[
  {
    "path": ".editorconfig",
    "content": "# Remove the line below if you want to inherit .editorconfig settings from higher directories\nroot = true\n\n# JSON files, shell scripts\n[*.{json,sh}]\n\n# New line preferences\nend_of_line = lf\ninsert_final_newline = true\n\n# C# files\n[*.cs]\ndotnet_diagnostic.IDE0055.severity = none\n\n#### Core EditorConfig Options ####\n\n# Indentation and spacing\nindent_size = 4\nindent_style = space\ntab_width = 4\n\n# New line preferences\nend_of_line = crlf\ninsert_final_newline =true\n\n# Organize usings\ndotnet_separate_import_directive_groups = false\ndotnet_sort_system_directives_first = false\nfile_header_template = unset\n\n# this. and Me. preferences\ndotnet_style_qualification_for_event = false:suggestion\ndotnet_style_qualification_for_field = false:suggestion\ndotnet_style_qualification_for_method = false:suggestion\ndotnet_style_qualification_for_property = false:suggestion\n\n# Language keywords vs BCL types preferences\ndotnet_style_predefined_type_for_locals_parameters_members = true:suggestion\ndotnet_style_predefined_type_for_member_access = true:suggestion\n\n# Parentheses preferences\ndotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion\ndotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion\ndotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion\ndotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion\n\n# Modifier preferences\ndotnet_style_require_accessibility_modifiers = for_non_interface_members:silent\n\n# Expression-level preferences\ndotnet_style_coalesce_expression = true:suggestion\ndotnet_style_collection_initializer = true:suggestion\ndotnet_style_explicit_tuple_names = true:suggestion\ndotnet_style_null_propagation = true:suggestion\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_operator_placement_when_wrapping = beginning_of_line\ndotnet_style_prefer_auto_properties = true:suggestion\ndotnet_style_prefer_compound_assignment = true:suggestion\ndotnet_style_prefer_conditional_expression_over_assignment = true:silent\ndotnet_style_prefer_conditional_expression_over_return = true:silent\ndotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion\ndotnet_style_prefer_inferred_tuple_names = true:suggestion\ndotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion\ndotnet_style_prefer_simplified_boolean_expressions = true:suggestion\ndotnet_style_prefer_simplified_interpolation = true:suggestion\n\n# Field preferences\ndotnet_style_readonly_field = true:warning\n\n# Parameter preferences\ndotnet_code_quality_unused_parameters = all:suggestion\n\n# Suppression preferences\ndotnet_remove_unnecessary_suppression_exclusions = none\n\n#### C# Coding Conventions ####\ndotnet_style_operator_placement_when_wrapping = beginning_of_line\ndotnet_style_coalesce_expression = true:suggestion\ndotnet_style_null_propagation = true:suggestion\ndotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion\ndotnet_style_prefer_auto_properties = true:silent\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_collection_initializer = true:suggestion\ndotnet_style_prefer_simplified_boolean_expressions = true:suggestion\ndotnet_style_prefer_conditional_expression_over_assignment = true:silent\ndotnet_style_prefer_conditional_expression_over_return = true:silent\ndotnet_style_explicit_tuple_names = true:suggestion\ndotnet_style_prefer_inferred_tuple_names = true:suggestion\ndotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion\ndotnet_style_prefer_compound_assignment = true:suggestion\ndotnet_style_prefer_simplified_interpolation = true:suggestion\ndotnet_style_namespace_match_folder = true:suggestion\ndotnet_style_readonly_field = true:warning\ndotnet_style_predefined_type_for_locals_parameters_members = true:suggestion\ndotnet_style_predefined_type_for_member_access = true:suggestion\ndotnet_style_require_accessibility_modifiers = for_non_interface_members:silent\ndotnet_style_allow_multiple_blank_lines_experimental = true:silent\ndotnet_style_allow_statement_immediately_after_block_experimental = true:silent\ndotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion\ndotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion\ndotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion\ndotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion\ndotnet_style_qualification_for_field = false:suggestion\ndotnet_style_qualification_for_property = false:suggestion\ndotnet_style_qualification_for_method = false:suggestion\ndotnet_style_qualification_for_event = false:suggestion\n\n# var preferences\ncsharp_style_var_elsewhere = true:suggestion\ncsharp_style_var_for_built_in_types = true:suggestion\ncsharp_style_var_when_type_is_apparent = true:suggestion\n\n# Expression-bodied members\ncsharp_style_expression_bodied_accessors = when_on_single_line:silent\ncsharp_style_expression_bodied_constructors = false:suggestion\ncsharp_style_expression_bodied_indexers = when_on_single_line:silent\ncsharp_style_expression_bodied_lambdas = when_on_single_line:silent\ncsharp_style_expression_bodied_local_functions = when_on_single_line:silent\ncsharp_style_expression_bodied_methods = false:suggestion\ncsharp_style_expression_bodied_operators = when_on_single_line:silent\ncsharp_style_expression_bodied_properties = when_on_single_line:silent\n\n# Pattern matching preferences\ncsharp_style_pattern_matching_over_as_with_null_check = true:suggestion\ncsharp_style_pattern_matching_over_is_with_cast_check = true:suggestion\ncsharp_style_prefer_not_pattern = true:suggestion\ncsharp_style_prefer_pattern_matching = true:none\ncsharp_style_prefer_switch_expression = false:suggestion\n\ncsharp_style_prefer_method_group_conversion = true:silent\ncsharp_style_prefer_top_level_statements = true:silent\ncsharp_style_prefer_null_check_over_type_check = true:suggestion\ncsharp_style_prefer_local_over_anonymous_function = true:suggestion\ncsharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion\ncsharp_style_prefer_tuple_swap = true:suggestion\ncsharp_style_prefer_utf8_string_literals = true:suggestion\ncsharp_style_allow_embedded_statements_on_same_line_experimental = true:silent\ncsharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent\ncsharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent\ncsharp_style_prefer_extended_property_pattern = true:suggestion\n\n# Null-checking preferences\ncsharp_style_conditional_delegate_call = true:suggestion\n\n# Modifier preferences\ncsharp_prefer_static_local_function = true:warning\ncsharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent\n\n# Code-block preferences\ncsharp_prefer_braces = true:suggestion\ncsharp_prefer_simple_using_statement = true:silent\n\n# Expression-level preferences\ncsharp_prefer_simple_default_expression = true:suggestion\ncsharp_style_deconstructed_variable_declaration = true:suggestion\ncsharp_style_inlined_variable_declaration = true:suggestion\ncsharp_style_pattern_local_over_anonymous_function = true:suggestion\ncsharp_style_prefer_index_operator = true:suggestion\ncsharp_style_prefer_range_operator = true:suggestion\ncsharp_style_throw_expression = true:suggestion\ncsharp_style_unused_value_assignment_preference = discard_variable:silent\ncsharp_style_unused_value_expression_statement_preference = discard_variable:none\n\n# 'using' directive preferences\ncsharp_using_directive_placement = inside_namespace:suggestion\n\n#### C# Formatting Rules ####\n\n# New line preferences\ncsharp_new_line_before_catch = true\ncsharp_new_line_before_else = true\ncsharp_new_line_before_finally = true\ncsharp_new_line_before_members_in_anonymous_types = true\ncsharp_new_line_before_members_in_object_initializers = true\ncsharp_new_line_before_open_brace = all\ncsharp_new_line_between_query_expression_clauses = true\n\n# Indentation preferences\ncsharp_indent_block_contents = true\ncsharp_indent_braces = false\ncsharp_indent_case_contents = true\ncsharp_indent_case_contents_when_block = true\ncsharp_indent_labels = one_less_than_current\ncsharp_indent_switch_labels = true\n\n# Space preferences\ncsharp_space_after_cast = false\ncsharp_space_after_colon_in_inheritance_clause = true\ncsharp_space_after_comma = true\ncsharp_space_after_dot = false\ncsharp_space_after_keywords_in_control_flow_statements = true\ncsharp_space_after_semicolon_in_for_statement = true\ncsharp_space_around_binary_operators = before_and_after\ncsharp_space_around_declaration_statements = false\ncsharp_space_before_colon_in_inheritance_clause = true\ncsharp_space_before_comma = false\ncsharp_space_before_dot = false\ncsharp_space_before_open_square_brackets = false\ncsharp_space_before_semicolon_in_for_statement = false\ncsharp_space_between_empty_square_brackets = false\ncsharp_space_between_method_call_empty_parameter_list_parentheses = false\ncsharp_space_between_method_call_name_and_opening_parenthesis = false\ncsharp_space_between_method_call_parameter_list_parentheses = false\ncsharp_space_between_method_declaration_empty_parameter_list_parentheses = false\ncsharp_space_between_method_declaration_name_and_open_parenthesis = false\ncsharp_space_between_method_declaration_parameter_list_parentheses = false\ncsharp_space_between_parentheses = false\ncsharp_space_between_square_brackets = false\n\n# Wrapping preferences\ncsharp_preserve_single_line_blocks = true\ncsharp_preserve_single_line_statements = true\n\n#### Naming styles ####\n\n# Naming rules\n\ndotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion\ndotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface\ndotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i\n\ndotnet_naming_rule.types_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.types_should_be_pascal_case.symbols = types\ndotnet_naming_rule.types_should_be_pascal_case.style = pascal_case\n\ndotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members\ndotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case\n\ndotnet_naming_rule.async_method_should_be_ends_in_async.severity = suggestion\ndotnet_naming_rule.async_method_should_be_ends_in_async.symbols = async_method\ndotnet_naming_rule.async_method_should_be_ends_in_async.style = ends_in_async\n\ndotnet_naming_rule.public_const_field_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.public_const_field_should_be_pascal_case.symbols = public_const_field\ndotnet_naming_rule.public_const_field_should_be_pascal_case.style = pascal_case\n\ndotnet_naming_rule.public_static_readonly_field_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.public_static_readonly_field_should_be_pascal_case.symbols = public_static_readonly_field\ndotnet_naming_rule.public_static_readonly_field_should_be_pascal_case.style = pascal_case\n\ndotnet_naming_rule.private_or_protected_const_field_should_be_begins_with_k.severity = suggestion\ndotnet_naming_rule.private_or_protected_const_field_should_be_begins_with_k.symbols = private_or_protected_const_field\ndotnet_naming_rule.private_or_protected_const_field_should_be_begins_with_k.style = begins_with_k\n\ndotnet_naming_rule.private_or_protected_static_readonly_field_should_be_begins_with_k.severity = suggestion\ndotnet_naming_rule.private_or_protected_static_readonly_field_should_be_begins_with_k.symbols = private_or_protected_static_readonly_field\ndotnet_naming_rule.private_or_protected_static_readonly_field_should_be_begins_with_k.style = begins_with_k\n\ndotnet_naming_rule.public_or_protected_field_should_be_begins_with__.severity = suggestion\ndotnet_naming_rule.public_or_protected_field_should_be_begins_with__.symbols = public_or_protected_field\ndotnet_naming_rule.public_or_protected_field_should_be_begins_with__.style = begins_with__\n\ndotnet_naming_rule.private_or_internal_field_should_be_begins_with__.severity = suggestion\ndotnet_naming_rule.private_or_internal_field_should_be_begins_with__.symbols = private_or_internal_field\ndotnet_naming_rule.private_or_internal_field_should_be_begins_with__.style = begins_with__\n\ndotnet_naming_rule.private_or_internal_static_field_should_be_begins_with__.severity = suggestion\ndotnet_naming_rule.private_or_internal_static_field_should_be_begins_with__.symbols = private_or_internal_static_field\ndotnet_naming_rule.private_or_internal_static_field_should_be_begins_with__.style = begins_with__\n\n# Symbol specifications\n\ndotnet_naming_symbols.interface.applicable_kinds = interface\ndotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal\ndotnet_naming_symbols.interface.required_modifiers =\n\ndotnet_naming_symbols.public_or_protected_field.applicable_kinds = field\ndotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected\ndotnet_naming_symbols.public_or_protected_field.required_modifiers =\n\ndotnet_naming_symbols.private_or_internal_field.applicable_kinds = field\ndotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private\ndotnet_naming_symbols.private_or_internal_field.required_modifiers =\n\ndotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field\ndotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private\ndotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static\n\ndotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum\ndotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal\ndotnet_naming_symbols.types.required_modifiers =\n\ndotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method\ndotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal\ndotnet_naming_symbols.non_field_members.required_modifiers =\n\ndotnet_naming_symbols.async_method.applicable_kinds = method\ndotnet_naming_symbols.async_method.applicable_accessibilities = *\ndotnet_naming_symbols.async_method.required_modifiers = async\n\ndotnet_naming_symbols.private_or_protected_const_field.applicable_kinds = field\ndotnet_naming_symbols.private_or_protected_const_field.applicable_accessibilities = private, protected, protected_internal, private_protected, local\ndotnet_naming_symbols.private_or_protected_const_field.required_modifiers = const\n\ndotnet_naming_symbols.private_or_protected_static_readonly_field.applicable_kinds = field\ndotnet_naming_symbols.private_or_protected_static_readonly_field.applicable_accessibilities = private, protected, protected_internal, private_protected, local\ndotnet_naming_symbols.private_or_protected_static_readonly_field.required_modifiers = readonly, static\n\ndotnet_naming_symbols.public_const_field.applicable_kinds = field\ndotnet_naming_symbols.public_const_field.applicable_accessibilities = public, internal\ndotnet_naming_symbols.public_const_field.required_modifiers = const\n\ndotnet_naming_symbols.public_static_readonly_field.applicable_kinds = field\ndotnet_naming_symbols.public_static_readonly_field.applicable_accessibilities = public, internal\ndotnet_naming_symbols.public_static_readonly_field.required_modifiers = readonly\n\n# Naming styles\n\ndotnet_naming_style.pascal_case.required_prefix =\ndotnet_naming_style.pascal_case.required_suffix =\ndotnet_naming_style.pascal_case.word_separator =\ndotnet_naming_style.pascal_case.capitalization = pascal_case\n\ndotnet_naming_style.begins_with_i.required_prefix = I\ndotnet_naming_style.begins_with_i.required_suffix =\ndotnet_naming_style.begins_with_i.word_separator =\ndotnet_naming_style.begins_with_i.capitalization = pascal_case\n\ndotnet_naming_style.begins_with__.required_prefix = _\ndotnet_naming_style.begins_with__.required_suffix =\ndotnet_naming_style.begins_with__.word_separator =\ndotnet_naming_style.begins_with__.capitalization = camel_case\n\ndotnet_naming_style.ends_in_async.required_prefix =\ndotnet_naming_style.ends_in_async.required_suffix = Async\ndotnet_naming_style.ends_in_async.word_separator =\ndotnet_naming_style.ends_in_async.capitalization = pascal_case\n\ndotnet_naming_style.begins_with_k.required_prefix = k\ndotnet_naming_style.begins_with_k.required_suffix =\ndotnet_naming_style.begins_with_k.word_separator =\ndotnet_naming_style.begins_with_k.capitalization = pascal_case\n\ncsharp_style_namespace_declarations= block_scoped:warning\n\n# IDE0046: Convert to conditional expression\ndotnet_diagnostic.IDE0046.severity = silent\n# IDE0045: Convert to conditional expression\ndotnet_diagnostic.IDE0045.severity = silent\n# IDE0130: Namespace does not match folder structure\ndotnet_diagnostic.IDE0130.severity = none\n# IDE0010: Add missing cases\ndotnet_diagnostic.IDE0010.severity = silent\n# IDE0072: Add missing cases\ndotnet_diagnostic.IDE0072.severity = silent\n\n# RCS1138: Add summary to documentation comment.\ndotnet_diagnostic.RCS1138.severity = suggestion\n# RCS1163: Unused parameter\ndotnet_diagnostic.RCS1163.severity = silent\n# RCS1180: Inline lazy initialization\ndotnet_diagnostic.RCS1180.severity = silent\n# RCS1194: Implement exception constructors.\ndotnet_diagnostic.RCS1194.severity = silent\n# RCS1073: Convert 'if' to 'return' statement.\ndotnet_diagnostic.RCS1073.severity = silent\n# RCS1112: Combine 'Enumerable.Where' method chain.\ndotnet_diagnostic.RCS1112.severity = silent\n# RCS1237: Use bit shift operator.\ndotnet_diagnostic.RCS1237.severity = silent\n# RCS1135: Declare enum member with zero value (when enum has FlagsAttribute).\ndotnet_diagnostic.RCS1135.severity = silent\n# RCS1079: Throwing of new NotImplementedException.\ndotnet_diagnostic.RCS1079.severity = silent\n# RCS1238: Avoid nested ?: operators.\ndotnet_diagnostic.RCS1238.severity = silent\n\n# CA1062: Variant value validation\ndotnet_code_quality.CA1062.null_check_validation_methods = IsNull|CheckNull\n\n# Default severity for analyzer diagnostics with category 'Naming'\ndotnet_analyzer_diagnostic.category-Naming.severity = suggestion\n# Default severity for analyzer diagnostics with category 'Performance'\ndotnet_analyzer_diagnostic.category-Performance.severity = suggestion\n\n# CA1303: Do not pass literals as localized parameters\ndotnet_diagnostic.CA1303.severity = none\n# CA1031: Do not catch general exception types\ndotnet_diagnostic.CA1031.severity = none\n# CA1062: Validate arguments of public methods\ndotnet_diagnostic.CA1062.severity = silent\n# CA1711: Identifiers should not have incorrect suffix\ndotnet_diagnostic.CA1711.severity = silent\n# CA2225: Operator overloads have named alternates\ndotnet_diagnostic.CA2225.severity = silent\n# CA1848: Use the LoggerMessage delegates\ndotnet_diagnostic.CA1848.severity = silent\n# CA1819: Properties should not return arrays\ndotnet_diagnostic.CA1819.severity = silent\n# CA1055: URI-like return values should not be strings\ndotnet_diagnostic.CA1055.severity = silent\n# CA1056: URI-like properties should not be strings\ndotnet_diagnostic.CA1056.severity = silent\n# CA1054: URI-like parameters should not be strings\ndotnet_diagnostic.CA1054.severity = silent\ndotnet_diagnostic.CA1309.severity=suggestion\n# CA1810: Initialize reference type static fields inline\ndotnet_diagnostic.CA1810.severity = none\ndotnet_diagnostic.CA1032.severity= silent\ndotnet_diagnostic.CA1304.severity=suggestion\ndotnet_diagnostic.CA1305.severity=suggestion\ndotnet_diagnostic.CA1307.severity=suggestion\ndotnet_diagnostic.CA1310.severity=warning\ndotnet_diagnostic.CA1727.severity=warning\ndotnet_diagnostic.CA2201.severity=warning\ndotnet_diagnostic.CA2215.severity=warning\ndotnet_diagnostic.CA5351.severity=warning\ndotnet_diagnostic.CA5350.severity=warning\ndotnet_diagnostic.CA5360.severity=error\ndotnet_diagnostic.CA5359.severity=warning\ndotnet_diagnostic.CA5363.severity=warning\ndotnet_diagnostic.CA5364.severity=warning\ndotnet_diagnostic.CA5365.severity=warning\ndotnet_diagnostic.CA5366.severity=warning\ndotnet_diagnostic.CA5373.severity=warning\ndotnet_diagnostic.CA5379.severity=warning\ndotnet_diagnostic.CA5385.severity=warning\ndotnet_diagnostic.CA5384.severity=warning\ndotnet_diagnostic.CA5397.severity=warning\ndotnet_diagnostic.CA5394.severity=suggestion\n# IDE0066: Convert switch statement to expression\ndotnet_diagnostic.IDE0066.severity = suggestion\ndotnet_diagnostic.CA1200.severity = suggestion\ndotnet_diagnostic.CA1848.severity = suggestion\ndotnet_diagnostic.CA2011.severity = warning\ndotnet_diagnostic.CA2009.severity = warning\ndotnet_diagnostic.CA1001.severity = warning\ndotnet_diagnostic.CA1311.severity = suggestion\n\n# Default severity for analyzer diagnostics with category 'Style'\ndotnet_analyzer_diagnostic.category-Style.severity = silent\ndotnet_code_quality_unused_parameters = all:suggestion\ndotnet_diagnostic.RCS1090.severity = warning\ndotnet_diagnostic.RCS1035.severity = suggestion\ndotnet_diagnostic.RCS1034.severity = suggestion\ndotnet_diagnostic.RCS1040.severity = suggestion\ndotnet_diagnostic.RCS1042.severity = suggestion\ndotnet_diagnostic.RCS1043.severity = suggestion\ndotnet_diagnostic.RCS1061.severity = suggestion\ndotnet_diagnostic.RCS1066.severity = suggestion\ndotnet_diagnostic.RCS1069.severity = suggestion\ndotnet_diagnostic.RCS1071.severity = suggestion\ndotnet_diagnostic.RCS1091.severity = suggestion\ndotnet_diagnostic.RCS1124.severity = suggestion\ndotnet_diagnostic.RCS1129.severity = suggestion\ndotnet_diagnostic.RCS1136.severity = suggestion\ndotnet_diagnostic.RCS1141.severity = suggestion\ndotnet_diagnostic.RCS1140.severity = suggestion\ndotnet_diagnostic.RCS1142.severity = suggestion\ndotnet_diagnostic.RCS1145.severity = suggestion\ndotnet_diagnostic.RCS1143.severity = suggestion\ndotnet_diagnostic.RCS1151.severity = suggestion\ndotnet_diagnostic.RCS1165.severity = suggestion\ndotnet_diagnostic.RCS1188.severity = suggestion\ndotnet_diagnostic.RCS1181.severity = suggestion\ndotnet_diagnostic.RCS1182.severity = suggestion\ndotnet_diagnostic.RCS1201.severity = suggestion\ndotnet_diagnostic.RCS1211.severity = suggestion\ndotnet_diagnostic.RCS1228.severity = none\ndotnet_diagnostic.RCS1229.severity = warning\ndotnet_diagnostic.RCS1244.severity = suggestion\n\n# xUnit1033: Test classes decorated with 'Xunit.IClassFixture<TFixture>' or 'Xunit.ICollectionFixture<TFixture>' should add a constructor argument of type TFixture\ndotnet_diagnostic.xUnit1033.severity = silent\n# xUnit1044: The type argument is not serializable, which will cause Test Explorer to not enumerate individual data rows. Consider using a type that is known to be serializable.\ndotnet_diagnostic.xUnit1044.severity = silent\n\n# CA1716: Identifiers should not match keywords\ndotnet_diagnostic.CA1716.severity = none\ncsharp_style_prefer_primary_constructors = false:suggestion\n\n# CA1861: Avoid constant arrays as arguments\ndotnet_diagnostic.CA1861.severity = silent\n\n# CA1724: Type names should not match namespaces\ndotnet_diagnostic.CA1724.severity = silent\n\n# CA1812: Avoid uninstantiated internal classes\ndotnet_diagnostic.CA1812.severity = silent\n\n# CA1003: Use generic event handler instances\ndotnet_diagnostic.CA1003.severity = silent\n\n# CA1008: Enums should have zero value\ndotnet_diagnostic.CA1008.severity = silent\ncsharp_style_prefer_readonly_struct = true:suggestion\ncsharp_style_prefer_readonly_struct_member = true:suggestion\ncsharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent\ncsharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent\ndotnet_diagnostic.RCS1055.severity = suggestion\ndotnet_diagnostic.RCS1039.severity = suggestion\ncsharp_prefer_static_anonymous_function = true:suggestion\ncsharp_prefer_system_threading_lock = true:suggestion\n\n# IDE0058: Expression value is never used\ndotnet_diagnostic.IDE0058.severity = none\n\n# IDE0078: Use pattern matching\ndotnet_diagnostic.IDE0078.severity = none\n\n[*.{cs,vb}]\ndotnet_style_coalesce_expression = true:silent\ndotnet_style_null_propagation = true:suggestion\ndotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion\ndotnet_style_prefer_auto_properties = true:silent\ndotnet_style_operator_placement_when_wrapping = beginning_of_line\ntab_width = 4\nindent_size = 4\nend_of_line = crlf\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_namespace_match_folder = false:silent\n\ndotnet_diagnostic.CA2007.severity = warning\ndotnet_diagnostic.CA1848.severity = silent\ndotnet_diagnostic.CA1036.severity = suggestion\ndotnet_diagnostic.CA1051.severity = silent\ndotnet_diagnostic.CA1711.severity = silent\ndotnet_diagnostic.CA1819.severity = suggestion\ndotnet_diagnostic.CA3061.severity = suggestion\ndotnet_diagnostic.CA3075.severity = suggestion\ndotnet_diagnostic.CA3076.severity = suggestion\ndotnet_diagnostic.CA3077.severity = suggestion\ndotnet_diagnostic.CA3147.severity = suggestion\ndotnet_diagnostic.CA5369.severity = suggestion\ndotnet_diagnostic.CA5371.severity = suggestion\ndotnet_diagnostic.CA5370.severity = suggestion\ndotnet_diagnostic.CA5372.severity = suggestion\ndotnet_diagnostic.CA5374.severity = warning\ndotnet_diagnostic.CA2251.severity = suggestion\ndotnet_style_prefer_collection_expression = when_types_exactly_match:suggestion\ndotnet_style_collection_initializer = true:suggestion\ndotnet_style_prefer_simplified_boolean_expressions = true:suggestion\ndotnet_style_prefer_conditional_expression_over_assignment = true:silent\n\n# IDE0270: Use coalesce expression\ndotnet_diagnostic.IDE0270.severity = silent\n# IDE0130: Namespace does not correspond to file location\ndotnet_diagnostic.IDE0130.severity = silent\ndotnet_diagnostic.CA1031.severity = silent\ndotnet_style_prefer_conditional_expression_over_return = true:silent\ndotnet_style_explicit_tuple_names = true:suggestion\ndotnet_style_prefer_inferred_tuple_names = true:suggestion\ndotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion\ndotnet_style_prefer_compound_assignment = true:suggestion\ndotnet_style_prefer_simplified_interpolation = true:suggestion\ndotnet_style_namespace_match_folder = false:suggestion\ndotnet_style_readonly_field = true:warning\ndotnet_style_predefined_type_for_locals_parameters_members = true:suggestion\ndotnet_style_predefined_type_for_member_access = true:suggestion\ndotnet_style_require_accessibility_modifiers = for_non_interface_members:silent\ndotnet_style_allow_multiple_blank_lines_experimental = true:silent\ndotnet_style_allow_statement_immediately_after_block_experimental = true:silent\ndotnet_code_quality_unused_parameters = all:suggestion\ndotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion\ndotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion\ndotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion\ndotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion\ndotnet_style_qualification_for_field = false:suggestion\ndotnet_style_qualification_for_property = false:suggestion\ndotnet_style_qualification_for_method = false:suggestion\ndotnet_style_qualification_for_event = false:suggestion\n"
  },
  {
    "path": ".gdnbaselines",
    "content": "{\n  \"hydrated\": false,\n  \"properties\": {\n    \"helpUri\": \"https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/baselines\"\n  },\n  \"version\": \"1.0.0\",\n  \"baselines\": {\n    \"default\": {\n      \"name\": \"default\",\n      \"createdDate\": \"2025-08-08 15:38:41Z\",\n      \"lastUpdatedDate\": \"2025-08-08 15:38:41Z\"\n    }\n  },\n  \"results\": {\n    \"6509bdf379f034da9286d6a99b43a48c28d25e6ed7a27498cdd040ca8d2716e3\": {\n      \"signature\": \"6509bdf379f034da9286d6a99b43a48c28d25e6ed7a27498cdd040ca8d2716e3\",\n      \"alternativeSignatures\": [\n        \"f6b70eed777a2be53d74c33c31bb729cfa646ab63add95fc1c0fa9af2498a78c\"\n      ],\n      \"memberOf\": [\n        \"default\"\n      ],\n      \"createdDate\": \"2025-08-08 15:38:41Z\"\n    },\n    \"58ae6a48f45ca345b98cdda729972ce4308cf93c8efb96deb348e3e91598cc0d\": {\n      \"signature\": \"58ae6a48f45ca345b98cdda729972ce4308cf93c8efb96deb348e3e91598cc0d\",\n      \"alternativeSignatures\": [\n        \"647af3f9494531075db1bd4924b6bccf8508acc3de6c32eb8d41b905f0b0d1e0\"\n      ],\n      \"memberOf\": [\n        \"default\"\n      ],\n      \"createdDate\": \"2025-08-08 15:38:41Z\"\n    }\n  }\n}"
  },
  {
    "path": ".gitattributes",
    "content": "# Default behavior: if Git thinks a file is text (as opposed to binary), it\n# will normalize line endings to LF in the repository, but convert to your\n# platform's native line endings on checkout (e.g., CRLF for Windows).\n* text=auto\n\n# Explicitly declare text files you want to always be normalized and converted\n# to native line endings on checkout. E.g.,\n#*.c text\n\n# Declare files that will always have LF line endings on checkout. E.g.,\n*.sh text eol=lf\n*.json text eol=lf\n*.rb text eol=lf\n*.go text eol=lf\n*.java text eol=lf\n*.ts text eol=lf\n*.js text eol=lf\n*.py text eol=lf\n\n# Denote all files that should not have line endings normalized, should not be\n# merged, and should not show in a textual diff.\n*.docm binary\n*.docx binary\n*.ico binary\n*.lib binary\n*.png binary\n*.pptx binary\n*.snk binary\n*.vsdx binary\n*.xps binary\n*.dll binary\n*.exe binary\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "* @Azure/azure-industrial-iot"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"nuget\"\n    directory: \"/\" # Location of package manifests\n    schedule:\n      interval: \"daily\"\n    open-pull-requests-limit: 25\n    # Raise pull requests in worker branch nuget\n    target-branch: \"main\"\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [ \"latest\", \"main\", \"release/*\" ]\n  pull_request:\n    branches: [ \"latest\", \"main\", \"release/*\" ]\n  schedule:\n    - cron: '37 9 * * 5'\n\njobs:\n  analyze:\n    name: Analyze (${{ matrix.language }})\n    runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}\n    timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}\n    permissions:\n      security-events: write\n      packages: read\n      actions: read\n      contents: read\n\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n        - language: csharp\n          build-mode: autobuild\n    steps:\n    - name: Setup .NET\n      uses: actions/setup-dotnet@v3\n      with:\n        dotnet-version: 9.0.x\n    - name: Checkout repository\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n    - name: Cleanup Nuget.Config\n      run: |\n        find . -name \"Nuget.Config\" -type f -delete\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v3\n      with:\n        languages: ${{ matrix.language }}\n        build-mode: ${{ matrix.build-mode }}\n      # queries: security-extended,security-and-quality\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v3\n      with:\n        category: \"/language:${{matrix.language}}\"\n"
  },
  {
    "path": ".github/workflows/dotnet.yml",
    "content": "name: Build Solutions\non:\n  push:\n    branches: [ \"latest\", \"main\" ]\n  pull_request:\n    branches: [ \"latest\", \"main\" ]\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        solution:\n          - '**/*.slnx'\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n    - name: Setup .NET\n      uses: actions/setup-dotnet@v3\n      with:\n        dotnet-version: 9.0.x\n    - name: Restore dependencies\n      run: dotnet restore ${{ matrix.solution }} -s https://api.nuget.org/v3/index.json\n    - name: Build\n      run: dotnet build ${{ matrix.solution }} --configuration Release --no-restore\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Build and Test\non:\n  push:\n    branches: [ \"latest\", \"main\" ]\n  pull_request:\n    branches: [ \"latest\", \"main\" ]\njobs:\n  build:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, windows-latest]\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n    - name: Setup .NET\n      uses: actions/setup-dotnet@v4\n      with:\n        dotnet-version: 9.0.x\n    - name: Restore dependencies\n      run: dotnet restore -s https://api.nuget.org/v3/index.json\n    - name: Build\n      run: dotnet build --no-restore\n    - name: Test\n      run: dotnet test --no-build --verbosity normal\n"
  },
  {
    "path": ".gitignore",
    "content": "/**/*.user\n/**/*.cache\n/**/*.user.json\n/**/*.nupkg\n/**/obj/**\n/**/.vs\n/**/bin/**\n/**/pki/**\n/**/csx/**\n/**/ecf/**\n/**/*.log\n/**/*.err\n/**/*.sdf\n/**/*.rsa\n/**/*.opendb\n/**/*.opensdf\n/**/*.vc.db\n/.vscode/**\n/build/**\n*.sarif\n*.dll\n*.so\n*.pdb\n*.der\n*.pfx\n*.exe\n/src/out\n/src/Logs\n/_tmpout/**\n/TestResults/**\n/**/TestResults/**\n/**/packages/**\n/**/appsettings.*.json\n.env\n*.crt\n*.key\n*.user\n*.cache\nCodeCoverage\ncoverage.cobertura.xml\n/api/csharp-api/api/*.yml\n/api/csharp-api/api/*.manifest\n/api/csharp-api/_site\nnode_modules\n.sonarqube/**\n"
  },
  {
    "path": ".mcp.json",
    "content": "{\n    \"inputs\": [\n        {\n            \"id\": \"github_pat\",\n            \"description\": \"GitHub personal access token\",\n            \"type\": \"promptString\",\n            \"password\": true\n        }\n    ],\n    \"servers\": {\n        \"microsoft.docs.mcp\": {\n            \"type\": \"http\",\n            \"url\": \"https://learn.microsoft.com/api/mcp\"\n        },\n        \"github\": {\n            \"type\": \"stdio\",\n            \"command\": \"docker\",\n            \"args\": [\n                \"run\",\n                \"-i\",\n                \"--rm\",\n                \"-e\",\n                \"GITHUB_PERSONAL_ACCESS_TOKEN\",\n                \"ghcr.io/github/github-mcp-server\"\n            ],\n            \"env\": {\n                \"GITHUB_PERSONAL_ACCESS_TOKEN\": \"${input:github_pat}\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": ".sscignore",
    "content": "{ \"cfs\": [\"CFS0001\", \"CFS0013\"] }"
  },
  {
    "path": "CODEOWNERS",
    "content": "# Always ensure to include industrial-iot-pr for every item that follows.\n* @Azure/industrial-iot-pr\n\n# Only exception is doc updates\n/docs/ @Azure/azure-industrial-iot\n"
  },
  {
    "path": "Industrial-IoT.slnx",
    "content": "<Solution>\n  <Configurations>\n    <Platform Name=\"Any CPU\" />\n    <Platform Name=\"x64\" />\n  </Configurations>\n  <Folder Name=\"/Solution Items/\">\n    <File Path=\".editorconfig\" />\n  </Folder>\n  <Folder Name=\"/src/\">\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Models/src/Azure.IIoT.OpcUa.Publisher.Models.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Module/src/Azure.IIoT.OpcUa.Publisher.Module.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Azure.IIoT.OpcUa.Publisher.Sdk.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Testing/src/Azure.IIoT.OpcUa.Publisher.Testing.Servers.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Azure.IIoT.OpcUa.Publisher.Testing.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher/src/Azure.IIoT.OpcUa.Publisher.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa/src/Azure.IIoT.OpcUa.csproj\" />\n  </Folder>\n  <Folder Name=\"/tests/\">\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Models/tests/Azure.IIoT.OpcUa.Publisher.Models.Tests.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Module/tests/Azure.IIoT.OpcUa.Publisher.Module.Tests.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher/tests/Azure.IIoT.OpcUa.Publisher.Tests.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa/tests/Azure.IIoT.OpcUa.Tests.csproj\" />\n  </Folder>\n  <Folder Name=\"/tools/\">\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Module/cli/Azure.IIoT.OpcUa.Publisher.Module.Cli.csproj\" />\n    <Project Path=\"src/Azure.IIoT.OpcUa.Publisher.Testing/cli/Azure.IIoT.OpcUa.Publisher.Testing.Cli.csproj\" />\n  </Folder>\n</Solution>\n"
  },
  {
    "path": "LICENSE",
    "content": "    MIT License\r\n\r\n    Copyright (c) Microsoft Corporation. All rights reserved.\r\n\r\n    Permission is hereby granted, free of charge, to any person obtaining a copy\r\n    of this software and associated documentation files (the \"Software\"), to deal\r\n    in the Software without restriction, including without limitation the rights\r\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n    copies of the Software, and to permit persons to whom the Software is\r\n    furnished to do so, subject to the following conditions:\r\n\r\n    The above copyright notice and this permission notice shall be included in all\r\n    copies or substantial portions of the Software.\r\n\r\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n    SOFTWARE\r\n"
  },
  {
    "path": "NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties.\nMicrosoft makes certain open source code available at https://3rdpartysource.microsoft.com,\nor you may send a check or money order for US $5.00, including the product name,\nthe open source component name, platform, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the extent\nrequired to debug changes to any libraries licensed under the GNU Lesser General Public License.\n\n---------------------------------------------------------\n\nAs an OPC Foundation Corporate Member, Microsoft distributes any code dual licensed under the RCL or GPLv2 license, under the RCL license.\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Core 1.4.368.58 - OTHER\n\n\nhttps://opcfoundation.org/license/redistributables/1.3/\n\nCopyright, OPC Foundation\n\nOPC REDISTRIBUTABLES Agreement of Use\nVersion 1.3, February 06, 2017, OPC Foundation\nThe terms and conditions of the Agreement apply to the Software Deliverables including without limitation any OPC Foundation: \nupdates,\nsupplements\nInternet-based services, and\nsupport services\nfor the Software Deliverables, unless OPC Foundation specifies that any other terms accompany such items, in which case the alternate terms specified by OPC Foundation would apply.\n\nBY USING THE SOURCE DELIVERABLES, YOU ACCEPT THE TERMS OF THIS AGREEMENT. IF YOU DO NOT ACCEPT THE TERMS OF THIS AGREEMENT, DO NOT USE THE SOFTWARE DELIVERABLES.\nIf you comply with this Agreement, you have the rights below.\n1. INSTALLATION AND USE RIGHTS.\nYou may install and use any number of copies of the Software Deliverables.\n2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.\nDistributable Code. The Software Deliverables contain compiled code that you are permitted to distribute with programs you develop if you comply with the terms below.\nRight to Use and Distribute.\nYou may copy and distribute all files that are part of this Software Deliverables.\nThird Party Distribution. You may permit distributors of your programs to copy and distribute the Software Deliverables as part of those programs.\nDistribution Requirements. For any Software Deliverables you distribute, you must:\nadd significant primary functionality to it in your programs;\nrequire distributors and external end users to agree to terms that protect it at least as much as this Agreement;\ndisplay your valid copyright notice on your programs; and\nindemnify, defend, and hold harmless the OPC Foundation from any claims, including attorneys’ fees, related to the distribution or use of your programs.\nDistribution Restrictions. You may not:\nalter any copyright, trademark or patent notice in the Software Deliverables;\nuse the OPC Foundation’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by the OPC Foundation;\ninclude Software Deliverables in malicious, deceptive or unlawful programs;\nmodify or distribute the source code of any Software Deliverables so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that (1). the code be disclosed or distributed in source code form; or (2) permit or otherwise allow others to have the right to modify such Software Deliverables; or\ncreate additional software components that directly link or directly load the Software Deliverables without accepting the corresponding source license for that Software Deliverable.\n3. SCOPE OF LICENSE.\nThe Software Deliverables are licensed, not sold. This Agreement only gives you some rights to use the Software Deliverables. The OPC Foundation reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this Agreement. In doing so, you must comply with any technical limitations in the Software Deliverables that only allow you to use it in certain ways. You may not:\ndisclose the results of any benchmark tests of the Software Deliverables to any third party without OPC Foundation’s prior written approval;\nwork around any technical limitations in the Software Deliverables;\nreverse engineer, decompile or disassemble the Software Deliverables, except and only to the extent that applicable law expressly permits, despite this limitation;\nmake more copies of the Software Deliverables than specified in this Agreement or allowed by applicable law, despite this limitation;\npublish the Software Deliverables for others to copy; or\nrent, lease or lend the Software Deliverables.\n4. BACKUP COPY.\nYou may make one backup copy of the Software Deliverables. You may use such copy only to reinstall the Software.\n5. DOCUMENTATION.\nAny person that has valid access to your computer or internal network may copy and use the documentation related to the Software Deliverables for your internal reference purposes.\n6. EXPORT RESTRICTIONS.\nThe Software Deliverables are subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the Software Deliverables. These laws include restrictions on destinations, end users and end use.\n7. SUPPORT SERVICES.\nBecause you accept the Software3 Deliverables from OPC Foundation “as is,” OPC Foundation may not provide support services for it.\n8. ENTIRE AGREEMENT.\nThis Agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire Agreement for the Software Deliverables and support services.\n10. LEGAL EFFECT\nThis Agreement describes certain legal rights. You may have other rights under the laws of your country. This Agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.\n11. DISCLAIMER OF WARRANTY.\nTHE SOFTWARE DELIVERABLES ARE LICENSED “AS-IS.” YOU BEAR THE RISK OF USING THE SPECIFICATIONS. THE OPC FOUNDATION MAKES NO WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, WITH REGARD TO THE SOFTWARE DELIVERABLES, INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF TITLE OR OWNERSHIP, IMPLIED WARRANTY OF MERCHANTABILITY, OR WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE.YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS UNDER YOUR LOCAL LAWS THAT THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, THE OPC FOUNDATION EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\nIN NO EVENT SHALL THE OPC FOUNDATION BE LIABLE FOR ERRORS CONTAINED IN THE SOURCE DELIVERABLES OR FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, RELIANCE OR COVER DAMAGES, INCLUDING LOSS OF PROFITS, REVENUE, DATA, OR USE, INCURRED BY ANY USER OR ANY THIRD PARTY IN CONNECTION WITH THE FURNISHING, PERFORMANCE, OR USE OF THE SOFTWARE DELIVERABLES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE USING THE SOFTWARE DELIVERABLES IS BORNE BY YOU AND/OR THE USER.\n\n---------------------------------------------------------\n\nhttps://opcfoundation.org/license/source/1.11/index.html\n\n\n      License information for OPC Source Deliverables\n\n\n        A. Introduction\n\nThe OPC Foundation provides source code as sample code/reference\nimplementation. The source code is provided as-is, with no warranty,\nsupport, or misrepresentation of the quality of code.\n\nThe OPC Foundation provides communication stacks, sample libraries,\nsample applications and utilities. All sources are available either as a\ndownloadable ZIP file or in a repository on github\n(https://github.com/OPCFoundation/ <https://github.com/OPCFoundation/>).\n\n\n        B. License models\n\nThe OPC Foundation provides different licenses depending on the\ncomponent and on the membership status of the user of the sources. A\nsingle ZIP file or a single repository can contain multiple components\nwhere the sources have different license models. The valid license is in\nthe header of each source file.\n\nFollowing are basic rules on how the OPC Foundation licenses the\ndifferent components:\n\n 1. OPC UA core components (OPC UA Stacks, OPC UA Local Discovery Server\n    - LDS) follow a dual-license model:\n      * *OPC Foundation Corporate Members*: RCL\n        <https://opcfoundation.org/license/rcl.html>\n        enables OPC Foundation corporate members to deploy their\n        applications using the core component sources without being\n        required to disclose the application code.\n         \n      * *Users that are not OPC Foundation corporate-members*: GPL 2.0\n        <https://opcfoundation.org/license/gpl.html>\n        Based on the GPL 2.0 license terms these users must disclose\n        their application code when using the core component sources.\n         \n 2. Samples and Utilities:\n    All samples and most of the utilities are provided under the MIT\n    license <https://opcfoundation.org/license/mit.html> for OPC\n    Foundation Members and Non-Members.\n\n---------------------------------------------------------\n\nhttps://opcfoundation.org/license/rcl.html\n\n      RCL License\n\nReciprocal Community License 1.00 (RCL1.00)\nVersion 1.00, June 24, 2009\nCopyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved.\n\nPREAMBLE\n\nThe Reciprocal Community License (RCL) is based on the concept of\nreciprocity or, if you prefer, fairness.\n\nThe RCL is adapted from the Open Source Reciprocal Public License (RPL)\nwhere the “Public” in the Open Source RPL license is replaced by the\n“Community” in the RCL License. In short, the RPL license grew out of a\ndesire to close loopholes in previous open source licenses, loopholes\nthat allowed parties to acquire open source software and derive\nfinancial benefit from it without having to release their improvements\nor derivatives to the community which enabled them. This occurred any\ntime an entity did not release their application to a \"third party\".\nWhile there is a certain freedom in this model of licensing, it struck\nthe authors of the RPL as being unfair to the open source community at\nlarge and to the original authors of the works in particular. After all,\nbug fixes, extensions, and meaningful and valuable derivatives were not\nconsistently faster, growth and expansion of the overall open source\nsoftware base.\n\nWhile you should clearly read and understand the entire license, the\nessence of the RCL is found in two definitions: \"Deploy\" and \"Required\nComponents\".\n\nRegarding deployment, under the RCL your changes, bug fixes, extensions,\netc. must be made available to the community when you Deploy in any form\n-- either internally or to an outside party.\n\nOnce you start running the software you have to start sharing the\nsoftware. Further, under the RCL all derivative work components you\nauthor including schemas, scripts, source code, documentation, etc. --\nmust be shared. You have to share the whole pie, not an isolated slice\nof it. The authored components you must share are confined to the\noriginal module licensed (e.g. SDK, stack, wrapper, proxy, utility,\netc.). You do not need to share any additional authored components that\nyou create that utilize the licensed component. This license is meant to\nbe friendly to commercial software vendors that must protect the IP in\ntheir code. You are not expected to share your proprietary source code\nthat makes use of the module(s) licensed under this agreement.\n\nThe specific terms and conditions of the license are defined in the\nremainder of this document.\n\n1 LICENSE TERMS\n1.1 General; Applicability & Definitions. This Reciprocal Community\nLicense Version 1.00 (\"License\") applies to any programs or other works\nas well as any and all updates or maintenance releases of said programs\nor works (\"Software\") not already covered by this License which the\nSoftware copyright holder (\"Licensor\") makes available containing a\nLicense Notice (hereinafter defined) from the Licensor specifying or\nallowing use or distribution under the terms of this License. As used in\nthis License:\n1.2 \"Contributor\" means any person or entity who created or contributed\nto the creation of an Extension.\n1.3 \"Deploy\" means to use, Serve, sublicense or distribute Licensed\nSoftware other than for Your internal Research and/or Personal Use, and\nincludes without limitation, any and all internal use or distribution of\nLicensed Software within Your business or organization other than for\nResearch and/or Personal Use, as well as direct or indirect sublicensing\nor distribution of Licensed Software by You to any third party.\n1.4 \"Derivative Works\" as used in this License is defined under U.S.\ncopyright law.\n1.5 \"Extensions\" means any Modifications, Derivative Works, or Required\nComponents as those terms are defined in this License.\n1.6 \"License\" means this Reciprocal Community License.\n1.7 \"License Notice\" means any notice contained in EXHIBIT A.\n1.8 \"Licensed Software\" means any Software licensed pursuant to this\nLicense. Licensed Software also includes all previous Extensions from\nany Contributor that You receive.\n1.9 \"Licensor\" means the copyright holder of any Software previously not\ncovered by this License who releases the Software under the terms of\nthis License.\n1.10 \"Modifications\" means any additions to or deletions from the\nsubstance or structure of (i) a file containing Licensed Software, or\n(ii) any new file that contains any part of Licensed Software.\n1.11 \"Original Licensor\" means the Licensor that is the copyright holder\nof the original work. For this license the Original Licensor is always\nthe OPC Foundation.\n1.12 \"Personal Use\" means use of Licensed Software by an individual\nsolely for his or her personal, private and non-commercial purposes.\nAn individual's use of Licensed Software in his or her capacity as an\nofficer, employee, member, independent contractor or agent of a\ncorporation, business or organization (commercial or non-commercial)\ndoes not qualify as Personal Use.\n1.13 \"Required Components\" means any text, programs, scripts, schema,\ninterface definitions, control files, or other works created by You\nwhich are required by a third party of average skill to successfully\ninstall and run Licensed Software containing Your Modifications, or to\ninstall and run Your Derivative Works. Required Components by this\ndefinition are the supporting works that are necessary to utilize your\nModifications and Derivative Works. This does not include your\napplications and supporting works that utilize the Licensed Software.\n1.14 \"Research\" means investigation or experimentation for the purpose\nof understanding the nature and limits of the Licensed Software and its\npotential uses.\n1.15 \"Serve\" means to deliver Licensed Software and/or Your Extensions\nby means of a computer network to one or more computers for purposes of\nexecution of Licensed Software and/or Your Extensions.\n1.16 \"Software\" means any computer programs or other works as well as\nany updates or maintenance releases of those programs or works which are\ndistributed publicly by Licensor.\n1.17 \"Source Code\" means the preferred form for making modifications to\nthe Licensed Software and/or Your Extensions, including all modules\ncontained therein, plus any associated text, interface definition files,\nscripts used to control compilation and installation of an executable\nprogram or other components required by a third party of average skill\nto build a running version of the Licensed Software or Your Extensions.\n1.18 \"User-Visible Attribution Notice\" means any notice contained in\nEXHIBIT B.\n1.19 \"You\" or \"Your\" means an individual or a legal entity exercising\nrights under this License. For legal entities, \"You\" or \"Your\" includes\nany entity which controls, is controlled by, or is under common control\nwith, You, where \"control\" means (a) the power, direct or indirect, to\ncause the direction or management of such entity, whether by contract or\notherwise, or (b) ownership of fifty percent (50%) or more of the\noutstanding shares or beneficial ownership of such entity.\n\n2.0 Acceptance Of License. You are not required to accept this License\nsince you have not signed it, however nothing else grants you permission\nto use, copy, distribute, modify, or create derivatives of either the\nSoftware or any Extensions created by a Contributor. These actions are\nprohibited by law if you do not accept this License. Therefore, by\nperforming any of these actions You indicate Your acceptance of this\nLicense and Your agreement to be bound by all its terms and conditions.\nIF YOU DO NOT AGREE WITH ALL THE TERMS AND CONDITIONS OF THIS LICENSE DO\nNOT USE, MODIFY, CREATE DERIVATIVES, OR DISTRIBUTE THE SOFTWARE. IF IT\nIS IMPOSSIBLE FOR YOU TO COMPLY WITH ALL THE TERMS AND CONDITIONS OF\nTHIS LICENSE THEN YOU CAN NOT USE, MODIFY, CREATE DERIVATIVES, OR\nDISTRIBUTE THE SOFTWARE.\n\n3.0 Grant of License From Licensor. Subject to the terms and conditions\nof this License, Licensor hereby grants You a world-wide, royalty-free,\nnon- exclusive license, subject to Licensor's intellectual property\nrights, and any third party intellectual property claims derived from\nthe Licensed Software under this License, to do the following:\n\n3.1 Use, reproduce, modify, display, and perform Licensed Software and\nYour Extensions in both Source Code form or as an executable program.\nYou may also sublicense and distribute Licensed Software and Your\nExtensions as an executable program. OPC Foundation Corporate Members\nmay also sublicense and distribute Licensed Software and Your Extensions\nin Source Code form.\n\n3.2 Create Derivative Works (as that term is defined under U.S.\ncopyright law) of Licensed Software.\n\n3.3 Under claims of patents now or hereafter owned or controlled by\nLicensor, to make, use, have made, and/or otherwise dispose of Licensed\nSoftware or portions thereof, but solely to the extent that any such\nclaim is necessary to enable You to make, use, have made, and/or\notherwise dispose of Licensed Software or portions thereof.\n\n3.4 Licensor reserves the right to release new versions of the Software\nwith different features, specifications, capabilities, functions,\nlicensing terms, general availability or other characteristics. Title,\nownership rights, and intellectual property rights in and to the\nLicensed Software shall remain in Licensor and/or its Contributors.\n\n4.0 Grant of License From Contributor. By application of the provisions\nin Section 6 below, each Contributor hereby grants You a world-wide,\nroyalty- free, non-exclusive license, subject to said Contributor's\nintellectual property rights, and any third party intellectual property\nclaims derived from the Licensed Software under this License, to do the\nfollowing:\n\n4.1 Use, reproduce, modify, display and perform any Extensions Deployed\nby such Contributor or portions thereof, in both Source Code form or as\nan executable program, either on an unmodified basis or as part of\nDerivative Works. You may also sublicense and distribute Extensions\nDeployed by such Contributor or portions thereof, as an executable\nprogram. OPC Foundation Corporate Members may also sublicense and\ndistribute Extensions Deployed by such Contributor or portions\nthereof,in Source Code form.\n\n4.2 Under claims of patents now or hereafter owned or controlled by\nContributor, to make, use, have made, and/or otherwise dispose of\nExtensions or portions thereof, but solely to the extent that any such\nclaim is necessary to enable You to make, use, have made, and/or\notherwise dispose of Licensed Software or portions thereof.\n\n5.0 Exclusions From License Grant. Nothing in this License shall be\ndeemed to grant any rights to trademarks, copyrights, patents, trade\nsecrets or any other intellectual property of Licensor or any\nContributor except as expressly stated herein. Except as expressly\nstated in Sections 3 and 4, no other patent rights, express or implied,\nare granted herein. Your Extensions may require additional patent\nlicenses from Licensor or Contributors which each may grant in its sole\ndiscretion. No right is granted to the trademarks of Licensor or any\nContributor even if such marks are included in the Licensed Software.\nNothing in this License shall be interpreted to prohibit Licensor from\nlicensing under different terms from this License any code that Licensor\notherwise would have a right to license.\n\n5.1 You expressly acknowledge and agree that although Licensor and each\nContributor grants the licenses to their respective portions of the\nLicensed Software set forth herein, no assurances are provided by\nLicensor or any Contributor that the Licensed Software does not infringe\nthe patent or other intellectual property rights of any other entity.\nLicensor and each Contributor disclaim any liability to You for claims\nbrought by any other entity based on infringement of intellectual\nproperty rights or otherwise. As a condition to exercising the rights\nand licenses granted hereunder, You hereby assume sole responsibility to\nsecure any other intellectual property rights needed, if any. For\nexample, if a third party patent license is required to allow You to\ndistribute the Licensed Software, it is Your responsibility to acquire\nthat license before distributing the Licensed Software.\n\n6.0 Your Obligations And Grants. In consideration of, and as an express\ncondition to, the licenses granted to You under this License You hereby\nagree that any Modifications, Derivative Works, or Required Components\n(collectively Extensions) that You create or to which You contribute are\ngoverned by the terms of this License including, without limitation,\nSection 4. Any Extensions that You create or to which You contribute\nmust be Deployed under the terms of this License or a future version of\nthis License released under Section 7. You hereby grant to Licensor and\nall third parties a world-wide, non-exclusive, royalty-free license\nunder those intellectual property rights You own or control to use,\nreproduce, display, perform, modify, create derivatives, sublicense, and\ndistribute Licensed Software, in any form. Any Extensions You make and\nDeploy must have a distinct title so as to readily tell any subsequent\nuser or Contributor that the Extensions are by You. You must include a\ncopy of this License or directions on how to obtain a copy with every\ncopy of the Extensions You distribute. You agree not to offer or impose\nany terms on any Source Code or executable version of the Licensed\nSoftware, or its Extensions that alter or restrict the applicable\nversion of this License or the recipients' rights hereunder.\nAdditionally, you herby grant to the Original Licensor the right to use,\nreproduce, display, perform, modify, create derivatives, sublicense, and\ndistribute Licensed Software, in any form, under the terms of this\nlicense and/or any other license terms it sees fit.\n\n6.1 Availability of Source Code. You must make available, under the\nterms of this License, the Source Code of any Extensions that You\nDeploy, by uploading the Source Code directly to the website of the\nOriginal Licensor. The Source Code for any version that You Deploy must\nbe made available within one (1) month of when you Deploy. You may not\ncharge a fee for any copy of the Source Code distributed under this\nSection. At the sole discretion of the Original Licensor, some or all of\nYour contributed Source Code may be included in a future baseline\nversion released by the Original Licensor.\n\n6.2 Description of Modifications. You must cause any Modifications that\nYou create or to which You contribute to be documented in the Source\nCode, clearly describing the additions, changes or deletions You made.\nYou must include a prominent statement that the Modifications are\nderived, directly or indirectly, from the Licensed Software and include\nthe names of the Licensor and any Contributor to the Licensed Software\nin (i) the Source Code and (ii) in any notice displayed by the Licensed\nSoftware You distribute or in related documentation in which You\ndescribe the origin or ownership of the Licensed Software. You may not\nmodify or delete any pre-existing copyright notices, change notices or\nLicense text in the Licensed Software without written permission of the\nrespective Licensor or Contributor.\n\n6.3 Intellectual Property Matters.\na. Third Party Claims. If You have knowledge that a license to a third\nparty's intellectual property right is required to exercise the rights\ngranted by this License, You must include a human-readable file with\nYour distribution that describes the claim and the party making the\nclaim in sufficient detail that a recipient will know whom to contact.\nb. Contributor APIs. If Your Extensions include an application\nprogramming interface (\"API\") and You have knowledge of patent licenses\nthat are reasonably necessary to implement that API, You must also\ninclude this information in a human-readable file supplied with Your\ndistribution.\nc. Representations. You represent that, except as disclosed pursuant to\n6.3(a) above, You believe that any Extensions You distribute are Your\noriginal creations and that You have sufficient rights to grant the\nrights conveyed by this License.\n\n6.4 Required Notices.\n\na. License Text. You must duplicate this License or instructions on how\nto acquire a copy in any documentation You provide along with the Source\nCode of any Extensions You create or to which You contribute, wherever\nYou describe recipients' rights relating to Licensed Software.\n\nb. License Notice. You must duplicate any notice contained in EXHIBIT A\n(the \"License Notice\") in each file of the Source Code of any copy You\ndistribute of the Licensed Software and Your Extensions. If You create\nan Extension, You may add Your name as a Contributor to the Source Code\nand accompanying documentation along with a description of the\ncontribution. If it is not possible to put the License Notice in a\nparticular Source Code file due to its structure, then You must include\nsuch License Notice in a location where a user would be likely to look\nfor such a notice.\n\nc. User-Visible Attribution. You must duplicate any notice contained in\nEXHIBIT B (the \"User-Visible Attribution Notice\") in each user-visible\ndisplay of the Licensed Software and Your Extensions which delineates\ncopyright, ownership, or similar attribution information. If You create\nan Extension, You may add Your name as a Contributor, and add Your\nattribution notice, as an equally visible and functional element of any\nUser-Visible Attribution Notice content. To ensure proper attribution,\nYou must also include such User-Visible Attribution Notice in at least\none location in the Software documentation where a user would be likely\nto look for such notice.\n\n6.5 Additional Terms. You may choose to offer, and charge a fee for,\nwarranty, support, indemnity or liability obligations to one or more\nrecipients of Licensed Software. However, You may do so only on Your own\nbehalf, and not on behalf of the Licensor or any Contributor except as\npermitted under other agreements between you and Licensor or\nContributor. You must make it clear that any such warranty, support,\nindemnity or liability obligation is offered by You alone, and You\nhereby agree to indemnify the Licensor and every Contributor for any\nliability plus attorney fees, costs, and related expenses due to any\nsuch action or claim incurred by the Licensor or such Contributor as a\nresult of warranty, support, indemnity or liability terms You offer.\n\n6.6 Conflicts With Other Licenses. Where any portion of Your Extensions,\nby virtue of being Derivative Works of another product or similar\ncircumstance, fall under the terms of another license, the terms of that\nlicense should be honored however You must also make Your Extensions\navailable under this License. If the terms of this License continue to\nconflict with the terms of the other license you may write the Licensor\nfor permission to resolve the conflict in a fashion that remains\nconsistent with the intent of this License. Such permission will be\ngranted at the sole discretion of the Licensor.\n\n7.0 Versions of This License. Licensor may publish from time to time\nrevised versions of the License. Once Licensed Software has been\npublished under a particular version of the License, You may always\ncontinue to use it under the terms of that version. You may also choose\nto use such Licensed Software under the terms of any subsequent version\nof the License published by Licensor. No one other than Licensor has the\nright to modify the terms applicable to Licensed Software created under\nthis License.\n\n7.1 If You create or use a modified version of this License, which You\nmay do only in order to apply it to software that is not already\nLicensed Software under this License, You must rename Your license so\nthat it is not confusingly similar to this License, and must make it\nclear that Your license contains terms that differ from this License. In\nso naming Your license, You may not use any trademark of Licensor or of\nany Contributor. Should Your modifications to this License be limited to\nalteration of a) Section 13.8 solely to modify the legal Jurisdiction or\nVenue for disputes, b) EXHIBIT A solely to define License Notice text,\nor c) to EXHIBIT B solely to define a User-Visible Attribution Notice,\nYou may continue to refer to Your License as the Reciprocal Community\nLicense or simply the RCL.\n\n8.0 Disclaimer of Warranty. LICENSED SOFTWARE IS PROVIDED UNDER THIS\nLICENSE ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER\nEXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE\nLICENSED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR\nPURPOSE OR NON-INFRINGING. FURTHER THERE IS NO WARRANTY MADE AND ALL\nIMPLIED WARRANTIES ARE DISCLAIMED THAT THE LICENSED SOFTWARE MEETS OR\nCOMPLIES WITH ANY DESCRIPTION OF PERFORMANCE OR OPERATION, SAID\nCOMPATIBILITY AND SUITABILITY BEING YOUR RESPONSIBILITY. LICENSOR\nDISCLAIMS ANY WARRANTY, IMPLIED OREXPRESSED,THAT ANY CONTRIBUTOR'S\nEXTENSIONS MEET ANY STANDARD OF COMPATIBILITY OR DESCRIPTION OF\nPERFORMANCE. THE ENTIRE RISK AS TO THE QUALITY ANDPERFORMANCE OF THE\nLICENSED SOFTWARE IS WITH YOU. SHOULD LICENSED SOFTWARE PROVE DEFECTIVE\nIN ANY RESPECT, YOU (AND NOT THE LICENSOR OR ANY OTHER CONTRIBUTOR)\nASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. UNDER\nTHE TERMS OF THIS LICENSOR WILL NOT SUPPORT THIS SOFTWARE AND IS UNDER\nNO OBLIGATION TO ISSUE UPDATES TO THIS SOFTWARE. LICENSOR HAS NO\nKNOWLEDGE OF ERRANT CODE OR VIRUS IN THIS SOFTWARE, BUT DOES NOT WARRANT\nTHAT THE SOFTWARE IS FREE FROM SUCH ERRORS OR VIRUSES. THIS DISCLAIMER\nOF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF\nLICENSED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.\n\n9.0 Limitation of Liability. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL\nTHEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE,\nSHALL THE LICENSOR, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF LICENSED\nSOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY\nPERSON FOR ANY INDIRECT,SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF\nANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF\nGOODWILL, WORK STOPPAGE, COMPUTERFAILURE OR MALFUNCTION, OR ANY AND ALL\nOTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN\nINFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF\nLIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY\nRESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENTAPPLICABLE LAW\nPROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION\nOR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THISEXCLUSION\nAND LIMITATION MAY NOT APPLY TO YOU.\n\n10.0 Restricted Rights Legend. This Specification is provided with\nRestricted Rights. Use, duplication or disclosure by the U.S. government\nis subject to restrictions as set forth in (a) this Agreement pursuant\nto DFARs 227.7202-3(a); (b) subparagraph (c)(1)(i) of the Rights in\nTechnical Data and Computer Software clause at DFARs 252.227-7013; or\n(c) the Commercial Computer Software Restricted Rights clause at FAR\n52.227-19 subdivision (c)(1) and (2), as applicable. Contractor /\nmanufacturer are the OPC Foundation,. 16101 N. 82nd Street, Suite 3B,\nScottsdale, AZ, 85260-1830 11.0 Responsibility for Claims. As between\nLicensor and Contributors, each party is responsible for claims and\ndamages arising, directly or indirectly, out of its utilization of\nrights under this License which specifically disclaims warranties and\nlimits any liability of the Licensor. This paragraph is to be used in\nconjunction with and controlled by the Disclaimer Of Warranties of\nSection 8, the Limitation Of Damages in Section 9, and the disclaimer\nagainst use for High Risk Activities in Section 10. The Licensor has\nthereby disclaimed all warranties and limited any damages that it is or\nmay be liable for. You agree to work with Licensor and Contributors to\ndistribute such responsibility on an equitable basis consistent with the\nterms of this License including Sections 8, 9, and 10. Nothing herein is\nintended or shall be deemed to constitute any admission of liability.\n\n12.0 Termination. This License and all rights granted hereunder will\nterminate immediately in the event of the circumstances described in\nSection 136 or if applicable law prohibits or restricts You from fully\nand or specifically complying with Sections 3, 4 and/or 6, or prevents\nthe enforceability of any of those Sections, and You must immediately\ndiscontinue any use of Licensed Software.\n\n12.1 Automatic Termination Upon Breach. This License and the rights\ngranted hereunder will terminate automatically if You fail to comply\nwith the terms herein and fail to cure such breach within thirty (30)\ndays of becoming aware of the breach. All sublicenses to the Licensed\nSoftware that are properly granted shall survive any termination of this\nLicense. Provisions that, by their nature, must remain in effect beyond\nthe termination of this License, shall survive.\n\n12.2 Termination Upon Assertion of Patent Infringement. If You initiate\nlitigation by asserting a patent infringement claim (excluding\ndeclaratory judgment actions) against Licensor or a Contributor\n(Licensor or Contributor against whom You file such an action is\nreferred to herein as \"Respondent\") alleging that Licensed Software\ndirectly or indirectly infringes any patent, then any and all rights\ngranted by such Respondent to You under Sections 3 or 4 of this License\nshall terminate prospectively upon sixty (60) days notice from\nRespondent (the \"Notice Period\") unless within that Notice Period You\neither agree in writing (i) to pay Respondent a mutually agreeable\nreasonably royalty for Your past or future use of Licensed Software made\nby such Respondent, or (ii) withdraw Your litigation claim with respect\nto Licensed Software against such Respondent. If within said Notice\nPeriod a reasonable royalty and payment arrangement are not mutually\nagreed upon in writing by the parties or the litigation claim is not\nwithdrawn, the rights granted by Licensor to You under Sections 3 and 4\nautomatically terminate at the expiration of said Notice Period.\n\n12.3 Reasonable Value of This License. If You assert a patent\ninfringement claim against Respondent alleging that Licensed Software\ndirectly or indirectly infringes any patent where such claim is resolved\n(such as by license or settlement) prior to the initiation of patent\ninfringement litigation, then the reasonable value of the licenses\ngranted by said Respondent under Sections 3 and 4 shall be taken into\naccount in determining the amount or value of any payment or license.\n\n12.4 No Retroactive Effect of Termination. In the event of termination\nunder this Section all end user license agreements (excluding licenses\nto distributors and resellers) that have been validly granted by You or\nany distributor hereunder prior to termination shall survive termination.\n\n13.0 Miscellaneous.\n\n13.1 U.S. Government End Users. The Licensed Software is a \"commercial\nitem,\" as that term is defined in 48 C.F.R. 2.101 (Oct. 1995),\nconsisting of \"commercial computer software\" and \"commercial computer\nsoftware documentation,\" as such terms are used in 48 C.F.R. 12.212\n(Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1\nthrough 227.7202-4 (June 1995), all U.S. Government End Users acquire\nLicensed Software with only those rights set forth herein.\n\n13.2 Relationship of Parties. This License will not be construed as\ncreating an agency, partnership, joint venture, or any other form of\nlegal association between or among You, Licensor, or any Contributor,\nand You will not represent to the contrary, whether expressly, by\nimplication, appearance, or otherwise.\n\n13.3 Independent Development. Nothing in this License will impair\nLicensor's right to acquire, license, develop, subcontract, market, or\ndistribute technology or products that perform the same or similar\nfunctions as, or otherwise compete with, Extensions that You may\ndevelop, produce, market, or distribute.\n\n13.4 Consent To Breach Not Waiver. Failure by Licensor or Contributor to\nenforce any provision of this License will not be deemed a waiver of\nfuture enforcement of that or any other provision.\n\n13.5 Severability. This License represents the complete agreement\nconcerning the subject matter hereof. If any provision of this License\nis held to be unenforceable, such provision shall be reformed only to\nthe extent necessary to make it enforceable.\n\n13.6 Inability to Comply Due to Statute or Regulation. If it is\nimpossible for You to comply with any of the terms of this License with\nrespect to some or all of the Licensed Software due to statute, judicial\norder, or regulation, then You cannot use, modify, or distribute the\nsoftware.\n\n13.7 Export Restrictions. You may be restricted with respect to\ndownloading or otherwise acquiring, exporting, or reexporting the\nLicensed Software or any underlying information or technology by United\nStates and other applicable laws and regulations. By downloading or by\notherwise obtaining the Licensed Software, You are agreeing to be\nresponsible for compliance with all applicable laws and regulations.\n\n13.8 Arbitration, Jurisdiction & Venue. This License shall be governed\nby Minnesota law provisions (except to the extent applicable law, if\nany, provides otherwise), excluding its conflict-of-law provisions. You\nexpressly agree that any dispute relating to this License shall be\nsubmitted to binding arbitration under the rules then prevailing of the\nAmerican Arbitration Association. You further agree that Minnesota USA\nis proper venue and grant such arbitration proceeding jurisdiction as\nmay be appropriate for purposes of resolving any dispute under this\nLicense. Judgment upon any award made in arbitration may be entered and\nenforced in any court of competent jurisdiction. The arbitrator shall\naward attorney's fees and costs of arbitration to the prevailing party.\nShould either party find it necessary to enforce its arbitration award\nor seek specific performance of such award in a civil court of competent\njurisdiction, the prevailing party shall be entitled to reasonable\nattorney's fees and costs. The application of the United Nations\nConvention on Contracts for the International Sale of Goods is expressly\nexcluded. You and Licensor expressly waive any rights to a jury trial in\nany litigation concerning Licensed Software or this License. Any law or\nregulation that provides that the language of a contract shall be\nconstrued against the drafter shall not apply to this License.\n\n13.9 Entire Agreement. This License constitutes the entire agreement\nbetween the parties with respect to the subject matter hereof.\n\nEXHIBIT A\n\nThe License Notice below must appear in each file of the Source Code of\nany copy You distribute of the Licensed Software or any Extensions thereto:\n\nUnless explicitly acquired and licensed from Licensor under another\nlicense, the contents of this file are subject to the Reciprocal\nCommunity License (\"RCL\") Version 0.9, or subsequent versions as allowed\nby the RCL, and You may not copy or use this file in either source code\nor executable form, except in compliance with the terms and conditions\nof the RCL.\n\nAll software distributed under the RCL is provided strictly on an \"AS\nIS\" basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND\nLICENSOR HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT\nLIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\nPURPOSE, QUIET ENJOYMENT, OR NON-INFRINGEMENT. See the RCL for specific\nlanguage governing rights and limitations under the RCL.\n\nEXHIBIT B\n\nThe User-Visible Attribution Notice below, when provided, must appear in\neach user-visible display as defined in Section 6.4 (c): “Portions\ncopyright © by OPC Foundation, Inc. and licensed under the Reciprocal\nCommunity License (RCL)\n\n---------------------------------------------------------\n\nhttps://opcfoundation.org/license/gpl.html\n\n                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n---------------------------------------------------------\n\nhttps://opcfoundation.org/license/mit.html\n\nMIT License\n\nOPC Foundation MIT License 1.00\n\nCopyright (c) 2008-2022 OPC Foundation, Inc. Permission is hereby granted, \nfree of charge, to any person obtaining a copy of this software and associated \ndocumentation files (the \"Software\"), to deal in the Software without \nrestriction, including without limitation the rights to use, copy, modify, \nmerge, publish, distribute, sublicense, and/or sell copies of the Software, \nand to permit persons to whom the Software is furnished to do so, subject to \nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included in all \ncopies or substantial portions of the Software. \n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE \nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE \nSOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Client 1.4.368.58 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Client.ComplexTypes 1.4.368.58 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Configuration 1.4.368.58 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Security.Certificates 1.4.368.58 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Server 1.4.368.58 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nBuildBundlerMinifier 3.2.449 - Apache-2.0\n\n\nCopyright 2017\nCopyright James Newton-King 2008\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nCastle.Core 5.1.0 - Apache-2.0\n\n\n(c) 2004-2022 Castle Project - http://www.castleproject.org\nCopyright 2004-2021 Castle Project - http://www.castleproject.org\nCopyright (c) 2004-2022 Castle Project - http://www.castleproject.org\n\nCopyright 2004-2021 Castle Project - http://www.castleproject.org/\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nFluentAssertions 6.7.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nFluentValidation 11.2.2 - Apache-2.0\n\n\n(c) Jeremy Skinner, .NET Foundation, and contributors 2008-2022\nCopyright (c) Jeremy Skinner, .NET Foundation, and contributors 2008-2022\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nFluentValidation.DependencyInjectionExtensions 11.2.2 - Apache-2.0\n\n\n(c) Jeremy Skinner, .NET Foundation, and contributors 2008-2022\nCopyright (c) Jeremy Skinner, .NET Foundation, and contributors 2008-2022\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nIdentityModel 6.0.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nIdentityModel.OidcClient 3.1.2 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Authentication.Abstractions 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Authorization 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Authorization.Policy 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Cryptography.Internal 3.1.24 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.DataProtection 3.1.24 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.DataProtection.Abstractions 3.1.24 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.DataProtection.AzureKeyVault 3.1.24 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.DataProtection.AzureStorage 3.1.24 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Hosting 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Hosting.Abstractions 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Hosting.Abstractions 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Hosting.Server.Abstractions 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Hosting.Server.Abstractions 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http 2.1.22 - Apache-2.0\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation and Contributors\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Abstractions 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Abstractions 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Connections 1.1.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Connections.Client 5.0.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation.\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Connections.Common 5.0.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation.\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Extensions 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Extensions 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Features 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Features 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Routing 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Routing.Abstractions 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR 1.1.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR.Core 1.1.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR.Protocols.Json 1.1.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.WebSockets 2.2.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.WebUtilities 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.WebUtilities 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Binder 2.0.0 - Apache-2.0\n\n\nCopyright Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.EnvironmentVariables 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.FileExtensions 3.1.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Json 3.1.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.FileProviders.Physical 3.1.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.FileSystemGlobbing 3.1.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Hosting.Abstractions 3.1.8 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.ObjectPool 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.ObjectPool 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Options.ConfigurationExtensions 2.0.0 - Apache-2.0\n\n\nCopyright Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Net.Http.Headers 2.1.1 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Net.Http.Headers 2.2.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNuGet.Frameworks 5.11.0 - Apache-2.0\n\n\n(c) Microsoft Corporation.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nRoslynator.Analyzers 3.1.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog 2.10.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog 2.12.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.AspNetCore 6.0.1 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Extensions.Hosting 5.0.1 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Extensions.Logging 3.1.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Formatting.Compact 1.1.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Settings.Configuration 3.3.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Sinks.ApplicationInsights 4.0.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Sinks.Console 4.0.1 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Sinks.Console 4.1.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Sinks.Debug 2.0.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Sinks.File 5.0.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSerilog.Sinks.Trace 3.0.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nWindowsAzure.Storage 9.3.2 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nWindowsAzure.Storage 9.3.3 - Apache-2.0\n\n\n(c) Microsoft Corporation.\nCopyright 2018 Microsoft Corp.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.abstractions 2.0.3 - Apache-2.0\n\n\nCopyright (c) Outercurve Foundation\nCopyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.analyzers 1.0.0 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\nCopyright (c) .NET Foundation xUnit.net\nCopyright (c) .NET Foundation xunit.analyzers, analyzers, roslyn, xunit, xunit.net\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.assert 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\nCopyright (c) .NET Foundation xUnit.net\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.core 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.extensibility.core 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\nCopyright (c) .NET Foundation xUnit.net\nCopyright (c) .NET Foundation 0xUnit.net\nCopyright (c) .NET Foundation xUnit.net Runner Utility\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.extensibility.execution 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\nCopyright (c) .NET Foundation xUnit.net\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.CommonDataModel.ObjectModel 1.0.15 - Apache-2.0 AND MS-PL AND MS-RL\n\n\n(c) Microsoft Corporation.\n\nApache-2.0 AND MS-PL AND MS-RL\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAntlr4 4.6.6 - BSD-3-Clause\n\n\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAntlr4.CodeGenerator 4.6.6 - BSD-3-Clause\n\n\nCopyright Sam Harwell 2011\nCopyright Sam Harwell 2015\nCopyright Sam Harwell 2016\nCopyright (c) Sam Harwell 2015\nCopyright (c) Terence Parr, Sam Harwell.\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAntlr4.Runtime 4.6.6 - BSD-3-Clause\n\n\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMoq 4.18.2 - BSD-3-Clause\n\n\nCopyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, and Contributors\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNLog 4.6.7 - BSD-3-Clause\n\n\nCopyright (c) 2004-2019 NLog Project\nACopyright (c) 2004-2019 NLog Project\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Data.Edm 5.8.4 - mit\n\n\n(c) Microsoft Corporation.\n\nmit\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Data.OData 5.8.4 - mit\n\n\n(c) Microsoft Corporation.\n\nmit\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAccelist.FluentValidation.Blazor 4.0.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutofac 5.2.0 - MIT\n\n\nCopyright 2015 Autofac\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutofac.Extensions.DependencyInjection 6.0.0 - MIT\n\n\nCopyright 2015 Autofac\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutofac.Extras.Moq 5.0.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutoFixture 4.17.0 - MIT\n\n\nCopyright Ploeh 2011\nCopyright (c) Ploeh 2011\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutoFixture.AutoMoq 4.17.0 - MIT\n\n\nCopyright Ploeh 2011\nCopyright (c) Ploeh 2011\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Core 1.21.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Core 1.22.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Core 1.25.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Identity 1.4.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Storage.Blobs 12.14.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Storage.Common 12.13.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Storage.Files.DataLake 12.12.1 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nBlazored.Modal 4.1.0 - MIT\n\n\nCopyright 2018 (c) Chris Sainty.\n5Copyright 2018 (c) Chris Sainty.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nBlazored.SessionStorage 2.2.0 - MIT\n\n\n(c) Chris Sainty.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncoverlet.collector 3.1.2 - MIT\n\n\nCopyright 2008 - 2018 Jb Evain\nCopyright Microsoft Corporation\nCopyright James Newton-King 2008\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncoverlet.msbuild 3.1.2 - MIT\n\n\nCopyright 2008 - 2018 Jb Evain\nCopyright Microsoft Corporation\nCopyright James Newton-King 2008\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nFare 2.1.1 - MIT\n\n\nCopyright Nikos Baxevanis 2016\nCopyright (c) Nikos Baxevanis 2016 Regex Test NFA DFA Automaton\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nJetBrains.Annotations 2021.2.0 - MIT\n\n\nCopyright (c) 2016 JetBrains http://www.jetbrains.com\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nJson.More.Net 1.7.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) 2022 Greg Dennis\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nJsonPointer.Net 2.2.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) 2020 Greg Dennis\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nJsonSchema.Net 3.2.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) 2022 Greg Dennis\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMessagePack 2.4.35 - MIT\n\n\n(c) Yoshifumi Kawai and contributors\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2017 Yoshifumi Kawai and contributors\n\nMessagePack for C#\n\nMIT License\n\nCopyright (c) 2017 Yoshifumi Kawai and contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---\n\nlz4net\n\nCopyright (c) 2013-2017, Milosz Krajewski\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMessagePack.Annotations 2.4.35 - MIT\n\n\n(c) Yoshifumi Kawai and contributors\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2017 Yoshifumi Kawai and contributors\n\nMessagePack for C#\n\nMIT License\n\nCopyright (c) 2017 Yoshifumi Kawai and contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---\n\nlz4net\n\nCopyright (c) 2013-2017, Milosz Krajewski\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.ApplicationInsights 2.21.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.ApplicationInsights.AspNetCore 2.21.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.ApplicationInsights.DependencyCollector 2.21.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.ApplicationInsights.EventCounterCollector 2.21.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.ApplicationInsights.PerfCounterCollector 2.21.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.ApplicationInsights.WindowsServer 2.21.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.ApplicationInsights.WindowsServer.TelemetryChannel 2.21.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Authentication.AzureAD.UI 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Authentication.JwtBearer 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Authentication.OpenIdConnect 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Authorization 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Components 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) 2014 Waybury\nCopyright (c) 1998 John D. Polstra\nCopyright (c) 2013 - 2018 AngleSharp\nCopyright (c) 2000-2013 Julian Seward\nCopyright (c) 2011-2018 Twitter, Inc.\nCopyright (c) 1996-1998 John D. Polstra\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2011, The Outercurve Foundation\nCopyright (c) 2011-2018 The Bootstrap Authors\nCopyright (c) 2007 John Birrell (jb@freebsd.org)\nCopyright (c) 1989, 1993 The Regents of the University of California\nCopyright (c) 1990, 1993 The Regents of the University of California\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Components.Analyzers 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) 2014 Waybury\nCopyright (c) 1998 John D. Polstra\nCopyright (c) 2013 - 2018 AngleSharp\nCopyright (c) 2000-2013 Julian Seward\nCopyright (c) 2011-2018 Twitter, Inc.\nCopyright (c) 1996-1998 John D. Polstra\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2011, The Outercurve Foundation\nCopyright (c) 2011-2018 The Bootstrap Authors\nCopyright (c) 2007 John Birrell (jb@freebsd.org)\nCopyright (c) 1989, 1993 The Regents of the University of California\nCopyright (c) 1990, 1993 The Regents of the University of California\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Components.Forms 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) 2014 Waybury\nCopyright (c) 1998 John D. Polstra\nCopyright (c) 2013 - 2018 AngleSharp\nCopyright (c) 2000-2013 Julian Seward\nCopyright (c) 2011-2018 Twitter, Inc.\nCopyright (c) 1996-1998 John D. Polstra\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2011, The Outercurve Foundation\nCopyright (c) 2011-2018 The Bootstrap Authors\nCopyright (c) 2007 John Birrell (jb@freebsd.org)\nCopyright (c) 1989, 1993 The Regents of the University of California\nCopyright (c) 1990, 1993 The Regents of the University of California\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Components.Web 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) 2014 Waybury\nCopyright (c) 1998 John D. Polstra\nCopyright (c) 2013 - 2018 AngleSharp\nCopyright (c) 2000-2013 Julian Seward\nCopyright (c) 2011-2018 Twitter, Inc.\nCopyright (c) 1996-1998 John D. Polstra\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2011, The Outercurve Foundation\nCopyright (c) 2011-2018 The Bootstrap Authors\nCopyright (c) 2007 John Birrell (jb@freebsd.org)\nCopyright (c) 1989, 1993 The Regents of the University of California\nCopyright (c) 1990, 1993 The Regents of the University of California\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Connections.Abstractions 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Connections.Client 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Http.Connections.Common 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.JsonPatch 6.0.0-rc.1.21452.15 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.JsonPatch 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Metadata 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Mvc.NewtonsoftJson 6.0.0-rc.1.21452.15 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2007 James Newton-King\nCopyright (c) Microsoft Corporation.\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Mvc.NewtonsoftJson 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Mvc.Testing 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Mvc.Versioning 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) Microsoft Corporation. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR.Client 6.0.10 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR.Client.Core 6.0.10 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR.Common 6.0.10 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR.Protocols.Json 6.0.10 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR.Protocols.MessagePack 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.SignalR.Protocols.NewtonsoftJson 6.0.10 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.TestHost 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Core.NewtonsoftJson 1.0.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.EventHubs 4.3.2 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.EventHubs.Processor 4.3.2 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.KeyVault 3.0.5 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.KeyVault.Core 2.0.4 - MIT\n\n\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.KeyVault.Core 3.0.3 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.KeyVault.WebKey 3.0.5 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.ApplicationInsights 0.3.0-preview - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2019 Microsoft\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.AppService.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Authorization 2.12.0-preview - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2019 Microsoft\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.BatchAI.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Cdn.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Compute.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.ContainerInstance.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.ContainerRegistry.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.ContainerService.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.CosmosDB.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Dns.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.EventHub.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Graph.RBAC.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.IotHub 4.2.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.KeyVault.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Locks.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Monitor.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Msi.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Network.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.OperationalInsights 0.23.0-preview - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.PrivateDns.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Redis.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.ResourceManager.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Search.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.ServiceBus.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.SignalR 1.1.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2019 Microsoft\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Sql.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.Storage.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Management.TrafficManager.Fluent 1.38.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.ServiceBus 5.2.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Services.AppAuthentication 1.0.3 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Microsoft Corporation.\n9Copyright (c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Services.AppAuthentication 1.6.2 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2019 Microsoft\nCopyright (c) Microsoft Corporation.\n9Copyright (c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.SignalR 1.18.3 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.SignalR.Management 1.18.3 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.SignalR.Protocols 1.18.3 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Storage.Blob 10.0.1 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright 2019 Microsoft Corp.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Storage.Blob 11.1.7 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Storage.Common 10.0.1 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright 2019 Microsoft Corp.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Storage.Common 11.1.7 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright 2019 Microsoft Corp.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Bcl.AsyncInterfaces 1.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Bcl.AsyncInterfaces 1.1.1 - MIT\n\n\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Build.Tasks.Git 1.1.1 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.ApiDescription.Server 6.0.5 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Caching.Abstractions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration 6.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2020 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Abstractions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Binder 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.CommandLine 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.EnvironmentVariables 6.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2020 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.FileExtensions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Ini 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Json 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.UserSecrets 6.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2020 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyInjection 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyInjection 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyInjection 6.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2020 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyInjection.Abstractions 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyInjection.Abstractions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyModel 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Diagnostics.HealthChecks 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Features 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.FileProviders.Abstractions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.FileProviders.Physical 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.FileSystemGlobbing 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Hosting 6.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2020 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Hosting.Abstractions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Http 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Abstractions 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Abstractions 6.0.2 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2020 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.ApplicationInsights 2.21.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Configuration 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Console 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Debug 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.EventLog 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.EventSource 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Options 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Options 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Options.ConfigurationExtensions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Primitives 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Graph.Auth 1.0.0-preview.7 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2018 Microsoft Graph\n\nMIT License\n\nCopyright (c) 2018 Microsoft Graph\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Client 4.30.1 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Client 4.47.2 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Client.Extensions.Msal 2.18.4 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Abstractions 6.22.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Abstractions 6.24.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Clients.ActiveDirectory 3.14.2 - MIT\n\n\nCopyright (c) Microsoft Corporation.\n9Copyright (c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Clients.ActiveDirectory 5.2.9 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.JsonWebTokens 5.4.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.JsonWebTokens 5.5.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.JsonWebTokens 6.24.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Logging 1.1.2 - MIT\n\n\nCopyright (c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Logging 5.4.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Logging 5.5.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Logging 6.24.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Protocols 6.24.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Protocols.OpenIdConnect 6.24.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Tokens 5.1.2 - MIT\n\n\nCopyright (c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Tokens 5.4.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Tokens 5.5.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Tokens 6.24.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.JSInterop 6.0.10 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.NET.StringTools 1.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2015 Christian Klutz\nCopyright (c) .NET Foundation and Contributors\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Rest.ClientRuntime 2.3.20 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Rest.ClientRuntime 2.3.21 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2019 Microsoft\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Rest.ClientRuntime 2.3.24 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Rest.ClientRuntime.Azure 3.3.18 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Rest.ClientRuntime.Azure 3.3.19 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Rest.ClientRuntime.Azure.Authentication 2.4.1 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2019 Microsoft\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.SourceLink.Common 1.1.1 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.SourceLink.GitHub 1.1.1 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Win32.SystemEvents 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMono.Options 6.12.0.148 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 1990-2009 Info-ZIP.\nCopyright (c) .NET Foundation Contributors\ncopyrighted by the Free Software Foundation\nCopyright (c) 1989, 1991 Free Software Foundation, Inc.\nCopyright 2006 James Newton-King http://www.newtonsoft.com\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnbgv 3.5.113 - MIT\n\n\nCopyright (c) Manuel Romer\nCopyright 1995-2017 Mark Adler\nCopyright James Newton-King 2008\nCopyright LibGit2Sharp contributors\nCopyright (c) 2007 James Newton-King\nCopyright (c) LibGit2Sharp contributors\nCopyright James Newton-King 2008 Json.NET\nCopyright 1995-2017 Mark Adler +3 CScs DEFG\nCopyright (c) .NET Foundation and Contributors\nCopyright 1995-2017 Jean-loup Gailly and Mark Adler\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNerdbank.GitVersioning 3.5.113 - MIT\n\n\nCopyright 1995-2017 Mark Adler\nCopyright James Newton-King 2008\nCopyright LibGit2Sharp contributors\nCopyright James Newton-King 2008 Json.NET\nCopyright 1995-2017 Mark Adler +3 CScs DEFG\nCopyright (c) .NET Foundation and Contributors\nCopyright AssemblyCompany AssemblyConfiguration\nCopyright 1995-2017 Jean-loup Gailly and Mark Adler\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNewtonsoft.Json 10.0.3 - MIT\n\n\nCopyright James Newton-King 2008\nCopyright (c) 2007 James Newton-King\nCopyright James Newton-King 2008 Json.NET\n\nThe MIT License (MIT)\n\nCopyright (c) 2007 James Newton-King\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNewtonsoft.Json 13.0.1 - MIT\n\n\nCopyright James Newton-King 2008\nCopyright (c) 2007 James Newton-King\nCopyright (c) James Newton-King 2008\nCopyright James Newton-King 2008 Json.NET\n\nThe MIT License (MIT)\n\nCopyright (c) 2007 James Newton-King\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNewtonsoft.Json.Bson 1.0.2 - MIT\n\n\nCopyright James Newton-King 2017\nCopyright (c) 2017 James Newton-King\nCopyright (c) James Newton-King 2017\n\nThe MIT License (MIT)\n\nCopyright (c) 2017 James Newton-King\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Client 1.4.370.12 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Client.ComplexTypes 1.4.370.12 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Configuration 1.4.370.12 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Security.Certificates 1.4.370.12 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOPCFoundation.NetStandard.Opc.Ua.Server 1.4.370.12 - MIT\n\n\nCopyright 2004-2022 OPC Foundation, Inc\nCopyright (c) 2008-2022 OPC Foundation, Inc.\nCopyright (c) 2004-2022 OPC Foundation, Inc OPCFoundation OPC\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nprometheus-net 6.0.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nprometheus-net.AspNetCore 6.0.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore 6.4.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.Annotations 6.4.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.Newtonsoft 6.4.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.Swagger 6.4.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.SwaggerGen 6.4.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.SwaggerUI 6.4.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Configuration.ConfigurationManager 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Diagnostics.EventLog 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Diagnostics.PerformanceCounter 4.7.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Drawing.Common 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Formats.Asn1 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IdentityModel.Tokens.Jwt 5.4.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IdentityModel.Tokens.Jwt 5.5.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IdentityModel.Tokens.Jwt 6.24.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IO.FileSystem.AccessControl 4.7.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IO.Hashing 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IO.Pipelines 6.0.3 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2020 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Memory 4.5.4 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 1991-2017 Unicode, Inc.\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Memory.Data 1.0.2 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Net.WebSockets.WebSocketProtocol 4.5.3 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 1991-2017 Unicode, Inc.\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Runtime.Caching 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Runtime.CompilerServices.Unsafe 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.AccessControl 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.Cryptography.Pkcs 4.7.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.Cryptography.ProtectedData 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.Cryptography.Xml 4.7.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.Permissions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Spatial 5.8.4 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Text.Encodings.Web 4.7.2 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Text.Encodings.Web 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Text.Json 4.7.2 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Text.Json 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Text.Json 6.0.2 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2020 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Threading.Channels 4.5.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 1991-2017 Unicode, Inc.\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Threading.Channels 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.ValueTuple 4.5.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 1991-2017 Unicode, Inc.\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Windows.Extensions 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.runner.visualstudio 2.4.5 - MIT\n\n\nCopyright (c) .NET Foundation\nCopyright (c) 2015 .NET Foundation\nCopyright (c) Outercurve Foundation\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) .NET Foundation xUnit.net Runner Utility\nCopyright (c) .NET Foundation ,xUnit.net Runner Utility\nCopyright (c) .NET Foundation 1xUnit.net Runner Utility\nCopyright (c) .NET Foundation xUnit.net Runner Reporters\nCopyright (c) .NET Foundation .xUnit.net Runner Reporters\nCopyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS\nCopyright (c) .NET Foundation and Contributors. Visual Studio 2019\n\nUnless otherwise noted, the source code here is covered by the following license:\n\n    Copyright (c) .NET Foundation and Contributors\n    All Rights Reserved\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n-----------------------\n\nThe code in src/xunit.runner.visualstudio/Utility/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from:\n    https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions\n\nThe code in src/xunit.runner.visualstudio/Utility/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from:\n    https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel\n\nBoth sets of code are covered by the following license:\n\n    The MIT License (MIT)\n\n    Copyright (c) 2015 .NET Foundation\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nValidation 2.4.18 - MS-PL\n\n\n\nMicrosoft Public License (Ms-PL)\n\nThis license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\n\n   1. Definitions\n\n   The terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the same meaning here as under U.S. copyright law. A \"contribution\" is the original software, or any additions or changes to the software. A \"contributor\" is any person that distributes its contribution under this license. \"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\n\n   2. Grant of Rights\n\n      (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\n\n      (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\n\n   3. Conditions and Limitations\n\n      (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\n\n      (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\n\n      (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\n\n      (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\n\n      (E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nXunit.SkippableFact 1.4.13 - MS-PL\n\n\n\nMicrosoft Public License (Ms-PL)\n\nThis license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\n\n   1. Definitions\n\n   The terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the same meaning here as under U.S. copyright law. A \"contribution\" is the original software, or any additions or changes to the software. A \"contributor\" is any person that distributes its contribution under this license. \"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\n\n   2. Grant of Rights\n\n      (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\n\n      (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\n\n   3. Conditions and Limitations\n\n      (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\n\n      (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\n\n      (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\n\n      (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\n\n      (E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\n\n---------------------------------------------------------\n\nNOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties.\nMicrosoft makes certain open source code available at https://3rdpartysource.microsoft.com,\nor you may send a check or money order for US $5.00, including the product name,\nthe open source component name, platform, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the extent\nrequired to debug changes to any libraries licensed under the GNU Lesser General Public License.\n\n---------------------------------------------------------\n\nCastle.Core 4.0.0 - Apache-2.0\n\n\nCopyright 2004-2016 Castle Project\nCopyright 2004-2017 Castle Project\nCopyright (c) 2004-2017 Castle Project\nECopyright (c) 2004-2017 Castle Project\n\nCopyright 2004-2016 Castle Project - http://www.castleproject.org/\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nCastle.Core 5.1.1 - Apache-2.0\n\n\n(c) 2004-2022 Castle Project - http://www.castleproject.org\nCopyright 2004-2021 Castle Project - http://www.castleproject.org\nCopyright (c) 2004-2022 Castle Project - http://www.castleproject.org\n\nCopyright 2004-2021 Castle Project - http://www.castleproject.org/\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nDapr.Client 1.11.0 - Apache-2.0\n\n\nCopyright (c) Microsoft Corporation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nDapr.Extensions.Configuration 1.11.0 - Apache-2.0\n\n\nCopyright (c) Microsoft Corporation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nFluentAssertions 6.11.0 - Apache-2.0\n\n\nCopyright Dennis Doomen 2010-2023\nCopyright Dennis Doomen 2010-2023 MSTest2 xUnit NUnit MSpec NSpec TDD BDD Fluent\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNuGet.Frameworks 6.5.0 - Apache-2.0\n\n\n(c) Microsoft Corporation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOpenTelemetry.Exporter.OpenTelemetryProtocol.Logs 1.5.0-rc.1 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOpenTelemetry.Exporter.Prometheus.AspNetCore 1.4.0-rc.4 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOpenTelemetry.Instrumentation.AspNetCore 1.0.0-rc9.14 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOpenTelemetry.Instrumentation.Http 1.0.0-rc9.14 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nOpenTelemetry.Instrumentation.Runtime 1.5.0 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nRoslynator.Analyzers 4.3.0 - Apache-2.0\n\n\nCopyright (c) 2016-2023 Josef Pihrt\nCopyright (c) 2016-2023 Josef Pihrt LThis\nCopyright (c) 2016-2023 Josef Pihrt WThis\nCopyright (c) 2016-2023 Josef Pihrt Roslyn Analyzer Refactoring Productivity CodeAnalysis C CSharp\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nRoslynator.Formatting.Analyzers 4.3.0 - Apache-2.0\n\n\nCopyright (c) 2016-2023 Josef Pihrt\nCopyright (c) 2016-2023 Josef Pihrt LThis\nCopyright (c) 2016-2023 Josef Pihrt WThis\nCopyright (c) 2016-2023 Josef Pihrt Roslyn Analyzer Formatting Productivity CodeAnalysis C CSharp\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nWindowsAzure.Storage 9.3.2 - Apache-2.0\n\n\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.abstractions 2.0.3 - Apache-2.0\n\n\nCopyright (c) Outercurve Foundation\nCopyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.analyzers 1.0.0 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\nCopyright (c) .NET Foundation xUnit.net\nCopyright (c) .NET Foundation xunit.analyzers, analyzers, roslyn, xunit, xunit.net\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.assert 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\nCopyright (c) .NET Foundation xUnit.net\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.core 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.extensibility.core 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\nCopyright (c) .NET Foundation xUnit.net\nCopyright (c) .NET Foundation 0xUnit.net\nCopyright (c) .NET Foundation xUnit.net Runner Utility\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.extensibility.execution 2.4.2 - Apache-2.0\n\n\nCopyright (c) .NET Foundation\nCopyright (c) .NET Foundation xUnit.net\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMoq 4.7.0 - BSD-2-Clause\n\n\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAntlr4 4.6.6 - BSD-3-Clause\n\n\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAntlr4.CodeGenerator 4.6.6 - BSD-3-Clause\n\n\nCopyright Sam Harwell 2011\nCopyright Sam Harwell 2015\nCopyright Sam Harwell 2016\nCopyright (c) Sam Harwell 2015\nCopyright (c) Terence Parr, Sam Harwell.\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAntlr4.Runtime 4.6.6 - BSD-3-Clause\n\n\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nGoogle.Api.CommonProtos 2.2.0 - BSD-3-Clause\n\n\nCopyright 2016, Google Inc.\n\nCopyright 2016, Google Inc. All Rights Reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nGoogle.Protobuf 3.19.4 - BSD-3-Clause\n\n\nCopyright 2008 Google Inc.\nCopyright 2015, Google Inc.\nCopyright 2015, Google Inc. Protocol Buffers Binary Serialization Format Google\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMoq 4.18.4 - BSD-3-Clause\n\n\nCopyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, and Contributors\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnbgv 3.6.133 - CC-BY-4.0 AND MIT AND MS-PL\n\n\nCopyright (c) Manuel Romer\nCopyright 1995-2017 Mark Adler\nCopyright James Newton-King 2008\nCopyright LibGit2Sharp contributors\nCopyright (c) 2007 James Newton-King\nCopyright (c) LibGit2Sharp contributors\nCopyright James Newton-King 2008 Json.NET\nCopyright 1995-2017 Mark Adler +3 CScs DEFG\nCopyright (c) .NET Foundation and Contributors\nCopyright 1995-2017 Jean-loup Gailly and Mark Adler\n\nCC-BY-4.0 AND MIT AND MS-PL\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutofac 7.0.1 - MIT\n\n\nCopyright 2015 Autofac\nCopyright (c) 2015 Autofac\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutofac.Extensions.DependencyInjection 8.0.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutofac.Extras.Moq 6.1.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAutoFixture 4.18.0 - MIT\n\n\nCopyright Ploeh 2011\nCopyright (c) Ploeh 2011\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Core 1.32.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Core.Amqp 1.3.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Identity 1.9.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Messaging.EventHubs 5.9.2 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Messaging.EventHubs.Processor 5.9.2 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Security.KeyVault.Certificates 4.1.0 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Security.KeyVault.Secrets 4.5.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Storage.Blobs 12.16.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nAzure.Storage.Common 12.15.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncoverlet.msbuild 6.0.0 - MIT\n\n\nCopyright 2008 - 2018 Jb Evain\nCopyright Microsoft Corporation\nCopyright James Newton-King 2008\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nDivergic.Logging.Xunit 4.2.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nFare 2.1.1 - MIT\n\n\nCopyright Nikos Baxevanis 2016\nCopyright (c) Nikos Baxevanis 2016 Regex Test NFA DFA Automaton\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nIrony 1.2.0 - MIT\n\n\nCopyright 2019 IronyProject\nCopyright IronyProject, 2019\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nJson.More.Net 1.8.0 - MIT\n\n\n(c) Microsoft 2023\nCopyright (c) 2022 Greg Dennis\n\nMIT License\n\nCopyright (c) 2022 Greg Dennis\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Cryptography.Internal 7.0.7 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.DataProtection 7.0.7 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.DataProtection.Abstractions 7.0.7 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.JsonPatch 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Mvc.NewtonsoftJson 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright (c) 2019 David Fowler\nCopyright (c) 2016 Richard Morris\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2014-2018 Michael Daines\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019-2020 West Wind Technologies\nCopyright (c) 2010-2019 Google LLC. http://angular.io/license\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.AspNetCore.Mvc.Versioning 5.1.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) Microsoft Corporation. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Amqp 2.6.2 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Devices 1.39.0 - MIT\n\n\n(c) Microsoft 2023\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\nMicrosoft Azure IoT SDKs\nCopyright (c) Microsoft Corporation\nAll rights reserved.\nMIT License\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"\"Software\"\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Devices.Client 1.42.0 - MIT\n\n\n(c) Microsoft 2023\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\nMicrosoft Azure IoT SDKs\nCopyright (c) Microsoft Corporation\nAll rights reserved.\nMIT License\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"\"Software\"\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Azure.Devices.Shared 1.30.3 - MIT\n\n\n(c) Microsoft 2023\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\nMicrosoft Azure IoT SDKs\nCopyright (c) Microsoft Corporation\nAll rights reserved.\nMIT License\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"\"Software\"\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Bcl.AsyncInterfaces 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Build.Tasks.Git 1.1.1 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.ApiDescription.Server 6.0.5 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Caching.Abstractions 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Caching.Memory 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Abstractions 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Binder 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Binder 7.0.4 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.CommandLine 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.EnvironmentVariables 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.FileExtensions 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.Json 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Configuration.UserSecrets 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyInjection 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyInjection.Abstractions 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.DependencyModel 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.FileProviders.Abstractions 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.FileProviders.Physical 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.FileSystemGlobbing 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Hosting 7.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Hosting.Abstractions 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Http 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Abstractions 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Abstractions 7.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Configuration 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Console 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.Debug 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.EventLog 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Logging.EventSource 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Options 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Options 7.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Options.ConfigurationExtensions 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Extensions.Primitives 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Abstractions 3.2.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\n    MIT License\n\n    Copyright (c) Microsoft Corporation.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Client 4.49.1 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Client 4.54.1 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Client.Extensions.Msal 2.25.3 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Web 2.12.4 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\n    MIT License\n\n    Copyright (c) Microsoft Corporation.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Web.Certificate 2.12.4 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\n    MIT License\n\n    Copyright (c) Microsoft Corporation.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Web.Certificateless 2.12.4 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\n    MIT License\n\n    Copyright (c) Microsoft Corporation.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Web.Diagnostics 2.12.4 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\n    MIT License\n\n    Copyright (c) Microsoft Corporation.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Web.TokenAcquisition 2.12.4 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\n    MIT License\n\n    Copyright (c) Microsoft Corporation.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Identity.Web.TokenCache 2.12.4 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Microsoft Corporation\n\n    MIT License\n\n    Copyright (c) Microsoft Corporation.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Abstractions 6.22.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Abstractions 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.JsonWebTokens 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Logging 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.LoggingExtensions 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Protocols 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Protocols.OpenIdConnect 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Tokens 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IdentityModel.Validators 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.IO.RecyclableMemoryStream 2.3.2 - MIT\n\n\nCopyright Microsoft 2015\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.NET.Build.Containers 7.0.304 - MIT\n\n\n(c) Microsoft Corporation\nCopyright James Newton-King 2008\nCopyright James Newton-King 2008 Json.NET\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.NET.StringTools 17.6.3 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) 2015 Christian Klutz\nCopyright (c) .NET Foundation and Contributors\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Rest.ClientRuntime 2.3.21 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2019 Microsoft\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.SourceLink.Common 1.1.1 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.SourceLink.GitHub 1.1.1 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMicrosoft.Win32.SystemEvents 4.7.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMono.Options 6.12.0.148 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 1990-2009 Info-ZIP.\nCopyright (c) .NET Foundation Contributors\ncopyrighted by the Free Software Foundation\nCopyright (c) 1989, 1991 Free Software Foundation, Inc.\nCopyright 2006 James Newton-King http://www.newtonsoft.com\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMQTTnet 4.2.1.781 - MIT\n\n\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) .NET Foundation and Contributors MQTT Message Queue Telemetry Transport MQTTClient MQTTServer Server MQTTBroker Broker NETStandard IoT InternetOfThings Messaging Hardware Arduino Sensor Actuator M2M ESP Smart Home Cities Automation Xamarin Blazor\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nMQTTnet.Extensions.ManagedClient 4.2.1.781 - MIT\n\n\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) .NET Foundation and Contributors MQTT Message Queue Telemetry Transport MQTTClient MQTTServer Server MQTTBroker Broker NETStandard IoT InternetOfThings Messaging Hardware Arduino Sensor Actuator M2M ESP Smart Home Cities Automation Xamarin Blazor\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNerdbank.GitVersioning 3.6.133 - MIT\n\n\nCopyright 1995-2017 Mark Adler\nCopyright James Newton-King 2008\nCopyright LibGit2Sharp contributors\nCopyright James Newton-King 2008 Json.NET\nCopyright 1995-2017 Mark Adler +3 CScs DEFG\nCopyright (c) .NET Foundation and Contributors\nCopyright AssemblyCompany AssemblyConfiguration\nCopyright 1995-2017 Jean-loup Gailly and Mark Adler\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNewtonsoft.Json.Bson 1.0.2 - MIT\n\n\nCopyright James Newton-King 2017\nCopyright (c) 2017 James Newton-King\nCopyright (c) James Newton-King 2017\n\nThe MIT License (MIT)\n\nCopyright (c) 2017 James Newton-King\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.AsyncEx 5.1.2 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.AsyncEx.Context 5.1.2 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.AsyncEx.Coordination 5.1.2 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.AsyncEx.Interop.WaitHandles 5.1.2 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.AsyncEx.Oop 5.1.2 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.AsyncEx.Tasks 5.1.2 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.Cancellation 1.1.2 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.Collections.Deque 1.1.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.Disposables 2.2.1 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nNito.Disposables 2.4.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore 6.5.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.Annotations 6.5.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.Newtonsoft 6.5.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.Swagger 6.5.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.SwaggerGen 6.5.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSwashbuckle.AspNetCore.SwaggerUI 6.5.0 - MIT\n\n\n(c) ,u r(1970)\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Configuration.ConfigurationManager 4.4.0 - MIT\n\n\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Configuration.ConfigurationManager 4.4.1 - MIT\n\n\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Diagnostics.EventLog 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Diagnostics.EventLog 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Drawing.Common 4.7.2 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Formats.Asn1 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Formats.Asn1 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IdentityModel.Tokens.Jwt 6.30.0 - MIT\n\n\n(c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IO.FileSystem.AccessControl 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IO.Hashing 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.IO.Pipelines 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Linq.Async 6.0.1 - MIT\n\n\nCopyright (c) .NET Foundation and Contributors.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Memory 4.5.3 - MIT\n\n\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 1991-2017 Unicode, Inc.\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Memory 4.5.4 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 1991-2017 Unicode, Inc.\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Memory.Data 1.0.2 - MIT\n\n\n(c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Net.Http.Json 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Runtime.CompilerServices.Unsafe 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Runtime.CompilerServices.Unsafe 6.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.AccessControl 5.0.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) Andrew Arnott\nCopyright 2018 Daniel Lemire\nCopyright 2012 the V8 project\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\nCopyright (c) 1998 Microsoft. To\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2018 Alexander Chermyanin\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) The Internet Society 1997.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) The Internet Society (2003).\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass.\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.Cryptography.Pkcs 7.0.3 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.Cryptography.ProtectedData 4.4.0 - MIT\n\n\n(c) Microsoft Corporation.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 1991-2017 Unicode, Inc.\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.Cryptography.ProtectedData 4.7.0 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Security.Cryptography.Xml 7.0.1 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Text.Encodings.Web 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Text.Json 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Threading.Channels 4.7.1 - MIT\n\n\n(c) Microsoft Corporation.\nCopyright (c) .NET Foundation.\nCopyright (c) 2011, Google Inc.\n(c) 1997-2005 Sean Eron Anderson.\nCopyright (c) 2007 James Newton-King\nCopyright (c) 1991-2017 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2005-2007, Nick Galbreath\nPortions (c) International Organization\nCopyright (c) 2015 The Chromium Authors.\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) .NET Foundation Contributors\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2017 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nSystem.Threading.Channels 7.0.0 - MIT\n\n\n(c) Microsoft Corporation\nCopyright (c) Andrew Arnott\nCopyright 2019 LLVM Project\nCopyright 2018 Daniel Lemire\nCopyright (c) .NET Foundation\nCopyright (c) 2011, Google Inc.\nCopyright (c) 2020 Dan Shechter\n(c) 1997-2005 Sean Eron Anderson\nCopyright (c) 1998 Microsoft. To\nCopyright (c) 2017 Yoshifumi Kawai\nCopyright (c) 2005-2020 Rich Felker\nCopyright (c) Microsoft Corporation\nCopyright (c) 2007 James Newton-King\nCopyright (c) 2012-2014, Yann Collet\nCopyright (c) 1991-2022 Unicode, Inc.\nCopyright (c) 2013-2017, Alfred Klomp\nCopyright 2012 the V8 project authors\nCopyright (c) 1999 Lucent Technologies\nCopyright (c) 2008-2016, Wojciech Mula\nCopyright (c) 2011-2020 Microsoft Corp\nCopyright (c) 2015-2017, Wojciech Mula\nCopyright (c) 2021 csFastFloat authors\nCopyright (c) 2005-2007, Nick Galbreath\nCopyright (c) 2015 The Chromium Authors\nCopyright (c) 2018 Alexander Chermyanin\nCopyright (c) The Internet Society 1997\nPortions (c) International Organization\nCopyright (c) 2004-2006 Intel Corporation\nCopyright (c) 2013-2017, Milosz Krajewski\nCopyright (c) 2016-2017, Matthieu Darbois\nCopyright (c) The Internet Society (2003)\nCopyright (c) .NET Foundation Contributors\nCopyright (c) 2020 Mara Bos <m-ou.se@m-ou.se>\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) 2008-2020 Advanced Micro Devices, Inc.\nCopyright (c) 2019 Microsoft Corporation, Daan Leijen\nCopyright (c) 2011 Novell, Inc (http://www.novell.com)\nCopyright (c) 1995-2022 Jean-loup Gailly and Mark Adler\nCopyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)\nCopyright (c) 2009, 2010, 2013-2016 by the Brotli Authors\nCopyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com\nCopyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.\nCopyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers\nCopyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip\nCopyright (c) 1980, 1986, 1993 The Regents of the University of California\nCopyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass\nCopyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To\n\nThe MIT License (MIT)\n\nCopyright (c) .NET Foundation and Contributors\n\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxRetry 1.9.0 - MIT\n\n\nCopyright Josh Keegan 2019-2023 XUnit Retry Test-Automation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxunit.runner.visualstudio 2.4.5 - MIT\n\n\nCopyright (c) .NET Foundation\nCopyright (c) 2015 .NET Foundation\nCopyright (c) Outercurve Foundation\nCopyright (c) .NET Foundation and Contributors\nCopyright (c) .NET Foundation xUnit.net Runner Utility\nCopyright (c) .NET Foundation ,xUnit.net Runner Utility\nCopyright (c) .NET Foundation 1xUnit.net Runner Utility\nCopyright (c) .NET Foundation xUnit.net Runner Reporters\nCopyright (c) .NET Foundation .xUnit.net Runner Reporters\nCopyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS\nCopyright (c) .NET Foundation and Contributors. Visual Studio 2019\n\nUnless otherwise noted, the source code here is covered by the following license:\n\n    Copyright (c) .NET Foundation and Contributors\n    All Rights Reserved\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n-----------------------\n\nThe code in src/xunit.runner.visualstudio/Utility/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from:\n    https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions\n\nThe code in src/xunit.runner.visualstudio/Utility/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from:\n    https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel\n\nBoth sets of code are covered by the following license:\n\n    The MIT License (MIT)\n\n    Copyright (c) 2015 .NET Foundation\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nValidation 2.4.18 - MS-PL\n\n\n\nMicrosoft Public License (Ms-PL)\n\nThis license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\n\n   1. Definitions\n\n   The terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the same meaning here as under U.S. copyright law. A \"contribution\" is the original software, or any additions or changes to the software. A \"contributor\" is any person that distributes its contribution under this license. \"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\n\n   2. Grant of Rights\n\n      (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\n\n      (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\n\n   3. Conditions and Limitations\n\n      (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\n\n      (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\n\n      (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\n\n      (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\n\n      (E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nXunit.SkippableFact 1.4.13 - MS-PL\n\n\n\nMicrosoft Public License (Ms-PL)\n\nThis license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\n\n   1. Definitions\n\n   The terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the same meaning here as under U.S. copyright law. A \"contribution\" is the original software, or any additions or changes to the software. A \"contributor\" is any person that distributes its contribution under this license. \"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\n\n   2. Grant of Rights\n\n      (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\n\n      (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\n\n   3. Conditions and Limitations\n\n      (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\n\n      (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\n\n      (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\n\n      (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\n\n      (E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\n\n---------------------------------------------------------\n\n"
  },
  {
    "path": "Nuget.Config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <packageSources>\n    <clear />\n    <add key=\"Industrial-IoT\" value=\"https://pkgs.dev.azure.com/msazure/One/_packaging/Industrial-IoT/nuget/v3/index.json\" />\n  </packageSources>\n</configuration>"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "azure-pipelines.yml",
    "content": "pr:\n  autoCancel: 'true'\n  drafts: 'true'\n  branches:\n    include:\n    - '*'\ntrigger:\n  batch: 'true'\n  branches:\n    include:\n    - latest\n    - main\n    - release/*\nparameters:\n- name: onebranch\n  displayName: 'One Branch to use'\n  type: string\n  default: 'main'\n  values:\n    - 'main'\n    - 'test'\njobs:\n- job: OneBranchTrigger\n  pool:\n    vmImage: 'ubuntu-latest'\n  timeoutInMinutes: 120\n  displayName: Trigger Governed Pipeline\n  steps:\n  - task: PowerShell@2\n    displayName: 'Determine pipeline and parameters'\n    inputs:\n      targetType: 'inline'\n      pwsh: true\n      script: |\n        $message = '$(Build.SourceVersionMessage)'\n        if ([string]::IsNullOrWhiteSpace($message)) {\n          $message = 'No message'\n        }\n        $message = $message -replace \"[^a-zA-Z0-9\\s]\", \"\"\n        $message = $message.Trim()\n        $message = $message.substring(0, [System.Math]::Min(100, $message.Length))\n        $branchName = '$(Build.SourceBranch)'\n        $branchName = $branchName -replace \"refs/heads/\", \"\"\n        if ('$(Build.Reason)' -eq 'PullRequest')\n        {\n          $pipelineDefinition = 'Industrial-IoT-PullRequest'\n          $templateParameters = \"ref: $(Build.SourceBranch), buildInfo: '$message'\"\n          Write-Host \"Triggering Pull Request build for $(Build.SourceBranch)...\"\n        }\n        elseif ('$(Build.SourceBranch)' -like 'refs/heads/release/*')\n        {\n          $pipelineDefinition = 'Industrial-IoT-Official'\n          $templateParameters = \"branch: $branchName, buildInfo: '$message'\"\n          Write-Host \"Triggering official build for branch $branchName...\"\n        }\n        else\n        {\n          $pipelineDefinition = 'Industrial-IoT-Buddy'\n          $templateParameters = \"branch: $branchName, buildInfo: '$message'\"\n          Write-Host \"Triggering buddy build for branch $branchName ...\"\n        }\n        Write-Host \"$(Build.Reason): Trigger $pipelineDefinition with '$templateParameters'...\"\n        Write-Host \"##vso[task.setvariable variable=pipelineDefinition]$pipelineDefinition\"\n        Write-Host \"##vso[task.setvariable variable=templateParameters]$templateParameters\"\n  - task: TriggerBuild@4\n    displayName: 'Trigger Build'\n    inputs:\n      definitionIsInCurrentTeamProject: true\n      buildDefinition: $(pipelineDefinition)\n      queueBuildForUserThatTriggeredBuild: false\n      ignoreSslCertificateErrors: false\n      useSameSourceVersion: false\n      useCustomSourceVersion: false\n      useSameBranch: false\n      branchToUse: '${{ parameters.onebranch }}'\n      storeInEnvironmentVariable: true\n      authenticationMethod: 'OAuth Token'\n      password: $(System.AccessToken)\n      enableBuildInQueueCondition: true\n      dependentOnSuccessfulBuildCondition: false\n      dependentOnFailedBuildCondition: false\n      checkbuildsoncurrentbranch: false\n      failTaskIfConditionsAreNotFulfilled: false\n      templateParameters: '$(templateParameters)'\n  - task: PowerShell@2\n    displayName: 'Update build number and tags'\n    inputs:\n      targetType: 'inline'\n      pwsh: true\n      script: |\n        $buildId = $(TriggeredBuildIds)\n        $buildUrl = \"$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_build/results?buildId=$buildId\"\n        Write-Host \"Triggered build $buildUrl ...\"\n        Write-Host \"##vso[build.addbuildtag]$(pipelineDefinition) build $buildId\"\n        Write-Host \"##vso[task.logissue type=warning]$buildUrl\"\n        Write-Host \"##vso[build.updatebuildnumber]$buildId\"\n  - task: WaitForBuildToFinish@3\n    displayName: 'Wait for build to finish'\n    inputs:\n      definitionIsInCurrentTeamProject: true\n      ignoreSslCertificateErrors: false\n      waitForQueuedBuildsToFinishRefreshTime: '90'\n      failTaskIfBuildsNotSuccessful: true\n      cancelBuildsIfAnyFails: false\n      treatPartiallySucceededBuildAsSuccessful: true\n      downloadBuildArtifacts: false\n      clearVariable: true\n      authenticationMethod: 'OAuth Token'\n      password: $(System.AccessToken)"
  },
  {
    "path": "common.props",
    "content": "<Project>\n  <PropertyGroup>\n    <Product>Azure Industrial IoT Platform</Product>\n    <RepositoryUrl>https://github.com/Azure/Industrial-IoT</RepositoryUrl>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <NoWarn>NU5125;RS1022;AD0001</NoWarn>\n    <Authors>Microsoft</Authors>\n    <Company>Microsoft</Company>\n    <copyright>© Microsoft Corporation. All rights reserved.</copyright>\n    <PackageIcon>icon.png</PackageIcon>\n    <PackageReadmeFile>readme.md</PackageReadmeFile>\n    <PackageReleaseNotes>$(RepositoryUrl)/releases</PackageReleaseNotes>\n    <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl>\n    <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>\n    <PackageTags>Industrial;Industrial IoT;Manufacturing;Azure;IoT;.NET</PackageTags>\n    <HighEntropyVA>true</HighEntropyVA>\n    <NeutralLanguage>en-US</NeutralLanguage>\n    <LangVersion>13.0</LangVersion>\n    <IsPackable>false</IsPackable>\n    <Nullable>disable</Nullable>\n    <ErrorOnDuplicatePublishOutputFiles>false</ErrorOnDuplicatePublishOutputFiles>\n    <ValidateExecutableReferencesMatchSelfContained>false</ValidateExecutableReferencesMatchSelfContained>\n    <RuntimeIdentifiers>win-x64;linux-x64;linux-musl-x64;linux-musl-arm;linux-musl-arm64</RuntimeIdentifiers>\n  </PropertyGroup>\n  <ItemGroup Condition=\"'$(IsPackable)' != 'false'\">\n    <None Include=\"$(MSBuildThisFileDirectory)/docs/media/icon.png\" Pack=\"true\" PackagePath=\"\\\"/>\n    <None Include=\"$(MSBuildThisFileDirectory)/readme.md\" Pack=\"true\" PackagePath=\"\\\"/>\n  </ItemGroup>\n  <PropertyGroup>\n    <IncludeSymbols>true</IncludeSymbols>\n    <SymbolPackageFormat>snupkg</SymbolPackageFormat>\n    <PublishRepositoryUrl>true</PublishRepositoryUrl>\n    <EmbedUntrackedSources>true</EmbedUntrackedSources>\n  </PropertyGroup>\n  <ItemGroup Condition=\"$(NO_GIT) == ''\">\n    <PackageReference Include=\"Microsoft.SourceLink.GitHub\" Version=\"8.0.0\" PrivateAssets=\"All\"/>\n    <PackageReference Include=\"Nerdbank.GitVersioning\" Version=\"3.8.118\" PrivateAssets=\"All\"/>\n  </ItemGroup>\n  <PropertyGroup>\n    <IncludeOpenAPIAnalyzers>true</IncludeOpenAPIAnalyzers>\n    <EnableNETAnalyzers>true</EnableNETAnalyzers>\n    <AnalysisMode>All</AnalysisMode>\n    <AnalysisLevel>preview</AnalysisLevel>\n    <AnalysisModeStyle>default</AnalysisModeStyle>\n    <CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>\n    <!--<TreatWarningsAsErrors>true</TreatWarningsAsErrors>-->\n  </PropertyGroup>\n  <ItemGroup Condition=\"$(NO_RCS) == ''\">\n    <PackageReference Include=\"Roslynator.Analyzers\" Version=\"4.14.1\" PrivateAssets=\"All\"/>\n    <PackageReference Include=\"Roslynator.Formatting.Analyzers\" Version=\"4.14.1\" PrivateAssets=\"All\"/>\n  </ItemGroup>\n  <!-- only create the SARIF files for the SDL build step in cloud builds -->\n  <PropertyGroup Condition=\"'$(NBGV_NugetPackageVersion)' != ''\">\n    <ErrorLog>$(MSBuildProjectFullPath).$([System.Guid]::NewGuid().ToString().Substring(0,8)).sarif</ErrorLog>\n  </PropertyGroup>\n</Project>\n"
  },
  {
    "path": "contributing.md",
    "content": "We'll be glad to accept patches and contributions to the project. There are just few guidelines we ask to follow.\n\nContribution License Agreement\n==============================\n\nIf you want/plan to contribute, we ask you to sign a [CLA](https://cla.microsoft.com/) (Contribution License Agreement).  A friendly bot will remind you about it when you submit a pull-request.\n\nSubmitting a contribution\n=========================\n\nIt's generally best to start by [opening a new issue](https://help.github.com/articles/creating-an-issue) describing the work you intend to submit. Even for minor tasks, it's helpful to know what contributors are working on. Please mention in the initial issue that you are planning to work on it, so that it can be assigned to you.\n\nFollow the usual GitHub flow process of [forking the project](https://help.github.com/articles/fork-a-repo), and setup a new branch to work in. Each group of changes should be done in separate branches, in order to ensure that a pull request only includes the changes related to one issue.\n\nAny significant change should almost always be accompanied by tests. Look at the existing tests to see the testing approach and style used.  \n\nFollow the project coding style, to ensure consistency and quick code reviews.  We heavily rely on dependency injection using *Autofac* and thus ask to follow the same paradigm when adding new code.\n\nDo your best to have clear commit messages for each change, in order to keep consistency throughout the project. Reference the issue number (#num). A good commit message serves at least these purposes:\n* Speed up the pull request review process\n* Help future developers to understand the purpose of your code\n* Help the maintainer write release notes\n\nOne-line messages are fine for small changes, but bigger changes should look like this:\n```\n$ git commit -m \"A brief summary of the commit\n>\n> A paragraph describing what changed and its impact.\"\n```\n\nFinally, push the commits to your fork, submit a pull request, wait for all gates to pass and fix any issues found as part of the gate process.  The team might ask for some [changes](https://help.github.com/articles/committing-changes-to-a-pull-request-branch-created-from-a-fork) before merging the pull request."
  },
  {
    "path": "deploy/azuredeploy.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"userPrincipalId\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"Specifies the object ID of a principal in your Azure Active Directory tenant to access the deployed services.\"\n            }\n        },\n        \"userManagedIdentityName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"[concat('msi', take(uniqueString(subscription().subscriptionId, resourceGroup().id), 5))]\",\n            \"metadata\": {\n                \"description\": \"The name of the managed identity to create. If client principal was omitted a default identity will be provisioned to access resources.\"\n            }\n        },\n        \"storageName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"[concat('storage', take(uniqueString(subscription().subscriptionId, resourceGroup().id), 6))]\",\n            \"metadata\": {\n                \"description\": \"The name of the storage account created as part of the deployment.\"\n            }\n        },\n        \"storageSkuName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"Standard_LRS\",\n            \"allowedValues\": [\n                \"Standard_LRS\",\n                \"Standard_GRS\",\n                \"Standard_RAGRS\",\n                \"Standard_ZRS\",\n                \"Premium_LRS\"\n            ],\n            \"metadata\": {\n                \"description\": \"The storage SKU to use.\"\n            }\n        },\n        \"iotHubName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"[concat('iothub-', take(uniqueString(subscription().subscriptionId, resourceGroup().id), 6))]\",\n            \"metadata\": {\n                \"description\": \"The name of Azure IoT Hub created as part of the deployment.\"\n            }\n        },\n        \"iotHubSku\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"S1\",\n            \"allowedValues\": [\n                \"F1\",\n                \"S1\",\n                \"S2\",\n                \"S3\"\n            ],\n            \"metadata\": {\n                \"description\": \"The Azure IoT Hub SKU to use.\"\n            }\n        },\n        \"iotHubCapacity\": {\n            \"type\": \"int\",\n            \"defaultValue\": 1,\n            \"metadata\": {\n                \"description\": \"The Azure IoT Hub SKU capacity to use.\"\n            }\n        },\n        \"iotHubTier\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"Standard\",\n            \"allowedValues\": [\n                \"Free\",\n                \"Standard\"\n            ],\n            \"metadata\": {\n                \"description\": \"The Azure IoT Hub tier to use.\"\n            }\n        },\n        \"iotHubPartitionCount\": {\n            \"type\": \"int\",\n            \"defaultValue\": 4,\n            \"metadata\": {\n                \"description\": \"The Azure IoT Hub default endpoint partition count.\"\n            }\n        },\n        \"iotHubRetentionInDays\": {\n            \"type\": \"int\",\n            \"defaultValue\": 2,\n            \"metadata\": {\n                \"description\": \"The Azure IoT Hub default message retention in days.\"\n            }\n        },\n        \"dpsName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"[concat('dps', take(uniqueString(subscription().subscriptionId, resourceGroup().id), 6))]\",\n            \"metadata\": {\n                \"description\": \"The name of the Azure Device Provisioning service created as part of this deployment.\"\n            }\n        },\n        \"dpsSku\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"S1\",\n            \"allowedValues\": [\n                \"S1\"\n            ],\n            \"metadata\": {\n                \"description\": \"The Azure Device Provisioning service SKU to use.\"\n            }\n        },\n        \"dpsCapacity\": {\n            \"type\": \"int\",\n            \"defaultValue\": 1,\n            \"minValue\": 1,\n            \"maxValue\": 3,\n            \"metadata\": {\n                \"description\": \"The Azure Device Provisioning service capacity.\"\n            }\n        },\n        \"tags\": {\n            \"type\": \"object\",\n            \"defaultValue\": {},\n            \"metadata\": {\n                \"description\": \"Tags for Azure resources.\"\n            }\n        }\n    },\n    \"variables\": {\n        \"iotHubResourceId\": \"[resourceId('Microsoft.Devices/Iothubs', parameters('iotHubName'))]\",\n        \"iotHubContributorRoleId\": \"[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4fc6c259-987e-4a07-842e-c321cc9d413f')]\",\n        \"iotHubPrincipalRoleAssignment\": \"[guid(parameters('iotHubName'), parameters('userPrincipalId'))]\",\n        \"iotHubKeyName\": \"iothubowner\",\n        \"iotHubKeyResource\": \"[resourceId('Microsoft.Devices/Iothubs/Iothubkeys', parameters('iotHubName'), variables('iotHubKeyName'))]\",\n        \"iotHubTelemetryConsumerGroup\": \"telemetry\",\n        \"iotHubEventsConsumerGroup\": \"events\",\n        \"userManagedIdentityResourceId\": \"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userManagedIdentityName'))]\",\n        \"storageResourceId\": \"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageName'))]\",\n        \"storageBlobDataOwnerRoleId\": \"[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b7e6dc6d-f1e8-4753-8033-0f276bb0955b')]\",\n        \"storageAccountContributorRoleId\": \"[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '17d1049b-9a84-46fb-8f53-869881c3d3ab')]\",\n        \"storagePrincipalBlobDataOwnerRoleAssignment\": \"[guid(parameters('storageName'), 'StorageBlobDataOwner', parameters('userPrincipalId'))]\",\n        \"storagePrincipalStorageAccountContributorRoleAssignment\": \"[guid(parameters('storageName'), 'StorageAccountContributor', parameters('userPrincipalId'))]\",\n        \"storageRoleAssignment\": \"[guid(parameters('storageName'), parameters('userManagedIdentityName'))]\",\n        \"dpsResourceId\": \"[resourceId('Microsoft.Devices/provisioningServices', parameters('dpsName'))]\"\n    },\n    \"resources\": [\n        {\n            \"comments\": \"User managed identity.\",\n            \"name\": \"[parameters('userManagedIdentityName')]\",\n            \"type\": \"Microsoft.ManagedIdentity/userAssignedIdentities\",\n            \"apiVersion\": \"2023-01-31\",\n            \"location\": \"[resourceGroup().location]\",\n            \"tags\": \"[parameters('tags')]\"\n        },\n        {\n            \"comments\": \"Create an Azure IoT Hub.\",\n            \"apiVersion\": \"2023-06-30\",\n            \"type\": \"Microsoft.Devices/Iothubs\",\n            \"name\": \"[parameters('iotHubName')]\",\n            \"location\": \"[resourceGroup().location]\",\n            \"identity\": {\n                \"userAssignedIdentities\": {\n                    \"[variables('userManagedIdentityResourceId')]\": {}\n                },\n                \"type\": \"UserAssigned\"\n            },\n            \"tags\": \"[parameters('tags')]\",\n            \"sku\": {\n                \"name\": \"[parameters('iotHubSku')]\",\n                \"tier\": \"[parameters('iotHubTier')]\",\n                \"capacity\": \"[parameters('iotHubCapacity')]\"\n            },\n            \"properties\": {\n                \"location\": \"[resourceGroup().location]\",\n                \"ipFilterRules\": [],\n                \"disableLocalAuth\": false,\n                \"eventHubEndpoints\": {\n                    \"events\": {\n                        \"retentionTimeInDays\": \"[parameters('iotHubRetentionInDays')]\",\n                        \"partitionCount\": \"[parameters('iotHubPartitionCount')]\"\n                    }\n                },\n                \"routing\": {\n                    \"endpoints\": {\n                        \"serviceBusQueues\": [],\n                        \"serviceBusTopics\": [],\n                        \"eventHubs\": [],\n                        \"storageContainers\": []\n                    },\n                    \"routes\": [\n                        {\n                            \"name\": \"TwinChanges\",\n                            \"source\": \"TwinChangeEvents\",\n                            \"condition\": \"true\",\n                            \"endpointNames\": [\n                                \"events\"\n                            ],\n                            \"isEnabled\": true\n                        },\n                        {\n                            \"name\": \"DeviceLifecycle\",\n                            \"source\": \"DeviceLifecycleEvents\",\n                            \"condition\": \"true\",\n                            \"endpointNames\": [\n                                \"events\"\n                            ],\n                            \"isEnabled\": true\n                        }\n                    ],\n                    \"fallbackRoute\": {\n                        \"name\": \"$fallback\",\n                        \"source\": \"DeviceMessages\",\n                        \"condition\": \"true\",\n                        \"endpointNames\": [\n                            \"events\"\n                        ],\n                        \"isEnabled\": true\n                    }\n                },\n                \"messagingEndpoints\": {\n                    \"fileNotifications\": {\n                        \"lockDurationAsIso8601\": \"PT1M\",\n                        \"ttlAsIso8601\": \"PT1H\",\n                        \"maxDeliveryCount\": 10\n                    }\n                },\n                \"cloudToDevice\": {\n                    \"maxDeliveryCount\": 10,\n                    \"defaultTtlAsIso8601\": \"PT1H\",\n                    \"feedback\": {\n                        \"lockDurationAsIso8601\": \"PT1M\",\n                        \"ttlAsIso8601\": \"PT1H\",\n                        \"maxDeliveryCount\": 10\n                    }\n                },\n                \"features\": \"None\"\n            },\n            \"dependsOn\": [\n                \"[variables('storageResourceId')]\",\n                \"[variables('userManagedIdentityResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"Add optionally the iot hub owner role to the user principal.\",\n            \"type\": \"Microsoft.Authorization/roleAssignments\",\n            \"apiVersion\": \"2022-04-01\",\n            \"name\": \"[variables('iotHubPrincipalRoleAssignment')]\",\n            \"condition\": \"[not(empty(parameters('userPrincipalId')))]\",\n            \"scope\": \"[variables('iotHubResourceId')]\",\n            \"properties\": {\n                \"roleDefinitionId\": \"[variables('iotHubContributorRoleId')]\",\n                \"principalId\": \"[parameters('userPrincipalId')]\"\n            },\n            \"dependsOn\": [\n                \"[variables('iotHubResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"Create a Telemetry Consumer Group in IoT Hub.\",\n            \"apiVersion\": \"2019-03-22\",\n            \"name\": \"[concat(parameters('iotHubName'), '/events/', variables('iotHubTelemetryConsumerGroup'))]\",\n            \"type\": \"Microsoft.Devices/Iothubs/eventhubEndpoints/ConsumerGroups\",\n            \"tags\": \"[parameters('tags')]\",\n            \"dependsOn\": [\n                \"[variables('iotHubResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"And a edge Events Consumer Group in the hub.\",\n            \"apiVersion\": \"2019-03-22\",\n            \"name\": \"[concat(parameters('iotHubName'), '/events/', variables('iotHubEventsConsumerGroup'))]\",\n            \"type\": \"Microsoft.Devices/Iothubs/eventhubEndpoints/ConsumerGroups\",\n            \"tags\": \"[parameters('tags')]\",\n            \"dependsOn\": [\n                \"[variables('iotHubResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"Create blob storage account for event processing offset snapshots.\",\n            \"type\": \"Microsoft.Storage/storageAccounts\",\n            \"name\": \"[parameters('storageName')]\",\n            \"apiVersion\": \"2023-04-01\",\n            \"location\": \"[resourceGroup().location]\",\n            \"tags\": \"[parameters('tags')]\",\n            \"kind\": \"StorageV2\",\n            \"sku\": {\n                \"name\": \"[parameters('storageSkuName')]\"\n            },\n            \"properties\": {\n                \"networkAcls\": {\n                    \"bypass\": \"AzureServices\",\n                    \"virtualNetworkRules\": [],\n                    \"ipRules\": [],\n                    \"defaultAction\": \"Allow\"\n                },\n                \"defaultToOAuthAuthentication\": true,\n                \"allowSharedKeyAccess\": false,\n                \"supportsHttpsTrafficOnly\": true,\n                \"encryption\": {\n                    \"services\": {\n                        \"file\": {\n                            \"enabled\": true\n                        },\n                        \"blob\": {\n                            \"enabled\": true\n                        }\n                    },\n                    \"keySource\": \"Microsoft.Storage\"\n                }\n            }\n        },\n        {\n            \"comments\": \"Assign access to own blobs in the storage to our managed identity.\",\n            \"type\": \"Microsoft.Authorization/roleAssignments\",\n            \"apiVersion\": \"2022-04-01\",\n            \"name\": \"[variables('storageRoleAssignment')]\",\n            \"scope\": \"[variables('storageResourceId')]\",\n            \"properties\": {\n                \"roleDefinitionId\": \"[variables('storageBlobDataOwnerRoleId')]\",\n                \"principalId\": \"[reference(variables('userManagedIdentityResourceId'), '2018-11-30').principalId]\",\n                \"principalType\": \"ServicePrincipal\"\n            },\n            \"dependsOn\": [\n                \"[variables('userManagedIdentityResourceId')]\",\n                \"[variables('storageResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"And optionally the storage blob data owner role...\",\n            \"type\": \"Microsoft.Authorization/roleAssignments\",\n            \"apiVersion\": \"2022-04-01\",\n            \"name\": \"[variables('storagePrincipalBlobDataOwnerRoleAssignment')]\",\n            \"condition\": \"[not(empty(parameters('userPrincipalId')))]\",\n            \"scope\": \"[variables('storageResourceId')]\",\n            \"properties\": {\n                \"roleDefinitionId\": \"[variables('storageBlobDataOwnerRoleId')]\",\n                \"principalId\": \"[parameters('userPrincipalId')]\"\n            },\n            \"dependsOn\": [\n                \"[variables('storageResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"... as well as the storage account contributor role to the user principal.\",\n            \"type\": \"Microsoft.Authorization/roleAssignments\",\n            \"apiVersion\": \"2022-04-01\",\n            \"name\": \"[variables('storagePrincipalStorageAccountContributorRoleAssignment')]\",\n            \"condition\": \"[not(empty(parameters('userPrincipalId')))]\",\n            \"scope\": \"[variables('storageResourceId')]\",\n            \"properties\": {\n                \"roleDefinitionId\": \"[variables('storageAccountContributorRoleId')]\",\n                \"principalId\": \"[parameters('userPrincipalId')]\"\n            },\n            \"dependsOn\": [\n                \"[variables('storageResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"Create Azure Device Provisioning service.\",\n            \"type\": \"Microsoft.Devices/provisioningServices\",\n            \"name\": \"[parameters('dpsName')]\",\n            \"apiVersion\": \"2022-12-12\",\n            \"location\": \"[resourceGroup().location]\",\n            \"tags\": \"[parameters('tags')]\",\n            \"sku\": {\n                \"name\": \"[parameters('dpsSku')]\",\n                \"capacity\": \"[parameters('dpsCapacity')]\"\n            },\n            \"properties\": {\n                \"iotHubs\": [\n                    {\n                        \"connectionString\": \"[concat('HostName=', reference(variables('iotHubResourceId')).hostName, ';SharedAccessKeyName=', variables('iotHubKeyName'), ';SharedAccessKey=', listKeys(variables('iotHubKeyResource'), '2018-04-01').primaryKey)]\",\n                        \"iotHubResourceId\": \"[variables('iotHubResourceId')]\",\n                        \"location\": \"[resourceGroup().location]\",\n                        \"name\": \"[reference(variables('iotHubResourceId')).hostName]\"\n                    }\n                ]\n            },\n            \"dependsOn\": [\n                \"[variables('iotHubResourceId')]\"\n            ]\n        }\n    ],\n    \"outputs\": {\n        \"iotHubConnString\": {\n            \"type\": \"string\",\n            \"value\": \"[concat('HostName=', reference(variables('iotHubResourceId')).hostName, ';SharedAccessKeyName=', variables('iotHubKeyName'), ';SharedAccessKey=', listKeys(variables('iotHubKeyResource'), '2018-04-01').primaryKey)]\",\n            \"metadata\": {\n                \"description\": \"The connection string for the IoT Hub. Use this to connect to IoT Hub using your user principal or managed identity.\"\n            }\n        },\n        \"dpsConnString\": {\n            \"type\": \"string\",\n            \"value\": \"[concat('HostName=', reference(variables('dpsResourceId'), '2018-01-22'). serviceOperationsHostName, ';SharedAccessKeyName=', listKeys(variables('dpsResourceId'), '2018-01-22').value[0].keyName, ';SharedAccessKey=', listKeys(variables('dpsResourceId'), '2018-01-22').value[0].primaryKey)]\",\n            \"metadata\": {\n                \"description\": \"The connection string for the Device Provisioning Service. Use this to deploy IoT Edge devices using DPS.\"\n            }\n        },\n        \"dpsIdScope\": {\n            \"type\": \"string\",\n            \"value\": \"[reference(variables('dpsResourceId'), '2018-01-22').idScope]\",\n            \"metadata\": {\n                \"description\": \"The ID scope for the Device Provisioning Service. Use this to deploy IoT Edge devices using DPS.\"\n            }\n        },\n        \"tenantId\": {\n            \"type\": \"string\",\n            \"value\": \"[subscription().tenantId]\",\n            \"metadata\": {\n                \"description\": \"The tenant ID of the Azure subscription.\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "deploy/azuredeploy.parameters.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"userPrincipalId\": {\n            \"value\": \"\",\n            \"metadata\": {\n                \"description\": \"The user principal ID of the user who will be assigned as the owner of the IoT Hub and DPS.  Leave empty to not give access to a user principal ID.\",\n                \"displayName\": \"User Principal ID\"\n            }\n        },\n        \"storageSkuName\": {\n            \"value\": \"Standard_LRS\",\n            \"metadata\": {\n                \"description\": \"The SKU name for the storage account. Valid values are Standard_LRS, Standard_GRS, Standard_RAGRS, Premium_LRS, Standard_ZRS, Premium_ZRS.\",\n                \"displayName\": \"Storage Account SKU Name\"\n            }\n        },\n        \"iotHubSku\": {\n            \"value\": \"S1\",\n            \"metadata\": {\n                \"description\": \"The SKU for the IoT Hub. Valid values are S1, S2, S3, B1, B2, B3, F1.\",\n                \"displayName\": \"IoT Hub SKU\"\n            }\n        },\n        \"iotHubCapacity\": {\n            \"value\": 1,\n            \"metadata\": {\n                \"description\": \"The capacity for the IoT Hub. This is the number of units for the IoT Hub. For S1, S2, and S3 SKUs, this is the number of throughput units.\",\n                \"displayName\": \"IoT Hub Capacity\"\n            }\n        },\n        \"iotHubTier\": {\n            \"value\": \"Standard\",\n            \"metadata\": {\n                \"description\": \"The tier for the IoT Hub. Valid values are Basic, Standard, Free, and Premium. Note that the Free tier has limitations on the number of devices and messages.\",\n                \"displayName\": \"IoT Hub Tier\"\n            }\n        },\n        \"iotHubPartitionCount\": {\n            \"value\": 4,\n            \"metadata\": {\n                \"description\": \"The partition count for the IoT Hub. This is the number of partitions for the IoT Hub. The default value is 4, but it can be set to a maximum of 32 for S1, S2, and S3 SKUs.\",\n                \"displayName\": \"IoT Hub Partition Count\"\n            }\n        },\n        \"iotHubRetentionInDays\": {\n            \"value\": 2,\n            \"metadata\": {\n                \"description\": \"The message retention period for the IoT Hub. This is the number of days that messages are retained in the IoT Hub. The default value is 2 days, but it can be set to a maximum of 7 days for S1, S2, and S3 SKUs.\",\n                \"displayName\": \"IoT Hub Retention (Days)\"\n            }\n        },\n        \"dpsSku\": {\n            \"value\": \"S1\",\n            \"metadata\": {\n                \"description\": \"The SKU for the Device Provisioning Service. Valid values are S1, S2, S3, B1, B2, B3, F1.\",\n                \"displayName\": \"DPS SKU\"\n            }\n        },\n        \"dpsCapacity\": {\n            \"value\": 1,\n            \"metadata\": {\n                \"description\": \"The capacity for the Device Provisioning Service. This is the number of units for the DPS. For S1, S2, and S3 SKUs, this is the number of throughput units.\",\n                \"displayName\": \"DPS Capacity\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "deploy/deploy.ps1",
    "content": "﻿<#\n    .SYNOPSIS\n        Deploys Azure services required for the Industrial IoT solution.\n    .DESCRIPTION\n        Deploys the Industrial IoT services and dependencies on\n        Azure.\n    .PARAMETER Name\n        The name of the deployment.\n    .PARAMETER ResourceGroup\n        The name of the resource group to deploy to.\n    .PARAMETER TenantId\n        The Azure tenant ID to use for the deployment.\n    .PARAMETER SubscriptionId\n        The Azure subscription ID to use for the deployment.\n    .PARAMETER Location\n        The Azure region to deploy the resources to.\n    .PARAMETER NoPrompt\n        If specified, the script will not prompt for confirmation\n        before saving the environment variables to a file.\n#>\n\nparam(\n    [string] [Parameter(Mandatory = $true)] $Name,\n    [string] $ResourceGroup,\n    [string] $TenantId,\n    [string] $SubscriptionId,\n    [string] $Location,\n    [switch] $NoPrompt\n)\n\n$ErrorActionPreference = 'Continue'\n$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Path\n\n#\n# Dump command line arguments\n#\nif ([string]::IsNullOrWhiteSpace($script:ResourceGroup)) {\n    $script:ResourceGroup = $script:Name\n}\nWrite-Host \"Using resource group $($script:ResourceGroup)...\" -ForegroundColor Cyan\nif ([string]::IsNullOrWhiteSpace($script:TenantId)) {\n    $script:TenantId = $env:AZURE_TENANT_ID\n}\nif (![string]::IsNullOrWhiteSpace($script:TenantId)) {\n    Write-Host \"Using tenant $($script:TenantId)...\" -ForegroundColor Cyan\n}\nif ([string]::IsNullOrWhiteSpace($script:Location)) {\n    $script:Location = \"westus\"\n}\nWrite-Host \"Using location $($script:Location)...\" -ForegroundColor Cyan\nif ([string]::IsNullOrWhiteSpace($script:OpsInstanceName)) {\n    $script:OpsInstanceName = $script:Name\n}\n\n$errOut = $($azVersion = (az version)[1].Split(\":\")[1].Split('\"')[1]) 2>&1\nif ($azVersion -lt \"2.74.0\" -or !$azVersion) {\n    Write-Host \"Azure CLI version 2.74.0 or higher is required. $errOut\" `\n        -ForegroundColor Red\n    exit -1\n}\n#\n# Log into azure\n#\nWrite-Host \"Log into Azure...\" -ForegroundColor Cyan\n$loginParams = @( \"--only-show-errors\" )\nif (![string]::IsNullOrWhiteSpace($script:TenantId)) {\n    $loginParams += @(\"--tenant\", $script:TenantId)\n}\n$session = (az login @loginParams) | ConvertFrom-Json\nif (-not $session) {\n    Write-Host \"Error: Login failed.\" -ForegroundColor Red\n    exit -1\n}\nif ([string]::IsNullOrWhiteSpace($SubscriptionId)) {\n    $script:SubscriptionId = $session[0].id\n}\nif ([string]::IsNullOrWhiteSpace($TenantId)) {\n    $script:TenantId = $session[0].tenantId\n}\n\n$errOut = $($rg = & { az group show `\n    --name $script:ResourceGroup `\n    --subscription $script:SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$rg) {\n    Write-Host \"Creating resource group $script:ResourceGroup...\" -ForegroundColor Cyan\n    $errOut = $($rg = & { az group create `\n        --name $script:ResourceGroup `\n        --location $script:Location `\n        --subscription $script:SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$rg) {\n        Write-Host \"Error creating resource group - $($errOut).\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Resource group $($rg.id) created.\" -ForegroundColor Green\n}\nelse {\n    Write-Host \"Resource group $($rg.id) exists.\" -ForegroundColor Green\n}\n\nWrite-Host \"Deploying resources to $($script:ResourceGroup)...\" -ForegroundColor Cyan\n$azureDeployFile = Join-Path $script:ScriptDir \"azuredeploy.json\"\n& { az deployment group create `\n    --name $script:Name `\n    --resource-group $rg.Name `\n    --template-file $azureDeployFile `\n    --parameters \"userPrincipalId=$(az ad signed-in-user show --query id -o tsv)\" `\n    --subscription $script:SubscriptionId `\n    --only-show-errors --no-prompt --no-wait } | Out-Null\nif ($?) {\n    az deployment group wait --created --interval 3 `\n        --name $script:Name `\n        --resource-group $rg.Name `\n        --subscription $script:SubscriptionId `\n        --only-show-errors\n}\nif (-not $?) {\n    Write-Host \"Error deploying resources.\" -ForegroundColor Red\n    exit -1\n}\nWrite-Host \"Deployment $($script:Name) completed.\" -ForegroundColor Green\n$errOut = $($deployment = & { az deployment group show `\n    --name $script:Name `\n    --resource-group $rg.Name `\n    --subscription $script:SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$deployment.properties.outputs) {\n    $deployment | ConvertTo-Json -Depth 10 | Out-Host\n    Write-Host \"Deployment $($script:Name) not found - $($errOut).\" -ForegroundColor Red\n    exit -1\n}\n$rootDir = $scriptDir\nwhile (![string]::IsNullOrEmpty($rootDir)) {\n    if (Test-Path -Path (Join-Path $rootDir \"Industrial-IoT.sln\") -PathType Leaf) {\n        break\n    }\n    $rootDir = Split-Path $rootDir\n}\n$writeFile = $true\n$ENVVARS = Join-Path $rootDir \".env\"\nif (-not $script:NoPrompt.IsPresent) {\n    $writeFile = $false\n    $prompt = \"Save environment as $ENVVARS for local development? [y/n]\"\n    $reply = Read-Host -Prompt $prompt\n    if ($reply -match \"[yY]\") {\n        $writeFile = $true\n    }\n}\nif ($writeFile) {\n    if (Test-Path $ENVVARS) {\n        if (-not $script:NoPrompt.IsPresent) {\n            $prompt = \"Overwrite existing .env file in $rootDir? [y/n]\"\n            if ($reply -match \"[yY]\") {\n                Remove-Item $ENVVARS -Force\n            }\n            else {\n                $writeFile = $false\n            }\n        }\n        else {\n            Remove-Item $ENVVARS -Force\n        }\n    }\n}\n\nFunction Get-EnvironmentVariables() { Param( $deployment )\n    if (![string]::IsNullOrEmpty($script:ResourceGroup)) {\n        Write-Output \"PCS_RESOURCE_GROUP=$($script:ResourceGroup)\"\n    }\n    if (![string]::IsNullOrEmpty($script:SubscriptionId)) {\n        Write-Output \"PCS_SUBSCRIPTION_ID=$($script:SubscriptionId)\"\n    }\n    $var = $deployment.properties.outputs.tenantId.value\n    if (![string]::IsNullOrEmpty($var)) {\n        Write-Output \"PCS_AUTH_TENANT=$($var)\"\n    }\n    $var = $deployment.properties.outputs.iotHubConnString.value\n    if (![string]::IsNullOrEmpty($var)) {\n        Write-Output \"PCS_IOTHUB_CONNSTRING=$($var)\"\n    }\n    $var = $deployment.properties.outputs.dpsConnString.value\n    if (![string]::IsNullOrEmpty($var)) {\n        Write-Output \"PCS_DPS_CONNSTRING=$($var)\"\n    }\n    $var = $deployment.properties.outputs.dpsIdScope.value\n    if (![string]::IsNullOrEmpty($var)) {\n        Write-Output \"PCS_DPS_IDSCOPE=$($var)\"\n    }\n}\n\nif ($writeFile) {\n    Get-EnvironmentVariables $deployment | Out-File -Encoding ascii `\n        -FilePath $ENVVARS\n\n    Write-Host\n    Write-Host \".env file created in $rootDir.\"\n    Write-Host\n    Write-Warning \"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"\n    Write-Warning \"!The file contains security keys to your Azure resources!\"\n    Write-Warning \"! Safeguard the contents of this file, or delete it now !\"\n    Write-Warning \"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"\n    Write-Host\n}\nelse {\n    Get-EnvironmentVariables $deployment | Out-Default\n}\n"
  },
  {
    "path": "deploy/docker/build.cmd",
    "content": "@echo off\nsetlocal\n\nset CMDLINE=--self-contained false /t:PublishContainer -r linux-x64\nset PROJECT=../../src/Azure.IIoT.OpcUa.Publisher.Module/src/Azure.IIoT.OpcUa.Publisher.Module.csproj\n\ndotnet restore %PROJECT% -s https://api.nuget.org/v3/index.json\ndotnet publish %PROJECT% -c Release %CMDLINE% /p:ContainerImageTag=latest\ndotnet publish %PROJECT% -c Debug %CMDLINE% /p:ContainerImageTag=debug\n"
  },
  {
    "path": "deploy/docker/dapr/pubsub.yaml",
    "content": "apiVersion: dapr.io/v1alpha1\nkind: Component\nmetadata:\n  name: redis-pubsub\nspec:\n  type: pubsub.redis\n  version: v1\n  metadata:\n  - name: redisHost\n    value: redis:6379"
  },
  {
    "path": "deploy/docker/dapr/statestore.yaml",
    "content": "apiVersion: dapr.io/v1alpha1\nkind: Component\nmetadata:\n  name: statestore\nspec:\n  type: state.redis\n  version: v1\n  metadata:\n  - name: redisHost\n    value: redis:6379\n  - name: redisPassword\n    value: \"\"\n  - name: actorStateStore\n    value: \"true\"\n"
  },
  {
    "path": "deploy/docker/docker-compose.yaml",
    "content": "services:\n  ############################\n  # OPC PLC Simulation\n  ############################\n  opcplc:\n    container_name: opcplc\n    image: mcr.microsoft.com/iotedge/opc-plc:${OPC_PLC_TAG:-latest}\n    ports:\n      - \"50000:50000\"\n    command: [\n      \"--sph=True\",\n      \"--spf=/shared/opcplc.json\",\n      \"--pn=50000\",\n      \"--alm=True\",\n      \"--ses=True\",\n      \"--ei=${EVENT_NODES:-100}\",\n      \"--gn=${GUID_NODES:-100}\",\n      \"--fn=${FAST_NODES:-4900}\",\n      \"--sn=${SLOW_NODES:-4900}\",\n      \"--aa=True\"\n      ]\n    volumes:\n      - shared:/shared:rw\n  ############################\n  # OPC Publisher\n  ############################\n  publisher:\n    container_name: publisher\n    image: mcr.microsoft.com/iotedge/opc-publisher:${OPC_PUBLISHER_TAG:-2.9}\n    user: root\n    ports:\n      - \"9071:80\"\n      - \"9072:443\"\n    command: [\n      \"-c\",\n      \"--aa\",\n      \"--bs=1\",\n      \"--bi=0\",\n      \"--di=60\",\n      \"--cl=5\",\n      \"--cto=30\",\n      \"--sto=1200\",\n      \"--rs\",\n      \"--dm=True\",\n      \"--cfa\",\n      \"--lfm=syslog\",\n      \"--pki=/shared/pki\",\n      \"--npd=${NODES_PER_DATASET:-5000}\"\n      ]\n    environment:\n      PublishedNodesFile: /shared/opcplc.json\n      ADDITIONAL_CONFIGURATION: /run/secrets/publisher-secrets\n    secrets:\n      - publisher-secrets\n    volumes:\n      - shared:/shared:rw\nvolumes:\n  shared:\nsecrets:\n  publisher-secrets:\n    file: ./publisher_secrets.txt"
  },
  {
    "path": "deploy/docker/gcdump.ps1",
    "content": "<#\n .SYNOPSIS\n    Create gc dump files periodically\n\n .PARAMETER WaitSeconds\n    The number of seconds to wait in between dumps\n#>\n\nparam(\n    [int] $WaitSeconds = 1,\n    [string] $Path = \"dumps\"\n)\n\n# start with monitor and dump gc\nRemove-Item -Path $Path -Recurse -Force -ErrorAction SilentlyContinue\nNew-Item -ItemType Directory -Path $Path\n$StartTime = $(get-date)\ndocker compose -f docker-compose.yaml -f with-monitor.yaml -f with-limits.yaml up -d\n$dumpIndex = 0\nwhile ($true) {\n    Start-Sleep -Seconds $WaitSeconds\n    try\n    {\n        curl http://localhost:9084/gcdump -o $Path/dump$($dumpIndex).gcdump\n    }\n    catch {\n        break\n    }\n    $dumpIndex++\n}\n$elapsedTime = $(get-date) - $StartTime\nWrite-Host \"Ran for (hh:mm:ss) $($elapsedTime.ToString(\"hh\\:mm\\:ss\"))\"\n#docker compose -f docker-compose.yaml -f with-monitor.yaml -f with-limits.yaml down\n"
  },
  {
    "path": "deploy/docker/mosquitto/mosquitto.conf",
    "content": "# from https://mosquitto.org/man/mosquitto-conf-5.html\n\nallow_anonymous true\nlistener 1883\npersistence false\n#persistence_location /tmp/mosquitto/data\n#log_dest file /var/log/mosquitto/mosquitto.log\nlog_dest stdout\nlog_dest topic\n\n# If using syslog logging (not on Windows), messages will be logged to the\n# \"daemon\" facility by default. Use the log_facility option to choose which of\n# local0 to local7 to log to instead. The option value should be an integer\n# value, e.g. \"log_facility 5\" to use local5.\n#log_facility\n\n# Possible types are: debug, error, warning, notice, information, \n# none, subscribe, unsubscribe, websockets, all.\n# Note that debug type messages are for decoding the incoming/outgoing\n# network packets. They are not logged in \"topics\".\nlog_type error\nlog_type warning\nlog_type notice\nlog_type information\n\n# If set to true, client connection and disconnection messages will be included\n# in the log.\nconnection_messages true\n\n# If set to true, add a timestamp value to each log message.\nlog_timestamp true"
  },
  {
    "path": "deploy/docker/mosquitto/settings.json",
    "content": "{\n  \"ConnectionManager_connections\": {\n    \"mosquitto\": {\n      \"configVersion\": 1,\n      \"certValidation\": false,\n      \"clientId\": \"mqtt-explorer\",\n      \"id\": \"6b3e0a76-c99d-464d-a74c-9c0d1c483edf\",\n      \"name\": \"mosquitto\",\n      \"encryption\": false,\n      \"subscriptions\": [\n        {\n          \"topic\": \"#\",\n          \"qos\": 0\n        },\n        {\n          \"topic\": \"$SYS/#\",\n          \"qos\": 0\n        }\n      ],\n      \"type\": \"mqtt\",\n      \"host\": \"mosquitto\",\n      \"port\": 1883,\n      \"protocol\": \"mqtt\"\n    }\n  }\n}\n"
  },
  {
    "path": "deploy/docker/opentelemetry/collector.yaml",
    "content": "receivers:\n  otlp:\n    protocols:\n      grpc:\n      http:\nexporters:\n  prometheus:\n    endpoint: 0.0.0.0:8889\n  otlp:\n    endpoint: tempo:4317\n    tls:\n      insecure: true\n  loki:\n    endpoint: http://loki:3100/loki/api/v1/push\n    format: json\n    labels:\n      resource:\n        service.name: \"service_name\"\n        service.instance.id: \"service_instance_id\"\nservice:\n  pipelines:\n    metrics:\n      receivers: [ otlp ]\n      exporters: [ prometheus ]\n    traces:\n      receivers: [ otlp ]\n      exporters: [ otlp ]\n    logs:\n      receivers: [ otlp ]\n      exporters: [ loki ]"
  },
  {
    "path": "deploy/docker/opentelemetry/dashboards/opc-publisher.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"PBFA97CFB590B2093\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"hiddenSeries\": false,\n      \"id\": 2,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"8.3.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"iiot_edge_publisher_messages{}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Messages sent\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Publisher - Messages \",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"PBFA97CFB590B2093\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"hiddenSeries\": false,\n      \"id\": 18,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": true,\n        \"current\": false,\n        \"max\": true,\n        \"min\": true,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"8.3.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.985, sum(rate(iiot_edge_publisher_messages_duration_bucket[5m])) by (le))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"98.5th percentile\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(rate(iiot_edge_publisher_messages_duration_bucket[5m])) by (le))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"95th percentile\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.80, sum(rate(iiot_edge_publisher_messages_duration_bucket[5m])) by (le))\",\n          \"interval\": \"\",\n          \"legendFormat\": \"80th percentile\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Publisher - Messages send duration\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"transformations\": [],\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"PBFA97CFB590B2093\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"hiddenSeries\": false,\n      \"id\": 20,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"8.3.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"iiot_edge_publisher_iothub_queue_dropped_count{}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Publisher - Dropped count\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"PBFA97CFB590B2093\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"hiddenSeries\": false,\n      \"id\": 22,\n      \"legend\": {\n        \"avg\": true,\n        \"current\": false,\n        \"max\": true,\n        \"min\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"8.3.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"PBFA97CFB590B2093\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(process_runtime_dotnet_gc_heap_size{}[$__interval])\",\n          \"interval\": \"\",\n          \"legendFormat\": \"GC {{generation}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Publisher - Dotnet GC\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"PBFA97CFB590B2093\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 16\n      },\n      \"hiddenSeries\": false,\n      \"id\": 12,\n      \"legend\": {\n        \"avg\": true,\n        \"current\": false,\n        \"max\": true,\n        \"min\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"8.3.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"iiot_edge_publisher_chunk_size_average\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Average chunk size\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Publisher - Chunk Size\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"PBFA97CFB590B2093\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 24\n      },\n      \"hiddenSeries\": false,\n      \"id\": 14,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"8.3.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"iiot_edge_publisher_data_changes_per_second{}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Publisher - Data Changes per Sec\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"PBFA97CFB590B2093\"\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 32\n      },\n      \"hiddenSeries\": false,\n      \"id\": 16,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"8.3.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"iiot_edge_publisher_iothub_queue_size{}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Queue Size\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeRegions\": [],\n      \"title\": \"Publisher - Queue Size\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"mode\": \"time\",\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"logBase\": 1,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false\n      }\n    }\n  ],\n  \"refresh\": false,\n  \"schemaVersion\": 34,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": []\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Publisher\",\n  \"uid\": \"RbYIZhBMk\",\n  \"version\": 4,\n  \"weekStart\": \"\"\n}\n"
  },
  {
    "path": "deploy/docker/opentelemetry/dashboards.yaml",
    "content": "apiVersion: 1\nproviders:\n  - name: dashboards\n    type: file\n    options:\n      path: /etc/dashboards\n      foldersFromFilesStructure: true"
  },
  {
    "path": "deploy/docker/opentelemetry/datasources.yaml",
    "content": "apiVersion: 1\ndatasources:\n  - name: Prometheus\n    type: prometheus\n    access: proxy\n    orgId: 1\n    uid: PBFA97CFB590B2093\n    url: http://prometheus:9090\n    basicAuth: false\n    isDefault: false\n    version: 1\n    editable: false\n  - name: Tempo\n    type: tempo\n    access: proxy\n    orgId: 1\n    url: http://tempo:3200\n    basicAuth: false\n    isDefault: false\n    version: 1\n    editable: false\n    apiVersion: 1\n    uid: tempo\n  - name: Loki\n    type: loki\n    access: proxy\n    orgId: 1\n    url: http://loki:3100\n    basicAuth: false\n    isDefault: true\n    version: 1\n    editable: false\n    apiVersion: 1\n    jsonData:\n      derivedFields:\n        - datasourceUid: tempo\n          matcherRegex: (?:\"traceid\"):\"(\\w+)\"\n          name: TraceID\n          url: $${__value.raw}\n"
  },
  {
    "path": "deploy/docker/opentelemetry/prometheus.yml",
    "content": "﻿global:\n  scrape_interval:     5s # Set the scrape interval to every 5 seconds. Default is every 1 minute.\n  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.\n  # scrape_timeout is set to the global default (10s).\nalerting:\n  alertmanagers:\n  - static_configs:\n    - targets:\n      # - alertmanager:9093\nscrape_configs:\n  - job_name: 'prometheus'\n    static_configs:\n    - targets: ['localhost:9090']\n  - job_name: 'collector'\n    static_configs:\n      - targets: ['collector:8889']"
  },
  {
    "path": "deploy/docker/opentelemetry/tempo.yaml",
    "content": "server:\n  http_listen_port: 3200\ndistributor:\n  receivers:\n    otlp:\n      protocols:\n        http:\n        grpc:\nstorage:\n  trace:\n    backend: local\n    local:\n      path: /tmp/tempo/blocks"
  },
  {
    "path": "deploy/docker/publisher_secrets.txt",
    "content": "ApiKey=myKey1"
  },
  {
    "path": "deploy/docker/readme.md",
    "content": "# Deploy in docker compose <!-- omit in toc -->\n\n> IMPORTANT: Docker compose based hosting is experimental and only supported on a best effort basis.\n\n## Table Of Contents <!-- omit in toc -->\n\n- [General usage](#general-usage)\n  - [Running with Open Telemetry stack](#running-with-open-telemetry-stack)\n  - [Running with dotnet-monitor](#running-with-dotnet-monitor)\n  - [Running with Mosquitto MQTT broker](#running-with-mosquitto-mqtt-broker)\n- [Setting resource limits on OPC Publisher](#setting-resource-limits-on-opc-publisher)\n\n## General usage\n\nEnsure you have docker compose installed. Run\n\n```bash\ndocker compose up -d\n```\n\nTo start OPC Publisher and OPC PLC. If you want to build OPC Publisher images from the repo run\n\n```cmd\nbuild\n```\n\nTo stop run\n\n```bash\ndocker compose down -d\n```\n\nTo connect to Azure IoT Hub set the `EdgeHubConnectionString` environment variable to a Azure IoT Hub device connection string. Such connection string can be obtained in the portal or through the AZ command line.\n\n> If you use a `.env` file to set the variable, remember to delete the file since the connection string contains secrets!\n\nYou can run OPC Publisher with a couple of additional components to aid in development:\n\n- Use [Open Telemetry](#running-with-open-telemetry-stack) and track metrics.\n- Observe OPC Publisher under [dotnet monitor](#running-with-dotnet-monitor)\n- Run with [Mosquitto MQTT broker](#running-with-mosquitto-mqtt-broker)\n\nThe different configurations can be mixed and matched.\n\n### Running with Open Telemetry stack\n\nTo run OPC Publisher with the Open Telemetry collector connected to Loki, Tempo, Prometheus and Grafana and observe metrics run\n\n```bash\ndocker compose -f docker-compose.yaml -f with-opentelemtry.yaml up -d\n```\n\n### Running with dotnet-monitor\n\nTo create dump files and performance traces of OPC Publisher you can attach dotnet monitor tool.\n\n```bash\ndocker compose -f docker-compose.yaml -f with-monitor.yaml up -d\n```\n\n### Running with Mosquitto MQTT broker\n\nYou can connect OPC Publisher with MQTT output to Mosquitto. The included configuration includes the OPC Foundation UA Cloud dashboard.\n\n```bash\ndocker compose -f docker-compose.yaml -f with-mosquitto.yaml up -d\n```\n\nHint: Ensure that you keep the OPC PLC nodes configured to a minimum to show nice graphs.\n\n## Setting resource limits on OPC Publisher\n\nYou should set limits that are not aggressive and take the following runtime characteristics into account:\n\n- Number of sessions.  Each session requires significant memory (10-20 MB depending on the size of the server)\n- Number of nodes. Each node has a cache of last value\n- Number of messages queued up for batching.\n- Size of the data per monitored item\n\nIt is recommended to set a limit of 4gb. But you should monitor runtime usage in production to determined exact numbers.\n\nYou can run the OPC Publisher with 50m limits under docker, which is not supported by either .net nor us. Nevertheless, the following docker compose configuration shows which settings you can set to run OPC Publisher container for several hours in this mode.\n\n```bash\ndocker compose -f docker-compose.yaml -f with-limits.yaml up -d\n```\n\nWe use this mode to test for leaks over time. You an use the `gcdump.ps1` powershell script to start the same together with dotnet-monitor to periodically dump the GC and observe differences in memory use over time.\n\nThis setup is certainly experimental because:\n\n- Running the above command uses the null transport sink, so no data is ever buffered, messages are just thrown away. The more that is buffered before sending the more memory is required.\n- Alpine images must be used if you want to run for more than 3 seconds with said limit. The official OPC Publisher images are based on Alpine, but the ones built from the repository do not.\n- We disable meta data loading which has significant memory overhead. But you might need it.\n- The publisher publishes 11 nodes with value changes every 1 second. There is no buffering enabled, the messages are immediately dropped after encoding.\n- The setup is continuously under GC pressure and a good chunk of CPU is used for garbage collection and compression.\n- Open Telemetry and Prometheus metrics are disabled as they consume a large amount of memory.\n- The .net GC is configured to be over aggressive which are not ideal for production scenarios.\n"
  },
  {
    "path": "deploy/docker/with-dapr.yaml",
    "content": "services:\n  ############################\n  # OPC Publisher\n  ############################\n  publisher:\n    environment:\n      DaprConnectionString: \"PubSubComponent=redis-pubsub\"\n  ############################\n  # Dapr sidecar for publisher\n  ############################\n  publisher-dapr:\n    image: \"daprio/daprd:edge\"\n    command: [\n      \"./daprd\",\n      \"-app-id\", \"publisher\",\n      \"-placement-host-address\", \"placement:50006\",\n      \"-components-path\", \"/components\"\n      ]\n    volumes:\n      - \"./dapr:/components\"\n    depends_on:\n      - publisher\n    network_mode: \"service:publisher\"\n  ############################\n  # Redis state store\n  ############################\n  redis:\n    container_name: redis\n    hostname: redis\n    image: \"redis:alpine\"\n    ports:\n      - \"6379:6379\"\n  ############################\n  # Dapr placement service\n  ############################\n  placement:\n    image: \"daprio/dapr\"\n    command: [\"./placement\", \"-port\", \"50006\"]\n    ports:\n      - \"50006:50006\"\n  ############################\n  # Redis dashboard\n  ############################\n  redis-commander:\n    container_name: redis-commander\n    hostname: redis-commander\n    image: ghcr.io/joeferner/redis-commander:latest\n    restart: always\n    environment:\n    - REDIS_HOSTS=local:redis:6379\n    ports:\n    - \"8081:8081\""
  },
  {
    "path": "deploy/docker/with-limits.yaml",
    "content": "services:\n  ############################\n  # OPC PLC Simulation\n  ############################\n  opcplc:\n    command: [\n      \"--sph\",\n      \"--spf=/shared/opcplc.json\",\n      \"--pn=50000\",\n      \"--fn=1\",\n      \"--sn=0\",\n      \"--gn=0\",\n      \"--nd\",\n      \"--nn\",\n      \"--ns\",\n      \"--np\",\n      \"--nv\",\n      \"--aa\"\n      ]\n  ############################\n  # OPC Publisher\n  ############################\n  publisher:\n    cpus: \"0.5\"\n    mem_limit: 100m\n    environment:\n      EnableMetrics: false\n      MaxNetworkMessageSendQueueSize: 4\n      DOTNET_ReadyToRun: 1\n      DOTNET_TieredPGO: 0\n      DOTNET_TC_QuickJitForLoops: 0\n      DOTNET_GCConserveMemory: 9\n      DOTNET_GCHeapHardLimitPercent: 30\n"
  },
  {
    "path": "deploy/docker/with-localimage.yaml",
    "content": "services:\n  publisher:\n    image: iotedge/opc-publisher:${OPC_PUBLISHER_TAG:-latest}\n"
  },
  {
    "path": "deploy/docker/with-localvolume.yaml",
    "content": "services:\n  publisher:\n    environment:\n      PublishedNodesFile: /shared/pn.json\n      UseFileChangePolling: True\n    volumes:\n      - shared:/shared:rw\nvolumes:\n  shared:\n    driver: local\n    driver_opts:\n      type: none\n      device: c:\\Shared\n      o: bind"
  },
  {
    "path": "deploy/docker/with-monitor.yaml",
    "content": "services:\n  ############################\n  # OPC PLC Simulation\n  ############################\n  # opcplc:\n  #  environment:\n  #   DOTNET_DiagnosticPorts: /shared/diag/dotnet-monitor.sock\n  ############################\n  # OPC Publisher\n  ############################\n  publisher:\n    environment:\n      DOTNET_DiagnosticPorts: /shared/diag/dotnet-monitor.sock\n  ############################\n  # dotnet-monitor\n  ############################\n  monitor:\n    container_name: monitor\n    image: mcr.microsoft.com/dotnet/monitor:latest\n    ports:\n      - \"9084:52325\"\n    command: [ \"collect\", \"--no-auth\" ]\n    environment:\n      DOTNETMONITOR_DiagnosticPort__ConnectionMode: listen\n      DOTNETMONITOR_Storage__DefaultSharedPath: /shared/diag\n      DOTNETMONITOR_Storage__DumpTempFolder: /shared/diag/tmp\n      DOTNETMONITOR_Metrics__Endpoints: http://+:52325\n      DOTNETMONITOR_Urls: http://localhost:52323\n    volumes:\n      - shared:/shared\n"
  },
  {
    "path": "deploy/docker/with-mosquitto.yaml",
    "content": "services:\n  ############################\n  # OPC Publisher\n  ############################\n  publisher:\n    environment:\n      MqttClientConnectionString: \"HostName=mosquitto;Port=1883;UseTls=false;Protocol=v5\"\n      TelemetryTopicTemplate: \"opcua/{Encoding}/data/{PublisherId}/{WriterGroup}/{DataSetWriter}\"\n      DataSetMetaDataTopicTemplate: \"opcua/{Encoding}/metadata/{PublisherId}/{WriterGroup}/{DataSetWriter}\"\n      DiagnosticsTopicTemplate: \"opcua/{Encoding}/data/{PublisherId}/{WriterGroup}/diagnostic\"\n      EventsTopicTemplate: \"opcua/{Encoding}/status/{PublisherId}\"\n      DefaultDataSetRouting: \"UseBrowseNames\"\n      MessagingMode: \"SingleRawDataSet\"\n      PublisherId: Microsoft\n      SiteId: Munich\n    depends_on:\n      - mosquitto\n  ############################\n  # Mosquitto\n  ############################\n  mosquitto:\n    container_name: mosquitto\n    image: \"eclipse-mosquitto:latest\"\n    restart: unless-stopped\n    ports:\n      - \"1883:1883\"\n    volumes:\n      - mosquitto:/mosquitto/data\n      - \"./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf\"\n  ############################\n  # MQTT explorer\n  ############################\n  mqtt-explorer:\n    container_name: mqtt-explorer\n    image: \"smeagolworms4/mqtt-explorer:latest\"\n    ports:\n      - \"4000:4000\"\n    volumes:\n      - \"./mosquitto/settings.json:/mqtt-explorer/config/settings.json\"\n    depends_on:\n      - mosquitto\n  ############################\n  # UA Cloud dashboard\n  ############################\n  dashboard:\n    container_name: dashboard\n    image: \"ghcr.io/opcfoundation/ua-clouddashboard:main\"\n    ports:\n      - \"8000:80\"\n    environment:\n      IGNORE_MISSING_METADATA: 1\n      USE_MQTT: 1\n      CLIENT_NAME: \"dashboard\"\n      BROKER_NAME: \"mosquitto\"\n      BROKER_PORT: \"1883\"\n      TOPIC: Microsoft/factory1/#\n    depends_on:\n      - mosquitto\nvolumes:\n  mosquitto:\n"
  },
  {
    "path": "deploy/docker/with-opentelemetry.yaml",
    "content": "services:\n  ############################\n  # OPC Publisher\n  ############################\n  publisher:\n    environment:\n      OtlpCollectorEndpoint: \"http://collector:4317\"\n  ############################\n  # OTEL Collector\n  ############################\n  collector:\n    image: otel/opentelemetry-collector-contrib:0.42.0\n    container_name: collector\n    restart: unless-stopped\n    command: [ \"--config=/etc/collector.yaml\" ]\n    ports:\n      - \"4317:4317\"\n      - \"8889:8889\"\n    volumes:\n      - ./opentelemetry/collector.yaml:/etc/collector.yaml\n  ############################\n  # Prometheus for collector\n  ############################\n  prometheus:\n    container_name: prometheus\n    image: prom/prometheus:latest\n    restart: unless-stopped\n    volumes:\n      - ./opentelemetry/prometheus.yml:/etc/prometheus/prometheus.yml\n  ############################\n  # tempo for collector\n  ############################\n  tempo:\n    container_name: tempo\n    image: grafana/tempo:latest\n    restart: unless-stopped\n    command: [ \"-config.file=/etc/tempo.yaml\" ]\n    volumes:\n      - ./opentelemetry/tempo.yaml:/etc/tempo.yaml\n  ############################\n  # Loki for collector\n  ############################\n  loki:\n    container_name: loki\n    image: grafana/loki:latest\n    restart: unless-stopped\n    command: [ \"-config.file=/etc/loki/local-config.yaml\" ]\n  ############################\n  # Dashboarding\n  ############################\n  grafana:\n    container_name: grafana\n    image: grafana/grafana:8.3.3\n    ports:\n      - \"3000:3000\"\n    volumes:\n      - ./opentelemetry/datasources.yaml:/etc/grafana/provisioning/datasources/datasources.yaml\n      - ./opentelemetry/dashboards.yaml:/etc/grafana/provisioning/dashboards/dashboards.yaml\n      - ./opentelemetry/dashboards/:/etc/dashboards/\n    environment:\n      - GF_AUTH_ANONYMOUS_ENABLED=true\n      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin\n      - GF_AUTH_DISABLE_LOGIN_FORM=true\n    depends_on:\n      - prometheus\n      - tempo\n      - loki\n"
  },
  {
    "path": "deploy/docker/with-pcap-capture.yaml",
    "content": "services:\n  ############################\n  # OPC PLC Simulation\n  ############################\n  opcplc:\n    command: [\n      \"--sph=True\",\n      \"--spf=/shared/pn.json\",\n      \"--pn=50000\",\n      \"--fn=8000\",\n      \"--aa=True\",\n      \"--ut=True\"\n      ]\n  ############################\n  # Network capture\n  ############################\n  pcap:\n    container_name: pcap\n    image: travelping/pcap\n    cap_add:\n      - NET_ADMIN\n    network_mode: host\n    volumes:\n      - shared:/data:rw\n    environment:\n      IFACE: any\n      FORMAT: pcapng\n      MAXFILENUM: 10\n      MAXFILESIZE: 200\n      FILENAME: dump.pcap\n      FILTER: \"src or dst host 192.168.80.2\"\nvolumes:\n  shared:\n"
  },
  {
    "path": "deploy/iotedge/.gitignore",
    "content": "eflow-setup/*\n*.log"
  },
  {
    "path": "deploy/iotedge/arm/TLSSettings.ps1",
    "content": "﻿#***************************************************************************************************************\n# This script supports the TLS 1.2 everywhere project\n# It does the following:\n#   *   By default it disables TLS 1.O, TLS 1.1, SSLv2, SSLv3 and Enables TLS1.2\n#   *   The CipherSuite order is set to the SDL approved version.\n#   *   The FIPS MinEncryptionLevel is set to 3.\n#   *   RC4 is disabled\n#   *   A log with a transcript of all actions taken is generated\n#***************************************************************************************************************\n\n#************************************************ SCRIPT USAGE  ************************************************\n# .\\TLSSettings.ps1\n#   -SetCipherOrder         :   Excellence/Min-Bar, default(Excellence), use B to set Min-Bar. (Min-Bar ordering prefers ciphers with smaller key sizes to improve performance over security)\n#   -RebootIfRequired       :   $true/$false, default($true), use $false to disable auto-reboot (Settings won't take effect until a reboot is completed)\n#   -EnableOlderTlsVersions :   $true/$false, default($false), use $true to explicitly Enable TLS1.0, TLS1.1\n#***************************************************************************************************************\n\n#***************************TEAM CAN DETERMINE WHAT CIPHER SUITE ORDER IS CHOSEN  ******************************\n# Option B provides the min-bar configuration (small trade-off: performance over security)\n# Syntax:     .\\TLSSettings.ps1 -SetCipherOrder B\n# if no option is supplied, you will get the opportunity for excellence cipher order (small trade-off: security over performance)\n# Syntax:     .\\TLSSettings.ps1\n#***************************************************************************************************************\n\nparam (\n    [string]$SetCipherOrder = \" \",\n    [bool]$RebootIfRequired = $true,\n    [bool]$EnableOlderTlsVersions = $false\n)\n\n#******************* FUNCTION THAT ACTUALLY UPDATES KEYS; WILL RETURN REBOOT FLAG IF CHANGES ***********************\nFunction Set-CryptoSetting {\n    param (\n        $regKeyName,\n        $value,\n        $valuedata,\n        $valuetype\n    )\n\n    $restart = $false\n\n    # Check for existence of registry key, and create if it does not exist\n    If (!(Test-Path -Path $regKeyName)) {\n        New-Item $regKeyName | Out-Null\n    }\n\n\n    # Get data of registry value, or null if it does not exist\n    $val = (Get-ItemProperty -Path $regKeyName -Name $value -ErrorAction SilentlyContinue).$value\n\n\n    If ($val -eq $null) {\n        # Value does not exist - create and set to desired value\n        New-ItemProperty -Path $regKeyName -Name $value -Value $valuedata -PropertyType $valuetype | Out-Null\n        $restart = $true\n    }\n    Else {\n        # Value does exist - if not equal to desired value, change it\n        If ($val -ne $valuedata) {\n            Set-ItemProperty -Path $regKeyName -Name $value -Value $valuedata\n            $restart = $true\n        }\n    }\n\n\n    $restart\n}\n#***************************************************************************************************************\n\n\n#******************* FUNCTION THAT DISABLES RC4 ***********************\nFunction DisableRC4 {\n\n    $restart = $false\n    $subkeys = Get-Item -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\"\n    $ciphers = $subkeys.OpenSubKey(\"Ciphers\", $true)\n\n    Write-Log -Message \"----- Checking the status of RC4 -----\"  -Logfile $logLocation -Severity Information\n\n    $RC4 = $false\n    if ($ciphers.SubKeyCount -eq 0) {\n        $k1 = $ciphers.CreateSubKey(\"RC4 128/128\")\n        $k1.SetValue(\"Enabled\", 0, [Microsoft.Win32.RegistryValueKind]::DWord)\n        $restart = $true\n        $k2 = $ciphers.CreateSubKey(\"RC4 64/128\")\n        $k2.SetValue(\"Enabled\", 0, [Microsoft.Win32.RegistryValueKind]::DWord)\n        $k3 = $ciphers.CreateSubKey(\"RC4 56/128\")\n        $k3.SetValue(\"Enabled\", 0, [Microsoft.Win32.RegistryValueKind]::DWord)\n        $k4 = $ciphers.CreateSubKey(\"RC4 40/128\")\n        $k4.SetValue(\"Enabled\", 0, [Microsoft.Win32.RegistryValueKind]::DWord)\n\n        Write-Log -Message \"RC4 was disabled \"  -Logfile $logLocation -Severity Information\n        $RC4 = $true\n    }\n\n    If ($RC4 -ne $true) {\n        Write-Log -Message \"There was no change for RC4 \"  -Logfile $logLocation -Severity Information\n    }\n\n    $restart\n}\n#***************************************************************************************************************\n\n#******************* FUNCTION CHECKS FOR PROBLEMATIC FIPS SETTING AND FIXES IT  ***********************\nFunction Test-RegistryValueForFipsSettings {\n\n    $restart = $false\n\n    $fipsPath = @(\n        \"HKLM:\\System\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp\",\n        \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services\",\n        \"HKLM:\\System\\CurrentControlSet\\Control\\Terminal Server\\DefaultUserConfiguration\"\n    )\n\n    $fipsValue = \"MinEncryptionLevel\"\n\n\n    foreach ($path in $fipsPath) {\n\n        Write-Log -Message \"Checking to see if $($path)\\$fipsValue exists\"  -Logfile $logLocation -Severity Information\n\n        $ErrorActionPreference = \"stop\"\n        Try {\n\n            $result = Get-ItemProperty -Path $path | Select-Object -ExpandProperty $fipsValue\n            if ($result -eq 4) {\n                set-itemproperty -Path $path -Name $fipsValue -value 3\n                Write-Log -Message \"Regkey $($path)\\$fipsValue was changed from value $result to a value of 3\"  -Logfile $logLocation -Severity Information\n                $restart = $true\n            }\n\t\t\telse {\n                Write-Log -Message \"Regkey $($path)\\$fipsValue left at value $result\"  -Logfile $logLocation -Severity Information\n\t\t\t}\n\n        }\n        Catch [System.Management.Automation.ItemNotFoundException] {\n\n            Write-Log -Message \"Reg path $path was not found\" -Logfile $logLocation  -Severity Information\n        }\n        Catch [System.Management.Automation.PSArgumentException] {\n\n            Write-Log -Message \"Regkey $($path)\\$fipsValue was not found\" -Logfile $logLocation  -Severity Information\n        }\n        Catch {\n            Write-Log -Message \"Error of type $($Error[0].Exception.GetType().FullName) trying to get $($path)\\$fipsValue\"  -Logfile $logLocation -Severity Information\n        }\n        Finally {$ErrorActionPreference = \"Continue\"\n        }\n    }\n    $restart\n}\n#***************************************************************************************************************\n\n#********************************** FUNCTION THAT CREATE LOG DIRECTORY IF IT DOES NOT EXIST *******************************\nfunction CreateLogDirectory {\n\n    $TARGETDIR = \"$env:HOMEDRIVE\\Logs\"\n    if ( -Not (Test-Path -Path $TARGETDIR ) ) {\n        New-Item -ItemType directory -Path $TARGETDIR | Out-Null\n    }\n\n   $TARGETDIR = $TARGETDIR + \"\\\" + \"TLSSettingsLogFile.csv\"\n\n   return $TARGETDIR\n}\n#***************************************************************************************************************\n\n\n#********************************** FUNCTION THAT LOGS WHAT THE SCRIPT IS DOING *******************************\nfunction Write-Log {\n    [CmdletBinding()]\n    param(\n        [Parameter()]\n        [ValidateNotNullOrEmpty()]\n        [string]$Message,\n\n        [Parameter()]\n        [ValidateNotNullOrEmpty()]\n        [string]$LogFile,\n\n        [Parameter()]\n        [ValidateNotNullOrEmpty()]\n        [ValidateSet('Information', 'Warning', 'Error')]\n        [string]$Severity = 'Information'\n    )\n\n\n    [pscustomobject]@{\n        Time     = (Get-Date -f g)\n        Message  = $Message\n        Severity = $Severity\n    } | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File -Append -FilePath $LogFile\n}\n\n#********************************TLS CipherSuite Settings *******************************************\n\n# CipherSuites for windows OS < 10\nfunction Get-BaseCipherSuitesOlderWindows()\n{\n    param\n    (\n        [Parameter(Mandatory=$true, Position=0)][bool] $isExcellenceOrder\n    )\n    $cipherorder = @()\n\n    if ($isExcellenceOrder -eq $true)\n    {\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256\"\n    }\n    else\n    {\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384\"\n    }\n\n    # Add additional ciphers when EnableOlderTlsVersions flag is set to true\n    if ($EnableOlderTlsVersions)\n    {\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256\"\n        $cipherorder += \"TLS_RSA_WITH_AES_256_GCM_SHA384\"\n        $cipherorder += \"TLS_RSA_WITH_AES_128_GCM_SHA256\"\n        $cipherorder += \"TLS_RSA_WITH_AES_256_CBC_SHA256\"\n        $cipherorder += \"TLS_RSA_WITH_AES_128_CBC_SHA256\"\n        $cipherorder += \"TLS_RSA_WITH_AES_256_CBC_SHA\"\n        $cipherorder += \"TLS_RSA_WITH_AES_128_CBC_SHA\"\n    }\n    return $cipherorder\n}\n\n# Ciphersuites needed for backwards compatibility with Firefox, Chrome\n# Server 2012 R2 doesn't support TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\n# Both firefox and chrome negotiate ECDHE_RSA_AES_256_CBC_SHA1, Edge negotiates ECDHE_RSA_AES_256_CBC_SHA384\nfunction Get-BrowserCompatCipherSuitesOlderWindows()\n{\n    param\n    (\n        [Parameter(Mandatory=$true, Position=0)][bool] $isExcellenceOrder\n    )\n    $cipherorder = @()\n\n    if ($isExcellenceOrder -eq $true)\n    {\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384\"  # (uses SHA-1)\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256\"  # (uses SHA-1)\n    }\n    else\n    {\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256\"  # (uses SHA-1)\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384\"  # (uses SHA-1)\n    }\n    return $cipherorder\n}\n\n# Ciphersuites for OS versions windows 10 and above\nfunction Get-BaseCipherSuitesWin10Above()\n{\n    param\n    (\n        [Parameter(Mandatory=$true, Position=0)][bool] $isExcellenceOrder\n    )\n\n    $cipherorder = @()\n\n    if ($isExcellenceOrder -eq $true)\n    {\n\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256\"\n    }\n    else\n    {\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384\"\n    }\n    # Add additional ciphers when EnableOlderTlsVersions flag is set to true\n    if ($EnableOlderTlsVersions)\n    {\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256\"\n        $cipherorder += \"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256\"\n        $cipherorder += \"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256\"\n        $cipherorder += \"TLS_RSA_WITH_AES_256_GCM_SHA384\"\n        $cipherorder += \"TLS_RSA_WITH_AES_128_GCM_SHA256\"\n        $cipherorder += \"TLS_RSA_WITH_AES_256_CBC_SHA256\"\n        $cipherorder += \"TLS_RSA_WITH_AES_128_CBC_SHA256\"\n        $cipherorder += \"TLS_RSA_WITH_AES_256_CBC_SHA\"\n        $cipherorder += \"TLS_RSA_WITH_AES_128_CBC_SHA\"\n    }\n\n    return $cipherorder\n}\n\n\n#******************************* TLS Version Settings ****************************************************\n\nfunction Get-RegKeyPathForTls12()\n{\n    $regKeyPath = @(\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.2\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.2\\Client\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.2\\Server\"\n    )\n    return $regKeyPath\n}\n\nfunction Get-RegKeyPathForTls11()\n{\n    $regKeyPath = @(\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.1\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.1\\Client\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.1\\Server\"\n    )\n    return $regKeyPath\n}\n\nfunction Get-RegKeypathForTls10()\n{\n    $regKeyPath = @(\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.0\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.0\\Client\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.0\\Server\"\n    )\n    return $regKeyPath\n}\n\nfunction Get-RegKeyPathForSsl30()\n{\n    $regKeyPath = @(\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\SSL 3.0\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\SSL 3.0\\Client\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\SSL 3.0\\Server\"\n    )\n    return $regKeyPath\n}\n\nfunction Get-RegKeyPathForSsl20()\n{\n    $regKeyPath = @(\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\SSL 2.0\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\SSL 2.0\\Client\",\n        \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\SSL 2.0\\Server\"\n    )\n    return $regKeyPath\n}\n\n#Initialize reboot value to false\n$reboot = $false\n\n#*****************************Create the logfile if not does not exist***************************************\n$logLocation = CreateLogDirectory\n\n\n#Start writing to the logs\nWrite-Log -Message \"========== Start of logging for a script execution ==========\"  -Logfile $logLocation -Severity Information\n\n$registryPathGoodGuys = @()\n$registryPathBadGuys = @()\n\n# we enable TLS 1.2 and disable SSL 2.0, 3.0 in any case\n$registryPathGoodGuys += Get-RegKeyPathForTls12\n\n$registryPathBadGuys += Get-RegKeyPathForSsl20\n$registryPathBadGuys += Get-RegKeyPathForSsl30\n\n# add TLS 1.0/1.1 to good/bad depending on user's preference\n# default is adding TLS 1.0/1.1 to bad\nif ($EnableOlderTlsVersions)\n{\n    $registryPathGoodGuys += Get-RegKeypathForTls10\n    $registryPathGoodGuys += Get-RegKeyPathForTls11\n    Write-Log -Message \"Enabling TLS1.2, TLS1.1, TLS1.0. Disabling SSL3.0, SSL2.0\"  -Logfile $logLocation -Severity Information\n}\nelse\n{\n    $registryPathBadGuys += Get-RegKeypathForTls10\n    $registryPathBadGuys += Get-RegKeyPathForTls11\n    Write-Log -Message \"Enabling TLS1.2. Disabling TLS1.1, TLS1.0, SSL3.0, SSL2.0\"  -Logfile $logLocation -Severity Information\n}\n\n\nWrite-Log -Message \"Check which registry keys exist already and which registry keys need to be created.\"  -Logfile $logLocation -Severity Information\n\n#******************* CREATE THE REGISTRY KEYS IF THEY DON'T EXIST********************************\n# Check for existence of GoodGuy registry keys, and create if they do not exist\nFor ($i = 0; $i -lt $registryPathGoodGuys.Length; $i = $i + 1) {\n\n\t   Write-Log -Message \"Checking for existing of key: $($registryPathGoodGuys[$i]) \" -Logfile $logLocation  -Severity Information\n\t   If (!(Test-Path -Path $registryPathGoodGuys[$i])) {\n        New-Item $registryPathGoodGuys[$i] | Out-Null\n     \t  Write-Log -Message \"Creating key: $($registryPathGoodGuys[$i]) \"  -Logfile $logLocation -Severity Information\n \t  }\n}\n\n# Check for existence of BadGuy registry keys, and create if they do not exist\nFor ($i = 0; $i -lt $registryPathBadGuys.Length; $i = $i + 1) {\n\n    Write-Log -Message \"Checking for existing of key: $($registryPathBadGuys[$i]) \"  -Logfile $logLocation -Severity Information\n\t   If (!(Test-Path -Path $registryPathBadGuys[$i])) {\n        Write-Log -Message \"Creating key: $($registryPathBadGuys[$i]) \"  -Logfile $logLocation -Severity Information\n        New-Item  $registryPathBadGuys[$i] | Out-Null\n \t  }\n}\n\n#******************* EXPLICITLY DISABLE SSLV2, SSLV3, TLS10 AND TLS11 ********************************\nFor ($i = 0; $i -lt $registryPathBadGuys.Length; $i = $i + 1) {\n\n    if ($registryPathBadGuys[$i].Contains(\"Client\") -Or $registryPathBadGuys[$i].Contains(\"Server\")) {\n\n        Write-Log -Message \"Disabling this key: $($registryPathBadGuys[$i]) \"  -Logfile $logLocation -Severity Information\n        $result = Set-CryptoSetting $registryPathBadGuys[$i].ToString() Enabled 0 DWord\n        $result = Set-CryptoSetting $registryPathBadGuys[$i].ToString() DisabledByDefault 1 DWord\n        $reboot = $reboot -or $result\n    }\n}\n\n#********************************* EXPLICITLY Enable TLS12 ****************************************\nFor ($i = 0; $i -lt $registryPathGoodGuys.Length; $i = $i + 1) {\n\n    if ($registryPathGoodGuys[$i].Contains(\"Client\") -Or $registryPathGoodGuys[$i].Contains(\"Server\")) {\n\n        Write-Log -Message \"Enabling this key: $($registryPathGoodGuys[$i]) \"  -Logfile $logLocation -Severity Information\n        $result = Set-CryptoSetting $registryPathGoodGuys[$i].ToString() Enabled 1 DWord\n        $result = Set-CryptoSetting $registryPathGoodGuys[$i].ToString() DisabledByDefault 0 DWord\n        $reboot = $reboot -or $result\n    }\n}\n\n#************************************** Disable RC4 ************************************************\n$result = DisableRC4\n$reboot = $reboot -or $result\n\n\n#************************************** Set Cipher Suite Order **************************************\nWrite-Log -Message \"----- starting ciphersuite order calculation -----\"  -Logfile $logLocation -Severity Information\n$configureExcellenceOrder = $true\nif ($SetCipherOrder.ToUpper() -eq \"B\")\n{\n    $configureExcellenceOrder = $false\n    Write-Host \"The min bar cipher suite order was chosen.\"\n    Write-Log -Message \"The min bar cipher suite order was chosen.\"  -Logfile $logLocation -Severity Information\n}\nelse\n{\n    Write-Host \"The opportunity for excellence cipher suite order was chosen.\"\n    Write-Log -Message \"The opportunity for excellence cipher suite order was chosen.\"  -Logfile $logLocation -Severity Information\n}\n$cipherlist = @()\n\nif ([Environment]::OSVersion.Version.Major -lt 10)\n{\n    $cipherlist += Get-BaseCipherSuitesOlderWindows -isExcellenceOrder $configureExcellenceOrder\n    $cipherlist += Get-BrowserCompatCipherSuitesOlderWindows -isExcellenceOrder $configureExcellenceOrder\n}\nelse\n{\n    $cipherlist += Get-BaseCipherSuitesWin10Above -isExcellenceOrder $configureExcellenceOrder\n}\n$cipherorder = [System.String]::Join(\",\", $cipherlist)\n Write-Host \"Appropriate ciphersuite order : $cipherorder\"\n Write-Log -Message \"Appropriate ciphersuite order : $cipherorder\"  -Logfile $logLocation -Severity Information\n\n$CipherSuiteRegKey = \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Cryptography\\Configuration\\SSL\\00010002\"\n\nif (!(Test-Path -Path $CipherSuiteRegKey))\n{\n    New-Item $CipherSuiteRegKey | Out-Null\n    $reboot = $True\n    Write-Log -Message \"Creating key: $($CipherSuiteRegKey) \"  -Logfile $logLocation -Severity Information\n}\n\n$val = (Get-Item -Path $CipherSuiteRegKey -ErrorAction SilentlyContinue).GetValue(\"Functions\", $null)\nWrite-Log -Message \"Previous cipher suite value: $val  \"  -Logfile $logLocation -Severity Information\nWrite-Log -Message \"New cipher suite value     : $cipherorder  \"  -Logfile $logLocation -Severity Information\n\nif ($val -ne $cipherorder)\n{\n    Write-Log -Message \"Cipher suite order needs to be updated. \"  -Logfile $logLocation -Severity Information\n    Write-Host \"The original cipher suite order needs to be updated\", `n, $val\n    Set-ItemProperty -Path $CipherSuiteRegKey -Name Functions -Value $cipherorder\n    Write-Log -Message \"Cipher suite value was updated. \"  -Logfile $logLocation -Severity Information\n    $reboot = $True\n}\nelse\n{\n    Write-Log -Message \"Cipher suite order does not need to be updated. \"  -Logfile $logLocation -Severity Information\n\tWrite-Log -Message \"Cipher suite value was not updated as there was no change. \" -Logfile $logLocation -Severity Information\n}\n\n#****************************** CHECK THE FIPS SETTING WHICH IMPACTS RDP'S ALLOWED CIPHERS **************************\n#Check for FipsSettings\nWrite-Log -Message \"Checking to see if reg keys exist and if MinEncryptionLevel is set to 4\"  -Logfile $logLocation -Severity Information\n$result = Test-RegistryValueForFipsSettings\n$reboot = $reboot -or $result\n\n\n#************************************** REBOOT **************************************\n\nif ($RebootIfRequired)\n{\n    Write-Log -Message \"You set the RebootIfRequired flag to true. If changes are made, the system will reboot \"  -Logfile $logLocation -Severity Information\n    # If any settings were changed, reboot\n    If ($reboot)\n    {\n        Write-Log -Message \"Rebooting now... \"  -Logfile $logLocation -Severity Information\n        Write-Log -Message \"Using this command: shutdown.exe /r /t 5 /c \"\"Crypto settings changed\"\" /f /d p:2:4 \"  -Logfile $logLocation -Severity Information\n        Write-Host \"Rebooting now...\"\n        shutdown.exe /r /t 5 /c \"Crypto settings changed\" /f /d p:2:4\n    }\n    Else\n    {\n        Write-Host \"Nothing get updated.\"\n        Write-Log -Message \"Nothing get updated. \"  -Logfile $logLocation -Severity Information\n    }\n}\nelse\n{\n\n    Write-Log -Message \"You set the RebootIfRequired flag to false. If changes are made, the system will NOT reboot \"  -Logfile $logLocation -Severity Information\n    Write-Log -Message \"No changes will take effect until a reboot has been completed. \"  -Logfile $logLocation -Severity Information\n    Write-Log -Message \"Script does not include a reboot by design\" -Logfile $logLocation -Severity Information\n}\nWrite-Log -Message \"========== End of logging for a script execution ==========\"  -Logfile $logLocation -Severity Information\n"
  },
  {
    "path": "deploy/iotedge/arm/default.yml",
    "content": "version: '3'\nservices:\n  opcserver0:\n    image: mcr.microsoft.com/iotedge/opc-plc:latest\n    restart: always\n    command: --aa -pn 51200 -fn 50 -fr 1 -sn 250 -sr 10\n    ports:\n      - \"51200:51200\"\n  opcserver1:\n    image: mcr.microsoft.com/iotedge/opc-plc:latest\n    restart: always\n    command: --aa -pn 51200 -fn 50 -fr 1 -sn 250 -sr 10\n    ports:\n      - \"51201:51201\"\n  opcserver2:\n    image: mcr.microsoft.com/iotedge/opc-plc:latest\n    restart: always\n    command: --aa -pn 51200 -fn 50 -fr 1 -sn 250 -sr 10\n    ports:\n      - \"51202:51202\"\n"
  },
  {
    "path": "deploy/iotedge/arm/dps-enroll.ps1",
    "content": "<#\n .SYNOPSIS\n    Creates a new enrollment in dps\n\n .DESCRIPTION\n    Creates a new random enrollment in dps and returns enrollment information\n\n .PARAMETER dpsConnString\n    The Azure Device Provisioning Service connection string\n\n .PARAMETER os\n    The operating system to enroll\n#>\nparam(\n    [Parameter(Mandatory)]\n    [string] $dpsConnString,\n    [Parameter(Mandatory)]\n    [string] $os\n)\n\n#******************************************************************************\n# Generate a random key\n#******************************************************************************\nFunction New-Key() {\n    param(\n        $length = 15\n    )\n    $digits = 48..57\n    $lcLetters = 65..90\n    $password = `\n        [char](Get-Random -Count 1 -InputObject ($lcLetters)) + `\n        [char](Get-Random -Count 1 -InputObject ($digits))\n    $password += get-random -Count ($length - 4) `\n        -InputObject ($digits + $lcLetters) |`\n        ForEach-Object -begin { $aa = $null } -process { $aa += [char]$_ } -end { $aa }\n    return $password\n}\n\n$registrationId = (New-Key).ToLower()\n\n# Parse connection string\n$hostName = $null\n$keyName = $null\n$key = $null\n$dpsConnString.Split(';') | ForEach-Object {\n    $kv = $_\n    $x = \"HostName=\"\n    if ($kv.StartsWith($x)) {\n        $hostName = $kv.Replace($x, \"\").Trim()\n        return\n    }\n    $x = \"SharedAccessKeyName=\"\n    if ($kv.StartsWith($x)) {\n        $keyName = $kv.Replace($x, \"\").Trim()\n    }\n    $x = \"SharedAccessKey=\"\n    if ($kv.StartsWith($x)) {\n        $key = $kv.Replace($x, \"\").Trim()\n        return\n    }\n}\n\n# Create sas token\nAdd-Type -AssemblyName System.Web\n$audience = $hostName\n$expires=([DateTimeOffset]::Now.ToUnixTimeSeconds()) + 300\n$signatureString=[System.Web.HttpUtility]::UrlEncode($audience)+ \"`n\" + [string]$expires\n$hmac = New-Object System.Security.Cryptography.HMACSHA256\n$hmac.key = [Convert]::FromBase64String($key)\n$signature = $HMAC.ComputeHash([Text.Encoding]::UTF8.GetBytes($signatureString))\n$signature = [Convert]::ToBase64String($signature)\n$sasToken = \"SharedAccessSignature \" `\n    + \"sr=\" + [System.Web.HttpUtility]::UrlEncode($audience) `\n    + \"&sig=\" + [System.Web.HttpUtility]::UrlEncode($signature) `\n    + \"&se=\" + $expires `\n    + \"&skn=\" + $keyName\n\n# Create enrollment\n\n$headers = @{\"Authorization\" = $sasToken; \"Content-Type\" = \"application/json\"}\nAdd-Type -AssemblyName System.Net\n$deviceId = [System.Net.Dns]::GetHostName()\n$body = @{\n    attestation = @{\n        type = \"symmetricKey\"\n    }\n    deviceId = $deviceId\n    initialTwin = @{\n        tags = @{\n            __type__ = \"iiotedge\"\n            os = $os\n        }\n    }\n    registrationId = $registrationId\n    capabilities = @{\n        iotEdge = $true\n    }\n} | ConvertTo-Json\n\n\n$uri = \"https://$($hostName)/enrollments/$($registrationId)?api-version=2019-03-31\"\ntry {\n    $response = $body | Invoke-RestMethod -Method Put -Headers $headers -Uri $uri\n    return @{\n        registrationId = $response.registrationId\n        primaryKey = $response.attestation.symmetricKey.primaryKey\n    }\n} catch {\n    Write-Host $_.Exception.Message\n    return $null\n}\n"
  },
  {
    "path": "deploy/iotedge/arm/dsc-install.ps1",
    "content": "Configuration InstallWindowsFeatures {\n\n    Import-DscResource -ModuleName PsDesiredStateConfiguration\n\n    Node \"localhost\" {\n\n        LocalConfigurationManager {\n            RebootNodeIfNeeded = $true\n            ActionAfterReboot  = 'ContinueConfiguration'\n        }\n\n        WindowsFeature Hyper-V {\n            Name   = \"Hyper-V\"\n            Ensure = \"Present\"\n            IncludeAllSubFeature = $true\n        }\n\n        Script VirtualMachinePlatform {\n            SetScript = { Enable-WindowsOptionalFeature -Online -FeatureName \"VirtualMachinePlatform\" }\n            TestScript = { (Get-WindowsOptionalFeature -Online -FeatureName \"VirtualMachinePlatform\").State -eq \"Enabled\" }\n            GetScript = { @{ Result = Get-WindowsOptionalFeature -Online -FeatureName \"VirtualMachinePlatform\" } }\n        }\n\n        WindowsFeature Hyper-V-Management-Tools {\n            Name = \"RSAT-Hyper-V-Tools\"\n            Ensure = \"Present\"\n        }\n\n        Script Microsoft-Hyper-V-Management-PowerShell {\n            SetScript = { Enable-WindowsOptionalFeature -Online -FeatureName \"Microsoft-Hyper-V-Management-PowerShell\" }\n            TestScript = { (Get-WindowsOptionalFeature -Online -FeatureName \"Microsoft-Hyper-V-Management-PowerShell\").State -eq \"Enabled\" }\n            GetScript = { @{ Result = Get-WindowsOptionalFeature -Online -FeatureName \"Microsoft-Hyper-V-Management-PowerShell\" } }\n        }\n\n        WindowsFeature DHCP {\n            Name   = \"DHCP\"\n            Ensure = \"Present\"\n            IncludeAllSubFeature = $true\n        }\n\n        WindowsFeature DHCP-Management-Tools {\n            Name = \"RSAT-DHCP\"\n            Ensure = \"Present\"\n        }\n\n        Script OpenSSH-Client-Capability {\n            SetScript = { Add-WindowsCapability -Online -Name \"OpenSSH.Client*\" }\n            TestScript = { (Get-WindowsCapability -Online -Name \"OpenSSH.Client*\").State -eq \"Installed\" }\n            GetScript = { @{ Result = Get-WindowsCapability -Online -Name \"OpenSSH.Client*\" } }\n        }\n    }\n}\n"
  },
  {
    "path": "deploy/iotedge/arm/edge-setup.ps1",
    "content": "<#\n .SYNOPSIS\n    Configure IoT edge\n\n .DESCRIPTION\n    Configure IoT edge on linux vm to use DPS.\n\n .PARAMETER dpsConnString\n    The Dps connection string\n\n .PARAMETER idScope\n    The Dps id scope\n#>\nparam(\n    [Parameter(Mandatory)]\n    [string] $dpsConnString,\n    [Parameter(Mandatory)]\n    [string] $idScope\n)\n\n$path = Split-Path $script:MyInvocation.MyCommand.Path\n$enrollPath = join-path $path dps-enroll.ps1\n\n$file = \"/etc/aziot/config.toml\"\nif (Test-Path $file) {\n    Write-Host \"Already configured.\"\n    return\n}\n\nWrite-Host \"Create new IoT Edge enrollment.\"\n$enrollment = & $enrollPath -dpsConnString $dpsConnString -os Linux\nWrite-Host \"Configure and initialize IoT Edge on Linux using enrollment information.\"\n\n# add dps setting\n$configtoml = \"`nauto_reprovisioning_mode = `\"OnErrorOnly`\"\"\n$configtoml += \"`n\"\n$configtoml += \"`n[aziot_keys]\"\n$configtoml += \"`n\"\n$configtoml += \"`n[preloaded_keys]\"\n$configtoml += \"`n\"\n$configtoml += \"`n[cert_issuance]\"\n$configtoml += \"`n\"\n$configtoml += \"`n[preloaded_certs]\"\n$configtoml += \"`n\"\n$configtoml += \"`n[tpm]\"\n$configtoml += \"`n\"\n$configtoml += \"`n[agent]\"\n$configtoml += \"`nname = `\"edgeAgent`\"\"\n$configtoml += \"`ntype = `\"docker`\"\"\n$configtoml += \"`nimagePullPolicy = `\"on-create`\"\"\n$configtoml += \"`n\"\n$configtoml += \"`n[agent.config]\"\n$configtoml += \"`nimage = `\"mcr.microsoft.com/azureiotedge-agent:1.4`\"\"\n$configtoml += \"`n\"\n$configtoml += \"`n[agent.config.createOptions]\"\n$configtoml += \"`n\"\n$configtoml += \"`n[agent.env]\"\n$configtoml += \"`n\"\n$configtoml += \"`n[connect]\"\n$configtoml += \"`nworkload_uri = `\"unix:///var/run/iotedge/workload.sock`\"\"\n$configtoml += \"`nmanagement_uri = `\"unix:///var/run/iotedge/mgmt.sock`\"\"\n$configtoml += \"`n\"\n$configtoml += \"`n[listen]\"\n$configtoml += \"`nworkload_uri = `\"fd://aziot-edged.workload.socket`\"\"\n$configtoml += \"`nmanagement_uri = `\"fd://aziot-edged.mgmt.socket`\"\"\n$configtoml += \"`nmin_tls_version = `\"tls1.0`\"\"\n$configtoml += \"`n[watchdog]\"\n$configtoml += \"`nmax_retries = `\"infinite`\"\"\n$configtoml += \"`n\"\n$configtoml += \"`n[provisioning]\"\n$configtoml += \"`nsource = `\"dps`\"\"\n$configtoml += \"`nglobal_endpoint = `\"https://global.azure-devices-provisioning.net`\"\"\n$configtoml += \"`nid_scope = `\"$($idScope)`\"\"\n$configtoml += \"`n\"\n$configtoml += \"`n[provisioning.attestation]\"\n$configtoml += \"`nmethod = `\"symmetric_key`\"\"\n$configtoml += \"`nregistration_id = `\"$($enrollment.registrationId)`\"\"\n$configtoml += \"`nsymmetric_key = { value = `\"$($enrollment.primaryKey)`\" }\"\n$configtoml += \"`n\"\n\n$configtoml | Out-Host\n$configtoml | Out-File $file -Force\n"
  },
  {
    "path": "deploy/iotedge/arm/edge-setup.sh",
    "content": "#!/bin/bash -e\n\nwhile [ \"$#\" -gt 0 ]; do\n    case \"$1\" in\n        --dpsConnString)                  dpsConnString=\"$2\" ;;\n        --idScope)                        idScope=\"$2\" ;;\n    esac\n    shift\ndone\n\ncurdir=\"$( cd \"$(dirname \"$0\")\" ; pwd -P )\"\n\necho \"In $curdir...\"\nosversion=$(lsb_release -sr)\nif [[ -z \"$osversion\" ]]; then\n    echo \"Not an Ubuntu image...\"\n    exit 1\nfi\necho \"Prepare Ubuntu $osversion...\"\nDEBIAN_FRONTEND=noninteractive\n\n# install powershell and iotedge\n\ncurl -O https://packages.microsoft.com/config/ubuntu/$osversion/packages-microsoft-prod.deb\ndpkg -i packages-microsoft-prod.deb\napt-get update\napt-get install -y --no-install-recommends powershell\necho \"Powershell installed.\"\n\ncurl -o microsoft-prod.list https://packages.microsoft.com/config/ubuntu/$osversion/multiarch/prod.list\ncp ./microsoft-prod.list /etc/apt/sources.list.d/\ncurl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg\ncp ./microsoft.gpg /etc/apt/trusted.gpg.d/\napt-get update\napt-get install -y --no-install-recommends moby-engine moby-cli\napt-get install -y --no-install-recommends aziot-edge defender-iot-micro-agent-edge\necho \"Iotedge installed.\"\n\necho \"Provisioning iotedge...\"\nsleep 3\npwsh -File $curdir/edge-setup.ps1 -dpsConnString $dpsConnString -idScope $idScope\necho \"Iotedge provisioned.\"\n\niotedge config apply\n\n"
  },
  {
    "path": "deploy/iotedge/arm/eflow-setup.ps1",
    "content": "\n<#\n .SYNOPSIS\n    Setup Eflow IoT edge\n\n .DESCRIPTION\n    Setup Eflow IoT edge on windows vm to use DPS using DSC.\n\n .PARAMETER dpsConnString\n    The Dps connection string\n\n .PARAMETER idScope\n    The Dps id scope\n#>\nparam(\n    [Parameter(Mandatory)]\n    [string] $dpsConnString,\n    [Parameter(Mandatory)]\n    [string] $idScope\n)\n\n$eflowMsiUri = \"https://aka.ms/AzEFLOWMSI_1_4_LTS_X64\"\n\n$ErrorActionPreference = \"Stop\"\n$path = Split-Path $script:MyInvocation.MyCommand.Path\n$enrollPath = join-path $path dps-enroll.ps1\n\n# Set-ExecutionPolicy -ExecutionPolicy AllSigned -Force\nStart-Transcript -path (join-path $path \"edge-setup.log\")\n\n[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\nInstall-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force\nInstall-Module Subnet -Force\n\nWrite-Host \"Download IoT Edge installer.\"\n$msiPath = $([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))\n$ProgressPreference = 'SilentlyContinue'\n[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\nInvoke-WebRequest $eflowMsiUri -OutFile $msiPath\n\nWrite-Host \"Run IoT Edge installer.\"\nStart-Process -Wait msiexec -ArgumentList \"/i\",\"$([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))\",\"/qn\"\n\nWrite-Host \"Existing virtual switches:\"\nGet-VmSwitch\n\n$switch = \"NestedSwitch\"\nWrite-Host \"Add virtual switch $($switch)...\"\nNew-VMSwitch -Name $switch -SwitchType Internal\n\n$switchAlias = \"vEthernet ($($switch))\"\nWrite-Host \"Network Adapter for '$($switchAlias)'\"\n$itf = Get-NetAdapter -Name $switchAlias -ErrorAction SilentlyContinue\nwhile (!$itf)\n{\n   Start-Sleep -Seconds 3\n   $itf = Get-NetAdapter -Name $switchAlias -ErrorAction SilentlyContinue\n}\n$itf | Out-Host\n\n$ifIndex = $itf.ifIndex\n$virtualSwitchIp = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $ifIndex -ErrorAction SilentlyContinue\nwhile (!$virtualSwitchIp)\n{\n   Start-Sleep -Seconds 3\n   $virtualSwitchIp = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $ifIndex -ErrorAction SilentlyContinue\n}\n$virtualSwitchIp | Out-Host\n$subnet = Get-Subnet -IP $virtualSwitchIp.IPAddress -MaskBits 24\nWrite-Host \"Create new ip address $($subnet.HostAddresses[0])/$($subnet.MaskBits)\"\nNew-NetIPAddress -IPAddress $subnet.HostAddresses[0] -PrefixLength $subnet.MaskBits -InterfaceIndex  $ifIndex\nWrite-Host \"Create NAT $($subnet.NetworkAddress)}/$($subnet.MaskBits)\"\nNew-NetNat -Name $switch -InternalIPInterfaceAddressPrefix \"$($subnet.NetworkAddress)/$($subnet.MaskBits)\"\n\nStart-Sleep -Seconds 10\nWrite-Host \"Configure DHCP\"\ncmd.exe /c \"netsh dhcp add securitygroups\"\nRestart-Service dhcpserver\n# select a set of 100 addresses\n$startIp = $subnet.HostAddresses[100]\n$endIp = $subnet.HostAddresses[200]\nWrite-Host \"Add DHCP scope to $startIp - $endIp ...\"\nAdd-DhcpServerV4Scope -Name \"AzureIoTEdgeScope\" -StartRange $startIp -EndRange $endIp -SubnetMask $subnet.SubnetMask -State Active\nSet-DhcpServerV4OptionValue -ScopeID $subnet.NetworkAddress -Router $subnet.HostAddresses[0]\nRestart-service dhcpserver\n\nWrite-Host \"ipconfig:\"\nipconfig /all\n\nWrite-Host \"Deploy eflow with switch $($switch).\"\nDeploy-Eflow -acceptEula Yes -acceptOptionalTelemetry Yes -vSwitchType \"Internal\" -vSwitchName $switch\n\nGet-EflowVmAddr\nGet-EflowVmEndpoint\nGet-EflowNetwork -vSwitchName $switch\n\nWrite-Host \"Create new IoT Edge enrollment in DPS.\"\n$enrollment = & $enrollPath -dpsConnString $dpsConnString -os Windows\n\nWrite-Host \"Provision eflow with DPS registration $($enrollment.registrationId) in DPS scope $($idScope).\"\nProvision-EflowVm -provisioningType DpsSymmetricKey -scopeId $idScope -registrationId $enrollment.registrationId -symmKey $enrollment.primaryKey\nWrite-Host \"Eflow provisioned.\"\n\nStart-EflowVm\nVerify-EflowVm\nWrite-Host \"Eflow running.\"\n"
  },
  {
    "path": "deploy/iotedge/arm/simulation.sh",
    "content": "#!/bin/bash -ex\n\nADMIN=$USER\nIMAGES_NAMESPACE=\nIMAGES_TAG=\nDOCKER_SERVER=\nDOCKER_USER=\nDOCKER_PASSWORD=\nDOCKER_COMPOSE_FILE=\"default.yml\"\nDEBIAN_FRONTEND=noninteractive\n\nAPP_PATH=\"/app\"\nENVVARS=\"${APP_PATH}/.env\"\n\n# ========================================================================\n\nwhile [ \"$#\" -gt 0 ]; do\n    case \"$1\" in\n        --admin)                ADMIN=\"$2\" ;;\n        --name)                 DOCKER_COMPOSE_FILE=\"$2.yml\" ;;\n        --imagesNamespace)      IMAGES_NAMESPACE=\"$2\" ;;\n        --imagesTag)            IMAGES_TAG=\"$2\" ;;\n        --dockerServer)         DOCKER_SERVER=\"$2\" ;;\n        --dockerUser)           DOCKER_USER=\"$2\" ;;\n        --dockerPassword)       DOCKER_PASSWORD=\"$2\" ;;\n    esac\n    shift\ndone\n\n# ========================================================================\n\napt-get update\napt-get remove -y docker docker-engine docker.io\napt-get autoremove -y\napt-get install -y --no-install-recommends apt-transport-https ca-certificates curl software-properties-common openssl\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\napt-key fingerprint 0EBFCD88\nadd-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\"\napt-get update\napt-get install -y --no-install-recommends docker-ce\nusermod -aG docker $USER\nusermod -aG docker $ADMIN\ncurl -L \"https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\nchmod +x /usr/local/bin/docker-compose\n\n# ========================================================================\n\nmkdir -p ${APP_PATH}\nchmod ugo+rX ${APP_PATH}\ncp -f ${DOCKER_COMPOSE_FILE} ${APP_PATH}/docker-compose.yml\ncp -f simulation.sh ${APP_PATH}/simulation.sh\ncd ${APP_PATH}\ntouch docker-compose.yml && chmod 644 docker-compose.yml\nchmod 755 simulation.sh\n\n# ========================================================================\n\nif [ -z \"$DOCKER_SERVER\" ]; then\n    DOCKER_SERVER=mcr.microsoft.com\nfi\nif [ -z \"$DOCKER_USER\" ]; then\n    echo -e \"Deploying from public ${DOCKER_SERVER}.\"\nelse\n    echo -e \"Logging into private registry at ${DOCKER_SERVER}.\"\n    docker login -u $DOCKER_USER -p $DOCKER_PASSWORD $DOCKER_SERVER\nfi\n\nchown -R $ADMIN ${APP_PATH}\ncd ${APP_PATH}\nrm -f ${ENVVARS}\nif [ -z \"$IMAGES_NAMESPACE\" ]; then\n    echo \"REPOSITORY=${DOCKER_SERVER}\" >> ${ENVVARS}\nelse\n    echo \"REPOSITORY=${DOCKER_SERVER}/${IMAGES_NAMESPACE}\" >> ${ENVVARS}\nfi\nif [ -z \"$IMAGES_TAG\" ]; then\n    echo -e \"Using latest version of images as defined in compose file.\"\nelse\n    echo \"VERSION=${IMAGES_TAG}\" >> ${ENVVARS}\nfi\ntouch ${ENVVARS} && chmod 644 ${ENVVARS}\ndocker-compose pull\ndocker-compose up -d\nif [ $? -eq 0 ]\nthen\n    echo \"Simulation started.\"\n    exit 0\nelse\n    echo \"Failure: Cannot start simulation.\" >&2\n    exit 1\nfi\n"
  },
  {
    "path": "deploy/iotedge/arm/testing.yml",
    "content": "version: '3'\nservices:\n  opcserver0:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51200:51200\"\n    environment:\n      - SERVER_PORT=51200\n  opcserver1:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51201:51201\"\n    environment:\n      - SERVER_PORT=51201\n  opcserver2:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51202:51202\"\n    environment:\n      - SERVER_PORT=51202\n  opcserver3:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51203:51203\"\n    environment:\n      - SERVER_PORT=51203\n  opcserver4:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51204:51204\"\n    environment:\n      - SERVER_PORT=51204\n  opcserver5:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51205:51205\"\n    environment:\n      - SERVER_PORT=51205\n  opcserver6:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51206:51206\"\n    environment:\n      - SERVER_PORT=51206\n  opcserver7:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51207:51207\"\n    environment:\n      - SERVER_PORT=51207\n  opcserver8:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51208:51208\"\n    environment:\n      - SERVER_PORT=51208\n  opcserver9:\n    image: ${REPOSITORY:-mcr.microsoft.com}/iot/opc-ua-test-server:${VERSION:-latest}\n    restart: always\n    ports:\n      - \"51209:51209\"\n    environment:\n      - SERVER_PORT=51209\n"
  },
  {
    "path": "deploy/iotedge/azuredeploy.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"edgeName\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Name of the IoT Edge virtual machine.\"\n            }\n        },\n        \"simulationProfile\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"default\",\n            \"allowedValues\": [\n                \"default\",\n                \"testing\"\n            ],\n            \"metadata\": {\n                \"description\": \"The name of the simulation docker-compose file on github without extension.\"\n            }\n        },\n        \"dpsIdScope\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Device provisioning service id scope.\"\n            }\n        },\n        \"dpsConnString\": {\n            \"type\": \"secureString\",\n            \"metadata\": {\n                \"description\": \"Azure Device Provisioning service connection string.\"\n            }\n        },\n        \"edgeOs\": {\n            \"type\": \"string\",\n            \"allowedValues\": [\n                \"linux\",\n                \"windows\"\n            ],\n            \"defaultValue\": \"linux\",\n            \"metadata\": {\n                \"description\": \"Operating system to use for the virtual edge.\"\n            }\n        },\n        \"edgeUsername\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"Username for the IoT Edge virtual machine.\"\n            }\n        },\n        \"edgePassword\": {\n            \"type\": \"securestring\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"Password for the IoT Edge virtual machine.\"\n            }\n        },\n        \"edgeVmSize\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"The size of the gateway VM to provision.\"\n            }\n        },\n        \"numberOfSimulations\": {\n            \"type\": \"int\",\n            \"defaultValue\": 1,\n            \"maxValue\": 255,\n            \"minValue\": 1,\n            \"metadata\": {\n                \"description\": \"Number of simulated factories to deploy.\"\n            }\n        },\n        \"simulationVmSize\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"The size of the simulation VM to provision.\"\n            }\n        },\n        \"dockerServer\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"mcr.microsoft.com\",\n            \"metadata\": {\n                \"description\": \"Specifies the endpoint of the Container Registry.\"\n            }\n        },\n        \"dockerUser\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"Specifies the user to log into the Container Registry.\"\n            }\n        },\n        \"dockerPassword\": {\n            \"type\": \"secureString\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"Specifies the password to the Container Registry.\"\n            }\n        },\n        \"imagesNamespace\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"Specifies the namespace prefix for the images in the Container Registry.\"\n            }\n        },\n        \"imagesTag\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"latest\",\n            \"metadata\": {\n                \"description\": \"Specifies the image version tag to use for all images.\"\n            }\n        },\n        \"templateUrl\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"https://raw.githubusercontent.com/Azure/Industrial-IoT\",\n            \"metadata\": {\n                \"description\": \"The artifacts url from which to pull all linked templates.  Default is official repository.\"\n            }\n        },\n        \"branchName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"main\",\n            \"metadata\": {\n                \"description\": \"The branch from which to deploy deploy services and application.  Default to main.\"\n            }\n        },\n        \"managedIdentityResourceId\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"A user created managed identity to use for keyvault access.  If not provided, above secret will be used to gain access to keyvault.\"\n            }\n        },\n        \"tags\": {\n            \"type\": \"object\",\n            \"defaultValue\": {},\n            \"metadata\": {\n                \"description\": \"Tags for Azure resources.\"\n            }\n        }\n    },\n    \"variables\": {\n        \"instanceId\": \"[take(uniqueString(subscription().subscriptionId, resourceGroup().id, parameters('edgeName'), parameters('edgeOs')), 7)]\",\n        \"vmPrefix\": \"[if(equals(parameters('edgeOs'), 'windows'), take(parameters('edgeName'), 6), parameters('edgeName'))]\",\n        \"vmName\": \"[tolower(concat(variables('vmPrefix'), '-', variables('instanceId')))]\",\n        \"vmResourceId\": \"[resourceId('Microsoft.Compute/virtualMachines', variables('vmName'))]\",\n        \"nicResourceName\": \"[concat(variables('vmName'), '-nic')]\",\n        \"nicResourceId\": \"[resourceId(resourceGroup().name,'Microsoft.Network/networkInterfaces', variables('nicResourceName'))]\",\n        \"vnetResourceName\": \"[concat(variables('vmName'), '-vnet')]\",\n        \"vnetResourceId\": \"[resourceId(resourceGroup().name,'Microsoft.Network/virtualNetworks', variables('vnetResourceName'))]\",\n        \"nsgResourceName\": \"[concat(variables('vmName'), '-nsg')]\",\n        \"nsgResourceId\": \"[resourceId(resourceGroup().name,'Microsoft.Network/virtualNetworks', variables('nsgResourceName'))]\",\n        \"simulationName\": \"[concat(variables('vmName'), '-sim')]\",\n        \"simulationResourceName\": \"[concat(deployment().name, '.edge')]\",\n        \"identity\": {\n            \"type\": \"UserAssigned\",\n            \"userAssignedIdentities\": {\n                \"[parameters('managedIdentityResourceId')]\": {\n                }\n            }\n        },\n        \"windowsDscProperties\": {\n            \"publisher\": \"Microsoft.Powershell\",\n            \"type\": \"DSC\",\n            \"typeHandlerVersion\": \"2.77\",\n            \"autoUpgradeMinorVersion\": true,\n            \"settings\": {\n                \"wmfVersion\": \"latest\",\n                \"configuration\": {\n                    \"url\": \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/dsc-install.zip')]\",\n                    \"script\": \"dsc-install.ps1\",\n                    \"function\": \"InstallWindowsFeatures\"\n                }\n            }\n        },\n        \"windowsVmExtension\": {\n            \"publisher\": \"Microsoft.Compute\",\n            \"type\": \"CustomScriptExtension\",\n            \"typeHandlerVersion\": \"1.9\",\n            \"autoUpgradeMinorVersion\": true,\n            \"settings\": {\n                \"fileUris\": [\n                    \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/dps-enroll.ps1')]\",\n                    \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/eflow-setup.ps1')]\",\n                    \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/TLSSettings.ps1')]\"\n                ]\n            },\n            \"protectedSettings\": {\n                \"commandToExecute\": \"[concat('powershell -ExecutionPolicy Unrestricted -File ./eflow-setup.ps1 -idScope \\\"', parameters('dpsIdScope'), '\\\" -dpsConnString \\\"', parameters('dpsConnString'), '\\\"')]\"\n            }\n        },\n        \"windowsOsProfile\": {\n            \"computerName\": \"[variables('vmName')]\",\n            \"adminUsername\": \"[parameters('edgeUsername')]\",\n            \"adminPassword\": \"[if(not(empty(parameters('edgePassword'))), parameters('edgePassword'), json('null'))]\",\n            \"windowsConfiguration\": {\n                \"enableAutomaticUpdates\": true,\n                \"provisionVmAgent\": true\n            }\n        },\n        \"windowsVmSku\": \"Standard_D4s_v4\",\n        \"windowsImage\": {\n            \"publisher\": \"MicrosoftWindowsServer\",\n            \"offer\": \"WindowsServer\",\n            \"sku\": \"2022-Datacenter\",\n            \"version\": \"latest\"\n        },\n        \"linuxVmSku\": \"[if(not(empty(parameters('edgeVmSize'))), parameters('edgeVmSize'), 'Standard_B2s')]\",\n        \"linuxImage\": {\n            \"publisher\": \"Canonical\",\n            \"offer\": \"UbuntuServer\",\n            \"sku\": \"18.04-LTS\",\n            \"version\": \"latest\"\n        },\n        \"linuxOsProfile\": {\n            \"computerName\": \"[variables('vmName')]\",\n            \"adminUsername\": \"[parameters('edgeUsername')]\",\n            \"adminPassword\": \"[if(not(empty(parameters('edgePassword'))), parameters('edgePassword'), json('null'))]\"\n        },\n        \"linuxVmExtension\": {\n            \"publisher\": \"Microsoft.Azure.Extensions\",\n            \"type\": \"CustomScript\",\n            \"typeHandlerVersion\": \"2.0\",\n            \"autoUpgradeMinorVersion\": true,\n            \"settings\": {\n                \"fileUris\": [\n                    \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/dps-enroll.ps1')]\",\n                    \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/edge-setup.ps1')]\",\n                    \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/edge-setup.sh')]\"\n                ]\n            },\n            \"protectedSettings\": {\n                \"commandToExecute\": \"[concat('sudo bash edge-setup.sh --idScope \\\"', parameters('dpsIdScope'), '\\\" --dpsConnString \\\"', parameters('dpsConnString'), '\\\"')]\"\n            }\n        },\n        \"imagesTagOrLatest\": \"[if(empty(parameters('imagesTag')), 'latest', parameters('imagesTag'))]\",\n        \"edgeVmSku\": \"[if(equals(parameters('edgeOs'), 'linux'), variables('linuxVmSku'), variables('windowsVmSku'))]\",\n        \"simulationVmSku\": \"[if(not(empty(parameters('simulationVmSize'))), parameters('simulationVmSize'), variables('linuxVmSku'))]\"\n    },\n    \"resources\": [\n        {\n            \"comments\": \"Virtual edge network.\",\n            \"name\": \"[variables('vnetResourceName')]\",\n            \"type\": \"Microsoft.Network/virtualNetworks\",\n            \"apiVersion\": \"2019-09-01\",\n            \"location\": \"[resourceGroup().location]\",\n            \"tags\": \"[parameters('tags')]\",\n            \"properties\": {\n                \"addressSpace\": {\n                    \"addressPrefixes\": [\n                        \"10.1.8.0/22\"\n                    ]\n                },\n                \"subnets\": [\n                    {\n                        \"name\": \"vm-subnet\",\n                        \"properties\": {\n                            \"addressPrefix\": \"10.1.8.0/24\"\n                        }\n                    }\n                ]\n            },\n            \"dependsOn\": [\n            ]\n        },\n        {\n            \"comments\": \"Network interface for edge virtual machine to use.\",\n            \"name\": \"[variables('nicResourceName')]\",\n            \"type\": \"Microsoft.Network/networkInterfaces\",\n            \"apiVersion\": \"2019-09-01\",\n            \"location\": \"[resourceGroup().location]\",\n            \"tags\": \"[parameters('tags')]\",\n            \"properties\": {\n                \"ipConfigurations\": [\n                    {\n                        \"name\": \"ipconfig1\",\n                        \"properties\": {\n                            \"subnet\": {\n                                \"id\": \"[concat(variables('vnetResourceId'), '/subnets/', 'vm-subnet')]\"\n                            },\n                            \"privateIPAllocationMethod\": \"Dynamic\"\n                        }\n                    }\n                ]\n            },\n            \"dependsOn\": [\n                \"[variables('vnetResourceId')]\"\n            ]\n        },\n        {\n            \"type\": \"Microsoft.Network/networkSecurityGroups\",\n            \"apiVersion\": \"2023-04-01\",\n            \"name\": \"[variables('nsgResourceName')]\",\n            \"location\": \"[resourceGroup().location]\",\n            \"properties\": {\n                \"securityRules\": [\n                    {\n                        \"name\": \"default-allow-22\",\n                        \"id\": \"[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', variables('nsgResourceName'), 'default-allow-22')]\",\n                        \"type\": \"Microsoft.Network/networkSecurityGroups/securityRules\",\n                        \"properties\": {\n                            \"protocol\": \"Tcp\",\n                            \"sourcePortRange\": \"*\",\n                            \"destinationPortRange\": \"22\",\n                            \"sourceAddressPrefix\": \"*\",\n                            \"destinationAddressPrefix\": \"*\",\n                            \"access\": \"Allow\",\n                            \"priority\": 1000,\n                            \"direction\": \"Inbound\",\n                            \"sourcePortRanges\": [],\n                            \"destinationPortRanges\": [],\n                            \"sourceAddressPrefixes\": [],\n                            \"destinationAddressPrefixes\": []\n                        }\n                    },\n                    {\n                        \"name\": \"DenyAnyHTTPSOutbound\",\n                        \"id\": \"[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', variables('nsgResourceName'), 'DenyAnyHTTPSOutbound')]\",\n                        \"type\": \"Microsoft.Network/networkSecurityGroups/securityRules\",\n                        \"properties\": {\n                            \"protocol\": \"TCP\",\n                            \"sourcePortRange\": \"*\",\n                            \"destinationPortRange\": \"443\",\n                            \"sourceAddressPrefix\": \"*\",\n                            \"destinationAddressPrefix\": \"*\",\n                            \"access\": \"Deny\",\n                            \"priority\": 1010,\n                            \"direction\": \"Outbound\",\n                            \"sourcePortRanges\": [],\n                            \"destinationPortRanges\": [],\n                            \"sourceAddressPrefixes\": [],\n                            \"destinationAddressPrefixes\": []\n                        }\n                    },\n                    {\n                        \"name\": \"DenyAnyHTTPOutbound\",\n                        \"id\": \"[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', variables('nsgResourceName'), 'DenyAnyHTTPOutbound')]\",\n                        \"type\": \"Microsoft.Network/networkSecurityGroups/securityRules\",\n                        \"properties\": {\n                            \"protocol\": \"TCP\",\n                            \"sourcePortRange\": \"*\",\n                            \"destinationPortRange\": \"80\",\n                            \"sourceAddressPrefix\": \"*\",\n                            \"destinationAddressPrefix\": \"*\",\n                            \"access\": \"Deny\",\n                            \"priority\": 1020,\n                            \"direction\": \"Outbound\",\n                            \"sourcePortRanges\": [],\n                            \"destinationPortRanges\": [],\n                            \"sourceAddressPrefixes\": [],\n                            \"destinationAddressPrefixes\": []\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"comments\": \"Virtual machine hosting the IoT Edge installation.\",\n            \"name\": \"[variables('vmName')]\",\n            \"type\": \"Microsoft.Compute/virtualMachines\",\n            \"apiVersion\": \"2022-03-01\",\n            \"location\": \"[resourceGroup().location]\",\n            \"tags\": \"[parameters('tags')]\",\n            \"identity\": \"[if(not(empty(parameters('managedIdentityResourceId'))), variables('identity'), '')]\",\n            \"properties\": {\n                \"hardwareProfile\": {\n                    \"vmSize\": \"[variables('edgeVmSku')]\"\n                },\n                \"osProfile\": \"[if(equals(parameters('edgeOs'), 'linux'), variables('linuxOsProfile'), variables('windowsOsProfile'))]\",\n                \"storageProfile\": {\n                    \"imageReference\": \"[if(equals(parameters('edgeOs'), 'linux'), variables('linuxImage'), variables('windowsImage'))]\",\n                    \"osDisk\": {\n                        \"createOption\": \"FromImage\"\n                    }\n                },\n                \"networkProfile\": {\n                    \"networkInterfaces\": [\n                        {\n                            \"id\": \"[variables('nicResourceId')]\"\n                        }\n                    ]\n                }\n            },\n            \"dependsOn\": [\n                \"[variables('nicResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"Install required windows features for eflow installtion on vm.\",\n            \"type\": \"Microsoft.Compute/virtualMachines/extensions\",\n            \"apiVersion\": \"2021-03-01\",\n            \"condition\": \"[not(equals(parameters('edgeOs'), 'linux'))]\",\n            \"name\": \"[concat(variables('vmName'), '/', 'InstallWindowsFeatures')]\",\n            \"location\": \"[resourceGroup().location]\",\n            \"properties\": \"[variables('windowsDscProperties')]\",\n            \"dependsOn\": [\n                \"[variables('vmResourceId')]\"\n            ]\n        },\n        {\n            \"comments\": \"One time script execution to install and onboard IoT Edge and deploy workloads\",\n            \"type\": \"Microsoft.Compute/virtualMachines/extensions\",\n            \"name\": \"[concat(variables('vmName'), '/', 'scriptextensions')]\",\n            \"apiVersion\": \"2019-03-01\",\n            \"location\": \"[resourceGroup().location]\",\n            \"tags\": \"[parameters('tags')]\",\n            \"properties\": \"[if (equals(parameters('edgeOs'), 'linux'), variables('linuxVmExtension'), variables('windowsVmExtension'))]\",\n            \"dependsOn\": [\n                \"[variables('vmResourceId')]\",\n                \"[resourceId('Microsoft.Compute/virtualMachines/extensions', variables('vmName'), 'InstallWindowsFeatures')]\"\n            ]\n        },\n        {\n            \"comments\": \"Deploy factory network simulation.\",\n            \"type\": \"Microsoft.Resources/deployments\",\n            \"apiVersion\": \"2019-08-01\",\n            \"name\": \"[concat(variables('simulationResourceName'), copyIndex())]\",\n            \"condition\": \"[not(equals(parameters('numberOfSimulations'), 0))]\",\n            \"copy\": {\n                \"count\": \"[if(not(equals(0, parameters('numberOfSimulations'))), parameters('numberOfSimulations'), 1)]\",\n                \"mode\": \"Parallel\",\n                \"name\": \"simulationcopies\"\n            },\n            \"properties\": {\n                \"mode\": \"Incremental\",\n                \"template\": {\n                    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n                    \"contentVersion\": \"1.0.0.0\",\n                    \"resources\": [\n                        {\n                            \"comments\": \"Network interface for simulation virtual machine to use.\",\n                            \"name\": \"[concat(variables('simulationName'), copyIndex(), '-nic')]\",\n                            \"type\": \"Microsoft.Network/networkInterfaces\",\n                            \"apiVersion\": \"2019-09-01\",\n                            \"location\": \"[resourceGroup().location]\",\n                            \"tags\": \"[parameters('tags')]\",\n                            \"properties\": {\n                                \"ipConfigurations\": [\n                                    {\n                                        \"name\": \"ipconfig1\",\n                                        \"properties\": {\n                                            \"subnet\": {\n                                                \"id\": \"[concat(variables('vnetResourceId'), '/subnets/', 'vm-subnet')]\"\n                                            },\n                                            \"privateIPAllocationMethod\": \"Dynamic\"\n                                        }\n                                    }\n                                ]\n                            },\n                            \"dependsOn\": [\n                            ]\n                        },\n                        {\n                            \"comments\": \"VM running the simulation\",\n                            \"type\": \"Microsoft.Compute/virtualMachines\",\n                            \"name\": \"[concat(variables('simulationName'), copyIndex())]\",\n                            \"apiVersion\": \"2019-03-01\",\n                            \"location\": \"[resourceGroup().location]\",\n                            \"tags\": \"[parameters('tags')]\",\n                            \"properties\": {\n                                \"hardwareProfile\": {\n                                    \"vmSize\": \"[variables('simulationVmSku')]\"\n                                },\n                                \"osProfile\": {\n                                    \"computerName\": \"[concat(variables('simulationName'), copyIndex())]\",\n                                    \"adminUsername\": \"[parameters('edgeUsername')]\",\n                                    \"adminPassword\": \"[if(not(empty(parameters('edgePassword'))), parameters('edgePassword'), json('null'))]\"\n                                },\n                                \"storageProfile\": {\n                                    \"imageReference\": \"[variables('linuxImage')]\",\n                                    \"osDisk\": {\n                                        \"createOption\": \"FromImage\"\n                                    }\n                                },\n                                \"networkProfile\": {\n                                    \"networkInterfaces\": [\n                                        {\n                                            \"id\": \"[resourceId('Microsoft.Network/networkInterfaces/', concat(variables('simulationName'), copyIndex(), '-nic'))]\"\n                                        }\n                                    ]\n                                }\n                            },\n                            \"dependsOn\": [\n                                \"[resourceId('Microsoft.Network/networkInterfaces/', concat(variables('simulationName'), copyIndex(), '-nic'))]\"\n                            ]\n                        },\n                        {\n                            \"comments\": \"One time script execution to prepare the VM environment\",\n                            \"type\": \"Microsoft.Compute/virtualMachines/extensions\",\n                            \"name\": \"[concat(variables('simulationName'), copyIndex(), '/', 'scriptextensions')]\",\n                            \"apiVersion\": \"2019-03-01\",\n                            \"location\": \"[resourceGroup().location]\",\n                            \"tags\": \"[parameters('tags')]\",\n                            \"properties\": {\n                                \"publisher\": \"Microsoft.Azure.Extensions\",\n                                \"type\": \"CustomScript\",\n                                \"typeHandlerVersion\": \"2.0\",\n                                \"autoUpgradeMinorVersion\": true,\n                                \"settings\": {\n                                    \"fileUris\": [\n                                        \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/simulation.sh')]\",\n                                        \"[concat(parameters('templateUrl'), '/', parameters('branchName'), '/deploy/iotedge/arm/', parameters('simulationProfile'), '.yml')]\"\n                                    ]\n                                },\n                                \"protectedSettings\": {\n                                    \"commandToExecute\": \"[concat('sudo bash simulation.sh ', ' --admin ', parameters('edgeUsername'), ' --name ', parameters('simulationProfile'), ' --imagesNamespace ', concat('\\\"', parameters('imagesNamespace'), '\\\"'), ' --imagesTag ', concat('\\\"', variables('imagesTagOrLatest'), '\\\"'), ' --dockerServer ', concat('\\\"', parameters('dockerServer'), '\\\"'), ' --dockerUser ', concat('\\\"', parameters('dockerUser'), '\\\"'), ' --dockerPassword ', concat('\\\"', parameters('dockerPassword'), '\\\"'))]\"\n                                }\n                            },\n                            \"dependsOn\": [\n                                \"[resourceId('Microsoft.Compute/virtualMachines/', concat(variables('simulationName'), copyIndex()))]\"\n                            ]\n                        }\n                    ]\n                }\n            },\n            \"dependsOn\": [\n                \"[variables('vnetResourceId')]\"\n            ]\n        }\n    ],\n    \"outputs\": {\n        \"edgeUsername\": {\n            \"type\": \"string\",\n            \"value\": \"[parameters('edgeUsername')]\"\n        }\n    }\n}\n"
  },
  {
    "path": "deploy/iotedge/azuredeploy.parameters.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"edgeName\": {\n            \"value\": \"\",\n            \"metadata\": {\n                \"description\": \"The name of the IoT Edge device. This name must be unique within the IoT Hub.\",\n                \"displayName\": \"IoT Edge Device Name\"\n            }\n        },\n        \"dpsIdScope\": {\n            \"value\": \"\",\n            \"metadata\": {\n                \"description\": \"The ID scope for the Device Provisioning Service. This is used to identify the DPS instance.\",\n                \"displayName\": \"DPS ID Scope\"\n            }\n        },\n        \"dpsConnString\": {\n            \"value\": \"\",\n            \"metadata\": {\n                \"description\": \"The connection string for the Device Provisioning Service.\",\n                \"displayName\": \"DPS Connection String\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "deploy/iotedge/edgehubdev.cmd",
    "content": "@REM Copyright (c) Microsoft. All rights reserved.\n@REM Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n@setlocal EnableExtensions EnableDelayedExpansion\n@echo off\n\nset current-path=%~dp0\nrem // remove trailing slash\nset current-path=%current-path:~0,-1%\nset build_root=%current-path%\\..\n\nset clean=\nset _config=Release\nset _verbose=\n\n:args-loop\nif \"%1\" equ \"\" goto :args-done\nif \"%1\" equ \"--xtrace\" goto :arg-trace\nif \"%1\" equ  \"-x\" goto :arg-trace\nif \"%1\" equ \"--debug\" goto :arg-config\nif \"%1\" equ  \"-d\" goto :arg-config\nif \"%1\" equ \"--verbose\" goto :arg-verbose\nif \"%1\" equ  \"-v\" goto :arg-verbose\nif \"%1\" equ \"--hub-name\" goto :arg-hub-name\nif \"%1\" equ  \"-n\" goto :arg-hub-name\nif \"%1\" equ \"--tenant\" goto :arg-tenant\nif \"%1\" equ  \"-t\" goto :arg-tenant\nif \"%1\" equ \"--subscription\" goto :arg-subscription\nif \"%1\" equ  \"-s\" goto :arg-subscription\ngoto :usage\n:args-continue\nshift\ngoto :args-loop\n\n:usage\necho Run opc publisher in the edgehubdev context.\necho Usage: run.cmd [options]\necho options:\necho -n --hub-name [name]       specify hub name to install into (REQUIRED).\necho -t --tenant [id]           specify the tenant to log into.\necho -s --subscription [id]     set the subscription to use.\necho -v --verbose               Log output from edge hub dev.\necho -d --debug                 build debug container images.\necho -x --xtrace                print a trace of each command.\nexit /b 1\n\n:arg-trace\necho on\ngoto :args-continue\n:arg-config\nset _config=Debug\ngoto :args-continue\n:arg-verbose\nset _verbose=-v\ngoto :args-continue\n:arg-hub-name\nshift\nset _hub-name=%1\ngoto :args-continue\n:arg-subscription\nshift\nset _subscription=%1\ngoto :args-continue\n:arg-tenant\nshift\nset _tenant=-t %1\ngoto :args-continue\n:args-done\ngoto :validate-args\n\n:validate-args\nif \"%_hub-name%\" == \"\" echo Missing required argument --hub-name. && goto :usage\ngoto :main\n\nrem\nrem Check edgehubdev and docker\nrem\n:main\ncall iotedgehubdev --version\nif !ERRORLEVEL! == 0 goto :docker\necho First install iotedgehubdev per https://github.com/Azure/iotedgehubdev.\ngoto :error\n:docker\ncall docker ps -a > nul 2>&1\nif !ERRORLEVEL! == 0 goto :login\necho Docker is not running or installed.\ngoto :error\n\nrem\nrem Login\nrem\n:login\ncall az account show > nul 2>&1\nif !ERRORLEVEL! == 0 goto :setsub\necho Login to Azure...\ncall az login %_tenant%\ngoto :setsub\n:setsub\nif \"%_subscription%\" == \"\" goto :build\ncall az account set -s %subscription% > nul 2>&1\nif !ERRORLEVEL! == 0 goto :build\necho Failed to change subscription!\ngoto :error\n\nrem\nrem Build and publish\nrem\n:build\nset c=--self-contained false /t:PublishContainer /p:ContainerImageTag=latest\nset p=Azure.IIoT.OpcUa.Publisher.Module\necho Building %_config% image...\ncall dotnet publish ../../src/%p%/src/%p%.csproj -c %_config% %c% > nul 2>&1\nif !ERRORLEVEL! == 0 goto :run\necho Failed to build %_config% image!\ngoto :error\n\nrem\nrem Setup and start\nrem\n:run\nset c=\nset c=%c% az iot hub connection-string show\nset c=%c% --hub-name %_hub-name%\nset c=%c% -o tsv --query connectionString\nfor /f \"tokens=*\" %%a in ('%c%') do set _HUB_CS=%%a\nif !ERRORLEVEL! == 0 goto :check\necho Failed to get connection string for iot hub %_hub-name%!\ngoto :error\n:check\nfor /f \"tokens=*\" %%a in ('hostname') do set hostname=%%a\n\ncall az iot hub device-identity show -n %_hub-name% --device-id %hostname% > nul 2>&1\nif not !ERRORLEVEL! == 0 goto :create\nset c=\nset c=%c% az iot hub device-identity connection-string show\nset c=%c% --hub-name %_hub-name% --device-id %hostname%\nset c=%c% -o tsv --query connectionString\nfor /f \"tokens=*\" %%a in ('%c%') do set _EH_CS=%%a\nif !ERRORLEVEL! == 0 goto :setup\n:create\necho Creating device %hostname% in %_hub-name%.\ncall az iot edge devices create -n %_hub-name% --device id=%hostname%\nif !ERRORLEVEL! == 0 goto :check\necho Failed to create edge device %hostname% in %_hub-name%.\ngoto :error\n:setup\ncall iotedgehubdev setup -c \"%_EH_CS%\" -i \"%_HUB_CS%\" -g %hostname%\nif !ERRORLEVEL! == 0 goto :start\necho Failed to setup iotedgehubdev!\ngoto :error\n:start\nif not exist %current-path%\\edgehubdev.json goto :error\ncall iotedgehubdev start -d %current-path%\\edgehubdev.json %_verbose%\nif !ERRORLEVEL! == 0 goto :done\necho Failed to start iotedgehubdev!\ngoto :error\n\n:done\ngoto :eof\n:error\nexit /b 1\n\n\n\n"
  },
  {
    "path": "deploy/iotedge/edgehubdev.json",
    "content": "{\n    \"modulesContent\": {\n        \"$edgeAgent\": {\n            \"properties.desired\": {\n                \"schemaVersion\": \"1.1\",\n                \"runtime\": {\n                    \"type\": \"docker\",\n                    \"settings\": {\n                        \"minDockerVersion\": \"v1.25\",\n                        \"loggingOptions\": \"\",\n                        \"registryCredentials\": {}\n                    }\n                },\n                \"systemModules\": {\n                    \"edgeAgent\": {\n                        \"type\": \"docker\",\n                        \"settings\": {\n                            \"image\": \"mcr.microsoft.com/azureiotedge-agent:1.4\",\n                            \"createOptions\": \"\"\n                        }\n                    },\n                    \"edgeHub\": {\n                        \"type\": \"docker\",\n                        \"status\": \"running\",\n                        \"restartPolicy\": \"always\",\n                        \"settings\": {\n                            \"image\": \"mcr.microsoft.com/azureiotedge-hub:1.4\",\n                            \"createOptions\": \"{\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"5671/tcp\\\":[{\\\"HostPort\\\":\\\"5671\\\"}], \\\"8883/tcp\\\":[{\\\"HostPort\\\":\\\"8883\\\"}],\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"443\\\"}]}}}\"\n                        },\n                        \"env\": {\n                            \"SslProtocols\": {\n                                \"value\": \"tls1.2\"\n                            }\n                        }\n                    }\n                },\n                \"modules\": {\n                    \"publisher\": {\n                        \"version\": \"1.0\",\n                        \"type\": \"docker\",\n                        \"status\": \"running\",\n                        \"restartPolicy\": \"always\",\n                        \"settings\": {\n                            \"image\": \"iotedge/opc-publisher:latest\",\n                            \"createOptions\": \"{\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"8081\\\"}]},\\\"CapDrop\\\":[\\\"CHOWN\\\",\\\"SETUID\\\"]},\\\"Hostname\\\":\\\"publisher\\\",\\\"User\\\":\\\"root\\\",\\\"Cmd\\\":[\\\"--strict\\\",\\\"--pki=/mount/pki\\\",\\\"--cf\\\",\\\"--mm=PubSub\\\",\\\"--me=Json\\\",\\\"--cl=5\\\",\\\"--sl\\\",\\\"--aa\\\"]}\"\n                        }\n                    },\n                    \"opcplc\": {\n                        \"version\": \"1.0\",\n                        \"type\": \"docker\",\n                        \"status\": \"running\",\n                        \"restartPolicy\": \"always\",\n                        \"settings\": {\n                            \"image\": \"mcr.microsoft.com/iotedge/opc-plc:latest\",\n                            \"createOptions\": \"{\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"50000/tcp\\\":[{\\\"HostPort\\\":\\\"50000\\\"}]},\\\"CapDrop\\\":[\\\"CHOWN\\\",\\\"SETUID\\\"]},\\\"Hostname\\\":\\\"opcplc\\\",\\\"User\\\":\\\"root\\\",\\\"Cmd\\\":[\\\"--sph=True\\\",\\\"--pki=/mount/pki\\\",\\\"--pn=50000\\\",\\\"--alm=True\\\",\\\"--ses=True\\\",\\\"--sn=1000\\\",\\\"--fn=1000\\\",\\\"--aa=True\\\"]}\"\n                        }\n                    }\n                }\n            }\n        },\n        \"$edgeHub\": {\n            \"properties.desired\": {\n                \"schemaVersion\": \"1.0\",\n                \"routes\": {\n                    \"publisherToUpstream\": \"FROM /messages/modules/publisher/* INTO $upstream\",\n                    \"leafToUpstream\": \"FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO $upstream\"\n                },\n                \"storeAndForwardConfiguration\": {\n                    \"timeToLiveSecs\": 7200\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "deploy/iotedge/eflow-setup.json",
    "content": "{\n    \"$edgeAgent\": {\n        \"properties.desired\": {\n            \"schemaVersion\": \"1.1\",\n            \"runtime\": {\n                \"type\": \"docker\",\n                \"settings\": {\n                    \"minDockerVersion\": \"v1.25\",\n                    \"loggingOptions\": \"\",\n                    \"registryCredentials\": {}\n                }\n            },\n            \"systemModules\": {\n                \"edgeAgent\": {\n                    \"type\": \"docker\",\n                    \"settings\": {\n                        \"image\": \"mcr.microsoft.com/azureiotedge-agent:1.4\",\n                        \"createOptions\": \"\"\n                    }\n                },\n                \"edgeHub\": {\n                    \"type\": \"docker\",\n                    \"status\": \"running\",\n                    \"restartPolicy\": \"always\",\n                    \"settings\": {\n                        \"image\": \"mcr.microsoft.com/azureiotedge-hub:1.4\",\n                        \"createOptions\": \"{\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"5671/tcp\\\":[{\\\"HostPort\\\":\\\"5671\\\"}], \\\"8883/tcp\\\":[{\\\"HostPort\\\":\\\"8883\\\"}],\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"443\\\"}]}}}\"\n                    },\n                    \"env\": {\n                        \"SslProtocols\": {\n                            \"value\": \"tls1.2\"\n                        }\n                    }\n                }\n            },\n            \"modules\": {\n                \"publisher\": {\n                    \"version\": \"1.0\",\n                    \"type\": \"docker\",\n                    \"status\": \"running\",\n                    \"restartPolicy\": \"always\",\n                    \"settings\": {\n                        \"image\": \"mcr.microsoft.com/iotedge/opc-publisher:latest\",\n                        \"createOptions\": \"{\\\"HostConfig\\\":{\\\"Binds\\\": [\\\"/tmp/host:/mount\\\"],\\\"PortBindings\\\":{\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"8081\\\"}]}},\\\"User\\\":\\\"root\\\",\\\"Cmd\\\":[\\\"--strict\\\",\\\"--pf=/mount/pn.json\\\",\\\"--pki=/mount/pki\\\",\\\"--cf\\\",\\\"--mm=PubSub\\\",\\\"--me=Json\\\",\\\"--cl=5\\\",\\\"--sl\\\",\\\"--aa\\\"]}\"\n                    }\n                },\n                \"opcplc\": {\n                    \"version\": \"1.0\",\n                    \"type\": \"docker\",\n                    \"status\": \"running\",\n                    \"restartPolicy\": \"always\",\n                    \"settings\": {\n                        \"image\": \"mcr.microsoft.com/iotedge/opc-plc:latest\",\n                        \"createOptions\": \"{\\\"HostConfig\\\":{\\\"Binds\\\": [\\\"/tmp/host:/mount\\\"]},\\\"User\\\":\\\"root\\\",\\\"Cmd\\\":[\\\"--sph=True\\\",\\\"--spf=/mount/plc.json\\\",\\\"--vf1k=0\\\",\\\"--vfbs=0\\\",\\\"--gn=0\\\",\\\"--nd=True\\\",\\\"--np=True\\\",\\\"--nn=True\\\",\\\"--pn=50000\\\",\\\"--alm=True\\\",\\\"--ses=True\\\",\\\"--sn=10\\\",\\\"--fn=10\\\",\\\"--aa=True\\\"]}\"\n                    }\n                }\n            }\n        }\n    },\n    \"$edgeHub\": {\n        \"properties.desired\": {\n            \"schemaVersion\": \"1.1\",\n            \"routes\": {\n                \"publisherToUpstream\": \"FROM /messages/modules/publisher/* INTO $upstream\"\n            },\n            \"storeAndForwardConfiguration\": {\n                \"timeToLiveSecs\": 7200\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "deploy/iotedge/eflow-setup.ps1",
    "content": "<#\n   .SYNOPSIS\n      Setup Eflow IoT edge (must run as admin)\n   .DESCRIPTION\n      Setup Eflow IoT edge on the device. This script will install the\n      Azure IoT Edge runtime and deploy the Eflow IoT edge modules\n      specified in the eflow-setup.json manifest.\n   .NOTES\n      DO NOT USE FOR PRODUCTION SYSTEMS. This script is intended for\n      development and testing purposes only.\n\n   .PARAMETER IotHubName\n      The IoT Hub name.\n   .PARAMETER TenantId\n      The tenant id to use when logging into Azure.\n   .PARAMETER SubscriptionId\n      The subscription id to scope all activity to.\n   .PARAMETER SharedFolderPath\n      The shared folder path on the host system to mount into the guest.\n   .PARAMETER ProvisioningOnly\n      Only provision an existing eflow vm to an Azure IoT Hub.\n   .PARAMETER DebuggingSupport\n      Enable debugging support in eflow.\n   .PARAMETER NoModules\n      Do not deploy any modules.\n   .PARAMETER NoCleanup\n      Perform no cleanup after successfuly run.\n#>\n\nparam(\n   [string] $IotHubName,\n   [string] $TenantId,\n   [string] $SubscriptionId,\n   [string] $SharedFolderPath,\n   [switch] $ProvisioningOnly,\n   [switch] $DebuggingSupport,\n   [ValidateSet(\"Debug\", \"Release\")]\n   [string] $Configuration = \"Debug\",\n   [switch] $NoModules,\n   [switch] $NoCleanup\n)\n\n#Requires -RunAsAdministrator\n\n$eflowMsiUri = \"https://aka.ms/AzEFLOWMSI_1_4_LTS_X64\"\n\n$ErrorActionPreference = \"Stop\"\n$path = Split-Path $script:MyInvocation.MyCommand.Path\n\nif ([string]::IsNullOrWhiteSpace($TenantId)) {\n   $TenantId = $env:AZURE_TENANT_ID\n}\n\n$setupPath = Join-Path $path \"eflow-setup\"\nif (!(Test-Path $setupPath)) {\n   New-Item -ItemType Directory -Path $setupPath | Out-Null\n}\n\n# Set-ExecutionPolicy -ExecutionPolicy AllSigned -Force\nStart-Transcript -path $(join-path $setupPath \"eflow-setup.log\") -Append\n\nUpdate-AzConfig -DisplayBreakingChangeWarning $false | Out-Null\nif (![string]::IsNullOrWhiteSpace($SubscriptionId)) {\n   Update-AzConfig -DefaultSubscriptionForLogin $SubscriptionId\n}\n$azargs = @{}\nif (![string]::IsNullOrWhiteSpace($TenantId)) {\n   $azargs.Add(\"-Tenant\", $TenantId)\n}\nConnect-AzAccount @azargs\n\n# Find iot hub\nif ([string]::IsNullOrWhiteSpace($IotHubName)) {\n   Write-Host \"Please choose an Azure Iot Hub from the list (using its index):\"\n   $script:index = 0\n   $hubs = Get-AzIoTHub\n   $hubs | Format-Table -AutoSize -Property `\n   @{Name = \"Index\"; Expression = { ($script:index++) } }, `\n   @{Name = \"Hub\"; Expression = { $_.Name } }`\n   | Out-Host\n   while ($true) {\n      $option = Read-Host \">\"\n      try {\n         if ([int]$option -ge 1 -and [int]$option -le $hubs.Count) {\n            break\n         }\n      }\n      catch {\n         Write-Host \"Invalid index '$($option)' provided.\"\n      }\n      Write-Host \"Choose from the list using an index between 1 and $($hubs.Count).\"\n   }\n   $hub = $hubs[$option - 1]\n}\nelse {\n   $hub = Get-AzIoTHub | Where-Object Name -eq $IotHubName\n   if (!$hub) {\n      throw \"IoT Hub $IotHubName not found.\"\n   }\n}\n\nif (!$ProvisioningOnly.IsPresent) {\n   Write-Host \"(Re-) Installing Azure IoT Edge eflow...\"\n   [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n   Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force | Out-Null\n   Install-Module Subnet -Force | Out-Null\n\n   $msiPath = Join-Path $setupPath \"AzureIoTEdge.msi\"\n   if (!(Test-Path $msiPath)) {\n      Write-Host \"Downloading Azure IoT Edge eflow installer...\"\n      [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n      Invoke-WebRequest $eflowMsiUri -OutFile $msiPath\n   }\n\n   # uninstall existing IoT Edge runtime if needed\n   Start-Process -Wait msiexec -ArgumentList \"/x\", \"$msiPath\", \"/qn\" `\n      -ErrorAction SilentlyContinue | Out-Null\n\n   Write-Host \"Run Azure IoT Edge eflow installer.\"\n   Start-Process -Wait msiexec -ArgumentList \"/i\", \"$msiPath\", \"/qn\"\n\n   $mountPath = \"C:\\Shared\"\n   if (![string]::IsNullOrWhiteSpace($SharedFolderPath)) {\n      $mountPath = $SharedFolderPath\n   }\n   $fullPath = Join-Path $mountPath \"EFLOW-Shared\"\n   if (!(Test-Path $fullPath)) {\n      New-Item -ItemType Directory -Path $fullPath | Out-Null\n   }\n   $sharedFolderConfig = @(\n      @{\n         sharedFolderRoot = $mountPath\n         sharedFolders    = @(\n            @{\n               hostFolderPath      = \"EFLOW-Shared\"\n               readOnly            = $false\n               targetFolderOnGuest = \"/tmp/host\"\n            }\n         )\n      }\n   )\n\n   $sharedFoldersJsonPath = Join-Path $setupPath \"SharedFolders.json\"\n   $sharedFolderConfig | ConvertTo-Json `\n      | Set-Content -Path $sharedFoldersJsonPath -Force -Encoding UTF8\n\n   Write-Host \"Deploy Azure IoT Edge eflow with r/w folder $fullPath as /mount...\"\n   Deploy-Eflow -acceptEula Yes -acceptOptionalTelemetry Yes `\n      -cpuCount 2 -memoryInMB 4096 -vmLogSize Large `\n      -sharedFoldersJsonPath $sharedFoldersJsonPath\n   if ($LASTEXITCODE -ne 0) {\n      throw \"Failed to deploy eflow.\"\n   }\n\n   Write-Host \"Successfully installed and deployed eflow.\"\n   Get-EflowNetwork | ConvertTo-Json\n   Get-EflowVmAddr | ConvertTo-Json\n   Get-EflowVmEndpoint | ConvertTo-Json\n\n   #Get-EflowNetworkInterface\n   #Get-EflowHostConfiguration\n   #Get-EflowVmTelemetryOption\n   #Get-EflowVmUserName\n   #Get-EflowVmFeature\n   #Get-EflowVmSharedFolder\n   #Get-EflowVmTpmProvisioningInfo\n   #Connect-EflowVm Connect to eflow vm\n}\n\nWrite-Host \"Provisioning eflow vm...\"\n$ok = Verify-EflowVm\nif (!$ok) {\n   throw \"Eflow VM not created.\"\n}\n\n$vmName = Get-EflowVmName\nif (!$vmName) {\n   throw \"Failed to get eflow vm name.\"\n}\n\nWrite-Host \"Creating new IoT Edge device $vmName in $($hub.Name)...\"\n$device = $hub | Get-AzIotHubDevice -DeviceId $vmName\nif (!$device.EdgeEnabled) {\n   $hub | Remove-AzIotHubDevice -DeviceId $vmName\n   $device = $null\n}\nif (!$device) {\n   $device = $hub | Add-AzIotHubDevice -DeviceId $vmName `\n      -AuthMethod shared_private_key -Status Enabled -EdgeEnabled\n}\n$devConnString = $hub | Get-AzIotHubDeviceConnectionString -DeviceId $device.Id\nif (!$devConnString) {\n   throw \"Failed to get device connection string for $vmName.\"\n}\nif ([string]::IsNullOrWhiteSpace($devConnString.ConnectionString)) {\n   throw \"Device connection string for $vmName was empty.\"\n}\n\nWrite-Host \"Provision Azure IoT Edge Eflow VM $vmName...\"\n# ensure started\nStart-EflowVm\n\nif ($DebuggingSupport.IsPresent) {\n   Write-Host \"Configuring debugging support in eflow...\"\n   Set-EflowVmFeature -feature Defender -enable:$False\n\n   $ds = \"/etc/systemd/system/docker.service\"\n   # Configure the EFLOW virtual machine Docker engine to accept external\n   # connections, and add the appropriate firewall rules.\n   Invoke-EflowVmCommand `\n      \"sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT\"\n   # Create a copy of the EFLOW VM _docker.service_ in the system folder.\n   Invoke-EflowVmCommand `\n      \"sudo cp /lib/systemd/system/docker.service $ds\"\n   # Replace the service execution line to listen for external connections.\n   Invoke-EflowVmCommand `\n      \"sudo sed -i 's/-H fd:\\/\\// -H fd:\\/\\/ -H tcp:\\/\\/0.0.0.0:2375/g'  $ds\"\n   # Reload the EFLOW VM services configurations.\n   Invoke-EflowVmCommand `\n      \"sudo systemctl daemon-reload\"\n   # Reload the Docker engine service.\n   Invoke-EflowVmCommand `\n      \"sudo systemctl restart docker.service\"\n   # Check that the Docker engine is listening to external connections.\n   Invoke-EflowVmCommand `\n      \"sudo netstat -lntp | grep dockerd\"\n\n   $vmIp = Get-EflowVmAddr\n\n   if (!$NoModules.IsPresent) {\n      $containerRegistry = \"$($hub.Name)acr\" -replace '[^a-zA-Z0-9]'\n      $registry = Get-AzContainerRegistry -Name $containerRegistry `\n         -ResourceGroupName $hub.Resourcegroup -ErrorAction SilentlyContinue\n      if (!$registry) {\n         Write-Host \"Creating ACR $($containerRegistry) in $($hub.Location) ...\"\n         $registry = New-AzContainerRegistry -Name $containerRegistry `\n            -ResourceGroupName $hub.Resourcegroup -Location $hub.Location `\n            -EnableAdminUser -Sku Standard\n      }\n      Write-Host \"Getting credentials from ACR $($containerRegistry) ...\"\n      $registrySecret = Get-AzContainerRegistryCredential -Name $containerRegistry `\n         -ResourceGroupName $hub.Resourcegroup\n\n      $containerRegistryUsername = $registrySecret.Username\n      $containerRegistryPassword = $registrySecret.Password\n      $containerRegistryServer = $registry.LoginServer\n\n      Connect-AzContainerRegistry -Name $containerRegistry\n\n      $proj = $path | Split-Path | Split-Path | `\n         Join-Path -ChildPath \"src\" | `\n         Join-Path -ChildPath \"Azure.IIoT.OpcUa.Publisher.Module\" | `\n         Join-Path -ChildPath \"src\" | `\n         Join-Path -ChildPath \"Azure.IIoT.OpcUa.Publisher.Module.csproj\"\n\n      Write-Host \"Building and pushing debug module to $containerRegistry...\"\n      dotnet publish $proj -c $Configuration --self-contained false `\n         /t:PublishContainer /p:ContainerImageTag=$($Configuration.ToLower()) `\n         /p:ContainerRegistry=$containerRegistryServer\n\n      $image = \"$containerRegistryServer/iotedge/opc-publisher:$($Configuration.ToLower())\"\n   }\n   Write-Host \"Use 'docker -H tcp://$($vmIp[1]):2375' to connect to docker.\"\n   Write-Host \"Follow instructions in https://aka.ms/iotedge-eflow-debugging.\"\n}\n\nProvision-EflowVm -provisioningType ManualConnectionString `\n   -devConnString $devConnString.ConnectionString\nif ($LASTEXITCODE -ne 0) {\n   throw \"Failed to provision eflow vm $vmName.\"\n}\nWrite-Host \"Azure IoT Edge Eflow VM $vmName provisioned.\"\n\n# work around for ConvertFrom-Json not supporting -AsHashtable in PS 5.1\nfunction ConvertPSObjectToHashtable {\n   param ([Parameter(ValueFromPipeline)] $InputObject)\n   if ($null -eq $InputObject) {\n      return $null\n   }\n   if ($InputObject -is [System.Collections.IEnumerable] `\n         -and $InputObject -isnot [string]) {\n      $collection = @( foreach ($object in $InputObject) {\n         ConvertPSObjectToHashtable $object\n      } )\n      Write-Output -NoEnumerate $collection\n   }\n   elseif ($InputObject -is [psobject]) {\n      $hash = @{}\n      foreach ($property in $InputObject.PSObject.Properties) {\n         $hash[$property.Name] = `\n         (ConvertPSObjectToHashtable $property.Value).PSObject.BaseObject\n      }\n      $hash\n   }\n   else {\n      $InputObject\n   }\n}\nif (!$NoModules.IsPresent) {\n   Write-Host \"Deploying modules...\"\n   $modulesContentFile = Join-Path $path \"eflow-setup.json\"\n   if (!(Test-Path $modulesContentFile)) {\n      throw \"Module content file $modulesContentFile not found.\"\n   }\n   $modulesContent = Get-Content -Raw -Path $modulesContentFile `\n   | ConvertFrom-Json | ConvertPSObjectToHashtable\n   if ($DebuggingSupport.IsPresent) {\n      # Update with our debug image\n      $desired = $modulesContent[\"`$edgeAgent\"][\"properties.desired\"]\n      $desired[\"modules\"][\"publisher\"][\"settings\"][\"image\"] = $image\n      $desired[\"runtime\"][\"settings\"][\"registryCredentials\"] = @{\n         $containerRegistry = @{\n            username = $containerRegistryUsername\n            password = $containerRegistryPassword\n            address = $containerRegistryServer\n         }\n      }\n      # $modulesContent | ConvertTo-Json -Depth 10\n   }\n   $hub | Set-AzIotHubEdgeModule -DeviceId $device.Id `\n      -ModulesContent $modulesContent | Out-Null\n}\n\nStart-Sleep -Seconds 10\n$vm = Get-EflowVm\nif (!$vm) {\n   throw \"Failed to get eflow vm.\"\n}\nWrite-Host \"\"\nWrite-Host \"Edge status:\"\nWrite-Host \"========================================================\"\nWrite-Host \"\"\n$vm.EdgeRuntimeStatus.SystemCtlStatus | ForEach-Object { $_ | Out-Host }\n$vm.EdgeRuntimeStatus.ModuleList | ForEach-Object { $_ | Out-Host }\nWrite-Host \"\"\nWrite-Host \"========================================================\"\nWrite-Host \"\"\nWrite-Host \"Azure IoT Edge eflow successfully installed!\"\n\nStop-Transcript\nif (!$NoCleanup.IsPresent) {\n   Write-Host \"Cleaning up...\"\n   Remove-Item -Path $setupPath -Force -Recurse -ErrorAction SilentlyContinue\n}\nelse {\n   Remove-Item -Path $(join-path $setupPath \"eflow-setup.log\") -Force `\n      -ErrorAction SilentlyContinue\n   Get-EflowLogs -zipName $(Join-Path $setupPath \"eflow-logs.zip\")\n}\n\n"
  },
  {
    "path": "deploy/iotedge/readme.md",
    "content": "# IoT Edge deployment scripts <!-- omit in toc -->\n\n> DO NOT USE FOR PRODUCTION SYSTEMS. The scripts here are intended for development and testing purposes only.\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Deploy IoT Edge simulation to Azure](#deploy-iot-edge-simulation-to-azure)\n- [Azure IoT Edge EFLOW](#azure-iot-edge-eflow)\n  - [Deploying a debug OPC Publisher](#deploying-a-debug-opc-publisher)\n- [IoTEdgeHubDev](#iotedgehubdev)\n- [Azure VM based IoT Edge](#azure-vm-based-iot-edge)\n\n## Deploy IoT Edge simulation to Azure\n\n[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FIndustrial-IoT%2Fmain%2Fdeploy%2Fiotedge%2Fazuredeploy.json)\n\n## Azure IoT Edge EFLOW\n\nTo simplify setting up a development IoT Edge *on Windows*, run the `eflow-setup.ps1` script in a powershell session with Administrator privileges.\n\nThe script was tested on Windows 11. It will install and configure [Azure IoT Edge EFLOW](https://learn.microsoft.com/azure/iot-edge/quickstart) against an existing IoT Hub. The IoT Hub name can be provided on the command line or selected.  Use the `-Tenant` and `-Subscription` parameters of the powershell script to narrow which IoT Hub is selected.\n\nThe script will also deploy an initial set up modules (OPC PLC and OPC Publisher) sharing a common shared volume. This setup is similar to the [docker-compose](../docker/), but not intended for production deployments.\n\n> Once the modules in `eflow-setup.json` are deployed the OPC Publisher will start to produce data that is uploaded to IoT Hub. This data can be significant and will accrue charges.\n\nMake sure to stop the VM when you do not need it anymore (Run `powershell Stop-EflowVm` - Administrator privileges needed).  If you want to deploy a naked IOT Edge, re-provision the IoT Edge with the `-NoModules` switch.\n\nBy default the shared folder is persisted on the Host OS in the `C:\\Shared` folder. If you like to choose a different folder, supply the full path using the `-SharedFolderPath` script parameter.\n\n> The module PKI is persisted into the shared folder path. It contains keys which are secrets, make sure to guard access to the folder and properly delete the content when you are done with your development tasks.\n\nThe script also provides an option to `-ProvisioningOnly` an existing EFLOW installation against a different IOT Hub. The device ID will always be the name of the VM, which should be set as `%HOSTNAME%_EFLOW`. You can find and manage this device in the portal or via AZ CLI.  If the IoT Edge VM has been provisioned before, the script will prompt to confirm whether to re-provision the VM.\n\n### Deploying a debug OPC Publisher\n\nThe script can also set up the Azure IoT Edge EFLOW device to support [debugging](https://aka.ms/iotedge-eflow-debugging). Use the `-DebuggingSupport` parameter to do so.\n\nThe script will print the docker command line that can be used from the host to access the docker daemon on the guest. Furthermore, if `-NoModules` is not set the script will build a debug container image of OPC Publisher from the current branch and deploy it into the IoT Edge instance instead of deploying the `latest` released container of OPC Publisher. The debug image can then be debugged using the previously mentioned instructions.\n\n## IoTEdgeHubDev\n\nIn addition the folder contains a script to run OPC Publisher and OPC PLC in `IoTEdgeHubDev` tool. The script does not install, and only configures the `IoTEdgeHubDev` tool.  Also, volume mapping support on Windows is only provided in version 0.14.3 or higher. For this reason the deployed manifest has file mapping turned off.\n\n> Note: The IoTEdgeHubDev tool is in maintenance mode and is not supported anymore. It is recommended to use the earlier mechanism to create a simulation IoT Edge.\n\n## Azure VM based IoT Edge\n\nIf you are looking to setup a Azure IoT Edge VM in Azure (Windows or Linux), take a look at the deployment scripts [here](../scripts/).\n"
  },
  {
    "path": "deploy/kubernetes/cluster-setup.ps1",
    "content": "\n<#\n    .SYNOPSIS\n        Setup local AIO cluster and connect to Arc (must run as admin)\n    .DESCRIPTION\n        Setup local AIO cluster and connect to Arc. This script installs\n        the cluster type chosen and all other required dependencies and\n        connect it to the cloud via Arc. Then it will install AIO on it.\n    .NOTES\n        DO NOT USE FOR PRODUCTION SYSTEMS. This script is intended for\n        development and testing purposes only.\n\n    .PARAMETER Name\n        The name of the cluster\n    .PARAMETER OpsInstanceName\n        The name of the instance to create. Default is the same as the\n        cluster name.\n    .PARAMETER ClusterNamespace\n        The namespace to create the instance in.\n        Default is azure-iot-operations.\n    .PARAMETER ResourceGroup\n        The resource group to create or use for the cluster.\n        Default is the same as the cluster name.\n    .PARAMETER SharedFolderPath\n        The shared folder path on the host system to mount into the guest.\n    .PARAMETER TenantId\n        The tenant id to use when logging into Azure.\n    .PARAMETER SubscriptionId\n        The subscription id to scope all activity to.\n    .PARAMETER Location\n        The location of the cluster.\n    .PARAMETER ClusterType\n        The type of cluster to create. Default is microk8s.\n    .PARAMETER Connector\n        Whether to deploy the OPC Publisher as connector. Official\n        installs the official connector build, Local builds and deploys\n        a local version. Debug the debug version. Default is Official.\n    .PARAMETER OpsVersion\n        The version of Azure IoT Operations to use.\n        Default is the latest stable release.\n    .PARAMETER OpsTrain\n        The train to use if an OpsVersion is chosen.\n        Default is integration.\n    .PARAMETER Force\n        Force reinstall.\n    .PARAMETER OpsExtension\n        (Internal) Use a preview version of the Azure IoT Operations\n        extension to use.\n    .PARAMETER DeployPlcSimulation\n        Whether to deploy the PLC simulation. Default is false.\n    .PARAMETER DeployTestSimulation\n        Whether to deploy the Test simulation. Default is false.\n#>\n\nparam(\n    [string] [Parameter(Mandatory = $true)] $Name,\n    [string] $OpsInstanceName,\n    [string] $SharedFolderPath,\n    [string] $ResourceGroup,\n    [string] $TenantId,\n    [string] $SubscriptionId,\n    [string] $Location,\n    [string] [ValidateSet(\n        \"kind\",\n        \"minikube\",\n        \"k3d\",\n        \"microk8s\"\n    )] $ClusterType = \"microk8s\",\n    [string] $ClusterNamespace,\n    [string] [ValidateSet(\n        \"None\",\n        \"Official\",\n        \"Local\",\n        \"Debug\"\n    )] $Connector = \"Official\",\n    [string] $OpsVersion = $null,\n    [string] [ValidateSet(\n        \"integration\",\n        \"stable\",\n        \"dev\"\n    )] $OpsTrain = \"integration\",\n    [switch] $Force,\n    [string] [ValidateSet(\n        \"preview\",\n        \"installed\",\n        \"stable\"\n    )] $OpsExtension = \"stable\",\n    [switch] $DeployPlcSimulation,\n    [switch] $DeployTestSimulation,\n    [switch] $EnableNetworkDiscovery\n)\n\n#Requires -RunAsAdministrator\n$ErrorActionPreference = 'Continue'\n\nif (![Environment]::Is64BitProcess) {\n    Write-Host \"Error: Run this in 64bit Powershell session\" -ForegroundColor Red\n    exit -1\n}\n\n$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Path\nImport-Module $(Join-Path $(Join-Path $scriptDirectory \"common\") \"cluster-utils.psm1\") -Force\n\n#\n# Dump command line arguments\n#\n$forceReinstall = $script:Force.IsPresent\nif ($forceReinstall) {\n    Write-Host \"Force reinstall...\" -ForegroundColor Yellow\n}\nif ([string]::IsNullOrWhiteSpace($script:ResourceGroup)) {\n    $script:ResourceGroup = $script:Name\n}\nWrite-Host \"Using resource group $($script:ResourceGroup)...\" -ForegroundColor Cyan\nif ([string]::IsNullOrWhiteSpace($script:TenantId)) {\n    $script:TenantId = $env:AZURE_TENANT_ID\n}\nif (![string]::IsNullOrWhiteSpace($script:TenantId)) {\n    Write-Host \"Using tenant $($script:TenantId)...\" -ForegroundColor Cyan\n}\nif ([string]::IsNullOrWhiteSpace($script:Location)) {\n    $script:Location = \"westus\"\n}\nWrite-Host \"Using location $($script:Location)...\" -ForegroundColor Cyan\nif ([string]::IsNullOrWhiteSpace($script:OpsInstanceName)) {\n    $script:OpsInstanceName = $script:Name\n}\nWrite-Host \"Using instance name $($script:OpsInstanceName)...\" -ForegroundColor Cyan\nif ([string]::IsNullOrWhiteSpace($script:ClusterNamespace)) {\n    $script:ClusterNamespace = \"azure-iot-operations\"\n}\nelse {\n    Write-Host \"   ... with cluster namespace $($script:ClusterNamespace)...\" `\n        -ForegroundColor Cyan\n}\nif (![string]::IsNullOrEmpty($script:OpsVersion)) {\n    Write-Host \"   ... and version $($script:OpsVersion) ($($script:OpsTrain))...\" `\n        -ForegroundColor Cyan\n}\n$mountPath = \"C:\\Shared\"\nif (![string]::IsNullOrWhiteSpace($script:SharedFolderPath)) {\n    $mountPath = $script:SharedFolderPath\n}\n#Write-Host \"Using shared folder path $mountPath...\" -ForegroundColor Cyan\n[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n\n# Install az cli if not installed or version is too old\n$installAz = $false\ntry {\n    $azVersion = (az version)[1].Split(\":\")[1].Split('\"')[1]\n    if ($azVersion -lt \"2.74.0\" -or !$azVersion) {\n        $installAz = $true\n    }\n}\ncatch {\n    $installAz = $true\n}\nif ($installAz) {\n    Write-Host \"Installing Az CLI...\" -ForegroundColor Cyan\n\n    Set-ExecutionPolicy Bypass -Scope Process -Force\n    $ProgressPreference = 'SilentlyContinue'\n    Invoke-WebRequest -Uri https://aka.ms/installazurecliwindowsx64 -OutFile .\\AzureCLI.msi\n    Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'\n    Remove-Item .\\AzureCLI.msi\n}\nelse {\n    Write-Host \"Az CLI version $azVersion found.\" -ForegroundColor Green\n}\n\n#\n# Log into azure\n#\nWrite-Host \"Log into Azure...\" -ForegroundColor Cyan\n$loginParams = @( \"--only-show-errors\" )\nif (![string]::IsNullOrWhiteSpace($script:TenantId)) {\n    $loginParams += @(\"--tenant\", $script:TenantId)\n}\n$session = (az login @loginParams) | ConvertFrom-Json\nif (-not $session) {\n    Write-Host \"Error: Login failed.\" -ForegroundColor Red\n    exit -1\n}\nif ([string]::IsNullOrWhiteSpace($SubscriptionId)) {\n    $script:SubscriptionId = $session[0].id\n}\nif ([string]::IsNullOrWhiteSpace($TenantId)) {\n    $script:TenantId = $session[0].tenantId\n}\n\nWrite-Host \"Ensuring all required dependencies are installed...\" -ForegroundColor Cyan\n\nif ($script:ClusterType -ne \"none\" `\n    -and $script:ClusterType -ne \"microk8s\" `\n    -and $script:Connector -ne \"None\") {\n    # check if docker is installed\n    $errOut = $($docker = & { docker version --format json | ConvertFrom-Json }) 2>&1\n    if (-not $? -or !$docker.Server) {\n        $docker | Out-Host\n        Write-Host \"Docker not installed or running : $errOut\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Found $($docker.Server.Platform.Name)...\" -ForegroundColor Green\n}\n\n# Install required az extensions\naz config set extension.dynamic_install_allow_preview=true --only-show-errors 2>&1 `\n    | Out-Null\n$ensureLatest = \"false\"\n$extensions = @( \"connectedk8s\", \"k8s-configuration\" )\nif ($script:OpsExtension -eq \"stable\"){\n    $ensureLatest = \"true\"\n    $extensions += \"azure-iot-ops\"\n}\nelseif ($script:OpsExtension -eq \"preview\") {\n    $query = \"[?!contains(name, '255')].{ Name:name, Date:properties.creationTime }\"\n    $iotOpsWhl = $($(az storage blob list `\n        --container-name drop --account-name azedgecli --auth-mode login `\n        --query \"max_by($query, &Date)\" `\n        --output json) | ConvertFrom-Json).Name\n    if ((-not $?) -or (-not $iotOpsWhl)) {\n        Write-Host \"Error: No preview extension found.\" -ForegroundColor Red\n        exit -1\n    }\n    else {\n        $extensionVersion = $iotOpsWhl `\n            -replace \"azext_iot_ops-\", \"\" -replace \"-py3-none-any.whl\", \"\"\n        # Create a temp folder\n        $temp = New-Item -ItemType Directory -Path ([System.IO.Path]::GetTempPath()) `\n            -Name ([System.Guid]::NewGuid().ToString()) `\n            | Select-Object -ExpandProperty FullName\n        $ext = \"$($temp)/$($iotOpsWhl)\"\n        $errOut = $($stdOut = & { az storage blob download `\n            --auth-mode login `\n            --container-name drop `\n            --account-name azedgecli `\n            --name $iotOpsWhl `\n            --file $ext }) 2>&1\n        if ($?) {\n            $errOut = $($stdOut = & { az extension add --allow-preview true `\n                --upgrade --yes --source $ext }) 2>&1\n        }\n        if (-not $?) {\n            Write-Host \"Error installing iot ops extension $($extensionVersion) - $($errOut).\" `\n                -ForegroundColor Red\n            exit -1\n        }\n        Write-Host \"Using iot ops extension version $($extensionVersion)...\" `\n            -ForegroundColor Cyan\n    }\n}\nforeach ($p in $extensions) {\n    $errOut = $($stdOut = & { az extension add `\n        --upgrade `\n        --name $p `\n        --allow-preview true }) 2>&1\n    if (-not $?) {\n        $stdOut | Out-Host\n        Write-Host \"Error installing az extension $p : $errOut\" -ForegroundColor Red\n        exit -1\n    }\n}\nif (![string]::IsNullOrWhiteSpace($SubscriptionId)) {\n    az account set --subscription $SubscriptionId 2>&1 | Out-Null\n}\n\n# Install chocolatey\n$errOut = $($chocolateyVersion = & { choco --version }) 2>&1\nif (!$chocolateyVersion -or $errOut) {\n    Write-Host \"Installing Chocolatey CLI...\" -ForegroundColor Cyan\n    [System.Net.ServicePointManager]::SecurityProtocol = `\n        [System.Net.ServicePointManager]::SecurityProtocol -bor 3072\n    $scriptLoc = 'https://community.chocolatey.org/install.ps1'\n    Invoke-Expression ((New-Object System.Net.WebClient).DownloadString($scriptLoc))\n}\n\n# Install or upgrade kind, helm and kubectl, k9s and headlamp\n$packages =\n@(\n    \"kubernetes-cli\",\n    \"kubernetes-helm\",\n    \"headlamp\",\n    \"k9s\"\n)\nif ($script:ClusterType -ne \"none\" -and $script:ClusterType -ne \"microk8s\") {\n    $packages += $script:ClusterType\n}\nforeach ($p in $packages) {\n    $errOut = $($stdOut = & { choco install $p --yes }) 2>&1\n    if (-not $?) {\n        $stdOut | Out-Host\n        Write-Host \"Error during chocolatey install of $p : $errOut\" -ForegroundColor Red\n        exit -1\n    }\n    $errOut = $($stdOut = & { choco upgrade $p --yes }) 2>&1\n    if (-not $?) {\n        $stdOut | Out-Host\n        Write-Host \"Error during chocolatey upgrade of $p : $errOut\" -ForegroundColor Red\n        exit -1\n    }\n}\n\n#\n# Create the cluster\n#\nif ($script:ClusterType -eq \"none\") {\n    Write-Host \"Skipping cluster creation...\" -ForegroundColor Green\n}\nelseif ($script:ClusterType -eq \"microk8s\") {\n    # ensure multipass is running\n    Start-Service -Name \"Multipass\" -ErrorAction SilentlyContinue | Out-Null\n    $errOut = $($stdOut = & { microk8s status }) 2>&1\n    if (-not $?) {\n        Write-Host \"Error querying microk8s status - $($errOut)\" -ForegroundColor Red\n        exit -1\n    }\n    if (!$forceReinstall -and $stdOut -match \"microk8s is running\") {\n        Write-Host \"Microk8s cluster is running...\" -ForegroundColor Green\n    }\n    else {\n        Write-Host \"Resetting microk8s cluster...\" -ForegroundColor Cyan\n        microk8s uninstall\n        microk8s install --cpu 4 --mem 12\n        microk8s start\n        if (-not $?) {\n            Write-Host \"Error starting microk8s cluster - $($errOut)\" -ForegroundColor Red\n            exit -1\n        }\n        Write-Host \"Microk8s cluster started.\" -ForegroundColor Green\n    }\n    $features =\n    @(\n        \"dns\",\n        \"hostpath-storage\",\n        \"ingress\"\n    )\n    foreach ($f in $features) {\n        $errOut = $($stdOut = & { microk8s enable $f }) 2>&1\n        if (-not $?) {\n            $stdOut | Out-Host\n            Write-Host \"Error enabling microk8s feature $f : $errOut\" `\n                -ForegroundColor Red\n            exit -1\n        }\n    }\n    $(microk8s config) | Out-File $env:USERPROFILE/.kube/config -Encoding utf8 -Force\n}\nelseif ($script:ClusterType -eq \"k3d\") {\n    $errOut = $($table = & { k3d cluster list --no-headers } -split \"`n\") 2>&1\n    if (-not $?) {\n        Write-Host \"Error querying k3d clusters - $($errOut)\" -ForegroundColor Red\n        exit -1\n    }\n    $clusters = $table | ForEach-Object { $($_ -split \" \")[0].Trim() }\n    if (($clusters -contains $script:Name) -and (!$forceReinstall)) {\n        Write-Host \"Cluster $script:Name exists...\" -ForegroundColor Green\n    }\n    else {\n        foreach ($cluster in $clusters) {\n            if (!$forceReinstall) {\n                if ($(Read-Host \"Delete existing cluster $cluster? [Y/N]\") -ne \"Y\") {\n                    continue\n                }\n            }\n            Write-Host \"Deleting existing cluster $cluster...\" -ForegroundColor Yellow\n            k3d cluster delete $cluster 2>&1 | Out-Null\n        }\n        Write-Host \"Creating k3d cluster $script:Name...\" -ForegroundColor Cyan\n\n        $fullPath1 = Join-Path $mountPath \"system\"\n        if (!(Test-Path $fullPath1)) {\n            New-Item -ItemType Directory -Path $fullPath1 | Out-Null\n        }\n        $volumeMapping1 = \"$($fullPath1):/var/lib/rancher/k3s/storage@all\"\n        $fullPath2 = Join-Path $mountPath \"user\"\n        if (!(Test-Path $fullPath2)) {\n            New-Item -ItemType Directory -Path $fullPath2 | Out-Null\n        }\n        $volumeMapping2 = \"$($fullPath2):/storage/user@all\"\n        $env:K3D_FIX_MOUNTS = 1\n        k3d cluster create $script:Name `\n            --agents 3 `\n            --servers 1 `\n            --volume $volumeMapping1 `\n            --volume $volumeMapping2 `\n            --env K3D_FIX_MOUNTS=1@all `\n            --wait\n        if (-not $?) {\n            Write-Host \"Error creating k3d cluster - $($errOut)\" -ForegroundColor Red\n            exit -1\n        }\n        Write-Host \"Cluster created...\" -ForegroundColor Green\n    }\n}\nelseif ($script:ClusterType -eq \"minikube\") {\n    $errOut = $($clusters = & { minikube profile list -o json } | ConvertFrom-Json) 2>&1\n    if (($clusters.valid.Name -contains $script:Name) -and (!$forceReinstall)) {\n        Write-Host \"Valid minikube cluster $script:Name exists...\" -ForegroundColor Green\n        # Start the cluster\n        if ($stat.Host -Contains \"Stopped\" -or\n            $stat.APIServer -Contains \"Stopped\" -or\n            $stat.Kubelet -Contains \"Stopped\") {\n            Write-Host \"Minikube cluster $script:Name stopped. Starting...\" -ForegroundColor Cyan\n            minikube start -p $script:Name\n            if (-not $?) {\n                Write-Host \"Error starting minikube cluster.\" -ForegroundColor Red\n                minikube logs --file=$($script:Name).log\n                exit -1\n            }\n            Write-Host \"Minikube cluster $script:Name started.\" -ForegroundColor Green\n        }\n        else {\n            Write-Host \"Minikube cluster $script:Name running.\" -ForegroundColor Green\n        }\n    }\n    elseif (-not $?) {\n        Write-Host \"Error querying minikube clusters - $($errOut)\" -ForegroundColor Red\n        exit -1\n    }\n    else {\n        if ($forceReinstall) {\n            Write-Host \"Deleting other clusters...\" -ForegroundColor Yellow\n            minikube delete --all --purge\n        }\n        elseif ($clusters.invalid.Name -contains $script:Name) {\n            Write-Host \"Delete bad minikube cluster $script:Name...\" -ForegroundColor Yellow\n            minikube delete -p $script:Name\n        }\n        Write-Host \"Creating new minikube cluster $script:Name...\" -ForegroundColor Cyan\n\n        if (Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All) {\n            Write-Host \"Hyper-V is enabled...\" -ForegroundColor Green\n        }\n        else {\n            Write-Host \"Enabling Hyper-V...\" -ForegroundColor Cyan\n            $hv = Enable-WindowsOptionalFeature -Online `\n                -FeatureName Microsoft-Hyper-V-All\n            if ($hv.RestartNeeded) {\n                Write-Host \"Restarting...\" -ForegroundColor Yellow\n                Restart-Computer -Force\n            }\n        }\n\n        if (Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Management-PowerShell) {\n            Write-Host \"Hyper-V commands installed...\" -ForegroundColor Green\n        }\n        else {\n            $hv = Enable-WindowsOptionalFeature -Online `\n                -FeatureName Microsoft-Hyper-V-Management-PowerShell\n            if ($hv.RestartNeeded) {\n                Write-Host \"Restarting...\" -ForegroundColor Yellow\n                Restart-Computer -Force\n            }\n        }\n        Start-Sleep -Seconds 5\n        & { minikube start -p $script:Name --cpus=4 --memory=8192 --nodes=4 --driver=hyperv }\n        if (-not $?) {\n            Write-Host \"Error creating minikube cluster - $($errOut)\" -ForegroundColor Red\n            minikube logs --file=$($script:Name).log\n            exit -1\n        }\n        Write-Host \"Cluster created...\" -ForegroundColor Green\n    }\n}\nelseif ($script:ClusterType -eq \"kind\") {\n    $errOut = $($clusters = & { kind get clusters } -split \"`n\") 2>&1\n    if (($clusters -contains $script:Name) -and (!$forceReinstall)) {\n        Write-Host \"Cluster $script:Name exists...\" -ForegroundColor Green\n    }\n    elseif (-not $?) {\n        Write-Host \"Error querying kind clusters - $($errOut)\" -ForegroundColor Red\n        exit -1\n    }\n    else {\n        foreach ($cluster in $clusters) {\n            if (!$forceReinstall) {\n                if ($(Read-Host \"Delete existing cluster $cluster? [Y/N]\") -ne \"Y\") {\n                    continue\n                }\n            }\n            Write-Host \"Deleting existing cluster $cluster...\" -ForegroundColor Yellow\n            kind delete cluster --name $cluster 2>&1 | Out-Null\n        }\n        Write-Host \"Creating kind cluster $script:Name...\" -ForegroundColor Cyan\n\n        $clusterConfig = @\"\nkind: Cluster\napiVersion: kind.x-k8s.io/v1alpha4\nnodes:\n- role: control-plane\n  extraPortMappings:\n  - containerPort: 80\n    hostPort: 80\n    listenAddress: \"127.0.0.1\"\n- role: worker\n- role: worker\n- role: worker\n- role: worker\n- role: worker\n\"@\n        $clusterConfig -replace \"`r`n\", \"`n\" `\n        | kind create cluster --name $script:Name --config -\n        if (-not $?) {\n            Write-Host \"Error creating kind cluster - $($errOut)\" -ForegroundColor Red\n            exit -1\n        }\n        Write-Host \"Cluster created...\" -ForegroundColor Green\n    }\n}\nelse {\n    Write-Host \"Error: Unsupported cluster type $script:ClusterType\" -ForegroundColor Red\n    exit -1\n}\n\n$errOut = $($stdOut = & { kubectl get nodes }) 2>&1\nif (-not $?) {\n    $stdOut | Out-Host\n    Write-Host \"Cluster not reachable : $errOut\" -ForegroundColor Red\n    exit -1\n}\n$stdOut | Out-Host\n\nWrite-Host \"Registering the required resource providers...\" -ForegroundColor Cyan\n$resourceProviders =\n@(\n    \"Microsoft.ExtendedLocation\",\n    \"Microsoft.Kubernetes\",\n    \"Microsoft.KubernetesConfiguration\",\n    \"Microsoft.EventGrid\",\n    \"Microsoft.EventHub\",\n    \"Microsoft.KeyVault\",\n    \"Microsoft.Storage\",\n    \"Microsoft.IoTOperations\",\n    \"Microsoft.Kusto\"\n)\nforeach ($rp in $resourceProviders) {\n    $errOut = $($obj = & { az provider show -n $rp `\n                --subscription $SubscriptionId `\n                --only-show-errors --output json | ConvertFrom-Json }) 2>&1\n    if (-not $?) {\n        Write-Host \"Error querying provider $rp : $errOut\" -ForegroundColor Red\n        exit -1\n    }\n    if ($obj.registrationState -eq \"Registered\") {\n        continue\n    }\n    $errOut = $($retVal = & { az provider register -n `\n                $rp --subscription $SubscriptionId --wait }) 2>&1\n    if (-not $?) {\n        $retVal | Out-Host\n        Write-Host \"Error registering provider $rp : $errOut\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Resource provider $rp registered.\" -ForegroundColor Green\n}\n\n$errOut = $($rg = & { az group show `\n    --name $script:ResourceGroup `\n    --subscription $script:SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif ($rg -and $forceReinstall) {\n    Write-Host \"Deleting existing resource group $($rg.Name)...\" `\n        -ForegroundColor Yellow\n    az group delete --name $rg.Name --subscription $SubscriptionId `\n        --only-show-errors --yes\n    $rg = $null\n}\nif (!$rg) {\n    Write-Host \"Creating resource group $script:ResourceGroup...\" -ForegroundColor Cyan\n    $errOut = $($rg = & { az group create `\n        --name $script:ResourceGroup `\n        --location $script:Location `\n        --subscription $script:SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$rg) {\n        Write-Host \"Error creating resource group - $($errOut).\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Resource group $($rg.id) created.\" -ForegroundColor Green\n}\nelse {\n    Write-Host \"Resource group $($rg.id) exists.\" -ForegroundColor Green\n}\n\n#\n# Create Azure resources\n#\n\n# Managed identity\n$errOut = $($mi = & { az identity show `\n    --name $script:Name `\n    --resource-group $($rg.Name) `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$mi) {\n    Write-Host \"Creating managed identity $script:Name...\" -ForegroundColor Cyan\n    $errOut = $($mi = & { az identity create `\n        --name $script:Name `\n        --location $Location `\n        --resource-group $($rg.Name) `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$mi) {\n        Write-Host \"Error creating managed identity - $($errOut).\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Managed identity $($mi.id) created.\" -ForegroundColor Green\n}\nelse {\n    Write-Host \"Managed identity $($mi.id) exists.\" -ForegroundColor Green\n}\n\n# Storage account\n$storageAccountName = $script:Name.Replace(\"-\", \"\")\n$errOut = $($stg = & { az storage account show `\n    --name $storageAccountName `\n    --resource-group $($rg.Name) `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$stg) {\n    Write-Host \"Creating Storage account $storageAccountName\" -ForegroundColor Cyan\n    $errOut = $($stg = & { az storage account create `\n        --name $storageAccountName `\n        --location $Location `\n        --resource-group $($rg.Name) `\n        --allow-shared-key-access false `\n        --enable-hierarchical-namespace `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$stg) {\n        Write-Host \"Error creating storage $storageAccountName - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Storage account $($stg.id) created.\" -ForegroundColor Green\n}\nelse {\n    Write-Host \"Storage account $($stg.id) exists.\" -ForegroundColor Green\n}\n\n# Event Hub namespace\n$eventHubNamespace = $script:Name\n$errOut = $($ehNs = & { az eventhubs namespace show `\n    --name $eventHubNamespace `\n    --resource-group $($rg.Name) `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$ehNs) {\n    Write-Host \"Creating Event Hub Namespace $($eventHubNamespace)...\" -ForegroundColor Cyan\n    $errOut = $($ehNs = & { az eventhubs namespace create `\n        --name $eventHubNamespace `\n        --resource-group $rg.Name `\n        --location $Location `\n        --disable-local-auth true `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$ehNs) {\n        Write-Host \"Error creating Event Hub Namespace $($eventHubNamespace) - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Event Hub Namespace $($ehNs.id) created.\" -ForegroundColor Green\n}\nelse {\n    Write-Host \"Event Hub Namespace $($ehNs.id) exists.\" -ForegroundColor Green\n}\n\n# Keyvault\n$keyVaultName = $script:Name + \"kv\"\n$errOut = $($kv = & { az keyvault show `\n    --name $keyVaultName `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$kv) {\n    Write-Host \"Creating Key vault $keyVaultName\" -ForegroundColor Cyan\n    az keyvault purge --name $keyVaultName --location $Location `\n        --subscription $SubscriptionId 2>&1 | Out-Null\n    $errOut = $($kv = & { az keyvault create `\n        --enable-rbac-authorization true `\n        --name $keyVaultName `\n        --resource-group $($rg.Name) `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$kv) {\n        Write-Host \"Error creating Azure Keyvault - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    if ($kv.properties.enableSoftDelete) {\n        az keyvault update `\n            --name $keyVaultName `\n            --enable-soft-delete false `\n            --resource-group $($rg.Name) `\n            --subscription $SubscriptionId 2>&1 | Out-Null\n    }\n    Write-Host \"Key vault $($kv.id) created...\" -ForegroundColor Green\n}\nelse {\n    Write-Host \"Key vault $($kv.id) exists.\" -ForegroundColor Green\n}\n\n#\n# Assign roles to the managed identity\n#\n$roleAssignments =\n@(\n    @(\"Contributor\", $stg.id, $mi.principalId),\n    @(\"Storage Blob Data Owner\", $stg.id, $mi.principalId),\n    @(\"Contributor\", $ehNs.id, $mi.principalId),\n    @(\"Contributor\", $rg.id, $mi.principalId),\n    @(\"Key Vault Administrator\", $kv.id, $mi.principalId)\n)\nforeach ($ra in $roleAssignments) {\n    Write-Host \"Assigning $($ra[0]) role to $($ra[2])...\" -ForegroundColor Cyan\n    $errOut = $($obj = & { az role assignment create `\n        --role $ra[0] `\n        --assignee-object-id $ra[2] `\n        --assignee-principal-type ServicePrincipal `\n        --scope $ra[1] | ConvertFrom-Json }) 2>&1\n    if (-not $?) {\n        Write-Host \"Error assigning role $($ra[0]) to $($ra[2]) : $errOut\" `\n            -ForegroundColor Red\n        #exit -1\n    }\n    Write-Host \"Role $($ra[0]) assigned to $($ra[2]).\" -ForegroundColor Green\n}\n\n# Azure IoT Operations schema registry\n$srName = \"$($script:Name.ToLowerInvariant())sr\"\n$errOut = $($sr = & { az iot ops schema registry show `\n    --name $srName `\n    --resource-group $($rg.Name) `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$sr) {\n    Write-Host \"Creating Azure IoT Operations schema registry...\" -ForegroundColor Cyan\n    $errOut = $($sr = & { az iot ops schema registry create `\n        --name $srName `\n        --resource-group $($rg.Name) `\n        --registry-namespace $srName `\n        --location $Location `\n        --sa-resource-id $stg.id `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$sr) {\n        Write-Host \"Error creating Azure IoT Operations schema registry - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Azure IoT Operations schema registry $($sr.id) created.\" `\n        -ForegroundColor Green\n}\nelse {\n    Write-Host \"Azure IoT Operations schema registry $($sr.id) exists.\" `\n        -ForegroundColor Green\n}\n\n#\n# Connect the cluster to Arc\n#\n$errOut = $($cc = & { az connectedk8s show `\n    --name $script:Name `\n    --resource-group $($rg.Name) `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif ($cc -and !$forceReinstall -and $cc.properties.connectivityStatus -ne \"Offline\") {\n    Write-Host \"Cluster $($cc.name) already connected to Arc.\" -ForegroundColor Green\n}\nelse {\n    if ($cc) {\n        Write-Host \"Disconnecting existing Arc cluster $($cc.name)...\" `\n            -ForegroundColor Yellow\n        az connectedk8s delete --only-show-errors `\n            --name $cc.name `\n            --resource-group $($rg.Name) `\n            --subscription $SubscriptionId `\n            --yes 2>&1 | Out-Null\n        if (-not $?) {\n            Write-Host \"Error: disconnecting cluster $($cc.name) from Arc failed.\" `\n                -ForegroundColor Red\n            exit -1\n        }\n    }\n    Write-Host \"Connecting cluster to Arc in $($rg.Name)...\" -ForegroundColor Cyan\n    az connectedk8s connect --only-show-errors `\n        --name $script:Name `\n        --resource-group $($rg.Name) `\n        --subscription $SubscriptionId `\n        --correlation-id \"d009f5dd-dba8-4ac7-bac9-b54ef3a6671a\" 2>&1 | Out-Host\n    if (-not $?) {\n        Write-Host \"Error: connecting cluster $($script:Name) to Arc failed.\" -ForegroundColor Red\n        exit -1\n    }\n    $errOut = $($cc = & { az connectedk8s show `\n        --name $script:Name `\n        --resource-group $($rg.Name) `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    Write-Host \"Cluster $($cc.name) connected to Arc.\" -ForegroundColor Green\n}\n\n# enable custom location feature\n$errOut = $($objectId = & { az ad sp show `\n            --id bc313c14-388c-4e7d-a58e-70017303ee3b --query id -o tsv }) 2>&1\nWrite-Host \"Enabling custom location feature for cluster $script:Name...\" -ForegroundColor Cyan\naz connectedk8s enable-features `\n    --name $cc.name `\n    --resource-group $rg.Name `\n    --subscription $SubscriptionId `\n    --custom-locations-oid $objectId `\n    --features cluster-connect custom-locations `\n    --only-show-errors\nif (-not $?) {\n    Write-Host \"Error: Failed to enable custom location feature.\" -ForegroundColor Red\n    exit -1\n}\n\n# enable workload identity\nif ($cc.securityProfile.workloadIdentity.enabled -and $cc.oidcIssuerProfile.enabled){\n    Write-Host \"Workload identity already enabled for cluster $script:Name.\" -ForegroundColor Green\n}\nelse {\n    Write-Host \"Enabling workload identity for cluster $script:Name...\" -ForegroundColor Cyan\n    az connectedk8s update `\n        --name $cc.name `\n        --resource-group $rg.Name `\n        --subscription $SubscriptionId `\n        --auto-upgrade true `\n        --enable-oidc-issuer `\n        --enable-workload-identity `\n        --only-show-errors\n    if (-not $?) {\n        Write-Host \"Error: Failed to enable workload identity.\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Workload identity enabled for cluster $script:Name.\" -ForegroundColor Green\n}\n\n# Validate we have a connected cluster\nwhile ($true) {\n    $errOut = $($cc = & { az connectedk8s show `\n        --name $script:Name `\n        --resource-group $($rg.Name) `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if ($cc.properties.connectivityStatus -eq \"Connected\") {\n        Write-Host \"Cluster $($cc.name) connected to Arc.\" -ForegroundColor Green\n        break\n    }\n    Write-Host \"Waiting for cluster $($cc.name) to connect - $($cc.properties.connectivityStatus)...\" `\n        -ForegroundColor Yellow\n    Start-Sleep -Seconds 10\n}\n\n#\n# Create adr namespace\n#\n$adrNsResource = \"/subscriptions/$($SubscriptionId)\"\n$adrNsResource = \"$($adrNsResource)/resourceGroups/$($rg.Name)\"\n$adrNsResource = \"$($adrNsResource)/providers/Microsoft.DeviceRegistry/namespaces/$($script:Name)\"\n$errOut = $($ns = & { az rest --method get `\n    --url \"$($adrNsResource)?api-version=2025-10-01\" `\n    --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\nif (!$ns -or !$ns.id) {\n    $body = @{\n        location = $Location\n        identity = @{\n            type = \"SystemAssigned\"\n        }\n        properties = @{}\n    } | ConvertTo-Json -Depth 100\n    $tempFile = New-TemporaryFile\n    $body | Out-File -FilePath $tempFile -Encoding utf8 -Force\n    Write-Host \"Creating ADR namespace $adrNsResource...\" -ForegroundColor Cyan\n    $errOut = $($ns = & { az rest --method put `\n        --url \"$($adrNsResource)?api-version=2025-10-01\" `\n        --headers \"Content-Type=application/json\" `\n        --body @$tempFile } | ConvertFrom-Json) 2>&1\n    if (-not $?) {\n        Write-Host \"Error: Failed to create ADR namespace $($adrNsResource) - $($errOut).\" `\n            -ForegroundColor Red\n        Remove-Item $tempFile -Force\n        exit -1\n    }\n    Remove-Item $tempFile -Force\n    Write-Host \"ADR namespace $($ns.id) created.\" -ForegroundColor Green\n}\nelse {\n    Write-Host \"ADR namespace $($ns.id) exists.\" -ForegroundColor Green\n}\n\n#\n# Create Azure IoT Operations instance\n#\n$errOut = $($iotOps = & { az iot ops show `\n    --resource-group $rg.Name `\n    --name $script:OpsInstanceName `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif ($iotOps) {\n    # first check cluster extension is deployed on the cluster and if not reset the instance\n    $queryVersion = \"[?scope.cluster.releaseNamespace == '$($script:ClusterNamespace)'\"\n    $queryVersion = \"$($queryVersion) && extensionType == 'microsoft.iotoperations'\"\n    $queryVersion = \"$($queryVersion) ].{ version:currentVersion, train:releaseTrain }\"\n    $currentVersion = $(az k8s-extension list `\n        --cluster-name $script:Name --cluster-type connectedClusters `\n        --resource-group $rg.Name `\n        --query $queryVersion --output json) | ConvertFrom-Json\n    if (!$currentVersion) {\n        Write-Host \"No Azure IoT Operations extension found on cluster $script:Name. Resetting.\" `\n            - ForegroundColor Yellow\n        az iot ops delete --name $iotOps.name --cluster $script:Name --yes --only-show-errors `\n            --resource-group $rg.Name --subscription $SubscriptionId `\n        if (-not $?) {\n            Write-Host \"Error removing Azure IoT Operations instance from cluster $script:Name.\" `\n                -ForegroundColor Red\n            exit -1\n        }\n        Write-Host \"Azure IoT Operations instance removed from cluster $script:Name.\" `\n            -ForegroundColor Green\n        $iotOps = $null\n        $currentVersion = $null\n    }\n    else {\n        Write-Host \"Azure IoT Operations instance found with $($currentVersion.Version).\" `\n            -ForegroundColor Green\n    }\n}\nif (!$iotOps) {\n    Write-Host \"Initializing cluster $script:Name for deployment of Azure IoT operations...\" `\n        -ForegroundColor Cyan\n    $iotOpsInit = @(\n        \"init\", `\n        \"--cluster\", $script:Name, `\n        \"--resource-group\", $rg.Name, `\n        \"--subscription\", $SubscriptionId, `\n        \"--ensure-latest\", $ensureLatest, `\n        \"--only-show-errors\"\n    )\n    & az iot ops $iotOpsInit\n    if (-not $?) {\n        Write-Host \"Error initializing cluster $script:Name for Azure IoT Operations.\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Cluster ready for Azure IoT Operations deployment...\" `\n        -ForegroundColor Green\n    Write-Host \"Creating the Azure IoT Operations instance $($script:OpsInstanceName)...\" `\n        -ForegroundColor Cyan\n    $iotOpsCreate = @(\n        \"create\", `\n        \"--cluster\", $script:Name, `\n        \"--resource-group\", $rg.Name, `\n        \"--subscription\", $SubscriptionId, `\n        \"--cluster-namespace\", $script:ClusterNamespace, `\n        \"--name\", $script:OpsInstanceName, `\n        \"--location\", $Location, `\n        \"--sr-resource-id\", $sr.id, `\n        \"--ns-resource-id\", $ns.id, `\n        \"--add-insecure-listener\", \"true\", `\n        \"--only-show-errors\"\n    )\n    if ($script:OpsVersion) {\n        $iotOpsCreate += \"--ops-train\", $script:OpsTrain\n        $iotOpsCreate += \"--ops-version\", $script:OpsVersion\n    }\n    & az iot ops $iotOpsCreate\n    if (-not $?) {\n        & az iot ops $iotOpsCreate\n        if (-not $?) {\n            Write-Host \"Error creating Azure IoT Operations instance - $($errOut).\" `\n                -ForegroundColor Red\n            exit -1\n        }\n    }\n    Write-Host \"Enabling Azure IoT Operations resource sync...\" `\n        -ForegroundColor Cyan\n    $errOut = $(az iot ops rsync enable `\n        --resource-group $($rg.Name) `\n        --instance $script:OpsInstanceName `\n        --subscription $SubscriptionId `\n        --only-show-errors) 2>&1\n    if (-not $?) {\n        Write-Host \"Error enabling Azure IoT Operations resource sync - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Azure IoT Operations resource sync enabled.\" `\n        -ForegroundColor Green\n\n    $errOut = $($iotOps = & { az iot ops show `\n        --resource-group $($rg.Name) `\n        --name $script:OpsInstanceName `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $iotOps) {\n        Write-Host \"Error retrieving created Azure IoT Operations instance - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Azure IoT Operations instance $($iotOps.id) created.\" `\n        -ForegroundColor Green\n}\nelse {\n    # check if we need to upgrade the cluster extension\n    $upgrade = $true\n    if ($script:OpsVersion -and $currentVersion.Version -ge $script:OpsVersion) {\n        $upgrade = $false\n        if ($script:OpsTrain -and $script:OpsTrain -ne $currentVersion.Train) {\n            $upgrade = $true\n        }\n    }\n    if ($upgrade) {\n        Write-Host \"Upgrading Azure IoT Operations $($iotOps.id) $($currentVersion.Version)...\" `\n            -ForegroundColor Cyan\n        $iotOpsUpgrade = @(\n            \"upgrade\", `\n            \"--name\", $iotOps.name, `\n            \"--resource-group\", $rg.Name, `\n            \"--subscription\", $SubscriptionId, `\n            \"--only-show-errors\",\n            \"--yes\"\n        )\n        if ($script:OpsVersion) {\n            $iotOpsUpgrade += \"--ops-train\", $script:OpsTrain\n            $iotOpsUpgrade += \"--ops-version\", $script:OpsVersion\n        }\n        & az iot ops $iotOpsUpgrade\n        if (-not $?) {\n            Write-Host \"Error upgrading Azure IoT Operations instance - $($errOut).\" `\n                -ForegroundColor Red\n            exit -1\n        }\n        Write-Host \"Azure IoT Operations $($iotOps.id) upgraded ...\" `\n            -ForegroundColor Green\n    }\n    else {\n        Write-Host \"Azure IoT Operations $($iotOps.id) at version $($currentVersion.Version).\" `\n            -ForegroundColor Green\n    }\n}\n\n$errOut = $($mia = & { az iot ops identity show `\n    --name $iotOps.name `\n    --resource-group $($rg.Name) `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$mia -or $mia.type -ne \"UserAssigned\") {\n    Write-Host \"Assign managed identity $($mi.id) to instance $($iotOps.id)...\" `\n        -ForegroundColor Cyan\n    $errOut = $($mia = & { az iot ops identity assign `\n        --name $iotOps.name `\n        --resource-group $($rg.Name) `\n        --subscription $SubscriptionId `\n        --mi-user-assigned $mi.id `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$mia) {\n        Write-Host \"Error assigning managed identity to instance - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Managed identity $($mi.id) assigned to instance $($iotOps.id).\" `\n        -ForegroundColor Green\n}\nelse {\n    Write-Host \"Managed identity $($mi.id) already assigned to $($iotOps.id).\" `\n        -ForegroundColor Green\n}\n\n$errOut = $($ss = & { az iot ops secretsync list `\n    --instance $iotOps.name `\n    --resource-group $($rg.Name) `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$ss) {\n    Write-Host \"Enabling secret sync with $($kv.id) for instance $($iotOps.id)...\" `\n        -ForegroundColor Cyan\n    $errOut = $($ss = & { az iot ops secretsync enable `\n        --instance $iotOps.name `\n        --kv-resource-id $kv.id `\n        --resource-group $rg.Name `\n        --subscription $SubscriptionId `\n        --mi-user-assigned $mi.id `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$ss) {\n        Write-Host \"Error enabling secret sync for instance - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Secret sync with $($kv.id) enabled for $($iotOps.id).\" `\n        -ForegroundColor Green\n}\nelse {\n    Write-Host \"Secret sync with $($kv.id) already enabled in $($iotOps.id).\" `\n        -ForegroundColor Green\n}\n\n$eventHubEndpointName = \"eventhub-endpoint\"\n$errOut = $($eh = & { az iot ops dataflow endpoint show `\n    --instance $iotOps.name `\n    --name $eventHubEndpointName `\n    --resource-group $rg.Name `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$eh) {\n    Write-Host \"Creating Event Hub endpoint $($eventHubEndpointName) in $($iotOps.id)...\" `\n        -ForegroundColor Cyan\n    $errOut = $($eh = & { az iot ops dataflow endpoint create eventhub `\n        --name $eventHubEndpointName `\n        --instance $iotOps.name `\n        --resource-group $rg.Name `\n        --eventhub-namespace $ehNs.Name `\n        --subscription $SubscriptionId `\n        --only-show-errors --output json } | ConvertFrom-Json) 2>&1\n    if (-not $? -or !$ss) {\n        Write-Host \"Error creating Event Hub endpoint $($eventHubEndpointName) - $($errOut).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Event Hub endpoint $($dp.id) created in $($iotOps.id).\" `\n        -ForegroundColor Green\n}\nelse {\n    Write-Host \"Event Hub endpoint $($eh.id) exists in $($iotOps.id).\" `\n        -ForegroundColor Green\n}\n\n#\n# Deploy opc publisher as connector\n#\nif ($script:Connector -ne \"None\") {\n    $discoveryMode = \"Off\"\n    if ($script:EnableNetworkDiscovery.IsPresent) {\n        $discoveryMode = \"Fast\"\n    }\n    & $(Join-Path $scriptDirectory \"deploy.ps1\") `\n        -Name $script:Name `\n        -ClusterType $script:ClusterType `\n        -ConnectorType $script:Connector `\n        -OpsInstanceName $iotOps.Name `\n        -AdrNamespaceName $ns.Name `\n        -SubscriptionId $SubscriptionId `\n        -TenantId $TenantId `\n        -ResourceGroup $rg.Name `\n        -Location $Location `\n        -NetworkDiscoveryMode $discoveryMode `\n        -SkipLogin `\n        -Force  # :$forceReinstall `\n\n    if (-not $?) {\n        Write-Host \"Error deploying opc publisher connector.\" -ForegroundColor Red\n        exit -1\n    }\n}\nelse {\n    Write-Host \"No connector selected - no connector will be deployed...\" `\n        -ForegroundColor Yellow\n}\n\n#\n# Deploy simulation servers\n#\nif ($script:DeployPlcSimulation.IsPresent) {\n    & $(Join-Path $(Join-Path $scriptDirectory \"simulation\") \"deploy.ps1\") `\n        -DeploymentName \"simulation1\" `\n        -SimulationName \"opc-plc\" -Count 2 `\n        -InstanceName $script:OpsInstanceName `\n        -AdrNamespaceName $script:Name `\n        -SubscriptionId $SubscriptionId `\n        -TenantId $TenantId `\n        -ResourceGroup $rg.Name `\n        -Location $Location `\n        -Namespace $script:ClusterNamespace `\n        -SkipLogin `\n        -Force  # :$forceReinstall `\n\n    if (-not $?) {\n        Write-Host \"Error deploying opc plc simulation servers.\" -ForegroundColor Red\n        exit -1\n    }\n}\nif ($script:DeployTestSimulation.IsPresent) {\n    & $(Join-Path $(Join-Path $scriptDirectory \"simulation\") \"deploy.ps1\") `\n        -DeploymentName \"simulation2\" `\n        -SimulationName \"opc-test\" -Count 2 `\n        -InstanceName $script:OpsInstanceName `\n        -AdrNamespaceName $script:Name `\n        -SubscriptionId $SubscriptionId `\n        -TenantId $TenantId `\n        -ResourceGroup $rg.Name `\n        -Location $Location `\n        -Namespace $script:ClusterNamespace `\n        -SkipLogin `\n        -Force  # :$forceReinstall `\n\n    if (-not $?) {\n        Write-Host \"Error deploying test simulation servers.\" -ForegroundColor Red\n        exit -1\n    }\n}\n\n"
  },
  {
    "path": "deploy/kubernetes/common/cluster-utils.psm1",
    "content": "# Common utilities\n\n<#\n    .SYNOPSIS\n        Imports a container image into a Kubernetes cluster.\n    .DESCRIPTION\n        Imports a container image into different types of Kubernetes\n        clusters (microk8s, k3d, kind).\n        Handles the specific import requirements for each cluster type.\n    .PARAMETER ClusterType\n        The type of Kubernetes cluster (microk8s, k3d, or kind).\n    .PARAMETER ContainerImage\n        The container image to import.\n#>\nfunction Import-ContainerImage {\n    [CmdletBinding()]\n    param(\n        [string] [Parameter(Mandatory = $true)] [ValidateSet(\n            \"microk8s\",\n            \"k3d\",\n            \"kind\")] $ClusterType,\n        [string] [Parameter(Mandatory = $true)] $ContainerImage\n    )\n    Write-Host \"Importing $ContainerImage into $ClusterType cluster...\" -ForegroundColor Cyan\n    switch ($ClusterType) {\n        \"microk8s\" {\n            # Windows only, support on linux is not implemented yet\n            $imageTar = Join-Path $env:TEMP \"image.tar\"\n            docker image save $ContainerImage -o $imageTar\n            multipass transfer $imageTar microk8s-vm:/tmp/image.tar\n            microk8s ctr image import /tmp/image.tar\n            Remove-Item -Path $imageTar -Force\n            docker image rm -f $ContainerImage\n            $ContainerImage = \"docker.io/$ContainerImage\"\n        }\n        \"k3d\" {\n            # import in all clusters which avoids asking for the cluster name\n            $clusters = $(& { k3d cluster list --no-headers } -split \")`n\") `\n                | ForEach-Object { $($_ -split \" \")[0].Trim() }\n            k3d image import $ContainerImage `\n                --mode auto `\n                --cluster $($clusters -join \",\")\n        }\n        \"kind\" {\n            kind load docker-image $ContainerImage\n        }\n    }\n    Write-Host \"Container $ContainerImage imported into $ClusterType cluster.\" -ForegroundColor Green\n}\n\n# Export module members\nExport-ModuleMember -Function Import-ContainerImage"
  },
  {
    "path": "deploy/kubernetes/debug/Dockerfile",
    "content": "FROM mcr.microsoft.com/dotnet/runtime-deps\n#FROM mcr.microsoft.com/dotnet/sdk:latest AS base\nUSER root\nWORKDIR /app\n\n#### Remote Debugging Setup ####\n# Update package lists, install openssh-server, curl, and unzip.\nRUN apt-get update && \\\n    apt-get install -y --no-install-recommends \\\n    openssh-server curl unzip rsync procps net-tools tcpdump && \\\n    rm -rf /var/lib/apt/lists/* && \\\n    mkdir /var/run/sshd && \\\n    # Set root password to \"password123!\"\n    echo 'root:password123!' | chpasswd && \\\n    # Configure SSH: allow root login and enable password authentication.\n    sed -i 's/^#*PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config && \\\n    sed -i 's/^#*PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config && \\\n    echo \"PermitUserEnvironment yes\" >> /etc/ssh/sshd_config && \\\n    # Install vsdbg for remote debugging with vs-code (vs 2022 installs its own version)\n    curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /vsdbg && \\\n    # Prepare SSH environment for root\n    mkdir -p /root/.ssh && chmod 700 /root/.ssh\n\n# Expose the SSH port (22)\nEXPOSE 22\n\n# Copy the custom entrypoint script into the container.\nCOPY ./entrypoint.sh /app/entrypoint.sh\nRUN chmod +x /app/entrypoint.sh\n\n# Use our entrypoint script to start SSH\nENTRYPOINT [\"/app/entrypoint.sh\"]"
  },
  {
    "path": "deploy/kubernetes/debug/build.ps1",
    "content": "<#\n    .SYNOPSIS\n        Build a debug version of OPC Publisher and make it available\n        in the local AIO cluster.\n    .NOTES\n        DO NOT USE FOR PRODUCTION SYSTEMS. This script is intended for\n        development and testing purposes only.\n\n    .PARAMETER Configuration\n        The build configuration to use. Default is \"Debug\".\n    .PARAMETER ClusterType\n        The type of Kubernetes cluster to use. Default is \"microk8s\".\n#>\n\nparam(\n    [string] [ValidateSet(\n        \"Debug\",\n        \"Release\"\n    )] $Configuration = \"Debug\",\n    [string] [ValidateSet(\n        \"kind\",\n        \"minikube\",\n        \"k3d\",\n        \"microk8s\"\n    )] $ClusterType = \"microk8s\",\n    [switch] $StartDebugger\n)\n\n$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Path\nImport-Module $(Join-Path $(Join-Path $(Split-Path $scriptDirectory) \"common\") `\n    \"cluster-utils.psm1\") -Force\n\n$projFile = \"Azure.IIoT.OpcUa.Publisher.Module\"\n$projFile = \"../../../src/$($projFile)/src/$($projFile).csproj\"\n\n$containerName = \"iotedge/opc-publisher\"\n$containerTag = Get-Date -Format \"MMddHHmmss\"\n$containerImage = \"$($containerName):$($containerTag)\"\nWrite-Host \"Publishing $Configuration OPC Publisher as $containerImage...\" `\n    -ForegroundColor Cyan\ndotnet clean $projFile -c $Configuration\ndotnet restore $projFile -s https://api.nuget.org/v3/index.json\ndotnet publish $projFile -c $Configuration --self-contained false --no-restore `\n    /t:PublishContainer -r linux-x64 /p:ContainerImageTag=$($containerTag)\nif (-not $?) {\n    Write-Host \"Error building opc publisher connector.\" -ForegroundColor Red\n    exit -1\n}\nWrite-Host \"$Configuration container image $containerImage published successfully.\" `\n    -ForegroundColor Green\n\nImport-ContainerImage -ClusterType $script:ClusterType -ContainerImage $containerImage\nif ($StartDebugger) {\n    ./debug.ps1 -Image $containerImage\n}\n"
  },
  {
    "path": "deploy/kubernetes/debug/debug.json",
    "content": "{\n  \"securityContext\": {\n    \"runAsNonRoot\": false,\n    \"runAsUser\": 0,\n    \"runAsGroup\": 0,\n    \"fsGroup\": 0,\n    \"privileged\": true\n  }\n}\n"
  },
  {
    "path": "deploy/kubernetes/debug/debug.ps1",
    "content": "<#\n    .SYNOPSIS\n        Make a pod debuggable by attaching a debugger container to it.\n    .DESCRIPTION\n        This script builds a Docker image for the vsdbg debugger and attaches\n        it to a specified pod in a Kubernetes cluster. It requires Docker and\n        kubectl to be installed and configured.\n    .PARAMETER PodName\n        The name of the pod to debug.\n    .PARAMETER ContainerName\n        The name of the container in the pod to debug.\n    .PARAMETER Namespace\n        The Kubernetes namespace where the pod is located.\n    .PARAMETER ClusterType\n        The type of Kubernetes cluster. Default is \"microk8s\".\n    .PARAMETER Image\n        If specified, the script will replace the existing image in the pod\n        See --set-image in kubectl debug documentation.\n#>\n\nparam(\n    [string] $PodName,\n    [string] $ContainerName,\n    [string] $Namespace,\n    [string] [ValidateSet(\n        \"kind\",\n        \"minikube\",\n        \"k3d\",\n        \"microk8s\"\n    )] $ClusterType =\"microk8s\",\n    [string] $Image,\n    [switch] $Fork\n)\n\n$ErrorActionPreference = 'Stop'\n$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Path\nImport-Module $(Join-Path $(Join-Path $(Split-Path $scriptDirectory) \"common\") `\n    \"cluster-utils.psm1\") -Force\n\n# Get a list of pods and let user select one\nif (-not (Get-Command kubectl -ErrorAction SilentlyContinue)) {\n    Write-Host \"kubectl is not installed or not in the PATH.\" -ForegroundColor Red\n    exit -1\n}\nif (-not (Get-Command docker -ErrorAction SilentlyContinue)) {\n    Write-Host \"docker is not installed or not in the PATH.\" -ForegroundColor Red\n    exit -1\n}\n\n# get list of namespaces and let user select one\n$namespaces = kubectl get namespaces --no-headers | ForEach-Object {\n    $_.Split()[0]\n}\nif (-not $namespaces) {\n    Write-Host \"No namespaces found.\" -ForegroundColor Red\n    exit -1\n}\nif (-not $script:Namespace) {\n    $script:Namespace = $namespaces | Out-GridView -Title \"Select a namespace\" -PassThru\n    if (-not $script:Namespace) {\n        Write-Host \"No namespace selected.\" -ForegroundColor Yellow\n        exit 0\n    }\n}\nelse {\n    if (-not $namespaces.Contains($script:Namespace)) {\n        Write-Host \"Namespace '$script:Namespace' not found.\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Using namespace '$script:Namespace'.\" -ForegroundColor Green\n}\n\nfunction Select-PodName {\n    # get list of pods in the namespace and let user select one\n    $pods = kubectl get pods -n $Namespace --no-headers | ForEach-Object {\n        $_.Split()[0]\n    }\n    if (-not $pods) {\n        Write-Host \"No pods found in namespace '$Namespace'.\" -ForegroundColor Red\n        exit -1\n    }\n    if (-not $script:PodName) {\n        $script:PodName = $pods | Out-GridView -Title \"Select a pod to debug\" -PassThru\n        if (-not $script:PodName) {\n            Write-Host \"No pod selected.\" -ForegroundColor Yellow\n            exit 0\n        }\n    }\n    else {\n        if (-not $pods.Contains($script:PodName)) {\n            Write-Host \"Pod '$script:PodName' not found in namespace '$Namespace'.\" `\n                -ForegroundColor Red\n            exit -1\n        }\n    }\n}\nSelect-PodName\nWrite-Host \"Using pod '$script:PodName'.\" -ForegroundColor Green\n\n# Build and make .net debugger image available in cluster\n$containerTag = Get-Date -Format \"MMddHHmmss\"\n$debuggerImage = \"debugger:$($containerTag)\"\nWrite-Host \"Building debugger image with tag '$containerTag'...\" `\n    -ForegroundColor Cyan\ndocker build --progress auto -f Dockerfile -t $debuggerImage .\nWrite-Host \"Debugger image built with tag '$containerTag'.\" `\n    -ForegroundColor Green\nImport-ContainerImage -ClusterType $script:ClusterType `\n    -ContainerImage $debuggerImage\n\nwhile ($true) {\n    # Get main container name if not specified\n    $containers = $(kubectl get pod $script:PodName -n $Namespace `\n            -o jsonpath-as-json='{.spec.containers[*].name}') | ConvertFrom-Json\n    if (-not $containers -or $containers.Count -eq 0) {\n        Write-Host \"No containers found in pod '$script:PodName'.\" -ForegroundColor Red\n        exit -1\n    }\n    # If ContainerName is not specified, use the first container\n    if (-not $ContainerName) {\n        # if one use it otherwise let user select one\n        if ($containers.Count -eq 1) {\n            $ContainerName = $containers\n            Write-Host \"Using container '$ContainerName' in pod '$script:PodName'.\" `\n                -ForegroundColor Green\n        }\n        else {\n            $ContainerName = $containers `\n                | Out-GridView -Title \"Select a container to debug\" -PassThru\n            if (-not $ContainerName) {\n                Write-Host \"No container selected.\" -ForegroundColor Yellow\n                exit 0\n            }\n        }\n    }\n    else {\n        if (-not $containers.Contains($ContainerName)) {\n            Write-Host \"Container '$ContainerName' not found in pod '$script:PodName'.\" `\n                -ForegroundColor Red\n            exit -1\n        }\n        Write-Host \"Attach debugger to container '$ContainerName' in pod '$script:PodName'.\" `\n            -ForegroundColor Green\n    }\n\n    $ephemeralContainers = $(kubectl get pod $script:PodName -n $Namespace `\n        -o jsonpath-as-json='{.spec.ephemeralContainers[*].name}') | ConvertFrom-Json\n    if (-not $ephemeralContainers -or -not $ephemeralContainers.Contains(\"debugger\")) {\n        # Debugger container is not attached yet, so we can proceed\n        Write-Host \"Debugger container not attached to pod '$script:PodName'.\" `\n            -ForegroundColor Green\n        break\n    }\n    Write-Host \"Debugger already attached to pod '$script:PodName' - Restarting pod.\" `\n        -ForegroundColor Yellow\n    # Delete the current pod so we can recreate it with the debug container\n    kubectl -n $Namespace delete pod $script:PodName --wait=true\n    # Now wait for the pod to be restarted\n    Write-Host \"Waiting for pod '$script:PodName' to be restarted...\" -ForegroundColor Cyan\n    while ($true) {\n        $podStatus = kubectl get pod $script:PodName -n $Namespace -o jsonpath='{.status.phase}'\n        if ($podStatus -eq \"Running\") {\n            Write-Host \"Pod '$script:PodName' is running.\"`\n                -ForegroundColor Green\n            break\n        }\n        elseif ($podStatus -eq \"Pending\") {\n            Write-Host \"Pod '$script:PodName' is pending...\"`\n                -ForegroundColor Yellow\n        }\n        elseif (!$podStatus -or $podStatus -eq \"\") {\n            $script:PodName = $null\n            Select-PodName\n            Write-Host \"Switching to Pod '$script:PodName'.\" `\n                -ForegroundColor Green\n        }\n        else {\n            Write-Host \"Pod '$script:PodName' is in state '$podStatus'.\" `\n                -ForegroundColor Yellow\n        }\n        Start-Sleep -Seconds 1\n    }\n}\n\nif ($script:Fork.IsPresent) {\n    # Check if the pods already contain a debug pod\n    $debugPod = \"$($script:PodName)-debug\"\n    if ($pods.Contains($debugPod)) {\n        # delete the existing debug pod\n        Write-Host \"Debug pod '$($debugPod)' already exists - deleting it.\" `\n            -ForegroundColor Yellow\n       # kubectl -n $Namespace delete pod $debugPod --wait=true\n    }\n\n    # Attach the debugger container to the specified pod and container\n    Write-Host \"Forking pod '$script:PodName' with container '$ContainerName' to '$($debugPod)'...\" `\n        -ForegroundColor Cyan\n    if ($Image) {\n         # Replace the existing image in the pod\n        kubectl -n $Namespace debug $script:PodName -n $($Namespace) `\n            -it --attach=false `\n            --image=docker.io/library/debugger:$($containerTag) `\n            --container=debugger `\n            --keep-annotations=true `\n            --keep-labels=true `\n            --keep-init-containers=true `\n            --keep-liveness=true `\n            --keep-readiness=true `\n            --keep-startup=true `\n            --same-node=true `\n            --set-image=\"$($ContainerName)=$($Image)\" `\n            --image-pull-policy=IfNotPresent `\n            --share-processes=true `\n            --profile=sysadmin `\n            --custom=debug.json `\n            --copy-to=$($debugPod) `\n    }\n    else {\n        kubectl -n $Namespace debug $script:PodName -n $($Namespace) `\n            -it --attach=false `\n            --image=docker.io/library/debugger:$($containerTag) `\n            --container=debugger `\n            --keep-annotations=true `\n            --keep-labels=true `\n            --keep-init-containers=true `\n            --keep-liveness=true `\n            --keep-readiness=true `\n            --keep-startup=true `\n            --same-node=true `\n            --image-pull-policy=IfNotPresent `\n            --share-processes=true `\n            --profile=sysadmin `\n            --custom=debug.json `\n            --copy-to=$($debugPod) `\n    }\n    if (-not $?) {\n        Write-Host \"Failed to fork pod '$script:PodName' with container '$ContainerName' to '$($debugPod)'.\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Debugging pod '$script:PodName' as '$($debugPod)' with container '$ContainerName'.\" `\n        -ForegroundColor Green\n    $script:PodName = $debugPod\n}\nelseif ($Image) {\n    # Set the image to the specified one\n    Write-Host \"Replacing image in pod '$script:PodName' for container '$ContainerName' with '$Image'...\" `\n        -ForegroundColor Cyan\n    kubectl set image \"pod/$($script:PodName)\" \"$($ContainerName)=$($Image)\" -n $($Namespace)\n    if (-not $?) {\n        Write-Host \"Failed to replace image in pod '$script:PodName' for container '$ContainerName'.\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Image in pod '$script:PodName' for container '$ContainerName' replaced with '$Image'.\" `\n        -ForegroundColor Green\n}\n\n# Now wait for the pod to start\nWrite-Host \"Checking state of pod '$script:PodName'...\" -ForegroundColor Cyan\nwhile ($true) {\n    $podStatus = kubectl get pod $script:PodName -n $Namespace -o jsonpath='{.status.phase}'\n    if ($podStatus -eq \"Running\") {\n        if ($Image) {\n            $podDescription = $(kubectl get pod $script:PodName -n $Namespace -o json) `\n                | ConvertFrom-Json\n            $images = $podDescription.spec.containers.image\n            if ($images -contains $Image) {\n                Write-Host \"Pod '$script:PodName' is running with '$Image'.\"`\n                    -ForegroundColor Green\n                break\n            }\n            else {\n                Write-Host \"Pod '$script:PodName' is running but still using the old image.\" `\n                    -ForegroundColor Yellow\n            }\n        }\n        else {\n            Write-Host \"Pod '$script:PodName' is running.\"`\n                -ForegroundColor Green\n            break\n        }\n    }\n    elseif ($podStatus -eq \"Pending\") {\n        Write-Host \"Pod '$script:PodName' is pending...\"`\n            -ForegroundColor Yellow\n    }\n    elseif (!$podStatus -or $podStatus -eq \"\") {\n        $ContainerName = $containers `\n                | Out-GridView -Title \"Select a container to debug\" -PassThru\n            if (-not $ContainerName) {\n                Write-Host \"No container selected.\" -ForegroundColor Yellow\n                exit 0\n            }\n        Write-Host \"Pod '$script:PodName' in unknown state...\"`\n            -ForegroundColor Red\n    }\n    else {\n        Write-Host \"Pod '$script:PodName' is in state '$podStatus'.\" `\n            -ForegroundColor Yellow\n    }\n    Start-Sleep -Seconds 1\n}\n\nif (-not $script:Fork.IsPresent) {\n\n    Write-Host \"Attaching debugger to pod '$script:PodName' and container '$ContainerName'...\" `\n        -ForegroundColor Cyan\n    # Attach to running container\n    kubectl -n $Namespace debug $script:PodName -n $($Namespace) `\n        --image=docker.io/library/debugger:$($containerTag) `\n        --target=$ContainerName `\n        --container=debugger `\n        --image-pull-policy=IfNotPresent `\n        --share-processes=true `\n        --profile=sysadmin `\n        --custom=debug.json `\n        -it --attach=false\n\n    Write-Host \"Debugging pod '$script:PodName' and container '$ContainerName'.\" `\n        -ForegroundColor Green\n}\n\nWrite-Host \"Visual Studio Debugger listening on localhost:50000.\" `\n    -ForegroundColor Green\nkubectl port-forward -n $($Namespace) --address=0.0.0.0 pod/$($script:PodName) 50000:22\n\n"
  },
  {
    "path": "deploy/kubernetes/debug/entrypoint.sh",
    "content": "#!/bin/bash\n\n#\n# Start ssh server to accept incoming debugger connections on port 22.\n#\necho \"Starting SSH server...\"\n/usr/sbin/sshd\n\n#\n# Workaround for the debugged container not sharing the /tmp directory with\n# the debugger which VS Debugger requires to set up the ipc to the process\n# being debugged. See https://github.com/microsoft/MIEngine/issues/1488 and\n# https://github.com/dotnet/runtime/issues/37444 for more information.\n#\nif [ -n \"$1\" ]; then\n    PROCESS=\"$1\"\nelif [ -n \"$__DEBUG_TARGET\" ]; then\n    PROCESS=\"$__DEBUG_TARGET\"\nelse\n    PROCESS=\"dotnet\"\nfi\nCUR=\nU=\"root\"\nwhile true; do\n    # Check if the process is running\n    PID=$(pgrep -f $PROCESS)\n    if [ -z \"$PID\" ]; then\n        if [ -n \"$CUR\" ]; then\n            echo \"$PROCESS process $CUR stopped.\"\n            CUR=\n        fi\n        sleep 2s\n    elif [ \"$PID\" != \"$CUR\" ]; then\n        if [ -z \"$CUR\" ]; then\n            echo \"$PROCESS process $PID started.\"\n        else\n            echo \"$PROCESS process $CUR restarted as $PID.\"\n        fi\n        CUR=$PID\n        # Update the TMPDIR environment variable for all users in bashrc\n        echo \"Setting TMPDIR to /proc/$CUR/$U/tmp for the current user...\"\n        if grep -q \"export TMPDIR=\" ~/.bashrc; then\n            sed -i \"s|^export TMPDIR=.*|export TMPDIR=/proc/$CUR/$U/tmp|\" ~/.bashrc\n        else\n            echo \"export TMPDIR=/proc/$CUR/$U/tmp\" >> ~/.bashrc\n        fi\n        ARGS=$(ps -o args= -p $CUR)\n        ARGS=$(set $ARGS && shift && echo $1)\n        echo \"$PROCESS started with PID $CUR and arguments '$ARGS'\"\n        echo \"Waiting...\"\n        sleep 3s\n        # point to the dotnet runtime in the debugged process\n        echo \"Linking /usr/share/dotnet to /proc/$CUR/$U/usr/share/dotnet\"\n        ln -sf /proc/$CUR/$U/usr/share/dotnet /usr/share/dotnet\n        # Try to make the dll/pdb files available to the debugger process...\n        ARG_PATH=$(dirname \"${ARGS}\")\n        mkdir -p $ARG_PATH\n        find $ARG_PATH/ -type l -delete\n        echo \"Linking files from /proc/$CUR/$U$ARG_PATH/ to $ARG_PATH/\"\n        FILES=$(find /proc/$CUR/$U$ARG_PATH/ \\\n            -regextype posix-extended -regex '.*\\.(pdb|dll)$' \\\n            -exec realpath --relative-to=/proc/$CUR/$U/ {} \\;)\n        for i in $FILES; do\n            echo \"Linking /proc/$CUR/$U/$i to /$i\"\n            ln -sf /proc/$CUR/$U/$i /$i\n        done\n    else\n        sleep 10s\n    fi\ndone\n"
  },
  {
    "path": "deploy/kubernetes/debug/forward-mq.ps1",
    "content": "<#\n    This script forwards the MQTT port of the aio-broker-insecure\n    service in the specified namespace.\n    It is intended for debugging purposes in a Kubernetes cluster.\n    Presumes the --enable-insecure-listener was used during az iot\n    ops create.\n#>\nparam(\n    [string] $Namespace = \"azure-iot-operations\"\n)\nkubectl -n $Namespace port-forward service/aio-broker-insecure 1883:1883"
  },
  {
    "path": "deploy/kubernetes/deploy.ps1",
    "content": "\n<#\n    .SYNOPSIS\n        Setup local AIO cluster and connect to Arc (must run as admin)\n    .DESCRIPTION\n        Setup local AIO cluster and connect to Arc. This script installs\n        the cluster type chosen and all other required dependencies and\n        connect it to the cloud via Arc. Then it will install AIO on it.\n    .NOTES\n        DO NOT USE FOR PRODUCTION SYSTEMS. This script is intended for\n        development and testing purposes only.\n\n    .PARAMETER Name\n        The name of the cluster\n    .PARAMETER OpsInstanceName\n        The name of the Azure IoT Ops instance. Default is the same as the\n        cluster name.\n    .PARAMETER AdrNamespaceName\n        The name of the ADR namespace to create or use. Default is the same\n        as the cluster name.\n    .PARAMETER ResourceGroup\n        The resource group to create or use for the cluster.\n        Default is the same as the cluster name.\n    .PARAMETER TenantId\n        The tenant id to use when logging into Azure.\n    .PARAMETER SubscriptionId\n        The subscription id to scope all activity to.\n    .PARAMETER Location\n        The location of the cluster.\n    .PARAMETER ClusterType\n        The type of cluster to create. Default is microk8s.\n    .PARAMETER ConnectorType\n        Whether to deploy the OPC Publisher as connector. Official\n        installs the official connector build, Local builds and deploys\n        a local version. Debug the debug version. Default is Official.\n    .PARAMETER BucketSize\n        The size of the bucket to use to partition devices across\n        connectors. Default is 1 where every connector gets one device.\n    .PARAMETER NetworkDiscoveryMode\n        Network discovery mode to use. Default is \"Off\" (disabled).\n    .PARAMETER SkipLogin\n        Skip the login to Azure. This is useful when running in a CI/CD\n    .PARAMETER Force\n        Force reinstall.\n#>\n\nparam(\n    [string] [Parameter(Mandatory = $true)] $Name,\n    [string] $OpsInstanceName,\n    [string] $AdrNamespaceName,\n    [string] $ResourceGroup,\n    [string] $TenantId,\n    [string] $SubscriptionId,\n    [string] $Location,\n    [string] [ValidateSet(\n        \"kind\",\n        \"minikube\",\n        \"k3d\",\n        \"microk8s\"\n    )] $ClusterType = \"microk8s\",\n    [string] [ValidateSet(\n        \"Official\",\n        \"Local\",\n        \"Debug\"\n    )] $ConnectorType = \"Official\",\n    [string] [ValidateSet(\n        \"Off\",\n        \"Fast\",\n        \"Local\",\n        \"Full\"\n    )] $NetworkDiscoveryMode = \"Off\",\n    [int] $BucketSize = 1,\n    [switch] $SkipLogin,\n    [switch] $Force\n)\n$ErrorActionPreference = 'Continue'\n\n$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Path\nImport-Module $(Join-Path $(Join-Path $scriptDirectory \"common\") \"cluster-utils.psm1\") -Force\n\n#\n# Dump command line arguments\n#\nif ([string]::IsNullOrWhiteSpace($script:ResourceGroup)) {\n    $script:ResourceGroup = $script:Name\n    Write-Host \"Using resource group $($script:ResourceGroup)...\" -ForegroundColor Cyan\n}\nif ([string]::IsNullOrWhiteSpace($script:Location)) {\n    $script:Location = \"westus\"\n    Write-Host \"Using location $($script:Location)...\" -ForegroundColor Cyan\n}\nif ([string]::IsNullOrWhiteSpace($script:OpsInstanceName)) {\n    $script:OpsInstanceName = $Name\n    Write-Host \"Using instance name $($script:OpsInstanceName)...\" -ForegroundColor Cyan\n}\nif ([string]::IsNullOrWhiteSpace($script:AdrNamespaceName)) {\n    $script:AdrNamespaceName = $Name\n    Write-Host \"Using ADR namespace name $($script:AdrNamespaceName)...\" -ForegroundColor Cyan\n}\n\n# check if docker and az cli are installed\n$errOut = $($docker = & { docker version --format json | ConvertFrom-Json }) 2>&1\nif (-not $? -or !$docker.Server) {\n    $docker | Out-Host\n    Write-Host \"Docker not installed or running : $errOut\" -ForegroundColor Red\n    exit -1\n}\n$errOut = $($azVersion = (az version)[1].Split(\":\")[1].Split('\"')[1]) 2>&1\nif ($azVersion -lt \"2.74.0\" -or !$azVersion) {\n    Write-Host \"Azure CLI version 2.74.0 or higher is required.\" `\n        -ForegroundColor Red\n    exit -1\n}\n$errOut = $($azVersion = & {az extension list -o json `\n    --query \"[?name == 'azure-iot-ops']\"} | ConvertFrom-Json) 2>&1\nif (!$azVersion -or $azVersion[0].version -lt \"2.0.0\") {\n    Write-Host \"Azure IoT Operations Extension version 2.0 or higher is required.\" `\n        -ForegroundColor Red\n    exit -1\n}\n\n#\n# Log into azure\n#\nif (-not $script:SkipLogin.IsPresent -or -not $SubscriptionId) {\n    if ([string]::IsNullOrWhiteSpace($script:TenantId)) {\n        $script:TenantId = $env:AZURE_TENANT_ID\n    }\n    Write-Host \"Log into Azure...\" -ForegroundColor Cyan\n    $loginParams = @( \"--only-show-errors\" )\n    if (![string]::IsNullOrWhiteSpace($script:TenantId)) {\n        $loginParams += @(\"--tenant\", $script:TenantId)\n    }\n    $session = (az login @loginParams) | ConvertFrom-Json\n    if (-not $session) {\n        Write-Host \"Error: Login failed.\" -ForegroundColor Red\n        exit -1\n    }\n    if ([string]::IsNullOrWhiteSpace($script:SubscriptionId)) {\n        $script:SubscriptionId = $session[0].id\n    }\n    if ([string]::IsNullOrWhiteSpace($script:TenantId)) {\n        $script:TenantId = $session[0].tenantId\n    }\n}\n\n#\n# Check adr namespace schema registry and azure iot instance exists\n#\n$errOut = $($rg = & { az group show `\n    --name $script:ResourceGroup `\n    --subscription $script:SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$rg) {\n    Write-Host \"Resource group $($script:ResourceGroup) not found - $($errOut).\" `\n        -ForegroundColor Red\n    exit -1\n}\n$adrNsResource = \"/subscriptions/$($script:SubscriptionId)\"\n$adrNsResource = \"$($adrNsResource)/resourceGroups/$($script:ResourceGroup)\"\n$adrNsResource = \"$($adrNsResource)/providers/Microsoft.DeviceRegistry\"\n$adrNsResource = \"$($adrNsResource)/namespaces/$($script:AdrNamespaceName)\"\n$errOut = $($ns = & { az rest --method get `\n    --url \"$($adrNsResource)?api-version=2025-10-01\" `\n    --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\nif (!$ns -or !$ns.id) {\n    Write-Host \"ADR namespace $($script:AdrNamespaceName) not found - $($errOut).\" `\n        -ForegroundColor Red\n    exit -1\n}\n$errOut = $($iotOps = & { az iot ops show `\n    --resource-group $script:ResourceGroup `\n    --name $script:OpsInstanceName `\n    --subscription $script:SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$iotOps) {\n    Write-Host \"Azure IoT Operations instance $($script:OpsInstanceName) not found - $($errOut).\" `\n        -ForegroundColor Red\n    exit -1\n}\n\n#\n# Deploy publisher as connector\n#\n\n$containerTag = \"latest\"\n$containerRegistry = $null\n$containerName = \"iotedge/opc-publisher\"\nif ($script:ConnectorType -eq \"Official\") {\n    Write-Host \"Using official OPC Publisher image as connector...\" -ForegroundColor Cyan\n    $containerPull = \"Always\"\n    $containerRegistry = @{\n        registrySettingsType = \"ContainerRegistry\"\n        containerRegistrySettings = @{\n            registry = \"mcr.microsoft.com\"\n        }\n    }\n    $containerImage = \"mcr.microsoft.com/$($containerName):$($containerTag)\"\n    $connectorMetadataRef = \"mcr.microsoft.com/$($containerName):$($containerTag)-metadata\"\n}\nelse {\n    $projFile = \"Azure.IIoT.OpcUa.Publisher.Module\"\n    $projFile = \"../../src/$($projFile)/src/$($projFile).csproj\"\n    $configuration = $script:ConnectorType\n    if ($configuration -eq \"Local\") {\n        $configuration = \"Release\"\n    }\n    $containerTag = Get-Date -Format \"MMddHHmmss\"\n    $containerImage = \"$($containerName):$($containerTag)\"\n    $connectorMetadataRef = $null\n    Write-Host \"Publishing $configuration OPC Publisher as $containerImage...\" `\n        -ForegroundColor Cyan\n    dotnet restore $projFile -s https://api.nuget.org/v3/index.json\n    dotnet publish $projFile -c $configuration --self-contained false --no-restore `\n        /t:PublishContainer -r linux-x64 /p:ContainerImageTag=$($containerTag)\n    if (-not $?) {\n        Write-Host \"Error building opc publisher connector.\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"$configuration container image $containerImage published successfully.\" `\n        -ForegroundColor Green\n    $containerPull = \"IfNotPresent\"\n\n    # Import container image\n    Import-ContainerImage -ClusterType $script:ClusterType -ContainerImage $containerImage\n    if ($script:ClusterType -eq \"microk8s\") {\n        $containerImage = \"docker.io/$($containerImage)\"\n        $containerRegistry = @{\n            registrySettingsType = \"ContainerRegistry\"\n            containerRegistrySettings = @{\n                registry = \"docker.io\"\n            }\n        }\n    }\n}\n\n# Deploy connector template\n$tempFile = New-TemporaryFile\n$template = @{\n    extendedLocation = $iotOps.extendedLocation\n    properties = @{\n        aioMetadata = @{\n            aioMinVersion = \"1.2.*\"\n            aioMaxVersion = \"1.*.*\"\n        }\n        runtimeConfiguration = @{\n            runtimeConfigurationType = \"ManagedConfiguration\"\n            managedConfigurationSettings = @{\n                managedConfigurationType = \"ImageConfiguration\"\n                imageConfigurationSettings = @{\n                    imageName = $containerName\n                    imagePullPolicy = $containerPull\n                    replicas = 1 # set to 2 when HA is supported\n                    registrySettings = $containerRegistry\n                    tagDigestSettings = @{\n                        tagDigestType = \"Tag\"\n                        tag = $containerTag\n                    }\n                }\n                allocation = @{\n                    policy = \"Bucketized\"\n                    bucketSize = $script:BucketSize\n                }\n                additionalConfiguration = @{\n                    EnableMetrics = \"True\"\n                    UseFileChangePolling = \"True\"\n                    AioNetworkDiscoveryMode = $null\n                    AioNetworkDiscoveryInterval = $null\n                    DisableDataSetMetaData = \"True\"\n                    LogFormat = \"syslog\"\n                    # Needed because we are not running as \"app\" user\n                    PkiRootPath = \"/var/tmp/pki\"\n                    PublishedNodesFile = \"/var/tmp/pn.json\"\n                    CreatePublishFileIfNotExist = \"True\"\n                }\n                #persistentVolumeClaims = @(\n                #    @{\n                #        claimName = \"opcpublisherdata\"\n                #        mountPath = \"/app\"\n                #    }\n                #)\n                secrets = @()\n            }\n        }\n        deviceInboundEndpointTypes = @(\n            @{\n                endpointType = \"Microsoft.OpcPublisher\"\n                version = \"2.9\"\n                displayName = \"OPC Publisher\"\n            }\n        )\n        diagnostics = @{\n            logs = @{\n                level = \"info\"\n            }\n        }\n        connectorMetadataRef = $connectorMetadataRef\n        mqttConnectionConfiguration = @{\n            host = \"aio-broker:18883\"\n            authentication = @{\n                method = \"ServiceAccountToken\"\n                serviceAccountTokenSettings = @{\n                    audience = \"aio-internal\"\n                }\n            }\n            tls = @{\n                mode = \"Enabled\"\n                trustedCaCertificateConfigMapRef = \"azure-iot-operations-aio-ca-trust-bundle\"\n            }\n        }\n    }\n} | ConvertTo-Json -Depth 100\n\n# Workaround for discovery while discovery handler is not yet supported\nif ($script:NetworkDiscoveryMode -ne \"Off\") {\n    Write-Host \"Network Discovery via discovery handler is not supported yet.\" `\n         -ForegroundColor Yellow\n    Write-Host \"Enabling discovery in connector instead.\" `\n         -ForegroundColor Yellow\n    $additionalConfig = $template.properties.runtimeConfiguration.additionalConfiguration\n    $additionalConfig.AioNetworkDiscoveryMode = $script:NetworkDiscoveryMode\n    $additionalConfig.AioNetworkDiscoveryInterval = \"00:10:00\"\n    $script:NetworkDiscoveryMode = \"Off\"\n}\n\n$template | Out-File -FilePath $tempFile -Encoding utf8 -Force\n\n$ctName = \"opc-publisher\"\n$ctResource = \"/subscriptions/$($script:SubscriptionId)\"\n$ctResource = \"$($ctResource)/resourceGroups/$($rg.Name)\"\n$ctResource = \"$($ctResource)/providers/Microsoft.IoTOperations\"\n$ctResource = \"$($ctResource)/instances/$($iotOps.name)\"\n$ctResource = \"$($ctResource)/akriConnectorTemplates/$($ctName)\"\nWrite-Host \"Deploying connector template $($ctName)...\" -ForegroundColor Cyan\naz rest --method put `\n    --url \"$($ctResource)?api-version=2025-09-01-preview\" `\n    --headers \"Content-Type=application/json\" `\n    --body @$tempFile\nif (-not $?) {\n    Write-Host \"Error deploying connector template $($ctName) - $($errOut).\" `\n        -ForegroundColor Red\n    Remove-Item -Path $tempFile -Force\n    exit -1\n}\n\n# Deploy discovery handler - disabled in current version of Azure IoT Operations\nif ($script:NetworkDiscoveryMode -ne \"Off\") {\n    $template = @{\n        extendedLocation = $iotOps.extendedLocation\n        properties = @{\n            aioMetadata = @{\n                aioMinVersion = \"1.2.*\"\n                aioMaxVersion = \"1.*.*\"\n            }\n            imageConfiguration = @{\n                imageName = $containerName\n                imagePullPolicy = $containerPull\n                registrySettings = $containerRegistry\n                tagDigestSettings = @{\n                    tagDigestType = \"Tag\"\n                    tag = $containerTag\n                }\n            }\n            mode = \"Enabled\"\n            schedule = @{\n                scheduleType = \"Cron\" # or \"Continuous\" or \"RunOnce\"\n                cron = \"*/10 * * * *\"\n            }\n            additionalConfiguration = @{\n                AioNetworkDiscoveryMode = \"$($script:NetworkDiscoveryMode)\"\n                EnableMetrics = \"True\"\n                UseFileChangePolling = \"True\"\n                LogFormat = \"syslog\"\n                DisableDataSetMetaData = \"True\"\n                # Needed because we are not running as \"app\" user\n                PkiRootPath = \"/var/tmp/pki\"\n                PublishedNodesFile = \"/var/tmp/pn.json\"\n                CreatePublishFileIfNotExist = \"True\"\n            }\n            discoverableDeviceEndpointTypes = @(\n                @{\n                    endpointType = \"Microsoft.OpcPublisher\"\n                    version = \"2.9\"\n                    #displayName = \"OPC Publisher\"\n                }\n            )\n            secrets = @()\n            diagnostics = @{\n                logs = @{\n                    level = \"info\"\n                }\n            }\n            connectorMetadataRef = $connectorMetadataRef\n            mqttConnectionConfiguration = @{\n                host = \"aio-broker:18883\"\n                authentication = @{\n                    method = \"ServiceAccountToken\"\n                    serviceAccountTokenSettings = @{\n                        audience = \"aio-internal\"\n                    }\n                }\n                tls = @{\n                    mode = \"Enabled\"\n                    trustedCaCertificateConfigMapRef = \"azure-iot-operations-aio-ca-trust-bundle\"\n                }\n            }\n        }\n    } | ConvertTo-Json -Depth 100\n    $template | Out-File -FilePath $tempFile -Encoding utf8 -Force\n\n    $dhName = \"opc-publisher\"\n    $dhResource = \"/subscriptions/$($script:SubscriptionId)\"\n    $dhResource = \"$($dhResource)/resourceGroups/$($rg.Name)\"\n    $dhResource = \"$($dhResource)/providers/Microsoft.IoTOperations\"\n    $dhResource = \"$($dhResource)/instances/$($iotOps.name)\"\n    $dhResource = \"$($dhResource)/akriDiscoveryHandlers/$($dhName)\"\n    Write-Host \"Deploying discovery handler template $($dhName)...\" -ForegroundColor Cyan\n    az rest --method put `\n        --url \"$($dhResource)?api-version=2025-09-01-preview\" `\n        --headers \"Content-Type=application/json\" `\n        --body @$tempFile\n    if (-not $?) {\n        Write-Host \"Error deploying discovery handler template $($dhName) - $($errOut).\" `\n            -ForegroundColor Red\n        Remove-Item -Path $tempFile -Force\n        exit -1\n    }\n}\n\nRemove-Item -Path $tempFile -Force\n\n"
  },
  {
    "path": "deploy/kubernetes/iotops/adr-tool.ps1",
    "content": "<#\n    .SYNOPSIS\n        Enables onboarding and cleanup of namespace resources in\n        Azure Device Registry.\n    .DESCRIPTION\n        This tool can be used to onboard discovered assets and devices\n        as assets and devices or clean them up. It requires the Azure\n        CLI to be installed. When used in \"Onboard\" mode, it will\n        monitor (loop) for new discovered assets and devices in ADR\n        and copy them as new assets and devices. This is a simpler\n        way to test discovery than the UX based onboarding flow via\n        the Digital Operation experience. When used in \"Cleanup\"\n        mode, it will delete all discovered and onboarded assets and\n        devices in ADR.\n    .NOTES\n        DO NOT USE FOR PRODUCTION SYSTEMS. This script is intended for\n        development and testing purposes only.\n\n    .PARAMETER Action\n        The action to perform. Valid values are \"Onboard\" and \"Cleanup\".\n        Default is \"Onboard\". If \"Cleanup\" is specified, the script will\n        delete all discovered assets and devices.\n    .PARAMETER AdrNamespaceName\n        The ADR namespace to use for the instance.\n        Default is the same as the instance name.\n    .PARAMETER ResourceGroup\n        The resource group to create or use for the cluster.\n        Default is the same as the cluster name.\n    .PARAMETER SubscriptionId\n        The subscription id where the namespace is located.\n        If not specified, the script will use the current subscription.\n    .PARAMETER TenantId\n        The tenant id to use when logging into Azure.\n        If not specified, the script will use the current tenant.\n    .PARAMETER RunOnce\n        If specified, the script will run only one iteration of the\n        action and exit. Otherwise it will run the action to completion.\n    .PARAMETER Force\n        If specified, the script will force the onboarding of devices\n        and assets even if they already exist.\n    .PARAMETER SkipLogin\n        If specified, the script will skip the login step and use\n        the current session.\n#>\n\nparam(\n    [string] [Parameter(Mandatory = $true)] [ValidateSet(\n        \"Onboard\",\n        \"Cleanup\"\n    )] [string] $Action,\n    [string] [Parameter(Mandatory = $true)] $Name,\n    [string] $AdrNamespaceName,\n    [string] $ResourceGroup,\n    [string] $SubscriptionId = \"53d910a7-f1f8-4b7a-8ee0-6e6b67bddd82\",\n    [string] $TenantId,\n    [switch] $RunOnce,\n    [switch] $Force,\n    [switch] $SkipLogin\n)\n\n$ErrorActionPreference = 'Continue'\n\nif ([string]::IsNullOrWhiteSpace($ResourceGroup)) {\n    $ResourceGroup = $script:Name\n    Write-Host \"Using resource group $ResourceGroup...\" -ForegroundColor Cyan\n}\nif ([string]::IsNullOrWhiteSpace($script:AdrNamespaceName)) {\n    $script:AdrNamespaceName = $script:Name\n    Write-Host \"Using ADR namespace name $($script:AdrNamespaceName)...\" -ForegroundColor Cyan\n}\n\n$azVersion = (az version)[1].Split(\":\")[1].Split('\"')[1]\nif ($azVersion -lt \"2.74.0\" -or !$azVersion) {\n    Write-Host \"Azure CLI version 2.74.0 or higher is required.\" `\n        -ForegroundColor Red\n    exit -1\n}\n\n#\n# Log into azure\n#\nif (-not $script:SkipLogin.IsPresent) {\n    Write-Host \"Log into Azure...\" -ForegroundColor Cyan\n    $loginParams = @( \"--only-show-errors\" )\n    if (![string]::IsNullOrWhiteSpace($script:TenantId)) {\n        $loginParams += @(\"--tenant\", $script:TenantId)\n    }\n    $session = (az login @loginParams) | ConvertFrom-Json\n    if (-not $session) {\n        Write-Host \"Error: Login failed.\" -ForegroundColor Red\n        exit -1\n    }\n    if ([string]::IsNullOrWhiteSpace($script:SubscriptionId)) {\n        $script:SubscriptionId = $session[0].id\n    }\n    if ([string]::IsNullOrWhiteSpace($script:TenantId)) {\n        $script:TenantId = $session[0].tenantId\n    }\n}\n\n#\n# Check adr namespace exists\n#\n$adrNsResource = \"/subscriptions/$($script:SubscriptionId)\"\n$adrNsResource = \"$($adrNsResource)/resourceGroups/$($script:ResourceGroup)\"\n$adrNsResource = \"$($adrNsResource)/providers/Microsoft.DeviceRegistry\"\n$adrNsResource = \"$($adrNsResource)/namespaces/$($AdrNamespaceName)\"\n$errOut = $($ns = & { az rest --method get `\n    --url \"$($adrNsResource)?api-version=2025-10-01\" `\n    --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\nif (!$ns -or !$ns.id) {\n    Write-Host \"ADR namespace $($adrNsResource) not found - $($errOut).\" `\n        -ForegroundColor Red\n    exit -1\n}\n\n#\n# Remove properties from discovered resource that are not supported on actual resource\n#\nfunction Remove-PropertyRecursively {\n    param (\n        [Parameter(Mandatory)] [PSObject] $Object,\n        [Parameter(Mandatory)] [string] $PropertyName\n    )\n\n    # Check if the object is a hashtable or PSCustomObject\n    if ($Object -is [System.Collections.IDictionary]) {\n        # Remove the property if it exists\n        if ($Object.ContainsKey($PropertyName)) {\n            $Object.Remove($PropertyName)\n        }\n\n        # Recursively process nested objects\n        foreach ($key in $Object.Keys) {\n            Remove-PropertyRecursively -Object $Object[$key] -PropertyName $PropertyName\n        }\n    } elseif ($Object -is [System.Collections.IEnumerable] -and -not ($Object -is [string])) {\n        # Iterate through enumerable objects\n        foreach ($item in $Object) {\n            Remove-PropertyRecursively -Object $item -PropertyName $PropertyName\n        }\n    } elseif ($Object -is [PSCustomObject]) {\n        # Remove the property if it exists\n        if ($Object.PSObject.Properties[$PropertyName]) {\n            $Object.PSObject.Properties.Remove($PropertyName)\n        }\n\n        # Recursively process nested properties\n        foreach ($property in $Object.PSObject.Properties) {\n            Remove-PropertyRecursively -Object $property.Value -PropertyName $PropertyName\n        }\n    }\n}\n\nif ($script:Action -eq \"Cleanup\") {\n    $resourceTypes = @(\n        \"discoveredAssets\",\n        \"discoveredDevices\",\n        \"assets\",\n        \"devices\"\n    )\n    $itemsDeleted = $true\n    while ($itemsDeleted) {\n        $itemsDeleted = $false\n        foreach ($resourceType in $resourceTypes) {\n            Write-Host \"Deleting all $($resourceType) in ADR namespace $($ns.name)...\" `\n                -ForegroundColor Cyan\n            $errOut = $($resources = & { az rest --method get `\n                --url \"$($ns.id)/$($resourceType)?api-version=2025-10-01\" `\n                --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\n            if ($resources -and $resources.value) {\n                foreach ($resource in $resources.value) {\n                    $itemsDeleted = $true\n                    $errOut = & { az rest --method delete `\n                        --url \"$($resource.id)?api-version=2025-10-01\" `\n                        --headers \"Content-Type=application/json\" } 2>&1\n                    $name = \"$($resourceType.TrimEnd('s')) $($resource.name)\"\n                    if (-not $?) {\n                        Write-Host \"Error deleting $($name): $($errOut)\" `\n                            -ForegroundColor Red\n                    }\n                    else {\n                        Write-Host \"Deleted $($name).\" -ForegroundColor Green\n                    }\n                }\n            }\n        }\n        if ($script:RunOnce.IsPresent) {\n            break\n        }\n    }\n}\nelseif ($script:Action -eq \"Onboard\") {\n    $tempFile = New-TemporaryFile\n    Write-Host \"Onboarding devices and assets in ADR namespace $($ns.name)...\" `\n        -ForegroundColor Green\n    while ($true) {\n        $errOut = $($dDevices = & { az rest --method get `\n            --url \"$($ns.id)/discoveredDevices?api-version=2025-10-01\" `\n            --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\n        $onboardComplete = $false\n        $needsSync = $false\n        if ($dDevices -and $dDevices.value) {\n            foreach ($dDevice in $dDevices.value) {\n\n                $errOut = $($device = & { az rest --method get `\n                    --url \"$($ns.id)/devices/$($dDevice.name)?api-version=2025-10-01\" `\n                    --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\n                if ($device -and $device.id) {\n                    Write-Host \"Device $($device.name) exists with version $($device.properties.version)...\" `\n                        -ForegroundColor Cyan\n                    if ($dDevice.properties.version -eq 1) { # always sync first version\n                        $needsSync = $true\n                    }\n                    elseif ($device.properties.version -ne $dDevice.properties.version) {\n                        Write-Host \"Discovered Device $($dDevice.name) has a different version $($dDevice.properties.version).\" `\n                            -ForegroundColor Yellow\n                        $needsSync = $true\n                    }\n                    elseif (-not $script:Force.IsPresent) {\n                        Write-Host \"Device $($device.name) is up to date.\" -ForegroundColor Green\n                        $onboardComplete = $true\n                        continue\n                    }\n                }\n\n                Remove-PropertyRecursively -Object $dDevice.properties -PropertyName \"supportedAuthenticationMethods\"\n                $body = @{\n                    extendedLocation = $dDevice.extendedLocation\n                    location = $dDevice.location\n                    properties = @{\n                        externalDeviceId = $dDevice.properties.externalDeviceId\n                        enabled = $true\n                        endpoints = $dDevice.properties.endpoints\n                    }\n                } | ConvertTo-Json -Depth 100\n                #$body | Out-Host\n                $body | Out-File -FilePath $tempFile -Encoding utf8 -Force\n                Write-Host \"Create or update device $($dDevice.name)...\" -ForegroundColor Cyan\n                $errOut = $($device = & { az rest --method put `\n                    --url \"$($ns.id)/devices/$($dDevice.name)?api-version=2025-10-01\" `\n                    --headers \"Content-Type=application/json\" `\n                    --body @$tempFile } | ConvertFrom-Json) 2>&1\n                if (!$device.id) {\n                    Write-Host \"Error onboarding device $($dDevice.name): $($errOut)\" `\n                        -ForegroundColor Red\n                } else {\n                    Write-Host \"Device $($device.name) created or updated successfully.\" `\n                        -ForegroundColor Green\n                    $onboardComplete = $true\n                }\n            }\n        }\n        else {\n            Write-Host \"No discovered devices found.\" -ForegroundColor Yellow\n        }\n        $errOut = $($dAssets = & { az rest --method get `\n            --url \"$($ns.id)/discoveredAssets?api-version=2025-10-01\" `\n            --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\n        if ($dAssets -and $dAssets.value) {\n            foreach ($dAsset in $dAssets.value) {\n                $errOut = $($asset = & { az rest --method get `\n                    --url \"$($ns.id)/assets/$($dAsset.name)?api-version=2025-10-01\" `\n                    --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\n                if ($asset -and $asset.id) {\n                    Write-Host \"Asset $($asset.name) exists with version $($asset.properties.version)...\" `\n                        -ForegroundColor Cyan\n                    if ($asset.properties.version -ne $dAsset.properties.version) {\n                        Write-Host \"Discovered Asset $($dAsset.name) has a different version $($dAsset.properties.version).\" `\n                            -ForegroundColor Yellow\n                        $needsSync = $true\n                    }\n                    elseif (-not $script:Force.IsPresent) {\n                        Write-Host \"Asset $($asset.name) is up to date.\" -ForegroundColor Green\n                        $onboardComplete = $true\n                        continue\n                    }\n                }\n\n                $displayName = $dAsset.properties.displayName\n                if (!$displayName) {\n                    $displayName = $dAsset.properties.model\n                }\n                Remove-PropertyRecursively -Object $dAsset.properties -PropertyName \"lastUpdatedOn\"\n                $body = @{\n                    extendedLocation = $dAsset.extendedLocation\n                    location = $dAsset.location\n                    properties = @{\n                        externalAssetId = $dAsset.properties.externalAssetId\n                        enabled = $true\n                        displayName = $displayName\n                        description = $dAsset.properties.description\n                        manufacturer = $dAsset.properties.manufacturer\n                        model = $dAsset.properties.model\n                        productCode = $dAsset.properties.productCode\n                        hardwareRevision = $dAsset.properties.hardwareRevision\n                        softwareRevision = $dAsset.properties.softwareRevision\n                        documentationUri = $dAsset.properties.documentationUri\n                        serialNumber = $dAsset.properties.serialNumber\n                        defaultDatasetsDestinations = `\n                            $dAsset.properties.defaultDatasetsDestinations\n                        defaultEventsDestinations = `\n                            $dAsset.properties.defaultEventsDestinations\n                        defaultStreamsDestinations = `\n                            $dAsset.properties.defaultStreamsDestinations\n                        defaultDatasetsConfiguration = `\n                            $dAsset.properties.defaultDatasetsConfiguration\n                        defaultEventsConfiguration = `\n                            $dAsset.properties.defaultEventsConfiguration\n                        defaultStreamsConfiguration = `\n                            $dAsset.properties.defaultStreamsConfiguration\n                        defaultManagementGroupsConfiguration = `\n                            $dAsset.properties.defaultManagementGroupsConfiguration\n                        # .... add more properties as needed\n                        deviceRef = $dAsset.properties.deviceRef\n                        discoveredAssetRefs = @($dAsset.name)\n                        assetTypeRefs = [array]$dAsset.properties.assetTypeRefs\n                        datasets = [array]$dAsset.properties.datasets\n                        eventGroups = [array]$dAsset.properties.eventGroups\n                        streams = [array]$dAsset.properties.streams\n                        managementGroups = [array]$dAsset.properties.managementGroups\n                    }\n                } | ConvertTo-Json -Depth 100\n                #$body | Out-Host\n                $body | Out-File -FilePath $tempFile -Encoding utf8 -Force\n                Write-Host \"Create or update asset $($dAsset.name)...\" -ForegroundColor Cyan\n                $errOut = $($asset = & { az rest --method put `\n                    --url \"$($ns.id)/assets/$($dAsset.name)?api-version=2025-10-01\" `\n                    --headers \"Content-Type=application/json\" `\n                    --body @$tempFile } | ConvertFrom-Json) 2>&1\n                if (!$asset.id) {\n                    Write-Host \"Error onboarding asset $($dAsset.name): $($errOut)\" `\n                        -ForegroundColor Red\n                } else {\n                    Write-Host \"Asset $($asset.name) created or updated successfully.\" `\n                        -ForegroundColor Green\n                    $onboardComplete = $true\n                }\n            }\n        }\n        else {\n            Write-Host \"No discovered assets found.\" -ForegroundColor Yellow\n        }\n        if ($script:RunOnce.IsPresent -and $onboardComplete -and -not $needsSync) {\n            break\n        }\n        if ($needsSync) {\n            continue\n        }\n        Start-Sleep -Seconds 60\n    }\n    Remove-Item -Path $tempFile -Force\n}\nelse {\n    Write-Host \"Invalid action $($script:Action).\" -ForegroundColor Red\n    exit -1\n}\n"
  },
  {
    "path": "deploy/kubernetes/iotops/enable-preview.ps1",
    "content": "\n<#\nThis script enables the Azure IoT Operations Private Preview feature and installs \nthe necessary extension.\nIt requires the Azure CLI and the Azure IoT Operations extension to be installed.\n#>\nparam (\n    [string] $SubscriptionId\n)\n\naz feature register --name PrivatePreview2509 --namespace Microsoft.IoTOperations `\n    --subscription $SubscriptionId `\n    --only-show-errors\n\nWrite-Host \"Azure IoT Operations Private Preview enabled.\" -ForegroundColor Green\nWrite-Host \"You must use '--ops-extension preview' parameter for ./cluster.setup.ps1 script\" `\n    -ForegroundColor Yellow\nWrite-Host \"Otherwise this script must be run again.\" -ForegroundColor Yellow"
  },
  {
    "path": "deploy/kubernetes/iotops/opc-publisher-connector-metadata.json",
    "content": "{\n    \"$schema\": \"https://raw.githubusercontent.com/Azure/iot-operations-sdks/refs/heads/main/doc/akri_connector/connector-metadata-schema.json\",\n    \"name\": \"OpcPublisher\",\n    \"description\": \"OPC Publisher Connector\",\n    \"version\": \"2.9.0\",\n    \"maintainer\": \"iiotadmin@microsoft.com\",\n    \"vendor\": \"Microsoft\",\n    \"imageConfigurationSettings\": {\n        \"imageName\": \"mcr.microsoft.com/iotedge/opc-publisher\",\n        \"tag\": \"latest\"\n    },\n    \"supportedArchitectures\": [\n        \"linux/amd64\",\n        \"linux/arm64\",\n        \"linux/arm/v7\"\n    ],\n    \"sourceCode\": {\n        \"language\": \".NET\",\n        \"languageVersion\": \".NET 9.0\",\n        \"sdks\": {\n            \"connectorPackageVersion\": \"0.13.0-preview\"\n        }\n    },\n    \"aioMetadata\": {\n        \"aioMinVersion\": \"1.2.*\",\n        \"aioMaxVersion\": \"1.*.*\"\n    },\n    \"inboundEndpoints\": [\n        {\n            \"endpointType\": \"Microsoft.OpcPublisher\",\n            \"description\": \"Connect to an OPC UA server and publish data to Azure.\",\n            \"supportedAuthenticationTypes\": [\n                \"anonymous\",\n                \"usernamePassword\"\n            ],\n            \"assetsEnabledByDefault\": true,\n            \"version\": \"2.9\",\n            \"fields\": {\n                \"address\": {\n                    \"input\": \"required\",\n                    \"type\": \"string\",\n                    \"description\": \"The endpoint URL of the OPC UA server to connect to.\",\n                    \"regex\":\n                    [\n                         \"^opc.(tcp|http|https)://.+$\"\n                    ],\n                    \"exampleValue\": \"opc.tcp://localhost:4840\"\n                }\n            },\n            \"additionalConfigurationSchema\": {\n                \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n                \"title\": \"DeviceEndpointModel\",\n                \"description\": \"Configuration model for OPC UA endpoint security and connection settings.\",\n                \"type\": \"object\",\n                \"properties\": {\n                    \"EndpointSecurityPolicy\": {\n                        \"type\": \"string\",\n                        \"minLength\": 1,\n                        \"maxLength\": 512,\n                        \"examples\": [\n                            \"Basic256Sha256\",\n                            \"Aes256_Sha256_RsaPss\",\n                            \"http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256\"\n                        ],\n                        \"description\": \"The security policy URI to use for the endpoint connection. Defines the encryption and signing algorithms used for communication.\",\n                        \"errorMessage\": {\n                            \"type\": \"Must be a string or null\",\n                            \"minLength\": \"Security policy cannot be empty\",\n                            \"maxLength\": \"Security policy cannot exceed 512 characters\"\n                        }\n                    },\n                    \"EndpointSecurityMode\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                            \"None\",\n                            \"Sign\",\n                            \"SignAndEncrypt\"\n                        ],\n                        \"default\": \"SignAndEncrypt\",\n                        \"examples\": [\n                            \"None\",\n                            \"Sign\",\n                            \"SignAndEncrypt\"\n                        ],\n                        \"description\": \"The security mode to use for the endpoint. None (no security), Sign (messages signed), or SignAndEncrypt (messages signed and encrypted).\",\n                        \"errorMessage\": {\n                            \"enum\": \"Must be one of: None, Sign, SignAndEncrypt\"\n                        }\n                    },\n                    \"UseReverseConnect\": {\n                        \"type\": \"boolean\",\n                        \"default\": false,\n                        \"examples\": [\n                            true,\n                            false\n                        ],\n                        \"description\": \"Use reverse connect to connect to the endpoint. Enable when the server needs to initiate the connection to the client.\",\n                        \"errorMessage\": {\n                            \"type\": \"Must be a boolean or omitted\"\n                        }\n                    },\n                    \"RunAssetDiscovery\": {\n                        \"type\": \"boolean\",\n                        \"default\": false,\n                        \"examples\": [\n                            true,\n                            false\n                        ],\n                        \"description\": \"Runs asset discovery on the endpoint. Enable to automatically discover and catalog available assets.\",\n                        \"errorMessage\": {\n                            \"type\": \"Must be a boolean or omitted\"\n                        }\n                    },\n                    \"AssetTypes\": {\n                        \"type\": \"array\",\n                        \"items\": {\n                            \"type\": \"string\",\n                            \"minLength\": 1,\n                            \"maxLength\": 256\n                        },\n                        \"uniqueItems\": true,\n                        \"examples\": [\n                            [\n                                \"ns=1;s=PumpType\",\n                                \"nsu=https://opcfoundation.org/UA;i=2345\"\n                            ]\n                        ],\n                        \"description\": \"List of asset types to discover when RunAssetDiscovery is enabled. Each type must be unique.\",\n                        \"errorMessage\": {\n                            \"uniqueItems\": \"Asset types must be unique\",\n                            \"items\": {\n                                \"minLength\": \"Asset type name cannot be empty\",\n                                \"maxLength\": \"Asset type name cannot exceed 256 characters\"\n                            }\n                        }\n                    },\n                    \"DumpConnectionDiagnostics\": {\n                        \"type\": \"boolean\",\n                        \"default\": false,\n                        \"examples\": [\n                            true,\n                            false\n                        ],\n                        \"description\": \"Enables detailed server diagnostics logging for the connection. Enable for troubleshooting connection issues.\",\n                        \"errorMessage\": {\n                            \"type\": \"Must be a boolean or omitted\"\n                        }\n                    }\n                },\n                \"additionalProperties\": false,\n                \"dependencies\": {\n                    \"AssetTypes\": [\n                        \"RunAssetDiscovery\"\n                    ]\n                }\n            },\n            \"datasets\": {\n                \"limits\": {\n                    \"minimum\": 0\n                },\n                \"fields\": {\n                    \"dataSource\": {\n                        \"input\": \"required\"\n                    },\n                    \"typeRef\": {\n                        \"input\": \"optional\"\n                    }\n                },\n                \"destinations\": {\n                    \"supportedDestinations\": [\n                        \"Mqtt\",\n                        \"BrokerStateStore\"\n                    ],\n                    \"defaultDestination\": {\n                        \"destination\": \"Mqtt\",\n                        \"topic\": \"{PublisherId}/{WriterGroupName}/{DataSetWriterName}\",\n                        \"qos\": 1,\n                        \"ttl\": 0,\n                        \"retain\": \"never\"\n                    }\n                },\n                \"datasetConfigurationSchema\": {\n                    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n                    \"title\": \"DataSetEventModel\",\n                    \"description\": \"Dataset and event default and resource additional configuration model. Inherits all properties from PublishedNodesEntryModel and adds mapped properties for samplingInterval, publishingInterval, keyFrameCount, and StartInstance.\",\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"publishingInterval\": {\n                            \"type\": \"integer\",\n                            \"minimum\": 0,\n                            \"maximum\": 4294967295,\n                            \"examples\": [\n                                100,\n                                1000,\n                                5000\n                            ],\n                            \"description\": \"The publishing interval in milliseconds for this dataset writer. Controls how frequently data is published.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be an integer in milliseconds or omitted\",\n                                \"minimum\": \"Must be non-negative\",\n                                \"maximum\": \"Must not exceed maximum supported interval (4294967295ms)\"\n                            }\n                        },\n                        \"samplingInterval\": {\n                            \"type\": \"integer\",\n                            \"minimum\": 0,\n                            \"maximum\": 4294967295,\n                            \"examples\": [\n                                100,\n                                500,\n                                1000\n                            ],\n                            \"description\": \"Default sampling interval in milliseconds for all data points in the dataset. Controls how frequently data is read from nodes.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be an integer in milliseconds or omitted\",\n                                \"minimum\": \"Must be non-negative\",\n                                \"maximum\": \"Must not exceed maximum supported interval (4294967295ms)\"\n                            }\n                        },\n                        \"MessageEncoding\": {\n                            \"type\": \"string\",\n                            \"enum\": [\n                                \"Json\",\n                                \"Avro\"\n                            ],\n                            \"default\": \"Json\",\n                            \"examples\": [\n                                \"Json\",\n                                \"Avro\"\n                            ],\n                            \"description\": \"The encoding format to use for messages. Json (human-readable), Avro (raw format).\",\n                            \"errorMessage\": {\n                                \"enum\": \"Must be one of: Json, Uadp, Binary\"\n                            }\n                        },\n                        \"keyFrameCount\": {\n                            \"type\": \"integer\",\n                            \"minimum\": 1,\n                            \"maximum\": 1000,\n                            \"examples\": [\n                                1,\n                                10,\n                                100\n                            ],\n                            \"description\": \"Controls key frame insertion frequency in the message stream. Higher values reduce bandwidth but increase latency for new subscribers.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be an integer or omitted\",\n                                \"minimum\": \"Must be at least 1\",\n                                \"maximum\": \"Must not exceed 1000\"\n                            }\n                        },\n                        \"Priority\": {\n                            \"type\": \"integer\",\n                            \"minimum\": 0,\n                            \"maximum\": 255,\n                            \"examples\": [\n                                0,\n                                100,\n                                255\n                            ],\n                            \"description\": \"Priority of the writer subscription (0-255). Higher values indicate higher priority for resource allocation and processing.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be an integer or omitted\",\n                                \"minimum\": \"Must be non-negative\",\n                                \"maximum\": \"Must not exceed 255\"\n                            }\n                        },\n                        \"DataSetClassId\": {\n                            \"type\": \"string\",\n                            \"format\": \"uuid\",\n                            \"description\": \"The optional dataset class id as it shall appear in dataset messages and dataset metadata.\"\n                        },\n                        \"DataSetDescription\": {\n                            \"type\": \"string\",\n                            \"description\": \"The optional description of the dataset.\"\n                        },\n                        \"DataSetExtensionFields\": {\n                            \"type\": \"object\",\n                            \"description\": \"Optional key-value pairs inserted into key frame and metadata messages in the same data set.\",\n                            \"additionalProperties\": true\n                        },\n                        \"DefaultHeartbeatInterval\": {\n                            \"type\": \"integer\",\n                            \"minimum\": 0,\n                            \"maximum\": 4294967295,\n                            \"examples\": [\n                                60000,\n                                300000\n                            ],\n                            \"description\": \"The interval in milliseconds at which to publish heartbeat messages.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be an integer in milliseconds or omitted\",\n                                \"minimum\": \"Must be non-negative\",\n                                \"maximum\": \"Must not exceed maximum supported interval (4294967295ms)\"\n                            }\n                        },\n                        \"DefaultHeartbeatBehavior\": {\n                            \"type\": \"string\",\n                            \"enum\": [\n                                \"WatchChange\",\n                                \"Periodically\",\n                                \"None\"\n                            ],\n                            \"default\": \"WatchChange\",\n                            \"examples\": [\n                                \"WatchChange\",\n                                \"Periodically\",\n                                \"None\"\n                            ],\n                            \"description\": \"Configures how heartbeat messages are handled for all nodes. WatchChange (on value changes), Periodically (fixed intervals), or None (disabled).\",\n                            \"errorMessage\": {\n                                \"enum\": \"Must be one of: WatchChange, Periodically, None\"\n                            }\n                        },\n                        \"SendKeepAliveDataSetMessages\": {\n                            \"type\": \"boolean\",\n                            \"default\": false,\n                            \"examples\": [\n                                true,\n                                false\n                            ],\n                            \"description\": \"Controls whether to send keep alive messages for this dataset. Enable to maintain connection health monitoring.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be a boolean value\"\n                            }\n                        },\n                        \"MaxKeepAliveCount\": {\n                            \"type\": \"integer\",\n                            \"minimum\": 0,\n                            \"maximum\": 1000,\n                            \"examples\": [\n                                3,\n                                10,\n                                20\n                            ],\n                            \"description\": \"Defines how many publishing timer expirations to wait before sending a keep-alive message. Larger values reduce traffic but increase detection time.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be an integer or omitted\",\n                                \"minimum\": \"Must be non-negative\",\n                                \"maximum\": \"Must not exceed 1000\"\n                            }\n                        },\n                        \"DataSetWriterWatchdogBehavior\": {\n                            \"type\": \"string\",\n                            \"enum\": [\n                                \"Restart\",\n                                \"Halt\",\n                                \"Continue\"\n                            ],\n                            \"default\": \"Restart\",\n                            \"examples\": [\n                                \"Restart\",\n                                \"Halt\",\n                                \"Continue\"\n                            ],\n                            \"description\": \"Defines what action to take when the watchdog timer triggers. Restart (reinitialize writer), Halt (stop publishing), or Continue (keep running).\",\n                            \"errorMessage\": {\n                                \"enum\": \"Must be one of: Restart, Halt, Continue\"\n                            }\n                        },\n                        \"OpcNodeWatchdogCondition\": {\n                            \"type\": \"string\",\n                            \"enum\": [\n                                \"NoData\",\n                                \"Error\",\n                                \"Any\"\n                            ],\n                            \"default\": \"NoData\",\n                            \"examples\": [\n                                \"NoData\",\n                                \"Error\",\n                                \"Any\"\n                            ],\n                            \"description\": \"Specifies the condition that triggers the watchdog behavior. NoData (no updates received), Error (error occurs), or Any (either condition).\",\n                            \"errorMessage\": {\n                                \"enum\": \"Must be one of: NoData, Error, Any\"\n                            }\n                        },\n                        \"DisableSubscriptionTransfer\": {\n                            \"type\": \"boolean\",\n                            \"default\": false,\n                            \"examples\": [\n                                true,\n                                false\n                            ],\n                            \"description\": \"Controls whether subscription transfer is disabled during reconnect. Enable to prevent subscription state transfer.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be a boolean or omitted\"\n                            }\n                        },\n                        \"RepublishAfterTransfer\": {\n                            \"type\": \"boolean\",\n                            \"default\": true,\n                            \"examples\": [\n                                true,\n                                false\n                            ],\n                            \"description\": \"Controls whether to republish missed values after a subscription is transferred during reconnect handling. Enable to ensure data consistency.\",\n                            \"errorMessage\": {\n                                \"type\": \"Must be a boolean or omitted\"\n                            }\n                        }\n                    },\n                    \"additionalProperties\": true\n                },\n                \"alternativeTypeName\": {\n                    \"singular\": \"DataSet\",\n                    \"plural\": \"DataSets\"\n                },\n                \"dataPoints\": {\n                    \"limits\": {\n                        \"minimum\": 1\n                    },\n                    \"fields\": {\n                        \"dataSource\": {\n                            \"input\": \"required\"\n                        },\n                        \"typeRef\": {\n                            \"input\": \"optional\"\n                        }\n                    },\n                    \"dataPointConfigurationSchema\": {\n                        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n                        \"title\": \"Data Set Data point configuration\",\n                        \"description\": \"Data point additional configuration model.\",\n                        \"type\": \"object\",\n                        \"properties\": {\n                            \"SamplingInterval\": {\n                                \"type\": \"integer\",\n                                \"minimum\": 0,\n                                \"maximum\": 4294967295,\n                                \"examples\": [\n                                    100,\n                                    1000,\n                                    5000\n                                ],\n                                \"description\": \"Server-side sampling rate in milliseconds. The value 0 means use the fastest practical rate.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be an integer in milliseconds or omitted\",\n                                    \"minimum\": \"Must be non-negative\",\n                                    \"maximum\": \"Must not exceed maximum supported interval (4294967295ms)\"\n                                }\n                            },\n                            \"AttributeId\": {\n                                \"type\": \"string\",\n                                \"enum\": [\n                                    \"Value\",\n                                    \"DataType\",\n                                    \"AccessLevel\",\n                                    \"ArrayDimensions\",\n                                    \"BrowseName\",\n                                    \"DisplayName\",\n                                    \"Description\",\n                                    \"WriteMask\",\n                                    \"UserWriteMask\",\n                                    \"IsAbstract\",\n                                    \"Symmetric\",\n                                    \"InverseName\"\n                                ],\n                                \"default\": \"Value\",\n                                \"examples\": [\n                                    \"Value\",\n                                    \"DataType\",\n                                    \"DisplayName\"\n                                ],\n                                \"description\": \"The OPC UA attribute to monitor on the node. Specifies which characteristic of the node to monitor.\",\n                                \"errorMessage\": {\n                                    \"enum\": \"Must be a valid OPC UA attribute identifier\"\n                                }\n                            },\n                            \"DataChangeTrigger\": {\n                                \"type\": \"string\",\n                                \"enum\": [\n                                    \"Status\",\n                                    \"StatusValue\",\n                                    \"StatusValueTimestamp\"\n                                ],\n                                \"default\": \"StatusValue\",\n                                \"examples\": [\n                                    \"Status\",\n                                    \"StatusValue\",\n                                    \"StatusValueTimestamp\"\n                                ],\n                                \"description\": \"Specifies what triggers value change notifications: Status (only status changes), StatusValue (status or value changes), or StatusValueTimestamp (status, value, or timestamp changes).\",\n                                \"errorMessage\": {\n                                    \"enum\": \"Must be one of: Status, StatusValue, StatusValueTimestamp\"\n                                }\n                            },\n                            \"QueueSize\": {\n                                \"type\": \"integer\",\n                                \"minimum\": 1,\n                                \"maximum\": 65536,\n                                \"examples\": [\n                                    1,\n                                    100,\n                                    1000\n                                ],\n                                \"description\": \"Size of the server-side queue for this monitored item. Larger queues consume more memory but provide better buffering.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be an integer or omitted\",\n                                    \"minimum\": \"Must be at least 1\",\n                                    \"maximum\": \"Must not exceed maximum queue size (65536)\"\n                                }\n                            },\n                            \"DeadbandType\": {\n                                \"type\": \"string\",\n                                \"enum\": [\n                                    \"None\",\n                                    \"Absolute\",\n                                    \"Percent\"\n                                ],\n                                \"default\": \"None\",\n                                \"examples\": [\n                                    \"None\",\n                                    \"Absolute\",\n                                    \"Percent\"\n                                ],\n                                \"description\": \"Deadband type of the data change filter to apply. None (no filtering), Absolute (absolute value change), or Percent (percentage value change).\",\n                                \"errorMessage\": {\n                                    \"enum\": \"Must be one of: None, Absolute, Percent\"\n                                }\n                            },\n                            \"DeadbandValue\": {\n                                \"type\": [\n                                    \"number\",\n                                    \"null\"\n                                ],\n                                \"minimum\": 0,\n                                \"examples\": [\n                                    0.1,\n                                    1.0,\n                                    5.0\n                                ],\n                                \"description\": \"Deadband value of the data change filter to apply. For Absolute type, this is the absolute change required. For Percent type, this is the percentage change required (0-100).\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be a number or omitted\",\n                                    \"minimum\": \"Must be non-negative\"\n                                }\n                            },\n                            \"DiscardNew\": {\n                                \"type\": \"boolean\",\n                                \"default\": false,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Controls queue overflow behavior for monitored items. If true, new values are discarded when queue is full. If false, oldest values are discarded.\"\n                            },\n                            \"RegisterNode\": {\n                                \"type\": \"boolean\",\n                                \"default\": false,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Optimize node access using RegisterNodes service. Improves performance for frequently accessed nodes but consumes server resources.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be a boolean or omitted\"\n                                }\n                            },\n                            \"UseCyclicRead\": {\n                                \"type\": \"boolean\",\n                                \"default\": false,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Use periodic reads instead of monitored items. Enable for nodes that don't support subscriptions or for specific polling requirements. Required to be true when using CyclicReadMaxAge.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be a boolean or omitted\"\n                                }\n                            },\n                            \"CyclicReadMaxAge\": {\n                                \"type\": \"integer\",\n                                \"minimum\": 0,\n                                \"maximum\": 4294967295,\n                                \"examples\": [\n                                    1000,\n                                    5000,\n                                    60000\n                                ],\n                                \"description\": \"Maximum age for cached values in cyclic reads (milliseconds). Values older than this are considered stale and will trigger a new read. Only used when UseCyclicRead is true.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be an integer in milliseconds or omitted\",\n                                    \"minimum\": \"Must be non-negative\",\n                                    \"maximum\": \"Must not exceed maximum supported age (4294967295ms)\",\n                                    \"dependencies\": \"Requires UseCyclicRead to be true\"\n                                }\n                            },\n                            \"HeartbeatInterval\": {\n                                \"type\": \"integer\",\n                                \"minimum\": 0,\n                                \"maximum\": 4294967295,\n                                \"examples\": [\n                                    60000,\n                                    300000\n                                ],\n                                \"description\": \"Node-specific heartbeat interval in milliseconds.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be an integer in milliseconds or omitted\",\n                                    \"minimum\": \"Must be non-negative\",\n                                    \"maximum\": \"Must not exceed maximum supported interval (4294967295ms)\"\n                                }\n                            },\n                            \"HeartbeatBehavior\": {\n                                \"type\": \"string\",\n                                \"enum\": [\n                                    \"WatchChange\",\n                                    \"Periodically\",\n                                    \"None\"\n                                ],\n                                \"default\": \"WatchChange\",\n                                \"examples\": [\n                                    \"WatchChange\",\n                                    \"Periodically\",\n                                    \"None\"\n                                ],\n                                \"description\": \"Controls heartbeat message generation for this node: WatchChange (on value changes), Periodically (at fixed intervals), or None (disabled).\",\n                                \"errorMessage\": {\n                                    \"enum\": \"Must be one of: WatchChange, Periodically, None\"\n                                }\n                            },\n                            \"SkipFirst\": {\n                                \"type\": \"boolean\",\n                                \"default\": false,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Controls handling of initial value notification. If true, skips the first value after subscription creation to avoid initial value spikes.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be a boolean or omitted\"\n                                }\n                            },\n                            \"IndexRange\": {\n                                \"type\": \"string\",\n                                \"pattern\": \"^\\\\d+(:?\\\\d+)?$\",\n                                \"examples\": [\n                                    \"0\",\n                                    \"1:3\",\n                                    \"2:5\"\n                                ],\n                                \"description\": \"Range specification for array or string values. Use single index (e.g., '1') or range (e.g., '1:3'). First element is at index 0.\",\n                                \"errorMessage\": {\n                                    \"pattern\": \"Must be a single index or range in format 'start:end'\"\n                                }\n                            }\n                        },\n                        \"required\": [],\n                        \"additionalProperties\": true,\n                        \"dependencies\": {\n                            \"CyclicReadMaxAge\": {\n                                \"properties\": {\n                                    \"UseCyclicRead\": {\n                                        \"enum\": [\n                                            true\n                                        ]\n                                    }\n                                },\n                                \"required\": [\n                                    \"UseCyclicRead\"\n                                ]\n                            }\n                        }\n                    },\n                    \"alternativeTypeName\": {\n                        \"singular\": \"NodeId\",\n                        \"plural\": \"NodeIds\"\n                    }\n                }\n            },\n            \"eventGroups\": {\n                \"limits\": {\n                    \"minimum\": 0\n                },\n                \"fields\": {\n                    \"dataSource\": {\n                        \"input\": \"optional\"\n                    },\n                    \"typeRef\": {\n                        \"input\": \"optional\"\n                    }\n                },\n                \"alternativeTypeName\": {\n                    \"singular\": \"EventGroup\",\n                    \"plural\": \"EventGroups\"\n                },\n                \"eventGroupConfigurationSchema\": {\n                    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n                    \"title\": \"Event group configuration\",\n                    \"description\": \"Event group additional configuration model.\",\n                    \"type\": \"object\",\n                    \"properties\": {}\n                },\n                \"events\": {\n                    \"limits\": {\n                        \"minimum\": 0\n                    },\n                    \"fields\": {\n                        \"dataSource\": {\n                            \"input\": \"required\"\n                        },\n                        \"typeRef\": {\n                            \"input\": \"optional\"\n                        }\n                    },\n                    \"destinations\": {\n                        \"supportedDestinations\": [\n                            \"Mqtt\"\n                        ],\n                        \"defaultDestination\": {\n                            \"destination\": \"Mqtt\",\n                            \"topic\": \"{PublisherId}/{WriterGroupName}/{EventGroupName}\",\n                            \"qos\": 1,\n                            \"ttl\": 0,\n                            \"retain\": \"never\"\n                        }\n                    },\n                    \"eventConfigurationSchema\": {\n                        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n                        \"title\": \"Event configuration model\",\n                        \"description\": \"Event resource additional configuration model.\",\n                        \"type\": \"object\",\n                        \"properties\": {\n                            \"QueueSize\": {\n                                \"type\": \"integer\",\n                                \"minimum\": 1,\n                                \"maximum\": 65536,\n                                \"examples\": [\n                                    1,\n                                    100,\n                                    1000\n                                ],\n                                \"description\": \"Size of the server-side queue for this monitored item. Larger queues consume more memory but provide better buffering.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be an integer or omitted\",\n                                    \"minimum\": \"Must be at least 1\",\n                                    \"maximum\": \"Must not exceed maximum queue size (65536)\"\n                                }\n                            },\n                            \"PublishingInterval\": {\n                                \"type\": \"integer\",\n                                \"minimum\": 0,\n                                \"maximum\": 4294967295,\n                                \"examples\": [\n                                    100,\n                                    1000,\n                                    5000\n                                ],\n                                \"description\": \"The publishing interval in milliseconds for this dataset writer. Controls how frequently data is published.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be an integer in milliseconds or omitted\",\n                                    \"minimum\": \"Must be non-negative\",\n                                    \"maximum\": \"Must not exceed maximum supported interval (4294967295ms)\"\n                                }\n                            },\n                            \"DiscardNew\": {\n                                \"type\": \"boolean\",\n                                \"default\": false,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Controls queue overflow behavior for monitored items. If true, new values are discarded when queue is full. If false, oldest values are discarded.\"\n                            },\n                            \"EventFilter\": {\n                                \"$ref\": \"#/definitions/EventFilterModel\",\n                                \"description\": \"Event Filter to apply. When specified the node is assumed to be an event notifier node to subscribe to.\"\n                            },\n                            \"ConditionHandling\": {\n                                \"$ref\": \"#/definitions/ConditionHandlingOptionsModel\",\n                                \"description\": \"Settings for pending condition handling.\"\n                            },\n                            \"SkipFirst\": {\n                                \"type\": \"boolean\",\n                                \"default\": false,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Controls handling of initial value notification. If true, skips the first value after subscription creation to avoid initial value spikes.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be a boolean or omitted\"\n                                }\n                            },\n                            \"MessageEncoding\": {\n                                \"type\": \"string\",\n                                \"enum\": [\n                                    \"Json\",\n                                    \"Avro\"\n                                ],\n                                \"default\": \"Json\",\n                                \"examples\": [\n                                    \"Json\",\n                                    \"Avro\"\n                                ],\n                                \"description\": \"The encoding format to use for messages. Json (human-readable), Avro (raw format).\",\n                                \"errorMessage\": {\n                                    \"enum\": \"Must be one of: Json, Uadp, Binary\"\n                                }\n                            },\n                            \"Priority\": {\n                                \"type\": \"integer\",\n                                \"minimum\": 0,\n                                \"maximum\": 255,\n                                \"examples\": [\n                                    0,\n                                    100,\n                                    255\n                                ],\n                                \"description\": \"Priority of the writer subscription (0-255). Higher values indicate higher priority for resource allocation and processing.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be an integer or omitted\",\n                                    \"minimum\": \"Must be non-negative\",\n                                    \"maximum\": \"Must not exceed 255\"\n                                }\n                            },\n                            \"DataSetClassId\": {\n                                \"type\": \"string\",\n                                \"format\": \"uuid\",\n                                \"description\": \"The optional dataset class id as it shall appear in dataset messages and dataset metadata.\"\n                            },\n                            \"DataSetDescription\": {\n                                \"type\": \"string\",\n                                \"description\": \"The optional description of the dataset.\"\n                            },\n                            \"SendKeepAliveDataSetMessages\": {\n                                \"type\": \"boolean\",\n                                \"default\": false,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Controls whether to send keep alive messages for this dataset. Enable to maintain connection health monitoring.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be a boolean value\"\n                                }\n                            },\n                            \"MaxKeepAliveCount\": {\n                                \"type\": \"integer\",\n                                \"minimum\": 0,\n                                \"maximum\": 1000,\n                                \"examples\": [\n                                    3,\n                                    10,\n                                    20\n                                ],\n                                \"description\": \"Defines how many publishing timer expirations to wait before sending a keep-alive message. Larger values reduce traffic but increase detection time.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be an integer or omitted\",\n                                    \"minimum\": \"Must be non-negative\",\n                                    \"maximum\": \"Must not exceed 1000\"\n                                }\n                            },\n                            \"DataSetWriterWatchdogBehavior\": {\n                                \"type\": \"string\",\n                                \"enum\": [\n                                    \"Restart\",\n                                    \"Halt\",\n                                    \"Continue\"\n                                ],\n                                \"default\": \"Restart\",\n                                \"examples\": [\n                                    \"Restart\",\n                                    \"Halt\",\n                                    \"Continue\"\n                                ],\n                                \"description\": \"Defines what action to take when the watchdog timer triggers. Restart (reinitialize writer), Halt (stop publishing), or Continue (keep running).\",\n                                \"errorMessage\": {\n                                    \"enum\": \"Must be one of: Restart, Halt, Continue\"\n                                }\n                            },\n                            \"OpcNodeWatchdogCondition\": {\n                                \"type\": \"string\",\n                                \"enum\": [\n                                    \"NoData\",\n                                    \"Error\",\n                                    \"Any\"\n                                ],\n                                \"default\": \"NoData\",\n                                \"examples\": [\n                                    \"NoData\",\n                                    \"Error\",\n                                    \"Any\"\n                                ],\n                                \"description\": \"Specifies the condition that triggers the watchdog behavior. NoData (no updates received), Error (error occurs), or Any (either condition).\",\n                                \"errorMessage\": {\n                                    \"enum\": \"Must be one of: NoData, Error, Any\"\n                                }\n                            },\n                            \"DisableSubscriptionTransfer\": {\n                                \"type\": \"boolean\",\n                                \"default\": false,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Controls whether subscription transfer is disabled during reconnect. Enable to prevent subscription state transfer.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be a boolean or omitted\"\n                                }\n                            },\n                            \"RepublishAfterTransfer\": {\n                                \"type\": \"boolean\",\n                                \"default\": true,\n                                \"examples\": [\n                                    true,\n                                    false\n                                ],\n                                \"description\": \"Controls whether to republish missed values after a subscription is transferred during reconnect handling. Enable to ensure data consistency.\",\n                                \"errorMessage\": {\n                                    \"type\": \"Must be a boolean or omitted\"\n                                }\n                            }\n                        },\n                        \"additionalProperties\": true,\n                        \"definitions\": {\n                            \"EventFilterModel\": {\n                                \"type\": \"object\",\n                                \"description\": \"Event filter for OPC UA event monitoring.\",\n                                \"properties\": {\n                                    \"whereClause\": {\n                                        \"$ref\": \"#/definitions/ContentFilterModel\",\n                                        \"description\": \"Where clause for event filtering.\"\n                                    },\n                                    \"typeDefinitionId\": {\n                                        \"type\": \"string\",\n                                        \"description\": \"Simple event Type definition node id.\"\n                                    }\n                                },\n                                \"additionalProperties\": false\n                            },\n                            \"ContentFilterModel\": {\n                                \"type\": \"object\",\n                                \"description\": \"Content filter for event filtering (structure not detailed in provided context).\",\n                                \"properties\": {},\n                                \"additionalProperties\": true\n                            },\n                            \"ConditionHandlingOptionsModel\": {\n                                \"type\": \"object\",\n                                \"description\": \"Condition handling options\",\n                                \"properties\": {\n                                    \"updateInterval\": {\n                                        \"type\": \"integer\",\n                                        \"minimum\": 0,\n                                        \"description\": \"Time interval for sending pending interval updates in seconds.\"\n                                    },\n                                    \"snapshotInterval\": {\n                                        \"type\": \"integer\",\n                                        \"minimum\": 0,\n                                        \"description\": \"Time interval for sending pending interval snapshot in seconds.\"\n                                    }\n                                },\n                                \"additionalProperties\": false\n                            }\n                        }\n                    },\n                    \"alternativeTypeName\": {\n                        \"singular\": \"Event\",\n                        \"plural\": \"Events\"\n                    }\n                }\n            },\n            \"managementGroups\": {\n                \"limits\": {\n                    \"minimum\": 0\n                },\n                \"fields\": {\n                    \"dataSource\": {\n                        \"input\": \"optional\"\n                    },\n                    \"typeRef\": {\n                        \"input\": \"optional\"\n                    }\n                },\n                \"managementGroupConfigurationSchema\": {\n                    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n                    \"title\": \"Service configuration\",\n                    \"description\": \"Service additional configuration model.\",\n                    \"type\": \"object\",\n                    \"properties\": {}\n                },\n                \"alternativeTypeName\": {\n                    \"singular\": \"Service\",\n                    \"plural\": \"Services\"\n                },\n                \"managementGroupActions\": {\n                    \"limits\": {\n                        \"minimum\": 0\n                    },\n                    \"fields\": {\n                        \"targetUri\": {\n                            \"input\": \"required\"\n                        },\n                        \"typeRef\": {\n                            \"input\": \"optional\"\n                        }\n                    },\n                    \"actionConfigurationSchema\": {\n                        \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n                        \"title\": \"Service call configuration model\",\n                        \"description\": \"Service call additional configuration model.\",\n                        \"type\": \"object\",\n                        \"properties\": {}\n                    },\n                    \"alternativeTypeName\": {\n                        \"singular\": \"Service Call\",\n                        \"plural\": \"Service Calls\"\n                    }\n                }\n            }\n        }\n    ],\n    \"inboundEndpointAlternativeTypeName\": {\n        \"singular\": \"OPC UA Server\",\n        \"plural\": \"OPC UA Servers\"\n    },\n    \"endpointsEnabledByDefault\": true,\n    \"isPreview\": true,\n    \"recommendedAllocationPolicy\": \"bucketized\",\n    \"recommendedReplicas\": 1,\n    \"connectorConfigurationKeys\": [\n        {\n            \"key\": \"UseFileChangePolling\",\n            \"description\": \"Poll for file changes instead of using a file system watcher.\\nUse this setting when the underlying file system does not support file system notifications such as in some docker container setups.\\nDefault: `false`\\n\"\n        },\n        {\n            \"key\": \"PublisherId\",\n            \"description\": \"Sets the publisher id of the publisher.\\nDefault: `not set` which results in the IoT edge identity being used \\n\"\n        },\n        {\n            \"key\": \"SiteId\",\n            \"description\": \"Sets the site name of the publisher module.\\nDefault: `not set` \\n\"\n        },\n        {\n            \"key\": \"ApiKey\",\n            \"description\": \"Sets the api key that must be used to authenticate calls on the publisher REST endpoint.\\nDefault: `not set` (Key will be generated if not available) \\n\"\n        },\n        {\n            \"key\": \"DisableOpenApiEndpoint\",\n            \"description\": \"Disable the OPC Publisher Open API endpoint exposed by the built-in HTTP server.\\nDefault: `false` (enabled).\\n\"\n        },\n        {\n            \"key\": \"UseStandardsCompliantEncoding\",\n            \"description\": \"Use strict OPC UA standard compliance. It is recommended to run the publisher in compliant mode for best interoperability.\\nBe aware that explicitly specifying other command line options can result in non-comnpliance despite this option being set.\\nDefault: `false` for backwards compatibility (2.5.x - 2.8.x)\\n\"\n        },\n        {\n            \"key\": \"DefaultNamespaceFormat\",\n            \"description\": \"The format to use when serializing node ids and qualified names containing a namespace uri into a string.\\nAllowed values:\\n    `Uri`\\n    `Index`\\n    `Expanded`\\n    `ExpandedWithNamespace0`\\nDefault: `Expanded` if `-c` is specified, otherwise `Uri` for backwards compatibility.\\n\"\n        },\n        {\n            \"key\": \"MessagingMode\",\n            \"description\": \"The messaging mode for messages\\nAllowed values:\\n    `PubSub`\\n    `Samples`\\n    `FullNetworkMessages`\\n    `FullSamples`\\n    `DataSetMessages`\\n    `SingleDataSetMessage`\\n    `DataSets`\\n    `SingleDataSet`\\n    `RawDataSets`\\n    `SingleRawDataSet`\\nDefault: `PubSub` if `-c` is specified, otherwise `Samples` for backwards compatibility.\\n\"\n        },\n        {\n            \"key\": \"WriteValueWhenDataSetHasSingleEntry\",\n            \"description\": \"When a data set has a single entry the encoder will write only the value of a data set entry and omit the key.\\nThis is not compliant with OPC UA Part 14.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"MessageEncoding\",\n            \"description\": \"The message encoding for messages\\nAllowed values:\\n    `Uadp`\\n    `Json`\\n    `Xml`\\n    `Avro`\\n    `IsReversible`\\n    `JsonReversible`\\n    `IsGzipCompressed`\\n    `JsonGzip`\\n    `AvroGzip`\\n    `JsonReversibleGzip`\\nDefault: `Json`.\\n\"\n        },\n        {\n            \"key\": \"BatchTriggerInterval\",\n            \"description\": \"The network message publishing interval in milliseconds. Determines the publishing period at which point messages are emitted.\\nWhen `--bs` (`BatchSize`) is 1 and `--bi` is set to 0 batching is disabled.\\nDefault: `10000` (10 seconds).\\nAlso can be set using `BatchTriggerInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`.\\n\"\n        },\n        {\n            \"key\": \"BatchSize\",\n            \"description\": \"The number of incoming OPC UA subscription notifications to collect until sending a network messages. When `--bs` (`BatchSize`) is set to 1 and `--bi` (`BatchTriggerInterval`) is 0 batching is disabled and messages are sent as soon as notifications arrive.\\nDefault: `50`.\\n\"\n        },\n        {\n            \"key\": \"RemoveDuplicatesFromBatch\",\n            \"description\": \"Use this option to remove values with the same node id from batch messages in legacy `Samples` mode. Sends only the latest value as per the value's source timestamp.\\nOnly applies to `Samples` mode, otherwise this setting is ignored.\\nDefault: `false` (keep all duplicate values).\\n\"\n        },\n        {\n            \"key\": \"MessageTimestamp\",\n            \"description\": \"The value to set as as the timestamp property of messages during encoding (if the encoding supports writing message timestamps).\\nAllowed values:\\n    `CurrentTimeUtc`\\n    `PublishTime`\\n    `EncodingTimeUtc`\\nDefault: `CurrentTimeUtc` to use the time when the message was created in OPC Publisher.\\n\"\n        },\n        {\n            \"key\": \"MaxNodesPerDataSet\",\n            \"description\": \"Maximum number of nodes within a Subscription. When there are more nodes configured for a data set writer, they will be added to new subscriptions. This also affects metadata message size. \\nDefault: `1000`.\\n\"\n        },\n        {\n            \"key\": \"DefaultKeyFrameCount\",\n            \"description\": \"The default number of delta messages to send until a key frame message is sent. If 0, no key frame messages are sent, if 1, every message will be a key frame. \\nDefault: `0`.\\n\"\n        },\n        {\n            \"key\": \"EnableDataSetKeepAlives\",\n            \"description\": \"Enables sending keep alive messages triggered by writer subscription's keep alive notifications. This setting can be used to enable the messaging profile's support for keep alive messages.\\nIf the chosen messaging profile does not support keep alive messages this setting is ignored.\\nDefault: `false` (to save bandwidth).\\n\"\n        },\n        {\n            \"key\": \"SendDataSetKeepAlivesAsKeyFrame\",\n            \"description\": \"When the sending of keep alive messages is enabled determines whether the empty keep alive message will be promoted to a key frame messages\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"DefaultMetaDataUpdateTime\",\n            \"description\": \"Default value in milliseconds for the metadata send interval which determines in which interval metadata is sent.\\nEven when disabled, metadata is still sent when the metadata version changes unless `--mm=*Samples` (`MessagingMode)=*Samples`) is set in which case this setting is ignored. Only valid for network message encodings. \\nDefault: `0` which means periodic sending of metadata is disabled.\\n\"\n        },\n        {\n            \"key\": \"DisableDataSetMetaData\",\n            \"description\": \"Disables sending any metadata when metadata version changes. This setting can be used to also override the messaging profile's default support for metadata sending.\\nIt is recommended to disable sending metadata when too many nodes are part of a data set as this can slow down start up time.\\nDefault: `False` if the messaging profile selected supports sending metadata and `--strict` (`UseStandardsCompliantEncoding`) is set but not '--dct' (`DisableComplexTypeSystem`), `True` otherwise.\\n\"\n        },\n        {\n            \"key\": \"AsyncMetaDataLoadTimeout\",\n            \"description\": \"The default duration in seconds a publish request should wait until the meta data is loaded.\\nLoaded metadata guarantees a metadata message is sent before the first message is sent but loading of metadata takes time during subscription setup. Set to `0` to block until metadata is loaded.\\nOnly used if meta data is supported and enabled.\\nDefault: `5000` milliseconds.\\n\"\n        },\n        {\n            \"key\": \"PreferAvroOverJsonSchema\",\n            \"description\": \"Publish Avro schema even for Json encoded messages. Automatically enables publishing schemas as if `--ps` was set.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"MaxNetworkMessageSendQueueSize\",\n            \"description\": \"The maximum number of messages to buffer on the send path before messages are dropped.\\nDefault: `4096`\\n\"\n        },\n        {\n            \"key\": \"DefaultWriterGroupPartitionCount\",\n            \"description\": \"The number of partitions to split the writer group into. Each partition represents a data flow to the transport sink. The partition is selected by topic hash.\\nDefault: `0` (partitioning is disabled)\\n\"\n        },\n        {\n            \"key\": \"HttpServerPort\",\n            \"description\": \"The port on which the http server of OPC Publisher is listening.\\nDefault: `9072` if no value is provided.\\n\"\n        },\n        {\n            \"key\": \"UnsecureHttpServerPort\",\n            \"description\": \"Allow unsecure access to the REST api of OPC Publisher. A port can be specified if the default port 9071 is not desired.\\nDo not enable this in production as it exposes the Api Key on the network.\\nDefault: `disabled`, if specified without a port `9071` port is used.\\n\"\n        },\n        {\n            \"key\": \"RenewTlsCertificateOnStartup\",\n            \"description\": \"If set a new tls certificate is created during startup updating any previously created ones.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"DefaultSamplingInterval\",\n            \"description\": \"Default value in milliseconds to request the servers to sample values. This value is used if an explicit sampling interval for a node was not configured. \\nDefault: `1000`.\\nAlso can be set using `DefaultSamplingInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`.\\n\"\n        },\n        {\n            \"key\": \"DefaultPublishingInterval\",\n            \"description\": \"Default value in milliseconds for the publishing interval setting of a subscription created with an OPC UA server. This value is used if an explicit publishing interval was not configured.\\nWhen setting to `0` the server decides the lowest publishing interval it can support.\\nDefault: `1000`.\\nAlso can be set using `DefaultPublishingInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`.\\n\"\n        },\n        {\n            \"key\": \"EnableImmediatePublishing\",\n            \"description\": \"By default OPC Publisher will create a subscription with publishing disabled and only enable it after it has filled it with all configured monitored items. Use this setting to create the subscription with publishing already enabled.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"DefaultKeepAliveCount\",\n            \"description\": \"Specifies the default number of publishing intervals before a keep alive is returned with the next queued publishing response.\\nDefault: `auto set based on publishing interval`.\\n\"\n        },\n        {\n            \"key\": \"DefaultLifetimeCount\",\n            \"description\": \"Default subscription lifetime count which is a multiple of the keep alive counter and when reached instructs the server to declare the subscription invalid.\\nDefault: `auto set based on publishing interval`.\\n\"\n        },\n        {\n            \"key\": \"DefaultQueueSize\",\n            \"description\": \"Default queue size for all monitored items if queue size was not specified in the configuration.\\nDefault: `1` (for backwards compatibility).\\n\"\n        },\n        {\n            \"key\": \"AutoSetQueueSizes\",\n            \"description\": \"(Experimental) Automatically calculate queue sizes for monitored items using the subscription publishing interval and the item's sampling rate as max(configured queue size, roundup(publishinginterval / samplinginterval)).\\nNote that the server might revise the queue size down if it cannot handle the calculated size.\\nDefault: `false` (disabled).\\n\"\n        },\n        {\n            \"key\": \"DiscardNew\",\n            \"description\": \"The publisher is using this as default value for the discard old setting of monitored item queue configuration. Setting to true will ensure that new values are dropped before older ones are drained. \\nDefault: `false` (which is the OPC UA default).\\n\"\n        },\n        {\n            \"key\": \"DefaultDataChangeTrigger\",\n            \"description\": \"Default data change trigger for all monitored items configured in the published nodes configuration unless explicitly overridden.\\nAllowed values:\\n    `Status`\\n    `StatusValue`\\n    `StatusValueTimestamp`\\nDefault: `StatusValue` (which is the OPC UA default).\\n\"\n        },\n        {\n            \"key\": \"DefaultMonitoredItemWatchdogSeconds\",\n            \"description\": \"The subscription and monitored item watchdog timeout in seconds the subscription uses to check on late reporting monitored items unless overridden in the published nodes configuration explicitly.\\nDefault: `not set` (watchdog disabled).\\n\"\n        },\n        {\n            \"key\": \"DefaultMonitoredItemWatchdogCondition\",\n            \"description\": \"The default condition when to run the action configured as the watchdog behavior. The condition can be overridden in the published nodes configuration.\\nAllowed values:\\n    `WhenAllAreLate`\\n    `WhenAnyIsLate`\\nDefault: `WhenAllAreLate` (if enabled).\\n\"\n        },\n        {\n            \"key\": \"DefaultWatchdogBehavior\",\n            \"description\": \"Default behavior of the subscription and monitored item watchdog mechanism unless overridden in the published nodes configuration explicitly.\\nAllowed values:\\n    `Diagnostic`\\n    `Reset`\\n    `FailFast`\\n    `ExitProcess`\\nDefault: `Diagnostic` (if enabled).\\n\"\n        },\n        {\n            \"key\": \"DefaultSkipFirst\",\n            \"description\": \"The publisher is using this as default value for the skip first setting of nodes configured without a skip first setting. A value of True will skip sending the first notification received when the monitored item is added to the subscription.\\nDefault: `False` (disabled).\\n\"\n        },\n        {\n            \"key\": \"RepublishAfterTransfer\",\n            \"description\": \"Configure whether publisher republishes missed subscription notifications still in the server queue after transferring a subscription during reconnect handling.\\nThis can result in out of order notifications after a reconnect but minimizes data loss.\\nDefault: `False` (disabled).\\n\"\n        },\n        {\n            \"key\": \"DefaultSamplingUsingCyclicRead\",\n            \"description\": \"All nodes should be sampled using periodical client reads instead of subscriptions services, unless otherwise configured.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"MaxMonitoredItemPerSubscription\",\n            \"description\": \"Max monitored items per subscription until the subscription is split.\\nThis is used if the server does not provide limits in its server capabilities.\\nDefault: `not set`.\\n\"\n        },\n        {\n            \"key\": \"EnableSequentialPublishing\",\n            \"description\": \"Set to false to disable sequential publishing in the protocol stack.\\nDefault: `True` (enabled).\\n\"\n        },\n        {\n            \"key\": \"SubscriptionManagementIntervalSeconds\",\n            \"description\": \"The interval in seconds after which the publisher re-applies the desired state of the subscription to a session.\\nDefault: `0` (only on configuration change).\\n\"\n        },\n        {\n            \"key\": \"BadMonitoredItemRetryDelaySeconds\",\n            \"description\": \"The delay in seconds after which nodes that were rejected by the server while added or updating a subscription or while publishing, are re-applied to a subscription.\\nSet to 0 to disable retrying.\\nDefault: `1800` seconds.\\n\"\n        },\n        {\n            \"key\": \"InvalidMonitoredItemRetryDelaySeconds\",\n            \"description\": \"The delay in seconds after which the publisher attempts to re-apply nodes that were incorrectly configured to a subscription.\\nSet to 0 to disable retrying.\\nDefault: `300` seconds.\\n\"\n        },\n        {\n            \"key\": \"BadMonitoredItemRetryDelayMaxSeconds\",\n            \"description\": \"The max delay in seconds between retrying nodes that were rejected by the server while added or updating a subscription or while publishing.\\nWhen set an exponential retry policy is used with the `--bmr` (`BadMonitoredItemRetryDelaySeconds`) value as the starting delay.\\nDefault: `not set`.\\n\"\n        },\n        {\n            \"key\": \"InvalidMonitoredItemRetryDelayMaxSeconds\",\n            \"description\": \"The max  delay in seconds between retrying nodes that were incorrectly configured in the a subscription.\\nWhen set an exponential retry policy is used with the `--inr` (`InvalidMonitoredItemRetryDelaySeconds`) value as the starting delay.\\nDefault: `not set`.\\n\"\n        },\n        {\n            \"key\": \"SubscriptionErrorRetryDelaySeconds\",\n            \"description\": \"The delay in seconds between attempts to create a subscription in a session.\\nSet to 0 to disable retrying.\\nDefault: `2` seconds.\\n\"\n        },\n        {\n            \"key\": \"DefaultUseReverseConnect\",\n            \"description\": \"(Experimental) Use reverse connect for all endpoints in the published nodes configuration unless otherwise configured.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"DisableSubscriptionTransfer\",\n            \"description\": \"Do not attempt to transfer subscriptions when reconnecting but re-establish the subscription.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"DisableComplexTypeSystem\",\n            \"description\": \"Never load the complex type system for any connections that are required for subscriptions.\\nThis setting not just disables meta data messages but also prevents transcoding of unknown complex types in outgoing messages.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"DisableSessionPerWriterGroup\",\n            \"description\": \"Disable creating a separate session per writer group. Instead sessions are re-used across writer groups.\\nDefault: `False`.\\n\"\n        },\n        {\n            \"key\": \"IgnoreConfiguredPublishingIntervals\",\n            \"description\": \"Always use the publishing interval provided via `--op` (DefaultPublishingInterval) and ignore all publishing interval settings in the configuration.\\nCombine with `--op=0` ((DefaultPublishingInterval)=0) to let the server use the lowest publishing interval it can support.\\nDefault: `False` (disabled).\\n\"\n        },\n        {\n            \"key\": \"AutoAcceptUntrustedCertificates\",\n            \"description\": \"The publisher accepts untrusted certificates presented by a server it connects to.\\nThis does not include servers presenting bad certificates or certificates that fail chain validation. These errors cannot be suppressed and connection will always be rejected.\\nWARNING: This setting should never be used in production environments!\\n\"\n        },\n        {\n            \"key\": \"RejectUnknownRevocationStatus\",\n            \"description\": \"Set this to `False` to accept certificates presented by a server that have an unknown revocation status.\\nWARNING: This setting should never be used in production environments!\\nDefault: `True`.\\n\"\n        },\n        {\n            \"key\": \"CreateSessionTimeout\",\n            \"description\": \"Amount of time in seconds to wait until a session is connected.\\nDefault: `5` seconds.\\n\"\n        },\n        {\n            \"key\": \"MinReconnectDelay\",\n            \"description\": \"The minimum amount of time in milliseconds to wait reconnection of session is attempted again.\\nDefault: `1000` milliseconds.\\n\"\n        },\n        {\n            \"key\": \"MaxReconnectDelay\",\n            \"description\": \"The maximum amount of time in milliseconds to wait between reconnection attempts of the session.\\nDefault: `60000` milliseconds.\\n\"\n        },\n        {\n            \"key\": \"DefaultSessionTimeout\",\n            \"description\": \"Maximum amount of time in seconds that a session should remain open by the OPC server without any activity (session timeout). Requested from the OPC server at session creation.\\nDefault: `60` seconds.\\n\"\n        },\n        {\n            \"key\": \"KeepAliveInterval\",\n            \"description\": \"The interval in seconds the publisher is sending keep alive messages to the OPC servers on the endpoints it is connected to.\\nDefault: `10` seconds.\\n\"\n        },\n        {\n            \"key\": \"DefaultServiceCallTimeout\",\n            \"description\": \"Maximum amount of time in seconds that a service call should take before it is being cancelled.\\nThis value can be overridden in the request header.\\nDefault: `180` seconds.\\n\"\n        },\n        {\n            \"key\": \"DefaultConnectTimeout\",\n            \"description\": \"Maximum amount of time in seconds that a service call should wait for a connected session to be used.\\nThis value can be overridden in the request header.\\nDefault: `not set` (in this case the default service call timeout value is used).\\n\"\n        },\n        {\n            \"key\": \"OperationTimeout\",\n            \"description\": \"The operation service call timeout of individual service requests to the server in milliseconds. As opposed to the `--sct` (DefaultServiceCallTimeout) timeout, this is the timeout hint provided to the server in every request.\\nThis value can be overridden in the request header.\\nDefault: `120000` milliseconds.\\n\"\n        },\n        {\n            \"key\": \"LingerTimeoutSeconds\",\n            \"description\": \"Amount of time in seconds to delay closing a client and underlying session after the a last service call.\\nUse this setting to speed up multiple subsequent calls.\\nDefault: `0` sec (no linger).\\n\"\n        },\n        {\n            \"key\": \"ReverseConnectPort\",\n            \"description\": \"The port to use when accepting inbound reverse connect requests from servers.\\nDefault: `4840`.\\n\"\n        },\n        {\n            \"key\": \"MaxNodesPerReadOverride\",\n            \"description\": \"Limit max number of nodes to read in a single read request when batching reads or the server limit if less.\\nDefault: `0` (using server limit).\\n\"\n        },\n        {\n            \"key\": \"MaxNodesPerBrowseOverride\",\n            \"description\": \"Limit max number of nodes per browse request when batching browse operations or the server limit if less.\\nDefault: `0` (using server limit).\\n\"\n        },\n        {\n            \"key\": \"NodeCacheCapacity\",\n            \"description\": \"The max size of the node caches used in the complex type system.\\nThere are caches (values, nodes, references).\\nDefault: `4096`.\\n\"\n        },\n        {\n            \"key\": \"NodeCacheTimeout\",\n            \"description\": \"The timeout of a node cache entries if not used in milliseconds.\\nDefault: `3600`.\\n\"\n        },\n        {\n            \"key\": \"MinPublishRequests\",\n            \"description\": \"Minimum number of publish requests to queue once subscriptions are created in the session.\\nDefault: `2`.\\n\"\n        },\n        {\n            \"key\": \"PublishRequestsPerSubscriptionPercent\",\n            \"description\": \"Percentage ratio of publish requests per subscriptions in the session in percent up to the number configured using `--xpr` (MaxPublishRequests).\\nDefault: `100`% (1 request per subscription).\\n\"\n        },\n        {\n            \"key\": \"MaxPublishRequests\",\n            \"description\": \"Maximum number of publish requests to every queue once subscriptions are created in the session.\\nDefault: `10`.\\n\"\n        },\n        {\n            \"key\": \"DisableComplexTypePreloading\",\n            \"description\": \"Complex types (structures, enumerations) a server exposes are preloaded from the server after the session is connected. In some cases this can cause problems either on the client or server itself. Use this setting to disable pre-loading support.\\nNote that since the complex type system is used for meta data messages it will still be loaded at the time the subscription is created, therefore also disable meta data support if you want to ensure the complex types are never loaded for an endpoint.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"SecurityTokenLifetime\",\n            \"description\": \"OPC UA Stack Transport Secure Channel - Security token lifetime in milliseconds.\\nDefault: `3600000` (1h).\\n\"\n        },\n        {\n            \"key\": \"ChannelLifetime\",\n            \"description\": \"OPC UA Stack Transport Secure Channel - Channel lifetime in milliseconds.\\nDefault: `300000` (5 min).\\n\"\n        },\n        {\n            \"key\": \"MaxBufferSize\",\n            \"description\": \"OPC UA Stack Transport Secure Channel - Max buffer size.\\nDefault: `65535` (64KB -1).\\n\"\n        },\n        {\n            \"key\": \"MaxMessageSize\",\n            \"description\": \"OPC UA Stack Transport Secure Channel - Max message size.\\nDefault: `4194304` (4 MB).\\n\"\n        },\n        {\n            \"key\": \"MaxArrayLength\",\n            \"description\": \"OPC UA Stack Transport Secure Channel - Max array length.\\nDefault: `65535` (64KB - 1).\\n\"\n        },\n        {\n            \"key\": \"MaxStringLength\",\n            \"description\": \"The max length of a string opc can transmit/receive over the OPC UA secure channel.\\nDefault: `130816` (128KB - 256).\\n\"\n        },\n        {\n            \"key\": \"MaxByteStringLength\",\n            \"description\": \"OPC UA Stack Transport Secure Channel - Max byte string length.\\nDefault: `1048576` (1MB).\\n\"\n        },\n        {\n            \"key\": \"ApplicationUri\",\n            \"description\": \"Application URI as per OPC UA definition inside the OPC UA client application configuration presented to the server.\\nDefault: `not set`.\\n\"\n        },\n        {\n            \"key\": \"ProductUri\",\n            \"description\": \"The Product URI as per OPC UA definition inside the OPC UA client application configuration presented to the server.\\nDefault: `not set`.\\n\"\n        },\n        {\n            \"key\": \"RejectSha1SignedCertificates\",\n            \"description\": \"If set to `False` OPC Publisher will accept SHA1 certificates which have been officially deprecated and are unsafe to use.\\nNote: Set this to `False` to support older equipment that uses Sha1 signed certificates rather than using no security.\\nDefault: `True`.\\n\"\n        },\n        {\n            \"key\": \"MinimumCertificateKeySize\",\n            \"description\": \"Minimum accepted certificate size.\\nNote: It is recommended to this value to the highest certificate key size possible based on the connected OPC UA servers.\\nDefault: 1024.\\n\"\n        },\n        {\n            \"key\": \"AddAppCertToTrustedStore\",\n            \"description\": \"Set to `False` to disable adding the publisher's own certificate to the trusted store automatically.\\nDefault: `True`.\\n\"\n        },\n        {\n            \"key\": \"ApplicationCertificateSubjectName\",\n            \"description\": \"The subject name for the app cert.\\nDefault: `CN=<the value of --an|--appname|ApplicationName>, C=DE, S=Bav, O=Microsoft, DC=localhost`.\\n\"\n        },\n        {\n            \"key\": \"ApplicationName\",\n            \"description\": \"The name for the app (used during OPC UA authentication).\\nDefault: `Microsoft.Azure.IIoT`\\n\"\n        },\n        {\n            \"key\": \"TryConfigureFromExistingAppCert\",\n            \"description\": \"Automatically set the application subject name, host name and application uri from the first valid application certificate found in the application certificate store path.\\nIf the chosen certificate is valid, it will be used, otherwise a new, self-signed certificate with the information will be created.\\nDefault: `false`.\\n\"\n        },\n        {\n            \"key\": \"LogLevel\",\n            \"description\": \"The loglevel to use.\\nAllowed values:\\n    `Trace`\\n    `Debug`\\n    `Information`\\n    `Warning`\\n    `Error`\\n    `Critical`\\n    `None`\\nDefault: `Information`.\\n\"\n        },\n        {\n            \"key\": \"DiagnosticsInterval\",\n            \"description\": \"Produce publisher diagnostic information at this specified interval in seconds.\\nBy default diagnostics are written to the OPC Publisher logger (which requires at least --loglevel or environment variable `LogLevel` =`information`) unless configured differently using `--pd` (DiagnosticsTarget).\\n`0` disables diagnostic output.\\nDefault:60000 (60 seconds).\\nAlso can be set using `DiagnosticsInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`\\\".\\n\"\n        },\n        {\n            \"key\": \"DiagnosticsTarget\",\n            \"description\": \"Configures how to emit diagnostics information at the `--di` (DiagnosticsInterval) configured interval.\\nUse this to for example emit diagnostics as events to the event topic template instead of the console.\\nAllowed values:\\n    `Logger`\\n    `Events`\\nDefault: `Logger`.\\n\"\n        },\n        {\n            \"key\": \"DisableResourceMonitoring\",\n            \"description\": \"Disable resource monitoring as part of the diagnostics output and metrics.\\nDefault: `false` (enabled).\\n\"\n        },\n        {\n            \"key\": \"DebugLogNotifications\",\n            \"description\": \"Log ingress subscription notifications at Informational level to aid debugging.\\nDefault: `disabled`.\\n\"\n        },\n        {\n            \"key\": \"DebugLogNotificationsWithHeartbeat\",\n            \"description\": \"Include heartbeats in notifications log.\\nIf set also implicitly enables debug logging via `--ln` (DebugLogNotifications).\\nDefault: `disabled`.\\n\"\n        },\n        {\n            \"key\": \"DebugLogNotificationsFilter\",\n            \"description\": \"Only log notifications where the data set field name, subscription name, or data set name match the provided regular expression pattern.\\nIf set implicitly enables debug logging via `--ln`  (DebugLogNotifications).\\nDefault: `null` (matches all).\\n\"\n        },\n        {\n            \"key\": \"DebugLogEncodedNotifications\",\n            \"description\": \"Log encoded subscription and monitored item notifications at Informational level to aid debugging.\\nDefault: `disabled`.\\n\"\n        },\n        {\n            \"key\": \"OpcUaKeySetLogFolderName\",\n            \"description\": \"Writes negotiated symmetric keys for all running client connection to this file.\\nThe file can be loaded by Wireshark 4.3 and used to decrypt encrypted channels when analyzing network traffic captures.\\nNote that enabling this feature presents a security risk!\\nDefault: `disabled`.\\n\"\n        }\n    ]\n}\n"
  },
  {
    "path": "deploy/kubernetes/readme.md",
    "content": "# Azure IoT Operations Development Environment Setup\n\nThis guide explains how to set up a local development environment for Azure IoT Operations (AIO)\nand how to install OPC Publisher as a Akri connector.\n\n> This functionality is **experimental**. OPC Publisher running as connector in Azure IoT Operations\n> is not supported by Microsoft.\n> **Use the Azure IoT Operations built in OPC UA connectivity support for production!**\n\n## Cluster Setup\n\nThe [`cluster-setup.ps1`](./cluster-setup.ps1) PowerShell script sets up a local Kubernetes\ncluster and connects it to Azure Arc. It is a convenient way to boot strap a Azure IoT\nOperations cluster on Windows targeting K3D, MicroK8s, Minikube and Kind.\n\n> Linux is currently not supported / has not been tested.\n> Currently only K3D and MicroK8s have been tested.\n> Only version 1.2 or higher of Azure IoT Operations is supported which is currently in\n> preview.\n\n### Prerequisites\n\n- Windows 11 with PowerShell.\n- Azure subscription with required permissions\n- All other dependencies are installed, however, if you intend to use microk8s install it using the\n  [public installer](https://microk8s.io/docs/install-windows) **including multipass** before\n  running the script.\n\n> The script must be run as administrator and is not intended to set up production clusters.\n\n### Using the cluster setup script\n\n```powershell\n# Basic usage\n.\\cluster-setup.ps1 -Name <cluster-name>\n\n# Full syntax with all parameters\n.\\cluster-setup.ps1 `\n    -Name <cluster-name> `                          # Required: Cluster and resource name\n    [-InstanceName <instance-name>] `               # Optional: AIO instance name (default: same as cluster)\n    [-InstanceNamespace <namespace>] `              # Optional: K8s namespace (default: azure-iot-operations)\n    [-ResourceGroup <resource-group>] `             # Optional: Resource group (default: same as cluster)\n    [-SharedFolderPath <path>] `                    # Optional: Shared storage path (default: C:\\Shared)\n    [-Location <location>] `                        # Optional: Azure region (default: westus)\n    [-ClusterType <type>] `                         # Optional: microk8s, kind, k3d, minikube (default: microk8s)\n    [-Connector <type>] `                           # Optional: None, Official, Local, Debug (default: Official)\n    [-OpsVersion <version>] `                       # Optional: Azure IoT Operations version\n    [-OpsTrain <train>] `                           # Optional: integration, stable, dev (default: integration)\n    [-Force]                                        # Optional: Force reinstallation\n\n# Examples\n\n# Basic setup with defaults\n.\\cluster-setup.ps1 -Name \"myCluster\"\n\n# Custom configuration with different cluster type\n.\\cluster-setup.ps1 `\n    -Name \"myCluster\" `\n    -ClusterType \"kind\" `\n    -InstanceNamespace \"iot-ops\" `\n    -Connector \"Local\"\n\n# Development setup with specific version and train\n.\\cluster-setup.ps1 `\n    -Name \"devCluster\" `\n    -OpsVersion \"1.2.96\" `\n    -OpsTrain \"dev\" `\n    -Connector \"Debug\" `\n    -Force\n\n```\n\n### Akri and Azure Asset and Device Registry Integration\n\nThe cluster setup script by default deploys the officially built OPC Publisher as a Akri\nconnector into the cluster. The connector will handle publishing of data that is configured\nin Assets that are bound to a device endpoint. These can be created in ADR using the AZ CLI\nas well as the Digital Operations experience user interface.\n\nThere are 2 devices installed by default pointing to 2 running OPC PLC simulation servers\nrunning in the cluster.\n\nThe connector will discover assets in OPC PLC via the AssetTypes configuration option on\nthe device \"none\" endpoint. It will also add all endpoints of the server to the device\nand publishes a discovered device resource to Akri with the additional endpoints and the\nsame identifier as the original device.\n\nFor convenience the script also enables the insecure listener on the MQTT broker. Forward\nthe insecure port (1883) locally using the `.\\debug\\forward-mq.ps1`.\n\n### Onboarding discovered Assets and Devices\n\nThe import or onboarding flow can be managed using the Digital Operations Experience user\ninterface.\nThe `.\\iotops\\adr-tool.ps1` powershell script can be used to effectively copy the discovered\nresource into Azure Device Registry and allows you to bypass the DOE experience.\n\n#### Using the onboarding script\n\n```powershell\n# Basic usage\n.\\iotops\\adr-tool.ps1 -AdrNamespaceName <namespace> -ResourceGroup <resource-group>\n\n# Full syntax with all options\n.\\iotops\\adr-tool.ps1 `\n    -Action Onboard `\n    -AdrNamespaceName <namespace> `                   # Required: ADR namespace name\n    -ResourceGroup <resource-group> `                 # Required: Azure resource group\n    [-SubscriptionId <subscription-id>] `             # Optional: Azure subscription ID\n    [-Location <location>] `                          # Optional: Azure region (default: westus)\n    [-TenantId <tenant-id>] `                         # Optional: Azure tenant ID\n    [-RunOnce] `                                      # Optional: Run once and exit\n    [-Force] `                                        # Optional: Force update existing resources\n    [-SkipLogin]                                      # Optional: Skip Azure login\n```\n\nYou can run the script in a loop or just once. Note that the discovered devices and assets will\ntake several minutes to be synchronized into Azure and that can happen in any order. Run the script\nagain or in loop mode to bring all resources in and back down to the cluster.\n\n## Advanced\n\nThe debug folder contains scripts to build and debug the OPC Publisher.\n\n### Adding more sample servers to the cluster\n\nThe `.\\simulation\\deploy.ps1` script allows you to deploy not just OPC PLC but also the test server\nincluded in this repository. It also allows you to add other simulations.  For more information\ncheck out the script help.\n\n### Building OPC Publisher and deploying into the cluster\n\nYou can use [`.\\debug\\build.ps1`](./debug/build.ps1) to build a debug version.\n\n```powershell\n# Basic usage\n.\\debug\\build.ps1\n\n# Full syntax with all parameters\n.\\debug\\build.ps1 `\n    [-Configuration <config>] `                    # Optional: Debug or Release (default: Debug)\n    [-ClusterType <type>] `                        # Optional: Target cluster type (default: microk8s)\n    [-StartDebugger]                               # Optional: Start debugger after build\n\n# Examples\n\n# Build with default settings (Debug configuration)\n.\\debug\\build.ps1\n\n# Build release configuration for specific cluster\n.\\debug\\build.ps1 `\n    -Configuration \"Release\" `\n    -ClusterType \"kind\"\n\n# Build and start debugging session\n.\\debug\\build.ps1 `\n    -Configuration \"Debug\" `\n    -StartDebugger\n```\n\nThe script builds the OPC Publisher and starts the `debug.ps1` script pointing to the built container.\nDebugging is described in the next section.\n\n### Attaching the Debugger\n\nUse [`.\\debug\\debug.ps1`](./debug/debug.ps1) to attach the debugger to the running OPC Publisher that\ncan be connected to the Visual Studio 2022 or Visual Studio Code debugger:\n\n```powershell\n# Basic usage (interactive)\n.\\debug\\debug.ps1\n\n# Full syntax with all parameters\n.\\debug\\debug.ps1 `\n    [-PodName <pod>] `                            # Optional: Target pod name (prompts if omitted)\n    [-ContainerName <container>] `                # Optional: Target container name (prompts if omitted)\n    [-Namespace <namespace>] `                    # Optional: K8s namespace (default: azure-iot-operations)\n    [-ClusterType <type>] `                       # Optional: Cluster type (default: microk8s)\n    [-Image <image-name>] `                       # Optional: Debug image to replace in pod\n    [-Fork]                                       # Optional: Create new pod instead of modifying existing\n\n# Examples\n\n# Interactive debugging (prompts for pod and container)\n.\\debug\\debug.ps1\n\n# Debug specific pod and container\n.\\debug\\debug.ps1 `\n    -PodName \"opc-publisher\" `\n    -ContainerName \"publisher\"\n\n# Debug with custom namespace and image\n.\\debug\\debug.ps1 `\n    -PodName \"opc-publisher\" `\n    -Namespace \"iot-debug\" `\n    -Image \"debug-publisher:latest\" `\n    -Fork\n```\n\nOnce the debugger is attached you can open the solution file in Visual Studio 2022 and\nattach to the selected container using a SSH connection to localhost:50000."
  },
  {
    "path": "deploy/kubernetes/simulation/deploy.ps1",
    "content": "<#\n    .SYNOPSIS\n        Deploys OPC UA simulation servers in a Kubernetes cluster\n        and registers them with Azure IoT Operations.\n    .DESCRIPTION\n        This script deploys a specified number of OPC UA simulation\n        servers using Helm and registers them as devices in Azure IoT\n        Operations. Each server is configured with specific endpoint\n        settings and asset discovery capabilities.\n    .NOTES\n        DO NOT USE FOR PRODUCTION SYSTEMS. This script is intended for\n        development and testing purposes only.\n\n    .PARAMETER SimulationName\n        The type of simulation to deploy. Currently supports \"opc-plc\"\n        \"umati\", \"umati-public\" and \"opc-test\". Default is \"opc-plc\".\n    .PARAMETER Count\n        Number of simulation servers to deploy.\n    .PARAMETER AdrNamespaceName\n        The Azure IoT Operations namespace to deploy the simulation\n        devices into. Must exist already.\n    .PARAMETER Namespace\n        The Kubernetes namespace where the simulation servers will\n        be deployed.\n    .PARAMETER ResourceGroup\n        The resource group to create or use for the cluster.\n        Default is the same as the cluster name.\n    .PARAMETER SubscriptionId\n        The subscription id to scope all activity to.\n    .PARAMETER Location\n        The Azure region where the resources will be created.\n    .PARAMETER OpsInstanceName\n        The name of the Azure IoT Operations instance to register\n        the devices with. This instance must already exist.\n    .PARAMETER DeploymentName\n        The name of the Helm deployment for the simulation servers.\n    .PARAMETER Force\n        If specified, will force the creation of devices even if they\n        already exist in the ADR namespace.\n    .PARAMETER SkipLogin\n        If specified, will skip the Azure login step.\n    .PARAMETER ClusterType\n        The type of Kubernetes cluster to deploy to. Valid values are\n        \"kind\", \"minikube\", \"k3d\", and \"microk8s\". Optional and only\n        needed if you want to deploy opc-test from local repo.\n#>\n\nparam(\n    [string] [Parameter(Mandatory = $true)] $DeploymentName,\n    [string] [ValidateSet(\n        \"opc-plc\",\n        \"opc-test\",\n        \"umati\",\n        \"umati-public\"\n    )] $SimulationName = \"opc-plc\",\n    [int] $Count = 1,\n    [string] [Parameter(Mandatory = $true)] $OpsInstanceName,\n    [string] [Parameter(Mandatory = $true)] $ResourceGroup,\n    [string] [Parameter(Mandatory = $true)] $AdrNamespaceName,\n    [string] $SubscriptionId,\n    [string] $TenantId,\n    [string] $Location = \"westus\",\n    [string] $Namespace,\n    [string] [ValidateSet(\n        \"kind\",\n        \"minikube\",\n        \"k3d\",\n        \"microk8s\"\n    )] $ClusterType =\"microk8s\",\n    [switch] $AddServerType,\n    [switch] $Force,\n    [switch] $SkipLogin\n)\n\n$ErrorActionPreference = \"Continue\"\n$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Path\nImport-Module $(Join-Path $(Join-Path $(Split-Path $scriptDirectory) \"common\") `\n    \"cluster-utils.psm1\") -Force\n\n$azVersion = (az version)[1].Split(\":\")[1].Split('\"')[1]\nif ($azVersion -lt \"2.74.0\" -or !$azVersion) {\n    Write-Host \"Azure CLI version 2.74.0 or higher is required.\" `\n        -ForegroundColor Red\n    exit -1\n}\n\n#\n# Log into azure\n#\nif (-not $script:SkipLogin.IsPresent) {\n    Write-Host \"Log into Azure...\" -ForegroundColor Cyan\n    $loginParams = @( \"--only-show-errors\" )\n    if (![string]::IsNullOrWhiteSpace($TenantId)) {\n        $loginParams += @(\"--tenant\", $TenantId)\n    }\n    $session = (az login @loginParams) | ConvertFrom-Json\n    if (-not $session) {\n        Write-Host \"Error: Login failed.\" -ForegroundColor Red\n        exit -1\n    }\n    if ([string]::IsNullOrWhiteSpace($SubscriptionId)) {\n        $SubscriptionId = $session[0].id\n    }\n    if ([string]::IsNullOrWhiteSpace($TenantId)) {\n        $TenantId = $session[0].tenantId\n    }\n}\n\n#\n# Check adr namespace and azure iot instances exists\n#\n$adrNsResource = \"/subscriptions/$($SubscriptionId)\"\n$adrNsResource = \"$($adrNsResource)/resourceGroups/$($ResourceGroup)\"\n$adrNsResource = \"$($adrNsResource)/providers/Microsoft.DeviceRegistry\"\n$adrNsResource = \"$($adrNsResource)/namespaces/$($AdrNamespaceName)\"\n$errOut = $($ns = & { az rest --method get `\n    --url \"$($adrNsResource)?api-version=2025-10-01\" `\n    --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\nif (!$ns -or !$ns.id) {\n    Write-Host \"ADR namespace $($adrNsResource) not found - $($errOut).\" `\n        -ForegroundColor Red\n    exit -1\n}\n$errOut = $($iotOps = & { az iot ops show `\n    --resource-group $script:ResourceGroup `\n    --name $script:OpsInstanceName `\n    --subscription $SubscriptionId `\n    --only-show-errors --output json } | ConvertFrom-Json) 2>&1\nif (!$iotOps) {\n    Write-Host \"Error: Failed to get IoT Operations instance - $($errOut).\" `\n        -ForegroundColor Red\n    exit -1\n}\n\n#\n# Get list of namespaces and let user select one or validate the one provided\n#\n$namespaces = kubectl get namespaces --no-headers | ForEach-Object {\n    $_.Split()[0]\n}\nif (-not $namespaces) {\n    Write-Host \"No namespaces found.\" -ForegroundColor Red\n    exit -1\n}\nif (-not $script:Namespace) {\n    $script:Namespace = $namespaces | Out-GridView -Title \"Select a namespace\" -PassThru\n    if (-not $script:Namespace) {\n        Write-Host \"No namespace selected.\" -ForegroundColor Yellow\n        exit 0\n    }\n}\nelse {\n    if (-not $namespaces.Contains($script:Namespace)) {\n        Write-Host \"Namespace '$script:Namespace' not found.\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Using namespace '$script:Namespace'.\" -ForegroundColor Green\n}\n\n$displayName = \"$($script:Count) $($script:SimulationName) simulation servers\"\nif ($script:SimulationName -eq \"umati-public\") {\n    Write-Host \"Using public Umati server for simulation.\" -ForegroundColor Yellow\n    $script:Count = 1\n}\nelseif ($script:SimulationName -eq \"opc-test\" -and $script:ClusterType) {\n    Write-Host \"Building opc-test-server image for simulation.\" -ForegroundColor Yellow\n    $projFile = \"Azure.IIoT.OpcUa.Publisher.Testing\"\n    $projFile = \"../../../src/$($projFile)/cli/$($projFile).Cli.csproj\"\n    $configuration = \"Debug\"\n    $containerTag = \"latest\"\n    $containerName = \"iot/opc-ua-test-server\"\n    $containerImage = \"$($containerName):$($containerTag)\"\n    Write-Host \"Publishing $configuration Simulation as $containerImage...\" `\n        -ForegroundColor Cyan\n    dotnet restore $projFile -s https://api.nuget.org/v3/index.json\n    dotnet publish $projFile -c $configuration --self-contained false --no-restore `\n        /t:PublishContainer -r linux-x64 /p:ContainerImageTag=$($containerTag)\n    if (-not $?) {\n        Write-Host \"Error building opc-ua-test server image connector.\" -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"$configuration container image $containerImage published successfully.\" `\n        -ForegroundColor Green\n    Import-ContainerImage -ClusterType $script:ClusterType -ContainerImage $containerImage\n    $helmPath = Join-Path $(Join-Path $scriptDirectory \"helm\") $script:SimulationName\n    helm upgrade -i $script:DeploymentName \"$($helmPath)\" `\n        --namespace $script:Namespace `\n        --set simulations=$script:Count `\n        --set deployDefaultIssuerCA=false `\n        --set image=$($containerName) `\n        --set tag=$($containerTag) `\n        --set pullPolicy=IfNotPresent `\n        --wait\n    if (-not $?) {\n        Write-Host \"Error deploying $($displayName) as $($script:DeploymentName).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Deployment of $($displayName) as $($script:DeploymentName) completed.\" `\n        -ForegroundColor Green\n}\nelse {\n    Write-Host \"Deploying $($displayName) as $($script:DeploymentName)...\" `\n        -ForegroundColor Cyan\n    $helmPath = Join-Path $(Join-Path $scriptDirectory \"helm\") $script:SimulationName\n    helm upgrade -i $script:DeploymentName \"$($helmPath)\" `\n        --namespace $script:Namespace `\n        --set simulations=$script:Count `\n        --set deployDefaultIssuerCA=false `\n        --wait\n\n    if (-not $?) {\n        Write-Host \"Error deploying $($displayName) as $($script:DeploymentName).\" `\n            -ForegroundColor Red\n        exit -1\n    }\n    Write-Host \"Deployment of $($displayName) as $($script:DeploymentName) completed.\" `\n        -ForegroundColor Green\n}\n\n$tempFile = New-TemporaryFile\n\n#\n# Deployment simulation configuration\n#\n$assetTypes = @()\nif ($script:AddServerType) {\n    $assetTypes += \"nsu=http://opcfoundation.org/UA/;i=2004\"\n}\nswitch ($script:SimulationName) {\n    \"opc-plc\" {\n        # OPC Plc\n        $assetTypes += \"nsu=http://opcfoundation.org/UA/Boiler/;i=1132\"\n        $assetTypes += \"nsu=http://microsoft.com/Opc/OpcPlc/Boiler;i=1000\"\n        $assetTypes += \"nsu=http://microsoft.com/Opc/OpcPlc/Boiler;i=3\"\n    }\n    \"opc-test\" {\n        $assetTypes += \"nsu=http://opcfoundation.org/UA/Boiler/;i=1132\" # BoilerType\n        $assetTypes += \"nsu=http://opcfoundation.org/UA/WoT-Con/;i=115\" # AssetType\n        #$assetTypes += \"nsu=FileSystem;i=16314\" # FileSystemType\n    }\n    \"umati\" {\n        # $assetTypes += \"nsu=http://opcfoundation.org/UA/MachineTool/;i=14\" # monitoring\n        $assetTypes += \"nsu=http://opcfoundation.org/UA/MachineTool/;i=13\" # machine tool\n    }\n    \"umati-public\" {\n        # $assetTypes += \"nsu=http://opcfoundation.org/UA/MachineTool/;i=14\" # monitoring\n        $assetTypes += \"nsu=http://opcfoundation.org/UA/MachineTool/;i=13\" # machine tool\n    }\n}\n\nfor ($i = 0; $i -lt $script:Count; $i++) {\n    $suffix = $(\"{0:D6}\" -f $i)\n    $deviceName = \"$($script:SimulationName)-$($suffix)\"\n    $deviceResource = \"$($ns.id)/devices/$($deviceName)\"\n    $errOut = $($device = & { az rest --method get `\n        --url \"$($deviceResource)?api-version=2025-10-01\" `\n        --headers \"Content-Type=application/json\" } | ConvertFrom-Json) 2>&1\n    if (!$device -or !$device.id -or $script:Force.IsPresent) {\n        if ($script:SimulationName -eq \"umati-public\") {\n            $address = \"opc.tcp://opcua.umati.app:4840\"\n        }\n        else {\n            $address = \"$($script:SimulationName)-$($DeploymentName)-$($suffix)\"\n            $address = \"$($address).$($script:Namespace).svc.cluster.local\"\n            $address = \"opc.tcp://$($address):4840\"\n        }\n        $body = @{\n            extendedLocation = $iotOps.extendedLocation\n            location = $Location\n            properties = @{\n                enabled = $true\n                attributes = @{\n                    deviceType = \"LDS\"\n                }\n                endpoints = @{\n                    inbound = @{\n                        \"none\" = @{\n                            address = $address\n                            endpointType = \"Microsoft.OpcPublisher\"\n                            version = \"2.9\"\n                            authentication = @{\n                                method = \"Anonymous\"\n                            }\n                            additionalConfiguration = $(@{\n                                EndpointSecurityMode = \"None\"\n                                EndpointSecurityPolicy = \"None\"\n                                RunAssetDiscovery = $True\n                                AssetTypes = $assetTypes\n                            } | ConvertTo-Json -Depth 100 -Compress)\n                        }\n                    }\n                }\n            }\n        } | ConvertTo-Json -Depth 100\n        $body | Out-File -FilePath $tempFile -Encoding utf8 -Force\n        Write-Host \"Creating ADR namespaced device $deviceResource...\" -ForegroundColor Cyan\n        $errOut = $($device = & { az rest --method put `\n            --url \"$($deviceResource)?api-version=2025-10-01\" `\n            --headers \"Content-Type=application/json\" `\n            --body @$tempFile } | ConvertFrom-Json) 2>&1\n        if (-not $? -or !$device -or !$device.id) {\n            Write-Host \"Error: Failed to create device $($deviceResource) - $($errOut).\" `\n                -ForegroundColor Red\n            Remove-Item -Path $tempFile -Force\n            exit -1\n        }\n        Write-Host \"ADR namespaced device $($device.id) created.\" -ForegroundColor Green\n    }\n    else {\n        Write-Host \"ADR namespaced device $($device.id) exists.\" -ForegroundColor Green\n    }\n}\nRemove-Item -Path $tempFile -Force\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-plc/Chart.yaml",
    "content": "apiVersion: v2\nname: microsoft-opc-plc\ndescription: A Helm chart for Kubernetes that deploys the OPC PLC.\ntype: application\nversion: 2.9-alpha.1\nappVersion: 2.9-alpha.1\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-plc/templates/_helpers.tpl",
    "content": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"simulation.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"simulation.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nName of ConfigMap for OPC PLC.\n*/}}\n{{- define \"simulation.configmap\" -}}\n{{- printf \"%s-%s\" \"opc-plc-config\" $.Release.Name | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCommon labels\n*/}}\n{{- define \"simulation.labels\" -}}\nhelm.sh/chart: {{ include \"simulation.chart\" . }}\n{{ include \"simulation.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io/version: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io/managed-by: {{ .Release.Service }}\n{{- end }}\n\n{{/*\nSelector labels\n*/}}\n{{- define \"simulation.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"simulation.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-plc/templates/opc-plc_configMap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: {{ include \"simulation.configmap\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    {{- include \"simulation.labels\" . | nindent 4 }}\ndata:\n  nodesfile.json: |-\n    {\n      \"Folder\": \"MyTelemetry\",\n      \"NodeList\": [\n        {\n          \"NodeId\": \"panic\",\n          \"Name\": \"Panic\",\n          \"DataType\": \"Boolean\",\n          \"ValueRank\": -1,\n          \"AccessLevel\": \"CurrentReadOrWrite\",\n          \"Description\": \"Node that panics, if written\"\n        }\n      ]\n    }\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-plc/templates/opc-plc_default_application_certificate.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\n{{- if $.Capabilities.APIVersions.Has \"cert-manager.io/v1\" }}\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n  name: opc-ua-opc-plc-default-application-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\nspec:\n  # Secret names are always required.\n  secretName: opc-ua-opc-plc-default-application-cert-{{ $suffix }}\n  duration: 8760h # 365d\n  renewBefore: 4380h # 182d\n  subject:\n    #  It is recommended that the user sets here in the subject at least the organization's name. This information will be stored in the certificate and helps to identify the certificate.\n    # organizations:\n    #  - Microsoft\n  commonName: OpcPlc\n  isCA: false\n  privateKey:\n    algorithm: RSA\n    encoding: PKCS1\n    size: 2048\n    rotationPolicy: Always\n  usages:\n    - content commitment\n    - digital signature\n    - key encipherment\n    - data encipherment\n    - cert sign\n    - client auth\n    - server auth\n  # At least one of a DNS Name, URI, or IP address is required.\n  uris:\n    - urn:OpcPlc:opc-plc-{{ $suffix }}\n  dnsNames:\n    - opc-plc-{{ $suffix }}.{{ $.Release.Namespace }}\n    - opc-plc-{{ $suffix }}\n  issuerRef:\n    kind: Issuer\n{{- if $.Values.deployDefaultIssuerCA }}\n    name: aio-opc-opcuabroker-default-root-ca-issuer\n{{- else }}\n    name: aio-opc-ua-self-signed-issuer\n{{- end }}\n{{- else }}\n{{ fail \"cert-manager is required to create Certificate resource. Please install cert-manager.\"}}\n{{- end }}\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-plc/templates/opc-plc_deployment.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $simulationSelectorLabels := include \"simulation.selectorLabels\" . -}}\n{{- $simulationConfigMap := include \"simulation.configmap\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: opc-plc-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\n    app.kubernetes.io/component: opc-plc-{{ $suffix }}\nspec:\n  selector:\n    matchLabels:\n      {{- $simulationSelectorLabels | nindent 6 }}\n      app.kubernetes.io/component: opc-plc-{{ $suffix }}\n  template:\n    metadata:\n      labels:\n        {{- $simulationSelectorLabels | nindent 8 }}\n        app.kubernetes.io/component: opc-plc-{{ $suffix }}\n    spec:\n      {{- with $.Values.pullSecrets }}\n      imagePullSecrets:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      nodeSelector:\n        \"kubernetes.io/os\": linux\n      containers:\n      - name: opc-plc\n        {{- if $.Values.setSecurityContext }}\n        securityContext:\n          allowPrivilegeEscalation: false\n          privileged: false\n          # OPC PLC runs as root.\n          # runAsNonRoot: true\n          # readOnlyRootFilesystem: true\n          capabilities:\n            drop:\n              - ALL\n          seccompProfile:\n            type: RuntimeDefault\n        {{- end }}\n        image: {{ $.Values.image }}:{{ $.Values.tag }}\n        imagePullPolicy: {{ $.Values.pullPolicy }}\n        ports:\n        - containerPort: 4840\n        args:\n          - \"--ph=opc-plc-{{ $suffix }}.{{ $.Release.Namespace }}\"\n          - \"--cdn=opc-plc-{{ $suffix }}.{{ $.Release.Namespace }},opc-plc-{{ $suffix }}\"\n          - \"--nodesfile=/app/nodesfile.json\"\n          - \"--ut\"\n          {{- if $.Values.autoAcceptUntrustedCertificates }}\n          - \"--autoaccept\"\n          {{- end }}\n          - \"--sn={{ $.Values.slowNodes }}\"\n          - \"--sr=10\"\n          - \"--fn={{ $.Values.fastNodes }}\"\n          - \"--veryfastrate={{ $.Values.fastRate }}\"\n          - \"--gn=5\"\n          - \"--pn=4840\"\n          {{- if $.Values.openTelemetry.endpointUri }}\n          - \"--otlpee={{ $.Values.openTelemetry.endpointUri }}\"\n          - \"--otlpei={{ $.Values.openTelemetry.exportIntervalSeconds }}\"\n          - \"--otlpep={{ $.Values.openTelemetry.exportProtocol }}\"\n          {{- end }}\n          - \"--maxsessioncount={{ $.Values.maxSessionCount }}\"\n          - \"--maxsubscriptioncount={{ $.Values.maxSubscriptionCount }}\"\n          - \"--maxqueuedrequestcount={{ $.Values.maxQueuedRequestCount }}\"\n          - \"--ses\"\n          - \"--alm\"\n          - \"--at=FlatDirectory\"\n          - \"--drurs\"\n          # Check if additionalArgs are defined and have arguments for the current instance\n          {{- if and (hasKey $.Values \"additionalArgs\") (not (empty $.Values.additionalArgs)) (index $.Values.additionalArgs $i) }}\n          # Add additional arguments for the current instance\n          {{- range (index $.Values.additionalArgs $i) }}\n          - {{ . }}\n          {{- end }}\n          {{- end }}\n        volumeMounts:\n          - name: opc-plc-config-{{ $suffix }}\n            mountPath: /app/nodesfile.json\n            subPath: nodesfile.json\n          - name: opc-ua-opc-plc-default-application-cert-{{ $suffix }}\n            mountPath: /app/pki/own/\n          - name: opc-ua-opc-plc-default-trusted-cert-{{ $suffix }}\n            mountPath: /app/pki/trusted/\n{{ if $.Values.resources }}\n        resources:\n{{ toYaml $.Values.resources | indent 10 }}\n{{- end }}\n      volumes:\n        - name: opc-plc-config-{{ $suffix }}\n          configMap:\n            name: {{ $simulationConfigMap }}\n        - name: opc-ua-opc-plc-default-application-cert-{{ $suffix }}\n          secret:\n            secretName: opc-ua-opc-plc-default-application-cert-{{ $suffix }}\n        - name: opc-ua-opc-plc-default-trusted-cert-{{ $suffix }}\n          # fallback to trust the own certificate secret. this contain the CA certificate when used.\n          secret:\n            secretName: opc-ua-opc-plc-default-application-cert-{{ $suffix }}\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-plc/templates/opc-plc_service.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $simulationSelectorLabels := include \"simulation.selectorLabels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: opc-plc-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\n    app.kubernetes.io/component: opc-plc-{{ $suffix }}-service\nspec:\n  type: ClusterIP\n  selector:\n    {{- $simulationSelectorLabels | nindent 4 }}\n    app.kubernetes.io/component: opc-plc-{{ $suffix }}\n  ports:\n  - port: 4840\n    protocol: TCP\n    targetPort: 4840\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-plc/values.yaml",
    "content": "image: mcr.microsoft.com/iotedge/opc-plc\ntag: latest\npullPolicy: Always\npullSecrets: []\n# Controls number of OPC PLCs that should be deployed.\nsimulations: 1\n\nopenTelemetry:\n  # OpenTelemetry Endpoint Uri\n  endpointUri: null\n  # OpenTelemetry Export Interval in seconds\n  exportIntervalSeconds: 60\n  # OpenTelemetry Export Protocol\n  exportProtocol: grpc\n\n# Number of fast nodes.\nfastNodes: 2000\n# Rate in milliseconds to change fast nodes.\nfastRate: 1000\n# Number of slow nodes.\nslowNodes: 25\n# Maximum number of parallel sessions.\nmaxSessionCount: 100\n# Maximum number of subscriptions.\nmaxSubscriptionCount: 100\n# Maximum number of requests that will be queued waiting for a thread.\nmaxQueuedRequestCount: 2000\n\n# Controls if the security bar is lowered for the OPC PLC simulation server. When set to true, all client connections will be accepted.\nautoAcceptUntrustedCertificates: true\n\n# Controls if the security context should be set for the OPC PLC simulation server.\nsetSecurityContext: true\n\n# Additional arguments for the OPC PLC simulation\n# This should be an array of arrays, where each inner array contains the arguments for a specific instance.\nadditionalArgs: []\n\nresources:\n  requests:\n    memory: 192Mi\n    cpu: 125m\n  limits:\n    memory: 768Mi\n    cpu: 500m\n\nnameOverride: null\ndeployDefaultIssuerCA: false\n\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-test/Chart.yaml",
    "content": "apiVersion: v2\nname: microsoft-opc-test\ndescription: A Helm chart for Kubernetes that deploys the OPC UA test servers.\ntype: application\nversion: 2.9.15-alpha.1\nappVersion: 2.9.15-alpha.1\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-test/templates/_helpers.tpl",
    "content": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"simulation.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"simulation.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCommon labels\n*/}}\n{{- define \"simulation.labels\" -}}\nhelm.sh/chart: {{ include \"simulation.chart\" . }}\n{{ include \"simulation.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io/version: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io/managed-by: {{ .Release.Service }}\n{{- end }}\n\n{{/*\nSelector labels\n*/}}\n{{- define \"simulation.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"simulation.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-test/templates/opc-test_default_application_certificate.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\n{{- if $.Capabilities.APIVersions.Has \"cert-manager.io/v1\" }}\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n  name: opc-ua-opc-test-default-application-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\nspec:\n  # Secret names are always required.\n  secretName: opc-ua-opc-test-default-application-cert-{{ $suffix }}\n  duration: 8760h # 365d\n  renewBefore: 4380h # 182d\n  subject:\n    #  It is recommended that the user sets here in the subject at least the organization's name. This information will be stored in the certificate and helps to identify the certificate.\n    # organizations:\n    #  - Microsoft\n  commonName: OpcTester\n  isCA: false\n  privateKey:\n    algorithm: RSA\n    encoding: PKCS1\n    size: 2048\n    rotationPolicy: Always\n  usages:\n    - content commitment\n    - digital signature\n    - key encipherment\n    - data encipherment\n    - cert sign\n    - client auth\n    - server auth\n  # At least one of a DNS Name, URI, or IP address is required.\n  uris:\n    - urn:OpcTester:opc-test-{{ $suffix }}\n  dnsNames:\n    - opc-test-{{ $suffix }}.{{ $.Release.Namespace }}\n    - opc-test-{{ $suffix }}\n  issuerRef:\n    kind: Issuer\n{{- if $.Values.deployDefaultIssuerCA }}\n    name: aio-opc-opcuabroker-default-root-ca-issuer\n{{- else }}\n    name: aio-opc-ua-self-signed-issuer\n{{- end }}\n{{- else }}\n{{ fail \"cert-manager is required to create Certificate resource. Please install cert-manager.\"}}\n{{- end }}\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-test/templates/opc-test_deployment.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $simulationSelectorLabels := include \"simulation.selectorLabels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: opc-test-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\n    app.kubernetes.io/component: opc-test-{{ $suffix }}\nspec:\n  selector:\n    matchLabels:\n      {{- $simulationSelectorLabels | nindent 6 }}\n      app.kubernetes.io/component: opc-test-{{ $suffix }}\n  template:\n    metadata:\n      labels:\n        {{- $simulationSelectorLabels | nindent 8 }}\n        app.kubernetes.io/component: opc-test-{{ $suffix }}\n    spec:\n      {{- with $.Values.pullSecrets }}\n      imagePullSecrets:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      nodeSelector:\n        \"kubernetes.io/os\": linux\n      containers:\n      - name: opc-test\n        {{- if $.Values.setSecurityContext }}\n        securityContext:\n          allowPrivilegeEscalation: false\n          privileged: false\n          # OPC Tester runs as root.\n          # runAsNonRoot: true\n          # readOnlyRootFilesystem: true\n          capabilities:\n            drop:\n              - ALL\n          seccompProfile:\n            type: RuntimeDefault\n        {{- end }}\n        image: {{ $.Values.image }}:{{ $.Values.tag }}\n        imagePullPolicy: {{ $.Values.pullPolicy }}\n        ports:\n        - containerPort: 4840\n        args:\n          - \"--port\"\n          - \"4840\"\n          - \"--hosts\"\n          - \"opc-test-{{ $suffix }}.{{ $.Release.Namespace }},opc-test-{{ $suffix }}\"\n          # Check if additionalArgs are defined and have arguments for the current instance\n          {{- if and (hasKey $.Values \"additionalArgs\") (not (empty $.Values.additionalArgs)) (index $.Values.additionalArgs $i) }}\n          # Add additional arguments for the current instance\n          {{- range (index $.Values.additionalArgs $i) }}\n          - {{ . }}\n          {{- end }}\n          {{- end }}\n        volumeMounts:\n          - name: opc-ua-opc-test-default-application-cert-{{ $suffix }}\n            mountPath: /app/pki/own/\n          - name: opc-ua-opc-test-default-trusted-cert-{{ $suffix }}\n            mountPath: /app/pki/trusted/\n{{ if $.Values.resources }}\n        resources:\n{{ toYaml $.Values.resources | indent 10 }}\n{{- end }}\n      volumes:\n        - name: opc-ua-opc-test-default-application-cert-{{ $suffix }}\n          secret:\n            secretName: opc-ua-opc-test-default-application-cert-{{ $suffix }}\n        - name: opc-ua-opc-test-default-trusted-cert-{{ $suffix }}\n          # fallback to trust the own certificate secret. this contain the CA certificate when used.\n          secret:\n            secretName: opc-ua-opc-test-default-application-cert-{{ $suffix }}\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-test/templates/opc-test_service.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $simulationSelectorLabels := include \"simulation.selectorLabels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: opc-test-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\n    app.kubernetes.io/component: opc-test-{{ $suffix }}-service\nspec:\n  type: ClusterIP\n  selector:\n    {{- $simulationSelectorLabels | nindent 4 }}\n    app.kubernetes.io/component: opc-test-{{ $suffix }}\n  ports:\n  - port: 4840\n    protocol: TCP\n    targetPort: 4840\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-test/values.yaml",
    "content": "image: mcr.microsoft.com/iot/opc-ua-test-server\ntag: 2.9.15\npullPolicy: Always\npullSecrets: []\n# Controls number of OPC UA Test servers that should be deployed.\nsimulations: 1\n\n# Unused, opc test always uses the default application certificate.\n# TODO, remove and pass same to opc-plc as additionalArgs\nautoAcceptUntrustedCertificates: true\n# Controls if the security context should be set for the OPC UA Test server simulation server.\nsetSecurityContext: true\n# Additional arguments for the OPC UA Test server simulation\n# This should be an array of arrays, where each inner array contains the arguments for a specific instance.\nadditionalArgs: []\n\nresources:\n  requests:\n    memory: 192Mi\n    cpu: 125m\n  limits:\n    memory: 768Mi\n    cpu: 500m\n\nnameOverride: null\ndeployDefaultIssuerCA: false\n\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/opc-umati/templates/umati_deployment.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $simulationSelectorLabels := include \"simulation.selectorLabels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: umati-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\n    app.kubernetes.io/component: umati-{{ $suffix }}\nspec:\n  selector:\n    matchLabels:\n      {{- $simulationSelectorLabels | nindent 6 }}\n      app.kubernetes.io/component: umati-{{ $suffix }}\n  template:\n    metadata:\n      labels:\n        {{- $simulationSelectorLabels | nindent 8 }}\n        app.kubernetes.io/component: umati-{{ $suffix }}\n    spec:\n      {{- with $.Values.pullSecrets }}\n      imagePullSecrets:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      nodeSelector:\n        \"kubernetes.io/os\": linux\n      containers:\n      - name: umati\n        {{- if $.Values.setSecurityContext }}\n        securityContext:\n          allowPrivilegeEscalation: false\n          privileged: false\n          # runAsNonRoot: true\n          # readOnlyRootFilesystem: true\n          capabilities:\n            drop:\n              - ALL\n          seccompProfile:\n            type: RuntimeDefault\n        {{- end }}\n        image: {{ $.Values.image }}:{{ $.Values.tag }}\n        imagePullPolicy: {{ $.Values.pullPolicy }}\n        ports:\n        - containerPort: 4840\n        args:\n          - \"/app/configuration.json\"\n        volumeMounts:\n          - name: umati-config-{{ $suffix }}\n            mountPath: /app/configuration.json\n            subPath: configuration.json\n          - name: opc-ua-umati-default-application-cert-{{ $suffix }}\n            mountPath: /app/pki/own/\n          - name: opc-ua-umati-default-trusted-cert-{{ $suffix }}\n            mountPath: /app/pki/trusted/\n{{ if $.Values.resources }}\n        resources:\n{{ toYaml $.Values.resources | indent 10 }}\n{{- end }}\n      volumes:\n        - name: umati-config-{{ $suffix }}\n          configMap:\n            name: umati-config-{{ $suffix }}\n        - name: opc-ua-umati-default-application-cert-{{ $suffix }}\n          secret:\n            secretName: opc-ua-umati-default-application-cert-{{ $suffix }}\n        - name: opc-ua-umati-default-trusted-cert-{{ $suffix }}\n          # fallback to trust the own certificate secret. this contain the CA certificate when used.\n          secret:\n            secretName: opc-ua-umati-default-application-cert-{{ $suffix }}\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/umati/Chart.yaml",
    "content": "apiVersion: v2\nname: umati-sample-server\ndescription: A Helm chart for Kubernetes that deploys the Umati sample server.\ntype: application\nversion: 1.0-alpha.1\nappVersion: 1.0-alpha.1\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/umati/templates/_helpers.tpl",
    "content": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"simulation.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"simulation.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{/*\nCommon labels\n*/}}\n{{- define \"simulation.labels\" -}}\nhelm.sh/chart: {{ include \"simulation.chart\" . }}\n{{ include \"simulation.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io/version: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io/managed-by: {{ .Release.Service }}\n{{- end }}\n\n{{/*\nSelector labels\n*/}}\n{{- define \"simulation.selectorLabels\" -}}\napp.kubernetes.io/name: {{ include \"simulation.name\" . }}\napp.kubernetes.io/instance: {{ .Release.Name }}\n{{- end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/umati/templates/umati_configMap.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $releaseName := .Release.Name -}}\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: umati-config-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\ndata:\n  configuration.json: |-\n    {\n      \"Hostname\": \"umati-{{ $suffix }}.{{ $.Release.Namespace }}.svc.cluster.local\",\n      \"Port\": 4840,\n      \"UserPassAuthentication\": [],\n      \"Encryption\": {\n        \"ServerCert\": \"/app/pki/own/tls.crt\",\n        \"ServerKey\": \"/app/pki/own/key.der\",\n        \"TrustedClients\": [\"trusted/trustedClient.der\"],\n        \"IssuerCerts\": [],\n        \"Revocation\": []\n      }\n    }\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/umati/templates/umati_default_application_certificate.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\n{{- if $.Capabilities.APIVersions.Has \"cert-manager.io/v1\" }}\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n  name: opc-ua-umati-default-application-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\nspec:\n  # Secret names are always required.\n  secretName: opc-ua-umati-default-application-cert-{{ $suffix }}\n  #additionalOutputFormats:\n  #- type: DER\n  duration: 8760h # 365d\n  renewBefore: 4380h # 182d\n  subject:\n    #  It is recommended that the user sets here in the subject at least the organization's name. This information will be stored in the certificate and helps to identify the certificate.\n    # organizations:\n    #  - Microsoft\n  commonName: UMATI\n  isCA: false\n  privateKey:\n    algorithm: RSA\n    encoding: PKCS1\n    size: 2048\n    rotationPolicy: Always\n  usages:\n    - content commitment\n    - digital signature\n    - key encipherment\n    - data encipherment\n    - cert sign\n    - client auth\n    - server auth\n  # At least one of a DNS Name, URI, or IP address is required.\n  uris:\n    - urn:UMATI:umati-{{ $suffix }}\n  dnsNames:\n    - umati-{{ $suffix }}.{{ $.Release.Namespace }}\n    - umati-{{ $suffix }}\n  issuerRef:\n    kind: Issuer\n{{- if $.Values.deployDefaultIssuerCA }}\n    name: aio-opc-opcuabroker-default-root-ca-issuer\n{{- else }}\n    name: aio-opc-ua-self-signed-issuer\n{{- end }}\n{{- else }}\n{{ fail \"cert-manager is required to create Certificate resource. Please install cert-manager.\"}}\n{{- end }}\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/umati/templates/umati_deployment.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $simulationSelectorLabels := include \"simulation.selectorLabels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: umati-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\n    app.kubernetes.io/component: umati-{{ $suffix }}\nspec:\n  selector:\n    matchLabels:\n      {{- $simulationSelectorLabels | nindent 6 }}\n      app.kubernetes.io/component: umati-{{ $suffix }}\n  template:\n    metadata:\n      labels:\n        {{- $simulationSelectorLabels | nindent 8 }}\n        app.kubernetes.io/component: umati-{{ $suffix }}\n    spec:\n      hostname: umati-{{ $suffix }}\n      {{- with $.Values.pullSecrets }}\n      imagePullSecrets:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      nodeSelector:\n        \"kubernetes.io/os\": linux\n      containers:\n      - name: umati\n        {{- if $.Values.setSecurityContext }}\n        securityContext:\n          allowPrivilegeEscalation: false\n          privileged: false\n          # runAsNonRoot: true\n          # readOnlyRootFilesystem: true\n          capabilities:\n            drop:\n              - ALL\n          seccompProfile:\n            type: RuntimeDefault\n        {{- end }}\n        image: {{ $.Values.image }}:{{ $.Values.tag }}\n        imagePullPolicy: {{ $.Values.pullPolicy }}\n        ports:\n        - containerPort: 4840\n        args:\n          - \"/app/configuration.json\"\n        volumeMounts:\n          - name: umati-config-{{ $suffix }}\n            mountPath: /app/configuration.json\n            subPath: configuration.json\n          - name: opc-ua-umati-default-application-cert-{{ $suffix }}\n            mountPath: /app/pki/own/\n          - name: opc-ua-umati-default-trusted-cert-{{ $suffix }}\n            mountPath: /app/pki/trusted/\n{{ if $.Values.resources }}\n        resources:\n{{ toYaml $.Values.resources | indent 10 }}\n{{- end }}\n      volumes:\n        - name: umati-config-{{ $suffix }}\n          configMap:\n            name: umati-config-{{ $suffix }}\n        - name: opc-ua-umati-default-application-cert-{{ $suffix }}\n          secret:\n            secretName: opc-ua-umati-default-application-cert-{{ $suffix }}\n        - name: opc-ua-umati-default-trusted-cert-{{ $suffix }}\n          # fallback to trust the own certificate secret. this contain the CA certificate when used.\n          secret:\n            secretName: opc-ua-umati-default-application-cert-{{ $suffix }}\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/umati/templates/umati_service.yaml",
    "content": "{{- $simulationLabels := include \"simulation.labels\" . -}}\n{{- $simulationSelectorLabels := include \"simulation.selectorLabels\" . -}}\n{{- $releaseName := .Release.Name -}}\n\n{{ range $i := until (.Values.simulations | int) }}\n{{ $suffix := printf \"%s-%06d\" $releaseName $i }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: umati-{{ $suffix }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    {{- $simulationLabels | nindent 4 }}\n    app.kubernetes.io/component: umati-{{ $suffix }}-service\nspec:\n  type: ClusterIP\n  selector:\n    {{- $simulationSelectorLabels | nindent 4 }}\n    app.kubernetes.io/component: umati-{{ $suffix }}\n  ports:\n  - port: 4840\n    protocol: TCP\n    targetPort: 4840\n---\n{{ end }}\n"
  },
  {
    "path": "deploy/kubernetes/simulation/helm/umati/values.yaml",
    "content": "image: ghcr.io/umati/sample-server\ntag: develop\npullPolicy: Always\npullSecrets: []\n# Controls number of OPC PLCs that should be deployed.\nsimulations: 1\n\n# Controls if the security bar is lowered for the Umati sample simulation server. When set to true, all client connections will be accepted.\nautoAcceptUntrustedCertificates: true\n\n# Controls if the security context should be set for the Umati sample simulation server.\nsetSecurityContext: true\n\n# Additional arguments for the Umati sample simulation\n# This should be an array of arrays, where each inner array contains the arguments for a specific instance.\nadditionalArgs: []\n\nresources:\n  requests:\n    memory: 192Mi\n    cpu: 125m\n  limits:\n    memory: 768Mi\n    cpu: 500m\n\nnameOverride: null\ndeployDefaultIssuerCA: false\n\n"
  },
  {
    "path": "deploy/readme.md",
    "content": "# Deploy IoT services\n\n[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FIndustrial-IoT%2Fmain%2Fdeploy%2Fazuredeploy.json)\n\nYou can also deploy the required resources using the provided script:\n\n```powershell\n./deploy.ps1 -Name <deployment>\n```\n\nOnce completed you can [deploy Azure IoT Edge using ARM](./iotedge/azuredeploy.json) or [using the provided scripts](./iotedge/readme.md).\n"
  },
  {
    "path": "docs/_config.yml",
    "content": "remote_theme: MicrosoftLearning/Jekyll-Theme\n"
  },
  {
    "path": "docs/opc-publisher/api.md",
    "content": "\n<a name=\"paths\"></a>\n## Resources\n\n<a name=\"certificates_resource\"></a>\n### Certificates\nThis section lists the certificate APi provided by OPC Publisher providing\n            all public and private key infrastructure (PKI) related API methods.\n\nThe method name for all transports other than HTTP (which uses the shown\n            HTTP methods and resource uris) is the name of the subsection header.\n            To use the version specific method append \"_V1\" or \"_V2\" to the method\n            name.\n\n\n<a name=\"addtrustedhttpscertificate\"></a>\n#### AddTrustedHttpsCertificateAsync\n```\nPOST /v2/pki/https/certs\n```\n\n\n##### Description\nAdd a certificate chain to the trusted https store. The certificate is provided as a concatenated set of certificates with the first the one to add, and the remainder the issuer chain.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The certificate chain.|string (byte)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"approverejectedcertificate\"></a>\n#### ApproveRejectedCertificate\n```\nPOST /v2/pki/rejected/certs/{thumbprint}/approve\n```\n\n\n##### Description\nMove a rejected certificate from the rejected folder to the trusted folder on the publisher.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**thumbprint**  <br>*required*|The thumbprint of the certificate to trust.|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"addcertificatechain\"></a>\n#### AddCertificateChain\n```\nPOST /v2/pki/trusted/certs\n```\n\n\n##### Description\nAdd a certificate chain to the specified store. The certificate is provided as a concatenated asn encoded set of certificates with the first the one to add, and the remainder the issuer chain.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The certificate chain.|string (byte)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"removeall\"></a>\n#### RemoveAll\n```\nDELETE /v2/pki/{store}\n```\n\n\n##### Description\nRemove all certificates and revocation lists from the specified store.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**store**  <br>*required*|The store to add the certificate to|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information such store name is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|Nothing could be found.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"listcertificates\"></a>\n#### ListCertificates\n```\nGET /v2/pki/{store}/certs\n```\n\n\n##### Description\nGet the certificates in the specified certificate store\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**store**  <br>*required*|The store to enumerate|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|< [X509CertificateModel](definitions.md#x509certificatemodel) > array|\n|**400**|The passed in information such as store name is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|Nothing could be found.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"addcertificate\"></a>\n#### AddCertificate\n```\nPATCH /v2/pki/{store}/certs\n```\n\n\n##### Description\nAdd a certificate to the specified store. The certificate is provided as a pfx/pkcs12 optionally password protected blob.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**store**  <br>*required*|The store to add the certificate to|string|\n|**Query**|**password**  <br>*optional*|The optional password of the pfx|string|\n|**Body**|**body**  <br>*required*|The pfx encoded certificate.|string (byte)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information such as store name is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"removecertificate\"></a>\n#### RemoveCertificate\n```\nDELETE /v2/pki/{store}/certs/{thumbprint}\n```\n\n\n##### Description\nRemove a certificate with the provided thumbprint from the specified store.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**store**  <br>*required*|The store to add the certificate to|string|\n|**Path**|**thumbprint**  <br>*required*|The thumbprint of the certificate to delete.|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information such store name is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|Nothing could be found.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"listcertificaterevocationlists\"></a>\n#### ListCertificateRevocationLists\n```\nGET /v2/pki/{store}/crls\n```\n\n\n##### Description\nGet the certificates in the specified certificated store\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**store**  <br>*required*|The store to enumerate|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|< string (byte) > array|\n|**400**|The passed in information such as store name is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|Nothing could be found.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"removecertificaterevocationlist\"></a>\n#### RemoveCertificateRevocationList\n```\nDELETE /v2/pki/{store}/crls\n```\n\n\n##### Description\nRemove a certificate revocation list from the specified store.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**store**  <br>*required*|The store to add the certificate to|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information such store name is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|Nothing could be found.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"addcertificaterevocationlist\"></a>\n#### AddCertificateRevocationList\n```\nPATCH /v2/pki/{store}/crls\n```\n\n\n##### Description\nAdd a certificate revocation list to the specified store. The certificate revocation list is provided as a der encoded blob.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**store**  <br>*required*|The store to add the certificate to|string|\n|**Body**|**body**  <br>*required*|The pfx encoded certificate.|string (byte)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An internal error ocurred.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"configuration_resource\"></a>\n### Configuration\nThis section contains the API to configure OPC Publisher.\n\nThe method name for all transports other than HTTP (which uses the shown\n            HTTP methods and resource uris) is the name of the subsection header.\n            To use the version specific method append \"_V1\" or \"_V2\" to the method\n            name.\n\n\n<a name=\"getconfiguredendpoints\"></a>\n#### [GetConfiguredEndpoints](./directmethods.md#getconfiguredendpoints_v1)\n```\nGET /v2/configuration\n```\n\n\n##### Description\nGet a list of nodes under a configured endpoint in the configuration. Further information is provided in the OPC Publisher documentation. configuration.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Query**|**IncludeNodes**  <br>*optional*|Include nodes that make up the configuration|boolean|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The data was retrieved.|[GetConfiguredEndpointsResponseModel](definitions.md#getconfiguredendpointsresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"setconfiguredendpoints\"></a>\n#### [SetConfiguredEndpoints](./directmethods.md#setconfiguredendpoints_v1)\n```\nPUT /v2/configuration\n```\n\n\n##### Description\nEnables clients to update the entire published nodes configuration in one call. This includes clearing the existing configuration. Further information is provided in the OPC Publisher documentation. configuration.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The new published nodes configuration|[SetConfiguredEndpointsRequestModel](definitions.md#setconfiguredendpointsrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"addorupdateendpoints\"></a>\n#### [AddOrUpdateEndpoints](./directmethods.md#addorupdateendpoints_v1)\n```\nPATCH /v2/configuration\n```\n\n\n##### Description\nAdd or update endpoint configuration and nodes on a server. Further information is provided in the OPC Publisher documentation.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The parts of the configuration to add or update.|< [PublishedNodesEntryModel](definitions.md#publishednodesentrymodel) > array|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[PublishedNodesResponseModel](definitions.md#publishednodesresponsemodel)|\n|**404**|The endpoint was not found to add to|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"publishbulk\"></a>\n#### PublishBulk\n```\nPOST /v2/configuration/bulk\n```\n\n\n##### Description\nConfigure node values to publish and unpublish in bulk. The group field in the Connection Model can be used to specify a writer group identifier that will be used in the configuration entry that is created from it inside OPC Publisher.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The nodes to publish or unpublish.|[PublishBulkRequestModelRequestEnvelope](definitions.md#publishbulkrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[PublishBulkResponseModel](definitions.md#publishbulkresponsemodel)|\n|**404**|The item could not be unpublished|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getdiagnosticinfo\"></a>\n#### [GetDiagnosticInfo](./directmethods.md#getdiagnosticinfo_v1)\n```\nPOST /v2/configuration/diagnostics\n```\n\n\n##### Description\nGet the list of diagnostics info for all dataset writers in the OPC Publisher at the point the call is received. Further information is provided in the OPC Publisher documentation.\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|< [PublishDiagnosticInfoModel](definitions.md#publishdiagnosticinfomodel) > array|\n|**405**|Call not supported or functionality disabled.|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getconfigurednodesonendpoint\"></a>\n#### [GetConfiguredNodesOnEndpoint](./directmethods.md#getconfigurednodesonendpoint_v)\n```\nPOST /v2/configuration/endpoints/list/nodes\n```\n\n\n##### Description\nGet the nodes of a published nodes entry object returned earlier from a call to GetConfiguredEndpoints. Further information is provided in the OPC Publisher documentation.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The entry model from a call to GetConfiguredEndpoints for which to gather the nodes.|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The information was returned.|[GetConfiguredNodesOnEndpointResponseModel](definitions.md#getconfigurednodesonendpointresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|The entry was not found.|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"publishlist\"></a>\n#### PublishList\n```\nPOST /v2/configuration/list\n```\n\n\n##### Description\nGet all published nodes for a server endpoint. The group field that was used in the Connection Model to start publishing must also be specified in this connection model.\n\n\n##### Parameters\n\n|Type|Name|Schema|\n|---|---|---|\n|**Body**|**body**  <br>*required*|[PublishedItemListRequestModelRequestEnvelope](definitions.md#publisheditemlistrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The items were found and returned.|[PublishedItemListResponseModel](definitions.md#publisheditemlistresponsemodel)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"publishnodes\"></a>\n#### [PublishNodes](./directmethods.md#publishnodes_v1)\n```\nPOST /v2/configuration/nodes\n```\n\n\n##### Description\nPublishNodes enables a client to add a set of nodes to be published. Further information is provided in the OPC Publisher documentation.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request contains the nodes to publish.|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[PublishedNodesResponseModel](definitions.md#publishednodesresponsemodel)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"unpublishnodes\"></a>\n#### [UnpublishNodes](./directmethods.md#unpublishnodes_v1)\n```\nPOST /v2/configuration/nodes/unpublish\n```\n\n\n##### Description\nUnpublishNodes method enables a client to remove nodes from a previously configured DataSetWriter. Further information is provided in the OPC Publisher documentation.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload specifying the nodes to unpublish.|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[PublishedNodesResponseModel](definitions.md#publishednodesresponsemodel)|\n|**404**|The nodes could not be unpublished|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"unpublishallnodes\"></a>\n#### [UnpublishAllNodes](./directmethods.md#unpublishallnodes_v1)\n```\nPOST /v2/configuration/nodes/unpublish/all\n```\n\n\n##### Description\nUnpublish all specified nodes or all nodes in the publisher configuration. Further information is provided in the OPC Publisher documentation.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*optional*|The request contains the parts of the configuration to remove.|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[PublishedNodesResponseModel](definitions.md#publishednodesresponsemodel)|\n|**404**|The nodes could not be unpublished|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"publishstart\"></a>\n#### PublishStart\n```\nPOST /v2/configuration/start\n```\n\n\n##### Description\nStart publishing values from a node on a server. The group field in the Connection Model can be used to specify a writer group identifier that will be used in the configuration entry that is created from it inside OPC Publisher.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The server and node to publish.|[PublishStartRequestModelRequestEnvelope](definitions.md#publishstartrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[PublishStartResponseModel](definitions.md#publishstartresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"publishstop\"></a>\n#### PublishStop\n```\nPOST /v2/configuration/stop\n```\n\n\n##### Description\nStop publishing values from a node on the specified server. The group field that was used in the Connection Model to start publishing must also be specified in this connection model.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The node to stop publishing|[PublishStopRequestModelRequestEnvelope](definitions.md#publishstoprequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[PublishStopResponseModel](definitions.md#publishstopresponsemodel)|\n|**404**|The item could not be unpublished|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"diagnostics_resource\"></a>\n### Diagnostics\nThis section lists the diagnostics APi provided by OPC Publisher providing\n            connection related diagnostics API methods.\n\nThe method name for all transports other than HTTP (which uses the shown\n            HTTP methods and resource uris) is the name of the subsection header.\n            To use the version specific method append \"_V1\" or \"_V2\" to the method\n            name.\n\n\n<a name=\"getactiveconnections\"></a>\n#### GetActiveConnections\n```\nGET /v2/connections\n```\n\n\n##### Description\nGet all active connections the publisher is currently managing.\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|< [ConnectionModel](definitions.md#connectionmodel) > array|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getchanneldiagnostics\"></a>\n#### GetChannelDiagnostics\n```\nGET /v2/diagnostics/channels\n```\n\n\n##### Description\nGet channel diagnostic information for all connections.\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|< [ChannelDiagnosticModel](definitions.md#channeldiagnosticmodel) > array|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"watchchanneldiagnostics\"></a>\n#### WatchChannelDiagnostics\n```\nGET /v2/diagnostics/channels/watch\n```\n\n\n##### Description\nGet channel diagnostic information for all connections. The first set of diagnostics are the diagnostics active for all connections, continue reading to get updates.\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[ChannelDiagnosticModelIAsyncEnumerable](definitions.md#channeldiagnosticmodeliasyncenumerable)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getconnectiondiagnostics\"></a>\n#### GetConnectionDiagnostics\n```\nGET /v2/diagnostics/connections\n```\n\n\n##### Description\nGet diagnostics for all active clients including server and client session diagnostics.\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|[ConnectionDiagnosticsModelIAsyncEnumerable](definitions.md#connectiondiagnosticsmodeliasyncenumerable)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"resetallconnections\"></a>\n#### ResetAllConnections\n```\nGET /v2/reset\n```\n\n\n##### Description\nCan be used to reset all established connections causing a full reconnect and recreate of all subscriptions.\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful.|No Content|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"discovery_resource\"></a>\n### Discovery\nOPC UA and network discovery related API.\n\nThe method name for all transports other than HTTP (which uses the shown\n            HTTP methods and resource uris) is the name of the subsection header.\n            To use the version specific method append \"_V1\" or \"_V2\" to the method\n\n\n<a name=\"discover\"></a>\n#### Discover\n```\nPOST /v2/discovery\n```\n\n\n##### Description\nStart network discovery using the provided discovery request configuration. The discovery results are published to the configured default event transport.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The discovery configuration to use during the discovery run.|[DiscoveryRequestModel](definitions.md#discoveryrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|boolean|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"cancel\"></a>\n#### Cancel\n```\nPOST /v2/discovery/cancel\n```\n\n\n##### Description\nCancel a discovery run that is ongoing using the discovery request token specified in the discover operation.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The information needed to cancel the discovery operation.|[DiscoveryCancelRequestModel](definitions.md#discoverycancelrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|boolean|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"findserver\"></a>\n#### FindServer\n```\nPOST /v2/discovery/findserver\n```\n\n\n##### Description\nFind servers matching the specified endpoint query spec.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The endpoint query specifying the matching criteria for the discovered endpoints.|[ServerEndpointQueryModel](definitions.md#serverendpointquerymodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[ApplicationRegistrationModel](definitions.md#applicationregistrationmodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"register\"></a>\n#### Register\n```\nPOST /v2/discovery/register\n```\n\n\n##### Description\nStart server registration. The results of the registration are published as events to the default event transport.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|Contains all information to perform the registration request including discovery url to use.|[ServerRegistrationRequestModel](definitions.md#serverregistrationrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|boolean|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"filesystem_resource\"></a>\n### FileSystem\nThis section lists the file transfer API provided by OPC Publisher providing\n            access to file transfer services to move files in and out of a server\n            using the File transfer specification.\n\nThe method name for all transports other than HTTP (which uses the shown\n            HTTP methods and resource uris) is the name of the subsection header.\n            To use the version specific method append \"_V1\" or \"_V2\" to the method\n            name.\n\n\n<a name=\"createdirectory\"></a>\n#### CreateDirectory\n```\nPOST /v2/filesystem/create/directory/{name}\n```\n\n\n##### Description\nCreate a new directory in an existing file system or directory on the server.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**name**  <br>*required*|The name of the directory to create as child under the parent directory provided|string|\n|**Body**|**body**  <br>*required*|The file system or directory object to create the directory in and the connection information identifying the server to connect to perform the operation on.|[FileSystemObjectModelRequestEnvelope](definitions.md#filesystemobjectmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[FileSystemObjectModelServiceResponse](definitions.md#filesystemobjectmodelserviceresponse)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"createfile\"></a>\n#### CreateFile\n```\nPOST /v2/filesystem/create/file/{name}\n```\n\n\n##### Description\nCreate a new file in a directory or file system on the server\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**name**  <br>*required*|The name of the file to create as child under the directory or filesystem provided|string|\n|**Body**|**body**  <br>*required*|The file system or directory object to create the file in and the connection information identifying the server to connect to perform the operation on.|[FileSystemObjectModelRequestEnvelope](definitions.md#filesystemobjectmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[FileSystemObjectModelServiceResponse](definitions.md#filesystemobjectmodelserviceresponse)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"deletefilesystemobject\"></a>\n#### DeleteFileSystemObject\n```\nPOST /v2/filesystem/delete\n```\n\n\n##### Description\nDelete a file or directory in an existing file system on the server.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The file or directory object to delete and the connection information identifying the server to connect to perform the operation on.|[FileSystemObjectModelRequestEnvelope](definitions.md#filesystemobjectmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"deletefileordirectory\"></a>\n#### DeleteFileOrDirectory\n```\nPOST /v2/filesystem/delete/{fileOrDirectoryNodeId}\n```\n\n\n##### Description\nDelete a file or directory in the specified directory or file system.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**fileOrDirectoryNodeId**  <br>*required*|The node id of the file or directory to delete|string|\n|**Body**|**body**  <br>*required*|The filesystem or directory object in which to delete the specified file or directory and the connection to use for the operation.|[FileSystemObjectModelRequestEnvelope](definitions.md#filesystemobjectmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"download\"></a>\n#### Download\n```\nGET /v2/filesystem/download\n```\n\n\n##### Description\nDownload a file from the server\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Header**|**x-ms-connection**  <br>*required*|The connection information identifying the server to connect to perform the operation on. This is passed as json serialized via the header \"x-ms-connection\"|string|\n|**Header**|**x-ms-target**  <br>*required*|The file object to upload. This is passed as json serialized via the header \"x-ms-target\"|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getfileinfo\"></a>\n#### GetFileInfo\n```\nPOST /v2/filesystem/info/file\n```\n\n\n##### Description\nGets the file information for a file on the server.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The file object and connection information identifying the server to connect to perform the operation on.|[FileSystemObjectModelRequestEnvelope](definitions.md#filesystemobjectmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[FileInfoModelServiceResponse](definitions.md#fileinfomodelserviceresponse)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getfilesystems\"></a>\n#### GetFileSystems\n```\nPOST /v2/filesystem/list\n```\n\n\n##### Description\nGets all file systems of the server.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The connection information identifying the server to connect to perform the operation on.|[ConnectionModel](definitions.md#connectionmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[FileSystemObjectModelServiceResponseIAsyncEnumerable](definitions.md#filesystemobjectmodelserviceresponseiasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getdirectories\"></a>\n#### GetDirectories\n```\nPOST /v2/filesystem/list/directories\n```\n\n\n##### Description\nGets all directories in a directory or file system\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The directory or filesystem object and connection information identifying the server to connect to perform the operation on.|[FileSystemObjectModelRequestEnvelope](definitions.md#filesystemobjectmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[FileSystemObjectModelIEnumerableServiceResponse](definitions.md#filesystemobjectmodelienumerableserviceresponse)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getfiles\"></a>\n#### GetFiles\n```\nPOST /v2/filesystem/list/files\n```\n\n\n##### Description\nGet files in a directory or file system on a server.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The directory or filesystem object and connection information identifying the server to connect to perform the operation on.|[FileSystemObjectModelRequestEnvelope](definitions.md#filesystemobjectmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[FileSystemObjectModelIEnumerableServiceResponse](definitions.md#filesystemobjectmodelienumerableserviceresponse)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getparent\"></a>\n#### GetParent\n```\nPOST /v2/filesystem/parent\n```\n\n\n##### Description\nGets the parent directory or filesystem of a file or directory.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The file or directory object and connection information identifying the server to connect to perform the operation on.|[FileSystemObjectModelRequestEnvelope](definitions.md#filesystemobjectmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[FileSystemObjectModelServiceResponse](definitions.md#filesystemobjectmodelserviceresponse)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"upload\"></a>\n#### Upload\n```\nPOST /v2/filesystem/upload\n```\n\n\n##### Description\nUpload a file to the server.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Header**|**x-ms-connection**  <br>*required*|The connection information identifying the server to connect to perform the operation on. This is passed as json serialized via the header \"x-ms-connection\"|string|\n|**Header**|**x-ms-options**  <br>*required*|The file write options to use passed as header \"x-ms-mode\"|string|\n|**Header**|**x-ms-target**  <br>*required*|The file object to upload. This is passed as json serialized via the header \"x-ms-target\"|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"general_resource\"></a>\n### General\nThis section lists the general APi provided by OPC Publisher providing\n            all connection, endpoint and address space related API methods.\n\nThe method name for all transports other than HTTP (which uses the shown\n            HTTP methods and resource uris) is the name of the subsection header.\n            To use the version specific method append \"_V1\" or \"_V2\" to the method\n            name.\n\n\n<a name=\"browsestream\"></a>\n#### BrowseStream (only HTTP transport)\n```\nPOST /v2/browse\n```\n\n\n##### Description\nRecursively browse a node to discover its references and nodes. The results are returned as a stream of nodes and references. Consult <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.2\"> the relevant section of the OPC UA reference specification</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[BrowseStreamRequestModelRequestEnvelope](definitions.md#browsestreamrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[BrowseStreamChunkModelIAsyncEnumerable](definitions.md#browsestreamchunkmodeliasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"browse\"></a>\n#### Browse\n```\nPOST /v2/browse/first\n```\n\n\n##### Description\nBrowse a a node to discover its references. For more information consult <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.2\"> the relevant section of the OPC UA reference specification</a>. The operation might return a continuation token. The continuation token can be used in the BrowseNext method call to retrieve the remainder of references or additional continuation tokens.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[BrowseFirstRequestModelRequestEnvelope](definitions.md#browsefirstrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[BrowseFirstResponseModel](definitions.md#browsefirstresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"browsenext\"></a>\n#### BrowseNext\n```\nPOST /v2/browse/next\n```\n\n\n##### Description\nBrowse next\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[BrowseNextRequestModelRequestEnvelope](definitions.md#browsenextrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[BrowseNextResponseModel](definitions.md#browsenextresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"browsepath\"></a>\n#### BrowsePath\n```\nPOST /v2/browse/path\n```\n\n\n##### Description\nTranslate a start node and browse path into 0 or more target nodes. Allows programming aginst types in OPC UA. For more information consult <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.4\"> the relevant section of the OPC UA reference specification</a>.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[BrowsePathRequestModelRequestEnvelope](definitions.md#browsepathrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[BrowsePathResponseModel](definitions.md#browsepathresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"methodcall\"></a>\n#### MethodCall\n```\nPOST /v2/call\n```\n\n\n##### Description\nCall a method on the OPC UA server endpoint with the specified input arguments and received the result in the form of the method output arguments. See <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11.2\"> the relevant section of the OPC UA reference specification</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[MethodCallRequestModelRequestEnvelope](definitions.md#methodcallrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[MethodCallResponseModel](definitions.md#methodcallresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"methodmetadata\"></a>\n#### MethodMetadata\n```\nPOST /v2/call/$metadata\n```\n\n\n##### Description\nGet the metadata for calling the method. This API is obsolete. Use the more powerful GetMetadata method instead.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[MethodMetadataRequestModelRequestEnvelope](definitions.md#methodmetadatarequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[MethodMetadataResponseModel](definitions.md#methodmetadataresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getservercapabilities\"></a>\n#### GetServerCapabilities\n```\nPOST /v2/capabilities\n```\n\n\n##### Description\nGet the capabilities of the server. The server capabilities are exposed as a property of the server object and this method provides a convinient way to retrieve them.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[RequestHeaderModelRequestEnvelope](definitions.md#requestheadermodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[ServerCapabilitiesModel](definitions.md#servercapabilitiesmodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getendpointcertificate\"></a>\n#### GetEndpointCertificate\n```\nPOST /v2/certificate\n```\n\n\n##### Description\nGet a server endpoint's certificate and certificate chain if available.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The server endpoint to get the certificate for.|[EndpointModel](definitions.md#endpointmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[X509CertificateChainModel](definitions.md#x509certificatechainmodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historygetservercapabilities\"></a>\n#### HistoryGetServerCapabilities\n```\nPOST /v2/history/capabilities\n```\n\n\n##### Description\nGet the historian capabilities exposed as part of the OPC UA server server object.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[RequestHeaderModelRequestEnvelope](definitions.md#requestheadermodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryServerCapabilitiesModel](definitions.md#historyservercapabilitiesmodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historygetconfiguration\"></a>\n#### HistoryGetConfiguration\n```\nPOST /v2/history/configuration\n```\n\n\n##### Description\nGet the historian configuration of a historizing node in the OPC UA server\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[HistoryConfigurationRequestModelRequestEnvelope](definitions.md#historyconfigurationrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryConfigurationResponseModel](definitions.md#historyconfigurationresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyread\"></a>\n#### HistoryRead\n```\nPOST /v2/historyread/first\n```\n\n\n##### Description\nRead the history using the respective OPC UA service call. See <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> the relevant section of the OPC UA reference specification</a> for more information. If continuation is returned the remaining results of the operation can be read using the HistoryReadNext method.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[VariantValueHistoryReadRequestModelRequestEnvelope](definitions.md#variantvaluehistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[VariantValueHistoryReadResponseModel](definitions.md#variantvaluehistoryreadresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreadnext\"></a>\n#### HistoryReadNext\n```\nPOST /v2/historyread/next\n```\n\n\n##### Description\nRead next history using the respective OPC UA service call. See <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> the relevant section of the OPC UA reference specification</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[HistoryReadNextRequestModelRequestEnvelope](definitions.md#historyreadnextrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[VariantValueHistoryReadNextResponseModel](definitions.md#variantvaluehistoryreadnextresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyupdate\"></a>\n#### HistoryUpdate\n```\nPOST /v2/historyupdate\n```\n\n\n##### Description\nUpdate history using the respective OPC UA service call. Consult the <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> relevant section of the OPC UA reference specification</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[VariantValueHistoryUpdateRequestModelRequestEnvelope](definitions.md#variantvaluehistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getmetadata\"></a>\n#### GetMetadata\n```\nPOST /v2/metadata\n```\n\n\n##### Description\nGet the type metadata for a any node. For data type nodes the response contains the data type metadata including fields. For method nodes the output and input arguments metadata is provided. For objects and object types the instance declaration is returned.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[NodeMetadataRequestModelRequestEnvelope](definitions.md#nodemetadatarequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[NodeMetadataResponseModel](definitions.md#nodemetadataresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"compilequery\"></a>\n#### CompileQuery\n```\nPOST /v2/query/compile\n```\n\n\n##### Description\nCompile a query string into a query spec that can be used when setting up event filters on monitored items that monitor events.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The compilation request and connection information.|[QueryCompilationRequestModelRequestEnvelope](definitions.md#querycompilationrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[QueryCompilationResponseModel](definitions.md#querycompilationresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"valueread\"></a>\n#### ValueRead\n```\nPOST /v2/read\n```\n\n\n##### Description\nRead the value of a variable node. This uses the service detailed in the <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.1\"> relevant section of the OPC UA reference specification</a>.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[ValueReadRequestModelRequestEnvelope](definitions.md#valuereadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[ValueReadResponseModel](definitions.md#valuereadresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"noderead\"></a>\n#### NodeRead\n```\nPOST /v2/read/attributes\n```\n\n\n##### Description\nRead any writeable attribute of a specified node on the server. See <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.2\"> the relevant section of the OPC UA reference specification</a> for more information. The attributes supported by the node are dependend on the node class of the node.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[ReadRequestModelRequestEnvelope](definitions.md#readrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[ReadResponseModel](definitions.md#readresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"testconnection\"></a>\n#### TestConnection\n```\nPOST /v2/test\n```\n\n\n##### Description\nTest connection to an opc ua server. The call will not establish any persistent connection but will just allow a client to test that the server is available.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[TestConnectionRequestModelRequestEnvelope](definitions.md#testconnectionrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[TestConnectionResponseModel](definitions.md#testconnectionresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"valuewrite\"></a>\n#### ValueWrite\n```\nPOST /v2/write\n```\n\n\n##### Description\nWrite the value of a variable node. This uses the service detailed in <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.4\"> the relevant section of the OPC UA reference specification</a>.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[ValueWriteRequestModelRequestEnvelope](definitions.md#valuewriterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[ValueWriteResponseModel](definitions.md#valuewriteresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"nodewrite\"></a>\n#### NodeWrite\n```\nPOST /v2/write/attributes\n```\n\n\n##### Description\nWrite any writeable attribute of a specified node on the server. See <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.4\"> the relevant section of the OPC UA reference specification</a> for more information. The attributes supported by the node are dependend on the node class of the node.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The request payload and connection information identifying the server to connect to perform the operation on.|[WriteRequestModelRequestEnvelope](definitions.md#writerequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[WriteResponseModel](definitions.md#writeresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"history_resource\"></a>\n### History\nThis section lists all OPC UA HDA or Historian related API provided by\n            OPC Publisher.\n\nThe method name for all transports other than HTTP (which uses the shown\n            HTTP methods and resource uris) is the name of the subsection header.\n            To use the version specific method append \"_V1\" or \"_V2\" to the method\n            name.\n\n\n<a name=\"historydeleteevents\"></a>\n#### HistoryDeleteEvents\n```\nPOST /v2/history/events/delete\n```\n\n\n##### Description\nDelete event entries in a timeseries of the server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The events to delete in the timeseries.|[DeleteEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#deleteeventsdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyinsertevents\"></a>\n#### HistoryInsertEvents\n```\nPOST /v2/history/events/insert\n```\n\n\n##### Description\nInsert event entries into a specified timeseries of the historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The events to insert into the timeseries.|[UpdateEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#updateeventsdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historystreamevents\"></a>\n#### HistoryStreamEvents (only HTTP transport)\n```\nPOST /v2/history/events/read\n```\n\n\n##### Description\nRead an entire event timeseries from an OPC UA server historian as stream. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The events to read in the timeseries.|[ReadEventsDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readeventsdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricEventModelIAsyncEnumerable](definitions.md#historiceventmodeliasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreadevents\"></a>\n#### HistoryReadEvents\n```\nPOST /v2/history/events/read/first\n```\n\n\n##### Description\nRead an event timeseries inside the OPC UA server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The events to read in the timeseries.|[ReadEventsDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readeventsdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricEventModelArrayHistoryReadResponseModel](definitions.md#historiceventmodelarrayhistoryreadresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreadeventsnext\"></a>\n#### HistoryReadEventsNext\n```\nPOST /v2/history/events/read/next\n```\n\n\n##### Description\nContinue reading an event timeseries inside the OPC UA server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The continuation from a previous read request.|[HistoryReadNextRequestModelRequestEnvelope](definitions.md#historyreadnextrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricEventModelArrayHistoryReadNextResponseModel](definitions.md#historiceventmodelarrayhistoryreadnextresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreplaceevents\"></a>\n#### HistoryReplaceEvents\n```\nPOST /v2/history/events/replace\n```\n\n\n##### Description\nReplace events in a timeseries in the historian of the OPC UA server. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The events to replace with in the timeseries.|[UpdateEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#updateeventsdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyupsertevents\"></a>\n#### HistoryUpsertEvents\n```\nPOST /v2/history/events/upsert\n```\n\n\n##### Description\nUpsert events into a time series of the opc server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The events to upsert into the timeseries.|[UpdateEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#updateeventsdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historydeletevalues\"></a>\n#### HistoryDeleteValues\n```\nPOST /v2/history/values/delete\n```\n\n\n##### Description\nDelete value change entries in a timeseries of the server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to delete in the timeseries.|[DeleteValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#deletevaluesdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historydeletevaluesattimes\"></a>\n#### HistoryDeleteValuesAtTimes\n```\nPOST /v2/history/values/delete/attimes\n```\n\n\n##### Description\nDelete value change entries in a timeseries of the server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to delete in the timeseries.|[DeleteValuesAtTimesDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#deletevaluesattimesdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historydeletemodifiedvalues\"></a>\n#### HistoryDeleteModifiedValues\n```\nPOST /v2/history/values/delete/modified\n```\n\n\n##### Description\nDelete value change entries in a timeseries of the server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to delete in the timeseries.|[DeleteValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#deletevaluesdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyinsertvalues\"></a>\n#### HistoryInsertValues\n```\nPOST /v2/history/values/insert\n```\n\n\n##### Description\nInsert value change entries in a timeseries of the server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to insert into the timeseries.|[UpdateValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#updatevaluesdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historystreamvalues\"></a>\n#### HistoryStreamValues (only HTTP transport)\n```\nPOST /v2/history/values/read\n```\n\n\n##### Description\nRead an entire timeseries from an OPC UA server historian as stream. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to read in the timeseries.|[ReadValuesDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelIAsyncEnumerable](definitions.md#historicvaluemodeliasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historystreamvaluesattimes\"></a>\n#### HistoryStreamValuesAtTimes (only HTTP transport)\n```\nPOST /v2/history/values/read/attimes\n```\n\n\n##### Description\nRead specific timeseries data from an OPC UA server historian as stream. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to read in the timeseries.|[ReadValuesAtTimesDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readvaluesattimesdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelIAsyncEnumerable](definitions.md#historicvaluemodeliasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreadvalues\"></a>\n#### HistoryReadValues\n```\nPOST /v2/history/values/read/first\n```\n\n\n##### Description\nRead a data change timeseries inside the OPC UA server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to read in the timeseries.|[ReadValuesDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelArrayHistoryReadResponseModel](definitions.md#historicvaluemodelarrayhistoryreadresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreadvaluesattimes\"></a>\n#### HistoryReadValuesAtTimes\n```\nPOST /v2/history/values/read/first/attimes\n```\n\n\n##### Description\nRead parts of a timeseries inside the OPC UA server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to read in the timeseries.|[ReadValuesAtTimesDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readvaluesattimesdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelArrayHistoryReadResponseModel](definitions.md#historicvaluemodelarrayhistoryreadresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreadmodifiedvalues\"></a>\n#### HistoryReadModifiedValues\n```\nPOST /v2/history/values/read/first/modified\n```\n\n\n##### Description\nRead modified changes in a timeseries inside the OPC UA server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to read in the timeseries.|[ReadModifiedValuesDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readmodifiedvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelArrayHistoryReadResponseModel](definitions.md#historicvaluemodelarrayhistoryreadresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreadprocessedvalues\"></a>\n#### HistoryReadProcessedValues\n```\nPOST /v2/history/values/read/first/processed\n```\n\n\n##### Description\nRead processed timeseries data inside the OPC UA server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to read in the timeseries.|[ReadProcessedValuesDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readprocessedvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelArrayHistoryReadResponseModel](definitions.md#historicvaluemodelarrayhistoryreadresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historystreammodifiedvalues\"></a>\n#### HistoryStreamModifiedValues (only HTTP transport)\n```\nPOST /v2/history/values/read/modified\n```\n\n\n##### Description\nRead an entire modified series from an OPC UA server historian as stream. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to read in the timeseries.|[ReadModifiedValuesDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readmodifiedvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelIAsyncEnumerable](definitions.md#historicvaluemodeliasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreadvaluesnext\"></a>\n#### HistoryReadValuesNext\n```\nPOST /v2/history/values/read/next\n```\n\n\n##### Description\nContinue reading a timeseries inside the OPC UA server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The continuation token from a previous read operation.|[HistoryReadNextRequestModelRequestEnvelope](definitions.md#historyreadnextrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelArrayHistoryReadNextResponseModel](definitions.md#historicvaluemodelarrayhistoryreadnextresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historystreamprocessedvalues\"></a>\n#### HistoryStreamProcessedValues (only HTTP transport)\n```\nPOST /v2/history/values/read/processed\n```\n\n\n##### Description\nRead processed timeseries data from an OPC UA server historian as stream. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to read in the timeseries.|[ReadProcessedValuesDetailsModelHistoryReadRequestModelRequestEnvelope](definitions.md#readprocessedvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoricValueModelIAsyncEnumerable](definitions.md#historicvaluemodeliasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyreplacevalues\"></a>\n#### HistoryReplaceValues\n```\nPOST /v2/history/values/replace\n```\n\n\n##### Description\nReplace value change entries in a timeseries of the server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to replace with in the timeseries.|[UpdateValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#updatevaluesdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"historyupsertvalues\"></a>\n#### HistoryUpsertValues\n```\nPOST /v2/history/values/upsert\n```\n\n\n##### Description\nUpsert value change entries in a timeseries of the server historian. See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\"> the relevant section of the OPC UA reference specification</a> and <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\"> respective service documentation</a> for more information.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The values to upsert into the timeseries.|[UpdateValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope](definitions.md#updatevaluesdetailsmodelhistoryupdaterequestmodelrequestenvelope)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The operation was successful or the response payload contains relevant error information.|[HistoryUpdateResponseModel](definitions.md#historyupdateresponsemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"writer_resource\"></a>\n### Writer\nThis section contains the API to configure data set writers and writer\n            groups inside OPC Publisher. It supersedes the configuration API.\n            Applications should use one or the other, but not both at the same\n            time.\n\nThe method name for all transports other than HTTP (which uses the shown\n            HTTP methods and resource uris) is the name of the subsection header.\n            To use the version specific method append \"_V1\" or \"_V2\" to the method\n            name.\n\n\n<a name=\"expandandcreateorupdatedatasetwriterentries\"></a>\n#### ExpandAndCreateOrUpdateDataSetWriterEntries\n```\nPOST /v2/writer\n```\n\n\n##### Description\nCreate a series of published nodes entries using the provided entry as template. The entry is expanded using expansion configuration provided. Expanded entries are returned one by one with error information if any. The configuration is also saved in the local configuration store. The server must be online and accessible for the expansion to work.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The entry to create for the writer and node expansion configuration to use|[PublishedNodeExpansionModelPublishedNodesEntryRequestModel](definitions.md#publishednodeexpansionmodelpublishednodesentryrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The item was created|[PublishedNodesEntryModelServiceResponseIAsyncEnumerable](definitions.md#publishednodesentrymodelserviceresponseiasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to update.|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"createorupdatedatasetwriterentry\"></a>\n#### CreateOrUpdateDataSetWriterEntry\n```\nPUT /v2/writer\n```\n\n\n##### Description\nCreate a published nodes entry for a specific writer group and dataset writer. The entry must specify a unique writer group and dataset writer id. A null value is treated as empty string. If the entry is found it is replaced, if it is not found, it is created. If more than one entry is found with the same writer group and writer id an error is returned. The writer entry provided must include at least one node which will be the initial set. All nodes must specify a unique dataSetFieldId. A null value is treated as empty string. Publishing intervals at node level are also not supported and generate an error. Publishing intervals must be configured at the data set writer level.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The entry to create for the writer|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The item was created|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to update.|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"createorupdateasset\"></a>\n#### CreateOrUpdateAsset\n```\nPOST /v2/writer/assets\n```\n\n\n##### Description\nCreates an asset from the entry in the request and the configuration provided in the Web of Things Asset json configuration property. The entry must contain a data set name which will be used as the asset name. The writer can stay empty. It will be set to the asset id on successful return. The server must support the WoT profile per <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\" />. The asset will be created and the configuration updated to reference it. A wait time can be provided as optional query parameter to wait until the server has settled after uploading the configuration.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The contains the entry and WoT file to configure the server to expose the asset.|[VariantValuePublishedNodeCreateAssetRequestModel](definitions.md#variantvaluepublishednodecreateassetrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The asset was created|[PublishedNodesEntryModelServiceResponse](definitions.md#publishednodesentrymodelserviceresponse)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|Forbidden|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"createorupdateasset2\"></a>\n#### CreateOrUpdateAsset (With binary configuration)\n```\nPOST /v2/writer/assets/create\n```\n\n\n##### Description\nCreates an asset from the entry in the request and the configuration provided in the Web of Things Asset configuration byte buffer. The entry must contain a data set name which will be used as the asset name. The writer can stay empty. It will be set to the asset id on successful return. The server must support the WoT profile per <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\" />. The asset will be created and the configuration updated to reference it. A wait time can be provided as optional query parameter to wait until the server has settled after uploading the configuration.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The contains the entry and WoT file to configure the server to expose the asset.|[ByteArrayPublishedNodeCreateAssetRequestModel](definitions.md#bytearraypublishednodecreateassetrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The asset was created|[PublishedNodesEntryModelServiceResponse](definitions.md#publishednodesentrymodelserviceresponse)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|Forbidden|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"deleteasset\"></a>\n#### DeleteAsset\n```\nPOST /v2/writer/assets/delete\n```\n\n\n##### Description\nDelete the asset referenced by the entry in the request. The entry must contain the asset id to delete. The asset id is the data set writer id. The entry must also contain the writer group id or deletion of the asset in the configuration will fail before the asset is deleted. The server must support WoT connectivity profile per <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\" />. First the entry in the configuration will be deleted and then the asset on the server. If deletion of the asset in the configuration fails it will not be deleted in the server. An optional request option force can be used to force the deletion of the asset in the server regardless of the failure to delete the entry in the configuration.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|Request that contains the entry of the asset that should be deleted.|[PublishedNodeDeleteAssetRequestModel](definitions.md#publishednodedeleteassetrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The asset was deleted successfully|[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|Forbidden|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getallassets\"></a>\n#### GetAllAssets\n```\nPOST /v2/writer/assets/list\n```\n\n\n##### Description\nGet a list of entries representing the assets in the server. This will not touch the configuration, it will obtain the list from the server. If the server does not support <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\" /> the result will be empty.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The entry to use to list the assets with the optional header information used when invoking services on the server.|[RequestHeaderModelPublishedNodesEntryRequestModel](definitions.md#requestheadermodelpublishednodesentryrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|Successfully completed the listing|[PublishedNodesEntryModelServiceResponseIAsyncEnumerable](definitions.md#publishednodesentrymodelserviceresponseiasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|Forbidden|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"expandwriter\"></a>\n#### ExpandWriter\n```\nPOST /v2/writer/expand\n```\n\n\n##### Description\nExpands the provided nodes in the entry to a series of published node entries. The provided entry is used template. The entry is expanded using expansion configuration provided. Expanded entries are returned one by one with error information if any. The configuration is not updated but the resulting entries can be modified and later saved in the configuration using the configuration API. The server must be online and accessible for the expansion to work.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Body**|**body**  <br>*required*|The entry to expand and the node expansion configuration to use. If no configuration is provided a default configuration is used which and no error entries are returned.|[PublishedNodeExpansionModelPublishedNodesEntryRequestModel](definitions.md#publishednodeexpansionmodelpublishednodesentryrequestmodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The item was created|[PublishedNodesEntryModelServiceResponseIAsyncEnumerable](definitions.md#publishednodesentrymodelserviceresponseiasyncenumerable)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to update.|[ProblemDetails](definitions.md#problemdetails)|\n|**408**|The operation timed out.|[ProblemDetails](definitions.md#problemdetails)|\n|**500**|An unexpected error occurred|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getdatasetwriterentry\"></a>\n#### GetDataSetWriterEntry\n```\nGET /v2/writer/{dataSetWriterGroup}/{dataSetWriterId}\n```\n\n\n##### Description\nGet the published nodes entry for a specific writer group and dataset writer. Dedicated errors are returned if no, or no unique entry could be found. The entry does not contain the nodes. Nodes can be retrieved using the GetNodes API.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**dataSetWriterGroup**  <br>*required*|The writer group name of the entry|string|\n|**Path**|**dataSetWriterId**  <br>*required*|The data set writer identifer of the entry|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The item was found|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|There is no unique item present.|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|The item was not found|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"addorupdatenode\"></a>\n#### AddOrUpdateNode\n```\nPUT /v2/writer/{dataSetWriterGroup}/{dataSetWriterId}\n```\n\n\n##### Description\nAdd a node to a dedicated data set writer in a writer group. A node must have a unique DataSetFieldId. If the field already exists, the node is updated. If a node does not have a dataset field id an error is returned. Publishing intervals at node level are also not supported and generate an error. Publishing intervals must be configured at the data set writer level.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**dataSetWriterGroup**  <br>*required*|The writer group name of the entry|string|\n|**Path**|**dataSetWriterId**  <br>*required*|The data set writer identifer of the entry|string|\n|**Query**|**insertAfterFieldId**  <br>*optional*|Field after which to insert the nodes. If not specified, nodes are added at the end of the entry|string|\n|**Body**|**body**  <br>*required*|Node to add or update|[OpcNodeModel](definitions.md#opcnodemodel)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The item was added|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to update.|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|An entry was not found to add the node to|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"removedatasetwriterentry\"></a>\n#### RemoveDataSetWriterEntry\n```\nDELETE /v2/writer/{dataSetWriterGroup}/{dataSetWriterId}\n```\n\n\n##### Description\nRemove the published nodes entry for a specific data set writer in a writer group. Dedicated errors are returned if no, or no unique entry could be found.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|Default|\n|---|---|---|---|---|\n|**Path**|**dataSetWriterGroup**  <br>*required*|The writer group name of the entry|string||\n|**Path**|**dataSetWriterId**  <br>*required*|The data set writer identifer of the entry|string||\n|**Query**|**force**  <br>*optional*|Force delete all writers even if more than one were found. Does not error when none were found.|boolean|`\"false\"`|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The entry was removed|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to remove.|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|The entry to remove was not found|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"addorupdatenodes\"></a>\n#### AddOrUpdateNodes\n```\nPOST /v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/add\n```\n\n\n##### Description\nAdd Nodes to a dedicated data set writer in a writer group. Each node must have a unique DataSetFieldId. If the field already exists, the node is updated. If a node does not have a dataset field id an error is returned. Publishing intervals at node level are also not supported and generate an error. Publishing intervals must be configured at the data set writer level.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**dataSetWriterGroup**  <br>*required*|The writer group name of the entry|string|\n|**Path**|**dataSetWriterId**  <br>*required*|The data set writer identifer of the entry|string|\n|**Query**|**insertAfterFieldId**  <br>*optional*|Field after which to insert the nodes. If not specified, nodes are added at the end of the entry|string|\n|**Body**|**body**  <br>*required*|Nodes to add or update|< [OpcNodeModel](definitions.md#opcnodemodel) > array|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The items were added|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique entry could not be found to add to.|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|The entry was not found|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getnodes\"></a>\n#### GetNodes\n```\nGET /v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/nodes\n```\n\n\n##### Description\nGet Nodes from a data set writer in a writer group. The nodes can optionally be offset from a previous last node identified by the dataSetFieldId and pageanated by the pageSize. If the dataSetFieldId is not found, an empty list is returned. If the dataSetFieldId is not specified, the first page is returned.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**dataSetWriterGroup**  <br>*required*|The writer group name of the entry|string|\n|**Path**|**dataSetWriterId**  <br>*required*|The data set writer identifer of the entry|string|\n|**Query**|**lastDataSetFieldId**  <br>*optional*|the field id after which to start the page. If not specified, nodes from the beginning are returned.|string|\n|**Query**|**pageSize**  <br>*optional*|Number of nodes to return|integer (int32)|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The items were found|< [OpcNodeModel](definitions.md#opcnodemodel) > array|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to get nodes from.|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|The entry was not found|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"removenodes\"></a>\n#### RemoveNodes\n```\nPOST /v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/remove\n```\n\n\n##### Description\nRemove Nodes that match the provided data set field ids from a data set writer in a writer group. If one of the fields is not found, no error is returned, however, if all fields are not found an error is returned.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**dataSetWriterGroup**  <br>*required*|The writer group name of the entry|string|\n|**Path**|**dataSetWriterId**  <br>*required*|The data set writer identifer of the entry|string|\n|**Body**|**body**  <br>*required*|The identifiers of the fields to remove|< string > array|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|Some or all items were removed|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to remove from.|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|The entry or all items to remove were not found|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Consumes\n\n* `application/json`\n* `application/x-msgpack`\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"getnode\"></a>\n#### GetNode\n```\nGET /v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/{dataSetFieldId}\n```\n\n\n##### Description\nGet a node from a dataset in a writer group. Dedicated errors are returned if no, or no unique entry could be found, or the node does not exist.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**dataSetFieldId**  <br>*required*|The data set field id of the node to return|string|\n|**Path**|**dataSetWriterGroup**  <br>*required*|The writer group name of the entry|string|\n|**Path**|**dataSetWriterId**  <br>*required*|The data set writer identifer of the entry|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The item was retrieved|[OpcNodeModel](definitions.md#opcnodemodel)|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to get a node from.|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|The entry or item was not found|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n<a name=\"removenode\"></a>\n#### RemoveNode\n```\nDELETE /v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/{dataSetFieldId}\n```\n\n\n##### Description\nRemove a node with the specified data set field id from a data set writer in a writer group. If the field is not found, an error is returned.\n\n\n##### Parameters\n\n|Type|Name|Description|Schema|\n|---|---|---|---|\n|**Path**|**dataSetFieldId**  <br>*required*|Identifier of the field to remove|string|\n|**Path**|**dataSetWriterGroup**  <br>*required*|The writer group name of the entry|string|\n|**Path**|**dataSetWriterId**  <br>*required*|The data set writer identifer of the entry|string|\n\n\n##### Responses\n\n|HTTP Code|Description|Schema|\n|---|---|---|\n|**200**|The item was removed|No Content|\n|**400**|The passed in information is invalid|[ProblemDetails](definitions.md#problemdetails)|\n|**403**|A unique item could not be found to remove from.|[ProblemDetails](definitions.md#problemdetails)|\n|**404**|The entry or item to remove was not found|[ProblemDetails](definitions.md#problemdetails)|\n\n\n##### Produces\n\n* `application/json`\n* `application/x-msgpack`\n\n\n\n"
  },
  {
    "path": "docs/opc-publisher/commandline.md",
    "content": "# OPC Publisher configuration via command line options and environment variables\n\n[Home](./readme.md)\n\n> This documentation applies to version 2.9\n\nThe following OPC Publisher configuration can be applied by Command Line Interface (CLI) options or as environment variable settings. Any CamelCase options can also be provided using environment variables (without the preceding `--`). When both environment variable and CLI argument are provided, the command line option will override the environment variable.\n\n> IMPORTANT: The command line of OPC Publisher only understands below command line options. You cannot specify environment variables on the command line (e.g., like `env1=value env2=value`). All option names are **case-sensitive**!\n\nSecrets such as `EdgeHubConnectionString`, other connection strings, or the `ApiKey` should never be provided on the command line or as environment variables. It should be avoided at all cost. A file using the `.env` format can be specified using the `ADDITIONAL_CONFIGURATION` environment variable. The contents will be loaded before the command line arguments are evaluated. If a file name is not provided via said environment variable, OPC Publisher tries to load the `/run/secrets/.env` file. This approach integrates well with [docker secrets](https://github.com/compose-spec/compose-spec/blob/master/05-services.md#secrets). An example of this can be found [here](https://raw.githubusercontent.com/Azure/Industrial-IoT/main/deploy/docker/docker-compose.yaml).\n\n> Please note that rolling of secrets is not supported and that any errors loading secrets is silently discarded.\n\n```text\n ██████╗ ██████╗  ██████╗    ██████╗ ██╗   ██╗██████╗ ██╗     ██╗███████╗██╗  ██╗███████╗██████╗\n██╔═══██╗██╔══██╗██╔════╝    ██╔══██╗██║   ██║██╔══██╗██║     ██║██╔════╝██║  ██║██╔════╝██╔══██╗\n██║   ██║██████╔╝██║         ██████╔╝██║   ██║██████╔╝██║     ██║███████╗███████║█████╗  ██████╔╝\n██║   ██║██╔═══╝ ██║         ██╔═══╝ ██║   ██║██╔══██╗██║     ██║╚════██║██╔══██║██╔══╝  ██╔══██╗\n╚██████╔╝██║     ╚██████╗    ██║     ╚██████╔╝██████╔╝███████╗██║███████║██║  ██║███████╗██║  ██║\n ╚═════╝ ╚═╝      ╚═════╝    ╚═╝      ╚═════╝ ╚═════╝ ╚══════╝╚═╝╚══════╝╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝\n                              2.9.15-rc.19+6ad3d509a8 (.NET 9.0.9/linux-x64/OPC Stack 1.5.377.11)\nGeneral\n-------\n\n  -h, --help                 Show help and exit.\n  -f, --pf, --publishfile, --PublishedNodesFile=VALUE\n                             The name of the file containing the configuration\n                               of the nodes to be published as well as the\n                               information to connect to the OPC UA server\n                               sources.\n                               This file is also used to persist changes made\n                               through the control plane, e.g., through IoT Hub\n                               device method calls.\n                               When no file is specified a default `\n                               publishednodes.json` file is created in the\n                               working directory.\n                               Default: `publishednodes.json`\n      --cf, --createifnotexist, --CreatePublishFileIfNotExist[=VALUE]\n                             Permit publisher to create the the specified\n                               publish file if it does not exist. The new file\n                               will be created under the access rights of the\n                               publisher module.\n                               The default file 'publishednodes.json' is always\n                               created when no file name was provided on the\n                               command line and this option is ignored.\n                               If a file was specified but does not exist and\n                               should not be created the module exits.\n                               Default: `false`\n      --pol, --usepolling, --UseFileChangePolling[=VALUE]\n                             Poll for file changes instead of using a file\n                               system watcher.\n                               Use this setting when the underlying file system\n                               does not support file system notifications such\n                               as in some docker container setups.\n                               Default: `false`\n      --fe, --forceencryptedcredentials, --ForceCredentialEncryption[=VALUE]\n                             If set to true the publisher will never write\n                               plain text credentials into the published nodes\n                               configuration file.\n                               If a credential cannot be written to the file\n                               using the IoT Edge workload API crypto provider\n                               the publisher will exit with an error.\n                               Default: `false` (write secrets as plain text\n                               into the configuration file which should be\n                               properly ACL'ed)\n      --id, --publisherid, --PublisherId=VALUE\n                             Sets the publisher id of the publisher.\n                               Default: `not set` which results in the IoT edge\n                               identity being used\n  -s, --site, --SiteId=VALUE Sets the site name of the publisher module.\n                               Default: `not set`\n      --pi, --initfile, --InitFilePath[=VALUE]\n                             A file from which to read initialization\n                               instructions.\n                               Use this option to have OPC Publisher run a set\n                               of method calls found in this file.\n                               The file must be formatted using a subset of the\n                               .http/.rest file format without support for\n                               indentation, scripting or environment variables.\n                               Default: `not set` (disabled). If only a file\n                               name is specified, it is loaded from the path\n                               specifed using `--pn`. If just the argument is\n                               provided without a value the default is `\n                               publishednodes.init`.\n      --il, --initlog, --InitLogFile=VALUE\n                             A file into which the results of the\n                               initialization instructions are written.\n                               Only valid if `--pi` option is specified.\n                               Default: If a init file is set using `--pi`, it\n                               is appended with the `.log` extension. If just a\n                               file name is used, the file is created in the\n                               same folder as the init file configured using\n                               the `--pi` command line option.\n      --rs, --runtimestatereporting, --RuntimeStateReporting[=VALUE]\n                             Enable that when publisher starts or restarts it\n                               reports its runtime state using a restart\n                               message.\n                               Default: `false` (disabled)\n      --api-key, --ApiKey=VALUE\n                             Sets the api key that must be used to authenticate\n                               calls on the publisher REST endpoint.\n                               Default: `not set` (Key will be generated if not\n                               available)\n      --doa, --disableopenapi, --DisableOpenApiEndpoint[=VALUE]\n                             Disable the OPC Publisher Open API endpoint\n                               exposed by the built-in HTTP server.\n                               Default: `false` (enabled).\n\nMessaging configuration\n-----------------------\n\n  -c, --strict, --UseStandardsCompliantEncoding[=VALUE]\n                             Use strict OPC UA standard compliance. It is\n                               recommended to run the publisher in compliant\n                               mode for best interoperability.\n                               Be aware that explicitly specifying other\n                               command line options can result in non-\n                               comnpliance despite this option being set.\n                               Default: `false` for backwards compatibility (2.\n                               5.x - 2.8.x)\n      --nf, --namespaceformat, --DefaultNamespaceFormat=VALUE\n                             The format to use when serializing node ids and\n                               qualified names containing a namespace uri into\n                               a string.\n                               Allowed values:\n                                   `Uri`\n                                   `Index`\n                                   `Expanded`\n                                   `ExpandedWithNamespace0`\n                               Default: `Expanded` if `-c` is specified,\n                               otherwise `Uri` for backwards compatibility.\n      --mm, --messagingmode, --MessagingMode=VALUE\n                             The messaging mode for messages\n                               Allowed values:\n                                   `PubSub`\n                                   `Samples`\n                                   `FullNetworkMessages`\n                                   `FullSamples`\n                                   `DataSetMessages`\n                                   `SingleDataSetMessage`\n                                   `DataSets`\n                                   `SingleDataSet`\n                                   `RawDataSets`\n                                   `SingleRawDataSet`\n                               Default: `PubSub` if `-c` is specified,\n                               otherwise `Samples` for backwards compatibility.\n      --ode, --optimizeddatasetencoding, --WriteValueWhenDataSetHasSingleEntry[=VALUE]\n                             When a data set has a single entry the encoder\n                               will write only the value of a data set entry\n                               and omit the key.\n                               This is not compliant with OPC UA Part 14.\n                               Default: `false`.\n      --me, --messageencoding, --MessageEncoding=VALUE\n                             The message encoding for messages\n                               Allowed values:\n                                   `Uadp`\n                                   `Json`\n                                   `Xml`\n                                   `Avro`\n                                   `IsReversible`\n                                   `JsonReversible`\n                                   `IsGzipCompressed`\n                                   `JsonGzip`\n                                   `AvroGzip`\n                                   `JsonReversibleGzip`\n                               Default: `Json`.\n      --bi, --batchtriggerinterval, --BatchTriggerInterval=VALUE\n                             The network message publishing interval in\n                               milliseconds. Determines the publishing period\n                               at which point messages are emitted.\n                               When `--bs` is 1 and `--bi` is set to 0 batching\n                               is disabled.\n                               Default: `10000` (10 seconds).\n                               Also can be set using `BatchTriggerInterval`\n                               environment variable in the form of a duration\n                               string in the form `[d.]hh:mm:ss[.fffffff]`.\n      --bs, --batchsize, --BatchSize=VALUE\n                             The number of incoming OPC UA subscription\n                               notifications to collect until sending a network\n                               messages. When `--bs` is set to 1 and `--bi` is\n                               0 batching is disabled and messages are sent as\n                               soon as notifications arrive.\n                               Default: `50`.\n      --rdb, --removedupsinbatch, --RemoveDuplicatesFromBatch[=VALUE]\n                             Use this option to remove values with the same\n                               node id from batch messages in legacy `Samples`\n                               mode. Sends only the latest value as per the\n                               value's source timestamp.\n                               Only applies to `Samples` mode, otherwise this\n                               setting is ignored.\n                               Default: `false` (keep all duplicate values).\n      --ms, --maxmessagesize, --iothubmessagesize, --IoTHubMaxMessageSize=VALUE\n                             The maximum size of the messages to emit. In case\n                               the encoder cannot encode a message because the\n                               size would be exceeded, the message is dropped.\n                               Otherwise the encoder will aim to chunk messages\n                               if possible.\n                               Default: `256k` in case of IoT Hub messages, `0`\n                               otherwise.\n      --qos, --DefaultQualityOfService=VALUE\n                             The default quality of service to use for data set\n                               messages.\n                               This does not apply to metadata messages which\n                               are always sent with `AtLeastOnce` semantics.\n                               Allowed values:\n                                   `AtMostOnce`\n                                   `AtLeastOnce`\n                                   `ExactlyOnce`\n                               Default: `AtLeastOnce`.\n      --ttl, --DefaultMessageTimeToLive=VALUE\n                             The default time to live for all network message\n                               published in milliseconds if the transport\n                               supports it.\n                               This does not apply to metadata messages which\n                               are always sent with a ttl of the metadata\n                               update interval or infinite ttl.\n                               Default: `not set` (infinite).\n      --retain, --DefaultMessageRetention[=VALUE]\n                             Whether by default to send messages with retain\n                               flag to a broker if the transport supports it.\n                               This does not apply to metadata messages which\n                               are always sent as retained messages.\n                               Default: `false'.\n      --mts, --messagetimestamp, --MessageTimestamp=VALUE\n                             The value to set as as the timestamp property of\n                               messages during encoding (if the encoding\n                               supports writing message timestamps).\n                               Allowed values:\n                                   `CurrentTimeUtc`\n                                   `PublishTime`\n                                   `EncodingTimeUtc`\n                               Default: `CurrentTimeUtc` to use the time when\n                               the message was created in OPC Publisher.\n      --npd, --maxnodesperdataset, --MaxNodesPerDataSet=VALUE\n                             Maximum number of nodes within a Subscription.\n                               When there are more nodes configured for a data\n                               set writer, they will be added to new\n                               subscriptions. This also affects metadata\n                               message size.\n                               Default: `1000`.\n      --kfc, --keyframecount, --DefaultKeyFrameCount=VALUE\n                             The default number of delta messages to send until\n                               a key frame message is sent. If 0, no key frame\n                               messages are sent, if 1, every message will be a\n                               key frame.\n                               Default: `0`.\n      --ka, --sendkeepalives, --EnableDataSetKeepAlives[=VALUE]\n                             Enables sending keep alive messages triggered by\n                               writer subscription's keep alive notifications.\n                               This setting can be used to enable the messaging\n                               profile's support for keep alive messages.\n                               If the chosen messaging profile does not support\n                               keep alive messages this setting is ignored.\n                               Default: `false` (to save bandwidth).\n      --kaf, --keepalivesaskeyframe, --SendDataSetKeepAlivesAsKeyFrame[=VALUE]\n                             When the sending of keep alive messages is enabled\n                               determines whether the empty keep alive message\n                               will be promoted to a key frame messages\n                               Default: `false`.\n      --msi, --metadatasendinterval, --DefaultMetaDataUpdateTime=VALUE\n                             Default value in milliseconds for the metadata\n                               send interval which determines in which interval\n                               metadata is sent.\n                               Even when disabled, metadata is still sent when\n                               the metadata version changes unless `--mm=*\n                               Samples` is set in which case this setting is\n                               ignored. Only valid for network message\n                               encodings.\n                               Default: `0` which means periodic sending of\n                               metadata is disabled.\n      --dm, --disablemetadata, --DisableDataSetMetaData[=VALUE]\n                             Disables sending any metadata when metadata\n                               version changes. This setting can be used to\n                               also override the messaging profile's default\n                               support for metadata sending.\n                               It is recommended to disable sending metadata\n                               when too many nodes are part of a data set as\n                               this can slow down start up time.\n                               Default: `false` if the messaging profile\n                               selected supports sending metadata and `--strict`\n                                is set but not '--dct', `True` otherwise.\n      --amt, --asyncmetadataloadtimeout, --AsyncMetaDataLoadTimeout=VALUE\n                             The default duration in seconds a publish request\n                               should wait until the meta data is loaded.\n                               Loaded metadata guarantees a metadata message is\n                               sent before the first message is sent but\n                               loading of metadata takes time during\n                               subscription setup. Set to `0` to block until\n                               metadata is loaded.\n                               Only used if meta data is supported and enabled.\n                               Default: `5000` milliseconds.\n      --ps, --publishschemas, --PublishMessageSchema[=VALUE]\n                             Publish the Avro or Json message schemas to schema\n                               registry or subtopics.\n                               Automatically enables complex type system and\n                               metadata support.\n                               Only has effect if the messaging profile\n                               supports publishing schemas.\n                               Default: `True` if the message encoding requires\n                               schemas (for example Avro) otherwise `False`.\n      --asj, --preferavro, --PreferAvroOverJsonSchema[=VALUE]\n                             Publish Avro schema even for Json encoded messages.\n                                Automatically enables publishing schemas as if `\n                               --ps` was set.\n                               Default: `false`.\n      --daf, --disableavrofiles, --DisableAvroFileWriter[=VALUE]\n                             Disable writing avro files and instead dump\n                               messages and schema as zip files using the\n                               filesystem transport.\n                               Default: `false`.\n      --om, --maxsendqueuesize, --MaxNetworkMessageSendQueueSize=VALUE\n                             The maximum number of messages to buffer on the\n                               send path before messages are dropped.\n                               Default: `4096`\n      --wgp, --writergrouppartitions, --DefaultWriterGroupPartitionCount=VALUE\n                             The number of partitions to split the writer group\n                               into. Each partition represents a data flow to\n                               the transport sink. The partition is selected by\n                               topic hash.\n                               Default: `0` (partitioning is disabled)\n  -t, --dmt, --defaultmessagetransport, --DefaultTransport=VALUE\n                             The desired transport to use to publish network\n                               messages with.\n                               Requires the transport to be properly configured\n                               (see transport settings).\n                               Allowed values:\n                                   `IoTHub`\n                                   `Mqtt`\n                                   `EventHub`\n                                   `Dapr`\n                                   `Http`\n                                   `FileSystem`\n                                   `AioMqtt`\n                                   `AioDss`\n                                   `Null`\n                               Default: `IoTHub` or the first configured\n                               transport of the allowed value list.\n\nTransport settings\n------------------\n\n  -b, --mqc, --mqttclientconnectionstring, --MqttClientConnectionString=VALUE\n                             An mqtt connection string to use. Use this option\n                               to connect OPC Publisher to a MQTT Broker\n                               endpoint.\n                               To connect to an MQTT broker use the format '\n                               HostName=<IPorDnsName>;Port=<Port>[;Username=<\n                               Username>;Password=<Password>;Protocol=<'v5'|'\n                               v311'>]'. To publish via MQTT by default specify\n                               `-t=Mqtt`.\n                               Default: `not set`.\n  -e, --ec, --edgehubconnectionstring, --dc, --deviceconnectionstring, --EdgeHubConnectionString=VALUE\n                             A edge hub or iot hub connection string to use if\n                               you run OPC Publisher outside of IoT Edge. The\n                               connection string can be obtained from the IoT\n                               Hub portal. It is not required to use this\n                               option if running inside IoT Edge. To publish\n                               through IoT Edge by default specify `-t=IoTHub`.\n                               Default: `not set`.\n      --ht, --ih, --iothubprotocol, --Transport=VALUE\n                             Protocol to use for communication with EdgeHub.\n                               Allowed values:\n                                   `None`\n                                   `AmqpOverTcp`\n                                   `AmqpOverWebsocket`\n                                   `Amqp`\n                                   `MqttOverTcp`\n                                   `Tcp`\n                                   `MqttOverWebsocket`\n                                   `Websocket`\n                                   `Mqtt`\n                                   `Any`\n                               Default: `Mqtt` if device or edge hub connection\n                               string is provided, ignored otherwise.\n      --eh, --eventhubnamespaceconnectionstring, --EventHubNamespaceConnectionString=VALUE\n                             The connection string of an existing event hub\n                               namespace to use for the Azure EventHub\n                               transport.\n                               Default: `not set`.\n      --sg, --schemagroup, --SchemaGroupName=VALUE\n                             The schema group in an event hub namespace to\n                               publish message schemas to.\n                               Default: `not set`.\n  -d, --dcs, --daprconnectionstring, --DaprConnectionString=VALUE\n                             Connect the OPC Publisher to a dapr pub sub\n                               component using a connection string.\n                               The connection string specifies the PubSub\n                               component to use and allows you to configure the\n                               side car connection if needed.\n                               Use the format 'PubSubComponent=<PubSubComponent>\n                               [;GrpcPort=<GrpcPort>;HttpPort=<HttpPort>[;\n                               Scheme=<'https'|'http'>][;Host=<IPorDnsName>]][;\n                               CheckSideCarHealth=<'true'|'false'>]'.\n                               To publish through dapr by default specify `-t=\n                               Dapr`.\n                               Default: `not set`.\n  -w, --hcs, --httpconnectionstring, --HttpConnectionString=VALUE\n                             Allows OPC Publisher to publish multipart messages\n                               to a topic path using the http protocol (web\n                               hook). Specify the target host and configure the\n                               optional connection settings using a connection\n                               string of the format 'HostName=<IPorDnsName>[;\n                               Port=<Port>][;Scheme=<'https'|'http'>][;Put=true]\n                               [;ApiKey=<ApiKey>]'. To publish via HTTP by\n                               default specify `-t=Http`.\n                               Default: `not set`.\n  -o, --outdir, --OutputRoot=VALUE\n                             A folder to write messages into.\n                               Use this option to have OPC Publisher write\n                               messages to a folder structure under this folder.\n                                The structure reflects the topic tree. To\n                               publish into the file system folder by default\n                               specify `-t=FileSystem`.\n                               Default: `not set`.\n  -p, --httpserverport, --HttpServerPort=VALUE\n                             The port on which the http server of OPC Publisher\n                               is listening.\n                               Default: `443` if no value is provided.\n      --unsecurehttp, --UnsecureHttpServerPort[=VALUE]\n                             Allow unsecure access to the REST api of OPC\n                               Publisher. A port can be specified if the\n                               default port 80 is not desired.\n                               Do not enable this in production as it exposes\n                               the Api Key on the network.\n                               Default: `disabled`, if specified without a port\n                               `80` port is used.\n      --rtc, --renewtlscert, --RenewTlsCertificateOnStartup[=VALUE]\n                             If set a new tls certificate is created during\n                               startup updating any previously created ones.\n                               Default: `false`.\n      --useopenapiv3, --UseOpenApiV3[=VALUE]\n                             If enabled exposes the open api schema of OPC\n                               Publisher using v3 schema (yaml).\n                               Only valid if Open API endpoint is not disabled.\n                               Default: `v2` (json).\n\nRouting configuration\n---------------------\n\n      --rtt, --roottopictemplate, --RootTopicTemplate[=VALUE]\n                             The default root topic of OPC Publisher.\n                               If not specified, the `{PublisherId}` template\n                               is the root topic.\n                               Currently only the template variables\n                                   `{SiteId}` and\n                                   `{PublisherId}`\n                               can be used as dynamic substituations in the\n                               template. If the template variable does not\n                               exist it is replaced with the `$default` string.\n                               Default: `{PublisherId}`.\n      --mtt, --methodtopictemplate, --MethodTopicTemplate=VALUE\n                             The topic at which OPC Publisher's method handler\n                               is mounted.\n                               If not specified, the `{RootTopic}/methods`\n                               template will be used as root topic with the\n                               method names as sub topic.\n                               Only\n                                   `{RootTopic}`\n                                   `{SiteId}` and\n                                   `{PublisherId}`\n                               can currently be used as replacement variables\n                               in the template.\n                               Default: `{RootTopic}/methods`.\n      --ttt, --telemetrytopictemplate, --TelemetryTopicTemplate[=VALUE]\n                             The default topic that all messages are sent to.\n                               If not specified, the `{RootTopic}/messages/{\n                               WriterGroup}` template will be used as root\n                               topic for all events sent by OPC Publisher.\n                               The template variables\n                                   `{RootTopic}`\n                                   `{SiteId}`\n                                   `{Encoding}`\n                                   `{PublisherId}`\n                                   `{DataSetClassId}`\n                                   `{DataSetWriter}` and\n                                   `{WriterGroup}`\n                                can be used as dynamic parts in the template.\n                               If a template variable does not exist the name\n                               of the variable is emitted.\n                               Default: `{RootTopic}/messages/{WriterGroup}`.\n      --ett, --eventstopictemplate, --EventsTopicTemplate=VALUE\n                             The topic into which OPC Publisher publishes any\n                               events that are not telemetry messages such as\n                               discovery or runtime events.\n                               If not specified, the `{RootTopic}/events`\n                               template will be used.\n                               Only\n                                   `{RootTopic}`\n                                   `{SiteId}`\n                                   `{Encoding}` and\n                                   `{PublisherId}`\n                               can currently be used as replacement variables\n                               in the template.\n                               Default: `{RootTopic}/events`.\n      --dtt, --diagnosticstopictemplate, --DiagnosticsTopicTemplate=VALUE\n                             The topic into which OPC Publisher publishes\n                               writer group diagnostics events.\n                               If not specified, the `{RootTopic}/diagnostics/{\n                               WriterGroup}` template will be used.\n                               Only\n                                   `{RootTopic}`\n                                   `{SiteId}`\n                                   `{Encoding}`\n                                   `{PublisherId}` and\n                                   `{WriterGroup}`\n                               can currently be used as replacement variables\n                               in the template.\n                               Default: `{RootTopic}/diagnostics/{WriterGroup}`\n      --mdt, --metadatatopictemplate, --DataSetMetaDataTopicTemplate[=VALUE]\n                             The topic that metadata should be sent to.\n                               In case of MQTT the message will by default be\n                               sent as RETAIN message with a TTL of either\n                               metadata send interval or infinite if metadata\n                               send interval is not configured.\n                               Only valid if metadata is supported and/or\n                               explicitely enabled.\n                               The template variables\n                                   `{RootTopic}`\n                                   `{SiteId}`\n                                   `{TelemetryTopic}`\n                                   `{Encoding}`\n                                   `{PublisherId}`\n                                   `{DataSetClassId}`\n                                   `{DataSetWriter}` and\n                                   `{WriterGroup}`\n                               can be used as dynamic parts in the template.\n                               Default: `{TelemetryTopic}` which means metadata\n                               is sent to the same output as regular messages.\n                               If specified without value, the default output\n                               is `{TelemetryTopic}/metadata`.\n      --stt, --schematopictemplate, --SchemaTopicTemplate[=VALUE]\n                             The topic that schemas should be sent to if schema\n                               publishing is configured.\n                               In case of MQTT schemas will not be sent with .\n                               Only valid if schema publishing is enabled (`--\n                               ps`).\n                               The template variables\n                                   `{RootTopic}`\n                                   `{SiteId}`\n                                   `{PublisherId}`\n                                   `{TelemetryTopic}`\n                               can be used as variables inside the template.\n                               Default: `{TelemetryTopic}/schema` which means\n                               the schema is sent to a sub topic where the\n                               telemetry message is sent to.\n      --uns, --datasetrouting, --DefaultDataSetRouting=VALUE\n                             Configures whether messages should automatically\n                               be routed using the browse path of the monitored\n                               item inside the address space starting from the\n                               RootFolder.\n                               The browse path is appended as topic structure\n                               to the telemetry topic root which can be\n                               configured using `--ttt`. Reserved characters in\n                               browse names are escaped with their hex ASCII\n                               code.\n                               Allowed values:\n                                   `None`\n                                   `UseBrowseNames`\n                                   `UseBrowseNamesWithNamespaceIndex`\n                               Default: `None` (Topics must be configured).\n      --ri, --enableroutinginfo, --EnableRoutingInfo[=VALUE]\n                             Add routing information to messages. The name of\n                               the property is `$$RoutingInfo` and the value is\n                               the `DataSetWriterGroup` from which the\n                               particular message is emitted. Disabled if `\n                               EnableCloudEvents` is enabled.\n                               Default: `False`.\n      --ce, --cloudevents, --EnableCloudEvents[=VALUE]\n                             Add cloud event headers to messages. The cloud\n                               events comply to the opc ua cloud events\n                               extension.\n                               Default: `False`.\n\nSubscription settings\n---------------------\n\n      --oi, --opcsamplinginterval, --DefaultSamplingInterval=VALUE\n                             Default value in milliseconds to request the\n                               servers to sample values. This value is used if\n                               an explicit sampling interval for a node was not\n                               configured.\n                               Default: `1000`.\n                               Also can be set using `DefaultSamplingInterval`\n                               environment variable in the form of a duration\n                               string in the form `[d.]hh:mm:ss[.fffffff]`.\n      --op, --opcpublishinginterval, --DefaultPublishingInterval=VALUE\n                             Default value in milliseconds for the publishing\n                               interval setting of a subscription created with\n                               an OPC UA server. This value is used if an\n                               explicit publishing interval was not configured.\n                               When setting `--op=0` the server decides the\n                               lowest publishing interval it can support.\n                               Default: `1000`.\n                               Also can be set using `DefaultPublishingInterval`\n                                environment variable in the form of a duration\n                               string in the form `[d.]hh:mm:ss[.fffffff]`.\n      --eip, --immediatepublishing, --EnableImmediatePublishing[=VALUE]\n                             By default OPC Publisher will create a\n                               subscription with publishing disabled and only\n                               enable it after it has filled it with all\n                               configured monitored items. Use this setting to\n                               create the subscription with publishing already\n                               enabled.\n                               Default: `false`.\n      --ska, --keepalivecount, --DefaultKeepAliveCount=VALUE\n                             Specifies the default number of publishing\n                               intervals before a keep alive is returned with\n                               the next queued publishing response.\n                               Default: `auto set based on publishing interval`.\n\n      --slt, --lifetimecount, --DefaultLifetimeCount=VALUE\n                             Default subscription lifetime count which is a\n                               multiple of the keep alive counter and when\n                               reached instructs the server to declare the\n                               subscription invalid.\n                               Default: `auto set based on publishing interval`.\n\n      --fd, --fetchdisplayname, --FetchOpcNodeDisplayName[=VALUE]\n                             Fetches the displayname for the monitored items\n                               subscribed if a display name was not specified\n                               in the configuration.\n                               Note: This has high impact on OPC Publisher\n                               startup performance.\n                               Default: `false` (disabled).\n      --fp, --fetchpathfromroot, --FetchOpcBrowsePathFromRoot[=VALUE]\n                             (Experimental) Explicitly disable or enable\n                               retrieving relative paths from root for\n                               monitored items.\n                               Default: `false` (disabled).\n      --qs, --queuesize, --DefaultQueueSize=VALUE\n                             Default queue size for all monitored items if\n                               queue size was not specified in the\n                               configuration.\n                               Default: `1` (for backwards compatibility).\n      --aq, --autosetqueuesize, --AutoSetQueueSizes[=VALUE]\n                             (Experimental) Automatically calculate queue sizes\n                               for monitored items using the subscription\n                               publishing interval and the item's sampling rate\n                               as max(configured queue size, roundup(\n                               publishinginterval / samplinginterval)).\n                               Note that the server might revise the queue size\n                               down if it cannot handle the calculated size.\n                               Default: `false` (disabled).\n      --ndo, --nodiscardold, --DiscardNew[=VALUE]\n                             The publisher is using this as default value for\n                               the discard old setting of monitored item queue\n                               configuration. Setting to true will ensure that\n                               new values are dropped before older ones are\n                               drained.\n                               Default: `false` (which is the OPC UA default).\n      --mc, --monitoreditemdatachangetrigger, --DefaultDataChangeTrigger=VALUE\n                             Default data change trigger for all monitored\n                               items configured in the published nodes\n                               configuration unless explicitly overridden.\n                               Allowed values:\n                                   `Status`\n                                   `StatusValue`\n                                   `StatusValueTimestamp`\n                               Default: `StatusValue` (which is the OPC UA\n                               default).\n      --mwt, --monitoreditemwatchdog, --DefaultMonitoredItemWatchdogSeconds=VALUE\n                             The subscription and monitored item watchdog\n                               timeout in seconds the subscription uses to\n                               check on late reporting monitored items unless\n                               overridden in the published nodes configuration\n                               explicitly.\n                               Default: `not set` (watchdog disabled).\n      --mwc, --monitoreditemwatchdogcondition, --DefaultMonitoredItemWatchdogCondition=VALUE\n                             The default condition when to run the action\n                               configured as the watchdog behavior. The\n                               condition can be overridden in the published\n                               nodes configuration.\n                               Allowed values:\n                                   `WhenAllAreLate`\n                                   `WhenAnyIsLate`\n                               Default: `WhenAllAreLate` (if enabled).\n      --dwb, --watchdogbehavior, --DefaultWatchdogBehavior=VALUE\n                             Default behavior of the subscription and monitored\n                               item watchdog mechanism unless overridden in the\n                               published nodes configuration explicitly.\n                               Allowed values:\n                                   `Diagnostic`\n                                   `Reset`\n                                   `FailFast`\n                                   `ExitProcess`\n                               Default: `Diagnostic` (if enabled).\n      --sf, --skipfirst, --DefaultSkipFirst[=VALUE]\n                             The publisher is using this as default value for\n                               the skip first setting of nodes configured\n                               without a skip first setting. A value of True\n                               will skip sending the first notification\n                               received when the monitored item is added to the\n                               subscription.\n                               Default: `False` (disabled).\n      --rat, --republishaftertransfer, --RepublishAfterTransfer[=VALUE]\n                             Configure whether publisher republishes missed\n                               subscription notifications still in the server\n                               queue after transferring a subscription during\n                               reconnect handling.\n                               This can result in out of order notifications\n                               after a reconnect but minimizes data loss.\n                               Default: `False` (disabled).\n      --hbb, --heartbeatbehavior, --DefaultHeartbeatBehavior=VALUE\n                             Default behavior of the heartbeat mechanism unless\n                               overridden in the published nodes configuration\n                               explicitly.\n                               Allowed values:\n                                   `WatchdogLKV`\n                                   `WatchdogLKG`\n                                   `PeriodicLKV`\n                                   `PeriodicLKG`\n                                   `WatchdogLKVWithUpdatedTimestamps`\n                                   `WatchdogLKVDiagnosticsOnly`\n                                   `PeriodicLKVDropValue`\n                                   `PeriodicLKGDropValue`\n                               Default: `WatchdogLKV` (Sending LKV in a\n                               watchdog fashion).\n      --hb, --heartbeatinterval, --DefaultHeartbeatInterval=VALUE\n                             The publisher is using this as default value in\n                               seconds for the heartbeat interval setting of\n                               nodes that were configured without a heartbeat\n                               interval setting. A heartbeat is sent at this\n                               interval if no value has been received.\n                               Default: `0` (disabled)\n                               Also can be set using `DefaultHeartbeatInterval`\n                               environment variable in the form of a duration\n                               string in the form `[d.]hh:mm:ss[.fffffff]`.\n      --ucr, --usecyclicreads, --DefaultSamplingUsingCyclicRead[=VALUE]\n                             All nodes should be sampled using periodical\n                               client reads instead of subscriptions services,\n                               unless otherwise configured.\n                               Default: `false`.\n      --xmi, --maxmonitoreditems, --MaxMonitoredItemPerSubscription=VALUE\n                             Max monitored items per subscription until the\n                               subscription is split.\n                               This is used if the server does not provide\n                               limits in its server capabilities.\n                               Default: `not set`.\n      --da, --deferredacks, --UseDeferredAcknoledgements[=VALUE]\n                             (Experimental) Acknoledge subscription\n                               notifications only when the data has been\n                               successfully published.\n                               Default: `false`.\n      --rbp, --rebrowseperiod, --DefaultRebrowsePeriod=VALUE\n                             (Experimental) The default time to wait until the\n                               address space model is browsed again when\n                               generating model change notifications.\n                               Default: `12:00:00`.\n      --sqp, --sequentialpublishing, --EnableSequentialPublishing[=VALUE]\n                             Set to false to disable sequential publishing in\n                               the protocol stack.\n                               Default: `True` (enabled).\n      --smi, --subscriptionmanagementinterval, --SubscriptionManagementIntervalSeconds=VALUE\n                             The interval in seconds after which the publisher\n                               re-applies the desired state of the subscription\n                               to a session.\n                               Default: `0` (only on configuration change).\n      --bnr, --badnoderetrydelay, --BadMonitoredItemRetryDelaySeconds=VALUE\n                             The delay in seconds after which nodes that were\n                               rejected by the server while added or updating a\n                               subscription or while publishing, are re-applied\n                               to a subscription.\n                               Set to 0 to disable retrying.\n                               Default: `1800` seconds.\n      --inr, --invalidnoderetrydelay, --InvalidMonitoredItemRetryDelaySeconds=VALUE\n                             The delay in seconds after which the publisher\n                               attempts to re-apply nodes that were incorrectly\n                               configured to a subscription.\n                               Set to 0 to disable retrying.\n                               Default: `300` seconds.\n      --bmd, --badnoderetrymaxdelay, --BadMonitoredItemRetryDelayMaxSeconds=VALUE\n                             The max delay in seconds between retrying nodes\n                               that were rejected by the server while added or\n                               updating a subscription or while publishing.\n                               When set an exponential retry policy is used\n                               with the `--bmr` value as the starting delay.\n                               Default: `not set`.\n      --imd, --invalidnoderetrymaxdelay, --InvalidMonitoredItemRetryDelayMaxSeconds=VALUE\n                             The max  delay in seconds between retrying nodes\n                               that were incorrectly configured in the a\n                               subscription.\n                               When set an exponential retry policy is used\n                               with the `--inr` value as the starting delay.\n                               Default: `not set`.\n      --ser, --subscriptionerrorretrydelay, --SubscriptionErrorRetryDelaySeconds=VALUE\n                             The delay in seconds between attempts to create a\n                               subscription in a session.\n                               Set to 0 to disable retrying.\n                               Default: `2` seconds.\n      --urc, --usereverseconnect, --DefaultUseReverseConnect[=VALUE]\n                             (Experimental) Use reverse connect for all\n                               endpoints in the published nodes configuration\n                               unless otherwise configured.\n                               Default: `false`.\n      --dtr, --disabletransferonreconnect, --DisableSubscriptionTransfer[=VALUE]\n                             Do not attempt to transfer subscriptions when\n                               reconnecting but re-establish the subscription.\n                               Default: `false`.\n      --dct, --disablecomplextypesystem, --DisableComplexTypeSystem[=VALUE]\n                             Never load the complex type system for any\n                               connections that are required for subscriptions.\n                               This setting not just disables meta data\n                               messages but also prevents transcoding of\n                               unknown complex types in outgoing messages.\n                               Default: `false`.\n      --dsg, --disablesessionpergroup, --DisableSessionPerWriterGroup[=VALUE]\n                             Disable creating a separate session per writer\n                               group. Instead sessions are re-used across\n                               writer groups.\n                               Default: `False`.\n      --ipi, --ignorepublishingintervals, --IgnoreConfiguredPublishingIntervals[=VALUE]\n                             Always use the publishing interval provided via\n                               command line argument `--op` and ignore all\n                               publishing interval settings in the\n                               configuration.\n                               Combine with `--op=0` to let the server use the\n                               lowest publishing interval it can support.\n                               Default: `False` (disabled).\n\nOPC UA Client configuration\n---------------------------\n\n      --aa, --acceptuntrusted, --AutoAcceptUntrustedCertificates[=VALUE]\n                             The publisher accepts untrusted certificates\n                               presented by a server it connects to.\n                               This does not include servers presenting bad\n                               certificates or certificates that fail chain\n                               validation. These errors cannot be suppressed\n                               and connection will always be rejected.\n                               WARNING: This setting should never be used in\n                               production environments!\n      --rur, --rejectunknownrevocationstatus, --RejectUnknownRevocationStatus[=VALUE]\n                             Set this to `False` to accept certificates\n                               presented by a server that have an unknown\n                               revocation status.\n                               WARNING: This setting should never be used in\n                               production environments!\n                               Default: `True`.\n      --ct, --createsessiontimeout, --CreateSessionTimeout=VALUE\n                             Amount of time in seconds to wait until a session\n                               is connected.\n                               Default: `5` seconds.\n      --mr, --reconnectperiod, --MinReconnectDelay=VALUE\n                             The minimum amount of time in milliseconds to wait\n                               reconnection of session is attempted again.\n                               Default: `1000` milliseconds.\n      --xr, --maxreconnectperiod, --MaxReconnectDelay=VALUE\n                             The maximum amount of time in millseconds to wait\n                               between reconnection attempts of the session.\n                               Default: `60000` milliseconds.\n      --sto, --sessiontimeout, --DefaultSessionTimeout=VALUE\n                             Maximum amount of time in seconds that a session\n                               should remain open by the OPC server without any\n                               activity (session timeout). Requested from the\n                               OPC server at session creation.\n                               Default: `60` seconds.\n      --ki, --keepaliveinterval, --KeepAliveInterval=VALUE\n                             The interval in seconds the publisher is sending\n                               keep alive messages to the OPC servers on the\n                               endpoints it is connected to.\n                               Default: `10` seconds.\n      --sct, --servicecalltimeout, --DefaultServiceCallTimeout=VALUE\n                             Maximum amount of time in seconds that a service\n                               call should take before it is being cancelled.\n                               This value can be overridden in the request\n                               header.\n                               Default: `180` seconds.\n      --cto, --connecttimeout, --DefaultConnectTimeout=VALUE\n                             Maximum amount of time in seconds that a service\n                               call should wait for a connected session to be\n                               used.\n                               This value can be overridden in the request\n                               header.\n                               Default: `not set` (in this case the default\n                               service call timeout value is used).\n      --ot, --operationtimeout, --OperationTimeout=VALUE\n                             The operation service call timeout of individual\n                               service requests to the server in milliseconds.\n                               As opposed to the `--sco` timeout, this is the\n                               timeout hint provided to the server in every\n                               request.\n                               This value can be overridden in the request\n                               header.\n                               Default: `120000` milliseconds.\n      --cl, --clientlinger, --LingerTimeoutSeconds=VALUE\n                             Amount of time in seconds to delay closing a\n                               client and underlying session after the a last\n                               service call.\n                               Use this setting to speed up multiple subsequent\n                               calls.\n                               Default: `0` sec (no linger).\n      --rcp, --reverseconnectport, --ReverseConnectPort=VALUE\n                             The port to use when accepting inbound reverse\n                               connect requests from servers.\n                               Default: `4840`.\n      --mnr, --maxnodesperread, --MaxNodesPerReadOverride=VALUE\n                             Limit max number of nodes to read in a single read\n                               request when batching reads or the server limit\n                               if less.\n                               Default: `0` (using server limit).\n      --mnb, --maxnodesperbrowse, --MaxNodesPerBrowseOverride=VALUE\n                             Limit max number of nodes per browse request when\n                               batching browse operations or the server limit\n                               if less.\n                               Default: `0` (using server limit).\n      --ncc, --nodecachecapacity, --NodeCacheCapacity=VALUE\n                             The max size of the node caches used in the\n                               complex type system.\n                               There are caches (values, nodes, references).\n                               Default: `4096`.\n      --nct, --nodecachetimeout, --NodeCacheTimeout=VALUE\n                             The timeout of a node cache entries if not used in\n                               milliseconds.\n                               Default: `3600`.\n      --mpr, --minpublishrequests, --MinPublishRequests=VALUE\n                             Minimum number of publish requests to queue once\n                               subscriptions are created in the session.\n                               Default: `2`.\n      --ppr, --percentpublishrequests, --PublishRequestsPerSubscriptionPercent=VALUE\n                             Percentage ratio of publish requests per\n                               subscriptions in the session in percent up to\n                               the number configured using `--xpr`.\n                               Default: `100`% (1 request per subscription).\n      --xpr, --maxpublishrequests, --MaxPublishRequests=VALUE\n                             Maximum number of publish requests to every queue\n                               once subscriptions are created in the session.\n                               Default: `10`.\n      --dcp, --disablecomplextypepreloading, --DisableComplexTypePreloading[=VALUE]\n                             Complex types (structures, enumerations) a server\n                               exposes are preloaded from the server after the\n                               session is connected. In some cases this can\n                               cause problems either on the client or server\n                               itself. Use this setting to disable pre-loading\n                               support.\n                               Note that since the complex type system is used\n                               for meta data messages it will still be loaded\n                               at the time the subscription is created,\n                               therefore also disable meta data support if you\n                               want to ensure the complex types are never\n                               loaded for an endpoint.\n                               Default: `false`.\n      --otl, --opctokenlifetime, --SecurityTokenLifetime=VALUE\n                             OPC UA Stack Transport Secure Channel - Security\n                               token lifetime in milliseconds.\n                               Default: `3600000` (1h).\n      --ocl, --opcchannellifetime, --ChannelLifetime=VALUE\n                             OPC UA Stack Transport Secure Channel - Channel\n                               lifetime in milliseconds.\n                               Default: `300000` (5 min).\n      --omb, --opcmaxbufferlen, --MaxBufferSize=VALUE\n                             OPC UA Stack Transport Secure Channel - Max buffer\n                               size.\n                               Default: `65535` (64KB -1).\n      --oml, --opcmaxmessagelen, --MaxMessageSize=VALUE\n                             OPC UA Stack Transport Secure Channel - Max\n                               message size.\n                               Default: `4194304` (4 MB).\n      --oal, --opcmaxarraylen, --MaxArrayLength=VALUE\n                             OPC UA Stack Transport Secure Channel - Max array\n                               length.\n                               Default: `65535` (64KB - 1).\n      --ol, --opcmaxstringlen, --MaxStringLength=VALUE\n                             The max length of a string opc can transmit/\n                               receive over the OPC UA secure channel.\n                               Default: `130816` (128KB - 256).\n      --obl, --opcmaxbytestringlen, --MaxByteStringLength=VALUE\n                             OPC UA Stack Transport Secure Channel - Max byte\n                               string length.\n                               Default: `1048576` (1MB).\n      --au, --appuri, --ApplicationUri=VALUE\n                             Application URI as per OPC UA definition inside\n                               the OPC UA client application configuration\n                               presented to the server.\n                               Default: `not set`.\n      --pu, --producturi, --ProductUri=VALUE\n                             The Product URI as per OPC UA definition insde the\n                               OPC UA client application configuration\n                               presented to the server.\n                               Default: `not set`.\n      --rejectsha1, --RejectSha1SignedCertificates=VALUE\n                             If set to `False` OPC Publisher will accept SHA1\n                               certificates which have been officially\n                               deprecated and are unsafe to use.\n                               Note: Set this to `False` to support older\n                               equipment that uses Sha1 signed certificates\n                               rather than using no security.\n                               Default: `True`.\n      --mks, --minkeysize, --MinimumCertificateKeySize=VALUE\n                             Minimum accepted certificate size.\n                               Note: It is recommended to this value to the\n                               highest certificate key size possible based on\n                               the connected OPC UA servers.\n                               Default: 1024.\n      --tm, --trustmyself, --AddAppCertToTrustedStore=VALUE\n                             Set to `False` to disable adding the publisher's\n                               own certificate to the trusted store\n                               automatically.\n                               Default: `True`.\n      --sn, --appcertsubjectname, --ApplicationCertificateSubjectName=VALUE\n                             The subject name for the app cert.\n                               Default: `CN=<the value of --an|--appname>, C=DE,\n                                S=Bav, O=Microsoft, DC=localhost`.\n      --an, --appname, --ApplicationName=VALUE\n                             The name for the app (used during OPC UA\n                               authentication).\n                               Default: `Microsoft.Azure.IIoT`\n      --pki, --pkirootpath, --PkiRootPath=VALUE\n                             PKI certificate store root path.\n                               Default: `pki`.\n      --ap, --appcertstorepath, --ApplicationCertificateStorePath=VALUE\n                             The path where the own application cert should be\n                               stored.\n                               Default: $\"{PkiRootPath}/own\".\n      --apt, --at, --appcertstoretype, --ApplicationCertificateStoreType=VALUE\n                             The own application cert store type.\n                               Allowed values:\n                                   `Directory`\n                                   `X509Store`\n                                   `FlatDirectory`\n                               Default: `Directory`.\n      --cfa, --configurefromappcert, --TryConfigureFromExistingAppCert[=VALUE]\n                             Automatically set the application subject name,\n                               host name and application uri from the first\n                               valid application certificate found in the\n                               application certificate store path.\n                               If the chosen certificate is valid, it will be\n                               used, otherwise a new, self-signed certificate\n                               with the information will be created.\n                               Default: `false`.\n      --apw, --appcertstorepwd, --ApplicationCertificatePassword=VALUE\n                             Password to use when storing the application\n                               certificate in the store folder if the store is\n                               of type `Directory`.\n                               Default: empty, which means application\n                               certificate is not protected by default.\n      --tp, --trustedcertstorepath, --TrustedPeerCertificatesPath=VALUE\n                             The path of the trusted cert store.\n                               Default: $\"{PkiRootPath}/trusted\".\n      --tpt, --TrustedPeerCertificatesType=VALUE\n                             Trusted peer certificate store type.\n                               Allowed values:\n                                   `Directory`\n                                   `X509Store`\n                                   `FlatDirectory`\n                               Default: `Directory`.\n      --rp, --rejectedcertstorepath, --RejectedCertificateStorePath=VALUE\n                             The path of the rejected cert store.\n                               Default: $\"{PkiRootPath}/rejected\".\n      --rpt, --RejectedCertificateStoreType=VALUE\n                             Rejected certificate store type.\n                               Allowed values:\n                                   `Directory`\n                                   `X509Store`\n                                   `FlatDirectory`\n                               Default: `Directory`.\n      --ip, --issuercertstorepath, --TrustedIssuerCertificatesPath=VALUE\n                             The path of the trusted issuer cert store.\n                               Default: $\"{PkiRootPath}/issuer\".\n      --ipt, --TrustedIssuerCertificatesType=VALUE\n                             Trusted issuer certificate store type.\n                               Allowed values:\n                                   `Directory`\n                                   `X509Store`\n                                   `FlatDirectory`\n                               Default: `Directory`.\n      --up, --usercertstorepath, --TrustedUserCertificatesPath=VALUE\n                             The path of the certificate store for user\n                               certificates.\n                               Default: $\"{PkiRootPath}/users\".\n      --upt, --TrustedUserCertificatesType=VALUE\n                             Type of certificate store for all User\n                               certificates.\n                               Allowed values:\n                                   `Directory`\n                                   `X509Store`\n                                   `FlatDirectory`\n                               Default: `Directory`.\n      --uip, --userissuercertstorepath, --UserIssuerCertificatesPath=VALUE\n                             The path of the user issuer cert store.\n                               Default: $\"{PkiRootPath}/users/issuer\".\n      --uit, --UserIssuerCertificatesType=VALUE\n                             Type of the issuer certificate store for User\n                               certificates.\n                               Allowed values:\n                                   `Directory`\n                                   `X509Store`\n                                   `FlatDirectory`\n                               Default: `Directory`.\n\nDiagnostic options\n------------------\n\n      --ll, --loglevel, --LogLevel=VALUE\n                             The loglevel to use.\n                               Allowed values:\n                                   `Trace`\n                                   `Debug`\n                                   `Information`\n                                   `Warning`\n                                   `Error`\n                                   `Critical`\n                                   `None`\n                               Default: `Information`.\n      --lfm, --logformat, --LogFormat=VALUE\n                             The log format to use when writing to the console.\n                               Allowed values:\n                                   `simple`\n                                   `syslog`\n                                   `systemd`\n                               Default: `simple`.\n      --di, --diagnosticsinterval, --DiagnosticsInterval=VALUE\n                             Produce publisher diagnostic information at this\n                               specified interval in seconds.\n                               By default diagnostics are written to the OPC\n                               Publisher logger (which requires at least --\n                               loglevel `information`) unless configured\n                               differently using `--pd`.\n                               `0` disables diagnostic output.\n                               Default:60000 (60 seconds).\n                               Also can be set using `DiagnosticsInterval`\n                               environment variable in the form of a duration\n                               string in the form `[d.]hh:mm:ss[.fffffff]`\".\n      --pd, --diagnosticstarget, --DiagnosticsTarget=VALUE\n                             Configures how to emit diagnostics information at\n                               the `--di` configured interval.\n                               Use this to for example emit diagnostics as\n                               events to the event topic template instead of\n                               the console.\n                               Allowed values:\n                                   `Logger`\n                                   `Events`\n                               Default: `Logger`.\n      --dr, --disableresourcemonitoring, --DisableResourceMonitoring[=VALUE]\n                             Disable resource monitoring as part of the\n                               diagnostics output and metrics.\n                               Default: `false` (enabled).\n      --ln, --lognotifications[=VALUE]\n                             Log ingress subscription notifications at\n                               Informational level to aid debugging.\n                               Default: `disabled`.\n      --lnh, --lognotificationsandheartbeats[=VALUE]\n                             Include heartbeats in notifications log.\n                               If set also implicitly enables debug logging via\n                               `--ln`.\n                               Default: `disabled`.\n      --lnf, --lognotificationfilter[=VALUE]\n                             Only log notifications where the data set field\n                               name, subscription name, or data set name match\n                               the provided regular expression pattern.\n                               If set implicitly enables debug logging via `--\n                               ln`.\n                               Default: `null` (matches all).\n      --len, --logencodednotifications[=VALUE]\n                             Log encoded subscription and monitored item\n                               notifications at Informational level to aid\n                               debugging.\n                               Default: `disabled`.\n      --sl, --opcstacklogging, --EnableOpcUaStackLogging[=VALUE]\n                             Enable opc ua stack logging beyond logging at\n                               error level.\n                               Default: `disabled`.\n      --ksf, --keysetlogfolder, --OpcUaKeySetLogFolderName[=VALUE]\n                             Writes negotiated symmetric keys for all running\n                               client connection to this file.\n                               The file can be loaded by Wireshark 4.3 and used\n                               to decrypt encrypted channels when analyzing\n                               network traffic captures.\n                               Note that enabling this feature presents a\n                               security risk!\n                               Default: `disabled`.\n      --ecw, --enableconsolewriter, --EnableConsoleWriter[=VALUE]\n                             Enable writing encoded messages to standard error\n                               log through the filesystem transport (must\n                               enable via `-t FileSystem` and `-o` must be set\n                               to either `stderr` or `stdout`).\n                               Default: `false`.\n      --oc, --otlpcollector, --OtlpCollectorEndpoint=VALUE\n                             Specifiy the OpenTelemetry collector grpc endpoint\n                               url to export diagnostics to.\n                               Default: `disabled`.\n      --eol, --enableotellogging, --EnableOtelLogging[=VALUE]\n                             Enable logging over open telemetry endpoint.\n                               By default only metrics are enabled.\n                               Default: `disabled`.\n      --eot, --enableoteltraces, --EnableOtelTraces[=VALUE]\n                             Enable traces over open telemetry endpoint.\n                               By default only metrics are emitted.\n                               Default: `disabled`.\n      --oxi, --otlpexportinterval, --OtlpExportIntervalMilliseconds=VALUE\n                             The interval in milliseconds when OpenTelemetry is\n                               exported to the collector endpoint.\n                               Default: `15000` (15 seconds).\n      --mms, --maxmetricstreams, --OtlpMaxMetricStreams=VALUE\n                             Specifiy the max number of streams to collect in\n                               the default view.\n                               Default: `4000`.\n      --em, --enableprometheusendpoint, --EnableMetrics[=VALUE]\n                             Explicitly enable or disable exporting prometheus\n                               metrics directly on the standard path.\n                               Default: `disabled` if Otlp collector is\n                               configured, otherwise `enabled`.\n      --ari, --addruntimeinstrumentation, --OtlpRuntimeInstrumentation[=VALUE]\n                             Include metrics captured for the underlying\n                               runtime and web server.\n                               Default: `False`.\n      --ats, --addtotalsuffix, --OtlpTotalNameSuffixForCounters[=VALUE]\n                             Add total suffix to all counter instrument names\n                               when exporting metrics via prometheus exporter.\n                               Default: `False`.\n```\n\nCurrently supported combinations of `--mm` snd `--me` can be found [here](./messageformats.md).\n"
  },
  {
    "path": "docs/opc-publisher/definitions.md",
    "content": "\n<a name=\"definitions\"></a>\n## Definitions\n\n<a name=\"additionaldata\"></a>\n### AdditionalData\nFlags that are set by the historian when\nreturning archived values.\n\n*Type* : enum (None, Partial, ExtraData, MultipleValues)\n\n\n<a name=\"aggregateconfigurationmodel\"></a>\n### AggregateConfigurationModel\nAggregate configuration\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**percentDataBad**  <br>*optional*|Percent of data that is bad|integer (int32)|\n|**percentDataGood**  <br>*optional*|Percent of data that is good|integer (int32)|\n|**treatUncertainAsBad**  <br>*optional*|Whether to treat uncertain as bad|boolean|\n|**useSlopedExtrapolation**  <br>*optional*|Whether to use sloped extrapolation.|boolean|\n\n\n<a name=\"applicationinfomodel\"></a>\n### ApplicationInfoModel\nApplication info model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**applicationId**  <br>*required*|Unique application id|string|\n|**applicationName**  <br>*optional*|Default name of application|string|\n|**applicationType**  <br>*optional*||[ApplicationType](definitions.md#applicationtype)|\n|**applicationUri**  <br>*required*|Unique application uri|string|\n|**capabilities**  <br>*optional*|The capabilities advertised by the server.|< string > array|\n|**created**  <br>*optional*||[OperationContextModel](definitions.md#operationcontextmodel)|\n|**discovererId**  <br>*optional*|Discoverer that registered the application|string|\n|**discoveryProfileUri**  <br>*optional*|Discovery profile uri|string|\n|**discoveryUrls**  <br>*optional*|Discovery urls of the server|< string > array|\n|**gatewayServerUri**  <br>*optional*|Gateway server uri|string|\n|**hostAddresses**  <br>*optional*|Host addresses of server application or null|< string > array|\n|**locale**  <br>*optional*|Locale of default name - defaults to \"en\"|string|\n|**localizedNames**  <br>*optional*|Localized Names of application keyed on locale|< string, string > map|\n|**notSeenSince**  <br>*optional*|Last time application was seen if not visible|string (date-time)|\n|**productUri**  <br>*optional*|Product uri|string|\n|**siteId**  <br>*optional*|Site of the application  <br>**Example** : `\"productionlineA\"`|string|\n|**updated**  <br>*optional*||[OperationContextModel](definitions.md#operationcontextmodel)|\n\n\n<a name=\"applicationregistrationmodel\"></a>\n### ApplicationRegistrationModel\nApplication with optional list of endpoints\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**application**  <br>*required*||[ApplicationInfoModel](definitions.md#applicationinfomodel)|\n|**endpoints**  <br>*optional*|List of endpoints for it|< [EndpointRegistrationModel](definitions.md#endpointregistrationmodel) > array|\n\n\n<a name=\"applicationtype\"></a>\n### ApplicationType\nApplication type\n\n*Type* : enum (Server, Client, ClientAndServer, DiscoveryServer)\n\n\n<a name=\"attributereadrequestmodel\"></a>\n### AttributeReadRequestModel\nAttribute to read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**attribute**  <br>*required*||[NodeAttribute](definitions.md#nodeattribute)|\n|**nodeId**  <br>*required*|Node to read from or write to (mandatory)  <br>**Minimum length** : `1`|string|\n\n\n<a name=\"attributereadresponsemodel\"></a>\n### AttributeReadResponseModel\nAttribute value read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**value**  <br>*required*|Attribute value|object|\n\n\n<a name=\"attributewriterequestmodel\"></a>\n### AttributeWriteRequestModel\nAttribute and value to write to it\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**attribute**  <br>*required*||[NodeAttribute](definitions.md#nodeattribute)|\n|**nodeId**  <br>*required*|Node to write to (mandatory)  <br>**Minimum length** : `1`|string|\n|**value**  <br>*required*|Value to write (mandatory)|object|\n\n\n<a name=\"attributewriteresponsemodel\"></a>\n### AttributeWriteResponseModel\nAttribute write result\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n\n\n<a name=\"authenticationmethodmodel\"></a>\n### AuthenticationMethodModel\nAuthentication Method model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**configuration**  <br>*optional*|Method specific configuration|object|\n|**credentialType**  <br>*optional*||[CredentialType](definitions.md#credentialtype)|\n|**id**  <br>*required*|Method id  <br>**Minimum length** : `1`|string|\n|**securityPolicy**  <br>*optional*|Security policy to use when passing credential.|string|\n\n\n<a name=\"browsedirection\"></a>\n### BrowseDirection\nDirection to browse\n\n*Type* : enum (Forward, Backward, Both)\n\n\n<a name=\"browsefirstrequestmodel\"></a>\n### BrowseFirstRequestModel\nBrowse request model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**direction**  <br>*optional*||[BrowseDirection](definitions.md#browsedirection)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**maxReferencesToReturn**  <br>*optional*|Max number of references to return. There might<br>be less returned as this is up to the client<br>restrictions.  Set to 0 to return no references<br>or target nodes.<br>(default is decided by client e.g. 60)|integer (int64)|\n|**noSubtypes**  <br>*optional*|Whether to include subtypes of the reference type.<br>(default is false)|boolean|\n|**nodeClassFilter**  <br>*optional*|Filter returned target nodes by only returning<br>nodes that have classes defined in this array.<br>(default: null - all targets are returned)|enum (Object, Variable, Method, ObjectType, VariableType, ReferenceType, DataType, View)|\n|**nodeId**  <br>*optional*|Node to browse.<br>(defaults to root folder).|string|\n|**nodeIdsOnly**  <br>*optional*|Whether to only return the raw node id<br>information and not read the target node.<br>(default is false)|boolean|\n|**readVariableValues**  <br>*optional*|Whether to read variable values on target nodes.<br>(default is false)|boolean|\n|**referenceTypeId**  <br>*optional*|Reference types to browse.<br>(default: hierarchical).|string|\n|**targetNodesOnly**  <br>*optional*|Whether to collapse all references into a set of<br>unique target nodes and not show reference<br>information.<br>(default is false)|boolean|\n|**view**  <br>*optional*||[BrowseViewModel](definitions.md#browseviewmodel)|\n\n\n<a name=\"browsefirstrequestmodelrequestenvelope\"></a>\n### BrowseFirstRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[BrowseFirstRequestModel](definitions.md#browsefirstrequestmodel)|\n\n\n<a name=\"browsefirstresponsemodel\"></a>\n### BrowseFirstResponseModel\nBrowse response model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token if more results pending.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**node**  <br>*required*||[NodeModel](definitions.md#nodemodel)|\n|**references**  <br>*required*|References returned|< [NodeReferenceModel](definitions.md#nodereferencemodel) > array|\n\n\n<a name=\"browsenextrequestmodel\"></a>\n### BrowseNextRequestModel\nRequest node browsing continuation\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**abort**  <br>*optional*|Whether to abort browse and release.<br>(default: false)|boolean|\n|**continuationToken**  <br>*required*|Continuation token from previews browse request.<br>(mandatory)  <br>**Minimum length** : `1`|string|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeIdsOnly**  <br>*optional*|Whether to only return the raw node id<br>information and not read the target node.<br>(default is false)|boolean|\n|**readVariableValues**  <br>*optional*|Whether to read variable values on target nodes.<br>(default is false)|boolean|\n|**targetNodesOnly**  <br>*optional*|Whether to collapse all references into a set of<br>unique target nodes and not show reference<br>information.<br>(default is false)|boolean|\n\n\n<a name=\"browsenextrequestmodelrequestenvelope\"></a>\n### BrowseNextRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[BrowseNextRequestModel](definitions.md#browsenextrequestmodel)|\n\n\n<a name=\"browsenextresponsemodel\"></a>\n### BrowseNextResponseModel\nResult of node browse continuation\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token if more results pending.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**references**  <br>*required*|References returned|< [NodeReferenceModel](definitions.md#nodereferencemodel) > array|\n\n\n<a name=\"browsepathrequestmodel\"></a>\n### BrowsePathRequestModel\nBrowse nodes by path\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePaths**  <br>*required*|The paths to browse from node.<br>(mandatory)|< < string > array > array|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*optional*|Node to browse from (defaults to root folder).|string|\n|**nodeIdsOnly**  <br>*optional*|Whether to only return the raw node id<br>information and not read the target node.<br>(default is false)|boolean|\n|**readVariableValues**  <br>*optional*|Whether to read variable values on target nodes.<br>(default is false)|boolean|\n\n\n<a name=\"browsepathrequestmodelrequestenvelope\"></a>\n### BrowsePathRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[BrowsePathRequestModel](definitions.md#browsepathrequestmodel)|\n\n\n<a name=\"browsepathresponsemodel\"></a>\n### BrowsePathResponseModel\nResult of node browse continuation\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**targets**  <br>*optional*|Targets|< [NodePathTargetModel](definitions.md#nodepathtargetmodel) > array|\n\n\n<a name=\"browsestreamchunkmodeliasyncenumerable\"></a>\n### BrowseStreamChunkModelIAsyncEnumerable\n*Type* : object\n\n\n<a name=\"browsestreamrequestmodel\"></a>\n### BrowseStreamRequestModel\nBrowse stream request model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**direction**  <br>*optional*||[BrowseDirection](definitions.md#browsedirection)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**noRecurse**  <br>*optional*|Whether to not browse recursively<br>(default is false)|boolean|\n|**noSubtypes**  <br>*optional*|Whether to include subtypes of the reference type.<br>(default is false)|boolean|\n|**nodeClassFilter**  <br>*optional*|Filter returned target nodes by only returning<br>nodes that have classes defined in this array.<br>(default: null - all targets are returned)|enum (Object, Variable, Method, ObjectType, VariableType, ReferenceType, DataType, View)|\n|**nodeId**  <br>*optional*|Start nodes to browse.<br>(defaults to root folder).|< string > array|\n|**readVariableValues**  <br>*optional*|Whether to read variable values on source nodes.<br>(default is false)|boolean|\n|**referenceTypeId**  <br>*optional*|Reference types to browse.<br>(default: hierarchical).|string|\n|**view**  <br>*optional*||[BrowseViewModel](definitions.md#browseviewmodel)|\n\n\n<a name=\"browsestreamrequestmodelrequestenvelope\"></a>\n### BrowseStreamRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[BrowseStreamRequestModel](definitions.md#browsestreamrequestmodel)|\n\n\n<a name=\"browseviewmodel\"></a>\n### BrowseViewModel\nView to browse\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**timestamp**  <br>*optional*|Browses at or before this timestamp.|string (date-time)|\n|**version**  <br>*optional*|Browses specific version of the view.|integer (int64)|\n|**viewId**  <br>*required*|Node of the view to browse  <br>**Minimum length** : `1`|string|\n\n\n<a name=\"bytearraypublishednodecreateassetrequestmodel\"></a>\n### ByteArrayPublishedNodeCreateAssetRequestModel\nRequest to create an asset in the configuration api\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**configuration**  <br>*required*|The asset configuration to use when creating the asset.|string (byte)|\n|**entry**  <br>*required*||[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**waitTime**  <br>*optional*|Time to wait after the configuration is applied to perform<br>the configuration of the asset in the configuration api.<br>This is to let the server settle.|string (date-span)|\n\n\n<a name=\"channeldiagnosticmodel\"></a>\n### ChannelDiagnosticModel\nChannel diagnostics model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**channelId**  <br>*optional*|The id assigned to the channel that the token<br>belongs to.|integer (int64)|\n|**client**  <br>*optional*||[ChannelKeyModel](definitions.md#channelkeymodel)|\n|**connection**  <br>*required*||[ConnectionModel](definitions.md#connectionmodel)|\n|**createdAt**  <br>*optional*|When the token was created by the server<br>(refers to the server's clock).|string (date-time)|\n|**lifetime**  <br>*optional*|The lifetime of the token|string (date-span)|\n|**localIpAddress**  <br>*optional*|Effective local ip address used for the connection<br>if connected. Empty if disconnected.|string|\n|**localPort**  <br>*optional*|The effective local port used when connected,<br>null if disconnected.|integer (int32)|\n|**remoteIpAddress**  <br>*optional*|Effective remote ip address used for the<br>connection if connected. Empty if disconnected.|string|\n|**remotePort**  <br>*optional*|The effective remote port used when connected,<br>null if disconnected.|integer (int32)|\n|**server**  <br>*optional*||[ChannelKeyModel](definitions.md#channelkeymodel)|\n|**sessionCreated**  <br>*optional*|When the session was created.|string (date-time)|\n|**sessionId**  <br>*optional*|The session id if connected. Empty if disconnected.|string|\n|**timeStamp**  <br>*required*|Timestamp of the diagnostic information|string (date-time)|\n|**tokenId**  <br>*optional*|The id assigned to the token.|integer (int64)|\n\n\n<a name=\"channeldiagnosticmodeliasyncenumerable\"></a>\n### ChannelDiagnosticModelIAsyncEnumerable\n*Type* : object\n\n\n<a name=\"channelkeymodel\"></a>\n### ChannelKeyModel\nChannel token key model.\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**iv**  <br>*required*|Iv|< integer (int32) > array|\n|**key**  <br>*required*|Key|< integer (int32) > array|\n|**sigLen**  <br>*required*|Signature length|integer (int32)|\n\n\n<a name=\"conditionhandlingoptionsmodel\"></a>\n### ConditionHandlingOptionsModel\nCondition handling options model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**snapshotInterval**  <br>*optional*|Time interval for sending pending interval snapshot in seconds.|integer (int32)|\n|**updateInterval**  <br>*optional*|Time interval for sending pending interval updates in seconds.|integer (int32)|\n\n\n<a name=\"connectiondiagnosticsmodeliasyncenumerable\"></a>\n### ConnectionDiagnosticsModelIAsyncEnumerable\n*Type* : object\n\n\n<a name=\"connectionmodel\"></a>\n### ConnectionModel\nConnection model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**diagnostics**  <br>*optional*||[DiagnosticsModel](definitions.md#diagnosticsmodel)|\n|**endpoint**  <br>*required*||[EndpointModel](definitions.md#endpointmodel)|\n|**group**  <br>*optional*|Connection group allows splitting connections<br>per purpose.|string|\n|**locales**  <br>*optional*|Optional list of preferred locales in preference order.|< string > array|\n|**options**  <br>*optional*||[ConnectionOptions](definitions.md#connectionoptions)|\n|**user**  <br>*optional*||[CredentialModel](definitions.md#credentialmodel)|\n\n\n<a name=\"connectionoptions\"></a>\n### ConnectionOptions\nOptions that can be applied to a connection\n\n*Type* : enum (None, UseReverseConnect, NoComplexTypeSystem, NoSubscriptionTransfer, DumpDiagnostics)\n\n\n<a name=\"contentfilterelementmodel\"></a>\n### ContentFilterElementModel\nAn expression element in the filter ast\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**filterOperands**  <br>*optional*|The operands in the element for the operator|< [FilterOperandModel](definitions.md#filteroperandmodel) > array|\n|**filterOperator**  <br>*optional*||[FilterOperatorType](definitions.md#filteroperatortype)|\n\n\n<a name=\"contentfiltermodel\"></a>\n### ContentFilterModel\nContent filter\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**elements**  <br>*optional*|The flat list of elements in the filter AST|< [ContentFilterElementModel](definitions.md#contentfilterelementmodel) > array|\n\n\n<a name=\"credentialmodel\"></a>\n### CredentialModel\nCredential model. For backwards compatibility\nthe actual credentials to pass to the server is set\nthrough the value property.\n\n\n|Name|Schema|\n|---|---|\n|**type**  <br>*optional*|[CredentialType](definitions.md#credentialtype)|\n|**value**  <br>*optional*|[UserIdentityModel](definitions.md#useridentitymodel)|\n\n\n<a name=\"credentialtype\"></a>\n### CredentialType\nType of credentials to use for authentication\n\n*Type* : enum (None, UserName, X509Certificate, JwtToken)\n\n\n<a name=\"datachangetriggertype\"></a>\n### DataChangeTriggerType\nData change trigger\n\n*Type* : enum (Status, StatusValue, StatusValueTimestamp)\n\n\n<a name=\"datalocation\"></a>\n### DataLocation\nIndicate the data location\n\n*Type* : enum (Raw, Calculated, Interpolated)\n\n\n<a name=\"datasetroutingmode\"></a>\n### DataSetRoutingMode\nSpecifies how OPC UA node paths are mapped to message routing paths/topics.\nControls automatic topic structure generation from OPC UA address space.\nUsed to create a unified namespace when publishing to message brokers\nthat support hierarchical routing like MQTT.\n\n*Type* : enum (None, UseBrowseNames, UseBrowseNamesWithNamespaceIndex)\n\n\n<a name=\"datatypemetadatamodel\"></a>\n### DataTypeMetadataModel\nData type metadata model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**dataType**  <br>*optional*|The data type for the instance declaration.|string|\n\n\n<a name=\"deadbandtype\"></a>\n### DeadbandType\nDeadband type\n\n*Type* : enum (Absolute, Percent)\n\n\n<a name=\"deleteeventsdetailsmodel\"></a>\n### DeleteEventsDetailsModel\nThe events to delete\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**eventIds**  <br>*required*|Events to delete|< string (byte) > array|\n\n\n<a name=\"deleteeventsdetailsmodelhistoryupdaterequestmodel\"></a>\n### DeleteEventsDetailsModelHistoryUpdateRequestModel\nRequest node history update\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[DeleteEventsDetailsModel](definitions.md#deleteeventsdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*optional*|Node to update (mandatory without browse path)|string|\n\n\n<a name=\"deleteeventsdetailsmodelhistoryupdaterequestmodelrequestenvelope\"></a>\n### DeleteEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[DeleteEventsDetailsModelHistoryUpdateRequestModel](definitions.md#deleteeventsdetailsmodelhistoryupdaterequestmodel)|\n\n\n<a name=\"deletevaluesattimesdetailsmodel\"></a>\n### DeleteValuesAtTimesDetailsModel\nDeletes data at times\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**reqTimes**  <br>*required*|The timestamps to delete|< string (date-time) > array|\n\n\n<a name=\"deletevaluesattimesdetailsmodelhistoryupdaterequestmodel\"></a>\n### DeleteValuesAtTimesDetailsModelHistoryUpdateRequestModel\nRequest node history update\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[DeleteValuesAtTimesDetailsModel](definitions.md#deletevaluesattimesdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*optional*|Node to update (mandatory without browse path)|string|\n\n\n<a name=\"deletevaluesattimesdetailsmodelhistoryupdaterequestmodelrequestenvelope\"></a>\n### DeleteValuesAtTimesDetailsModelHistoryUpdateRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[DeleteValuesAtTimesDetailsModelHistoryUpdateRequestModel](definitions.md#deletevaluesattimesdetailsmodelhistoryupdaterequestmodel)|\n\n\n<a name=\"deletevaluesdetailsmodel\"></a>\n### DeleteValuesDetailsModel\nDelete values\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**endTime**  <br>*optional*|End time to delete until|string (date-time)|\n|**startTime**  <br>*optional*|Start time|string (date-time)|\n\n\n<a name=\"deletevaluesdetailsmodelhistoryupdaterequestmodel\"></a>\n### DeleteValuesDetailsModelHistoryUpdateRequestModel\nRequest node history update\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[DeleteValuesDetailsModel](definitions.md#deletevaluesdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*optional*|Node to update (mandatory without browse path)|string|\n\n\n<a name=\"deletevaluesdetailsmodelhistoryupdaterequestmodelrequestenvelope\"></a>\n### DeleteValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[DeleteValuesDetailsModelHistoryUpdateRequestModel](definitions.md#deletevaluesdetailsmodelhistoryupdaterequestmodel)|\n\n\n<a name=\"diagnosticslevel\"></a>\n### DiagnosticsLevel\nLevel of diagnostics requested in responses\n\n*Type* : enum (None, Status, Information, Debug, Verbose)\n\n\n<a name=\"diagnosticsmodel\"></a>\n### DiagnosticsModel\nDiagnostics configuration\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**auditId**  <br>*optional*|Client audit log entry.<br>(default: client generated)|string|\n|**level**  <br>*optional*||[DiagnosticsLevel](definitions.md#diagnosticslevel)|\n|**timeStamp**  <br>*optional*|Timestamp of request.<br>(default: client generated)|string (date-time)|\n\n\n<a name=\"discoverycancelrequestmodel\"></a>\n### DiscoveryCancelRequestModel\nDiscovery cancel request\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**context**  <br>*optional*||[OperationContextModel](definitions.md#operationcontextmodel)|\n|**id**  <br>*optional*|Id of discovery request|string|\n\n\n<a name=\"discoveryconfigmodel\"></a>\n### DiscoveryConfigModel\nDiscovery configuration api model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**addressRangesToScan**  <br>*optional*|Address ranges to scan (null == all wired nics)|string|\n|**discoveryUrls**  <br>*optional*|List of preset discovery urls to use|< string > array|\n|**idleTimeBetweenScans**  <br>*optional*|Delay time between discovery sweeps|string (date-span)|\n|**locales**  <br>*optional*|List of locales to filter with during discovery|< string > array|\n|**maxNetworkProbes**  <br>*optional*|Max network probes that should ever run.|integer (int32)|\n|**maxPortProbes**  <br>*optional*|Max port probes that should ever run.|integer (int32)|\n|**minPortProbesPercent**  <br>*optional*|Probes that must always be there as percent of max.|integer (int32)|\n|**networkProbeTimeout**  <br>*optional*|Network probe timeout|string (date-span)|\n|**portProbeTimeout**  <br>*optional*|Port probe timeout|string (date-span)|\n|**portRangesToScan**  <br>*optional*|Port ranges to scan (null == all unassigned)|string|\n\n\n<a name=\"discoverymode\"></a>\n### DiscoveryMode\nDiscovery mode to use\n\n*Type* : enum (Off, Local, Network, Fast, Scan)\n\n\n<a name=\"discoveryrequestmodel\"></a>\n### DiscoveryRequestModel\nDiscovery request\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**configuration**  <br>*optional*||[DiscoveryConfigModel](definitions.md#discoveryconfigmodel)|\n|**context**  <br>*optional*||[OperationContextModel](definitions.md#operationcontextmodel)|\n|**discovery**  <br>*optional*||[DiscoveryMode](definitions.md#discoverymode)|\n|**id**  <br>*optional*|Id of discovery request|string|\n\n\n<a name=\"endpointmodel\"></a>\n### EndpointModel\nEndpoint model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**alternativeUrls**  <br>*optional*|Alternative endpoint urls that can be used for<br>accessing and validating the server|< string > array|\n|**certificate**  <br>*optional*|Endpoint certificate thumbprint|string|\n|**securityMode**  <br>*optional*||[SecurityMode](definitions.md#securitymode)|\n|**securityPolicy**  <br>*optional*|Security policy uri to use for communication.<br>default to best.|string|\n|**url**  <br>*required*|Endpoint url to use to connect with  <br>**Minimum length** : `1`|string|\n\n\n<a name=\"endpointregistrationmodel\"></a>\n### EndpointRegistrationModel\nEndpoint registration\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**authenticationMethods**  <br>*optional*|Supported authentication methods that can be selected to<br>obtain a credential and used to interact with the endpoint.|< [AuthenticationMethodModel](definitions.md#authenticationmethodmodel) > array|\n|**discovererId**  <br>*optional*|Entity that registered and can access the endpoint|string|\n|**endpoint**  <br>*optional*||[EndpointModel](definitions.md#endpointmodel)|\n|**endpointUrl**  <br>*optional*|Original endpoint url of the endpoint|string|\n|**id**  <br>*required*|Endpoint identifier which is hashed from<br>the supervisor, site and url.  <br>**Minimum length** : `1`|string|\n|**securityLevel**  <br>*optional*|Security level of the endpoint|integer (int32)|\n|**siteId**  <br>*optional*|Registered site of the endpoint|string|\n\n\n<a name=\"eventfiltermodel\"></a>\n### EventFilterModel\nEvent filter\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**selectClauses**  <br>*optional*|Select clauses|< [SimpleAttributeOperandModel](definitions.md#simpleattributeoperandmodel) > array|\n|**typeDefinitionId**  <br>*optional*|Simple event Type definition node id|string|\n|**whereClause**  <br>*optional*||[ContentFilterModel](definitions.md#contentfiltermodel)|\n\n\n<a name=\"exceptiondeviationtype\"></a>\n### ExceptionDeviationType\nException deviation type\n\n*Type* : enum (AbsoluteValue, PercentOfValue, PercentOfRange, PercentOfEURange)\n\n\n<a name=\"fileinfomodel\"></a>\n### FileInfoModel\nFile info\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**lastModified**  <br>*optional*|The time the file was last modified.|string (date-time)|\n|**maxBufferSize**  <br>*optional*|The maximum number of bytes of<br>the read and write buffers.|integer (int64)|\n|**mimeType**  <br>*optional*|The media type of the file based on RFC 2046.|string|\n|**openCount**  <br>*optional*|The number of currently valid file handles on<br>the file.|integer (int32)|\n|**size**  <br>*optional*|The size of the file in Bytes. When a file is<br>currently opened for write, the size might not be<br>accurate or available.|integer (int64)|\n|**writable**  <br>*optional*|Whether the file is writable.|boolean|\n\n\n<a name=\"fileinfomodelserviceresponse\"></a>\n### FileInfoModelServiceResponse\nResponse envelope\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**result**  <br>*optional*|[FileInfoModel](definitions.md#fileinfomodel)|\n\n\n<a name=\"filesystemobjectmodel\"></a>\n### FileSystemObjectModel\nFile system object model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|The browse path to the filesystem object|< string > array|\n|**name**  <br>*optional*|The name of the filesystem object|string|\n|**nodeId**  <br>*optional*|The node id of the filesystem object|string|\n\n\n<a name=\"filesystemobjectmodelienumerableserviceresponse\"></a>\n### FileSystemObjectModelIEnumerableServiceResponse\nResponse envelope\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**result**  <br>*optional*|Result|< [FileSystemObjectModel](definitions.md#filesystemobjectmodel) > array|\n\n\n<a name=\"filesystemobjectmodelrequestenvelope\"></a>\n### FileSystemObjectModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[FileSystemObjectModel](definitions.md#filesystemobjectmodel)|\n\n\n<a name=\"filesystemobjectmodelserviceresponse\"></a>\n### FileSystemObjectModelServiceResponse\nResponse envelope\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**result**  <br>*optional*|[FileSystemObjectModel](definitions.md#filesystemobjectmodel)|\n\n\n<a name=\"filesystemobjectmodelserviceresponseiasyncenumerable\"></a>\n### FileSystemObjectModelServiceResponseIAsyncEnumerable\n*Type* : object\n\n\n<a name=\"filteroperandmodel\"></a>\n### FilterOperandModel\nFilter operand\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**alias**  <br>*optional*|Optional alias to refer to it makeing it a<br>full blown attribute operand|string|\n|**attributeId**  <br>*optional*||[NodeAttribute](definitions.md#nodeattribute)|\n|**browsePath**  <br>*optional*|Browse path of attribute operand|< string > array|\n|**dataType**  <br>*optional*|Data type if operand is a literal|string|\n|**index**  <br>*optional*|Element reference in the outer list if<br>operand is an element operand|integer (int64)|\n|**indexRange**  <br>*optional*|Index range of attribute operand|string|\n|**nodeId**  <br>*optional*|Type definition node id if operand is<br>simple or full attribute operand.|string|\n|**value**  <br>*optional*|Variant value if operand is a literal|object|\n\n\n<a name=\"filteroperatortype\"></a>\n### FilterOperatorType\nFilter operator type\n\n*Type* : enum (Equals, IsNull, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, Like, Not, Between, InList, And, Or, Cast, InView, OfType, RelatedTo, BitwiseAnd, BitwiseOr)\n\n\n<a name=\"getconfiguredendpointsresponsemodel\"></a>\n### GetConfiguredEndpointsResponseModel\nResult of GetConfiguredEndpoints method call\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**endpoints**  <br>*optional*|Collection of Endpoints in the configuration|< [PublishedNodesEntryModel](definitions.md#publishednodesentrymodel) > array|\n\n\n<a name=\"getconfigurednodesonendpointresponsemodel\"></a>\n### GetConfiguredNodesOnEndpointResponseModel\nResult of GetConfiguredNodesOnEndpoint method call\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**opcNodes**  <br>*optional*|Collection of Nodes configured for a particular endpoint|< [OpcNodeModel](definitions.md#opcnodemodel) > array|\n\n\n<a name=\"heartbeatbehavior\"></a>\n### HeartbeatBehavior\nControls how heartbeat messages are handled for monitored items.\nHeartbeats help maintain awareness of node state and connection health\neven when values don't change. Can be configured globally via the\n--hbb command line option. Works with heartbeat interval settings.\n\n*Type* : enum (WatchdogLKV, WatchdogLKG, PeriodicLKV, PeriodicLKG, WatchdogLKVWithUpdatedTimestamps, WatchdogLKVDiagnosticsOnly, Reserved, PeriodicLKVDropValue, PeriodicLKGDropValue)\n\n\n<a name=\"historiceventmodel\"></a>\n### HistoricEventModel\nHistoric event\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**eventFields**  <br>*required*|The selected fields of the event|object|\n\n\n<a name=\"historiceventmodelarrayhistoryreadnextresponsemodel\"></a>\n### HistoricEventModelArrayHistoryReadNextResponseModel\nHistory read continuation result\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token if more results pending.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**history**  <br>*required*|History as json encoded extension object|< [HistoricEventModel](definitions.md#historiceventmodel) > array|\n\n\n<a name=\"historiceventmodelarrayhistoryreadresponsemodel\"></a>\n### HistoricEventModelArrayHistoryReadResponseModel\nHistory read results\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token if more results pending.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**history**  <br>*required*|History as json encoded extension object|< [HistoricEventModel](definitions.md#historiceventmodel) > array|\n\n\n<a name=\"historiceventmodeliasyncenumerable\"></a>\n### HistoricEventModelIAsyncEnumerable\n*Type* : object\n\n\n<a name=\"historicvaluemodel\"></a>\n### HistoricValueModel\nHistoric data\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**additionalData**  <br>*optional*||[AdditionalData](definitions.md#additionaldata)|\n|**dataLocation**  <br>*optional*||[DataLocation](definitions.md#datalocation)|\n|**dataType**  <br>*optional*|Built in data type of the updated values|string|\n|**modificationInfo**  <br>*optional*||[ModificationInfoModel](definitions.md#modificationinfomodel)|\n|**serverPicoseconds**  <br>*optional*|Additional resolution for the server timestamp.|integer (int32)|\n|**serverTimestamp**  <br>*optional*|The server timestamp associated with the value.|string (date-time)|\n|**sourcePicoseconds**  <br>*optional*|Additional resolution for the source timestamp.|integer (int32)|\n|**sourceTimestamp**  <br>*optional*|The source timestamp associated with the value.|string (date-time)|\n|**status**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**value**  <br>*optional*|The value of data value.|object|\n\n\n<a name=\"historicvaluemodelarrayhistoryreadnextresponsemodel\"></a>\n### HistoricValueModelArrayHistoryReadNextResponseModel\nHistory read continuation result\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token if more results pending.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**history**  <br>*required*|History as json encoded extension object|< [HistoricValueModel](definitions.md#historicvaluemodel) > array|\n\n\n<a name=\"historicvaluemodelarrayhistoryreadresponsemodel\"></a>\n### HistoricValueModelArrayHistoryReadResponseModel\nHistory read results\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token if more results pending.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**history**  <br>*required*|History as json encoded extension object|< [HistoricValueModel](definitions.md#historicvaluemodel) > array|\n\n\n<a name=\"historicvaluemodeliasyncenumerable\"></a>\n### HistoricValueModelIAsyncEnumerable\n*Type* : object\n\n\n<a name=\"historyconfigurationmodel\"></a>\n### HistoryConfigurationModel\nHistory configuration\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**aggregateConfiguration**  <br>*optional*||[AggregateConfigurationModel](definitions.md#aggregateconfigurationmodel)|\n|**aggregateFunctions**  <br>*optional*|Allowed aggregate functions|< string, string > map|\n|**definition**  <br>*optional*|Human readable string that specifies how<br>the value of this HistoricalDataNode is<br>calculated|string|\n|**endOfArchive**  <br>*optional*|The last date of the archive|string (date-time)|\n|**exceptionDeviation**  <br>*optional*|Minimum amount that the data for the<br>Node shall change in order for the change<br>to be reported to the history database|number (double)|\n|**exceptionDeviationType**  <br>*optional*||[ExceptionDeviationType](definitions.md#exceptiondeviationtype)|\n|**maxTimeInterval**  <br>*optional*|Specifies the maximum interval between data<br>points in the history repository<br>regardless of their value change|string (date-span)|\n|**minTimeInterval**  <br>*optional*|Specifies the minimum interval between<br>data points in the history repository<br>regardless of their value change|string (date-span)|\n|**serverTimestampSupported**  <br>*optional*|Server supports ServerTimestamps in addition<br>to SourceTimestamp|boolean|\n|**startOfArchive**  <br>*optional*|The date before which there is no data in the<br>archive either online or offline|string (date-time)|\n|**startOfOnlineArchive**  <br>*optional*|Date of the earliest data in the online archive|string (date-time)|\n|**stepped**  <br>*optional*|specifies whether the historical data was<br>collected in such a manner that it should<br>be displayed as SlopedInterpolation (sloped<br>line between points) or as SteppedInterpolation<br>(vertically-connected horizontal lines<br>between points) when raw data is examined.<br>This Property also effects how some<br>Aggregates are calculated|boolean|\n\n\n<a name=\"historyconfigurationrequestmodel\"></a>\n### HistoryConfigurationRequestModel\nRequest history configuration\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*required*|Continuation token to continue reading more<br>results.  <br>**Minimum length** : `1`|string|\n\n\n<a name=\"historyconfigurationrequestmodelrequestenvelope\"></a>\n### HistoryConfigurationRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[HistoryConfigurationRequestModel](definitions.md#historyconfigurationrequestmodel)|\n\n\n<a name=\"historyconfigurationresponsemodel\"></a>\n### HistoryConfigurationResponseModel\nResponse with history configuration\n\n\n|Name|Schema|\n|---|---|\n|**configuration**  <br>*optional*|[HistoryConfigurationModel](definitions.md#historyconfigurationmodel)|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n\n\n<a name=\"historyreadnextrequestmodel\"></a>\n### HistoryReadNextRequestModel\nRequest node history read continuation\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**abort**  <br>*optional*|Abort reading after this read|boolean|\n|**continuationToken**  <br>*required*|Continuation token to continue reading more<br>results.  <br>**Minimum length** : `1`|string|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n\n\n<a name=\"historyreadnextrequestmodelrequestenvelope\"></a>\n### HistoryReadNextRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[HistoryReadNextRequestModel](definitions.md#historyreadnextrequestmodel)|\n\n\n<a name=\"historyservercapabilitiesmodel\"></a>\n### HistoryServerCapabilitiesModel\nHistory Server capabilities\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**aggregateFunctions**  <br>*optional*|Supported aggregate functions|< string, string > map|\n|**deleteAtTimeCapability**  <br>*optional*|Server support deleting data at times|boolean|\n|**deleteEventCapability**  <br>*optional*|Server supports deleting events|boolean|\n|**deleteRawCapability**  <br>*optional*|Server supports deleting raw data|boolean|\n|**insertAnnotationCapability**  <br>*optional*|Allows inserting annotations|boolean|\n|**insertDataCapability**  <br>*optional*|Server supports inserting data|boolean|\n|**insertEventCapability**  <br>*optional*|Server supports inserting events|boolean|\n|**maxReturnDataValues**  <br>*optional*|Maximum number of historic data values that will<br>be returned in a single read.|integer (int64)|\n|**maxReturnEventValues**  <br>*optional*|Maximum number of events that will be returned<br>in a single read.|integer (int64)|\n|**replaceDataCapability**  <br>*optional*|Server supports replacing historic data|boolean|\n|**replaceEventCapability**  <br>*optional*|Server supports replacing events|boolean|\n|**serverTimestampSupported**  <br>*optional*|Server supports ServerTimestamps in addition<br>to SourceTimestamp|boolean|\n|**supportsHistoricData**  <br>*optional*|Server supports historic data access|boolean|\n|**supportsHistoricEvents**  <br>*optional*|Server supports historic event access|boolean|\n|**updateDataCapability**  <br>*optional*|Server supports updating historic data|boolean|\n|**updateEventCapability**  <br>*optional*|Server supports updating events|boolean|\n\n\n<a name=\"historyupdateoperation\"></a>\n### HistoryUpdateOperation\nHistory update type\n\n*Type* : enum (Insert, Replace, Update, Delete)\n\n\n<a name=\"historyupdateresponsemodel\"></a>\n### HistoryUpdateResponseModel\nHistory update results\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**results**  <br>*optional*|List of results from the update operation|< [ServiceResultModel](definitions.md#serviceresultmodel) > array|\n\n\n<a name=\"instancedeclarationmodel\"></a>\n### InstanceDeclarationModel\nInstance declaration meta data\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browseName**  <br>*optional*|The browse name for the instance declaration.|string|\n|**browsePath**  <br>*optional*|The browse path|< string > array|\n|**description**  <br>*optional*|The description for the instance declaration.|string|\n|**displayName**  <br>*optional*|The display name for the instance declaration.|string|\n|**displayPath**  <br>*optional*|A localized path to the instance declaration.|string|\n|**method**  <br>*optional*||[MethodMetadataModel](definitions.md#methodmetadatamodel)|\n|**modellingRule**  <br>*optional*|The modelling rule for the instance<br>declaration (i.e. Mandatory or Optional).|string|\n|**modellingRuleId**  <br>*optional*|The modelling rule node id.|string|\n|**nodeClass**  <br>*optional*||[NodeClass](definitions.md#nodeclass)|\n|**nodeId**  <br>*optional*|The node id for the instance.|string|\n|**overriddenDeclaration**  <br>*optional*||[InstanceDeclarationModel](definitions.md#instancedeclarationmodel)|\n|**rootTypeId**  <br>*optional*|The type that the declaration belongs to.|string|\n|**variable**  <br>*optional*||[VariableMetadataModel](definitions.md#variablemetadatamodel)|\n\n\n<a name=\"messageencoding\"></a>\n### MessageEncoding\nSpecifies the encoding format for OPC UA Publisher messages.\nCan be combined with compression and reversibility flags to control\nmessage format characteristics.\n\n*Type* : enum (Uadp, Json, Xml, Avro, IsReversible, JsonReversible, IsGzipCompressed, JsonGzip, AvroGzip, JsonReversibleGzip)\n\n\n<a name=\"messagingmode\"></a>\n### MessagingMode\nDefines how OPC UA Publisher formats and structures messages for transport.\nEach mode provides different trade-offs between message completeness,\nbandwidth efficiency, and compatibility with different message consumers.\n\n*Type* : enum (PubSub, Samples, FullNetworkMessages, FullSamples, DataSetMessages, SingleDataSetMessage, DataSets, SingleDataSet, RawDataSets, SingleRawDataSet)\n\n\n<a name=\"methodcallargumentmodel\"></a>\n### MethodCallArgumentModel\nMethod argument model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**dataType**  <br>*optional*|Data type Id of the value (from meta data)|string|\n|**value**  <br>*optional*|Initial value or value to use|object|\n\n\n<a name=\"methodcallrequestmodel\"></a>\n### MethodCallRequestModel\nCall request model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**arguments**  <br>*optional*|Arguments for the method - null means no args|< [MethodCallArgumentModel](definitions.md#methodcallargumentmodel) > array|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**methodBrowsePath**  <br>*optional*|An optional component path from the node identified by<br>MethodId or from a resolved objectId to the actual<br>method node.|< string > array|\n|**methodId**  <br>*optional*|Method id of method to call.|string|\n|**objectBrowsePath**  <br>*optional*|An optional component path from the node identified by<br>ObjectId to the actual object or objectType node.<br>If ObjectId is null, the root node (i=84) is used|< string > array|\n|**objectId**  <br>*optional*|Context of the method, i.e. an object or object type<br>node.  If null then the method is called in the context<br>of the inverse HasComponent reference of the MethodId<br>if it exists.|string|\n\n\n<a name=\"methodcallrequestmodelrequestenvelope\"></a>\n### MethodCallRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[MethodCallRequestModel](definitions.md#methodcallrequestmodel)|\n\n\n<a name=\"methodcallresponsemodel\"></a>\n### MethodCallResponseModel\nMethod call response model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**results**  <br>*required*|Resulting output values of method call|< [MethodCallArgumentModel](definitions.md#methodcallargumentmodel) > array|\n\n\n<a name=\"methodmetadataargumentmodel\"></a>\n### MethodMetadataArgumentModel\nMethod argument metadata model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**arrayDimensions**  <br>*optional*|Optional Array dimension of argument|integer (int64)|\n|**defaultValue**  <br>*optional*|Default value for the argument|object|\n|**description**  <br>*optional*|Optional description of argument|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**name**  <br>*required*|Name of the argument|string|\n|**type**  <br>*required*||[NodeModel](definitions.md#nodemodel)|\n|**valueRank**  <br>*optional*||[NodeValueRank](definitions.md#nodevaluerank)|\n\n\n<a name=\"methodmetadatamodel\"></a>\n### MethodMetadataModel\nMethod metadata model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**inputArguments**  <br>*optional*|Input argument meta data|< [MethodMetadataArgumentModel](definitions.md#methodmetadataargumentmodel) > array|\n|**objectId**  <br>*optional*|Id of object that the method is a component of|string|\n|**outputArguments**  <br>*optional*|output argument meta data|< [MethodMetadataArgumentModel](definitions.md#methodmetadataargumentmodel) > array|\n\n\n<a name=\"methodmetadatarequestmodel\"></a>\n### MethodMetadataRequestModel\nMethod metadata request model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**methodBrowsePath**  <br>*optional*|An optional component path from the node identified by<br>MethodId to the actual method node.|< string > array|\n|**methodId**  <br>*optional*|Method id of method to call.<br>(Required)|string|\n\n\n<a name=\"methodmetadatarequestmodelrequestenvelope\"></a>\n### MethodMetadataRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[MethodMetadataRequestModel](definitions.md#methodmetadatarequestmodel)|\n\n\n<a name=\"methodmetadataresponsemodel\"></a>\n### MethodMetadataResponseModel\nResult of method metadata query\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**inputArguments**  <br>*optional*|Input argument meta data|< [MethodMetadataArgumentModel](definitions.md#methodmetadataargumentmodel) > array|\n|**objectId**  <br>*optional*|Id of object that the method is a component of|string|\n|**outputArguments**  <br>*optional*|output argument meta data|< [MethodMetadataArgumentModel](definitions.md#methodmetadataargumentmodel) > array|\n\n\n<a name=\"modelchangehandlingoptionsmodel\"></a>\n### ModelChangeHandlingOptionsModel\nDescribes how model changes are published\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**rebrowseIntervalTimespan**  <br>*optional*|Rebrowse period|string (date-span)|\n\n\n<a name=\"modificationinfomodel\"></a>\n### ModificationInfoModel\nModification information\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**modificationTime**  <br>*optional*|Modification time|string (date-time)|\n|**updateType**  <br>*optional*||[HistoryUpdateOperation](definitions.md#historyupdateoperation)|\n|**userName**  <br>*optional*|User who made the change|string|\n\n\n<a name=\"monitoreditemwatchdogcondition\"></a>\n### MonitoredItemWatchdogCondition\nDefines the conditions that trigger the subscription watchdog behavior.\nWorks in conjunction with OpcNodeWatchdogTimespan to determine when nodes\nare considered \"late\" and DataSetWriterWatchdogBehavior to define the response.\nCan be configured globally via the --mwc command line option.\n\n*Type* : enum (WhenAllAreLate, WhenAnyIsLate)\n\n\n<a name=\"namespaceformat\"></a>\n### NamespaceFormat\nNamespace serialization format for node ids\nand qualified names.\n\n*Type* : enum (Uri, Index, Expanded, ExpandedWithNamespace0)\n\n\n<a name=\"nodeaccesslevel\"></a>\n### NodeAccessLevel\nFlags that can be set for the AccessLevel attribute.\n\n*Type* : enum (None, CurrentRead, CurrentWrite, HistoryRead, HistoryWrite, SemanticChange, StatusWrite, TimestampWrite, NonatomicRead, NonatomicWrite, WriteFullArrayOnly)\n\n\n<a name=\"nodeaccessrestrictions\"></a>\n### NodeAccessRestrictions\nFlags that can be read or written in the\nAccessRestrictions attribute.\n\n*Type* : enum (None, SigningRequired, EncryptionRequired, SessionRequired)\n\n\n<a name=\"nodeattribute\"></a>\n### NodeAttribute\nNode attribute identifiers\n\n*Type* : enum (NodeId, NodeClass, BrowseName, DisplayName, Description, WriteMask, UserWriteMask, IsAbstract, Symmetric, InverseName, ContainsNoLoops, EventNotifier, Value, DataType, ValueRank, ArrayDimensions, AccessLevel, UserAccessLevel, MinimumSamplingInterval, Historizing, Executable, UserExecutable, DataTypeDefinition, RolePermissions, UserRolePermissions, AccessRestrictions)\n\n\n<a name=\"nodeclass\"></a>\n### NodeClass\nNode class\n\n*Type* : enum (Object, Variable, Method, ObjectType, VariableType, ReferenceType, DataType, View)\n\n\n<a name=\"nodeeventnotifier\"></a>\n### NodeEventNotifier\nFlags that can be set for the EventNotifier attribute.\n\n*Type* : enum (SubscribeToEvents, HistoryRead, HistoryWrite)\n\n\n<a name=\"nodeidmodel\"></a>\n### NodeIdModel\nRepresents an OPC UA Node identifier in string format.\nUsed to identify nodes in the OPC UA address space for monitoring.\nSupports standard OPC UA node ID formats including:\n- Namespace index and identifier (ns=0;i=85)\n- String identifiers (ns=2;s=MyNode)\n- GUID identifiers (ns=3;g=8599E6C4-6667-4FB7-9EA9-C6896B31DB02)\n- Opaque/binary identifiers (ns=4;b=FA34E...)\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**Identifier**  <br>*optional*|The node identifier string in standard OPC UA notation.<br>Format: ns={namespace};{type}={value}<br>Examples:<br>- ns=0;i=85 (numeric identifier)<br>- ns=2;s=MyNode (string identifier)<br>- ns=3;g=8599E6C4-6667-4FB7-9EA9-C6896B31DB02 (GUID)<br>- ns=4;b=FA34E... (binary/opaque)<br>If namespace index is omitted, ns=0 is assumed.|string|\n\n\n<a name=\"nodemetadatarequestmodel\"></a>\n### NodeMetadataRequestModel\nNode metadata request model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional component path from the node identified by<br>NodeId to the actual node.|< string > array|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*optional*|Node id of the type.<br>(Required)|string|\n\n\n<a name=\"nodemetadatarequestmodelrequestenvelope\"></a>\n### NodeMetadataRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[NodeMetadataRequestModel](definitions.md#nodemetadatarequestmodel)|\n\n\n<a name=\"nodemetadataresponsemodel\"></a>\n### NodeMetadataResponseModel\nNode metadata model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**dataTypeMetadata**  <br>*optional*||[DataTypeMetadataModel](definitions.md#datatypemetadatamodel)|\n|**description**  <br>*optional*|The description for the node.|string|\n|**displayName**  <br>*optional*|The display name of the node.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**nethodMetadata**  <br>*optional*||[MethodMetadataModel](definitions.md#methodmetadatamodel)|\n|**nodeClass**  <br>*optional*||[NodeClass](definitions.md#nodeclass)|\n|**nodeId**  <br>*optional*|The node id of the node|string|\n|**typeDefinition**  <br>*optional*||[TypeDefinitionModel](definitions.md#typedefinitionmodel)|\n|**variableMetadata**  <br>*optional*||[VariableMetadataModel](definitions.md#variablemetadatamodel)|\n\n\n<a name=\"nodemodel\"></a>\n### NodeModel\nNode model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**accessLevel**  <br>*optional*||[NodeAccessLevel](definitions.md#nodeaccesslevel)|\n|**accessRestrictions**  <br>*optional*||[NodeAccessRestrictions](definitions.md#nodeaccessrestrictions)|\n|**arrayDimensions**  <br>*optional*|Array dimensions of variable or variable type.<br>(default: empty array)|integer (int64)|\n|**browseName**  <br>*optional*|Browse name|string|\n|**children**  <br>*optional*|Whether node has children which are defined as<br>any forward hierarchical references.<br>(default: unknown)|boolean|\n|**containsNoLoops**  <br>*optional*|Whether a view contains loops. Null if<br>not a view.|boolean|\n|**dataType**  <br>*optional*|If variable the datatype of the variable.<br>(default: null)|string|\n|**dataTypeDefinition**  <br>*optional*|Data type definition in case node is a<br>data type node and definition is available,<br>otherwise null.|object|\n|**description**  <br>*optional*|Description if any|string|\n|**displayName**  <br>*optional*|Display name|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**eventNotifier**  <br>*optional*||[NodeEventNotifier](definitions.md#nodeeventnotifier)|\n|**executable**  <br>*optional*|If method node class, whether method can<br>be called.|boolean|\n|**historizing**  <br>*optional*|Whether the value of a variable is historizing.<br>(default: false)|boolean|\n|**inverseName**  <br>*optional*|Inverse name of the reference if the node is<br>a reference type, otherwise null.|string|\n|**isAbstract**  <br>*optional*|Whether type is abstract, if type can<br>be abstract.  Null if not type node.<br>(default: false)|boolean|\n|**minimumSamplingInterval**  <br>*optional*|Minimum sampling interval for the variable<br>value, otherwise null if not a variable node.<br>(default: null)|number (double)|\n|**nodeClass**  <br>*optional*||[NodeClass](definitions.md#nodeclass)|\n|**nodeId**  <br>*required*|Id of node.<br>(Mandatory).  <br>**Minimum length** : `1`|string|\n|**rolePermissions**  <br>*optional*|Role permissions|< [RolePermissionModel](definitions.md#rolepermissionmodel) > array|\n|**serverPicoseconds**  <br>*optional*|Pico seconds part of when value was read at server.|integer (int32)|\n|**serverTimestamp**  <br>*optional*|Timestamp of when value was read at server.|string (date-time)|\n|**sourcePicoseconds**  <br>*optional*|Pico seconds part of when value was read at source.|integer (int32)|\n|**sourceTimestamp**  <br>*optional*|Timestamp of when value was read at source.|string (date-time)|\n|**symmetric**  <br>*optional*|Whether the reference is symmetric in case<br>the node is a reference type, otherwise<br>null.|boolean|\n|**typeDefinitionId**  <br>*optional*|Optional type definition of the node|string|\n|**userAccessLevel**  <br>*optional*||[NodeAccessLevel](definitions.md#nodeaccesslevel)|\n|**userExecutable**  <br>*optional*|If method node class, whether method can<br>be called by current user.<br>(default: false if not executable)|boolean|\n|**userRolePermissions**  <br>*optional*|User Role permissions|< [RolePermissionModel](definitions.md#rolepermissionmodel) > array|\n|**userWriteMask**  <br>*optional*|User write mask for the node<br>(default: 0)|integer (int64)|\n|**value**  <br>*optional*|Value of variable or default value of the<br>subtyped variable in case node is a variable<br>type, otherwise null.|object|\n|**valueRank**  <br>*optional*||[NodeValueRank](definitions.md#nodevaluerank)|\n|**writeMask**  <br>*optional*|Default write mask for the node<br>(default: 0)|integer (int64)|\n\n\n<a name=\"nodepathtargetmodel\"></a>\n### NodePathTargetModel\nNode path target\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*required*|The target browse path|< string > array|\n|**remainingPathIndex**  <br>*optional*|Remaining index in path|integer (int32)|\n|**target**  <br>*required*||[NodeModel](definitions.md#nodemodel)|\n\n\n<a name=\"nodereferencemodel\"></a>\n### NodeReferenceModel\nReference model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**direction**  <br>*optional*||[BrowseDirection](definitions.md#browsedirection)|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**referenceTypeId**  <br>*optional*|Reference Type id|string|\n|**target**  <br>*required*||[NodeModel](definitions.md#nodemodel)|\n\n\n<a name=\"nodetype\"></a>\n### NodeType\nThe node type\n\n*Type* : enum (Unknown, Variable, DataVariable, Property, DataType, View, Object, Event, Interface)\n\n\n<a name=\"nodevaluerank\"></a>\n### NodeValueRank\nConstants defined for the ValueRank attribute.\n\n*Type* : enum (OneOrMoreDimensions, OneDimension, TwoDimensions, ScalarOrOneDimension, Any, Scalar)\n\n\n<a name=\"opcauthenticationmode\"></a>\n### OpcAuthenticationMode\nSpecifies the authentication method used to connect to OPC UA servers.\nThe chosen mode determines how the Publisher authenticates itself to servers.\nWhen using credentials or certificates, encrypted communication should be enabled\nvia UseSecurity or EndpointSecurityMode to protect authentication secrets.\n\n*Type* : enum (Anonymous, UsernamePassword, Certificate)\n\n\n<a name=\"opcnodemodel\"></a>\n### OpcNodeModel\nDefines configuration for monitoring an OPC UA node.\nContains settings for sampling, filtering, publishing\nbehavior, and message routing. This model allows\nfine-grained control over how each node's data is collected\nand transmitted. Part of a PublishedNodesEntryModel's\nOpcNodes collection.\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**AttributeId**  <br>*optional*||[NodeAttribute](definitions.md#nodeattribute)|\n|**BrowsePath**  <br>*optional*|Relative path through the address space to reach target<br>node. Sequence of browse names from starting node to<br>target. Example: [\"Objects\", \"Server\", \"Data\",<br>\"Dynamic\", \"Scalar\"]. Allows referencing nodes through<br>hierarchical structure. Alternative to direct node ID<br>addressing.|< string > array|\n|**ConditionHandling**  <br>*optional*||[ConditionHandlingOptionsModel](definitions.md#conditionhandlingoptionsmodel)|\n|**CyclicReadMaxAge**  <br>*optional*|Maximum age for cached values in cyclic reads. Specified in<br>milliseconds. Default: 0 (no caching) Only applies when<br>UseCyclicRead is true. Server may return cached value if<br>within max age. Helps reduce server load in high-frequency<br>reads. Ignored when CyclicReadMaxAgeTimespan is defined.|integer (int32)|\n|**CyclicReadMaxAgeTimespan**  <br>*optional*|Maximum age for cached values in cyclic reads as TimeSpan.<br>Takes precedence over CyclicReadMaxAge if both defined.<br>Only applies when UseCyclicRead is true. Default:<br>\"00:00:00\" (no caching) Example: \"00:00:00.500\" for 500ms<br>max cache age. Helps optimize read performance vs data<br>freshness.|string (date-span)|\n|**DataChangeTrigger**  <br>*optional*||[DataChangeTriggerType](definitions.md#datachangetriggertype)|\n|**DataSetClassFieldId**  <br>*optional*|Unique identifier for correlating fields with dataset<br>class metadata. Links monitored item data with dataset<br>class field definitions. Used to provide context and type<br>information for the field. Must match corresponding field<br>ID in dataset class metadata. Important for proper message<br>decoding by subscribers.|string (uuid)|\n|**DataSetFieldId**  <br>*optional*|Custom identifier for this node in dataset messages. Used<br>as field name in message payloads if specified. Falls back<br>to DisplayName if not provided. Helps correlate data with<br>specific measurements or tags. Must be unique within a<br>dataset writer.|string|\n|**DeadbandType**  <br>*optional*||[DeadbandType](definitions.md#deadbandtype)|\n|**DeadbandValue**  <br>*optional*|Deadband value of the data change filter to apply. Does<br>not apply to events|number (double)|\n|**DiscardNew**  <br>*optional*|Controls queue overflow behavior for monitored items.<br>True: Discard newest values when queue is full (LIFO).<br>False: Discard oldest values when queue is full (FIFO,<br>default). Use True to preserve historical data during<br>connection issues. Use False to maintain current value<br>accuracy.|boolean|\n|**DisplayName**  <br>*optional*|Human-readable name for the monitored item. Used as field<br>identifier if DataSetFieldId not specified. Can be<br>overridden by actual node DisplayName if<br>FetchDisplayName=true. Helps identify data sources in<br>messages and logs. Should be unique within a dataset for<br>clear identification.|string|\n|**EventFilter**  <br>*optional*||[EventFilterModel](definitions.md#eventfiltermodel)|\n|**ExpandedNodeId**  <br>*optional*|Alternative node identifier with full namespace URI. Same<br>as Id but uses complete namespace URI instead of index.<br>Format: \"nsu={uri};{type}={value}\" Example:<br>\"nsu=http://opcfoundation.org/UA/;i=2258\" Provides more<br>portable node identification across servers.|string|\n|**FetchDisplayName**  <br>*optional*|Retrieve node's DisplayName attribute on startup. True:<br>Query and use actual display name False: Use configured<br>DisplayName (default) Overrides DataSetFetchDisplayNames<br>setting. Used for human-readable field identification.|boolean|\n|**HeartbeatBehavior**  <br>*optional*||[HeartbeatBehavior](definitions.md#heartbeatbehavior)|\n|**HeartbeatInterval**  <br>*optional*|Node-specific heartbeat interval in milliseconds.<br>Overrides DefaultHeartbeatInterval from parent<br>configuration. Controls how often heartbeat messages are<br>generated. Set to 0 to disable heartbeats for this node.<br>Ignored when HeartbeatIntervalTimespan is defined.|integer (int32)|\n|**HeartbeatIntervalTimespan**  <br>*optional*|Node-specific heartbeat interval as TimeSpan. Takes<br>precedence over HeartbeatInterval if both defined.<br>Overrides DefaultHeartbeatIntervalTimespan setting.<br>Provides more precise control over timing. Example:<br>\"00:00:10\" for 10-second interval.|string (date-span)|\n|**Id**  <br>*optional*|The OPC UA node identifier string in standard notation.<br>Format: ns={namespace};{type}={value} Required field that<br>uniquely identifies the node to monitor. Examples:<br>\"ns=2;s=MyTag\", \"ns=0;i=2258\" See OPC UA Part 3 for node<br>ID format specifications.|string|\n|**IndexRange**  <br>*optional*|Range specification for array or string values. Format:<br>\"start:end\" or \"index\". Examples: \"0:3\" (first 4<br>elements), \"7\" (8th element) Allows monitoring specific<br>array elements. Default: null (entire value monitored)|string|\n|**MethodMetadata**  <br>*optional*||[MethodMetadataModel](definitions.md#methodmetadatamodel)|\n|**ModelChangeHandling**  <br>*optional*||[ModelChangeHandlingOptionsModel](definitions.md#modelchangehandlingoptionsmodel)|\n|**OpcPublishingInterval**  <br>*optional*|Client-side publishing rate in milliseconds. Controls how<br>often the server sends notifications. Must be >=<br>OpcSamplingInterval for proper operation. Overrides<br>DataSetPublishingInterval when specified. Ignored if<br>OpcPublishingIntervalTimespan is defined.|integer (int32)|\n|**OpcPublishingIntervalTimespan**  <br>*optional*|OpcPublishingInterval as TimeSpan.|string (date-span)|\n|**OpcSamplingInterval**  <br>*optional*|Server-side sampling rate in milliseconds. Determines how<br>often the server checks for value changes. Default from<br>DataSetSamplingInterval if not specified. Should be less<br>than or equal to OpcPublishingInterval for effective<br>sampling. Ignored when OpcSamplingIntervalTimespan is<br>defined.|integer (int32)|\n|**OpcSamplingIntervalTimespan**  <br>*optional*|Server-side sampling rate as a TimeSpan. Takes precedence<br>over OpcSamplingInterval if both are defined. Provides<br>more precise control over timing than milliseconds.<br>Example: \"00:00:00.100\" for 100ms sampling. Should be<br>less than or equal to OpcPublishingIntervalTimespan for<br>effective sampling.|string (date-span)|\n|**QualityOfService**  <br>*optional*||[QoS](definitions.md#qos)|\n|**QueueSize**  <br>*optional*|Size of the server-side queue for this monitored item.<br>Controls how many values can be buffered during slow<br>connections. Values are discarded according to DiscardNew<br>when queue is full. Default is 1 unless otherwise<br>configured. Larger queues help prevent data loss but use<br>more server memory.|integer (int64)|\n|**RegisterNode**  <br>*optional*|Optimize node access using RegisterNodes service. True:<br>Register node for faster subsequent reads False: Use<br>direct node access (default) Can improve performance for<br>frequently accessed nodes. Server must support<br>RegisterNodes service.|boolean|\n|**SkipFirst**  <br>*optional*|Controls handling of initial value notification. True:<br>Suppress first value from monitored item. False: Publish<br>initial value (default). Useful when only changes are<br>relevant. Server always sends initial value on creation.|boolean|\n|**Topic**  <br>*optional*|Custom routing topic/queue for this node's messages.<br>Overrides writer and writer group queue settings. Enables<br>node-specific message routing patterns. Messages are split<br>into separate network messages when nodes have different<br>topics. Format depends on transport (e.g., MQTT topic<br>syntax).|string|\n|**TriggeredNodes**  <br>*optional*|Collection of dependent nodes triggered by this node. Read<br>atomically when parent node changes. Limited to one level<br>of triggering (no cascading). Useful for maintaining data<br>consistency between related measurements. Changes to<br>triggered nodes must be made through parent node's API<br>calls.|< [OpcNodeModel](definitions.md#opcnodemodel) > array|\n|**TypeDefinitionId**  <br>*optional*|A type definition id that references a well known opc ua<br>type definition node for the variable represented by this<br>node entry.|string|\n|**UseCyclicRead**  <br>*optional*|Use periodic reads instead of monitored items. True: Sample<br>using CyclicRead service calls False: Use standard<br>subscription monitoring (default) Useful for nodes that<br>don't support monitoring or when consistent sampling<br>timing is required. Consider CyclicReadMaxAge when<br>enabled.|boolean|\n\n\n<a name=\"operationcontextmodel\"></a>\n### OperationContextModel\nOperation log model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**AuthorityId**  <br>*optional*|User|string|\n|**Time**  <br>*optional*|Operation time|string (date-time)|\n\n\n<a name=\"operationlimitsmodel\"></a>\n### OperationLimitsModel\nServer limits\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**maxArrayLength**  <br>*optional*|Max array length supported|integer (int64)|\n|**maxBrowseContinuationPoints**  <br>*optional*|Max browse continuation points|integer (int32)|\n|**maxByteStringLength**  <br>*optional*|Max byte buffer length supported|integer (int64)|\n|**maxHistoryContinuationPoints**  <br>*optional*|Max history continuation points|integer (int32)|\n|**maxMonitoredItemsPerCall**  <br>*optional*|Max monitored items that can be updated at once.|integer (int64)|\n|**maxNodesPerBrowse**  <br>*optional*|Max nodes that can be part of a single browse call.|integer (int64)|\n|**maxNodesPerHistoryReadData**  <br>*optional*|Number of nodes that can be in a History Read value call|integer (int64)|\n|**maxNodesPerHistoryReadEvents**  <br>*optional*|Number of nodes that can be in a History Read events call|integer (int64)|\n|**maxNodesPerHistoryUpdateData**  <br>*optional*|Number of nodes that can be in a History Update call|integer (int64)|\n|**maxNodesPerHistoryUpdateEvents**  <br>*optional*|Number of nodes that can be in a History events update call|integer (int64)|\n|**maxNodesPerMethodCall**  <br>*optional*|Max nodes that can be read in single method call|integer (int64)|\n|**maxNodesPerNodeManagement**  <br>*optional*|Max nodes that can be added or removed in a single call.|integer (int64)|\n|**maxNodesPerRead**  <br>*optional*|Max nodes that can be read in single read call|integer (int64)|\n|**maxNodesPerRegisterNodes**  <br>*optional*|Max nodes that can be registered at once|integer (int64)|\n|**maxNodesPerTranslatePathsToNodeIds**  <br>*optional*|Max nodes that can be part of a browse path|integer (int64)|\n|**maxNodesPerWrite**  <br>*optional*|Max nodes that can be read in single write call|integer (int64)|\n|**maxQueryContinuationPoints**  <br>*optional*|Max query continuation points|integer (int32)|\n|**maxStringLength**  <br>*optional*|Max string length supported|integer (int64)|\n|**minSupportedSampleRate**  <br>*optional*|Min supported sampling rate|number (double)|\n\n\n<a name=\"problemdetails\"></a>\n### ProblemDetails\n\n|Name|Schema|\n|---|---|\n|**detail**  <br>*optional*|string|\n|**instance**  <br>*optional*|string|\n|**status**  <br>*optional*|integer (int32)|\n|**title**  <br>*optional*|string|\n|**type**  <br>*optional*|string|\n\n\n<a name=\"publishbulkrequestmodel\"></a>\n### PublishBulkRequestModel\nPublish in bulk request\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodesToAdd**  <br>*optional*|Node to add|< [PublishedItemModel](definitions.md#publisheditemmodel) > array|\n|**nodesToRemove**  <br>*optional*|Node to remove|< string > array|\n\n\n<a name=\"publishbulkrequestmodelrequestenvelope\"></a>\n### PublishBulkRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[PublishBulkRequestModel](definitions.md#publishbulkrequestmodel)|\n\n\n<a name=\"publishbulkresponsemodel\"></a>\n### PublishBulkResponseModel\nResult of bulk request\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**nodesToAdd**  <br>*optional*|Node to add|< [ServiceResultModel](definitions.md#serviceresultmodel) > array|\n|**nodesToRemove**  <br>*optional*|Node to remove|< [ServiceResultModel](definitions.md#serviceresultmodel) > array|\n\n\n<a name=\"publishdiagnosticinfomodel\"></a>\n### PublishDiagnosticInfoModel\nModel for a diagnostic info.\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**connectionRetries**  <br>*optional*|ConnectionRetries|integer (int64)|\n|**encoderAvgIoTChunkUsage**  <br>*optional*|EncoderAvgIoTChunkUsage|number (double)|\n|**encoderAvgIoTMessageBodySize**  <br>*optional*|EncoderAvgIoTMessageBodySize|number (double)|\n|**encoderAvgNotificationsMessage**  <br>*optional*|EncoderAvgNotificationsMessage|number (double)|\n|**encoderIoTMessagesProcessed**  <br>*optional*|EncoderIoTMessagesProcessed|integer (int64)|\n|**encoderMaxMessageSplitRatio**  <br>*optional*|Encoder max message split ratio|number (double)|\n|**encoderNotificationsDropped**  <br>*optional*|EncoderNotificationsDropped|integer (int64)|\n|**encoderNotificationsProcessed**  <br>*optional*|EncoderNotificationsProcessed|integer (int64)|\n|**encodingBlockInputSize**  <br>*optional*|EncodingBlockInputSize|integer (int64)|\n|**encodingBlockOutputSize**  <br>*optional*|EncodingBlockOutputSize|integer (int64)|\n|**endpoints**  <br>*optional*|Endpoints covered by the diagnostics model.<br>The endpoints are all part of the same writer<br>group. Specify|< [PublishedNodesEntryModel](definitions.md#publishednodesentrymodel) > array|\n|**estimatedIoTChunksPerDay**  <br>*optional*|EstimatedIoTChunksPerDay|number (double)|\n|**ingestionDuration**  <br>*optional*|IngestionDuration|string (date-span)|\n|**ingressBatchBlockBufferSize**  <br>*optional*|IngressBatchBlockBufferSize|integer (int64)|\n|**ingressCyclicReads**  <br>*optional*|Number of cyclic reads of the total value changes|integer (int64)|\n|**ingressDataChanges**  <br>*optional*|IngressDataChanges|integer (int64)|\n|**ingressDataChangesInLastMinute**  <br>*optional*|Data changes received in the last minute|integer (int64)|\n|**ingressEventNotifications**  <br>*optional*|Number of incoming event notifications|integer (int64)|\n|**ingressEvents**  <br>*optional*|Total incoming events so far.|integer (int64)|\n|**ingressHeartbeats**  <br>*optional*|Number of heartbeats of the total value changes|integer (int64)|\n|**ingressValueChanges**  <br>*optional*|IngressValueChanges|integer (int64)|\n|**ingressValueChangesInLastMinute**  <br>*optional*|Value changes received in the last minute|integer (int64)|\n|**monitoredOpcNodesFailedCount**  <br>*optional*|MonitoredOpcNodesFailedCount|integer (int64)|\n|**monitoredOpcNodesSucceededCount**  <br>*optional*|MonitoredOpcNodesSucceededCount|integer (int64)|\n|**opcEndpointConnected**  <br>*optional*|OpcEndpointConnected|boolean|\n|**outgressInputBufferCount**  <br>*optional*|OutgressInputBufferCount|integer (int64)|\n|**outgressInputBufferDropped**  <br>*optional*|OutgressInputBufferDropped|integer (int64)|\n|**outgressIoTMessageCount**  <br>*optional*|OutgressIoTMessageCount|integer (int64)|\n|**sentMessagesPerSec**  <br>*optional*|SentMessagesPerSec|number (double)|\n\n\n<a name=\"publishstartrequestmodel\"></a>\n### PublishStartRequestModel\nPublish request\n\n\n|Name|Schema|\n|---|---|\n|**header**  <br>*optional*|[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**item**  <br>*required*|[PublishedItemModel](definitions.md#publisheditemmodel)|\n\n\n<a name=\"publishstartrequestmodelrequestenvelope\"></a>\n### PublishStartRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[PublishStartRequestModel](definitions.md#publishstartrequestmodel)|\n\n\n<a name=\"publishstartresponsemodel\"></a>\n### PublishStartResponseModel\nResult of publish request\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n\n\n<a name=\"publishstoprequestmodel\"></a>\n### PublishStopRequestModel\nUnpublish request\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*required*|Node of published item to unpublish  <br>**Minimum length** : `1`|string|\n\n\n<a name=\"publishstoprequestmodelrequestenvelope\"></a>\n### PublishStopRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[PublishStopRequestModel](definitions.md#publishstoprequestmodel)|\n\n\n<a name=\"publishstopresponsemodel\"></a>\n### PublishStopResponseModel\nResult of publish stop request\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n\n\n<a name=\"publisheditemlistrequestmodel\"></a>\n### PublishedItemListRequestModel\nRequest list of published items\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token or null to start|string|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n\n\n<a name=\"publisheditemlistrequestmodelrequestenvelope\"></a>\n### PublishedItemListRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[PublishedItemListRequestModel](definitions.md#publisheditemlistrequestmodel)|\n\n\n<a name=\"publisheditemlistresponsemodel\"></a>\n### PublishedItemListResponseModel\nList of published nodes\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation or null if final|string|\n|**items**  <br>*optional*|Monitored items|< [PublishedItemModel](definitions.md#publisheditemmodel) > array|\n\n\n<a name=\"publisheditemmodel\"></a>\n### PublishedItemModel\nA monitored and published item\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**displayName**  <br>*optional*|Display name of the variable node monitored|string|\n|**heartbeatInterval**  <br>*optional*|Heartbeat interval to use|string (date-span)|\n|**nodeId**  <br>*required*|Variable node monitored  <br>**Minimum length** : `1`|string|\n|**publishingInterval**  <br>*optional*|Publishing interval to use|string (date-span)|\n|**samplingInterval**  <br>*optional*|Sampling interval to use|string (date-span)|\n\n\n<a name=\"publishednodedeleteassetrequestmodel\"></a>\n### PublishedNodeDeleteAssetRequestModel\nContains entry in the published nodes configuration representing\nthe asset as well as an optional request header.\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**entry**  <br>*required*||[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n|**force**  <br>*optional*|The asset on the server is deleted no matter whether<br>the removal in the publisher configuration was successful<br>or not.|boolean|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n\n\n<a name=\"publishednodeexpansionmodel\"></a>\n### PublishedNodeExpansionModel\nNode expansion configuration. Configures how an entry should\n            be expanded into configuration. If a node is an object it is\n            expanded to all contained variables.\n\nIf a node is an object type, all objects of that type are\n            searched from the object root node. These found objects are\n            then expanded into their variables.\n\nIf the node is a variable, the variable is expanded to include\n            all contained variables or properties. All entries will have\n            the data set field id configured as data set class id.\n\nIf a node is a variable type, then all variables of this type\n            are found and added to a single writer entry. Note: That by\n            themselves these variables are no further expanded.\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**createSingleWriter**  <br>*optional*|By default the api will create a new distinct<br>writer per expanded object. Objects that cannot<br>be expanded are part of the originally provided<br>writer. The writer id is then post fixed with<br>the data set field id of the object node field.<br>If true, all variables of all expanded nodes are<br>added to the originally provided entry.|boolean|\n|**discardErrors**  <br>*optional*|Errors are silently discarded and only<br>successfully expanded nodes are returned.|boolean|\n|**excludeRootIfInstanceNode**  <br>*optional*|If the node is an object or variable instance do<br>not include it but only the instances underneath<br>them.|boolean|\n|**flattenTypeInstance**  <br>*optional*|If false, treats instance nodes found just like<br>objects that need to be expanded. In case of a<br>companion spec object type this could be set to<br>true, flattening the structure into a single<br>writer that represents the object in its entirety.<br>However, when using generic interfaces that can<br>be implemented across objects in the address<br>space and only its variables are important, it<br>might be useful to set this to false.|boolean|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**includeMethods**  <br>*optional*|Include not just variables and events but also<br>methods when expanding an object.|boolean|\n|**maxDepth**  <br>*optional*|Max browse depth for object search operation or<br>when searching for an instance of a type.<br>To only expand an object to its variables set<br>this value to 0. The depth of expansion of a<br>variable itself can be controlled via the<br>Azure.IIoT.OpcUa.Publisher.Models.PublishedNodeExpansionModel.MaxLevelsToExpand\" property.<br>If the root object is excluded a value of 0 is<br>equivalent to a value of 1 to get the first level<br>of objects contained in the object but not the<br>object itself, e.g. a folder object.|integer (int64)|\n|**maxLevelsToExpand**  <br>*optional*|Max number of levels to expand an instance node<br>such as an object or variable into resulting<br>variables.<br>If the node is a variable instance to start with<br>but the Azure.IIoT.OpcUa.Publisher.Models.PublishedNodeExpansionModel.ExcludeRootIfInstanceNode<br>property is set to excluded it, then setting this<br>value to 0 is equivalent to a value of 1 to get<br>the first level of variables contained in the<br>variable, but not the variable itself. Otherwise<br>only the variable itelf is returned. If the node<br>is an object instance, 0 is equivalent to<br>infinite and all levels are expanded.|integer (int64)|\n|**noSubTypesOfTypeNodes**  <br>*optional*|Do not consider subtypes of an object type when<br>searching for instances of the type.|boolean|\n|**useBrowseNameAsDisplayName**  <br>*optional*|Use the browse name as display name for nodes. The<br>display name is rooted in the parent node from<br>which browsing occurs, or just the browse name if<br>the browse root is not a parent.|boolean|\n\n\n<a name=\"publishednodeexpansionmodelpublishednodesentryrequestmodel\"></a>\n### PublishedNodeExpansionModelPublishedNodesEntryRequestModel\nWraps a request and a published nodes entry to bind to a\nbody more easily for api that requires an entry and additional\nconfiguration\n\n\n|Name|Schema|\n|---|---|\n|**entry**  <br>*required*|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n|**request**  <br>*optional*|[PublishedNodeExpansionModel](definitions.md#publishednodeexpansionmodel)|\n\n\n<a name=\"publishednodesentrymodel\"></a>\n### PublishedNodesEntryModel\nConfiguration model for OPC UA Publisher that defines how\n            OPC UA nodes are published to messaging systems. Used to\n            configure connections to OPC UA servers, setup node\n            monitoring, and control message publishing.\n\nKey features:\n            - Endpoint configuration and security settings\n            - Writer group and dataset organization\n            - Publishing intervals and sampling controls\n            - Message batching and triggering\n            - Subscription and monitoring options\n            - Heartbeat and watchdog behaviors\n            - Security modes and authentication\n\nFor detailed configuration options, see individual\n            properties.\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**BatchSize**  <br>*optional*|The number of notifications that are queued before a<br>network message is generated. Controls message batching for<br>optimizing network traffic vs latency. For historic reasons<br>the default value is 50 unless otherwise configured via the<br>--bs command line option.|integer (int64)|\n|**BatchTriggerInterval**  <br>*optional*|The interval at which batched network messages are<br>published, in milliseconds. Messages are published when<br>this interval elapses or when BatchSize is reached. For<br>historic reasons the default is 10 seconds unless<br>configured via --bi. Ignored when<br>BatchTriggerIntervalTimespan is specified. Used with<br>BatchSize to optimize network traffic vs latency.|integer (int32)|\n|**BatchTriggerIntervalTimespan**  <br>*optional*|The interval at which batched network messages are<br>published, as a TimeSpan. Takes precedence over<br>BatchTriggerInterval if both are defined. Messages are<br>published when this interval elapses or when BatchSize is<br>reached. Provides more precise control over publishing<br>timing than millisecond interval. Used with BatchSize to<br>optimize network traffic vs latency.|string (date-span)|\n|**DataSetClassId**  <br>*optional*|The optional dataset class id as it shall appear in dataset<br>messages and dataset metadata. Used to uniquely identify the<br>type of dataset being published. Default: Guid.Empty|string (uuid)|\n|**DataSetDescription**  <br>*optional*|The optional description of the dataset.|string|\n|**DataSetExtensionFields**  <br>*optional*|Optional key-value pairs inserted into key frame and<br>metadata messages in the same data set. Values are<br>formatted using OPC UA Variant JSON encoding. Used to add<br>contextual information to datasets.|< string, object > map|\n|**DataSetFetchDisplayNames**  <br>*optional*|Controls whether to fetch display names of monitored<br>variable nodes and use those inside messages as field<br>names. When true, fetches display names for all nodes. If<br>false, uses DisplayName value if provided; if not provided,<br>uses the node id. Can be configured via --fd command line<br>option.|boolean|\n|**DataSetKeyFrameCount**  <br>*optional*|Controls key frame insertion frequency in the message<br>stream. A key frame contains all current values, while<br>delta frames only contain changes. Setting this ensures<br>periodic complete state updates, useful for late-joining<br>consumers or state synchronization. Key frames can also<br>include configured DataSetExtensionFields for additional<br>context. Default: 0 (key frames disabled)|integer (int64)|\n|**DataSetName**  <br>*optional*|The optional name of the dataset as it will appear in the<br>dataset metadata. Used for identification and organization<br>of datasets.|string|\n|**DataSetPublishingInterval**  <br>*optional*|The publishing interval used for a grouped set of nodes<br>under a certain DataSetWriter, expressed in milliseconds.<br>When a specific node underneath DataSetWriter defines<br>OpcPublishingInterval (or Timespan), its value will<br>overwrite this interval and potentially split the data set<br>writer into more than one subscription. Ignored when<br>DataSetPublishingIntervalTimespan is present.|integer (int32)|\n|**DataSetPublishingIntervalTimespan**  <br>*optional*|The publishing interval for a dataset writer, expressed as a<br>TimeSpan value. Takes precedence over<br>DataSetPublishingInterval if defined. Provides more precise<br>control over timing than milliseconds. When overridden by<br>node-specific intervals, the writer may split into multiple<br>subscriptions.|string (date-span)|\n|**DataSetRootNodeId**  <br>*optional*|A root node that all nodes that use a non rooted browse paths in the<br>dataset should start from.|string|\n|**DataSetRouting**  <br>*optional*||[DataSetRoutingMode](definitions.md#datasetroutingmode)|\n|**DataSetSamplingInterval**  <br>*optional*|Default sampling interval in milliseconds for all monitored<br>items in the dataset. Used if individual nodes don't<br>specify their own sampling interval. Follows OPC UA<br>specification for sampling behavior. Ignored when<br>DataSetSamplingIntervalTimespan is present. Defaults to<br>value configured via --oi command line option.|integer (int32)|\n|**DataSetSamplingIntervalTimespan**  <br>*optional*|Default sampling interval as TimeSpan for all monitored<br>items in the dataset. Takes precedence over<br>DataSetSamplingInterval if both are defined. Used if<br>individual nodes don't specify their own sampling interval.<br>Provides more precise control over sampling timing. Follows<br>OPC UA specification for sampling behavior.|string (date-span)|\n|**DataSetSourceUri**  <br>*optional*|Contains an uri identifier that allows correlation of the writer<br>data set source into other systems. Will be used as part of<br>cloud events header if enabled.|string|\n|**DataSetSubject**  <br>*optional*|Contains an identifier that allows correlation of the writer<br>group into other systems in the context of the source. Will be<br>used as part of cloud events header if enabled.|string|\n|**DataSetType**  <br>*optional*|A type definition id that references a well known opc ua type<br>definition node for the dataset represented by this entry.<br>If set it is used in context of cloud events to specify a concrete<br>type of dataset message in the cloud events type header.|string|\n|**DataSetWriterGroup**  <br>*optional*|The data set writer group collecting datasets defined for a<br>certain endpoint. This attribute is used to identify the<br>session opened into the server. The default value consists<br>of the EndpointUrl string, followed by a deterministic hash<br>composed of the EndpointUrl, UseSecurity,<br>OpcAuthenticationMode, UserName and Password attributes.|string|\n|**DataSetWriterId**  <br>*optional*|The unique identifier for a data set writer used to collect<br>OPC UA nodes to be semantically grouped and published with<br>the same publishing interval. When not specified, uses a<br>string representing the common publishing interval of the<br>nodes in the data set collection. This attribute uniquely<br>identifies a data set within a DataSetWriterGroup. The<br>uniqueness is determined using the provided DataSetWriterId<br>and the publishing interval of the grouped OpcNodes.|string|\n|**DataSetWriterWatchdogBehavior**  <br>*optional*||[SubscriptionWatchdogBehavior](definitions.md#subscriptionwatchdogbehavior)|\n|**DefaultHeartbeatBehavior**  <br>*optional*||[HeartbeatBehavior](definitions.md#heartbeatbehavior)|\n|**DefaultHeartbeatInterval**  <br>*optional*|The interval in milliseconds at which to publish heartbeat<br>messages. Heartbeat acts like a watchdog that fires after<br>this interval has passed and no new value has been<br>received. A value of 0 disables heartbeat. Ignored when<br>DefaultHeartbeatIntervalTimespan is defined. See<br>heartbeat.md for detailed behavior documentation.|integer (int32)|\n|**DefaultHeartbeatIntervalTimespan**  <br>*optional*|The heartbeat interval as TimeSpan for all nodes in this<br>dataset. Takes precedence over DefaultHeartbeatInterval if<br>defined. Controls how often heartbeat messages are<br>published when no value changes occur.|string (date-span)|\n|**DisableSubscriptionTransfer**  <br>*optional*|Controls whether subscription transfer is disabled during<br>reconnect. When false (default), attempts to transfer<br>subscriptions on reconnect to maintain data continuity. Set<br>to true to fix interoperability issues with servers that<br>don't support subscription transfer. Can be configured<br>globally via command line options.|boolean|\n|**DumpConnectionDiagnostics**  <br>*optional*|Enables detailed server diagnostics logging for the<br>connection. When enabled, provides additional diagnostic<br>information useful for troubleshooting connectivity,<br>authentication, and subscription issues. The diagnostics<br>data is included in the publisher's logs. Default: false|boolean|\n|**EncryptedAuthPassword**  <br>*optional*|The encrypted password for authentication when<br>OpcAuthenticationMode is UsernamePassword. For certificate<br>authentication, contains the password to access the private<br>key. Encrypted credentials at rest can be enforced using<br>the --fce command line option. Version 2.6+ stores<br>credentials in plain text by default, while 2.5 and below<br>always encrypted them.|string|\n|**EncryptedAuthUsername**  <br>*optional*|The encrypted username for authentication when<br>OpcAuthenticationMode is UsernamePassword. Encrypted<br>credentials at rest can be enforced using the --fce command<br>line option. Version 2.6+ stores credentials in plain text<br>by default, while 2.5 and below always encrypted them.|string|\n|**EndpointSecurityMode**  <br>*optional*||[SecurityMode](definitions.md#securitymode)|\n|**EndpointSecurityPolicy**  <br>*optional*|The security policy URI to use for the endpoint connection.<br>Overrides UseSecurity setting and refines<br>EndpointSecurityMode choice. Examples include<br>\"http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256\".<br>If the specified policy is not available with the chosen<br>security mode, connectivity will fail. This allows enforcing<br>specific security requirements.|string|\n|**EndpointUrl**  <br>*required*|The required OPC UA server endpoint URL to connect to. This<br>is the only required field in the configuration. Format:<br>\"opc.tcp://host:port/path\"  <br>**Minimum length** : `1`|string|\n|**LastChangeDateTime**  <br>*optional*|The time the Publisher configuration was last updated.<br>Read only and informational only.|string (date-time)|\n|**MaxKeepAliveCount**  <br>*optional*|Defines how many publishing timer expirations to wait<br>before sending a keep-alive message when no notifications<br>are pending. Works with SendKeepAliveDataSetMessages to<br>maintain connection awareness. Keep-alive messages help<br>detect connection issues even when no data changes are<br>occurring.|integer (int64)|\n|**MessageEncoding**  <br>*optional*||[MessageEncoding](definitions.md#messageencoding)|\n|**MessageRetention**  <br>*optional*|Controls message retention for this specific writer.<br>Overrides WriterGroupMessageRetention at the individual<br>writer level. Only applied if the transport technology<br>supports retention. Together with QueueName, allows<br>splitting messages across different queues with different<br>retention policies.|boolean|\n|**MessageTtlTimespan**  <br>*optional*|Time-to-live duration for messages sent by this specific<br>writer. Overrides WriterGroupMessageTtlTimespan at the<br>individual writer level. Only applied if the transport<br>technology supports message TTL. Allows different TTL<br>settings for different types of data.|string (date-span)|\n|**MessagingMode**  <br>*optional*||[MessagingMode](definitions.md#messagingmode)|\n|**MetaDataQueueName**  <br>*optional*|The queue name to use for metadata messages from this<br>writer. Overrides the default metadata topic template.<br>Allows routing metadata to specific destinations separate<br>from data messages.|string|\n|**MetaDataRetention**  <br>*optional*|Metadata retention setting for the dataset writer.|boolean|\n|**MetaDataTtlTimespan**  <br>*optional*|Metadata time-to-live duration for the dataset writer.|string (date-span)|\n|**MetaDataUpdateTime**  <br>*optional*|The interval in milliseconds at which metadata messages are<br>sent, even when the metadata has not changed. Only applies<br>when metadata messaging is supported or explicitly enabled.<br>Ignored when MetaDataUpdateTimeTimespan is defined.|integer (int32)|\n|**MetaDataUpdateTimeTimespan**  <br>*optional*|The interval as TimeSpan at which metadata messages are<br>sent, even when metadata has not changed. Takes precedence<br>over MetaDataUpdateTime if both are defined. Only applies<br>when metadata messaging is supported or explicitly enabled.|string (date-span)|\n|**NodeId**  <br>*optional*||[NodeIdModel](definitions.md#nodeidmodel)|\n|**OpcAuthenticationMode**  <br>*optional*||[OpcAuthenticationMode](definitions.md#opcauthenticationmode)|\n|**OpcAuthenticationPassword**  <br>*optional*|The plaintext password for UsernamePassword authentication,<br>or the password protecting the private key for Certificate<br>authentication. For Certificate mode, this must match the<br>password used when adding the certificate to the PKI store.|string|\n|**OpcAuthenticationUsername**  <br>*optional*|The plaintext username for UsernamePassword authentication,<br>or the subject name of the certificate for Certificate<br>authentication. When using Certificate mode, this refers to<br>a certificate in the User certificate store of the PKI<br>configuration.|string|\n|**OpcNodeWatchdogCondition**  <br>*optional*||[MonitoredItemWatchdogCondition](definitions.md#monitoreditemwatchdogcondition)|\n|**OpcNodeWatchdogTimespan**  <br>*optional*|The timeout duration used to monitor whether monitored<br>items in the subscription are continuously reporting fresh<br>data. This watchdog mechanism helps detect stale data or<br>connectivity issues. When this timeout expires, the<br>configured DataSetWriterWatchdogBehavior is triggered based<br>on OpcNodeWatchdogCondition. Expressed as a TimeSpan value.|string (date-span)|\n|**OpcNodes**  <br>*optional*|The DataSet collection grouping the nodes to be published<br>for the specific DataSetWriter. Each node can specify<br>monitoring parameters including sampling intervals, deadband<br>settings, and event filtering options. Contains variable<br>nodes or event notifiers to monitor.|< [OpcNodeModel](definitions.md#opcnodemodel) > array|\n|**Priority**  <br>*optional*|Priority of the writer subscription.|integer (int32)|\n|**PublisherId**  <br>*optional*|Set a publisher id to use that is different form the<br>global publisher identity.|string|\n|**QualityOfService**  <br>*optional*||[QoS](definitions.md#qos)|\n|**QueueName**  <br>*optional*|Overrides the writer group queue name at the individual<br>writer level. When specified, causes network messages to be<br>split across different queues. The split also takes QoS<br>settings into account, allowing fine-grained control over<br>message routing and delivery guarantees.|string|\n|**RepublishAfterTransfer**  <br>*optional*|Controls whether to republish missed values after a<br>subscription is transferred during reconnect handling. Only<br>applies when DisableSubscriptionTransfer is false. Helps<br>ensure no data is lost during connection interruptions.<br>Default: true|boolean|\n|**SendKeepAliveAsKeyFrameMessages**  <br>*optional*|When sending of keep alive messages is enabled, this<br>flag controls whether the keep alive messages are sent<br>as key frames. Key frames contain all current values.|boolean|\n|**SendKeepAliveDataSetMessages**  <br>*optional*|Controls whether to send keep alive messages for this<br>dataset when a subscription keep alive notification is<br>received. Keep alive messages help maintain connection<br>status awareness. Only valid if the messaging mode supports<br>keep alive messages. Default: false|boolean|\n|**UseReverseConnect**  <br>*optional*|Use reverse connect to connect ot the endpoint|boolean|\n|**UseSecurity**  <br>*optional*|Controls whether to use a secure OPC UA transport mode to<br>establish a session. When true, defaults to<br>SecurityMode.NotNone which requires signed or encrypted<br>communication. When false, uses SecurityMode.None with no<br>security. Can be overridden by EndpointSecurityMode and<br>EndpointSecurityPolicy settings. Use encrypted<br>communication whenever possible to protect credentials and<br>data.|boolean|\n|**Version**  <br>*optional*|A monotonically increasing number identifying the change<br>version. At this point the version number is informational<br>only, but should be provided in API requests if available.<br>Not used inside file based configuration.|integer (int64)|\n|**WriterGroupMessageRetention**  <br>*optional*|Controls whether messages should be retained by the<br>messaging system. Only applied if the transport technology<br>supports message retention. When true, messages are kept by<br>the broker even after delivery. Useful for late-joining<br>subscribers to receive the last known values.|boolean|\n|**WriterGroupMessageTtlTimepan**  <br>*optional*|Time-to-live duration for messages sent through the writer<br>group. Only applied if the transport technology supports<br>message TTL. After this duration expires, messages may be<br>discarded by the messaging system. Used to prevent stale<br>data from being processed by consumers.|string (date-span)|\n|**WriterGroupPartitions**  <br>*optional*|Specifies how many partitions to split the writer group<br>into when publishing to target topics. Used to distribute<br>message load and enable parallel processing by consumers.<br>Default is 1 partition. Particularly useful for<br>high-throughput scenarios or when using partitioned<br>queues/topics in the messaging system.|integer (int32)|\n|**WriterGroupProperties**  <br>*optional*|Additional properties of the writer group that should be retained<br>with the configuration.|< string, object > map|\n|**WriterGroupQualityOfService**  <br>*optional*||[QoS](definitions.md#qos)|\n|**WriterGroupQueueName**  <br>*optional*|Overrides the default writer group topic template for<br>message routing. Used to customize where messages from this<br>writer group are published. Particularly useful when<br>publishing to MQTT topics or message queues where specific<br>routing patterns are needed.|string|\n|**WriterGroupRootNodeId**  <br>*optional*|A node that represents the writer group in the server address space.<br>This is the instance id of the root node from which all datasets<br>originate. It is informational only and would not need to be<br>configured|string|\n|**WriterGroupTransport**  <br>*optional*||[WriterGroupTransport](definitions.md#writergrouptransport)|\n|**WriterGroupTransportConfiguration**  <br>*optional*|Pass connection string for the transport layer. This works<br>for transports that support connection strings such as<br>IoT Hub or Event Hubs. It enables overriding the default<br>connection string configured for the publisher. The transport<br>must be configured using the command line options first, and<br>can be overriden here. If it is not configured on the command<br>line first, the setting here is ignored.|string|\n|**WriterGroupType**  <br>*optional*|A type that is attached to the writer group and explains the shape<br>of the writer group. It is the type definition id of the writer<br>group root node id. It is informational only and would not need<br>to be configured|string|\n\n\n<a name=\"publishednodesentrymodelserviceresponse\"></a>\n### PublishedNodesEntryModelServiceResponse\nResponse envelope\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**result**  <br>*optional*|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n\n\n<a name=\"publishednodesentrymodelserviceresponseiasyncenumerable\"></a>\n### PublishedNodesEntryModelServiceResponseIAsyncEnumerable\n*Type* : object\n\n\n<a name=\"publishednodesresponsemodel\"></a>\n### PublishedNodesResponseModel\nPublishNodes direct method response\n\n*Type* : object\n\n\n<a name=\"qos\"></a>\n### QoS\n*Type* : enum (AtMostOnce, AtLeastOnce, ExactlyOnce)\n\n\n<a name=\"querycompilationrequestmodel\"></a>\n### QueryCompilationRequestModel\nQuery compiler request model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**query**  <br>*required*|The query to compile.  <br>**Minimum length** : `1`|string|\n|**queryType**  <br>*optional*||[QueryType](definitions.md#querytype)|\n\n\n<a name=\"querycompilationrequestmodelrequestenvelope\"></a>\n### QueryCompilationRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[QueryCompilationRequestModel](definitions.md#querycompilationrequestmodel)|\n\n\n<a name=\"querycompilationresponsemodel\"></a>\n### QueryCompilationResponseModel\nQuery compiler response model\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**eventFilter**  <br>*optional*|[EventFilterModel](definitions.md#eventfiltermodel)|\n\n\n<a name=\"querytype\"></a>\n### QueryType\nQuery type\n\n*Type* : enum (Event, Query)\n\n\n<a name=\"readeventsdetailsmodel\"></a>\n### ReadEventsDetailsModel\nRead event data\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**endTime**  <br>*optional*|End time to read to|string (date-time)|\n|**filter**  <br>*optional*||[EventFilterModel](definitions.md#eventfiltermodel)|\n|**numEvents**  <br>*optional*|Number of events to read|integer (int64)|\n|**startTime**  <br>*optional*|Start time to read from|string (date-time)|\n\n\n<a name=\"readeventsdetailsmodelhistoryreadrequestmodel\"></a>\n### ReadEventsDetailsModelHistoryReadRequestModel\nRequest node history read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[ReadEventsDetailsModel](definitions.md#readeventsdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**indexRange**  <br>*optional*|Index range to read, e.g. 1:2,0:1 for 2 slices<br>out of a matrix or 0:1 for the first item in<br>an array, string or bytestring.<br>See 7.22 of part 4: NumericRange.|string|\n|**nodeId**  <br>*optional*|Node to read from (mandatory without browse path)|string|\n|**timestampsToReturn**  <br>*optional*||[TimestampsToReturn](definitions.md#timestampstoreturn)|\n\n\n<a name=\"readeventsdetailsmodelhistoryreadrequestmodelrequestenvelope\"></a>\n### ReadEventsDetailsModelHistoryReadRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[ReadEventsDetailsModelHistoryReadRequestModel](definitions.md#readeventsdetailsmodelhistoryreadrequestmodel)|\n\n\n<a name=\"readmodifiedvaluesdetailsmodel\"></a>\n### ReadModifiedValuesDetailsModel\nRead modified data\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**endTime**  <br>*optional*|The end time to read to|string (date-time)|\n|**numValues**  <br>*optional*|The number of values to read|integer (int64)|\n|**startTime**  <br>*optional*|The start time to read from|string (date-time)|\n\n\n<a name=\"readmodifiedvaluesdetailsmodelhistoryreadrequestmodel\"></a>\n### ReadModifiedValuesDetailsModelHistoryReadRequestModel\nRequest node history read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[ReadModifiedValuesDetailsModel](definitions.md#readmodifiedvaluesdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**indexRange**  <br>*optional*|Index range to read, e.g. 1:2,0:1 for 2 slices<br>out of a matrix or 0:1 for the first item in<br>an array, string or bytestring.<br>See 7.22 of part 4: NumericRange.|string|\n|**nodeId**  <br>*optional*|Node to read from (mandatory without browse path)|string|\n|**timestampsToReturn**  <br>*optional*||[TimestampsToReturn](definitions.md#timestampstoreturn)|\n\n\n<a name=\"readmodifiedvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope\"></a>\n### ReadModifiedValuesDetailsModelHistoryReadRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[ReadModifiedValuesDetailsModelHistoryReadRequestModel](definitions.md#readmodifiedvaluesdetailsmodelhistoryreadrequestmodel)|\n\n\n<a name=\"readprocessedvaluesdetailsmodel\"></a>\n### ReadProcessedValuesDetailsModel\nRead processed historic data\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**aggregateConfiguration**  <br>*optional*||[AggregateConfigurationModel](definitions.md#aggregateconfigurationmodel)|\n|**aggregateType**  <br>*optional*|The aggregate type to apply. Can be the name of<br>the aggregate if available in the history server<br>capabilities, or otherwise will be used as a node<br>id referring to the aggregate.|string|\n|**endTime**  <br>*optional*|End time to read until|string (date-time)|\n|**processingInterval**  <br>*optional*|Interval to process|string (date-span)|\n|**startTime**  <br>*optional*|Start time to read from.|string (date-time)|\n\n\n<a name=\"readprocessedvaluesdetailsmodelhistoryreadrequestmodel\"></a>\n### ReadProcessedValuesDetailsModelHistoryReadRequestModel\nRequest node history read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[ReadProcessedValuesDetailsModel](definitions.md#readprocessedvaluesdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**indexRange**  <br>*optional*|Index range to read, e.g. 1:2,0:1 for 2 slices<br>out of a matrix or 0:1 for the first item in<br>an array, string or bytestring.<br>See 7.22 of part 4: NumericRange.|string|\n|**nodeId**  <br>*optional*|Node to read from (mandatory without browse path)|string|\n|**timestampsToReturn**  <br>*optional*||[TimestampsToReturn](definitions.md#timestampstoreturn)|\n\n\n<a name=\"readprocessedvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope\"></a>\n### ReadProcessedValuesDetailsModelHistoryReadRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[ReadProcessedValuesDetailsModelHistoryReadRequestModel](definitions.md#readprocessedvaluesdetailsmodelhistoryreadrequestmodel)|\n\n\n<a name=\"readrequestmodel\"></a>\n### ReadRequestModel\nRequest node attribute read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**attributes**  <br>*required*|Attributes to read|< [AttributeReadRequestModel](definitions.md#attributereadrequestmodel) > array|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n\n\n<a name=\"readrequestmodelrequestenvelope\"></a>\n### ReadRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[ReadRequestModel](definitions.md#readrequestmodel)|\n\n\n<a name=\"readresponsemodel\"></a>\n### ReadResponseModel\nResult of attribute reads\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**results**  <br>*required*|All results of attribute reads|< [AttributeReadResponseModel](definitions.md#attributereadresponsemodel) > array|\n\n\n<a name=\"readvaluesattimesdetailsmodel\"></a>\n### ReadValuesAtTimesDetailsModel\nRead data at specified times\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**reqTimes**  <br>*required*|Requested datums|< string (date-time) > array|\n|**useSimpleBounds**  <br>*optional*|Whether to use simple bounds|boolean|\n\n\n<a name=\"readvaluesattimesdetailsmodelhistoryreadrequestmodel\"></a>\n### ReadValuesAtTimesDetailsModelHistoryReadRequestModel\nRequest node history read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[ReadValuesAtTimesDetailsModel](definitions.md#readvaluesattimesdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**indexRange**  <br>*optional*|Index range to read, e.g. 1:2,0:1 for 2 slices<br>out of a matrix or 0:1 for the first item in<br>an array, string or bytestring.<br>See 7.22 of part 4: NumericRange.|string|\n|**nodeId**  <br>*optional*|Node to read from (mandatory without browse path)|string|\n|**timestampsToReturn**  <br>*optional*||[TimestampsToReturn](definitions.md#timestampstoreturn)|\n\n\n<a name=\"readvaluesattimesdetailsmodelhistoryreadrequestmodelrequestenvelope\"></a>\n### ReadValuesAtTimesDetailsModelHistoryReadRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[ReadValuesAtTimesDetailsModelHistoryReadRequestModel](definitions.md#readvaluesattimesdetailsmodelhistoryreadrequestmodel)|\n\n\n<a name=\"readvaluesdetailsmodel\"></a>\n### ReadValuesDetailsModel\nRead historic values\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**endTime**  <br>*optional*|End of period to read. Set to null if no<br>specific end time is specified.|string (date-time)|\n|**numValues**  <br>*optional*|The maximum number of values returned for any Node<br>over the time range. If only one time is specified,<br>the time range shall extend to return this number<br>of values. 0 or null indicates that there is no<br>maximum.|integer (int64)|\n|**returnBounds**  <br>*optional*|Whether to return the bounding values or not.|boolean|\n|**startTime**  <br>*optional*|Beginning of period to read. Set to null<br>if no specific start time is specified.|string (date-time)|\n\n\n<a name=\"readvaluesdetailsmodelhistoryreadrequestmodel\"></a>\n### ReadValuesDetailsModelHistoryReadRequestModel\nRequest node history read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[ReadValuesDetailsModel](definitions.md#readvaluesdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**indexRange**  <br>*optional*|Index range to read, e.g. 1:2,0:1 for 2 slices<br>out of a matrix or 0:1 for the first item in<br>an array, string or bytestring.<br>See 7.22 of part 4: NumericRange.|string|\n|**nodeId**  <br>*optional*|Node to read from (mandatory without browse path)|string|\n|**timestampsToReturn**  <br>*optional*||[TimestampsToReturn](definitions.md#timestampstoreturn)|\n\n\n<a name=\"readvaluesdetailsmodelhistoryreadrequestmodelrequestenvelope\"></a>\n### ReadValuesDetailsModelHistoryReadRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[ReadValuesDetailsModelHistoryReadRequestModel](definitions.md#readvaluesdetailsmodelhistoryreadrequestmodel)|\n\n\n<a name=\"requestheadermodel\"></a>\n### RequestHeaderModel\nRequest header model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**connectTimeout**  <br>*optional*|Connect timeout in ms. As opposed to the service call<br>timeout this terminates the entire transaction if<br>it takes longer than the timeout to connect a session<br>A connect and reconnect during the service call<br>resets the timeout therefore the overall time for<br>the call to complete can be longer than specified.|integer (int32)|\n|**diagnostics**  <br>*optional*||[DiagnosticsModel](definitions.md#diagnosticsmodel)|\n|**elevation**  <br>*optional*||[CredentialModel](definitions.md#credentialmodel)|\n|**locales**  <br>*optional*|Optional list of preferred locales in preference<br>order to be used during connecting the session.<br>We suggest to use the connection object to set<br>the locales|< string > array|\n|**namespaceFormat**  <br>*optional*||[NamespaceFormat](definitions.md#namespaceformat)|\n|**operationTimeout**  <br>*optional*|Operation timeout in ms. This applies to every<br>operation that is invoked, not to the entire<br>transaction and overrides the configured operation<br>timeout.|integer (int32)|\n|**serviceCallTimeout**  <br>*optional*|Service call timeout in ms. As opposed to the<br>operation timeout this terminates the entire<br>transaction if it takes longer than the timeout to<br>complete. Note that a connect and reconnect during<br>the service call is gated by the connect timeout<br>setting. If a connect timeout is not specified<br>this timeout is used also for connect timeout.|integer (int32)|\n\n\n<a name=\"requestheadermodelpublishednodesentryrequestmodel\"></a>\n### RequestHeaderModelPublishedNodesEntryRequestModel\nWraps a request and a published nodes entry to bind to a\nbody more easily for api that requires an entry and additional\nconfiguration\n\n\n|Name|Schema|\n|---|---|\n|**entry**  <br>*required*|[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n|**request**  <br>*optional*|[RequestHeaderModel](definitions.md#requestheadermodel)|\n\n\n<a name=\"requestheadermodelrequestenvelope\"></a>\n### RequestHeaderModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[RequestHeaderModel](definitions.md#requestheadermodel)|\n\n\n<a name=\"rolepermissionmodel\"></a>\n### RolePermissionModel\nRole permission model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**permissions**  <br>*optional*||[RolePermissions](definitions.md#rolepermissions)|\n|**roleId**  <br>*required*|Identifier of the role object.  <br>**Minimum length** : `1`|string|\n\n\n<a name=\"rolepermissions\"></a>\n### RolePermissions\nIndividual permissions assigned to a role\n\n*Type* : enum (None, Browse, ReadRolePermissions, WriteAttribute, WriteRolePermissions, WriteHistorizing, Read, Write, ReadHistory, InsertHistory, ModifyHistory, DeleteHistory, ReceiveEvents, Call, AddReference, RemoveReference, DeleteNode, AddNode)\n\n\n<a name=\"securitymode\"></a>\n### SecurityMode\nSpecifies the security mode for OPC UA endpoint connections.\nDetermines how messages are protected during transmission between\nthe Publisher and OPC UA servers. Proper security mode selection\nis crucial for protecting sensitive data and credentials.\n\n*Type* : enum (Best, Sign, SignAndEncrypt, None, NotNone)\n\n\n<a name=\"servercapabilitiesmodel\"></a>\n### ServerCapabilitiesModel\nServer capabilities\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**MaxMonitoredItems**  <br>*optional*|Supported aggregate functions|integer (int64)|\n|**MaxMonitoredItemsPerSubscription**  <br>*optional*|Supported aggregate functions|integer (int64)|\n|**MaxMonitoredItemsQueueSize**  <br>*optional*|Supported aggregate functions|integer (int64)|\n|**MaxSelectClauseParameters**  <br>*optional*|Supported aggregate functions|integer (int64)|\n|**MaxSessions**  <br>*optional*|Supported aggregate functions|integer (int64)|\n|**MaxSubscriptions**  <br>*optional*|Supported aggregate functions|integer (int64)|\n|**MaxSubscriptionsPerSession**  <br>*optional*|Supported aggregate functions|integer (int64)|\n|**MaxWhereClauseParameters**  <br>*optional*|Supported aggregate functions|integer (int64)|\n|**aggregateFunctions**  <br>*optional*|Supported aggregate functions|< string, string > map|\n|**conformanceUnits**  <br>*optional*|Supported aggregate functions|< string > array|\n|**modellingRules**  <br>*optional*|Supported modelling rules|< string, string > map|\n|**operationLimits**  <br>*required*||[OperationLimitsModel](definitions.md#operationlimitsmodel)|\n|**serverProfileArray**  <br>*optional*|Server profiles|< string > array|\n|**supportedLocales**  <br>*optional*|Supported locales|< string > array|\n\n\n<a name=\"serverendpointquerymodel\"></a>\n### ServerEndpointQueryModel\nEndpoint model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**certificate**  <br>*optional*|Endpoint must match with this certificate thumbprint|string|\n|**discoveryUrl**  <br>*optional*|Discovery url to use to query|string|\n|**securityMode**  <br>*optional*||[SecurityMode](definitions.md#securitymode)|\n|**securityPolicy**  <br>*optional*|Endpoint must support this Security policy.|string|\n|**url**  <br>*optional*|Endpoint url that should match the found endpoint|string|\n\n\n<a name=\"serverregistrationrequestmodel\"></a>\n### ServerRegistrationRequestModel\nServer registration request\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**context**  <br>*optional*||[OperationContextModel](definitions.md#operationcontextmodel)|\n|**discoveryUrl**  <br>*required*|Discovery url to use for registration  <br>**Minimum length** : `1`|string|\n|**id**  <br>*optional*|User defined request id|string|\n\n\n<a name=\"serviceresultmodel\"></a>\n### ServiceResultModel\nService result\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**additionalInfo**  <br>*optional*|Additional information if available|string|\n|**errorMessage**  <br>*optional*|Error message in case of error or null.|string|\n|**inner**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**locale**  <br>*optional*|Locale of the error message|string|\n|**namespaceUri**  <br>*optional*|Namespace uri|string|\n|**statusCode**  <br>*optional*|Error code - if null operation succeeded.|integer (int64)|\n|**symbolicId**  <br>*optional*|Symbolic identifier|string|\n\n\n<a name=\"setconfiguredendpointsrequestmodel\"></a>\n### SetConfiguredEndpointsRequestModel\nSet configured endpoints request call\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**endpoints**  <br>*optional*|Endpoints and nodes that make up the configuration|< [PublishedNodesEntryModel](definitions.md#publishednodesentrymodel) > array|\n\n\n<a name=\"simpleattributeoperandmodel\"></a>\n### SimpleAttributeOperandModel\nSimple attribute operand model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**attributeId**  <br>*optional*||[NodeAttribute](definitions.md#nodeattribute)|\n|**browsePath**  <br>*optional*|Browse path of attribute operand|< string > array|\n|**dataSetClassFieldId**  <br>*optional*|Optional data set class field id (Publisher extension)|string (uuid)|\n|**displayName**  <br>*optional*|Optional display name|string|\n|**indexRange**  <br>*optional*|Index range of attribute operand|string|\n|**typeDefinitionId**  <br>*optional*|Type definition node id if operand is<br>simple or full attribute operand.|string|\n\n\n<a name=\"subscriptionwatchdogbehavior\"></a>\n### SubscriptionWatchdogBehavior\nDefines how the publisher responds when monitored items stop reporting data.\nThe watchdog triggers when items are late according to OpcNodeWatchdogTimespan\nand OpcNodeWatchdogCondition settings. Can be configured globally via the\n--dwb command line option.\n\n*Type* : enum (Diagnostic, Reset, FailFast, ExitProcess)\n\n\n<a name=\"testconnectionrequestmodel\"></a>\n### TestConnectionRequestModel\nTest connection request\n\n\n|Name|Schema|\n|---|---|\n|**header**  <br>*optional*|[RequestHeaderModel](definitions.md#requestheadermodel)|\n\n\n<a name=\"testconnectionrequestmodelrequestenvelope\"></a>\n### TestConnectionRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[TestConnectionRequestModel](definitions.md#testconnectionrequestmodel)|\n\n\n<a name=\"testconnectionresponsemodel\"></a>\n### TestConnectionResponseModel\nTest connection response\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n\n\n<a name=\"timestampstoreturn\"></a>\n### TimestampsToReturn\nTimestamps\n\n*Type* : enum (Both, Source, Server, None)\n\n\n<a name=\"typedefinitionmodel\"></a>\n### TypeDefinitionModel\nType definition\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browseName**  <br>*optional*|Browse name|string|\n|**description**  <br>*optional*|Description if any|string|\n|**displayName**  <br>*optional*|Display name|string|\n|**nodeType**  <br>*optional*||[NodeType](definitions.md#nodetype)|\n|**typeDefinitionId**  <br>*required*|The node id of the type of the node  <br>**Minimum length** : `1`|string|\n|**typeHierarchy**  <br>*optional*|Super types hierarchy starting from base type<br>up to Azure.IIoT.OpcUa.Publisher.Models.TypeDefinitionModel.TypeDefinitionId which is<br>not included.|< [NodeModel](definitions.md#nodemodel) > array|\n|**typeMembers**  <br>*optional*|Fully inherited instance declarations of the type<br>of the node.|< [InstanceDeclarationModel](definitions.md#instancedeclarationmodel) > array|\n\n\n<a name=\"updateeventsdetailsmodel\"></a>\n### UpdateEventsDetailsModel\nInsert, upsert or replace historic events\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**events**  <br>*required*|The new events to insert|< [HistoricEventModel](definitions.md#historiceventmodel) > array|\n|**filter**  <br>*optional*||[EventFilterModel](definitions.md#eventfiltermodel)|\n\n\n<a name=\"updateeventsdetailsmodelhistoryupdaterequestmodel\"></a>\n### UpdateEventsDetailsModelHistoryUpdateRequestModel\nRequest node history update\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[UpdateEventsDetailsModel](definitions.md#updateeventsdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*optional*|Node to update (mandatory without browse path)|string|\n\n\n<a name=\"updateeventsdetailsmodelhistoryupdaterequestmodelrequestenvelope\"></a>\n### UpdateEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[UpdateEventsDetailsModelHistoryUpdateRequestModel](definitions.md#updateeventsdetailsmodelhistoryupdaterequestmodel)|\n\n\n<a name=\"updatevaluesdetailsmodel\"></a>\n### UpdateValuesDetailsModel\nInsert, upsert, or update historic values\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**values**  <br>*required*|Values to insert|< [HistoricValueModel](definitions.md#historicvaluemodel) > array|\n\n\n<a name=\"updatevaluesdetailsmodelhistoryupdaterequestmodel\"></a>\n### UpdateValuesDetailsModelHistoryUpdateRequestModel\nRequest node history update\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*||[UpdateValuesDetailsModel](definitions.md#updatevaluesdetailsmodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*optional*|Node to update (mandatory without browse path)|string|\n\n\n<a name=\"updatevaluesdetailsmodelhistoryupdaterequestmodelrequestenvelope\"></a>\n### UpdateValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[UpdateValuesDetailsModelHistoryUpdateRequestModel](definitions.md#updatevaluesdetailsmodelhistoryupdaterequestmodel)|\n\n\n<a name=\"useridentitymodel\"></a>\n### UserIdentityModel\nUser identity model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**password**  <br>*optional*|For Azure.IIoT.OpcUa.Publisher.Models.CredentialType.UserName authentication<br>            this is the password of the user.<br><br>For Azure.IIoT.OpcUa.Publisher.Models.CredentialType.X509Certificate authentication<br>            this is the passcode to export the configured certificate's<br>            private key.<br><br>Not used for the other authentication types.|string|\n|**thumbprint**  <br>*optional*|For Azure.IIoT.OpcUa.Publisher.Models.CredentialType.X509Certificate authentication<br>            this is the thumbprint of the configured certificate to use.<br>            Either Azure.IIoT.OpcUa.Publisher.Models.UserIdentityModel.User or Azure.IIoT.OpcUa.Publisher.Models.UserIdentityModel.Thumbprint must be<br>            used to select the certificate in the user certificate store.<br><br>Not used for the other authentication types.|string|\n|**user**  <br>*optional*|For Azure.IIoT.OpcUa.Publisher.Models.CredentialType.UserName authentication<br>            this is the name of the user.<br><br>For Azure.IIoT.OpcUa.Publisher.Models.CredentialType.X509Certificate authentication<br>            this is the subject name of the certificate that has been<br>            configured.<br>            Either Azure.IIoT.OpcUa.Publisher.Models.UserIdentityModel.User or Azure.IIoT.OpcUa.Publisher.Models.UserIdentityModel.Thumbprint must be<br>            used to select the certificate in the user certificate store.<br><br>Not used for the other authentication types.|string|\n\n\n<a name=\"valuereadrequestmodel\"></a>\n### ValueReadRequestModel\nRequest node value read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>an actual node.|< string > array|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**indexRange**  <br>*optional*|Index range to read, e.g. 1:2,0:1 for 2 slices<br>out of a matrix or 0:1 for the first item in<br>an array, string or bytestring.<br>See 7.22 of part 4: NumericRange.|string|\n|**maxAge**  <br>*optional*|Maximum age of the value to be read in milliseconds.<br>The age of the value is based on the difference<br>between the ServerTimestamp and the time when<br>the Server starts processing the request.<br>If not supplied, the Server shall attempt to read<br>a new value from the data source.|string (date-span)|\n|**nodeId**  <br>*optional*|Node to read from (mandatory)|string|\n|**timestampsToReturn**  <br>*optional*||[TimestampsToReturn](definitions.md#timestampstoreturn)|\n\n\n<a name=\"valuereadrequestmodelrequestenvelope\"></a>\n### ValueReadRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[ValueReadRequestModel](definitions.md#valuereadrequestmodel)|\n\n\n<a name=\"valuereadresponsemodel\"></a>\n### ValueReadResponseModel\nValue read response model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**dataType**  <br>*optional*|Built in data type of the value read.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**serverPicoseconds**  <br>*optional*|Pico seconds part of when value was read at server.|integer (int32)|\n|**serverTimestamp**  <br>*optional*|Timestamp of when value was read at server.|string (date-time)|\n|**sourcePicoseconds**  <br>*optional*|Pico seconds part of when value was read at source.|integer (int32)|\n|**sourceTimestamp**  <br>*optional*|Timestamp of when value was read at source.|string (date-time)|\n|**value**  <br>*optional*|Value read|object|\n\n\n<a name=\"valuewriterequestmodel\"></a>\n### ValueWriteRequestModel\nValue write request model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**dataType**  <br>*optional*|A built in datatype for the value. This can<br>be a data type from browse, or a built in<br>type.<br>(default: best effort)|string|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**indexRange**  <br>*optional*|Index range to write|string|\n|**nodeId**  <br>*optional*|Node id to write value to.|string|\n|**value**  <br>*required*|Value to write. The system tries to convert<br>the value according to the data type value,<br>e.g. convert comma seperated value strings<br>into arrays.  (Mandatory)|object|\n\n\n<a name=\"valuewriterequestmodelrequestenvelope\"></a>\n### ValueWriteRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[ValueWriteRequestModel](definitions.md#valuewriterequestmodel)|\n\n\n<a name=\"valuewriteresponsemodel\"></a>\n### ValueWriteResponseModel\nValue write response model\n\n\n|Name|Schema|\n|---|---|\n|**errorInfo**  <br>*optional*|[ServiceResultModel](definitions.md#serviceresultmodel)|\n\n\n<a name=\"variablemetadatamodel\"></a>\n### VariableMetadataModel\nVariable metadata model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**arrayDimensions**  <br>*optional*|Array dimensions of the variable.|integer (int64)|\n|**dataType**  <br>*optional*||[DataTypeMetadataModel](definitions.md#datatypemetadatamodel)|\n|**valueRank**  <br>*optional*||[NodeValueRank](definitions.md#nodevaluerank)|\n\n\n<a name=\"variantvaluehistoryreadnextresponsemodel\"></a>\n### VariantValueHistoryReadNextResponseModel\nHistory read continuation result\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token if more results pending.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**history**  <br>*required*|History as json encoded extension object|object|\n\n\n<a name=\"variantvaluehistoryreadrequestmodel\"></a>\n### VariantValueHistoryReadRequestModel\nRequest node history read\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*|The HistoryReadDetailsType extension object<br>encoded in json and containing the tunneled<br>Historian reader request.|object|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**indexRange**  <br>*optional*|Index range to read, e.g. 1:2,0:1 for 2 slices<br>out of a matrix or 0:1 for the first item in<br>an array, string or bytestring.<br>See 7.22 of part 4: NumericRange.|string|\n|**nodeId**  <br>*optional*|Node to read from (mandatory without browse path)|string|\n|**timestampsToReturn**  <br>*optional*||[TimestampsToReturn](definitions.md#timestampstoreturn)|\n\n\n<a name=\"variantvaluehistoryreadrequestmodelrequestenvelope\"></a>\n### VariantValueHistoryReadRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[VariantValueHistoryReadRequestModel](definitions.md#variantvaluehistoryreadrequestmodel)|\n\n\n<a name=\"variantvaluehistoryreadresponsemodel\"></a>\n### VariantValueHistoryReadResponseModel\nHistory read results\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**continuationToken**  <br>*optional*|Continuation token if more results pending.|string|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**history**  <br>*required*|History as json encoded extension object|object|\n\n\n<a name=\"variantvaluehistoryupdaterequestmodel\"></a>\n### VariantValueHistoryUpdateRequestModel\nRequest node history update\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**browsePath**  <br>*optional*|An optional path from NodeId instance to<br>the actual node.|< string > array|\n|**details**  <br>*required*|The HistoryUpdateDetailsType extension object<br>encoded as json Variant and containing the tunneled<br>update request for the Historian server. The value<br>is updated at edge using above node address.|object|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**nodeId**  <br>*optional*|Node to update (mandatory without browse path)|string|\n\n\n<a name=\"variantvaluehistoryupdaterequestmodelrequestenvelope\"></a>\n### VariantValueHistoryUpdateRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[VariantValueHistoryUpdateRequestModel](definitions.md#variantvaluehistoryupdaterequestmodel)|\n\n\n<a name=\"variantvaluepublishednodecreateassetrequestmodel\"></a>\n### VariantValuePublishedNodeCreateAssetRequestModel\nRequest to create an asset in the configuration api\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**configuration**  <br>*required*|The asset configuration to use when creating the asset.|object|\n|**entry**  <br>*required*||[PublishedNodesEntryModel](definitions.md#publishednodesentrymodel)|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n|**waitTime**  <br>*optional*|Time to wait after the configuration is applied to perform<br>the configuration of the asset in the configuration api.<br>This is to let the server settle.|string (date-span)|\n\n\n<a name=\"writerequestmodel\"></a>\n### WriteRequestModel\nRequest node attribute write\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**attributes**  <br>*required*|Attributes to update|< [AttributeWriteRequestModel](definitions.md#attributewriterequestmodel) > array|\n|**header**  <br>*optional*||[RequestHeaderModel](definitions.md#requestheadermodel)|\n\n\n<a name=\"writerequestmodelrequestenvelope\"></a>\n### WriteRequestModelRequestEnvelope\nWraps a request and a connection to bind to a\nbody more easily for api that requires a\nconnection endpoint\n\n\n|Name|Schema|\n|---|---|\n|**connection**  <br>*required*|[ConnectionModel](definitions.md#connectionmodel)|\n|**request**  <br>*optional*|[WriteRequestModel](definitions.md#writerequestmodel)|\n\n\n<a name=\"writeresponsemodel\"></a>\n### WriteResponseModel\nResult of attribute write\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**errorInfo**  <br>*optional*||[ServiceResultModel](definitions.md#serviceresultmodel)|\n|**results**  <br>*required*|All results of attribute writes|< [AttributeWriteResponseModel](definitions.md#attributewriteresponsemodel) > array|\n\n\n<a name=\"writergrouptransport\"></a>\n### WriterGroupTransport\nSpecifies the transport technology used to publish messages from OPC Publisher.\nEach transport offers different capabilities for message delivery, routing,\nand quality of service. The transport choice affects how messages are delivered\nand what features are available.\n\n*Type* : enum (IoTHub, Mqtt, EventHub, Dapr, Http, FileSystem, AioMqtt, AioDss, Null)\n\n\n<a name=\"x509certificatechainmodel\"></a>\n### X509CertificateChainModel\nCertificate chain\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**chain**  <br>*optional*|Chain|< [X509CertificateModel](definitions.md#x509certificatemodel) > array|\n|**status**  <br>*optional*|Chain validation status if validated|enum (NotTimeValid, Revoked, NotSignatureValid, NotValidForUsage, UntrustedRoot, RevocationStatusUnknown, Cyclic, InvalidExtension, InvalidPolicyConstraints, InvalidBasicConstraints, InvalidNameConstraints, HasNotSupportedNameConstraint, HasNotDefinedNameConstraint, HasNotPermittedNameConstraint, HasExcludedNameConstraint, PartialChain, CtlNotTimeValid, CtlNotSignatureValid, CtlNotValidForUsage, HasWeakSignature, OfflineRevocation, NoIssuanceChainPolicy, ExplicitDistrust, HasNotSupportedCriticalExtension)|\n\n\n<a name=\"x509certificatemodel\"></a>\n### X509CertificateModel\nCertificate model\n\n\n|Name|Description|Schema|\n|---|---|---|\n|**hasPrivateKey**  <br>*optional*|Contains private key|boolean|\n|**notAfterUtc**  <br>*optional*|Not after validity|string (date-time)|\n|**notBeforeUtc**  <br>*optional*|Not before validity|string (date-time)|\n|**pfx**  <br>*optional*|Certificate as Pkcs12|< integer (int32) > array|\n|**selfSigned**  <br>*optional*|Self signed certificate|boolean|\n|**serialNumber**  <br>*optional*|Serial number|string|\n|**subject**  <br>*optional*|Subject|string|\n|**thumbprint**  <br>*optional*|Thumbprint|string|\n\n\n<a name=\"x509chainstatus\"></a>\n### X509ChainStatus\nStatus of x509 chain\n\n*Type* : enum (NotTimeValid, Revoked, NotSignatureValid, NotValidForUsage, UntrustedRoot, RevocationStatusUnknown, Cyclic, InvalidExtension, InvalidPolicyConstraints, InvalidBasicConstraints, InvalidNameConstraints, HasNotSupportedNameConstraint, HasNotDefinedNameConstraint, HasNotPermittedNameConstraint, HasExcludedNameConstraint, PartialChain, CtlNotTimeValid, CtlNotSignatureValid, CtlNotValidForUsage, HasWeakSignature, OfflineRevocation, NoIssuanceChainPolicy, ExplicitDistrust, HasNotSupportedCriticalExtension)\n\n\n\n"
  },
  {
    "path": "docs/opc-publisher/deployment.json",
    "content": "{\n    \"modulesContent\": {\n      \"$edgeAgent\": {\n        \"properties.desired\": {\n          \"schemaVersion\": \"1.1\",\n          \"runtime\": {\n            \"type\": \"docker\",\n            \"settings\": {\n              \"minDockerVersion\": \"v1.25\",\n              \"loggingOptions\": \"\",\n              \"registryCredentials\": {}\n            }\n          },\n          \"systemModules\": {\n            \"edgeAgent\": {\n              \"type\": \"docker\",\n              \"settings\": {\n                \"image\": \"mcr.microsoft.com/azureiotedge-agent:1.4\",\n                \"createOptions\": \"\"\n              }\n            },\n            \"edgeHub\": {\n              \"type\": \"docker\",\n              \"status\": \"running\",\n              \"restartPolicy\": \"always\",\n              \"settings\": {\n                \"image\": \"mcr.microsoft.com/azureiotedge-hub:1.4\",\n                \"createOptions\": \"{\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"5671/tcp\\\":[{\\\"HostPort\\\":\\\"5671\\\"}], \\\"8883/tcp\\\":[{\\\"HostPort\\\":\\\"8883\\\"}],\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"443\\\"}]}}}\"\n              },\n              \"env\": {\n                \"SslProtocols\": {\n                  \"value\": \"tls1.2\"\n                }\n              }\n            }\n          },\n          \"modules\": {\n            \"publisher\": {\n              \"version\": \"1.0\",\n              \"type\": \"docker\",\n              \"status\": \"running\",\n              \"restartPolicy\": \"always\",\n              \"settings\": {\n                \"image\": \"iotedge/opc-publisher:debug\",\n                \"createOptions\": \"{\\\"User\\\":\\\"root\\\",\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"80/tcp\\\":[{\\\"HostPort\\\":\\\"8080\\\"}],\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"8081\\\"}]},\\\"CapDrop\\\":[\\\"CHOWN\\\",\\\"SETUID\\\"]}}\"\n              }\n            }\n          }\n        }\n      },\n      \"$edgeHub\": {\n        \"properties.desired\": {\n          \"schemaVersion\": \"1.0\",\n          \"routes\": {\n            \"publisherToUpstream\": \"FROM /messages/modules/publisher/* INTO $upstream\",\n            \"leafToUpstream\": \"FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO $upstream\"\n          },\n          \"storeAndForwardConfiguration\": {\n            \"timeToLiveSecs\": 7200\n          }\n        }\n      }\n    }\n  }\n"
  },
  {
    "path": "docs/opc-publisher/directmethods.md",
    "content": "# Configuration API <!-- omit in toc -->\n\n[Home](./readme.md)\n\nFor large-scale deployments, automating the configuration and management of OPC Publisher is critical. OPC Publisher version 2.8.2 and later implements [IoT Hub Direct Methods](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-direct-methods), which can be called from an application using the [IoT Hub Device SDK](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-sdks).\n\nAzure IoT Hub's Cloud-to-Device (C2D) commands allow you to remotely configure and control OPC Publisher instances running on IoT Edge devices. For example, you can send commands to update the configuration, restart the module, or change runtime parameters without needing to manually intervene on each device. An example of sending a C2D command to update the configuration:\n\n```bash\naz iot hub invoke-module-method --hub-name <your-iot-hub> --device-id <your-device-id> --module-name <opc-publisher> --method-name SetConfiguredEndpoints --method-payload '{\"Endpoints\": [{\"EndpointUrl\": \"opc.tcp://new-opc-server:4840\", \"OpcNodes\": [{\"Id\": \"ns=2;i=10853\"}]}]}'\n```\n\nThe following direct methods and many more can be used to remotely configure the OPC Publisher:\n\n- [Shutdown\\_V2](#shutdown_v2)\n- [GetServerCertificate\\_V2](#getservercertificate_v2)\n- [GetApiKey\\_V2](#getapikey_v2)\n- [PublishNodes\\_V1](#publishnodes_v1)\n- [AddOrUpdateEndpoints\\_V1](#addorupdateendpoints_v1)\n- [UnpublishNodes\\_V1](#unpublishnodes_v1)\n- [UnpublishAllNodes\\_V1](#unpublishallnodes_v1)\n- [GetConfiguredEndpoints\\_V1](#getconfiguredendpoints_v1)\n- [SetConfiguredEndpoints\\_V1](#setconfiguredendpoints_v1)\n- [GetConfiguredNodesOnEndpoint\\_V1](#getconfigurednodesonendpoint_v1)\n- [GetDiagnosticInfo\\_V1](#getdiagnosticinfo_v1)\n\nThe corresponding REST API of OPC Publisher 2.9 (with same operation names and [type definitions](./definitions.md)) is documented [here](./api.md). In addition to calling the API through HTTP REST calls (Preview) you can call the configuration API through MQTT v5 (Preview) in OPC Publisher 2.9.\n\nIf you need to migrate your application from OPC Publisher 2.5.x to OPC Publisher 2.8.2 or later, we provide the needed information in a [separate document](./migrationpath.md).\n\nIt is important to understand the [configuration schema](./readme.md#configuration-schema) as it is the foundation of the OPC Publisher configuration surface and represented by the [PublishedNodesEntryModel](./definitions.md#publishednodesentrymodel).\n\nNow let's dive into each direct method request and response payloads with examples.\n\n## Shutdown_V2\n\nThis API call allows you to shutdown the publisher. By passing a `true`, the publisher is immediately terminates the process with an error and reports an error message. When passing `false`, the exits the process without a 0 exit code.\n\n  _Request_: `true` or `false` or nothing.\n\n  _Response_: Potentially nothing if the publisher is immediately shutdown\n\n  _Example_:\n\n  > _Method Name_: `Shutdown_V2`\n  >\n  > _Request_:\n  >\n  > ```json\n  > true\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > n/a\n  > ```\n\n## GetServerCertificate_V2\n\nThis API can be called to retrieve the HTTP certificate that secures the REST endpoint. A caller should call this API and then validate the server certificate presented against this certificate.  The certificate can be cached for the duration of its validity period. \n\n  _Request_: An empty object or `null` can be passed since no argument is required.\n\n  _Response_: when successful Status 200 and the certificate in PEM format.\n\n  _Exceptions_: an exception is thrown when method call returns status other than 200\n\n  _Example_:\n\n  > _Method Name_: `GetServerCertificate_V2`\n  >\n  > _Request_:\n  >\n  > ```json\n  > null\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > \"-----BEGIN CERTIFICATE-----\\n <base64 encoded certificate\" -----END CERTIFICATE-----\\n\"\n  > ```\n\nThe certificate Key can also be read from the IoT Hub device twin as  `__certificate__` reported property, together with the ip address, hostname, schema, and port (`__ip__`, `__hostname__`, `__scheme__`, and `__port__`).\n\n## GetApiKey_V2\n\nThis API call allows a caller to programmatically obtain the current API key. The API key is passed in the `Authorization` header of the HTTP request sent to the HTTP endpoint. The format of the header value is `ApiKey <api-key>`, e.g., `ApiKey 85....<redacted>.....F78`.\n\n  _Request_: follows strictly the request [payload schema](./definitions.md#publishednodesentrymodel), the `OpcNodes` attribute being mandatory.\n\n  _Response_: when successful Status 200 and an empty json (`{}`) as payload\n\n  _Exceptions_: an exception is thrown when method call returns status other than 200\n\n  _Example_:\n\n  > _Method Name_: `GetApiKey_V2`\n  >\n  > _Request_:\n  >\n  > ```json\n  > null\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > \"85....<redacted>.....F78\"\n  > ```\n\nThe API Key can also be read from the IoT Hub device twin as the `__apikey__` reported property.\n\n## PublishNodes_V1\n\nPublishNodes enables a client to add a set of nodes to be published. A [`DataSetWriter`](./readme.md#configuration-schema) groups nodes which results in seperate subscriptions being created (grouped further by the Publishing interval, if different ones are configured, but these have no bearing on the `DataSetWriter` identity). A `DataSetWriter`s identity is the combination of `DataSetWriterId`, `DataSetName`, `DataSetKeyFrameCount`, `DataSetClassId`, and connection relevant information such as credentials, security mode, and endpoint Url. To update a `DataSetWriter` this information must match exactly.\n\nWhen a `DataSetWriter` already exists, the nodes are incrementally added to the same [`dataset`](./readme.md#configuration-schema). When it doesn't already exist, a new `DataSetWriter` is created with the initial set of nodes contained in the request. When working with `DataSetWriterGroup`s it is important to note that all groups not part of the publish request are removed.  To incrementally update `DataSetWriterGroup`s of `DataSetWriter`s use [`AddOrUpdateEndpoints_v1`](#addorupdateendpoints_v1) API instead.\n\n  _Request_: follows strictly the request [payload schema](./definitions.md#publishednodesentrymodel), the `OpcNodes` attribute being mandatory.\n\n  _Response_: when successful Status 200 and an empty json (`{}`) as payload\n\n  _Exceptions_: an exception is thrown when method call returns status other than 200\n\n  _Example_:\n\n  > _Method Name_: `PublishNodes_V1`\n  >\n  > _Request_:\n  >\n  > ```json\n  > {\n  >    \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n  >    \"DataSetWriterGroup\": \"Asset0\",\n  >    \"DataSetWriterId\": \"DataFlow0\",\n  >    \"DataSetPublishingInterval\": 5000,\n  >    \"OpcNodes\": [\n  >       {\n  >          \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\"\n  >       }\n  >    ]\n  > }\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > {\n  >    \"status\": 200,\n  >    \"payload\": {}\n  > }\n  > ```\n\nMore information can be found in the [API documentation](./api.md#publishnodes)\n\n## AddOrUpdateEndpoints_V1\n\nThis method allows updating multiple endpoints (`DataSetWriter`s) without effecting others. Unlike `PublishNodes_V1` method, `AddOrUpdateEndpoints_V1` replaces the nodes of an endpoint (`DataSetWriter`) with the one provided in the method's request payload. By providing an empty list of nodes in a request, a endpoint (`DataSetWriter`) can be removed from a `DataSetWriterGroup`. Removing the last from a group removes the group.\n\n  _Request_: represents a list of objects, which should strictly follow the request payload schema as described above. The `OpcNodes` attribute being empty list or `null` will be interpreted as a removal request for that endpoint (`DataSetWriter`).\n\n  _Response_: when successful - Status 200 and an empty json (`{}`) as payload\n\n  _Exceptions_: a response corresponding to an exception will be returned if:\n\n- request payload contains deletion request for an endpoint (`DataSetWriter`) that isn't present in publisher configuration\n\n- request payload contains two or more entries for the same endpoint (`DataSetWriter`)\n\n  _Example_:\n  > _Method Name_: `AddOrUpdateEndpoints_V1`\n  >\n  > _Payload_:\n  >\n  > ```json\n  > [\n  >    {\n  >       \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n  >       \"DataSetWriterGroup\": \"Asset1\",\n  >       \"DataSetWriterId\": \"DataFlow1\",\n  >       \"DataSetPublishingInterval\": 5000,\n  >       \"OpcNodes\": [\n  >          {\n  >             \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\",\n  >          }\n  >       ]\n  >    },\n  >    {\n  >       \"EndpointUrl\": \"opc.tcp://opcplc:50001\",\n  >       \"DataSetWriterGroup\": \"Asset2\",\n  >       \"DataSetWriterId\": \"DataFlow2\",\n  >       \"OpcNodes\": []\n  >    }\n  > ]\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > {\n  >    \"status\": 200,\n  >    \"payload\": {}\n  > }\n  > ```\n\nMore information can be found in the [API documentation](./api.md#addorupdateendpoints)\n\n## UnpublishNodes_V1\n\nUnpublishNodes method enables a client to remove nodes from a previously configured `DataSetWriter`. A `DataSetWriter`s identity is the combination of `DataSetWriterId`, `DataSetName`, `DataSetKeyFrameCount`, `DataSetClassId` and connection relevant information such as credentials, security mode, and endpoint Url. To update a `DataSetWriter` this information must match exactly.\nIf value of the `OpcNodes` attribute is `null` or an empty list, then the whole DataSetWriter entity is removed.\n\n_Note_: If all the nodes from a DataSet are to be unpublished, the DataSetWriter entity is removed from the configuration storage.\n\n  _Request_:  follows strictly the request payload schema, the `OpcNodes` attribute not being mandatory.\n\n  _Response_: when successful - Status 200 and an empty json (`{}`) as Payload\n\n  _Exceptions_: a response corresponding to an exception will be returned if:\n\n- request payload contains an endpoint (DataSet) that isn't present in publisher configuration\n\n- request payload contains a node that isn't present in publisher configuration\n\n  _Example_:\n\n  > _Method Name_: `UnpublishNodes_V1`\n  >\n  > _Request_:\n  >\n  > ```json\n  > {\n  >    \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n  >    \"DataSetWriterGroup\": \"Asset0\",\n  >    \"DataSetWriterId\": \"DataFlow0\",\n  >    \"DataSetPublishingInterval\": 5000,\n  >    \"OpcNodes\": [\n  >       {\n  >          \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\"\n  >       }\n  >    ]\n  > }\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > {\n  >    \"status\": 200,\n  >    \"payload\": {}\n  > }\n  > ```\n\nMore information can be found in the [API documentation](./api.md#unpublishnodes)\n\n## UnpublishAllNodes_V1\n\nUnpublishAllNodes method enables a client to remove all the nodes from a previously configured DataSetWriter.\nThe DataSetWriter entity will be removed from the configuration storage.\nWhen an empty payload is set or the endpoint in payload is null, the complete configuration of the publisher will be purged.\n\n  _Request_: follows strictly the request payload schema, the `OpcNodes` attribute should be excluded.\n\n  _Response_: when successful - Status 200 and an empty json (`{}`) as Payload\n\n  _Exceptions_: a response corresponding to an exception will be returned if:\n\n- request payload contains an endpoint (DataSet) that isn't present in publisher configuration\n\n- request payload contains `OpcNodes`\n\n  _Example_:\n\n  > _Method Name_: `UnpublishAllNodes_V1`\n  >\n  > _Payload_:\n  >\n  > ```json\n  > {\n  >    \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n  >    \"DataSetWriterGroup\": \"Asset1\",\n  >    \"DataSetWriterId\": \"DataFlow1\",\n  >    \"DataSetPublishingInterval\": 5000\n  > }\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > {\n  >    \"status\": 200,\n  >    \"payload\": {}\n  > }\n  > ```\n\nMore information can be found in the [API documentation](./api.md#unpublishallnodes)\n\n## GetConfiguredEndpoints_V1\n\nReturns the configured endpoints (`DataSetWriter`s)\n\n  _Request_: empty json (`{}`)\n\n  _Response_: the list of configured endpoints (and optional parameters).\n\n  _Exceptions_: an exception is thrown when method call returns status other than 200\n\n  _Example_:\n\n  > _Method Name_: `GetConfiguredEndpoints_V1`\n  >\n  > _Response_:\n  >\n  > ```json\n  > {\n  >    \"status\": 200,\n  >    \"payload\": {\n  >       \"endpoints\": [\n  >          {\n  >             \"endpointUrl\": \"opc.tcp://opcplc:50000\",\n  >             \"dataSetWriterGroup\": \"Asset1\",\n  >             \"dataSetWriterId\": \"DataFlow1\",\n  >             \"dataSetPublishingInterval\": 5000,\n  >           },\n  >           {\n  >              \"endpointUrl\": \"opc.tcp://opcplc:50001\"\n  >           }\n  >       ]\n  >    }\n  > }\n  > ```\n\nMore information can be found in the [API documentation](./api.md#getconfiguredendpoints)\n\n## SetConfiguredEndpoints_V1\n\nSets the configured endpoints (`DataSetWriter`s) and thus allows to update all configuration at once. The configuration on the OPC Publisher is replaced with the request payload content. Use empty array of endpoints to clear the entire content of the published nodes file.\n\n  _Request_: A list of configured endpoints (and optional parameters).\n\n  _Response_: empty json (`{}`)\n\n  _Exceptions_: an exception is thrown when method call returns status other than 200\n\n  _Example_:\n\n  > _Method Name_: `SetConfiguredEndpoints_V1`\n  >\n  > _Payload_:\n  >\n  > ```json\n  > {\n  >    \"endpoints\": [\n  >       {\n  >          \"endpointUrl\": \"opc.tcp://opcplc:50000\",\n  >          \"dataSetWriterGroup\": \"Asset1\",\n  >          \"dataSetWriterId\": \"DataFlow1\",\n  >          \"dataSetPublishingInterval\": 5000,\n  >        },\n  >        {\n  >           \"endpointUrl\": \"opc.tcp://opcplc:50001\"\n  >        }\n  >    ]\n  > }\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > {\n  >    \"status\": 200,\n  >    \"payload\": {}\n  > }\n  > ```\n\nMore information can be found in the [API documentation](./api.md#setconfiguredendpoints)\n\n## GetConfiguredNodesOnEndpoint_V1\n\nReturns the nodes configured for one Endpoint (`DataSetWriter`s).\n\n  _Request_: contains the elements defining the Dataset. Please note that the Dataset definition should fully match the one that is present in OPC Publisher configuration.\n\n  _Response_: list of `OpcNodes` configured for the selected Endpoint (and optional parameters).\n\n  _Exceptions_: an exception is thrown when method call returns status other than 200\n\n  _Example_:\n\n  > _Method Name_: `GetConfiguredNodesOnEndpoints_V1`\n  >\n  > _Payload_:\n  >\n  > ```json\n  > {\n  >    \"EndpointUrl\": \"opc.tcp://192.168.100.20:50000\",\n  >    \"DataSetWriterGroup\": \"Asset0\",\n  >    \"DataSetWriterId\": \"DataFlow0\",\n  >    \"DataSetPublishingInterval\": 5000\n  > }\n  > ```\n  >\n  > _Response_:\n  >\n  > ```json\n  > {\n  >    \"status\": 200,\n  >    \"payload\": {\n  >       \"opcNodes\": [\n  >          {\n  >             \"id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowUInt1\",\n  >             \"opcSamplingIntervalTimespan\": \"00:00:10\",\n  >             \"heartbeatIntervalTimespan\": \"00:00:50\"\n  >           }\n  >       ]\n  >    }\n  > }\n  > ```\n\nMore information can be found in the [API documentation](./api.md#getconfigurednodesonendpoint)\n\n## GetDiagnosticInfo_V1\n\nReturns a list of actual metrics for all concrete `DataSetWriter`s. This includes virtual `DataSetWriter`s created due to different publishing intervals configured.  The name of these contain the original name provided and a hash value.\n\n  _Request_: empty json (`{}`)\n\n  _Response_: list of actual metrics for every endpoint (Dataset).\n\n  _Exceptions_: an exception is thrown when method call returns status other than 200\n\n  _Note_: passwords aren't being part of the response.\n\n  _Example_:\n\n  > _Method Name_: `GetDiagnosticInfo_V1`\n  >\n  > _Response_:\n  >\n  > ```json\n  > {\n  >    \"status\":200,\n  >    \"payload\":[\n  >       {\n  >          \"endpoint\": {\n  >             \"endpointUrl\": \"opc.tcp://opcplc:50000\",\n  >             \"dataSetWriterGroup\": \"Asset1\",\n  >             \"useSecurity\": false,\n  >             \"opcAuthenticationMode\": \"UsernamePassword\",\n  >             \"opcAuthenticationUsername\": \"Usr\"\n  >          },\n  >          \"sentMessagesPerSec\": 2.6,\n  >          \"ingestionDuration\": \"{00:00:25.5491702}\",\n  >          \"ingressDataChanges\": 25,\n  >          \"ingressValueChanges\": 103,\n  >          \"ingressBatchBlockBufferSize\": 0,\n  >          \"encodingBlockInputSize\": 0,\n  >          \"encodingBlockOutputSize\": 0,\n  >          \"encoderNotificationsProcessed\": 83,\n  >          \"encoderNotificationsDropped\": 0,\n  >          \"encoderIoTMessagesProcessed\": 2,\n  >          \"encoderAvgNotificationsMessage\": 41.5,\n  >          \"encoderAvgIoTMessageBodySize\": 6128,\n  >          \"encoderAvgIoTChunkUsage\": 1.158034,\n  >          \"estimatedIoTChunksPerDay\": 13526.858105160689,\n  >          \"outgressBatchBlockBufferSize\": 0,\n  >          \"outgressInputBufferCount\": 0,\n  >          \"outgressInputBufferDropped\": 0,\n  >          \"outgressIoTMessageCount\": 0,\n  >          \"connectionRetries\": 0,\n  >          \"opcEndpointConnected\": true,\n  >          \"monitoredOpcNodesSucceededCount\": 5,\n  >          \"monitoredOpcNodesFailedCount\": 0,\n  >          \"ingressEventNotifications\": 0,\n  >          \"ingressEvents\": 0\n  >       }\n  >    ]\n  > }\n  > ```\n\nMore information can be found in the [API documentation](./api.md#getdiagnosticinfocinfo)\n"
  },
  {
    "path": "docs/opc-publisher/features.md",
    "content": "# Features\n\n[Home](./readme.md)\n\nThe following table shows the supported features of OPC Publisher and planned feature additions. Preview features are supported through GitHub issues only, experimental features will become preview or fully supported features if you request so through GitHub issues or by contacting us. If you would like to see additional features added, please open a feature request.\n\n| Feature | Sub Feature | 2.8 | 2.9 | Feature state |\n| ------- | ----------- |---- | --- | ------------- |\n| Uses latest .net reference stack ||X|X||\n| .net Version || .net 6 | .net 9 ||\n| Secure channel transport and configuration ||X|X||\n| OPC UA HTTP transport and configuration ||-|-|#1997|\n| Secure channel over web socket transport and configuration ||-|-|#1997|\n| Secure channel certificate management [API](./api.md#certificates) |||||\n| | Client Cert |-|X||\n| | Using EST |-|-||\n| | GDS Pull from GDS server |-|-|#2081|\n| | GDS Server Push to OPC Publisher |-|-||\n| Session-reconnect handling across connection loss ||X|X||\n| | Using official .net stack implementation |-|X||\n| [Reverse Connect](./readme.md#using-opc-ua-reverse-connect) ||-|X|Preview|\n| User authentication |||||\n| | Username / Password authentication |X|X||\n| | X509 based user authentication ||X||\n| | Token based user authentication |-|-||\n| Get Endpoint and Server information [API](./api.md#getservercapabilities) ||-|X|Preview|\n| Connect and Disconnect [API](./api.md) ||-|X|Preview|\n| Test connection [API](./api.md#testconnection) ||-|X|Preview|\n| Browse [API](./api.md#browse) ||-|X||\n| | Browse first/next |-|X||\n| | RegEx Browse filter |-|-||\n| | Streaming browse \"Fast browsing\" / Partial node set export |-|X|Preview|\n| | Publish model change feed change events |-|X|Experimental|\n| Translate browse path [API](./api.md) ||-|X||\n| Read [API](./api.md#valueread) |||||\n| | Read Value |-|X||\n| | Read other attributes of nodes |-|X||\n| | Get instance metadata |-|X||\n| Write [API](./api.md#valuewrite)|||||\n| | Write Value |-|X||\n| | Write other attributes of nodes |-|X||\n| Method Call [API](./api.md#methodcall) ||-|X||\n| HDA [API](./api.md#history) for processed, modified, at-times, events time series data |||||\n| | Read |-|X|Preview|\n| | Streaming read |-|X|Experimental|\n| | Update |-|X|Preview|\n| | Upsert |-|X|Preview|\n| | Delete |-|X|Preview|\n| File Transfer [API](./api.md#filesystem) ([Part 20](https://reference.opcfoundation.org/Core/Part20/v105/docs/)) |||||\n| | List file systems |-|X|Experimental|\n| | Browse file systems on server |-|X|Experimental|\n| | Create files and directories |-|X|Experimental|\n| | Download files |-|X|Experimental|\n| | Upload files to directory |-|X|Experimental|\n| | Delete files and directories |-|X|Experimental|\n| | Substitutable Close method |-|X|Experimental|\n| | Temporary file transfer |-|-||\n| Subscribe to [value changes](./readme.md#configuration-schema) |||||\n| | Value change subscriptions |X|X||\n| | Data change filter support |-|X||\n| | Using browse path to node |-|X||\n| | Deadband |-|X||\n| | Status trigger |-|X||\n| | Set server queue size per value|-|X||\n| | Set server queue LIFO/FIFO behavior per value|-|X||\n| | Set queue size using publishing interval and sampling interval |-|X|Preview|\n| | Periodic read ([cyclic read](./readme.md#sampling-and-publishing-interval-configuration))|-|X|Preview|\n| | Heartbeat (Periodic resending of last known value) |X|X||\n| | Configurable heartbeat behavior (LKG, LKV) ||X||\n| | Heartbeat message timestamp source configuration ||X||\n| Subscribe to [events](./readme.md#configuring-event-subscriptions) |||||\n| | Using browse path to event notifier |-|X||\n| | Simple (get all events of a type from event notifier)|-|X||\n| | Event filter (filter events on server before sending)|-|X||\n| | Condition handling / Condition snapshots|-|X|Preview|\n| Subscribe to nodes that are not variables or event notifiers |||||\n| | All variables under and object |-|X|Preview|\n| | All Objects and variables of an object type |-|X|Preview|\n| | All Variables of a variable type |-|X|Preview|\n| Triggering |||||\n| | Using Server side triggering service (SetTriggering) |-|-||\n| | Client side sampling of values on event |-|-||\n| Re-evaluate subscriptions |||||\n| | Periodically |-|X||\n| | While monitored items failed to be applied |-|X||\n| | On data model change events |-|-|#1209|\n| Subscription watchdog |||||\n| | When all monitored items are not reporting within an interval |-|X||\n| | When a monitored item is not reporting within an interval |-|X||\n| | When subscription is deleted on server |-|X||\n| | Configure whether to reset or terminate |-|X||\n| Registered Nodes |||||\n| | For periodic reads (registered read) |-|X|Preview|\n| | For monitored items |-|X|Preview|\n| | Register API call |-|-||\n| | Unregister API call |-|-||\n| Client-side transport queue configuration |||||\n| | Batch size and publishing interval publisher wide |X|X||\n| | Batch size and publishing interval per group |-|X||\n| | Load shedding |X|X||\n| | Queue jumping / Priority messages|-|-||\n| | Advanced overflow handling strategies|-|-||\n| IIoT Platform 2.8 Orchestrated mode support ||X|-||\n| 0 message loss||-|-||\n| Transfer subscription|||||\n| | On reconnect |-|X||\n| | On startup |-|-||\n| Re-activate session on startup (Transfer session)|||||\n| Deferred Notification Acknowledgement||-|X|Experimental|\n| Back pressure to server||-|-||\n| Published nodes JSON [schema](./readme.md#configuration-schema) support |||||\n| | v2.5 |X|X||\n| | v2.8 |X|X||\n| | v2.9 |-|X||\n| | JSON schema validation |X|-||\n| | Bootstrapped from Azure Storage blob |-|-|#2284|\n| API to configure and subscribe to Objects, Types and Assets |||||\n| | All variables under an object as writers |-|X|Experimental|\n| | All variables of objects of a certain object type or subtype |-|X|Experimental|\n| | All variables of a variable type or subtype |-|X|Experimental|\n| | Asset configuration using Web of Things Description per [Part 10100-1](https://reference.opcfoundation.org/WoT/v100/docs/)|-|X|Experimental|\n| | Asset admin shell support per [Part 30270](https://reference.opcfoundation.org/I4AAS/v100/docs/)|-|-||\n| OPC UA Pub/Sub configuration API ([Part 14](https://reference.opcfoundation.org/Core/Part14/v105/docs/))||-|-||\n| Data contextualization |||||\n| | Add Endpoint/Dataset name to message header (Routing) |X|X||\n| | [Enrichment](./readme.md#key-frames-delta-frames-and-extension-fields) |-|X||\n| | Transformation |-|-||\n| | Normalization |-|-||\n| Running as docker outside IoT Edge or K8s ||-|X|Experimental|\n| [IoT Edge](./readme.md#install-iot-edge) deployment support ||X|X||\n| | Fully functional in nested (ISA95) setup |-|X||\n| | IoT Hub direct method-based configuration|X|X||\n| | IoT Hub direct method-based API calls|-|X||\n| | DTDL interface for API |-|-||\n| [MQTT](./transports.md#mqtt) request response-based API and configuration |||||\n| | v5 request response |-|X|Preview|\n| | v3.11 using IoT Hub like &rid= correlation |-|X|Experimental|\n| [HTTP](./transports.md#built-in-http-api-server) REST command/control and configuration API ||-|X|Preview|\n| Kafka request response-based API and configuration ||-|-||\n| Configuration via OPC UA endpoint ||-|-||\n| Prometheus [Metrics](./observability.md) |||||\n| | For module metrics |X|X||\n| | Endpoint metrics |X|X||\n| | Process data |-|-|Backlog|\n| Periodic diagnostic output |||||\n| | To Console |X|X||\n| | To Diagnostics Topic/Output |-|X||\n| | As OPC UA PubSub Message |-|-|Backlog|\n| Health and liveness probe / watchdog ||-|-|Backlog|\n| Message and event publishing [transports](./transports.md) |||||\n| | IoT Hub |X|X||\n| | MQTT topics |-|X|Preview|\n| | Publishing to [Azure EventHub](./transports.md#azure-eventhub) |-|X|Preview|\n| | Dapr Pub/Sub (Kafka, Redis, etc.) |-|X|Experimental|\n| | Publishing to a Web hook|-|X|Experimental|\n| | Dump messages and schemas to zip files in file system |-|X|Experimental|\n| | Null sink|-|X|Experimental|\n| Multiple cloud transports enabled in parallel ||-|X|Preview|\n| Select desired transport per writer group ||-|X|Preview|\n| Cloud Events support ||-|-|via Dapr|\n| OPC UA Pub Sub [message content profiles](./messageformats.md) |||||\n| | (Full and simple) data set messages |X|X||\n| | (Full and simple) Network messages |X|X||\n| | Raw message format |-|X||\n| | Single data set format |-|X||\n| | Custom configuration using content flags |-|-||\n| | Configurable per writer group |-|X||\n| OPC UA Pub Sub message [encoding](./messageformats.md) |||||\n| | JSON Encoding |X|X||\n| | [Non-Reversible](https://reference.opcfoundation.org/Core/Part6/v105/docs/) |-|X||\n| | [Reversible](https://reference.opcfoundation.org/Core/Part6/v105/docs/) |-|X||\n| | [Compact](https://reference.opcfoundation.org/Core/Part6/v105/docs/) |-|-||\n| | [Verbose](https://reference.opcfoundation.org/Core/Part6/v105/docs/) |-|-||\n| | GZIP JSON Encoding |-|X||\n| | JSON Schema publishing for JSON encoding |-|X|Experimental|\n| | UADP Binary encoding per [Part 14](https://reference.opcfoundation.org/Core/Part14/v105/docs/)|-|X|Preview|\n| | Avro and Avro+Gzip encoding with Schema publishing |-|X|Experimental|\n| | [Samples JSON encoding](./messageformats.md#samples-mode-encoding-legacy) – Legacy |X|X|Deprecated|\n| | Samples Binary encoding – Legacy |X|-||\n| | Configurable per writer group |-|X||\n| OPC UA [Part 14](https://reference.opcfoundation.org/Core/Part14/v105/docs/) Pub Sub Message types |||||\n| | [Delta frame messages](./messageformats.md#data-value-change-messages) |-|X||\n| | [Key frame messages](./readme.md#key-frames-delta-frames-and-extension-fields) / Key frame count |-|X||\n| | [Event messages](./messageformats.md#event-messages) |-|X||\n| | Keep alive messages |-|X||\n| | Data Set Metadata messages (on change and periodic) |-|X||\n| | Discovery messages |-|-||\n| | Publisher status messages |-|-||\n| Unified Namespace |||||\n| | Topic templates at writer group and dataset writer level |-|X|Preview|\n| | Automatic topic routing using OPC UA browse paths |-|X|Experimental|\n"
  },
  {
    "path": "docs/opc-publisher/intfilesamples.md",
    "content": "# Init file samples <!-- omit in toc -->\n\n[Home](./readme.md#configuration-via-init-file)\n\nYou find here examples that leverage the [init file capabilities](./readme.md#configuration-via-init-file) of OPC Publisher (since 2.9.12).\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Find and create writers for all machine tools in a server](#find-and-create-writers-for-all-machine-tools-in-a-server)\n- [Add all variables in a server to a single data set writer](#add-all-variables-in-a-server-to-a-single-data-set-writer)\n- [Add machine objects as data set writers](#add-machine-objects-as-data-set-writers)\n- [Create a Web of Things Asset and add a data set writer](#create-a-web-of-things-asset-and-add-a-data-set-writer)\n\n## Find and create writers for all machine tools in a server\n\nThis init file uses the [ExpandAndCreateOrUpdateDataSetWriterEntries API](./api.md#expandandcreateorupdatedatasetwriterentries) to generate writers for each machine tool found on the server. A machine tool is an object that compiles to the MachineTool ObjectType as defined in the [OPC 40501-1](https://reference.opcfoundation.org/MachineTool/v102/docs/8.1) (machine tool companion specification).\n\nFor this reason, this and the following 2 samples use the publicly hosted [Umati](https://umati.org/) reference server giving a good understanding on how to leverage the OPC UA companion specifications.\n\n``` json\n###\n\n// 3 retries in case of failure, with a delay of 5 seconds between\n// @delay 5\n// @retries 3\n\n// Creates writer entries for all objects that implement the\n// machine tool object type or one of its subtypes on the server\nExpandAndCreateOrUpdateDataSetWriterEntries_V2\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"opc.tcp://opcua.umati.app:4840\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"MachineTools\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/MachineTool/;i=13\" }\n        ]\n    }\n}\n\n###\n\n// Shutdown the publisher in case the expansion failed\n// and let docker restart it. The Fail fast argument\n// provided as json payload.\n# @on-error\nShutdown_V2\n\ntrue\n\n###\n```\n\nThis results in a result (log) file that shows the result of the execution of the individual methods on the publisher API and that looks like this (the response payload is abbreviated and in any case not indented):\n\n``` json\n###\n\n// 3 retries in case of failure, with a delay of 5 seconds between\n// Creates writer entries for all objects that implement the\n// machine tool object type or one of its subtypes on the server\nExpandAndCreateOrUpdateDataSetWriterEntries_V2\n200\n\n[{\"result\":{\"DataSetWrite ....... tionMode\":\"Anonymous\"}}]\n\n###\n\n// Shutdown the publisher in case the expansion failed\n// and let docker restart it. The Fail fast argument\n// provided as json payload.\nShutdown_V2\n// @skipped reason = success\n###\n```\n\n## Add all variables in a server to a single data set writer\n\nThe following example uses the same API but with the ObjectsFolder (`i=85`) node as root, drilling down 10 levels and capturing all variables into a single writer entry in the published nodes configuration.\n\n``` json\n###\n\n// 3 retries in case of failure, with a delay of 5 seconds between\n// @delay 5\n// @retries 3\nExpandAndCreateOrUpdateDataSetWriterEntries_V2\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"opc.tcp://opcua.umati.app:4840\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"All\",\n        \"OpcNodes\": [\n            { \"Id\": \"i=85\" }\n        ]\n    },\n    \"request\": {\n        \"createSingleWriter\": true,\n        \"maxDepth\": 10,\n        \"discardErrors\": true\n    }\n}\n\n###\n\n// Shutdown the publisher in case the expansion failed\n// and let docker restart it. The Fail fast argument\n// provided as json payload.\n# @on-error\nShutdown_V2\n\ntrue\n\n###\n```\n\n## Add machine objects as data set writers\n\nThe following example uses again the same API but with the Machines folder (`nsu=http://opcfoundation.org/UA/Machinery/;i=1001`) node as root capturing all variables into several writer entries in the published nodes configuration.\n\n``` json\n###\n// @delay 5\nExpandAndCreateOrUpdateDataSetWriterEntries\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"opc.tcp://opcua.umati.app:4840\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"Machinery Objects\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Machinery/;i=1001\" }\n        ]\n    }\n}\n\n// @retries 3\n###\nShutdown\n// @on-error\n###\n```\n\n## Create a Web of Things Asset and add a data set writer\n\nThe following shows how to create a Asset in a [WoT connectivity](https://reference.opcfoundation.org/WoT/v100/docs/) compatible server using a WoT Thing instance model using the [Asset](./api.md#createorupdateasset) API. An compatible sample server can be found [here](https://github.com/OPCFoundation/UA-EdgeTranslator).\n\n> Please note that the asset name inside the configuration must match the `DataSetName` property.\n\n``` json\n###\nCreateOrUpdateAsset\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"opc.tcp://localhost:4840\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assets\",\n        \"DataSetName\": \"MyAsset1\"\n    },\n    \"waitTime\": \"00:00:01\",\n    \"configuration\": {\n        \"@context\": [\n            \"https://www.w3.org/2022/wot/td/v1.1\"\n        ],\n        \"id\": \"urn:Simple PLC\",\n        \"securityDefinitions\": {\n            \"nosec_sc\": {\n                \"scheme\": \"nosec\"\n            }\n        },\n        \"security\": [\n            \"nosec_sc\"\n        ],\n        \"@type\": [\n            \"tm:ThingModel\"\n        ],\n        \"name\": \"MyAsset1\",\n        \"base\": \"ads://127.0.0.1:8534\",\n        \"title\": \"Untitled1\",\n        \"properties\": {\n        \"Global_Version.stLibVersion_Tc2_Standard\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": null,\n            \"opcua:type\": null,\n            \"opcua:fieldPath\": null,\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n            {\n                \"href\": \"Global_Version.stLibVersion_Tc2_Standard?36\",\n                \"op\": [\n                    \"readproperty\",\n                    \"observeproperty\"\n                ],\n                \"type\": \"xsd:float\",\n                \"pollingTime\": 1000\n            }\n            ]\n        },\n        \"Global_Version.stLibVersion_Tc2_System\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": null,\n            \"opcua:type\": null,\n            \"opcua:fieldPath\": null,\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"Global_Version.stLibVersion_Tc2_System?36\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"type\": \"xsd:float\",\n                    \"pollingTime\": 1000\n                }\n            ]\n        },\n        \"Global_Version.stLibVersion_Tc3_Module\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": null,\n            \"opcua:type\": null,\n            \"opcua:fieldPath\": null,\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"Global_Version.stLibVersion_Tc3_Module?36\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"type\": \"xsd:float\",\n                    \"pollingTime\": 1000\n                }\n            ]\n        },\n        \"GVL_VAR.temp\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": null,\n            \"opcua:type\": null,\n            \"opcua:fieldPath\": null,\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"GVL_VAR.temp?4\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"type\": \"xsd:float\",\n                    \"pollingTime\": 1000\n                }\n            ]\n        }\n    }\n}\n\n###\n# @on-error\nShutdown_V2\n###\n```\n"
  },
  {
    "path": "docs/opc-publisher/messageformats.md",
    "content": "# Telemetry Message Formats <!-- omit in toc -->\n\n[Home](./readme.md)\n\n> This documentation applies to version 2.9\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Messaging Profiles supported by OPC Publisher](#messaging-profiles-supported-by-opc-publisher)\n- [OPC UA Pub Sub Encoding](#opc-ua-pub-sub-encoding)\n  - [Standards compliance](#standards-compliance)\n  - [Delta and key frame messages](#delta-and-key-frame-messages)\n  - [Event messages](#event-messages)\n  - [Reversible encoding](#reversible-encoding)\n  - [Pending Alarm snapshots](#pending-alarm-snapshots)\n  - [Keep Alive messages](#keep-alive-messages)\n- [Samples mode encoding (Legacy)](#samples-mode-encoding-legacy)\n  - [Value change messages in Samples mode](#value-change-messages-in-samples-mode)\n  - [Event messages in Samples mode](#event-messages-in-samples-mode)\n\nOPC Publisher supports a rich set of message formats, including legacy formats supported.\n\n## Messaging Profiles supported by OPC Publisher\n\n| Messaging Mode<br>(--mm) | Message Encoding<br>(--me) | NetworkMessageContentMask | DataSetMessageContentMask | DataSetFieldContentMask | Metadata supported | KeyFrames supported | KeepAlive supported | Schema publishing |\n   |--------------------------|----------------------------|---------------------------|---------------------------|-------------------------|--------------------|---------------------|---------------------|-------------------|\n| Samples | Json | DataSetMessageHeader, MonitoredItemMessage<br>(0x2) | MetaDataVersion, MajorVersion, MinorVersion, MessageType, DataSetWriterName<br>(0xB0000062) | StatusCode, SourceTimestamp, NodeId, DisplayName, EndpointUrl<br>(0x3) |   |   |   |\n| FullSamples | Json | DataSetMessageHeader, MonitoredItemMessage<br>(0x2) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0xF200006F) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) |   |   |   |\n| PubSub | Json | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x1B) | MetaDataVersion, MajorVersion, MinorVersion, MessageType, DataSetWriterName<br>(0xB0000062) | StatusCode, SourceTimestamp, NodeId, DisplayName, EndpointUrl<br>(0x3) | X | X | X |\n| FullNetworkMessages | Json | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x1B) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0xF200006F) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| PubSub | JsonGzip | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x1B) | MetaDataVersion, MajorVersion, MinorVersion, MessageType, DataSetWriterName<br>(0xB0000062) | StatusCode, SourceTimestamp, NodeId, DisplayName, EndpointUrl<br>(0x3) | X | X | X |\n| FullNetworkMessages | JsonGzip | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x1B) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0xF200006F) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| PubSub | JsonReversible | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x1B) | MetaDataVersion, MajorVersion, MinorVersion, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xB00000E2) | StatusCode, SourceTimestamp, NodeId, DisplayName, EndpointUrl<br>(0x3) | X | X | X |\n| PubSub | JsonReversibleGzip | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x1B) | MetaDataVersion, MajorVersion, MinorVersion, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xB00000E2) | StatusCode, SourceTimestamp, NodeId, DisplayName, EndpointUrl<br>(0x3) | X | X | X |\n| FullNetworkMessages | JsonReversible | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x1B) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xF20000EF) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| FullNetworkMessages | JsonReversibleGzip | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x1B) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xF20000EF) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| Samples | JsonReversible | DataSetMessageHeader, MonitoredItemMessage<br>(0x2) | MetaDataVersion, MajorVersion, MinorVersion, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xB00000E2) | StatusCode, SourceTimestamp, NodeId, DisplayName, EndpointUrl<br>(0x3) |   |   |   |\n| Samples | JsonReversibleGzip | DataSetMessageHeader, MonitoredItemMessage<br>(0x2) | MetaDataVersion, MajorVersion, MinorVersion, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xB00000E2) | StatusCode, SourceTimestamp, NodeId, DisplayName, EndpointUrl<br>(0x3) |   |   |   |\n| FullSamples | JsonReversible | DataSetMessageHeader, MonitoredItemMessage<br>(0x2) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xF20000EF) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) |   |   |   |\n| FullSamples | JsonReversibleGzip | DataSetMessageHeader, MonitoredItemMessage<br>(0x2) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xF20000EF) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) |   |   |   |\n| DataSetMessages | Json | DataSetMessageHeader<br>(0x2) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0xF200006F) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| DataSetMessages | JsonGzip | DataSetMessageHeader<br>(0x2) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0xF200006F) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| DataSetMessages | JsonReversible | DataSetMessageHeader<br>(0x2) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xF20000EF) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| DataSetMessages | JsonReversibleGzip | DataSetMessageHeader<br>(0x2) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xF20000EF) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSetMessage | Json | DataSetMessageHeader, SingleDataSetMessage<br>(0x6) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0xF200006F) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSetMessage | JsonGzip | DataSetMessageHeader, SingleDataSetMessage<br>(0x6) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0xF200006F) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSetMessage | JsonReversible | DataSetMessageHeader, SingleDataSetMessage<br>(0x6) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xF20000EF) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSetMessage | JsonReversibleGzip | DataSetMessageHeader, SingleDataSetMessage<br>(0x6) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName, ReversibleFieldEncoding<br>(0xF20000EF) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| DataSets | Json | 0<br>(0x0) | 0<br>(0xF2000000) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| DataSets | JsonGzip | 0<br>(0x0) | 0<br>(0xF2000000) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSet | Json | SingleDataSetMessage<br>(0x4) | 0<br>(0xF2000000) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSet | JsonGzip | SingleDataSetMessage<br>(0x4) | 0<br>(0xF2000000) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| DataSets | JsonReversible | 0<br>(0x0) | 0<br>(0xF2000000) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| DataSets | JsonReversibleGzip | 0<br>(0x0) | 0<br>(0xF2000000) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSet | JsonReversible | SingleDataSetMessage<br>(0x4) | 0<br>(0xF2000000) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSet | JsonReversibleGzip | SingleDataSetMessage<br>(0x4) | 0<br>(0xF2000000) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| RawDataSets | Json | 0<br>(0x0) | 0<br>(0x0) | RawData<br>(0x20) |   | X | X |\n| RawDataSets | JsonGzip | 0<br>(0x0) | 0<br>(0x0) | RawData<br>(0x20) |   | X | X |\n| SingleRawDataSet | Json | SingleDataSetMessage<br>(0x4) | 0<br>(0x0) | RawData<br>(0x20) | X | X | X |\n| SingleRawDataSet | JsonGzip | SingleDataSetMessage<br>(0x4) | 0<br>(0x0) | RawData<br>(0x20) | X | X | X |\n| RawDataSets | JsonReversible | 0<br>(0x0) | 0<br>(0x0) | RawData<br>(0x20) |   | X | X |\n| RawDataSets | JsonReversibleGzip | 0<br>(0x0) | 0<br>(0x0) | RawData<br>(0x20) |   | X | X |\n| SingleRawDataSet | JsonReversible | SingleDataSetMessage<br>(0x4) | 0<br>(0x0) | RawData<br>(0x20) | X | X | X |\n| SingleRawDataSet | JsonReversibleGzip | SingleDataSetMessage<br>(0x4) | 0<br>(0x0) | RawData<br>(0x20) | X | X | X |\n| PubSub | Uadp | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x2F5) | MetaDataVersion, MajorVersion, MinorVersion, MessageType, DataSetWriterName<br>(0x18) | StatusCode, SourceTimestamp, NodeId, DisplayName, EndpointUrl<br>(0x3) | X | X | X |\n| FullNetworkMessages | Uadp | PublisherId, WriterGroupId, NetworkMessageNumber, SequenceNumber, PayloadHeader, Timestamp, DataSetClassId, NetworkMessageHeader, DataSetMessageHeader<br>(0x2F5) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0x39) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| DataSetMessages | Uadp | DataSetMessageHeader<br>(0x0) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0x39) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| SingleDataSetMessage | Uadp | DataSetMessageHeader, SingleDataSetMessage<br>(0x0) | Timestamp, MetaDataVersion, DataSetWriterId, MajorVersion, MinorVersion, SequenceNumber, MessageType, DataSetWriterName<br>(0x39) | StatusCode, SourceTimestamp, ServerTimestamp, NodeId, DisplayName, EndpointUrl, ApplicationUri, ExtensionFields<br>(0x7) | X | X | X |\n| RawDataSets | Uadp | 0<br>(0x0) | 0<br>(0x0) | RawData<br>(0x20) |   | X | X |\n| SingleRawDataSet | Uadp | SingleDataSetMessage<br>(0x0) | 0<br>(0x0) | RawData<br>(0x20) | X | X | X |\n\n## OPC UA Pub Sub Encoding\n\nTo use the OPC UA PubSub format specify a value for `--mm` on the command line. This needs to be done because the OPC publisher defaults to `--mm=Samples` mode which existed before the introduction of OPC UA standards compliant PubSub format. You should always use PubSub format specified in the OPC UA Standard. We will not support the non standards compliant Samples mode in versions greater than 2.*.\n\n### Standards compliance\n\nOPC Publisher 2.9 and above supports strict adherence to Part 6 and Part 14 of the OPC UA specification when it comes to network message encoding. To enable strict mode use the `-c` or `--strict` [command line](./commandline.md) option. For backwards compatibility this option is off by default.\n\n> It is highly recommended to always run OPC Publisher with strict adherence turned on. Strict mode is continuously adjusted as we do interoperability testing and parts of the standard are clarified.  \n\nThe following are the key differences between strict compliance and the compatibility mode with previous versions of OPC Publisher:\n\n| Strict mode | Compatibility mode |\n|-------------|--------------------|\n| `PubSub` is the default encoding mode if nothing else is specified | `Samples` is the default encoding mode and `--mm=PubSub` must be explicitly specified |\n| `DataSetWriterId` is a unique integer in the `DataSetWriterGroup` | `DataSetWriterId` is the writer name string |\n| `DataSetWriterName` is the writer name string | `DataSetWriterName` is not used |\n| Network messages contain array of data set messages when batching | Array of network messages is sent when batching |\n| `Status` field is status code integer only (as per Part 14) | `Status` is fully JSON encoded Status code (per Part 6) |\n| JSON encoding compliant with Part 6 | Microsoft [JSON extensions](../json.md) |\n\n### Delta and key frame messages\n\nThis section covers data value change messages (Message type `ua-deltaframe` and `ua-keyframe`). Details for OPC UA Alarms and Events messages (`ua-event`) can be found [further on](#event-messages).\n\nThe following messages are emitted for data value changes in a subscription if `--mm=PubSub` message mode is used with `--me=Json`:\n\n```json\n{\n  \"body\": {\n    \"MessageId\": \"27\",\n    \"MessageType\": \"ua-data\",\n    \"PublisherId\": \"opc.tcp://opcplc:50000_70FB9F43\",\n    \"Messages\": [\n      {\n        \"DataSetWriterId\": 1,\n        \"DataSetWriterName\": \"1000\",\n        \"SequenceNumber\": 27,\n        \"MetaDataVersion\": {\n          \"MajorVersion\": 1,\n          \"MinorVersion\": 0\n        },\n        \"MessageType\": \"ua-deltaframe\",\n        \"Timestamp\": \"2022-03-18T12:55:21.3424136Z\",\n        \"Payload\": {\n          \"AlternatingBoolean\": {\n            \"Value\": true,\n            \"SourceTimestamp\": \"2022-03-18T12:55:20.9313098Z\",\n            \"ServerTimestamp\": \"2022-03-18T12:55:20.9314784Z\"\n          },\n          \"StepUp\": {\n            \"Value\": 23305,\n            \"SourceTimestamp\": \"2022-03-18T12:55:21.3313539Z\",\n            \"ServerTimestamp\": \"2022-03-18T12:55:21.3313638Z\"\n          },\n          \"RandomSignedInt32\": {\n            \"Value\": 1076635612,\n            \"SourceTimestamp\": \"2022-03-18T12:55:21.3419164Z\",\n            \"ServerTimestamp\": \"2022-03-18T12:55:21.3419728Z\"\n          },\n          \"RandomUnsignedInt32\": {\n            \"Value\": 1461169798,\n            \"SourceTimestamp\": \"2022-03-18T12:55:21.3419727Z\",\n            \"ServerTimestamp\": \"2022-03-18T12:55:21.3420045Z\"\n          },\n          \"BadFastUInt1\": {\n            \"StatusCode\": {\n              \"Symbol\": \"BadNoCommunication\",\n              \"Code\": 2150694912\n            },\n            \"SourceTimestamp\": \"2022-03-18T12:55:20.8409353Z\",\n            \"ServerTimestamp\": \"2022-03-18T12:55:20.8409362Z\"\n          }\n        }\n      }\n    ]\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 13:55:21 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-network-message-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nThe data set messages in the `ua-data` network message can be delta frames (`ua-deltaframe`, containing only changed values in the dataset), key frames (`ua-keyframe`, containing all values of the dataset), keep alive messages (`ua-keepalive`, containing no payload), or [events and conditions](#event-messages).\n\nIMPORTANT: Depending on the number of nodes in a subscription and the data type of properties inside a single dataset, data set messages contained in a network message can be very large.  Indeed, it can potentially be too large and not fit into IoT Hub Messages which are limited to 256 kB.  In this case messages might not be sent. You can try to use `--me=JsonGzip` to compress messages using Gzip compression, or use `--me=Uadp` which supports network message chuncing (and overcomes any transport limitation). If neither help or are an option it is recommended to create smaller subscriptions (by adding less nodes to an endpoint) or disable dataset metadata message sending using `--dm=False`.\n\nThe data set is described by a corresponding metadata message (message type `ua-metdata`), which is emitted prior to the first message and whenever the configuration is updated requiring an update of the metadata. Metadata can also be sent periodically, which can be configured using the control plane of OPC Publisher.\n\n```json\n{\n  \"body\": [\n    {\n      \"MessageId\": \"0\",\n      \"MessageType\": \"ua-metadata\",\n      \"PublisherId\": \"opc.tcp://localhost:57537/UA/SampleServer_A2425855\",\n      \"DataSetWriterId\": 1,\n      \"MetaData\": {\n        \"Namespaces\": [\n          \"http://opcfoundation.org/UA/\",\n          \"urn:localhost:OPCFoundation:CoreSampleServer\",\n          \"http://test.org/UA/Data/\",\n          \"http://opcfoundation.org/UA/Boiler/\"\n        ],\n        \"StructureDataTypes\": [],\n        \"EnumDataTypes\": [],\n        \"SimpleDataTypes\": [],\n        \"Fields\": [\n          {\n            \"Name\": \"Output\",\n            \"BuiltInType\": 26,\n            \"DataType\": \"Number\",\n            \"ValueRank\": -1,\n            \"ArrayDimensions\": [],\n            \"DataSetFieldId\": \"fcab2ed0-c6b2-4456-a4c3-ed985e5c708d\",\n            \"Properties\": []\n          }\n        ],\n        \"ConfigurationVersion\": {\n          \"MajorVersion\": 1222304635,\n          \"MinorVersion\": 1289056823\n        }\n      }\n    }\n  ],\n  \"enqueuedTime\": \"Mon Jan 23 2023 13:49:02 GMT+0200 (Central European Summer Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-network-message-json-v1\",\n    \"iothub-message-schema\": \"application/ua+json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n\n```\n\nIMPORTANT: Depending on the number of nodes in a subscription, a Metadata messages can be very large.  Indeed, it can potentially be too large and not fit into IoT Hub Messages which are limited to 256 kB.  In this case they are created but never sent. You can choose to use `--me=JsonGzip` to compress messages using Gzip compression, or use `--me=Uadp` which supports network message chunking. If neither help or are an option it is recommended to create smaller subscriptions (by adding less nodes to an endpoint) or disable dataset metadata message sending using `--dm=False`.\n\n### Event messages\n\nThis section describes what the output looks like when listening for events in the OPC Publisher.\n\nTo use the OPC UA PubSub format specify the `--mm=PubSub` command line. This needs to be done because the OPC publisher defaults to `--mm=Samples` [mode](#samples-mode-encoding-legacy) which existed before the introduction of OPC UA standards compliant PubSub format.\n\nEvents should be produced in the PubSub format specified in the OPC UA Standard. The payload is an event which consists of fields selected in the select clause and its values.\n\nThe following is an example of the output you will se when listening to events from the Simple Events sample:\n\n```json\n{\n  \"body\": [\n    {\n      \"MessageId\": \"43\",\n      \"MessageType\": \"ua-data\",\n      \"PublisherId\": \"SIMPLE-EVENTS\",\n      \"DataSetWriterGroup\": \"SIMPLE-EVENTS\",\n      \"Messages\": [\n        {\n          \"DataSetWriterId\": \"SIMPLE-EVENTS\",\n          \"MetaDataVersion\": {\n            \"MajorVersion\": 1222304427,\n            \"MinorVersion\": 801860751\n          },\n          \"MessageType\": \"ua-event\",\n          \"Payload\": {\n            \"EventId\": \"+6CQjN1eqkO6+yHJnxMz5w==\",\n            \"EventType\": \"http://microsoft.com/Opc/OpcPlc/SimpleEvents#i=14\",\n            \"Message\": \"The system cycle '59' has started.\",\n            \"ReceiveTime\": \"2021-06-21T12:38:55.5814091Z\",\n            \"Severity\": 1,\n            \"SourceName\": \"System\",\n            \"SourceNode\": \"i=2253\",\n            \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n              \"Name\": \"Step 1\",\n              \"Duration\": 1000.0\n            },\n            \"Time\": \"2021-06-21T12:38:55.5814078Z\"\n          }\n        }\n      ]\n    }\n  ],\n  \"enqueuedTime\": \"Mon Jan 21 2023 14:39:02 GMT+0200 (Central European Summer Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-network-message-json-v1\",\n    \"iothub-message-schema\": \"application/ua+json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nThe event is described by the corresponding metadata message, which is emitted prior to the first message and whenever the configuration is updated requiring an update of the metadata. Metadata can also be sent periodically, which can be configured using the control plane of OPC Publisher. The following metadata is provided in `--strict` mode:\n\n```json\n{\n  \"body\": [\n    {\n      \"MessageId\": \"edecf7ec-5ae8-4957-82ef-7f915dddb5be\",\n      \"MessageType\": \"ua-metadata\",\n      \"PublisherId\": \"opc.tcp://localhost:55924/UA/SampleServer_E8BAB2AD\",\n      \"DataSetWriterId\": 1,\n      \"MetaData\": {\n        \"Namespaces\": [\n          \"http://opcfoundation.org/UA/\",\n          \"http://test.org/UA/Data/\",\n          \"http://test.org/UA/Data//Instance\",\n          \"http://opcfoundation.org/UA/Boiler//Instance\",\n          \"urn:localhost:somecompany.com:VehiclesServer\",\n          \"http://opcfoundation.org/UA/Vehicles/Types\",\n          \"http://opcfoundation.org/UA/Vehicles/Instances\",\n          \"http://opcfoundation.org/ReferenceApplications\",\n          \"http://opcfoundation.org/UA/Diagnostics\",\n          \"http://opcfoundation.org/UA/Boiler/\"\n        ],\n        \"StructureDataTypes\": [\n          {\n            \"DataTypeId\": {\n              \"Id\": 183,\n              \"Namespace\": \"http://opcfoundation.org/SimpleEvents\"\n            },\n            \"Name\": {\n              \"Name\": \"CycleStepDataType\",\n              \"Uri\": \"http://opcfoundation.org/SimpleEvents\"\n            },\n            \"StructureDefinition\": {\n              \"BaseDataType\": {\n                \"Id\": 22\n              },\n              \"StructureType\": \"Structure_0\",\n              \"Fields\": [\n                {\n                  \"Name\": \"Name\",\n                  \"DataType\": {\n                    \"Id\": 12\n                  },\n                  \"ValueRank\": -1,\n                  \"ArrayDimensions\": [],\n                  \"MaxStringLength\": 0,\n                  \"IsOptional\": false\n                },\n                {\n                  \"Name\": \"Duration\",\n                  \"DataType\": {\n                    \"Id\": 11\n                  },\n                  \"ValueRank\": -1,\n                  \"ArrayDimensions\": [],\n                  \"MaxStringLength\": 0,\n                  \"IsOptional\": false\n                }\n              ]\n            }\n          }\n        ],\n        \"EnumDataTypes\": [],\n        \"SimpleDataTypes\": [],\n        \"Fields\": [\n          {\n            \"Name\": \"EventId\",\n            \"FieldFlags\": 0,\n            \"BuiltInType\": 15,\n            \"DataType\": {\n              \"Id\": 15\n            },\n            \"ValueRank\": -1,\n            \"ArrayDimensions\": [],\n            \"MaxStringLength\": 0,\n            \"DataSetFieldId\": \"487f710c-9f43-4425-9a77-03f3396362f7\",\n            \"Properties\": []\n          },\n          {\n            \"Name\": \"Message\",\n            \"FieldFlags\": 0,\n            \"BuiltInType\": 21,\n            \"DataType\": {\n              \"Id\": 21\n            },\n            \"ValueRank\": -1,\n            \"ArrayDimensions\": [],\n            \"MaxStringLength\": 0,\n            \"DataSetFieldId\": \"15c7bc3a-4714-4f5e-9874-d4671288f5a0\",\n            \"Properties\": []\n          },\n          {\n            \"Name\": \"http://opcfoundation.org/SimpleEvents#CycleId\",\n            \"FieldFlags\": 0,\n            \"BuiltInType\": 12,\n            \"DataType\": {\n              \"Id\": 12\n            },\n            \"ValueRank\": -1,\n            \"ArrayDimensions\": [],\n            \"MaxStringLength\": 0,\n            \"DataSetFieldId\": \"03378140-f21b-4ee1-9bbe-01325e847128\",\n            \"Properties\": []\n          },\n          {\n            \"Name\": \"http://opcfoundation.org/SimpleEvents#CurrentStep\",\n            \"FieldFlags\": 0,\n            \"BuiltInType\": 22,\n            \"DataType\": {\n              \"Id\": 183,\n              \"Namespace\": \"http://opcfoundation.org/SimpleEvents\"\n            },\n            \"ValueRank\": -1,\n            \"ArrayDimensions\": [],\n            \"MaxStringLength\": 0,\n            \"DataSetFieldId\": \"a9cd0d57-ae64-4e20-b113-b3df52cb6a59\",\n            \"Properties\": []\n          }\n        ],\n        \"ConfigurationVersion\": {\n          \"MajorVersion\": 1222308210,\n          \"MinorVersion\": 2861644214\n        }\n      },\n      \"DataSetWriterName\": \"1000\"\n    }\n  ],\n  \"enqueuedTime\": \"Mon Jan 23 2023 13:49:02 GMT+0200 (Central European Summer Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-network-message-json-v1\",\n    \"iothub-message-schema\": \"application/ua+json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n\n```\n\nIMPORTANT: Depending on the number of members in an event type and their data types, data set messages contained in a network message can be large.  In some cases a JSON metadata message can potentially be too large and not fit into IoT Hub Messages which are limited to 256 kB. In this case messages might not be sent. You can try to use `--me=JsonGzip` to compress event data set messages using Gzip compression, or use `--me=Uadp` which supports network message chunking (and overcomes any transport limitation). If neither help or are an option it is recommended to use an event filter and select the properties needed or disable dataset metadata message sending altogether using `--dm=False`.\n\n### Reversible encoding\n\nThe format produced here does not contain enough information to decode the message using the OPC UA type system. If you need to decode messages using a OPC UA JSON decoder the command-line option called `UseReversibleEncoding` can be set to `true`. If you enable this setting the output will look like as follows:\n\n```json\n{\n  \"body\": [\n    {\n      \"MessageId\": \"5\",\n      \"MessageType\": \"ua-data\",\n      \"PublisherId\": \"opc.tcp://localhost:54340/UA/SampleServer_5CB8F1A5\",\n      \"Messages\": [\n        {\n          \"DataSetWriterId\": \"SIMPLE-EVENTS\",\n          \"MetaDataVersion\": {\n            \"MajorVersion\": 1222304426,\n            \"MinorVersion\": 3462403799\n          },\n          \"MessageType\": \"ua-event\",\n          \"Payload\": {\n            \"EventId\": {\n              \"Type\": \"ByteString\",\n              \"Body\": \"88C2T817uUWMVNDclyOFnA==\"\n            },\n            \"Message\": {\n              \"Type\": \"LocalizedText\",\n              \"Body\": {\n                \"Text\": \"The system cycle \\u00275\\u0027 has started.\",\n                \"Locale\": \"en-US\"\n              }\n            },\n            \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n              \"Type\": \"String\",\n              \"Body\": \"5\"\n            },\n            \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n              \"Type\": \"ExtensionObject\",\n              \"Body\": {\n                \"TypeId\": \"http://opcfoundation.org/SimpleEvents#i=183\",\n                \"Encoding\": \"Json\",\n                \"Body\": {\n                  \"Name\": \"Step 1\",\n                  \"Duration\": 1000.0\n                }\n              }\n            }\n          }\n        }\n      ]\n    }\n  ],\n  \"enqueuedTime\": \"Mon Jun 21 2021 14:45:22 GMT+0200 (Central European Summer Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-network-message-json-v1\",\n    \"iothub-message-schema\": \"application/ua+json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nThis JSON contains the metadata information to decode each variant value.\n\n### Pending Alarm snapshots\n\nThe OPC Publisher also supports sending Pending Alarms (or conditions) which are events that are associated with a condition, as described in the user guide for [configuration of events](./readme.md#configuring-event-subscriptions). When this feature is enabled, it will listen to all ConditionType derived events and cache all that have has the `Retain` property set to true. It will then periodically generate output to broadcast the condition case still being in effect.\n\nWhen running against the OPC Foundation's Alarms & Conditions reference server sample the output will look like this:\n\n```json\n{\n  \"body\": [\n    {\n      \"MessageId\": \"34\",\n      \"MessageType\": \"ua-data\",\n      \"PublisherId\": \"PENDING-ALARMS\",\n      \"DataSetWriterGroup\": \"PENDING-ALARMS\",\n      \"Messages\": [\n        {\n          \"DataSetWriterId\": \"PENDING-ALARMS\",\n          \"MetaDataVersion\": {\n            \"MajorVersion\": 1,\n            \"MinorVersion\": 0\n          },\n          \"MessageType\": \"ua-condition\",\n          \"Payload\": {\n            \"EventId\": \"PQpa0fNNwUym272/HW40ww==\",\n            \"EventType\": \"i=2830\",\n            \"LocalTime\": {\n              \"Offset\": 60,\n              \"DaylightSavingInOffset\": true\n            },\n            \"Message\": \"The dialog was activated\",\n            \"ReceiveTime\": \"2022-12-20T17:03:02.1338153Z\",\n            \"Severity\": 100,\n            \"SourceName\": \"EastTank\",\n            \"SourceNode\": \"http://opcfoundation.org/AlarmCondition#s=1%3aColours%2fEastTank\",\n            \"Time\": \"2022-12-20T17:03:02.1338153Z\"\n          }\n        }\n      ]\n    }\n  ],\n  \"enqueuedTime\": \"Mon Jun 21 2021 14:56:53 GMT+0200 (Central European Summer Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-network-message-json-v1\",\n    \"iothub-message-schema\": \"application/ua+json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nThe important part to highlight here is that the payload is an array of events which have the Retain property set to true. Otherwise it's very similar to value change messages earlier.\n\n### Keep Alive messages\n\nKeep alive messages must be explicitly enabled (since they potentially consume bandwidth and cost). To Enable them for the OPC Publisher use the `--ka` [command line](./commandline.md) argument or enable it for a specific `DataSetWriter` in the [configuration](./readme.md#configuration-schema). [Samples](#samples-mode-encoding-legacy) mode does not support keep alive messages even when enabled.\n\nKeep alive messages are part of the network message. A network message can contain more data sets from other writers that are also keep alive messages or of other message types.  A simple keep alive message is shown here:\n\n```json\n{\n  \"body\": {\n    \"MessageId\": \"64\",\n    \"MessageType\": \"ua-data\",\n    \"PublisherId\": \"MyPublisher\",\n    \"Messages\": [\n      {\n        \"DataSetWriterId\": 1,\n        \"DataSetWriterName\": \"DataSet33\",\n        \"SequenceNumber\": 66,\n        \"MetaDataVersion\": {\n          \"MajorVersion\": 1,\n          \"MinorVersion\": 0\n        },\n        \"MessageType\": \"ua-keepalive\",\n        \"Timestamp\": \"2023-03-18T12:55:21.3423234Z\"\n      }\n    ]\n  }\n}\n```\n\n## Samples mode encoding (Legacy)\n\n> IMPORTANT: Legacy `Samples` encoding mode is a message format that predates OPC UA PubSub message encoding and is thus considered legacy and not standards conform. We might decide to not support the non standards compliant Samples mode in future versions of OPC Publisher.\n\n### Value change messages in Samples mode\n\nIn samples mode value change messages look like this:\n\n```json\n{\n  \"body\": {\n    \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n    \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n    \"ApplicationUri\": \"urn:OpcPlc:opcplc\",\n    \"DisplayName\": \"StepUp\",\n    \"Timestamp\": \"2022-03-18T12:52:42.137703Z\",\n    \"Value\": {\n      \"Value\": 21713,\n      \"SourceTimestamp\": \"2022-03-18T12:52:42.1327544Z\",\n      \"ServerTimestamp\": \"2022-03-18T12:52:42.1327633Z\"\n    },\n    \"SequenceNumber\": 120,\n    \"ExtensionFields\": {\n      \"PublisherId\": \"opc.tcp://opcplc:50000_D09D61EF\",\n      \"DataSetWriterId\": \"1000\"\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 13:52:42 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nTo provide compatibility with new version of the IIoT Platform's telemetry processors the OPC Publisher should be started in standalone mode with `--fm=true` argument and produces messages like shown here:\n\n```json\n{\n  \"body\": {\n    \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=RandomUnsignedInt32\",\n    \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n    \"ApplicationUri\": \"urn:OpcPlc:opcplc\",\n    \"Timestamp\": \"2022-03-18T12:58:45.6660994Z\",\n    \"Value\": {\n      \"Value\": 1059185306,\n      \"SourceTimestamp\": \"2022-03-18T12:58:45.6329923Z\",\n      \"ServerTimestamp\": \"2022-03-18T12:58:45.6331823Z\"\n    },\n    \"SequenceNumber\": 22,\n    \"ExtensionFields\": {\n      \"PublisherId\": \"opc.tcp://opcplc:50000_D3C751BF\",\n      \"DataSetWriterId\": \"1000\"\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 13:58:45 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n\n{\n  \"body\": {\n    \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=BadFastUInt1\",\n    \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n    \"ApplicationUri\": \"urn:OpcPlc:opcplc\",\n    \"Timestamp\": \"2022-03-18T12:58:41.6538735Z\",\n    \"Value\": {\n      \"StatusCode\": {\n        \"Symbol\": \"BadNoCommunication\",\n        \"Code\": 2150694912\n      },\n      \"SourceTimestamp\": \"2022-03-18T12:58:40.840659Z\",\n      \"ServerTimestamp\": \"2022-03-18T12:58:40.8406599Z\"\n    },\n    \"SequenceNumber\": 18,\n    \"ExtensionFields\": {\n      \"PublisherId\": \"opc.tcp://opcplc:50000_D3C751BF\",\n      \"DataSetWriterId\": \"1000\"\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 13:58:41 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nThe following message is an example with batching/bulk mode enabled. Here OPC Publisher was started with the `--bs=5` argument, where 5 is the number of messages to be batched.\n\n```json\n\n  \"body\": [\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"ApplicationUri\": \"urn:OpcPlc:opcplc\",\n      \"Timestamp\": \"2022-03-18T13:01:56.7551553Z\",\n      \"Value\": {\n        \"Value\": false,\n        \"SourceTimestamp\": \"2022-03-18T13:01:55.9333398Z\",\n        \"ServerTimestamp\": \"2022-03-18T13:01:55.933447Z\"\n      },\n      \"SequenceNumber\": 22,\n      \"ExtensionFields\": {\n        \"PublisherId\": \"opc.tcp://opcplc:50000_9C43F84E\",\n        \"DataSetWriterId\": \"1000\"\n      }\n    },\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"ApplicationUri\": \"urn:OpcPlc:opcplc\",\n      \"Timestamp\": \"2022-03-18T13:01:56.7551553Z\",\n      \"Value\": {\n        \"Value\": 27259,\n        \"SourceTimestamp\": \"2022-03-18T13:01:56.7393301Z\",\n        \"ServerTimestamp\": \"2022-03-18T13:01:56.7401032Z\"\n      },\n      \"SequenceNumber\": 22,\n      \"ExtensionFields\": {\n        \"PublisherId\": \"opc.tcp://opcplc:50000_9C43F84E\",\n        \"DataSetWriterId\": \"1000\"\n      }\n    },\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=RandomSignedInt32\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"ApplicationUri\": \"urn:OpcPlc:opcplc\",\n      \"Timestamp\": \"2022-03-18T13:01:56.7551553Z\",\n      \"Value\": {\n        \"Value\": -2127202062,\n        \"SourceTimestamp\": \"2022-03-18T13:01:56.7393504Z\",\n        \"ServerTimestamp\": \"2022-03-18T13:01:56.7398952Z\"\n      },\n      \"SequenceNumber\": 22,\n      \"ExtensionFields\": {\n        \"PublisherId\": \"opc.tcp://opcplc:50000_9C43F84E\",\n        \"DataSetWriterId\": \"1000\"\n      }\n    },\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=RandomUnsignedInt32\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"ApplicationUri\": \"urn:OpcPlc:opcplc\",\n      \"Timestamp\": \"2022-03-18T13:01:56.7551553Z\",\n      \"Value\": {\n        \"Value\": 456421443,\n        \"SourceTimestamp\": \"2022-03-18T13:01:56.739439Z\",\n        \"ServerTimestamp\": \"2022-03-18T13:01:56.7395003Z\"\n      },\n      \"SequenceNumber\": 22,\n      \"ExtensionFields\": {\n        \"PublisherId\": \"opc.tcp://opcplc:50000_9C43F84E\",\n        \"DataSetWriterId\": \"1000\"\n      }\n    },\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=BadFastUInt1\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"ApplicationUri\": \"urn:OpcPlc:opcplc\",\n      \"Timestamp\": \"2022-03-18T13:01:56.7551553Z\",\n      \"Value\": {\n        \"Value\": 5,\n        \"SourceTimestamp\": \"2022-03-18T13:01:55.8426847Z\",\n        \"ServerTimestamp\": \"2022-03-18T13:01:55.8427264Z\"\n      },\n      \"SequenceNumber\": 22,\n      \"ExtensionFields\": {\n        \"PublisherId\": \"opc.tcp://opcplc:50000_9C43F84E\",\n        \"DataSetWriterId\": \"1000\"\n      }\n    }\n  ],\n  \"enqueuedTime\": \"Fri Mar 18 2022 14:01:56 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nTo provide compatible with the Connected Factory 1.0 and versions of OPC Publisher <= 2.5, OPC Publisher can be started in standalone mode with `--fm=false` argument:\n\n```json\n{\n  \"body\": {\n    \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n    \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n    \"Value\": {\n      \"Value\": 28679,\n      \"SourceTimestamp\": \"2022-03-18T13:04:18.7244388Z\"\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 14:04:18 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nor\n\n```json\n{\n  \"body\": {\n    \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=BadFastUInt1\",\n    \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n    \"Value\": {\n      \"Value\": 4,\n      \"StatusCode\": {\n        \"Symbol\": \"UncertainLastUsableValue\",\n        \"Code\": 1083179008\n      },\n      \"SourceTimestamp\": \"2022-03-18T13:04:14.8405063Z\"\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 14:04:15 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nIn this case, if OPC Publisher is started in bulk mode with `--bs=5` argument a message would look like:\n\n```json\n{\n  \"body\": [\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"Value\": {\n        \"Value\": true,\n        \"SourceTimestamp\": \"2022-03-18T13:06:30.932775Z\"\n      }\n    },\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"Value\": {\n        \"Value\": 30003,\n        \"SourceTimestamp\": \"2022-03-18T13:06:31.1337676Z\"\n      }\n    },\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=RandomSignedInt32\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"Value\": {\n        \"Value\": -2052144044,\n        \"SourceTimestamp\": \"2022-03-18T13:06:31.1338343Z\"\n      }\n    },\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=RandomUnsignedInt32\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"Value\": {\n        \"Value\": 186770890,\n        \"SourceTimestamp\": \"2022-03-18T13:06:31.1339985Z\"\n      }\n    },\n    {\n      \"NodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=BadFastUInt1\",\n      \"EndpointUrl\": \"opc.tcp://opcplc:50000/\",\n      \"Value\": {\n        \"StatusCode\": {\n          \"Symbol\": \"BadNoCommunication\",\n          \"Code\": 2150694912\n        },\n        \"SourceTimestamp\": \"2022-03-18T13:06:30.8423538Z\"\n      }\n    }\n  ],\n  \"enqueuedTime\": \"Fri Mar 18 2022 14:06:31 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\n### Event messages in Samples mode\n\nThe following sample messages show how events look like in legacy samples mode:\n\n```json\n{\n  \"body\": {\n    \"NodeId\": \"i=2253\",\n    \"EndpointUrl\": \"opc.tcp://localhost:57965/UA/SampleServer\",\n    \"DisplayName\": \"SimpleEvents\",\n    \"Value\": {\n      \"EventId\": \"JdRhF43ktkKvJBrk\\u002BsePkg==\",\n      \"Message\": \"The system cycle \\u00271\\u0027 has started.\",\n      \"http://opcfoundation.org/SimpleEvents#CycleId\": \"1\",\n      \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n        \"Name\": \"Step 1\",\n        \"Duration\": 1000.0\n      }\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 14:04:18 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nWith `--fm=True` enabling full featured messages, these would then look like:\n\n```json\n{\n  \"body\": {\n    \"NodeId\": \"i=2253\",\n    \"EndpointUrl\": \"opc.tcp://localhost:56769/UA/SampleServer\",\n    \"ApplicationUri\": \"urn:SampleServer\",\n    \"DisplayName\": \"SimpleEvents\",\n    \"Timestamp\": \"2022-12-05T11:00:18.1907826Z\",\n    \"Value\": {\n      \"EventId\": \"MB0Xs/BZ5US/BeKOUtsL8A==\",\n      \"Message\": \"The system cycle \\u00273\\u0027 has started.\",\n      \"http://opcfoundation.org/SimpleEvents#CycleId\": \"3\",\n      \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n        \"Name\": \"Step 1\",\n        \"Duration\": 1000.0\n      }\n    },\n    \"SequenceNumber\": 2,\n    \"ExtensionFields\": {\n      \"PublisherId\": \"opc.tcp://localhost:56769/UA/SampleServer_59F0BDE1\",\n      \"DataSetWriterId\": \"1000\"\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 14:04:18 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nPending Alarms (or conditions) sent in Samples mode look as follows:\n\n```json\n{\n  \"body\": {\n    \"NodeId\": \"i=2253\",\n    \"EndpointUrl\": \"opc.tcp://localhost:56692/UA/SampleServer\",\n    \"DisplayName\": \"PendingAlarms\",\n    \"Value\": {\n      \"EventId\": \"xW5uvGPSuUWBdvp8IfSueQ==\",\n      \"EventType\": \"i=2830\",\n      \"LocalTime\": {\n        \"Offset\": 60,\n        \"DaylightSavingInOffset\": true\n      },\n      \"Message\": \"The dialog was activated\",\n      \"ReceiveTime\": \"2022-12-20T15:53:10.3815705Z\",\n      \"Severity\": 100,\n      \"SourceName\": \"EastTank\",\n      \"SourceNode\": \"http://opcfoundation.org/AlarmCondition#s=1%3aColours%2fEastTank\",\n      \"Time\": \"2022-12-20T15:53:10.3815705Z\"\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 14:04:18 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n\nFinally, using reversable mode, legacy samples messages will look as follows:\n\n```json\n{\n  \"body\":   {\n    \"NodeId\": \"i=2253\",\n    \"EndpointUrl\": \"opc.tcp://localhost:54040/UA/SampleServer\",\n    \"DisplayName\": \"SimpleEvents\",\n    \"Value\": {\n      \"Type\": \"ExtensionObject\",\n      \"Body\": {\n        \"TypeId\": \"http://microsoft.com/Industrial-IoT/OpcPublisher#i=1\",\n        \"Encoding\": \"Json\",\n        \"Body\": {\n          \"EventId\": {\n            \"Type\": \"ByteString\",\n            \"Body\": \"xbAm3QTXwEKsVZFcsHSdzA==\"\n          },\n          \"Message\": {\n            \"Type\": \"LocalizedText\",\n            \"Body\": {\n              \"Text\": \"The system cycle \\u00271\\u0027 has started.\",\n              \"Locale\": \"en-US\"\n            }\n          },\n          \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n            \"Type\": \"String\",\n            \"Body\": \"1\"\n          },\n          \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n            \"Type\": \"ExtensionObject\",\n            \"Body\": {\n              \"TypeId\": \"http://opcfoundation.org/SimpleEvents#i=183\",\n              \"Encoding\": \"Json\",\n              \"Body\": {\n                \"Name\": \"Step 1\",\n                \"Duration\": 1000.0\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"enqueuedTime\": \"Fri Mar 18 2022 14:04:18 GMT+0100 (Central European Standard Time)\",\n  \"properties\": {\n    \"$$ContentType\": \"application/x-monitored-item-json-v1\",\n    \"iothub-message-schema\": \"application/json\",\n    \"$$ContentEncoding\": \"utf-8\"\n  }\n}\n```\n"
  },
  {
    "path": "docs/opc-publisher/migrationpath.md",
    "content": "# Migrate from previous versions of OPC Publisher to 2.9 and higher  <!-- omit in toc -->\n\n[Home](./readme.md)\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Why the changes from 2.8 to 2.9?](#why-the-changes-from-28-to-29)\n- [Breaking changes](#breaking-changes)\n  - [Migrating Cosmos DB job definitions](#migrating-cosmos-db-job-definitions)\n- [Upgrading OPC Publisher published nodes configuration file (pn.json)](#upgrading-opc-publisher-published-nodes-configuration-file-pnjson)\n- [Command Line Arguments](#command-line-arguments)\n  - [OPC Publisher 2.5.x Command Line Arguments supported in 2.8.2 or higher](#opc-publisher-25x-command-line-arguments-supported-in-282-or-higher)\n- [Direct Method compatibility](#direct-method-compatibility)\n- [OPC Publisher 2.5.x direct methods supported in 2.8.2](#opc-publisher-25x-direct-methods-supported-in-282)\n  - [PublishNodes (PublishNodes\\_V1)](#publishnodes-publishnodes_v1)\n  - [GetConfiguredEndpoints (GetConfiguredEndpoints\\_V1)](#getconfiguredendpoints-getconfiguredendpoints_v1)\n  - [GetConfiguredNodesOnEndpoint (GetConfiguredNodesOnEndpoint\\_V1)](#getconfigurednodesonendpoint-getconfigurednodesonendpoint_v1)\n  - [GetDiagnosticInfo (GetDiagnosticInfo\\_V1)](#getdiagnosticinfo-getdiagnosticinfo_v1)\n  - [UnpublishNodes (UnpublishNodes\\_V1)](#unpublishnodes-unpublishnodes_v1)\n  - [UnpublishAllNodes (UnpublishAllNodes\\_V1)](#unpublishallnodes-unpublishallnodes_v1)\n- [OPC Publisher 2.5.x direct methods not supported in 2.8.2](#opc-publisher-25x-direct-methods-not-supported-in-282)\n  - [GetDiagnosticLog](#getdiagnosticlog)\n  - [GetDiagnosticStartupLog](#getdiagnosticstartuplog)\n  - [ExitApplication](#exitapplication)\n  - [GetInfo](#getinfo)\n\n## Why the changes from 2.8 to 2.9?\n\nCustomers told us they want to leverage the capabilities of OPC Twin. However, deploying and operating a micro service architecture is often times too costly and too difficult for them. Many times customers were already using an Azure IoT Hub instance to manage other devices and wanted to leverage this instance also for OPC UA enabled assets. What they were looking for was the standalone version of OPC Publisher but with its capabilities extended to provide read/write/call capabilities also.\n\nWe also found significant problems with the orchestration approach in OPC Publisher to continue its development. For one, the size constraints imposed by keeping the entire configuration of a publisher in a single document in Cosmos DB became an issue for some customers.  And the overhead of the communication between publisher and cloud services and the need for a second cloud connection bypassing IoT Edge were a problem for stable and reliable production use.\n\nWe reacted by combining all 3 edge modules into OPC Publisher 2.9 and combining all cloud services into a single web service that is now optional. Yes, you can directy interact with OPC Publisher through IoT Hub or MQTT/HTTP (Preview). We also updated OPC Publisher to leverage .net 8 performance improvements and to use more defensive coding and code analysis moving the code base forward.\n\n## Breaking changes\n\nWe provided backwards compatibility (e.g., you need to use the `-c`, `--strict` command line argument to enable standards compliance) in OPC Publisher. *OPC Publisher 2.9 is therefore a drop in replacement for OPC Publisher 2.8 in standalone mode* with the following exceptions:\n\n- Log levels specified through the `--loglevel` [command line option](./commandline.md) have been aligned to standard .net log levels, e.g., to specify verbose logging, use `Trace`.\n\nHowever, if you were using the 2.8 micro services before then you must be aware of the following breaking changes:\n\n- Due to the simplification of the cloud services we **removed the IAI installer and Helm chart** support. It is still possible to deploy the web api container in AKS but we do not provide any tooling to do that.\n- OPC Publisher 2.9 **removes \"orchestrated mode\"**. This means you must [migrate your Cosmos DB job definitions](#migrating-cosmos-db-job-definitions) using the migration tooling.\n- We also removed the **telemetry processors** and the secondary event hub to read the proprietary data set messages from. To migrate change your event hub processor or ingestion code to read OPC Publisher telemetry messages directly from IoT Hub event hub compatible endpoint.\n- We retained Open API compatibility to the 2.8 cloud service API in the new OPC Publisher cloud web service's API. This includes using the same route paths as in the AKS hosted version of the 2.8 platform. However, the following **API changes** were made:\n  - OPC Publisher 2.9 does not support activation and deactivation of Endpoint Twins, which allowed OPC Twin endpoints to be addressed with a IoT Hub device id. Instead all API's must be invoked with a `ConnectionModel` parameter (`connection`) and the original request model.\n  - The concept of supervisor (the OPC Twin module instance) and discoverer (the OPC Discovery module instance) are completely equivalent to the publisher concept in 2.9. The supervisor, discovery, and publisher REST APIs have been retained for backwards compatibility and return the same information which is the twin of the Publisher module.  However, this also means there is no migration from OPC Twin or OPC Discovery to OPC Publisher 2.9, settings have to be re-applied.\n  - With removal of the database and orchestrated mode we changed the existing Publishing API to directly update the publisher configuration which has different performance characteristics than in 2.8 especially for the bulk publishing API.\n  - The GetSupervisorStatus and ResetSupervisor API has been removed without replacement.\n  - GetEndpointCertificate API now returns a `X509CertificateChainModel` instead of a byte array in 2.8.\n  - OPC Discovery capabilities are integrated into OPC Publisher 2.9.\n\n### Migrating Cosmos DB job definitions\n\nCOMING SOON\n\n## Upgrading OPC Publisher published nodes configuration file (pn.json)\n\nOPC Publisher can consume published nodes JSON files version 2.5.x or higher without any modifications.\n\nEach OPC Publisher since has added new fields to configure publishing but maintained backwards compatibilty with older versions, such as 2.5.*x*.\n\nThe full schema of published nodes JSON file that works in all versions since 2.5.* looks like this:\n\n```json\n[\n  {\n    \"EndpointUrl\": \"string\",\n    \"UseSecurity\": \"boolean\",\n    \"OpcAuthenticationMode\": \"string\",\n    \"OpcAuthenticationUsername\": \"string\",\n    \"OpcAuthenticationPassword\": \"string\",\n    \"DataSetWriterGroup\": \"string\",\n    \"DataSetWriterId\": \"string\",\n    \"DataSetPublishingInterval\": \"integer\",\n    \"DataSetPublishingIntervalTimespan\": \"string\",\n    \"Tag\": \"string\",\n    \"OpcNodes\": [\n      {\n        \"Id\": \"string\",\n        \"ExpandedNodeId\": \"string\",\n        \"DataSetFieldId \": \"string\",\n        \"DisplayName\": \"string\",\n        \"OpcSamplingInterval\": \"integer\",\n        \"OpcSamplingIntervalTimespan\": \"string\",\n        \"OpcPublishingInterval\": \"integer\",\n        \"OpcPublishingIntervalTimespan\": \"string\",\n        \"HeartbeatInterval\": \"integer\",\n        \"HeartbeatIntervalTimespan\": \"string\",\n        \"SkipFirst\": \"bool\",\n        \"QueueSize\": \"integer\"\n      }\n    ]\n  }\n]\n```\n\nFor details of each field you can consult the [direct methods API documentation](./directmethods.md) as the fields of published nodes JSON schema map directly to that of direct method API calls.\nThe only difference is that `OpcAuthenticationUsername` and `OpcAuthenticationPassword` are refereed to as `UserName` and `Password` in direct method API calls.\n\nPlease note that OPC Publisher 2.9 can still consume legacy `NodeId`-based node definitions (as can be found in [`publishednodes_2.5.json`](publishednodes_2.5.json?raw=1)), but we strongly recommend to use `OpcNodes`-based definitions instead. Please consider migrating your old published nodes JSON files that use `NodeId` to the newer schema.\n\n## Command Line Arguments\n\nTo learn more about how to use comman-line arguments to configure OPC Publisher, please refer to [this](./commandline.md) doc.\n\n### OPC Publisher 2.5.x Command Line Arguments supported in 2.8.2 or higher\n\nAny removed command line arguments will still silently work.\n\nThe following table describes the command line arguments, which were available in OPC Publisher 2.5.x and their compatibility in OPC Publisher 2.8.2 and above.\n\n| **Command Line Options**                |  **in 2.8.2 and above**  | **Alternative** |\n|--------------------------------------   |--------------------------|-----------------|\n| --pf, --publishfile=VALUE               |  yes                     |                 |\n| --tc, --telemetryconfigfile=VALUE       |  no                      |                 |\n| --s, --site=VALUE                       |  yes                     |                 |\n| --ic, --iotcentral                      |  no                      |                 |\n| --sw, --sessionconnectwait=VALUE        |  no                      |                 |\n| --mq, --monitoreditemqueuecapacity=VALUE|  no                      | use --om, --maxoutgressmessages=VALUE |\n| --di, --diagnosticsinterval=VALUE       |  yes                     |                 |\n| --ns, --noshutdown=VALUE                |  no                      |                 |\n| --rf, --runforever                      |  no                      |                 |\n| --lf, --logfile=VALUE                   |  no                      | IoT Edge support bundle or live logs |\n| --lt, --logflushtimespan=VALUE          |  no                      | IoT Edge support bundle or live logs |\n| --ll, --loglevel=VALUE                  |  yes                     |                 |\n| --ih, --iothubprotocol=VALUE            |  yes                     |                 |\n| --ms, --iothubmessagesize=VALUE         |  yes                     |                 |\n| --si, --iothubsendinterval=VALUE        |  yes                     |                 |\n| --dc, --deviceconnectionstring=VALUE    |  yes                     |                 |\n| --c, --connectionstring=VALUE           |  no                      | use --dc, --deviceconnectionstring=VALUE |\n| --hb, --heartbeatinterval=VALUE         |  yes                     |                 |\n| --sf, --skipfirstevent=VALUE            |  yes (2.9.0 or above)    | same as --skipfirst=VALUE |\n| --pn, --portnum=VALUE                   |  no                      |                 |\n| --pa, --path=VALUE                      |  no                      |                 |\n| --lr, --ldsreginterval=VALUE            |  no                      |                 |\n| --ol, --opcmaxstringlen=VALUE           |  yes                     |                 |\n| --ot, --operationtimeout=VALUE          |  yes                     |                 |\n| --oi, --opcsamplinginterval=VALUE       |  yes                     |                 |\n| --op, --opcpublishinginterval=VALUE     |  yes                     |                 |\n| --ct, --createsessiontimeout=VALUE      |  yes                     |                 |\n| --ki, --keepaliveinterval=VALUE         |  yes                     |                 |\n| --kt, --keepalivethreshold=VALUE        |  yes                     |                 |\n| --aa, --autoaccept                      |  yes                     |                 |\n| --tm, --trustmyself=VALUE               |  yes                     |                 |\n| --to, --trustowncert                    |  no                      | same as --tm, --trustmyself |\n| --fd, --fetchdisplayname=VALUE          |  yes                     |                 |\n| --fn, --fetchname                       |  no                      | same as --fd, --fetchdisplayname |\n| --ss, --suppressedopcstatuscodes=VALUE  |  no                      |                 |\n| --at, --appcertstoretype=VALUE          |  yes                     |                 |\n| --ap, --appcertstorepath=VALUE          |  yes                     |                 |\n| --tp, --trustedcertstorepath=VALUE      |  yes                     |                 |\n| --rp, --rejectedcertstorepath=VALUE     |  yes                     |                 |\n| --ip, --issuercertstorepath=VALUE       |  yes                     |                 |\n| --csr                                   |  no                      |                 |\n| --ab, --applicationcertbase64=VALUE     |  no                      |                 |\n| --af, --applicationcertfile=VALUE       |  no                      |                 |\n| --pb, --privatekeybase64=VALUE          |  no                      |                 |\n| --pk, --privatekeyfile=VALUE            |  no                      |                 |\n| --cp, --certpassword=VALUE              |  no                      |                 |\n| --tb, --addtrustedcertbase64=VALUE      |  no                      |                 |\n| --tf, --addtrustedcertfile=VALUE        |  no                      |                 |\n| --ib, --addissuercertbase64=VALUE       |  no                      |                 |\n| --if, --addissuercertfile=VALUE         |  no                      |                 |\n| --rb, --updatecrlbase64=VALUE           |  no                      |                 |\n| --uc, --updatecrlfile=VALUE             |  no                      |                 |\n| --rc, --removecert=VALUE                |  no                      |                 |\n| --dt, --devicecertstoretype=VALUE       |  no                      |                 |\n| --dp, --devicecertstorepath=VALUE       |  no                      |                 |\n| -i, --install                           |  no                      |                 |\n| -h, --help                              |  yes                     |                 |\n| --st, --opcstacktracemask=VALUE         |  no                      |                 |\n| --sd, --shopfloordomain=VALUE           |  no                      |  same as --s, --site option |\n| --vc, --verboseconsole=VALUE            |  no                      |                 |\n| --as, --autotrustservercerts=VALUE      |  no                      |  same as --aa, --acceptuntrusted |\n|       --autoaccept=VALUE                |  yes                     |  same as --aa, --acceptuntrusted  |\n| --tt, --trustedcertstoretype=VALUE      |  no                      |  env variable TrustedPeerCertificatesType=VALUE  |\n| --rt, --rejectedcertstoretype=VALUE     |  no                      |  env variable RejectedCertificateStoreType=VALUE |\n| --it, --issuercertstoretype=VALUE       |  no                      |  env variable TrustedIssuerCertificatesType=VALUE  |\n\n## Direct Method compatibility\n\nOPC Publisher version 2.8.2 and above implements [IoT Hub Direct Methods](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-direct-methods), which can be called from applications using the [IoT Hub Device SDK](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-sdks).\n\nThe direct method request payload of OPC Publisher 2.8.2 and above is backwards compatible with OPC Publisher 2.5.x direct methods. The payload schema allows also configuration of attributes introduced in `pn.json` in OPC Publisher 2.6.x and above (for example: DataSetWriterGroup, DataSetWriterId, QueueSize per node, ...)\n\n**Limitations:** Continuation points for GetConfiguredEndpoints and GetConfiguredNodesOnEndpoint aren't available in 2.8.2 or above. Instead a chunking protocol is used when the .net sdk packages are used.\n\n**Note:** The objects and primitives names in the direct method payload api model are camel case formatted in 2.8.2. This follows the guidelines of the rest of the api models through the IIoT Platform. Since the names in json payloads in 2.5.x are pascal case formed, we highly recommend enabling case-insensitive Json parsing in your direct methods based configuration tool. You can find details on json case-insensitive serialization here: [how to enable case-insensitive property name matching with System.Text.Json](https://docs.microsoft.com/dotnet/standard/serialization/system-text-json-character-casing), or here: [Newtonsoft Json Serialization Naming Strategy](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Serialization_DefaultNamingStrategy.htm)\n\n## OPC Publisher 2.5.x direct methods supported in 2.8.2\n\nThe following table describes the direct methods, which were available in OPC Publisher 2.5.x with their request and response payloads.\n\n| **MethodName**                   | **Request**                                                     | **Response**                                                                                                                                                                 | **in 2.8.2 and above** |\n|----------------------------------|-----------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|\n| **PublishNodes**                 | EndpointUrl, List\\<OpcNodes\\>,  UseSecurity, UserName, Password | Status, List\\<StatusResponse\\>                                                                                                                                               | Yes                    |\n| **UnpublishNodes**               | EndpointUrl, List\\<OpcNodes\\>                                   | Status, List\\<StatusResponse\\>                                                                                                                                               | Yes                    |\n| **UnpublishAllNodes**            | EndpointUrl                                                     | Status, List\\<StatusResponse\\>                                                                                                                                               | Yes                    |\n| **GetConfiguredEndpoints**       | -                                                               | List\\<EndpointUrl\\>                                                                                                                                                          | Yes                    |\n| **GetConfiguredNodesOnEndpoint** | EndpointUrl                                                     | EndpointUrl, List< OpcNodeOnEndpointModel > where OpcNodeOnEndpointModel contains: Id ExpandedNodeId OpcSamplingInterval OpcPublishingInterval DisplayName HeartbeatInterval | Yes                    |\n| **GetDiagnosticInfo**            | -                                                               | DiagnosticInfoMethodResponseModel                                                                                                                                            | Yes                    |\n| **GetDiagnosticLog**             | -                                                               | MissedMessageCount, LogMessageCount, List\\<Log\\>                                                                                                                             | No*                    |\n| **GetDiagnosticStartupLog**      | -                                                               | MissedMessageCount, LogMessageCount, List\\<Log\\>                                                                                                                             | No*                    |\n| **ExitApplication**              | SecondsTillExit (optional)                                      | StatusCode, List\\<StatusResponse\\>                                                                                                                                           | No*                    |\n| **GetInfo**                      | -                                                               | GetInfoMethodResponseModel                                                                                                                                                   | No*                    |\n\n*This functionality is provided by direct methods of the IoT Edge `edgeAgent` module. For more information, see [\"Communicate with edgeAgent using built-in direct methods\"](https://docs.microsoft.com/azure/iot-edge/how-to-edgeagent-direct-method).\n\nAn outdated, archived [sample application](https://github.com/Azure-Samples/iot-edge-opc-publisher-nodeconfiguration) used to configure OPC Publisher 2.5.x can be used to configure OPC Publisher 2.8.2.\n\nFor new applications, direct method names with a `_V2` suffix should be used. For backward compatibility of older applications direct method names without the `_V2` suffix are supported, but are subject of deprecation.\n\n### PublishNodes (PublishNodes_V1)\n\n`Request`\n\n```json\n{\n   \"EndpointUrl\": \"opc.tcp://sandboxhost-637811493394507132:50000\",\n   \"UseSecurity\": false,\n   \"OpcNodes\":[\n      {\n         \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/Boiler;s=Boiler\"\n      },\n      {\n         \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=65e451f1-56f1-ce84-a44f-6addf176beaf\"\n      },\n      {\n         \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\"\n      }\n   ]\n}\n```\n\n`Response` (2.5.x)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": [\n      \"'nsu=http://microsoft.com/Opc/OpcPlc/Boiler;s=Boiler': added\",\n      \"'nsu=http://microsoft.com/Opc/OpcPlc/;s=65e451f1-56f1-ce84-a44f-6addf176beaf': added\",\n      \"'nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1': added\"\n   ]\n}\n```\n\n`Response` (2.8.2)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": {}\n}\n```\n\n### GetConfiguredEndpoints (GetConfiguredEndpoints_V1)\n\n`Request`\n\n {}\n\n`Response` (2.5.x)\n\nWithout any configured endpoints:\n\n```json\n{\n   \"status\": 200,\n   \"payload\":\n   {\n      \"Endpoints\": []\n   }\n}\n```\n\nWith configured endpoints:\n\n```json\n{\n   \"status\": 200,\n   \"payload\":\n   {\n      \"Endpoints\": [\n         {\n            \"EndpointUrl\":\"opc.tcp://sandboxhost-637811493394507132:50000\"\n         }\n      ]\n   }\n}\n```\n\n`Response` (2.8.2)\n\nWithout configured endpoints:\n\n```json\n{\n   \"status\": 200,\n   \"payload\":\n   {\n      \"endpoints\": []\n   }\n}\n```\n\nWith configured endpoints:\n\n```json\n{\n   \"status\": 200,\n   \"payload\":\n   {\n      \"endpoints\": [\n         {\n            \"endpointUrl\":\"opc.tcp://sandboxhost-637811493394507132:50000\"\n         }\n      ]\n   }\n}\n```\n\n### GetConfiguredNodesOnEndpoint (GetConfiguredNodesOnEndpoint_V1)\n\n`Request`\n\n```json\n{\n   \"EndpointUrl\": \"opc.tcp://sandboxhost-637811493394507132:50000\"\n}\n```\n\n`Response` (2.5.x)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": {\n      \"EndpointUrl\": \"opc.tcp://sandboxhost-637811493394507132:50000\",\n      \"OpcNodes\": [\n         {\n            \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/Boiler;s=Boiler\"\n         },\n         {\n            \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=65e451f1-56f1-ce84-a44f-6addf176beaf\"\n         },\n         {\n            \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\"\n         }\n      ]\n   }\n}\n```\n\nIf `UnpublishAllNodes` is called on that endpoint, then the response will be:\n\n```json\n{\n   \"status\": 200,\n   \"payload\": {\n      \"endpointUrl\": \"opc.tcp://sandboxhost-637811493394507132:50000\",\n      \"opcNodes\": []\n   }\n}\n```\n\n`Response` (2.8.2)\n\n```json\n{\n   \"status\":200,\n   \"payload\":\n   {\n      \"opcNodes\": [\n         {\n            \"id\": \"nsu=http://microsoft.com/Opc/OpcPlc/Boiler;s=Boiler\"\n         },\n         {\n            \"id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=65e451f1-56f1-ce84-a44f-6addf176beaf\"\n         },\n         {\n            \"id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\"\n         }\n      ]\n   }\n}\n```\n\nIf the endpoint isn't configured or `UnpublishAllNodes` is called on that endpoint, then the response will be:\n\n```json\n{\n   \"status\": 404,\n   \"payload\": \"Endpoint not found: opc.tcp://sandboxhost-637811493394507132:50000/\"\n}\n```\n\n### GetDiagnosticInfo (GetDiagnosticInfo_V1)\n\n`Request`\n{}\n\n`Response`  (2.5.x)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": {\n      \"PublisherStartTime\": \"2022-02-22T18:07:56.363511Z\",\n      \"NumberOfOpcSessionsConfigured\": 1,\n      \"NumberOfOpcSessionsConnected\": 0,\n      \"NumberOfOpcSubscriptionsConfigured\": 1,\n      \"NumberOfOpcSubscriptionsConnected\": 0,\n      \"NumberOfOpcMonitoredItemsConfigured\": 3,\n      \"NumberOfOpcMonitoredItemsMonitored\": 0,\n      \"NumberOfOpcMonitoredItemsToRemove\": 0,\n      \"MonitoredItemsQueueCapacity\": 8192,\n      \"MonitoredItemsQueueCount\": 0,\n      \"EnqueueCount\": 13060,\n      \"EnqueueFailureCount\": 0,\n      \"NumberOfEvents\": 13060,\n      \"SentMessages\": 30,\n      \"SentLastTime\": \"2022-02-22T19:03:39.3249082Z\",\n      \"SentBytes\": 3000192,\n      \"FailedMessages\": 0,\n      \"TooLargeCount\": 0,\n      \"MissedSendIntervalCount\": 8,\n      \"WorkingSetMB\": 118,\n      \"DefaultSendIntervalSeconds\": 10,\n      \"HubMessageSize\": 262144,\n      \"HubProtocol\": 3\n   }\n}\n```\n\n`Response` (2.8.2)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": [\n      {\n         \"endpoint\": {\n            \"endpointUrl\": \"opc.tcp://sandboxhost-637811493394507132:50000\",\n            \"dataSetWriterGroup\": \"Asset1\",\n            \"useSecurity\": false,\n            \"opcAuthenticationMode\": \"UsernamePassword\",\n            \"opcAuthenticationUsername\": \"Usr\"\n         },\n         \"sentMessagesPerSec\": 2.6,\n         \"ingestionDuration\": \"{00:00:25.5491702}\",\n         \"ingressDataChanges\": 25,\n         \"ingressValueChanges\": 103,\n         \"ingressBatchBlockBufferSize\": 0,\n         \"encodingBlockInputSize\": 0,\n         \"encodingBlockOutputSize\": 0,\n         \"encoderNotificationsProcessed\": 83,\n         \"encoderNotificationsDropped\": 0,\n         \"encoderIoTMessagesProcessed\": 2,\n         \"encoderAvgNotificationsMessage\": 41.5,\n         \"encoderAvgIoTMessageBodySize\": 6128,\n         \"encoderAvgIoTChunkUsage\": 1.158034,\n         \"estimatedIoTChunksPerDay\": 13526.858105160689,\n         \"outgressBatchBlockBufferSize\": 0,\n         \"outgressInputBufferCount\": 0,\n         \"outgressInputBufferDropped\": 0,\n         \"outgressIoTMessageCount\": 0,\n         \"connectionRetries\": 0,\n         \"opcEndpointConnected\": true,\n         \"monitoredOpcNodesSucceededCount\": 5,\n         \"monitoredOpcNodesFailedCount\": 0,\n         \"ingressEventNotifications\": 0,\n         \"ingressEvents\": 0\n      }\n   ]\n}\n```\n\n### UnpublishNodes (UnpublishNodes_V1)\n\nIf *OpcNodes* is omitted, then all nodes are unpublished and the endpoint is removed.\n\n`Request`\n\n```json\n{\n   \"EndpointUrl\": \"opc.tcp://sandboxhost-637811493394507132:50000\",\n   \"OpcNodes\": [\n      {\n         \"Id\":\"nsu=http://microsoft.com/Opc/OpcPlc/;s=65e451f1-56f1-ce84-a44f-6addf176beaf\"\n      }\n   ]\n}\n```\n\n`Response` (2.5.x)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": [\n      \"Id 'nsu=http://microsoft.com/Opc/OpcPlc/;s=65e451f1-56f1-ce84-a44f-6addf176beaf': tagged for removal\"\n   ]\n}\n```\n\n`Response` (2.8.2)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": {}\n}\n```\n\n### UnpublishAllNodes (UnpublishAllNodes_V1)\n\n`Request`\n\n```json\n{\n   \"EndpointUrl\": \"opc.tcp://sandboxhost-637811493394507132:50000\"\n}\n```\n\n`Response` (2.5.x)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": [\n      \"All monitored items in all subscriptions on endpoint 'opc.tcp://sandboxhost-637811493394507132:50000' tagged for removal\"\n   ]\n}\n```\n\n`Response` (2.8.2)\n\n```json\n{\n   \"status\": 200,\n   \"payload\": {}\n}\n```\n\n## OPC Publisher 2.5.x direct methods not supported in 2.8.2\n\nThe direct methods not available in OPC Publisher 2.8.2, there are changes required to apply to the applications, which do use them.\n\n### GetDiagnosticLog\n\nTo retrieve the logs of an IoT Edge module, please check the built-in direct methods provided by IoT Edge `edgeAgent` module [here](https://docs.microsoft.com/azure/iot-edge/how-to-retrieve-iot-edge-logs?view=iotedge-2020-11#retrieve-module-logs).\n\n### GetDiagnosticStartupLog\n\nTo get diagnostic info of OPC Publisher, please refer to this [link](https://docs.microsoft.com/azure/iot-edge/how-to-edgeagent-direct-method?view=iotedge-2020-11#diagnostic-direct-methods).\n\n### ExitApplication\n\nIf OPC Publisher is in failed state or other unhealthy behavior, you could trigger `RestartModule` direct method to stop and then restart the module. To learn more about this direct method, please have a look at [this](https://docs.microsoft.com/azure/iot-edge/how-to-edgeagent-direct-method?view=iotedge-2020-11) in-built direct method provided by IoT Edge.\n\n### GetInfo\n\nTo get the info like version, OS, etc., please refer to the properties provided by IoT Edge which is documented [here](https://docs.microsoft.com/azure/iot-edge/module-edgeagent-edgehub?view=iotedge-2020-11).\n"
  },
  {
    "path": "docs/opc-publisher/observability.md",
    "content": "# Observability <!-- omit in toc -->\n\n[Home](./readme.md)\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Logging](#logging)\n- [Runtime diagnostics output](#runtime-diagnostics-output)\n- [Available metrics](#available-metrics)\n- [IoT Edge Metrics collector](#iot-edge-metrics-collector)\n- [OpenTelemetry](#opentelemetry)\n- [Prometheus](#prometheus)\n  - [Setup](#setup)\n  - [View Prometheus dashboard](#view-prometheus-dashboard)\n  - [View Grafana dashboard](#view-grafana-dashboard)\n\n## Logging\n\nLogging can be configured using the `--ll` [command line argument](./commandline.md). It allows to set a desired log level. More fine grained logging can be configured using an appsettings.json file as per .net documentation.\n\nIt is also possible to enable more detailed logging of the OPC UA stack using the `--sl` option.\n\nTo get the logs the `iotedge` command line utility can be used. Run the following from the local command line:\n\n```bash\niotedge logs -f <container name>\n```\n\nThese logs contain the current state of operation and can be used to narrow down an issue.\n\nAdditionally, logs from edge modules can be fetched [via direct methods](https://github.com/Azure/iotedge/blob/master/doc/built-in-logs-pull.md) describes how to fetch and upload logs from Edge modules.\n\n## Runtime diagnostics output\n\nThe OPC Publisher emits metrics through its Prometheus endpoint (`/metrics`). To learn more about how to create a local metrics dashboard for OPC Publisher V2.7, refer to the tutorial [here](./observability.md).\n\nTo measure the performance of OPC Publisher, the `di` parameter can be used to print metrics to the log in the interval specified (in seconds). Using `--pd=Events` the diagnostics information can instead be emitted to a topic or to IoT Hub. The routing or topic can be configured using the `--dtt` [command line option](./commandline.md).\n\nThe following table describes the instruments that are collected per writer group and subsequently emitted:\n\n| Log line item name                      | Diagnostic info property name       | Description |\n|-----------------------------------------|-------------------------------------|-------------|\n| # OPC Publisher Version (Runtime)       | n/a                                 | The full version and runtime used by the publisher |\n| # Time                                  | timestamp                           | The timestamp of the diagnostics information |\n| # Ingestion duration                    | ingestionDuration                   | How long the data flow inside the publisher has been executing after it was created (either from file or API) |\n| # Opc endpoint connected?               | opcEndpointConnected                | Whether the pipeline is currently connected to the OPC UA server endpoint or in a reconnect attempt. |\n| # Connection retries                    | connectionRetries                   | How many times connections to the OPC UA server broke and needed to be reconnected as it pertains to the data flow. |\n| # Monitored Opc nodes succeeded count   | monitoredOpcNodesSucceededCount     | How many of the configured monitored items have been established successfully inside the data flow's OPC UA subscription and should be producing data. |\n| # Monitored Opc nodes failed count      | monitoredOpcNodesFailedCount        | How many of the configured monitored items inside the data flow failed to be created in the subscription (the logs will provide more information). |\n| # Subscriptions count                   | subscriptionsCount (*)              | How many subscriptions were created that contain above monitored items. |\n| # Queued/Minimum request count          | publishRequestsRatio (*)            | The ratio of currently queued requests to the server as a percentage of the subscription count measured here vs. the overall number of subscriptions in the underlying session (e.g., if the session is shared). |\n|                                         | minPublishRequestsRatio (*)         | The ratio of minimum number of publish requests that should always be queued to the server. |\n| # Good/Bad Publish request count        | goodPublishRequestsRatio (*)        | The ratio of currently queued publish requests that are in progress in the server and awaiting a response. |\n|                                         | badPublishRequestsRatio (*)         | The ratio of defunct publish requests which have not been resulting in a publish response from the server. |\n| # Ingress value changes                 | ingressValueChanges                 | The number of value changes inside the OPC UA subscription notifications processed by the data flow. |\n| # Ingress Events                        | ingressEvents                       | The number of events that were part of these OPC UA subscription notifications that were so far processed by the data flow. |\n| # Received Data Change Notifications    | ingressDataChanges                  | The number of OPC UA subscription notification messages with data value changes that have been received by publisher inside this data flow |\n| # Received Event Notifications          | ingressEventNotifications           | The number of OPC UA subscription notification messages with events that have been received by publisher so far inside this data flow |\n| # Received Keep Alive Notifications     | ingressEventNotifications           | The number of received OPC UA subscription notification messages that were keep alive messages |\n| # Generated Cyclic read Notifications   | ingressCyclicReads                  | The number of cyclic read notifications generated from sampling nodes on the client side. Each notification contains the changed value. |\n| # Generated Heartbeats Notifications    | ingressHeartbeats                   | The number of notifications that contain heartbeats. Each notification contains the heartbeat value. |\n| # Notification batch buffer size        | ingressBatchBlockBufferSize         | The number of messages awaiting encoding and sending tot he telemetry message destination inside the data flow pipeline. |\n| # Encoder input / output size           | encodingBlockInputSize              | The number of messages awaiting encoding into the output format. |\n|                                         | encodingBlockOutputSize             | The number of messages already encoded and waiting to be sent to the telemetry message destination. |\n| # Encoder Notif. processed/dropped      | encoderNotificationsProcessed       | The total number of subscription notifications processed by the encoder stage of the data flow pipeline since the pipeline started. |\n|                                         | encoderNotificationsDropped         | The total number of subscription notifications that were dropped because they could not be encoded, e.g., due to their size being to large to fit into the message. |\n| # Encoder Network Messages produced     | encoderIoTMessagesProcessed         | The total number of encoded messages produced by the encoder since the start of the pipeline. |\n| # Encoder avg Notifications/Message     | encoderAvgNotificationsMessage      | The average number of subscription notifications that were pressed into a message. |\n| # Encoder avg Message body size         | encoderAvgIoTMessageBodySize        | The average size of the message body produced over the course of the pipeline run. |\n| # Encoder avg Chunk (4 Kb) usage        | encoderAvgIoTChunkUsage             | The average use of IoT Hub chunks (4k). |\n| # Estimated Chunks (4 KB) per day       | estimatedIoTChunksPerDay            | An estimate of how many chunks are used per day by publisher which enables correct sizing of the IoT Hub to avoid data loss due to throttling. |\n| # Egress Messages queued/dropped        | outgressInputBufferCount            | The aggregated number of messages waiting in the input buffer of the configured telemetry message destination sinks. |\n|                                         | outgressInputBufferDropped          | The aggregated number of messages that were dropped in any of the configured telemetry message destination sinks. |\n| # Egress Messages successfully sent     | outgressIoTMessageCount             | The aggregated number of messages that were sent by all configured telemetry message destination sinks. |\n|                                         | sentMessagesPerSec                  | Publisher throughput meaning the number of messages sent to the telemetry message destination (e.g., IoT Hub / Edge Hub) per second |\n\n(*) Not exposed through the API\n\n## Available metrics\n\nBy convention, all instrument names start with _\"iiot\"_, e.g., `iiot_<component>_<metric>`. Metrics are collected through the .net Observability infrastructure. For backwards compatibility and to support IoT Edge metrics collector, metrics from OPC Publisher are exposed in Prometheus format on path _/metrics_ on the default HTTP server port (see `-p` [command line argument](./commandline.md). When binding the HTTPS port to 9072 on the host machine, the URL becomes <https://localhost:9072/metrics>.\n\nOne can combine information from multiple metrics to understand and paint a bigger picture of the state of the publisher. The following table describes the individual default metrics which are in Prometheus format.\n\n| Instrument Name | Dimensions | Description | Type |\n|-----------------|------------|-------------|------|\n| iiot_edge_module_start                                  | Edge modules start timestamp with version. Used to calculate uptime, device restarts.   | gauge     |\n| iiot_edge_publisher_monitored_items                     | Total monitored items per subscription                                                  | gauge     |\n| iiot_edge_device_reconnected                             | OPC UA server reconnection count                                                        | gauge     |\n| iiot_edge_device_disconnected                            | OPC UA server disconnection count                                                       | gauge     |\n| iiot_edge_reconnected                                     | Edge device reconnection count                                                          | gauge     |\n| iiot_edge_disconnected                                   | Edge device disconnection count                                                         | gauge     |\n| iiot_edge_publisher_messages_duration                  | Time taken to send messages from publisher. Used to calculate P50, P90, P95, P99, P99.9 | histogram |\n| iiot_edge_publisher_value_changes                                             | OPC UA server ValuesChanges delivered for processing                                    | counter     |\n| iiot_edge_publisher_value_changes_per_second                                | OPC UA server ValuesChanges delivered for processing per second                         | gauge     |\n| iiot_edge_publisher_heartbeats                                             | OPC Publisher heartbeats delivered for processing and included in the value changes. | counter     |\n| iiot_edge_publisher_cyclicreads                                             | OPC Publisher cyclic reads delivered for processing and included in the value changes. | counter     |\n| iiot_edge_publisher_data_changes                                              | OPC UA server DataChanges delivered for processing                                      | counter     |\n| iiot_edge_publisher_data_changes_per_second                                 | OPC UA server DataChanges delivered for processing                                      | gauge     |\n| iiot_edge_publisher_iothub_queue_size                                        | Queued messages to IoTHub                                                               | gauge     |\n| iiot_edge_publisher_iothub_queue_dropped_count                              | IoTHub dropped messages count                                                           | gauge     |\n| iiot_edge_publisher_messages                                        | Messages sent to IoTHub                                                                 | counter     |\n| iiot_edge_publisher_messages_per_second                           | Messages sent to IoTHub per second                                                      | gauge     |\n| iiot_edge_publisher_connection_retries                                        | Connection retries to OPC UA server                                                     | gauge     |\n| iiot_edge_publisher_encoded_notifications                                     | Encoded OPC UA server notifications count                                               | counter     |\n| iiot_edge_publisher_dropped_notifications                                     | Dropped OPC UA server notifications count                                               | counter     |\n| iiot_edge_publisher_processed_messages                                        | Processed IoT messages count                                                            | counter     |\n| iiot_edge_publisher_notifications_per_message_average                       | OPC UA sever notifications per IoT message average                                      | gauge     |\n| iiot_edge_publisher_encoded_message_size_average                            | Encoded IoT message body size average                                                   | gauge     |\n| iiot_edge_publisher_chunk_size_average                                       | IoT Hub chunk size average                                                              | gauge     |\n| iiot_edge_publisher_estimated_message_chunks_per_day                       | Estimated IoT Hub chunks charged per day                                                | gauge     |\n| iiot_edge_publisher_is_connection_ok                                       | Is the endpoint connection ok?                                                          | gauge     |\n| iiot_edge_publisher_good_nodes                                             | How many nodes are receiving data for this endpoint?                                    | gauge     |\n| iiot_edge_publisher_bad_nodes                                              | How many nodes are misconfigured for this endpoint?                                     | gauge     |\n\nYou can use the IoT Edge [Metrics Collector](#iot-edge-metrics-collector) module to collect the metrics.\n\nEdge modules would be instrumented with [Prometheus](https://github.com/prometheus-net/prometheus-net) metrics. Each module would expose the metrics on a pre-defined port.  The `metricscollector` module would use the configuration settings to scrape metrics in a defined interval. It would then push the scraped metrics to Log Analytics Workspace. Using Azure Data Explorer (ADX), we can then query our metrics from workspace. We are creating and deploying an Azure Workbook which would provide insights into the edge modules. This would act as our primary monitoring system for edge modules.\n\n## IoT Edge Metrics collector\n\nThe metrics collector module pulls metrics exposed by OPC Publisher and pushes them to the Log Analytics workspace.\n\n![metrics](./media/metrics.jpeg)\n\nThe default configuration to enable scraping metrics is:\n\n```json\n{\n    \"schemaVersion\": \"1.0\",\n    \"scrapeFrequencySecs\": 120,\n    \"metricsFormat\": \"Json\",\n    \"syncTarget\": \"AzureLogAnalytics\",\n    \"endpoints\": {\n        \"opcpublisher\": \"http://opcpublisher/metrics\"\n    }\n}\n```\n\n> This assumes the http server in OPC Publisher has not been disabled. Disabling the internal HTTP server also disables the Prometheus endpoint.\n\n## OpenTelemetry\n\nIt is possible to export all [metrics](#available-metrics), traces and [logs](#logging) to an OpenTelemetry (OTEL) collector. To specify the OTLP GRPC endpoint to export to, use the `--oc` [command line argument](./commandline.md).\n\nAn example setup using the OpenTelemetry (OTEL) Contrib Collector and Grafana stack can be found in the `/deploy/docker` folder.\n\n## Prometheus\n\nOPC Publisher module also exposes all [metrics](#available-metrics) to a Prometheus scraper (at the standard `/metrics` path). For troubleshooting and debugging, a local Grafana dashboard can be configured on Azure IoT Edge.\n\n> It is recommended to use the OpenTelemetry collector and expose metrics from the collector to Prometheus.\n\nThis section shows you how to setup and view OPC Publisher and EdgeHub metrics as bird's eye view and how to quickly drill down into the issues in case of failures.\n\nIn this tutorial two pre-configured docker images (for Prometheus and Grafana) must be created and deployed as Azure IoT Edge Modules. The Prometheus Module scrapes the metrics from OPC Publisher and EdgeHub, while Grafana is used for visualization of metrics.\n\n### Setup\n\n1. Create and configure [Azure Container Registry](https://docs.microsoft.com/azure/container-registry/container-registry-get-started-portal) to have an admin account enabled.  **Registry name** and **password**  are needed for pushing the docker images of Prometheus and Grafana.\n\n    ![01](./media/01.JPG)\n\n2. Create and push images to this ACR:\n\n    - Download the zip (_metricsdashboard.zip_) located in this folder and extract it.\n\n    - Navigate to **prometheus** folder as shown:\n\n      ![02](./media/02.JPG)\n\n    - Edit _prometheus.yml_ if needed. It defaults to scraping EdgeHub metrics at 9600 and OPC Publisher metrics at 9702. If only OPC Publisher metrics are needed, then remove the scraping config of EdgeHub.\n\n    - Run _buildimage.bat_ and enter the _registryname_, _password_ and _tagname_ when prompted. It will push the **edgeprometheus** image to container registry.\n\n      ![03](./media/03.JPG)\n\n    - Navigate back to the **grafana** folder and run _buildimage.bat_ located in this folder. Enter the same information to push the **edgegrafana** image to ACR.\n\n3. Now go to the portal and verify that the images are present, as shown in the image below.\n\n   ![04](./media/04.JPG)\n\n4. IoT Edge should now be configured to expose metrics. Navigate to the IoT Edge device to be used and perform the following steps:\n\n    - Select **Set Modules** to update the configuration\n\n    - Enter the registry information in the **Container Registry Credentials** so that it can authenticate with the Azure Container Registry.\n\n     ![05](./media/05.JPG)\n\n    - Optional: Enable metrics of _edgeHub_ (Note: As of release 1.0.10, metrics are automatically exposed by default on http port **9600** of the EdgeHub)\n\n      - Select the **Runtime Settings** option and for the EdgeHub and Agent, make sure that the\n        stable version is selected with version 1.0.9.4+\n\n        ![06](./media/06.JPG)\n\n      - Adjust the EdgeHub **Create Options** to include the Exposed Ports directive as shown above.\n\n      - Add the following environment variables to the EdgeHub. (Not needed for version 1.0.10+)\n\n        **ExperimentalFeatures__Enabled         : true**\n\n        **ExperimentalFeaturesEnable__Metrics   : true**\n\n      - Save the dialog to complete the runtime adjustments.\n\n    - Expose port on publisher module:\n\n      - Navigate to the publisher and expose port **9702** to allow the metrics to be scraped, by adding the exposed ports option in the Container Create Options in the Azure portal.\n\n        ![07](./media/07.JPG)\n\n      - Select **Update** to complete the changes made to the OPC publisher module.\n\n5. Now add new modules based on the Prometheus and Grafana images created previously.\n\n    - Prometheus:\n\n      - Add a new “IoT Edge Module” from the “+ Add” drop down list.\n\n      - Add a module named **prometheus** with the image uploaded previously to the Azure Container Registry.\n\n        ![08](./media/08.JPG)\n\n      - In the **Container Create Options** expose and bind the Prometheus port 9090.\n\n        ```json\n        {\n            \"Hostname\": \"prometheus\",\n            \"ExposedPorts\": {\n                \"9090/tcp\": {}\n            },\n            \"HostConfig\": {\n                \"PortBindings\": {\n                    \"9090/tcp\": [\n                        {\n                            \"HostPort\": 9090\n                        }\n                    ]\n                }\n            }\n        }\n        ```\n\n      - Click **Update** to complete the changes to the Prometheus module.\n\n      - Select **Review and Create** and complete the deployment by choosing **Create**.\n\n    - Grafana:\n\n      - Add a new “IoT Edge Module” from the “+ Add” drop down list.\n\n      - Add a module named **grafana** with the image uploaded previously to the Azure Container Registry.\n\n        ![09](./media/09.JPG)\n\n      - Update the environment variables to control access to the Grafana dashboard.\n\n        - GF_SECURITY_ADMIN_USER - the user name you want to use\n\n        - GF_SECURITY_ADMIN_PASSWORD - a password of your choice\n\n        - GF_SERVER_ROOT_URL  - http://localhost:3000\n\n          ![10](./media/10.JPG)\n\n      - In the **Container Create Options** expose and bind the Grafana port 3000.\n\n        ```json\n        {\n            \"Hostname\": \"grafana\",\n            \"ExposedPorts\": {\n                \"3000/tcp\": {}\n            },\n            \"HostConfig\": {\n                \"PortBindings\": {\n                    \"3000/tcp\": [\n                        {\n                            \"HostPort\": 3000\n                        }\n                    ]\n                }\n              }\n         }\n        ```\n\n      - Click **Update** to complete the changes to the Grafana module.\n\n      - Select **Review and Create** and complete the deployment by choosing **Create**.\n\n    - Verify all the modules are running successfully:\n\n      ![15](./media/15.JPG)\n\n### View Prometheus dashboard\n\n- Navigate to the Prometheus dashboard through a web browser on the IoT Edge’s host on port 9090.\n\n  - <http://{edge> host IP or name}:9090/graph\n  - **Note**: When using a VM, make sure to add an inbound rule for port 9090\n\n- Check the target state by navigating to **/targets**\n\n  ![12](./media/12.JPG)\n\n- Metrics can be viewed as shown:\n\n  ![11](./media/11.JPG)\n\n- ![13](./media/13.JPG)\n\n### View Grafana dashboard\n\n- Navigate to the Grafana dashboard through a web browser against the edge’s host on port 3000.\n  - http://{edge host IP or name}:3000\n  - When prompted for a user name and password enter the values entered in the environment variables\n  - **Note**: When using a VM, make sure to add an inbound rule for port 3000\n\n- Prometheus has already been configured as a data source and can now be directly accessed. Prometheus is scraping EdgeHub and OPC Publisher metrics.\n\n- Select the dashboards option to view the available dashboards and select “Publisher” to view the pre-configured dashboard as shown below.\n\n  ![14](./media/14.JPG)\n\n- One could easily add/remove more panels to this dashboard as per the needs.\n"
  },
  {
    "path": "docs/opc-publisher/openapi.json",
    "content": "{\n  \"swagger\": \"2.0\",\n  \"info\": {\n    \"title\": \"OpcPublisher\",\n    \"description\": \"\",\n    \"contact\": {\n      \"url\": \"https://www.github.com/Azure/Industrial-IoT\"\n    },\n    \"license\": {\n      \"name\": \"MIT LICENSE\",\n      \"url\": \"https://opensource.org/licenses/MIT\"\n    },\n    \"version\": \"v2\"\n  },\n  \"host\": \"localhost:9071\",\n  \"schemes\": [\n    \"https\",\n    \"http\"\n  ],\n  \"paths\": {\n    \"/v2/pki/{store}/certs\": {\n      \"get\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"ListCertificates\",\n        \"description\": \"Get the certificates in the specified certificate store\",\n        \"operationId\": \"ListCertificates\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"store\",\n            \"description\": \"The store to enumerate\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/X509CertificateModel\"\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information such as store name is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"Nothing could be found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"AddCertificate\",\n        \"description\": \"Add a certificate to the specified store. The certificate is provided as a pfx/pkcs12 optionally password protected blob.\",\n        \"operationId\": \"AddCertificate\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"store\",\n            \"description\": \"The store to add the certificate to\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"password\",\n            \"description\": \"The optional password of the pfx\",\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The pfx encoded certificate.\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"byte\",\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information such as store name is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/pki/{store}/crls\": {\n      \"get\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"ListCertificateRevocationLists\",\n        \"description\": \"Get the certificates in the specified certificated store\",\n        \"operationId\": \"ListCertificateRevocationLists\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"store\",\n            \"description\": \"The store to enumerate\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"format\": \"byte\",\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information such as store name is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"Nothing could be found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"patch\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"AddCertificateRevocationList\",\n        \"description\": \"Add a certificate revocation list to the specified store. The certificate revocation list is provided as a der encoded blob.\",\n        \"operationId\": \"AddCertificateRevocationList\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"store\",\n            \"description\": \"The store to add the certificate to\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The pfx encoded certificate.\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"byte\",\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"RemoveCertificateRevocationList\",\n        \"description\": \"Remove a certificate revocation list from the specified store.\",\n        \"operationId\": \"RemoveCertificateRevocationList\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"store\",\n            \"description\": \"The store to add the certificate to\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information such store name is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"Nothing could be found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/pki/trusted/certs\": {\n      \"post\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"AddCertificateChain\",\n        \"description\": \"Add a certificate chain to the specified store. The certificate is provided as a concatenated asn encoded set of certificates with the first the one to add, and the remainder the issuer chain.\",\n        \"operationId\": \"AddCertificateChain\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The certificate chain.\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"byte\",\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/pki/rejected/certs/{thumbprint}/approve\": {\n      \"post\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"ApproveRejectedCertificate\",\n        \"description\": \"Move a rejected certificate from the rejected folder to the trusted folder on the publisher.\",\n        \"operationId\": \"ApproveRejectedCertificate\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"thumbprint\",\n            \"description\": \"The thumbprint of the certificate to trust.\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/pki/https/certs\": {\n      \"post\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"AddTrustedHttpsCertificateAsync\",\n        \"description\": \"Add a certificate chain to the trusted https store. The certificate is provided as a concatenated set of certificates with the first the one to add, and the remainder the issuer chain.\",\n        \"operationId\": \"AddTrustedHttpsCertificate\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The certificate chain.\",\n            \"required\": true,\n            \"schema\": {\n              \"format\": \"byte\",\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/pki/{store}/certs/{thumbprint}\": {\n      \"delete\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"RemoveCertificate\",\n        \"description\": \"Remove a certificate with the provided thumbprint from the specified store.\",\n        \"operationId\": \"RemoveCertificate\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"store\",\n            \"description\": \"The store to add the certificate to\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"thumbprint\",\n            \"description\": \"The thumbprint of the certificate to delete.\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information such store name is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"Nothing could be found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/pki/{store}\": {\n      \"delete\": {\n        \"tags\": [\n          \"Certificates\"\n        ],\n        \"summary\": \"RemoveAll\",\n        \"description\": \"Remove all certificates and revocation lists from the specified store.\",\n        \"operationId\": \"RemoveAll\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"store\",\n            \"description\": \"The store to add the certificate to\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information such store name is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"Nothing could be found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An internal error ocurred.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/start\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"PublishStart\",\n        \"description\": \"Start publishing values from a node on a server. The group field in the Connection Model can be used to specify a writer group identifier that will be used in the configuration entry that is created from it inside OPC Publisher.\",\n        \"operationId\": \"PublishStart\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The server and node to publish.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishStartRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishStartResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/stop\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"PublishStop\",\n        \"description\": \"Stop publishing values from a node on the specified server. The group field that was used in the Connection Model to start publishing must also be specified in this connection model.\",\n        \"operationId\": \"PublishStop\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The node to stop publishing\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishStopRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishStopResponseModel\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The item could not be unpublished\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/bulk\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"PublishBulk\",\n        \"description\": \"Configure node values to publish and unpublish in bulk. The group field in the Connection Model can be used to specify a writer group identifier that will be used in the configuration entry that is created from it inside OPC Publisher.\",\n        \"operationId\": \"PublishBulk\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The nodes to publish or unpublish.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishBulkRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishBulkResponseModel\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The item could not be unpublished\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/list\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"PublishList\",\n        \"description\": \"Get all published nodes for a server endpoint. The group field that was used in the Connection Model to start publishing must also be specified in this connection model.\",\n        \"operationId\": \"PublishList\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedItemListRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The items were found and returned.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedItemListResponseModel\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/nodes\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"[PublishNodes](./directmethods.md#publishnodes_v1)\",\n        \"description\": \"PublishNodes enables a client to add a set of nodes to be published. Further information is provided in the OPC Publisher documentation.\",\n        \"operationId\": \"PublishNodes\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request contains the nodes to publish.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesResponseModel\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/nodes/unpublish\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"[UnpublishNodes](./directmethods.md#unpublishnodes_v1)\",\n        \"description\": \"UnpublishNodes method enables a client to remove nodes from a previously configured DataSetWriter. Further information is provided in the OPC Publisher documentation.\",\n        \"operationId\": \"UnpublishNodes\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload specifying the nodes to unpublish.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesResponseModel\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The nodes could not be unpublished\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/nodes/unpublish/all\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"[UnpublishAllNodes](./directmethods.md#unpublishallnodes_v1)\",\n        \"description\": \"Unpublish all specified nodes or all nodes in the publisher configuration. Further information is provided in the OPC Publisher documentation.\",\n        \"operationId\": \"UnpublishAllNodes\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request contains the parts of the configuration to remove.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesResponseModel\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The nodes could not be unpublished\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration\": {\n      \"patch\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"[AddOrUpdateEndpoints](./directmethods.md#addorupdateendpoints_v1)\",\n        \"description\": \"Add or update endpoint configuration and nodes on a server. Further information is provided in the OPC Publisher documentation.\",\n        \"operationId\": \"AddOrUpdateEndpoints\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The parts of the configuration to add or update.\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n              }\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesResponseModel\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The endpoint was not found to add to\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"get\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"[GetConfiguredEndpoints](./directmethods.md#getconfiguredendpoints_v1)\",\n        \"description\": \"Get a list of nodes under a configured endpoint in the configuration. Further information is provided in the OPC Publisher documentation. configuration.\",\n        \"operationId\": \"GetConfiguredEndpoints\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"query\",\n            \"name\": \"IncludeNodes\",\n            \"description\": \"Include nodes that make up the configuration\",\n            \"type\": \"boolean\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The data was retrieved.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/GetConfiguredEndpointsResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"put\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"[SetConfiguredEndpoints](./directmethods.md#setconfiguredendpoints_v1)\",\n        \"description\": \"Enables clients to update the entire published nodes configuration in one call. This includes clearing the existing configuration. Further information is provided in the OPC Publisher documentation. configuration.\",\n        \"operationId\": \"SetConfiguredEndpoints\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The new published nodes configuration\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/SetConfiguredEndpointsRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/endpoints/list/nodes\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"[GetConfiguredNodesOnEndpoint](./directmethods.md#getconfigurednodesonendpoint_v)\",\n        \"description\": \"Get the nodes of a published nodes entry object returned earlier from a call to GetConfiguredEndpoints. Further information is provided in the OPC Publisher documentation.\",\n        \"operationId\": \"GetConfiguredNodesOnEndpoint\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The entry model from a call to GetConfiguredEndpoints for which to gather the nodes.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The information was returned.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/GetConfiguredNodesOnEndpointResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The entry was not found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/configuration/diagnostics\": {\n      \"post\": {\n        \"tags\": [\n          \"Configuration\"\n        ],\n        \"summary\": \"[GetDiagnosticInfo](./directmethods.md#getdiagnosticinfo_v1)\",\n        \"description\": \"Get the list of diagnostics info for all dataset writers in the OPC Publisher at the point the call is received. Further information is provided in the OPC Publisher documentation.\",\n        \"operationId\": \"GetDiagnosticInfo\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/PublishDiagnosticInfoModel\"\n              }\n            }\n          },\n          \"405\": {\n            \"description\": \"Call not supported or functionality disabled.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/reset\": {\n      \"get\": {\n        \"tags\": [\n          \"Diagnostics\"\n        ],\n        \"summary\": \"ResetAllConnections\",\n        \"description\": \"Can be used to reset all established connections causing a full reconnect and recreate of all subscriptions.\",\n        \"operationId\": \"ResetAllConnections\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\"\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/connections\": {\n      \"get\": {\n        \"tags\": [\n          \"Diagnostics\"\n        ],\n        \"summary\": \"GetActiveConnections\",\n        \"description\": \"Get all active connections the publisher is currently managing.\",\n        \"operationId\": \"GetActiveConnections\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/ConnectionModel\"\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/diagnostics/connections\": {\n      \"get\": {\n        \"tags\": [\n          \"Diagnostics\"\n        ],\n        \"summary\": \"GetConnectionDiagnostics\",\n        \"description\": \"Get diagnostics for all active clients including server and client session diagnostics.\",\n        \"operationId\": \"GetConnectionDiagnostics\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConnectionDiagnosticsModelIAsyncEnumerable\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/diagnostics/channels\": {\n      \"get\": {\n        \"tags\": [\n          \"Diagnostics\"\n        ],\n        \"summary\": \"GetChannelDiagnostics\",\n        \"description\": \"Get channel diagnostic information for all connections.\",\n        \"operationId\": \"GetChannelDiagnostics\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/ChannelDiagnosticModel\"\n              }\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/diagnostics/channels/watch\": {\n      \"get\": {\n        \"tags\": [\n          \"Diagnostics\"\n        ],\n        \"summary\": \"WatchChannelDiagnostics\",\n        \"description\": \"Get channel diagnostic information for all connections. The first set of diagnostics are the diagnostics active for all connections, continue reading to get updates.\",\n        \"operationId\": \"WatchChannelDiagnostics\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ChannelDiagnosticModelIAsyncEnumerable\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/discovery/findserver\": {\n      \"post\": {\n        \"tags\": [\n          \"Discovery\"\n        ],\n        \"summary\": \"FindServer\",\n        \"description\": \"Find servers matching the specified endpoint query spec.\",\n        \"operationId\": \"FindServer\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The endpoint query specifying the matching criteria for the discovered endpoints.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ServerEndpointQueryModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ApplicationRegistrationModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/discovery/register\": {\n      \"post\": {\n        \"tags\": [\n          \"Discovery\"\n        ],\n        \"summary\": \"Register\",\n        \"description\": \"Start server registration. The results of the registration are published as events to the default event transport.\",\n        \"operationId\": \"Register\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"Contains all information to perform the registration request including discovery url to use.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ServerRegistrationRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"type\": \"boolean\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/discovery\": {\n      \"post\": {\n        \"tags\": [\n          \"Discovery\"\n        ],\n        \"summary\": \"Discover\",\n        \"description\": \"Start network discovery using the provided discovery request configuration. The discovery results are published to the configured default event transport.\",\n        \"operationId\": \"Discover\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The discovery configuration to use during the discovery run.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/DiscoveryRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"type\": \"boolean\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/discovery/cancel\": {\n      \"post\": {\n        \"tags\": [\n          \"Discovery\"\n        ],\n        \"summary\": \"Cancel\",\n        \"description\": \"Cancel a discovery run that is ongoing using the discovery request token specified in the discover operation.\",\n        \"operationId\": \"Cancel\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The information needed to cancel the discovery operation.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/DiscoveryCancelRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"type\": \"boolean\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/list\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"GetFileSystems\",\n        \"description\": \"Gets all file systems of the server.\",\n        \"operationId\": \"GetFileSystems\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConnectionModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelServiceResponseIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/list/directories\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"GetDirectories\",\n        \"description\": \"Gets all directories in a directory or file system\",\n        \"operationId\": \"GetDirectories\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The directory or filesystem object and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelIEnumerableServiceResponse\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/list/files\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"GetFiles\",\n        \"description\": \"Get files in a directory or file system on a server.\",\n        \"operationId\": \"GetFiles\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The directory or filesystem object and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelIEnumerableServiceResponse\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/parent\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"GetParent\",\n        \"description\": \"Gets the parent directory or filesystem of a file or directory.\",\n        \"operationId\": \"GetParent\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The file or directory object and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelServiceResponse\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/info/file\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"GetFileInfo\",\n        \"description\": \"Gets the file information for a file on the server.\",\n        \"operationId\": \"GetFileInfo\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The file object and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileInfoModelServiceResponse\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/create/file/{name}\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"CreateFile\",\n        \"description\": \"Create a new file in a directory or file system on the server\",\n        \"operationId\": \"CreateFile\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"name\",\n            \"description\": \"The name of the file to create as child under the directory or filesystem provided\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The file system or directory object to create the file in and the connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelServiceResponse\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/create/directory/{name}\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"CreateDirectory\",\n        \"description\": \"Create a new directory in an existing file system or directory on the server.\",\n        \"operationId\": \"CreateDirectory\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"name\",\n            \"description\": \"The name of the directory to create as child under the parent directory provided\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The file system or directory object to create the directory in and the connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelServiceResponse\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/delete\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"DeleteFileSystemObject\",\n        \"description\": \"Delete a file or directory in an existing file system on the server.\",\n        \"operationId\": \"DeleteFileSystemObject\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The file or directory object to delete and the connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ServiceResultModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/delete/{fileOrDirectoryNodeId}\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"DeleteFileOrDirectory\",\n        \"description\": \"Delete a file or directory in the specified directory or file system.\",\n        \"operationId\": \"DeleteFileOrDirectory\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"fileOrDirectoryNodeId\",\n            \"description\": \"The node id of the file or directory to delete\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The filesystem or directory object in which to delete the specified file or directory and the connection to use for the operation.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/FileSystemObjectModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ServiceResultModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/download\": {\n      \"get\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"Download\",\n        \"description\": \"Download a file from the server\",\n        \"operationId\": \"Download\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"header\",\n            \"name\": \"x-ms-connection\",\n            \"description\": \"The connection information identifying the server to connect to perform the operation on. This is passed as json serialized via the header \\\"x-ms-connection\\\"\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"header\",\n            \"name\": \"x-ms-target\",\n            \"description\": \"The file object to upload. This is passed as json serialized via the header \\\"x-ms-target\\\"\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/filesystem/upload\": {\n      \"post\": {\n        \"tags\": [\n          \"FileSystem\"\n        ],\n        \"summary\": \"Upload\",\n        \"description\": \"Upload a file to the server.\",\n        \"operationId\": \"Upload\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"header\",\n            \"name\": \"x-ms-connection\",\n            \"description\": \"The connection information identifying the server to connect to perform the operation on. This is passed as json serialized via the header \\\"x-ms-connection\\\"\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"header\",\n            \"name\": \"x-ms-target\",\n            \"description\": \"The file object to upload. This is passed as json serialized via the header \\\"x-ms-target\\\"\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"header\",\n            \"name\": \"x-ms-options\",\n            \"description\": \"The file write options to use passed as header \\\"x-ms-mode\\\"\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/capabilities\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"GetServerCapabilities\",\n        \"description\": \"Get the capabilities of the server. The server capabilities are exposed as a property of the server object and this method provides a convinient way to retrieve them.\",\n        \"operationId\": \"GetServerCapabilities\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/RequestHeaderModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ServerCapabilitiesModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/browse/first\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"Browse\",\n        \"description\": \"Browse a a node to discover its references. For more information consult <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.2\\\"> the relevant section of the OPC UA reference specification</a>. The operation might return a continuation token. The continuation token can be used in the BrowseNext method call to retrieve the remainder of references or additional continuation tokens.\",\n        \"operationId\": \"Browse\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/BrowseFirstRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/BrowseFirstResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/browse/next\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"BrowseNext\",\n        \"description\": \"Browse next\",\n        \"operationId\": \"BrowseNext\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/BrowseNextRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/BrowseNextResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/browse\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"BrowseStream (only HTTP transport)\",\n        \"description\": \"Recursively browse a node to discover its references and nodes. The results are returned as a stream of nodes and references. Consult <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.2\\\"> the relevant section of the OPC UA reference specification</a> for more information.\",\n        \"operationId\": \"BrowseStream\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/BrowseStreamRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/BrowseStreamChunkModelIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/browse/path\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"BrowsePath\",\n        \"description\": \"Translate a start node and browse path into 0 or more target nodes. Allows programming aginst types in OPC UA. For more information consult <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.4\\\"> the relevant section of the OPC UA reference specification</a>.\",\n        \"operationId\": \"BrowsePath\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/BrowsePathRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/BrowsePathResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/read\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"ValueRead\",\n        \"description\": \"Read the value of a variable node. This uses the service detailed in the <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.1\\\"> relevant section of the OPC UA reference specification</a>.\",\n        \"operationId\": \"ValueRead\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ValueReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ValueReadResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/write\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"ValueWrite\",\n        \"description\": \"Write the value of a variable node. This uses the service detailed in <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.4\\\"> the relevant section of the OPC UA reference specification</a>.\",\n        \"operationId\": \"ValueWrite\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ValueWriteRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ValueWriteResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/metadata\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"GetMetadata\",\n        \"description\": \"Get the type metadata for a any node. For data type nodes the response contains the data type metadata including fields. For method nodes the output and input arguments metadata is provided. For objects and object types the instance declaration is returned.\",\n        \"operationId\": \"GetMetadata\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/NodeMetadataRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/NodeMetadataResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/query/compile\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"CompileQuery\",\n        \"description\": \"Compile a query string into a query spec that can be used when setting up event filters on monitored items that monitor events.\",\n        \"operationId\": \"CompileQuery\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The compilation request and connection information.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/QueryCompilationRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/QueryCompilationResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/call/$metadata\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"MethodMetadata\",\n        \"description\": \"Get the metadata for calling the method. This API is obsolete. Use the more powerful GetMetadata method instead.\",\n        \"operationId\": \"MethodMetadata\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/MethodMetadataRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/MethodMetadataResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/call\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"MethodCall\",\n        \"description\": \"Call a method on the OPC UA server endpoint with the specified input arguments and received the result in the form of the method output arguments. See <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11.2\\\"> the relevant section of the OPC UA reference specification</a> for more information.\",\n        \"operationId\": \"MethodCall\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/MethodCallRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/MethodCallResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/read/attributes\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"NodeRead\",\n        \"description\": \"Read any writeable attribute of a specified node on the server. See <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.2\\\"> the relevant section of the OPC UA reference specification</a> for more information. The attributes supported by the node are dependend on the node class of the node.\",\n        \"operationId\": \"NodeRead\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/write/attributes\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"NodeWrite\",\n        \"description\": \"Write any writeable attribute of a specified node on the server. See <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.4\\\"> the relevant section of the OPC UA reference specification</a> for more information. The attributes supported by the node are dependend on the node class of the node.\",\n        \"operationId\": \"NodeWrite\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/WriteRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/WriteResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/historyread/first\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"HistoryRead\",\n        \"description\": \"Read the history using the respective OPC UA service call. See <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> the relevant section of the OPC UA reference specification</a> for more information. If continuation is returned the remaining results of the operation can be read using the HistoryReadNext method.\",\n        \"operationId\": \"HistoryRead\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/VariantValueHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/VariantValueHistoryReadResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/historyread/next\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"HistoryReadNext\",\n        \"description\": \"Read next history using the respective OPC UA service call. See <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> the relevant section of the OPC UA reference specification</a> for more information.\",\n        \"operationId\": \"HistoryReadNext\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryReadNextRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/VariantValueHistoryReadNextResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/historyupdate\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"HistoryUpdate\",\n        \"description\": \"Update history using the respective OPC UA service call. Consult the <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> relevant section of the OPC UA reference specification</a> for more information.\",\n        \"operationId\": \"HistoryUpdate\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/VariantValueHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/certificate\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"GetEndpointCertificate\",\n        \"description\": \"Get a server endpoint's certificate and certificate chain if available.\",\n        \"operationId\": \"GetEndpointCertificate\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The server endpoint to get the certificate for.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/EndpointModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/X509CertificateChainModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/capabilities\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"HistoryGetServerCapabilities\",\n        \"description\": \"Get the historian capabilities exposed as part of the OPC UA server server object.\",\n        \"operationId\": \"HistoryGetServerCapabilities\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/RequestHeaderModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryServerCapabilitiesModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/configuration\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"HistoryGetConfiguration\",\n        \"description\": \"Get the historian configuration of a historizing node in the OPC UA server\",\n        \"operationId\": \"HistoryGetConfiguration\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryConfigurationRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryConfigurationResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/test\": {\n      \"post\": {\n        \"tags\": [\n          \"General\"\n        ],\n        \"summary\": \"TestConnection\",\n        \"description\": \"Test connection to an opc ua server. The call will not establish any persistent connection but will just allow a client to test that the server is available.\",\n        \"operationId\": \"TestConnection\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The request payload and connection information identifying the server to connect to perform the operation on.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/TestConnectionRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/TestConnectionResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/events/replace\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReplaceEvents\",\n        \"description\": \"Replace events in a timeseries in the historian of the OPC UA server. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReplaceEvents\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The events to replace with in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/UpdateEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/events/insert\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryInsertEvents\",\n        \"description\": \"Insert event entries into a specified timeseries of the historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryInsertEvents\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The events to insert into the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/UpdateEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/events/upsert\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryUpsertEvents\",\n        \"description\": \"Upsert events into a time series of the opc server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryUpsertEvents\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The events to upsert into the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/UpdateEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/events/delete\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryDeleteEvents\",\n        \"description\": \"Delete event entries in a timeseries of the server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryDeleteEvents\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The events to delete in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/DeleteEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/delete/attimes\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryDeleteValuesAtTimes\",\n        \"description\": \"Delete value change entries in a timeseries of the server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryDeleteValuesAtTimes\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to delete in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/DeleteValuesAtTimesDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/delete/modified\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryDeleteModifiedValues\",\n        \"description\": \"Delete value change entries in a timeseries of the server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryDeleteModifiedValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to delete in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/DeleteValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/delete\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryDeleteValues\",\n        \"description\": \"Delete value change entries in a timeseries of the server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryDeleteValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to delete in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/DeleteValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/replace\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReplaceValues\",\n        \"description\": \"Replace value change entries in a timeseries of the server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReplaceValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to replace with in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/UpdateValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/insert\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryInsertValues\",\n        \"description\": \"Insert value change entries in a timeseries of the server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryInsertValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to insert into the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/UpdateValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/upsert\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryUpsertValues\",\n        \"description\": \"Upsert value change entries in a timeseries of the server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryUpsertValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to upsert into the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/UpdateValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryUpdateResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/events/read/first\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReadEvents\",\n        \"description\": \"Read an event timeseries inside the OPC UA server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReadEvents\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The events to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadEventsDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricEventModelArrayHistoryReadResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/events/read/next\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReadEventsNext\",\n        \"description\": \"Continue reading an event timeseries inside the OPC UA server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReadEventsNext\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The continuation from a previous read request.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryReadNextRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricEventModelArrayHistoryReadNextResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read/first\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReadValues\",\n        \"description\": \"Read a data change timeseries inside the OPC UA server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReadValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadValuesDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelArrayHistoryReadResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read/first/attimes\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReadValuesAtTimes\",\n        \"description\": \"Read parts of a timeseries inside the OPC UA server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReadValuesAtTimes\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadValuesAtTimesDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelArrayHistoryReadResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read/first/processed\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReadProcessedValues\",\n        \"description\": \"Read processed timeseries data inside the OPC UA server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReadProcessedValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadProcessedValuesDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelArrayHistoryReadResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read/first/modified\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReadModifiedValues\",\n        \"description\": \"Read modified changes in a timeseries inside the OPC UA server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReadModifiedValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadModifiedValuesDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelArrayHistoryReadResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read/next\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryReadValuesNext\",\n        \"description\": \"Continue reading a timeseries inside the OPC UA server historian. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryReadValuesNext\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The continuation token from a previous read operation.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoryReadNextRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelArrayHistoryReadNextResponseModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryStreamValues (only HTTP transport)\",\n        \"description\": \"Read an entire timeseries from an OPC UA server historian as stream. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryStreamValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadValuesDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read/modified\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryStreamModifiedValues (only HTTP transport)\",\n        \"description\": \"Read an entire modified series from an OPC UA server historian as stream. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryStreamModifiedValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadModifiedValuesDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read/attimes\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryStreamValuesAtTimes (only HTTP transport)\",\n        \"description\": \"Read specific timeseries data from an OPC UA server historian as stream. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryStreamValuesAtTimes\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadValuesAtTimesDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/values/read/processed\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryStreamProcessedValues (only HTTP transport)\",\n        \"description\": \"Read processed timeseries data from an OPC UA server historian as stream. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryStreamProcessedValues\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The values to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadProcessedValuesDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricValueModelIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/history/events/read\": {\n      \"post\": {\n        \"tags\": [\n          \"History\"\n        ],\n        \"summary\": \"HistoryStreamEvents (only HTTP transport)\",\n        \"description\": \"Read an entire event timeseries from an OPC UA server historian as stream. See <a href=\\\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\\\"> the relevant section of the OPC UA reference specification</a> and <a href=\\\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\\\"> respective service documentation</a> for more information.\",\n        \"operationId\": \"HistoryStreamEvents\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The events to read in the timeseries.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ReadEventsDetailsModelHistoryReadRequestModelRequestEnvelope\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation was successful or the response payload contains relevant error information.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/HistoricEventModelIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer\": {\n      \"put\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"CreateOrUpdateDataSetWriterEntry\",\n        \"description\": \"Create a published nodes entry for a specific writer group and dataset writer. The entry must specify a unique writer group and dataset writer id. A null value is treated as empty string. If the entry is found it is replaced, if it is not found, it is created. If more than one entry is found with the same writer group and writer id an error is returned. The writer entry provided must include at least one node which will be the initial set. All nodes must specify a unique dataSetFieldId. A null value is treated as empty string. Publishing intervals at node level are also not supported and generate an error. Publishing intervals must be configured at the data set writer level.\",\n        \"operationId\": \"CreateOrUpdateDataSetWriterEntry\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The entry to create for the writer\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The item was created\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to update.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"ExpandAndCreateOrUpdateDataSetWriterEntries\",\n        \"description\": \"Create a series of published nodes entries using the provided entry as template. The entry is expanded using expansion configuration provided. Expanded entries are returned one by one with error information if any. The configuration is also saved in the local configuration store. The server must be online and accessible for the expansion to work.\",\n        \"operationId\": \"ExpandAndCreateOrUpdateDataSetWriterEntries\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The entry to create for the writer and node expansion configuration to use\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodeExpansionModelPublishedNodesEntryRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The item was created\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModelServiceResponseIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to update.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/{dataSetWriterGroup}/{dataSetWriterId}\": {\n      \"get\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"GetDataSetWriterEntry\",\n        \"description\": \"Get the published nodes entry for a specific writer group and dataset writer. Dedicated errors are returned if no, or no unique entry could be found. The entry does not contain the nodes. Nodes can be retrieved using the GetNodes API.\",\n        \"operationId\": \"GetDataSetWriterEntry\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterGroup\",\n            \"description\": \"The writer group name of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterId\",\n            \"description\": \"The data set writer identifer of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The item was found\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"There is no unique item present.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The item was not found\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"put\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"AddOrUpdateNode\",\n        \"description\": \"Add a node to a dedicated data set writer in a writer group. A node must have a unique DataSetFieldId. If the field already exists, the node is updated. If a node does not have a dataset field id an error is returned. Publishing intervals at node level are also not supported and generate an error. Publishing intervals must be configured at the data set writer level.\",\n        \"operationId\": \"AddOrUpdateNode\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterGroup\",\n            \"description\": \"The writer group name of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterId\",\n            \"description\": \"The data set writer identifer of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"insertAfterFieldId\",\n            \"description\": \"Field after which to insert the nodes. If not specified, nodes are added at the end of the entry\",\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"Node to add or update\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/OpcNodeModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The item was added\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to update.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"An entry was not found to add the node to\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"RemoveDataSetWriterEntry\",\n        \"description\": \"Remove the published nodes entry for a specific data set writer in a writer group. Dedicated errors are returned if no, or no unique entry could be found.\",\n        \"operationId\": \"RemoveDataSetWriterEntry\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterGroup\",\n            \"description\": \"The writer group name of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterId\",\n            \"description\": \"The data set writer identifer of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"force\",\n            \"description\": \"Force delete all writers even if more than one were found. Does not error when none were found.\",\n            \"type\": \"boolean\",\n            \"default\": false\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The entry was removed\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to remove.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The entry to remove was not found\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/add\": {\n      \"post\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"AddOrUpdateNodes\",\n        \"description\": \"Add Nodes to a dedicated data set writer in a writer group. Each node must have a unique DataSetFieldId. If the field already exists, the node is updated. If a node does not have a dataset field id an error is returned. Publishing intervals at node level are also not supported and generate an error. Publishing intervals must be configured at the data set writer level.\",\n        \"operationId\": \"AddOrUpdateNodes\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterGroup\",\n            \"description\": \"The writer group name of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterId\",\n            \"description\": \"The data set writer identifer of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"insertAfterFieldId\",\n            \"description\": \"Field after which to insert the nodes. If not specified, nodes are added at the end of the entry\",\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"Nodes to add or update\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/OpcNodeModel\"\n              }\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The items were added\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique entry could not be found to add to.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The entry was not found\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/remove\": {\n      \"post\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"RemoveNodes\",\n        \"description\": \"Remove Nodes that match the provided data set field ids from a data set writer in a writer group. If one of the fields is not found, no error is returned, however, if all fields are not found an error is returned.\",\n        \"operationId\": \"RemoveNodes\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterGroup\",\n            \"description\": \"The writer group name of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterId\",\n            \"description\": \"The data set writer identifer of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The identifiers of the fields to remove\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\"\n              }\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Some or all items were removed\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to remove from.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The entry or all items to remove were not found\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/{dataSetFieldId}\": {\n      \"delete\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"RemoveNode\",\n        \"description\": \"Remove a node with the specified data set field id from a data set writer in a writer group. If the field is not found, an error is returned.\",\n        \"operationId\": \"RemoveNode\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterGroup\",\n            \"description\": \"The writer group name of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterId\",\n            \"description\": \"The data set writer identifer of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetFieldId\",\n            \"description\": \"Identifier of the field to remove\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The item was removed\"\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to remove from.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The entry or item to remove was not found\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      },\n      \"get\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"GetNode\",\n        \"description\": \"Get a node from a dataset in a writer group. Dedicated errors are returned if no, or no unique entry could be found, or the node does not exist.\",\n        \"operationId\": \"GetNode\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterGroup\",\n            \"description\": \"The writer group name of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterId\",\n            \"description\": \"The data set writer identifer of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetFieldId\",\n            \"description\": \"The data set field id of the node to return\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The item was retrieved\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/OpcNodeModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to get a node from.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The entry or item was not found\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/{dataSetWriterGroup}/{dataSetWriterId}/nodes\": {\n      \"get\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"GetNodes\",\n        \"description\": \"Get Nodes from a data set writer in a writer group. The nodes can optionally be offset from a previous last node identified by the dataSetFieldId and pageanated by the pageSize. If the dataSetFieldId is not found, an empty list is returned. If the dataSetFieldId is not specified, the first page is returned.\",\n        \"operationId\": \"GetNodes\",\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterGroup\",\n            \"description\": \"The writer group name of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"path\",\n            \"name\": \"dataSetWriterId\",\n            \"description\": \"The data set writer identifer of the entry\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"lastDataSetFieldId\",\n            \"description\": \"the field id after which to start the page. If not specified, nodes from the beginning are returned.\",\n            \"type\": \"string\"\n          },\n          {\n            \"in\": \"query\",\n            \"name\": \"pageSize\",\n            \"description\": \"Number of nodes to return\",\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The items were found\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/OpcNodeModel\"\n              }\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to get nodes from.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The entry was not found\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        },\n        \"x-ms-pageable\": {\n          \"nextLinkName\": \"lastDataSetFieldId\"\n        }\n      }\n    },\n    \"/v2/writer/expand\": {\n      \"post\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"ExpandWriter\",\n        \"description\": \"Expands the provided nodes in the entry to a series of published node entries. The provided entry is used template. The entry is expanded using expansion configuration provided. Expanded entries are returned one by one with error information if any. The configuration is not updated but the resulting entries can be modified and later saved in the configuration using the configuration API. The server must be online and accessible for the expansion to work.\",\n        \"operationId\": \"ExpandWriter\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The entry to expand and the node expansion configuration to use. If no configuration is provided a default configuration is used which and no error entries are returned.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodeExpansionModelPublishedNodesEntryRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The item was created\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModelServiceResponseIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"A unique item could not be found to update.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/assets/create\": {\n      \"post\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"CreateOrUpdateAsset (With binary configuration)\",\n        \"description\": \"Creates an asset from the entry in the request and the configuration provided in the Web of Things Asset configuration byte buffer. The entry must contain a data set name which will be used as the asset name. The writer can stay empty. It will be set to the asset id on successful return. The server must support the WoT profile per <see href=\\\"https://reference.opcfoundation.org/WoT/v100/docs/\\\" />. The asset will be created and the configuration updated to reference it. A wait time can be provided as optional query parameter to wait until the server has settled after uploading the configuration.\",\n        \"operationId\": \"CreateOrUpdateAsset2\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The contains the entry and WoT file to configure the server to expose the asset.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ByteArrayPublishedNodeCreateAssetRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The asset was created\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModelServiceResponse\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"Forbidden\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/assets\": {\n      \"post\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"CreateOrUpdateAsset\",\n        \"description\": \"Creates an asset from the entry in the request and the configuration provided in the Web of Things Asset json configuration property. The entry must contain a data set name which will be used as the asset name. The writer can stay empty. It will be set to the asset id on successful return. The server must support the WoT profile per <see href=\\\"https://reference.opcfoundation.org/WoT/v100/docs/\\\" />. The asset will be created and the configuration updated to reference it. A wait time can be provided as optional query parameter to wait until the server has settled after uploading the configuration.\",\n        \"operationId\": \"CreateOrUpdateAsset\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The contains the entry and WoT file to configure the server to expose the asset.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/VariantValuePublishedNodeCreateAssetRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The asset was created\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModelServiceResponse\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"Forbidden\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/assets/list\": {\n      \"post\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"GetAllAssets\",\n        \"description\": \"Get a list of entries representing the assets in the server. This will not touch the configuration, it will obtain the list from the server. If the server does not support <see href=\\\"https://reference.opcfoundation.org/WoT/v100/docs/\\\" /> the result will be empty.\",\n        \"operationId\": \"GetAllAssets\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"The entry to use to list the assets with the optional header information used when invoking services on the server.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/RequestHeaderModelPublishedNodesEntryRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Successfully completed the listing\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodesEntryModelServiceResponseIAsyncEnumerable\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"Forbidden\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    },\n    \"/v2/writer/assets/delete\": {\n      \"post\": {\n        \"tags\": [\n          \"Writer\"\n        ],\n        \"summary\": \"DeleteAsset\",\n        \"description\": \"Delete the asset referenced by the entry in the request. The entry must contain the asset id to delete. The asset id is the data set writer id. The entry must also contain the writer group id or deletion of the asset in the configuration will fail before the asset is deleted. The server must support WoT connectivity profile per <see href=\\\"https://reference.opcfoundation.org/WoT/v100/docs/\\\" />. First the entry in the configuration will be deleted and then the asset on the server. If deletion of the asset in the configuration fails it will not be deleted in the server. An optional request option force can be used to force the deletion of the asset in the server regardless of the failure to delete the entry in the configuration.\",\n        \"operationId\": \"DeleteAsset\",\n        \"consumes\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"application/x-msgpack\"\n        ],\n        \"parameters\": [\n          {\n            \"in\": \"body\",\n            \"name\": \"body\",\n            \"description\": \"Request that contains the entry of the asset that should be deleted.\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/PublishedNodeDeleteAssetRequestModel\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The asset was deleted successfully\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ServiceResultModel\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The passed in information is invalid\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"403\": {\n            \"description\": \"Forbidden\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"408\": {\n            \"description\": \"The operation timed out.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          },\n          \"500\": {\n            \"description\": \"An unexpected error occurred\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ProblemDetails\"\n            }\n          }\n        }\n      }\n    }\n  },\n  \"definitions\": {\n    \"AdditionalData\": {\n      \"description\": \"Flags that are set by the historian when\\r\\nreturning archived values.\",\n      \"enum\": [\n        \"None\",\n        \"Partial\",\n        \"ExtraData\",\n        \"MultipleValues\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"AdditionalData\",\n        \"modelAsString\": false\n      }\n    },\n    \"AggregateConfigurationModel\": {\n      \"description\": \"Aggregate configuration\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"treatUncertainAsBad\": {\n          \"description\": \"Whether to treat uncertain as bad\",\n          \"type\": \"boolean\"\n        },\n        \"percentDataBad\": {\n          \"format\": \"int32\",\n          \"description\": \"Percent of data that is bad\",\n          \"type\": \"integer\"\n        },\n        \"percentDataGood\": {\n          \"format\": \"int32\",\n          \"description\": \"Percent of data that is good\",\n          \"type\": \"integer\"\n        },\n        \"useSlopedExtrapolation\": {\n          \"description\": \"Whether to use sloped extrapolation.\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ApplicationInfoModel\": {\n      \"description\": \"Application info model\",\n      \"required\": [\n        \"applicationId\",\n        \"applicationUri\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"applicationId\": {\n          \"description\": \"Unique application id\",\n          \"type\": \"string\"\n        },\n        \"applicationType\": {\n          \"$ref\": \"#/definitions/ApplicationType\"\n        },\n        \"applicationUri\": {\n          \"description\": \"Unique application uri\",\n          \"type\": \"string\"\n        },\n        \"productUri\": {\n          \"description\": \"Product uri\",\n          \"type\": \"string\"\n        },\n        \"applicationName\": {\n          \"description\": \"Default name of application\",\n          \"type\": \"string\"\n        },\n        \"locale\": {\n          \"description\": \"Locale of default name - defaults to \\\"en\\\"\",\n          \"type\": \"string\"\n        },\n        \"localizedNames\": {\n          \"description\": \"Localized Names of application keyed on locale\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"capabilities\": {\n          \"description\": \"The capabilities advertised by the server.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"discoveryUrls\": {\n          \"description\": \"Discovery urls of the server\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"discoveryProfileUri\": {\n          \"description\": \"Discovery profile uri\",\n          \"type\": \"string\"\n        },\n        \"gatewayServerUri\": {\n          \"description\": \"Gateway server uri\",\n          \"type\": \"string\"\n        },\n        \"hostAddresses\": {\n          \"description\": \"Host addresses of server application or null\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"siteId\": {\n          \"description\": \"Site of the application\",\n          \"type\": \"string\",\n          \"example\": \"productionlineA\"\n        },\n        \"discovererId\": {\n          \"description\": \"Discoverer that registered the application\",\n          \"type\": \"string\"\n        },\n        \"notSeenSince\": {\n          \"format\": \"date-time\",\n          \"description\": \"Last time application was seen if not visible\",\n          \"type\": \"string\"\n        },\n        \"created\": {\n          \"$ref\": \"#/definitions/OperationContextModel\"\n        },\n        \"updated\": {\n          \"$ref\": \"#/definitions/OperationContextModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ApplicationRegistrationModel\": {\n      \"description\": \"Application with optional list of endpoints\",\n      \"required\": [\n        \"application\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"application\": {\n          \"$ref\": \"#/definitions/ApplicationInfoModel\"\n        },\n        \"endpoints\": {\n          \"description\": \"List of endpoints for it\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/EndpointRegistrationModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ApplicationType\": {\n      \"description\": \"Application type\",\n      \"enum\": [\n        \"Server\",\n        \"Client\",\n        \"ClientAndServer\",\n        \"DiscoveryServer\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"ApplicationType\",\n        \"modelAsString\": false\n      }\n    },\n    \"AttributeReadRequestModel\": {\n      \"description\": \"Attribute to read\",\n      \"required\": [\n        \"attribute\",\n        \"nodeId\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to read from or write to (mandatory)\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"attribute\": {\n          \"$ref\": \"#/definitions/NodeAttribute\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"AttributeReadResponseModel\": {\n      \"description\": \"Attribute value read\",\n      \"required\": [\n        \"value\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"value\": {\n          \"description\": \"Attribute value\",\n          \"type\": \"object\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"AttributeWriteRequestModel\": {\n      \"description\": \"Attribute and value to write to it\",\n      \"required\": [\n        \"attribute\",\n        \"nodeId\",\n        \"value\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to write to (mandatory)\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"attribute\": {\n          \"$ref\": \"#/definitions/NodeAttribute\"\n        },\n        \"value\": {\n          \"description\": \"Value to write (mandatory)\",\n          \"type\": \"object\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"AttributeWriteResponseModel\": {\n      \"description\": \"Attribute write result\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"AuthenticationMethodModel\": {\n      \"description\": \"Authentication Method model\",\n      \"required\": [\n        \"id\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Method id\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"credentialType\": {\n          \"$ref\": \"#/definitions/CredentialType\"\n        },\n        \"securityPolicy\": {\n          \"description\": \"Security policy to use when passing credential.\",\n          \"type\": \"string\"\n        },\n        \"configuration\": {\n          \"description\": \"Method specific configuration\",\n          \"type\": \"object\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseDirection\": {\n      \"description\": \"Direction to browse\",\n      \"enum\": [\n        \"Forward\",\n        \"Backward\",\n        \"Both\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"BrowseDirection\",\n        \"modelAsString\": false\n      }\n    },\n    \"BrowseFirstRequestModel\": {\n      \"description\": \"Browse request model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to browse.\\r\\n(defaults to root folder).\",\n          \"type\": \"string\"\n        },\n        \"direction\": {\n          \"$ref\": \"#/definitions/BrowseDirection\"\n        },\n        \"view\": {\n          \"$ref\": \"#/definitions/BrowseViewModel\"\n        },\n        \"referenceTypeId\": {\n          \"description\": \"Reference types to browse.\\r\\n(default: hierarchical).\",\n          \"type\": \"string\"\n        },\n        \"noSubtypes\": {\n          \"description\": \"Whether to include subtypes of the reference type.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"maxReferencesToReturn\": {\n          \"format\": \"int64\",\n          \"description\": \"Max number of references to return. There might\\r\\nbe less returned as this is up to the client\\r\\nrestrictions.  Set to 0 to return no references\\r\\nor target nodes.\\r\\n(default is decided by client e.g. 60)\",\n          \"type\": \"integer\"\n        },\n        \"targetNodesOnly\": {\n          \"description\": \"Whether to collapse all references into a set of\\r\\nunique target nodes and not show reference\\r\\ninformation.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"readVariableValues\": {\n          \"description\": \"Whether to read variable values on target nodes.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"nodeClassFilter\": {\n          \"description\": \"Filter returned target nodes by only returning\\r\\nnodes that have classes defined in this array.\\r\\n(default: null - all targets are returned)\",\n          \"enum\": [\n            \"Object\",\n            \"Variable\",\n            \"Method\",\n            \"ObjectType\",\n            \"VariableType\",\n            \"ReferenceType\",\n            \"DataType\",\n            \"View\"\n          ],\n          \"type\": \"string\",\n          \"items\": {\n            \"$ref\": \"#/definitions/NodeClass\"\n          },\n          \"x-ms-enum\": {\n            \"name\": \"NodeClass\",\n            \"modelAsString\": false\n          }\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"nodeIdsOnly\": {\n          \"description\": \"Whether to only return the raw node id\\r\\ninformation and not read the target node.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseFirstRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/BrowseFirstRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseFirstResponseModel\": {\n      \"description\": \"Browse response model\",\n      \"required\": [\n        \"node\",\n        \"references\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"node\": {\n          \"$ref\": \"#/definitions/NodeModel\"\n        },\n        \"references\": {\n          \"description\": \"References returned\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/NodeReferenceModel\"\n          }\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation token if more results pending.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseNextRequestModel\": {\n      \"description\": \"Request node browsing continuation\",\n      \"required\": [\n        \"continuationToken\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"continuationToken\": {\n          \"description\": \"Continuation token from previews browse request.\\r\\n(mandatory)\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"abort\": {\n          \"description\": \"Whether to abort browse and release.\\r\\n(default: false)\",\n          \"type\": \"boolean\"\n        },\n        \"targetNodesOnly\": {\n          \"description\": \"Whether to collapse all references into a set of\\r\\nunique target nodes and not show reference\\r\\ninformation.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"readVariableValues\": {\n          \"description\": \"Whether to read variable values on target nodes.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"nodeIdsOnly\": {\n          \"description\": \"Whether to only return the raw node id\\r\\ninformation and not read the target node.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseNextRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/BrowseNextRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseNextResponseModel\": {\n      \"description\": \"Result of node browse continuation\",\n      \"required\": [\n        \"references\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"references\": {\n          \"description\": \"References returned\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/NodeReferenceModel\"\n          }\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation token if more results pending.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowsePathRequestModel\": {\n      \"description\": \"Browse nodes by path\",\n      \"required\": [\n        \"browsePaths\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to browse from (defaults to root folder).\",\n          \"type\": \"string\"\n        },\n        \"browsePaths\": {\n          \"description\": \"The paths to browse from node.\\r\\n(mandatory)\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"readVariableValues\": {\n          \"description\": \"Whether to read variable values on target nodes.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"nodeIdsOnly\": {\n          \"description\": \"Whether to only return the raw node id\\r\\ninformation and not read the target node.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowsePathRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/BrowsePathRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowsePathResponseModel\": {\n      \"description\": \"Result of node browse continuation\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"targets\": {\n          \"description\": \"Targets\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/NodePathTargetModel\"\n          }\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseStreamChunkModelIAsyncEnumerable\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false\n    },\n    \"BrowseStreamRequestModel\": {\n      \"description\": \"Browse stream request model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"nodeId\": {\n          \"description\": \"Start nodes to browse.\\r\\n(defaults to root folder).\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"direction\": {\n          \"$ref\": \"#/definitions/BrowseDirection\"\n        },\n        \"view\": {\n          \"$ref\": \"#/definitions/BrowseViewModel\"\n        },\n        \"referenceTypeId\": {\n          \"description\": \"Reference types to browse.\\r\\n(default: hierarchical).\",\n          \"type\": \"string\"\n        },\n        \"noSubtypes\": {\n          \"description\": \"Whether to include subtypes of the reference type.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"readVariableValues\": {\n          \"description\": \"Whether to read variable values on source nodes.\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"noRecurse\": {\n          \"description\": \"Whether to not browse recursively\\r\\n(default is false)\",\n          \"type\": \"boolean\"\n        },\n        \"nodeClassFilter\": {\n          \"description\": \"Filter returned target nodes by only returning\\r\\nnodes that have classes defined in this array.\\r\\n(default: null - all targets are returned)\",\n          \"enum\": [\n            \"Object\",\n            \"Variable\",\n            \"Method\",\n            \"ObjectType\",\n            \"VariableType\",\n            \"ReferenceType\",\n            \"DataType\",\n            \"View\"\n          ],\n          \"type\": \"string\",\n          \"items\": {\n            \"$ref\": \"#/definitions/NodeClass\"\n          },\n          \"x-ms-enum\": {\n            \"name\": \"NodeClass\",\n            \"modelAsString\": false\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseStreamRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/BrowseStreamRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"BrowseViewModel\": {\n      \"description\": \"View to browse\",\n      \"required\": [\n        \"viewId\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"viewId\": {\n          \"description\": \"Node of the view to browse\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"version\": {\n          \"format\": \"int64\",\n          \"description\": \"Browses specific version of the view.\",\n          \"type\": \"integer\"\n        },\n        \"timestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Browses at or before this timestamp.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ByteArrayPublishedNodeCreateAssetRequestModel\": {\n      \"description\": \"Request to create an asset in the configuration api\",\n      \"required\": [\n        \"configuration\",\n        \"entry\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"entry\": {\n          \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n        },\n        \"configuration\": {\n          \"format\": \"byte\",\n          \"description\": \"The asset configuration to use when creating the asset.\",\n          \"type\": \"string\"\n        },\n        \"waitTime\": {\n          \"format\": \"date-span\",\n          \"description\": \"Time to wait after the configuration is applied to perform\\r\\nthe configuration of the asset in the configuration api.\\r\\nThis is to let the server settle.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ChannelDiagnosticModel\": {\n      \"description\": \"Channel diagnostics model\",\n      \"required\": [\n        \"connection\",\n        \"timeStamp\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"timeStamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Timestamp of the diagnostic information\",\n          \"type\": \"string\"\n        },\n        \"sessionId\": {\n          \"description\": \"The session id if connected. Empty if disconnected.\",\n          \"type\": \"string\"\n        },\n        \"sessionCreated\": {\n          \"format\": \"date-time\",\n          \"description\": \"When the session was created.\",\n          \"type\": \"string\"\n        },\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"remoteIpAddress\": {\n          \"description\": \"Effective remote ip address used for the\\r\\nconnection if connected. Empty if disconnected.\",\n          \"type\": \"string\"\n        },\n        \"remotePort\": {\n          \"format\": \"int32\",\n          \"description\": \"The effective remote port used when connected,\\r\\nnull if disconnected.\",\n          \"type\": \"integer\"\n        },\n        \"localIpAddress\": {\n          \"description\": \"Effective local ip address used for the connection\\r\\nif connected. Empty if disconnected.\",\n          \"type\": \"string\"\n        },\n        \"localPort\": {\n          \"format\": \"int32\",\n          \"description\": \"The effective local port used when connected,\\r\\nnull if disconnected.\",\n          \"type\": \"integer\"\n        },\n        \"channelId\": {\n          \"format\": \"int64\",\n          \"description\": \"The id assigned to the channel that the token\\r\\nbelongs to.\",\n          \"type\": \"integer\"\n        },\n        \"tokenId\": {\n          \"format\": \"int64\",\n          \"description\": \"The id assigned to the token.\",\n          \"type\": \"integer\"\n        },\n        \"createdAt\": {\n          \"format\": \"date-time\",\n          \"description\": \"When the token was created by the server\\r\\n(refers to the server's clock).\",\n          \"type\": \"string\"\n        },\n        \"lifetime\": {\n          \"format\": \"date-span\",\n          \"description\": \"The lifetime of the token\",\n          \"type\": \"string\"\n        },\n        \"client\": {\n          \"$ref\": \"#/definitions/ChannelKeyModel\"\n        },\n        \"server\": {\n          \"$ref\": \"#/definitions/ChannelKeyModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ChannelDiagnosticModelIAsyncEnumerable\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false\n    },\n    \"ChannelKeyModel\": {\n      \"description\": \"Channel token key model.\",\n      \"required\": [\n        \"iv\",\n        \"key\",\n        \"sigLen\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"iv\": {\n          \"description\": \"Iv\",\n          \"type\": \"array\",\n          \"items\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\"\n          }\n        },\n        \"key\": {\n          \"description\": \"Key\",\n          \"type\": \"array\",\n          \"items\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\"\n          }\n        },\n        \"sigLen\": {\n          \"format\": \"int32\",\n          \"description\": \"Signature length\",\n          \"type\": \"integer\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ConditionHandlingOptionsModel\": {\n      \"description\": \"Condition handling options model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"updateInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"Time interval for sending pending interval updates in seconds.\",\n          \"type\": \"integer\"\n        },\n        \"snapshotInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"Time interval for sending pending interval snapshot in seconds.\",\n          \"type\": \"integer\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ConnectionDiagnosticsModelIAsyncEnumerable\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false\n    },\n    \"ConnectionModel\": {\n      \"description\": \"Connection model\",\n      \"required\": [\n        \"endpoint\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"endpoint\": {\n          \"$ref\": \"#/definitions/EndpointModel\"\n        },\n        \"user\": {\n          \"$ref\": \"#/definitions/CredentialModel\"\n        },\n        \"diagnostics\": {\n          \"$ref\": \"#/definitions/DiagnosticsModel\"\n        },\n        \"group\": {\n          \"description\": \"Connection group allows splitting connections\\r\\nper purpose.\",\n          \"type\": \"string\"\n        },\n        \"locales\": {\n          \"description\": \"Optional list of preferred locales in preference order.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"options\": {\n          \"$ref\": \"#/definitions/ConnectionOptions\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ConnectionOptions\": {\n      \"description\": \"Options that can be applied to a connection\",\n      \"enum\": [\n        \"None\",\n        \"UseReverseConnect\",\n        \"NoComplexTypeSystem\",\n        \"NoSubscriptionTransfer\",\n        \"DumpDiagnostics\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"ConnectionOptions\",\n        \"modelAsString\": false\n      }\n    },\n    \"ContentFilterElementModel\": {\n      \"description\": \"An expression element in the filter ast\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"filterOperator\": {\n          \"$ref\": \"#/definitions/FilterOperatorType\"\n        },\n        \"filterOperands\": {\n          \"description\": \"The operands in the element for the operator\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/FilterOperandModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ContentFilterModel\": {\n      \"description\": \"Content filter\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"elements\": {\n          \"description\": \"The flat list of elements in the filter AST\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ContentFilterElementModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"CredentialModel\": {\n      \"description\": \"Credential model. For backwards compatibility\\r\\nthe actual credentials to pass to the server is set\\r\\nthrough the value property.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"$ref\": \"#/definitions/CredentialType\"\n        },\n        \"value\": {\n          \"$ref\": \"#/definitions/UserIdentityModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"CredentialType\": {\n      \"description\": \"Type of credentials to use for authentication\",\n      \"enum\": [\n        \"None\",\n        \"UserName\",\n        \"X509Certificate\",\n        \"JwtToken\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"CredentialType\",\n        \"modelAsString\": false\n      }\n    },\n    \"DataChangeTriggerType\": {\n      \"description\": \"Data change trigger\",\n      \"enum\": [\n        \"Status\",\n        \"StatusValue\",\n        \"StatusValueTimestamp\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"DataChangeTriggerType\",\n        \"modelAsString\": false\n      }\n    },\n    \"DataLocation\": {\n      \"description\": \"Indicate the data location\",\n      \"enum\": [\n        \"Raw\",\n        \"Calculated\",\n        \"Interpolated\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"DataLocation\",\n        \"modelAsString\": false\n      }\n    },\n    \"DataSetRoutingMode\": {\n      \"description\": \"Specifies how OPC UA node paths are mapped to message routing paths/topics.\\r\\nControls automatic topic structure generation from OPC UA address space.\\r\\nUsed to create a unified namespace when publishing to message brokers\\r\\nthat support hierarchical routing like MQTT.\",\n      \"enum\": [\n        \"None\",\n        \"UseBrowseNames\",\n        \"UseBrowseNamesWithNamespaceIndex\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"DataSetRoutingMode\",\n        \"modelAsString\": false\n      }\n    },\n    \"DataTypeMetadataModel\": {\n      \"description\": \"Data type metadata model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"dataType\": {\n          \"description\": \"The data type for the instance declaration.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeadbandType\": {\n      \"description\": \"Deadband type\",\n      \"enum\": [\n        \"Absolute\",\n        \"Percent\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"DeadbandType\",\n        \"modelAsString\": false\n      }\n    },\n    \"DeleteEventsDetailsModel\": {\n      \"description\": \"The events to delete\",\n      \"required\": [\n        \"eventIds\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"eventIds\": {\n          \"description\": \"Events to delete\",\n          \"type\": \"array\",\n          \"items\": {\n            \"format\": \"byte\",\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeleteEventsDetailsModelHistoryUpdateRequestModel\": {\n      \"description\": \"Request node history update\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to update (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/DeleteEventsDetailsModel\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeleteEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/DeleteEventsDetailsModelHistoryUpdateRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeleteValuesAtTimesDetailsModel\": {\n      \"description\": \"Deletes data at times\",\n      \"required\": [\n        \"reqTimes\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"reqTimes\": {\n          \"description\": \"The timestamps to delete\",\n          \"type\": \"array\",\n          \"items\": {\n            \"format\": \"date-time\",\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeleteValuesAtTimesDetailsModelHistoryUpdateRequestModel\": {\n      \"description\": \"Request node history update\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to update (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/DeleteValuesAtTimesDetailsModel\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeleteValuesAtTimesDetailsModelHistoryUpdateRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/DeleteValuesAtTimesDetailsModelHistoryUpdateRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeleteValuesDetailsModel\": {\n      \"description\": \"Delete values\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"startTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"Start time\",\n          \"type\": \"string\"\n        },\n        \"endTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"End time to delete until\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeleteValuesDetailsModelHistoryUpdateRequestModel\": {\n      \"description\": \"Request node history update\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to update (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/DeleteValuesDetailsModel\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DeleteValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/DeleteValuesDetailsModelHistoryUpdateRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DiagnosticsLevel\": {\n      \"description\": \"Level of diagnostics requested in responses\",\n      \"enum\": [\n        \"None\",\n        \"Status\",\n        \"Information\",\n        \"Debug\",\n        \"Verbose\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"DiagnosticsLevel\",\n        \"modelAsString\": false\n      }\n    },\n    \"DiagnosticsModel\": {\n      \"description\": \"Diagnostics configuration\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"level\": {\n          \"$ref\": \"#/definitions/DiagnosticsLevel\"\n        },\n        \"auditId\": {\n          \"description\": \"Client audit log entry.\\r\\n(default: client generated)\",\n          \"type\": \"string\"\n        },\n        \"timeStamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Timestamp of request.\\r\\n(default: client generated)\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DiscoveryCancelRequestModel\": {\n      \"description\": \"Discovery cancel request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Id of discovery request\",\n          \"type\": \"string\"\n        },\n        \"context\": {\n          \"$ref\": \"#/definitions/OperationContextModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DiscoveryConfigModel\": {\n      \"description\": \"Discovery configuration api model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"addressRangesToScan\": {\n          \"description\": \"Address ranges to scan (null == all wired nics)\",\n          \"type\": \"string\"\n        },\n        \"networkProbeTimeout\": {\n          \"format\": \"date-span\",\n          \"description\": \"Network probe timeout\",\n          \"type\": \"string\"\n        },\n        \"maxNetworkProbes\": {\n          \"format\": \"int32\",\n          \"description\": \"Max network probes that should ever run.\",\n          \"type\": \"integer\"\n        },\n        \"portRangesToScan\": {\n          \"description\": \"Port ranges to scan (null == all unassigned)\",\n          \"type\": \"string\"\n        },\n        \"portProbeTimeout\": {\n          \"format\": \"date-span\",\n          \"description\": \"Port probe timeout\",\n          \"type\": \"string\"\n        },\n        \"maxPortProbes\": {\n          \"format\": \"int32\",\n          \"description\": \"Max port probes that should ever run.\",\n          \"type\": \"integer\"\n        },\n        \"minPortProbesPercent\": {\n          \"format\": \"int32\",\n          \"description\": \"Probes that must always be there as percent of max.\",\n          \"type\": \"integer\"\n        },\n        \"idleTimeBetweenScans\": {\n          \"format\": \"date-span\",\n          \"description\": \"Delay time between discovery sweeps\",\n          \"type\": \"string\"\n        },\n        \"discoveryUrls\": {\n          \"description\": \"List of preset discovery urls to use\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"locales\": {\n          \"description\": \"List of locales to filter with during discovery\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"DiscoveryMode\": {\n      \"description\": \"Discovery mode to use\",\n      \"enum\": [\n        \"Off\",\n        \"Local\",\n        \"Network\",\n        \"Fast\",\n        \"Scan\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"DiscoveryMode\",\n        \"modelAsString\": false\n      }\n    },\n    \"DiscoveryRequestModel\": {\n      \"description\": \"Discovery request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Id of discovery request\",\n          \"type\": \"string\"\n        },\n        \"discovery\": {\n          \"$ref\": \"#/definitions/DiscoveryMode\"\n        },\n        \"configuration\": {\n          \"$ref\": \"#/definitions/DiscoveryConfigModel\"\n        },\n        \"context\": {\n          \"$ref\": \"#/definitions/OperationContextModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"EndpointModel\": {\n      \"description\": \"Endpoint model\",\n      \"required\": [\n        \"url\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"Endpoint url to use to connect with\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"alternativeUrls\": {\n          \"description\": \"Alternative endpoint urls that can be used for\\r\\naccessing and validating the server\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"securityMode\": {\n          \"$ref\": \"#/definitions/SecurityMode\"\n        },\n        \"securityPolicy\": {\n          \"description\": \"Security policy uri to use for communication.\\r\\ndefault to best.\",\n          \"type\": \"string\"\n        },\n        \"certificate\": {\n          \"description\": \"Endpoint certificate thumbprint\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"EndpointRegistrationModel\": {\n      \"description\": \"Endpoint registration\",\n      \"required\": [\n        \"id\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Endpoint identifier which is hashed from\\r\\nthe supervisor, site and url.\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"endpointUrl\": {\n          \"description\": \"Original endpoint url of the endpoint\",\n          \"type\": \"string\"\n        },\n        \"siteId\": {\n          \"description\": \"Registered site of the endpoint\",\n          \"type\": \"string\"\n        },\n        \"discovererId\": {\n          \"description\": \"Entity that registered and can access the endpoint\",\n          \"type\": \"string\"\n        },\n        \"endpoint\": {\n          \"$ref\": \"#/definitions/EndpointModel\"\n        },\n        \"securityLevel\": {\n          \"format\": \"int32\",\n          \"description\": \"Security level of the endpoint\",\n          \"type\": \"integer\"\n        },\n        \"authenticationMethods\": {\n          \"description\": \"Supported authentication methods that can be selected to\\r\\nobtain a credential and used to interact with the endpoint.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/AuthenticationMethodModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"EventFilterModel\": {\n      \"description\": \"Event filter\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"selectClauses\": {\n          \"description\": \"Select clauses\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/SimpleAttributeOperandModel\"\n          }\n        },\n        \"whereClause\": {\n          \"$ref\": \"#/definitions/ContentFilterModel\"\n        },\n        \"typeDefinitionId\": {\n          \"description\": \"Simple event Type definition node id\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ExceptionDeviationType\": {\n      \"description\": \"Exception deviation type\",\n      \"enum\": [\n        \"AbsoluteValue\",\n        \"PercentOfValue\",\n        \"PercentOfRange\",\n        \"PercentOfEURange\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"ExceptionDeviationType\",\n        \"modelAsString\": false\n      }\n    },\n    \"FileInfoModel\": {\n      \"description\": \"File info\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"size\": {\n          \"format\": \"int64\",\n          \"description\": \"The size of the file in Bytes. When a file is\\r\\ncurrently opened for write, the size might not be\\r\\naccurate or available.\",\n          \"type\": \"integer\"\n        },\n        \"writable\": {\n          \"description\": \"Whether the file is writable.\",\n          \"type\": \"boolean\"\n        },\n        \"openCount\": {\n          \"format\": \"int32\",\n          \"description\": \"The number of currently valid file handles on\\r\\nthe file.\",\n          \"type\": \"integer\"\n        },\n        \"mimeType\": {\n          \"description\": \"The media type of the file based on RFC 2046.\",\n          \"type\": \"string\"\n        },\n        \"maxBufferSize\": {\n          \"format\": \"int64\",\n          \"description\": \"The maximum number of bytes of\\r\\nthe read and write buffers.\",\n          \"type\": \"integer\"\n        },\n        \"lastModified\": {\n          \"format\": \"date-time\",\n          \"description\": \"The time the file was last modified.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"FileInfoModelServiceResponse\": {\n      \"description\": \"Response envelope\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"result\": {\n          \"$ref\": \"#/definitions/FileInfoModel\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"FileSystemObjectModel\": {\n      \"description\": \"File system object model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"The node id of the filesystem object\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"The browse path to the filesystem object\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"name\": {\n          \"description\": \"The name of the filesystem object\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"FileSystemObjectModelIEnumerableServiceResponse\": {\n      \"description\": \"Response envelope\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"result\": {\n          \"description\": \"Result\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/FileSystemObjectModel\"\n          }\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"FileSystemObjectModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/FileSystemObjectModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"FileSystemObjectModelServiceResponse\": {\n      \"description\": \"Response envelope\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"result\": {\n          \"$ref\": \"#/definitions/FileSystemObjectModel\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"FileSystemObjectModelServiceResponseIAsyncEnumerable\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false\n    },\n    \"FilterOperandModel\": {\n      \"description\": \"Filter operand\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"index\": {\n          \"format\": \"int64\",\n          \"description\": \"Element reference in the outer list if\\r\\noperand is an element operand\",\n          \"type\": \"integer\"\n        },\n        \"value\": {\n          \"description\": \"Variant value if operand is a literal\",\n          \"type\": \"object\"\n        },\n        \"nodeId\": {\n          \"description\": \"Type definition node id if operand is\\r\\nsimple or full attribute operand.\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"Browse path of attribute operand\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"attributeId\": {\n          \"$ref\": \"#/definitions/NodeAttribute\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range of attribute operand\",\n          \"type\": \"string\"\n        },\n        \"alias\": {\n          \"description\": \"Optional alias to refer to it makeing it a\\r\\nfull blown attribute operand\",\n          \"type\": \"string\"\n        },\n        \"dataType\": {\n          \"description\": \"Data type if operand is a literal\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"FilterOperatorType\": {\n      \"description\": \"Filter operator type\",\n      \"enum\": [\n        \"Equals\",\n        \"IsNull\",\n        \"GreaterThan\",\n        \"LessThan\",\n        \"GreaterThanOrEqual\",\n        \"LessThanOrEqual\",\n        \"Like\",\n        \"Not\",\n        \"Between\",\n        \"InList\",\n        \"And\",\n        \"Or\",\n        \"Cast\",\n        \"InView\",\n        \"OfType\",\n        \"RelatedTo\",\n        \"BitwiseAnd\",\n        \"BitwiseOr\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"FilterOperatorType\",\n        \"modelAsString\": false\n      }\n    },\n    \"GetConfiguredEndpointsResponseModel\": {\n      \"description\": \"Result of GetConfiguredEndpoints method call\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"endpoints\": {\n          \"description\": \"Collection of Endpoints in the configuration\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"GetConfiguredNodesOnEndpointResponseModel\": {\n      \"description\": \"Result of GetConfiguredNodesOnEndpoint method call\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"opcNodes\": {\n          \"description\": \"Collection of Nodes configured for a particular endpoint\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/OpcNodeModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HeartbeatBehavior\": {\n      \"description\": \"Controls how heartbeat messages are handled for monitored items.\\r\\nHeartbeats help maintain awareness of node state and connection health\\r\\neven when values don't change. Can be configured globally via the\\r\\n--hbb command line option. Works with heartbeat interval settings.\",\n      \"enum\": [\n        \"WatchdogLKV\",\n        \"WatchdogLKG\",\n        \"PeriodicLKV\",\n        \"PeriodicLKG\",\n        \"WatchdogLKVWithUpdatedTimestamps\",\n        \"WatchdogLKVDiagnosticsOnly\",\n        \"Reserved\",\n        \"PeriodicLKVDropValue\",\n        \"PeriodicLKGDropValue\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"HeartbeatBehavior\",\n        \"modelAsString\": false\n      }\n    },\n    \"HistoricEventModel\": {\n      \"description\": \"Historic event\",\n      \"required\": [\n        \"eventFields\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"eventFields\": {\n          \"description\": \"The selected fields of the event\",\n          \"type\": \"object\",\n          \"items\": {\n            \"description\": \"A variant which can be represented by any value including null.\",\n            \"type\": \"object\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoricEventModelArrayHistoryReadNextResponseModel\": {\n      \"description\": \"History read continuation result\",\n      \"required\": [\n        \"history\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"history\": {\n          \"description\": \"History as json encoded extension object\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/HistoricEventModel\"\n          }\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation token if more results pending.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoricEventModelArrayHistoryReadResponseModel\": {\n      \"description\": \"History read results\",\n      \"required\": [\n        \"history\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"history\": {\n          \"description\": \"History as json encoded extension object\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/HistoricEventModel\"\n          }\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation token if more results pending.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoricEventModelIAsyncEnumerable\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false\n    },\n    \"HistoricValueModel\": {\n      \"description\": \"Historic data\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"value\": {\n          \"description\": \"The value of data value.\",\n          \"type\": \"object\"\n        },\n        \"dataType\": {\n          \"description\": \"Built in data type of the updated values\",\n          \"type\": \"string\"\n        },\n        \"status\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        },\n        \"sourceTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"The source timestamp associated with the value.\",\n          \"type\": \"string\"\n        },\n        \"sourcePicoseconds\": {\n          \"format\": \"int32\",\n          \"description\": \"Additional resolution for the source timestamp.\",\n          \"type\": \"integer\"\n        },\n        \"serverTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"The server timestamp associated with the value.\",\n          \"type\": \"string\"\n        },\n        \"serverPicoseconds\": {\n          \"format\": \"int32\",\n          \"description\": \"Additional resolution for the server timestamp.\",\n          \"type\": \"integer\"\n        },\n        \"dataLocation\": {\n          \"$ref\": \"#/definitions/DataLocation\"\n        },\n        \"modificationInfo\": {\n          \"$ref\": \"#/definitions/ModificationInfoModel\"\n        },\n        \"additionalData\": {\n          \"$ref\": \"#/definitions/AdditionalData\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoricValueModelArrayHistoryReadNextResponseModel\": {\n      \"description\": \"History read continuation result\",\n      \"required\": [\n        \"history\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"history\": {\n          \"description\": \"History as json encoded extension object\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/HistoricValueModel\"\n          }\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation token if more results pending.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoricValueModelArrayHistoryReadResponseModel\": {\n      \"description\": \"History read results\",\n      \"required\": [\n        \"history\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"history\": {\n          \"description\": \"History as json encoded extension object\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/HistoricValueModel\"\n          }\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation token if more results pending.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoricValueModelIAsyncEnumerable\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false\n    },\n    \"HistoryConfigurationModel\": {\n      \"description\": \"History configuration\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"stepped\": {\n          \"description\": \"specifies whether the historical data was\\r\\ncollected in such a manner that it should\\r\\nbe displayed as SlopedInterpolation (sloped\\r\\nline between points) or as SteppedInterpolation\\r\\n(vertically-connected horizontal lines\\r\\nbetween points) when raw data is examined.\\r\\nThis Property also effects how some\\r\\nAggregates are calculated\",\n          \"type\": \"boolean\"\n        },\n        \"definition\": {\n          \"description\": \"Human readable string that specifies how\\r\\nthe value of this HistoricalDataNode is\\r\\ncalculated\",\n          \"type\": \"string\"\n        },\n        \"maxTimeInterval\": {\n          \"format\": \"date-span\",\n          \"description\": \"Specifies the maximum interval between data\\r\\npoints in the history repository\\r\\nregardless of their value change\",\n          \"type\": \"string\"\n        },\n        \"minTimeInterval\": {\n          \"format\": \"date-span\",\n          \"description\": \"Specifies the minimum interval between\\r\\ndata points in the history repository\\r\\nregardless of their value change\",\n          \"type\": \"string\"\n        },\n        \"exceptionDeviation\": {\n          \"format\": \"double\",\n          \"description\": \"Minimum amount that the data for the\\r\\nNode shall change in order for the change\\r\\nto be reported to the history database\",\n          \"type\": \"number\"\n        },\n        \"exceptionDeviationType\": {\n          \"$ref\": \"#/definitions/ExceptionDeviationType\"\n        },\n        \"startOfArchive\": {\n          \"format\": \"date-time\",\n          \"description\": \"The date before which there is no data in the\\r\\narchive either online or offline\",\n          \"type\": \"string\"\n        },\n        \"endOfArchive\": {\n          \"format\": \"date-time\",\n          \"description\": \"The last date of the archive\",\n          \"type\": \"string\"\n        },\n        \"startOfOnlineArchive\": {\n          \"format\": \"date-time\",\n          \"description\": \"Date of the earliest data in the online archive\",\n          \"type\": \"string\"\n        },\n        \"serverTimestampSupported\": {\n          \"description\": \"Server supports ServerTimestamps in addition\\r\\nto SourceTimestamp\",\n          \"type\": \"boolean\"\n        },\n        \"aggregateConfiguration\": {\n          \"$ref\": \"#/definitions/AggregateConfigurationModel\"\n        },\n        \"aggregateFunctions\": {\n          \"description\": \"Allowed aggregate functions\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoryConfigurationRequestModel\": {\n      \"description\": \"Request history configuration\",\n      \"required\": [\n        \"nodeId\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"nodeId\": {\n          \"description\": \"Continuation token to continue reading more\\r\\nresults.\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoryConfigurationRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/HistoryConfigurationRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoryConfigurationResponseModel\": {\n      \"description\": \"Response with history configuration\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"configuration\": {\n          \"$ref\": \"#/definitions/HistoryConfigurationModel\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoryReadNextRequestModel\": {\n      \"description\": \"Request node history read continuation\",\n      \"required\": [\n        \"continuationToken\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"continuationToken\": {\n          \"description\": \"Continuation token to continue reading more\\r\\nresults.\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"abort\": {\n          \"description\": \"Abort reading after this read\",\n          \"type\": \"boolean\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoryReadNextRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/HistoryReadNextRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoryServerCapabilitiesModel\": {\n      \"description\": \"History Server capabilities\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"supportsHistoricData\": {\n          \"description\": \"Server supports historic data access\",\n          \"type\": \"boolean\"\n        },\n        \"supportsHistoricEvents\": {\n          \"description\": \"Server supports historic event access\",\n          \"type\": \"boolean\"\n        },\n        \"maxReturnDataValues\": {\n          \"format\": \"int64\",\n          \"description\": \"Maximum number of historic data values that will\\r\\nbe returned in a single read.\",\n          \"type\": \"integer\"\n        },\n        \"maxReturnEventValues\": {\n          \"format\": \"int64\",\n          \"description\": \"Maximum number of events that will be returned\\r\\nin a single read.\",\n          \"type\": \"integer\"\n        },\n        \"insertDataCapability\": {\n          \"description\": \"Server supports inserting data\",\n          \"type\": \"boolean\"\n        },\n        \"replaceDataCapability\": {\n          \"description\": \"Server supports replacing historic data\",\n          \"type\": \"boolean\"\n        },\n        \"updateDataCapability\": {\n          \"description\": \"Server supports updating historic data\",\n          \"type\": \"boolean\"\n        },\n        \"deleteRawCapability\": {\n          \"description\": \"Server supports deleting raw data\",\n          \"type\": \"boolean\"\n        },\n        \"deleteAtTimeCapability\": {\n          \"description\": \"Server support deleting data at times\",\n          \"type\": \"boolean\"\n        },\n        \"insertEventCapability\": {\n          \"description\": \"Server supports inserting events\",\n          \"type\": \"boolean\"\n        },\n        \"replaceEventCapability\": {\n          \"description\": \"Server supports replacing events\",\n          \"type\": \"boolean\"\n        },\n        \"updateEventCapability\": {\n          \"description\": \"Server supports updating events\",\n          \"type\": \"boolean\"\n        },\n        \"deleteEventCapability\": {\n          \"description\": \"Server supports deleting events\",\n          \"type\": \"boolean\"\n        },\n        \"insertAnnotationCapability\": {\n          \"description\": \"Allows inserting annotations\",\n          \"type\": \"boolean\"\n        },\n        \"serverTimestampSupported\": {\n          \"description\": \"Server supports ServerTimestamps in addition\\r\\nto SourceTimestamp\",\n          \"type\": \"boolean\"\n        },\n        \"aggregateFunctions\": {\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"HistoryUpdateOperation\": {\n      \"description\": \"History update type\",\n      \"enum\": [\n        \"Insert\",\n        \"Replace\",\n        \"Update\",\n        \"Delete\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"HistoryUpdateOperation\",\n        \"modelAsString\": false\n      }\n    },\n    \"HistoryUpdateResponseModel\": {\n      \"description\": \"History update results\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"results\": {\n          \"description\": \"List of results from the update operation\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ServiceResultModel\"\n          }\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"InstanceDeclarationModel\": {\n      \"description\": \"Instance declaration meta data\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"rootTypeId\": {\n          \"description\": \"The type that the declaration belongs to.\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"The browse path\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"displayPath\": {\n          \"description\": \"A localized path to the instance declaration.\",\n          \"type\": \"string\"\n        },\n        \"modellingRule\": {\n          \"description\": \"The modelling rule for the instance\\r\\ndeclaration (i.e. Mandatory or Optional).\",\n          \"type\": \"string\"\n        },\n        \"nodeId\": {\n          \"description\": \"The node id for the instance.\",\n          \"type\": \"string\"\n        },\n        \"nodeClass\": {\n          \"$ref\": \"#/definitions/NodeClass\"\n        },\n        \"browseName\": {\n          \"description\": \"The browse name for the instance declaration.\",\n          \"type\": \"string\"\n        },\n        \"displayName\": {\n          \"description\": \"The display name for the instance declaration.\",\n          \"type\": \"string\"\n        },\n        \"description\": {\n          \"description\": \"The description for the instance declaration.\",\n          \"type\": \"string\"\n        },\n        \"variable\": {\n          \"$ref\": \"#/definitions/VariableMetadataModel\"\n        },\n        \"method\": {\n          \"$ref\": \"#/definitions/MethodMetadataModel\"\n        },\n        \"overriddenDeclaration\": {\n          \"$ref\": \"#/definitions/InstanceDeclarationModel\"\n        },\n        \"modellingRuleId\": {\n          \"description\": \"The modelling rule node id.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MessageEncoding\": {\n      \"description\": \"Specifies the encoding format for OPC UA Publisher messages.\\r\\nCan be combined with compression and reversibility flags to control\\r\\nmessage format characteristics.\",\n      \"enum\": [\n        \"Uadp\",\n        \"Json\",\n        \"Xml\",\n        \"Avro\",\n        \"IsReversible\",\n        \"JsonReversible\",\n        \"IsGzipCompressed\",\n        \"JsonGzip\",\n        \"AvroGzip\",\n        \"JsonReversibleGzip\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"MessageEncoding\",\n        \"modelAsString\": false\n      }\n    },\n    \"MessagingMode\": {\n      \"description\": \"Defines how OPC UA Publisher formats and structures messages for transport.\\r\\nEach mode provides different trade-offs between message completeness,\\r\\nbandwidth efficiency, and compatibility with different message consumers.\",\n      \"enum\": [\n        \"PubSub\",\n        \"Samples\",\n        \"FullNetworkMessages\",\n        \"FullSamples\",\n        \"DataSetMessages\",\n        \"SingleDataSetMessage\",\n        \"DataSets\",\n        \"SingleDataSet\",\n        \"RawDataSets\",\n        \"SingleRawDataSet\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"MessagingMode\",\n        \"modelAsString\": false\n      }\n    },\n    \"MethodCallArgumentModel\": {\n      \"description\": \"Method argument model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"value\": {\n          \"description\": \"Initial value or value to use\",\n          \"type\": \"object\"\n        },\n        \"dataType\": {\n          \"description\": \"Data type Id of the value (from meta data)\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MethodCallRequestModel\": {\n      \"description\": \"Call request model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"methodId\": {\n          \"description\": \"Method id of method to call.\",\n          \"type\": \"string\"\n        },\n        \"objectId\": {\n          \"description\": \"Context of the method, i.e. an object or object type\\r\\nnode.  If null then the method is called in the context\\r\\nof the inverse HasComponent reference of the MethodId\\r\\nif it exists.\",\n          \"type\": \"string\"\n        },\n        \"arguments\": {\n          \"description\": \"Arguments for the method - null means no args\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MethodCallArgumentModel\"\n          }\n        },\n        \"methodBrowsePath\": {\n          \"description\": \"An optional component path from the node identified by\\r\\nMethodId or from a resolved objectId to the actual\\r\\nmethod node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"objectBrowsePath\": {\n          \"description\": \"An optional component path from the node identified by\\r\\nObjectId to the actual object or objectType node.\\r\\nIf ObjectId is null, the root node (i=84) is used\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MethodCallRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/MethodCallRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MethodCallResponseModel\": {\n      \"description\": \"Method call response model\",\n      \"required\": [\n        \"results\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"results\": {\n          \"description\": \"Resulting output values of method call\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MethodCallArgumentModel\"\n          }\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MethodMetadataArgumentModel\": {\n      \"description\": \"Method argument metadata model\",\n      \"required\": [\n        \"name\",\n        \"type\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"description\": \"Name of the argument\",\n          \"type\": \"string\"\n        },\n        \"description\": {\n          \"description\": \"Optional description of argument\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"$ref\": \"#/definitions/NodeModel\"\n        },\n        \"defaultValue\": {\n          \"description\": \"Default value for the argument\",\n          \"type\": \"object\"\n        },\n        \"valueRank\": {\n          \"$ref\": \"#/definitions/NodeValueRank\"\n        },\n        \"arrayDimensions\": {\n          \"format\": \"int64\",\n          \"description\": \"Optional Array dimension of argument\",\n          \"type\": \"integer\",\n          \"items\": {\n            \"format\": \"int64\",\n            \"type\": \"integer\"\n          }\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MethodMetadataModel\": {\n      \"description\": \"Method metadata model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"objectId\": {\n          \"description\": \"Id of object that the method is a component of\",\n          \"type\": \"string\"\n        },\n        \"inputArguments\": {\n          \"description\": \"Input argument meta data\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MethodMetadataArgumentModel\"\n          }\n        },\n        \"outputArguments\": {\n          \"description\": \"output argument meta data\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MethodMetadataArgumentModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MethodMetadataRequestModel\": {\n      \"description\": \"Method metadata request model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"methodId\": {\n          \"description\": \"Method id of method to call.\\r\\n(Required)\",\n          \"type\": \"string\"\n        },\n        \"methodBrowsePath\": {\n          \"description\": \"An optional component path from the node identified by\\r\\nMethodId to the actual method node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MethodMetadataRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/MethodMetadataRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MethodMetadataResponseModel\": {\n      \"description\": \"Result of method metadata query\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"objectId\": {\n          \"description\": \"Id of object that the method is a component of\",\n          \"type\": \"string\"\n        },\n        \"inputArguments\": {\n          \"description\": \"Input argument meta data\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MethodMetadataArgumentModel\"\n          }\n        },\n        \"outputArguments\": {\n          \"description\": \"output argument meta data\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MethodMetadataArgumentModel\"\n          }\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ModelChangeHandlingOptionsModel\": {\n      \"description\": \"Describes how model changes are published\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"rebrowseIntervalTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"Rebrowse period\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ModificationInfoModel\": {\n      \"description\": \"Modification information\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"modificationTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"Modification time\",\n          \"type\": \"string\"\n        },\n        \"updateType\": {\n          \"$ref\": \"#/definitions/HistoryUpdateOperation\"\n        },\n        \"userName\": {\n          \"description\": \"User who made the change\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"MonitoredItemWatchdogCondition\": {\n      \"description\": \"Defines the conditions that trigger the subscription watchdog behavior.\\r\\nWorks in conjunction with OpcNodeWatchdogTimespan to determine when nodes\\r\\nare considered \\\"late\\\" and DataSetWriterWatchdogBehavior to define the response.\\r\\nCan be configured globally via the --mwc command line option.\",\n      \"enum\": [\n        \"WhenAllAreLate\",\n        \"WhenAnyIsLate\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"MonitoredItemWatchdogCondition\",\n        \"modelAsString\": false\n      }\n    },\n    \"NamespaceFormat\": {\n      \"description\": \"Namespace serialization format for node ids\\r\\nand qualified names.\",\n      \"enum\": [\n        \"Uri\",\n        \"Index\",\n        \"Expanded\",\n        \"ExpandedWithNamespace0\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"NamespaceFormat\",\n        \"modelAsString\": false\n      }\n    },\n    \"NodeAccessLevel\": {\n      \"description\": \"Flags that can be set for the AccessLevel attribute.\",\n      \"enum\": [\n        \"None\",\n        \"CurrentRead\",\n        \"CurrentWrite\",\n        \"HistoryRead\",\n        \"HistoryWrite\",\n        \"SemanticChange\",\n        \"StatusWrite\",\n        \"TimestampWrite\",\n        \"NonatomicRead\",\n        \"NonatomicWrite\",\n        \"WriteFullArrayOnly\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"NodeAccessLevel\",\n        \"modelAsString\": false\n      }\n    },\n    \"NodeAccessRestrictions\": {\n      \"description\": \"Flags that can be read or written in the\\r\\nAccessRestrictions attribute.\",\n      \"enum\": [\n        \"None\",\n        \"SigningRequired\",\n        \"EncryptionRequired\",\n        \"SessionRequired\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"NodeAccessRestrictions\",\n        \"modelAsString\": false\n      }\n    },\n    \"NodeAttribute\": {\n      \"description\": \"Node attribute identifiers\",\n      \"enum\": [\n        \"NodeId\",\n        \"NodeClass\",\n        \"BrowseName\",\n        \"DisplayName\",\n        \"Description\",\n        \"WriteMask\",\n        \"UserWriteMask\",\n        \"IsAbstract\",\n        \"Symmetric\",\n        \"InverseName\",\n        \"ContainsNoLoops\",\n        \"EventNotifier\",\n        \"Value\",\n        \"DataType\",\n        \"ValueRank\",\n        \"ArrayDimensions\",\n        \"AccessLevel\",\n        \"UserAccessLevel\",\n        \"MinimumSamplingInterval\",\n        \"Historizing\",\n        \"Executable\",\n        \"UserExecutable\",\n        \"DataTypeDefinition\",\n        \"RolePermissions\",\n        \"UserRolePermissions\",\n        \"AccessRestrictions\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"NodeAttribute\",\n        \"modelAsString\": false\n      }\n    },\n    \"NodeClass\": {\n      \"description\": \"Node class\",\n      \"enum\": [\n        \"Object\",\n        \"Variable\",\n        \"Method\",\n        \"ObjectType\",\n        \"VariableType\",\n        \"ReferenceType\",\n        \"DataType\",\n        \"View\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"NodeClass\",\n        \"modelAsString\": false\n      }\n    },\n    \"NodeEventNotifier\": {\n      \"description\": \"Flags that can be set for the EventNotifier attribute.\",\n      \"enum\": [\n        \"SubscribeToEvents\",\n        \"HistoryRead\",\n        \"HistoryWrite\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"NodeEventNotifier\",\n        \"modelAsString\": false\n      }\n    },\n    \"NodeIdModel\": {\n      \"description\": \"Represents an OPC UA Node identifier in string format.\\r\\nUsed to identify nodes in the OPC UA address space for monitoring.\\r\\nSupports standard OPC UA node ID formats including:\\r\\n- Namespace index and identifier (ns=0;i=85)\\r\\n- String identifiers (ns=2;s=MyNode)\\r\\n- GUID identifiers (ns=3;g=8599E6C4-6667-4FB7-9EA9-C6896B31DB02)\\r\\n- Opaque/binary identifiers (ns=4;b=FA34E...)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Identifier\": {\n          \"description\": \"The node identifier string in standard OPC UA notation.\\r\\nFormat: ns={namespace};{type}={value}\\r\\nExamples:\\r\\n- ns=0;i=85 (numeric identifier)\\r\\n- ns=2;s=MyNode (string identifier)\\r\\n- ns=3;g=8599E6C4-6667-4FB7-9EA9-C6896B31DB02 (GUID)\\r\\n- ns=4;b=FA34E... (binary/opaque)\\r\\nIf namespace index is omitted, ns=0 is assumed.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"NodeMetadataRequestModel\": {\n      \"description\": \"Node metadata request model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"nodeId\": {\n          \"description\": \"Node id of the type.\\r\\n(Required)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional component path from the node identified by\\r\\nNodeId to the actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"NodeMetadataRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/NodeMetadataRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"NodeMetadataResponseModel\": {\n      \"description\": \"Node metadata model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"The node id of the node\",\n          \"type\": \"string\"\n        },\n        \"nodeClass\": {\n          \"$ref\": \"#/definitions/NodeClass\"\n        },\n        \"displayName\": {\n          \"description\": \"The display name of the node.\",\n          \"type\": \"string\"\n        },\n        \"description\": {\n          \"description\": \"The description for the node.\",\n          \"type\": \"string\"\n        },\n        \"variableMetadata\": {\n          \"$ref\": \"#/definitions/VariableMetadataModel\"\n        },\n        \"dataTypeMetadata\": {\n          \"$ref\": \"#/definitions/DataTypeMetadataModel\"\n        },\n        \"nethodMetadata\": {\n          \"$ref\": \"#/definitions/MethodMetadataModel\"\n        },\n        \"typeDefinition\": {\n          \"$ref\": \"#/definitions/TypeDefinitionModel\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"NodeModel\": {\n      \"description\": \"Node model\",\n      \"required\": [\n        \"nodeId\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeClass\": {\n          \"$ref\": \"#/definitions/NodeClass\"\n        },\n        \"displayName\": {\n          \"description\": \"Display name\",\n          \"type\": \"string\"\n        },\n        \"nodeId\": {\n          \"description\": \"Id of node.\\r\\n(Mandatory).\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"description\": {\n          \"description\": \"Description if any\",\n          \"type\": \"string\"\n        },\n        \"browseName\": {\n          \"description\": \"Browse name\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Value of variable or default value of the\\r\\nsubtyped variable in case node is a variable\\r\\ntype, otherwise null.\",\n          \"type\": \"object\"\n        },\n        \"sourcePicoseconds\": {\n          \"format\": \"int32\",\n          \"description\": \"Pico seconds part of when value was read at source.\",\n          \"type\": \"integer\"\n        },\n        \"sourceTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Timestamp of when value was read at source.\",\n          \"type\": \"string\"\n        },\n        \"serverPicoseconds\": {\n          \"format\": \"int32\",\n          \"description\": \"Pico seconds part of when value was read at server.\",\n          \"type\": \"integer\"\n        },\n        \"serverTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Timestamp of when value was read at server.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        },\n        \"accessRestrictions\": {\n          \"$ref\": \"#/definitions/NodeAccessRestrictions\"\n        },\n        \"writeMask\": {\n          \"format\": \"int64\",\n          \"description\": \"Default write mask for the node\\r\\n(default: 0)\",\n          \"type\": \"integer\"\n        },\n        \"userWriteMask\": {\n          \"format\": \"int64\",\n          \"description\": \"User write mask for the node\\r\\n(default: 0)\",\n          \"type\": \"integer\"\n        },\n        \"isAbstract\": {\n          \"description\": \"Whether type is abstract, if type can\\r\\nbe abstract.  Null if not type node.\\r\\n(default: false)\",\n          \"type\": \"boolean\"\n        },\n        \"containsNoLoops\": {\n          \"description\": \"Whether a view contains loops. Null if\\r\\nnot a view.\",\n          \"type\": \"boolean\"\n        },\n        \"eventNotifier\": {\n          \"$ref\": \"#/definitions/NodeEventNotifier\"\n        },\n        \"executable\": {\n          \"description\": \"If method node class, whether method can\\r\\nbe called.\",\n          \"type\": \"boolean\"\n        },\n        \"userExecutable\": {\n          \"description\": \"If method node class, whether method can\\r\\nbe called by current user.\\r\\n(default: false if not executable)\",\n          \"type\": \"boolean\"\n        },\n        \"dataTypeDefinition\": {\n          \"description\": \"Data type definition in case node is a\\r\\ndata type node and definition is available,\\r\\notherwise null.\",\n          \"type\": \"object\"\n        },\n        \"accessLevel\": {\n          \"$ref\": \"#/definitions/NodeAccessLevel\"\n        },\n        \"userAccessLevel\": {\n          \"$ref\": \"#/definitions/NodeAccessLevel\"\n        },\n        \"dataType\": {\n          \"description\": \"If variable the datatype of the variable.\\r\\n(default: null)\",\n          \"type\": \"string\"\n        },\n        \"valueRank\": {\n          \"$ref\": \"#/definitions/NodeValueRank\"\n        },\n        \"arrayDimensions\": {\n          \"format\": \"int64\",\n          \"description\": \"Array dimensions of variable or variable type.\\r\\n(default: empty array)\",\n          \"type\": \"integer\",\n          \"items\": {\n            \"format\": \"int64\",\n            \"type\": \"integer\"\n          }\n        },\n        \"historizing\": {\n          \"description\": \"Whether the value of a variable is historizing.\\r\\n(default: false)\",\n          \"type\": \"boolean\"\n        },\n        \"minimumSamplingInterval\": {\n          \"format\": \"double\",\n          \"description\": \"Minimum sampling interval for the variable\\r\\nvalue, otherwise null if not a variable node.\\r\\n(default: null)\",\n          \"type\": \"number\"\n        },\n        \"inverseName\": {\n          \"description\": \"Inverse name of the reference if the node is\\r\\na reference type, otherwise null.\",\n          \"type\": \"string\"\n        },\n        \"symmetric\": {\n          \"description\": \"Whether the reference is symmetric in case\\r\\nthe node is a reference type, otherwise\\r\\nnull.\",\n          \"type\": \"boolean\"\n        },\n        \"rolePermissions\": {\n          \"description\": \"Role permissions\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/RolePermissionModel\"\n          }\n        },\n        \"userRolePermissions\": {\n          \"description\": \"User Role permissions\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/RolePermissionModel\"\n          }\n        },\n        \"typeDefinitionId\": {\n          \"description\": \"Optional type definition of the node\",\n          \"type\": \"string\"\n        },\n        \"children\": {\n          \"description\": \"Whether node has children which are defined as\\r\\nany forward hierarchical references.\\r\\n(default: unknown)\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"NodePathTargetModel\": {\n      \"description\": \"Node path target\",\n      \"required\": [\n        \"browsePath\",\n        \"target\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"browsePath\": {\n          \"description\": \"The target browse path\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"target\": {\n          \"$ref\": \"#/definitions/NodeModel\"\n        },\n        \"remainingPathIndex\": {\n          \"format\": \"int32\",\n          \"description\": \"Remaining index in path\",\n          \"type\": \"integer\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"NodeReferenceModel\": {\n      \"description\": \"Reference model\",\n      \"required\": [\n        \"target\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"referenceTypeId\": {\n          \"description\": \"Reference Type id\",\n          \"type\": \"string\"\n        },\n        \"direction\": {\n          \"$ref\": \"#/definitions/BrowseDirection\"\n        },\n        \"target\": {\n          \"$ref\": \"#/definitions/NodeModel\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"NodeType\": {\n      \"description\": \"The node type\",\n      \"enum\": [\n        \"Unknown\",\n        \"Variable\",\n        \"DataVariable\",\n        \"Property\",\n        \"DataType\",\n        \"View\",\n        \"Object\",\n        \"Event\",\n        \"Interface\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"NodeType\",\n        \"modelAsString\": false\n      }\n    },\n    \"NodeValueRank\": {\n      \"description\": \"Constants defined for the ValueRank attribute.\",\n      \"enum\": [\n        \"OneOrMoreDimensions\",\n        \"OneDimension\",\n        \"TwoDimensions\",\n        \"ScalarOrOneDimension\",\n        \"Any\",\n        \"Scalar\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"NodeValueRank\",\n        \"modelAsString\": false\n      }\n    },\n    \"OpcAuthenticationMode\": {\n      \"description\": \"Specifies the authentication method used to connect to OPC UA servers.\\r\\nThe chosen mode determines how the Publisher authenticates itself to servers.\\r\\nWhen using credentials or certificates, encrypted communication should be enabled\\r\\nvia UseSecurity or EndpointSecurityMode to protect authentication secrets.\",\n      \"enum\": [\n        \"Anonymous\",\n        \"UsernamePassword\",\n        \"Certificate\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"OpcAuthenticationMode\",\n        \"modelAsString\": false\n      }\n    },\n    \"OpcNodeModel\": {\n      \"description\": \"Defines configuration for monitoring an OPC UA node.\\r\\nContains settings for sampling, filtering, publishing\\r\\nbehavior, and message routing. This model allows\\r\\nfine-grained control over how each node's data is collected\\r\\nand transmitted. Part of a PublishedNodesEntryModel's\\r\\nOpcNodes collection.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Id\": {\n          \"description\": \"The OPC UA node identifier string in standard notation.\\r\\nFormat: ns={namespace};{type}={value} Required field that\\r\\nuniquely identifies the node to monitor. Examples:\\r\\n\\\"ns=2;s=MyTag\\\", \\\"ns=0;i=2258\\\" See OPC UA Part 3 for node\\r\\nID format specifications.\",\n          \"type\": \"string\"\n        },\n        \"OpcSamplingInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"Server-side sampling rate in milliseconds. Determines how\\r\\noften the server checks for value changes. Default from\\r\\nDataSetSamplingInterval if not specified. Should be less\\r\\nthan or equal to OpcPublishingInterval for effective\\r\\nsampling. Ignored when OpcSamplingIntervalTimespan is\\r\\ndefined.\",\n          \"type\": \"integer\"\n        },\n        \"OpcSamplingIntervalTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"Server-side sampling rate as a TimeSpan. Takes precedence\\r\\nover OpcSamplingInterval if both are defined. Provides\\r\\nmore precise control over timing than milliseconds.\\r\\nExample: \\\"00:00:00.100\\\" for 100ms sampling. Should be\\r\\nless than or equal to OpcPublishingIntervalTimespan for\\r\\neffective sampling.\",\n          \"type\": \"string\"\n        },\n        \"DataSetFieldId\": {\n          \"description\": \"Custom identifier for this node in dataset messages. Used\\r\\nas field name in message payloads if specified. Falls back\\r\\nto DisplayName if not provided. Helps correlate data with\\r\\nspecific measurements or tags. Must be unique within a\\r\\ndataset writer.\",\n          \"type\": \"string\"\n        },\n        \"DataSetClassFieldId\": {\n          \"format\": \"uuid\",\n          \"description\": \"Unique identifier for correlating fields with dataset\\r\\nclass metadata. Links monitored item data with dataset\\r\\nclass field definitions. Used to provide context and type\\r\\ninformation for the field. Must match corresponding field\\r\\nID in dataset class metadata. Important for proper message\\r\\ndecoding by subscribers.\",\n          \"type\": \"string\"\n        },\n        \"DisplayName\": {\n          \"description\": \"Human-readable name for the monitored item. Used as field\\r\\nidentifier if DataSetFieldId not specified. Can be\\r\\noverridden by actual node DisplayName if\\r\\nFetchDisplayName=true. Helps identify data sources in\\r\\nmessages and logs. Should be unique within a dataset for\\r\\nclear identification.\",\n          \"type\": \"string\"\n        },\n        \"QueueSize\": {\n          \"format\": \"int64\",\n          \"description\": \"Size of the server-side queue for this monitored item.\\r\\nControls how many values can be buffered during slow\\r\\nconnections. Values are discarded according to DiscardNew\\r\\nwhen queue is full. Default is 1 unless otherwise\\r\\nconfigured. Larger queues help prevent data loss but use\\r\\nmore server memory.\",\n          \"type\": \"integer\"\n        },\n        \"DiscardNew\": {\n          \"description\": \"Controls queue overflow behavior for monitored items.\\r\\nTrue: Discard newest values when queue is full (LIFO).\\r\\nFalse: Discard oldest values when queue is full (FIFO,\\r\\ndefault). Use True to preserve historical data during\\r\\nconnection issues. Use False to maintain current value\\r\\naccuracy.\",\n          \"type\": \"boolean\"\n        },\n        \"DataChangeTrigger\": {\n          \"$ref\": \"#/definitions/DataChangeTriggerType\"\n        },\n        \"DeadbandType\": {\n          \"$ref\": \"#/definitions/DeadbandType\"\n        },\n        \"DeadbandValue\": {\n          \"format\": \"double\",\n          \"description\": \"Deadband value of the data change filter to apply. Does\\r\\nnot apply to events\",\n          \"type\": \"number\"\n        },\n        \"EventFilter\": {\n          \"$ref\": \"#/definitions/EventFilterModel\"\n        },\n        \"ConditionHandling\": {\n          \"$ref\": \"#/definitions/ConditionHandlingOptionsModel\"\n        },\n        \"BrowsePath\": {\n          \"description\": \"Relative path through the address space to reach target\\r\\nnode. Sequence of browse names from starting node to\\r\\ntarget. Example: [\\\"Objects\\\", \\\"Server\\\", \\\"Data\\\",\\r\\n\\\"Dynamic\\\", \\\"Scalar\\\"]. Allows referencing nodes through\\r\\nhierarchical structure. Alternative to direct node ID\\r\\naddressing.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"AttributeId\": {\n          \"$ref\": \"#/definitions/NodeAttribute\"\n        },\n        \"IndexRange\": {\n          \"description\": \"Range specification for array or string values. Format:\\r\\n\\\"start:end\\\" or \\\"index\\\". Examples: \\\"0:3\\\" (first 4\\r\\nelements), \\\"7\\\" (8th element) Allows monitoring specific\\r\\narray elements. Default: null (entire value monitored)\",\n          \"type\": \"string\"\n        },\n        \"Topic\": {\n          \"description\": \"Custom routing topic/queue for this node's messages.\\r\\nOverrides writer and writer group queue settings. Enables\\r\\nnode-specific message routing patterns. Messages are split\\r\\ninto separate network messages when nodes have different\\r\\ntopics. Format depends on transport (e.g., MQTT topic\\r\\nsyntax).\",\n          \"type\": \"string\"\n        },\n        \"QualityOfService\": {\n          \"$ref\": \"#/definitions/QoS\"\n        },\n        \"HeartbeatBehavior\": {\n          \"$ref\": \"#/definitions/HeartbeatBehavior\"\n        },\n        \"HeartbeatInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"Node-specific heartbeat interval in milliseconds.\\r\\nOverrides DefaultHeartbeatInterval from parent\\r\\nconfiguration. Controls how often heartbeat messages are\\r\\ngenerated. Set to 0 to disable heartbeats for this node.\\r\\nIgnored when HeartbeatIntervalTimespan is defined.\",\n          \"type\": \"integer\"\n        },\n        \"HeartbeatIntervalTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"Node-specific heartbeat interval as TimeSpan. Takes\\r\\nprecedence over HeartbeatInterval if both defined.\\r\\nOverrides DefaultHeartbeatIntervalTimespan setting.\\r\\nProvides more precise control over timing. Example:\\r\\n\\\"00:00:10\\\" for 10-second interval.\",\n          \"type\": \"string\"\n        },\n        \"SkipFirst\": {\n          \"description\": \"Controls handling of initial value notification. True:\\r\\nSuppress first value from monitored item. False: Publish\\r\\ninitial value (default). Useful when only changes are\\r\\nrelevant. Server always sends initial value on creation.\",\n          \"type\": \"boolean\"\n        },\n        \"OpcPublishingInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"Client-side publishing rate in milliseconds. Controls how\\r\\noften the server sends notifications. Must be >=\\r\\nOpcSamplingInterval for proper operation. Overrides\\r\\nDataSetPublishingInterval when specified. Ignored if\\r\\nOpcPublishingIntervalTimespan is defined.\",\n          \"type\": \"integer\"\n        },\n        \"OpcPublishingIntervalTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"OpcPublishingInterval as TimeSpan.\",\n          \"type\": \"string\"\n        },\n        \"UseCyclicRead\": {\n          \"description\": \"Use periodic reads instead of monitored items. True: Sample\\r\\nusing CyclicRead service calls False: Use standard\\r\\nsubscription monitoring (default) Useful for nodes that\\r\\ndon't support monitoring or when consistent sampling\\r\\ntiming is required. Consider CyclicReadMaxAge when\\r\\nenabled.\",\n          \"type\": \"boolean\"\n        },\n        \"RegisterNode\": {\n          \"description\": \"Optimize node access using RegisterNodes service. True:\\r\\nRegister node for faster subsequent reads False: Use\\r\\ndirect node access (default) Can improve performance for\\r\\nfrequently accessed nodes. Server must support\\r\\nRegisterNodes service.\",\n          \"type\": \"boolean\"\n        },\n        \"FetchDisplayName\": {\n          \"description\": \"Retrieve node's DisplayName attribute on startup. True:\\r\\nQuery and use actual display name False: Use configured\\r\\nDisplayName (default) Overrides DataSetFetchDisplayNames\\r\\nsetting. Used for human-readable field identification.\",\n          \"type\": \"boolean\"\n        },\n        \"ModelChangeHandling\": {\n          \"$ref\": \"#/definitions/ModelChangeHandlingOptionsModel\"\n        },\n        \"TriggeredNodes\": {\n          \"description\": \"Collection of dependent nodes triggered by this node. Read\\r\\natomically when parent node changes. Limited to one level\\r\\nof triggering (no cascading). Useful for maintaining data\\r\\nconsistency between related measurements. Changes to\\r\\ntriggered nodes must be made through parent node's API\\r\\ncalls.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/OpcNodeModel\"\n          }\n        },\n        \"CyclicReadMaxAge\": {\n          \"format\": \"int32\",\n          \"description\": \"Maximum age for cached values in cyclic reads. Specified in\\r\\nmilliseconds. Default: 0 (no caching) Only applies when\\r\\nUseCyclicRead is true. Server may return cached value if\\r\\nwithin max age. Helps reduce server load in high-frequency\\r\\nreads. Ignored when CyclicReadMaxAgeTimespan is defined.\",\n          \"type\": \"integer\"\n        },\n        \"CyclicReadMaxAgeTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"Maximum age for cached values in cyclic reads as TimeSpan.\\r\\nTakes precedence over CyclicReadMaxAge if both defined.\\r\\nOnly applies when UseCyclicRead is true. Default:\\r\\n\\\"00:00:00\\\" (no caching) Example: \\\"00:00:00.500\\\" for 500ms\\r\\nmax cache age. Helps optimize read performance vs data\\r\\nfreshness.\",\n          \"type\": \"string\"\n        },\n        \"TypeDefinitionId\": {\n          \"description\": \"A type definition id that references a well known opc ua\\r\\ntype definition node for the variable represented by this\\r\\nnode entry.\",\n          \"type\": \"string\"\n        },\n        \"MethodMetadata\": {\n          \"$ref\": \"#/definitions/MethodMetadataModel\"\n        },\n        \"ExpandedNodeId\": {\n          \"description\": \"Alternative node identifier with full namespace URI. Same\\r\\nas Id but uses complete namespace URI instead of index.\\r\\nFormat: \\\"nsu={uri};{type}={value}\\\" Example:\\r\\n\\\"nsu=http://opcfoundation.org/UA/;i=2258\\\" Provides more\\r\\nportable node identification across servers.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"OperationContextModel\": {\n      \"description\": \"Operation log model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"AuthorityId\": {\n          \"description\": \"User\",\n          \"type\": \"string\"\n        },\n        \"Time\": {\n          \"format\": \"date-time\",\n          \"description\": \"Operation time\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"OperationLimitsModel\": {\n      \"description\": \"Server limits\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"minSupportedSampleRate\": {\n          \"format\": \"double\",\n          \"description\": \"Min supported sampling rate\",\n          \"type\": \"number\"\n        },\n        \"maxBrowseContinuationPoints\": {\n          \"format\": \"int32\",\n          \"description\": \"Max browse continuation points\",\n          \"type\": \"integer\"\n        },\n        \"maxQueryContinuationPoints\": {\n          \"format\": \"int32\",\n          \"description\": \"Max query continuation points\",\n          \"type\": \"integer\"\n        },\n        \"maxHistoryContinuationPoints\": {\n          \"format\": \"int32\",\n          \"description\": \"Max history continuation points\",\n          \"type\": \"integer\"\n        },\n        \"maxArrayLength\": {\n          \"format\": \"int64\",\n          \"description\": \"Max array length supported\",\n          \"type\": \"integer\"\n        },\n        \"maxStringLength\": {\n          \"format\": \"int64\",\n          \"description\": \"Max string length supported\",\n          \"type\": \"integer\"\n        },\n        \"maxByteStringLength\": {\n          \"format\": \"int64\",\n          \"description\": \"Max byte buffer length supported\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerBrowse\": {\n          \"format\": \"int64\",\n          \"description\": \"Max nodes that can be part of a single browse call.\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerRead\": {\n          \"format\": \"int64\",\n          \"description\": \"Max nodes that can be read in single read call\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerWrite\": {\n          \"format\": \"int64\",\n          \"description\": \"Max nodes that can be read in single write call\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerMethodCall\": {\n          \"format\": \"int64\",\n          \"description\": \"Max nodes that can be read in single method call\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerHistoryReadData\": {\n          \"format\": \"int64\",\n          \"description\": \"Number of nodes that can be in a History Read value call\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerHistoryReadEvents\": {\n          \"format\": \"int64\",\n          \"description\": \"Number of nodes that can be in a History Read events call\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerHistoryUpdateData\": {\n          \"format\": \"int64\",\n          \"description\": \"Number of nodes that can be in a History Update call\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerHistoryUpdateEvents\": {\n          \"format\": \"int64\",\n          \"description\": \"Number of nodes that can be in a History events update call\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerRegisterNodes\": {\n          \"format\": \"int64\",\n          \"description\": \"Max nodes that can be registered at once\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerTranslatePathsToNodeIds\": {\n          \"format\": \"int64\",\n          \"description\": \"Max nodes that can be part of a browse path\",\n          \"type\": \"integer\"\n        },\n        \"maxNodesPerNodeManagement\": {\n          \"format\": \"int64\",\n          \"description\": \"Max nodes that can be added or removed in a single call.\",\n          \"type\": \"integer\"\n        },\n        \"maxMonitoredItemsPerCall\": {\n          \"format\": \"int64\",\n          \"description\": \"Max monitored items that can be updated at once.\",\n          \"type\": \"integer\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ProblemDetails\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\"\n        },\n        \"title\": {\n          \"type\": \"string\"\n        },\n        \"status\": {\n          \"format\": \"int32\",\n          \"type\": \"integer\"\n        },\n        \"detail\": {\n          \"type\": \"string\"\n        },\n        \"instance\": {\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": { }\n    },\n    \"PublishBulkRequestModel\": {\n      \"description\": \"Publish in bulk request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodesToAdd\": {\n          \"description\": \"Node to add\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PublishedItemModel\"\n          }\n        },\n        \"nodesToRemove\": {\n          \"description\": \"Node to remove\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishBulkRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/PublishBulkRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishBulkResponseModel\": {\n      \"description\": \"Result of bulk request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodesToAdd\": {\n          \"description\": \"Node to add\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ServiceResultModel\"\n          }\n        },\n        \"nodesToRemove\": {\n          \"description\": \"Node to remove\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ServiceResultModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishDiagnosticInfoModel\": {\n      \"description\": \"Model for a diagnostic info.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"endpoints\": {\n          \"description\": \"Endpoints covered by the diagnostics model.\\r\\nThe endpoints are all part of the same writer\\r\\ngroup. Specify\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n          }\n        },\n        \"sentMessagesPerSec\": {\n          \"format\": \"double\",\n          \"description\": \"SentMessagesPerSec\",\n          \"type\": \"number\"\n        },\n        \"ingestionDuration\": {\n          \"format\": \"date-span\",\n          \"description\": \"IngestionDuration\",\n          \"type\": \"string\"\n        },\n        \"ingressDataChanges\": {\n          \"format\": \"int64\",\n          \"description\": \"IngressDataChanges\",\n          \"type\": \"integer\"\n        },\n        \"ingressValueChanges\": {\n          \"format\": \"int64\",\n          \"description\": \"IngressValueChanges\",\n          \"type\": \"integer\"\n        },\n        \"ingressBatchBlockBufferSize\": {\n          \"format\": \"int64\",\n          \"description\": \"IngressBatchBlockBufferSize\",\n          \"type\": \"integer\"\n        },\n        \"encodingBlockInputSize\": {\n          \"format\": \"int64\",\n          \"description\": \"EncodingBlockInputSize\",\n          \"type\": \"integer\"\n        },\n        \"encodingBlockOutputSize\": {\n          \"format\": \"int64\",\n          \"description\": \"EncodingBlockOutputSize\",\n          \"type\": \"integer\"\n        },\n        \"encoderNotificationsProcessed\": {\n          \"format\": \"int64\",\n          \"description\": \"EncoderNotificationsProcessed\",\n          \"type\": \"integer\"\n        },\n        \"encoderNotificationsDropped\": {\n          \"format\": \"int64\",\n          \"description\": \"EncoderNotificationsDropped\",\n          \"type\": \"integer\"\n        },\n        \"encoderIoTMessagesProcessed\": {\n          \"format\": \"int64\",\n          \"description\": \"EncoderIoTMessagesProcessed\",\n          \"type\": \"integer\"\n        },\n        \"encoderAvgNotificationsMessage\": {\n          \"format\": \"double\",\n          \"description\": \"EncoderAvgNotificationsMessage\",\n          \"type\": \"number\"\n        },\n        \"encoderAvgIoTMessageBodySize\": {\n          \"format\": \"double\",\n          \"description\": \"EncoderAvgIoTMessageBodySize\",\n          \"type\": \"number\"\n        },\n        \"encoderAvgIoTChunkUsage\": {\n          \"format\": \"double\",\n          \"description\": \"EncoderAvgIoTChunkUsage\",\n          \"type\": \"number\"\n        },\n        \"estimatedIoTChunksPerDay\": {\n          \"format\": \"double\",\n          \"description\": \"EstimatedIoTChunksPerDay\",\n          \"type\": \"number\"\n        },\n        \"outgressInputBufferCount\": {\n          \"format\": \"int64\",\n          \"description\": \"OutgressInputBufferCount\",\n          \"type\": \"integer\"\n        },\n        \"outgressInputBufferDropped\": {\n          \"format\": \"int64\",\n          \"description\": \"OutgressInputBufferDropped\",\n          \"type\": \"integer\"\n        },\n        \"outgressIoTMessageCount\": {\n          \"format\": \"int64\",\n          \"description\": \"OutgressIoTMessageCount\",\n          \"type\": \"integer\"\n        },\n        \"connectionRetries\": {\n          \"format\": \"int64\",\n          \"description\": \"ConnectionRetries\",\n          \"type\": \"integer\"\n        },\n        \"opcEndpointConnected\": {\n          \"description\": \"OpcEndpointConnected\",\n          \"type\": \"boolean\"\n        },\n        \"monitoredOpcNodesSucceededCount\": {\n          \"format\": \"int64\",\n          \"description\": \"MonitoredOpcNodesSucceededCount\",\n          \"type\": \"integer\"\n        },\n        \"monitoredOpcNodesFailedCount\": {\n          \"format\": \"int64\",\n          \"description\": \"MonitoredOpcNodesFailedCount\",\n          \"type\": \"integer\"\n        },\n        \"ingressEventNotifications\": {\n          \"format\": \"int64\",\n          \"description\": \"Number of incoming event notifications\",\n          \"type\": \"integer\"\n        },\n        \"ingressEvents\": {\n          \"format\": \"int64\",\n          \"description\": \"Total incoming events so far.\",\n          \"type\": \"integer\"\n        },\n        \"encoderMaxMessageSplitRatio\": {\n          \"format\": \"double\",\n          \"description\": \"Encoder max message split ratio\",\n          \"type\": \"number\"\n        },\n        \"ingressDataChangesInLastMinute\": {\n          \"format\": \"int64\",\n          \"description\": \"Data changes received in the last minute\",\n          \"type\": \"integer\"\n        },\n        \"ingressValueChangesInLastMinute\": {\n          \"format\": \"int64\",\n          \"description\": \"Value changes received in the last minute\",\n          \"type\": \"integer\"\n        },\n        \"ingressHeartbeats\": {\n          \"format\": \"int64\",\n          \"description\": \"Number of heartbeats of the total value changes\",\n          \"type\": \"integer\"\n        },\n        \"ingressCyclicReads\": {\n          \"format\": \"int64\",\n          \"description\": \"Number of cyclic reads of the total value changes\",\n          \"type\": \"integer\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishStartRequestModel\": {\n      \"description\": \"Publish request\",\n      \"required\": [\n        \"item\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"item\": {\n          \"$ref\": \"#/definitions/PublishedItemModel\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishStartRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/PublishStartRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishStartResponseModel\": {\n      \"description\": \"Result of publish request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishStopRequestModel\": {\n      \"description\": \"Unpublish request\",\n      \"required\": [\n        \"nodeId\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node of published item to unpublish\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishStopRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/PublishStopRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishStopResponseModel\": {\n      \"description\": \"Result of publish stop request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedItemListRequestModel\": {\n      \"description\": \"Request list of published items\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"continuationToken\": {\n          \"description\": \"Continuation token or null to start\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedItemListRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/PublishedItemListRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedItemListResponseModel\": {\n      \"description\": \"List of published nodes\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"items\": {\n          \"description\": \"Monitored items\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PublishedItemModel\"\n          }\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation or null if final\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedItemModel\": {\n      \"description\": \"A monitored and published item\",\n      \"required\": [\n        \"nodeId\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Variable node monitored\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"displayName\": {\n          \"description\": \"Display name of the variable node monitored\",\n          \"type\": \"string\"\n        },\n        \"publishingInterval\": {\n          \"format\": \"date-span\",\n          \"description\": \"Publishing interval to use\",\n          \"type\": \"string\"\n        },\n        \"samplingInterval\": {\n          \"format\": \"date-span\",\n          \"description\": \"Sampling interval to use\",\n          \"type\": \"string\"\n        },\n        \"heartbeatInterval\": {\n          \"format\": \"date-span\",\n          \"description\": \"Heartbeat interval to use\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedNodeDeleteAssetRequestModel\": {\n      \"description\": \"Contains entry in the published nodes configuration representing\\r\\nthe asset as well as an optional request header.\",\n      \"required\": [\n        \"entry\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"entry\": {\n          \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n        },\n        \"force\": {\n          \"description\": \"The asset on the server is deleted no matter whether\\r\\nthe removal in the publisher configuration was successful\\r\\nor not.\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedNodeExpansionModel\": {\n      \"description\": \"\\r\\nNode expansion configuration. Configures how an entry should\\r\\n            be expanded into configuration. If a node is an object it is\\r\\n            expanded to all contained variables.\\r\\n\\r\\nIf a node is an object type, all objects of that type are\\r\\n            searched from the object root node. These found objects are\\r\\n            then expanded into their variables.\\r\\n\\r\\nIf the node is a variable, the variable is expanded to include\\r\\n            all contained variables or properties. All entries will have\\r\\n            the data set field id configured as data set class id.\\r\\n\\r\\nIf a node is a variable type, then all variables of this type\\r\\n            are found and added to a single writer entry. Note: That by\\r\\n            themselves these variables are no further expanded.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"createSingleWriter\": {\n          \"description\": \"By default the api will create a new distinct\\r\\nwriter per expanded object. Objects that cannot\\r\\nbe expanded are part of the originally provided\\r\\nwriter. The writer id is then post fixed with\\r\\nthe data set field id of the object node field.\\r\\nIf true, all variables of all expanded nodes are\\r\\nadded to the originally provided entry.\",\n          \"type\": \"boolean\"\n        },\n        \"maxLevelsToExpand\": {\n          \"format\": \"int64\",\n          \"description\": \"Max number of levels to expand an instance node\\r\\nsuch as an object or variable into resulting\\r\\nvariables.\\r\\nIf the node is a variable instance to start with\\r\\nbut the Azure.IIoT.OpcUa.Publisher.Models.PublishedNodeExpansionModel.ExcludeRootIfInstanceNode\\r\\nproperty is set to excluded it, then setting this\\r\\nvalue to 0 is equivalent to a value of 1 to get\\r\\nthe first level of variables contained in the\\r\\nvariable, but not the variable itself. Otherwise\\r\\nonly the variable itelf is returned. If the node\\r\\nis an object instance, 0 is equivalent to\\r\\ninfinite and all levels are expanded.\",\n          \"type\": \"integer\"\n        },\n        \"noSubTypesOfTypeNodes\": {\n          \"description\": \"Do not consider subtypes of an object type when\\r\\nsearching for instances of the type.\",\n          \"type\": \"boolean\"\n        },\n        \"excludeRootIfInstanceNode\": {\n          \"description\": \"If the node is an object or variable instance do\\r\\nnot include it but only the instances underneath\\r\\nthem.\",\n          \"type\": \"boolean\"\n        },\n        \"maxDepth\": {\n          \"format\": \"int64\",\n          \"description\": \"Max browse depth for object search operation or\\r\\nwhen searching for an instance of a type.\\r\\nTo only expand an object to its variables set\\r\\nthis value to 0. The depth of expansion of a\\r\\nvariable itself can be controlled via the\\r\\nAzure.IIoT.OpcUa.Publisher.Models.PublishedNodeExpansionModel.MaxLevelsToExpand\\\" property.\\r\\nIf the root object is excluded a value of 0 is\\r\\nequivalent to a value of 1 to get the first level\\r\\nof objects contained in the object but not the\\r\\nobject itself, e.g. a folder object.\",\n          \"type\": \"integer\"\n        },\n        \"flattenTypeInstance\": {\n          \"description\": \"If false, treats instance nodes found just like\\r\\nobjects that need to be expanded. In case of a\\r\\ncompanion spec object type this could be set to\\r\\ntrue, flattening the structure into a single\\r\\nwriter that represents the object in its entirety.\\r\\nHowever, when using generic interfaces that can\\r\\nbe implemented across objects in the address\\r\\nspace and only its variables are important, it\\r\\nmight be useful to set this to false.\",\n          \"type\": \"boolean\"\n        },\n        \"includeMethods\": {\n          \"description\": \"Include not just variables and events but also\\r\\nmethods when expanding an object.\",\n          \"type\": \"boolean\"\n        },\n        \"discardErrors\": {\n          \"description\": \"Errors are silently discarded and only\\r\\nsuccessfully expanded nodes are returned.\",\n          \"type\": \"boolean\"\n        },\n        \"useBrowseNameAsDisplayName\": {\n          \"description\": \"Use the browse name as display name for nodes. The\\r\\ndisplay name is rooted in the parent node from\\r\\nwhich browsing occurs, or just the browse name if\\r\\nthe browse root is not a parent.\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedNodeExpansionModelPublishedNodesEntryRequestModel\": {\n      \"description\": \"Wraps a request and a published nodes entry to bind to a\\r\\nbody more easily for api that requires an entry and additional\\r\\nconfiguration\",\n      \"required\": [\n        \"entry\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"entry\": {\n          \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/PublishedNodeExpansionModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedNodesEntryModel\": {\n      \"description\": \"\\r\\nConfiguration model for OPC UA Publisher that defines how\\r\\n            OPC UA nodes are published to messaging systems. Used to\\r\\n            configure connections to OPC UA servers, setup node\\r\\n            monitoring, and control message publishing.\\r\\n\\r\\nKey features:\\r\\n            - Endpoint configuration and security settings\\r\\n            - Writer group and dataset organization\\r\\n            - Publishing intervals and sampling controls\\r\\n            - Message batching and triggering\\r\\n            - Subscription and monitoring options\\r\\n            - Heartbeat and watchdog behaviors\\r\\n            - Security modes and authentication\\r\\n\\r\\nFor detailed configuration options, see individual\\r\\n            properties.\",\n      \"required\": [\n        \"EndpointUrl\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"Version\": {\n          \"format\": \"int64\",\n          \"description\": \"A monotonically increasing number identifying the change\\r\\nversion. At this point the version number is informational\\r\\nonly, but should be provided in API requests if available.\\r\\nNot used inside file based configuration.\",\n          \"type\": \"integer\"\n        },\n        \"LastChangeDateTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"The time the Publisher configuration was last updated.\\r\\nRead only and informational only.\",\n          \"type\": \"string\"\n        },\n        \"DataSetWriterId\": {\n          \"description\": \"The unique identifier for a data set writer used to collect\\r\\nOPC UA nodes to be semantically grouped and published with\\r\\nthe same publishing interval. When not specified, uses a\\r\\nstring representing the common publishing interval of the\\r\\nnodes in the data set collection. This attribute uniquely\\r\\nidentifies a data set within a DataSetWriterGroup. The\\r\\nuniqueness is determined using the provided DataSetWriterId\\r\\nand the publishing interval of the grouped OpcNodes.\",\n          \"type\": \"string\"\n        },\n        \"DataSetWriterGroup\": {\n          \"description\": \"The data set writer group collecting datasets defined for a\\r\\ncertain endpoint. This attribute is used to identify the\\r\\nsession opened into the server. The default value consists\\r\\nof the EndpointUrl string, followed by a deterministic hash\\r\\ncomposed of the EndpointUrl, UseSecurity,\\r\\nOpcAuthenticationMode, UserName and Password attributes.\",\n          \"type\": \"string\"\n        },\n        \"OpcNodes\": {\n          \"description\": \"The DataSet collection grouping the nodes to be published\\r\\nfor the specific DataSetWriter. Each node can specify\\r\\nmonitoring parameters including sampling intervals, deadband\\r\\nsettings, and event filtering options. Contains variable\\r\\nnodes or event notifiers to monitor.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/OpcNodeModel\"\n          }\n        },\n        \"DataSetClassId\": {\n          \"format\": \"uuid\",\n          \"description\": \"The optional dataset class id as it shall appear in dataset\\r\\nmessages and dataset metadata. Used to uniquely identify the\\r\\ntype of dataset being published. Default: Guid.Empty\",\n          \"type\": \"string\"\n        },\n        \"DataSetName\": {\n          \"description\": \"The optional name of the dataset as it will appear in the\\r\\ndataset metadata. Used for identification and organization\\r\\nof datasets.\",\n          \"type\": \"string\"\n        },\n        \"DataSetPublishingInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"The publishing interval used for a grouped set of nodes\\r\\nunder a certain DataSetWriter, expressed in milliseconds.\\r\\nWhen a specific node underneath DataSetWriter defines\\r\\nOpcPublishingInterval (or Timespan), its value will\\r\\noverwrite this interval and potentially split the data set\\r\\nwriter into more than one subscription. Ignored when\\r\\nDataSetPublishingIntervalTimespan is present.\",\n          \"type\": \"integer\"\n        },\n        \"DataSetPublishingIntervalTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"The publishing interval for a dataset writer, expressed as a\\r\\nTimeSpan value. Takes precedence over\\r\\nDataSetPublishingInterval if defined. Provides more precise\\r\\ncontrol over timing than milliseconds. When overridden by\\r\\nnode-specific intervals, the writer may split into multiple\\r\\nsubscriptions.\",\n          \"type\": \"string\"\n        },\n        \"DataSetKeyFrameCount\": {\n          \"format\": \"int64\",\n          \"description\": \"Controls key frame insertion frequency in the message\\r\\nstream. A key frame contains all current values, while\\r\\ndelta frames only contain changes. Setting this ensures\\r\\nperiodic complete state updates, useful for late-joining\\r\\nconsumers or state synchronization. Key frames can also\\r\\ninclude configured DataSetExtensionFields for additional\\r\\ncontext. Default: 0 (key frames disabled)\",\n          \"type\": \"integer\"\n        },\n        \"MetaDataUpdateTime\": {\n          \"format\": \"int32\",\n          \"description\": \"The interval in milliseconds at which metadata messages are\\r\\nsent, even when the metadata has not changed. Only applies\\r\\nwhen metadata messaging is supported or explicitly enabled.\\r\\nIgnored when MetaDataUpdateTimeTimespan is defined.\",\n          \"type\": \"integer\"\n        },\n        \"MetaDataUpdateTimeTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"The interval as TimeSpan at which metadata messages are\\r\\nsent, even when metadata has not changed. Takes precedence\\r\\nover MetaDataUpdateTime if both are defined. Only applies\\r\\nwhen metadata messaging is supported or explicitly enabled.\",\n          \"type\": \"string\"\n        },\n        \"SendKeepAliveDataSetMessages\": {\n          \"description\": \"Controls whether to send keep alive messages for this\\r\\ndataset when a subscription keep alive notification is\\r\\nreceived. Keep alive messages help maintain connection\\r\\nstatus awareness. Only valid if the messaging mode supports\\r\\nkeep alive messages. Default: false\",\n          \"type\": \"boolean\"\n        },\n        \"EndpointUrl\": {\n          \"description\": \"The required OPC UA server endpoint URL to connect to. This\\r\\nis the only required field in the configuration. Format:\\r\\n\\\"opc.tcp://host:port/path\\\"\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"MaxKeepAliveCount\": {\n          \"format\": \"int64\",\n          \"description\": \"Defines how many publishing timer expirations to wait\\r\\nbefore sending a keep-alive message when no notifications\\r\\nare pending. Works with SendKeepAliveDataSetMessages to\\r\\nmaintain connection awareness. Keep-alive messages help\\r\\ndetect connection issues even when no data changes are\\r\\noccurring.\",\n          \"type\": \"integer\"\n        },\n        \"DataSetDescription\": {\n          \"description\": \"The optional description of the dataset.\",\n          \"type\": \"string\"\n        },\n        \"Priority\": {\n          \"format\": \"int32\",\n          \"description\": \"Priority of the writer subscription.\",\n          \"type\": \"integer\"\n        },\n        \"DataSetExtensionFields\": {\n          \"description\": \"Optional key-value pairs inserted into key frame and\\r\\nmetadata messages in the same data set. Values are\\r\\nformatted using OPC UA Variant JSON encoding. Used to add\\r\\ncontextual information to datasets.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"description\": \"A variant which can be represented by any value including null.\",\n            \"type\": \"object\"\n          }\n        },\n        \"EndpointSecurityMode\": {\n          \"$ref\": \"#/definitions/SecurityMode\"\n        },\n        \"EndpointSecurityPolicy\": {\n          \"description\": \"The security policy URI to use for the endpoint connection.\\r\\nOverrides UseSecurity setting and refines\\r\\nEndpointSecurityMode choice. Examples include\\r\\n\\\"http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256\\\".\\r\\nIf the specified policy is not available with the chosen\\r\\nsecurity mode, connectivity will fail. This allows enforcing\\r\\nspecific security requirements.\",\n          \"type\": \"string\"\n        },\n        \"MessagingMode\": {\n          \"$ref\": \"#/definitions/MessagingMode\"\n        },\n        \"MessageEncoding\": {\n          \"$ref\": \"#/definitions/MessageEncoding\"\n        },\n        \"BatchSize\": {\n          \"format\": \"int64\",\n          \"description\": \"The number of notifications that are queued before a\\r\\nnetwork message is generated. Controls message batching for\\r\\noptimizing network traffic vs latency. For historic reasons\\r\\nthe default value is 50 unless otherwise configured via the\\r\\n--bs command line option.\",\n          \"type\": \"integer\"\n        },\n        \"BatchTriggerInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"The interval at which batched network messages are\\r\\npublished, in milliseconds. Messages are published when\\r\\nthis interval elapses or when BatchSize is reached. For\\r\\nhistoric reasons the default is 10 seconds unless\\r\\nconfigured via --bi. Ignored when\\r\\nBatchTriggerIntervalTimespan is specified. Used with\\r\\nBatchSize to optimize network traffic vs latency.\",\n          \"type\": \"integer\"\n        },\n        \"BatchTriggerIntervalTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"The interval at which batched network messages are\\r\\npublished, as a TimeSpan. Takes precedence over\\r\\nBatchTriggerInterval if both are defined. Messages are\\r\\npublished when this interval elapses or when BatchSize is\\r\\nreached. Provides more precise control over publishing\\r\\ntiming than millisecond interval. Used with BatchSize to\\r\\noptimize network traffic vs latency.\",\n          \"type\": \"string\"\n        },\n        \"UseReverseConnect\": {\n          \"description\": \"Use reverse connect to connect ot the endpoint\",\n          \"type\": \"boolean\"\n        },\n        \"DataSetRouting\": {\n          \"$ref\": \"#/definitions/DataSetRoutingMode\"\n        },\n        \"WriterGroupQueueName\": {\n          \"description\": \"Overrides the default writer group topic template for\\r\\nmessage routing. Used to customize where messages from this\\r\\nwriter group are published. Particularly useful when\\r\\npublishing to MQTT topics or message queues where specific\\r\\nrouting patterns are needed.\",\n          \"type\": \"string\"\n        },\n        \"WriterGroupQualityOfService\": {\n          \"$ref\": \"#/definitions/QoS\"\n        },\n        \"WriterGroupTransport\": {\n          \"$ref\": \"#/definitions/WriterGroupTransport\"\n        },\n        \"UseSecurity\": {\n          \"description\": \"Controls whether to use a secure OPC UA transport mode to\\r\\nestablish a session. When true, defaults to\\r\\nSecurityMode.NotNone which requires signed or encrypted\\r\\ncommunication. When false, uses SecurityMode.None with no\\r\\nsecurity. Can be overridden by EndpointSecurityMode and\\r\\nEndpointSecurityPolicy settings. Use encrypted\\r\\ncommunication whenever possible to protect credentials and\\r\\ndata.\",\n          \"type\": \"boolean\"\n        },\n        \"OpcAuthenticationMode\": {\n          \"$ref\": \"#/definitions/OpcAuthenticationMode\"\n        },\n        \"EncryptedAuthUsername\": {\n          \"description\": \"The encrypted username for authentication when\\r\\nOpcAuthenticationMode is UsernamePassword. Encrypted\\r\\ncredentials at rest can be enforced using the --fce command\\r\\nline option. Version 2.6+ stores credentials in plain text\\r\\nby default, while 2.5 and below always encrypted them.\",\n          \"type\": \"string\"\n        },\n        \"EncryptedAuthPassword\": {\n          \"description\": \"The encrypted password for authentication when\\r\\nOpcAuthenticationMode is UsernamePassword. For certificate\\r\\nauthentication, contains the password to access the private\\r\\nkey. Encrypted credentials at rest can be enforced using\\r\\nthe --fce command line option. Version 2.6+ stores\\r\\ncredentials in plain text by default, while 2.5 and below\\r\\nalways encrypted them.\",\n          \"type\": \"string\"\n        },\n        \"OpcAuthenticationUsername\": {\n          \"description\": \"The plaintext username for UsernamePassword authentication,\\r\\nor the subject name of the certificate for Certificate\\r\\nauthentication. When using Certificate mode, this refers to\\r\\na certificate in the User certificate store of the PKI\\r\\nconfiguration.\",\n          \"type\": \"string\"\n        },\n        \"OpcAuthenticationPassword\": {\n          \"description\": \"The plaintext password for UsernamePassword authentication,\\r\\nor the password protecting the private key for Certificate\\r\\nauthentication. For Certificate mode, this must match the\\r\\npassword used when adding the certificate to the PKI store.\",\n          \"type\": \"string\"\n        },\n        \"QueueName\": {\n          \"description\": \"Overrides the writer group queue name at the individual\\r\\nwriter level. When specified, causes network messages to be\\r\\nsplit across different queues. The split also takes QoS\\r\\nsettings into account, allowing fine-grained control over\\r\\nmessage routing and delivery guarantees.\",\n          \"type\": \"string\"\n        },\n        \"MetaDataQueueName\": {\n          \"description\": \"The queue name to use for metadata messages from this\\r\\nwriter. Overrides the default metadata topic template.\\r\\nAllows routing metadata to specific destinations separate\\r\\nfrom data messages.\",\n          \"type\": \"string\"\n        },\n        \"QualityOfService\": {\n          \"$ref\": \"#/definitions/QoS\"\n        },\n        \"WriterGroupPartitions\": {\n          \"format\": \"int32\",\n          \"description\": \"Specifies how many partitions to split the writer group\\r\\ninto when publishing to target topics. Used to distribute\\r\\nmessage load and enable parallel processing by consumers.\\r\\nDefault is 1 partition. Particularly useful for\\r\\nhigh-throughput scenarios or when using partitioned\\r\\nqueues/topics in the messaging system.\",\n          \"type\": \"integer\"\n        },\n        \"DisableSubscriptionTransfer\": {\n          \"description\": \"Controls whether subscription transfer is disabled during\\r\\nreconnect. When false (default), attempts to transfer\\r\\nsubscriptions on reconnect to maintain data continuity. Set\\r\\nto true to fix interoperability issues with servers that\\r\\ndon't support subscription transfer. Can be configured\\r\\nglobally via command line options.\",\n          \"type\": \"boolean\"\n        },\n        \"RepublishAfterTransfer\": {\n          \"description\": \"Controls whether to republish missed values after a\\r\\nsubscription is transferred during reconnect handling. Only\\r\\napplies when DisableSubscriptionTransfer is false. Helps\\r\\nensure no data is lost during connection interruptions.\\r\\nDefault: true\",\n          \"type\": \"boolean\"\n        },\n        \"OpcNodeWatchdogTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"The timeout duration used to monitor whether monitored\\r\\nitems in the subscription are continuously reporting fresh\\r\\ndata. This watchdog mechanism helps detect stale data or\\r\\nconnectivity issues. When this timeout expires, the\\r\\nconfigured DataSetWriterWatchdogBehavior is triggered based\\r\\non OpcNodeWatchdogCondition. Expressed as a TimeSpan value.\",\n          \"type\": \"string\"\n        },\n        \"DataSetWriterWatchdogBehavior\": {\n          \"$ref\": \"#/definitions/SubscriptionWatchdogBehavior\"\n        },\n        \"OpcNodeWatchdogCondition\": {\n          \"$ref\": \"#/definitions/MonitoredItemWatchdogCondition\"\n        },\n        \"DataSetSamplingInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"Default sampling interval in milliseconds for all monitored\\r\\nitems in the dataset. Used if individual nodes don't\\r\\nspecify their own sampling interval. Follows OPC UA\\r\\nspecification for sampling behavior. Ignored when\\r\\nDataSetSamplingIntervalTimespan is present. Defaults to\\r\\nvalue configured via --oi command line option.\",\n          \"type\": \"integer\"\n        },\n        \"DataSetSamplingIntervalTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"Default sampling interval as TimeSpan for all monitored\\r\\nitems in the dataset. Takes precedence over\\r\\nDataSetSamplingInterval if both are defined. Used if\\r\\nindividual nodes don't specify their own sampling interval.\\r\\nProvides more precise control over sampling timing. Follows\\r\\nOPC UA specification for sampling behavior.\",\n          \"type\": \"string\"\n        },\n        \"DataSetFetchDisplayNames\": {\n          \"description\": \"Controls whether to fetch display names of monitored\\r\\nvariable nodes and use those inside messages as field\\r\\nnames. When true, fetches display names for all nodes. If\\r\\nfalse, uses DisplayName value if provided; if not provided,\\r\\nuses the node id. Can be configured via --fd command line\\r\\noption.\",\n          \"type\": \"boolean\"\n        },\n        \"WriterGroupMessageTtlTimepan\": {\n          \"format\": \"date-span\",\n          \"description\": \"Time-to-live duration for messages sent through the writer\\r\\ngroup. Only applied if the transport technology supports\\r\\nmessage TTL. After this duration expires, messages may be\\r\\ndiscarded by the messaging system. Used to prevent stale\\r\\ndata from being processed by consumers.\",\n          \"type\": \"string\"\n        },\n        \"WriterGroupMessageRetention\": {\n          \"description\": \"Controls whether messages should be retained by the\\r\\nmessaging system. Only applied if the transport technology\\r\\nsupports message retention. When true, messages are kept by\\r\\nthe broker even after delivery. Useful for late-joining\\r\\nsubscribers to receive the last known values.\",\n          \"type\": \"boolean\"\n        },\n        \"MessageTtlTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"Time-to-live duration for messages sent by this specific\\r\\nwriter. Overrides WriterGroupMessageTtlTimespan at the\\r\\nindividual writer level. Only applied if the transport\\r\\ntechnology supports message TTL. Allows different TTL\\r\\nsettings for different types of data.\",\n          \"type\": \"string\"\n        },\n        \"MessageRetention\": {\n          \"description\": \"Controls message retention for this specific writer.\\r\\nOverrides WriterGroupMessageRetention at the individual\\r\\nwriter level. Only applied if the transport technology\\r\\nsupports retention. Together with QueueName, allows\\r\\nsplitting messages across different queues with different\\r\\nretention policies.\",\n          \"type\": \"boolean\"\n        },\n        \"DefaultHeartbeatInterval\": {\n          \"format\": \"int32\",\n          \"description\": \"The interval in milliseconds at which to publish heartbeat\\r\\nmessages. Heartbeat acts like a watchdog that fires after\\r\\nthis interval has passed and no new value has been\\r\\nreceived. A value of 0 disables heartbeat. Ignored when\\r\\nDefaultHeartbeatIntervalTimespan is defined. See\\r\\nheartbeat.md for detailed behavior documentation.\",\n          \"type\": \"integer\"\n        },\n        \"DefaultHeartbeatIntervalTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"The heartbeat interval as TimeSpan for all nodes in this\\r\\ndataset. Takes precedence over DefaultHeartbeatInterval if\\r\\ndefined. Controls how often heartbeat messages are\\r\\npublished when no value changes occur.\",\n          \"type\": \"string\"\n        },\n        \"DefaultHeartbeatBehavior\": {\n          \"$ref\": \"#/definitions/HeartbeatBehavior\"\n        },\n        \"DataSetSourceUri\": {\n          \"description\": \"Contains an uri identifier that allows correlation of the writer\\r\\ndata set source into other systems. Will be used as part of\\r\\ncloud events header if enabled.\",\n          \"type\": \"string\"\n        },\n        \"DataSetSubject\": {\n          \"description\": \"Contains an identifier that allows correlation of the writer\\r\\ngroup into other systems in the context of the source. Will be\\r\\nused as part of cloud events header if enabled.\",\n          \"type\": \"string\"\n        },\n        \"WriterGroupProperties\": {\n          \"description\": \"Additional properties of the writer group that should be retained\\r\\nwith the configuration.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"description\": \"A variant which can be represented by any value including null.\",\n            \"type\": \"object\"\n          }\n        },\n        \"DataSetType\": {\n          \"description\": \"A type definition id that references a well known opc ua type\\r\\ndefinition node for the dataset represented by this entry.\\r\\nIf set it is used in context of cloud events to specify a concrete\\r\\ntype of dataset message in the cloud events type header.\",\n          \"type\": \"string\"\n        },\n        \"DataSetRootNodeId\": {\n          \"description\": \"A root node that all nodes that use a non rooted browse paths in the\\r\\ndataset should start from.\",\n          \"type\": \"string\"\n        },\n        \"WriterGroupRootNodeId\": {\n          \"description\": \"A node that represents the writer group in the server address space.\\r\\nThis is the instance id of the root node from which all datasets\\r\\noriginate. It is informational only and would not need to be\\r\\nconfigured\",\n          \"type\": \"string\"\n        },\n        \"WriterGroupType\": {\n          \"description\": \"A type that is attached to the writer group and explains the shape\\r\\nof the writer group. It is the type definition id of the writer\\r\\ngroup root node id. It is informational only and would not need\\r\\nto be configured\",\n          \"type\": \"string\"\n        },\n        \"MetaDataRetention\": {\n          \"description\": \"Metadata retention setting for the dataset writer.\",\n          \"type\": \"boolean\"\n        },\n        \"MetaDataTtlTimespan\": {\n          \"format\": \"date-span\",\n          \"description\": \"Metadata time-to-live duration for the dataset writer.\",\n          \"type\": \"string\"\n        },\n        \"SendKeepAliveAsKeyFrameMessages\": {\n          \"description\": \"When sending of keep alive messages is enabled, this\\r\\nflag controls whether the keep alive messages are sent\\r\\nas key frames. Key frames contain all current values.\",\n          \"type\": \"boolean\"\n        },\n        \"PublisherId\": {\n          \"description\": \"Set a publisher id to use that is different form the\\r\\nglobal publisher identity.\",\n          \"type\": \"string\"\n        },\n        \"WriterGroupTransportConfiguration\": {\n          \"description\": \"Pass connection string for the transport layer. This works\\r\\nfor transports that support connection strings such as\\r\\nIoT Hub or Event Hubs. It enables overriding the default\\r\\nconnection string configured for the publisher. The transport\\r\\nmust be configured using the command line options first, and\\r\\ncan be overriden here. If it is not configured on the command\\r\\nline first, the setting here is ignored.\",\n          \"type\": \"string\"\n        },\n        \"DumpConnectionDiagnostics\": {\n          \"description\": \"Enables detailed server diagnostics logging for the\\r\\nconnection. When enabled, provides additional diagnostic\\r\\ninformation useful for troubleshooting connectivity,\\r\\nauthentication, and subscription issues. The diagnostics\\r\\ndata is included in the publisher's logs. Default: false\",\n          \"type\": \"boolean\"\n        },\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/NodeIdModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedNodesEntryModelServiceResponse\": {\n      \"description\": \"Response envelope\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"result\": {\n          \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"PublishedNodesEntryModelServiceResponseIAsyncEnumerable\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false\n    },\n    \"PublishedNodesResponseModel\": {\n      \"description\": \"PublishNodes direct method response\",\n      \"type\": \"object\",\n      \"additionalProperties\": false\n    },\n    \"QoS\": {\n      \"enum\": [\n        \"AtMostOnce\",\n        \"AtLeastOnce\",\n        \"ExactlyOnce\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"QoS\",\n        \"modelAsString\": false\n      }\n    },\n    \"QueryCompilationRequestModel\": {\n      \"description\": \"Query compiler request model\",\n      \"required\": [\n        \"query\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"query\": {\n          \"description\": \"The query to compile.\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"queryType\": {\n          \"$ref\": \"#/definitions/QueryType\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"QueryCompilationRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/QueryCompilationRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"QueryCompilationResponseModel\": {\n      \"description\": \"Query compiler response model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        },\n        \"eventFilter\": {\n          \"$ref\": \"#/definitions/EventFilterModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"QueryType\": {\n      \"description\": \"Query type\",\n      \"enum\": [\n        \"Event\",\n        \"Query\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"QueryType\",\n        \"modelAsString\": false\n      }\n    },\n    \"ReadEventsDetailsModel\": {\n      \"description\": \"Read event data\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"startTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"Start time to read from\",\n          \"type\": \"string\"\n        },\n        \"endTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"End time to read to\",\n          \"type\": \"string\"\n        },\n        \"numEvents\": {\n          \"format\": \"int64\",\n          \"description\": \"Number of events to read\",\n          \"type\": \"integer\"\n        },\n        \"filter\": {\n          \"$ref\": \"#/definitions/EventFilterModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadEventsDetailsModelHistoryReadRequestModel\": {\n      \"description\": \"Request node history read\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to read from (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/ReadEventsDetailsModel\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range to read, e.g. 1:2,0:1 for 2 slices\\r\\nout of a matrix or 0:1 for the first item in\\r\\nan array, string or bytestring.\\r\\nSee 7.22 of part 4: NumericRange.\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"timestampsToReturn\": {\n          \"$ref\": \"#/definitions/TimestampsToReturn\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadEventsDetailsModelHistoryReadRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/ReadEventsDetailsModelHistoryReadRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadModifiedValuesDetailsModel\": {\n      \"description\": \"Read modified data\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"startTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"The start time to read from\",\n          \"type\": \"string\"\n        },\n        \"endTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"The end time to read to\",\n          \"type\": \"string\"\n        },\n        \"numValues\": {\n          \"format\": \"int64\",\n          \"description\": \"The number of values to read\",\n          \"type\": \"integer\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadModifiedValuesDetailsModelHistoryReadRequestModel\": {\n      \"description\": \"Request node history read\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to read from (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/ReadModifiedValuesDetailsModel\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range to read, e.g. 1:2,0:1 for 2 slices\\r\\nout of a matrix or 0:1 for the first item in\\r\\nan array, string or bytestring.\\r\\nSee 7.22 of part 4: NumericRange.\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"timestampsToReturn\": {\n          \"$ref\": \"#/definitions/TimestampsToReturn\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadModifiedValuesDetailsModelHistoryReadRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/ReadModifiedValuesDetailsModelHistoryReadRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadProcessedValuesDetailsModel\": {\n      \"description\": \"Read processed historic data\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"startTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"Start time to read from.\",\n          \"type\": \"string\"\n        },\n        \"endTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"End time to read until\",\n          \"type\": \"string\"\n        },\n        \"processingInterval\": {\n          \"format\": \"date-span\",\n          \"description\": \"Interval to process\",\n          \"type\": \"string\"\n        },\n        \"aggregateType\": {\n          \"description\": \"The aggregate type to apply. Can be the name of\\r\\nthe aggregate if available in the history server\\r\\ncapabilities, or otherwise will be used as a node\\r\\nid referring to the aggregate.\",\n          \"type\": \"string\"\n        },\n        \"aggregateConfiguration\": {\n          \"$ref\": \"#/definitions/AggregateConfigurationModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadProcessedValuesDetailsModelHistoryReadRequestModel\": {\n      \"description\": \"Request node history read\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to read from (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/ReadProcessedValuesDetailsModel\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range to read, e.g. 1:2,0:1 for 2 slices\\r\\nout of a matrix or 0:1 for the first item in\\r\\nan array, string or bytestring.\\r\\nSee 7.22 of part 4: NumericRange.\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"timestampsToReturn\": {\n          \"$ref\": \"#/definitions/TimestampsToReturn\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadProcessedValuesDetailsModelHistoryReadRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/ReadProcessedValuesDetailsModelHistoryReadRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadRequestModel\": {\n      \"description\": \"Request node attribute read\",\n      \"required\": [\n        \"attributes\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"attributes\": {\n          \"description\": \"Attributes to read\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/AttributeReadRequestModel\"\n          }\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/ReadRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadResponseModel\": {\n      \"description\": \"Result of attribute reads\",\n      \"required\": [\n        \"results\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"results\": {\n          \"description\": \"All results of attribute reads\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/AttributeReadResponseModel\"\n          }\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadValuesAtTimesDetailsModel\": {\n      \"description\": \"Read data at specified times\",\n      \"required\": [\n        \"reqTimes\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"reqTimes\": {\n          \"description\": \"Requested datums\",\n          \"type\": \"array\",\n          \"items\": {\n            \"format\": \"date-time\",\n            \"type\": \"string\"\n          }\n        },\n        \"useSimpleBounds\": {\n          \"description\": \"Whether to use simple bounds\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadValuesAtTimesDetailsModelHistoryReadRequestModel\": {\n      \"description\": \"Request node history read\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to read from (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/ReadValuesAtTimesDetailsModel\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range to read, e.g. 1:2,0:1 for 2 slices\\r\\nout of a matrix or 0:1 for the first item in\\r\\nan array, string or bytestring.\\r\\nSee 7.22 of part 4: NumericRange.\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"timestampsToReturn\": {\n          \"$ref\": \"#/definitions/TimestampsToReturn\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadValuesAtTimesDetailsModelHistoryReadRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/ReadValuesAtTimesDetailsModelHistoryReadRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadValuesDetailsModel\": {\n      \"description\": \"Read historic values\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"startTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"Beginning of period to read. Set to null\\r\\nif no specific start time is specified.\",\n          \"type\": \"string\"\n        },\n        \"endTime\": {\n          \"format\": \"date-time\",\n          \"description\": \"End of period to read. Set to null if no\\r\\nspecific end time is specified.\",\n          \"type\": \"string\"\n        },\n        \"numValues\": {\n          \"format\": \"int64\",\n          \"description\": \"The maximum number of values returned for any Node\\r\\nover the time range. If only one time is specified,\\r\\nthe time range shall extend to return this number\\r\\nof values. 0 or null indicates that there is no\\r\\nmaximum.\",\n          \"type\": \"integer\"\n        },\n        \"returnBounds\": {\n          \"description\": \"Whether to return the bounding values or not.\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadValuesDetailsModelHistoryReadRequestModel\": {\n      \"description\": \"Request node history read\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to read from (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/ReadValuesDetailsModel\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range to read, e.g. 1:2,0:1 for 2 slices\\r\\nout of a matrix or 0:1 for the first item in\\r\\nan array, string or bytestring.\\r\\nSee 7.22 of part 4: NumericRange.\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"timestampsToReturn\": {\n          \"$ref\": \"#/definitions/TimestampsToReturn\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ReadValuesDetailsModelHistoryReadRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/ReadValuesDetailsModelHistoryReadRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"RequestHeaderModel\": {\n      \"description\": \"Request header model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"elevation\": {\n          \"$ref\": \"#/definitions/CredentialModel\"\n        },\n        \"locales\": {\n          \"description\": \"Optional list of preferred locales in preference\\r\\norder to be used during connecting the session.\\r\\nWe suggest to use the connection object to set\\r\\nthe locales\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"diagnostics\": {\n          \"$ref\": \"#/definitions/DiagnosticsModel\"\n        },\n        \"namespaceFormat\": {\n          \"$ref\": \"#/definitions/NamespaceFormat\"\n        },\n        \"operationTimeout\": {\n          \"format\": \"int32\",\n          \"description\": \"Operation timeout in ms. This applies to every\\r\\noperation that is invoked, not to the entire\\r\\ntransaction and overrides the configured operation\\r\\ntimeout.\",\n          \"type\": \"integer\"\n        },\n        \"serviceCallTimeout\": {\n          \"format\": \"int32\",\n          \"description\": \"Service call timeout in ms. As opposed to the\\r\\noperation timeout this terminates the entire\\r\\ntransaction if it takes longer than the timeout to\\r\\ncomplete. Note that a connect and reconnect during\\r\\nthe service call is gated by the connect timeout\\r\\nsetting. If a connect timeout is not specified\\r\\nthis timeout is used also for connect timeout.\",\n          \"type\": \"integer\"\n        },\n        \"connectTimeout\": {\n          \"format\": \"int32\",\n          \"description\": \"Connect timeout in ms. As opposed to the service call\\r\\ntimeout this terminates the entire transaction if\\r\\nit takes longer than the timeout to connect a session\\r\\nA connect and reconnect during the service call\\r\\nresets the timeout therefore the overall time for\\r\\nthe call to complete can be longer than specified.\",\n          \"type\": \"integer\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"RequestHeaderModelPublishedNodesEntryRequestModel\": {\n      \"description\": \"Wraps a request and a published nodes entry to bind to a\\r\\nbody more easily for api that requires an entry and additional\\r\\nconfiguration\",\n      \"required\": [\n        \"entry\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"entry\": {\n          \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"RequestHeaderModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"RolePermissionModel\": {\n      \"description\": \"Role permission model\",\n      \"required\": [\n        \"roleId\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"roleId\": {\n          \"description\": \"Identifier of the role object.\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"permissions\": {\n          \"$ref\": \"#/definitions/RolePermissions\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"RolePermissions\": {\n      \"description\": \"Individual permissions assigned to a role\",\n      \"enum\": [\n        \"None\",\n        \"Browse\",\n        \"ReadRolePermissions\",\n        \"WriteAttribute\",\n        \"WriteRolePermissions\",\n        \"WriteHistorizing\",\n        \"Read\",\n        \"Write\",\n        \"ReadHistory\",\n        \"InsertHistory\",\n        \"ModifyHistory\",\n        \"DeleteHistory\",\n        \"ReceiveEvents\",\n        \"Call\",\n        \"AddReference\",\n        \"RemoveReference\",\n        \"DeleteNode\",\n        \"AddNode\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"RolePermissions\",\n        \"modelAsString\": false\n      }\n    },\n    \"SecurityMode\": {\n      \"description\": \"Specifies the security mode for OPC UA endpoint connections.\\r\\nDetermines how messages are protected during transmission between\\r\\nthe Publisher and OPC UA servers. Proper security mode selection\\r\\nis crucial for protecting sensitive data and credentials.\",\n      \"enum\": [\n        \"Best\",\n        \"Sign\",\n        \"SignAndEncrypt\",\n        \"None\",\n        \"NotNone\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"SecurityMode\",\n        \"modelAsString\": false\n      }\n    },\n    \"ServerCapabilitiesModel\": {\n      \"description\": \"Server capabilities\",\n      \"required\": [\n        \"operationLimits\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"operationLimits\": {\n          \"$ref\": \"#/definitions/OperationLimitsModel\"\n        },\n        \"supportedLocales\": {\n          \"description\": \"Supported locales\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"serverProfileArray\": {\n          \"description\": \"Server profiles\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"modellingRules\": {\n          \"description\": \"Supported modelling rules\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"aggregateFunctions\": {\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"MaxSessions\": {\n          \"format\": \"int64\",\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"integer\"\n        },\n        \"MaxSubscriptions\": {\n          \"format\": \"int64\",\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"integer\"\n        },\n        \"MaxMonitoredItems\": {\n          \"format\": \"int64\",\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"integer\"\n        },\n        \"MaxSubscriptionsPerSession\": {\n          \"format\": \"int64\",\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"integer\"\n        },\n        \"MaxMonitoredItemsPerSubscription\": {\n          \"format\": \"int64\",\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"integer\"\n        },\n        \"MaxSelectClauseParameters\": {\n          \"format\": \"int64\",\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"integer\"\n        },\n        \"MaxWhereClauseParameters\": {\n          \"format\": \"int64\",\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"integer\"\n        },\n        \"MaxMonitoredItemsQueueSize\": {\n          \"format\": \"int64\",\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"integer\"\n        },\n        \"conformanceUnits\": {\n          \"description\": \"Supported aggregate functions\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ServerEndpointQueryModel\": {\n      \"description\": \"Endpoint model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"discoveryUrl\": {\n          \"description\": \"Discovery url to use to query\",\n          \"type\": \"string\"\n        },\n        \"url\": {\n          \"description\": \"Endpoint url that should match the found endpoint\",\n          \"type\": \"string\"\n        },\n        \"securityMode\": {\n          \"$ref\": \"#/definitions/SecurityMode\"\n        },\n        \"securityPolicy\": {\n          \"description\": \"Endpoint must support this Security policy.\",\n          \"type\": \"string\"\n        },\n        \"certificate\": {\n          \"description\": \"Endpoint must match with this certificate thumbprint\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ServerRegistrationRequestModel\": {\n      \"description\": \"Server registration request\",\n      \"required\": [\n        \"discoveryUrl\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"discoveryUrl\": {\n          \"description\": \"Discovery url to use for registration\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"User defined request id\",\n          \"type\": \"string\"\n        },\n        \"context\": {\n          \"$ref\": \"#/definitions/OperationContextModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ServiceResultModel\": {\n      \"description\": \"Service result\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"statusCode\": {\n          \"format\": \"int64\",\n          \"description\": \"Error code - if null operation succeeded.\",\n          \"type\": \"integer\"\n        },\n        \"errorMessage\": {\n          \"description\": \"Error message in case of error or null.\",\n          \"type\": \"string\"\n        },\n        \"symbolicId\": {\n          \"description\": \"Symbolic identifier\",\n          \"type\": \"string\"\n        },\n        \"locale\": {\n          \"description\": \"Locale of the error message\",\n          \"type\": \"string\"\n        },\n        \"additionalInfo\": {\n          \"description\": \"Additional information if available\",\n          \"type\": \"string\"\n        },\n        \"namespaceUri\": {\n          \"description\": \"Namespace uri\",\n          \"type\": \"string\"\n        },\n        \"inner\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"SetConfiguredEndpointsRequestModel\": {\n      \"description\": \"Set configured endpoints request call\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"endpoints\": {\n          \"description\": \"Endpoints and nodes that make up the configuration\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"SimpleAttributeOperandModel\": {\n      \"description\": \"Simple attribute operand model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"typeDefinitionId\": {\n          \"description\": \"Type definition node id if operand is\\r\\nsimple or full attribute operand.\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"Browse path of attribute operand\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"attributeId\": {\n          \"$ref\": \"#/definitions/NodeAttribute\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range of attribute operand\",\n          \"type\": \"string\"\n        },\n        \"displayName\": {\n          \"description\": \"Optional display name\",\n          \"type\": \"string\"\n        },\n        \"dataSetClassFieldId\": {\n          \"format\": \"uuid\",\n          \"description\": \"Optional data set class field id (Publisher extension)\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"SubscriptionWatchdogBehavior\": {\n      \"description\": \"Defines how the publisher responds when monitored items stop reporting data.\\r\\nThe watchdog triggers when items are late according to OpcNodeWatchdogTimespan\\r\\nand OpcNodeWatchdogCondition settings. Can be configured globally via the\\r\\n--dwb command line option.\",\n      \"enum\": [\n        \"Diagnostic\",\n        \"Reset\",\n        \"FailFast\",\n        \"ExitProcess\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"SubscriptionWatchdogBehavior\",\n        \"modelAsString\": false\n      }\n    },\n    \"TestConnectionRequestModel\": {\n      \"description\": \"Test connection request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"TestConnectionRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/TestConnectionRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"TestConnectionResponseModel\": {\n      \"description\": \"Test connection response\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"TimestampsToReturn\": {\n      \"description\": \"Timestamps\",\n      \"enum\": [\n        \"Both\",\n        \"Source\",\n        \"Server\",\n        \"None\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"TimestampsToReturn\",\n        \"modelAsString\": false\n      }\n    },\n    \"TypeDefinitionModel\": {\n      \"description\": \"Type definition\",\n      \"required\": [\n        \"typeDefinitionId\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"typeDefinitionId\": {\n          \"description\": \"The node id of the type of the node\",\n          \"minLength\": 1,\n          \"type\": \"string\"\n        },\n        \"nodeType\": {\n          \"$ref\": \"#/definitions/NodeType\"\n        },\n        \"displayName\": {\n          \"description\": \"Display name\",\n          \"type\": \"string\"\n        },\n        \"browseName\": {\n          \"description\": \"Browse name\",\n          \"type\": \"string\"\n        },\n        \"description\": {\n          \"description\": \"Description if any\",\n          \"type\": \"string\"\n        },\n        \"typeHierarchy\": {\n          \"description\": \"Super types hierarchy starting from base type\\r\\nup to Azure.IIoT.OpcUa.Publisher.Models.TypeDefinitionModel.TypeDefinitionId which is\\r\\nnot included.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/NodeModel\"\n          }\n        },\n        \"typeMembers\": {\n          \"description\": \"Fully inherited instance declarations of the type\\r\\nof the node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/InstanceDeclarationModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"UpdateEventsDetailsModel\": {\n      \"description\": \"Insert, upsert or replace historic events\",\n      \"required\": [\n        \"events\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"filter\": {\n          \"$ref\": \"#/definitions/EventFilterModel\"\n        },\n        \"events\": {\n          \"description\": \"The new events to insert\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/HistoricEventModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"UpdateEventsDetailsModelHistoryUpdateRequestModel\": {\n      \"description\": \"Request node history update\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to update (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/UpdateEventsDetailsModel\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"UpdateEventsDetailsModelHistoryUpdateRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/UpdateEventsDetailsModelHistoryUpdateRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"UpdateValuesDetailsModel\": {\n      \"description\": \"Insert, upsert, or update historic values\",\n      \"required\": [\n        \"values\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"values\": {\n          \"description\": \"Values to insert\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/HistoricValueModel\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"UpdateValuesDetailsModelHistoryUpdateRequestModel\": {\n      \"description\": \"Request node history update\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to update (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/UpdateValuesDetailsModel\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"UpdateValuesDetailsModelHistoryUpdateRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/UpdateValuesDetailsModelHistoryUpdateRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"UserIdentityModel\": {\n      \"description\": \"User identity model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"user\": {\n          \"description\": \"\\r\\nFor Azure.IIoT.OpcUa.Publisher.Models.CredentialType.UserName authentication\\r\\n            this is the name of the user.\\r\\n\\r\\nFor Azure.IIoT.OpcUa.Publisher.Models.CredentialType.X509Certificate authentication\\r\\n            this is the subject name of the certificate that has been\\r\\n            configured.\\r\\n            Either Azure.IIoT.OpcUa.Publisher.Models.UserIdentityModel.User or Azure.IIoT.OpcUa.Publisher.Models.UserIdentityModel.Thumbprint must be\\r\\n            used to select the certificate in the user certificate store.\\r\\n\\r\\nNot used for the other authentication types.\",\n          \"type\": \"string\"\n        },\n        \"password\": {\n          \"description\": \"\\r\\nFor Azure.IIoT.OpcUa.Publisher.Models.CredentialType.UserName authentication\\r\\n            this is the password of the user.\\r\\n\\r\\nFor Azure.IIoT.OpcUa.Publisher.Models.CredentialType.X509Certificate authentication\\r\\n            this is the passcode to export the configured certificate's\\r\\n            private key.\\r\\n\\r\\nNot used for the other authentication types.\",\n          \"type\": \"string\"\n        },\n        \"thumbprint\": {\n          \"description\": \"\\r\\nFor Azure.IIoT.OpcUa.Publisher.Models.CredentialType.X509Certificate authentication\\r\\n            this is the thumbprint of the configured certificate to use.\\r\\n            Either Azure.IIoT.OpcUa.Publisher.Models.UserIdentityModel.User or Azure.IIoT.OpcUa.Publisher.Models.UserIdentityModel.Thumbprint must be\\r\\n            used to select the certificate in the user certificate store.\\r\\n\\r\\nNot used for the other authentication types.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ValueReadRequestModel\": {\n      \"description\": \"Request node value read\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to read from (mandatory)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nan actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"indexRange\": {\n          \"description\": \"Index range to read, e.g. 1:2,0:1 for 2 slices\\r\\nout of a matrix or 0:1 for the first item in\\r\\nan array, string or bytestring.\\r\\nSee 7.22 of part 4: NumericRange.\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"maxAge\": {\n          \"format\": \"date-span\",\n          \"description\": \"Maximum age of the value to be read in milliseconds.\\r\\nThe age of the value is based on the difference\\r\\nbetween the ServerTimestamp and the time when\\r\\nthe Server starts processing the request.\\r\\nIf not supplied, the Server shall attempt to read\\r\\na new value from the data source.\",\n          \"type\": \"string\"\n        },\n        \"timestampsToReturn\": {\n          \"$ref\": \"#/definitions/TimestampsToReturn\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ValueReadRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/ValueReadRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ValueReadResponseModel\": {\n      \"description\": \"Value read response model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"value\": {\n          \"description\": \"Value read\",\n          \"type\": \"object\"\n        },\n        \"dataType\": {\n          \"description\": \"Built in data type of the value read.\",\n          \"type\": \"string\"\n        },\n        \"sourcePicoseconds\": {\n          \"format\": \"int32\",\n          \"description\": \"Pico seconds part of when value was read at source.\",\n          \"type\": \"integer\"\n        },\n        \"sourceTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Timestamp of when value was read at source.\",\n          \"type\": \"string\"\n        },\n        \"serverPicoseconds\": {\n          \"format\": \"int32\",\n          \"description\": \"Pico seconds part of when value was read at server.\",\n          \"type\": \"integer\"\n        },\n        \"serverTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Timestamp of when value was read at server.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ValueWriteRequestModel\": {\n      \"description\": \"Value write request model\",\n      \"required\": [\n        \"value\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node id to write value to.\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"value\": {\n          \"description\": \"Value to write. The system tries to convert\\r\\nthe value according to the data type value,\\r\\ne.g. convert comma seperated value strings\\r\\ninto arrays.  (Mandatory)\",\n          \"type\": \"object\"\n        },\n        \"dataType\": {\n          \"description\": \"A built in datatype for the value. This can\\r\\nbe a data type from browse, or a built in\\r\\ntype.\\r\\n(default: best effort)\",\n          \"type\": \"string\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range to write\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ValueWriteRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/ValueWriteRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"ValueWriteResponseModel\": {\n      \"description\": \"Value write response model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"VariableMetadataModel\": {\n      \"description\": \"Variable metadata model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"dataType\": {\n          \"$ref\": \"#/definitions/DataTypeMetadataModel\"\n        },\n        \"valueRank\": {\n          \"$ref\": \"#/definitions/NodeValueRank\"\n        },\n        \"arrayDimensions\": {\n          \"format\": \"int64\",\n          \"description\": \"Array dimensions of the variable.\",\n          \"type\": \"integer\",\n          \"items\": {\n            \"format\": \"int64\",\n            \"type\": \"integer\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"VariantValueHistoryReadNextResponseModel\": {\n      \"description\": \"History read continuation result\",\n      \"required\": [\n        \"history\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"history\": {\n          \"description\": \"History as json encoded extension object\",\n          \"type\": \"object\"\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation token if more results pending.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"VariantValueHistoryReadRequestModel\": {\n      \"description\": \"Request node history read\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to read from (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"description\": \"The HistoryReadDetailsType extension object\\r\\nencoded in json and containing the tunneled\\r\\nHistorian reader request.\",\n          \"type\": \"object\"\n        },\n        \"indexRange\": {\n          \"description\": \"Index range to read, e.g. 1:2,0:1 for 2 slices\\r\\nout of a matrix or 0:1 for the first item in\\r\\nan array, string or bytestring.\\r\\nSee 7.22 of part 4: NumericRange.\",\n          \"type\": \"string\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"timestampsToReturn\": {\n          \"$ref\": \"#/definitions/TimestampsToReturn\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"VariantValueHistoryReadRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/VariantValueHistoryReadRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"VariantValueHistoryReadResponseModel\": {\n      \"description\": \"History read results\",\n      \"required\": [\n        \"history\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"history\": {\n          \"description\": \"History as json encoded extension object\",\n          \"type\": \"object\"\n        },\n        \"continuationToken\": {\n          \"description\": \"Continuation token if more results pending.\",\n          \"type\": \"string\"\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"VariantValueHistoryUpdateRequestModel\": {\n      \"description\": \"Request node history update\",\n      \"required\": [\n        \"details\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"nodeId\": {\n          \"description\": \"Node to update (mandatory without browse path)\",\n          \"type\": \"string\"\n        },\n        \"browsePath\": {\n          \"description\": \"An optional path from NodeId instance to\\r\\nthe actual node.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"details\": {\n          \"description\": \"The HistoryUpdateDetailsType extension object\\r\\nencoded as json Variant and containing the tunneled\\r\\nupdate request for the Historian server. The value\\r\\nis updated at edge using above node address.\",\n          \"type\": \"object\"\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"VariantValueHistoryUpdateRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/VariantValueHistoryUpdateRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"VariantValuePublishedNodeCreateAssetRequestModel\": {\n      \"description\": \"Request to create an asset in the configuration api\",\n      \"required\": [\n        \"configuration\",\n        \"entry\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        },\n        \"entry\": {\n          \"$ref\": \"#/definitions/PublishedNodesEntryModel\"\n        },\n        \"configuration\": {\n          \"description\": \"The asset configuration to use when creating the asset.\",\n          \"type\": \"object\"\n        },\n        \"waitTime\": {\n          \"format\": \"date-span\",\n          \"description\": \"Time to wait after the configuration is applied to perform\\r\\nthe configuration of the asset in the configuration api.\\r\\nThis is to let the server settle.\",\n          \"type\": \"string\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"WriteRequestModel\": {\n      \"description\": \"Request node attribute write\",\n      \"required\": [\n        \"attributes\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"attributes\": {\n          \"description\": \"Attributes to update\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/AttributeWriteRequestModel\"\n          }\n        },\n        \"header\": {\n          \"$ref\": \"#/definitions/RequestHeaderModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"WriteRequestModelRequestEnvelope\": {\n      \"description\": \"Wraps a request and a connection to bind to a\\r\\nbody more easily for api that requires a\\r\\nconnection endpoint\",\n      \"required\": [\n        \"connection\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"connection\": {\n          \"$ref\": \"#/definitions/ConnectionModel\"\n        },\n        \"request\": {\n          \"$ref\": \"#/definitions/WriteRequestModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"WriteResponseModel\": {\n      \"description\": \"Result of attribute write\",\n      \"required\": [\n        \"results\"\n      ],\n      \"type\": \"object\",\n      \"properties\": {\n        \"results\": {\n          \"description\": \"All results of attribute writes\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/AttributeWriteResponseModel\"\n          }\n        },\n        \"errorInfo\": {\n          \"$ref\": \"#/definitions/ServiceResultModel\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"WriterGroupTransport\": {\n      \"description\": \"Specifies the transport technology used to publish messages from OPC Publisher.\\r\\nEach transport offers different capabilities for message delivery, routing,\\r\\nand quality of service. The transport choice affects how messages are delivered\\r\\nand what features are available.\",\n      \"enum\": [\n        \"IoTHub\",\n        \"Mqtt\",\n        \"EventHub\",\n        \"Dapr\",\n        \"Http\",\n        \"FileSystem\",\n        \"AioMqtt\",\n        \"AioDss\",\n        \"Null\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"WriterGroupTransport\",\n        \"modelAsString\": false\n      }\n    },\n    \"X509CertificateChainModel\": {\n      \"description\": \"Certificate chain\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"chain\": {\n          \"description\": \"Chain\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/X509CertificateModel\"\n          }\n        },\n        \"status\": {\n          \"description\": \"Chain validation status if validated\",\n          \"enum\": [\n            \"NotTimeValid\",\n            \"Revoked\",\n            \"NotSignatureValid\",\n            \"NotValidForUsage\",\n            \"UntrustedRoot\",\n            \"RevocationStatusUnknown\",\n            \"Cyclic\",\n            \"InvalidExtension\",\n            \"InvalidPolicyConstraints\",\n            \"InvalidBasicConstraints\",\n            \"InvalidNameConstraints\",\n            \"HasNotSupportedNameConstraint\",\n            \"HasNotDefinedNameConstraint\",\n            \"HasNotPermittedNameConstraint\",\n            \"HasExcludedNameConstraint\",\n            \"PartialChain\",\n            \"CtlNotTimeValid\",\n            \"CtlNotSignatureValid\",\n            \"CtlNotValidForUsage\",\n            \"HasWeakSignature\",\n            \"OfflineRevocation\",\n            \"NoIssuanceChainPolicy\",\n            \"ExplicitDistrust\",\n            \"HasNotSupportedCriticalExtension\"\n          ],\n          \"type\": \"string\",\n          \"items\": {\n            \"$ref\": \"#/definitions/X509ChainStatus\"\n          },\n          \"x-ms-enum\": {\n            \"name\": \"X509ChainStatus\",\n            \"modelAsString\": false\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"X509CertificateModel\": {\n      \"description\": \"Certificate model\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"subject\": {\n          \"description\": \"Subject\",\n          \"type\": \"string\"\n        },\n        \"thumbprint\": {\n          \"description\": \"Thumbprint\",\n          \"type\": \"string\"\n        },\n        \"serialNumber\": {\n          \"description\": \"Serial number\",\n          \"type\": \"string\"\n        },\n        \"notBeforeUtc\": {\n          \"format\": \"date-time\",\n          \"description\": \"Not before validity\",\n          \"type\": \"string\"\n        },\n        \"notAfterUtc\": {\n          \"format\": \"date-time\",\n          \"description\": \"Not after validity\",\n          \"type\": \"string\"\n        },\n        \"selfSigned\": {\n          \"description\": \"Self signed certificate\",\n          \"type\": \"boolean\"\n        },\n        \"pfx\": {\n          \"description\": \"Certificate as Pkcs12\",\n          \"type\": \"array\",\n          \"items\": {\n            \"format\": \"int32\",\n            \"type\": \"integer\"\n          }\n        },\n        \"hasPrivateKey\": {\n          \"description\": \"Contains private key\",\n          \"type\": \"boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"X509ChainStatus\": {\n      \"description\": \"Status of x509 chain\",\n      \"enum\": [\n        \"NotTimeValid\",\n        \"Revoked\",\n        \"NotSignatureValid\",\n        \"NotValidForUsage\",\n        \"UntrustedRoot\",\n        \"RevocationStatusUnknown\",\n        \"Cyclic\",\n        \"InvalidExtension\",\n        \"InvalidPolicyConstraints\",\n        \"InvalidBasicConstraints\",\n        \"InvalidNameConstraints\",\n        \"HasNotSupportedNameConstraint\",\n        \"HasNotDefinedNameConstraint\",\n        \"HasNotPermittedNameConstraint\",\n        \"HasExcludedNameConstraint\",\n        \"PartialChain\",\n        \"CtlNotTimeValid\",\n        \"CtlNotSignatureValid\",\n        \"CtlNotValidForUsage\",\n        \"HasWeakSignature\",\n        \"OfflineRevocation\",\n        \"NoIssuanceChainPolicy\",\n        \"ExplicitDistrust\",\n        \"HasNotSupportedCriticalExtension\"\n      ],\n      \"type\": \"string\",\n      \"x-ms-enum\": {\n        \"name\": \"X509ChainStatus\",\n        \"modelAsString\": false\n      }\n    }\n  },\n  \"tags\": [\n    {\n      \"name\": \"Certificates\",\n      \"description\": \"\\r\\nThis section lists the certificate APi provided by OPC Publisher providing\\r\\n            all public and private key infrastructure (PKI) related API methods.\\r\\n\\r\\nThe method name for all transports other than HTTP (which uses the shown\\r\\n            HTTP methods and resource uris) is the name of the subsection header.\\r\\n            To use the version specific method append \\\"_V1\\\" or \\\"_V2\\\" to the method\\r\\n            name.\"\n    },\n    {\n      \"name\": \"Configuration\",\n      \"description\": \"\\r\\nThis section contains the API to configure OPC Publisher.\\r\\n\\r\\nThe method name for all transports other than HTTP (which uses the shown\\r\\n            HTTP methods and resource uris) is the name of the subsection header.\\r\\n            To use the version specific method append \\\"_V1\\\" or \\\"_V2\\\" to the method\\r\\n            name.\"\n    },\n    {\n      \"name\": \"Diagnostics\",\n      \"description\": \"\\r\\nThis section lists the diagnostics APi provided by OPC Publisher providing\\r\\n            connection related diagnostics API methods.\\r\\n\\r\\nThe method name for all transports other than HTTP (which uses the shown\\r\\n            HTTP methods and resource uris) is the name of the subsection header.\\r\\n            To use the version specific method append \\\"_V1\\\" or \\\"_V2\\\" to the method\\r\\n            name.\"\n    },\n    {\n      \"name\": \"Discovery\",\n      \"description\": \"\\r\\nOPC UA and network discovery related API.\\r\\n\\r\\nThe method name for all transports other than HTTP (which uses the shown\\r\\n            HTTP methods and resource uris) is the name of the subsection header.\\r\\n            To use the version specific method append \\\"_V1\\\" or \\\"_V2\\\" to the method\"\n    },\n    {\n      \"name\": \"FileSystem\",\n      \"description\": \"\\r\\nThis section lists the file transfer API provided by OPC Publisher providing\\r\\n            access to file transfer services to move files in and out of a server\\r\\n            using the File transfer specification.\\r\\n\\r\\nThe method name for all transports other than HTTP (which uses the shown\\r\\n            HTTP methods and resource uris) is the name of the subsection header.\\r\\n            To use the version specific method append \\\"_V1\\\" or \\\"_V2\\\" to the method\\r\\n            name.\"\n    },\n    {\n      \"name\": \"General\",\n      \"description\": \"\\r\\nThis section lists the general APi provided by OPC Publisher providing\\r\\n            all connection, endpoint and address space related API methods.\\r\\n\\r\\nThe method name for all transports other than HTTP (which uses the shown\\r\\n            HTTP methods and resource uris) is the name of the subsection header.\\r\\n            To use the version specific method append \\\"_V1\\\" or \\\"_V2\\\" to the method\\r\\n            name.\"\n    },\n    {\n      \"name\": \"History\",\n      \"description\": \"\\r\\nThis section lists all OPC UA HDA or Historian related API provided by\\r\\n            OPC Publisher.\\r\\n\\r\\nThe method name for all transports other than HTTP (which uses the shown\\r\\n            HTTP methods and resource uris) is the name of the subsection header.\\r\\n            To use the version specific method append \\\"_V1\\\" or \\\"_V2\\\" to the method\\r\\n            name.\"\n    },\n    {\n      \"name\": \"Writer\",\n      \"description\": \"\\r\\nThis section contains the API to configure data set writers and writer\\r\\n            groups inside OPC Publisher. It supersedes the configuration API.\\r\\n            Applications should use one or the other, but not both at the same\\r\\n            time.\\r\\n\\r\\nThe method name for all transports other than HTTP (which uses the shown\\r\\n            HTTP methods and resource uris) is the name of the subsection header.\\r\\n            To use the version specific method append \\\"_V1\\\" or \\\"_V2\\\" to the method\\r\\n            name.\"\n    }\n  ]\n}\n"
  },
  {
    "path": "docs/opc-publisher/publishednodes_2.5.json",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n[\n\n  {\n    // example for an EnpointUrl is: opc.tcp://192.168.178.26:62541/Quickstarts/ReferenceServer\n    \"EndpointUrl\": \"opc.tcp://<your_opcua_server>:<your_opcua_server_port>/<your_opcua_server_path>\",\n    // allows to access the endpoint with SecurityPolicy.None when set to 'false' (no signing and encryption applied to the OPC UA communication), default is true\n    \"UseSecurity\": true,\n    \"OpcNodes\": [\n      {\n        // identifies the OPC node to publish in either NodeId format (contains \"ns=\") or ExpandedNodeId format (contains \"nsu=\")\n        \"Id\": \"i=2258\",\n        // specifies the sampling interval OPC Publisher requests the server to sample the node value\n        \"OpcSamplingInterval\": 2000,\n        // specifies the publishing interval OPC Publisher requests the server to publish the node value, it will only be published if the value has changed\n        \"OpcPublishingInterval\": 5000,\n        // specifies that there should be a heartbeat generated by OPC Publisher, this means that after the given interval the last message will be sent again with an updated SourceTimestamp value.\n        \"HeartbeatInterval\": 3600,\n        // specifies that the first event will not generate a telemetry event, this is useful when publishing a large amount of data to prevent a event flood at startup of OPC Publisher\n        \"SkipFirst\": false\n      }\n    ]\n  },\n\n  {\n    // example for an EnpointUrl is: opc.tcp://192.168.178.26:62541/Quickstarts/ReferenceServer\n    \"EndpointUrl\": \"opc.tcp://<your_opcua_server>:<your_opcua_server_port>/<your_opcua_server_path>\",\n    // allows to access the endpoint with SecurityPolicy.None when set to 'false' (no signing and encryption applied to the OPC UA communication), default is true\n    \"UseSecurity\": true,\n    \"OpcNodes\": [\n      {\n        // identifies the OPC node to publish using string based addressing e.g. for Siemens S7 \"TCP\".PLC_1.Motor_Simulation.M1.Motor_Drehzahl\n        \"Id\": \"ns=2;s=Siemens S7 \\\"TCP\\\".PLC_1.Motor_Simulation.M1.Motor_Drehzahl\",\n        // specifies the sampling interval OPC Publisher requests the server to sample the node value\n        \"OpcSamplingInterval\": 2000,\n        // specifies the publishing interval OPC Publisher requests the server to publish the node value, it will only be published if the value has changed\n        \"OpcPublishingInterval\": 5000,\n        // specifies that there should be a heartbeat generated by OPC Publisher, this means that after the given interval the last message will be sent again with an updated SourceTimestamp value.\n        \"HeartbeatInterval\": 3600,\n        // specifies that the first event will not generate a telemetry event, this is useful when publishing a large amount of data to prevent a event flood at startup of OPC Publisher\n        \"SkipFirst\": false\n      }\n    ]\n  },\n\n  //\n  // For completeness you will find the documentation of legacy formats below.\n  //\n  {\n    // example for an EnpointUrl is: opc.tcp://win10iot:51210/UA/SampleServer\n    \"EndpointUrl\": \"opc.tcp://<your_opcua_server>:<your_opcua_server_port>/<your_opcua_server_path>\",\n    // Allows to access the endpoint with SecurityPolicy.None when set to 'false' (no signing and encryption applied to the OPC UA communication), default is true\n    \"UseSecurity\": true,\n    \"OpcNodes\": [\n      // Publisher will request the server at EndpointUrl to sample the node with the OPC sampling interval specified on command line (or the default value: OPC publishing interval)\n      // and the subscription will publish the node value with the OPC publishing interval specified on command line (or the default value: server revised publishing interval).\n      {\n        // The identifier specifies the NamespaceUri and the node identifier in XML notation as specified in Part 6 of the OPC UA specification in the XML Mapping section.\n        \"ExpandedNodeId\": \"nsu=http://opcfoundation.org/UA/;i=2258\"\n      },\n      // Publisher will request the server at EndpointUrl to sample the node with the OPC sampling interval specified on command line (or the default value: OPC publishing interval)\n      // and the subscription will publish the node value with an OPC publishing interval of 4 seconds.\n      // Publisher will use for each dinstinct publishing interval (of nodes on the same EndpointUrl) a separate subscription. All nodes without a publishing interval setting,\n      // will be on the same subscription and the OPC UA stack will publish with the lowest sampling interval of a node.\n      {\n        \"ExpandedNodeId\": \"nsu=http://opcfoundation.org/UA/;i=2258\",\n        \"OpcPublishingInterval\": 4000\n      },\n      // Publisher will request the server at EndpointUrl to sample the node with the given sampling interval of 1 second\n      // and the subscription will publish the node value with the OPC publishing interval specified on command line (or the default value: server revised interval).\n      // If the OPC publishing interval is set to a lower value, Publisher will adjust the OPC publishing interval of the subscription to the OPC sampling interval value.\n      {\n        \"ExpandedNodeId\": \"nsu=http://opcfoundation.org/UA/;i=2258\",\n        // the OPC sampling interval to use for this node.\n        \"OpcSamplingInterval\": 1000\n      }\n    ]\n  },\n\n  // the format below (NodeId format) is only supported for backward compatibility. you need to ensure that the\n  // OPC UA server on the configured EndpointUrl has the namespaceindex you expect with your configuration.\n  // please use the ExpandedNodeId format as in the examples above instead.\n  {\n    \"EndpointUrl\": \"opc.tcp://<your_opcua_server>:<your_opcua_server_port>/<your_opcua_server_path>\",\n    \"NodeId\": {\n      \"Identifier\": \"ns=0;i=2258\"\n    }\n  }\n  // please consult the OPC UA specification for details on how OPC monitored node sampling interval and OPC subscription publishing interval settings are handled by the OPC UA stack.\n  // the publishing interval of the data to Azure IoTHub is controlled by the command line settings (or the default: publish data to IoTHub at least each 1 second).\n]"
  },
  {
    "path": "docs/opc-publisher/publishednodes_2.8.json",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n[\n\n  {\n    // Example for an EnpointUrl is: opc.tcp://192.168.178.26:62541/Quickstarts/ReferenceServer\n    \"EndpointUrl\": \"opc.tcp://<your_opcua_server>:<your_opcua_server_port>/<your_opcua_server_path>\",\n    // Allows to access the endpoint with SecurityPolicy.None when set to false (no signing and encryption applied to the OPC UA communication), default is false.\n    \"UseSecurity\": false,\n    \"OpcNodes\": [\n      {\n        // Identifies the OPC node to publish in either NodeId format (contains \"ns=\") or ExpandedNodeId format (contains \"nsu=\")\n        \"Id\": \"i=2258\",\n        // Specifies the sampling interval OPC Publisher requests the server to sample the node value.\n        // Value expressed in milliseconds.\n        \"OpcSamplingInterval\": 1000,\n        // Specifies the publishing interval OPC Publisher requests the server to publish the node value, it will only be published if the value has changed.\n        // Value expressed in milliseconds.\n        \"OpcPublishingInterval\": 5000,\n        // Specifies that there should be a heartbeat generated by OPC Publisher, this means that after the given interval the last message will be sent again with an updated SourceTimestamp value.\n        // Value expressed in seconds.\n        \"HeartbeatInterval\": 3600,\n        // specifies that the first event will not generate a telemetry event, this is useful when publishing a large amount of data to prevent a event flood at startup of OPC Publisher\n        \"SkipFirst\": false\n      }\n    ]\n  },\n\n  {\n    // Example for an EnpointUrl is: opc.tcp://192.168.178.26:62541/Quickstarts/ReferenceServer\n    \"EndpointUrl\": \"opc.tcp://<your_opcua_server>:<your_opcua_server_port>/<your_opcua_server_path>\",\n    // The data set writer group collecting datasets defined for a certain endpoint.\n    \"DataSetWriterGroup\": \"Asset0\",\n    // The unique identifier for a data set writer used to collect OPC UA nodes to be semantically grouped and published with the same publishing interval.\n    \"DataSetWriterId\": \"DataFlow0\",\n    // Controls whether to use a secure OPC UA mode to establish a session to the OPC UA server endpoint.\n    \"UseSecurity\": true,\n    // Enum to specify the session authentication. Options: \"Anonymous\", \"UsernamePassword\"\n    \"OpcAuthenticationMode\": \"UsernamePassword\",\n    // The username for the session authentication. Mandatory if OpcAuthentication mode is \"UsernamePassword\".\n    \"OpcAuthenticationUsername\": \"username\",\n    // The password for the session authentication. Mandatory if OpcAuthentication mode is \"UsernamePassword\".\n    \"OpcAuthenticationPassword\": \"password\",\n    // The DataSet collection grouping the nodes to be published for the specific DataSetWriter defined above.\n    \"OpcNodes\": [\n      {\n        // Identifies the OPC node to publish using string based addressing e.g. for Siemens S7 \"TCP\".PLC_1.Motor_Simulation.M1.Motor_Drehzahl\n        \"Id\": \"ns=2;s=Siemens S7 \\\"TCP\\\".PLC_1.Motor_Simulation.M1.Motor_Drehzahl\",\n        // Specifies the sampling interval OPC Publisher requests the server to sample the node value.\n        // Value expressed in Timespan string({d.hh:mm:dd.fff}).\n        \"OpcSamplingIntervalTimespan\": \"00:00:02\",\n        // Specifies the publishing interval OPC Publisher requests the server to publish the node value, it will only be published if the value has changed.\n        // Value expressed in Timespan string({d.hh:mm:dd.fff}).\n        \"OpcPublishingIntervalTimespan\": \"00:00:05\",\n        // Specifies that there should be a heartbeat generated by OPC Publisher, this means that after the given interval the last message will be sent again with an updated SourceTimestamp value.\n        // Value expressed in Timespan string({d.hh:mm:dd.fff}).\n        \"HeartbeatIntervalTimespan\": \"00:01:00\",\n        // The desired QueueSize for the monitored item to be published.\n        \"QueueSize\": 10,\n        // Report a notification on status, value or timestamp node change. It can take the values\n        // \"Status\", \"StatusValue\" and \"StatusValueTimestamp\". If null, the OPC UA Specification defaults to \"StatusValue\".\n        \"DataChangeTrigger\": \"StatusValueTimestamp\"\n      }\n    ]\n  },\n\n  {\n    // example for an EnpointUrl is: opc.tcp://192.168.178.26:62541/Quickstarts/ReferenceServer\n    \"EndpointUrl\": \"opc.tcp://<your_opcua_server>:<your_opcua_server_port>/<your_opcua_server_path>\",\n    // The data set writer group collecting datasets defined for a certain endpoint.\n    \"DataSetWriterGroup\": \"Asset0\",\n    // The unique identifier for a data set writer used to collect OPC UA nodes to be semantically grouped and published with the same publishing interval.\n    \"DataSetWriterId\": \"DataFlow1\",\n    // Controls whether to use a secure OPC UA mode to establish a session to the OPC UA server endpoint.\n    \"UseSecurity\": false,\n    // Enum to specify the session authentication. Options: \"Anonymous\", \"UsernamePassword\"\n    \"OpcAuthenticationMode\": \"Anonymous\",\n\n    // The publishing interval used for a grouped set of nodes under a certain DataSetWriter.\n    // Value expressed as a Timespan string ({d.hh:mm:dd.fff}).\n    \"DataSetPublishingIntervalTimespan\": \"00:00:05\",\n\n    // The DataSet collection grouping the nodes to be published for the specific DataSetWriter defined above.\n    \"OpcNodes\": [\n      {\n        // Identifies the OPC node to publish in either NodeId format (contains \"ns=\") or ExpandedNodeId format (contains \"nsu=\")\n        \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n        // A user defined tag to be added to the telemetry message when publisher runs in Samples message mode.\n        \"DisplayName\":\"StepUp\"\n      }\n    ]\n  },\n\n  {\n    // Example for an EnpointUrl is: opc.tcp://win10iot:51210/UA/SampleServer\n    \"EndpointUrl\": \"opc.tcp://<your_opcua_server>:<your_opcua_server_port>/<your_opcua_server_path>\",\n    // Allows to access the endpoint with SecurityPolicy.None when set to 'false' (no signing and encryption applied to the OPC UA communication), default is false.\n    \"UseSecurity\": true,\n    \"OpcNodes\": [\n      // Publisher will request the server at EndpointUrl to sample the node with the OPC sampling interval specified on command line (or the default value: OPC publishing interval)\n      // and the subscription will publish the node value with the OPC publishing interval specified on command line (or the default value: server revised publishing interval).\n      {\n        // The identifier specifies the NamespaceUri and the node identifier in XML notation as specified in Part 6 of the OPC UA specification in the XML Mapping section.\n        \"ExpandedNodeId\": \"nsu=http://opcfoundation.org/UA/;i=2258\"\n      },\n      // Publisher will request the server at EndpointUrl to sample the node with the OPC sampling interval specified on command line (or the default value: OPC publishing interval)\n      // and the subscription will publish the node value with an OPC publishing interval of 4 seconds.\n      // Publisher will use for each dinstinct publishing interval (of nodes on the same EndpointUrl) a separate subscription. All nodes without a publishing interval setting,\n      // will be on the same subscription and the OPC UA stack will publish with the lowest sampling interval of a node.\n      {\n        \"ExpandedNodeId\": \"nsu=http://opcfoundation.org/UA/;i=2258\",\n        \"OpcPublishingInterval\": 4000\n      },\n      // Publisher will request the server at EndpointUrl to sample the node with the given sampling interval of 1 second\n      // and the subscription will publish the node value with the OPC publishing interval specified on command line (or the default value: server revised interval).\n      // If the OPC publishing interval is set to a lower value, Publisher will adjust the OPC publishing interval of the subscription to the OPC sampling interval value.\n      {\n        \"ExpandedNodeId\": \"nsu=http://opcfoundation.org/UA/;i=2258\",\n        // the OPC sampling interval to use for this node.\n        \"OpcSamplingInterval\": 1000\n      }\n    ]\n  }\n]"
  },
  {
    "path": "docs/opc-publisher/readme.md",
    "content": "# Microsoft OPC Publisher <!-- omit in toc -->\n\n[Home](../readme.md)\n\nOPC Publisher is a module that runs on [Azure IoT Edge](https://azure.microsoft.com/services/iot-edge/) and bridges the gap between industrial assets and the Microsoft Azure cloud. It connects to OPC UA server systems and publishes telemetry data to [Azure IoT Hub](https://azure.microsoft.com/services/iot-hub/) in various formats, including IEC62541 OPC UA PubSub standard format (*not supported in versions < 2.7.x*).\n\n> This documentation applies to version 2.9 or higher.\n\nHere you find information about\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Overview](#overview)\n- [Getting Started](#getting-started)\n  - [Install IoT Edge](#install-iot-edge)\n  - [Deploy OPC Publisher from Azure Marketplace](#deploy-opc-publisher-from-azure-marketplace)\n  - [Specifying Container Create Options in the Azure portal](#specifying-container-create-options-in-the-azure-portal)\n  - [Deploy OPC Publisher using Azure CLI](#deploy-opc-publisher-using-azure-cli)\n  - [Deploy OPC Publisher using the Azure Portal](#deploy-opc-publisher-using-the-azure-portal)\n- [How OPC Publisher works](#how-opc-publisher-works)\n- [Configuring OPC Publisher](#configuring-opc-publisher)\n  - [Configuration via Configuration File](#configuration-via-configuration-file)\n  - [Configuration Schema](#configuration-schema)\n  - [Writer group configuration](#writer-group-configuration)\n  - [Configuration via init file](#configuration-via-init-file)\n  - [Sampling and Publishing Interval configuration](#sampling-and-publishing-interval-configuration)\n    - [Key frames, delta frames and extension fields](#key-frames-delta-frames-and-extension-fields)\n    - [Status codes](#status-codes)\n    - [Heartbeat](#heartbeat)\n      - [Timestamps](#timestamps)\n      - [Legacy behavior](#legacy-behavior)\n    - [Cyclic reading (Client side sampling)](#cyclic-reading-client-side-sampling)\n  - [Overcoming server limits and interop limitations](#overcoming-server-limits-and-interop-limitations)\n  - [Configuring Security](#configuring-security)\n  - [Using OPC UA reverse connect](#using-opc-ua-reverse-connect)\n  - [Configuring event subscriptions](#configuring-event-subscriptions)\n    - [Simple event filter](#simple-event-filter)\n    - [Advanced event filter configuration](#advanced-event-filter-configuration)\n    - [Condition handling options](#condition-handling-options)\n- [Publish to a Unified Namespace](#publish-to-a-unified-namespace)\n- [OPC Publisher Telemetry Formats](#opc-publisher-telemetry-formats)\n- [Programming against OPC Publisher using the OPC Publisher API](#programming-against-opc-publisher-using-the-opc-publisher-api)\n  - [Using IoT Edge Simulation environment](#using-iot-edge-simulation-environment)\n    - [Calling the Direct Methods API](#calling-the-direct-methods-api)\n    - [Calling the API over HTTP](#calling-the-api-over-http)\n  - [JSON encoding](#json-encoding)\n    - [Node Ids](#node-ids)\n    - [Browse paths](#browse-paths)\n  - [Discovering OPC UA servers with OPC Publisher](#discovering-opc-ua-servers-with-opc-publisher)\n    - [Discovery Configuration](#discovery-configuration)\n    - [One-time discovery](#one-time-discovery)\n    - [Discovery Progress](#discovery-progress)\n  - [OPC UA command and control (OPC Twin)](#opc-ua-command-and-control-opc-twin)\n- [OPC UA Certificates](#opc-ua-certificates)\n  - [PKI management](#pki-management)\n  - [Auto Accept server certificates](#auto-accept-server-certificates)\n- [OPC UA stack](#opc-ua-stack)\n- [Performance and Memory Tuning OPC Publisher](#performance-and-memory-tuning-opc-publisher)\n\n## Overview\n\nMicrosoft OPC Publisher runs on Azure [IoT Edge](https://docs.microsoft.com/azure/iot-edge/module-edgeagent-edgehub) and connects OPC UA-enabled servers to Azure. It can be [configured](#configuring-opc-publisher) using Azure IoT Hub, through MQTT/HTTPS locally (Preview) or via configuration file.\n\nOPC Publisher is a [feature rich OPC UA client/server to OPC UA Pub/Sub translator](./features.md). Per configuration it sets up OPC UA subscriptions to monitor data (OPC UA nodes) using an integrated [OPC UA stack](#opc-ua-stack). When a data value change or event of an OPC UA node is reported, it transcodes the OPC UA notification using the configured encoding and publishes it to IoT Hub or MQTT broker of choice.\n\nWith OPC Publisher you can also browse a server's data model, read and write ad-hoc data, or call methods on your assets. This [capability](#opc-ua-command-and-control-opc-twin) can be accessed programmatically from the cloud or through other applications running alongside. OPC Publisher also supports [discovering](#discovering-opc-ua-servers-with-opc-publisher) OPC UA-enabled assets on the shop floor. When it finds an asset either through a discovery url or (optionally) active network scanning, it queries the assets endpoints (including its security configuration) and reports the results to IoT Hub or returns them from the respective [API call as response](api.md#find-server-with-endpoint).\n\nAzure IoT Edge gateways support nested ISA 95 (Purdue) topologies. It needs to be placed where it has access to all industrial assets that are to be connected, and a IoT Edge device needs to be placed at every layer leading to the internet. Using OPC UA [reverse connect](#using-opc-ua-reverse-connect) is another option to bridge network layer.\n\n> Note that this might require configuring a specific route from IoT Edge to the public Internet through several on-premise routers. In terms of firewall configuration, IoT Edge just needs a single outbound port to operate, i.e., port 443.\n\n## Getting Started\n\n### Install IoT Edge\n\nThe industrial assets (machines and systems) are connected to Azure through modules running on an [Azure IoT Edge](https://azure.microsoft.com/services/iot-edge/) industrial gateway.\n\n> While OPC Publisher can run outside of Azure IoT Edge, the only Microsoft supported hosting environment is Azure IoT Edge. If you want to use OPC Publisher outside of Azure IoT Edge, support is through GitHub issues and community only.\n\nYou can purchase industrial gateways compatible with IoT Edge. Please see our [Azure Device Catalog](https://catalog.azureiotsolutions.com/alldevices?filters={\"3\":[\"2\",\"9\"],\"18\":[\"1\"]}) for a selection of industrial-grade gateways. Alternatively, you can setup a local VM.\n\nYou can also manually [create an IoT Edge instance for an IoT Hub](https://docs.microsoft.com/azure/iot-edge/how-to-register-device) and install the IoT Edge runtime following the [IoT Edge setup documentation](https://docs.microsoft.com/azure/iot-edge/). The IoT Edge Runtime can be installed on [Linux](https://docs.microsoft.com/azure/iot-edge/how-to-install-iot-edge-linux) or [Windows](https://docs.microsoft.com/azure/iot-edge/iot-edge-for-linux-on-windows).\n\nYou can find out more about Azure IoT Edge here:\n\n- [Deploy and monitor Edge modules at scale](https://docs.microsoft.com/azure/iot-edge/how-to-deploy-monitor)\n- [Learn more about Azure IoT Edge for Visual Studio Code](https://github.com/microsoft/vscode-azure-iot-edge)\n- [Run IoT Edge on Kubernetes](https://github.com/Azure-Samples/IoT-Edge-K8s-KubeVirt-Deployment/)\n\n### Deploy OPC Publisher from Azure Marketplace\n\nUse the Microsoft supported docker containers for OPC Publisher available in the Microsoft Container Registry rather than building from sources:\n\n``` bash\ndocker pull mcr.microsoft.com/iotedge/opc-publisher:latest\n```\n\n> We recommend to use a floating version tag (\"2.9\") when deploying the OPC Publisher container images instead of \"latest\". You can also use a fixed tag such as \"2.9.11\" but this will require you to manually update your edge deployment to keep up with the latest secure and supported version.\n\nThe easiest way to deploy OPC Publisher is through the [Azure Marketplace](https://azuremarketplace.microsoft.com/marketplace/apps/microsoft_iot.iotedge-opc-publisher).\n\nSelect the \"Get It Now\" button to log into the [Azure portal](https://portal.azure.com) and deploy OPC Publisher. The following steps are required:\n\n1. Pick the Azure subscription to use. If no Azure subscription is available, one must be created.\n2. Pick the IoT Hub the OPC Publisher is supposed to send data to. If no IoT Hub is available, one must be created.\n3. Pick the IoT Edge device OPC Publisher is supposed to run on. If no IoT Edge device exists, one must be created).\n4. Select \"Create\". The \"Set modules on Device\" page for the selected IoT Edge device opens.\n5. Select on \"OPCPublisher\" to open the OPC Publisher's \"Update IoT Edge Module\" page and then select \"Container Create Options\".\n6. Validate \"container create options\" based on your usage of OPC Publisher. For more information, see next section.\n\n### Specifying Container Create Options in the Azure portal\n\nContainer create options are used to specify the container and configuration [command line arguments](./commandline.md) of OPC Publisher. The docker create options can be specified in the \"Update IoT Edge Module\" page of OPC Publisher and must be in JSON format. Specifically the OPC Publisher command line arguments can be specified via the \"Cmd\" key. Here an example for a configuration on a Linux host system:\n\n``` json\n{\n    \"Cmd\": [\n        \"-c\", // 2.9+ only\n        \"--cl=5\", // 2.9+ only\n        \"--PkiRootPath=/mount/pki\",\n        \"--pf=/mount/published_nodes.json\",\n        \"--cf\", // 2.9+ only\n        \"--mm=PubSub\",\n        \"--me=Json\",\n        \"--fd=false\",\n        \"--bs=100\",\n        \"--bi=1000\",\n        \"--aa\"\n    ],\n    \"HostConfig\": {\n        \"Binds\": [\n            \"/opcpublisher:/mount\"\n        ],\n        \"CapDrop\": [\n            \"CHOWN\",\n            \"SETUID\"\n        ]\n    }\n}\n```\n\nTo not loose the OPC Publisher configuration across restarts all configuration files should be persisted. This requires a bind mount. A bind mound makes folders in the IoT Edge host file system available to the OPC Publisher. In above example the **Mounts** section maps the `/mount` folder inside the container to the folder `/opcpublisher` on the host file system. Without it all configuration changes will be applied to the container file system which lives in memory and thus will be lost when the OPC Publisher module is restarted. With above options specified however, OPC Publisher will use the configuration file `published_nodes.json` inside the `/mount` folder and thus on the `/opcpublisher` folder on IoT Edge host. The `CertificateStores` directory (used for OPC UA certificates) will also be created in the `pki` directory of the `/mount` folder.\n\n> IMPORTANT: The `/opcpublisher` directory must be present on the host file system, otherwise OPC Publisher will fail to start. Also, the folder contains security sensitive information. Any username and password configured inside the configuration are stored in plain text. It must be ensured that the configuration file is protected by the file system access control of the host file system. The same must be ensured for the file system based certificate store, since it contains the certificate and private key of OPC Publisher.\n\nThe `CapDrop` option drops the CHOWN (user can’t makes arbitrary changes to file UIDs and GIDs) and SETUID (user can’t makes arbitrary manipulations of process UIDs) capabilities for security reason.\n\nA connection to an OPC UA server using its hostname without a DNS server configured on the network can be achieved by adding an `ExtraHosts` entry to the `HostConfig` section:\n\n``` json\n\"HostConfig\": {\n    \"ExtraHosts\": [\n        \"opctestsvr:192.168.178.26\"\n    ]\n}\n```\n\n### Deploy OPC Publisher using Azure CLI\n\n1. Obtain the IoT Hub name and device id of the [installed IoT Edge](#install-iot-edge) Gateway.\n\n1. Install the [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli). You must have at least `v2.0.24`, which you can verify with `az --version`.\n\n1. Add the [IoT Edge Extension](https://github.com/Azure/azure-iot-cli-extension/) with the following commands:\n\n    ```bash\n    az extension add --name azure-cli-iot-ext\n    ```\n\nTo deploy all required modules using Az...\n\n1. Save the following content into a `deployment.json` file:\n\n    ```json\n    {\n      \"modulesContent\": {\n        \"$edgeAgent\": {\n          \"properties.desired\": {\n            \"schemaVersion\": \"1.1\",\n            \"runtime\": {\n              \"type\": \"docker\",\n              \"settings\": {\n                \"minDockerVersion\": \"v1.25\",\n                \"loggingOptions\": \"\",\n                \"registryCredentials\": {}\n              }\n            },\n            \"systemModules\": {\n              \"edgeAgent\": {\n                \"type\": \"docker\",\n                \"settings\": {\n                  \"image\": \"mcr.microsoft.com/azureiotedge-agent:1.4\",\n                  \"createOptions\": \"\"\n                }\n              },\n              \"edgeHub\": {\n                \"type\": \"docker\",\n                \"status\": \"running\",\n                \"restartPolicy\": \"always\",\n                \"settings\": {\n                  \"image\": \"mcr.microsoft.com/azureiotedge-hub:1.4\",\n                  \"createOptions\": \"{\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"5671/tcp\\\":[{\\\"HostPort\\\":\\\"5671\\\"}], \\\"8883/tcp\\\":[{\\\"HostPort\\\":\\\"8883\\\"}],\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"443\\\"}]}}}\"\n                },\n                \"env\": {\n                  \"SslProtocols\": {\n                    \"value\": \"tls1.2\"\n                  }\n                }\n              }\n            },\n            \"modules\": {\n              \"publisher\": {\n                \"version\": \"1.0\",\n                \"type\": \"docker\",\n                \"status\": \"running\",\n                \"restartPolicy\": \"always\",\n                \"settings\": {\n                  \"image\": \"mcr.microsoft.com/iotedge/opc-publisher:2.9\",\n                  \"createOptions\": \"{\\\"HostConfig\\\":{\\\"CapDrop\\\":[\\\"CHOWN\\\",\\\"SETUID\\\"]}}\"\n                }\n              }\n            }\n          }\n        },\n        \"$edgeHub\": {\n          \"properties.desired\": {\n            \"schemaVersion\": \"1.0\",\n            \"routes\": {\n              \"publisherToUpstream\": \"FROM /messages/modules/publisher/* INTO $upstream\",\n              \"leafToUpstream\": \"FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO $upstream\"\n            },\n            \"storeAndForwardConfiguration\": {\n              \"timeToLiveSecs\": 7200\n            }\n          }\n        }\n      }\n    }\n    ```\n\n1. Use the following command to apply the configuration to an IoT Edge device:\n\n   ```bash\n   az iot edge set-modules --device-id [device id] --hub-name [hub name] --content ./deployment.json\n   ```\n\n   The `device id` parameter is case-sensitive. The content parameter points to the deployment manifest file that you saved.\n    ![az iot edge set-modules output](https://docs.microsoft.com/azure/iot-edge/media/how-to-deploy-cli/set-modules.png)\n\n1. Once you've deployed modules to your device, you can view all of them with the following command:\n\n   ```bash\n   az iot hub module-identity list --device-id [device id] --hub-name [hub name]\n   ```\n\n   The device id parameter is case-sensitive. ![az iot hub module-identity list output](https://docs.microsoft.com/azure/iot-edge/media/how-to-deploy-cli/list-modules.png)\n\nMore information about az and IoT Edge can be found [here](https://docs.microsoft.com/en-us/azure/iot-edge/how-to-deploy-monitor-cli).\n\n### Deploy OPC Publisher using the Azure Portal\n\nTo deploy OPC Puublisher to the IoT Edge Gateway using the Azure Portal...\n\n1. Sign in to the [Azure portal](https://portal.azure.com/) and navigate to the IoT Hub deployed earlier.\n\n1. Select **IoT Edge** from the left-hand menu.\n\n1. Click on the ID of the target device from the list of devices.\n\n1. Select **Set Modules**.\n\n1. In the **Deployment modules** section of the page, select **Add** and **IoT Edge Module.**\n\n1. In the **IoT Edge Custom Module** dialog use `publisher` as name for the module, then specify the container *image URI* as\n\n   ```bash\n   mcr.microsoft.com/iotedge/opc-publisher:2.9\n   ```\n\n   On Linux use the following *create options* if you intend to use the network scanning capabilities of the module:\n\n   ```json\n   {\"NetworkingConfig\":{\"EndpointsConfig\":{\"host\":{}}},\"HostConfig\":{\"NetworkMode\":\"host\",\"CapAdd\":[\"NET_ADMIN\"],\n   \"CapDrop\":[\"CHOWN\", \"SETUID\"]}}\n   ```\n\n   Fill out the optional fields if necessary. For more information about container create options, restart policy, and desired status see [EdgeAgent desired properties](https://docs.microsoft.com/azure/iot-edge/module-edgeagent-edgehub#edgeagent-desired-properties). For more information about the module twin see [Define or update desired properties](https://docs.microsoft.com/azure/iot-edge/module-composition#define-or-update-desired-properties).\n\n1. Select **Save** and then **Next** to continue to the routes section.\n\n1. In the routes tab, paste the following\n\n    ```json\n    {\n      \"routes\": {\n        \"publisherToUpstream\": \"FROM /messages/modules/publisher/* INTO $upstream\",\n        \"leafToUpstream\": \"FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO $upstream\"\n      }\n    }\n    ```\n\n    and select **Next**\n\n1. Review your deployment information and manifest. It should look like the deployment manifest found in the [previous section](#deploy-opc-publisher-using-azure-cli).  Select **Submit**.\n\n1. Once you've deployed modules to your device, you can view all of them in the **Device details** page of the portal. This page displays the name of each deployed module, as well as useful information like the deployment status and exit code.\n\n1. Add your own or other modules from the Azure Marketplace using the steps above.\n\nFor more in depth information check out [the Azure IoT Edge Portal documentation](https://docs.microsoft.com/en-us/azure/iot-edge/how-to-deploy-modules-portal).\n\n## How OPC Publisher works\n\nThe following diagram courtesy of the OPC Foundation's [Part 14 of the OPC UA specification](https://reference.opcfoundation.org/Core/Part14/v105/docs/5) illustrates the inner workings of the OPC Publisher process:\n\n![Publisher](https://reference.opcfoundation.org/api/image/get/413/image006.png)\n\nPublishing OPC UA telemetry from an OPC UA server works as follows:\n\n1. An OPC UA server exposes variable nodes (also sometimes called \"tags\") which make sensor readings accessible, or nodes that allow a client to subscribe to events.\n\n1. The OPC Publisher can be configured to connect to one or more selected OPC UA server endpoints. Based on the configuration the OPC Publisher OPC UA client creates subscriptions requesting to be notified when the value of the specified nodes change or an event occurs.\n\n1. The publisher groups nodes in the configuration into groups of `Dataset Writers` called [`Writer Groups`](https://reference.opcfoundation.org/Core/Part14/v105/docs/5) which are akin to OPC UA subscriptions. These subscriptions refer to node ids (in OPC UA also called monitored items). Nodes can be configured with `SamplingInterval`, `PublishingInterval`, `DataSetWriterId`, and `DataSetWriterGroup`.\n\n   - `DataSetWriterId`: A logical name of a subscription to an endpoint on a OPC UA server. A writer can only have 1 publishing interval and in case of event subscription, 1 event node. Should multiple be specified then the writer is broken into smaller writers. A data set writer writes data sets, which are a set of OPC UA data values or events inside a OPC UA PubSub network message.\n\n   - `DataSetWriterGroup`: A logical group of data set writers. These define the content of a OPC UA PubSub network message.\n\n   - `SamplingInterval`: The cyclic time in milliseconds, in which a node in a writer is sampled for updates. This is not applicable for events.\n\n   - `PublishingInterval`: The cyclic time in milliseconds, in which changes to a set of nodes (notifications) are sent to the subscriber (OPC Publisher). A small interval minimizes latency at the cost of network traffic and server load. For low latency it should be set to the smallest sampling interval and appropriate queue size values should be configured to avoid message loss.\n\n1. Data change notifications or event notifications are published by the OPC UA server to OPC Publisher. OPC UA only sends value changes, that means, if a value has not changed in the publishing cycle it is not send. If you need all values in a message you can use the `DataSetKeyFrameCount` or `HeartbeatInterval` options or read the values using `UseCyclicRead` [options](#configuration-schema) instead of subscriptions. OPC Publisher also emits meta data messages for all configured data sets inside a data set writer group unless disabled or not supported by the chosen [message format](./messageformats.md).\n\n1. The OPC Publisher can be configured to send notifications as soon as they arrive or batch them before sending which saves bandwidth and increases throughput. Sending a batch is triggered by exceeding the threshold of a specified number of messages or by exceeding a specified time interval.\n\n1. OPC Publisher groups and encodes the telemetry events using the specified messaging mode and message encoding format. More information can be found [here](./messageformats.md).\n\n1. The encoded telemetry events are sent over the configured [transport](./transports.md) as OPC UA network messages. The default transport is Azure IoT which has a message limit of 256kB. The publisher tries to split messages to avoid loosing data, but has a runtime cost. In case of PubSub encoding when strict mode is used (`--strict`) or when `--dm=false` is set, OPC Publisher also emits Metadata messages which can be used to learn more about the message content and support decoding in some cases.\n\n1. Azure IoT Hub stores messages using a configured retention time (default: 1 day, max: 7 days, dependent on the size of the ingested messages as well, see [here](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-messages-read-builtin) for more details). Messages can be consumed by applications or other services from IoT Hub.\n\n## Configuring OPC Publisher\n\nOPC Publisher has several interfaces that can be used to configure it.\n\n- [Configuration via configuration file](#configuration-via-configuration-file)\n- [Command Line options configuration](./commandline.md)\n- [Configuration via API](./directmethods.md)\n- [Configuration via init file](#configuration-via-init-file)\n- [How to migrate from previous versions of OPC Publisher](./migrationpath.md)\n\n### Configuration via Configuration File\n\nThe simplest way to configure OPC Publisher is via a file. A basic configuration file looks like this:\n\n``` json\n[\n  {\n    \"EndpointUrl\": \"opc.tcp://testserver:62541/Quickstarts/ReferenceServer\",\n    \"UseSecurity\": true,\n    \"OpcNodes\": [\n      {\n        \"Id\": \"i=2258\",\n        \"OpcSamplingInterval\": 2000,\n        \"OpcPublishingInterval\": 5000,\n        \"DisplayName\": \"Current time\"\n      }\n    ]\n  }\n]\n```\n\nThis configuration can be placed in a JSON file, typically named publishednodes.json, and provided to OPC Publisher using the [command line](./commandline.md) argument `-f, --pf, --publishfile`, e.g. `--pf=/app/publishednodes.json`.\n\n> Environment variables can also be used to configure OPC Publisher. This method is particularly useful when deploying at scale or in environments where you want to externalize configuration from the container image. An example is `PublishedNodesFile`.\n\nExample configuration files are [here](publishednodes_2.5.json?raw=1) and [here](publishednodes_2.8.json?raw=1).\n\n### Configuration Schema\n\nThe configuration schema is used with the file based configuration, but also with the [Api based configuration](./directmethods.md).\nThe configuration consists a JSON array of [entries](./definitions.md#publishednodesentrymodel) containing arrays of [nodes](./definitions.md#opcnodemodel):\n\n```json\n{\n  \"EndpointUrl\": \"string\",\n  \"UseSecurity\": \"boolean\",\n  \"DataSetWriterGroup\": \"string\",\n  \"DataSetWriterId\": \"string\",\n  \"WriterGroupTransport\": \"string\",\n  \"WriterGroupQueueName\":_ \"string\",\n  \"WriterGroupQualityOfService\": \"string\",\n  \"WriterGroupMessageRetention\": \"boolean\",\n  \"WriterGroupMessageTtlTimespan\": \"string\",\n  \"WriterGroupPartitions\": \"integer\",\n  \"EndpointSecurityMode\": \"string\",\n  \"EndpointSecurityPolicy\": \"string\",\n  \"OpcAuthenticationMode\": \"string\",\n  \"OpcAuthenticationUsername\": \"string\",\n  \"OpcAuthenticationPassword\": \"string\",\n  \"DataSetClassId\": \"guid\",\n  \"DataSetName\": \"string\",\n  \"DataSetDescription\": \"string\",\n  \"DataSetPublishingInterval\": \"integer\",\n  \"DataSetPublishingIntervalTimespan\": \"string\",\n  \"DataSetSamplingInterval\": \"integer\",\n  \"DataSetSamplingIntervalTimespan\": \"string\",\n  \"DataSetKeyFrameCount\": \"integer\",\n  \"DataSetExtensionFields\": \"object\",\n  \"DataSetFetchDisplayNames\": \"boolean\",\n  \"DataSetWriterWatchdogBehavior\": \"string\",\n  \"OpcNodeWatchdogTimespan\": \"string\",\n  \"OpcNodeWatchdogCondition\": \"string\",\n  \"UseReverseConnect\": \"boolean\",\n  \"DisableSubscriptionTransfer\": \"boolean\",\n  \"RepublishAfterTransfer\": \"boolean\",\n  \"QueueName\": \"string\",\n  \"MetaDataQueueName\": \"string\",\n  \"MetaDataUpdateTime\": \"integer\",\n  \"MetaDataUpdateTimeTimespan\": \"string\",\n  \"SendKeepAliveDataSetMessages\": \"boolean\",\n  \"QualityOfService\": \"string\",\n  \"MessageRetention\": \"boolean\",\n  \"MessageTtlTimespan\": \"string\",\n  \"MessageEncoding\": \"string\",\n  \"MessagingMode\": \"string\",\n  \"BatchSize\": \"integer\",\n  \"BatchTriggerInterval\": \"integer\",\n  \"BatchTriggerIntervalTimespan\": \"string\",\n  \"MaxKeepAliveCount\": \"integer\",\n  \"Priority\": \"integer\",\n  \"OpcNodes\":\n  [\n    {\n      \"Id\": \"string\",\n      \"ExpandedNodeId\": \"string\",\n      \"BrowsePath\": [ \"string\" ],\n      \"AttributeId\": \"string\",\n      \"IndexRange\": \"string\",\n      \"UseCyclicRead\": \"boolean\",\n      \"RegisterNode\": \"boolean\",\n      \"FetchDisplayName\": \"boolean\",\n      \"OpcSamplingInterval\": \"integer\",\n      \"OpcSamplingIntervalTimespan\": \"string\",\n      \"OpcPublishingInterval\": \"integer\",\n      \"OpcPublishingIntervalTimespan\": \"string\",\n      \"DataSetFieldId \": \"string\",\n      \"DataSetClassFieldId \": \"Guid\",\n      \"DisplayName\": \"string\",\n      \"SkipFirst\": \"boolean\",\n      \"DiscardNew\": \"boolean\",\n      \"HeartbeatInterval\": \"integer\",\n      \"HeartbeatIntervalTimespan\": \"string\",\n      \"QueueSize\": \"integer\",\n      \"DataChangeTrigger\": \"string\",\n      \"DeadbandType\": \"string\",\n      \"DeadbandValue\": \"decimal\",\n      \"ModelChangeHandling\": {\n        \"RebrowseIntervalTimespan\": \"string\"\n      },\n      \"ConditionHandling\": {\n        \"UpdateInterval\": \"integer\",\n        \"SnapshotInterval\": \"integer\"\n      },\n      \"EventFilter\": {\n        (*)\n      }\n    }\n  ],\n  \"Version\": \"integer\",\n  \"LastChangeTimespan\": \"string\",\n}\n```\n\n(*) To subscribe to OPC UA Alarms and Events you must configure the `EventFilter` attribute in `OpcNodes` as [described here](./readme.md#configuring-event-subscriptions).\n\nEach [published nodes entry model](./definitions.md#publishednodesentrymodel) has the following attributes:\n\n| Attribute | Mandatory | Type | Default | Description |\n| ----------| --------- | -----| ------- | ----------- |\n| `Version` | No | Integer | `null` | A monotonically increasing number identifying the change version.<br>NOTE: At this point the version number is informational only, but should be provided in API requests if available. It is not used inside file based configuration. |\n| `LastChangeTimespan` | No | String | `null` | The time the Publisher configuration was last updated.<br>Read only and informational only. |\n| `EndpointUrl` | Yes | String | N/A | The OPC UA server endpoint URL |\n| `UseReverseConnect` | No | Boolean | `false` | Controls whether to use OPC UA reverse connect to connect to the OPC UA server.<br>A publisher wide default value can be set using the [command line](./commandline.md) |\n| `DisableSubscriptionTransfer` | No | Boolean | `false` | This setting allows you to disable subscription transfer on reconnect to fix interoperability issues with servers that do not support it.<br>A publisher wide default value can be set using the [command line](./commandline.md) |\n| `UseSecurity` | No | Boolean | `false` | Controls whether to use a secure OPC UA mode to establish a session to the OPC UA server endpoint.<br>`true` corresponds to `EndpointSecurityMode` = `SignAndEncrypt`, `false` to `EndpointSecurityMode` = `None` |\n| `EndpointSecurityMode` | No | Enum | `null` | Enum to specify a requested security mode of the chosen session endpoint. Overrides `UseSecurity` value.<br>Options: `Sign`, `SignAndEncrypt`, `None`, and `Best` (security mode possible which might include `None`) |\n| `EndpointSecurityPolicy` | No | String | `null` | String to specify a security policy the chosen endpoint must meet. Refines the endpoint chosen through `EndpointSecurityMode` and overrides `UseSecurity` value. |\n| `OpcAuthenticationMode` | No | Enum | `Anonymous` | Enum to specify the session authentication. <br>Options: `Anonymous`, `UsernamePassword`, `Certificate` |\n| `OpcAuthenticationUsername` | No | String | `null` | The username for the session authentication if OpcAuthentication mode is `UsernamePassword`. Otherwise the subject name of a x509 certificate in the user certificate store. Ignored if the mode is `Anonymous`. |\n| `OpcAuthenticationPassword` | No | String | `null` | The password for the session authentication if OpcAuthentication mode is `UsernamePassword`. Otherwise the password to access the private key of the referenced certificate in the user certificate store. Ignored if the mode is `Anonymous`.|\n| `DataSetWriterGroup` | No | String | `\"<<UnknownWriterGroup>>\"` | The data set writer group collecting datasets defined for a certain <br>endpoint uniquely identified by the above attributes. <br>This attribute is used to identify the session opened into the <br>server. The default value consists of the EndpointUrl string, <br>followed by a deterministic hash composed of the <br>EndpointUrl, UseSecurity, OpcAuthenticationMode, UserName and Password attributes. |\n| `DataSetWriterId` | No | String | `\"<<UnknownDataSet>>\"` | The unique identifier for a data set writer used to collect <br>OPC UA nodes to be semantically grouped and published with <br>the same publishing interval. <br>When not specified a string representing the common <br>publishing interval of the nodes in the data set collection. <br>This attribute uniquely identifies a data set <br>within a DataSetWriterGroup. The uniqueness is determined <br>using the provided DataSetWriterId and the publishing <br>interval of the grouped OpcNodes.  An individual <br>subscription is created for each DataSetWriterId. |\n| `DataSetName` | No | String | `null` | The optional name of the data set as it will appear in the dataset metadata. |\n| `DataSetDescription` | No | String | `null` | The optional description for the data set as it will appear in the dataset metadata. |\n| `DataSetClassId` | No | Guid | `Guid.Empty` | The optional dataset class id as it shall appear in dataset messages and dataset metadata. |\n| `DataSetExtensionFields` | No | Object | `null` | An optional JSON object with key value pairs where the value is a Variant in JSON encoding. This can be used to [contextualize data set messages](#key-frames-delta-frames-and-extension-fields) produced by the writer.<br>Each item is added to key frame and meta data messages in the same data set, or in the extension section of samples messages (in samples messages the value is stringified). |\n| `DataSetPublishingInterval` | No | Integer | `null` | The publishing interval used for a grouped set of nodes under a certain DataSetWriter. <br>Value expressed in milliseconds. <br>Ignored when `DataSetPublishingIntervalTimespan` is present. <br> *Note*: When a specific node underneath DataSetWriter defines `OpcPublishingInterval` (or Timespan), <br>its value will overwrite publishing interval and potentially split the data set writer into more than one subscription. |\n| `DataSetPublishingIntervalTimespan` | No | String | `null` | The publishing interval used for a grouped set of nodes under a certain DataSetWriter. <br>Value expressed as a Timespan string ({d.hh:mm:dd.fff}). <br>When both Intervals are specified, the Timespan will win and be used for the configuration. <br> *Note*: When a specific node underneath DataSetWriter defines `OpcPublishingInterval` (or Timespan), <br>its value will overwrite publishing interval and potentially split the data set writer into more than one subscription. |\n| `DataSetSamplingInterval` | No | Integer | `null` | A default sampling interval for all monitored items that are sampled in the data set. <br>Value expressed in milliseconds. <br>This value will be overwritten if a sampling interval is defined for a node. <br>The value is used as defined in the OPC UA specification. <br>Ignored when `DataSetSamplingIntervalTimespan` is present.<br>Defaults to the value configured via `--oi` command line option. |\n| `DataSetSamplingIntervalTimespan` | No | String | `null` | The default sampling interval for all monitored items that are sampled in the data set. <br>Value expressed as Timespan string ({d.hh:mm:dd.fff}). <br>This value is used if the sampling interval is not configured on an individual node. <br>The value is used as defined in the OPC UA specification. |\n| `DataSetKeyFrameCount` | No | Integer | `null` | The optional number of messages until a key frame is inserted. <br>Only valid if messaging mode supports key frames. |\n| `DataSetFetchDisplayNames` | No | Boolean | `null` | Whether to fetch the display name and use it as<br>data set id for all opc node items in the data set.<br>Defaults to the value configured via `--fd` command line option. |\n| `MetaDataUpdateTime` | No | Integer | `null` | The optional interval at which meta data messages should be sent even if the meta data has not changed.<br>Only valid if messaging mode supports metadata or metadata is explicitly enabled. |\n| `MetaDataUpdateTimeTimespan` | No | String | `null` | Same as `MetaDataUpdateTime` but expressed as duration string.<br>Takes precedence over the Integer value. |\n| `SendKeepAliveDataSetMessages` | No | Boolean | `false` | Whether to send keep alive data set messages for this data set when a subscription keep alive notification is received.<br>Only valid if messaging mode supports keep alive messages. |\n| `MessageEncoding` | No | String | `null` | The message encoding to use when publishing the data sets. <br>For the list of supported message type names see [here](./messageformats.md#messaging-profiles-supported-by-opc-publisher) |\n| `MessagingMode` | No | String | `null` | The messaging mode to use when publishing the data sets. <br>For the list of supported messaging mode names see [here](./messageformats.md#messaging-profiles-supported-by-opc-publisher) |\n| `WriterGroupTransport` | No | String | `null` | The transport technology to use when publishing messages. <br>For the list of supported transport names see [here](./transports.md) |\n| `WriterGroupPartitions` | No | Integer | `1` | Number of partitions to split the writer group into when publishing to target topics. |\n| `WriterGroupQueueName` | No | String | `null` | Writer group queue overrides the default writer group topic template to use. |\n| `WriterGroupMessageRetention` | No | Boolean | `null` | Message retention flag value for all messages sent through the writer group if the transport supports it. |\n| `WriterGroupMessageTtlTimespan` | No | String | `null` | Message time to live expressed as duration string for messages sent through the writer group if the transport supports it. |\n| `WriterGroupQualityOfService` | No | String | `null` | The quality of service for telemetry messages (if supported by transport). <br>One of `AtMostOnce`, `AtLeastOnce`, or `ExactlyOnce`.<br>Defaults to the value configured via `--qos` command line option or if not provided `AtLeastOnce` (QOS 1). |\n| `Priority` | No | Integer | `null` | Priority of the writer subscription. |\n| `BatchSize` | No | Integer | `null` | The optional number of notifications that are queued before a network message is generated. <br>For historic reasons the default value is 50 unless otherwise configured via `--bs` command line option. |\n| `BatchTriggerInterval` | No | Integer | `null` | The network message publishing interval. Network and meta data messages are published cyclically from the notification queue when the specified duration has passed (or when the batch size configuration triggered a network message).<br>For historic reasons the default value is 10 seconds unless otherwise configured via  the `--bi` command line option. |\n| `BatchTriggerIntervalTimespan` | No | String | `null` | Same as `BatchTriggerInterval` but expressed as duration string.<br>Takes precedence over the Integer value. |\n| `DisableSubscriptionTransfer` | No | Boolean | `false` | Disable subscription transfer on reconnect to override the default behavior per endpoint. |\n| `RepublishAfterTransfer` | No | Boolean | `true` | Republishes any missing values after a subscription is transferred on reconnect. |\n| `MaxKeepAliveCount` | No | Integer | `null` | When the publishing timer has expired this number of times without requiring any Notification to be sent, to the writer a keep-alive message is sent. |\n| `QueueName` | No | String | `null` |  Writer queue overrides the writer group queue name.<br>Network messages are split by different Qos settings. |\n| `MessageRetention` | No | Boolean | `null` | Message retention setting for messages sent by the writer if the transport supports it<br>Network messages are split by differing retention flag values. |\n| `MessageTtlTimespan` | No | String | `null` | Message time to live expressed as duration string for messages sent by the writer.<br>Network messages are split across different Ttl settings. |\n| `QualityOfService` | No | String | `null` | Quality of service to use for the writer.<br>One of `AtMostOnce`, `AtLeastOnce`, or `ExactlyOnce`.<br>Overrides the Writer group quality of service and together with queue name causes network messages to be split.. |\n| `MetaDataQueueName` | No | String | `null` | Meta data queue name to use for the writer. <br>Overrides the default metadata topic template. |\n| `DataSetWriterWatchdogBehavior` | No | String | `null` | Determines what to do when the data set writer watchdog triggers. <br>One of `Diagnostic`, `Reset`, `FailFast`, or `ExitProcess`.<br>Defaults to the value configured via `--dwb` command line option. |\n| `OpcNodeWatchdogTimespan` | No | String | `null` | Determines the timeout of the monitored item watchdog that triggers the `DataSetWriterWatchdogBehavior`. <br>Value is expressed as Timespan string ({d.hh:mm:dd.fff}).<br>Defaults to the value configured via `--mwt` command line option. |\n| `OpcNodeWatchdogCondition` | No | String | `null` | Run the watchdog behavior for the writer subscription `WhenAllAreLate` or `WhenAllAreLate`.<br>Defaults to the value configured via `--mwc` command line option. |\n| `OpcNodes` | No (see notes) | `List<OpcNode>` | empty | The DataSet collection grouping the nodes to be published for <br>the specific DataSetWriter defined above. |\n\n*Note*: `OpcNodes` field is mandatory for `PublishNodes_V1`. It is optional for `CreateOrUpdateDataSetWriterEntry_V2`, `UnpublishNodes_V1` and `AddOrUpdateEndpoints_V1`. The `OpcNodes` field shouldn't be specified for the rest of the direct methods taking an entry object.\n\nEach [OpcNode](./definitions.md#opcnodemodel) has the following attributes:\n\n| Attribute | Mandatory | Type | Default | Description |\n| --------- | --------- | ---- | ------- | ----------- |\n| `Id` | Yes* | String | N/A | The OPC UA [NodeId](#node-ids) in the OPC UA server whose data value changes should be published. <br>Can be specified as NodeId or ExpandedNodeId as per OPC UA specification, <br>or as ExpandedNodeId IIoT format {NamespaceUi}#{NodeIdentifier}. <br>**Note*: `Id` field may be omitted when `ExpandedNodeId` is present. |\n| `ExpandedNodeId` | No | String | `null` | Enables backwards compatibility. <br>Must be specified as ExpandedNodeId as per OPC UA specification. <br>**Note*: when `ExpandedNodeId` is present `Id` field may be omitted. |\n| `BrowsePath` | No | `List<String>` | `null` | The [browse path](#browse-paths) from the Node configured in `Id` to the actual node to monitor.<br>**Note*: if the node `Id` is not provided, `i=84` (root node) is assumed. |\n| `AttributeId` | No | String | `Value` | The node attribute to sample in case the node is a variable value (data item). <br>The allowed values are defined in the OPC UA specification. <br>Ignored when subscribing to events. |\n| `IndexRange` | No | String | `null` | The index range of the value to publish. <br>Value expressed as a numeric range as defined in the OPC UA specification. <br>Ignored when subscribing to events. |\n| `OpcSamplingInterval` | No | Integer | `1000` | The sampling interval for the monitored item to be published. <br>Value expressed in milliseconds. <br>The value is used as defined in the OPC UA specification. <br>Ignored when `OpcSamplingIntervalTimespan` is present. |\n| `OpcSamplingIntervalTimespan` | No | String | `null`    | The sampling interval for the monitored item to be published. <br>Value expressed in Timespan string({d.hh:mm:dd.fff}). <br>The value is used as defined in the OPC UA specification. |\n| `OpcPublishingInterval` | No | Integer | `null` | The publishing interval for the monitored item to be published. <br>Value expressed in milliseconds. <br>This value will overwrite the publishing interval defined in the DataSetWriter for the specified node. <br>The value is used as defined in the OPC UA specification. <br>Ignored when `OpcPublishingIntervalTimespan` is present. |\n| `OpcPublishingIntervalTimespan` | No | String | `null` | The publishing interval for the monitored item to be published. <br>Value expressed in Timespan string ({d.hh:mm:dd.fff}). <br>This value will overwrite the publishing interval defined in the DataSetWriter for the specified node. <br>The value is used as defined in the OPC UA specification. |\n| `DataSetFieldId` | No | String | `null` | A user defined tag used to identify the field in the <br>DataSet telemetry message when publisher runs in <br>PubSub message mode. |\n| `DataSetClassFieldId` | No | Guid | `Guid.Empty`  | A user defined Guid that identifies the field in the data set class of the <br>DataSet telemetry message when publisher runs in <br>PubSub message mode.<br>This value is ignored when subscribing to events, in which case a `DataSetClassFieldId` can be applied to each select clause that select the content of the event dataset. |\n| `DisplayName` | No | String | `null` | A user defined tag to be added to the telemetry message <br>when publisher runs in Samples message mode. |\n| `HeartbeatInterval` | No | Integer | `0` | The interval used for the node to publish a value (a publisher <br>cached one) even if the value hasn't been changed at the source. <br>Value expressed in seconds. <br>0 means the heartbeat mechanism is disabled. <br>This value is ignored when `HeartbeatIntervalTimespan` is present. |\n| `HeartbeatIntervalTimespan` | No | String | `null` | The interval used for the node to publish a value (a publisher <br>cached one) even if the value hasn't been changed at the source. <br>Value expressed in Timespan string ({d.hh:mm:dd.fff}). |\n| `SkipFirst` | No | Boolean | `false` | Whether the first received data change for the monitored item should not be sent. This can avoid large initial messages since all values are sent by a server as the first notification.<br>If an `EventFilter` is specified, this value is ignored |\n| `QueueSize` | No | Integer | `1` | The desired QueueSize for the monitored item to be published. |\n| `FetchDisplayName` | No | Boolean | `false` | Whether the server shall fetch display names of monitored variable nodes and use those inside messages as field names. Default is to use the `DisplayName` value if provided even if this option is set to `true`, if not provided or `false`, and no `DisplayName` specified, the node id is used. |\n| `DiscardNew` | No | Boolean | `false` | Whether the server shall discard new values when the queue is full. Default is false, it will discard values that have not been sent yet. |\n| `UseCyclicRead` | No | Boolean | `false` | Read the value periodically at the sampling rate instead of subscribing through subscriptions.<br>Ignored when subscribing to events. |\n| `RegisterNode` | No | Boolean | `false` | Register the node to sample using the Register service call before accessing. Some servers then support faster reads, but this is not guaranteed.<br>The service is defined in the OPC UA specification. <br>Ignored when subscribing to events. |\n| `DataChangeTrigger` | No | String | `null` | The data change trigger to use. <br>The default is `\"StatusValue\"` causing telemetry to be sent when value or statusCode of the DataValue change. <br>`\"Status\"` causes messages to be sent only when the status code changes and <br>`\"StatusValueTimestamp\"` causes a message to be sent when value, statusCode, or the source timestamp of the value change. A publisher wide default value can be set using the [command line](./commandline.md). This value is ignored if an EventFilter is configured. |\n| `DeadbandType` | No | String | `1` | The type of dead band filter to apply. <br>`\"Percent\"` means that the `DeadbandValue` specified is a percentage of the EURange of the value. The value then is clamped to a value between 0.0 and 100.0 <br>`\"Absolute\"` means the value is an absolute deadband range. Negative values are interpreted as 0.0. This value is ignored if an `EventFilter` is present. |\n| `DeadbandValue` | No | Decimal | `1` | The deaad band value to use. If the `DeadbandType` is not specified or an `EventFilter` is specified, this value is ignored. |\n| `EventFilter` | No | [EventFilter](./definitions.md#eventfiltermodel) | `null` | An [event filter](./readme.md#configuring-event-subscriptions) configuration to use when subscribing to events instead of data changes. |\n| `ConditionHandling` | No | [ConditionHandlingOptions](./definitions.md#conditionhandlingoptionsmodel) | `null` | Configures the special [condition handling logic](./readme.md#condition-handling-options) when subscribing to events. |\n| `ModelChangeHandling` | No | [ModelChangeHandlingOptions](./definitions.md#modelchangehandlingoptionsmodel) | `null` | Configures model change tracking through this node (Experimental). |\n\n> The configuration file syntax has been enhanced over time. OPC Publisher reads old formats and converts them into the current format when persisting the configuration. OPC Publisher regularly persists the configuration file.\n\n### Writer group configuration\n\n**DataSets** are a group of nodes within one OPC UA server. Datasets contain data value changes for nodes that all share a common [publishing interval](#sampling-and-publishing-interval-configuration). A `DataSetWriter` emits **DataSetMessages** containing a DataSet. The Writer has all information to establish a connection to an OPC UA server.\n\nA `DataSetWriterGroup` is used to group several DataSetWriter's for a specific OPC UA server. A DataSetWriterGroup emits what is called a **NetworkMessage** containing the **DataSetMessages**. The following diagram courtesy of the OPC Foundation reference specification hows the relationship between these concepts and the messages emitted over the specified transport protocol:\n\n![Messages](https://reference.opcfoundation.org/api/image/get/307/image023.png)\n\nIn the implementation of OPC Publisher, a Writer group is defined by the `DataSetWriterGroup` name attribute in the configuration. Due to the limitations of the configuration schema, for attributes that apply to the Writer group the value of the first configuration entry object will be used. All other values in further entries with the same `DataSetWriterGroup` value are discarded. It is recommended to use the same values for all writer group related attributes in all entries for a consistent and deterministic behavior.\n\nThe following configuration properties of the published nodes entry model apply to the Writer group:\n\n- Messaging profile (`MessageEncoding`, `MessagingMode`)\n- Batch size and batch publishing interval (`BatchSize`, `BatchTriggerIntervalTimespan`)\n- Desired transport (`WriterGroupTransport`)\n\n> IMPORTANT: It is important to set a unique `DataSetWriterGroup` name when configuring the above settings. Not doing so will yield unexpected behavior as all configurations with the same writer group name are collated into a single one with differing settings being clobbered.\n\nA `DataSetWriter` is defined by its `DataSetWriterId` and the effective `DataSetPublishingInterval` of the writer. A group of nodes with the same [publishing interval](#sampling-and-publishing-interval-configuration) becomes a writer inside a writer group, regardless of using the same `DataSetWriterId`. If the same `DataSetWriterId` is used but with nodes that have different effective publishing intervals, then a postfix string is added to the name to further disambiguate.\n\n> IMPORTANT: Just like the writer group configuration, it is important to set a unique `DataSetWriterId` name when configuring multiple writers with different settings (publishing interval excluded). Not doing so will yield unexpected behavior as all configurations with the same dataset writer name are collated into a single one with differing settings being clobbered.\n\nDue to historic reasons, by default a session is scoped to a writer group. That means for each endpoint url and security configuration inside a single writer group a single session is opened and the subscriptions are established inside the session. If you use more than one writer group in your configuration and each contain writers with the same endpoint information, multiple sessions will be created. This can be overridden using command line options.\n\nOPC Publisher will try to re-use an existing OPC UA subscription or create a new one per `DataSetWriter`.\n\n### Configuration via init file\n\nOPC Publisher can be configured remotely using its [writer](./api.md#writer) and [node](./api.md#configuration) configuration API.  This API can be invoked via HTTP, MQTT (RPC), in many cases through IoT Hub direct methods, but also using OPC Publisher's init file feature.\n\nThe init file can be specified using the [command line option](./commandline.md) `--pi, --initfile`. The file can be updated while OPC Publisher is running, in which case the new file content will be executed. The file will not be run if it has not changed. This applies also across restarts. However, this requires that the response file (see the `--il, --initlog` [argument](./commandline.md)) is writeable.\n\nThe init file format follows the [.http file format](https://learn.microsoft.com/aspnet/core/test/http-files) with the additional exception that scripting, variables, and `{{ }}` templates are not supported.\n\nWhile the [method line](https://learn.microsoft.com/aspnet/core/test/http-files#requests) can start with a `HTTPMethod` and end with a `HTTPVersion`, they are effectively discarded at the moment.  The `URL` must be a direct method name as specified in the API documentation, e.g. `AddOrUpdateEndpoint_V1`.  While headers can be provided, the only relevant one is `Content-Type` which defaults to `application/json`. In addition to the documented format, the init file format supported by OPC Publisher supports the following additional request directives which can be provided after a comment (# or //):\n\n| Directive | Description |\n| --------- | ----------- |\n| **@no-log** | Disable logging for this request after this directive.<br>This directive must be applied for every request and on the first line so that nothing is emitted to the init log. |\n| **@timeout** | Timeout for the request.<br>If the request times out it will be an error and all further requests are not sent. |\n| **@retries** | Retry this number of times in case of an error.<br>An error is any request that returns with status code >= 400. |\n| **@delay** | Delay before executing a request.<br>If retries are specified the delay applies again before every retry. |\n| **@on-error** | Invoke the request only when the previous request failed.<br>If the previous request has **@continue-on-error** directive this request will not be executed. If the request succeeds the next request after is run. |\n| **@continue-on-error** | Continue to next request even if the request failed.<br>The default behavior is to stop execution of requests except for the next request with **@on-error** directive. |\n\nThe **@on-error** condition can be used as an error handler e.g. to call the [Shutdown](./directmethods.md#shutdown_v2) method. If the restart is immediate, the init file will be execute again after restart.  A delay can throttle these restarts.  An example init file is shown here:\n\n``` json\n###\n\n// 3 retries in case of failure, with a delay of 5 seconds between\n// @delay 5\n// @retries 3\n\n// Creates writer entries for all objects that implement the\n// machine tool object type or one of its subtypes on this server\nExpandAndCreateOrUpdateDataSetWriterEntries_V2\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"opc.tcp://opcua.umati.app:4840\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"MachineTools\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/MachineTool/;i=13\" }\n        ]\n    }\n}\n\n###\n\n// Shutdown the publisher in case the expansion failed\n// and let docker restart it. The Fail fast argument\n// provided as json payload.\n# @on-error\nShutdown_V2\n\ntrue\n\n###\n```\n\nMore init file examples with explanations can be found [here](./intfilesamples.md).\n\n### Sampling and Publishing Interval configuration\n\nThe OPC UA reference specification provides a detailed overview of the OPC UA [monitored item](https://reference.opcfoundation.org/Core/Part4/v104/docs/5.12) and [subscription](https://reference.opcfoundation.org/Core/Part4/v104/docs/5.13.1) service model.\n\nA `DataSetWriter` is a group of (variable or event notifier) nodes inside an OPC UA server that constitute a data set. Several parameters can be configured for each node that tell the Server how the node is to be sampled, evaluated and reported. These [attributes](#configuration-schema) include\n\n- Sampling interval (`OpcSamplingInterval` or `OpcSamplingIntervalTimespan` or `DataSetSamplingIntervalTimespan` at the entry level)\n- Filter definition (`DeadbandValue`, `DeadbandType`, and `DataChangeTrigger` for variables, or [EventFilter](./definitions.md#eventfiltermodel) in case the monitored item is an event notifier)\n- Queue mode (`DiscardNew`) and\n- Queue length (`QueueSize`)\n\nThe following overview diagram courtesy of the OPC Foundation shows how the server operates based on the configuration:\n\n![Reference](https://reference.opcfoundation.org/api/image/get/407/image018.png)\n\nA subscription is created for a `DataSetWriter` if none with the same subscription settings already exists. The publishing interval (configured using the `DataSetPublishingInterval` or `OpcPublishingInterval` values) is an attribute of the subscription (hence multiple writers are instantiated if there are multiple different publishing intervals nodes under a data set writer configured). The publishing interval defines the cyclic rate at which it collects values from the monitored item queues. Each time it attempts to send a Notification Message to OPC Publisher containing new values or events of its monitored items.\n\nA default OPC Publisher wide publishing interval can be provided using the [command line option](./commandline.md) (`--op`) which is used when the interval is not configured.  The default publishing interval used by OPC Publisher is 1 second.  It is also possible to override all publishing intervals configured in the OPC Publisher configuration using the `--ipi` command line option. Setting the publishing interval to `0` instructs the server to choose the fastest publishing interval cycle it can manage. This can be useful if you have existing configuration specifying multiple publishing intervals but would like to avoid separate subscriptions to be created for each interval, or just put the server in charge. Note though that the `--npd` command line will still split a data set writer if more nodes than the configured amount are specified in the configuration file.\n\nThe diagnostics output and metrics contain a `Server queue overflows` instrument which captures the number of data values with overflow bit set and indicates data changes were lost. Increase the `QueueSize` of frequently sampled items until the instrument stays `0`. You can also configure the publisher with the `--aq` command line option and let it calculate an appropriate queue size taking into account the (revised) publishing interval and sampling interval for a monitored item.\n\nNotifications received by the writers in the writer group inside OPC Publisher are batched and encoded and published to the chosen [transport sink](./transports.md).\n\nThe OPC UA server always sends the first data value to OPC Publisher when a monitored item is added to a subscription. To prevent publishing all of these values during startup, the `SkipFirst` value can be specified in the data item's configuration:\n\n``` json\n  \"SkipFirst\": true,\n```\n\n#### Key frames, delta frames and extension fields\n\nOPC UA optimizes network bandwidth by only sending changes to OPC Publisher when the data item's value has changed. These messages are sent as `ua-deltaframe` messages by the data set writer, and the resulting data set messages are sparse. It is desirable to send all other values that have not changed together with a value that changed as a key frame (`ua-keyframe`). To accomplish this a writer can be configured with a `DataSetKeyFrameCount` value other than 0. If this is the case, all values are sent in the first message, and then every `DataSetKeyFrameCount` number of messages later.\n\nThe `DataSetExtensionFields` object in the [configuration](#configuration-schema) can be used to insert additional fixed fields into these key frame messages which allows you to contextualize messages with data that is available in external systems only, or that allows your application to understand the context in which the message is produced.  An example configuration is shown here:\n\n```json\n[\n    {\n        ...\n        \"MessagingMode\": \"PubSub\",\n        \"DataSetExtensionFields\": {\n            \"EngineeringUnits\": \"mm/sec\",\n            \"AssetId\": 5,\n            \"Important\": false,\n            \"Variance\": {\n              \"Value\": 0.4,\n              \"DataType\": \"Single\"\n            }\n        },\n        \"DataSetKeyFrameCount\": 3,\n        \"OpcNodes\": [\n            ...\n        ]\n    }\n]\n\n```\n\nValues are formatted using the extended OPC UA Variant [JSON format](#json-encoding). This encoding is compliant with OPC UA Part 6, however it also allows to use simple JSON types which will be interpreted as Variant values using a simple heuristic, mapping the best OPC UA type possible to it.\n\n> IMPORTANT: Extension fields are only sent as part of key frame messages when using Pub Sub encoding. You must configure a key frame count for key frames to be sent as the default key frame count value is 0 and therefore key frames are disabled.\n\n#### Status codes\n\nThe status code `value` is the integer received over the wire from the server (full one including all bits).\n\nStatusCode \"Good\" is defined as 0 in OPC UA, which is omitted in JSON encoding (as per Part 6). The `symbol` in the encoding is what OPC Publisher is looking up from the standard defined codes (using the code bits which are the 16 bits defining the error code part of the status code).\n\nThe symbol can be `Good` and still show up in the message when other bits are set in the `value`, e.g., overflow status, or additional information status, etc. One such example is the value `1152` which indicates the overflow bit (the server monitored item queue was in an overflow condition, which means the queue size should be increased):\n\n``` bash\nCodeBits = Value & 0xFFFF0000; --> This is used to look up the symbol which is \"Good\".\nFlagBits = Value & 0x0000FFFF;\n\n1152 == 0x480 == DataValueInfo | OverflowBit\n```\n\nYou can find more information in [Part 4](https://reference.opcfoundation.org/v105/Core/docs/Part4/7.39.1) of the OPC UA reference.\n\n#### Heartbeat\n\nSome use cases require to publish data values in constant intervals. OPC Publisher has always supported a \"heartbeat\" option on the configured monitored node item. Heartbeat acts like a watchdog which fires after the heartbeat interval has passed and no new value has yet been received. It can be enabled by specifying the `HeartbeatInterval` key in an item's configuration. The interval is specified in seconds (but can also be specified as a Timespan value):\n\n``` json\n  \"HeartbeatInterval\": 60,\n```\n\nThe behavior of heartbeat can be fine tuned using the `--hbb, --heartbeatbehavior` [command line options](./commandline.md) or the\n\n``` json\n  \"HeartbeatBehavior\": \"...\",\n```\n\noption of the node entry. The behavior can be set to watch dog behavior with Last Known Value (`WatchdogLKV`, which is the default) or Last Known Good (`WatchdogLKG`) semantics. A last known good value has either a status code of `Good` or a valid value (!= Null) and not a bad status code (which covers other Good or Uncertain status codes). Bad values are not causing heartbeat messages in LKG mode.\n\nA continuous periodic sending of the last known value (`PeriodicLKV`) or last good value (`PeriodicLKG`) can also be selected. In some cases periodic reporting is all that is needed, and the actual value read that is reported out of period should be dropped. Use the `PeriodicLKVDropValue` or `PeriodicLKGDropValue` behavior to achieve this behavior. The outcome is similar to the [cyclic read](#cyclic-reading-client-side-sampling) mode but using a periodic timer over server side sampled nodes.\n\nThe heartbeat behavior `WatchdogLKVDiagnosticsOnly` is special, it allows you to log heartbeat in the diagnostics output without sending heartbeats as part of the outgoing messages.\n\n##### Timestamps\n\nThe OPC UA data value contains a source and server timestamp. These are reported by the server and are based on the OPC UA server clock. The server is free to send whatever timestamp it wants, including none even though the OPC Publisher is setting up all monitored items to report both timestamps.\n\nWhen you want to analyze time series of data sets (where the value timestamps of every field in the data set will be different) or when you want to use Heartbeats (where the LKG or LKV are re-sent with the original timestamps), the `Timestamp` of the message should be used instead of the `SourceTimestamp` or `ServerTimestamp` values.\n\n> NOTE: The Timestamp property is not part of the regular legacy samples messages.  You must set `--fm=True` for them to be included.\n\nThe timestamp of the message is the time the notification *was received from the OPC UA server*. Using the `--mts` [command line options](./commandline.md) other sources for this timestamp can be chosen, e.g., the time of encoding (which is shortly before sending to the data sink), or the `PublishTime` property of the subscription notification received from the server (provided by OPC UA server).\n\n> Note that if the `PublishTime` is selected as message timestamp, heartbeat messages will not have a message timestamp as they are generated locally and not as a result of a publish operation.\n\n##### Legacy behavior\n\nWe still support a heartbeat behavior that mimics the behavior of heartbeat in 2.8 and below. Here the source timestamp of the value will be shifted by the time passed since receiving it. This behavior can be enabled by specifying `--hbb=WatchdogLKVWithUpdatedTimestamps` as [command line argument](./commandline.md) during deployment.\n\nThis behavior only mimics the old behavior. In past versions of OPC Publisher the heartbeat option layered on top of the Keep Alive mechanism of the subscription and was similar to `WatchdogLKVWithUpdatedTimestamps`. In 2.9 and higher the heartbeat is emitted every heartbeat interval from the last received value until a new value is received following a watchdog pattern. Given that the previous mechanism resulted in unexpected behavior, the new mechanism has a simpler and more reliable pattern leading to the desired outcome. It is also better because heartbeats are also sent when OPC Publisher is not connected to the server (during intermittent disconnects).\n\n> Please be aware that when analyzing using `SourceTimestamp` or `ServerTimestamp` properties, the values are provided by the server, not by OPC Publisher. They are therefore only as reliable as the server implementation. This also extends to heartbeats when `WatchdogLKVWithUpdatedTimestamps` behavior is used. When the server sends a data value without or invalid timestamps, these timestamps are shifted and can result in garbage. The best solution is to primarily rely on the message timestamp and only `SourceTimestamp` as secondary information.\n\n#### Cyclic reading (Client side sampling)\n\nSimilar use cases require cyclic read based sampling using read service calls on a periodic timer. The `UseCyclicRead` property of a configured node tells OPC Publisher to sample the value periodically when the timer expires. Note that read operations of all nodes at the same sampling rate are batched together for efficiency. They only execute when no previous read operation is in progress when the period expires. While the sampler configures a timeout of half the sampling rate in case of high frequency sampling a value every time the sampling rate expires cannot be guaranteed.\n\n``` json\n  \"UseCyclicRead\": true,\n```\n\nThe diagnostics output and metrics contain a `Server queue overflows` instrument. In the case of cyclic reads these are the number of skipped value reads because a cycle was missed due to delays reading from the server.  For example when configuring a 1 second sampling interval and the read operation takes 2.5 seconds, then 1 cycle will be missed and 1 overflow per value will be reported. Either set a less aggressive sampling interval (e.g., 3 seconds in the above case) or configure less items in the data set writer (if latency is due to the # of read operations in a single read request or the operation limits of the server).\n\nNote that reads are batched into a single service call. Therefore slow nodes can impact other nodes that can be read faster. You can configure the caching mode and cache age to use when reading the node value using the `CyclicReadMaxAgeTimespan` property which must be below or equal the cyclic sampling rate chosen for the node. Set the duration to 0 (which is the default) to always use *uncached* reads. In addition it is possible to combine cyclic reads with registering the node to read (\"registered read\") by setting the `RegisterNode` property of the node to `true`. This way some servers can optimize reading values from the backend for these nodes, however only a limited number of \"registered nodes\" are supported in such servers.\n\nThe OPC UA subscription/monitored items service due to its async model (server side sampling, queuing and publishing) is by far way more efficient than cyclically reading nodes from the server. Limits are reached relatively quickly compared to regular operation and heavily depend on the OPC UA server implementation and vendor.\n\n### Overcoming server limits and interop limitations\n\nOPC UA servers can be limited with regards to the amount of sessions, subscriptions or publishing requests they support. By default OPC Publisher tries to bundle as many writers with the same subscription configuration (including the publishing interval) into a OPC UA subscription inside a (writer group) session. It uses the `MaxMonitoredItemsPerSubscription` limit provided by in the Server capabilities object read by OPC Publisher when the session is created to create the right number of subscriptions that hold as many monitored items as possible. If the limit a not provided by the server or is 0, OPC Publisher uses a default value of `65536`. This value can be overridden using the `--xmi --maxmonitoreditems` [command line](./commandline.md) option.\n\nOPC Publisher has several options to overcome additional server limitations and that can be used to tune and overcome interoperability issues.\n\n- To minimize the number of sessions against a server, the default behavior of creating a session per writer group can be overridden using the `--dsg, --disablesessionpergroup` command line option which results in a *session per endpoint* spanning multiple writer groups with the same endpoint url and configuration.\n\n- To further limit the number of subscriptions avoid specifying different publishing intervals for the `OpcNodes` items in the OPC Publisher [configuration](#configuration-schema). Each publishing interval will result in a subscription with the server inside the (writer group) session.\n\n  - You can use the `--ipi, --ignorepublishingintervals` command line option to *ignore publishing interval configuration* in the JSON configuration and use the publishing interval configured using the `--op` command line option (default: 1 second).\n\n  - In addition you can set the `--op=0` to let the server decide the smallest publishing interval it offers.\n\n  - You can also use the `--aq, --autosetqueuesize` option to let OPC Publisher calculate the best queue size for monitored items in the subscription to limit data loss.\n\n- By default OPC Publisher tries to dispatch as many publishing requests to a server session as there are subscriptions in the session up to a maximum of `10`. The OPC UA stack tries to gradually lower the number based on feedback from the server (`BadTooManyPublishRequests`). This behavior is not tolerated by some servers. To set a lower maximum that OPC Publisher should never exceed use the `--xpr` command line option.\n\n### Configuring Security\n\nIoT Edge automatically provides OPC Publisher with a secure configuration to access IoT Hub. OPC UA does use [X.509 certificates](#opc-ua-certificates) fo mutual authentication of both OPC Publisher clients and the OPC UA server and to establish a secure channel between both. OPC Publisher can be configured to [store these certificates](#pki-management) in a file system based certificate store which root can be configured using the `--pki` [command line argument](./commandline.md). During startup, OPC Publisher checks if there's already a private certificate it should use as its identity. If it cannot find one, a self-signed certificate is created.\n\n> Self-signed certificates don't provide any trust value and we don't recommend using them in production.\n\nEncrypted communication between OPC Publisher and the OPC UA server can be enabled per endpoint via the `\"UseSecurity\": true,` flag in the [configuration](#configuration-schema). In addition, a specific security mode and policy can be chosen using the `EndpointSecurityMode` and `EndpointSecurityPolicy` configuration properties which possibly override the `UseSecurity` value. If none of these are specified then OPC Publisher will connect to the endpoint URL using **no security** at all to support backwards compatibility to previous versions of OPC Publisher.\n\n> Use encrypted communication whenever possible. Do not use `Best` as `EndpointSecurityMode` as this can mean that `None` could be chosen if the server does not returns any secure endpoint descriptors during discovery. In this case it is better to fail connecting.\n\nBy default OPC Publisher connects to the endpoint using anonymous authentication. However, OPC Publisher also supports user authentication using username and password. These credentials can be specified using the configuration file as follows:\n\n``` json\n  \"OpcAuthenticationMode\": \"UsernamePassword\",\n  \"OpcAuthenticationUsername\": \"usr\",\n  \"OpcAuthenticationPassword\": \"pwd\",\n```\n\nOPC Publisher also supports X.509 Certificate based user authentication. A user certificate with private key must be added to the `User` certificate store of the [PKI](#pki-management). The user name then refers to the subject name of the certificate and the password to the password that was used to protect the pfx blob representing the user certificate. For example:\n\n``` json\n  \"OpcAuthenticationMode\": \"Certificate\",\n  \"OpcAuthenticationUsername\": \"certificate-subject-name\",\n  \"OpcAuthenticationPassword\": \"certificate-password\",\n```\n\n> If user credentials are configured you should always enable encrypted communication to ensure the secrets are not leaked. OPC Publisher does not force encrypted authentication if a password is specified.\n\nOPC Publisher version 2.5 and below encrypts the username and password in the configuration file. Version 2.6 and above stores them in plain text. 2.9 allows you to force encryption of credentials at rest (`--fce`) or otherwise cause OPC Publisher to exit.\n\n### Using OPC UA reverse connect\n\nYou can let servers connect to OPC Publisher using the OPC UA reverse connect mode. This allows an OPC UA server to connect to OPC Publisher located in a higher layer network instead of opening up inbound ports to let OPC Publisher connect to it. Consequently only an outbound port needs to be opened in the lower layer network. You can find more information in [OPC UA standard Part 6](https://reference.opcfoundation.org/v104/Core/docs/Part6/7.1.3/).\n\nReverse connect mode can be enabled per endpoint. This can be done using the `UseReverseConnect` property inside the published nodes configuration entry. An OPC Publisher-wide default for the case the property is missing can be configured using the `--urc` [command line options](./commandline.md).\n\nReverse connect is only supported for the opc.tcp scheme of endpoint urls. Reverse connecting other transports is not supported. If OPC Publisher cannot find a Url candidate with the opc.tcp scheme to use when reverse connecting it will try to establish a regular connection to any of the other candidate endpoints instead (see [ConnectionModel](./definitions.md#connectionmodel) for more information).\n\nOPC Publisher will listen for reverse connect requests on port 4840, unless a different port is configured through the `--rcp` [command line options](./commandline.md). You must open the port on the OPC Publisher docker container for external OPC UA servers to be able to access it. This must be done in the IoT Edge deployment manifest's create options. Add a port binding entry for port 4840 (or otherwise chosen port) container port and the host port you want to open (e.g., 4840):\n\n```json\n    \"createOptions\": \"{\\\"User\\\":\\\"root\\\",\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"4840/tcp\\\":[{\\\"HostPort\\\":\\\"4840\\\"}],  ...\n```\n\nOPC Publisher opens the outbound port when the first reverse connection is required. This happens when at a published nodes entry with a reverse connected endpoint causes a subscription to be created, or by making an API call with a reverse connection model passed as part of the request, whichever happens first. Otherwise the port stays closed.\n\nIt is also important to note that the Endpoint URL presented by the server in the RHEL packet must match exactly the endpoint url used to create the OPC UA client inside OPC Publisher (either the `EndpointUrl` property in the published nodes entry or the Url inside the [ConnectionModel](./definitions.md#connectionmodel)). Otherwise connections from the server will be rejected by OPC Publisher. This is important because some OPC UA servers do not use a FQDN host name in the endpoint Url in the RHEL packet they send. In this case, do not specify the FQDN in the Endpoint Url either. Follow instructions to [trouble shoot](./troubleshooting.md) OPC Publisher and in particular enable stack logging using `--sl` to see the endpoint url presented by the server when the server connection is rejected, then update the OPC Publisher configuration to match.\n\n### Configuring event subscriptions\n\nOPC Publisher supports two types of event filter configurations you can specify:\n\n- [Simple event filter](#simple-event-filter) configuration mode, where you specify the source node and the event type you want to filter on and then the OPC Publisher constructs the select and where clauses for you.\n- [Advanced event filter](#advanced-event-filter-configuration) configuration mode where you explicitly specify the select and where clauses.\n\nIn the configuration file you can specify how many event configurations as you like and you can also combine events and data nodes for a single endpoint.\n\nIn addition you can configure optional [Condition](#condition-handling-options) reporting where OPC Publisher reports retained conditions at a configured time periodic rate in seconds.\n\n#### Simple event filter\n\nAs highlighted in the example above you can specify namespaces both by using the index or the full name for the namespace. Also look at how the [BrowsePath](#browse-paths) can be configured.\n\nHere is an example of a configuration file in simple mode:\n\n```json\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://testserver:62563/Quickstarts/SimpleEventsServer\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"SimpleEventServerEvents\",\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"ns=2;i=235\"\n                }\n            }\n        ]\n    }\n]\n```\n\nTo subscribe to an event you specify the source node (in this case the server node which has node id `i=2253`) and the event type to monitor (in this case `ns=2;i=235`).\n\nWhen you use the simple configuration option above, the OPC Publisher does two things:\n\n- It looks at the TypeDefinitionId of the event type to monitor and traverses the inheritance tree for that event type, collecting all fields. Then it constructs a select clause with all the fields it finds.\n- It creates a where clause that is OfType(TypeDefinitionId) to filter the events to just the selected event type.\n\n#### Advanced event filter configuration\n\nTo configure an advanced event filter you have to specify a full event filter which at minimum consists of three things:\n\n- The source node you want to receive events for (in the example below again the server node which has node id `i=2253`).\n- A select clause specifying which fields should be in the reported event. This can include a data set class field id that is then used as identifier in the dataset metadata for the dataset class.\n- A where clause specifying the filter AST.\n\nHere is an example of a configuration file that selects events using an advanced event filter:\n\n```json\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://testserver:62563/Quickstarts/SimpleEventsServer\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"SimpleEventServerEvents\",\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"DataSetClassFieldId \": \"D3EB3722-E956-4E5E-925B-FB727B737520\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"DataSetClassFieldId \": \"A435F616-CE1E-4FBD-A819-03175EB49231\",\n                            \"BrowsePath\": [\n                                \"Message\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=2;i=235\",\n                            \"DataSetClassFieldId \": \"BD236A98-8DA3-40A1-B8E8-00AB23A6B5E9\",\n                            \"BrowsePath\": [\n                                \"/2:CycleId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"nsu=http://opcfoundation.org/Quickstarts/SimpleEvents;i=235\",\n                            \"DataSetClassFieldId \": \"9F9A420B-509E-488B-A7A4-F320F8223E9E\",\n                            \"BrowsePath\": [\n                                \"/http://opcfoundation.org/Quickstarts/SimpleEvents#CurrentStep\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=2;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n]\n```\n\nThe exact syntax allowed can be found in the [OPC UA reference documentation](https://reference.opcfoundation.org/Core/Part4/v105/docs/7.22.3). Note that not all servers support all filter capabilities. You can [troubleshoot](./troubleshooting.md) issues using the OPC Publisher logs.\n\n#### Condition handling options\n\n> This feature is in preview\n\nIn addition to event subscription, you can also configure events to enable condition handling.\n\nWhen configured, OPC Publisher listens to ConditionType derived events, records unique occurrences of them and periodically sends out all condition events that have the Retain property set to True. This enables you to continuously get a snapshot view of all active alarms and conditions which can be very useful for dashboard-like scenarios.\n\nHere is an example of a configuration for condition handling:\n\n```json\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://testserver:62563/Quickstarts/AlarmConditionServer\",\n        \"OpcNodes\": [\n            {\n                \"DisplayName\": \"AlarmConditions\",\n                \"Id\": \"i=2253\",\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"i=2915\"\n                },\n                \"ConditionHandling\": {\n                    \"UpdateInterval\": 10,\n                    \"SnapshotInterval\": 20\n                }\n            }\n        ]\n    }\n]\n```\n\nThe `ConditionHandling` section consists of the following properties:\n\n- `UpdateInterval` - the interval, in seconds, which a message is sent if anything has been updated during this interval.\n- `SnapshotInterval` - the interval, in seconds, that triggers a message to be sent regardless of if there has been an update or not.\n\nOne or both of these must be set for condition handling to be in effect. You can use the condition handling configuration regardless if you are using advanced or simple event filters. If you specify the`ConditionHandling` option property without an `EventFilter` property it is ignored, as condition handling has no effect for data change subscriptions.\n\nConditions are sent as `ua-condition` data set messages. This is a message type not part of the official standard but allows separating condition snapshots from regular `ua-event` data set messages.\n\n## Publish to a Unified Namespace\n\n> This feature is in preview\n\nOPC Publisher allows you to map values and events obtained from the OPC UA address space to MQTT topics up to the granularity of the subscribed node id (monitored item).\n\nSpecify topic templates at the level of `WriterGroup`, `DataSetWriter` or `Node` as part of the [configuration](#configuration-schema) to configure routing that meets your needs. Topic templates can apply not just to MQTT but to any transport supporting topic or queue name based routing, however, the default templates that apply use the MQTT topic format with `/` path delimiter and escape only MQTT topic reserved characters (using `\\x<ascii-code>`).\n\nFor extra convenience use the automatic routing feature which leverages the OPC UA browse paths inside the address space to automatically create the topic structure. The [browse paths](#browse-paths) from the root folder (`i=84`) is used as it maps well with how clients visualize the address space. To use this feature, configure the `DataSetRouting` option in the configuration or set a default on the [command line](./commandline.md). For example when configuring the `UseBrowseNames` option all Events and data changes are routed to topics that match the browse path of the source node effectively mapping the address space into the MQTT topic structure with limited configuration overhead.\n\nWhen publishing value changes to topics best choose a [Message format](./messageformats.md) that has limited overhead, e.g., `SingleRawDataSet` or `SingleDataSetMessage`.\n\n## OPC Publisher Telemetry Formats\n\nOPC Publisher version 2.6 and above supports standardized OPC UA PubSub network messages in JSON format as specified in [part 14 of the OPC UA specification](https://opcfoundation.org/developer-tools/specifications-unified-architecture/part-14-pubsub/).\n\nAn example OPC UA PubSub message emitted by OPC Publisher version 2.9 and higher looks as follows:\n\n``` json\n{\n  \"MessageId\": \"18\",\n  \"MessageType\": \"ua-data\",\n  \"PublisherId\": \"uat46f9f8f82fd5c1b42a7de31b5dc2c11ef418a62f\",\n  \"DataSetClassId\": \"78c4e91c-82cb-444e-a8e0-6bbacc9a946d\",\n  \"Messages\": [\n    {\n      \"DataSetWriterId\": 2,\n      \"SequenceNumber\": 18,\n      \"MetaDataVersion\": {\n        \"MajorVersion\": 452345324,\n        \"MinorVersion\": 234523542\n      },\n      \"Timestamp\": \"2020-03-24T23:30:56.9597112Z\",\n      \"Status\": 0,\n      \"Payload\": {\n        \"Temperature\": {\n          \"Value\": 99,\n          \"SourceTimestamp\": \"2020-03-24T23:30:55.9891469Z\",\n          \"ServerTimestamp\": \"2020-03-24T23:30:55.9891469Z\"\n        },\n        \"Counter\": {\n          \"Value\": 251,\n          \"SourceTimestamp\": \"2020-03-24T23:30:55.9891469Z\",\n          \"ServerTimestamp\": \"2020-03-24T23:30:55.9891469Z\"\n        }\n      },\n      \"DataSetWriterName\": \"uat46f9f8f82fd5c1b42a7de31b5dc2c11ef418a62f\"\n    }\n  ]\n}\n```\n\nOPC Publisher 2.9 and above supports strict adherence to Part 6 and Part 14 of the OPC UA specification when it comes to network message encoding. To enable strict mode use the `-c` or `--strict` [command line options](./commandline.md). For backwards compatibility this option is off by default. Strict mode automatically enables all OPC UA Pub Sub features, including metadata messages. To disable metadata messages use the `--dm=true` flag. To enable metadata messages when strict mode is not used (compatible to 2.8), use `--dm=false`.\n\n> It is highly recommended to always run OPC Publisher with strict adherence turned on.\n\nAll versions of OPC Publisher also support a non-standard, simple JSON telemetry format (typically referred to as \"Samples\" format and which is the default setting). Samples mode is compatible with [Azure Time Series Insights](https://azure.microsoft.com/services/time-series-insights/):\n\n``` json\n[\n   {\n      \"EndpointUrl\": \"opc.tcp://192.168.178.3:49320/\",\n      \"NodeId\": \"ns=2;s=Pump\\\\234754a-c63-b9601\",\n      \"MonitoredItem\": {\n         \"ApplicationUri\": \"urn:myfirstOPCServer\"\n      },\n      \"Value\": {\n         \"Value\": 973,\n         \"SourceTimestamp\": \"2020-11-30T07:21:31.2604024Z\",\n         \"StatusCode\": 0,\n         \"Status\": \"Good\"\n      }\n  },\n  {\n      \"EndpointUrl\": \"opc.tcp://192.168.178.4:49320/\",\n      \"NodeId\": \"ns=2;s=Boiler\\\\234754a-c63-b9601\",\n      \"MonitoredItem\": {\n         \"ApplicationUri\": \"urn:mySecondOPCServer\"\n      },\n      \"Value\": {\n         \"Value\": 974,\n         \"SourceTimestamp\": \"2020-11-30T07:21:32.2625062Z\",\n         \"StatusCode\": 0,\n         \"Status\": \"Good\"\n      }\n   }\n]\n```\n\n**Warning: The `Samples` format changed over time and is now deprecated**\n\nMore detailed information about the supported message formats can be found [here](./messageformats.md)\n\n## Programming against OPC Publisher using the OPC Publisher API\n\nOPC Publisher supports remote configuration through Azure IoT Hub [direct methods](./directmethods.md). In addition to the configuration API, OPC Publisher 2.9 also supports additional [APIs](./api.md) and [a number of different transports](./transports.md) that can be used to receive messages or invoke these API services. The transports can be configured using the [command line arguments](./commandline.md).\n\n- The API can be invoked through Azure [**IoT Hub direct methods**](#calling-the-direct-methods-api) from the cloud or from another IoT Edge module running alongside of OPC Publisher or inside a higher layer of a Purdue network setup. The method name is the operation name and request payload as documented in the API documentation.\n\n- The same API is exposed as [REST API](#calling-the-api-over-http) via the Http**HTTP Server** [built into OPC Publisher](./transports.md#built-in-http-api-server) (Preview). The API supports browse and historian access streaming, which the other transports do not provide. All calls must be authenticated through an API Key which must be provided as a Api Key token in the Authorization header (`ApiKey <api-key>`). The API key is generated at start up and [can be read from the OPC Publisher module's module twin](#using-iot-edge-simulation-environment) (`__apikey__` property).\n\n- The API can also be invoked through **MQTT v5 RPC calls** (Preview). The API is mounted on top of the method template (configured using the `--mtt` [command line argument](./commandline.md)). The method name follows the topic. The caller provides the topic that receives the response in the topic specified in the corresponding MQTTv5 PUBLISH packet property.\n\n### Using IoT Edge Simulation environment\n\nA handy way to program against OPC Publisher is inside the IoT Edge Development simulator. You can also use [Azure IoT Edge for Visual Studio Code](https://github.com/microsoft/vscode-azure-iot-edge) to program against OPC Publisher which provides an integrated development experience.\n\n> NOTE: [IoTEdgeHubDev](https://github.com/Azure/iotedgehubdev) is a development tool and in maintenance mode. If you encounter issues please file an issue and we will aim to address.\n\nFollow the instructions to install [IoTEdgeHubDev](https://github.com/Azure/iotedgehubdev). Make sure the docker daemon is started and accessible. You can now use the official OPC Publisher images on Microsoft container registry (mcr.microsoft.com/iotedge/opc-publisher:latest) or build a local version from the root of this repository as follows:\n\n```bash\ndotnet publish src/Azure.IIoT.OpcUa.Publisher.Module/src/Azure.IIoT.OpcUa.Publisher.Module.csproj --os linux --arch x64 /p:ContainerImageTags=debug\n```\n\nDoing this will produce the container image `iotedge/opc-publisher:debug`. The [sample deployment manifest](deployment.json?raw=1) already points to the local container image. If you would like to use a different container image (e.g., the official one on MCR or from your private Azure Container Registry) update the image name in the manifest accordingly. To start the IoT Edge simulation run\n\n```bash\niotedgehubdev start -d docs/opc-publisher/deployment.json -v\n```\n\n> If you omit the `-v` command line argument the simulation will run in the background. You can now interact with OPC Publisher the same way as if it was running on a production IoT Edge.\n\n#### Calling the Direct Methods API\n\nIoT Edge Hub Development simulator can be used to deploy other modules side by side with OPC Publisher which can then invoke OPC Publisher [direct methods](https://learn.microsoft.com/azure/iot-hub/iot-hub-devguide-direct-methods). The API Payload is described in the [API](./api.md) and [configuration](./directmethods.md) documentation. While the API documentation is based on the OPC Publisher [openapi.json](openapi.json?raw=1) (Swagger), the direct method API uses the same [definitions](./definitions.md) for requests and responses.\n\nThe operation name in the the Open API JSON which is also the heading of the individual entry in the API documentation (e.g., [AddOrUpdateEndpoint](./api.md#addorupdateendpoints) or [GetConfiguredEndpoints](./api.md#getconfiguredendpoints)) is the direct method name that must be placed into the IoT Edge / IoT Hub method call. You can try this using the `az iot hub invoke-module-method` command, e.g.,\n\n```bash\naz iot hub invoke-module-method -m publisher -n <hub name> -d <iotedgehubdev device name> --method-name GetConfiguredEndpoints\n{\n  \"payload\": {\n    \"endpoints\": []\n  },\n  \"status\": 200\n}\n```\n\nDirect methods have a payload size limit of 256KB. This means large requests or responses will fail if they are larger than the max payload allowed. It is therefore recommended to use MQTT or HTTP to access the API (locally) or use  the SDK project inside this repository which supports transmitting and receiving payloads that are larger than the 256 KB payload limitation of Azure IoT Hub through compression and request/response chunking.\n\n#### Calling the API over HTTP\n\n> This feature is in preview\n\nYou can now send HTTP requests to the publisher module http server at `https://localhost` (use port 8081 when not running as container). The unsecure endpoint is mounted at `http://localhost` for testing purposes (use port 8080 when not running as container). E.g. to get the swagger definition run:\n\n```bash\ncurl http://localhost/swagger/v2/openapi.json\n```\n\nWhen you run inside IoT Edge and want to expose the REST API endpoint on the host network so other applications on the network or on the host sysytem can access it, you must configure port bindings.  For example - as can be seen in the sample [deployment manifest](./deployment.json):\n\n```bash\n... \"HostConfig\\\":{\\\"PortBindings\\\": ... \\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"8081\\\"}]}, ...\n```\n\nWIth this setting the API can be securely accessed at `https://localhost:8081` (replace localhost with the host name of the IoT Edge server).\n\n> NOTE: Do not expose port 80 on the host side as traffic over port 80 is unencrypted and insecure. It should only be used for testing and during development.\n\nTo call the API you must authenticate to the [built in HTTP server](./transports.md#built-in-http-api-server) endpoint using an API Key. You can obtain the API key needed to authenticate from the publisher module twin. e.g., using the [AZ CLI](https://learn.microsoft.com/azure/iot-edge/how-to-monitor-module-twins?view=iotedge-1.4#monitor-module-twins-in-azure-cli) tool you can run\n\n```bash\naz iot hub module-twin show -m publisher -n <hub name> -d <iotedgehubdev device name>\n```\n\nIf the OPC Publisher has successfully started then this will produce e.g., output as follows:\n\n```json\n      ...\n      \"$version\": 3,\n      \"__apikey__\": \"<api-key>\",\n      \"__certificate__\": \"...\",\n      \"__type__\": \"OpcPublisher\",\n      \"__version__\": \"2.9.11\"\n      ...\n```\n\nYou can now send HTTP requests to the publisher module http server at `https://localhost:8081` with the Authorization header `ApiKey <api-key>`. E.g., to call this API with the previously retrieved API Key run\n\n```bash\ncurl -H \"Authorization: ApiKey <api-key>\" https://localhost:8081/v2/configuration\n{\"endpoints\":[]}\n```\n\n> The API key is a secret just like passwords or decryption keys. Therefore always use HTTPS in production scenarios since using HTTP endpoint makes the secret visible to everyone and verify the server certificate against the \"certificate\" value provided in the twin. It is also recommended to continuously update the API key (Rolling) which can be done by writing a new key to the module twin or deleting the entry so it is re-generated.\n\n### JSON encoding\n\nThe REST API uses OPC UA JSON reversible encoding as per standard defined in [OPC UA](../readme.md#what-is-opc-ua) specification 1.04, Part 6, with the exception that default scalar values and `null` values are not encoded except when inside of an array.  A missing value implies `null` or the default of the scalar data type.\n\nAll *primitive built-in* values (`integer`, `string`, `int32`, `double`, etc.) and *Arrays* of them can be passed as JSON encoded Variant objects (as per standard) or as JSON Token.  The twin module attempts to coerce the JSON Token in the payload to the expected built-in type of the Variable or Input argument.\n\nThe decoder will match JSON variable names case-**in**sensitively.  This means you can write a JSON object property name as `\"tyPeiD\": \"\"`, `\"typeid\": \"\"`, or `\"TYPEID\": \"\"` and all are decoded into a OPC UA structure's `\"TypeId\"` member.\n\n#### Node Ids\n\nIn addition to the standard string encoding using a namespace `Index` (e.g. `ns=4;i=3`) or the `Expanded` format (e.g. `nsu=http://opcfoundation.org/UA/;i=3523`). OPC Publisher also supports the use of (non-standards compliant) `Uri` encoded Node Ids and Qualified Names (see [RFC 3986](http://tools.ietf.org/html/rfc3986)).\n\n```bash\n<namespace-uri>#<id-type>=<URL-encoded-id-value>\n```\n\nExamples are: `http://opcfoundation.org/UA/#i=3523` or `http://opcfoundation.org/UA/#s=tag1`.\n\nWhile the API supports any input format for node ids and qualified names (e.g., such as in [browse paths](#browse-paths)), you can select the desired output namespace format through the [header in the request](./definitions.md#requestheadermodel) and its property `NamespaceFormat`.  You can also set a default on the [command line](./commandline.md) using `--nf`. If the publisher is started in `--strict` the namespace format is `Expanded`, otherwise defaults to `Uri`.\n\n> The use of the `Uri` format is discouraged because it is not standards compliant. The use of the `Index` format is also discouraged as it does not allow configuring stable identifiers (the namespace table can change between sessions or when the server is updated, in which case the index might then point to a different namespace).  Use the `Expanded` format when possible.\n[browse paths](#browse-paths)\n\nNon Uri namespace Uri's must always be encoded using the `Index` or `Expanded` syntax (e.g. `nsu=taglist;i=3523`). Expanded Node Identifiers should be encoded using the OPC UA `Index` or `Expanded` syntax (e.g. `svu=opc.tcp://test;nsu=http://opcfoundation.org/UA/;i=3523`). However, the `Uri` format is also possible. In this case the server URI is appended as\n\n```bash\n<namespace-uri>&srv=<URL-encoded-server-uri>#<id-type>=<URL-encoded-id-value>\n```\n\n#### Browse paths\n\nA browse path is a set of browse names that the server should follow inside the address space to get to a node. The browse name is an attribute of a node and is a qualified name. Qualified Names are encoded as a single string the same way as Node Ids, where the name is the ID element of the URI. Examples of qualified names in `Expanded` format is `nsu=http://microsoft.com/;Browse%20Name`, in `Index` format `3:Browse%20Name` and in `Uri` format `http://opcfoundation.org/UA/#Browse%20Name`.\n\n The browse path starts by default from the root node. If this is not desired, the starting node id must also be provided.\n\nThe browse path format follows the documented browse path format in the OPC UA reference normative section. In all API and configuration the browse path is a JSON array containing the individual relative path element. The simplest example when using a browse path with browse names in the default namespace is:\n\n```json\n[ \"Objects\", \"Server\", \"ServerStatus\", \"CurrentTime\" ]\n```\n\nIn this example, the default `References` reference type is assumed linking the objects named by the browse path. The paths are forward traversed.\nThe relative path element by default must be a browse name formatted using one of the namespace formatting options (`Index`, `Expanded`, or `Uri`), e.g., the following are equivalent:\n\n```json\n[  // Expanded\n    \"Objects\",\n    \"nsu=http://opcfoundation.org/UA/Plc/Applications;OpcPlc\",\n    \"nsu=http://opcfoundation.org/UA/Plc/Applications;Telemetry\",\n    \"nsu=http://opcfoundation.org/UA/Plc/Applications;Fast\",\n    \"nsu=http://opcfoundation.org/UA/Plc/Applications;FastUIntScalar1\"\n],\n[ // Index\n    \"Objects\", \"17:OpcPlc\", \"17:Telemetry\", \"17:Fast\", \"17:FastUIntScalar1\"\n],\n[  // Uri\n    \"Objects\",\n    \"http://opcfoundation.org/UA/Plc/Applications#OpcPlc\",\n    \"http://opcfoundation.org/UA/Plc/Applications#Telemetry\",\n    \"http://opcfoundation.org/UA/Plc/Applications#Fast\",\n    \"http://opcfoundation.org/UA/Plc/Applications#FastUIntScalar1\"\n]\n```\n\nThe first option is the preferred and recommended model because it is the official formatting defined in the specification, and it is stable compared to the second option of using a namespace index, which can point to a different namespace in the namespace table than intended.\n\nIn addition each path element can be prefixed to narrow the reference or describe whether the path follow an inverse reference:\n\n- `.`: Short for `Aggregates` reference to select a property of a variable.\n- `/`: Short for a `HierarchicalReference` reference.\n- `#`: Whether to use the explicitly defined reference and do not consider subtypes of the reference type linking the elements.\n- `!`: Whether the inverse of the reference should be used\n- `<{ReferenceTypeId}>`: An explicit reference type to use, the well known reference types can be specified by name, otherwise use the node id of the reference type.\n\nIf the prefix is a valid character of the browse name it can be escaped by prefixing it with a `&` ampersand character, e.g. `&<, &>, &/, &., &:, &&`.\n\n> Note that in a filter query string the browse path is not specified as a JSON array but as a concatenation of the elements. In this case a prefix must be used. In addition the target can be then escaped by specifying it with brackets `[` and `]`. However, this only applies to the [query parser API](./api.md#compilequery).\n\n### Discovering OPC UA servers with OPC Publisher\n\n> This feature is in preview\n\nStarting from version 2.9 OPC Publisher provides discovery services (formerly [OPC Discovery](https://github.com/Azure/Industrial-IoT/tree/release/2.8.6)) to find assets (OPC UA servers) on the local shop floor network where the IoT Edge device is deployed. This can be programmatically controlled using API calls documented [here](./api.md). The optional [Web service](../web-api/readme.md) subscribes to the events and registers the discovered assets in Azure IoT Hub as device identities.\n\nExample use cases:\n\n- An industrial solution wants to detect assets which are unknown by its asset management system.\n- A customer wants to access an asset without looking up the connectivity information in his asset management database or Excel spreadsheet printout from 10 years ago!\n- A customer wants to onboard an asset which was recently added to a production line without causing additional network load.\n\nDiscovery supports two modes of operation:\n\n- Active Scan mode: The local network is actively scanned by the Discovery module.\n- Targeted discovery mode: A list of asset addresses can be specified to be checked.\n\nDiscovery is based on native OPC UA server functionality as specified in the OPC UA specification, which allows discovery of endpoint information including security profile information without establishing an OPC UA authenticated and encrypted OPC UA session.\n\nThe results of the discovery process are sent to cloud via the IoT Edge Hub’s and IoT Hub’s telemetry path. The optional cloud web service processes the results and onboard the discovered entities as IoT Hub identities.\n\nThe Discovery can be configured via the OPC Registry REST API and allows a fine-grained configuration of the discovery process for recurring as well as one-time scans.\n\n#### Discovery Configuration\n\nThe Discovery capability of OPC Publisher can be configured to do active network and port scanning. The following parameters can be configured for active scanning:\n\n- address ranges (needed when hosted in a Docker context where the host interfaces are not visible)\n- port ranges (to narrow or widen scanning to a list of known ports)\n- number of workers and time between scans (Advanced)\n\n> Active scanning should be used with care since it causes load on the local network and might be identified by network security software as a threat.\n\nFor a targeted discovery, the configuration requires a specific list of discovery URLs. Please note that targeted discovery disables the use of address and port ranges as only the specific list of discovery URLs are checked.\n\n#### One-time discovery\n\nOne-time discovery is supported by the OPC Publisher module and can be initiated through a API call over IoT Hub direct methods or MQTT/HTTPS (Preview).  The API is documented [here](./api.md).\n\nA discovery configuration is part of the API request payload. All one-time discovery requests are serialized in the Discovery module at the edge, i.e. will be performed one by one.\n\nUsing the targeted discovery mode, servers can be registered using a well-known discovery URL without active scanning.\n\n#### Discovery Progress\n\nThe discovery progress as well as current request queue size is reported via the telemetry path and available in the cloud for applications by the Registry services REST interface.\n\n### OPC UA command and control (OPC Twin)\n\n> This feature is in preview\n\nThe control services (formerly [OPC Twin services](https://github.com/Azure/Industrial-IoT/tree/release/2.8.6)) are provided using IoT Hub device method API as well as Web API and MQTT based request response API (Preview).\n\nExample use cases:\n\n- A customer wants to gather the configuration of an asset by reading configuration parameters of the asset.\n- A customer wants to browse an OPC UA server’s information model/address space for telemetry selection.\n- An industrial solution wants to react on a condition detected in an asset by changing a configuration parameter in the asset.\n\nThe API enables you to write applications that invoke OPC UA server functionality on OPC server endpoints. The Payload is transcoded from JSON to OPC UA binary and passed on through the OPC UA stack to the OPC UA server.  The response is re-encoded to JSON and passed back to the cloud service. This includes [Variant](#json-encoding) encoding and decoding in a consistent JSON format.\n\nPayloads that are larger than the Azure IoT Hub supported Device Method payload size are chunked, compressed, sent, then decompressed and reassembled for both request and response. This allows fast and large value writes and reads, as well as returning large browse results.\n\nA single session is opened on demand per endpoint so the OPC UA server is not overburdened with 100’s of simultaneous requests. The client linger option can be configured using the [command line](./commandline.md) option `--cl` so that clients stay open for a while after the service call completes avoiding re-establishment of the session.\n\n## OPC UA Certificates\n\nOPC Publisher connects to OPC UA servers built into machines or industrial systems via OPC UA client/server. There is an OPC UA client built into the OPC Publisher Edge module. OPC UA Client/server uses an OPC UA Secure Channel to secure this connection. The OPC UA Secure Channel in turn uses X.509 certificates to establish *trust* between the client and the server. This is done through *mutual* authentication, i.e. the certificates must be \"accepted\" (or trusted) by both the client and the server.\n\nThe pki path of OPC Publisher can be configured using the `PkiRootPath` or `--pki` [command line argument](./commandline.md) (the default folder is `/pki`). It is usually a good idea to specify a volume that is mounted to the host operating system and therefore persists during restarts of the OPC Publisher container. The individual stores are found under the PKI root path. These by default follow the layout guidance of the [OPC UA standard](https://reference.opcfoundation.org/GDS/v105/docs/F.1).\n\nBy default, the OPC Publisher module will create a self signed x509 *Application certificate* with a 1 year expiration in the `own` store. This default, self signed cert includes the Subject `Microsoft.Azure.IIoT`. This certificate is fine as a demonstration, but for production systems customers may want to [use their own certificate](#pki-management).\n\nThe biggest hurdle most OT admins need to overcome when deploying OPC Publisher is to configure the OPC UA server (equipment) to accept the OPC Publisher X.509 certificate (the other side of mutual trust). There is usually a configuration tool that comes with the built-in OPC UA server where certificates can be trusted. For example for KepServerEx, configure the trusted Client certificate as discussed [here]( https://www.kepware.com/getattachment/ccefc1a5-9b13-41e6-99d9-2b00cc85373e/opc-ua-client-server-easy-guide.pdf). To use the [OPC PLC Server Simulator](https://docs.microsoft.com/samples/azure-samples/iot-edge-opc-plc) with mutual trust you can use the `–-aa` switch on the simulator to accept OPC Publisher's certificate or copy the server certificate from the simulator to the pki `trusted` folder of OPC Publisher.\n\n### PKI management\n\nThe `certificate stores` in OPC Publisher live in the file system. They can be managed remotely using the `Certificates` [Api](./api.md#certificate) (Preview). This API enables an application or user to [list all certificates](./api.md#listcertificates) and [add](./api.md#addcertificate) and [remove certificates](./api.md#removecertificate). There is also an API to move rejected certificates from the rejected store to the trusted store and list, add, remove [certificate revocation lists](./api.md#listcertificaterevocationlists).\n\nBy default, the OPC Publisher module will create a self signed x509 certificate with a 1 year expiration which is fine for demonstration. For real applications, customers may want to use their own certificate.\n\nYou can use `openssl` to create your own self-signed certificate, e.g., with a 2 year expiration and a custom subject. In the following example script, replace `<application-name>` and `<subject-name>` with the application name and subject name you desire:\n\n```bash\n# Create cert.pem and key.pem\nopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -sha256 -days 730 -nodes \\\n-subj \"/CN=<application-name>/O=<your-company-name>/DC=localhost\" \\\n-addext \"subjectAltName=URI:urn:localhost:<application-name>:microsoft:,DNS:<iot-edge-host-name>\" \\\n-addext \"keyUsage=nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign\" \\\n-addext \"extendedKeyUsage=clientAuth\"\n\n# Transform cert.pem to cert.der\nopenssl x509 -outform der -in cert.pem -out cert.der\n# Transform key.pem and cert.pem to cert.pfx\nopenssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem\n\n# Clean up keys\nrm -f cert.pem\nrm -f key.pem\n```\n\nThe resulting .pfx file can now be copied to the `own/private` folder under pki root (or to an alternative application certificate folder configured) and the .der file to the `own/certs` and `trusted/certs` folders. Alternatively you can also push the pfx file content to OPC Publisher's PKI through the [OPC Publisher API](./api.md#addcertificate).\n\nAs part of above script you will be prompted to enter and verify an export password to protect the PFX file. If you are copying the PFX file into the `own` folder, then by default the password should be blank (hit enter), unless you specify the password using the `--apw=<pwd>` [command line options](./commandline.md). In this case the password should be the same password.\n\nOPC Publisher can retrieve the application Uri, application name, subject Name and Host name (DNS Domain name) from the first certificate found in the `own/certs` folder under the PKI root folder if you start it with the `--cfa` [command line argument](./commandline.md).\n\nIf you need to select a specific certificate in the `own/certs` store (e.g., because you configured more than one) or would like to have OPC Publisher generate a self-signed certificate with different content than the default, a application name can be provided using the `--an` command line argument (The default is `Microsoft.Azure.IIoT`). If you desire a different subject name than the default, the OPC Publisher must be started with `--sn` command line providing the desired subject name (for example `CN=<application-name>,O=mycompany`). If you desire a different application Uri than the default, it can be specified using the `--au` command line option. In this case, do not set the `--cfa` command line argument or it will override these settings from the first certificate found.\n\n> TIP: Using the `--cfa` command line option simplifies setting up OPC Publisher and also enables easier version to version upgrade without chances that a new application certificate is generated after the update because the desired certificate is not found.\n\nIf you intend to provide the certificate using the  [OPC Publisher API](./api.md#addcertificate) you must provide any password you choose as part of the API call so that the API server in OPC Publisher is able to export the key from the PFX blob. If the OPC Publisher was started using the `--tm` command line option any certificate added to the `own` store will also be added to the `trusted` store.\n\n### Auto Accept server certificates\n\nTo simplify the getting started experience, the OPC Publisher Edge module has a setting to automatically trust all *untrusted* server certificates presented to OPC Publisher (`--aa`). This does not mean OPC Publisher will accept any certificate presented. If Certificates are malformed or if certificates chains cannot be validated the certificate is considered broken (and not untrusted) and will be rejected as per OPC Foundation Security guidelines. In particular if a server does not provide a full chain it should be configured to do so, or the entire chain must be pre-provisioned in the OPC Publishers `pki` folder structure.\n\n> WARNING: Automatically trusting any server certificate provided by an endpoint exposes OPC Publisher to man in the middle attacks. Do not use OPC Publisher with auto accept mode in production.\n\n## OPC UA stack\n\nThe OPC UA .NET Standard reference stack of the OPC Foundation (contributed by Microsoft) is used for OPC UA secure communications by OPC Publisher. Modules and services consume the re-distributable NuGet package licensed by the OPC Foundation. The open source for the reference implementation is provided by the OPC Foundation on GitHub in [this public repository](https://github.com/OPCFoundation/UA-.NETStandard).\n\n## Performance and Memory Tuning OPC Publisher\n\nIn production setups, network performance requirements (throughput and latency) and memory resources must be considered. OPC Publisher exposes the following command line parameters to help meet these requirements:\n\n- Message queue capacity (`om` since version 2.7)\n- IoT Hub send interval (`si`)\n\nThe `om` parameter controls the upper limit of the capacity of the internal message queue. This queue buffers all messages before they're sent to IoT Hub. The default size of the queue is 4000 IoT Hub messages (for example: if the setting for the IoT Hub message size is 256 KB, the size of the queue will be up to 1 GB). If OPC Publisher isn't able to send messages to IoT Hub fast enough, the number of items in this queue increases. In this case, one or both of the following can be done to mitigate:\n\n- Decrease the IoT Hub send interval (`si`)\n- Use latest OPC Publisher in standalone mode\n  - Use PubSub format (`--mm=PubSub`).\n    - Choose the smallest message providing the information you need. E.g., instead of `--mm=PubSub` use `--mm=DataSetMessages`, or event `--mm=RawDataSets`. You can find sample messages [here](./messageformats.md).\n    - If you are able to decompress messages back to json at the receiver side, use `--me=JsonGzip` or `--me=JsonReversibleGzip` encoding.\n    - If you are able to decode binary network messages at the receiver side, choose `--me=Uadp` instead of `--me=Json`, `--me=JsonReversible` or a compressed form of Json\n  - When Samples format (`--mm=Samples`) is required\n    - Don't use FullFeaturedMessage (`--mm=FullSamples` or `--mm=Samples` with `--fm=false`). You can find a sample of full featured telemetry message [here](messageformats.md).\n  - Use batching (`--bs=600`) in combination with batch publishing interval (`--si=20`).\n  - Increase Monitored Items Queue capacity (e.g., `--mq=10`)\n  - Don't use \"fetch display name\" (`--fd=false`)\n- General recommendations\n  - Try to use less different publishing intervals, rather aim to use the same for all nodes.\n  - Experiment with the command line and configuration. E.g., depending on the IoT Hub connectivity it seems to be better to have fewer messages with more OPC UA value changes in it (check OPC Publisher logs) but it could also be better to have more messages with fewer OPC UA value changes, this is specific to every application.\n\nIf the queue keeps growing even though the parameters have been adjusted, eventually the maximum queue capacity will be reached and messages will be lost. This is because all parameters have physical limits and the Internet connection between OPC Publisher and IoT Hub isn't fast enough for the number of messages that must be sent in a given scenario. In that case, only setting up several, parallel OPC Publishers will help. The `om` parameter also has the biggest impact on the memory consumption by OPC Publisher.\n\nIt must be noted that IoT Hub also has limits in terms of how many messages it will accept, that is, there are quotas for a given IoT Hub SKU defined [here](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-quotas-throttling). If this quota is exceeded, OPC Publisher will generate an error trying to send the message to IoT Hub and the message will be lost.\n\nThe `si` or `bi` parameter forces OPC Publisher to send messages to IoT Hub at the specified interval. A message is sent either when the maximum IoT Hub message size of 256 KB of data is available (triggering the send interval to reset) or when the specified interval time has passed.\n\nThe `bs` parameter enables batching of incoming OPC UA data change messages. When used without batching interval (`bi`), a message is sent to IoT Hub only once OPC Publisher receives specified number of incoming messages. That is why it is recommended to use batching together with batching interval to achieve consistent message delivery cadence to IoT Hub.\n\nThe `ms` parameter enables batching of messages sent to IoT Hub. In most network setups, the latency of sending a single message to IoT Hub is high, compared to the time it takes to transmit the payload. This is due to Quality of Service (QoS) requirements, since messages are acknowledged only once they've been processed by IoT Hub). Therefore, if a delay for the data to arrive at IoT Hub is acceptable, OPC Publisher should be configured to use the maximal message size of 256 KB by setting the `ms` parameter to 0. It's also the most cost-effective way to use OPC Publisher.\n\nThe metric `monitored item notifications enqueue failure`  in OPC Publisher version 2.5 and below and `messages lost` in OPC Publisher version 2.7 shows how many messages were lost.\n\nWhen both `si` and `ms` parameters are set to 0, OPC Publisher sends a message to IoT Hub as soon as data is available. This results in an average IoT Hub message size of just over 200 bytes. However, the advantage of this configuration is that OPC Publisher sends the data from the connected asset without delay. The number of lost messages will be high for use cases where a large amount of data must be published and hence this isn't recommended for these scenarios.\n"
  },
  {
    "path": "docs/opc-publisher/security.md",
    "content": "\n<a name=\"securityscheme\"></a>\n## Security\n\n<a name=\"oauth2\"></a>\n### oauth2\nImplicit oauth2 token flow.\n\n*Type* : oauth2  \n*Flow* : implicit\n"
  },
  {
    "path": "docs/opc-publisher/transports.md",
    "content": "# OPC Publisher Transports <!-- omit in toc -->\n\n[Home](./readme.md)\n\nOPC Publisher translates these northbound transport protocols to and from OPC UA with different levels of fidelity.\n\n> Except for the fully supported Azure IoT transport, other northbound transports here are currently provided in preview or experimental form and are by default disabled.\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Azure IoT Hub and Azure IoT Edge](#azure-iot-hub-and-azure-iot-edge)\n- [MQTT](#mqtt)\n- [Azure EventHub](#azure-eventhub)\n- [Dapr](#dapr)\n- [HTTP](#http)\n  - [Built-in HTTP API server](#built-in-http-api-server)\n  - [Publishing to a Webhook](#publishing-to-a-webhook)\n- [Other transports](#other-transports)\n  - [File System](#file-system)\n\n## Azure IoT Hub and Azure IoT Edge\n\nWhen deployed into Azure IoT Edge OPC Publisher is automatically configured and connects securely to the Edge Hub component. This is the officially supported configuration of OPC Publisher.\n\nIn addition to the automatic configuration during deployment in IoT Edge it is also possible to start the OPC Publisher with an Azure IoT Hub connection using the [command line](./commandline.md) argument `--ec` or by setting the `EdgeHubConnectionString` environment variable to the Azure IoT connection string.\n\n> Providing Azure IoT connection strings is supported for debugging only. Azure IoT connection strings contain access keys. You must ensure they are properly secured in your development environment.\n\nThe following table shows the supported features of the Azure IoT Edge and IoT Hub transport implementations inside OPC Publisher:\n\n| Feature                  | Supported  | Notes |\n| ------------------------ | ---------- | ----- |\n| State store              | Yes        | Using Device Twin desired and reported properties |\n| Configuration API        | Yes        | |\n| Twin and Discovery       | Yes        | |\n| Streaming (Browse/HDA)   | No         | |\n| Payload size limits      | 256 kb (*) | |\n| Telemetry publishing     | Yes        | |\n| Discovery Events         | Yes        | |\n| Operational Events       | Yes        | |\n| Message size limits      | 256 kb     | |\n\nIoT Edge is used as the default transport unless the Azure IoT related configuration cannot be found at startup time. By default all discovery and runtime events are sent through IoT Edge. Using the `-t` command line argument a different transport can be chosen to publish network messages with. The writer group (network message) transport can also be individually overridden for a writer group using the OPC Publisher [configuration schema's](./readme.md#configuration-schema) `WriterGroupTransport` attribute.\n\nDirect methods can be used to interact with the OPC Publisher configuration, discovery, and general (fka. OPC Twin) [API](./api.md). Direct method calls have a payload limit of 256 KB. High frequency interaction such as browsing through direct methods is naturally slow.\n\n## MQTT\n\n> This transport is in preview\n\nOPC Publisher 2.9 can be connected to an MQTT broker using MQTT 3.11 and MQTT 5 protocols. The connection information is provided in the form of a connection string through the [command line](./commandline.md) argument `--mqc`.\n\n> The MQTT broker connection string typically contains the user name and password to access the MQTT broker. Ensure that you properly secure this secret in your production environment.\n\nMQTT v5 supports RPC which allows a client to call the OPC Publisher [API](./api.md) over MQTT. Like in the case of [IoT Edge](#azure-iot-hub-and-azure-iot-edge), streaming HDA and browse results are not supported.\n\nOPC Publisher supports rich configuration of topic templates that are used when publishing data to MQTT broker, or to specify the root of the RPC server endpoint on which API requests are received. For more information how to configure MQTT topic trees see the [command line](./commandline.md) documentation for the `--rtt`, `--mtt`, `--ett`, `--ttt` and `--mdt` arguments.\n\nOPC Publisher will subscribe to the configured RPC server topic and handle method calls. The sub topic name is the name of the method. The response topic is specified as part of the MQTTv5 message header. Upon handling the method call the response payload will be published to the response topic. The request and response payload as well as the method name are defined in the API documentation.\n\nThe following table shows the supported features of the MQTT transport implementation inside OPC Publisher:\n\n| Feature                  | Supported  | Notes |\n| ------------------------ | ---------- | ----- |\n| State store              | No         | |\n| Configuration API        | Yes        | |\n| Twin and Discovery       | Yes        | |\n| Streaming (Browse/HDA)   | No         | |\n| Payload size limits      | 512 MB     | Actual limits depend on MQTT broker and can be configured using the connection string. |\n| Telemetry publishing     | Yes        | |\n| Discovery Events         | Yes        | Only if IoT Hub transport was not configured |\n| Operational Events       | Yes        | Only if IoT Hub transport was not configured |\n| Message size limits      | 512 MB     | Actual limits depend on MQTT broker and can be configured using the connection string. |\n\nTo configure MQTT as the default transport for telemetry publishing specify the `-t=Mqtt` command line argument. This default choice can be individually overridden for a writer group in the OPC Publisher [configuration](./readme.md#configuration-schema) using the `WriterGroupTransport` attribute.\n\nThe message schema can optionally be published to a schema topic, a schema topic template can be configured using the `--stt` [command line options](./commandline.md).  This feature is currently experimental.\n\n## Azure EventHub\n\n> This transport is in preview\n\nOPC Publisher can be configured to publish to [Azure EventHubs](https://dapr.io/). The event hub connectivity information can be configured in OPC Publisher using a connection string using the `--eh, --eventhubnamespaceconnectionstring` [command line options](./commandline.md). The connection string can be obtained from the Azure portal.\n\nThe following table shows the supported features of the Azure EventHub transport implementation inside OPC Publisher:\n\n| Feature                  | Supported  | Notes |\n| ------------------------ | ---------- | ----- |\n| State store              | No         | |\n| Configuration API        | No         | |\n| Twin and Discovery       | No         | |\n| Streaming (Browse/HDA)   | No         | |\n| Payload size limits      | No         | |\n| Telemetry publishing     | Yes        | |\n| Discovery Events         | Yes        | |\n| Operational Events       | Yes        | |\n| Message size limits      | Yes        | |\n\nIn addition, OPC Publisher can publish message schemas to the Azure schema registry (Experimental). The schema group can be selected using the `--sg, --schemagroup` [command line options](./commandline.md). Publishing to the schema registry requires OPC Publisher to authenticate using an Azure identity e.g., a managed service identity, user or service principal.\n\n## Dapr\n\n> This transport is experimental\n\nOPC Publisher can be configured to use [Dapr](https://dapr.io/) to publish to a supported [Dapr Pub Sub component](https://docs.dapr.io/reference/components-reference/supported-pubsub/) via a side car. To get started with Dapr follow the documentation on the [Dapr web site](https://docs.dapr.io/getting-started/).\n\nThe following table shows the supported features of the Dapr transport implementation inside OPC Publisher:\n\n| Feature                  | Supported  | Notes |\n| ------------------------ | ---------- | ----- |\n| State store              | Yes        | Only if IoT Hub transport was not configured |\n| Configuration API        | Yes        | Via [Dapr Service invoke](https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services/) of the [REST API](#http) |\n| Twin and Discovery       | Yes        | Via [Dapr Service invoke](https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services/) of the [REST API](#http) |\n| Streaming (Browse/HDA)   | Yes        | Via [Dapr Service invoke](https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services/) of the [REST API](#http) |\n| Payload size limits      | No         | |\n| Telemetry publishing     | Yes        | |\n| Discovery Events         | Yes        | Only if IoT Hub and MQTT transport were not configured |\n| Operational Events       | Yes        | Only if IoT Hub and MQTT transport were not configured |\n| Message size limits      | No (*)     | Actual limits depend on the chosen Pub Sub component. Limits can be configured using the connection string |\n\nWhether the Dapr transport is enabled is determined by whether the Dapr Pub Sub component and Api Token are configured. The Pub sub component name and Api token can be provided through the `-d` connection string using the [command line](./commandline.md). The Api Token is automatically provided by the Dapr runtime through the `DAPR_API_TOKEN` environment variable. Whether the component was configured in your Dapr environment is not validated.\n\nThe Dapr transport will add all user properties into the meta data of the published event. For retained messages the `retain` metadata variable is set to `true`.\n\nTo configure Dapr as the default transport for telemetry publishing specify the `-t=Dapr` command line argument. This default choice can be individually overridden for a writer group in the OPC Publisher [configuration](./readme.md#configuration-schema) using the `WriterGroupTransport` attribute.\n\n## HTTP\n\nThe HTTP transports is split into two parts: The [built in HTTP server](#built-in-http-api-server) and the [Http event publisher](#publishing-to-a-webhook) that can be configured to publish to another HTTP server (Web Hook). The following features are supported:\n\n| Feature                  | Supported  | Notes |\n| ------------------------ | ---------- | ----- |\n| State store              | No         | |\n| Configuration API        | Yes        | |\n| Twin and Discovery       | Yes        | |\n| Streaming (Browse/HDA)   | Yes        | |\n| Payload size limits      | No         | |\n| Telemetry publishing     | Yes        | |\n| Discovery Events         | Yes        | Only if IoT Hub, MQTT, and Dapr transports were not configured |\n| Operational Events       | Yes        | Only if IoT Hub, MQTT, and Dapr transports were not configured |\n| Message size limits      | No         | |\n\n### Built-in HTTP API server\n\n> This transport is in preview\n\nThe built in HTTP server eposes the OPC Publisher [API](./api.md). The API is secured by an API Key. The API key is generated at startup if it is not found inside the state store. The default state store is the IoT Hub device twin. Therefore the API key can be read from the device registry in IoT Hub. The API key must be provided in every request in the HTTP `Authorization` header using the `ApiKey <ApiKey>` scheme.\n\nThe HTTP server is exposed at port 80 (no encryption) and 443 (with encryption). The SSL channel is secured using a IoT Edge generated server certificate, just like Edge Hub's endpoints. The API can be further secured using a [Dapr](#dapr) side car providing mtls based security on top of the generic API surface.\n\nThe built in HTTP server can be disabled using the `--dh` [command line](./commandline.md) argument.\n\n> Never expose the OPC Publisher HTTP port outside of the Edge Gateway's docker network. The HTTP server should only be accessible by other docker containers.\n\n### Publishing to a Webhook\n\n> This transport is experimental\n\nThe other part of the HTTP support in OPC Publisher is the ability to publish network messages to a HTTP server (Web Hook). The web server information is provided on the [command line](./commandline.md) using the `-r` argument in the form of a connection string.\n\n> The HTTP Connection string can contain an API Key. Ensure that you properly secure the connection string.\n\n## Other transports\n\n### File System\n\n> This transport is experimental\n\nSometimes it is important for troubleshooting and debugging to dump the network messages to files. The File system transport can be used to reflect the network messages in their topic structure inside the file system. The file system Transport is intended for debugging only and not for production scenarios. You can configure a root folder on the bind mount of OPC Publisher using the `-o` [command line](./commandline.md) argument and inspect the results using a file viewer of choice.\n"
  },
  {
    "path": "docs/opc-publisher/troubleshooting.md",
    "content": "# Troubleshooting OPC Publisher <!-- omit in toc -->\n\n[Home](./readme.md)\n\nIn this document you find information about\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Debugging Telemetry data issues](#debugging-telemetry-data-issues)\n  - [Check OPC UA server](#check-opc-ua-server)\n  - [Check IoT Edge](#check-iot-edge)\n  - [Check OPC Publisher](#check-opc-publisher)\n    - [BadNodeIdUnknown](#badnodeidunknown)\n  - [Check EdgeHub](#check-edgehub)\n  - [Check data arriving in IoT Hub](#check-data-arriving-in-iot-hub)\n    - [IoT Hub Metrics](#iot-hub-metrics)\n      - [Use Azure IoT Explorer](#use-azure-iot-explorer)\n- [Restart the module](#restart-the-module)\n- [Analyzing network capture files](#analyzing-network-capture-files)\n  - [Netcap](#netcap)\n- [Session and Subscription diagnostics](#session-and-subscription-diagnostics)\n- [Limits and contributing factors](#limits-and-contributing-factors)\n- [Debugging Discovery](#debugging-discovery)\n\n## Debugging Telemetry data issues\n\nFollow the data from the source and check where it stops:\n\n1. Check the [OPC UA server](#check-opc-ua-server)\n1. Check [IoT Edge](#check-iot-edge)\n1. Check [OPC Publisher](#check-opc-publisher)\n1. Check [EdgeHub](#check-edgehub)\n1. Check data arriving in [IoT Hub](#check-data-arriving-in-iot-hub)\n1. Finally check your application that is consuming from IoT Hub is running and operating correctly.\n\n### Check OPC UA server\n\nMicrosoft OPC Publisher connects to OPC UA servers built into machines or industrial systems via OPC UA client/server. There is an OPC UA client built into the OPC Publisher Edge module. OPC UA Client/server uses an OPC UA Secure Channel to secure this connection. The OPC UA Secure Channel in turn uses X.509 certificates to establish trust between the client and the server. This is done through mutual authentication, i.e. the certificates must be \"accepted\" (or trusted) by both the client and the server. To simplify setup, the OPC Publisher Edge module has a setting enabled to automatically accept all server certificates (\"--aa\" in the case of the OPC Publisher, see example below).\n\nHowever, the biggest hurdle most OT admins need to overcome when deploying OPC Publisher is to accept the module's X.509 certificate in the OPC UA server the platform tries to connect to. There is usually a configuration tool that comes with the built-in OPC UA server where certificates can be trusted. Here is a screenshot of this dialog from PTC’s KepServerEx industrial connectivity software configuration tool:\n\n![OPC UA Configuration](./media/image26.png)\n\nIn the dialog above, it can be seen that the certificate **Microsoft.Azure.IIoT** is trusted by Kepware `KepServerEx`. This is only done once and then the data can be exchanged between the OPC UA server (in this case `KepServerEx`) and OPC Publisher Edge module.\n\nThe OPC UA certificate used by the OPC Publisher Edge module is a self-signed certificates generated when the modules start up when a certificate doesn’t exist. However, each time a Docker container starts up, all previous state of the container is removed. To avoid re-establishing trust by each OPC UA server on-premises after each restart the certificates can be persisted to the local filesystem of the host (where IoT Edge as well as the Docker containers `EdgeHub` and `EdgeAgent` and of course OPC Publisher module runs on). To do this, the filesystem directory within the container needs to be mapped to an existing filesystem directory on the host through a [bind mount](https://docs.docker.com/storage/bind-mounts). See [here](readme.md) for more information on how to accomplish this.\n\nAnother feature of OPC UA that is often turned off by OT administrators is user authentication. User authentication is another authentication layer on top of the client/server authentication described above. Most OPC UA servers only support anonymous user authentication but some support user authentication based on username and password. If this is the case, a username and password must be supplied to the OPC Publisher’s API or set in the `publishednodes.json` file (properties `OpcAuthenticationUsername` and `OpcAuthenticationPassword`).\n\n### Check IoT Edge\n\nTo troubleshoot an IoT Edge device run the following commands in a terminal session on the IoT Edge device or over a remote SSH session:\n\n- `sudo iotedge check` to check the state of the installation.\n- `systemctl status iotedge` to view the status of the IoT Edge security manager.\n- `systemctl restart iotedge` to restart the IoT Edge Security Daemon.\n- `iotedge logs <publisher container name>` to check the logs.\n- `iotedge restart <publisher container name>` to restart OPC Publisher.\n- `iotedge restart edgeAgent && iotedge restart edgeHub` to restart the IoT Edge runtime containers.\n- `docker stats` to retrieve statistics from the docker runtime.\n\nFor more detailed description on how to troubleshoot IoT Edge device, please refer to [here](https://docs.microsoft.com/azure/iot-edge/troubleshoot-common-errors) and [here](https://docs.microsoft.com/azure/iot-edge/troubleshoot).\n\nFor a complete overview of all production deployment settings for IoT Edge, see [here](https://docs.microsoft.com/azure/iot-edge/production-checklist).\n\n### Check OPC Publisher\n\n[Retrieve the logs](./observability.md) from publisher and examine.\n\nIf you disabled console output of the logs and are not monitoring metrics, enable diagnostics output to the console using the `--di` [command line options](./commandline.md). Using the logs:\n\n- Observe data throughput and make sure that the data changes over time are as you are expecting.\n- Check whether all endpoints are connected. This can be seen during session establishment and in the periodic diagnostic logs.\n- When OPC Publisher cannot subscribe to a node in the OPC UA server address space the number of failing nodes are logged in the metrics. To understand what happened you need to look at the logs that are emitted during connect.\n- The diagnostic output and metrics include an indicator of how many publishing requests are in flight between publisher and the OPC UA server and how many of these were returned with errors which reflects the health of the session and subscriptions in the writer group.\n- Observe the keep alive notification count in the periodic diagnostics output. If it counts up periodically it shows that while the connection and subscription is active, the server is not providing any data to OPC Publisher.  The keep alive is sent by the server after `(keep alive count) * (publishing interval of subscription)` time has past.\n- Check how many data points were logged as dropped or whether data is queued up in the internal pipeline of the publisher (buffering, encoder, sending).\n\nTo log notifications received on a subscription to the log you can use the `--ln` switch.\n\nTo increase the log level and see debug logs use the `--ll Debug` switch.\n\nTo log informational an debug messages of the OPC UA stack to the log, use the `--sl` switch.\n\nTo diagnose throughput issues see the [limits and monitoring](#limits-and-contributing-factors) section.\n\n#### BadNodeIdUnknown\n\nA typical error shown in the log is `BadNodeIdUnknown` which means the server could not resolve the node id to a node in its address space to subscribe to.\n\nReasons why the node id specified in the configuration cannot be resolved inside the server during connect can be as follows:\n\n- The Node Id string in the configuration is incorrect, e.g., escaping of characters, extra spaces, missing semicolon.\n- Use an OPC UA Client like UA Expert or other to connect to the server with exactly the same security configuration (same user name, encryption settings, etc. that OPC Publisher uses, if you do not know, default to SecurityMode = none and anonymous user).  Find the node by browsing and copy the node id exactly from the tool.\n- If it still does not work, please send the node id string.\n- The namespace id in the node id has changed from last time.  Namespace ids are typically always static, but that is not guaranteed by the spec, quite the opposite. se the nsu= format of node id (expanded node id) to specify the namespace string instead of the id then.\n- The node is a dynamic node and comes and goes. You can configure OPC Publisher to re-evaluate periodically.\n- The node is only accessible to a particular user or user with role or on a particular endpoint with a special security profile.  If we know what that is, then I can make suggestion what to do next, but might require upgrading to 2.9\n\n### Check EdgeHub\n\nTo verify that a module or device has connectivity with the IoT Hub service, Microsoft provides a tool that is described here: <https://docs.microsoft.com/azure/iot-hub/tutorial-connectivity#check-device-to-cloud-connectivity>\n\nIf the `edgeHub` module fails to start, you may see a message like this in the logs:\n\n```bash\nOne or more errors occurred.\n\n(Docker API responded with status code=InternalServerError, response=\n\n{\\\\\"message\\\\\":\\\\\"driver failed programming external connectivity on endpoint edgeHub (6a82e5e994bab5187939049684fb64efe07606d2bb8a4cc5655b2a9bad5f8c80):\n\nError starting userland proxy: Bind for 0.0.0.0:443 failed: port is already allocated\\\\\"}\\\\n)\n```\n\nOr\n\n```powershell\ninfo: edgelet_docker::runtime -- Starting module edgeHub...\n\nwarn: edgelet_utils::logging -- Could not start module edgeHub\n\nwarn: edgelet_utils::logging -- caused by: failed to create endpoint edgeHub on network nat: hnsCall failed in Win32:\n\nThe process cannot access the file because it is being used by another process. (0x20)\n```\n\nTo find the root cause and resolution, please refer [here](https://docs.microsoft.com/azure/iot-edge/troubleshoot-common-errors).\n\n### Check data arriving in IoT Hub\n\n#### IoT Hub Metrics\n\nTo verify that the data is arriving in IoT Hub the Metrics of the IoT Hub can be checked. Particularly, select Metrics from the pane on the left side of your Azure IoT Hub resource page in the Azure Portal and select the **Telemetry messages sent** from the **IoT Hub standard metrics** namespace. This page gives an overview on the number of IoT Hub messages that have been sent from the OPC Publisher and from other custom edge modules. Please keep in mind that each of those messages have a size of up to 256KB. If buffering is enabled for the OPC Publisher module, then each IoT Hub message may contain several batches of data changes, where each batch contains a set of OPC value changes.\n\n![IoT Hub](./media/image31.png)\n\nAnother option to troubleshoot the issues in IoT Hub is by checking the \"_Diagnose and solve problems\"_ section of the IoT Hub resource page on the Azure Portal as shown below:\n\n![IoT Hub](./media/image32.png)\n\nMoreover, enabling the diagnostic settings provides more data to troubleshoot and how to choose where to store that data is shown below:\n\n![IoT Hub](./media/image33.png)\n\n##### Use Azure IoT Explorer\n\nAs a next step the Azure IoT Explorer can be used to validate that messages for a particular Publisher job are delivered to IoT Hub. To install Azure IoT Explorer, please follow the steps here:\n\n- [Install and use Azure IoT Explorer](https://docs.microsoft.com/azure/iot-pnp/howto-use-iot-explorer)\n\nTo view the telemetry of OPC Publisher in Azure IoT Explorer, go to its Telemetry and start monitoring telemetry from that publisher module of choice. If you do not receive any messages for that device after a long period since starting monitoring, then there is a problem which causes telemetry messages not to be delivered to IoT Hub.\n\n![Azure IoT Explorer](./media/image34.png)\n\n## Restart the module\n\nTo restart a module, the `iotedge` command line utility can be used as well. The command is:\n\n​```bash\niotedge restart <modulename>\n​​```\n\nThe name of the module can be retrieved via\n\n​```bash\niotedge list\n​​```\n\nYou can also troubleshoot the OPC Publisher module remotely through the Azure Portal. Select the module inside the respective IoT Edge device in the IoT Edge blade and click on the Troubleshooting button to see logs and restart the module remotely.\n\n## Analyzing network capture files\n\nThe issue might be between the OPC Publisher OPC UA client and the OPC UA server you are using. A network capture provides the definitive answer as to where the issue lies. To capture network traffic you can use [Wireshark](https://www.wireshark.org/) or [tshark](https://tshark.dev/setup/install/) (aka. command line wireshark) and capture a .pcap file for analysis.  An example of how to capture network traces in a docker environment can be found [here](../../deploy/docker/with-pcap-capture.yaml). To analyze OPC UA traffic, you must load the .pcap or .pcapng file you captured in Wireshark.\n\nFollow [these instructions](https://opcconnect.opcfoundation.org/2017/02/analyzing-opc-ua-communications-with-wireshark/#:~:text=Wireshark%20has%20a%20built-in%20filter%20for%20OPC%20UA%2C,fairly%20easy%20to%20capture%20and%20analyze%20the%20conversation.) to visualize the OPC UA traffic between OPC Publisher and your OPC UA server.\n\nIf your connection to the OPC UA server is encrypted (using security) you must use Wireshark 4.3 (not the stable version!). You will also need to capture the client and server keys. You can start OPC Publisher with the `-ksf` [command line argument](./commandline.md), providing an optional folder path that can be accessed after running OPC Publisher (volume mount). The folder is structured like this:\n\n![Key Set Log Folder](./media/keyset.png)\n\nYou can open the `log.md` markdown file in the `opcua_debug` folder and find the connection and session you want to decrypt.\n\n![Key Set Log File](./media/keyset1.png)\n\nThe log file shows the remote and local endpoints as well as a summary of the connection configuration that was used to connect OPC Publisher. Each keyset log can be found in a subfolder that starts with the port number, because the port number needs to be configured in the OPC UA protocol page in Wireshark.\n\n![Wireshark configuration](./media/keyset2.png)\n\nOnce you have found the right folder, load the `opcua_debug.txt` file in it using the protocol page, then save and Wireshark will be able to decrypt traffic.\n\n![Wireshark Analysis](./media/keyset3.png)\n\n> IMPORTANT: While the keys that are logged are scoped to the connection and cannot be re-used, it still presents a security risk, therefore, ensure to properly delete the `opcua_debug` folder and all its content when you are done. Do not use the feature in production.\n\n### Netcap\n\nTo simplify capturing network traces you can try out the [Netcap](../../samples/Netcap/readme.md) sample tool. It enables you to capture network traffic for an OPC Publisher module deployed to Azure IoT Edge.\n\n## Session and Subscription diagnostics\n\nTo enable client diagnostics output to the console use the `--di` [command line options](./commandline.md).\n\nThe OPC Publisher can be configured to dump a the server diagnostics information for a session (connection) at an interval. The diagnostic information contains the session diagnostics and subscription diagnostics the server maintains provided it is enabled on the server. The OPC Publisher tries to enable the diagnostics information if it is disabled.\n\nUse it to see how the server sees the OPC Publisher and identify issues like leaked subscriptions (not cleaned up and causing resource exhaustion) or monitored items not being reflected on the server's view of the subscription.\n\nTo enable a connection to dump its diagnostics, add a `\"DumpConnectionDiagnostics\": true` entry into the JSON configuration entry you want to diagnose.\n\n> Dumping diagnostics info is additional heavy load on the server. Use only sparingly, temporarily, and as a diagnostics tool only.\n\n## Limits and contributing factors\n\nIoT Edge runs on various distributions of Linux and leverages Docker containers for all workloads, including the built-in IoT Edge modules `edgeAgent` and `edgeHub`. Docker has settings for the maximum host resources that each container can consume. These can be displayed by the Docker command \"stats\" (run \"docker stats\" from the terminal on the gateway host):\n\n![Docker stats](./media/image9.png)\n\nFurthermore, the speed at which OPC UA telemetry messages can be sent to the cloud is dependent on the network resources available between the IoT Edge gateway and the Azure cloud data center. Here is a high-level data flow diagram:\n\n![DataFlow](./media/image10.png)\n\nCustomers often require \"at least once\" delivery of each telemetry message to the cloud, so Quality of Service - QoS must be enabled, in this case. As flow control is a big part of QoS, this significantly increases latency of each message delivered to the cloud. This is countered by packing as many telemetry \"tags\" as possible into a single message, called \"batching.\" Using batching, between 300 to 475 telemetry tags can be packaged into a single IoT Hub message of maximum size (256KB). The reason for the range stems from the fact that each JSON encoded telemetry tag is not always the same length. It is dependent on tag names, the tag types and OPC UA server URI. Such an IoT Hub message takes about 150 ms to be delivered from Edge Hub to IoT Hub on a typical DSL connection and is much faster when Azure Express Route is leveraged. For a list of practical latency figures, please see [here](https://docs.microsoft.com/azure/expressroute/expressroute-troubleshooting-network-performance#latencybandwidth-results).\n\nThe calculation for the maximum end-to-end latency is:\n\n![Latency](./media/image11.png)\n\nFor example, for 10,000 telemetry tags per second, the maximum latency allowed is 30 ms:\n\n![Latency](./media/image12.png)\n\nLatency limitations can be mitigated by deploying several parallel IoT Edge gateways, i.e. for a typical DSL Internet connection with 150 ms latency, **up to 5 (150/30) parallel IoT Edge gateways** must be deployed in order to achieve 10,000 telemetry tags per second.\n\nBandwidth is another important constraint, although usually more straightforward to address than latency.\n\nThe calculation for bandwidth is:\n\n![Bandwidth](./media/image13.png)\n\nFor example, for 10,000 telemetry tags per second, the minimum bandwidth required is 69.91 Mbps:\n\n![Bandwidth](./media/image14.png)\n\nBandwidth limitations can be mitigated through a larger Internet connection (or a dedicated line like Express Route).\n\nPlease also note that this ignores overhead of other consumers of bandwidth on the same connection and bandwidth fluctuations.\n\nIncreasing the number of telemetry tags sent in a single message can also be achieved through picking a binary or compressed telemetry encoding. This is possible by specifying a different telemetry format or encoding during deployment of the system. The open standard OPC UA PubSub telemetry format, which Azure Industrial IoT leverages, supports both JSON and binary encodings. JSON has the advantage that many cloud databases can parse the data directly without the need for a separate telemetry processor being hosted in front of the database (which needs to be built, deployed, and maintained). A telemetry processor translates the telemetry message back to JSON.\n\n## Debugging Discovery\n\nTo be able to perform active network scanning on a network interface of the host device you must attach OPC Publisher to the host network using the docker create options. Make sure to validate the host network is available:\n\n```bash\ndocker network ls\n    NETWORK ID          NAME                DRIVER              SCOPE\n    beceb3bd61c4        azure-iot-edge      bridge              local\n    97eccb2b9f82        bridge              bridge              local\n    758d949c5343        host                host                local\n    72fb3597ef74        none                null                local\n```\n\nUpdate the create options to attach the OPC Publisher module to the host network:\n\n```json\n\n```\n"
  },
  {
    "path": "docs/readme.md",
    "content": "# Azure Industrial IoT <!-- omit in toc -->\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n> This documentation applies to version 2.9\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Features](#features)\n- [Use Cases](#use-cases)\n- [What is OPC UA?](#what-is-opc-ua)\n  - [Why did Microsoft choose OPC UA as Industrial IoT Protocol?](#why-did-microsoft-choose-opc-ua-as-industrial-iot-protocol)\n  - [How can I learn more?](#how-can-i-learn-more)\n- [Next steps](#next-steps)\n\n## Features\n\nAzure [OPC Publisher](./opc-publisher/readme.md) allows plant operators to discover [OPC UA](#what-is-opc-ua) enabled servers in a factory network and register them in Azure IoT Hub. Operations personnel can subscribe to and react to events on the factory floor from anywhere in the world. The APIs mirror the [OPC UA](#what-is-opc-ua) services and are secured through IoT Hub or optionally using OAUTH authentication and authorization backed by Azure Active Directory (AAD). This enables your applications to browse server address spaces or read/write variables and execute methods using IoT Hub, MQTT or HTTPS with simple JSON payloads.\n\nThe following diagram shows how the OPC Publisher and optional REST Api integrate with Azure IoT Hub, Azure IoT Edge and other Azure services:\n\n![Architecture](./media/architecture.png)\n\nThe [OPC Publisher API](./opc-publisher/readme.md) can be used with any programming language through its exposed Open API specification (Swagger). This means when integrating OPC UA into cloud management solutions, developers are free to choose technology that matches their skills, interests, and architecture choices. For example, a full stack web developer who develops an application for an alarm and event dashboard can write logic to respond to events in JavaScript or TypeScript without ramping up on a OPC UA SDK, C, C++, Java or C#.\n\n## Use Cases\n\nOPC Publisher has fully embraced openness (an open platform, open source, open industrial standards and an open data model is used). Specifically, we leverage Azure's managed Platform as a Service (PaaS) offering, open-source software licensed via MIT license, open international standards for communication (OPC UA, AMQP, MQTT, HTTP) and interfaces (Open API) and open industrial data models (OPC UA) on the edge and in the cloud.\n\nOPC Publisher covers industrial connectivity of shop floor assets (including discovery of OPC UA-enabled assets), normalizes their data into OPC UA format and transmits asset telemetry data to Azure in OPC UA PubSub format. There, it stores the telemetry data in a cloud database. In addition, the platform enables secure access to the shop floor assets via OPC UA from the cloud. Device management capabilities (including security configuration) is also built in. The OPC UA functionality has been built using Docker container technology for easy deployment and management. For non-OPC UA-enabled assets, we have partnered with the leading industrial connectivity providers and helped them port their OPC UA adapter software to Azure IoT Edge. These adapters are available in the [Azure Marketplace](https://azuremarketplace.microsoft.com/marketplace/apps/category/internet-of-things?page=1&subcategories=iot-edge-modules).\n\n## What is OPC UA?\n\nOPC Unified Architecture (UA), released in 2008, is a platform-independent, service-oriented interoperability standard. OPC UA is used by various industrial systems and devices such as industry PCs, PLCs, and sensors. OPC UA integrates the functionality of the OPC Classic specifications into one extensible framework with built-in security. It is a standard that is driven by the OPC Foundation.\n\nThe [OPC Foundation](https://opcfoundation.org/) is a not-for-profit organization with more than 440 members. The goal of the organization is to use OPC specifications to facilitate multi-vendor, multi-platform, secure and reliable interoperability through:\n\n- Infrastructure\n- Specifications\n- Technology\n- Processes\n\n### Why did Microsoft choose OPC UA as Industrial IoT Protocol?\n\nMicrosoft chose OPC UA because it is an open, non-proprietary, platform independent, industry-recognized, and proven standard. It is a requirement for Industry 4.0 (RAMI4.0) reference architecture solutions ensuring interoperability between a broad set of manufacturing processes and equipment. Microsoft sees demand from its customers to build Industry 4.0 solutions.\n\nSupport for OPC UA helps lower the barrier for customers to achieve their goals and provides immediate business value to them.\n\n### How can I learn more?\n\n- Visit the OPC Foundation [Website](https://opcfoundation.org/).\n- Browse version [1.04 of the OPC UA specification](https://reference.opcfoundation.org/v104/).\n\n## Next steps\n\n- [Learn more about OPC Publisher](./opc-publisher/readme.md)\n- [Release announcements](./release-announcement.md)\n"
  },
  {
    "path": "docs/release-announcement.md",
    "content": "# Release announcement <!-- omit in toc -->\n\n## Table Of Contents <!-- omit in toc -->\n\n- [Azure Industrial IoT OPC Publisher 2.9.15](#azure-industrial-iot-opc-publisher-2915)\n  - [Breaking changes](#breaking-changes)\n  - [Changes in 2.9.15](#changes-in-2915)\n- [Azure Industrial IoT OPC Publisher 2.9.14](#azure-industrial-iot-opc-publisher-2914)\n  - [Changes in 2.9.14](#changes-in-2914)\n- [Azure Industrial IoT OPC Publisher 2.9.13](#azure-industrial-iot-opc-publisher-2913)\n  - [Changes in 2.9.13](#changes-in-2913)\n- [Azure Industrial IoT OPC Publisher 2.9.12](#azure-industrial-iot-opc-publisher-2912)\n  - [Significant changes made in 2.9.12](#significant-changes-made-in-2912)\n  - [Other changes in 2.9.12](#other-changes-in-2912)\n- [Azure Industrial IoT OPC Publisher 2.9.11](#azure-industrial-iot-opc-publisher-2911)\n  - [Changes in 2.9.11](#changes-in-2911)\n- [Azure Industrial IoT OPC Publisher 2.9.10](#azure-industrial-iot-opc-publisher-2910)\n  - [Changes in 2.9.10](#changes-in-2910)\n- [Azure Industrial IoT OPC Publisher 2.9.9](#azure-industrial-iot-opc-publisher-299)\n  - [Changes in 2.9.9](#changes-in-299)\n- [Azure Industrial IoT OPC Publisher 2.9.8](#azure-industrial-iot-opc-publisher-298)\n  - [Changes in 2.9.8](#changes-in-298)\n- [Azure Industrial IoT OPC Publisher 2.9.7](#azure-industrial-iot-opc-publisher-297)\n  - [Changes in 2.9.7](#changes-in-297)\n- [Azure Industrial IoT OPC Publisher 2.9.6](#azure-industrial-iot-opc-publisher-296)\n  - [Changes in 2.9.6](#changes-in-296)\n- [Azure Industrial IoT OPC Publisher 2.9.5](#azure-industrial-iot-opc-publisher-295)\n  - [Changes in 2.9.5](#changes-in-295)\n- [Azure Industrial IoT OPC Publisher 2.9.4](#azure-industrial-iot-opc-publisher-294)\n  - [Breaking changes in 2.9.4](#breaking-changes-in-294)\n  - [Changes in 2.9.4](#changes-in-294)\n- [Azure Industrial IoT OPC Publisher 2.9.3](#azure-industrial-iot-opc-publisher-293)\n  - [Breaking changes in 2.9.3](#breaking-changes-in-293)\n  - [New features in 2.9.3](#new-features-in-293)\n  - [Bug fixes in 2.9.3](#bug-fixes-in-293)\n- [Azure Industrial IoT OPC Publisher 2.9.2](#azure-industrial-iot-opc-publisher-292)\n  - [Changes in 2.9.2](#changes-in-292)\n- [Azure Industrial IoT OPC Publisher 2.9.1](#azure-industrial-iot-opc-publisher-291)\n  - [Changes in 2.9.1](#changes-in-291)\n- [Azure Industrial IoT OPC Publisher 2.9.0](#azure-industrial-iot-opc-publisher-290)\n  - [Changes in 2.9.0](#changes-in-290)\n- [Azure Industrial IoT OPC Publisher 2.9.0 Community Preview 4](#azure-industrial-iot-opc-publisher-290-community-preview-4)\n  - [Changes in 2.9.0 Preview 4](#changes-in-290-preview-4)\n- [Azure Industrial IoT OPC Publisher 2.9.0 Community Preview 3](#azure-industrial-iot-opc-publisher-290-community-preview-3)\n  - [Changes in 2.9.0 Preview 3](#changes-in-290-preview-3)\n- [Azure Industrial IoT OPC Publisher 2.9.0 Community Preview 2](#azure-industrial-iot-opc-publisher-290-community-preview-2)\n  - [Changes in 2.9.0 Preview 2](#changes-in-290-preview-2)\n- [Azure Industrial IoT OPC Publisher 2.9.0 Community Preview 1](#azure-industrial-iot-opc-publisher-290-community-preview-1)\n  - [Changes in 2.9.0 Preview 1](#changes-in-290-preview-1)\n- [Azure Industrial IoT Platform Release 2.8.6](#azure-industrial-iot-platform-release-286)\n  - [Changes in 2.8.6](#changes-in-286)\n- [Azure Industrial IoT Platform Release 2.8.5](#azure-industrial-iot-platform-release-285)\n  - [Changes in 2.8.5](#changes-in-285)\n- [Azure Industrial IoT Platform Release 2.8.4](#azure-industrial-iot-platform-release-284)\n  - [IMPORTANT - PLEASE READ](#important---please-read)\n  - [Changes in 2.8.4](#changes-in-284)\n  - [Known issues](#known-issues)\n- [Azure Industrial IoT Platform Release 2.8.3](#azure-industrial-iot-platform-release-283)\n  - [Security related fixes in 2.8.3](#security-related-fixes-in-283)\n  - [Fundamentals related fixes in 2.8.3](#fundamentals-related-fixes-in-283)\n  - [Bug fixes in 2.8.3](#bug-fixes-in-283)\n- [Azure Industrial IoT Platform Release 2.8.2](#azure-industrial-iot-platform-release-282)\n  - [Fundamentals related fixes in 2.8.2](#fundamentals-related-fixes-in-282)\n  - [Backwards Compatibility Notes for release 2.8.2](#backwards-compatibility-notes-for-release-282)\n- [Azure Industrial IoT Platform Release 2.8.1](#azure-industrial-iot-platform-release-281)\n- [Azure Industrial IoT Platform Release 2.8](#azure-industrial-iot-platform-release-28)\n\n## Azure Industrial IoT OPC Publisher 2.9.15\n\nWe are pleased to announce the release of version 2.9.15 of OPC Publisher. This monthly patch release comes with several bug and security fixes and is the latest supported release. Older releases below are no longer supported.\n\n### Breaking changes\n\n- The companion web app and API are no longer supported or included (#2370)\n- OPC Publisher container by default runs root-less (non-root user). To run as root, start the OPC Publisher using the --user root command line option. (#2428)\n\n### Changes in 2.9.15\n\n- call of ISA95 JobOrderReceiver \"Store\" method fails decoding \"JobOrderParameters\" \"ISA95ParameterDataType\" (2424)\n- OPC Publisher does not re-establish connection to OPC UA server, if the OPC UA server is restarted. (#2416)\n- Updates to all dependencies (.net and OPC UA stack)\n\n## Azure Industrial IoT OPC Publisher 2.9.14\n\nWe are pleased to announce the release of version 2.9.14 This monthly patch release updates dependencies to fix security vulnerabilities and bugs in them and is the latest supported release. Older releases below are no longer supported.\n\n### Changes in 2.9.14\n\n- Updates to all dependencies (.net 9.0.5 and OPC UA stack)\n- Additional diagnostic instruments to monitor session keep alive counters \n\n## Azure Industrial IoT OPC Publisher 2.9.13\n\nWe are pleased to announce the release of version 2.9.13 of OPC Publisher and the companion web api service. This monthly patch release comes with several bug and security fixes and is the latest supported release. Older releases below are no longer supported.\n\n### Changes in 2.9.13\n\n- Resiliency fixes based on new manual chaos testing.\n  - Recover a dead subscription that is missing keep alive results for the configured keep alive and life time count.\n  - Recover sessions that fail to be established due to various errors including session closed unexpectedly in server.\n- Fix typo in DefaultDataChangeTrigger environment variable name (breaking change) (#2393)\n- Events with arrays of complex data types are not encoded at all (#2381)\n- Updates to all dependencies (.net 9.0.4 and OPC UA stack)\n\n## Azure Industrial IoT OPC Publisher 2.9.12\n\nWe are pleased to announce the release of version 2.9.12 of OPC Publisher and the companion web api service. This monthly patch release comes with several bug and security fixes and is the latest supported release. Older releases below are no longer supported.\n\n### Significant changes made in 2.9.12\n\nThis release makes significant changes under the hood of OPC Publisher. These changes include:\n\n- The 1:1 relationship between writers and session/subscription has been removed. Instead the concept of a virtual subscription that bundles multiple writers was added to remove load on some servers that only allow a small number of subscriptions. (#2295)\n- Instead of trying to reconnect to the old session in the server, the OPC UA client will now always reconnect a new session and recreate all subscriptions if the secure channel drops (#2368, #2373, #2361, #2344)\n- Update to .net 9 and update of all packages to latest version.  This includes update to MQTT.net v5.\n- New preview feature to initialize publisher from a init file that automates the OPC Publisher config api. This enables for example\n  - Publishing all nodes of a connected OPC server (#2354, #2341)\n  - Support subscribing to Nodes where NodeClass is Object (recursively to all HasComponent variables underneath) (#1320)\n\n### Other changes in 2.9.12\n\n- Fix a NullReferenceException when Cyclic read monitored items are recreated/connected or when heartbeat notifications are to be sent while disconnected (#2367)\n- And related - ConditionHandling stops working after some time (#2288)\n- Extension Fields are now part of all messages (#2360)\n- Fix changing entry from SignAndEncrypt to None fails to connect until restarted (#2351)\n- Fix Kepserver restart leads to ArgumentException: Timeout must be greater than zero. (#2346)\n- Configuring MaxPublishRequests via command line and environment variable now works correctly (#2289)\n- Enable Response Compression in Publisher Rest API (Accept-Encoding gzip) (#2350)\n- Allow setting security policy only using the anchor name (e.g. \"None\"), not the entire url (#2337)\n- Ability to specify cache age for cyclic reads (#2328)\n- Add Endpoint url and application uri to PubSub messages (#2329)\n- New Heartbeat behavior to send values periodically but not send freshly received values. (#2327)\n- Support close and commit instead of just close when closing a file using the file API (#2322)\n\n## Azure Industrial IoT OPC Publisher 2.9.11\n\nWe are pleased to announce the release of version 2.9.11 of OPC Publisher and the companion web api service. This monthly patch release comes with several bug and security fixes and is the latest supported release. Older releases below are no longer supported.\n\n### Changes in 2.9.11\n\n- Fixes an issue when using amqp as transport combined with batching, some batches are not sent successfully (#2321)\n- Dependency updates to fix critical vulnerabilities as well as bugs such as proper support for cgroup v2 is used bug (#2261)\n- Resiliency and fixes of critical bugs in reconnect scenarios:\n  - Fix for \"Item was disposed or moved to another subscription\" (#2317)\n  - Fix for heartbeat and condition timers stopping and not recovering\n  - Subscriptions behavior now extends to subscriptions whose lifetime counter has expired (default: reset) (#2301)\n- Fix an issue with a runaway Heartbeat timer causing publishing wrong values at wrong time (#2313)\n- API addition allowing selecting which OPC Publisher to use for discovery feature request (#2302)\n\n## Azure Industrial IoT OPC Publisher 2.9.10\n\nWe are pleased to announce the release of version 2.9.10 of OPC Publisher and the companion web api service. This monthly patch release comes with several bug and security fixes and is the latest supported release. Older releases below are no longer supported.\n\n### Changes in 2.9.10\n\n- Update OPC UA .net stack to the latest 1.05 version and move forward other dependencies\n- API to get the server session, channel and subscription diagnostics for connections (#2303)\n- New --aq command line option to calculate queue sizes automatically from publishing interval and sampling interval (#2300)\n- New --ipi option to ignore publishing intervals in JSON configuration and use the default configured with --op (#2299)\n- New --spw option to configure creating a session per dataset writer (#2298)\n- Provide example and documentation for Browse Path definition. Allow browse path without node id in configuration (#2296)\n- New defaults for Keep alive counter and lifetime counters set to 0 to let server decide (#2294)\n- Updates and additions to writer API to manage writers and writer groups with data set fields (#2257, #2285, #2269, #2293, #2269)\n- Fix setting Heartbeat Interval with API is using milliseconds instead of seconds (#2292)\n- Fix issue that after calling reset API (/v2/reset) publisher stops receiving data changes (#2291)\n- Fix bug where ConditionHandling and Heartbeat timers stop working after reconnects (#2288)\n- Fix bug where Complex types are not decoded in initial messages (#2281)\n- Allow configuring message TTL on DatasetWriterGroup level (#2280)\n- Add ability to set Timestamp in UserProperties of message when using MQTT Transport (#2277)\n- JSON Configuration now provides the ability to set a (default) sampling interval for a writer (#2271)\n- Show log message when namespace table changes inside a client and between session reconnects (#2263)\n- Return ProblemDetails JSON for all error responses (#2201)\n- Fix incompatibility when generating SDK from openapi.json using Autorest (#2199)\n\n## Azure Industrial IoT OPC Publisher 2.9.9\n\nWe are pleased to announce the release of version 2.9.9 of OPC Publisher and the companion web api service. This release comes with several bug and security fixes and is the latest supported release. We recommend strongly to update from 2.9.8 due to several security fixes and overall instability in 2.9.8 and before in reconnect situations.\n\n### Changes in 2.9.9\n\n- Update OPC UA .net stack to the latest 1.05 version and move forward other dependencies\n- Monitored item state is not properly cleaned up after a hard reconnect which leads to heartbeat timers still being alive.\n- Allow configuring a watchdog for monitored items and set behavior when watchdog expires (#2164)\n- Limit number of publish requests to 10, allow override using command line argument (#2215)\n- Fix issue where count of bad and good monitored items is incorrect (#2202)\n- Return better error messages in responses (#2195)\n- Fix issue where publisher stops respecting reconnect period after initial successful connection (#2189)\n- Added sample to show using NodeRead to read attributes (#2226)\n- New command line option to read configuration from first certificate found in own folder addresses several backward compatibility breaks when migrating between OPCPublisher versions (#2166)\n- Added call timeouts that can be overridden in request header and automatically cancel after timeout (#2203, #2219, #2213)\n- Fix an issue where linger does not work when reference continuation token between calls is the same (#2227)\n- Add a command line option to disable runtime metrics (#2200, #2197)\n- Added ability to write encoded messages to stdout/stderr for debugging (#2259)\n- Add ability to disable resource monitoring via command line option to work around any incompatibility with host systems (related to #2261)\n- Improved documentation.\n\n## Azure Industrial IoT OPC Publisher 2.9.8\n\nWe are pleased to announce the release of version 2.9.8 of OPC Publisher and the companion web api service. This release comes with several bug and security fixes and is the latest supported release.\n\n### Changes in 2.9.8\n\n- Update OPC UA .net stack to the latest 1.05 version and move forward other dependencies\n- Telemetry messages are sent with non default (0) ttl now to support DAPR >= 1.13 (#2243)\n- Elevation property in request header does work now when service calls are sent using edge API (#2218)\n- Add more Info to Logs in case of publishing errors, e.g. \"Too many publish request error\" (#2229)\n- New Security mode \"NotNone\" reflecting the legacy \"UseSecurity\":true setting in nodes. \"Best\" (any) is persisting after Opc Publisher is restarted (#2228)\n- Latest OPC UA .net stack fixes \"CRL with zero revoked certificates fails to be decoded (#2214)\n- Enable the definition of the GRPC endpoint host name for DAPR (#2235)\n- Diagnostic info API returns incorrect information (#2230)\n- Make TransferSubscriptionsOnReconnect configurable (via publishednodes.json) (#2205)\n- Ability to disable Complex type system loading (#2185)\n- Several improvements for cyclic read (#2169)\n  - Only submit publish requests for active subscriptions rather than any subscription. (#2184)\n  - Better diagnostic messages of number of cyclic read, heartbeat, events per minute (#2175)\n  - Track # of missed intervals / samples due to latency of read (#2174)\n- BadNodeIdUnknown not re-evaluated despite short retry delays? (#2188)\n- Additional information in diagnostic messages including resource consumption (total)\n- Persistency of published nodes file now uses .net storage provider which supports enabling file change polling via command line option (needed on some linux setups)\n\n## Azure Industrial IoT OPC Publisher 2.9.7\n\n### Changes in 2.9.7\n\n- Added additional diagnostic logging option to capture the encoded notifications as well\n\n## Azure Industrial IoT OPC Publisher 2.9.6\n\nWe are pleased to announce the release of version 2.9.6 of OPC Publisher and the companion web api service. This release comes with several bug and security fixes and is the latest supported release.\n\n### Changes in 2.9.6\n\n- Update OPC UA .net stack to the latest 1.05 version and move forward other dependencies fixing several reported CVE vulnerabilities. \n- Additional option to log encoded notifications to trace data all the way to send path.\n- Hardened code paths that made it possible that no more publishing requests are enqueued after a while. Continuously ensure minimum amount of publish requests are in progress when receiving good session keep alives.\n\n## Azure Industrial IoT OPC Publisher 2.9.5\n\nWe are pleased to announce the release of version 2.9.5 of OPC Publisher and the companion web api service. This release comes with several bug and security fixes and is the latest supported release.\n\n### Changes in 2.9.5\n\n- Update OPC UA .net stack to the latest 1.05 version and move forward other dependencies\n- Fixed a bug where OPC Publisher could not connect when the port provided in the endpoint during discovery is different than the port in of the discovery URL.\n\n## Azure Industrial IoT OPC Publisher 2.9.4\n\nWe are pleased to announce the release of version 2.9.4 of OPC Publisher and the companion web api service. This release comes with several bug and security fixes and is the latest supported release.\n\n### Breaking changes in 2.9.4\n\n> IMPORTANT. Please read when updating from previous versions of OPC Publisher\n\n- Arm64 and AMD64 container images are published now with Mariner (Azure) Linux (distroless) as base images instead of Alpine.\n- Arm32 (v7) images of OPC Publisher continue to use Alpine as base image. Support transitions to the same model as for \"preview\" features.  Security updates are released as a result of updates to the AMD64 and ARM64 version of OPC Publisher.\n- Swagger UI has been removed without replacement.\n\n### Changes in 2.9.4\n\n- Update OPC UA .net stack to the 1.05 version including latest node set and fixing numerous issues. (#2162)\n- ApiKey and other secrets can now be provided ahead of time through docker secrets (or command line) in addition to being only available in the Module Twin. (#2181)\n- Send the error of CreateMonitoredItem as part of the keyframe field and in heartbeats if WatchdogLKV heartbeat behavior is used (#2150).\n- Credential based authentication uses concrete types for credentials now which are documented in openapi.json (#2152)\n- OPC Publisher can now obtain TLS certificates from IoT Edge workload API to secure the HTTPS API (#2101)\n- Fix release build issue which broke support for ARM64 images running on RPi4 (#2145).\n- Update console diagnostics output to provide better naming, additional diagnostics and reflect other transports than IoT Edge Hub (#2141)\n- Add keep alive notification counts to Diagnostics output and messages\n- Better diagnostics messages of cyclic reads, heartbeats and events including per minute and second reporting (#2175, #2174)\n- Experimental feature to allow publishing model changes in the underlying server address space (change feed) (#2158)\n- Add a full version that includes runtime, framework and full version string to runtime state message, twin, diagnostic object, and in console output.\n- When only using cyclic reads, the underlying dummy subscription should stay disabled (#2139)\n- Recreate session if it expires on server (#2138)\n- Log subscription keep alive error only when session is connected (#2137)\n- Added the ability to switch publisher to emit logs in syslog or systemd format using --lfm command line option.\n- Fix issue where certain publish errors cause reconnect state machine to fail (#2104, #2136)\n- Fix issues with cyclic reads not working as expected, subscribing to nodes > 300 not working (#2160, #2165)\n- Metric names are not like they were in 2.8, some metrics are missing (#2149)\n- SiteId placeholder is not working in TelemetryTopicTemplate (#2161)\n- Messaging mode can now be overridden in Strict mode to use a non-compliant mode. (#2167)\n\n## Azure Industrial IoT OPC Publisher 2.9.3\n\nWe are pleased to announce the release of version 2.9.3 of OPC Publisher and the companion web api. This release moves OPC Publisher to .net 8 which is the latest LTS version of .net and comes with several new features, bug and security fixes. 2.9.3 is the latest supported release.\n\n### Breaking changes in 2.9.3\n\n> IMPORTANT. Please read when updating from previous versions of OPC Publisher\n\n- Arm64 and AMD64 container images are published now with (Azure) Mariner Linux (distroless) as base images instead of Alpine.\n- Arm32 (v7) images of OPC Publisher continue to use Alpine as base image. Support transitions to the same model as for \"preview\" features.  Security updates are released as a result of updates to the AMD64 and ARM64 version of OPC Publisher.\n- Metadata collection has shown to be very taxing on OPC UA servers. When 2.9 was dropped in to replace 2.8 in production, memory consumption was too large and connections would drop. OPC Publisher now defaults to `--dm=true` in 2.9.3 to disable metadata messages to be compatible with 2.8 when `--strict` / `-c` is not specified. If you need meta data messages but do not use strict mode (not recommended) you must explicitly enable it using `--dm=false`.\n\n### New features in 2.9.3\n\n- For security the OPC Publisher Web API container now runs root-less. (#2114)\n- New configuration option to specify quality of service. This allows setting QOS0 as alternative to QOS1 (#2085)\n- Diagnostic info can now also be periodically published to a topic or IoT Edge output name using new `--dtt` diagnostics topic template. (#2068)\n- New Module to module method to get REST endpoint info and API key so that other modules can access the REST API (#2096)\n- Fixed Publisher HTTPS API returning SSL_ERROR_SYSCALL error. Now a self signed certificate is the fallback if workload api cannot produce a certificate with private key (#2101)\n- Restart announcement now includes additional information, including version, timestamp of (re-)start, module and device ids.\n- X509 User Authentication support using secrets reference feature request (#2005)\n- New API to manage the PKI infrastructure of the OPC Publisher (certificate stores). You can now list, add and remove certificates from the OPC UA certificate stores remotely. (#1996)\n- You can now configure OPC Publisher to re-use a session across writer groups with the same endpoint url and security settings. (#2065)\n- Subscription Watchdog monitors keep alive notifications and generates metric and logs when subscription keep alive is missing (#2060)\n- Added samples to show how to call OPC Publisher API over MQTT, HTTP and IoT Hub.\n\n### Bug fixes in 2.9.3\n\n- 2.8 Start instrument was missing on 2.9 prometheus endpoint (#2110)\n- Fix Publisher cannot get ssl cert from workload api, HTTPS API returning SSL_ERROR_SYSCALL error (#2101)\n- Harden when OPC UA server sometimes reports monitored items samples changes unordered in subscription notification and thus samples messages are also unordered (#2108)\n- Need to have timestamp information and other information in runtime state reporting message, need to have a special routing path for runtime state messages feature request. Restart announcement now includes additional information, including version, timestamp of (re-)start, module and device ids. (#2111)\n- Optimize metadata collection, do not collect metadata from servers for built in types (#2105)\n- Fix that it was not possible to configure event subscriptions for multiple events on the same node id (#2098)\n- Fix complex type encoding where Json message encoding has value in Binary encoding for complex (multilevel structure) (#2090)\n- Dapr now works without requiring state component. Dapr now runs over http instead of https by default. New option to select the url scheme (#2102, #2119, #2117, #2109\n- It is now possible to disable retrying subscription re-creation by configuring a value of 0. (#2100)\n- Fix that extension field values show up wrong in samples mode. (#2092)\n- Fix Event subscription using the REST Api fails with: \"The request field is required.\" (#2078)\n- The configuration of the OpcPublisher 2.9.2 fails using the REST Api bug (#2066)\n- For each configured in pn.json Dataset publisher must try to reuse an existing session for this EndpointUrl with the identical security settings (if exists). feature request\n- Address issues deploying the web api, e.g., getting error when trying to use option 2 to deploy Azure IIoT Deployment and ./aad-register.ps1 errors with \"A parameter cannot be found that matches the parameter name 'ReplyUrl'.\" (#2063, #2064)\n- Update documentation, including breaking changes, Add Azure Storage, Azure Key Vault services, and Application Insights to arch diagram, how to setup the OPCPublisher edge module with X.509 certificates documentation, and how to emit ExtensionFields in Pub sub mode using key frame counter. (#1917, #2091, #2083)\n- Fix incorrect API definitions in OpenAPI JSON for OPC publisher\n- FileSystem target now appends data instead of updating the file content. FileSystem target now supports arbitrary chars in topics.\n\n## Azure Industrial IoT OPC Publisher 2.9.2\n\nWe are pleased to announce the release of version 2.9.2 of OPC Publisher. This release comes with several bug and security fixes and is the latest supported release.\n\n### Changes in 2.9.2\n\n- Update to version 1.4.372 of the OPC UA .net stack and updated to latest secure version of nuget dependencies.\n- Fixed a bug where data stopped flowing in OPC Publisher bug on reconnect when subscription ids do not match server state (#2055)\n- Ability to select the message timestamp and behavior of Heartbeat\n  - Ability to generate heartbeats with different sourceTimestamp and serverTimestamp (#2049)\n  - Added a behavior option to update the source timestamp relative to the LKV to mimic previous behavior (#2048)\n- First Heartbeat message now dows not send anymore GoodNoData status when the monitored item is not yet live (#2041)\n- MQTT reconnect and disconnect reasons are now logged as errors (#2025)\n- Fixed an issue where Publisher failed to subscribe to a node because namespace table entry was not available during connect/subscribe (#2042) (Thank you @quality-leftovers for contributing this fix)\n- The default application name used to create certs is now the same as in 2.8 (#2047)\n- Batch size and Batch trigger have same defaults now than 2.8 (#2045)\n- Fix a bug where the user was not added correctly as owner in the aad_register.ps1 script (Thank you @0o001 for contributing this fix)\n\n## Azure Industrial IoT OPC Publisher 2.9.1\n\nWe are pleased to announce the release of version 2.9.1 of OPC Publisher. 2.9.1 comes with several bug and security fixes and is the latest supported release.\n\n### Changes in 2.9.1\n\n- Update all dependencies to latest version, in particular latest opc ua .net stack release 372\n- MQTT samples and making MQTT method calls over RPC working with Mqtt.net (#2039)\n- IoT Hub direct method samples (#2032)\n- The CLI switches using the environment variable names do no work (#2021)\n- New command line setting to select which clock is chosen for message timestamp (publish time or publisher current time) (#2035)\n- Fix negative count shown in diagnostics (#2031)\n- Documentation updates and fixes\n\n## Azure Industrial IoT OPC Publisher 2.9.0\n\nWe are pleased to announce the release of version 2.9.0 of OPC Publisher. This release adds several new features including support for reverse connect.\n\n### Changes in 2.9.0\n\nFor the list of changes released so far in preview releases please see:\n\n- [Changes in 2.9.0 Preview 4](#changes-in-290-preview-4)\n- [Changes in 2.9.0 Preview 3](#changes-in-290-preview-3)\n- [Changes in 2.9.0 Preview 2](#changes-in-290-preview-2)\n- [Changes in 2.9.0 Preview 1](#changes-in-290-preview-1)\n\nThe final release contains the following changes:\n\n- Restart announcement tests are disabled and need to work again #1988\n- Event item filter errors should be an error condition and re-evaluated periodically. #2014\n- Feedback / Message / Metric on OPC Server down or wrong credentials provided in OPC Publisher 2.8+ #1445\n- Option to directly enable subscription during create rather than using SetPublishingMode request. (BadNodeIdUnkown OPCPublisher) #1773\n- Option to enable swagger UI in release build publishers. (OPCPublisher:latest API Server not working) #2009\n- Publisher should try first to select the endpoint matching the configured url in Connection model. #2013\n- Select security mode and profile in configuration #2008\n- Using G8/17 to serialize float/double for precision Float/Double Serializer #1709\n- Send extension fields as part of datasetmessage and enable free form configuration of extension fields (move to Variant value) #1940\n- Command line option to disable complex type loading. #1953\n- publishednodes.json: When OpcAuthenticationUsername is set but OpcAuthenticationPassword is erroneously not, a misleading error message appears #1059\n- OPC Publisher REST API and Direct Methods Reference (Publish, Twin, Discovery) documentation  #1976/#1504\n- AAD-Register fails on converting System.String to type \"System.Security.SecureString\" #2015\n\n## Azure Industrial IoT OPC Publisher 2.9.0 Community Preview 4\n\nWe are pleased to announce the fourth **preview** release of version 2.9.0 of OPC Publisher. This release adds several new features including support for reverse connect.\n\n> IMPORTANT: Preview releases are only supported through GitHub issues. This particular release due to the number of changes included might have backward compatibility breaks that have not yet been documented. Please file issues and we will try to address them ahead of GA release.\n\n### Changes in 2.9.0 Preview 4\n\n- [OPC Publisher] Better documentation for REST API call with API Key #1991\n- [OPC Publisher] Fix Can't run OPC UA Publisher standalone module inside IoT Edge Simulator environment (iotedgehubdev) #1708\n- [OPC Publisher] No BypassCertVerification required in Simulation with VS Code / iotedgehubdev #1922\n- [OPC Publisher] Fix  standalone OPC-Publisher in Edge Simulator doesn't work #1999\n- [OPC Publisher] Fix 2.9 preview 3 not supporting iot edge decrypt of passwords #1998\n- [OPC Publisher] Application uri of the publisher should be unique for the deployment. #1986\n- [OPC Publisher] Better documentation for --strict mode in OPC Publisher, Better documentation for all other message profiles. #1938\n- [OPC Publisher] A way to node id in nsu and ns index format like ns=1;s=CycleCounter using API and telemetry #1057\n- [OPC Publisher] Support for Reverse Connect # 1586\n\n## Azure Industrial IoT OPC Publisher 2.9.0 Community Preview 3\n\nWe are pleased to announce the third **preview** release of version 2.9.0 of OPC Publisher. This release adds several new features including support for cyclic reads.\n\n> IMPORTANT: Preview releases are only supported through GitHub issues. This particular release due to the number of changes included might have backward compatibility breaks that have not yet been documented. Please file issues and we will try to address them ahead of GA release.\n\n### Changes in 2.9.0 Preview 3\n\n- [OPC Publisher] Heartbeat behavior is not deterministic - implement heartbeat as value change watchdog. #1993\n- [OPC Publisher] When enabling client linger in preview2 a failing connection retries forever  #1985\n- [OPC Publisher] Alarm condition integration tests have been partially disabled and need to enable again #1989\n- [OPC Publisher] Need OPC Publisher to poll data from server periodically rather than subscribing. #1934\n- [OPC Publisher] Polling mechanism instead of PubSub in OPCPublisher #605\n- [OPC Publisher] Configuration of the published nodes by browse path #47\n- [OPC Publisher] deploy.ps1 fails upon deploying \"platform\" #1981\n  [OPC Publisher] Updated documentation and nuget dependencies\n\n## Azure Industrial IoT OPC Publisher 2.9.0 Community Preview 2\n\nWe are pleased to announce the second **preview** release of version 2.9.0 of OPC Publisher. This release marks a large change for the Industrial IoT components and features. We have combined all edge functionality into the OPC Publisher edge module which now boasts not just MQTT and IoT Hub direct method access, but a full HTTP REST endpoint that can be used to configure its functionality. The cloud components also have been combined into a single Web API, which we recommend to deploy into Azure App Service for reduced cost and simplified operations.\n\n> IMPORTANT: Preview releases are only supported through GitHub issues. This particular release due to the number of changes included might have backward compatibility breaks that have not yet been documented. Please file issues and we will try to address them ahead of GA release.\n\n### Changes in 2.9.0 Preview 2\n\n- New Namespaces for all projects and simplified code structure. There are now 2 SDK projects, one for the OPC Publisher module, and another for the optional cloud WebAPI companion service.\n- Ability to run platform (modules, services) \"standalone\" on the edge #464\n  - [OPC Discovery] has been included into the OPC Publisher module, the container name must be updated to refer to OPC Publisher.\n  - [OPC Discovery] A new synchronous FindServer API has been added to allow discovery by discovery url through a single API call.\n  - [OPC Twin] has been included into the OPC Publisher module, the container name must be updated to refer to OPC Publisher.\n  - [OPC Twin] we removed the Activate and Deactivate calls.\n  - [OPC Twin] OPC TWIN Method call #996\n  - Support for opc-twin module api direct method calls with input arguments (not requiring OPC Twin micro services) #1512\n- Support for a new TestConnection API to test a connection to a server and receiving detailed error information back.\n- [OPC Publisher] (breaking change) The publisher id in each message is now always the same value across all writer groups rather than previously where a random guid was used per writer group when a publisher id was not configured.\n- [OPC Publisher] Several bug fixes for preview 1 (#1964)\n  - [OPC Publisher] DatasetMessage SequenceNumber is now correctly incremented (preview) (#1961)\n- [OPC Publisher] Enabling using DisplayNames defined for the event fields in pn.json as keys in the payload of dataset messages (#1963)\n- [OPC Publisher] Request opc server's nodes information #1960\n- [OPC Publisher] dotnet publish can be used to build a docker container for OPC Publisher #1949\n- [OPC Publisher] Metrics output and log output showing number of sessions currently active (related to #1923)\n- [OPC Publisher] Added new OPC UA stack which addressess #1937 and latest CVE's\n- [All micro services] Have been combined into a single WebAPI with the same resource paths as the 2.8 AKS deployment and all-in-one service.\n  - [OPC Registry service] Supervisor, Discoverer entities have been removed, but the API has been layered on top of the publisher entity for backwards compatibiltiy. Do not use these API's anymore.\n  - [OPC Registry service] A new RegisterEndpoint API has been added that calls the new sync FindServer API and adds the result into the registry in one call.\n  - [Telemetry processor] The telemetry and onboarding processors have been integrated into the WebAPI, but only forwards to SignalR. The secondary event hub has been removed. If you need to post process telemetry you must read telemetry data directly from IoT Hub.\n- Document the diagnostics output and troubleshooting guide #1952\n\n## Azure Industrial IoT OPC Publisher 2.9.0 Community Preview 1\n\nWe are pleased to announce the first **preview** release of version 2.9.0 of OPC Publisher. This release contains several requested features and fixes issues discovered.\n\n> IMPORTANT: Preview releases are only supported through GitHub issues.\n\n### Changes in 2.9.0 Preview 1\n\n- [OPC Publisher] [Alarms and Events](./opc-publisher/readme.md#configuring-event-subscriptions) support to OPC Publisher. You can now subscribe to events in addition to value changes and in the familar ways using the published nodes json configuration and direct methods.\n- [OPC Publisher] Full Deadband filtering. We introduced data change triggers in 2.8.4 and are now supporting the full data change filter configuration to configure percent and absolute deadband as defined in OPC UA.\n- [OPC Publisher] Support setting discard new configuration on command line.\n- [OPC Publisher] Full support for UADP network message encoding, as well as reversible Json profiles (JsonReversible)\n- [OPC Publisher] Support for smaller network messages by removing network message and dataset message headers (adding new MessageType.RawDataset and MessageType.DataSetMessages).\n- [OPC Publisher] Support for gzip encoded Json (MessageEncoding.JsonGzip and MessageEncoding.JsonReversibleGzip)\n- [OPC Publihser] Strict mode to adhere to OPC UA Part 14 and Part 6, including message formats and data type serialization.\n- [OPC Publisher] Adding back support for --sf and SkipFirst property to skip the first data change notification to be sent when subscription is created.\n- [All IoT Edge modules] Configuration to optionally enable MQTT topic publishing and command control via an MQTT broker instead of IoT Edge EdgeHub.\n- [All IoT Edge modules] Update OPC UA stack to latest .371 version.\n\n## Azure Industrial IoT Platform Release 2.8.6\n\nWe are pleased to announce the release of version 2.8.6 of our Industrial IoT Platform components as latest patch update of the 2.8 Long-Term Support (LTS) release. This release contains important security updates fixes, performance optimizations and bugfixes.\n\n### Changes in 2.8.6\n\n- [All] Update to latest JSON.net nuget dependency.\n- [All] Use latest OPC UA .net stack 371.\n- Update all images to use latest version of Alpine base image\n\n## Azure Industrial IoT Platform Release 2.8.5\n\nWe are pleased to announce the release of version 2.8.5 of our Industrial IoT Platform components as latest patch update of the 2.8 Long-Term Support (LTS) release. This release contains important security updates fixes, performance optimizations and bugfixes.\n\n### Changes in 2.8.5\n\n- [All] Update to latest dependencies.\n- [All] Use latest OPC UA .net stack 371.\n- [OPC Publisher] Fix a crash in the diagnostics output timer in orchestrated mode when endpoint url is reported null. (#1955)\n\n## Azure Industrial IoT Platform Release 2.8.4\n\nWe are pleased to announce the release of version 2.8.4 of our Industrial IoT Platform components as latest patch update of the 2.8 Long-Term Support (LTS) release. This release contains important security updates fixes, performance optimizations and bugfixes.\n\n### IMPORTANT - PLEASE READ\n\n- IoT Edge 1.1 LTS will be going out of support on 12/13/2022, please [update your IoT Edge gateways to IoT Edge 1.4 LTS](https://learn.microsoft.com/azure/iot-edge/how-to-update-iot-edge).\n\n  > To continue deploying the 1.1 LTS modules to your environment follow [these instructions](./opc-publisher/readme.md#getting-started).\n\n- Windows container images are no longer supported in IoT Edge 1.4 and consequentially have been removed from this release. Please use [IoT Edge for Linux on Windows (EFLOW) 1.4](https://learn.microsoft.com/windows/iot/iot-enterprise/azure-iot-edge-for-linux-on-windows) as your IoT Edge environment on Windows.  \n\n  > IoT Edge 1.4 LTS EFLOW is supported as a Preview Feature in this release.\n\n  - You must update your Windows based IoT Edge environment to EFLOW **ahead of deploying the platform**.\n  - Simulation deployed as part of the ./deploy.ps1 script now deploys EFLOW on a Windows VM Host (Preview Feature).  This requires nested virtualization.  The Azure subscription and chosen region must support Standard_D4_v4 VM which supports nested virtualization or deployment of simulated Windows gateway will be skipped.\n  - Network scanning on IoT Edge 1.4 LTS EFLOW using OPC Discovery is not supported yet. This applies to the deployed [simulation environment](./web-api/readme.md#getting-started) and engineering tool. You can register servers using a discovery url using the [registry service's registration REST API](./web-api/api.md).\n\n### Changes in 2.8.4\n\n- Updated .net to .net 6.0 LTS from .net core 3.1 LTS which will be going out of support on 12/13/2022.\n- Updated nuget dependencies to their .net 6 counterpart or to their latest compatible release.\n- [All IoT Edge modules] Updated IoT Edge dependency to IoT Edge 1.4 LTS from 1.1 LTS which will be going out of support on 12/13/2022.\n- [All IoT Edge modules] (Preview) Support for [IoT Edge EFLOW 1.4 LTS](https://learn.microsoft.com/windows/iot/iot-enterprise/azure-iot-edge-for-linux-on-windows)\n- [OPC Publisher] Fix for orchestrator infinite loop on publisher worker document update (#1870)\n- [OPC Publisher] Rate limit OPC Publisher orchestrator requests.\n- [OPC Publisher] More explicit error logs in orchestrated mode, also showing transient exceptions in logs for better troubleshooting.\n- [OPC Publisher] Add --bi / --batchtriggerinterval command line option to define interval in milliseconds. (#1893)\n- [Deployment] IAI: Upgraded Kubernetes version in AKS from 1.22.6 to 1.23.12. (#1885)\n- [Deployment] Increased proxy-connect-timeout of NGINX from default 5 seconds to 30. (#1871)\n- [OPC Publisher] (Preview) User can set the Data change trigger value of the Data change filter type either as a default for all or per subscription (#1830).\n- [OPC Publisher] (Preview) Allow comment in OpcPublisher Configuration when Validation is used (#1892)\n- [All IoT Edge modules] Add a configuration option to set security option RejectUnknownRevocationStatus (#1777)\n- [All IoT Edge modules] Add mandatory field for edgeHub in the base deployment template to support cloning deployments (#1764)\n- [OPC Discovery] Ensure duplicate discovery urls override previous url instead of causing exception (#1903, #1902)\n- [OPC Discovery] Enginering tool ad hoc discovery fails with \"capacity must be non negative\" error found during bug bash. (#1907)\n- [OPC Twin] Fix sessions in Twin are not closed when endpoint is deactivated. (#1910)\n\nFor features that are marked as Preview, please report any issues through GitHub issues.\n\n### Known issues\n\n- Under EFLOW, by default the Application instance certificate is generated by each module and not automatically shared. To work around this, configure EFLOW and modules deployed manually to use a [shared host volume](https://learn.microsoft.com/azure/iot-edge/how-to-share-windows-folder-to-vm?view=iotedge-2018-06) to map the pki folders.\n- Discovering using IP Address and port ranges is not supported on EFLOW.\n\n## Azure Industrial IoT Platform Release 2.8.3\n\nWe are pleased to announce the release of version 2.8.3 of our Industrial IoT Platform components as a third patch update of the 2.8 Long-Term Support (LTS) release. This release contains important security updates fixes, performance optimizations and bugfixes.\n\n> IMPORTANT\n> We suggest updating from the version 2.5 or later to ensure secure operations of your deployment. OPC Publisher 2.8.3 addresses backwards compatibilities issues with version 2.5.x.\n\n### Security related fixes in 2.8.3\n\n- Updated OPC UA Stack NuGet to the latest (1.4.368.58) addressing various security issues\n- Upgraded SSH.NET package to 2020.0.2 to address [CVE-2022-29245](https://nvd.nist.gov/vuln/detail/CVE-2022-29245).\n\n### Fundamentals related fixes in 2.8.3\n\n- [OPC Publisher] option to route telemetry to a specific output route was added\n\n### Bug fixes in 2.8.3\n\n- [OPC Publisher] Removed timestamps from metrics and updated the affected dashboard queries\n- [OPC Publisher] Fixed issue with large configurations when publisher running in orchestrated mode related to CosmosDB continuation tokens handling\n- [OPC Publisher] Publisher 2.8.2: Could not send worker heartbeat - eventually crashing and not restarting #1701\n- [OPC Publisher] Fix for false alarm sequence number mismatch warning in case of keep-alive messages\n- [Deployment] TLS certificate broken after upgrading of the AKS cluster #1389\n- [Registry API] Number of MaxWorker not returned while reading publisher configuration\n\n## Azure Industrial IoT Platform Release 2.8.2\n\nWe are pleased to announce the release of version 2.8.2 of our Industrial IoT Platform components as a second patch update of the 2.8 Long-Term Support (LTS) release. This release contains important backward compatibility fixes with version 2.5.x, performance optimizations as well as security updates and bugfixes.\n\n> IMPORTANT\n> We suggest to update from  version 2.5 or later to ensure secure operations of your deployment. OPC Publisher 2.8.2 addresses backwards compatibilities issues with version 2.5.x.\n\n### Fundamentals related fixes in 2.8.2\n\n- [OPC Publisher] Implemented the backwards compatible [Direct Methods API](./opc-publisher/directmethods.md) of 2.5.x publisher. The migration path is documented [here](./opc-publisher/migrationpath.md)\n- [OPC Publisher] Optimizations in opc subscriptions/monitored items management in case of configuration changes. Only incremental changes are applied to a subscription.\n- [OPC Publisher] Added support for setting QueueSize on monitored items for publisher in standalone mode.\n- [OPC Publisher] Hardened the retry mechanism for activating monitored items.\n\n### Backwards Compatibility Notes for release 2.8.2\n\n- [OPC Publisher] NodeId shows up now in telemetry in the exact format as specified in the configuration. Before 2.8.2, the NodeId was always reported as `Namespace#NodeId`\n    > E.g. : When configuring in pn.json file a NodeId like `nsu=http://mynamespace.com/;i=1`\n    >\n    > - OPC Publisher 2.8.1 telemetry reports `http://mynamespace.com/#i=1`\n    > - OPC Publisher 2.8.2 telemetry reports `nsu=http://mynamespace.com/;i=1`\n    >\n- [OPC Publisher] configuration of duplicate nodeIds in the same data set writer, respectively same subscription is no longer allowed.\n\n## Azure Industrial IoT Platform Release 2.8.1\n\nWe are pleased to announce the release of version 2.8.1 of our Industrial IoT Platform components as the first patch update of the 2.8 Long-Term Support (LTS) release. This release contains important security updates, bugfixes and performance optimizations.\n\n> IMPORTANT: Please note that OPC Publisher 2.8.1 is not backwards compatible with version 2.5.x.\n\n## Azure Industrial IoT Platform Release 2.8\n\nWe are pleased to announce the release of version 2.8 of our Industrial IoT Platform as well as the declaration of Long-Term Support (LTS) for this version.\nWhile we continue to develop and release updates to our ongoing projects on GitHub, we now also offer a branch that will only get critical bug fixes and security updates starting in July 2021. Customers can rely upon a longer-term support lifecycle for these LTS builds, providing stability and assurance for the planning on longer time horizons our customers require. The LTS branch offers customers a guarantee that they will benefit from any necessary security or critical bug fixes with minimal impact to their deployments and module interactions. At the same time, customers can access the latest updates in the main branch to keep pace with the latest developments and fastest cycle time for product updates.\n\n> IMPORTANT: We suggest to update from the version 2.6 or later to ensure secure operations of your deployment. 2.8.0 is not backwards compatible with version 2.5.x\n\nVersion 2.8.0 includes an updated version of the IoT Edge Runtime, a new Linux base image for all Linux deployments, and several bug fixes. The detailed changes can be found [here](https://github.com/Azure/Industrial-IoT/releases/tag/2.8.0).\n"
  },
  {
    "path": "e2e-tests/.gitignore",
    "content": ".env"
  },
  {
    "path": "e2e-tests/Directory.Build.props",
    "content": "﻿<Project>\n  <Import Project=\"$([MSBuild]::GetPathOfFileAbove(common.props))\" Condition=\"'$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), common.props))' != ''\" />\n</Project>\n"
  },
  {
    "path": "e2e-tests/IIoTPlatform-E2E-Tests.slnx",
    "content": "<Solution>\n  <Configurations>\n    <Platform Name=\"Any CPU\" />\n    <Platform Name=\"x64\" />\n  </Configurations>\n  <Folder Name=\"/Dependencies/\" />\n  <Folder Name=\"/Dependencies/src/\">\n    <Project Path=\"../src/Azure.IIoT.OpcUa.Publisher.Models/src/Azure.IIoT.OpcUa.Publisher.Models.csproj\" />\n    <Project Path=\"../src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Azure.IIoT.OpcUa.Publisher.Sdk.csproj\" />\n  </Folder>\n  <Folder Name=\"/Solution Items/\">\n    <File Path=\"../tools/e2etesting/GetSecrets.ps1\" />\n    <File Path=\".env\" />\n  </Folder>\n  <Project Path=\"OpcPublisher-E2E-Tests/OpcPublisher-AE-E2E-Tests.csproj\" />\n</Solution>\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Config/IContainerRegistryConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Config\n{\n    /// <summary>\n    /// Container registry client configuration\n    /// </summary>\n    public interface IContainerRegistryConfig\n    {\n        /// <summary>\n        /// Server url\n        /// </summary>\n        string ContainerRegistryServer { get; }\n\n        /// <summary>\n        /// Namespace\n        /// </summary>\n        string ImagesNamespace { get; }\n\n        /// <summary>\n        /// User\n        /// </summary>\n        string ContainerRegistryUser { get; }\n\n        /// <summary>\n        /// Password\n        /// </summary>\n        string ContainerRegistryPassword { get; }\n\n        /// <summary>\n        /// Version\n        /// </summary>\n        string ImagesTag { get; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Config/IDeviceConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Config\n{\n    /// <summary>\n    /// IoT Edge device configuration\n    /// </summary>\n    public interface IDeviceConfig\n    {\n        /// <summary>\n        /// IoT Edge device id\n        /// </summary>\n        string DeviceId { get; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Config/IIoTEdgeConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Config\n{\n    /// <summary>\n    /// IoT Edge configuration\n    /// </summary>\n    public interface IIoTEdgeConfig\n    {\n        /// <summary>\n        /// IoT Edge version\n        /// </summary>\n        string EdgeVersion { get; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Config/IIoTHubConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Config\n{\n    /// <summary>\n    /// IoT Hub configuration\n    /// </summary>\n    public interface IIoTHubConfig\n    {\n        /// <summary>\n        /// IoT Hub connection string\n        /// </summary>\n        string IoTHubConnectionString { get; }\n\n        /// <summary>\n        /// The connection string of the EventHub-compatible endpoint of the IoTHub\n        /// </summary>\n        string IoTHubEventHubConnectionString { get; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Config/IOpcPlcConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Config\n{\n    public interface IOpcPlcConfig\n    {\n        /// <summary>\n        /// Semicolon separated URLs to load published_nodes.json from OPC-PLCs\n        /// </summary>\n        string Urls { get; }\n\n        /// <summary>\n        /// Semicolon separated ip addresses of the OPC-PLCs\n        /// </summary>\n        string Ips { get; }\n\n        /// <summary>\n        /// TenantId for SP\n        /// </summary>\n        string TenantId { get; }\n\n        /// <summary>\n        /// Resource Group\n        /// </summary>\n        string ResourceGroupName { get; }\n\n        /// <summary>\n        /// Subscription Id\n        /// </summary>\n        string SubscriptionId { get; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Config/ISshConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Config\n{\n    public interface ISshConfig\n    {\n        /// <summary>\n        /// Username used for ssh authentication\n        /// </summary>\n        string Username { get; }\n\n        /// <summary>\n        /// Public key used for ssh authentication\n        /// </summary>\n        string PublicKey { get; }\n\n        /// <summary>\n        /// Private key used for ssh authentication\n        /// </summary>\n        string PrivateKey { get; }\n\n        /// <summary>\n        /// DNS Host name of machine to ssh into\n        /// </summary>\n        string Host { get; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage\n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given\n// a specific target and scoped to a namespace, type, member, etc.\n\nusing System.Diagnostics.CodeAnalysis;\n\n[assembly: SuppressMessage(\"Reliability\", \"CA2007:Consider calling ConfigureAwait on the awaited task\", Justification = \"xunit\")]\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/MessagingMode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests\n{\n    /// <summary>\n    /// Message modes\n    /// </summary>\n    public enum MessagingMode\n    {\n        /// <summary>\n        /// Network and dataset messages (default)\n        /// </summary>\n        PubSub,\n\n        /// <summary>\n        /// Monitored item samples\n        /// </summary>\n        Samples\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/OpcPublisher-AE-E2E-Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <RootNamespace>OpcPublisherAEE2ETests</RootNamespace>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Remove=\"TestResults\\**\" />\n    <EmbeddedResource Remove=\"TestResults\\**\" />\n    <None Remove=\"TestResults\\**\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Azure.Identity\" Version=\"1.17.0\" />\n    <PackageReference Include=\"Azure.Core\" Version=\"1.49.0\" />\n    <PackageReference Include=\"Azure.Messaging.EventHubs\" Version=\"5.12.2\" />\n    <PackageReference Include=\"Azure.ResourceManager.ContainerInstance\" Version=\"1.3.0\" />\n    <PackageReference Include=\"Azure.ResourceManager.Storage\" Version=\"1.5.0\" />\n    <PackageReference Include=\"Azure.Storage.Files.Shares\" Version=\"12.23.0\" />\n    <PackageReference Include=\"FluentAssertions\" Version=\"[7.2.0]\" />\n    <PackageReference Include=\"Azure.ResourceManager\" Version=\"1.13.2\" />\n    <PackageReference Include=\"Neovolve.Logging.Xunit\" Version=\"6.3.0\" />\n    <PackageReference Include=\"System.Text.Json\" Version=\"9.0.9\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.0\" />\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"Microsoft.Extensions.Configuration.EnvironmentVariables\" Version=\"9.0.9\" />\n    <PackageReference Include=\"SSH.NET\" Version=\"2025.0.0\" />\n    <PackageReference Include=\"System.Linq.Async\" Version=\"6.0.3\" />\n    <PackageReference Include=\"xunit\" Version=\"2.9.3\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"3.1.5\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"coverlet.collector\" Version=\"6.0.4\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Azure.IIoT.OpcUa.Publisher.Sdk\\src\\Azure.IIoT.OpcUa.Publisher.Sdk.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Update=\"opc-plc-files\\sc001.json\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Update=\"xunit.runner.json\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Properties/AssemblyInfo.cs",
    "content": "using System.Runtime.InteropServices;\nusing Xunit;\n\n// In SDK-style projects such as this one, several assembly attributes that were historically\n// defined in this file are now automatically added during build and populated with\n// values defined in project properties. For details of which attributes are included\n// and how to customise this process see: https://aka.ms/assembly-info-properties\n\n// Setting ComVisible to false makes the types in this assembly not visible to COM\n// components.  If you need to access a type in this assembly from COM, set the ComVisible\n// attribute to true on that type.\n\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM.\n\n[assembly: Guid(\"275eb2f6-3c8c-42e3-b3a7-d793b0363134\")]\n\n// deactivate run of test in parallel\n[assembly: CollectionBehavior(DisableTestParallelization = true)]"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/PublishedNodesConfigurations.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests\n{\n    using Newtonsoft.Json.Linq;\n\n    internal static partial class TestConstants\n    {\n        internal static class PublishedNodesConfigurations\n        {\n            public static string SimpleEvents(string host, uint port, string writerId)\n            {\n                return $$\"\"\"\n\n                [\n                    {\n                        \"EndpointUrl\": \"opc.tcp://{{host}}:{{port}}\",\n                        \"UseSecurity\": true,\n                        \"DataSetWriterId\":\"{{writerId}}\",\n                        \"OpcNodes\": [\n                            {\n                                \"Id\": \"ns=0;i=2253\",\n                                \"QueueSize\": 10,\n                                \"DisplayName\": \"SimpleEvents\",\n                                \"EventFilter\": {\n                                    \"SelectClauses\": [\n                                        {\n                                            \"TypeDefinitionId\": \"i=2041\",\n                                            \"BrowsePath\": [\n                                                \"EventId\"\n                                            ]\n                                        },\n                                        {\n                                            \"TypeDefinitionId\": \"i=2041\",\n                                            \"BrowsePath\": [\n                                                \"Message\"\n                                            ]\n                                        },\n                                        {\n                                            \"TypeDefinitionId\": \"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\",\n                                            \"BrowsePath\": [\n                                                \"http://microsoft.com/Opc/OpcPlc/SimpleEvents#CycleId\"\n                                            ]\n                                        },\n                                        {\n                                            \"TypeDefinitionId\": \"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\",\n                                            \"BrowsePath\": [\n                                                \"http://microsoft.com/Opc/OpcPlc/SimpleEvents#CurrentStep\"\n                                            ]\n                                        }\n                                    ],\n                                    \"WhereClause\": {\n                                        \"Elements\": [\n                                            {\n                                                \"FilterOperator\": \"OfType\",\n                                                \"FilterOperands\": [\n                                                    {\n                                                        \"Value\": \"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\"\n                                                    }\n                                                ]\n                                            }\n                                        ]\n                                    }\n                                }\n                            }\n                        ]\n                    }\n                ]\n\"\"\";\n            }\n\n            public static JArray SimpleEventFilter(\n                string typeDefinitionId = \"i=2782\")\n            {\n                return new JArray(\n                    new JObject(\n                        new JProperty(\"Id\", \"i=2253\"),\n                        new JProperty(\"QueueSize\", 1000),\n                        new JProperty(\"EventFilter\", new JObject(\n                            new JProperty(\"TypeDefinitionId\", typeDefinitionId)))));\n            }\n\n            public static JArray PendingConditionForAlarmsView()\n            {\n                return new JArray(\n                    new JObject(\n                        new JProperty(\"Id\", \"i=2253\"),\n                        new JProperty(\"QueueSize\", 10),\n                        new JProperty(\"EventFilter\", new JObject(\n                            new JProperty(\"TypeDefinitionId\", \"i=2915\"))),\n                        new JProperty(\"ConditionHandling\", new JObject(\n                            new JProperty(\"UpdateInterval\", 10),\n                            new JProperty(\"SnapshotInterval\", 20)\n                        ))));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/RegistryHelper.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests\n{\n    using OpcPublisherAEE2ETests.Deploy;\n    using OpcPublisherAEE2ETests.TestExtensions;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Microsoft.Azure.Devices;\n    using Microsoft.Azure.Devices.Common.Exceptions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    /// <summary>\n    /// Helper for managing IoT Hub device registry.\n    /// </summary>\n    public sealed class RegistryHelper : IDisposable\n    {\n        /// <summary>\n        /// Constructor of RegistryHelper class.\n        /// </summary>\n        /// <param name=\"context\"> Shared context for E2E tests </param>\n        public RegistryHelper(IIoTPlatformTestContext context)\n        {\n            _context = context ?? throw new ArgumentNullException(nameof(context));\n\n            RegistryManager = RegistryManager.CreateFromConnectionString(context.IoTHubConfig.IoTHubConnectionString);\n        }\n\n        /// <summary>\n        /// Wait until IIoT modules are in Connected state.\n        /// </summary>\n        /// <param name=\"deviceId\"> IoT Edge device id </param>\n        /// <param name=\"ct\"> Cancellation token </param>\n        /// <param name=\"moduleNames\"> List of modules to wait for, defaults to ModuleNamesDefault if not specified </param>\n        /// <returns></returns>\n        public async Task WaitForIIoTModulesConnectedAsync(\n            string deviceId,\n            CancellationToken ct,\n            IReadOnlyList<string> moduleNames = null\n        )\n        {\n            moduleNames ??= ModuleNamesDefault;\n            var sw = Stopwatch.StartNew();\n            try\n            {\n                while (true)\n                {\n                    var modules = (await RegistryManager.GetModulesOnDeviceAsync(deviceId, ct).ConfigureAwait(false)).ToList();\n                    var connectedModulesCount = modules\n                        .Where(m => moduleNames.Contains(m.Id))\n                        .Count(m => m.ConnectionState == DeviceConnectionState.Connected);\n\n                    if (connectedModulesCount == moduleNames.Count)\n                    {\n                        _context.OutputHelper.WriteLine($\"All required IoT Edge modules are connected! (took {sw.Elapsed})\");\n                        return;\n                    }\n\n                    var m = modules.Count == 0 ? \"No modules\" : modules\n                        .Select(m => $\"{m.Id}({m.ConnectionState})\")\n                        .Aggregate((a, b) => a + \", \" + b);\n                    //_context.OutputHelper.WriteLine($\"Waiting for IoT Edge modules: {m} on {deviceId}\");\n                    await Task.Delay(TestConstants.DefaultDelayMilliseconds, ct).ConfigureAwait(false);\n                }\n            }\n            catch (OperationCanceledException)\n            {\n                _context.OutputHelper.WriteLine($\"Waiting for IoT Edge modules to be loaded timeout timeout after {sw.Elapsed} - please check iot edge device for details\");\n                throw;\n            }\n            catch (Exception e)\n            {\n                _context.OutputHelper.WriteLine($\"Error {e.Message} occurred while waiting for edge Modules to be loaded after {sw.Elapsed}\");\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Wait until IIoT modules do not exist anymore on edge device\n        /// </summary>\n        /// <param name=\"deviceId\"> IoT Edge device id </param>\n        /// <param name=\"ct\"> Cancellation token </param>\n        /// <param name=\"moduleNames\"> List of modules to wait for, defaults to ModuleNamesDefault if not specified </param>\n        /// <returns></returns>\n        public async Task WaitForIIoTModulesRemovedAsync(\n            string deviceId,\n            CancellationToken ct,\n            IReadOnlyList<string> moduleNames = null\n        )\n        {\n            moduleNames ??= ModuleNamesDefault;\n            var sw = Stopwatch.StartNew();\n            try\n            {\n                while (!ct.IsCancellationRequested)\n                {\n                    var modules = (await RegistryManager.GetModulesOnDeviceAsync(deviceId, ct).ConfigureAwait(false)).ToList();\n                    if (!modules.Any(m => moduleNames.Contains(m.Id)))\n                    {\n                        _context.OutputHelper.WriteLine($\"All IoT Edge modules were removed (took {sw.Elapsed})\");\n                        return;\n                    }\n\n                    var m = modules\n                        .Select(m => $\"{m.Id}({m.ConnectionState})\")\n                        .Aggregate((a, b) => a + \", \" + b);\n                    _context.OutputHelper.WriteLine($\"Waiting for IoT Edge modules to undeploy: {m} on {deviceId}\");\n                    await Task.Delay(TestConstants.DefaultDelayMilliseconds, ct).ConfigureAwait(false);\n                }\n            }\n            catch (OperationCanceledException)\n            {\n                _context.OutputHelper.WriteLine($\"Waiting for IoT Edge modules to be removed timeout timeout after {sw.Elapsed} - please check iot edge device for details\");\n                throw;\n            }\n            catch (Exception e)\n            {\n                _context.OutputHelper.WriteLine($\"Error {e.Message} occurred while waiting for edge Modules to be removed after {sw.Elapsed}\");\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Undeploy publisher\n        /// </summary>\n        /// <param name=\"messagingMode\"></param>\n        /// <param name=\"fullRedeploy\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public async Task RestartStandalonePublisherAsync(\n            MessagingMode messagingMode = MessagingMode.Samples, bool fullRedeploy = false,\n            CancellationToken ct = default)\n        {\n            var publisher = new IoTHubPublisherDeployment(_context, messagingMode);\n            if (fullRedeploy)\n            {\n                // Delete layered edge deployment.\n                await publisher.DeleteLayeredDeploymentAsync(ct);\n            \tawait TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(\"[]\", _context, ct);\n\n                await _context.RegistryHelper.WaitForIIoTModulesRemovedAsync(_context.DeviceConfig.DeviceId, ct,\n                   new string[] { publisher.ModuleName });\n            }\n            else\n            {\n            \tawait TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(\"[]\", _context, ct);\n                await TestHelper.RestartAsync(_context, publisher.ModuleName, ct);\n            }\n        }\n\n        /// <summary>\n        /// Create publisher deployment\n        /// </summary>\n        /// <param name=\"messagingMode\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public async Task<string> DeployStandalonePublisherAsync(\n            MessagingMode messagingMode = MessagingMode.Samples,\n            CancellationToken ct = default)\n        {\n            // Create base edge deployment.\n            var edgeBase = new IoTHubEdgeBaseDeployment(_context);\n            var baseDeploymentResult = await edgeBase.CreateOrUpdateLayeredDeploymentAsync(ct);\n            Assert.True(baseDeploymentResult, \"Failed to create/update new edge base deployment.\");\n            _context.OutputHelper.WriteLine(\"Created/Updated new edge base deployment.\");\n\n            await RestartStandalonePublisherAsync(messagingMode, false, ct);\n            await TestHelper.SwitchToStandaloneModeAsync(_context, ct);\n            await TestHelper.CleanPublishedNodesJsonFilesAsync(_context, ct);\n\n            // Create new layered edge deployment.\n            var publisher = new IoTHubPublisherDeployment(_context, messagingMode);\n            var layeredDeploymentResult = await publisher.CreateOrUpdateLayeredDeploymentAsync(ct);\n            Assert.True(layeredDeploymentResult, \"Failed to create/update layered deployment for publisher module.\");\n            _context.OutputHelper.WriteLine(\"Created/Updated layered deployment for publisher module.\");\n\n            // We will wait for module to be deployed.\n            await _context.RegistryHelper.WaitForSuccessfulDeploymentAsync(publisher.GetDeploymentConfiguration(), ct);\n            await _context.RegistryHelper.WaitForIIoTModulesConnectedAsync(_context.DeviceConfig.DeviceId, ct,\n                new string[] { publisher.ModuleName });\n\n            // We've observed situations when even after the above waits the module did not yet restart.\n            // That leads to situations where the publishing of nodes happens just before the restart to apply\n            // new container creation options. After restart persisted nodes are picked up, but on the telemetry side\n            // the restart causes dropped messages to be detected. That happens because just before the restart OPC Publisher\n            // manages to send some telemetry. This wait makes sure that we do not run the test while restart is happening.\n            // await Task.Delay(TestConstants.AwaitInitInMilliseconds, ct);\n\n            _context.OutputHelper.WriteLine(\"OPC Publisher module is up and running.\");\n\n            return publisher.ModuleName;\n        }\n\n        /// <summary>\n        /// Wait until one successful deployment is reported.\n        /// </summary>\n        /// <param name=\"deploymentConfiguration\"></param>\n        /// <param name=\"ct\"></param>\n        public async Task WaitForSuccessfulDeploymentAsync(\n            Configuration deploymentConfiguration,\n            CancellationToken ct)\n        {\n            var sw = Stopwatch.StartNew();\n            Configuration lastConfiguration = null;\n            try\n            {\n                while (true)\n                {\n                    ct.ThrowIfCancellationRequested();\n\n                    var activeConfiguration = await RegistryManager.GetConfigurationAsync(deploymentConfiguration.Id, ct)\n                        .ConfigureAwait(false);\n                    if (activeConfiguration != null)\n                    {\n                        lastConfiguration = activeConfiguration;\n                        if (Equals(activeConfiguration, deploymentConfiguration)\n#if SYSTEM_METRICS_BUG\n                            && activeConfiguration.SystemMetrics.Results.TryGetValue(\"reportedSuccessfulCount\", out var value)\n                            && value >= 1\n#endif\n                                                    )\n                        {\n                            _context.OutputHelper.WriteLine($\"All required IoT Edge modules are deployed! (took {sw.Elapsed})\");\n                            return;\n                        }\n                    }\n\n                    await Task.Delay(TestConstants.DefaultDelayMilliseconds, ct).ConfigureAwait(false);\n                }\n            }\n            catch (OperationCanceledException)\n            {\n                _context.OutputHelper.WriteLine($\"Waiting for IoT Edge modules to be loaded timeout after {sw.Elapsed} - please check iot edge device for details\");\n                throw;\n            }\n            catch (Exception e)\n            {\n                _context.OutputHelper.WriteLine($\"Error {e.Message} occurred while waiting for edge Modules after {sw.Elapsed}\");\n                throw;\n            }\n            finally\n            {\n                _context.OutputHelper.WriteLine($\"Waiting for IoT Edge module got configuration: {JsonSerializer.Serialize(lastConfiguration, kIndented)}...\");\n            }\n        }\n        private static readonly JsonSerializerOptions kIndented = new() { WriteIndented = true };\n\n        /// <summary>\n        /// Delete deployment configuration\n        /// </summary>\n        /// <param name=\"configurationId\"></param>\n        /// <param name=\"ct\"> Cancellation token </param>\n        public async Task DeleteConfigurationAsync(string configurationId, CancellationToken ct = default)\n        {\n            while (true)\n            {\n                var getConfig = await RegistryManager.GetConfigurationAsync(configurationId, ct).ConfigureAwait(false);\n                if (getConfig == null)\n                {\n                    return;\n                }\n                // First try create configuration\n                try\n                {\n                    await RegistryManager.RemoveConfigurationAsync(configurationId, ct).ConfigureAwait(false);\n                    _context.OutputHelper.WriteLine($\"Deleted configuration {configurationId}\");\n                }\n                catch\n                {\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create or update deployment configuration\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"ct\"> Cancellation token </param>\n        public async Task<Configuration> CreateOrUpdateConfigurationAsync(\n            Configuration configuration,\n            CancellationToken ct = default\n        )\n        {\n            try\n            {\n                var getConfig = await RegistryManager.GetConfigurationAsync(configuration.Id, ct).ConfigureAwait(false);\n\n                if (getConfig == null)\n                {\n                    // First try create configuration\n                    try\n                    {\n                        _context.OutputHelper.WriteLine(\"Add new IoT Hub device configuration\");\n                        return await RegistryManager.AddConfigurationAsync(configuration, ct).ConfigureAwait(false);\n                    }\n                    catch (DeviceAlreadyExistsException)\n                    {\n                        // Technically update below should now work but for some reason it does not.\n                        // Remove and re-add in case we are forcing updates.\n                        _context.OutputHelper.WriteLine(\"IoT Hub device configuration already existed, remove and recreate it\");\n                        await RegistryManager.RemoveConfigurationAsync(configuration.Id, ct).ConfigureAwait(false);\n                        return await RegistryManager.AddConfigurationAsync(configuration, ct).ConfigureAwait(false);\n                    }\n                }\n\n                if (Equals(configuration, getConfig))\n                {\n                    return getConfig;\n                }\n\n                _context.\n                OutputHelper.WriteLine(\"Existing IoT Hub device configuration is different, remove and recreate it\");\n                await RegistryManager.RemoveConfigurationAsync(configuration.Id, ct).ConfigureAwait(false);\n                return await RegistryManager.AddConfigurationAsync(configuration, ct).ConfigureAwait(false);\n            }\n            catch (Exception e)\n            {\n                _context.OutputHelper.WriteLine(\"Error while creating or updating IoT Hub device configuration! {0}\", e.Message);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Check equality of two deployment configurations.\n        /// </summary>\n        /// <param name=\"c0\"></param>\n        /// <param name=\"c1\"></param>\n        public static bool Equals(Configuration c0, Configuration c1)\n        {\n            if (c0.Id != c1.Id)\n            {\n                return false;\n            }\n\n            if (c0.TargetCondition != c1.TargetCondition)\n            {\n                return false;\n            }\n\n            if (c0.Priority != c1.Priority)\n            {\n                return false;\n            }\n\n            var c0ModulesContentCount = c0.Content?.ModulesContent?.Count ?? 0;\n            var c1ModulesContentCount = c1.Content?.ModulesContent?.Count ?? 0;\n\n            if (c0ModulesContentCount == 0 && c1ModulesContentCount == 0)\n            {\n                return true;\n            }\n            else if (c0ModulesContentCount != c1ModulesContentCount)\n            {\n                return false;\n            }\n\n            // After the previous checks we know that both have the same non-zero number of module contents.\n            foreach (var moduleName in c1.Content.ModulesContent.Keys)\n            {\n                if (c0.Content.ModulesContent.TryGetValue(moduleName, out var moduleContent0))\n                {\n                    var moduleContent1 = c1.Content.ModulesContent[moduleName];\n\n                    var diffCount = moduleContent0\n                        .Count(entry => moduleContent1[entry.Key].ToString() != entry.Value.ToString());\n\n                    if (diffCount > 0)\n                    {\n                        return false;\n                    }\n                }\n                else\n                {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        /// <inheritdoc />\n        public void Dispose()\n        {\n            RegistryManager.Dispose();\n        }\n\n        /// <summary>\n        /// Access To Registry Manager\n        /// </summary>\n        public RegistryManager RegistryManager { get; }\n\n        /// <summary>\n        /// Default value for IIoT module names.\n        /// </summary>\n        public static IReadOnlyList<string> ModuleNamesDefault { get; } = new string[] { \"publisher\", \"twin\", \"discovery\" };\n\n        private readonly IIoTPlatformTestContext _context;\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Standalone/C_EventNamespaceTestTheory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Standalone\n{\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using TestExtensions;\n    using TestModels;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// The test theory using different (ordered) test cases to go thru all required steps of publishing OPC UA node\n    /// </summary>\n    [TestCaseOrderer(TestCaseOrderer.FullName, TestConstants.TestAssemblyName)]\n    [Trait(TestConstants.TraitConstants.PublisherModeTraitName, TestConstants.TraitConstants.PublisherModeTraitValue)]\n    public class CEventNamespaceTestTheory : DynamicAciTestBase, IClassFixture<IIoTStandaloneTestContext>\n    {\n        public CEventNamespaceTestTheory(IIoTStandaloneTestContext context, ITestOutputHelper output)\n            : base(context, output)\n        {\n        }\n\n        [Fact, PriorityOrder(10)]\n        public Task TestDeployAci()\n        {\n            return TestHelper.CreateSimulationContainerAsync(_context, new List<string> { \"/bin/sh\", \"-c\", \"./opcplc --autoaccept --ses --pn=50000\" }, _timeoutToken);\n        }\n\n        [Fact, PriorityOrder(11)]\n        public async Task TestVerifyIntegerNamespaceExpectSimpleEventsInHub()\n        {\n            // Arrange\n            var pnJson = SimpleEvents(\n                \"ns=0;i=2041\",\n                \"0:Message\",\n                \"ns=6;i=2\",\n                \"6:CycleId\",\n                \"ns=6;i=2\");\n\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemCycleStatusEventTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n\n            // Assert\n            VerifyPayloads(payloads);\n        }\n\n        [Fact, PriorityOrder(12)]\n        public async Task TestVerifyStringNamespaceExpectSimpleEventsInHub()\n        {\n            // Arrange\n            var pnJson = SimpleEvents(\n                \"i=2041\",\n                \"Message\",\n                \"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\",\n                \"http://microsoft.com/Opc/OpcPlc/SimpleEvents#CycleId\",\n                \"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\");\n\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemCycleStatusEventTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n\n            // Assert\n            VerifyPayloads(payloads);\n        }\n\n        [Fact, PriorityOrder(13)]\n        public async Task TestVerifyIntegerNamespaceExpectFilteredSimpleEventsInHub()\n        {\n            // Arrange\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.SimpleEventFilter(\"ns=6;i=2\"));\n\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemCycleStatusEventTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n\n            // Assert\n            VerifyPayloads(payloads);\n        }\n\n        [Fact, PriorityOrder(14)]\n        public async Task TestVerifyStringNamespaceExpectFilteredSimpleEventsInHub()\n        {\n            // Arrange\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.SimpleEventFilter(\"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\"));\n\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemCycleStatusEventTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n\n            // Assert\n            VerifyPayloads(payloads);\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Standalone/C_EventsStressTestTheory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Standalone\n{\n    using FluentAssertions;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using static System.TimeSpan;\n    using TestExtensions;\n    using TestModels;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// The test theory submitting a high load of event messages\n    /// </summary>\n    [TestCaseOrderer(TestCaseOrderer.FullName, TestConstants.TestAssemblyName)]\n    [Trait(TestConstants.TraitConstants.PublisherModeTraitName, TestConstants.TraitConstants.PublisherModeTraitValue)]\n    public class CEventsStressTestTheory : DynamicAciTestBase, IClassFixture<IIoTStandaloneTestContext>\n    {\n        public CEventsStressTestTheory(IIoTStandaloneTestContext context, ITestOutputHelper output)\n            : base(context, output)\n        {\n        }\n\n        [Fact, PriorityOrder(10)]\n        public async Task TestACIVerifyEnd2EndThroughputAndLatency()\n        {\n            // Settings\n            const int eventIntervalPerInstanceMs = 400;\n            const int eventInstances = 40;\n            const int instances = 10;\n            const int nSeconds = 20;\n            const int nSecondSkipFirst = 10;\n            const int nSecondSkipLast = 6;\n\n            // Arrange\n            await TestHelper.CreateSimulationContainerAsync(_context,\n                new List<string> { \"/bin/sh\", \"-c\", $\"./opcplc --autoaccept --ei={eventInstances} --er={eventIntervalPerInstanceMs} --pn=50000\" },\n                _timeoutToken,\n                numInstances: instances);\n\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemEventTypePayload>(_writerId, -1, _timeoutToken);\n\n            // Act\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.SimpleEventFilter(\"i=2041\")); // OPC-UA BaseEventType\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n\n            const int nSecondsTotal = nSeconds + nSecondSkipFirst + nSecondSkipLast;\n            var fullData = await messages\n                .TakeWhile(_context, (first, current) => current.EnqueuedTime - first.EnqueuedTime <= FromSeconds(nSecondsTotal))\n\n                // Get time of event attached Server node\n                .Select(e => (e.EnqueuedTime, SourceTimestamp: e.Payload.ReceiveTime.Value))\n                .ToListAsync(_timeoutToken);\n\n            // Assert throughput\n\n            // Trim first few and last seconds of data, since Publisher polls PLCs\n            // at different times\n            var intervalStart = fullData.Min(d => d.SourceTimestamp) + FromSeconds(nSecondSkipFirst);\n            var intervalEnd = fullData.Max(d => d.SourceTimestamp) - FromSeconds(nSecondSkipLast);\n            var intervalDuration = intervalEnd - intervalStart;\n            var eventData = fullData.Where(d => d.SourceTimestamp > intervalStart && d.SourceTimestamp < intervalEnd).ToList();\n\n            // Bin events by 1-second interval to compute event rate histogram\n            var eventRatesBySecond = eventData\n                .GroupBy(s => s.SourceTimestamp.Value.Truncate(FromSeconds(1)))\n                .Select(g => g.Count())\n                .ToArray()[1..^1];\n\n            const int expectedEventsPerSecond = instances * eventInstances * 1000 / eventIntervalPerInstanceMs;\n            _context.OutputHelper.WriteLine($\"Event rates per second, by second: {string.Join(',', eventRatesBySecond)} e/s (expected {expectedEventsPerSecond} e/s)\");\n\n            // Assert latency\n            var end2EndLatency = eventData\n                .ConvertAll(v => v.EnqueuedTime - v.SourceTimestamp);\n            end2EndLatency.Min().Should().BePositive();\n            end2EndLatency.Average(v => v.Value.TotalMilliseconds).Should().BeLessThan(8000);\n\n            // var eventRate = eventData.Count / intervalDuration.Value.TotalSeconds;\n            var eventRate = eventRatesBySecond.Average();\n            intervalDuration.Should().BeGreaterThan(FromSeconds(nSeconds));\n            eventData.Count.Should().BeGreaterThan(nSeconds * expectedEventsPerSecond,\n                \"Publisher should produce data continuously\");\n            eventRate.Should().BeApproximately(\n                expectedEventsPerSecond,\n                expectedEventsPerSecond / 10d,\n                \"Publisher should match PLC event rate\");\n\n            var (average, stDev) = DescriptiveStats(eventRatesBySecond);\n\n            average.Should().BeApproximately(\n                expectedEventsPerSecond,\n                expectedEventsPerSecond / 10d,\n                \"Publisher should match PLC event rate\");\n\n            stDev.Should().BeLessThan(expectedEventsPerSecond / 3d, \"Publisher should sustain PLC event rate\");\n        }\n\n        private static (double average, double stDev) DescriptiveStats(IReadOnlyCollection<int> population)\n        {\n            var average = population.Average();\n            var stDev = Math.Sqrt(population.Sum(v => (v - average) * (v - average)) / population.Count);\n            return (average, stDev);\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Standalone/C_PendingConditionsTestTheory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Standalone\n{\n    using OpcPublisherAEE2ETests.TestExtensions;\n    using OpcPublisherAEE2ETests.TestModels;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// The test theory using different (ordered) test cases to go thru all required steps of publishing OPC UA node\n    /// </summary>\n    [TestCaseOrderer(TestCaseOrderer.FullName, TestConstants.TestAssemblyName)]\n    [Trait(TestConstants.TraitConstants.PublisherModeTraitName, TestConstants.TraitConstants.PublisherModeTraitValue)]\n    public class CPendingConditionsTestTheory : DynamicAciTestBase, IClassFixture<IIoTStandaloneTestContext>\n    {\n        public CPendingConditionsTestTheory(IIoTStandaloneTestContext context, ITestOutputHelper output)\n        : base(context, output)\n        {\n        }\n\n        [Fact, PriorityOrder(10)]\n        public async Task TestVerifyDataAvailableAtIoTHubExpectPendingAlarmsView()\n        {\n            // Arrange\n            await TestHelper.CreateSimulationContainerAsync(_context, new List<string>\n                {\"/bin/sh\", \"-c\", \"./opcplc --autoaccept --alm --pn=50000\"},\n                _timeoutToken);\n\n            var messages = _consumer.ReadConditionMessagesFromWriterIdAsync<ConditionTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n            TestConstants.PublishedNodesConfigurations.PendingConditionForAlarmsView());\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n\n            // Assert\n            ValidatePendingConditionsView(payloads);\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Standalone/C_PublishConditionsTestTheory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Standalone\n{\n    using FluentAssertions;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using static System.TimeSpan;\n    using TestExtensions;\n    using TestModels;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// The test theory using different (ordered) test cases to go thru all required steps of publishing OPC UA node\n    /// </summary>\n    [TestCaseOrderer(TestCaseOrderer.FullName, TestConstants.TestAssemblyName)]\n    [Trait(TestConstants.TraitConstants.PublisherModeTraitName, TestConstants.TraitConstants.PublisherModeTraitValue)]\n    public class CPublishConditionsTestTheory : DynamicAciTestBase, IClassFixture<IIoTStandaloneTestContext>\n    {\n        private static readonly TimeSpan Precision = FromMilliseconds(500);\n\n        public CPublishConditionsTestTheory(IIoTStandaloneTestContext context, ITestOutputHelper output)\n            : base(context, output)\n        {\n        }\n\n        [Fact, PriorityOrder(11)]\n        public async Task TestACIVerifyDataAvailableAtIoTHubExpectNumberOfEventsGreaterThanZero()\n        {\n            // Arrange\n            await TestHelper.CreateSimulationContainerAsync(_context, new List<string>\n                {\"/bin/sh\", \"-c\", \"./opcplc --autoaccept --dalm=files/sc001.json --pn=50000\"},\n                _timeoutToken,\n                \"opc-plc-files/sc001.json\");\n\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<ConditionTypePayload>(_writerId, 10000, _timeoutToken, _context);\n\n            // Act\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.SimpleEventFilter());\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n\n            const int nMessages = 6;\n            var payloads = await messages\n                .Select(e => e.Payload)\n                .Skip(nMessages) // First batch of alarms are from a ConditionRefresh, therefore not in order\n                .SkipWhile(c => !c.Message.Value.Contains(\"LAST EVENT IN LOOP\", StringComparison.Ordinal))\n                .Skip(1)\n                .Take(nMessages)\n                .ToListAsync(_timeoutToken);\n\n            // Assert\n\n            var i = -1;\n            var doorOpen = new ConditionTypePayload\n            {\n                ConditionName = DataValueObject.Create(\"VendingMachine1_DoorOpen\"),\n                EnabledState = DataValueObject.Create(\"Enabled\"),\n                EnabledStateEffectiveDisplayName = DataValueObject.Create(\"Active | Unacknowledged\"),\n                EnabledStateId = DataValueObject.Create<bool?>(true),\n                EventType = DataValueObject.Create(\"i=10751\"),\n                LastSeverity = DataValueObject.Create<int?>(500),\n                Message = DataValueObject.Create(\"Door Open\"),\n                Retain = DataValueObject.Create<bool?>(true),\n                Severity = DataValueObject.Create(900),\n                SourceName = DataValueObject.Create(\"VendingMachine1\"),\n                SourceNode = DataValueObject.Create(\"http://microsoft.com/Opc/OpcPlc/DetermAlarmsInstance#s=VendingMachine1\")\n            };\n            VerifyPayload(payloads, ++i, null, doorOpen);\n\n            VerifyPayload(payloads,\n                ++i,\n                FromSeconds(5),\n                new ConditionTypePayload\n                {\n                    ConditionName = DataValueObject.Create(\"VendingMachine2_LightOff\"),\n                    EnabledState = DataValueObject.Create(\"Enabled\"),\n                    EnabledStateEffectiveDisplayName = DataValueObject.Create(\"Active | Unacknowledged\"),\n                    EnabledStateId = DataValueObject.Create<bool?>(true),\n                    EventType = DataValueObject.Create(\"i=10637\"),\n                    LastSeverity = DataValueObject.Create<int?>(500),\n                    Message = DataValueObject.Create(\"Light Off in machine\"),\n                    Retain = DataValueObject.Create<bool?>(true),\n                    Severity = DataValueObject.Create(500),\n                    SourceName = DataValueObject.Create(\"VendingMachine2\"),\n                    SourceNode = DataValueObject.Create(\"http://microsoft.com/Opc/OpcPlc/DetermAlarmsInstance#s=VendingMachine2\")\n                });\n\n            VerifyPayload(payloads,\n                ++i,\n                Zero,\n                new ConditionTypePayload\n                {\n                    ConditionName = DataValueObject.Create(\"VendingMachine1_AD_Lamp_Off\"),\n                    EnabledState = DataValueObject.Create(\"Enabled\"),\n                    EnabledStateEffectiveDisplayName = DataValueObject.Create(\"Enabled\"),\n                    EnabledStateId = DataValueObject.Create<bool?>(true),\n                    EventType = DataValueObject.Create(\"i=2782\"),\n                    LastSeverity = DataValueObject.Create<int?>(500),\n                    Message = DataValueObject.Create(\"AD Lamp Off\"),\n                    Retain = DataValueObject.Create<bool?>(true),\n                    Severity = DataValueObject.Create(500),\n                    SourceName = DataValueObject.Create(\"VendingMachine1\"),\n                    SourceNode = DataValueObject.Create(\"http://microsoft.com/Opc/OpcPlc/DetermAlarmsInstance#s=VendingMachine1\")\n                });\n\n            VerifyPayload(payloads,\n                ++i,\n                FromSeconds(5),\n                new ConditionTypePayload\n                {\n                    ConditionName = DataValueObject.Create(\"VendingMachine1_DoorOpen\"),\n                    EnabledState = DataValueObject.Create(\"Enabled\"),\n                    EnabledStateEffectiveDisplayName = DataValueObject.Create(\"Inactive | Unacknowledged\"),\n                    EnabledStateId = DataValueObject.Create<bool?>(true),\n                    EventType = DataValueObject.Create(\"i=10751\"),\n                    LastSeverity = DataValueObject.Create<int?>(900),\n                    Message = DataValueObject.Create(\"Door Closed\"),\n                    Retain = DataValueObject.Create<bool?>(false),\n                    Severity = DataValueObject.Create(500),\n                    SourceName = DataValueObject.Create(\"VendingMachine1\"),\n                    SourceNode = DataValueObject.Create(\"http://microsoft.com/Opc/OpcPlc/DetermAlarmsInstance#s=VendingMachine1\")\n                });\n\n            VerifyPayload(payloads,\n                ++i,\n                FromSeconds(4),\n                new ConditionTypePayload\n                {\n                    ConditionName = DataValueObject.Create(\"VendingMachine1_TemperatureHigh\"),\n                    EnabledState = DataValueObject.Create(\"Enabled\"),\n                    EnabledStateEffectiveDisplayName = DataValueObject.Create(\"Active | Unacknowledged\"),\n                    EnabledStateId = DataValueObject.Create<bool?>(true),\n                    EventType = DataValueObject.Create(\"i=2955\"),\n                    LastSeverity = DataValueObject.Create<int?>(900),\n                    Message = DataValueObject.Create(\"Temperature is HIGH (LAST EVENT IN LOOP)\"),\n                    Retain = DataValueObject.Create<bool?>(true),\n                    Severity = DataValueObject.Create(900),\n                    SourceName = DataValueObject.Create(\"VendingMachine1\"),\n                    SourceNode = DataValueObject.Create(\"http://microsoft.com/Opc/OpcPlc/DetermAlarmsInstance#s=VendingMachine1\")\n                });\n\n            VerifyPayload(payloads, ++i, Zero, doorOpen); // cycling back to first message\n        }\n\n        private static void VerifyPayload(IReadOnlyList<ConditionTypePayload> payloads, int i, TimeSpan? expectedDelay, ConditionTypePayload expectedPayload)\n        {\n            var p = payloads[i];\n\n            p.ConditionName.Value.Should().BeEquivalentTo(expectedPayload.ConditionName.Value);\n            p.EventType.Value.Should().BeEquivalentTo(expectedPayload.EventType.Value);\n            p.EnabledState.Value.Should().BeEquivalentTo(expectedPayload.EnabledState.Value);\n            p.EnabledStateId.Value.Should().Be(expectedPayload.EnabledStateId.Value);\n            p.EnabledStateEffectiveDisplayName.Value.Should().BeEquivalentTo(expectedPayload.EnabledStateEffectiveDisplayName.Value);\n            p.LastSeverity.Value.Should().Be(expectedPayload.LastSeverity.Value);\n            p.Retain.Value.Should().Be(expectedPayload.Retain.Value);\n            p.SourceName.Value.Should().BeEquivalentTo(expectedPayload.SourceName.Value);\n            p.SourceNode.Value.Should().BeEquivalentTo(expectedPayload.SourceNode.Value);\n\n            p.ConditionId.Value.Should().StartWith(\"http://microsoft.com/Opc/OpcPlc/DetermAlarmsInstance#i=\");\n\n            p.EnabledStateEffectiveTransitionTime.Value.Should().BeCloseTo(p.ReceiveTime.Value.Value, Precision);\n            p.EnabledStateTransitionTime.Value.Should().BeCloseTo(p.ReceiveTime.Value.Value, Precision);\n\n            if (expectedDelay != null)\n            {\n                i.Should().BeGreaterThan(0);\n                var transitionTime = p.EnabledStateEffectiveTransitionTime.Value - payloads[i - 1].EnabledStateEffectiveTransitionTime.Value;\n                // TODO there is no difference in the transition time...\n                // transitionTime.Should().BeCloseTo(expectedDelay.Value, Precision);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Standalone/C_WhereClauseTestTheory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Standalone\n{\n    using OpcPublisherAEE2ETests.TestExtensions;\n    using Newtonsoft.Json.Linq;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// The test theory using different (ordered) test cases to go thru all required steps of publishing OPC UA node\n    /// </summary>\n    [TestCaseOrderer(TestCaseOrderer.FullName, TestConstants.TestAssemblyName)]\n    [Trait(TestConstants.TraitConstants.PublisherModeTraitName, TestConstants.TraitConstants.PublisherModeTraitValue)]\n    public class CWhereClauseTestTheory : DynamicAciTestBase, IClassFixture<IIoTStandaloneTestContext>\n    {\n        public CWhereClauseTestTheory(IIoTStandaloneTestContext context, ITestOutputHelper output)\n            : base(context, output)\n        {\n        }\n\n        [Fact, PriorityOrder(10)]\n        public async Task TestVerifyDataAvailableAtIoTHubExpectFieldsToMatchSimpleFilter()\n        {\n            // Arrange\n            await TestHelper.CreateSimulationContainerAsync(_context, new List<string>\n                {\"/bin/sh\", \"-c\", \"./opcplc --autoaccept --ses --pn=50000\"},\n                _timeoutToken);\n\n            var messages = _consumer.ReadMessagesFromWriterIdAsync(_writerId, -1, null, _timeoutToken);\n\n            // Act\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.SimpleEventFilter(\"i=2041\")); // OPC-UA BaseEventType\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n\n            // take any message\n            var (_, _, payload, _) = await messages.FirstAsync(_timeoutToken);\n\n            // Assert\n            ValidateBaseEventTypeFields(payload);\n        }\n\n        [Fact, PriorityOrder(11)]\n        public async Task TestVerifyDataAvailableAtIoTHubExpectFieldsToMatchEventFilter()\n        {\n            // Arrange\n            await TestHelper.CreateSimulationContainerAsync(_context, new List<string>\n                {\"/bin/sh\", \"-c\", \"./opcplc --autoaccept --ses --pn=50000\"},\n                _timeoutToken);\n\n            var messages = _consumer.ReadMessagesFromWriterIdAsync(_writerId, -1, null, _timeoutToken);\n\n            // Act\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.SimpleEventFilter(\"i=2041\")); // OPC-UA BaseEventType\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n            // take any message\n            var (_, _, payload, _) = await messages\n                .FirstAsync(_timeoutToken);\n\n            // Assert\n            ValidateBaseEventTypeFields(payload);\n        }\n\n        [Fact, PriorityOrder(12)]\n        public async Task TestVerifyDataAvailableAtIoTHubExpectFieldsToSimpleEvents()\n        {\n            // Arrange\n            await TestHelper.CreateSimulationContainerAsync(_context, new List<string>\n                {\"/bin/sh\", \"-c\", \"./opcplc --autoaccept --ses --pn=50000\"},\n                _timeoutToken);\n\n            var messages = _consumer.ReadMessagesFromWriterIdAsync(_writerId, -1, null, _timeoutToken);\n\n            // Act\n            var pnJson = TestConstants.PublishedNodesConfigurations.SimpleEvents(_context.PlcAciDynamicUrls[0],\n                50000,\n                _writerId);\n            await TestHelper.SwitchToStandaloneModeAndPublishNodesAsync(pnJson, _context, _timeoutToken);\n            // take any message\n            var (_, _, payload, _) = await messages\n                .FirstAsync(_timeoutToken);\n\n            // Assert\n            ValidateSimpleEventFields(payload);\n        }\n\n        private static void ValidateBaseEventTypeFields(JObject ev)\n        {\n            // navigate to the event fields (nested several layers)\n            var fields = ev.Children().ToList();\n            Assert.Equal(13, fields.Count);\n            Assert.Contains(fields, x => x.Path.EndsWith(\"EventId\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"EventType\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"SourceNode\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"SourceName\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"Time\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"ReceiveTime\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"LocalTime\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"Message\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"Severity\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"ConditionClassId\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"ConditionClassName\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"ConditionSubClassId\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"ConditionSubClassName\", StringComparison.Ordinal));\n        }\n\n        private static void ValidateSimpleEventFields(JObject ev)\n        {\n            // navigate to the event fields (nested several layers)\n            var fields = ev.Children();\n            Assert.Equal(4, fields.Count());\n            Assert.Contains(fields, x => x.Path.EndsWith(\"EventId\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.EndsWith(\"Message\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.Contains(\"http://microsoft.com/Opc/OpcPlc/SimpleEvents#CycleId\", StringComparison.Ordinal));\n            Assert.Contains(fields, x => x.Path.Contains(\"http://microsoft.com/Opc/OpcPlc/SimpleEvents#CurrentStep\", StringComparison.Ordinal));\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Standalone/D_AlarmDirectMethodTestTheory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Standalone\n{\n    using OpcPublisherAEE2ETests.TestExtensions;\n    using OpcPublisherAEE2ETests.TestModels;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// The test theory using different (ordered) test cases to go thru all required steps of publishing OPC UA node\n    /// </summary>\n    [TestCaseOrderer(TestCaseOrderer.FullName, TestConstants.TestAssemblyName)]\n    [Trait(TestConstants.TraitConstants.PublisherModeTraitName, TestConstants.TraitConstants.PublisherModeTraitValue)]\n    public class DAlarmDirectMethodTestTheory : DynamicAciTestBase, IClassFixture<IIoTStandaloneTestContext>\n    {\n        public DAlarmDirectMethodTestTheory(IIoTStandaloneTestContext context, ITestOutputHelper output)\n        : base(context, output)\n        {\n        }\n\n        [Fact, PriorityOrder(10)]\n        public async Task TestVerifyDataAvailableAtIoTHubExpectPendingConditionsView()\n        {\n            // Arrange\n            await TestHelper.CreateSimulationContainerAsync(_context, new List<string>\n                {\"/bin/sh\", \"-c\", \"./opcplc --autoaccept --alm --pn=50000\"},\n                _timeoutToken);\n\n            var messages = _consumer.ReadConditionMessagesFromWriterIdAsync<ConditionTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.PendingConditionForAlarmsView());\n            await PublishNodesAsync(pnJson, _timeoutToken);\n\n            // take any message\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n            await UnpublishAllNodesAsync(_timeoutToken);\n\n            // Assert\n            ValidatePendingConditionsView(payloads);\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Standalone/D_EventDirectMethodTestTheory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Standalone\n{\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using TestExtensions;\n    using TestModels;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// The test theory using different (ordered) test cases to go thru all required steps of publishing OPC UA node\n    /// </summary>\n    [TestCaseOrderer(TestCaseOrderer.FullName, TestConstants.TestAssemblyName)]\n    [Trait(TestConstants.TraitConstants.PublisherModeTraitName, TestConstants.TraitConstants.PublisherModeTraitValue)]\n    public class DEventDirectMethodTestTheory : DynamicAciTestBase, IClassFixture<IIoTStandaloneTestContext>\n    {\n        public DEventDirectMethodTestTheory(IIoTStandaloneTestContext context, ITestOutputHelper output)\n            : base(context, output)\n        {\n        }\n\n        [Fact, PriorityOrder(10)]\n        public Task TestDeployAci()\n        {\n            return TestHelper.CreateSimulationContainerAsync(_context, new List<string> { \"/bin/sh\", \"-c\", \"./opcplc --autoaccept --ses --pn=50000\" }, _timeoutToken);\n        }\n\n        [Fact, PriorityOrder(11)]\n        public async Task TestVerifyIntegerNamespaceExpectSimpleEventsInHub()\n        {\n            // Arrange\n            var pnJson = SimpleEvents(\n                \"ns=0;i=2041\",\n                \"0:Message\",\n                \"ns=6;i=2\",\n                \"6:CycleId\",\n                \"ns=6;i=2\");\n\n            await PublishNodesAsync(pnJson, _timeoutToken);\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemCycleStatusEventTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n            await UnpublishAllNodesAsync(_timeoutToken);\n\n            // Assert\n            VerifyPayloads(payloads);\n        }\n\n        [Fact, PriorityOrder(12)]\n        public async Task TestVerifyStringNamespaceExpectSimpleEventsInHub()\n        {\n            // Arrange\n            var pnJson = SimpleEvents(\n                \"i=2041\",\n                \"Message\",\n                \"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\",\n                \"http://microsoft.com/Opc/OpcPlc/SimpleEvents#CycleId\",\n                \"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\");\n\n            await PublishNodesAsync(pnJson, _timeoutToken);\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemCycleStatusEventTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n            await UnpublishAllNodesAsync(_timeoutToken);\n\n            // Assert\n            VerifyPayloads(payloads);\n        }\n\n        [Fact, PriorityOrder(13)]\n        public async Task TestVerifyIntegerNamespaceExpectFilteredSimpleEventsInHub()\n        {\n            // Arrange\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.SimpleEventFilter(\"ns=6;i=2\"));\n\n            await PublishNodesAsync(pnJson, _timeoutToken);\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemCycleStatusEventTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n            await UnpublishAllNodesAsync(_timeoutToken);\n\n            // Assert\n            VerifyPayloads(payloads);\n        }\n\n        [Fact, PriorityOrder(14)]\n        public async Task TestVerifyStringNamespaceExpectFilteredSimpleEventsInHub()\n        {\n            // Arrange\n            var pnJson = _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                TestConstants.PublishedNodesConfigurations.SimpleEventFilter(\"nsu=http://microsoft.com/Opc/OpcPlc/SimpleEvents;i=2\"));\n\n            await PublishNodesAsync(pnJson, _timeoutToken);\n            var messages = _consumer.ReadMessagesFromWriterIdAsync<SystemCycleStatusEventTypePayload>(_writerId, 1, _timeoutToken);\n\n            // Act\n            var payloads = await messages.Select(v => v.Payload).ToListAsync(_timeoutToken);\n            await UnpublishAllNodesAsync(_timeoutToken);\n\n            // Assert\n            VerifyPayloads(payloads);\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/Standalone/DynamicAciTestBase.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Standalone\n{\n    using OpcPublisherAEE2ETests.TestExtensions;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.Messaging.EventHubs.Consumer;\n    using FluentAssertions;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Azure.Devices;\n    using Newtonsoft.Json.Linq;\n    using System;\n    using System.Collections.Generic;\n    using System.Net;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using TestModels;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// Base class for standalone tests using dynamic ACI\n    /// </summary>\n    [TestCaseOrderer(TestCaseOrderer.FullName, TestConstants.TestAssemblyName)]\n    [Trait(TestConstants.TraitConstants.PublisherModeTraitName, TestConstants.TraitConstants.PublisherModeTraitValue)]\n    public abstract class DynamicAciTestBase : IDisposable\n    {\n        protected readonly IIoTStandaloneTestContext _context;\n        protected readonly CancellationToken _timeoutToken;\n        protected readonly EventHubConsumerClient _consumer;\n        protected readonly string _writerId;\n        private readonly ISerializer _serializer;\n        private readonly ServiceClient _iotHubClient;\n        private readonly CancellationTokenSource _timeoutTokenSource;\n        private readonly string _iotHubPublisherDeviceName;\n        private readonly string _iotHubPublisherModuleName;\n\n        protected DynamicAciTestBase(IIoTStandaloneTestContext context, ITestOutputHelper output)\n        {\n            _context = context ?? throw new ArgumentNullException(nameof(context));\n            _context.SetOutputHelper(output);\n            _timeoutTokenSource = new CancellationTokenSource(TestConstants.MaxTestTimeoutMilliseconds);\n            _timeoutToken = _timeoutTokenSource.Token;\n            _iotHubPublisherDeviceName = _context.DeviceConfig.DeviceId;\n            _iotHubPublisherModuleName = _context.IoTHubPublisherDeployment.ModuleName;\n            _consumer = _context.GetEventHubConsumerClient();\n            _writerId = Guid.NewGuid().ToString();\n            _serializer = new NewtonsoftJsonSerializer();\n\n            // Initialize DeviceServiceClient from IoT Hub connection string.\n            _iotHubClient = TestHelper.DeviceServiceClient(\n                _context.IoTHubConfig.IoTHubConnectionString,\n                Microsoft.Azure.Devices.TransportType.Amqp_WebSocket_Only\n            );\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                if (_consumer != null)\n                {\n                    _consumer.CloseAsync(CancellationToken.None).GetAwaiter().GetResult();\n                    _consumer.DisposeAsync().AsTask().GetAwaiter().GetResult();\n\n                    _iotHubClient.Dispose();\n                }\n                _timeoutTokenSource?.Dispose();\n            }\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        [Fact, PriorityOrder(1)]\n        public async Task TestDeployStandalonePublisher()\n        {\n            await _context.RegistryHelper.DeployStandalonePublisherAsync(\n                OpcPublisherAEE2ETests.MessagingMode.PubSub, _timeoutToken);\n        }\n\n        [Fact, PriorityOrder(998)]\n        public async Task TestRestartStandalonePublisher()\n        {\n            await _context.RegistryHelper.RestartStandalonePublisherAsync(\n                OpcPublisherAEE2ETests.MessagingMode.PubSub, false, _timeoutToken);\n        }\n\n        [Fact, PriorityOrder(999)]\n        public async Task TestDeleteAci()\n        {\n            await TestHelper.DeleteSimulationContainerAsync(_context, _timeoutToken);\n        }\n\n        /// <summary>\n        /// Perform direct method call.\n        /// </summary>\n        /// <param name=\"parameters\"> Direct method parameters. </param>\n        /// <param name=\"ct\"> Cancellation token. </param>\n        /// <returns></returns>\n        protected async Task<MethodResultModel> CallMethodAsync(\n            MethodParameterModel parameters,\n            CancellationToken ct\n        )\n        {\n            return await TestHelper.CallMethodAsync(\n                _iotHubClient,\n                _iotHubPublisherDeviceName,\n                _iotHubPublisherModuleName,\n                parameters,\n                _context,\n                ct\n            ).ConfigureAwait(false);\n        }\n\n        protected async Task PublishNodesAsync(string json, CancellationToken ct)\n        {\n            await UnpublishAllNodesAsync(ct).ConfigureAwait(false);\n            var entries = _serializer.Deserialize<PublishedNodesEntryModel[]>(json);\n            foreach (var entry in entries)\n            {\n                // Call PublishNodes direct method\n                var result = await CallMethodAsync(\n                    new MethodParameterModel\n                    {\n                        Name = TestConstants.DirectMethodNames.PublishNodes,\n                        JsonPayload = _serializer.SerializeToString(entry)\n                    },\n                    ct\n                ).ConfigureAwait(false);\n\n                Assert.Equal((int)HttpStatusCode.OK, result.Status);\n            }\n\n            var result1 = await CallMethodAsync(\n                new MethodParameterModel\n                {\n                    Name = TestConstants.DirectMethodNames.GetConfiguredEndpoints\n                },\n                ct\n            ).ConfigureAwait(false);\n\n            Assert.Equal((int)HttpStatusCode.OK, result1.Status);\n            var response = _serializer.Deserialize<GetConfiguredEndpointsResponseModel>(result1.JsonPayload);\n            Assert.Equal(entries.Length, response.Endpoints.Count);\n        }\n\n        protected async Task UnpublishAllNodesAsync(CancellationToken ct = default)\n        {\n            MethodResultModel result = null;\n            for (var i = 0; i < 5; i++)\n            {\n                result = await CallMethodAsync(\n                    new MethodParameterModel\n                    {\n                        Name = TestConstants.DirectMethodNames.UnpublishAllNodes,\n\n                        // TODO: Remove this line to test fix for null request crash\n                        JsonPayload = \"null\"\n                    },\n                    ct\n                ).ConfigureAwait(false);\n\n                if (result.Status == 405)\n                {\n                    // Retry if method not yet mounted\n                    _context.OutputHelper?.WriteLine(result.JsonPayload);\n                    await Task.Delay(TestConstants.DefaultDelayMilliseconds, ct);\n                    continue;\n                }\n                break;\n            }\n            Assert.Equal((int)HttpStatusCode.OK, result?.Status);\n\n            var result1 = await CallMethodAsync(\n                new MethodParameterModel\n                {\n                    Name = TestConstants.DirectMethodNames.GetConfiguredEndpoints\n                },\n                ct\n            ).ConfigureAwait(false);\n\n            Assert.Equal((int)HttpStatusCode.OK, result1.Status);\n            var response = _serializer.Deserialize<GetConfiguredEndpointsResponseModel>(result1.JsonPayload);\n            Assert.Empty(response.Endpoints);\n        }\n\n        protected string SimpleEvents(string messageTypeDefinitionId, string messageBrowsePath,\n            string cycleIdDefinitionId, string cycleIdBrowsePath, string filterTypeDefinitionId)\n        {\n            return _context.PublishedNodesJson(\n                50000,\n                _writerId,\n                new JArray(\n                    new JObject(\n                        new JProperty(\"Id\", \"ns=0;i=2253\"),\n                        new JProperty(\"QueueSize\", 10),\n                        new JProperty(\"DisplayName\", \"SimpleEvents\"),\n                        new JProperty(\"EventFilter\", new JObject(\n                            new JProperty(\"SelectClauses\", new JArray(\n                                new JObject(\n                                    new JProperty(\"TypeDefinitionId\", messageTypeDefinitionId),\n                                    new JProperty(\"BrowsePath\", new JArray(\n                                        new JValue(messageBrowsePath)))),\n                                new JObject(\n                                    new JProperty(\"TypeDefinitionId\", cycleIdDefinitionId),\n                                    new JProperty(\"BrowsePath\", new JArray(\n                                        new JValue(cycleIdBrowsePath)))))),\n                            new JProperty(\"WhereClause\", new JObject(\n                                new JProperty(\"Elements\", new JArray(\n                                    new JObject(\n                                        new JProperty(\"FilterOperator\", new JValue(\"OfType\")),\n                                        new JProperty(\"FilterOperands\", new JArray(\n                                            new JObject(\n                                                new JProperty(\"Value\", filterTypeDefinitionId))))))))))))));\n        }\n\n        protected static void VerifyPayloads(IEnumerable<SystemCycleStatusEventTypePayload> payloads)\n        {\n            foreach (var payload in payloads)\n            {\n                payload.Message.Value.Should().Match(\"The system cycle '*' has started.\");\n                payload.CycleId.Value.Should().MatchRegex(\"^\\\\d+$\");\n            }\n        }\n\n        protected static void ValidatePendingConditionsView(IEnumerable<ConditionTypePayload> eventData)\n        {\n            foreach (var pendingMessage in eventData)\n            {\n                pendingMessage.ConditionId.Value.Should().StartWith(\"http://microsoft.com/Opc/OpcPlc/AlarmsInstance#\");\n                pendingMessage.Retain.Value.Should().BeTrue();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestConstants.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests\n{\n    /// <summary>\n    /// Contains constants using for End 2 End testing\n    /// </summary>\n    internal static partial class TestConstants\n    {\n        /// <summary>\n        /// Character that need to be used when split value of \"PLC_SIMULATION_XYZ\" environment variables\n        /// </summary>\n        public static char SimulationUrlsSeparator = ';';\n\n        /// <summary>\n        /// Name of the test assembly\n        /// </summary>\n        public const string TestAssemblyName = \"OpcPublisher-AE-E2E-Tests\";\n\n        /// <summary>\n        /// Default timeout of web calls\n        /// </summary>\n        public const int DefaultTimeoutInMilliseconds = 90 * 1000;\n\n        /// <summary>\n        /// Default delay interval in milliseconds\n        /// </summary>\n        public const int DefaultDelayMilliseconds = 5 * 1000;\n\n        /// <summary>\n        /// Maximum timeout for a test case\n        /// </summary>\n        public const int MaxTestTimeoutMilliseconds = 10 * 60 * 1000;\n\n        /// <summary>\n        /// Name of Published Nodes Json used by publisher module\n        /// </summary>\n        public const string PublishedNodesFilename = \"published_nodes.json\";\n\n        /// <summary>\n        /// Folder to store published_nodes.json file\n        /// </summary>\n        public const string PublishedNodesFolder = \"/mount/opc_publisher\";\n\n        /// <summary>\n        /// The full name of the publishednodes.json on the Edge\n        /// </summary>\n        public static readonly string PublishedNodesFullName =\n            PublishedNodesFolder.TrimEnd('/') + \"/\" + PublishedNodesFilename;\n\n        /// <summary>\n        /// Default Microsoft Container Registry\n        /// </summary>\n        public const string MicrosoftContainerRegistry = \"mcr.microsoft.com\";\n\n        /// <summary>\n        /// IoT Hub Event Hubs endpoint consumer group for tests\n        /// </summary>\n        public const string TestConsumerGroupName = \"TestConsumer\";\n\n        /// <summary>\n        /// Contains constants for OPC PLC\n        /// </summary>\n        internal static class OpcSimulation\n        {\n            /// <summary>\n            /// Default port of OPC UA Server endpoint of OPC PLC\n            /// </summary>\n            public const ushort Port = 50000;\n\n            /// <summary>\n            /// Name of Published Nodes Json file generated by OPC PLC, containing information\n            /// of provided (simulated) OPC UA Nodes\n            /// </summary>\n            public const string PublishedNodesFile = \"pn.json\";\n\n            /// <summary>\n            /// The share that is created in the pipeline\n            /// </summary>\n            public const string FileShareName = \"acishare\";\n\n            /// <summary>\n            /// This is the first part of the Azure Storage name that is created in pipeline\n            /// </summary>\n            public const string AzureStorageNameWithoutSuffix = \"e2etestingstorage\";\n\n            /// <summary>\n            /// Name of Tag in Resource Group\n            /// </summary>\n            public const string TestingResourcesSuffixName = \"TestingResourcesSuffix\";\n        }\n\n        /// <summary>\n        /// Contains names of Environment variables available for tests\n        /// </summary>\n        internal static class EnvironmentVariablesNames\n        {\n            /// <summary>\n            /// Tenant name used for authentication of Industrial IoT Platform\n            /// </summary>\n            public const string PCS_AUTH_TENANT = \"PCS_AUTH_TENANT\";\n\n            /// <summary>\n            /// Client App ID used for authentication of Industrial IoT Platform\n            /// </summary>\n            public const string PCS_AUTH_CLIENT_APPID = \"PCS_AUTH_CLIENT_APPID\";\n\n            /// <summary>\n            /// Client Secrete used for authentication of Industrial IoT Platform\n            /// </summary>\n            public const string PCS_AUTH_CLIENT_SECRET = \"PCS_AUTH_CLIENT_SECRET\";\n\n            /// <summary>\n            /// Semicolon separated URLs to load published_nodes.json from OPC-PLCs\n            /// </summary>\n            public const string PLC_SIMULATION_URLS = \"PLC_SIMULATION_URLS\";\n\n            /// <summary>\n            /// Semicolon separated ip addresses of OPC Plcs\n            /// </summary>\n            public const string PLC_SIMULATION_IPS = \"PLC_SIMULATION_IPS\";\n\n            /// <summary>\n            /// IoTEdge version\n            /// </summary>\n            public const string IOT_EDGE_VERSION = \"IOT_EDGE_VERSION\";\n\n            /// <summary>\n            /// Device identity of edge device at IoT Hub\n            /// </summary>\n            public const string IOT_EDGE_DEVICE_ID = \"IOT_EDGE_DEVICE_ID\";\n\n            /// <summary>\n            /// DNS name of edge device\n            /// </summary>\n            public const string IOT_EDGE_DEVICE_DNSNAME = \"IOT_EDGE_DEVICE_DNSNAME\";\n\n            /// <summary>\n            /// User name of vm that hosting edge device\n            /// </summary>\n            public const string IOT_EDGE_VM_USERNAME = \"IOT_EDGE_VM_USERNAME\";\n\n            /// <summary>\n            /// SSH public key of vm that hosting edge device\n            /// </summary>\n            public const string IOT_EDGE_VM_PUBLICKEY = \"IOT_EDGE_VM_PUBLICKEY\";\n\n            /// <summary>\n            /// SSH private key of vm that hosting edge device\n            /// </summary>\n            public const string IOT_EDGE_VM_PRIVATEKEY = \"IOT_EDGE_VM_PRIVATEKEY\";\n\n            /// <summary>\n            /// IoT Hub connection string\n            /// </summary>\n            public const string PCS_IOTHUB_CONNSTRING = \"PCS_IOTHUB_CONNSTRING\";\n\n            /// <summary>\n            /// The connection string of the event-hub compatible endpoint of IoT Hub.\n            /// </summary>\n            public const string IOTHUB_EVENTHUB_CONNECTIONSTRING = \"IOTHUB_EVENTHUB_CONNECTIONSTRING\";\n\n            /// <summary>\n            /// Container Registry server\n            /// </summary>\n            public const string PCS_DOCKER_SERVER = \"PCS_DOCKER_SERVER\";\n\n            /// <summary>\n            /// Container Registry user name\n            /// </summary>\n            public const string PCS_DOCKER_USER = \"PCS_DOCKER_USER\";\n\n            /// <summary>\n            /// Container Registry password\n            /// </summary>\n            public const string PCS_DOCKER_PASSWORD = \"PCS_DOCKER_PASSWORD\";\n\n            /// <summary>\n            ///Images namespace\n            /// </summary>\n            public const string PCS_IMAGES_NAMESPACE = \"PCS_IMAGES_NAMESPACE\";\n\n            /// <summary>\n            /// Images tag\n            /// </summary>\n            public const string PCS_IMAGES_TAG = \"PCS_IMAGES_TAG\";\n\n            /// <summary>\n            /// Resource group\n            /// </summary>\n            public const string PCS_RESOURCE_GROUP = \"PCS_RESOURCE_GROUP\";\n\n            /// <summary>\n            /// Subscription Id\n            /// </summary>\n            public const string PCS_SUBSCRIPTION_ID = \"PCS_SUBSCRIPTION_ID\";\n        }\n\n        /// <summary>\n        /// Constants related to xUnit traits\n        /// </summary>\n        internal static class TraitConstants\n        {\n            /// <summary>\n            /// The trait name of the Publisher Mode\n            /// </summary>\n            public const string PublisherModeTraitName = \"PublisherMode\";\n\n            /// <summary>\n            /// The trait value for PublisherMode = AE\n            /// </summary>\n            public const string PublisherModeTraitValue = \"AE\";\n\n            /// <summary>\n            /// The trait value for PublisherMode = standalone\n            /// </summary>\n            public const string PublisherModeStandaloneTraitValue = \"standaloneX\";\n        }\n\n        /// <summary>\n        /// Direct Method names\n        /// </summary>\n        internal static class DirectMethodNames\n        {\n            /// <summary>\n            /// Publish Nodes\n            /// </summary>\n            public const string PublishNodes = \"PublishNodes_V1\";\n\n            /// <summary>\n            /// Unpublish Nodes\n            /// </summary>\n            public const string UnpublishNodes = \"UnpublishNodes_V1\";\n\n            /// <summary>\n            /// GetConfiguredNodesOnEndpoint\n            /// </summary>\n            public const string GetConfiguredNodesOnEndpoint = \"GetConfiguredNodesOnEndpoint_V1\";\n\n            /// <summary>\n            /// GetConfiguredEndpoints\n            /// </summary>\n            public const string GetConfiguredEndpoints = \"GetConfiguredEndpoints_V1\";\n\n            /// <summary>\n            /// UnpublishAllNodes\n            /// </summary>\n            public const string UnpublishAllNodes = \"UnpublishAllNodes_V1\";\n\n            /// <summary>\n            /// GetDiagnosticInfo\n            /// </summary>\n            public const string GetDiagnosticInfo = \"GetDiagnosticInfo_V1\";\n\n            /// <summary>\n            /// AddOrUpdateEndpoints\n            /// </summary>\n            public const string AddOrUpdateEndpoints = \"AddOrUpdateEndpoints_V1\";\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestExtensions/IIoTPlatformTestContext.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestExtensions\n{\n    using Azure.ResourceManager.Resources;\n    using Config;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Neovolve.Logging.Xunit;\n    using System;\n    using System.Collections.Generic;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// Context to pass data between test cases\n    /// </summary>\n    public class IIoTPlatformTestContext : IDisposable, IDeviceConfig, IIoTHubConfig,\n        IIoTEdgeConfig, ISshConfig, IOpcPlcConfig, IContainerRegistryConfig\n    {\n        private ITestOutputHelper _outputHelper = new DummyOutput();\n\n        /// <summary>\n        /// Configuration\n        /// </summary>\n        private IConfiguration Configuration { get; }\n\n        public IIoTPlatformTestContext()\n        {\n            Configuration = GetConfiguration();\n            RegistryHelper = new RegistryHelper(this);\n        }\n\n        /// <summary>\n        /// Helper to write output, need to be set from constructor of test class\n        /// </summary>\n        public ITestOutputHelper OutputHelper => _outputHelper;\n\n        /// <summary>\n        /// Helper to write output, need to be set from constructor of test class\n        /// </summary>\n        /// <param name=\"output\"></param>\n        public void SetOutputHelper(ITestOutputHelper output)\n        {\n            ArgumentNullException.ThrowIfNull(output);\n            LogEnvironment(output);\n            _outputHelper = output;\n\n            _logFactory?.Dispose();\n            _logFactory = LogFactory.Create(_outputHelper);\n        }\n\n        public ILogger<T> CreateLogger<T>()\n        {\n            return _logFactory?.CreateLogger<T>();\n        }\n\n        private sealed class DummyOutput : ITestOutputHelper\n        {\n            public void WriteLine(string message) { Console.WriteLine(message); }\n            public void WriteLine(string format, params object[] args) { Console.WriteLine(format, args); }\n        }\n\n        /// <summary>\n        /// IoT Device Configuration\n        /// </summary>\n        public IDeviceConfig DeviceConfig { get { return this; } }\n\n        /// <summary>\n        /// IoT Hub Configuration\n        /// </summary>\n        public IIoTHubConfig IoTHubConfig { get { return this; } }\n\n        /// <summary>\n        /// IoT Edge Configuration\n        /// </summary>\n        public IIoTEdgeConfig IoTEdgeConfig { get { return this; } }\n\n        /// <summary>\n        /// SSH Configuration\n        /// </summary>\n        public ISshConfig SshConfig { get { return this; } }\n\n        /// <summary>\n        /// OpcPlc Configuration\n        /// </summary>\n        public IOpcPlcConfig OpcPlcConfig { get { return this; } }\n\n        /// <summary>\n        /// ContainerRegistry Configuration\n        /// </summary>\n        public IContainerRegistryConfig ContainerRegistryConfig { get { return this; } }\n\n        /// <summary>\n        /// Helper to work with Azure.Devices.RegistryManager\n        /// </summary>\n        public RegistryHelper RegistryHelper { get; }\n\n        /// <summary>\n        /// Resource group object\n        /// </summary>\n        public ResourceGroupResource ResourceGroup { get; set; }\n\n        /// <summary>\n        /// Urls for the dynamic ACI containers\n        /// </summary>\n        public IReadOnlyList<string> PlcAciDynamicUrls { get; set; }\n\n        /// <summary>\n        /// Azure Storage Name\n        /// </summary>\n        public string AzureStorageName { get; set; }\n\n        /// <summary>\n        /// Azure Storage Key\n        /// </summary>\n        public string AzureStorageKey { get; set; }\n\n        /// <summary>\n        /// Image that are used for PLC ACI\n        /// </summary>\n        public string PLCImage { get; set; }\n\n        /// <summary>\n        /// Testing suffix for this environment\n        /// </summary>\n        public string TestingSuffix { get; set; }\n\n        /// <inheritdoc />\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Override for disposing\n        /// </summary>\n        /// <param name=\"disposing\">Indicates if called from <see cref=\"Dispose\"/></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                RegistryHelper.Dispose();\n                _logFactory?.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Read configuration variable\n        /// </summary>\n        /// <param name=\"key\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        private string GetStringOrDefault(string key, Func<string> defaultValue)\n        {\n            var value = Configuration.GetValue<string>(key);\n            if (string.IsNullOrEmpty(value))\n            {\n                return defaultValue?.Invoke() ?? string.Empty;\n            }\n            return value.Trim();\n        }\n\n        /// <summary>\n        /// Get configuration that reads from:\n        ///     - environment variables\n        ///     - environment variables from user target\n        ///     - environment variables from .env file\n        /// </summary>\n        /// <returns></returns>\n        private static IConfigurationRoot GetConfiguration()\n        {\n            return new ConfigurationBuilder()\n                .AddEnvironmentVariables()\n                .AddFromDotEnvFile()\n                .Build();\n        }\n\n        public string DeviceId => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.IOT_EDGE_DEVICE_ID,\n            () => throw new InvalidOperationException(\"IoT Edge device id is not provided.\"));\n\n        public string IoTHubConnectionString => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_IOTHUB_CONNSTRING,\n            () => throw new InvalidOperationException(\"IoT Hub connection string is not provided.\"));\n\n        public string IoTHubEventHubConnectionString => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.IOTHUB_EVENTHUB_CONNECTIONSTRING,\n            () => throw new InvalidOperationException(\"IoT Hub EventHub connection string is not provided.\"));\n\n        public string EdgeVersion => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.IOT_EDGE_VERSION,\n            () => \"1.4\");\n\n        public string Username => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.IOT_EDGE_VM_USERNAME,\n            () => throw new InvalidOperationException(\"Username of iot edge device is not provided.\"));\n\n        public string PublicKey => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.IOT_EDGE_VM_PUBLICKEY,\n            () => throw new InvalidOperationException(\"Public key of iot edge device is not provided.\"));\n\n        public string PrivateKey => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.IOT_EDGE_VM_PRIVATEKEY,\n            () => throw new InvalidOperationException(\"Private key of iot edge device is not provided.\"));\n\n        public string Host => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.IOT_EDGE_DEVICE_DNSNAME,\n            () => throw new InvalidOperationException(\"DNS name of iot edge device is not provided.\"));\n\n        public string Urls => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PLC_SIMULATION_URLS,\n            () => throw new InvalidOperationException(\"Semicolon separated list of URLs of OPC-PLCs is not provided.\"));\n\n        public string Ips => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PLC_SIMULATION_IPS,\n            () => throw new InvalidOperationException(\"Semicolon separated list of ip addresses of OPC-PLCs is not provided.\"));\n\n        public string TenantId => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_AUTH_TENANT,\n            () => GetStringOrDefault(\"AZURE_TENANT_ID\", () => throw new InvalidOperationException(\"Tenant Id is not provided.\")));\n\n        public string ResourceGroupName => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_RESOURCE_GROUP,\n            () => throw new InvalidOperationException(\"Resource Group Name is not provided.\"));\n\n        public string SubscriptionId => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_SUBSCRIPTION_ID, () => string.Empty);\n\n        public string ContainerRegistryServer => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_DOCKER_SERVER,\n            () => string.Empty);\n\n        public string ContainerRegistryUser => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_DOCKER_USER,\n            () => string.Empty);\n\n        public string ContainerRegistryPassword => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_DOCKER_PASSWORD,\n            () => string.Empty);\n\n        public string ImagesNamespace => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_IMAGES_NAMESPACE,\n            () => string.Empty);\n\n        public string ImagesTag => GetStringOrDefault(TestConstants.EnvironmentVariablesNames.PCS_IMAGES_TAG,\n            () => \"latest\");\n\n        public void LogEnvironment(ITestOutputHelper output)\n        {\n            if (output == null || _logged || output is DummyOutput)\n            {\n                return;\n            }\n            _logged = true;\n            Log(\"ApplicationName\");\n            Log(\"PCS_IMAGES_TAG\");\n            Log(\"PCS_DOCKER_SERVER\");\n            Log(\"PCS_DOCKER_USER\");\n            Log(\"PCS_DOCKER_PASSWORD\");\n            Log(\"PCS_IMAGES_NAMESPACE\");\n            Log(\"PCS_SUBSCRIPTION_ID\");\n            Log(\"PCS_RESOURCE_GROUP\");\n            Log(\"PCS_SERVICE_URL\");\n            Log(\"PLC_SIMULATION_URLS\");\n            Log(\"IOT_EDGE_VERSION\");\n            Log(\"IOT_EDGE_DEVICE_ID\");\n            Log(\"IOT_EDGE_DEVICE_DNSNAME\");\n            Log(\"IOT_EDGE_VM_USERNAME\");\n            Log(\"PCS_IOTHUB_CONNSTRING\");\n            Log(\"IOTHUB_EVENTHUB_CONNECTIONSTRING\");\n            void Log(string envVar) => output.WriteLine($\"{envVar}: '{Environment.GetEnvironmentVariable(envVar)}'\");\n        }\n        private bool _logged;\n        private ILoggerFactory _logFactory;\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestExtensions/IIoTStandaloneTestContext.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestExtensions\n{\n    using OpcPublisherAEE2ETests.Deploy;\n\n    /// <summary>\n    /// Test context to pass data between test cases for standalone tests.\n    /// </summary>\n    public class IIoTStandaloneTestContext : IIoTPlatformTestContext\n    {\n        /// <summary>\n        /// Deployment for edgeHub and edgeAgent so called \"base deployment\"\n        /// </summary>\n        public readonly IIoTHubEdgeDeployment IoTHubEdgeBaseDeployment;\n\n        /// <summary>\n        /// Deployment for OPC Publisher as standalone\n        /// </summary>\n        public readonly ModuleDeploymentConfiguration IoTHubPublisherDeployment;\n\n        /// <summary>\n        /// Constructor of test context.\n        /// </summary>\n        public IIoTStandaloneTestContext()\n        {\n            // Create deployments.\n            IoTHubEdgeBaseDeployment = new IoTHubEdgeBaseDeployment(this);\n            IoTHubPublisherDeployment = new IoTHubPublisherDeployment(this, MessagingMode.PubSub);\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestExtensions/PriorityOrderAttribute.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestExtensions\n{\n    using System;\n\n    /// <summary>\n    /// Attribute to define ordering between xUnit tests\n    /// </summary>\n    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]\n    public sealed class PriorityOrderAttribute : Attribute\n    {\n        /// <summary>\n        /// Constructor to create instance of priority order attribute\n        /// </summary>\n        /// <param name=\"order\"></param>\n        public PriorityOrderAttribute(uint order)\n        {\n            Order = order;\n        }\n\n        /// <summary>\n        /// The order in which the test should be executed\n        /// </summary>\n        public uint Order { get; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestExtensions/TestCaseOrderer.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestExtensions\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Xunit.Abstractions;\n    using Xunit.Sdk;\n\n    /// <summary>\n    /// Orderer to order use test cases based on <see cref=\"PriorityOrderAttribute\"/>\n    /// </summary>\n    public class TestCaseOrderer : ITestCaseOrderer\n    {\n        /// <summary>\n        /// Fullname of the TestCollectionOrderer, as constant to be used in assembly info\n        /// </summary>\n        public const string FullName = \"OpcPublisherAEE2ETests.TestExtensions.TestCaseOrderer\";\n\n        /// <inheritdoc />\n        public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase\n        {\n            var sortedMethods = new SortedDictionary<uint, List<TTestCase>>();\n\n            foreach (var testCase in testCases)\n            {\n                uint order = 0;\n\n                foreach (var attr in testCase.TestMethod.Method.GetCustomAttributes(typeof(PriorityOrderAttribute).AssemblyQualifiedName))\n                {\n                    order = attr.GetNamedArgument<uint>(\"Order\");\n                }\n\n                GetOrCreate(sortedMethods, order).Add(testCase);\n            }\n\n            foreach (var list in sortedMethods.Keys.Select(priority => sortedMethods[priority]))\n            {\n                list.Sort((x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.TestMethod.Method.Name, y.TestMethod.Method.Name));\n                foreach (var testCase in list)\n                {\n                    yield return testCase;\n                }\n            }\n        }\n\n        private static TValue GetOrCreate<TKey, TValue>(SortedDictionary<TKey, TValue> dictionary, TKey key) where TValue : new()\n        {\n            if (dictionary.TryGetValue(key, out var result))\n            {\n                return result;\n            }\n\n            result = new TValue();\n            dictionary[key] = result;\n\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestHelper.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests\n{\n    using OpcPublisherAEE2ETests.Config;\n    using Azure;\n    using Azure.Core;\n    using Azure.Identity;\n    using Azure.Messaging.EventHubs.Consumer;\n    using Azure.ResourceManager;\n    using Azure.ResourceManager.ContainerInstance;\n    using Azure.ResourceManager.ContainerInstance.Models;\n    using Azure.ResourceManager.Resources;\n    using Azure.ResourceManager.Storage;\n    using Azure.Storage;\n    using Azure.Storage.Files.Shares;\n    using Microsoft.Azure.Devices;\n    using Microsoft.Azure.Devices.Common.Exceptions;\n    using Newtonsoft.Json;\n    using Newtonsoft.Json.Linq;\n    using Renci.SshNet;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Linq;\n    using System.Net.Sockets;\n    using System.Runtime.CompilerServices;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using TestExtensions;\n    using TestModels;\n    using Xunit;\n    using Xunit.Abstractions;\n    using Microsoft.Extensions.Options;\n\n    public record class MethodResultModel(string JsonPayload, int Status);\n    public record class MethodParameterModel\n    {\n        public string Name { get; set; }\n        public string JsonPayload { get; set; }\n    }\n\n    internal static class TestHelper\n    {\n        /// <summary>\n        /// Update Device Twin tag\n        /// </summary>\n        /// <param name=\"patch\">Name of deployed Industrial IoT</param>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\">Cancellation token</param>\n        public static async Task UpdateTagAsync(\n            string patch,\n            IIoTPlatformTestContext context,\n            CancellationToken ct = default\n        )\n        {\n            var registryManager = context.RegistryHelper.RegistryManager;\n            var twin = await registryManager.GetTwinAsync(context.DeviceConfig.DeviceId, ct).ConfigureAwait(false);\n            await registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Transfer the content of published_nodes.json file into the OPC Publisher edge module\n        /// </summary>\n        /// <param name=\"json\">String for published_nodes.json</param>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\">Cancellation token</param>\n        public static async Task SwitchToStandaloneModeAndPublishNodesAsync(\n            string json,\n            IIoTPlatformTestContext context,\n            CancellationToken ct = default\n        )\n        {\n            context.OutputHelper.WriteLine(\"Write published_nodes.json to IoT Edge\");\n            context.OutputHelper.WriteLine(json);\n            await PublishNodesAsync(json, context, ct).ConfigureAwait(false);\n            await SwitchToStandaloneModeAsync(context, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Transfer the content of published_nodes.json file into the OPC Publisher edge module\n        /// </summary>\n        /// <param name=\"json\">String for published_nodes.json</param>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\">Cancellation token</param>\n        public static async Task PublishNodesAsync(\n            string json,\n            IIoTPlatformTestContext context,\n            CancellationToken ct = default\n        )\n        {\n            for (var attempt = 0; ; attempt++)\n            {\n                try\n                {\n                    await CreateFolderOnEdgeVMAsync(TestConstants.PublishedNodesFolder, context, ct).ConfigureAwait(false);\n                    using var scpClient = await CreateScpClientAndConnectAsync(context, ct).ConfigureAwait(false);\n                    await using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));\n                    scpClient.Upload(stream, TestConstants.PublishedNodesFullName);\n\n                    return;\n                }\n                catch (Exception ex) when (attempt < 60)\n                {\n                    context.OutputHelper.WriteLine($\"Failed to write {TestConstants.PublishedNodesFullName} to {TestConstants.PublishedNodesFolder} on host {context.SshConfig.Host} with username {context.SshConfig.Username} ({ex.Message})\");\n                    await Task.Delay(1000, ct).ConfigureAwait(false);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Clean published nodes JSON files.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task CleanPublishedNodesJsonFilesAsync(IIoTPlatformTestContext context,\n            CancellationToken ct = default)\n        {\n            for (var attempt = 0; ; attempt++)\n            {\n                try\n                {\n                    // Make sure directories exist.\n                    using (var sshCient = await CreateSshClientAndConnectAsync(context, ct).ConfigureAwait(false))\n                    {\n                        sshCient.RunCommand($\"[ ! -d {TestConstants.PublishedNodesFolder} ]\" +\n                            $\" && sudo mkdir -m 777 -p {TestConstants.PublishedNodesFolder}\");\n                    }\n                    break;\n                }\n                catch (Exception ex) when (attempt < 60)\n                {\n                    context.OutputHelper.WriteLine($\"Failed to create folder on host {context.SshConfig.Host} with username {context.SshConfig.Username} ({ex.Message})\");\n                    await Task.Delay(1000, ct).ConfigureAwait(false);\n                }\n            }\n            await PublishNodesAsync(\"[]\", context, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Sets the unmanaged-Tag to \"true\" to enable Standalone-Mode\n        /// </summary>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\">Cancellation token</param>\n        /// <returns></returns>\n        public static async Task SwitchToStandaloneModeAsync(\n            IIoTPlatformTestContext context,\n            CancellationToken ct = default\n        )\n        {\n            const string patch =\n                @\"{\n                    tags: {\n                        unmanaged: true\n                    }\n                }\";\n\n            await UpdateTagAsync(patch, context, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Create a new SshClient based on SshConfig and directly connects to host\n        /// </summary>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>Instance of SshClient, that need to be disposed</returns>\n        private static async Task<SshClient> CreateSshClientAndConnectAsync(IIoTPlatformTestContext context,\n            CancellationToken ct = default)\n        {\n            var privateKeyFile = GetPrivateSshKey(context);\n            try\n            {\n                var client = new SshClient(\n                    context.SshConfig.Host,\n                    context.SshConfig.Username,\n                    privateKeyFile);\n\n                var connectAttempt = 0;\n                while (true)\n                {\n                    try\n                    {\n                        await client.ConnectAsync(ct);\n                        return client;\n                    }\n                    catch (SocketException) when (++connectAttempt < 10)\n                    {\n                        await Task.Delay(3000, ct).ConfigureAwait(false);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                context.OutputHelper.WriteLine($\"Failed to open ssh connection to host {context.SshConfig.Host} with username {context.SshConfig.Username} ({ex.Message})\");\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Create a new ScpClient based on SshConfig and directly connects to host\n        /// </summary>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>Instance of SshClient, that need to be disposed</returns>\n        private static async Task<ScpClient> CreateScpClientAndConnectAsync(IIoTPlatformTestContext context,\n            CancellationToken ct = default)\n        {\n            var privateKeyFile = GetPrivateSshKey(context);\n            try\n            {\n                var client = new ScpClient(\n                    context.SshConfig.Host,\n                    context.SshConfig.Username,\n                    privateKeyFile);\n\n                var connectAttempt = 0;\n                while (true)\n                {\n                    try\n                    {\n                        await client.ConnectAsync(ct);\n                        return client;\n                    }\n                    catch (SocketException) when (++connectAttempt < 10)\n                    {\n                        await Task.Delay(3000, ct).ConfigureAwait(false);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                context.OutputHelper.WriteLine(\"Failed to open scp connection to host {0} with username {1} ({2})\",\n                    context.SshConfig.Host,\n                    context.SshConfig.Username, ex.Message);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Gets the private SSH key from the configuration to connect to the Edge VM\n        /// </summary>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <returns></returns>\n        private static PrivateKeyFile GetPrivateSshKey(IIoTPlatformTestContext context)\n        {\n            var buffer = Encoding.Default.GetBytes(context.SshConfig.PrivateKey);\n            var privateKeyStream = new MemoryStream(buffer);\n\n            return new PrivateKeyFile(privateKeyStream);\n        }\n\n        /// <summary>\n        /// Delete a file on the Edge VM\n        /// </summary>\n        /// <param name=\"fileName\">Filename of the file to delete</param>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\"></param>\n        public static async Task DeleteFileOnEdgeVMAsync(string fileName, IIoTPlatformTestContext context,\n            CancellationToken ct = default)\n        {\n            var isSuccessful = false;\n            using var client = await CreateSshClientAndConnectAsync(context, ct).ConfigureAwait(false);\n\n            var terminal = client.RunCommand(\"rm \" + fileName);\n\n            if (string.IsNullOrEmpty(terminal.Error) ||\n                terminal.Error.Contains(\"no such file\", StringComparison.OrdinalIgnoreCase))\n            {\n                isSuccessful = true;\n            }\n            Assert.True(isSuccessful, \"Delete file was not successful\");\n        }\n\n        /// <summary>\n        /// Create a folder on Edge VM (if not exists)\n        /// </summary>\n        /// <param name=\"folderPath\">Name of the folder to create.</param>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\"></param>\n        private static async Task CreateFolderOnEdgeVMAsync(string folderPath, IIoTPlatformTestContext context,\n            CancellationToken ct = default)\n        {\n            Assert.False(string.IsNullOrWhiteSpace(folderPath));\n\n            var isSuccessful = false;\n            using var client = await CreateSshClientAndConnectAsync(context, ct).ConfigureAwait(false);\n\n            var terminal = client.RunCommand(\"sudo mkdir -p \" + folderPath + \";cd \" + folderPath + \"; sudo chmod 777 \" + folderPath);\n\n            if (string.IsNullOrEmpty(terminal.Error) || terminal.Error.Contains(\"File exists\", StringComparison.Ordinal))\n            {\n                isSuccessful = true;\n            }\n\n            Assert.True(isSuccessful, $\"Folder creation was not successful because of {terminal.Error}\");\n        }\n\n        /// <summary>\n        /// Serialize a published nodes json file.\n        /// </summary>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"port\">Port of OPC UA server</param>\n        /// <param name=\"writerId\">DataSetWriterId to set</param>\n        /// <param name=\"opcNodes\">OPC UA nodes</param>\n        public static string PublishedNodesJson(this IIoTStandaloneTestContext context, uint port, string writerId, JArray opcNodes)\n        {\n            return JsonConvert.SerializeObject(\n                new JArray(\n                    context.PlcAciDynamicUrls.Select(host => new JObject(\n                        new JProperty(\"EndpointUrl\", $\"opc.tcp://{host}:{port}\"),\n                        new JProperty(\"UseSecurity\", true),\n                        new JProperty(\"DataSetWriterGroup\", Guid.NewGuid().ToString()),\n                        new JProperty(\"DataSetWriterId\", writerId),\n                        new JProperty(\"OpcNodes\", opcNodes)))\n                ), Formatting.Indented);\n        }\n\n        /// <summary>\n        /// Create an ACI\n        /// </summary>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"commandLine\">Command line for container</param>\n        /// <param name=\"cancellationToken\">Cancellation token</param>\n        /// <param name=\"fileToUpload\">File to upload to the container</param>\n        /// <param name=\"numInstances\">Number of instances</param>\n        public static async Task CreateSimulationContainerAsync(IIoTPlatformTestContext context,\n            List<string> commandLine, CancellationToken cancellationToken, string fileToUpload = null, int numInstances = 1)\n        {\n            var resourceGroup = await GetResourceGroupAsync(context, cancellationToken).ConfigureAwait(false);\n\n            if (fileToUpload != null)\n            {\n                await UploadFileToStorageAccountAsync(context, fileToUpload, cancellationToken).ConfigureAwait(false);\n            }\n\n            context.PlcAciDynamicUrls = await Task.WhenAll(\n                Enumerable.Range(0, numInstances)\n                    .Select(i =>\n                        CreatePlcContainerGroupAsync(resourceGroup,\n                            $\"e2etesting-simulation-aci-{i}-{context.TestingSuffix}-dynamic\",\n                            context,\n                            commandLine[0],\n                            commandLine.GetRange(1, commandLine.Count - 1).ToArray(),\n                            TestConstants.OpcSimulation.FileShareName,\n                            cancellationToken))).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Upload a file to a storage account\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"fileName\">File name</param>\n        /// <param name=\"ct\"></param>\n        private async static Task UploadFileToStorageAccountAsync(IIoTPlatformTestContext context,\n            string fileName, CancellationToken ct = default)\n        {\n            var share = new ShareClient(\n                new Uri($\"https://{context.AzureStorageName}.file.core.windows.net/{TestConstants.OpcSimulation.FileShareName}\"),\n                new StorageSharedKeyCredential(context.AzureStorageName, context.AzureStorageKey));\n            var directory = share.GetRootDirectoryClient();\n\n            Assert.False(fileName.Contains('\\\\', StringComparison.Ordinal), \"\\\\ can't be used for file path\");\n\n            // if fileName contains '/' we will extract the filename\n            string onlyFileName;\n            if (fileName.Contains('/', StringComparison.Ordinal))\n            {\n                onlyFileName = fileName[(fileName.LastIndexOf('/') + 1)..];\n            }\n            else\n            {\n                onlyFileName = fileName;\n            }\n\n            var cf = directory.GetFileClient(onlyFileName);\n            try\n            {\n                await cf.DeleteIfExistsAsync(cancellationToken: ct);\n                await using var stream = new FileStream(fileName, FileMode.Open);\n                await cf.CreateAsync(stream.Length, cancellationToken: ct);\n                await cf.UploadAsync(stream, cancellationToken: ct);\n            }\n            catch (Exception ex)\n            {\n                context.OutputHelper.WriteLine($\"Failed to upload file {fileName} to storage \" +\n                    $\"account {context.AzureStorageName} as {onlyFileName} ({ex.Message})\");\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Create a container group\n        /// </summary>\n        /// <param name=\"resGroup\">Resource group</param>\n        /// <param name=\"containerGroupName\">Container group name</param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"executable\">Starting command line</param>\n        /// <param name=\"commandLine\">Additional command line options</param>\n        /// <param name=\"fileShareName\">File share name</param>\n        /// <param name=\"cancellationToken\"></param>\n        private static async Task<string> CreatePlcContainerGroupAsync(ResourceGroupResource resGroup,\n            string containerGroupName, IIoTPlatformTestContext context, string executable,\n            string[] commandLine, string fileShareName, CancellationToken cancellationToken)\n        {\n            var container = new ContainerInstanceContainer(containerGroupName, context.PLCImage,\n                new ContainerResourceRequirements(new ContainerResourceRequestsContent(0.5, 0.5)));\n            container.Command.Add(executable);\n            container.Command.AddRange(commandLine);\n            container.Ports.Add(new ContainerPort(50000));\n            container.VolumeMounts.Add(new ContainerVolumeMount(\"share\", \"/app/files\"));\n\n            var containerGroup = new ContainerGroupData(resGroup.Data.Location, container.YieldReturn(),\n                ContainerInstanceOperatingSystemType.Linux)\n            {\n                IPAddress = new ContainerGroupIPAddress(new ContainerGroupPort(50000).YieldReturn(),\n                    ContainerGroupIPAddressType.Public)\n                {\n                    DnsNameLabel = containerGroupName\n                }\n            };\n            containerGroup.Volumes.Add(new ContainerVolume(\"share\")\n            {\n                AzureFile = new ContainerInstanceAzureFileVolume(fileShareName, context.AzureStorageName)\n                {\n                    StorageAccountKey = context.AzureStorageKey,\n                    IsReadOnly = false\n                }\n            });\n\n            var operation = await resGroup.GetContainerGroups().CreateOrUpdateAsync(WaitUntil.Completed,\n                containerGroupName, containerGroup, cancellationToken);\n            return Validate(context, operation).Data.IPAddress.Fqdn;\n        }\n\n        /// <summary>\n        /// Delete an ACI\n        /// </summary>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\"></param>\n        public static async Task DeleteSimulationContainerAsync(IIoTPlatformTestContext context, CancellationToken ct)\n        {\n            if (context.PlcAciDynamicUrls == null || context.PlcAciDynamicUrls.Count == 0)\n            {\n                return;\n            }\n            var resourceGroup = await GetResourceGroupAsync(context, ct);\n            await Task.WhenAll(context.PlcAciDynamicUrls\n                .Select(url => url.Split(\".\")[0])\n                .Select(async n =>\n                {\n                    var response = await resourceGroup.GetContainerGroupAsync(n);\n                    var group = Validate(context, response);\n                    return await group.DeleteAsync(WaitUntil.Completed);\n                })\n            ).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Get an azure context\n        /// </summary>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"cancellationToken\">Cancellation token</param>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        internal async static Task<ResourceGroupResource> GetResourceGroupAsync(IIoTPlatformTestContext context,\n            CancellationToken cancellationToken)\n        {\n            if (context.ResourceGroup != null)\n            {\n                return context.ResourceGroup;\n            }\n\n            var armClient = await GetArmClientAsync(context, cancellationToken);\n\n            SubscriptionResource subscription = null;\n            if (!string.IsNullOrEmpty(context.OpcPlcConfig.SubscriptionId))\n            {\n                subscription = await armClient.GetSubscriptions()\n                    .FirstOrDefaultAsync(s => s.Data.SubscriptionId == context.OpcPlcConfig.SubscriptionId, cancellationToken);\n            }\n            subscription ??= await armClient.GetDefaultSubscriptionAsync(cancellationToken);\n\n            var response = await subscription.GetResourceGroupAsync(context.OpcPlcConfig.ResourceGroupName, cancellationToken);\n            var rg = Validate(context, response);\n            var tags = await rg.GetTagResource().GetAsync(cancellationToken);\n            context.OutputHelper.WriteLine($\"Get tag from tags {tags}\");\n            var testingSuffix = Validate(context, tags).Data.TagValues[TestConstants.OpcSimulation.TestingResourcesSuffixName];\n            context.TestingSuffix = testingSuffix;\n            context.AzureStorageName = TestConstants.OpcSimulation.AzureStorageNameWithoutSuffix + testingSuffix;\n\n            context.OutputHelper.WriteLine($\"Get storage keys from {rg}\");\n            var storageAccount = await rg.GetStorageAccountAsync(context.AzureStorageName, cancellationToken: cancellationToken).ConfigureAwait(false);\n            var keys = await Validate(context, storageAccount).GetKeysAsync(cancellationToken: cancellationToken).ToListAsync(cancellationToken);\n            if (keys.Count == 0)\n            {\n                throw new InvalidOperationException($\"No keys found for storage account {context.AzureStorageName}\");\n            }\n            context.AzureStorageKey = keys[0].Value;\n\n            context.OutputHelper.WriteLine($\"Get container groups from {rg}\");\n            var firstAciIpAddress = context.OpcPlcConfig.Ips.Split(\";\")[0];\n            var containerGroups = await rg.GetContainerGroups().ToListAsync(cancellationToken);\n            context.OutputHelper.WriteLine($\"Get container from groups {containerGroups}\");\n            var containerGroup = containerGroups.Find(g => g.Data?.IPAddress?.IP?.ToString() == firstAciIpAddress);\n            if (containerGroup == null)\n            {\n                throw new InvalidOperationException($\"Container group with IP address {firstAciIpAddress} not found\");\n            }\n            context.OutputHelper.WriteLine($\"Get image from group {containerGroup}\");\n            if (containerGroup.Data.Containers.Count == 0)\n            {\n                throw new InvalidOperationException($\"Container group with IP address {firstAciIpAddress} is empty\");\n            }\n            context.PLCImage = containerGroup.Data.Containers[0].Image;\n            context.ResourceGroup = rg;\n            return rg;\n        }\n\n        /// <summary>\n        /// Get an arm client\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"cancellationToken\"></param>\n        /// <returns></returns>\n        private static async Task<ArmClient> GetArmClientAsync(IIoTPlatformTestContext context,\n            CancellationToken cancellationToken)\n        {\n            context.OutputHelper.WriteLine($\"Accessing resource manager in tenant {context.OpcPlcConfig.TenantId}...\");\n            try\n            {\n                var systemAccessToken = Environment.GetEnvironmentVariable(\"SYSTEM_ACCESSTOKEN\");\n                var serviceConnection = Environment.GetEnvironmentVariable(\"AzureSubscription\");\n                var clientId = Environment.GetEnvironmentVariable(\"AZURE_CLIENT_ID\");\n                if (!string.IsNullOrEmpty(systemAccessToken) &&\n                    !string.IsNullOrEmpty(serviceConnection))\n                {\n                    context.OutputHelper.WriteLine(\n                        $\"Using service connection {serviceConnection} with client {clientId}...\");\n                    var armClient = new ArmClient(new AzurePipelinesCredential(\n                        context.OpcPlcConfig.TenantId, clientId, serviceConnection, systemAccessToken));\n                    await armClient.GetDefaultSubscriptionAsync(cancellationToken);\n                    return armClient;\n                }\n            }\n            catch (Exception ex)\n            {\n                context.OutputHelper.WriteLine($\"Failed to access resource manager using pipeline service connection: {ex.Message}\");\n            }\n            try\n            {\n                context.OutputHelper.WriteLine($\"AZURE_CLIENT_ID: {Environment.GetEnvironmentVariable(\"AZURE_CLIENT_ID\")}\");\n                context.OutputHelper.WriteLine($\"AZURE_TENANT_ID: {Environment.GetEnvironmentVariable(\"AZURE_TENANT_ID\")}\");\n                context.OutputHelper.WriteLine($\"AZURE_CLIENT_SECRET: {Environment.GetEnvironmentVariable(\"AZURE_CLIENT_SECRET\")}\");\n                var options = new DefaultAzureCredentialOptions\n                {\n                    TenantId = context.OpcPlcConfig.TenantId\n                };\n                //options.AdditionallyAllowedTenants.Add(\"*\");\n                var armClient = new ArmClient(new DefaultAzureCredential(options));\n                await armClient.GetDefaultSubscriptionAsync(cancellationToken);\n                return armClient;\n            }\n            catch (Exception ex)\n            {\n                context.OutputHelper.WriteLine($\"Failed to access resource manager using default credentials: {ex.Message}\");\n            }\n            try\n            {\n                var armClient = new ArmClient(new AzureCliCredential());\n                var subscription = await armClient.GetDefaultSubscriptionAsync(cancellationToken);\n                return armClient;\n            }\n            catch (Exception ex)\n            {\n                context.OutputHelper.WriteLine($\"Failed to access resource manager using azure cli: {ex.Message}\");\n                throw;\n            }\n        }\n\n        private static T Validate<T>(IIoTPlatformTestContext context, Response<T> response)\n        {\n            if (!response.HasValue)\n            {\n                context.OutputHelper.WriteLine($\"Get tags from {response}\");\n                throw new InvalidOperationException(response.ToString());\n            }\n            return response.Value;\n        }\n\n        private static T Validate<T>(IIoTPlatformTestContext context, Operation<T> response)\n        {\n            if (!response.HasValue)\n            {\n                context.OutputHelper.WriteLine($\"Get tags from {response}\");\n                throw new InvalidOperationException(response.ToString());\n            }\n            return response.Value;\n        }\n\n        /// <summary>\n        /// Deserializes the JSON structure contained by the specified <see cref=\"PartitionEvent\"/>\n        /// into an instance of the specified type.\n        /// </summary>\n        /// <param name=\"partitionEvent\">The <see cref=\"PartitionEvent\"/> containing the object.</param>\n        /// <typeparam name=\"T\">The type of the object to deserialize.</typeparam>\n        /// <returns>The instance of <typeparamref name=\"T\"/> being deserialized.</returns>\n        public static T DeserializeJson<T>(this PartitionEvent partitionEvent)\n        {\n            using var sr = new StreamReader(partitionEvent.Data.BodyAsStream);\n            using var reader = new JsonTextReader(sr);\n            return kSerializer.Deserialize<T>(reader);\n        }\n\n        /// <summary>\n        /// Get an Event Hub consumer\n        /// </summary>\n        /// <param name=\"config\">Configuration for IoT Hub</param>\n        /// <param name=\"consumerGroup\"></param>\n        public static EventHubConsumerClient GetEventHubConsumerClient(this IIoTHubConfig config, string consumerGroup = null)\n        {\n            return new EventHubConsumerClient(\n                consumerGroup ?? TestConstants.TestConsumerGroupName,\n                config.IoTHubEventHubConnectionString);\n        }\n\n        /// <summary>\n        /// <para>\n        ///   Reads events from all partitions of the IoT Hub Event Hubs endpoint as an asynchronous enumerable, allowing events to be iterated as they\n        ///   become available on the partition, waiting as necessary should there be no events available.\n        /// </para>\n        /// <para>  Reading begins at the end of each partition seeing only new events as they are published.</para>\n        /// <para>\n        ///   Breaks up the batched messages contained in the event, and returns only messages for the provided\n        ///   DataSetWriterId.\n        /// </para>\n        /// <para>\n        ///   This enumerator may block for an indeterminate amount of time for an <c>await</c> if events are not available on the partition, requiring\n        ///   cancellation via the <paramref name=\"cancellationToken\"/> to be requested in order to return control.\n        /// </para>\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"consumer\">The Event Hubs consumer.</param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"numberOfBatchesToRead\"></param>\n        /// <param name=\"cancellationToken\">An optional <see cref=\"CancellationToken\"/> instance to signal the request to cancel the operation.</param>\n        /// <param name=\"context\"></param>\n        /// <returns>An <see cref=\"IAsyncEnumerable{T}\"/> to be used for iterating over messages.</returns>\n        public static IAsyncEnumerable<EventData<T>> ReadMessagesFromWriterIdAsync<T>(this EventHubConsumerClient consumer, string dataSetWriterId,\n            int numberOfBatchesToRead, CancellationToken cancellationToken, IIoTPlatformTestContext context = null) where T : BaseEventTypePayload\n        {\n            return ReadMessagesFromWriterIdAsync(consumer, dataSetWriterId, numberOfBatchesToRead, context, cancellationToken)\n                        .Select(x =>\n                            new EventData<T>\n                            {\n                                EnqueuedTime = x.enqueuedTime,\n                                WriterGroupId = x.writerGroupId,\n                                Payload = x.payload.ToObject<T>()\n                            });\n        }\n\n        /// <summary>\n        /// <para>\n        ///   Reads events from all partitions of the IoT Hub Event Hubs endpoint as an asynchronous enumerable, allowing events to be iterated as they\n        ///   become available on the partition, waiting as necessary should there be no events available.\n        /// </para>\n        /// <para>  Reading begins at the end of each partition seeing only new events as they are published.</para>\n        /// <para>\n        ///   Breaks up the batched messages contained in the event, and returns only messages for the provided\n        ///   DataSetWriterId.\n        /// </para>\n        /// <para>\n        ///   This enumerator may block for an indeterminate amount of time for an <c>await</c> if events are not available on the partition, requiring\n        ///   cancellation via the <paramref name=\"cancellationToken\"/> to be requested in order to return control.\n        /// </para>\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"consumer\">The Event Hubs consumer.</param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"numberOfBatchesToRead\"></param>\n        /// <param name=\"cancellationToken\">An optional <see cref=\"CancellationToken\"/> instance to signal the request to cancel the operation.</param>\n        /// <param name=\"context\"></param>\n        /// <returns>An <see cref=\"IAsyncEnumerable{T}\"/> to be used for iterating over messages.</returns>\n        public static IAsyncEnumerable<PendingConditionEventData<T>> ReadConditionMessagesFromWriterIdAsync<T>(this EventHubConsumerClient consumer,\n            string dataSetWriterId, int numberOfBatchesToRead, CancellationToken cancellationToken, IIoTPlatformTestContext context = null) where T : BaseEventTypePayload\n        {\n            return ReadMessagesFromWriterIdAsync(consumer, dataSetWriterId, numberOfBatchesToRead, context, cancellationToken)\n                .Select(x =>\n                    new PendingConditionEventData<T>\n                    {\n                        IsPayloadCompressed = x.isPayloadCompressed,\n                        Payload = x.payload.ToObject<T>()\n                    }\n                );\n        }\n\n        /// <summary>\n        /// <para>\n        ///   Reads events from all partitions of the IoT Hub Event Hubs endpoint as an asynchronous enumerable, allowing events to be iterated as they\n        ///   become available on the partition, waiting as necessary should there be no events available.\n        /// </para>\n        /// <para>  Reading begins at the end of each partition seeing only new events as they are published.</para>\n        /// <para>\n        ///   Breaks up the batched messages contained in the event, and returns only messages for the provided\n        ///   DataSetWriterId.\n        /// </para>\n        /// <para>\n        ///   This enumerator may block for an indeterminate amount of time for an <c>await</c> if events are not available on the partition, requiring\n        ///   cancellation via the <paramref name=\"cancellationToken\"/> to be requested in order to return control.\n        /// </para>\n        /// </summary>\n        /// <param name=\"consumer\">The Event Hubs consumer.</param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"numberOfBatchesToRead\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"cancellationToken\">An optional <see cref=\"CancellationToken\"/> instance to signal the request to cancel the operation.</param>\n        /// <returns>An <see cref=\"IAsyncEnumerable{JObject}\"/> to be used for iterating over messages.</returns>\n        public static async IAsyncEnumerable<(DateTime enqueuedTime, string writerGroupId, JObject payload, bool isPayloadCompressed)> ReadMessagesFromWriterIdAsync(this EventHubConsumerClient consumer, string dataSetWriterId,\n            int numberOfBatchesToRead, IIoTPlatformTestContext context, [EnumeratorCancellation] CancellationToken cancellationToken)\n        {\n            var events = consumer.ReadEventsAsync(false, cancellationToken: cancellationToken);\n            await foreach (var partitionEvent in events.WithCancellation(cancellationToken))\n            {\n                var enqueuedTime = (DateTime)partitionEvent.Data.SystemProperties[MessageSystemPropertyNames.EnqueuedTime];\n                JToken json = null;\n                if (!partitionEvent.Data.Properties.TryGetValue(\"$$ContentType\", out var contentType))\n                {\n                    // Assert.Fail($\"Missing $$ContentType property in message {partitionEvent.DeserializeJson<JToken>()}\");\n                    continue;\n                }\n                var isPayloadCompressed = (string)contentType == \"application/json+gzip\";\n                if (isPayloadCompressed)\n                {\n                    var compressedPayload = Convert.FromBase64String(partitionEvent.Data.EventBody.ToString());\n                    await using (var input = new MemoryStream(compressedPayload))\n                    {\n                        await using (var gs = new GZipStream(input, CompressionMode.Decompress))\n                        {\n                            using (var textReader = new StreamReader(gs))\n                            {\n                                json = JsonConvert.DeserializeObject<JToken>(await textReader.ReadToEndAsync(cancellationToken).ConfigureAwait(false));\n                            }\n                        }\n                    }\n                }\n                else\n                {\n                    json = partitionEvent.DeserializeJson<JToken>();\n                }\n\n                if (context?.OutputHelper != null)\n                {\n                    context.OutputHelper.WriteLine(json.ToString(Formatting.Indented));\n                }\n\n                List<dynamic> batchedMessages;\n                if (json is JArray array)\n                {\n                    batchedMessages = array.Cast<dynamic>().ToList();\n                }\n                else\n                {\n                    batchedMessages = new List<dynamic> { json };\n                }\n\n                // Expect all messages to be the same\n                var messageIds = new HashSet<string>();\n                foreach (var message in batchedMessages)\n                {\n                    Assert.NotNull(message.MessageId.Value);\n                    Assert.True(messageIds.Add(message.MessageId.Value));\n                    var writerGroupId = (string)message.DataSetWriterGroup.Value;\n                    Assert.NotNull(writerGroupId);\n                    Assert.Equal(\"ua-data\", message.MessageType.Value);\n                    var innerMessages = (JArray)message.Messages;\n                    Assert.True(innerMessages.Any(), \"Json doesn't contain any messages\");\n\n                    foreach (dynamic innerMessage in innerMessages)\n                    {\n                        var messageWriterId = (string)innerMessage.DataSetWriterId.Value;\n                        if (!messageWriterId.StartsWith(dataSetWriterId, StringComparison.Ordinal))\n                        {\n                            continue;\n                        }\n\n                        // Metadata disabled, always sending version 1\n                        Assert.Equal(1, innerMessage.MetaDataVersion.MajorVersion.Value);\n\n                        yield return (enqueuedTime, writerGroupId, (JObject)innerMessage.Payload, isPayloadCompressed);\n                    }\n                }\n\n                if (batchedMessages.Count > 0 && --numberOfBatchesToRead == 0)\n                {\n                    break;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Returns elements from an async-enumerable sequence for a given time duration.\n        /// </summary>\n        /// <typeparam name=\"TSource\">The type of the elements in the source sequence.</typeparam>\n        /// <param name=\"source\">A sequence to return elements from.</param>\n        /// <param name=\"predicate\">While condition.</param>\n        /// <returns>An async-enumerable sequence that contains the elements from the input sequence for the given time period, starting when the first element is retrieved.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"source\"/> is null.</exception>\n        private static IAsyncEnumerable<TSource> TakeWhile<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, TSource, bool> predicate)\n        {\n            _ = source ?? throw new ArgumentNullException(nameof(source));\n\n            object firstSeen = null;\n            return source.TakeWhile(predicate: s =>\n            {\n                firstSeen ??= s;\n                return predicate((TSource)firstSeen, s);\n            });\n        }\n\n        /// <summary>\n        /// Bypasses elements in an async-enumerable sequence as long as a number of distinct items has not been seen, and then returns the remaining elements.\n        /// </summary>\n        /// <typeparam name=\"TSource\">The type of the elements in the source sequence.</typeparam>\n        /// <typeparam name=\"TValue\">The type of the elements to be compared for distinct values.</typeparam>\n        /// <param name=\"source\">An async-enumerable sequence to return elements from.</param>\n        /// <param name=\"valueFunc\">A function to generate the value to test for uniqueness, for each element.</param>\n        /// <param name=\"distinctCountToReach\">Number of distinct values for valueFunc output to observe until elements should be passed.</param>\n        /// <param name=\"before\">An optional action to execute when the first element is observed.</param>\n        /// <param name=\"after\">An optional action to execute when the last bypassed element is observed.</param>\n        /// <returns>An async-enumerable sequence that contains the elements from the input sequence starting at the first element in the linear series at which the number of distinct values has been observed.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"source\"/> or <paramref name=\"valueFunc\"/> is null.</exception>\n        private static IAsyncEnumerable<TSource> SkipUntilDistinctCountReached<TSource, TValue>(\n            this IAsyncEnumerable<TSource> source,\n            Func<TSource, TValue> valueFunc,\n            int distinctCountToReach,\n            Action before = default,\n            Action after = default\n        )\n        {\n            _ = source ?? throw new ArgumentNullException(nameof(source));\n            _ = valueFunc ?? throw new ArgumentNullException(nameof(valueFunc));\n\n            var seenValues = new HashSet<TValue>();\n            return source.SkipWhile(m =>\n            {\n                if (seenValues.Count == 0)\n                {\n                    before?.Invoke();\n                }\n\n                seenValues.Add(valueFunc(m));\n                if (seenValues.Count < distinctCountToReach)\n                {\n                    return true;\n                }\n\n                after?.Invoke();\n                return false;\n            });\n        }\n\n        /// <summary>\n        /// Returns elements from an async-enumerable sequence for a given time duration,\n        /// starting when one message has been published from every publishing source (PLC simulator).\n        /// </summary>\n        /// <typeparam name=\"TSource\">The type of the elements in the source sequence.</typeparam>\n        /// <param name=\"source\">A sequence to return elements from.</param>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"writerGroupIdFunc\">A function to extract the Data Source ID from a message payload.</param>\n        /// <param name=\"predicate\">While condition.</param>\n        /// <returns>An async-enumerable sequence that contains the elements from the input sequence for the given time period, starting when the first element is retrieved.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"source\"/> is null.</exception>\n        private static IAsyncEnumerable<TSource> TakeWhile<TSource>(\n            this IAsyncEnumerable<TSource> source,\n            IIoTPlatformTestContext context,\n            Func<TSource, string> writerGroupIdFunc,\n            Func<TSource, TSource, bool> predicate\n        )\n        {\n            // When the first message has been received for each simulator, the system is up and we\n            // \"let the flag fall\" to start computing event rates.\n            return source\n                .SkipUntilDistinctCountReached(\n                    writerGroupIdFunc,\n                    context.PlcAciDynamicUrls.Count,\n                    () => context.OutputHelper.WriteLine(\"Waiting for first message for PLC\"),\n                    () => context.OutputHelper.WriteLine(\"Consuming messages...\")\n                )\n                .TakeWhile(predicate);\n        }\n\n        /// <summary>\n        /// Returns elements from an async-enumerable sequence for a given time duration,\n        /// starting when one message has been published from every publishing source (PLC simulator).\n        /// </summary>\n        /// <typeparam name=\"TPayload\">The type of the payloads in the Publisher messages.</typeparam>\n        /// <param name=\"source\">A sequence to return elements from.</param>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"predicate\">A while condition.</param>\n        /// <returns>An async-enumerable sequence that contains the elements from the input sequence for the given time period, starting when the first element is retrieved.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"source\"/> is null.</exception>\n        public static IAsyncEnumerable<EventData<TPayload>> TakeWhile<TPayload>(\n            this IAsyncEnumerable<EventData<TPayload>> source,\n            IIoTPlatformTestContext context,\n            Func<EventData<TPayload>, EventData<TPayload>, bool> predicate\n        ) where TPayload : BaseEventTypePayload\n        {\n            return source.TakeWhile(context, m => m.WriterGroupId, predicate);\n        }\n\n        /// <summary>\n        /// Truncate a date time\n        /// </summary>\n        /// <param name=\"dateTime\">Date time top truncate</param>\n        /// <param name=\"timeSpan\">Time span</param>\n        public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)\n        {\n            if (timeSpan == TimeSpan.Zero)\n            {\n                return dateTime;\n            }\n\n            if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue)\n            {\n                return dateTime;\n            }\n\n            return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));\n        }\n\n        /// <summary>\n        /// Initialize DeviceServiceClient from IoT Hub connection string.\n        /// </summary>\n        /// <param name=\"iotHubConnectionString\"></param>\n        /// <param name=\"transportType\"></param>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        public static ServiceClient DeviceServiceClient(\n            string iotHubConnectionString,\n            TransportType transportType = TransportType.Amqp_WebSocket_Only\n        )\n        {\n            if (string.IsNullOrWhiteSpace(iotHubConnectionString))\n            {\n                throw new ArgumentNullException(nameof(iotHubConnectionString));\n            }\n\n            return ServiceClient.CreateFromConnectionString(\n                iotHubConnectionString,\n                transportType\n            );\n        }\n\n        /// <summary>\n        /// Restart module\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"moduleName\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task RestartAsync(IIoTPlatformTestContext context, string moduleName,\n            CancellationToken ct)\n        {\n            using var client = TestHelper.DeviceServiceClient(context.IoTHubConfig.IoTHubConnectionString,\n                    TransportType.Amqp_WebSocket_Only);\n            var method = new CloudToDeviceMethod(\"Shutdown\");\n            method.SetPayloadJson(\"false\");\n            try\n            {\n                await client.InvokeDeviceMethodAsync(context.DeviceId, moduleName, method, ct);\n            }\n            catch { } // Expected, since device will have disconnected now\n        }\n\n        /// <summary>\n        /// Prints the exception message and stacktrace for exception (and all inner exceptions) in test output\n        /// </summary>\n        /// <param name=\"e\">Exception to be printed</param>\n        /// <param name=\"outputHelper\">XUnit Test OutputHelper instance or null (no print in this case)</param>\n        private static void PrettyPrintException(Exception e, ITestOutputHelper outputHelper)\n        {\n            var exception = e;\n            while (exception != null)\n            {\n                outputHelper.WriteLine(exception.Message);\n                outputHelper.WriteLine(exception.StackTrace);\n                outputHelper.WriteLine(\"\");\n                exception = exception.InnerException;\n            }\n        }\n\n        /// <summary>\n        /// Call a direct method\n        /// </summary>\n        /// <param name=\"serviceClient\">Device service client</param>\n        /// <param name=\"deviceId\">Device Id</param>\n        /// <param name=\"moduleId\">Module Id</param>\n        /// <param name=\"parameters\">Method parameter </param>\n        /// <param name=\"context\">Shared Context for E2E testing Industrial IoT Platform</param>\n        /// <param name=\"ct\">Cancellation token</param>\n        public static async Task<MethodResultModel> CallMethodAsync(ServiceClient serviceClient, string deviceId, string moduleId,\n            MethodParameterModel parameters, IIoTPlatformTestContext context, CancellationToken ct)\n        {\n            for (var attempt = 0; ; attempt++)\n            {\n                try\n                {\n                    var i = 0;// Retry twice to call with error 500\n                    while (true)\n                    {\n                        var methodInfo = new CloudToDeviceMethod(parameters.Name);\n                        methodInfo.SetPayloadJson(parameters.JsonPayload);\n                        var result = await (string.IsNullOrEmpty(moduleId) ?\n                             serviceClient.InvokeDeviceMethodAsync(deviceId, methodInfo, ct) :\n                             serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInfo, ct)).ConfigureAwait(false);\n                        context.OutputHelper.WriteLine($\"Called method {parameters.Name}.\");\n                        var methodCallResult = new MethodResultModel(result.GetPayloadAsJson(), result.Status);\n                        if (methodCallResult.Status >= 500 && ++i < 3)\n                        {\n                            context.OutputHelper.WriteLine($\"Got internal error {methodCallResult.Status} ({methodCallResult.JsonPayload}), trying again to call publisher after delay...\");\n                            await Task.Delay(2000, ct).ConfigureAwait(false);\n                            continue;\n                        }\n                        return methodCallResult;\n                    }\n                }\n                catch (DeviceNotFoundException de) when (attempt < 60)\n                {\n                    context.OutputHelper.WriteLine($\"Failed to call method {parameters.Name} with {parameters.JsonPayload} due to {de.Message}\");\n                    await Task.Delay(TestConstants.DefaultDelayMilliseconds, ct).ConfigureAwait(false);\n                }\n                catch (Exception e)\n                {\n                    context.OutputHelper.WriteLine($\"Failed to call method {parameters.Name} with {parameters.JsonPayload}\");\n                    if (e.Message.Contains(\"The operation failed because the requested device isn't online\", StringComparison.Ordinal) && attempt < 60)\n                    {\n                        context.OutputHelper.WriteLine(\"Device is not online, trying again to call device after delay...\");\n                        await Task.Delay(TestConstants.DefaultDelayMilliseconds, ct).ConfigureAwait(false);\n                        continue;\n                    }\n                    PrettyPrintException(e, context.OutputHelper);\n                    throw;\n                }\n            }\n        }\n\n        private static readonly JsonSerializer kSerializer = new();\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestModels/BaseEventTypePayload.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestModels\n{\n    using Newtonsoft.Json;\n    using System;\n\n    /// <summary>Base class for payload types.</summary>\n    public class BaseEventTypePayload\n    {\n        /// <summary>Gets or sets event id.</summary>\n        /// <example>\"V1_DoorOpen(294)\" represented as JSON base-64 encoded string \"VjFfRG9vck9wZW4oMjk0KQ==\".</example>\n        [JsonProperty(nameof(EventId))]\n        public DataValueObject<byte[]> EventId { get; set; }\n\n        /// <summary>Gets or sets message.</summary>\n        /// <example>\"The system cycle '29813' has started.\"</example>\n        [JsonProperty(nameof(Message))]\n        public DataValueObject<string> Message { get; set; }\n\n        /// <summary>Gets or sets the severity.</summary>\n        /// <example>900</example>\n        [JsonProperty(nameof(Severity))]\n        public DataValueObject<int> Severity { get; set; }\n\n        /// <summary>Gets or sets the source name.</summary>\n        /// <example>\"VendingMachine1\"</example>\n        [JsonProperty(nameof(SourceName))]\n        public DataValueObject<string> SourceName { get; set; }\n\n        /// <summary>Gets or sets the source node.</summary>\n        /// <example>\"http://microsoft.com/Opc/OpcPlc/DetermAlarmsInstance#s=VendingMachine1\"</example>\n        [JsonProperty(nameof(SourceNode))]\n        public DataValueObject<string> SourceNode { get; set; }\n\n        /// <summary>Gets or sets the event type.</summary>\n        /// <example>\"i=10751\"</example>\n        [JsonProperty(nameof(EventType))]\n        public DataValueObject<string> EventType { get; set; }\n\n        /// <summary>Gets or sets the receive time.</summary>\n        [JsonProperty(nameof(ReceiveTime))]\n        public DataValueObject<DateTime?> ReceiveTime { get; set; }\n\n        /// <summary>Gets or sets the local time.</summary>\n        [JsonProperty(nameof(LocalTime))]\n        public DataValueObject<DateTime?> LocalTime { get; set; }\n    }\n}"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestModels/ConditionTypePayload.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestModels\n{\n    using Newtonsoft.Json;\n    using System;\n\n    /// <summary>Payload for conditions and alarms.</summary>\n    public class ConditionTypePayload : BaseEventTypePayload\n    {\n        /// <summary>Gets or sets Condition Id.</summary>\n        /// <example>\"http://microsoft.com/Opc/OpcPlc/DetermAlarmsInstance#i=1\"</example>\n        [JsonProperty(nameof(ConditionId))]\n        public DataValueObject<string> ConditionId { get; set; }\n\n        /// <summary>Gets or sets comment source timestamp.</summary>\n        [JsonProperty(nameof(Comment))]\n        public DataValueObject<string> Comment { get; set; }\n\n        /// <summary>Gets or sets the condition name.</summary>\n        /// <example>\"VendingMachine1_DoorOpen\"</example>\n        [JsonProperty(nameof(ConditionName))]\n        public DataValueObject<string> ConditionName { get; set; }\n\n        /// <summary>Gets or sets the enabled state.</summary>\n        /// <example>\"Enabled\"</example>\n        [JsonProperty(nameof(EnabledState))]\n        public DataValueObject<string> EnabledState { get; set; }\n\n        /// <summary>Gets or sets the enabled state effective display name.</summary>\n        /// <example>\"Active | Unacknowledged\"</example>\n        [JsonProperty(\"EnabledState/EffectiveDisplayName\")]\n        public DataValueObject<string> EnabledStateEffectiveDisplayName { get; set; }\n\n        /// <summary>Gets or sets the enabled state effective transition time.</summary>\n        [JsonProperty(\"EnabledState/EffectiveTransitionTime\")]\n        public DataValueObject<DateTime?> EnabledStateEffectiveTransitionTime { get; set; }\n\n        /// <summary>Gets or sets the enabled state Id.</summary>\n        /// <example>true</example>\n        [JsonProperty(\"EnabledState/Id\")]\n        public DataValueObject<bool?> EnabledStateId { get; set; }\n\n        /// <summary>Gets or sets the enabled state transition time.</summary>\n        [JsonProperty(\"EnabledState/TransitionTime\")]\n        public DataValueObject<DateTime?> EnabledStateTransitionTime { get; set; }\n\n        /// <summary>Gets or sets the event last severity.</summary>\n        /// <example>500</example>\n        [JsonProperty(nameof(LastSeverity))]\n        public DataValueObject<int?> LastSeverity { get; set; }\n\n        /// <summary>Gets or sets the quality.</summary>\n        [JsonProperty(nameof(Quality))]\n        public DataValueObject<string> Quality { get; set; }\n\n        /// <summary>Gets or sets the retain flag.</summary>\n        [JsonProperty(nameof(Retain))]\n        public DataValueObject<bool?> Retain { get; set; }\n\n        /// <summary>Gets or sets the time.</summary>\n        [JsonProperty(nameof(Time))]\n        public DataValueObject<DateTime?> Time { get; set; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestModels/DataValueObject.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestModels\n{\n    using Newtonsoft.Json;\n    using System;\n\n    public static class DataValueObject\n    {\n        public static DataValueObject<T> Create<T>(T value)\n        {\n            return new() { Value = value };\n        }\n    }\n\n    public class DataValueObject<T>\n    {\n        /// <summary>\n        /// Value\n        /// </summary>\n        [JsonProperty]\n        public T Value { get; set; }\n\n        [JsonProperty]\n        public DateTime? SourceTimestamp { get; set; }\n\n        [JsonProperty]\n        public DateTime? ServerTimestamp { get; set; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestModels/EventData.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestModels\n{\n    using System;\n\n    /// <summary>Event data with IoT Hub message enqueued time metadata.</summary>\n    /// <typeparam name=\"T\">Payload type.</typeparam>\n    public class EventData<T> where T : BaseEventTypePayload\n    {\n        /// <summary>IoT Hub message enqueued time.</summary>\n        public DateTime EnqueuedTime { get; set; }\n\n        /// <summary>Message origin host.</summary>\n        public string WriterGroupId { get; set; }\n\n        /// <summary>Payload</summary>\n        public T Payload { get; set; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestModels/PendingConditionEventData.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestModels\n{\n    public class PendingConditionEventData<T> where T : BaseEventTypePayload\n    {\n        public bool IsPayloadCompressed { get; set; }\n\n        public T Payload { get; set; }\n    }\n}"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestModels/SimpleEventsStep.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestModels\n{\n    /// <summary>Simple event step.</summary>\n    public class SimpleEventsStep\n    {\n        /// <summary>Gets or sets the step name.</summary>\n        /// <example>\"Step 1\"</example>\n        public string Name { get; set; }\n\n        /// <summary>Gets or sets the step duration in milliseconds.</summary>\n        /// <example>1000.0</example>\n        public double Duration { get; set; }\n    }\n}"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestModels/SystemCycleStatusEventTypePayload.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestModels\n{\n    using Newtonsoft.Json;\n\n    /// <summary>Payload for simple events.</summary>\n    public class SystemCycleStatusEventTypePayload : SystemEventTypePayload\n    {\n        /// <summary>Gets or sets the cycle id.</summary>\n        /// <example>\"29813\"</example>\n        [JsonProperty(\"http://microsoft.com/Opc/OpcPlc/SimpleEvents#CycleId\")]\n        public DataValueObject<string> CycleId { get; set; }\n\n        /// <summary>Gets or sets the current step.</summary>\n        [JsonProperty(\"http://microsoft.com/Opc/OpcPlc/SimpleEvents#CurrentStep\")]\n        public DataValueObject<SimpleEventsStep> CurrentStep { get; set; }\n    }\n}"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/TestModels/SystemEventTypePayload.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.TestModels\n{\n    using Newtonsoft.Json;\n    using System;\n\n    /// <summary>Base class for system events types.</summary>\n    public class SystemEventTypePayload : BaseEventTypePayload\n    {\n        /// <summary>Gets or sets the time.</summary>\n        [JsonProperty(nameof(Time))]\n        public DataValueObject<DateTime?> Time { get; set; }\n    }\n}"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/deploy/DeploymentConfiguration.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Deploy\n{\n    using Microsoft.Azure.Devices;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using TestExtensions;\n\n    public abstract class DeploymentConfiguration : IIoTHubEdgeDeployment\n    {\n        protected DeploymentConfiguration(IIoTPlatformTestContext context)\n        {\n            _context = context ?? throw new ArgumentNullException(nameof(context));\n        }\n\n        /// <inheritdoc />\n        public async Task<bool> CreateOrUpdateLayeredDeploymentAsync(CancellationToken token)\n        {\n            var deploymentConfiguration = GetDeploymentConfiguration();\n\n            var configuration = await _context.RegistryHelper\n                .CreateOrUpdateConfigurationAsync(deploymentConfiguration, token).ConfigureAwait(false);\n\n            _context.OutputHelper.WriteLine($\"Created deployment {configuration.Id}.\");\n            return configuration != null;\n        }\n\n        /// <inheritdoc />\n        public async Task DeleteLayeredDeploymentAsync(CancellationToken token)\n        {\n            var deploymentConfiguration = GetDeploymentConfiguration();\n\n            await _context.RegistryHelper\n                .DeleteConfigurationAsync(deploymentConfiguration.Id, token).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc />\n        public Configuration GetDeploymentConfiguration()\n        {\n            return new Configuration(DeploymentName)\n            {\n                Content = new ConfigurationContent\n                {\n                    ModulesContent = CreateDeploymentModules()\n                },\n                TargetCondition = TargetCondition,\n                Priority = Priority\n            };\n        }\n\n        protected readonly IIoTPlatformTestContext _context;\n\n        /// <summary>\n        /// Create a deployment modules object\n        /// </summary>\n        protected abstract IDictionary<string, IDictionary<string, object>> CreateDeploymentModules();\n\n        /// <summary>\n        /// The desired rank of deployment\n        /// </summary>\n        protected abstract int Priority { get; }\n\n        /// <summary>\n        /// Identifier of deployment\n        /// </summary>\n        protected abstract string DeploymentName { get; }\n\n        /// <summary>\n        /// Target condition for applying the deployment\n        /// </summary>\n        protected abstract string TargetCondition { get; }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/deploy/IIoTHubEdgeDeployment.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Deploy\n{\n    using Microsoft.Azure.Devices;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    public interface IIoTHubEdgeDeployment\n    {\n        /// <summary>\n        /// Create a new layered deployment or update an existing one.\n        /// </summary>\n        /// <param name=\"token\">The token to cancel the async task</param>\n        /// <returns>true if create or update was successful otherwise false</returns>\n        Task<bool> CreateOrUpdateLayeredDeploymentAsync(CancellationToken token);\n\n        /// <summary>\n        /// Get deployment configuration.\n        /// </summary>\n        Configuration GetDeploymentConfiguration();\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/deploy/IoTHubEdgeBaseDeployment.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Deploy\n{\n    using Newtonsoft.Json;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using TestExtensions;\n\n    /// <summary>\n    /// Default edge base deployment configuration\n    /// </summary>\n    public sealed class IoTHubEdgeBaseDeployment : DeploymentConfiguration\n    {\n        /// <summary>\n        /// Create edge base deployer\n        /// </summary>\n        /// <param name=\"context\"></param>\n        public IoTHubEdgeBaseDeployment(IIoTPlatformTestContext context) : base(context)\n        {\n        }\n\n        /// <inheritdoc />\n        protected override int Priority => 0;\n\n        /// <inheritdoc />\n        protected override string DeploymentName => kDeploymentName;\n\n        /// <inheritdoc />\n        protected override string TargetCondition => kTargetCondition;\n\n        /// <inheritdoc />\n        protected override IDictionary<string, IDictionary<string, object>> CreateDeploymentModules()\n        {\n            // We should always consume edgeAgent and edgeHub from mcr.microsoft.com.\n            const string server = TestConstants.MicrosoftContainerRegistry;\n            var version = _context.IoTEdgeConfig.EdgeVersion;\n\n            return JsonConvert.DeserializeObject<IDictionary<string, IDictionary<string, object>>>(\"\"\"\n\n            {\n                \"$edgeAgent\": {\n                    \"properties.desired\": {\n                        \"schemaVersion\": \"\n\"\"\" + kDefaultSchemaVersion + \"\"\"\n\",\n                        \"runtime\": {\n                            \"type\": \"docker\",\n                            \"settings\": {\n                                \"minDockerVersion\": \"v1.25\",\n                                \"loggingOptions\": \"\",\n                                \"registryCredentials\": {\n                                }\n                            }\n                        },\n                        \"systemModules\": {\n                            \"edgeAgent\": {\n                                \"type\": \"docker\",\n                                \"settings\": {\n                                    \"image\": \"\n\"\"\" + server + \"/azureiotedge-agent:\" + version + \"\"\"\n\",\n                                    \"createOptions\": \"{}\"\n                                },\n                                \"env\": {\n                                    \"ExperimentalFeatures__Enabled\": {\n                                        \"value\": \"true\"\n                                    },\n                                    \"ExperimentalFeatures__EnableGetLogs\": {\n                                        \"value\": \"true\"\n                                    },\n                                    \"ExperimentalFeatures__EnableUploadLogs\": {\n                                        \"value\": \"true\"\n                                    },\n                                    \"ExperimentalFeatures__EnableMetrics\": {\n                                        \"value\": \"true\"\n                                    }\n                                }\n                            },\n                            \"edgeHub\": {\n                                \"type\": \"docker\",\n                                \"status\": \"running\",\n                                \"restartPolicy\": \"always\",\n                                \"settings\": {\n                                    \"image\": \"\n\"\"\" + server + \"/azureiotedge-hub:\" + version + \"\"\"\n\",\n                                    \"createOptions\":  \"{\\\"HostConfig\\\":{\\\"PortBindings\\\":{\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"443\\\"}],\\\"5671/tcp\\\":[{\\\"HostPort\\\":\\\"5671\\\"}],\\\"8883/tcp\\\":[{\\\"HostPort\\\":\\\"8883\\\"}],\\\"9600/tcp\\\":[{\\\"HostPort\\\":\\\"9600\\\"}]}},\\\"ExposedPorts\\\":{\\\"5671/tcp\\\":{},\\\"8883/tcp\\\":{},\\\"9600/tcp\\\":{}}}\"\n                                },\n                                \"env\": {\n                                    \"experimentalFeatures:enabled\": {\n                                        \"value\": \"true\"\n                                    },\n                                    \"SslProtocols\": {\n                                        \"value\": \"tls1.2\"\n                                    }\n                                }\n                            }\n                        },\n                        \"modules\": {\n                        }\n                    }\n                },\n                \"$edgeHub\": {\n                    \"properties.desired\": {\n                        \"routes\": { },\n                        \"schemaVersion\": \"\n\"\"\" + kDefaultSchemaVersion + \"\"\"\n\",\n                        \"storeAndForwardConfiguration\": {\n                            \"timeToLiveSecs\": 7200\n                        }\n                    }\n                }\n            }\n\n\"\"\");\n        }\n\n        private const string kDefaultSchemaVersion = \"1.0\";\n        private const string kDeploymentName = \"iiotedge\";\n        /// <summary>\n        /// for E2E testing we use \"unmanaged\" for standalone testing\n        /// base deployment need to be valid for both (managed and unmanaged)\n        /// </summary>\n        private const string kTargetCondition = \"tags.__type__ = 'iiotedge'\";\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/deploy/IoTHubPublisherDeployment.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Deploy\n{\n    using Newtonsoft.Json;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using TestExtensions;\n\n    public sealed class IoTHubPublisherDeployment : ModuleDeploymentConfiguration\n    {\n        /// <summary>\n        /// MessagingMode that will be used for configuration of OPC Publisher.\n        /// </summary>\n        public readonly MessagingMode MessagingMode;\n\n        /// <summary>\n        /// Create deployment\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"messagingMode\"></param>\n        public IoTHubPublisherDeployment(IIoTPlatformTestContext context, MessagingMode messagingMode) : base(context)\n        {\n            MessagingMode = messagingMode;\n            DeploymentName = kDeploymentName;\n        }\n\n        /// <inheritdoc />\n        protected override int Priority => 1;\n\n        /// <inheritdoc />\n        protected override string DeploymentName { get; }\n\n        protected override string TargetCondition => kTargetCondition;\n\n        /// <inheritdoc />\n        public override string ModuleName => kModuleName;\n\n        /// <inheritdoc />\n        protected override IDictionary<string, IDictionary<string, object>> CreateDeploymentModules()\n        {\n            var registryCredentials = \"\";\n\n            //should only be provided if the different container registry require username and password\n            if (!string.IsNullOrEmpty(_context.ContainerRegistryConfig.ContainerRegistryServer) &&\n                _context.ContainerRegistryConfig.ContainerRegistryServer != TestConstants.MicrosoftContainerRegistry &&\n                !string.IsNullOrEmpty(_context.ContainerRegistryConfig.ContainerRegistryPassword) &&\n                !string.IsNullOrEmpty(_context.ContainerRegistryConfig.ContainerRegistryUser))\n            {\n                var registryId = _context.ContainerRegistryConfig.ContainerRegistryServer.Split('.')[0];\n                registryCredentials = \"\"\"\n\n                    \"properties.desired.runtime.settings.registryCredentials.\n\"\"\" + registryId + \"\"\"\n\": {\n                        \"address\": \"\n\"\"\" + _context.ContainerRegistryConfig.ContainerRegistryServer + \"\"\"\n\",\n                        \"password\": \"\n\"\"\" + _context.ContainerRegistryConfig.ContainerRegistryPassword + \"\"\"\n\",\n                        \"username\": \"\n\"\"\" + _context.ContainerRegistryConfig.ContainerRegistryUser + \"\"\"\n\"\n                    },\n\n\"\"\";\n            }\n\n            // Configure create options per os specified\n            var createOptions = JsonConvert.SerializeObject(new\n            {\n                Hostname = ModuleName,\n                User = \"root\",\n                Cmd = new[] {\n                    \"--pki=\" + TestConstants.PublishedNodesFolder + \"/pki\",\n                    \"--dm\", // Disable metadata support\n                    \"--aa\",\n                    \"--pf=\" + TestConstants.PublishedNodesFullName,\n                    \"--mm=\" + MessagingMode.ToString(),\n                    \"--fm=true\",\n                    \"--RuntimeStateReporting=true\"\n                },\n                HostConfig = new\n                {\n                    Binds = new[] {\n                        TestConstants.PublishedNodesFolder + \"/:\" + TestConstants.PublishedNodesFolder\n                    },\n                    CapDrop = new[] {\n                        \"CHOWN\",\n                        \"SETUID\"\n                    }\n                }\n            }).Replace(\"\\\"\", \"\\\\\\\"\", StringComparison.Ordinal);\n\n            var server = string.IsNullOrEmpty(_context.ContainerRegistryConfig.ContainerRegistryServer) ?\n                TestConstants.MicrosoftContainerRegistry : _context.ContainerRegistryConfig.ContainerRegistryServer;\n            var ns = string.IsNullOrEmpty(_context.ContainerRegistryConfig.ImagesNamespace) ? \"\" :\n                _context.ContainerRegistryConfig.ImagesNamespace.TrimEnd('/') + \"/\";\n            var version = _context.ContainerRegistryConfig.ImagesTag ?? \"latest\";\n            var image = $\"{server}/{ns}iotedge/opc-publisher:{version}\";\n\n            _context.\n            OutputHelper.WriteLine($\"Deploying {image} as {ModuleName}\");\n\n            // Return deployment modules object\n            var content = \"\"\"\n\n            {\n                \"$edgeAgent\": {\n\n\"\"\" + registryCredentials + \"\"\"\n\n                    \"properties.desired.modules.\n\"\"\" + ModuleName + \"\"\"\n\": {\n                        \"settings\": {\n                            \"image\": \"\n\"\"\" + image + \"\"\"\n\",\n                            \"createOptions\": \"\n\"\"\" + createOptions + \"\"\"\n\"\n                        },\n                        \"type\": \"docker\",\n                        \"status\": \"running\",\n                        \"restartPolicy\": \"always\",\n                        \"version\": \"\n\"\"\" + (version == \"latest\" ? \"1.0\" : version) + \"\"\"\n\"\n                    }\n                },\n                \"$edgeHub\": {\n                    \"properties.desired.routes.\n\"\"\" + ModuleName + @\"ToUpstream\"\": \"\"FROM /messages/modules/\" + ModuleName + \"\"\"\n/* INTO $upstream\",\n                    \"properties.desired.routes.leafToUpstream\": \"FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO $upstream\"\n                }\n            }\n\"\"\";\n            return JsonConvert.DeserializeObject<IDictionary<string, IDictionary<string, object>>>(content);\n        }\n\n        private const string kModuleName = \"publisher_standalone\";\n        private const string kDeploymentName = \"__default-opcpublisher-standalone\";\n        private const string kTargetCondition = \"(tags.__type__ = 'iiotedge' AND IS_DEFINED(tags.unmanaged))\";\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/deploy/ModuleDeploymentConfiguration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace OpcPublisherAEE2ETests.Deploy\n{\n    using TestExtensions;\n\n    /// <summary>\n    /// Configuration that corresponds to a module deployment.\n    /// </summary>\n    public abstract class ModuleDeploymentConfiguration : DeploymentConfiguration\n    {\n        /// <summary>\n        /// Name of the module that is being deployed by this configuration.\n        /// </summary>\n        public abstract string ModuleName { get; }\n\n        /// <summary>\n        /// Constructor that delegates to the base DeploymentConfiguration.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected ModuleDeploymentConfiguration(IIoTPlatformTestContext context)\n            : base(context) { }\n    }\n}\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/opc-plc-files/sc001.json",
    "content": "{\n    \"folders\": [\n      {\n        \"name\": \"VendingMachines\",\n        \"sources\": [\n          {\n            \"objectType\": \"BaseObjectState\",\n            \"name\": \"VendingMachine1\",\n            \"alarms\": [\n              {\n                \"objectType\": \"TripAlarmType\",\n                \"name\": \"VendingMachine1_DoorOpen\",\n                \"id\": \"V1_DoorOpen\"\n              },\n              {\n                \"objectType\": \"LimitAlarmType\",\n                \"name\": \"VendingMachine1_TemperatureHigh\",\n                \"id\": \"V1_TemperatureHigh\"\n              },\n              {\n                \"objectType\": \"ConditionType\",\n                \"name\": \"VendingMachine1_AD_Lamp_Off\",\n                \"id\": \"V1_AD_Lamp_Off\"\n              }\n            ]\n          },\n          {\n            \"objectType\": \"BaseObjectState\",\n            \"name\": \"VendingMachine2\",\n            \"alarms\": [\n              {\n                \"objectType\": \"TripAlarmType\",\n                \"name\": \"VendingMachine2_DoorOpen\",\n                \"id\": \"V2_DoorOpen\"\n              },\n              {\n                \"objectType\": \"OffNormalAlarmType\",\n                \"name\": \"VendingMachine2_LightOff\",\n                \"id\": \"V2_LightOff\"\n              }\n            ]\n          }\n        ]\n      }\n    ],\n    \"script\": {\n      \"waitUntilStartInSeconds\": 10,\n      \"isScriptInRepeatingLoop\": true,\n      \"runningForSeconds\": 86400,\n      \"steps\": [\n        {\n          \"event\": {\n            \"alarmId\": \"V1_DoorOpen\",\n            \"reason\": \"Door Open\",\n            \"severity\": \"High\",\n            \"eventId\": \"V1_DoorOpen-1\",\n            \"stateChanges\": [\n              {\n                \"stateType\": \"Enabled\",\n                \"state\": true\n              },\n              {\n                \"stateType\": \"Activated\",\n                \"state\": true\n              }\n            ]\n          }\n        },\n        {\n          \"sleepInSeconds\": 5\n        },\n        {\n          \"event\": {\n            \"alarmId\": \"V2_LightOff\",\n            \"reason\": \"Light Off in machine\",\n            \"severity\": \"Medium\",\n            \"eventId\": \"V2_LightOff-1\",\n            \"stateChanges\": [\n              {\n                \"stateType\": \"Enabled\",\n                \"state\": true\n              },\n              {\n                \"stateType\": \"Activated\",\n                \"state\": true\n              }\n            ]\n          }\n        },\n        {\n          \"event\": {\n            \"alarmId\": \"V1_AD_Lamp_Off\",\n            \"reason\": \"AD Lamp Off\",\n            \"severity\": \"Medium\",\n            \"eventId\": \"V1_AD_Lamp_Off-1\",\n            \"stateChanges\": [\n              {\n                \"stateType\": \"Enabled\",\n                \"state\": true\n              }\n            ]\n          }\n        },\n        {\n          \"sleepInSeconds\": 5\n        },\n        {\n          \"event\": {\n            \"alarmId\": \"V1_DoorOpen\",\n            \"reason\": \"Door Closed\",\n            \"severity\": \"Medium\",\n            \"eventId\": \"V1_DoorOpen-2\",\n            \"stateChanges\": [\n              {\n                \"stateType\": \"Activated\",\n                \"state\": false\n              }\n            ]\n          }\n        },\n        {\n          \"sleepInSeconds\": 4\n        },\n        {\n          \"event\": {\n            \"alarmId\": \"V1_TemperatureHigh\",\n            \"reason\": \"Temperature is HIGH (LAST EVENT IN LOOP)\",\n            \"severity\": \"High\",\n            \"eventId\": \"V1_TemperatureHigh-1\",\n            \"stateChanges\": [\n              {\n                \"stateType\": \"Activated\",\n                \"state\": true\n              },\n              {\n                \"stateType\": \"Enabled\",\n                \"state\": true\n              }\n            ]\n          }\n        }\n      ]\n    }\n  }\n"
  },
  {
    "path": "e2e-tests/OpcPublisher-E2E-Tests/xunit.runner.json",
    "content": "{\n  \"parallelizeTestCollections\": false\n}\n"
  },
  {
    "path": "e2e-tests/readme.md",
    "content": "# E2E test\n\n## Background\nPoperties of E2E tests:\n* black-box\n* end-to-end\n* high cost tests (long preparation / execution times)\n\nGoal of E2E tests:\n* check the customer point of view (validate)\n* cover the most important scenarios\n\n## How to write E2E tests\n### Preparation\nUse the `TestCaseOrderer` attribute with `TestCaseOrderer.FullName` parameter on\nyour test class, and `PriorityOrder` on your test methods to order them.\n\nUse the `Collection` attribute on your test class to share the context between \ntest methods.\n\nUse the `Trait` attribute on your test class to distinguish between orchestrated and standalone mode:\n* for orchestrated mode use the `Trait` with the name `TestConstants.TraitConstants.PublisherModeTraitName` and the value `TestConstants.TraitConstants.PublisherModeOrchestratedTraitValue`,\n* for standalone mode use the `Trait` with the name `TestConstants.TraitConstants.PublisherModeTraitName` and the value `TestConstants.TraitConstants.PublisherModeStandaloneTraitValue`.\n\nThe test class gets the context as a parameter of its constructor.\nUse one of the following context types:\n* `IIoTPlatformTestContext` - for orchestrated mode\n* `IIoTStandaloneTestContext` - for standalone mode\n\nIn order for the context to log information the `OutputHelper` of the context needs to be set to the `IOutputHelper` the test class gets as a constructor parameter.\n\nIf necessary you can clean the context by calling its `Reset` method, otherwise it's state is shared between test methods, and even between test classes of the same `Collection`. It is recommended to call `Reset` on the context in the first test method of a test class.\n\nAll test collections should start by setting the desired mode as a first step. E.g.<br>\n`await TestHelper.SwitchToOrchestratedModeAsync(_context);`\n\nUse and extend the `TestHelper` class.\n\n`TestEventProcessor` listens to IoT Hub and analyzes the value changes.\n\n## Executing tests in Visual Studio\n\nYou can reuse a test deployment to speed up test development.\nFollow these steps:\n* Start new E2E pipeline build with `Cleanup` variable set to `false`.\n* Find the `ResourceGroupName` in the pipeline logs.\n* Navigate to the given resource group on the Azure portal.\n* Change tags:\n  * add or edit tag named `owner` where the value identifies you,\n  * add the tag `DoNotDelete` with the value `true`.\n* Add yourself to the KeyVault:\n  * open \"Access policies\" on the azure portal,\n  * click \"Add Access Policy\",\n  * at \"Configure from template\" select \"Key & Secret Management\",\n  * at \"Select principal\" select your principal,\n  * press the \"Add\" button,\n  * press the \"Save\" button.\n* Execute /tools/e2etesting/GetSecrets.ps1 -KeyVaultName &lt;YourKeyVaultName&gt;. You will be asked whether you want to overwrite the .env file or not.\n  * if you choose 'yes' just wait for the script to finish and no further steps are needed\n  * if you choose 'no' copy the script output to *reporoot*/e2etests/.env\n    > The .env file is excluded from git, but double check you are not committing secrets.\n* Now you can use Visual Studio to execute your tests.\n* Don't forget to clean up by executing the pipeline with these variables set:\n  * `Cleanup = false`\n  * `UseExisting = true`\n  * `ResourceGroupName = $[format('<your_resource_group_name>')]`\n\n### To debug publisher messages and message validation issues\n\n* Stop the app service instance in the resource group.\n* Start the TestEventProcessor service from the tools\\e2etesting\\TestEventProcessor\\TestEventProcessor.slnx solution file\n* Change the .env file generated from KeyVault and change the TESTEVENTPROCESSOR_* variables to the default values found\n  in the TestEventProcessor's appsettings.json and launchSettings.json files.\n    \"TESTEVENTPROCESSOR_BASEURL\": \"https://localhost:49450\",\n    \"TESTEVENTPROCESSOR_USERNAME\": \"username\",\n    \"TESTEVENTPROCESSOR_PASSWORD\": \"password\",\n* Start the unit test (development)"
  },
  {
    "path": "readme.md",
    "content": "# Microsoft OPC Publisher Edge Module\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Build Status](https://msazure.visualstudio.com/One/_apis/build/status%2FOneBranch%2FIndustrial-IoT%2FIndustrial-IoT-Buddy?repoName=Industrial-IoT&branchName=main)](https://msazure.visualstudio.com/One/_build/latest?definitionId=364946&repoName=Industrial-IoT&branchName=main)\n\n## Discover, register and manage your OPC UA enabled Assets with Azure\n\nMicrosoft [OPC Publisher](docs/opc-publisher/readme.md) allows you to discover and operate OPC UA enabled industrial assets.\n\nWith OPC Publisher you can  harness the power of OPC UA and Azure IoT. OPC Publisher is a fully compliant OPC UA PubSub telemetry publisher (supporting JSON, JSON+Gzip, and UADP binary encoding) and provides a large subset of the OPC UA services through its control plane. OPC Publisher is an Azure IoT Edge module that runs on on-premises. OPC Publisher API can be accessed via HTTP(s) (Preview), an MQTT Broker (Preview) or through Azure IoT Hub device methods.\n\nMicrosoft provides pre-built Docker containers in the Microsoft Container Registry (MCR) for OPC Publisher and the other tools included in this repository.\n\n## Get started\n\n* Learn about [OPC Publisher](docs/opc-publisher/readme.md) and how to use it.\n* See all [Features](docs/opc-publisher/features.md) of OPC Publisher and their support level.\n* More [Industrial IoT documentation](docs/readme.md).\n* Find [release announcements](docs/release-announcement.md) and all [releases of the platform](https://github.com/Azure/Industrial-IoT/releases).\n\n## Get support\n\nPlease report any security related issues by following our [security process](./SECURITY.md).\n\nIf you are an Azure customer, please create an Azure Support Request. More information can be found [here](https://azure.microsoft.com/support/create-ticket/). (Azure Support SLA applies).\n\nOtherwise, please report bugs, feature requests, or suggestions as [GitHub issues](https://github.com/Azure/Industrial-IoT/issues) (No SLA available).\n\n### Supported releases and support policy\n\nOur releases are tagged following semantic versioning (“semver”) conventions. Minor and patch releases do not break backwards compatibility. Releases not shown in the table (e.g., 2.4.x, 2.5.x, 2.6.x, or 2.7.x) are out of support already.\n\n| Release (tag)      | Last release (tag) | End of support | Successor (tag)       | Update instructions |\n|--------------------|--------------------|----------------|-----------------------|---------------------|\n| Industrial IoT 2.8 | [2.8.6](https://github.com/Azure/Industrial-IoT/tree/release/2.8.6) | 7/15/2023  | OPC Publisher 2.9 | [Migration Path](docs/opc-publisher/migrationpath.md) |\n| OPC Publisher 2.8  | [2.8.7](https://github.com/Azure/Industrial-IoT/tree/release/2.8.7) | 12/15/2023 | OPC Publisher 2.9 | N/A |\n| OPC Publisher 2.9  | [2.9.15](https://github.com/Azure/Industrial-IoT/tree/release/2.9.15) | 11/10/2026 | TBA               | [Migration Path](docs/opc-publisher/migrationpath.md) |\n\nWe only support the latest patch version of a release which per semantic versioning convention is identified by the 3rd part of the version string. Preview releases, preview and experimental features are only supported through GitHub issues.\n\nIf you are using a container image with a major.minor version tag that is supported per above table, but a patch version lower than the latest patch version, you need to update your images to the latest version to ensure secure operation and take advantage of the latest fixes. If you unexpectedly encounter bugs and require help, please ensure you are running the latest patch release as we might already have addressed the issue you are seeing. If you are not, please update first and try to reproduce the issue on the latest patch version.\n\nSecurity-critical updates are made to the last patch version of the major.minor release containing the vulnerability. Bug fixes that are not security related are made only to the main branch and to the last supported release. The version the fix will be in can be found in the version.json file of the respective branch.\n\nOur [official Microsoft support](https://azure.microsoft.com/support/create-ticket/) and any related SLA only covers officially released docker containers obtained from MCR (Microsoft Container Registry) and deployed to Azure in Azure App Services (Web API container) or IoT Edge (OPC Publisher module container) using the documentation and deployment scripts provided as part of the latest release. Experimental and Preview features are excluded. Also, all Azure services deployed, the installed IoT Edge runtime, as well as Operating System and other middleware and combinations thereof must be officially supported as per their published support policy and SLA.\n\nIn all other cases, support is provided on a best effort basis through [GitHub issues](https://github.com/Azure/Industrial-IoT/issues). We aim to release patch releases on a regular cadence (approximately every 1-2 months), so if you are blocked, and you can suggest or contribute fixes, the chances of getting it into the next patch release are high.\n\n## Contribute\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\nIf you want/plan to contribute, we ask you to sign a [CLA](https://cla.microsoft.com/) (Contribution License Agreement) and follow the project 's [code submission guidelines](./contributing.md). A friendly bot will remind you about it when you submit a pull-request.\n\n## License\n\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the [MIT](LICENSE) License.\n"
  },
  {
    "path": "samples/.gitignore",
    "content": "/**/launchSettings.json"
  },
  {
    "path": "samples/Http/BrowseAll/BrowseAll.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing System.Net.Http.Json;\n\nConsole.WriteLine(\"Press key to exit\");\nConsole.WriteLine();\nusing var cts = new CancellationTokenSource();\n_ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); });\n\nusing var parameters = await Parameters.Parse(args).ConfigureAwait(false);\n// Connect to publisher\nusing var httpClient = parameters.CreateHttpClientWithAuth();\n\nvar request = new HttpRequestMessage(HttpMethod.Post, parameters.OpcPublisher + \"/v2/browse\")\n{\n    Content = JsonContent.Create(new\n    {\n        connection = new\n        {\n            endpoint = new\n            {\n                url = parameters.OpcPlc,\n                securityMode = \"SignAndEncrypt\"\n            }\n        },\n        request = new { }\n    }),\n};\nusing var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cts.Token).ConfigureAwait(false);\nresponse.EnsureSuccessStatusCode();\nawait foreach (var result in JsonSerializer.DeserializeAsyncEnumerable<JsonElement>(response.Content.ReadAsStream(), cancellationToken: cts.Token)!)\n{\n    var browseElementJson = JsonSerializer.Serialize(result, Parameters.Indented);\n    Console.WriteLine(browseElementJson);\n}\n"
  },
  {
    "path": "samples/Http/BrowseAll/BrowseAll.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Http/GetConfiguration/GetConfiguration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing System.Net.Http.Json;\n\nConsole.WriteLine(\"Press key to exit\");\nConsole.WriteLine();\nusing var cts = new CancellationTokenSource();\n_ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); });\n\nusing var parameters = await Parameters.Parse(args).ConfigureAwait(false);\n// Connect to publisher\nusing var httpClient = parameters.CreateHttpClientWithAuth();\n\nvar configuration = await httpClient.GetFromJsonAsync<JsonElement>(parameters.OpcPublisher + \"/v2/configuration\",\n    JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\nvar endpoints = configuration.GetProperty(\"endpoints\").EnumerateArray();\nforeach (var endpoint in endpoints)\n{\n    var endpointJson = JsonSerializer.Serialize(endpoint, Parameters.Indented);\n    Console.WriteLine(endpointJson);\n    var response = await httpClient.PostAsJsonAsync(parameters.OpcPublisher + \"/v2/configuration/endpoints/list/nodes\",\n        endpoint, cts.Token).ConfigureAwait(false);\n    var nodesJson = JsonSerializer.Serialize(JsonSerializer.Deserialize<JsonElement>(\n        await response.Content.ReadAsStringAsync(cts.Token).ConfigureAwait(false)),\n        Parameters.Indented);\n    Console.WriteLine(nodesJson);\n}\n"
  },
  {
    "path": "samples/Http/GetConfiguration/GetConfiguration.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Http/GetDiagnostics/GetDiagnostics.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing System.Net.Http.Json;\n\nusing var cts = new CancellationTokenSource();\n_ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); });\n\nusing var parameters = await Parameters.Parse(args).ConfigureAwait(false);\n// Connect to publisher\nusing var httpClient = parameters.CreateHttpClientWithAuth();\nwhile (!cts.IsCancellationRequested)\n{\n    Console.Clear();\n    try\n    {\n        await foreach (var info in httpClient.GetFromJsonAsAsyncEnumerable<JsonElement>(\n            parameters.OpcPublisher + \"/v2/diagnostics/clients\", cts.Token))\n        {\n            var str = JsonSerializer.Serialize(info, Parameters.Indented);\n            Console.WriteLine(str);\n        }\n        Console.WriteLine();\n        Console.WriteLine(\"Press key to exit\");\n        Console.SetCursorPosition(0, 0);\n        await Task.Delay(TimeSpan.FromSeconds(1), cts.Token).ConfigureAwait(false);\n    }\n    catch (OperationCanceledException) { break; }\n    catch (Exception ex)\n    {\n        Console.WriteLine(ex);\n    }\n}\n"
  },
  {
    "path": "samples/Http/GetDiagnostics/GetDiagnostics.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Http/HttpSamples.slnx",
    "content": "<Solution>\n  <Project Path=\"BrowseAll/BrowseAll.csproj\" />\n  <Project Path=\"GetConfiguration/GetConfiguration.csproj\" />\n  <Project Path=\"GetDiagnostics/GetDiagnostics.csproj\" />\n  <Project Path=\"ReadCurrentTime/ReadCurrentTime.csproj\" />\n  <Project Path=\"SetConfiguration/SetConfiguration.csproj\" />\n  <Project Path=\"WriteReadbackValue/WriteReadbackValue.csproj\" />\n</Solution>\n"
  },
  {
    "path": "samples/Http/Parameters.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing CommandLine;\nusing Microsoft.Azure.Devices;\nusing System.Diagnostics;\nusing System.Net.Http.Headers;\nusing System.Security.Cryptography.X509Certificates;\nusing System.Text.Json;\n\n/// <summary>\n/// Command line parameters\n/// </summary>\ninternal sealed class Parameters : IDisposable\n{\n    [Option(\n        'c',\n        \"IoTHubOwnerConnectionString\",\n        Required = false,\n        HelpText = \"The IoT hub connection string. This is available under the 'Shared access policies' in the Azure portal.\" +\n        \"\\nDefaults to value of environment variable 'IoTHubOwnerConnectionString'.\")]\n    public string? IoTHubOwnerConnectionString { get; set; } = Environment.GetEnvironmentVariable(\"IoTHubOwnerConnectionString\");\n\n    [Option(\n        'e',\n        \"EdgeHubConnectionString\",\n        Required = false,\n        HelpText = \"The edge hub connection string that OPC Publisher is using mainly for the module and device id values.\" +\n        \"\\nDefaults to value of environment variable 'EdgeHubConnectionString'.\")]\n    public string? EdgeHubConnectionString { get; set; } = Environment.GetEnvironmentVariable(\"EdgeHubConnectionString\");\n\n    const string HttpEndpoint = \"http://localhost:9071\";\n    const string HttpsEndpoint = \"https://localhost:9072\";\n\n    /// <summary>\n    /// Publisher Endpoint\n    /// </summary>\n    public string OpcPublisher => ApiKey == null ? HttpEndpoint : HttpsEndpoint;\n\n    /// <summary>\n    /// Plc endpoint\n    /// </summary>\n    public string OpcPlc { get; } = \"opc.tcp://opcplc:50000\";\n\n    /// <summary>\n    /// Certificate\n    /// </summary>\n    public X509Certificate2? Certificate { get; private set; }\n\n    /// <summary>\n    /// Api key\n    /// </summary>\n    public string? ApiKey { get; private set; }\n\n    internal static readonly JsonSerializerOptions Indented = new() { WriteIndented = true };\n\n    /// <summary>\n    /// Create client\n    /// </summary>\n    /// <returns></returns>\n    public HttpClient CreateHttpClientWithAuth()\n    {\n        if (ApiKey == null)\n        {\n            return new HttpClient();\n        }\n        var httpClient = new HttpClient(new HttpClientHandler\n        {\n            ServerCertificateCustomValidationCallback = (_, cert, _, _)\n                => cert != null && Certificate?.Thumbprint == cert?.Thumbprint\n        });\n        httpClient.DefaultRequestHeaders.Authorization =\n            new AuthenticationHeaderValue(\"ApiKey\", ApiKey);\n        return httpClient;\n    }\n\n    public void Dispose()\n    {\n        Certificate?.Dispose();\n        ApiKey = null;\n    }\n\n    /// <summary>\n    /// Parse parameters\n    /// </summary>\n    /// <param name=\"args\"></param>\n    /// <returns></returns>\n    public static async Task<Parameters> Parse(string[] args)\n    {\n        Parameters? parameters = null;\n        ParserResult<Parameters> result = Parser.Default.ParseArguments<Parameters>(args)\n            .WithParsed(parsedParams => parameters = parsedParams)\n            .WithNotParsed(errors => Environment.Exit(1));\n        Debug.Assert(parameters != null);\n\n        var deviceId = string.Empty;\n        var moduleId = string.Empty;\n        try\n        {\n            var ehc = IotHubConnectionStringBuilder.Create(parameters.EdgeHubConnectionString);\n            deviceId = ehc.DeviceId;\n            moduleId = ehc.ModuleId;\n\n            // Create a ServiceClient to communicate with service-facing endpoint on your hub.\n            using var registryManager = RegistryManager.CreateFromConnectionString(\n                parameters.IoTHubOwnerConnectionString);\n            var twin = await registryManager.GetTwinAsync(deviceId, moduleId).ConfigureAwait(false);\n            parameters.ApiKey = (string)twin.Properties.Reported[\"__apikey__\"];\n            var cert = (byte[])twin.Properties.Reported[\"__certificate__\"];\n            parameters.Certificate = new X509Certificate2(cert, parameters.ApiKey);\n            return parameters;\n        }\n        catch (Exception ex)\n        {\n            Console.WriteLine(\"Error occurred trying to access api key and certificate.\");\n\n            // In production this should be thrown and not continued.\n            Console.WriteLine(ex.Message);\n        }\n        Console.WriteLine(\"Specify connection strings to use the secure endpoint.\");\n        Console.WriteLine(\"The unsecure endpoint will be used for demonstration purposes.\");\n        Console.WriteLine(\"This is a security risk and should not be used in production!!!\");\n        return parameters;\n    }\n}\n"
  },
  {
    "path": "samples/Http/ReadCurrentTime/ReadCurrentTime.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing System.Net.Http.Json;\n\nConsole.WriteLine(\"Press key to exit\");\nConsole.WriteLine();\nusing var cts = new CancellationTokenSource();\n_ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); });\n\nusing var parameters = await Parameters.Parse(args).ConfigureAwait(false);\n// Connect to publisher\nusing var httpClient = parameters.CreateHttpClientWithAuth();\n\nwhile (true)\n{\n    // Read current time from server - see /read api in api.md\n    using var response = await httpClient.PostAsJsonAsync(parameters.OpcPublisher + \"/v2/read\", new\n    {\n        connection = new\n        {\n            endpoint = new\n            {\n                url = parameters.OpcPlc,\n                securityMode = \"SignAndEncrypt\"\n            }\n        },\n        request = new\n        {\n            nodeId = \"i=2258\"\n        }\n    }).ConfigureAwait(false);\n    response.EnsureSuccessStatusCode();\n\n    var responseJson = await response.Content.ReadFromJsonAsync<JsonElement>().ConfigureAwait(false);\n    Console.WriteLine(\"Current time on server:\" + responseJson.GetProperty(\"value\").GetString());\n}\n"
  },
  {
    "path": "samples/Http/ReadCurrentTime/ReadCurrentTime.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Http/SetConfiguration/SetConfiguration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing System.Net.Http.Json;\n\nConsole.WriteLine(\"Press key to exit\");\nConsole.WriteLine();\nusing var cts = new CancellationTokenSource();\n_ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); });\n\nusing var parameters = await Parameters.Parse(args).ConfigureAwait(false);\n// Connect to publisher\nusing var httpClient = parameters.CreateHttpClientWithAuth();\n\n// Get original published nodes json configuration\nvar original = await httpClient.GetFromJsonAsync<JsonElement>(parameters.OpcPublisher + \"/v2/configuration?IncludeNodes=true\",\n    JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\nvar json = JsonSerializer.Serialize(original, Parameters.Indented);\nConsole.WriteLine(\"Original configuration: \" + json);\n\n// Clear all\nusing var clear = await httpClient.PutAsJsonAsync(parameters.OpcPublisher + \"/v2/configuration\", new { },\n    JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\nclear.EnsureSuccessStatusCode();\nvar empty = await httpClient.GetFromJsonAsync<JsonElement>(parameters.OpcPublisher + \"/v2/configuration?IncludeNodes=true\",\n    JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\njson = JsonSerializer.Serialize(empty, Parameters.Indented);\nConsole.WriteLine(\"Cleared to: \" + json);\n\n// Patch configuration to add new one\n\nusing var addOrUpdate = await httpClient.PatchAsJsonAsync(parameters.OpcPublisher + \"/v2/configuration\", new[]\n{\n    new\n    {\n        EndpointUrl = parameters.OpcPlc,\n        DataSetWriterGroup = \"Asset1\",\n        DataSetWriterId = \"DataFlow1\",\n        DataSetPublishingInterval = 5000,\n        OpcNodes = new []\n        {\n            new\n            {\n                Id = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\"\n            }\n        }\n    }\n}, JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\naddOrUpdate.EnsureSuccessStatusCode();\n\nvar configuration = await httpClient.GetFromJsonAsync<JsonElement>(parameters.OpcPublisher + \"/v2/configuration?IncludeNodes=true\",\n    JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\njson = JsonSerializer.Serialize(configuration, Parameters.Indented);\nConsole.WriteLine(\"Patched to: \" + json);\n\n// Remove the endpoint and all its nodes again\nusing var unpublish = await httpClient.PostAsJsonAsync(parameters.OpcPublisher + \"/v2/configuration/nodes/unpublish\", new\n{\n    EndpointUrl = parameters.OpcPlc,\n    DataSetWriterGroup = \"Asset1\",\n    DataSetWriterId = \"DataFlow1\"\n}, JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\nunpublish.EnsureSuccessStatusCode();\n\nconfiguration = await httpClient.GetFromJsonAsync<JsonElement>(parameters.OpcPublisher + \"/v2/configuration?IncludeNodes=true\",\n    JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\njson = JsonSerializer.Serialize(configuration, Parameters.Indented);\nConsole.WriteLine(\"Now cleared again: \" + json);\n\n// Re-apply original published nodes json configuration to the publisher\nusing var reset = await httpClient.PutAsJsonAsync(parameters.OpcPublisher + \"/v2/configuration\", original,\n    JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\nreset.EnsureSuccessStatusCode();\nconfiguration = await httpClient.GetFromJsonAsync<JsonElement>(parameters.OpcPublisher + \"/v2/configuration?IncludeNodes=true\",\n    JsonSerializerOptions.Default, cts.Token).ConfigureAwait(false);\njson = JsonSerializer.Serialize(configuration, Parameters.Indented);\nConsole.WriteLine(\"Now reset back to: \" + json);\n"
  },
  {
    "path": "samples/Http/SetConfiguration/SetConfiguration.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Http/WriteReadbackValue/WriteReadbackValue.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing System.Net.Http.Json;\n\nConsole.WriteLine(\"Press key to exit\");\nConsole.WriteLine();\nusing var cts = new CancellationTokenSource();\n_ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); });\n\nusing var parameters = await Parameters.Parse(args).ConfigureAwait(false);\n// Connect to publisher\nusing var httpClient = parameters.CreateHttpClientWithAuth();\n\n//\n// Perform a couple write and readback operations:\n//\n\nvar originalValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Original value is: \" + originalValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(33).ConfigureAwait(false);\nvar updatedValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Value updated to : \" + updatedValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(44).ConfigureAwait(false);\nupdatedValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Value updated to : \" + updatedValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(originalValue).ConfigureAwait(false);\noriginalValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Now reset back to: \" + originalValue);\n\n//\n// Helpers functions\n//\n\n// Read value of the slow number of updates configuration node\nasync ValueTask<int> ReadSlowNumberOfUpdatesValueAsync()\n{\n    using var response = await httpClient.PostAsJsonAsync(parameters.OpcPublisher + \"/v2/read\", new\n    {\n        connection = new\n        {\n            endpoint = new\n            {\n                url = parameters.OpcPlc,\n                securityMode = \"SignAndEncrypt\"\n            }\n        },\n        request = new\n        {\n            nodeId = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowNumberOfUpdates\",\n        }\n    }).ConfigureAwait(false);\n    response.EnsureSuccessStatusCode();\n    var responseJson = await response.Content.ReadFromJsonAsync<JsonElement>().ConfigureAwait(false);\n    return responseJson.GetProperty(\"value\").GetInt32();\n}\n\n// Write value to the slow number of updates configuration node\nasync ValueTask WriteSlowNumberOfUpdatesValueAsync(int value)\n{\n    using var response = await httpClient.PostAsJsonAsync(parameters.OpcPublisher + \"/v2/write\", new\n    {\n        connection = new\n        {\n            endpoint = new\n            {\n                url = parameters.OpcPlc,\n                securityMode = \"SignAndEncrypt\"\n            }\n        },\n        request = new\n        {\n            nodeId = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowNumberOfUpdates\",\n            value\n        }\n    }).ConfigureAwait(false);\n    response.EnsureSuccessStatusCode();\n}\n"
  },
  {
    "path": "samples/Http/WriteReadbackValue/WriteReadbackValue.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Http/readme.md",
    "content": "# HTTP REST Samples\n\nThis folder contains several samples that show how to interact with the OPC Publisher over HTTPS. The samples show how to read values or update configuration\nusing the HTTP REST API of OPC Publisher. To run the samples, first start OPC Publisher:\n\n```bash\ncd deploy\ncd docker\nset EdgeHubConnectionString=<iot edge connection string from Azure portal>\ndocker compose up\n```\n\nAnother option is to deploy both into IoT Edge or run them inside the simulation environment as \nexplained [here](../../docs/opc-publisher/opc-publisher.md#using-iot-edge-simulation-environment).\n\nYou also need to set both the `EdgeHubConnectionString` and the Azure IoT Hub connection string in your environment before running the samples:\n\n```bash\nset EdgeHubConnectionString=<iot edge connection string from Azure portal>\nset IoTHubConnectionString=<iot hub connection string from Azure portal>\n```\n\n> IMPORTANT: The connection strings contain secrets, ensure you clear them and don't share them outside of your environment.\n\n> Restart Visual Studio to pick up the environment variables.\n\nThe environment variables are used to access IoT Hub and pull the API key (used as bearer authentication) and the certificate used to secure the REST endpoint.\nThe certificate contains the private key. In production it should be downloaded and only the certificate itself should be made available to other applications.\n\n> Note: The Environment variables are not required to run the samples. \n> The samples will fall back to use the unsecure HTTP (port 80) endpoint of OPC Publisher.\n> However, this is not recommended for production. \n> In production scenarios the HTTP port (80) should not be exposed like it is done in the compose samples. \n"
  },
  {
    "path": "samples/IoTHub/ApproveRejected/ApproveRejected.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Globalization;\nusing System.Text.Json;\nusing CommandLine;\nusing InvokeDeviceMethod;\nusing Microsoft.Azure.Devices;\n\nParameters? parameters = null;\nvar result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// This sample accepts the service connection string as a parameter, if present.\nParameters.ValidateConnectionStrings(parameters?.IoTHubOwnerConnectionString, parameters?.EdgeHubConnectionString, out var deviceId, out var moduleId);\n\n// Create a ServiceClient to communicate with service-facing endpoint on your hub.\nusing var serviceClient = ServiceClient.CreateFromConnectionString(parameters!.IoTHubOwnerConnectionString);\n\n// List rejected certs\nvar methodInvocation = new CloudToDeviceMethod(\"ListCertificates\")\n{\n    ResponseTimeout = TimeSpan.FromSeconds(30),\n};\nmethodInvocation.SetPayloadJson(JsonSerializer.Serialize(\"Rejected\"));\nvar response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\nvar certificates = JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson()).EnumerateArray()\n    .Select(c => (Thumbprint: c.GetProperty(\"thumbprint\").GetString(), Subject: c.GetProperty(\"subject\").GetString()))\n    .ToList();\nfor (var i = 0; i < certificates.Count; i++)\n{\n    var (Thumbprint, Subject) = certificates[i];\n    Console.WriteLine($\"[{i}] {Subject} [{Thumbprint}]\");\n}\nConsole.WriteLine(\"Select index of rejected certificate to approve:\");\nvar selected = certificates[int.Parse(Console.ReadLine()!, CultureInfo.CurrentCulture)];\n\n// Approve\nmethodInvocation = new CloudToDeviceMethod(\"ApproveRejectedCertificate\")\n{\n    ResponseTimeout = TimeSpan.FromSeconds(30),\n};\nmethodInvocation.SetPayloadJson(JsonSerializer.Serialize(selected.Thumbprint));\nawait serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\n"
  },
  {
    "path": "samples/IoTHub/ApproveRejected/ApproveRejected.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/BrowseCertificates/BrowseCertificates.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing CommandLine;\nusing InvokeDeviceMethod;\nusing Microsoft.Azure.Devices;\n\nParameters? parameters = null;\nParserResult<Parameters> result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// This sample accepts the service connection string as a parameter, if present.\nParameters.ValidateConnectionStrings(parameters?.IoTHubOwnerConnectionString, parameters?.EdgeHubConnectionString, out var deviceId, out var moduleId);\n\n// Create a ServiceClient to communicate with service-facing endpoint on your hub.\nusing var serviceClient = ServiceClient.CreateFromConnectionString(parameters!.IoTHubOwnerConnectionString);\n\nforeach (var store in new[] { \"Application\", \"Trusted\", \"Rejected\", \"Issuer\", \"User\", \"UserIssuer\" })\n{\n    var methodInvocation = new CloudToDeviceMethod(\"ListCertificates\")\n    {\n        ResponseTimeout = TimeSpan.FromSeconds(30),\n    };\n    // Get the application certificate and write to stdout\n    methodInvocation.SetPayloadJson(JsonSerializer.Serialize(store));\n\n    var response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\n    Console.WriteLine($\"Certificates in {store} store:\");\n    Console.WriteLine(\"==============================\");\n    var certificates = JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson()).EnumerateArray().ToList();\n    for (var i = 0; i < certificates.Count; i++)\n    {\n        var certificate = certificates[i];\n        var thumbprint = certificate.GetProperty(\"thumbprint\").GetString();\n        var subject = certificate.GetProperty(\"subject\").GetString();\n        var notAfterUtc = certificate.GetProperty(\"notAfterUtc\").GetDateTime();\n        var notBeforeUtc = certificate.GetProperty(\"notBeforeUtc\").GetDateTime();\n        var serialNumber = certificate.GetProperty(\"serialNumber\").GetString();\n        var selfSigned = certificate.GetProperty(\"selfSigned\").GetBoolean();\n        Console.WriteLine($\"[{thumbprint}] {subject} [SN:{serialNumber}] [Valid: {notBeforeUtc}-{notAfterUtc}] {(selfSigned ? \"(Self-signed)\" : \"\")}\");\n    }\n    Console.WriteLine(\"==============================\");\n}\n\n"
  },
  {
    "path": "samples/IoTHub/BrowseCertificates/BrowseCertificates.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/GetCertificate/GetApplicationCert.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing CommandLine;\nusing InvokeDeviceMethod;\nusing Microsoft.Azure.Devices;\n\nParameters? parameters = null;\nParserResult<Parameters> result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// This sample accepts the service connection string as a parameter, if present.\nParameters.ValidateConnectionStrings(parameters?.IoTHubOwnerConnectionString, parameters?.EdgeHubConnectionString, out var deviceId, out var moduleId);\n\n// Create a ServiceClient to communicate with service-facing endpoint on your hub.\nusing var serviceClient = ServiceClient.CreateFromConnectionString(parameters!.IoTHubOwnerConnectionString);\n\n// Get the application certificate and write to stdout\nvar methodInvocation = new CloudToDeviceMethod(\"ListCertificates\")\n{\n    ResponseTimeout = TimeSpan.FromSeconds(30),\n};\nmethodInvocation.SetPayloadJson(JsonSerializer.Serialize(\"Application\"));\nvar response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\nvar certificate = JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson()).EnumerateArray().FirstOrDefault();\nif (certificate.ValueKind != JsonValueKind.Null)\n{\n    var pfx = certificate.GetProperty(\"pfx\").GetBytesFromBase64();\n    using (var stream = Console.OpenStandardOutput(pfx.Length))\n    {\n        stream.Write(pfx);\n    }\n}\n"
  },
  {
    "path": "samples/IoTHub/GetCertificate/GetApplicationCert.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/GetConfiguration/GetConfiguration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing CommandLine;\nusing InvokeDeviceMethod;\nusing Microsoft.Azure.Devices;\n\nParameters? parameters = null;\nParserResult<Parameters> result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// This sample accepts the service connection string as a parameter, if present.\nParameters.ValidateConnectionStrings(parameters?.IoTHubOwnerConnectionString, parameters?.EdgeHubConnectionString, out var deviceId, out var moduleId);\n\n// Create a ServiceClient to communicate with service-facing endpoint on your hub.\nusing var serviceClient = ServiceClient.CreateFromConnectionString(parameters!.IoTHubOwnerConnectionString);\n\n// Get configured endpoints and then the nodes for each one of it\nvar methodInvocation = new CloudToDeviceMethod(\"GetConfiguredEndpoints\")\n{\n    ResponseTimeout = TimeSpan.FromSeconds(30),\n};\nvar response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\n\nvar endpoints = JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson()).GetProperty(\"endpoints\").EnumerateArray();\nforeach (var endpoint in endpoints)\n{\n    var endpointJson = JsonSerializer.Serialize(endpoint, Parameters.Indented);\n    Console.WriteLine(endpointJson);\n    methodInvocation = new CloudToDeviceMethod(\"GetConfiguredNodesOnEndpoint\")\n    {\n        ResponseTimeout = TimeSpan.FromSeconds(30),\n    };\n    methodInvocation.SetPayloadJson(endpointJson);\n    response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId,\n        methodInvocation).ConfigureAwait(false);\n\n    // Response is too large, this will generate 413 when run against OPC PLC.\n\n    var nodesJson = JsonSerializer.Serialize(JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson()),\n        Parameters.Indented);\n    Console.WriteLine(nodesJson);\n}\n"
  },
  {
    "path": "samples/IoTHub/GetConfiguration/GetConfiguration.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/IoTHubSamples.slnx",
    "content": "<Solution>\n  <Project Path=\"ApproveRejected/ApproveRejected.csproj\" />\n  <Project Path=\"BrowseCertificates/BrowseCertificates.csproj\" />\n  <Project Path=\"GetCertificate/GetApplicationCert.csproj\" />\n  <Project Path=\"GetConfiguration/GetConfiguration.csproj\" />\n  <Project Path=\"ManageWriter/ManageWriter.csproj\" />\n  <Project Path=\"MonitorMessages/MonitorMessages.csproj\" />\n  <Project Path=\"ReadCurrentTime/ReadCurrentTime.csproj\" />\n  <Project Path=\"ResetClients/GetAndResetConnections.csproj\" />\n  <Project Path=\"WriteReadbackValue/WriteReadbackValue.csproj\" />\n</Solution>\n"
  },
  {
    "path": "samples/IoTHub/ManageWriter/ManageWriter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing CommandLine;\nusing InvokeDeviceMethod;\nusing Microsoft.Azure.Devices;\n\nParameters? parameters = null;\nParserResult<Parameters> result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// This sample accepts the service connection string as a parameter, if present.\nParameters.ValidateConnectionStrings(parameters?.IoTHubOwnerConnectionString, parameters?.EdgeHubConnectionString, out var deviceId, out var moduleId);\n\n// Create a ServiceClient to communicate with service-facing endpoint on your hub.\nusing var serviceClient = ServiceClient.CreateFromConnectionString(parameters!.IoTHubOwnerConnectionString);\n\n// Create a writer\nvar methodInvocation = new CloudToDeviceMethod(\"CreateOrUpdateDataSetWriterEntry\")\n{\n    ResponseTimeout = TimeSpan.FromSeconds(30),\n};\nmethodInvocation.SetPayloadJson(JsonSerializer.Serialize(new\n{\n    endpointUrl = \"opc.tcp://opcplc:50000\",\n    securityMode = \"SignAndEncrypt\",\n    dataSetWriterId = \"MyWriterId\",\n    dataSetWriterGroup = \"MyWriterGroup\",\n    dataSetPublishingInterval = 2000,\n    OpcNodes = new[]\n    {\n        new\n        {\n            id = \"i=2258\",\n            dataSetFieldId = \"Time0\",\n            opcSamplingInterval = 1000\n        },\n    }\n}));\nawait serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\n\n// Update the writer and add additional nodes\nfor (var i = 0; i < 10; i++)\n{\n    methodInvocation = new CloudToDeviceMethod(\"AddOrUpdateNodes\")\n    {\n        ResponseTimeout = TimeSpan.FromSeconds(30),\n    };\n    methodInvocation.SetPayloadJson(JsonSerializer.Serialize(new\n    {\n        dataSetWriterId = \"MyWriterId\",\n        dataSetWriterGroup = \"MyWriterGroup\",\n        opcNodes = new[]\n        {\n            new\n            {\n                id = \"i=2258\",\n                dataSetFieldId = \"Time\" + i,\n                opcSamplingInterval = 1000\n            }\n        }\n    }));\n    await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId,\n        methodInvocation).ConfigureAwait(false);\n}\n\n// Show the nodes in the writer\nmethodInvocation = new CloudToDeviceMethod(\"GetNodes\")\n{\n    ResponseTimeout = TimeSpan.FromSeconds(30),\n};\nmethodInvocation.SetPayloadJson(JsonSerializer.Serialize(new\n{\n    dataSetWriterId = \"MyWriterId\",\n    dataSetWriterGroup = \"MyWriterGroup\"\n}));\nvar response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\n\nvar nodesJson = JsonSerializer.Serialize(JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson()),\n    Parameters.Indented);\nConsole.WriteLine(nodesJson);\n"
  },
  {
    "path": "samples/IoTHub/ManageWriter/ManageWriter.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/MonitorMessages/MonitorMessages.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text;\nusing Azure.Messaging.EventHubs.Consumer;\nusing CommandLine;\n\nParameters? parameters = null;\n// Parse application parameters\nvar result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// Either the connection string must be supplied, or the set of endpoint, name, and shared access key must be.\nif (string.IsNullOrWhiteSpace(parameters?.EventHubConnectionString)\n    && (string.IsNullOrWhiteSpace(parameters?.EventHubCompatibleEndpoint)\n        || string.IsNullOrWhiteSpace(parameters.EventHubName)\n        || string.IsNullOrWhiteSpace(parameters.SharedAccessKey)))\n{\n    Console.WriteLine(CommandLine.Text.HelpText.AutoBuild(result, null, null));\n    Environment.Exit(1);\n}\n\nConsole.WriteLine(\"Read all messages from IoT Hub. Ctrl-C to exit.\\n\");\n\n// Set up a way for the user to gracefully shutdown\nusing var cts = new CancellationTokenSource();\nConsole.CancelKeyPress += (sender, eventArgs) =>\n{\n    eventArgs.Cancel = true;\n    cts.Cancel();\n    Console.WriteLine(\"Exiting...\");\n};\n\nawait ReceiveMessagesFromDeviceAsync(parameters, cts.Token).ConfigureAwait(false);\n\n// Asynchronously create a PartitionReceiver for a partition and then start\n// reading any messages sent from the simulated client.\nstatic async Task ReceiveMessagesFromDeviceAsync(Parameters parameters, CancellationToken ct)\n{\n    var connectionString = parameters.GetEventHubConnectionString();\n\n    // Create the consumer using the default consumer group using a direct connection to the service.\n    // Information on using the client with a proxy can be found in the README for this quick start, here:\n    // https://github.com/Azure-Samples/azure-iot-samples-csharp/tree/main/iot-hub/Quickstarts/ReadD2cMessages/README.md#websocket-and-proxy-support\n    var consumer = new EventHubConsumerClient(\n            EventHubConsumerClient.DefaultConsumerGroupName,\n            connectionString,\n            parameters.EventHubName);\n    await using (consumer.ConfigureAwait(false))\n    {\n        Console.WriteLine(\"Listening for messages on all partitions.\");\n        try\n        {\n            // Begin reading events for all partitions, starting with the first event in each partition and waiting indefinitely for\n            // events to become available. Reading can be canceled by breaking out of the loop when an event is processed or by\n            // signaling the cancellation token.\n            //\n            // The \"ReadEventsAsync\" method on the consumer is a good starting point for consuming events for prototypes\n            // and samples. For real-world production scenarios, it is strongly recommended that you consider using the\n            // \"EventProcessorClient\" from the \"Azure.Messaging.EventHubs.Processor\" package.\n            //\n            // More information on the \"EventProcessorClient\" and its benefits can be found here:\n            //   https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/eventhub/Azure.Messaging.EventHubs.Processor/README.md\n            await foreach (PartitionEvent partitionEvent in consumer.ReadEventsAsync(ct).ConfigureAwait(false))\n            {\n                Console.WriteLine($\"\\nMessage received on partition {partitionEvent.Partition.PartitionId}:\");\n\n                var data = Encoding.UTF8.GetString(partitionEvent.Data.Body.ToArray());\n                Console.WriteLine($\"\\tMessage body: {data}\");\n\n                Console.WriteLine(\"\\tApplication properties (set by device):\");\n                foreach (var prop in partitionEvent.Data.Properties)\n                {\n                    PrintProperties(prop);\n                }\n\n                Console.WriteLine(\"\\tSystem properties (set by IoT hub):\");\n                foreach (var prop in partitionEvent.Data.SystemProperties)\n                {\n                    PrintProperties(prop);\n                }\n            }\n        }\n        catch (TaskCanceledException)\n        {\n            // This is expected when the token is signaled; it should not be considered an\n            // error in this scenario.\n        }\n    }\n}\n\nstatic void PrintProperties(KeyValuePair<string, object> prop)\n{\n    var propValue = prop.Value is DateTime time\n        ? time.ToString(\"O\") // using a built-in date format here that includes milliseconds\n        : prop.Value.ToString();\n    Console.WriteLine($\"\\t\\t{prop.Key}: {propValue}\");\n}\n\n/// <summary>\n/// Parameters for the application.\n/// </summary>\ninternal sealed class Parameters\n{\n    [Option(\n        'e',\n        \"EventHubCompatibleEndpoint\",\n        HelpText = \"The event hub-compatible endpoint from your IoT hub instance. Use `az iot hub show --query properties.eventHubEndpoints.events.endpoint --name {your IoT hub name}` to fetch via the Azure CLI.\")]\n    public string? EventHubCompatibleEndpoint { get; set; }\n\n    [Option(\n        'n',\n        \"EventHubName\",\n        HelpText = \"The event hub-compatible name of your IoT hub instance. Use `az iot hub show --query properties.eventHubEndpoints.events.path --name {your IoT hub name}` to fetch via the Azure CLI.\")]\n    public string? EventHubName { get; set; }\n\n    [Option(\n        's',\n        \"SharedAccessKey\",\n        HelpText = \"A primary or shared access key from your IoT hub instance, with the 'service' permission. Use `az iot hub policy show --name service --query primaryKey --hub-name {your IoT hub name}` to fetch via the Azure CLI.\")]\n    public string? SharedAccessKey { get; set; }\n\n    [Option(\n        'c',\n        \"EventHubConnectionString\",\n        HelpText = \"The connection string to the event hub-compatible endpoint. Use the Azure portal to get this parameter. If this value is provided, all the others are not necessary.\")]\n    public string? EventHubConnectionString { get; set; }\n\n    internal string GetEventHubConnectionString()\n    {\n        const string iotHubSharedAccessKeyName = \"service\";\n        return EventHubConnectionString ?? $\"Endpoint={EventHubCompatibleEndpoint};SharedAccessKeyName={iotHubSharedAccessKeyName};SharedAccessKey={SharedAccessKey}\";\n    }\n}\n"
  },
  {
    "path": "samples/IoTHub/MonitorMessages/MonitorMessages.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Azure.Messaging.EventHubs\" Version=\"5.11.6\" />\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/Parameters.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace InvokeDeviceMethod;\n\nusing CommandLine;\nusing Microsoft.Azure.Devices;\nusing System.Text.Json;\n\n/// <summary>\n/// Command line parameters\n/// </summary>\ninternal sealed class Parameters\n{\n    [Option(\n        'c',\n        \"IoTHubOwnerConnectionString\",\n        Required = false,\n        HelpText = \"The IoT hub connection string. This is available under the 'Shared access policies' in the Azure portal.\" +\n        \"\\nDefaults to value of environment variable 'IoTHubOwnerConnectionString'.\")]\n    public string? IoTHubOwnerConnectionString { get; set; } = Environment.GetEnvironmentVariable(\"IoTHubOwnerConnectionString\");\n\n    [Option(\n        'e',\n        \"EdgeHubConnectionString\",\n        Required = false,\n        HelpText = \"The edge hub connection string that OPC Publisher is using mainly for the module and device id values.\" +\n        \"\\nDefaults to value of environment variable 'EdgeHubConnectionString'.\")]\n    public string? EdgeHubConnectionString { get; set; } = Environment.GetEnvironmentVariable(\"EdgeHubConnectionString\");\n\n    internal static readonly JsonSerializerOptions Indented = new() { WriteIndented = true };\n\n    public static void ValidateConnectionStrings(string? hubConnectionString, string? edgeConnectionString,\n        out string deviceId, out string moduleId)\n    {\n        deviceId = string.Empty;\n        moduleId = string.Empty;\n\n        try\n        {\n            _ = IotHubConnectionStringBuilder.Create(hubConnectionString);\n        }\n        catch (Exception)\n        {\n            Console.WriteLine(\"An IoT hub connection string needs to be specified, \" +\n                \"please set the environment variable \\\"IoTHubOwnerConnectionString\\\" \" +\n                \"or pass in \\\"-c | --IoTHubOwnerConnectionString\\\" through command line.\");\n            Environment.Exit(1);\n        }\n        try\n        {\n            var ehc = IotHubConnectionStringBuilder.Create(edgeConnectionString);\n            deviceId = ehc.DeviceId;\n            moduleId = ehc.ModuleId;\n        }\n        catch (Exception)\n        {\n            Console.WriteLine(\"An Edge hub connection string needs to be specified, \" +\n                \"please set the environment variable \\\"EdgeHubConnectionString\\\" \" +\n                \"or pass in \\\"-e | --EdgeHubConnectionString\\\" through command line.\");\n            Environment.Exit(1);\n        }\n    }\n}\n"
  },
  {
    "path": "samples/IoTHub/ReadCurrentTime/ReadCurrentTime.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing CommandLine;\nusing InvokeDeviceMethod;\nusing Microsoft.Azure.Devices;\n\nParameters? parameters = null;\nParserResult<Parameters> result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// This sample accepts the service connection string as a parameter, if present.\nParameters.ValidateConnectionStrings(parameters?.IoTHubOwnerConnectionString, parameters?.EdgeHubConnectionString,\n    out var deviceId, out var moduleId);\n\n// Create a ServiceClient to communicate with service-facing endpoint on your hub.\nusing var serviceClient = ServiceClient.CreateFromConnectionString(parameters!.IoTHubOwnerConnectionString);\n\nwhile (true)\n{\n    var methodInvocation = new CloudToDeviceMethod(\"ValueRead_V2\")\n    {\n        ResponseTimeout = TimeSpan.FromSeconds(30),\n    };\n\n    methodInvocation.SetPayloadJson(JsonSerializer.Serialize(new\n    {\n        connection = new\n        {\n            endpoint = new\n            {\n                url = \"opc.tcp://opcplc:50000\",\n                securityMode = \"SignAndEncrypt\"\n            }\n        },\n        request = new\n        {\n            nodeId = \"i=2258\"\n        }\n    }));\n\n    var response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\n    var resopnseJson = JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson());\n    Console.WriteLine(\"Current time on server:\" + resopnseJson.GetProperty(\"value\").GetString());\n}\n"
  },
  {
    "path": "samples/IoTHub/ReadCurrentTime/ReadCurrentTime.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/ResetClients/GetAndResetConnections.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing CommandLine;\nusing InvokeDeviceMethod;\nusing Microsoft.Azure.Devices;\nusing System.Net;\nusing System.Text.Json;\n\nParameters? parameters = null;\nParserResult<Parameters> result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// This sample accepts the service connection string as a parameter, if present.\nParameters.ValidateConnectionStrings(parameters?.IoTHubOwnerConnectionString, parameters?.EdgeHubConnectionString,\n    out var deviceId, out var moduleId);\n\n// Create a ServiceClient to communicate with service-facing endpoint on your hub.\nusing var serviceClient = ServiceClient.CreateFromConnectionString(parameters!.IoTHubOwnerConnectionString);\n\nConsole.WriteLine(\"Active connections:\");\nvar methodInvocation = new CloudToDeviceMethod(\"GetActiveConnections_V2\")\n{\n    ResponseTimeout = TimeSpan.FromSeconds(30),\n};\nvar response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId,\n    methodInvocation).ConfigureAwait(false);\nvar connections = JsonSerializer.Serialize(JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson()), Parameters.Indented);\nConsole.WriteLine(connections);\n\nConsole.WriteLine(\"Resetting all connections...\");\nmethodInvocation = new CloudToDeviceMethod(\"ResetAllConnections_V2\")\n{\n    ResponseTimeout = TimeSpan.FromSeconds(30),\n};\nresponse = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId,\n    methodInvocation).ConfigureAwait(false);\nConsole.WriteLine(response.Status);\n"
  },
  {
    "path": "samples/IoTHub/ResetClients/GetAndResetConnections.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/WriteReadbackValue/WriteReadbackValue.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Text.Json;\nusing CommandLine;\nusing InvokeDeviceMethod;\nusing Microsoft.Azure.Devices;\n\nParameters? parameters = null;\nParserResult<Parameters> result = Parser.Default.ParseArguments<Parameters>(args)\n    .WithParsed(parsedParams => parameters = parsedParams)\n    .WithNotParsed(errors => Environment.Exit(1));\n\n// This sample accepts the service connection string as a parameter, if present.\nParameters.ValidateConnectionStrings(parameters?.IoTHubOwnerConnectionString, parameters?.EdgeHubConnectionString,\n    out var deviceId, out var moduleId);\n\n// Create a ServiceClient to communicate with service-facing endpoint on your hub.\nusing var serviceClient = ServiceClient.CreateFromConnectionString(parameters!.IoTHubOwnerConnectionString);\n\n//\n// Perform a couple write and readback operations:\n//\n\nvar originalValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Original value is: \" + originalValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(33).ConfigureAwait(false);\nvar updatedValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Value updated to : \" + updatedValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(44).ConfigureAwait(false);\nupdatedValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Value updated to : \" + updatedValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(originalValue).ConfigureAwait(false);\noriginalValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Now reset back to: \" + originalValue);\n\n//\n// Helpers functions\n//\n\n// Read value of the slow number of updates configuration node\nasync ValueTask<int> ReadSlowNumberOfUpdatesValueAsync()\n{\n    var methodInvocation = new CloudToDeviceMethod(\"ValueRead\")\n    {\n        ResponseTimeout = TimeSpan.FromSeconds(30),\n    };\n    methodInvocation.SetPayloadJson(JsonSerializer.Serialize(new\n    {\n        connection = new\n        {\n            endpoint = new\n            {\n                url = \"opc.tcp://opcplc:50000\",\n                securityMode = \"SignAndEncrypt\"\n            }\n        },\n        request = new\n        {\n            nodeId = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowNumberOfUpdates\"\n        }\n    }));\n    var response = await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId,\n        methodInvocation).ConfigureAwait(false);\n    var resopnseJson = JsonSerializer.Deserialize<JsonElement>(response.GetPayloadAsJson());\n    return resopnseJson.GetProperty(\"value\").GetInt32();\n}\n\n// Write value to the slow number of updates configuration node\nasync ValueTask WriteSlowNumberOfUpdatesValueAsync(int value)\n{\n    var methodInvocation = new CloudToDeviceMethod(\"ValueWrite\")\n    {\n        ResponseTimeout = TimeSpan.FromSeconds(30),\n    };\n    methodInvocation.SetPayloadJson(JsonSerializer.Serialize(new\n    {\n        connection = new\n        {\n            endpoint = new\n            {\n                url = \"opc.tcp://opcplc:50000\",\n                securityMode = \"SignAndEncrypt\"\n            }\n        },\n        request = new\n        {\n            nodeId = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowNumberOfUpdates\",\n            value\n        }\n    }));\n    await serviceClient.InvokeDeviceMethodAsync(deviceId, moduleId, methodInvocation).ConfigureAwait(false);\n}\n"
  },
  {
    "path": "samples/IoTHub/WriteReadbackValue/WriteReadbackValue.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Parameters.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/IoTHub/readme.md",
    "content": "# Azure IoT Hub Samples\n\nThis folder contains several samples that show how to interact with the OPC Publisher through Azure IoT Hub service and show for example how to \nread or write values. To run the samples, first start OPC Publisher and OPC PLC simulation server:\n\n```bash\ncd deploy\ncd docker\nset EdgeHubConnectionString=<iot edge connection string from Azure portal>\ndocker compose up\n```\n\nAnother option is to deploy both into IoT Edge or run them inside the simulation environment as \nexplained [here](../../docs/opc-publisher/opc-publisher.md#using-iot-edge-simulation-environment).\n\nYou also need to set both the `EdgeHubConnectionString` and the Azure IoT Hub connection string in your environment before running the samples:\n\n```bash\nset EdgeHubConnectionString=<iot edge connection string from Azure portal>\nset IoTHubConnectionString=<iot hub connection string from Azure portal>\n ```\n\n> Restart Visual Studio to pick up the environment variables.\n\n> IMPORTANT: The connection strings contain secrets, ensure you clear them and don't share them outside of your environment."
  },
  {
    "path": "samples/Mqtt/GetConfiguration/GetConfiguration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing MQTTnet.Protocol;\nusing MQTTnet.Formatter;\nusing MQTTnet;\nusing MQTTnet.Extensions.Rpc;\nusing System.Text.Json;\nusing System.Text;\n\n// Connect to mqtt broker\nvar mqttFactory = new MqttClientFactory();\nusing var mqttClient = mqttFactory.CreateMqttClient();\nvar mqttClientOptions = new MqttClientOptionsBuilder()\n    .WithProtocolVersion(MqttProtocolVersion.V500) // Important!!\n    .WithTcpServer(\"localhost\", 1883)\n    .Build();\nawait mqttClient.ConnectAsync(mqttClientOptions).ConfigureAwait(false);\nusing var mqttRpcClient = mqttFactory.CreateMqttRpcClient(mqttClient,\n    new MqttRpcClientOptionsBuilder().WithTopicGenerationStrategy(new PublisherTopicGenerationStrategy()).Build());\n\nvar response = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"GetConfiguredEndpoints\",\n    default, MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\ntry\n{\n    var endpoints = JsonSerializer.Deserialize<JsonElement>(response).GetProperty(\"endpoints\").EnumerateArray();\n    var indented = new JsonSerializerOptions { WriteIndented = true };\n    foreach (var endpoint in endpoints)\n    {\n        var endpointJson = JsonSerializer.Serialize(endpoint, indented);\n        Console.WriteLine(endpointJson);\n        response = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"GetConfiguredNodesOnEndpoint\",\n            endpointJson, MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\n        var nodesJson = JsonSerializer.Serialize(JsonSerializer.Deserialize<JsonElement>(response), indented);\n        Console.WriteLine(nodesJson);\n    }\n}\ncatch\n{\n    var error = Encoding.UTF8.GetString(response);\n    Console.WriteLine(error);\n}\n\npublic sealed class PublisherTopicGenerationStrategy : IMqttRpcClientTopicGenerationStrategy\n{\n    // Both are configured in with-mosquitto.yaml\n    const string PublisherId = \"Microsoft\";\n    public MqttRpcTopicPair CreateRpcTopics(TopicGenerationContext context)\n    {\n        // THe default method topic root is\n        var methodTopicRoot = $\"{PublisherId}/methods\";\n        return new MqttRpcTopicPair\n        {\n            RequestTopic = $\"{methodTopicRoot}/{context.MethodName}\",\n            ResponseTopic = $\"{methodTopicRoot}/{context.MethodName}/response\"\n        };\n    }\n}\n"
  },
  {
    "path": "samples/Mqtt/GetConfiguration/GetConfiguration.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"MQTTnet.Extensions.Rpc\" Version=\"5.0.1.1416\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Mqtt/ManageWriter/ManageWriter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing MQTTnet.Protocol;\nusing MQTTnet.Formatter;\nusing MQTTnet;\nusing MQTTnet.Extensions.Rpc;\nusing System.Text.Json;\nusing System.Text;\n\n// Connect to mqtt broker\nvar mqttFactory = new MqttClientFactory();\nusing var mqttClient = mqttFactory.CreateMqttClient();\nvar mqttClientOptions = new MqttClientOptionsBuilder()\n    .WithProtocolVersion(MqttProtocolVersion.V500) // Important!!\n    .WithTcpServer(\"localhost\", 1883)\n    .Build();\nawait mqttClient.ConnectAsync(mqttClientOptions).ConfigureAwait(false);\nusing var mqttRpcClient = mqttFactory.CreateMqttRpcClient(mqttClient,\n    new MqttRpcClientOptionsBuilder().WithTopicGenerationStrategy(new PublisherTopicGenerationStrategy()).Build());\n\n// Delete old writers\nvar response = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"RemoveDataSetWriterEntry\",\n    JsonSerializer.Serialize(new\n    {\n        dataSetWriterId = \"MyWriterId\",\n        dataSetWriterGroup = \"MyWriterGroup\"\n    }), MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\n\nif (response.Length > 1)\n{\n    var error = Encoding.UTF8.GetString(response);\n    Console.WriteLine(error);\n}\n\n// For payload see PublishedNodesEntryModel format\nresponse = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"CreateOrUpdateDataSetWriterEntry\",\n    JsonSerializer.Serialize(new\n    {\n        endpointUrl = \"opc.tcp://opcplc:50000\",\n        endpointSecurityMode = \"SignAndEncrypt\",\n        dataSetWriterId = \"MyWriterId\",\n        dataSetWriterGroup = \"MyWriterGroup\",\n        dataSetPublishingInterval = 2000,\n        opcNodes = new[]\n        {\n            new\n            {\n                id = \"i=2258\",\n                dataSetFieldId = \"Time0\",\n                opcSamplingInterval = 1000\n            },\n        }\n    }), MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\nif (response.Length > 1)\n{\n    var error = Encoding.UTF8.GetString(response);\n    Console.WriteLine(error);\n}\n// Update the writer and add additional nodes\nfor (var i = 0; i < 10; i++)\n{\n    response = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"AddOrUpdateNodes\",\n        JsonSerializer.Serialize(new\n        {\n            dataSetWriterId = \"MyWriterId\",\n            dataSetWriterGroup = \"MyWriterGroup\",\n            opcNodes = new[]\n            {\n                new\n                {\n                    id = \"i=2258\",\n                    dataSetFieldId = \"Time\" + i,\n                    opcSamplingInterval = 1000\n                }\n            }\n        }), MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\n    if (response.Length > 1)\n    {\n        var error = Encoding.UTF8.GetString(response);\n        Console.WriteLine(error);\n    }\n}\n\n// Show the nodes in the writer\nresponse = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"GetNodes\",\n    JsonSerializer.Serialize(new\n    {\n        dataSetWriterGroup = \"MyWriterGroup\",\n        dataSetWriterId = \"MyWriterId\"\n    }), MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\n\ntry\n{\n    var indented = new JsonSerializerOptions { WriteIndented = true };\n    var nodesJson = JsonSerializer.Serialize(JsonSerializer.Deserialize<JsonElement>(response), indented);\n    Console.WriteLine(nodesJson);\n}\ncatch\n{\n    var error = Encoding.UTF8.GetString(response);\n    Console.WriteLine(error);\n}\n\npublic sealed class PublisherTopicGenerationStrategy : IMqttRpcClientTopicGenerationStrategy\n{\n    // Both are configured in with-mosquitto.yaml\n    const string PublisherId = \"Microsoft\";\n    public MqttRpcTopicPair CreateRpcTopics(TopicGenerationContext context)\n    {\n        // THe default method topic root is\n        var methodTopicRoot = $\"{PublisherId}/methods\";\n        return new MqttRpcTopicPair\n        {\n            RequestTopic = $\"{methodTopicRoot}/{context.MethodName}\",\n            ResponseTopic = $\"{methodTopicRoot}/{context.MethodName}/response\"\n        };\n    }\n}\n"
  },
  {
    "path": "samples/Mqtt/ManageWriter/ManageWriter.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"MQTTnet.Extensions.Rpc\" Version=\"5.0.1.1416\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Mqtt/MonitorMessages/MonitorMessages.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing MQTTnet.Formatter;\nusing MQTTnet;\nusing System.Text.Json;\nusing System.Buffers;\n\n// Connect to mqtt broker\nvar mqttFactory = new MqttClientFactory();\nusing var mqttClient = mqttFactory.CreateMqttClient();\nvar mqttClientOptions = new MqttClientOptionsBuilder()\n    .WithProtocolVersion(MqttProtocolVersion.V500) // Important!!\n    .WithTcpServer(\"localhost\", 1883)\n    .Build();\nawait mqttClient.ConnectAsync(mqttClientOptions).ConfigureAwait(false);\nvar indented = new JsonSerializerOptions() { WriteIndented = true };\nmqttClient.ApplicationMessageReceivedAsync += args =>\n{\n    var reader = new Utf8JsonReader(args.ApplicationMessage.Payload);\n    var json = JsonSerializer.Serialize(JsonSerializer.Deserialize<JsonElement>(ref reader), indented);\n    Console.WriteLine($\"{args.ApplicationMessage.Topic}:{json}\");\n    return Task.CompletedTask;\n};\nConsole.WriteLine(\"Press key to exit\");\nConsole.WriteLine();\nconst string PublisherId = \"Microsoft\";\nawait mqttClient.SubscribeAsync(new MqttClientSubscribeOptionsBuilder()\n    .WithTopicFilter(new MqttTopicFilterBuilder()\n        .WithTopic($\"{PublisherId}/#\")\n        .Build())\n    .Build()).ConfigureAwait(false);\nConsole.ReadKey();\n"
  },
  {
    "path": "samples/Mqtt/MonitorMessages/MonitorMessages.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"MQTTnet.Extensions.Rpc\" Version=\"5.0.1.1416\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Mqtt/MqttSamples.slnx",
    "content": "<Solution>\n  <Project Path=\"GetConfiguration/GetConfiguration.csproj\" />\n  <Project Path=\"ManageWriter/ManageWriter.csproj\" />\n  <Project Path=\"MonitorMessages/MonitorMessages.csproj\" />\n  <Project Path=\"ReadAttributes/ReadAttributes.csproj\" />\n  <Project Path=\"ReadCurrentTime/ReadCurrentTime.csproj\" />\n  <Project Path=\"WriteReadbackValue/WriteReadbackValue.csproj\" />\n</Solution>\n"
  },
  {
    "path": "samples/Mqtt/ReadAttributes/ReadAttributes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing MQTTnet.Protocol;\nusing MQTTnet.Formatter;\nusing MQTTnet;\nusing MQTTnet.Extensions.Rpc;\nusing System.Text.Json;\nusing System.Text;\n\n// Connect to mqtt broker\nvar mqttFactory = new MqttClientFactory();\nusing var mqttClient = mqttFactory.CreateMqttClient();\nvar mqttClientOptions = new MqttClientOptionsBuilder()\n    .WithProtocolVersion(MqttProtocolVersion.V500) // Important!!\n    .WithTcpServer(\"localhost\", 1883)\n    .Build();\nawait mqttClient.ConnectAsync(mqttClientOptions).ConfigureAwait(false);\nusing var mqttRpcClient = mqttFactory.CreateMqttRpcClient(mqttClient,\n    new MqttRpcClientOptionsBuilder().WithTopicGenerationStrategy(new PublisherTopicGenerationStrategy()).Build());\n\nwhile (true)\n{\n    // Read attributes from server - see NodeRead api in api.md\n    var response = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"NodeRead_V2\",\n        JsonSerializer.SerializeToUtf8Bytes(new\n        {\n            connection = new\n            {\n                endpoint = new\n                {\n                    url = \"opc.tcp://opcplc:50000\",\n                    securityMode = 2,\n                    securityPolicy = \"http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256\"\n                }\n            },\n            request = new\n            {\n                attributes = new[]\n                {\n                    new\n                    {\n                        nodeId = \"i=2258\",\n                        attribute = 3\n                    },\n                    new\n                    {\n                        nodeId = \"i=2258\",\n                        attribute = 4\n                    },\n                    new\n                    {\n                        nodeId = \"i=2258\",\n                        attribute = 5\n                    },\n                    new\n                    {\n                        nodeId = \"i=2258\",\n                        attribute = 13\n                    },\n                    new\n                    {\n                        nodeId = \"i=2258\",\n                        attribute = 14\n                    },\n                    new\n                    {\n                        nodeId = \"i=2258\",\n                        attribute = 15\n                    }\n                }\n            }\n        }), MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\n\n    try\n    {\n        var resopnseJson = JsonSerializer.Deserialize<JsonElement>(response);\n        Console.WriteLine();\n        foreach (var item in resopnseJson.GetProperty(\"results\").EnumerateArray())\n        {\n            Console.WriteLine(item.GetProperty(\"value\").ToString());\n        }\n    }\n    catch\n    {\n        Console.WriteLine(Encoding.UTF8.GetString(response));\n    }\n}\n\npublic sealed class PublisherTopicGenerationStrategy : IMqttRpcClientTopicGenerationStrategy\n{\n    // Both are configured in with-mosquitto.yaml\n    const string PublisherId = \"Microsoft\";\n    public MqttRpcTopicPair CreateRpcTopics(TopicGenerationContext context)\n    {\n        // THe default method topic root is\n        var methodTopicRoot = $\"{PublisherId}/methods\";\n        return new MqttRpcTopicPair\n        {\n            RequestTopic = $\"{methodTopicRoot}/{context.MethodName}\",\n            ResponseTopic = $\"{methodTopicRoot}/{context.MethodName}/response\"\n        };\n    }\n}\n"
  },
  {
    "path": "samples/Mqtt/ReadAttributes/ReadAttributes.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"MQTTnet.Extensions.Rpc\" Version=\"5.0.1.1416\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Mqtt/ReadCurrentTime/ReadCurrentTime.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing MQTTnet.Protocol;\nusing MQTTnet.Formatter;\nusing MQTTnet;\nusing MQTTnet.Extensions.Rpc;\nusing System.Text.Json;\n\n// Connect to mqtt broker\nvar mqttFactory = new MqttClientFactory();\nusing var mqttClient = mqttFactory.CreateMqttClient();\nvar mqttClientOptions = new MqttClientOptionsBuilder()\n    .WithProtocolVersion(MqttProtocolVersion.V500) // Important!!\n    .WithTcpServer(\"localhost\", 1883)\n    .Build();\nawait mqttClient.ConnectAsync(mqttClientOptions).ConfigureAwait(false);\nusing var mqttRpcClient = mqttFactory.CreateMqttRpcClient(mqttClient,\n    new MqttRpcClientOptionsBuilder().WithTopicGenerationStrategy(new PublisherTopicGenerationStrategy()).Build());\n\nwhile (true)\n{\n    // Read current time from server - see ValueRead api in api.md\n    var response = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"ValueRead_V2\",\n        JsonSerializer.SerializeToUtf8Bytes(new\n        {\n            connection = new\n            {\n                endpoint = new\n                {\n                    url = \"opc.tcp://opcplc:50000\",\n                    securityMode = \"SignAndEncrypt\"\n                }\n            },\n            request = new\n            {\n                nodeId = \"i=2258\"\n            }\n        }), MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\n\n    var resopnseJson = JsonSerializer.Deserialize<JsonElement>(response);\n    Console.WriteLine(\"Current time on server:\" + resopnseJson.GetProperty(\"value\").GetString());\n}\n\npublic sealed class PublisherTopicGenerationStrategy : IMqttRpcClientTopicGenerationStrategy\n{\n    // Both are configured in with-mosquitto.yaml\n    const string PublisherId = \"Microsoft\";\n    public MqttRpcTopicPair CreateRpcTopics(TopicGenerationContext context)\n    {\n        // THe default method topic root is\n        var methodTopicRoot = $\"{PublisherId}/methods\";\n        return new MqttRpcTopicPair\n        {\n            RequestTopic = $\"{methodTopicRoot}/{context.MethodName}\",\n            ResponseTopic = $\"{methodTopicRoot}/{context.MethodName}/response\"\n        };\n    }\n}\n"
  },
  {
    "path": "samples/Mqtt/ReadCurrentTime/ReadCurrentTime.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"MQTTnet.Extensions.Rpc\" Version=\"5.0.1.1416\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Mqtt/WriteReadbackValue/WriteReadbackValue.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing MQTTnet.Protocol;\nusing MQTTnet.Formatter;\nusing MQTTnet;\nusing MQTTnet.Extensions.Rpc;\nusing System.Text.Json;\n\n// Connect to mqtt broker\nvar mqttFactory = new MqttClientFactory();\nusing var mqttClient = mqttFactory.CreateMqttClient();\nvar mqttClientOptions = new MqttClientOptionsBuilder()\n    .WithProtocolVersion(MqttProtocolVersion.V500) // Important!!\n    .WithTcpServer(\"localhost\", 1883)\n    .Build();\nawait mqttClient.ConnectAsync(mqttClientOptions).ConfigureAwait(false);\nusing var mqttRpcClient = mqttFactory.CreateMqttRpcClient(mqttClient,\n    new MqttRpcClientOptionsBuilder().WithTopicGenerationStrategy(new PublisherTopicGenerationStrategy()).Build());\n\n//\n// Perform a couple write and readback operations:\n//\n\nvar originalValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Original value is: \" + originalValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(33).ConfigureAwait(false);\nvar updatedValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Value updated to : \" + updatedValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(44).ConfigureAwait(false);\nupdatedValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Value updated to : \" + updatedValue);\n\nawait WriteSlowNumberOfUpdatesValueAsync(originalValue).ConfigureAwait(false);\noriginalValue = await ReadSlowNumberOfUpdatesValueAsync().ConfigureAwait(false);\nConsole.WriteLine(\"Now reset back to: \" + originalValue);\n\n//\n// Helpers functions\n//\n\n// Read value of the slow number of updates configuration node\nasync ValueTask<int> ReadSlowNumberOfUpdatesValueAsync()\n{\n    var response = await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"ValueRead\",\n        JsonSerializer.SerializeToUtf8Bytes(new\n        {\n            connection = new\n            {\n                endpoint = new\n                {\n                    url = \"opc.tcp://opcplc:50000\",\n                    securityMode = \"SignAndEncrypt\"\n                }\n            },\n            request = new\n            {\n                nodeId = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowNumberOfUpdates\",\n            }\n        }), MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\n    var resopnseJson = JsonSerializer.Deserialize<JsonElement>(response);\n    return resopnseJson.GetProperty(\"value\").GetInt32();\n}\n\n// Write value to the slow number of updates configuration node\nasync ValueTask WriteSlowNumberOfUpdatesValueAsync(int value)\n{\n    await mqttRpcClient.ExecuteAsync(TimeSpan.FromSeconds(60), \"ValueWrite\",\n        JsonSerializer.SerializeToUtf8Bytes(new\n        {\n            connection = new\n            {\n                endpoint = new\n                {\n                    url = \"opc.tcp://opcplc:50000\",\n                    securityMode = \"SignAndEncrypt\"\n                }\n            },\n            request = new\n            {\n                nodeId = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowNumberOfUpdates\",\n                value\n            }\n        }), MqttQualityOfServiceLevel.AtMostOnce).ConfigureAwait(false);\n}\n\npublic sealed class PublisherTopicGenerationStrategy : IMqttRpcClientTopicGenerationStrategy\n{\n    // Both are configured in with-mosquitto.yaml\n    const string PublisherId = \"Microsoft\";\n    public MqttRpcTopicPair CreateRpcTopics(TopicGenerationContext context)\n    {\n        // THe default method topic root is\n        var methodTopicRoot = $\"{PublisherId}/methods\";\n        return new MqttRpcTopicPair\n        {\n            RequestTopic = $\"{methodTopicRoot}/{context.MethodName}\",\n            ResponseTopic = $\"{methodTopicRoot}/{context.MethodName}/response\"\n        };\n    }\n}\n"
  },
  {
    "path": "samples/Mqtt/WriteReadbackValue/WriteReadbackValue.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"MQTTnet.Extensions.Rpc\" Version=\"5.0.1.1416\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "samples/Mqtt/readme.md",
    "content": "# MQTT Samples\n\nThis folder contains several samples that show how to interact with the OPC Publisher over MQTT and show how to read values or subscribe to \ntelemetry sent by the OPC Publisher. To run the samples, first start OPC Publisher and Mosquitto MQTT broker:\n\n````bash\ncd deploy\ncd docker\ndocker compose -f docker-compose.yaml -f with-mosquitto.yaml up\n```\n\nThe samples will communicate through the mosquitto broker which runs at localhost:1883.\n> For simplicity of the same, the broker is listening on port 1883 and thus an unencrypted connection is used. In production, ensure to use TLS.\n\nThe sample uses the MQTT.net RPC library. The MQTT.net RPC libary does not support error conditions, and the ExecuteAsync call returns just the\nresponse buffer and no additional context of the MQTT message. OPC Publisher will return a status code as part of the user properties of the \nresponse message which can be read via other MQTT libraries."
  },
  {
    "path": "samples/Netcap/Directory.Build.props",
    "content": "﻿<Project>\n  <Import Project=\"$([MSBuild]::GetPathOfFileAbove(common.props))\" Condition=\"'$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), common.props))' != ''\" />\n</Project>\n"
  },
  {
    "path": "samples/Netcap/Netcap.slnx",
    "content": "<Solution>\n  <Project Path=\"src/Netcap.csproj\" />\n</Solution>\n"
  },
  {
    "path": "samples/Netcap/build.sh",
    "content": "#!/bin/bash\nset -e\ncd src\ndocker build -t netcap:latest .\ndocker run -it --cap-add=NET_ADMIN netcap:latest $@\n"
  },
  {
    "path": "samples/Netcap/readme.md",
    "content": "# Netcap Diagnostic Tool\n\n> **This tool is provided as a sample, as-is and without any support and warranty. When used in production please be aware that it is invasive and should be used with care.**\n\nThe Netcap tool is designed to help diagnose interop issues with OPC UA servers that OPC Publisher connects to and which the normal logs of OPC Publisher fail to diagnose.\nTo support diagnosis, Netcap collects network traces remotely from a OPC Publisher deployment and then makes the traces available for download and analysis. It is implemented as a sidecar to OPC Publisher that must be running in the same network as OPC Publisher (and see the same endpoints).\n\n> Netcap can only diagnose OPC Publisher versions 2.9.10 or higher!\n\nThe Netcap tool has three modes of operation:\n\n1. **Install Mode**: Allows installation of Netcap on a remote Azure IoT Edge device as side car of a running OPC Publisher module. Installation provisions a storage account and container registry in the same resource group as the IoT Hub the device is connected to, then builds and deploys Netcap to the IoT Edge device. If installed with an output path (`-o`) it will also download the network traces (.pcap files) during the capture session and then remove the Netcap module from the IoT Edge device once capture is cancelled (key press).\n2. **Remote Mode**: Netcap connects to the OPC Publisher and starts to capture tcp dumps filtered to the OPC Publisher IP addresses. The capture traces are chunked to (by default) 5 minutes or 100 MB whichever is reached first, and then the traces are uploaded. There will not be gaps between traces. This happens as long as the Netcap module is deployed.\n3. **Proxy Mode**: Netcap captures traces on a different network than OPC Publisher is connected to, e.g. the host network. It then exposes a remote API to allow the OPC Publisher side car to retrieve and upload the traces.\n4. **Uninstall Mode**: Removes the Netcap module from the IoT Edge device. This leaves the storage account and container registry in place which must can be removed in Cleanup mode.\n\nInstallation and un-installation require administrator rights to the subscription in which the Azure IoT Hub resides that OPC Publisher is connected to. Rights must include access to the Azure IoT Hub resource as well as the permission to create storage and container registry resources in the same resource group as the IoT Hub instance. If you do not have permissions to create resources in the subscription and/or resource group, you must build Netcap and deploy it manually.\n\n## Getting started\n\nIn the `src` sub folder run\n\n``` bash\ndotnet run -- install -o <output-folder>\n```\n\nor if you want to use docker you can also run\n\n``` bash\ndocker build -t netcap .\ndocker run -it -v <output-folder-on-your-host>:/tmp netcap install -d -o /tmp\n```\n\n> Do not forget to specify the `-d` option to force authorizing with Azure Resource Manager (ARM) using the device code flow.\n\nFollow the instructions to select a OPC Publisher you want to diagnose. When you are done, cancel capture by pressing any key. The folder you specified now contains the key set logs and a capture file (`capture.pcap`) which you can open in Wireshark. In the `Preferences` view under `Edit` select the page for the OPC UA protocol. You must enter the port of the OPC UA server there. You can consult the session `*.log` file you are interested in the download folder. The file name starts with the port number (or the log contains it).\n\nYou can also provide the key set to decrypt encrypted traffic which is the corresponding `*.txt` file with the same name as the `*.log` file (requires Wireshark 4.3 RC builds). Once saved, you can filter the traces using the `opcua` filter in the filter edit box on the main screen. Tip: right click on the traces and you can select the OPC UA protocol configuration directly from there.\n\n## Advanced install options\n\nFor installation and un-installation you might want to narrow down where Netcap looks for OPC Publisher deployments it should consider presenting to you. Use the `-s` option to specify the subscription. If you are working in multiple tenants, specify the tenant ID using the `-t` command line option.\n\nDuring installation the Netcap tool is built using the deployed Azure Container Registry (ACR) instance using the source found in the main branch of this repository. If you want to use a different branch, you must specify this branch using the `-b` option during installation.\n\nAll captured files are stored in the storage account provisioned during installation. The storage account contains sensitive data that must be handled with care, e.g. in addition to the OPC Publisher configuration it also contains key/token material that can be used in Wireshark 4.3 to decrypt secure channel communication inside the network traces.\n"
  },
  {
    "path": "samples/Netcap/src/.dockerignore",
    "content": "**/.dockerignore\n**/.env\n**/.gitignore\n**/.project\n**/.settings\n**/.toolstarget\n**/.vs\n**/.vscode\n**/*.sh\n**/*.bat\n**/*.cmd\n**/*.props\n**/*.*proj.user\n**/*.dbmdl\n**/*.jfm\n**/azds.yaml\n**/charts\n**/docker-compose*\n**/Dockerfile*\n**/obj\n**/bin\n**/secrets.dev.yaml\n**/values.dev.yaml\nLICENSE\nREADME.md\n!**/.gitignore\n!.git/HEAD\n!.git/config\n!.git/packed-refs\n!.git/refs/heads/**"
  },
  {
    "path": "samples/Netcap/src/Dockerfile",
    "content": "FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base\nARG BRANCH=main\nARG VERSION\nRUN apt update -y \\\n\t&& apt install -y apt-utils \\\n\t&& echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \\\n\t&& apt install -y libpcap-dev bash net-tools\nUSER root:root\nENV BRANCH=${BRANCH}\nENV VERSION=${VERSION}\nWORKDIR /app\n\nFROM mcr.microsoft.com/dotnet/sdk:9.0 AS build\nARG BUILD_CONFIGURATION=Release\nWORKDIR /src\nCOPY [\"Netcap.csproj\", \".\"]\nRUN dotnet restore \"./Netcap.csproj\"\nCOPY . .\nWORKDIR \"/src/.\"\nRUN dotnet build \"./Netcap.csproj\" -c $BUILD_CONFIGURATION -o /app/build\n\nFROM build AS publish\nARG BUILD_CONFIGURATION=Release\nRUN dotnet publish \"./Netcap.csproj\" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false\n\nFROM base AS final\nWORKDIR /app\nCOPY --from=publish /app/publish .\nENTRYPOINT [\"dotnet\", \"Netcap.dll\"]"
  },
  {
    "path": "samples/Netcap/src/Extensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Netcap;\n\nusing Microsoft.Azure.Devices.Shared;\nusing System.Buffers;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Reflection;\nusing System.Text.Json;\nusing System.Text.RegularExpressions;\n\n/// <summary>\n/// Various extensions\n/// </summary>\ninternal static partial class Extensions\n{\n    /// <summary>\n    /// Stop property\n    /// </summary>\n    /// <param name=\"twin\"></param>\n    /// <param name=\"name\"></param>\n    /// <param name=\"defaultValue\"></param>\n    /// <param name=\"desired\"></param>\n    /// <returns></returns>\n    [return: NotNullIfNotNull(nameof(defaultValue))]\n    public static string? GetProperty(this Twin twin, string name,\n        string? defaultValue = null, bool desired = true)\n    {\n        var bag = desired ? twin.Properties.Desired : twin.Properties.Reported;\n        if (!bag.Contains(name))\n        {\n            return defaultValue;\n        }\n        var value = bag[name];\n        var result = (string?)value?.ToString();\n        if (string.IsNullOrEmpty(result))\n        {\n            return defaultValue;\n        }\n        return result;\n    }\n\n    /// <summary>\n    /// Stop tag\n    /// </summary>\n    /// <param name=\"twin\"></param>\n    /// <param name=\"name\"></param>\n    /// <param name=\"defaultValue\"></param>\n    /// <returns></returns>\n    [return: NotNullIfNotNull(nameof(defaultValue))]\n    public static string? GetTag(this Twin twin, string name,\n        string? defaultValue = null)\n    {\n        if (!twin.Tags.Contains(name))\n        {\n            return defaultValue;\n        }\n        var value = twin.Tags[name];\n        var result = (string?)value?.ToString();\n        if (string.IsNullOrEmpty(result))\n        {\n            return defaultValue;\n        }\n        return result;\n    }\n\n    /// <summary>\n    /// Stop bytes\n    /// </summary>\n    /// <param name=\"elem\"></param>\n    /// <param name=\"value\"></param>\n    /// <returns></returns>\n    public static bool TryGetBytes(this JsonElement elem,\n        [NotNullWhen(true)] out byte[]? value)\n    {\n        if (elem.ValueKind == JsonValueKind.Array)\n        {\n            value = elem.EnumerateArray().Select(d => d.GetByte()).ToArray();\n            return true;\n        }\n        if (elem.ValueKind == JsonValueKind.String)\n        {\n            return elem.TryGetBytesFromBase64(out value);\n        }\n        value = default;\n        return false;\n    }\n\n    /// <summary>\n    /// Fix a unique name for a resource\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static string FixUpResourceName(string name)\n    {\n        name = AlphaNumOnly().Replace(name, \"\");\n        if (name.Length > 24)\n        {\n            name = name[..24];\n        }\n        return name;\n    }\n\n    /// <summary>\n    /// Stop assembly version\n    /// </summary>\n    /// <param name=\"assembly\"></param>\n    public static string GetVersion(this Assembly assembly)\n    {\n        var branch = Environment.GetEnvironmentVariable(\"BRANCH\");\n        branch = !string.IsNullOrEmpty(branch) ? \"-\" + branch : string.Empty;\n        var ver = assembly.GetCustomAttribute<AssemblyFileVersionAttribute>()?.Version;\n        if (ver == null || !Version.TryParse(ver, out var assemblyVersion))\n        {\n            ver = Environment.GetEnvironmentVariable(\"VERSION\");\n            if (ver == null || !Version.TryParse(ver, out assemblyVersion))\n            {\n                assemblyVersion = new Version();\n            }\n        }\n        return assemblyVersion + branch;\n    }\n\n    /// <summary>\n    /// Fix file name\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static string FixFileName(string name)\n    {\n        return string.Join('_', name.Split(Path.GetInvalidFileNameChars(),\n            StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries));\n    }\n\n    /// <summary>\n    /// Fix folder name\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static string FixFolderName(string name)\n    {\n        return string.Join('_', name.Split(Path.GetInvalidPathChars(),\n            StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries));\n    }\n\n    /// <summary>\n    /// Replace invalid chars in a storage entity name\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    public static string FixUpStorageName(string name)\n    {\n        // Remove any invalid characters\n        var containerName = AlphaNumAndDashOnly().Replace(name, \"\");\n        containerName = containerName.Trim('-');\n\n        // Check length\n        if (containerName.Length < 3)\n        {\n            containerName = containerName.PadRight(3, 'x');\n        }\n        else if (containerName.Length > 63)\n        {\n            containerName = containerName[..63];\n        }\n#pragma warning disable CA1308 // Normalize strings to uppercase\n        return containerName.ToLowerInvariant();\n#pragma warning restore CA1308 // Normalize strings to uppercase\n    }\n\n    /// <summary>\n    /// Copy stream without\n    /// </summary>\n    /// <param name=\"source\"></param>\n    /// <param name=\"destination\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public static async Task<int> CopyAsync(this Stream source, Stream destination,\n        CancellationToken ct = default)\n    {\n        var copied = 0;\n        var buffer = ArrayPool<byte>.Shared.Rent(8 * 1024);\n        try\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                var bytesRead = await source.ReadAsync(new Memory<byte>(buffer),\n                    ct).ConfigureAwait(false);\n                if (bytesRead == 0)\n                {\n                    break;\n                }\n                copied += bytesRead;\n                await destination.WriteAsync(new ReadOnlyMemory<byte>(\n                    buffer, 0, bytesRead), ct).ConfigureAwait(false);\n            }\n        }\n        finally\n        {\n            ArrayPool<byte>.Shared.Return(buffer);\n        }\n        return copied;\n    }\n\n    /// <summary>\n    /// Returns true if running in container.\n    /// </summary>\n    /// <returns></returns>\n    public static bool IsRunningInContainer()\n    {\n        return Environment.GetEnvironmentVariable(\"DOTNET_RUNNING_IN_CONTAINER\") != null;\n    }\n\n    public static readonly JsonSerializerOptions Indented = new() { WriteIndented = true };\n\n    [GeneratedRegex(\"[^a-zA-Z0-9-]\")]\n    private static partial Regex AlphaNumAndDashOnly();\n    [GeneratedRegex(\"[^a-zA-Z0-9]\")]\n    private static partial Regex AlphaNumOnly();\n}\n"
  },
  {
    "path": "samples/Netcap/src/Gateway.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Netcap;\n\nusing Azure;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.Storage;\nusing Azure.ResourceManager.Storage.Models;\nusing Azure.ResourceManager.ContainerRegistry.Models;\nusing Azure.ResourceManager.ContainerRegistry;\nusing Azure.ResourceManager.IotHub;\nusing Azure.ResourceManager.Resources;\nusing Azure.ResourceManager.IotHub.Models;\nusing Azure.Storage.Blobs;\nusing Azure.Storage.Blobs.Models;\nusing Microsoft.Azure.Devices;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Azure.Devices.Common.Exceptions;\nusing Microsoft.Azure.Devices.Shared;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\n/// <summary>\n/// Represents and edge gateway that can be accessed from\n/// cloud.\n/// </summary>\ninternal sealed record class Gateway\n{\n    /// <summary>\n    /// Stop image\n    /// </summary>\n    /// <returns></returns>\n    public NetcapImage Netcap { get; }\n\n    /// <summary>\n    /// Stop storage\n    /// </summary>\n    /// <returns></returns>\n    public NetcapStorage Storage { get; }\n\n    /// <summary>\n    /// Create gateway\n    /// </summary>\n    /// <param name=\"client\"></param>\n    /// <param name=\"logger\"></param>\n    /// <param name=\"branch\"></param>\n    public Gateway(ArmClient client, ILogger logger, string? branch = null)\n    {\n        _client = client;\n        _logger = logger;\n\n        Netcap = new NetcapImage(this, branch, logger);\n        Storage = new NetcapStorage(this, logger);\n    }\n\n    /// <summary>\n    /// Select publisher\n    /// </summary>\n    /// <param name=\"subscriptionId\"></param>\n    /// <param name=\"netcapMonitored\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    /// <exception cref=\"InvalidOperationException\"></exception>\n    public async ValueTask<bool> SelectPublisherAsync(string? subscriptionId = null,\n        bool netcapMonitored = false, CancellationToken ct = default)\n    {\n        while (!ct.IsCancellationRequested)\n        {\n            // Stop target publishers in iot hubs\n            var deployments = await GetPublisherDeploymentsAsync(subscriptionId,\n                netcapMonitored, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            // Select IoT Hub with publisher modules deployed\n            if (deployments.Count == 0)\n            {\n                if (!Extensions.IsRunningInContainer())\n                {\n                    Console.WriteLine(\"No publishers found. Check again? [Y/N]\");\n                    var key = Console.ReadKey();\n                    Console.WriteLine();\n                    if (key.Key != ConsoleKey.Y)\n                    {\n                        break;\n                    }\n                }\n                else\n                {\n                    _logger.LogInformation(\"No publishers found. Trying again...\");\n                    await Task.Delay(TimeSpan.FromSeconds(5),\n                        ct).ConfigureAwait(false);\n                }\n                continue;\n            }\n            var selected = deployments[0];\n            if (deployments.Count > 1)\n            {\n                Console.Clear();\n                Console.WriteLine($\"Found {deployments.Count} publishers:\");\n\n                for (var index = 0; index < deployments.Count; index++)\n                {\n                    Console.WriteLine($\"{index + 1}: {deployments[index]}\");\n                }\n                int i;\n                Console.WriteLine(\"Select publisher index: \");\n                while (true)\n                {\n                    if (int.TryParse(Console.ReadLine(), out i)\n                        && i <= deployments.Count && i > 0)\n                    {\n                        break;\n                    }\n                }\n                Console.WriteLine();\n                selected = deployments[i - 1];\n            }\n            else if (!Extensions.IsRunningInContainer())\n            {\n                Console.WriteLine(\"Found 1 publisher.\");\n                var action = netcapMonitored ? \"Detach from\" : \"Attach to\";\n                Console.WriteLine($\"{action} {selected}? [Y/N]\");\n                var key = Console.ReadKey();\n                Console.WriteLine();\n                if (key.Key != ConsoleKey.Y)\n                {\n                    _logger.LogInformation(\n                        \"Trying again to find other publishers...\");\n                    continue;\n                }\n            }\n\n            _subscription = selected.Subscription;\n            _deploymentConfigId = selected.DeploymentConfigId;\n            _resourceGroupName = selected.ResourceGroupName;\n            _connectionString = selected.ConnectionString;\n            _iotHubName = selected.IoTHub.Name;\n            _publisher = selected.Publisher;\n            return true;\n        }\n        return false;\n    }\n\n    /// <summary>\n    /// Stop resource group\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    /// <exception cref=\"NetcapException\"></exception>\n    public async Task<ResourceGroupResource> GetResourceGroupAsync(\n        CancellationToken ct = default)\n    {\n        if (_resourceGroupName == null || _subscription == null)\n        {\n            throw new NetcapException(\"Hub not selected\");\n        }\n        return await _subscription.GetResourceGroupAsync(_resourceGroupName,\n            ct).ConfigureAwait(false);\n    }\n\n    /// <summary>\n    /// Stop storage\n    /// </summary>\n    /// <returns></returns>\n    /// <exception cref=\"NetcapException\"></exception>\n    public Storage GetStorage()\n    {\n        if (_publisher == null || _subscription == null)\n        {\n            throw new NetcapException(\"Publisher not selected\");\n        }\n        return new Storage(_publisher.DeviceId, _publisher.Id,\n            Storage.ConnectionString, _logger);\n    }\n\n    /// <summary>\n    /// Deploy netcap module and wait until it is connected\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    /// <exception cref=\"NetcapException\"></exception>\n    public async ValueTask DeployNetcapModuleAsync(CancellationToken ct = default)\n    {\n        if (_publisher == null || _connectionString == null)\n        {\n            throw new NetcapException(\"Publisher not selected\");\n        }\n\n        // Remove storage\n        await GetStorage().DeleteAsync(ct).ConfigureAwait(false);\n\n        // Deploy the module using manifest to device with the chosen publisher\n        using var registryManager = RegistryManager.CreateFromConnectionString(\n            _connectionString);\n        var ncModuleId = _publisher.Id + kPostFix;\n        _deploymentConfigId = Extensions.FixUpStorageName(\n            _publisher.DeviceId + ncModuleId);\n        try\n        {\n            await registryManager.RemoveConfigurationAsync(_deploymentConfigId,\n                ct).ConfigureAwait(false);\n        }\n        catch (ConfigurationNotFoundException) { }\n\n        var publisherTwin = await registryManager.GetTwinAsync(_publisher.DeviceId,\n            _publisher.Id, ct).ConfigureAwait(false);\n\n        var hostname = publisherTwin.GetProperty(\"__hostname__\", desired: false);\n        var port = publisherTwin.GetProperty(\"__port__\", desired: false);\n\n        // Stop the create options of the publisher\n        var agent = await registryManager.GetTwinAsync(_publisher.DeviceId,\n            \"$edgeAgent\", ct).ConfigureAwait(false);\n        if (agent?.Properties.Desired.Contains(\"modules\") == true)\n        {\n            var publisherDeployment = agent.Properties.Desired[\"modules\"][_publisher.Id];\n            if (publisherDeployment != null)\n            {\n                var settings = publisherDeployment[\"settings\"];\n                var options = (string?)settings[\"createOptions\"];\n                if (options != null)\n                {\n                    var createOptions = JObject.Parse(options\n                        .Replace(\"\\\\\\\"\", \"\\\"\", StringComparison.Ordinal));\n\n                    if (createOptions.TryGetValue(\"Hostname\", out var hn) &&\n                            hn.Type == JTokenType.String)\n                    {\n                        hostname = hn.Value<string>();\n                    }\n                    if (createOptions.TryGetValue(\"HostConfig\", out var cfg) &&\n                        cfg is JObject hostConfig &&\n                        hostConfig.TryGetValue(\"PortBindings\", out var bd) &&\n                        bd is JObject bindings)\n                    {\n                        // Looks like {\\\"443/tcp\\\":[{\\\"HostPort\\\":\\\"8081\\\"}]}\n                        foreach (var pm in bindings)\n                        {\n                            if (pm.Key.StartsWith(\"443\", StringComparison.Ordinal) &&\n                                pm.Value is JArray arr && arr.Count > 0 &&\n                                arr[0] is JObject o && o.TryGetValue(\"HostPort\", out var p))\n                            {\n                                port = p.Value<string>();\n                                hostname = \"localhost\"; // Connect to host port\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        await registryManager.AddConfigurationAsync(\n            new Configuration(_deploymentConfigId)\n            {\n                TargetCondition = $\"deviceId = '{_publisher.DeviceId}'\",\n                Content = new ConfigurationContent\n                {\n                    ModulesContent = CreateSidecarDeployment(_publisher.DeviceId, ncModuleId,\n                        _publisher.Id, Netcap.LoginServer, Netcap.Username,\n                        Netcap.Password, Netcap.Name, Storage.ConnectionString,\n                        publisherTwin.GetProperty(\"__apikey__\", desired: false),\n                        publisherTwin.GetProperty(\"__certificate__\", desired: false),\n                        publisherTwin.GetProperty(\"__scheme__\", desired: false),\n                        publisherTwin.GetProperty(\"__ip__\", desired: false),\n                        hostname,\n                        port)\n                }\n            }, ct).ConfigureAwait(false);\n        await registryManager.UpdateTwinAsync(_publisher.DeviceId, _publisher.Id,\n            new Twin\n            {\n                Tags = new TwinCollection\n                {\n                    [kDeploymentTag] = _deploymentConfigId\n                }\n            }, publisherTwin.ETag, ct).ConfigureAwait(false);\n\n        _logger.LogInformation(\"Deploying netcap module to {DeviceId}...\",\n            _publisher.DeviceId);\n\n        // Wait until connected\n        var connected = false;\n        for (var i = 1; !connected && !ct.IsCancellationRequested; i++)\n        {\n            await Task.Delay(TimeSpan.FromSeconds(Math.Min(i, 10)), ct).ConfigureAwait(false);\n            var modules = await registryManager.GetModulesOnDeviceAsync(\n                _publisher.DeviceId, ct).ConfigureAwait(false);\n            connected = modules.Any(m => m.Id == ncModuleId &&\n                m.ConnectionState == DeviceConnectionState.Connected);\n        }\n        _logger.LogInformation(\"Netcap module deployed to {DeviceId}.\",\n            _publisher.DeviceId);\n    }\n\n    /// <summary>\n    /// Remove deployment\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    /// <exception cref=\"NetcapException\"></exception>\n    public async ValueTask RemoveNetcapModuleAsync(CancellationToken ct = default)\n    {\n        if (_publisher == null || _connectionString == null || _deploymentConfigId == null)\n        {\n            throw new NetcapException(\"Publisher not selected\");\n        }\n\n        using var registryManager = RegistryManager.CreateFromConnectionString(\n            _connectionString);\n        var ncModuleId = _publisher.Id + kPostFix;\n\n        await registryManager.UpdateTwinAsync(_publisher.DeviceId, _publisher.Id,\n            new Twin\n            {\n                Tags = new TwinCollection\n                {\n                    [kDeploymentTag] = null\n                }\n            }, etag: \"*\", ct).ConfigureAwait(false);\n\n        await registryManager.RemoveConfigurationAsync(\n            _deploymentConfigId, ct).ConfigureAwait(false);\n\n        // Uninstalled\n        _deploymentConfigId = null;\n\n        _logger.LogInformation(\"Removing netcap module from {DeviceId}...\",\n            _publisher.DeviceId);\n\n        // Wait until netcap is not connected anymore\n        var connected = true;\n        for (var i = 1; connected && !ct.IsCancellationRequested; i++)\n        {\n            await Task.Delay(TimeSpan.FromSeconds(Math.Min(i, 10)), ct).ConfigureAwait(false);\n            var modules = await registryManager.GetModulesOnDeviceAsync(\n                _publisher.DeviceId, ct).ConfigureAwait(false);\n            connected = modules.Any(m => m.Id == ncModuleId);\n        }\n        _logger.LogInformation(\"Netcap module removed from {DeviceId}.\",\n            _publisher.DeviceId);\n    }\n\n    /// <summary>\n    /// Publisher deployment\n    /// </summary>\n    /// <param name=\"Subscription\"></param>\n    /// <param name=\"ResourceGroupName\"></param>\n    /// <param name=\"IoTHub\"></param>\n    /// <param name=\"ConnectionString\"></param>\n    /// <param name=\"Publisher\"></param>\n    /// <param name=\"Connected\"></param>\n    /// <param name=\"DeploymentConfigId\"></param>\n    internal sealed record class PublisherDeployment(SubscriptionResource Subscription,\n        string ResourceGroupName, IotHubDescriptionData IoTHub, string ConnectionString,\n        Module Publisher, bool Connected, string? DeploymentConfigId)\n    {\n        public override string? ToString()\n        {\n            return $\"[{Subscription.Data.DisplayName}/{ResourceGroupName}/\" +\n                $\"{IoTHub.Name}]  {Publisher.DeviceId}/modules/{Publisher.Id}\" +\n                $\"{(Connected ? \"\" : \"  [Disconnected]\")}\";\n        }\n    }\n\n    /// <summary>\n    /// Stop deployments\n    /// </summary>\n    /// <param name=\"subscriptionId\"></param>\n    /// <param name=\"netcapMonitored\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async IAsyncEnumerable<PublisherDeployment> GetPublisherDeploymentsAsync(\n        string? subscriptionId = null, bool netcapMonitored = false,\n        [EnumeratorCancellation] CancellationToken ct = default)\n    {\n        _logger.LogInformation(\"Finding publishers...\");\n        await foreach (var sub in _client.GetSubscriptions().GetAllAsync(ct).ConfigureAwait(false))\n        {\n            if (subscriptionId != null && sub.Data.DisplayName != subscriptionId\n                && sub.Id.SubscriptionId != subscriptionId)\n            {\n                continue;\n            }\n            await foreach (var hub in sub.GetIotHubDescriptionsAsync(cancellationToken: ct).ConfigureAwait(false))\n            {\n                Response<SharedAccessSignatureAuthorizationRule> keys;\n                try\n                {\n                    keys = await hub.GetKeysForKeyNameAsync(\"iothubowner\",\n                        ct).ConfigureAwait(false);\n                }\n                catch (Exception ex)\n                {\n                    _logger.LogDebug(ex, \"Failed to get keys for hub {Hub}.\", hub.Data.Name);\n                    continue;\n                }\n                var cs = IotHubConnectionStringBuilder.Create(hub.Data.Properties.HostName,\n                    new ServiceAuthenticationWithSharedAccessPolicyKey(\"iothubowner\",\n                        keys.Value.PrimaryKey));\n                Debug.Assert(hub.Id.ResourceGroupName != null);\n                var publishers = await GetPublishersAsync(sub, hub.Id.ResourceGroupName,\n                    hub.Data, cs.ToString(), netcapMonitored, ct)\n                    .ToListAsync(ct)\n                    .ConfigureAwait(false);\n                foreach (var pub in publishers)\n                {\n                    yield return pub;\n                }\n            }\n        }\n\n        static async IAsyncEnumerable<PublisherDeployment> GetPublishersAsync(\n            SubscriptionResource sub, string resourceGroupName, IotHubDescriptionData hub,\n            string connectionString, bool netcapMonitored,\n            [EnumeratorCancellation] CancellationToken ct = default)\n        {\n            using var registry = RegistryManager.CreateFromConnectionString(connectionString);\n            var query = registry.CreateQuery(\n                \"SELECT * FROM devices.modules WHERE properties.reported.__type__ = 'OpcPublisher'\");\n            string? continuationToken = null;\n            while (query.HasMoreResults)\n            {\n                ct.ThrowIfCancellationRequested();\n                QueryResponse<Twin> results;\n                try\n                {\n                    results = await query.GetNextAsTwinAsync(new QueryOptions\n                    {\n                        ContinuationToken = continuationToken\n                    }).ConfigureAwait(false);\n                }\n                catch (UnauthorizedException)\n                {\n                    yield break;\n                }\n                continuationToken = results.ContinuationToken;\n                foreach (var result in results)\n                {\n                    var version = result.GetProperty(\"__version__\", desired: false);\n                    if (version?.StartsWith(\"2.9.\", StringComparison.Ordinal) != true ||\n                        !int.TryParse(version.Split('.')[2], out var patch) ||\n                        patch < 10)\n                    {\n                        // Not supported\n                        continue;\n                    }\n\n                    var configId = result.GetTag(kDeploymentTag);\n                    if (!netcapMonitored)\n                    {\n                        if (configId != null)\n                        {\n                            // Select only publishers without netcap enabled\n                            continue;\n                        }\n                        if (result.ConnectionState != DeviceConnectionState.Connected)\n                        {\n                            // Select only connected publishers\n                            continue;\n                        }\n                    }\n                    else if (configId == null)\n                    {\n                        // Select only publisher with netcap enabled\n                        // Disconnected are ok, we want to uninstall those too\n                        continue;\n                    }\n\n                    var device = await registry.GetDeviceAsync(result.DeviceId,\n                        ct).ConfigureAwait(false);\n                    var connected = device.ConnectionState == DeviceConnectionState.Connected;\n                    yield return new PublisherDeployment(sub, resourceGroupName, hub,\n                        connectionString, new Module(result.DeviceId, result.ModuleId),\n                        connected, configId);\n                }\n            }\n        }\n    }\n\n    /// <summary>\n    /// Create Sidecar Deployment deployment\n    /// </summary>\n    /// <param name=\"deviceId\"></param>\n    /// <param name=\"netcapModuleId\"></param>\n    /// <param name=\"publisherModuleId\"></param>\n    /// <param name=\"server\"></param>\n    /// <param name=\"userName\"></param>\n    /// <param name=\"password\"></param>\n    /// <param name=\"image\"></param>\n    /// <param name=\"storageConnectionString\"></param>\n    /// <param name=\"apiKey\"></param>\n    /// <param name=\"certificate\"></param>\n    /// <param name=\"scheme\"></param>\n    /// <param name=\"ipAddresses\"></param>\n    /// <param name=\"hostName\"></param>\n    /// <param name=\"port\"></param>\n    /// <returns></returns>\n    private static IDictionary<string, IDictionary<string, object>>? CreateSidecarDeployment(\n        string deviceId, string netcapModuleId, string publisherModuleId, string server,\n        string userName, string password, string image, string storageConnectionString,\n        string? apiKey, string? certificate, string? scheme, string? ipAddresses,\n        string? hostName, string? port)\n    {\n        var args = new List<string>\n        {\n            \"-d\", deviceId,\n            \"-m\", publisherModuleId,\n            \"-s\", storageConnectionString\n        };\n        if (ipAddresses != null)\n        {\n            args.Add(\"-i\");\n            args.Add(ipAddresses);\n        }\n        if (apiKey != null)\n        {\n            args.Add(\"-a\");\n            args.Add(apiKey);\n        }\n        if (certificate != null)\n        {\n            args.Add(\"-p\");\n            args.Add(certificate);\n        }\n        if (hostName != null)\n        {\n            scheme ??= \"https\";\n            var url = $\"{scheme}://{hostName}\";\n            if (port != null)\n            {\n                url += $\":{port}\";\n            }\n\n            args.Add(\"-r\");\n            args.Add(url);\n        }\n        var createOptions = JsonConvert.SerializeObject(new\n        {\n            User = \"root\",\n            Cmd = args.ToArray(),\n            NetworkingConfig = new\n            {\n                EndpointsConfig = new\n                {\n                    host = new { }\n                }\n            },\n            HostConfig = new\n            {\n                NetworkMode = \"host\", // $\"container:{hostName ?? publisherModuleId}\",\n                CapAdd = new[] { \"NET_ADMIN\" }\n            }\n        }).Replace(\"\\\"\", \"\\\\\\\"\", StringComparison.Ordinal);\n\n        // Return deployment modules object\n        return JsonConvert.DeserializeObject<IDictionary<string, IDictionary<string, object>>>($$\"\"\"\n        {\n            \"$edgeAgent\": {\n                \"properties.desired.runtime.settings.registryCredentials.{{netcapModuleId}}\": {\n                    \"address\": \"{{server}}\",\n                    \"password\": \"{{password}}\",\n                    \"username\": \"{{userName}}\"\n                },\n                \"properties.desired.modules.{{netcapModuleId}}\": {\n                    \"settings\": {\n                        \"image\": \"{{image}}\",\n                        \"createOptions\": \"{{createOptions}}\"\n                    },\n                    \"type\": \"docker\",\n                    \"status\": \"running\",\n                    \"restartPolicy\": \"always\",\n                    \"version\": \"1.0\"\n                }\n            },\n            \"$edgeHub\": {\n                \"properties.desired.routes.netcapToUpstream\": {\n                    \"route\": \"FROM /messages/modules/{{netcapModuleId}}/* INTO $upstream\"\n                }\n            }\n        }\n\"\"\");\n    }\n\n    /// <summary>\n    /// Create resource name\n    /// </summary>\n    /// <param name=\"postfix\"></param>\n    /// <returns></returns>\n    private string GetResourceName(string postfix)\n    {\n        return Extensions.FixUpResourceName(_iotHubName + postfix);\n    }\n\n    /// <summary>\n    /// Container image\n    /// </summary>\n    internal sealed record class NetcapImage\n    {\n        public string LoginServer { get; private set; } = null!;\n        public string Username { get; private set; } = null!;\n        public string Password { get; private set; } = null!;\n        public string Name { get; private set; } = null!;\n\n        /// <summary>\n        /// Create image\n        /// </summary>\n        /// <param name=\"gateway\"></param>\n        /// <param name=\"branch\"></param>\n        /// <param name=\"logger\"></param>\n        public NetcapImage(Gateway gateway, string? branch, ILogger logger)\n        {\n            _gateway = gateway;\n            _branch = branch ?? \"main\";\n            _logger = logger;\n        }\n\n        /// <summary>\n        /// Create or update\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public async Task CreateOrUpdateAsync(CancellationToken ct = default)\n        {\n            // Create container registry or update if it already exists in rg\n            var regName = _gateway.GetResourceName(kResourceName);\n            var rg = await _gateway.GetResourceGroupAsync(ct).ConfigureAwait(false);\n            _logger.LogInformation(\n                \"Create netcap module image in {Registry} inside {ResourceGroup}.\",\n                regName, rg.Data.Name);\n            var registryResponse = await rg.GetContainerRegistries()\n                .CreateOrUpdateAsync(WaitUntil.Completed, regName,\n                new ContainerRegistryData(rg.Data.Location,\n                    new ContainerRegistrySku(ContainerRegistrySkuName.Basic))\n                {\n                    IsAdminUserEnabled = true,\n                    PublicNetworkAccess = ContainerRegistryPublicNetworkAccess.Enabled\n                },\n                    ct).ConfigureAwait(false);\n            var registryKeys = await registryResponse.Value.GetCredentialsAsync(ct)\n                .ConfigureAwait(false);\n\n            LoginServer = registryResponse.Value.Data.LoginServer;\n            Username = registryKeys.Value.Username;\n            Password = registryKeys.Value.Passwords[0].Value;\n            Name = LoginServer + \"/netcap:\" + GetType().Assembly.GetVersion();\n\n            _logger.LogInformation(\"Building Image {Image} ...\", Name);\n            // Build the image and push to the registry\n            var quickBuild = new ContainerRegistryDockerBuildContent(\"Dockerfile\",\n                new ContainerRegistryPlatformProperties(\"linux\") { Architecture = \"amd64\" })\n            {\n                SourceLocation =\n                    $\"https://github.com/Azure/Industrial-IoT.git#{_branch}:samples/Netcap/src\",\n                IsPushEnabled = true\n            };\n            quickBuild.ImageNames.Add(Name);\n            quickBuild.Arguments.Add(\n                new ContainerRegistryRunArgument(\"VERSION\", GetType().Assembly.GetVersion()));\n            quickBuild.Arguments.Add(\n                new ContainerRegistryRunArgument(\"BRANCH\", _branch));\n            var taskName = Extensions.FixUpResourceName(kTaskName + DateTime.UtcNow.ToBinary());\n            var buildResponse = await registryResponse.Value.GetContainerRegistryTaskRuns()\n                .CreateOrUpdateAsync(WaitUntil.Started, taskName, new ContainerRegistryTaskRunData\n                {\n                    RunRequest = quickBuild\n                }, ct).ConfigureAwait(false);\n\n            var runs = await registryResponse.Value.GetContainerRegistryTaskRuns()\n                .GetAsync(taskName, ct).ConfigureAwait(false);\n            var run = await registryResponse.Value.GetContainerRegistryRuns().GetAsync(\n                 runs.Value.Data.RunResult.RunId, ct).ConfigureAwait(false);\n\n            using var cts = new CancellationTokenSource();\n            var copyTask = LogRunLog(run.Value, cts.Token);\n\n            async Task LogRunLog(ContainerRegistryRunResource run, CancellationToken ct)\n            {\n                var position = 0;\n                var url = await run.GetLogSasUrlAsync(ct).ConfigureAwait(false);\n                while (!ct.IsCancellationRequested)\n                {\n                    try\n                    {\n                        var client = new BlobClient(new Uri(url.Value.LogLink));\n#pragma warning disable RCS1261 // Resource can be disposed asynchronously\n                        using var os = Console.OpenStandardOutput();\n                        using var source = await client.OpenReadAsync(new BlobOpenReadOptions(true)\n                        {\n                            Position = position\n                        }, ct).ConfigureAwait(false);\n#pragma warning restore RCS1261 // Resource can be disposed asynchronously\n                        position += await source.CopyAsync(os, ct).ConfigureAwait(false);\n                    }\n                    catch (OperationCanceledException) { }\n                    catch (Exception ex)\n                    {\n                        _logger.LogDebug(ex, \"Download from {Url} failed.\", url.Value.LogLink);\n                    }\n                }\n            }\n\n            await buildResponse.WaitForCompletionAsync(ct).ConfigureAwait(false);\n            await cts.CancelAsync().ConfigureAwait(false);\n            try { await copyTask.ConfigureAwait(false); } catch { }\n\n            _logger.LogInformation(\"Image {Image} built with {Result}\", Name,\n                buildResponse.Value.Data.RunResult.Status.ToString());\n        }\n\n        /// <summary>\n        /// Create or update\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public async Task DeleteAsync(CancellationToken ct)\n        {\n            var regName = _gateway.GetResourceName(kResourceName);\n            var rg = await _gateway.GetResourceGroupAsync(ct).ConfigureAwait(false);\n            var registryCollection = rg.GetContainerRegistries();\n            if (!await registryCollection.ExistsAsync(regName, ct).ConfigureAwait(false))\n            {\n                return;\n            }\n            var registryResponse = await rg.GetContainerRegistryAsync(regName,\n                ct).ConfigureAwait(false);\n            await registryResponse.Value.DeleteAsync(WaitUntil.Completed,\n                ct).ConfigureAwait(false);\n\n            LoginServer = null!;\n            Username = null!;\n            Password = null!;\n            Name = null!;\n        }\n\n        private const string kResourceName = \"acr\";\n        private const string kTaskName = \"nc\";\n        private readonly Gateway _gateway;\n        private readonly string _branch;\n        private readonly ILogger _logger;\n    }\n\n    /// <summary>\n    /// NetcapException storage controller\n    /// </summary>\n    internal sealed record class NetcapStorage\n    {\n        public string ConnectionString { get; private set; } = null!;\n\n        /// <summary>\n        /// Create storage\n        /// </summary>\n        /// <param name=\"gateway\"></param>\n        /// <param name=\"logger\"></param>\n        public NetcapStorage(Gateway gateway, ILogger logger)\n        {\n            _gateway = gateway;\n            _logger = logger;\n        }\n\n        /// <summary>\n        /// Create or update\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        /// <exception cref=\"NetcapException\"></exception>\n        public async ValueTask CreateOrUpdateAsync(CancellationToken ct)\n        {\n            var stgName = _gateway.GetResourceName(kResourceName);\n            var rg = await _gateway.GetResourceGroupAsync(ct).ConfigureAwait(false);\n            _logger.LogInformation(\"Create Storage {Storage} for netcap module in {Rg}.\",\n                stgName, rg.Data.Name);\n            var storageResponse = await rg.GetStorageAccounts()\n                .CreateOrUpdateAsync(WaitUntil.Completed, stgName,\n                new StorageAccountCreateOrUpdateContent(\n                    new StorageSku(StorageSkuName.StandardGrs),\n                    StorageKind.StorageV2, rg.Data.Location)\n                {\n                    AllowSharedKeyAccess = true,\n                    EnableHttpsTrafficOnly = true,\n                    PublicNetworkAccess = StoragePublicNetworkAccess.Enabled\n                }, ct).ConfigureAwait(false);\n\n            var storageName = storageResponse.Value.Data.Name;\n            var endpoints = storageResponse.Value.Data.PrimaryEndpoints;\n\n            var keys = await storageResponse.Value.GetKeysAsync(\n                cancellationToken: ct).ToListAsync(ct).ConfigureAwait(false);\n            if (keys.Count == 0)\n            {\n                throw new NetcapException(\n                    $\"No keys found for storage account {storageName}\");\n            }\n\n            // Create connection string for storage account\n            ConnectionString = \"DefaultEndpointsProtocol=https;\" +\n                $\"BlobEndpoint={endpoints.BlobUri};\" +\n                $\"QueueEndpoint={endpoints.QueueUri};\" +\n                $\"FileEndpoint={endpoints.FileUri};\" +\n                $\"TableEndpoint={endpoints.TableUri};\" +\n                $\"AccountName={storageName};AccountKey={keys[0].Value}\";\n            _logger.LogInformation(\"Storage {Name} for netcap module created.\",\n                storageName);\n        }\n\n        /// <summary>\n        /// Stop\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public async ValueTask DeleteAsync(CancellationToken ct)\n        {\n            var stgName = _gateway.GetResourceName(kResourceName);\n            var rg = await _gateway.GetResourceGroupAsync(ct).ConfigureAwait(false);\n            var storageCollection = rg.GetStorageAccounts();\n            if (!await storageCollection.ExistsAsync(stgName,\n                cancellationToken: ct).ConfigureAwait(false))\n            {\n                return;\n            }\n            var storageResponse = await rg.GetStorageAccountAsync(stgName,\n                cancellationToken: ct).ConfigureAwait(false);\n            await storageResponse.Value.DeleteAsync(WaitUntil.Completed,\n                ct).ConfigureAwait(false);\n\n            ConnectionString = null!;\n        }\n\n        private const string kResourceName = \"stg\";\n        private readonly Gateway _gateway;\n        private readonly ILogger _logger;\n    }\n\n    private const string kDeploymentTag = \"netcapdeployment\";\n    private const string kPostFix = \"-nc\";\n    private Module? _publisher;\n    private SubscriptionResource? _subscription;\n    private string? _iotHubName;\n    private string? _deploymentConfigId;\n    private string? _resourceGroupName;\n    private string? _connectionString;\n    private readonly ILogger _logger;\n    private readonly ArmClient _client;\n}\n"
  },
  {
    "path": "samples/Netcap/src/Netcap.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Netcap;\n\nusing Azure.Core;\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing CommandLine;\nusing Microsoft.AspNetCore.Authentication;\nusing Microsoft.Azure.Devices.Client;\nusing Microsoft.Azure.Devices.Common.Exceptions;\nusing Microsoft.Azure.Devices.Shared;\nusing Microsoft.Extensions.DependencyInjection.Extensions;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Options;\nusing System.Diagnostics;\nusing System.Net;\nusing System.Net.Http.Headers;\nusing System.Security.Claims;\nusing System.Security.Cryptography;\nusing System.Security.Cryptography.X509Certificates;\nusing System.Text.Encodings.Web;\nusing System.Text.Json;\n\n/// <summary>\n/// Netcap exception\n/// </summary>\npublic class NetcapException : Exception\n{\n    public NetcapException(string message) : base(message)\n    {\n    }\n\n    public NetcapException(string message, Exception innerException)\n        : base(message, innerException)\n    {\n    }\n}\n\n/// <summary>\n/// Netcap application\n/// </summary>\ninternal sealed class App : IDisposable\n{\n    [Verb(\"run\", isDefault: true, HelpText = \"Run netcap to capture diagnostics.\")]\n    public sealed class RunOptions\n    {\n        [Option('s', nameof(StorageConnectionString), Required = false,\n            HelpText = \"The storage connection string to use to upload files.\")]\n        public string? StorageConnectionString { get; set; } =\n            Environment.GetEnvironmentVariable(nameof(StorageConnectionString));\n\n        [Option('m', nameof(PublisherModuleId), Required = false,\n            HelpText = \"The module id of the opc publisher.\")]\n        public string PublisherModuleId { get; set; } =\n            Environment.GetEnvironmentVariable(nameof(PublisherModuleId)) ?? \"publisher\";\n\n        [Option('d', nameof(PublisherDeviceId), Required = false,\n            HelpText = \"The device id of the opc publisher.\")]\n        public string? PublisherDeviceId { get; set; } =\n            Environment.GetEnvironmentVariable(nameof(PublisherDeviceId));\n\n        [Option('a', nameof(PublisherRestApiKey), Required = false,\n            HelpText = \"The api key of the opc publisher.\")]\n        public string? PublisherRestApiKey { get; set; } =\n            Environment.GetEnvironmentVariable(nameof(PublisherRestApiKey));\n\n        [Option('p', nameof(PublisherRestCertificate), Required = false,\n            HelpText = \"The tls certificate of the opc publisher.\")]\n        public string? PublisherRestCertificate { get; set; }\n\n        [Option('r', nameof(PublisherRestApiEndpoint), Required = false,\n            HelpText = \"The Rest api endpoint of the opc publisher.\")]\n        public string? PublisherRestApiEndpoint { get; set; } =\n            Environment.GetEnvironmentVariable(nameof(PublisherRestApiEndpoint));\n\n        [Option('i', nameof(PublisherIpAddresses), Required = false,\n            HelpText = \"The endpoint of the opc publisher.\")]\n        public string? PublisherIpAddresses { get; set; }\n\n        [Option('t', nameof(CaptureDuration), Required = false,\n            HelpText = \"The capture duration.\")]\n        public TimeSpan? CaptureDuration { get; set; } = TimeSpan.TryParse(\n            Environment.GetEnvironmentVariable(nameof(CaptureDuration)), out var t) ? t : null;\n\n        [Option('f', nameof(CaptureFileSize), Required = false,\n            HelpText = \"The max file size of pcap in bytes.\")]\n        public int? CaptureFileSize { get; set; } = int.TryParse(\n            Environment.GetEnvironmentVariable(nameof(CaptureFileSize)), out var f) ? f : null;\n\n        [Option('I', nameof(CaptureInterfaces), Required = false,\n            HelpText = \"The network interfaces to capture from.\")]\n        public Pcap.InterfaceType CaptureInterfaces { get; set; } =\n            Pcap.InterfaceType.AnyIfAvailable;\n\n        [Option('E', nameof(HostCaptureEndpointUrl), Required = false,\n            HelpText = \"The remote capture endpoint to use.\")]\n        public string? HostCaptureEndpointUrl { get; internal set; }\n\n        [Option('C', nameof(HostCaptureCertificate), Required = false,\n            HelpText = \"The remote capture endpoint certificate.\")]\n        public string? HostCaptureCertificate { get; internal set; }\n\n        [Option('A', nameof(HostCaptureApiKey), Required = false,\n            HelpText = \"The remote capture endpoint api key.\")]\n        public string? HostCaptureApiKey { get; internal set; }\n\n        public RunOptions()\n        {\n            PublisherRestCertificate =\n                Environment.GetEnvironmentVariable(nameof(PublisherRestCertificate));\n        }\n\n        /// <summary>\n        /// Stop configuration from twin\n        /// </summary>\n        /// <param name=\"twin\"></param>\n        /// <returns></returns>\n        public void ConfigureFromTwin(Twin twin)\n        {\n            // Set any missing info from the netcap twin\n            PublisherIpAddresses = twin.GetProperty(\n                nameof(PublisherIpAddresses), PublisherIpAddresses);\n            PublisherRestApiEndpoint = twin.GetProperty(\n                nameof(PublisherRestApiEndpoint), PublisherRestApiEndpoint);\n            PublisherRestApiKey = twin.GetProperty(\n                nameof(PublisherRestApiKey), PublisherRestApiKey);\n            PublisherRestCertificate = twin.GetProperty(\n                nameof(PublisherRestCertificate), PublisherRestCertificate);\n            HostCaptureEndpointUrl = twin.GetProperty(\n                nameof(HostCaptureEndpointUrl), HostCaptureEndpointUrl);\n            HostCaptureCertificate = twin.GetProperty(\n                nameof(HostCaptureCertificate), HostCaptureCertificate);\n            HostCaptureApiKey = twin.GetProperty(\n                nameof(HostCaptureApiKey), HostCaptureApiKey);\n            StorageConnectionString = twin.GetProperty(\n                nameof(StorageConnectionString), StorageConnectionString);\n            var captureDuration = twin.GetProperty(nameof(CaptureDuration));\n            if (!string.IsNullOrWhiteSpace(captureDuration) &&\n                TimeSpan.TryParse(captureDuration, out var duration))\n            {\n                CaptureDuration = duration;\n            }\n            var captureFileSize = twin.GetProperty(nameof(CaptureFileSize));\n            if (!string.IsNullOrWhiteSpace(captureFileSize) &&\n                int.TryParse(captureFileSize, out var filesize))\n            {\n                CaptureFileSize = filesize;\n            }\n        }\n    }\n\n    [Verb(\"sidecar\", HelpText = \"Run netcap as capture host.\")]\n    public sealed class SidecarOptions;\n\n    [Verb(\"install\", HelpText = \"Install netcap into a publisher.\")]\n    public sealed class InstallOptions\n    {\n        [Option('t', nameof(TenantId), Required = false,\n            HelpText = \"The tenant to use to filter subscriptions down.\" +\n            \"\\nDefault uses all tenants accessible.\")]\n        public string? TenantId { get; set; } =\n            Environment.GetEnvironmentVariable(\"AZURE_TENANT_ID\");\n\n        [Option('d', nameof(UseDeviceCode), Required = false,\n            HelpText = \"Use device code authentication.\")]\n        public bool UseDeviceCode { get; set; }\n\n        [Option('s', nameof(SubscriptionId), Required = false,\n            HelpText = \"The subscription to use to install to.\" +\n            \"\\nDefault uses all subscriptions accessible.\")]\n        public string? SubscriptionId { get; set; }\n\n        [Option('o', nameof(OutputPath), Required = false,\n            HelpText = \"The output path to capture to.\")]\n        public string? OutputPath { get; set; }\n\n        [Option('b', nameof(Branch), Required = false,\n           HelpText = \"The branch to build netcap from.\" +\n           \"\\nDefaults to main branch.\")]\n        public string? Branch { get; set; } = \"main\";\n    }\n\n    [Verb(\"uninstall\", HelpText = \"Uninstall netcap from one or all publishers.\")]\n    public sealed class UninstallOptions\n    {\n        [Option('t', nameof(TenantId), Required = false,\n            HelpText = \"The tenant to use to filter subscriptions down.\" +\n            \"\\nDefault uses all tenants accessible.\")]\n        public string? TenantId { get; set; } =\n            Environment.GetEnvironmentVariable(\"AZURE_TENANT_ID\");\n\n        [Option('d', nameof(UseDeviceCode), Required = false,\n            HelpText = \"Use device code authentication.\")]\n        public bool UseDeviceCode { get; set; }\n\n        [Option('s', nameof(SubscriptionId), Required = false,\n            HelpText = \"The subscription to use to install to.\" +\n            \"\\nDefault uses all subscriptions accessible.\")]\n        public string? SubscriptionId { get; set; }\n    }\n\n    /// <summary>\n    /// Create netcap application\n    /// </summary>\n    public App()\n    {\n        _publisherHttpClient = new HttpClient();\n        _loggerFactory = new LoggerFactory();\n        _logger = UpdateLogger();\n    }\n\n    /// <inheritdoc/>\n    public void Dispose()\n    {\n        _loggerFactory.Dispose();\n        _publisherHttpClient.Dispose();\n        _publisherCertificate?.Dispose();\n        _sidecarHttpClient?.Dispose();\n        _sidecarCertificate?.Dispose();\n    }\n\n    /// <summary>\n    /// Parse parameters\n    /// </summary>\n    /// <param name=\"args\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public static async ValueTask<App> RunAsync(string[] args,\n        CancellationToken ct = default)\n    {\n        var cmd = new App();\n        await cmd.ParseAsync(args, ct).ConfigureAwait(false);\n        return cmd;\n    }\n\n    /// <summary>\n    /// Parse parameters\n    /// </summary>\n    /// <param name=\"args\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async ValueTask ParseAsync(string[] args, CancellationToken ct = default)\n    {\n        Parser.Default.ParseArguments<RunOptions, InstallOptions, UninstallOptions>(args)\n            .WithParsed<RunOptions>(parsedParams => _run = parsedParams)\n            .WithParsed<InstallOptions>(parsedParams => _install = parsedParams)\n            .WithParsed<SidecarOptions>(parsedParams => _sidecar = parsedParams)\n            .WithParsed<UninstallOptions>(parsedParams => _uninstall = parsedParams)\n            .WithNotParsed(errors =>\n            {\n                errors.ToList().ForEach(Console.WriteLine);\n                Environment.Exit(1);\n            });\n\n        _logger = UpdateLogger();\n        var iothubConnectionString =\n            Environment.GetEnvironmentVariable(\"IoTHubOwnerConnectionString\") ??\n            Environment.GetEnvironmentVariable(\"_HUB_CS\");\n\n        if (_install != null)\n        {\n            await InstallAsync(ct).ConfigureAwait(false);\n        }\n        else if (_uninstall != null)\n        {\n            await UninstallAsync(ct).ConfigureAwait(false);\n        }\n        else if (_sidecar != null)\n        {\n            await RunAsSidecarModuleAsync(ct).ConfigureAwait(false);\n        }\n        else if (!string.IsNullOrEmpty(iothubConnectionString))\n        {\n            await RunAsIoTHubConnectedModuleAsync(\n                iothubConnectionString, ct).ConfigureAwait(false);\n        }\n        else\n        {\n            await RunAsModuleAsync(ct).ConfigureAwait(false);\n        }\n    }\n\n    /// <summary>\n    /// Run netcap\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    /// <exception cref=\"NetcapException\"></exception>\n    private async Task RunAsync(CancellationToken ct = default)\n    {\n        _run ??= new RunOptions();\n\n        if (string.IsNullOrEmpty(_run.StorageConnectionString))\n        {\n            throw new NetcapException(\"Storage must be provided\");\n        }\n\n        using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);\n        if (!Extensions.IsRunningInContainer())\n        {\n            while (Console.KeyAvailable) { Console.ReadKey(); }\n            _ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); }, ct);\n            Console.WriteLine(\"Press any key to exit\");\n            Console.WriteLine();\n        }\n        try\n        {\n            // Connect to publisher\n            using var publisher = new Publisher(_publisherHttpClient, _run.PublisherIpAddresses,\n                _loggerFactory.CreateLogger(\"Publisher\"));\n\n            var storage = new Storage(_run.PublisherDeviceId ?? \"unknown\", _run.PublisherModuleId,\n                _run.StorageConnectionString, _loggerFactory.CreateLogger(\"Upload\"));\n            for (var i = 0; !cts.IsCancellationRequested; i++)\n            {\n                // Update endpoint urls and addresses to monitor if not set\n                if (await publisher.TryUploadEndpointsAsync(storage, cts.Token).ConfigureAwait(false))\n                {\n                    break;\n                }\n                _logger.LogInformation(\"waiting .....\");\n                await Task.Delay(TimeSpan.FromMinutes(1), cts.Token).ConfigureAwait(false);\n                continue;\n            }\n            cts.Token.ThrowIfCancellationRequested();\n\n            // Start capture and upload capture files and channel information\n            var configuration = publisher.GetCaptureConfiguration(_run.CaptureInterfaces,\n                _run.CaptureFileSize, _run.CaptureDuration);\n            using (Pcap.Capture(configuration, storage, _loggerFactory.CreateLogger(\"Capture\"),\n                _sidecarHttpClient))\n            {\n                await publisher.UploadChannelLogsAsync(storage, cts.Token).ConfigureAwait(false);\n            }\n        }\n        catch (OperationCanceledException) { }\n        catch (Exception ex)\n        {\n            _logger.LogError(ex, \"Failed to run.\");\n        }\n    }\n\n    /// <summary>\n    /// Install\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async Task InstallAsync(CancellationToken ct = default)\n    {\n        _install ??= new InstallOptions();\n        // Login to azure\n        var armClient = new ArmClient(\n            GetAzureCredentials(_install.TenantId, _install.UseDeviceCode));\n\n        _logger.LogInformation(\"Installing netcap module...\");\n\n        var gateway = new Gateway(armClient, _logger, _install.Branch);\n        try\n        {\n            // Stop publishers\n            var found = await gateway.SelectPublisherAsync(_install.SubscriptionId,\n                false, ct).ConfigureAwait(false);\n            if (!found)\n            {\n                return;\n            }\n\n            // Create storage account or update if it already exists in the rg\n            await gateway.Storage.CreateOrUpdateAsync(ct).ConfigureAwait(false);\n            // Create container registry or update and build netcap module\n            await gateway.Netcap.CreateOrUpdateAsync(ct).ConfigureAwait(false);\n\n            // Deploy the module using manifest to device with the chosen publisher\n            await gateway.DeployNetcapModuleAsync(ct).ConfigureAwait(false);\n\n            if (!string.IsNullOrWhiteSpace(_install.OutputPath))\n            {\n                using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);\n\n                while (Console.KeyAvailable) { Console.ReadKey(); }\n                _ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); }, ct);\n                Console.WriteLine(\"Press any key to exit\");\n                Console.WriteLine();\n\n                try\n                {\n                    // Stop the logs from the module, when cancelled undeploy\n                    var downloader = gateway.GetStorage();\n                    await downloader.DownloadAsync(_install.OutputPath,\n                        cts.Token).ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { }\n                finally\n                {\n                    await gateway.RemoveNetcapModuleAsync(ct).ConfigureAwait(false);\n                }\n\n                // Merge capture files for convinience\n                foreach (var d in Directory.GetDirectories(_install.OutputPath))\n                {\n                    var merged = Path.Combine(d, \"capture.pcap\");\n                    if (!File.Exists(merged))\n                    {\n                        _logger.LogInformation(\n                            \"Merging capture files in {Directory} into {File}\", d, merged);\n                        Pcap.Merge(d, merged);\n                    }\n                }\n            }\n        }\n        catch (Exception ex)\n        {\n            _logger.LogError(\"Failed to install netcap module with error: {Error}\",\n                ex.Message);\n            throw;\n        }\n    }\n\n    /// <summary>\n    /// Uninstall\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async Task UninstallAsync(CancellationToken ct = default)\n    {\n        _uninstall ??= new UninstallOptions();\n        // Login to azure\n        var armClient = new ArmClient(GetAzureCredentials(_uninstall.TenantId,\n            _uninstall.UseDeviceCode));\n\n        _logger.LogInformation(\"Uninstalling netcap module...\");\n\n        var gateway = new Gateway(armClient, _logger);\n        try\n        {\n            // Select netcap modules\n            var found = await gateway.SelectPublisherAsync(_uninstall.SubscriptionId,\n                true, ct).ConfigureAwait(false);\n            if (!found)\n            {\n                return;\n            }\n\n            // Add guard here\n\n            // Stop storage account or update if it already exists in the rg\n            // await gateway.Storage.DeleteAsync(ct).ConfigureAwait(false);\n            // Stop container registry\n            // await gateway.NetcapException.DeleteAsync(ct).ConfigureAwait(false);\n\n            // Deploy the module using manifest to device with the chosen publisher\n            await gateway.RemoveNetcapModuleAsync(ct).ConfigureAwait(false);\n        }\n        catch (Exception ex)\n        {\n            _logger.LogError(\"Failed to uninstall netcap module with error: {Error}\",\n                ex.Message);\n            throw;\n        }\n    }\n\n    /// <summary>\n    /// Connect module to edge hub\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async ValueTask RunAsModuleAsync(CancellationToken ct = default)\n    {\n        if (string.IsNullOrWhiteSpace(_run?.PublisherRestApiKey) &&\n            string.IsNullOrWhiteSpace(_run?.PublisherRestCertificate) &&\n            string.IsNullOrWhiteSpace(_run?.PublisherRestApiEndpoint))\n        {\n            await InstallAsync(ct).ConfigureAwait(false);\n        }\n\n        _run ??= new RunOptions();\n        var moduleClient = await CreateModuleClientAsync().ConfigureAwait(false);\n        try\n        {\n            // Call the \"GetApiKey\" and \"GetServerCertificate\" methods on the publisher module\n            await moduleClient.OpenAsync(ct).ConfigureAwait(false);\n            await moduleClient.UpdateReportedPropertiesAsync(new TwinCollection\n            {\n                [\"__type__\"] = \"OpcNetcap\",\n                [\"__version__\"] = GetType().Assembly.GetVersion()\n            }, ct).ConfigureAwait(false);\n\n            var twin = await moduleClient.GetTwinAsync(ct).ConfigureAwait(false);\n\n            var deviceId = twin.DeviceId ?? Environment.GetEnvironmentVariable(\"IOTEDGE_DEVICEID\");\n            // var moduleId = twin.ModuleId ?? Environment.GetEnvironmentVariable(\"IOTEDGE_MODULEID\");\n            _run.PublisherModuleId = twin.GetProperty(nameof(_run.PublisherModuleId),\n                _run.PublisherModuleId);\n            _run.PublisherDeviceId = deviceId; // Override as we must be in the same device\n            Debug.Assert(_run.PublisherModuleId != null);\n            Debug.Assert(_run.PublisherDeviceId != null);\n\n            _run.ConfigureFromTwin(twin);\n\n            _logger.LogInformation(\n                \"Connecting to OPC Publisher Module {PublisherModuleId} on {PublisherDeviceId}...\",\n                _run.PublisherModuleId, _run.PublisherDeviceId);\n\n            if (_run.PublisherRestApiKey == null || _run.PublisherRestCertificate == null)\n            {\n                if (_run.PublisherRestApiKey == null)\n                {\n                    var apiKeyResponse = await moduleClient.InvokeMethodAsync(\n                        _run.PublisherDeviceId, _run.PublisherModuleId,\n                        new MethodRequest(\"GetApiKey\"), ct).ConfigureAwait(false);\n                    _run.PublisherRestApiKey =\n                        JsonSerializer.Deserialize<string>(apiKeyResponse.Result);\n                }\n                if (_run.PublisherRestCertificate == null)\n                {\n                    var certResponse = await moduleClient.InvokeMethodAsync(\n                        _run.PublisherDeviceId, _run.PublisherModuleId,\n                        new MethodRequest(\"GetServerCertificate\"), ct).ConfigureAwait(false);\n                    _run.PublisherRestCertificate =\n                        JsonSerializer.Deserialize<string>(certResponse.Result);\n                }\n            }\n            await CreatePublisherHttpClientAsync().ConfigureAwait(false);\n            CreateSidecarHttpClientIfRequired();\n            await RunAsync(ct).ConfigureAwait(false);\n        }\n        finally\n        {\n            await moduleClient.CloseAsync(ct).ConfigureAwait(false);\n            await moduleClient.DisposeAsync().ConfigureAwait(false);\n        }\n    }\n\n    /// <summary>\n    /// Run the side car providing the host side capture capabilities\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async Task RunAsSidecarModuleAsync(CancellationToken ct = default)\n    {\n        _sidecar ??= new SidecarOptions();\n        var moduleClient = await CreateModuleClientAsync().ConfigureAwait(false);\n        try\n        {\n            await moduleClient.OpenAsync(ct).ConfigureAwait(false);\n            await moduleClient.UpdateReportedPropertiesAsync(new TwinCollection\n            {\n                [\"__type__\"] = \"OpcNetcapSidecar\",\n                [\"__version__\"] = GetType().Assembly.GetVersion()\n            }, ct).ConfigureAwait(false);\n\n            var twin = await moduleClient.GetTwinAsync(ct).ConfigureAwait(false);\n            var cert = twin.GetProperty(\"__certificate__\", desired: false);\n            var apiKey = twin.GetProperty(\"__apikey__\", desired: false);\n            if (cert != null && apiKey != null)\n            {\n                _sidecarCertificate = X509CertificateLoader.LoadPkcs12(\n                    Convert.FromBase64String(cert.Trim()), apiKey);\n            }\n            else\n            {\n                _sidecarCertificate = CreateCertificate(twin);\n                apiKey = Guid.NewGuid().ToString();\n                cert = Convert.ToBase64String(_sidecarCertificate.Export(\n                    X509ContentType.Pfx, apiKey));\n                await moduleClient.UpdateReportedPropertiesAsync(new TwinCollection\n                {\n                    [\"__certificate__\"] = cert,\n                    [\"__apikey__\"] = apiKey\n                }, ct).ConfigureAwait(false);\n            }\n\n            var builder = WebApplication.CreateBuilder();\n            builder.WebHost.ConfigureKestrel((_, serverOptions) =>\n                serverOptions.ListenAnyIP(443,\n                    options => options.UseHttps(_sidecarCertificate)));\n\n            builder.Services.AddHttpContextAccessor();\n            builder.Services.TryAddSingleton(_sidecar);\n            builder.Services.AddLogging(builder => builder\n                .AddSimpleConsole(options => options.SingleLine = true));\n            builder.Services.AddAuthentication(nameof(ApiKeyProvider.ApiKey))\n                .AddScheme<AuthenticationSchemeOptions, ApiKeyHandler>(\n                    nameof(ApiKeyProvider.ApiKey), null);\n            builder.Services.AddAuthentication();\n\n            var app = builder.Build();\n            app.UseCors();\n            app.UseAuthentication();\n            app.UseAuthorization();\n            app.UseHttpsRedirection();\n            using var server = new Pcap.Server(app, _logger);\n            await app.RunAsync(ct).ConfigureAwait(false);\n        }\n        finally\n        {\n            if (moduleClient != null)\n            {\n                await moduleClient.CloseAsync(ct).ConfigureAwait(false);\n                await moduleClient.DisposeAsync().ConfigureAwait(false);\n            }\n        }\n\n        static X509Certificate2 CreateCertificate(Twin twin)\n        {\n            var dnsName = Dns.GetHostName();\n            using var ecdsa = ECDsa.Create();\n            var req = new CertificateRequest(\"DC=\" + dnsName, ecdsa, HashAlgorithmName.SHA256);\n            var san = new SubjectAlternativeNameBuilder();\n            san.AddDnsName(dnsName);\n            var altDns = twin?.ModuleId ?? twin?.DeviceId;\n            if (!string.IsNullOrEmpty(altDns) &&\n                !string.Equals(altDns, dnsName, StringComparison.OrdinalIgnoreCase))\n            {\n                san.AddDnsName(altDns);\n            }\n            req.CertificateExtensions.Add(san.Build());\n            var certificate = req.CreateSelfSigned(DateTimeOffset.Now,\n                DateTimeOffset.Now + TimeSpan.FromDays(90));\n            Debug.Assert(certificate.HasPrivateKey);\n            return certificate;\n        }\n    }\n\n    /// <summary>\n    /// Connect with iot hub connection string\n    /// </summary>\n    /// <param name=\"iothubConnectionString\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async ValueTask RunAsIoTHubConnectedModuleAsync(\n        string iothubConnectionString, CancellationToken ct = default)\n    {\n        // NOTE: This is for local testing against IoT Hub\n        string deviceId;\n        const string ncModuleId = \"netcap\";\n        _run ??= new RunOptions();\n        var edgeHubConnectionString = Environment.GetEnvironmentVariable(\"EdgeHubConnectionString\");\n        if (!string.IsNullOrWhiteSpace(edgeHubConnectionString))\n        {\n            // Update device and module id from edge hub connection string provided\n            var ehc = IotHubConnectionStringBuilder.Create(edgeHubConnectionString);\n            deviceId = ehc.DeviceId;\n            _run.PublisherModuleId = ehc.ModuleId ?? ncModuleId;\n        }\n        else\n        {\n            // Default device to host name just like we do it in our publisher CLI\n#pragma warning disable CA1308 // Normalize strings to uppercase\n            deviceId = Dns.GetHostName().ToLowerInvariant();\n#pragma warning restore CA1308 // Normalize strings to uppercase\n        }\n        using var rm = Microsoft.Azure.Devices.RegistryManager\n            .CreateFromConnectionString(iothubConnectionString);\n        // Create module if not exist\n        try\n        {\n            await rm.AddDeviceAsync(new Microsoft.Azure.Devices.Device(deviceId), ct)\n                .ConfigureAwait(false);\n        }\n        catch (DeviceAlreadyExistsException) { }\n        try\n        {\n            await rm.AddModuleAsync(new Microsoft.Azure.Devices.Module(\n                deviceId, ncModuleId), ct).ConfigureAwait(false);\n        }\n        catch (ModuleAlreadyExistsException) { }\n\n        var twin = await rm.GetTwinAsync(deviceId, ncModuleId, ct).ConfigureAwait(false);\n        twin = await rm.UpdateTwinAsync(deviceId, ncModuleId, new Twin\n        {\n            Properties = new TwinProperties\n            {\n                Reported = new TwinCollection\n                {\n                    [\"__type__\"] = \"OpcNetcap\",\n                    [\"__version__\"] = GetType().Assembly.GetVersion()\n                }\n            }\n        }, twin.ETag, ct).ConfigureAwait(false);\n\n        // Update publisher id from twin if not configured\n        _run.PublisherModuleId =\n            twin.GetProperty(nameof(_run.PublisherModuleId), _run.PublisherModuleId);\n        _run.PublisherDeviceId ??= deviceId;\n        Debug.Assert(_run.PublisherModuleId != null);\n        Debug.Assert(_run.PublisherDeviceId != null);\n\n        _run.ConfigureFromTwin(twin);\n\n        _logger.LogInformation(\"Connecting to OPC Publisher Module {PublisherModuleId} \" +\n            \"on {PublisherDeviceId} via IoTHub...\", _run.PublisherModuleId,\n            _run.PublisherDeviceId);\n\n        var publisherTwin = await rm.GetTwinAsync(_run.PublisherDeviceId,\n            _run.PublisherModuleId, ct).ConfigureAwait(false);\n        _run.PublisherRestApiKey\n            ??= publisherTwin.GetProperty(\"__apikey__\", desired: false);\n        _run.PublisherRestCertificate\n            ??= publisherTwin.GetProperty(\"__certificate__\", desired: false);\n        _run.PublisherIpAddresses\n            ??= publisherTwin.GetProperty(\"__ip__\", desired: false);\n        var scheme = publisherTwin.GetProperty(\"__scheme__\", desired: false);\n        var hostName = publisherTwin.GetProperty(\"__hostname__\", desired: false);\n        var port = publisherTwin.GetProperty(\"__port__\", desired: false);\n        if (hostName != null)\n        {\n            scheme ??= \"https\";\n            var url = $\"{scheme}://{hostName}\";\n            if (port != null)\n            {\n                url += $\":{port}\";\n            }\n            _run.PublisherRestApiEndpoint ??= url;\n        }\n        if (_run.PublisherRestApiKey == null || _run.PublisherRestCertificate == null)\n        {\n            using var serviceClient = Microsoft.Azure.Devices.ServiceClient\n                .CreateFromConnectionString(iothubConnectionString);\n            if (_run.PublisherRestApiKey == null)\n            {\n                var apiKeyResponse = await serviceClient.InvokeDeviceMethodAsync(\n                    _run.PublisherDeviceId, _run.PublisherModuleId,\n                    new Microsoft.Azure.Devices.CloudToDeviceMethod(\n                        \"GetApiKey\"), ct).ConfigureAwait(false);\n                _run.PublisherRestApiKey =\n                    JsonSerializer.Deserialize<string>(apiKeyResponse.GetPayloadAsJson());\n            }\n            if (_run.PublisherRestCertificate == null)\n            {\n                var certResponse = await serviceClient.InvokeDeviceMethodAsync(\n                    _run.PublisherDeviceId, _run.PublisherModuleId,\n                    new Microsoft.Azure.Devices.CloudToDeviceMethod(\n                        \"GetServerCertificate\"), ct).ConfigureAwait(false);\n                _run.PublisherRestCertificate =\n                    JsonSerializer.Deserialize<string>(certResponse.GetPayloadAsJson());\n            }\n        }\n        await CreatePublisherHttpClientAsync().ConfigureAwait(false);\n        CreateSidecarHttpClientIfRequired();\n        await RunAsync(ct).ConfigureAwait(false);\n    }\n\n    /// <summary>\n    /// Create sidecar client\n    /// </summary>\n    /// <returns></returns>\n    private void CreateSidecarHttpClientIfRequired()\n    {\n        if (_run?.HostCaptureEndpointUrl == null ||\n            _run?.HostCaptureApiKey == null ||\n            _run?.HostCaptureCertificate == null)\n        {\n            return;\n        }\n\n        var cert = Convert.FromBase64String(_run.HostCaptureCertificate.Trim());\n        _sidecarCertificate = X509CertificateLoader.LoadPkcs12(cert, _run.HostCaptureApiKey);\n\n        _sidecarHttpClient?.Dispose();\n#pragma warning disable CA2000 // Dispose objects before losing scope\n        _sidecarHttpClient = new HttpClient(new HttpClientHandler\n        {\n            ServerCertificateCustomValidationCallback = (_, cert, _, _) =>\n            {\n                if (_sidecarCertificate?.Thumbprint != cert?.Thumbprint)\n                {\n                    _logger.LogWarning(\n                        \"Certificate thumbprint mismatch: {Expected} != {Actual}\",\n                        _sidecarCertificate?.Thumbprint, cert?.Thumbprint);\n                    return false;\n                }\n                return true;\n            }\n        })\n        {\n            BaseAddress = new Uri(_run.HostCaptureEndpointUrl)\n        };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        _sidecarHttpClient.DefaultRequestHeaders.Authorization =\n            new AuthenticationHeaderValue(\"ApiKey\", _run?.HostCaptureApiKey);\n    }\n\n    /// <summary>\n    /// Create publisher client\n    /// </summary>\n    /// <returns></returns>\n    private async ValueTask CreatePublisherHttpClientAsync()\n    {\n        if (_run?.PublisherRestApiKey != null)\n        {\n            // Load the certificate of the publisher if not exist\n            if (!string.IsNullOrWhiteSpace(_run?.PublisherRestCertificate)\n                && _publisherCertificate == null)\n            {\n                try\n                {\n                    _publisherCertificate = X509Certificate2.CreateFromPem(\n                        _run.PublisherRestCertificate.Trim());\n                }\n                catch\n                {\n                    var cert = Convert.FromBase64String(\n                        _run.PublisherRestCertificate.Trim());\n                    _publisherCertificate = X509CertificateLoader.LoadPkcs12(\n                        cert!, _run.PublisherRestApiKey);\n                }\n            }\n\n            _publisherHttpClient.Dispose();\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            _publisherHttpClient = new HttpClient(new HttpClientHandler\n            {\n                ServerCertificateCustomValidationCallback = (_, cert, _, _) =>\n                {\n                    if (_publisherCertificate?.Thumbprint != cert?.Thumbprint)\n                    {\n                        _logger.LogWarning(\n                            \"Certificate thumbprint mismatch: {Expected} != {Actual}\",\n                            _publisherCertificate?.Thumbprint, cert?.Thumbprint);\n                        return false;\n                    }\n                    return true;\n                }\n            })\n            {\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                BaseAddress =\n                await GetOpcPublisherRestEndpoint().ConfigureAwait(false)\n            };\n            _publisherHttpClient.DefaultRequestHeaders.Authorization =\n                new AuthenticationHeaderValue(\"ApiKey\", _run?.PublisherRestApiKey);\n        }\n\n        /// <summary>\n        /// Publisher Endpoint\n        /// </summary>\n        async ValueTask<Uri> GetOpcPublisherRestEndpoint()\n        {\n            if (_run?.PublisherRestApiEndpoint != null &&\n                Uri.TryCreate(_run.PublisherRestApiEndpoint,\n                UriKind.Absolute, out var u))\n            {\n                return u;\n            }\n            var host = _run?.PublisherModuleId;\n            if (host != null)\n            {\n                // Poor man ping\n                try\n                {\n                    var result = await Dns.GetHostEntryAsync(host).ConfigureAwait(false);\n                    if (result.AddressList.Length == 0)\n                    {\n                        host = null;\n                    }\n                }\n                catch { host = null; }\n            }\n            host ??= \"localhost\";\n            var isLocal = host == null;\n            var uri = new UriBuilder\n            {\n                Scheme = \"https\",\n                Port = !isLocal ? 8081 : 443,\n                Host = host\n            };\n            if (_run?.PublisherRestApiKey == null)\n            {\n                uri.Scheme = \"http\";\n                uri.Port = !isLocal ? 8080 : 80;\n            }\n            return uri.Uri;\n        }\n    }\n\n    /// <summary>\n    /// Update logger\n    /// </summary>\n    private ILogger UpdateLogger()\n    {\n        _loggerFactory.Dispose();\n        _loggerFactory = LoggerFactory.Create(builder => builder\n            .AddSimpleConsole(options => options.SingleLine = true));\n        return _loggerFactory.CreateLogger(\"Netcap\");\n    }\n\n    /// <summary>\n    /// Create module client\n    /// </summary>\n    /// <returns></returns>\n    private static async ValueTask<ModuleClient> CreateModuleClientAsync()\n    {\n        var edgeHubConnectionString = Environment.GetEnvironmentVariable(\"EdgeHubConnectionString\");\n        if (!string.IsNullOrWhiteSpace(edgeHubConnectionString))\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return ModuleClient.CreateFromConnectionString(edgeHubConnectionString);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n        return await ModuleClient.CreateFromEnvironmentAsync().ConfigureAwait(false);\n    }\n\n    /// <summary>\n    /// Injected apikey\n    /// </summary>\n    /// <param name=\"ApiKey\"></param>\n    public sealed record class ApiKeyProvider(string ApiKey);\n\n    /// <summary>\n    /// Api key authentication handler\n    /// </summary>\n    /// <remarks>\n    /// Create authentication handler\n    /// </remarks>\n    /// <param name=\"options\"></param>\n    /// <param name=\"logger\"></param>\n    /// <param name=\"encoder\"></param>\n    /// <param name=\"context\"></param>\n    /// <param name=\"apiKeyProvider\"></param>\n    internal sealed class ApiKeyHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,\n        ILoggerFactory logger, UrlEncoder encoder, IHttpContextAccessor context,\n            App.ApiKeyProvider apiKeyProvider) :\n        AuthenticationHandler<AuthenticationSchemeOptions>(options, logger, encoder)\n    {\n        public const string SchemeName = \"ApiKey\";\n\n        /// <inheritdoc/>\n        protected override Task<AuthenticateResult> HandleAuthenticateAsync()\n        {\n            var httpContext = _context.HttpContext;\n            if (httpContext == null)\n            {\n                return Task.FromResult(AuthenticateResult.Fail(\n                    \"No request.\"));\n            }\n\n            var authorization = httpContext.Request.Headers.Authorization;\n            if (authorization.Count == 0 || string.IsNullOrEmpty(authorization[0]))\n            {\n                return Task.FromResult(AuthenticateResult.Fail(\n                    \"Missing Authorization header.\"));\n            }\n            try\n            {\n                var header = AuthenticationHeaderValue.Parse(authorization[0]!);\n                if (header.Scheme != nameof(ApiKeyProvider.ApiKey))\n                {\n                    return Task.FromResult(AuthenticateResult.NoResult());\n                }\n\n                if (_apiKeyProvider.ApiKey != header.Parameter?.Trim())\n                {\n                    throw new UnauthorizedAccessException();\n                }\n\n                var claims = new[]\n                {\n                    new Claim(ClaimTypes.NameIdentifier, nameof(ApiKeyProvider.ApiKey))\n                };\n\n                var identity = new ClaimsIdentity(claims, Scheme.Name);\n                var principal = new ClaimsPrincipal(identity);\n                var ticket = new AuthenticationTicket(principal, Scheme.Name);\n                return Task.FromResult(AuthenticateResult.Success(ticket));\n            }\n            catch (Exception ex)\n            {\n                return Task.FromResult(AuthenticateResult.Fail(ex));\n            }\n        }\n\n        private readonly IHttpContextAccessor _context = context;\n        private readonly ApiKeyProvider _apiKeyProvider = apiKeyProvider;\n    }\n\n    private static TokenCredential GetAzureCredentials(string? tenantId,\n        bool useDeviceCode = false)\n    {\n        if (useDeviceCode)\n        {\n            return new DeviceCodeCredential(new DeviceCodeCredentialOptions\n            {\n                TenantId = tenantId\n            });\n        }\n        return new DefaultAzureCredential(\n            new DefaultAzureCredentialOptions\n            {\n                TenantId = tenantId\n            });\n    }\n\n    private HttpClient _publisherHttpClient;\n    private X509Certificate2? _publisherCertificate;\n    private HttpClient? _sidecarHttpClient;\n    private X509Certificate2? _sidecarCertificate;\n    private ILoggerFactory _loggerFactory = null!;\n    private ILogger _logger;\n    private InstallOptions? _install;\n    private UninstallOptions? _uninstall;\n    private RunOptions? _run;\n    private SidecarOptions? _sidecar;\n}\n"
  },
  {
    "path": "samples/Netcap/src/Netcap.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <ServerGarbageCollection>true</ServerGarbageCollection>\n    <TieredPGO>true</TieredPGO>\n  </PropertyGroup>\n  <PropertyGroup>\n    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>\n    <DockerfileContext>.</DockerfileContext>\n  </PropertyGroup>\n  <ItemGroup>\n    <ProjectCapability Include=\"AzureIoTEdgeModule\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Azure.ResourceManager.ContainerRegistry\" Version=\"1.3.1\" />\n    <PackageReference Include=\"Azure.ResourceManager.IotHub\" Version=\"1.1.1\" />\n    <PackageReference Include=\"Azure.ResourceManager.Storage\" Version=\"1.4.4\" />\n    <PackageReference Include=\"Azure.Storage.Blobs\" Version=\"12.25.0\" />\n    <PackageReference Include=\"Azure.Storage.Queues\" Version=\"12.23.0\" />\n    <PackageReference Include=\"CommandLineParser\" Version=\"2.9.1\" />\n    <PackageReference Include=\"Azure.Identity\" Version=\"1.16.0\" />\n    <PackageReference Include=\"Azure.Core\" Version=\"1.48.0\" />\n    <PackageReference Include=\"Microsoft.Azure.Devices\" Version=\"1.40.0\" />\n    <PackageReference Include=\"Microsoft.Azure.Devices.Client\" Version=\"1.42.3\" />\n    <PackageReference Include=\"Microsoft.Extensions.Logging.Console\" Version=\"9.0.9\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Azure.Containers.Tools.Targets\" Version=\"1.22.1\" />\n    <PackageReference Include=\"SharpPcap\" Version=\"6.3.1\" />\n    <PackageReference Include=\"System.Linq.Async\" Version=\"6.0.3\" />\n    <PackageReference Include=\"System.Text.Json\" Version=\"9.0.9\" />\n    <PackageReference Include=\"System.Private.Uri\" Version=\"4.3.2\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "samples/Netcap/src/Pcap.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Netcap;\n\nusing SharpPcap;\nusing SharpPcap.LibPcap;\nusing Microsoft.Extensions.Logging;\nusing PacketDotNet;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Diagnostics;\nusing System;\nusing System.Threading.Channels;\nusing System.Collections.Concurrent;\n\ninternal abstract class Pcap\n{\n    /// <summary>\n    /// Pcap configuration\n    /// </summary>\n    /// <param name=\"InterfaceType\"></param>\n    /// <param name=\"Filter\"></param>\n    /// <param name=\"MaxFileSize\"></param>\n    /// <param name=\"MaxDuration\"></param>\n    public sealed record class CaptureConfiguration(\n        InterfaceType InterfaceType, string? Filter = null,\n        int? MaxFileSize = null, TimeSpan? MaxDuration = null);\n\n    public enum InterfaceType\n    {\n        AnyIfAvailable,\n        AllButAny,\n        EthernetOnly\n    }\n\n    /// <summary>\n    /// Local\n    /// </summary>\n    /// <param name=\"configuration\"></param>\n    /// <param name=\"storage\"></param>\n    /// <param name=\"logger\"></param>\n    /// <param name=\"httpClient\"></param>\n    /// <returns></returns>\n    public static IDisposable Capture(CaptureConfiguration configuration,\n        Storage storage, ILogger logger, HttpClient? httpClient = null)\n    {\n        if (httpClient == null)\n        {\n            return new Local(logger, configuration, storage);\n        }\n        return new Remote(logger, configuration, storage, httpClient);\n    }\n\n    /// <summary>\n    /// Merge files\n    /// </summary>\n    /// <param name=\"folder\"></param>\n    /// <param name=\"outputFile\"></param>\n    public static void Merge(string folder, string outputFile)\n    {\n        if (File.Exists(outputFile))\n        {\n            File.Delete(outputFile);\n        }\n        var files = Directory.GetFiles(folder, \"*.pcap\");\n        if (files.Length == 0)\n        {\n            return;\n        }\n        using var writer = new CaptureFileWriterDevice(outputFile);\n        foreach (var file in files.Order())\n        {\n            using var reader = new CaptureFileReaderDevice(file);\n            reader.Open();\n            if (!writer.Opened)\n            {\n                writer.Open(new DeviceConfiguration\n                {\n                    LinkLayerType = reader.LinkType\n                });\n            }\n            while (reader.GetNextPacket(out var packet)\n                == GetPacketStatus.PacketRead)\n            {\n                writer.Write(packet.GetPacket());\n            }\n        }\n    }\n\n    /// <summary>\n    /// Get file path\n    /// </summary>\n    /// <param name=\"folder\"></param>\n    /// <param name=\"index\"></param>\n    /// <returns></returns>\n    private static string GetFilePath(string folder, int index)\n    {\n        return Path.Combine(folder, $\"capture{index}.pcap\");\n    }\n\n    /// <summary>\n    /// Pcap capture\n    /// </summary>\n    internal abstract class Base : IDisposable\n    {\n        /// <summary>\n        /// Handle\n        /// </summary>\n        public int Handle { get; }\n\n        /// <summary>\n        /// Reader\n        /// </summary>\n        protected ChannelReader<int> Reader => _channel.Reader;\n\n        /// <summary>\n        /// Create pcap\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"configuration\"></param>\n        protected Base(ILogger logger, CaptureConfiguration configuration)\n        {\n            _logger = logger;\n            _configuration = configuration;\n            _folder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());\n            Directory.CreateDirectory(_folder);\n            _maxPcapSize =  configuration.MaxFileSize ?? kMaxPcapSize;\n            _maxPcapDuration = configuration.MaxDuration.HasValue ?\n                (long)configuration.MaxDuration.Value.TotalMilliseconds : kMaxPcapDuration;\n            _channel = Channel.CreateUnbounded<int>();\n\n            Handle = Interlocked.Increment(ref _handles);\n            _logger.LogInformation(\n                \"Using SharpPcap {Version}\", SharpPcap.Pcap.SharpPcapVersion);\n\n            if (LibPcapLiveDeviceList.Instance.Count == 0)\n            {\n                throw new NetcapException(\"Cannot run capture without devices.\");\n            }\n\n            _devices = [.. LibPcapLiveDeviceList.New()];\n\n            // Open devices\n            var open = _devices\n                .Where(d =>\n                {\n                    try\n                    {\n                        _logger.LogInformation(\"Opening {Device} in promiscuous mode...\", d);\n                        d.Open(mode: DeviceModes.Promiscuous, 1000);\n                    }\n                    catch\n                    {\n                        try\n                        {\n                            _logger.LogInformation(\"Fall back to normal mode...\");\n                            d.Open(mode: DeviceModes.None, 1000);\n                        }\n                        catch (Exception ex2)\n                        {\n                            _logger.LogInformation(\n                                \"Failed to open {Device} ({Description}): {Message}\",\n                                d.Name, d.Description, ex2.Message);\n                        }\n                    }\n                    return d.Opened;\n                })\n                .ToList();\n\n            var capturing = Array.Empty<LibPcapLiveDevice>();\n            var linkType = PacketDotNet.LinkLayers.Null;\n            var itf = _configuration.InterfaceType;\n            if (itf == InterfaceType.AnyIfAvailable)\n            {\n                // Try to capture from cooked mode (https://wiki.wireshark.org/SLL)\n                linkType = PacketDotNet.LinkLayers.LinuxSll;\n                capturing = Capture(open.Where(d => d.LinkType == linkType));\n                if (capturing.Length == 0)\n                {\n                    itf = InterfaceType.AllButAny;\n                }\n            }\n            if (itf == InterfaceType.EthernetOnly)\n            {\n                linkType = PacketDotNet.LinkLayers.Ethernet;\n                capturing = Capture(open.Where(d => d.LinkType != linkType));\n                if (capturing.Length == 0)\n                {\n                    itf = InterfaceType.AllButAny;\n                }\n            }\n            if (itf == InterfaceType.AllButAny)\n            {\n                linkType = PacketDotNet.LinkLayers.Null;\n                capturing = Capture(open.Where(d =>\n                    d.LinkType != PacketDotNet.LinkLayers.LinuxSll));\n            }\n\n            if (capturing.Length == 0)\n            {\n                // Base from all interfaces that are open\n                linkType = PacketDotNet.LinkLayers.Null;\n                capturing = Capture(open);\n            }\n\n            _linkType = linkType;\n            _writer = CreateWriter(_index);\n\n            if (capturing.Length != 0)\n            {\n                foreach (var device in capturing)\n                {\n                    device.StartCapture();\n                    _logger.LogInformation(\"Capturing {Device} ({Description})...\",\n                        device.Name, device.Description);\n                }\n                _logger.LogInformation(\"    ... with {Filter}.\",\n                    _configuration.Filter ?? \"No filter\");\n                _captureWatch.Start();\n            }\n            else\n            {\n                _logger.LogWarning(\"No capture devices found to capture from.\");\n            }\n\n            LibPcapLiveDevice[] Capture(IEnumerable<LibPcapLiveDevice> candidates)\n            {\n                var capturing = new List<LibPcapLiveDevice>();\n                foreach (var device in candidates)\n                {\n                    try\n                    {\n                        // Open the device for capturing\n                        Debug.Assert(device.Opened);\n                        if (_configuration.Filter != null)\n                        {\n                            device.Filter = _configuration.Filter;\n                        }\n                        device.OnPacketArrival += WritePacket;\n                        capturing.Add(device);\n                    }\n                    catch (Exception ex)\n                    {\n                        _logger.LogError(\n                            \"Failed to capture {Device} ({Description}): {Message}\",\n                            device.Name, device.Description, ex.Message);\n                    }\n                }\n                return [.. capturing];\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Dispose\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                try\n                {\n                    StopCapture();\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Failed to complete capture.\");\n                }\n                finally\n                {\n                    _writer.Dispose();\n                    Directory.Delete(_folder, true);\n                }\n            }\n        }\n\n        /// <summary>\n        /// StopCapture\n        /// </summary>\n        protected void StopCapture()\n        {\n            if (_devices != null)\n            {\n                _devices.ForEach(d =>\n                {\n                    try\n                    {\n                        d.StopCapture();\n                        _logger.LogInformation(\n                            \"Capturing {Description} completed. ({Statistics}).\",\n                            d.Description, d.Statistics.ToString());\n                    }\n                    catch { }\n                });\n                _devices.ForEach(d => d.Dispose());\n                _logger.LogInformation(\"Completed capture.\");\n                _devices = null;\n\n                if (_captureCount > 0)\n                {\n                    _writer.Close();\n                    _captureCount = 0;\n\n                    _channel.Writer.TryWrite(_index);\n                    _channel.Writer.TryComplete();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Callback to write packet\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void WritePacket(object sender, PacketCapture e)\n        {\n            var pkt = e.GetPacket();\n            _captureCount += pkt.PacketLength;\n            if (_captureCount >= _maxPcapSize ||\n                _captureWatch.ElapsedMilliseconds > kMaxPcapDuration)\n            {\n                UpdateWriter();\n            }\n            _writer.Write(pkt);\n        }\n\n        /// <summary>\n        /// Locked update of writer\n        /// </summary>\n        private void UpdateWriter()\n        {\n            lock (_lock)\n            {\n                if (_captureCount >= _maxPcapSize ||\n                    _captureWatch.ElapsedMilliseconds > kMaxPcapDuration)\n                {\n                    var finished = _index;\n                    _writer.Dispose();\n                    _writer = CreateWriter(_index + 1);\n\n                    _index++;\n                    _captureCount = 0;\n                    _captureWatch.Restart();\n\n                    _channel.Writer.TryWrite(finished);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create next writer\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        private CaptureFileWriterDevice CreateWriter(int index)\n        {\n            var writer = new CaptureFileWriterDevice(GetFilePath(_folder, index));\n            writer.Open(new DeviceConfiguration\n            {\n                LinkLayerType = _linkType\n            });\n            return writer;\n        }\n\n        /// <summary> 100MB </summary>\n        private const long kMaxPcapSize = 100 * 1024 * 1024;\n        /// <summary> 5 minutes </summary>\n        private const long kMaxPcapDuration = 5 * 60 * 1000;\n        private static int _handles;\n        private int _index;\n        private long _captureCount;\n        private readonly Stopwatch _captureWatch = new ();\n        private readonly Lock _lock = new();\n        private readonly CaptureConfiguration _configuration;\n        private List<LibPcapLiveDevice>? _devices;\n        private CaptureFileWriterDevice _writer;\n        private readonly long _maxPcapSize;\n        private readonly long _maxPcapDuration;\n        private readonly Channel<int> _channel;\n        private readonly LinkLayers _linkType;\n        protected readonly string _folder;\n        protected readonly ILogger _logger;\n    }\n\n    /// <summary>\n    /// Local capture\n    /// </summary>\n    internal sealed class Local : Base\n    {\n        /// <summary>\n        /// Handle local capture\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"storage\"></param>\n        public Local(ILogger logger, CaptureConfiguration configuration,\n            Storage storage)\n            : base(logger, configuration)\n        {\n            _storage = storage;\n            _runner = RunAsync();\n        }\n\n        /// <inheritdoc/>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                StopCapture();\n                try\n                {\n                    // Will exit after stop capture as channel is completed\n                    _runner.GetAwaiter().GetResult();\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Failed to stop capture.\");\n                }\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Service the file handler\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task RunAsync(CancellationToken ct = default)\n        {\n            await foreach (var index in Reader.ReadAllAsync(ct).ConfigureAwait(false))\n            {\n                var file = GetFilePath(_folder, index);\n                await _storage.UploadAsync(file, ct).ConfigureAwait(false);\n                File.Delete(file);\n            }\n        }\n\n        private readonly Storage _storage;\n        private readonly Task _runner;\n    }\n\n    /// <summary>\n    /// Remote client\n    /// </summary>\n    private sealed class Remote : IDisposable\n    {\n        /// <summary>\n        /// Create client\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"storage\"></param>\n        /// <param name=\"client\"></param>\n        public Remote(ILogger logger, CaptureConfiguration configuration,\n            Storage storage, HttpClient client)\n        {\n            _logger = logger;\n            _folder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());\n            Directory.CreateDirectory(_folder);\n            _client = client;\n            _storage = storage;\n            _handle = StartAsync(configuration).GetAwaiter().GetResult();\n            _cts = new CancellationTokenSource();\n            _runner = RunAsync(_cts.Token);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            try\n            {\n                StopAsync().GetAwaiter().GetResult();\n\n                _cts.Cancel();\n                _runner.GetAwaiter().GetResult();\n            }\n            catch (OperationCanceledException) { }\n            catch (Exception ex)\n            {\n                _logger.LogError(ex, \"Failed to stop\");\n            }\n            finally\n            {\n                _cts.Dispose();\n                Directory.Delete(_folder, true);\n            }\n        }\n\n        /// <summary>\n        /// Start\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"ct\"></param>\n        private async Task<int> StartAsync(CaptureConfiguration configuration,\n            CancellationToken ct = default)\n        {\n            var response = await _client.PutAsJsonAsync(\"/\", configuration,\n                ct).ConfigureAwait(false);\n            response.EnsureSuccessStatusCode();\n            return await response.Content.ReadFromJsonAsync<int>(\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Service the file handler\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task RunAsync(CancellationToken ct)\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                try\n                {\n                    await foreach (var index in _client\n                        .GetFromJsonAsAsyncEnumerable<int>(new Uri($\"/{_handle}\"), ct).ConfigureAwait(false))\n                    {\n                        var s = await _client.GetStreamAsync(new Uri($\"/{_handle}/{index}\"),\n                            ct).ConfigureAwait(false);\n\n                        var file = GetFilePath(_folder, index);\n                        var f = System.IO.File.Create(file);\n                        await using var sd = s.ConfigureAwait(false);\n                        await using var fd = f.ConfigureAwait(false);\n                        await s.CopyToAsync(f, ct).ConfigureAwait(false);\n\n                        await _storage.UploadAsync(file, ct).ConfigureAwait(false);\n                        File.Delete(file);\n                    }\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Failed to download.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Stop\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public async Task StopAsync(CancellationToken ct = default)\n        {\n            var response = await _client.DeleteAsync(new Uri($\"/{_handle}\"),\n                ct).ConfigureAwait(false);\n            response.EnsureSuccessStatusCode();\n        }\n\n        private readonly int _handle;\n        private readonly HttpClient _client;\n        private readonly CancellationTokenSource _cts;\n        private readonly Storage _storage;\n        private readonly Task _runner;\n        private readonly ILogger _logger;\n        private readonly string _folder;\n    }\n\n    /// <summary>\n    /// Remote capture server\n    /// </summary>\n    public sealed record Server : IDisposable\n    {\n        /// <summary>\n        /// Create server\n        /// </summary>\n        /// <param name=\"app\"></param>\n        /// <param name=\"logger\"></param>\n        public Server(WebApplication app, ILogger logger)\n        {\n            _logger = logger;\n\n            app.MapPut(\"/\", Start)\n                .RequireAuthorization(nameof(App.ApiKeyProvider.ApiKey))\n                .Produces(StatusCodes.Status200OK)\n                .Produces(StatusCodes.Status404NotFound);\n            app.MapGet(\"/{handle}\", WaitAsync)\n                .RequireAuthorization(nameof(App.ApiKeyProvider.ApiKey))\n                .Produces(StatusCodes.Status200OK)\n                .Produces(StatusCodes.Status404NotFound);\n            app.MapGet(\"/{handle}/{index}\", Download)\n                .RequireAuthorization(nameof(App.ApiKeyProvider.ApiKey))\n                .Produces(StatusCodes.Status200OK)\n                .Produces(StatusCodes.Status404NotFound);\n            app.MapDelete(\"/{handle}\", Stop)\n                .RequireAuthorization(nameof(App.ApiKeyProvider.ApiKey))\n                .Produces(StatusCodes.Status200OK)\n                .Produces(StatusCodes.Status404NotFound);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            foreach (var capture in _captures.Values)\n            {\n                capture.Dispose();\n            }\n            _captures.Clear();\n        }\n\n        /// <summary>\n        /// Start\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        internal int Start(CaptureConfiguration configuration)\n        {\n            var pcap = new CaptureAdapter(_logger, configuration);\n            _captures.TryAdd(pcap.Handle, pcap);\n            return pcap.Handle;\n        }\n\n        /// <summary>\n        /// Read next index to download\n        /// </summary>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NetcapException\"></exception>\n        internal IAsyncEnumerable<int> WaitAsync(int handle,\n            CancellationToken ct = default)\n        {\n            if (!_captures.TryGetValue(handle, out var capture))\n            {\n                throw new NetcapException(\"Capture not found\");\n            }\n            return capture.ReadAllAsync(ct);\n        }\n\n        /// <summary>\n        /// Download\n        /// </summary>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NetcapException\"></exception>\n        internal IResult Download(int handle, int index)\n        {\n            if (!_captures.TryGetValue(handle, out var capture))\n            {\n                throw new NetcapException(\"Capture not found\");\n            }\n            return capture.Download(index);\n        }\n\n        /// <summary>\n        /// get metadata and cleanup\n        /// </summary>\n        /// <param name=\"handle\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NetcapException\"></exception>\n        internal void Stop(int handle)\n        {\n            if (!_captures.TryRemove(handle, out var capture))\n            {\n                throw new NetcapException(\"Capture not found\");\n            }\n            capture.Dispose();\n        }\n\n        /// <summary>\n        /// Remote capture\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"configuration\"></param>\n        private sealed class CaptureAdapter(ILogger logger,\n            Pcap.CaptureConfiguration configuration) : Base(logger, configuration)\n        {\n            /// <summary>\n            /// Download\n            /// </summary>\n            /// <param name=\"index\"></param>\n            /// <returns></returns>\n            public IResult Download(int index)\n            {\n                if (index > 0)\n                {\n                    // Clean up previous file\n                    File.Delete(GetFilePath(_folder, index - 1));\n                }\n                return Results.File(GetFilePath(_folder, index));\n            }\n\n            /// <summary>\n            /// Read indexes\n            /// </summary>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            public IAsyncEnumerable<int> ReadAllAsync(CancellationToken ct = default)\n            {\n                return Reader.ReadAllAsync(ct);\n            }\n        }\n\n        private readonly ConcurrentDictionary<int, CaptureAdapter> _captures = new();\n        private readonly ILogger _logger;\n    }\n}\n"
  },
  {
    "path": "samples/Netcap/src/Program.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing Netcap;\n\nusing var cts = new CancellationTokenSource();\n\nConsole.WriteLine($@\"\n   ____  _____   _____   _   _      _\n  / __ \\|  __ \\ / ____| | \\ | |    | |\n | |  | | |__) | |      |  \\| | ___| |_ ___ __ _ _ __\n | |  | |  ___/| |      | . ` |/ _ \\ __/ __/ _` | '_ \\\n | |__| | |    | |____  | |\\  |  __/ || (_| (_| | |_) |\n  \\____/|_|     \\_____| |_| \\_|\\___|\\__\\___\\__,_| .__/\n                                                | |\n                                                |_| {typeof(Extensions).Assembly.GetVersion()}\n\");\n\nusing var cmdLine = await App.RunAsync(args, cts.Token).ConfigureAwait(false);\n"
  },
  {
    "path": "samples/Netcap/src/Publisher.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Netcap;\n\nusing Microsoft.Extensions.Logging;\nusing System.Net;\nusing System.Net.Http;\nusing System.Net.Http.Json;\nusing System.Text.Json;\n\n/// <summary>\n/// Publisher interaction\n/// </summary>\ninternal sealed class Publisher : IDisposable\n{\n    /// <summary>\n    /// Endpoint urls\n    /// </summary>\n    public HashSet<string> Endpoints { get; } = [];\n\n    /// <summary>\n    /// Addresses of the publisher on the network\n    /// </summary>\n    public HashSet<IPAddress> Addresses { get; } = [];\n\n    /// <summary>\n    /// Create publisher\n    /// </summary>\n    /// <param name=\"httpClient\"></param>\n    /// <param name=\"publisherIpAddresses\"></param>\n    /// <param name=\"logger\"></param>\n    public Publisher(HttpClient httpClient, string? publisherIpAddresses, ILogger logger)\n    {\n        _logger = logger;\n        _httpClient = httpClient;\n        _folder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());\n        Directory.CreateDirectory(_folder);\n\n        if (!string.IsNullOrWhiteSpace(publisherIpAddresses))\n        {\n            foreach (var address in publisherIpAddresses.Split(',',\n                StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))\n            {\n                if (IPAddress.TryParse(address, out var ip))\n                {\n                    Addresses.Add(ip);\n                }\n            }\n        }\n    }\n\n    /// <inheritdoc>\n    public void Dispose()\n    {\n        Directory.Delete(_folder, true);\n    }\n\n    /// <summary>\n    /// Collect traces\n    /// </summary>\n    /// <param name=\"itf\"></param>\n    /// <param name=\"maxPcapFileSize\"></param>\n    /// <param name=\"maxPcapDuration\"></param>\n    /// <returns></returns>\n    public Pcap.CaptureConfiguration GetCaptureConfiguration(\n        Pcap.InterfaceType itf = Pcap.InterfaceType.AnyIfAvailable,\n        int? maxPcapFileSize = null, TimeSpan? maxPcapDuration = null)\n    {\n        // Base filter\n        // https://www.wireshark.org/docs/man-pages/pcap-filter.html\n        // src or dst host 192.168.80.2\n        // \"ip and tcp and not port 80 and not port 25\";\n        // TODO: Filter on src/dst of publisher ip\n        var addresses = Addresses\n            .Where(a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)\n            .ToList();\n        if (addresses.Count == 0)\n        {\n            return new Pcap.CaptureConfiguration(itf, \"ip and tcp\",\n                maxPcapFileSize, maxPcapDuration);\n        }\n        var filter = \"src or dst host \" + ((addresses.Count == 1) ? addresses[0] :\n            (\"(\" + string.Join(\" or \", addresses.Select(a => $\"{a}\")) + \")\"));\n\n        return new Pcap.CaptureConfiguration(itf, filter, maxPcapFileSize, maxPcapDuration);\n    }\n\n    /// <summary>\n    /// Monitor publisher\n    /// </summary>\n    /// <param name=\"storage\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public async ValueTask UploadChannelLogsAsync(Storage storage, CancellationToken ct = default)\n    {\n        while (!ct.IsCancellationRequested)\n        {\n            // Watch session diagnostics while we capture\n            try\n            {\n                _logger.LogInformation(\"Monitoring channels at {Url}...\", _httpClient.BaseAddress);\n                await foreach (var diagnostic in _httpClient.GetFromJsonAsAsyncEnumerable<JsonElement>(\n                    \"v2/diagnostics/channels/watch\",\n                        cancellationToken: ct).ConfigureAwait(false))\n                {\n                    try\n                    {\n                        await UploadSessionKeysFromDiagnosticsAsync(storage,\n                            diagnostic, ct).ConfigureAwait(false);\n                    }\n                    catch (OperationCanceledException) { }\n                    catch (Exception ex)\n                    {\n                        _logger.LogError(ex, \"Error uploading session keys.\");\n                    }\n                }\n                _logger.LogInformation(\"Restart monitoring channel diagnostics...\");\n            }\n            catch (OperationCanceledException) { } // Done\n            catch (Exception ex)\n            {\n                _logger.LogError(ex, \"Error monitoring channel diagnostics - restarting...\");\n            }\n        }\n    }\n\n    /// <summary>\n    /// Try update the endpoints and addresses from the publisher.\n    /// </summary>\n    /// <param name=\"storage\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public async ValueTask<bool> TryUploadEndpointsAsync(Storage storage,\n        CancellationToken ct = default)\n    {\n        try\n        {\n            _logger.LogInformation(\"Retrieving endpoints from publisher on {Url}...\",\n                _httpClient.BaseAddress);\n\n            // Stop and endpoint url to monitor if not set\n            var configuration = await _httpClient.GetFromJsonAsync<JsonElement>(\n                \"v2/configuration?includeNodes=true\",\n                JsonSerializerOptions.Default, ct).ConfigureAwait(false);\n            var pnJson = JsonSerializer.Serialize(configuration, Extensions.Indented);\n            foreach (var endpoint in configuration.GetProperty(\"endpoints\").EnumerateArray())\n            {\n                var endpointUrl = endpoint.GetProperty(\"EndpointUrl\").GetString();\n                if (!string.IsNullOrWhiteSpace(endpointUrl))\n                {\n                    Endpoints.Add(endpointUrl);\n                }\n            }\n\n            if (Endpoints.Count == 0)\n            {\n                _logger.LogInformation(\"No endpoints found in configuration - waiting....\");\n                return false;\n            }\n            _logger.LogInformation(\"Retrieved {Count} endpoints from publisher.\",\n                Endpoints.Count);\n\n            var pnJsonFile = Path.Combine(_folder, \"pn.json\");\n            await File.WriteAllTextAsync(pnJsonFile, pnJson, ct).ConfigureAwait(false);\n            await storage.UploadAsync(pnJsonFile, ct).ConfigureAwait(false);\n            return true;\n        }\n        catch (OperationCanceledException) { }\n        catch (Exception ex)\n        {\n            _logger.LogError(ex, \"Failed to update endpoints from publisher.\");\n        }\n        return false;\n    }\n\n    /// <summary>\n    /// Upload session keys to storage from publisher diagnostics\n    /// </summary>\n    /// <param name=\"storage\"></param>\n    /// <param name=\"diagnostic\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async Task UploadSessionKeysFromDiagnosticsAsync(Storage storage,\n        JsonElement diagnostic, CancellationToken ct = default)\n    {\n        var diagnosticJson = JsonSerializer.Serialize(diagnostic, Extensions.Indented);\n\n        if (diagnostic.TryGetProperty(\"connection\", out var conn) &&\n            conn.TryGetProperty(\"endpoint\", out var ep) &&\n            ep.TryGetProperty(\"url\", out _) &&\n            diagnostic.TryGetProperty(\"sessionCreated\", out var sessionCreatedToken) &&\n            sessionCreatedToken.TryGetDateTimeOffset(out var sessionCreated) &&\n            diagnostic.TryGetProperty(\"sessionId\", out var sessionId) &&\n            sessionId.GetString() != null &&\n            diagnostic.TryGetProperty(\"remotePort\", out var remotePortToken) &&\n            remotePortToken.TryGetInt32(out var remotePort))\n        {\n            var name = Extensions.FixFileName(sessionId.GetString() + sessionCreated);\n            var filePath = Path.Combine(_folder, $\"{remotePort}_{name}\");\n\n            var logFile = filePath + \".log\";\n            await File.AppendAllTextAsync(logFile, diagnosticJson, ct)\n                .ConfigureAwait(false);\n            await storage.UploadAsync(logFile, ct).ConfigureAwait(false);\n\n            if (diagnostic.TryGetProperty(\"channelId\", out var channelIdToken) &&\n                channelIdToken.TryGetUInt32(out var channelId) &&\n                diagnostic.TryGetProperty(\"tokenId\", out var tokenIdToken) &&\n                tokenIdToken.TryGetUInt32(out var tokenId) &&\n                diagnostic.TryGetProperty(\"client\", out var clientToken) &&\n                clientToken.TryGetProperty(\"iv\", out var clientIvToken) &&\n                clientIvToken.TryGetBytes(out var clientIv) &&\n                clientToken.TryGetProperty(\"key\", out var clientKeyToken) &&\n                clientKeyToken.TryGetBytes(out var clientKey) &&\n                clientToken.TryGetProperty(\"sigLen\", out var clientSigLenToken) &&\n                clientSigLenToken.TryGetInt32(out var clientSigLen) &&\n                diagnostic.TryGetProperty(\"server\", out var serverToken) &&\n                serverToken.TryGetProperty(\"iv\", out var serverIvToken) &&\n                serverIvToken.TryGetBytes(out var serverIv) &&\n                serverToken.TryGetProperty(\"key\", out var serverKeyToken) &&\n                serverKeyToken.TryGetBytes(out var serverKey) &&\n                serverToken.TryGetProperty(\"sigLen\", out var serverSigLenToken) &&\n                serverSigLenToken.TryGetInt32(out var serverSigLen))\n            {\n                // Add session keys to the endpoint capture\n                _logger.LogInformation(\n                    \"Logging session keys for channel {ChannelId} token {TokenId}\",\n                    channelId, tokenId);\n\n                var keyFile = filePath + \".txt\";\n                await AddSessionKeysAsync(keyFile, channelId,\n                    tokenId, clientIv, clientKey, clientSigLen, serverIv, serverKey,\n                    serverSigLen, ct).ConfigureAwait(false);\n                await storage.UploadAsync(keyFile, ct).ConfigureAwait(false);\n\n                static async ValueTask AddSessionKeysAsync(string fileName, uint channelId,\n                     uint tokenId, byte[] clientIv, byte[] clientKey, int clientSigLen,\n                     byte[] serverIv, byte[] serverKey, int serverSigLen,\n                     CancellationToken ct = default)\n                {\n                    var keysets = File.AppendText(fileName);\n                    await using var _ = keysets.ConfigureAwait(false);\n                    await keysets.WriteLineAsync(\n$\"client_iv_{channelId}_{tokenId}: {Convert.ToHexString(clientIv)}\").ConfigureAwait(false);\n                    await keysets.WriteLineAsync(\n$\"client_key_{channelId}_{tokenId}: {Convert.ToHexString(clientKey)}\").ConfigureAwait(false);\n                    await keysets.WriteLineAsync(\n$\"client_siglen_{channelId}_{tokenId}: {clientSigLen}\").ConfigureAwait(false);\n                    await keysets.WriteLineAsync(\n$\"server_iv_{channelId}_{tokenId}: {Convert.ToHexString(serverIv)}\").ConfigureAwait(false);\n                    await keysets.WriteLineAsync(\n$\"server_key_{channelId}_{tokenId}: {Convert.ToHexString(serverKey)}\").ConfigureAwait(false);\n                    await keysets.WriteLineAsync(\n$\"server_siglen_{channelId}_{tokenId}: {serverSigLen}\").ConfigureAwait(false);\n\n                    await keysets.FlushAsync(ct).ConfigureAwait(false);\n                }\n            }\n            else\n            {\n                _logger.LogInformation(\"No key information logged.\");\n            }\n        }\n        else\n        {\n            _logger.LogInformation(\"Received invalid diagnostic: {Diagnostic}\",\n                diagnosticJson);\n        }\n    }\n\n    private readonly ILogger _logger;\n    private readonly HttpClient _httpClient;\n    private readonly string _folder;\n}\n"
  },
  {
    "path": "samples/Netcap/src/Storage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Netcap;\n\nusing Azure;\nusing Azure.Storage.Blobs;\nusing Azure.Storage.Queues;\nusing Azure.Storage.Blobs.Models;\nusing Microsoft.Extensions.Logging;\nusing System.Text.Json;\nusing System.IO;\nusing System.Globalization;\nusing System;\nusing Azure.Storage;\n\n/// <summary>\n/// Upload and download files\n/// </summary>\n/// <remarks>\n/// Create capture sync\n/// </remarks>\n/// <param name=\"deviceId\"></param>\n/// <param name=\"moduleId\"></param>\n/// <param name=\"connectionString\"></param>\n/// <param name=\"logger\"></param>\n/// <param name=\"runName\"></param>\ninternal sealed class Storage(string deviceId, string moduleId, string connectionString,\n    ILogger logger, string? runName = null)\n{\n    /// <summary>\n    /// Download files\n    /// </summary>\n    /// <param name=\"path\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public async Task DownloadAsync(string path, CancellationToken ct = default)\n    {\n        var queueName = Extensions.FixUpStorageName($\"{_deviceId}_{_moduleId}\");\n        var queueClient = new QueueClient(_connectionString, queueName);\n        await EnsureQueueAsync(queueClient, ct).ConfigureAwait(false);\n\n        if (!Directory.Exists(path))\n        {\n            Directory.CreateDirectory(path);\n        }\n\n        _logger.LogInformation(\"Downloading files to {Path}.\", path);\n        while (!ct.IsCancellationRequested)\n        {\n            try\n            {\n                // Receive message\n                var message = await queueClient.ReceiveMessageAsync(\n                    cancellationToken: ct).ConfigureAwait(false);\n                if (!message.HasValue || message.Value?.Body == null)\n                {\n                    continue;\n                }\n                var notification =\n                    JsonSerializer.Deserialize<Notification>(message.Value.Body);\n                if (notification == null)\n                {\n                    continue;\n                }\n                try\n                {\n                    var containerClient = new BlobContainerClient(_connectionString,\n                        notification.ContainerName);\n                    var blobClient = containerClient.GetBlobClient(notification.BlobName);\n\n                    var blobProperties = await blobClient.GetPropertiesAsync(\n                        cancellationToken: ct).ConfigureAwait(false);\n\n                    var metadata = blobProperties.Value.Metadata;\n                    if (!metadata.TryGetValue(\"File\", out var f) ||\n                        !metadata.TryGetValue(\"Date\", out var d))\n                    {\n                        continue;\n                    }\n\n                    var c = Extensions.FixFolderName(notification.ContainerName);\n                    var folder = Path.Combine(path, c);\n                    if (!Directory.Exists(folder))\n                    {\n                        Directory.CreateDirectory(folder);\n                    }\n\n                    var file = Path.Combine(folder, Extensions.FixFileName(f));\n                    _logger.LogInformation(\"Downloading {Blob}...\", notification.BlobName);\n                    await blobClient.DownloadToAsync(file, new BlobDownloadToOptions\n                    {\n                        TransferOptions = new StorageTransferOptions\n                        {\n                            MaximumConcurrency = 4,\n                            InitialTransferSize = 8 * 1024 * 1024,\n                            MaximumTransferSize = 8 * 1024 * 1024\n                        }\n                    }, default).ConfigureAwait(false);\n                    _logger.LogInformation(\"Downloaded {Blob} to file {File}.\",\n                        notification.BlobName, file);\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Failed to download file from blob {BlobName}.\",\n                        notification.BlobName);\n                }\n                finally\n                {\n                    if (message.Value?.MessageId != null)\n                    {\n                        await queueClient.DeleteMessageAsync(message.Value.MessageId,\n                            message.Value.PopReceipt, ct).ConfigureAwait(false);\n                    }\n                }\n            }\n            catch (OperationCanceledException) { }\n            catch (Exception ex)\n            {\n                _logger.LogError(ex, \"Error receiving download notification.\");\n            }\n        }\n    }\n\n    /// <summary>\n    /// Upload file\n    /// </summary>\n    /// <param name=\"file\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public async ValueTask UploadAsync(string file, CancellationToken ct = default)\n    {\n        try\n        {\n            _logger.LogInformation(\"Uploading file {File}.\", file);\n            var containerName = Extensions.FixUpStorageName($\"{_deviceId}_{_moduleId}_{_runName}\");\n            var containerClient = new BlobContainerClient(_connectionString, containerName);\n            var queueName = Extensions.FixUpStorageName($\"{_deviceId}_{_moduleId}\");\n            var queueClient = new QueueClient(_connectionString, queueName);\n            await EnsureQueueAsync(queueClient, ct).ConfigureAwait(false);\n            await containerClient.CreateIfNotExistsAsync(PublicAccessType.None,\n                GetClientMetadata(), cancellationToken: ct).ConfigureAwait(false);\n\n            // Upload file\n            var blobName = Extensions.FixUpStorageName(Path.GetFileName(file));\n            var blobClient = containerClient.GetBlobClient(blobName);\n            var blobMetadata = new Dictionary<string, string>()\n            {\n                [\"Date\"] = DateTime.UtcNow.ToString(\"o\", CultureInfo.InvariantCulture),\n                [\"File\"] = Path.GetFileName(file)\n            };\n            await blobClient.UploadAsync(file, new BlobUploadOptions\n            {\n                TransferOptions = new StorageTransferOptions\n                {\n                    MaximumConcurrency = 2,\n                    InitialTransferSize = 8 * 1024 * 1024,\n                    MaximumTransferSize = 8 * 1024 * 1024\n                },\n                Metadata = blobMetadata,\n                ProgressHandler = new ProgressLogger(_logger, blobName)\n            }, ct).ConfigureAwait(false);\n\n            // Send completion notification\n            var message = JsonSerializer.Serialize(new Notification(\n                containerClient.Uri, blobClient.Uri,\n                blobClient.BlobContainerName, blobClient.Name));\n            await queueClient.SendMessageAsync(message, ct).ConfigureAwait(false);\n\n            _logger.LogInformation(\"Completed upload of file {File} to {BlobName}.\",\n                file, blobName);\n        }\n        catch (Exception ex)\n        {\n            _logger.LogError(ex, \"Failed to upload file {File}.\", file);\n            throw;\n        }\n    }\n\n    /// <summary>\n    /// Delete storage\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public async Task DeleteAsync(CancellationToken ct)\n    {\n        var containerName = Extensions.FixUpStorageName($\"{_deviceId}_{_moduleId}_{_runName}\");\n        _logger.LogInformation(\"Delete storage {Name}...\", containerName);\n\n        var containerClient = new BlobContainerClient(_connectionString, containerName);\n        if (await containerClient.ExistsAsync(ct).ConfigureAwait(false))\n        {\n            // leave\n            // await containerClient.DeleteAsync(cancellationToken: ct).ConfigureAwait(false);\n        }\n\n        var queueName = Extensions.FixUpStorageName($\"{_deviceId}_{_moduleId}\");\n        var queueClient = new QueueClient(_connectionString, queueName);\n        if (await queueClient.ExistsAsync(ct).ConfigureAwait(false))\n        {\n            await queueClient.DeleteAsync(ct).ConfigureAwait(false);\n        }\n    }\n\n    /// <summary>\n    /// Ensure queue exists and can be used\n    /// </summary>\n    /// <param name=\"queueClient\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    private async Task EnsureQueueAsync(QueueClient queueClient, CancellationToken ct)\n    {\n        while (!ct.IsCancellationRequested)\n        {\n            try\n            {\n                await queueClient.CreateIfNotExistsAsync(GetClientMetadata(),\n                    ct).ConfigureAwait(false);\n                break;\n            }\n            catch (RequestFailedException ex)\n                when (ex.Status == 409 && ex.ErrorCode == \"QueueBeingDeleted\")\n            {\n                await Task.Delay(TimeSpan.FromSeconds(1), ct).ConfigureAwait(false);\n            }\n        }\n    }\n\n    private Dictionary<string, string> GetClientMetadata()\n    {\n        return new Dictionary<string, string>\n        {\n            [\"DeviceId\"] = _deviceId,\n            [\"ModuleId\"] = _moduleId\n        };\n    }\n\n    private sealed record class ProgressLogger(ILogger Logger, string BlobName) :\n        IProgress<long>\n    {\n        /// <inheritdoc/>\n        public void Report(long value)\n        {\n            if (value > _lastProgress)\n            {\n                _lastProgress = value;\n                Logger.LogInformation(\n                    \"Uploading {Blob} - {Progress} bytes\", BlobName, value);\n            }\n        }\n        private long _lastProgress;\n    }\n\n    internal sealed record class Notification(Uri ContainerUri, Uri BlobUri,\n        string ContainerName, string BlobName);\n\n    private readonly string _deviceId = deviceId;\n    private readonly string _moduleId = moduleId;\n    private readonly string _runName = runName ?? DateTime.UtcNow.ToBinary()\n            .ToString(CultureInfo.InvariantCulture);\n    private readonly string _connectionString = connectionString;\n    private readonly ILogger _logger = logger;\n}\n"
  },
  {
    "path": "src/.gitignore",
    "content": "/**/launchSettings.json"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Azure.IIoT.OpcUa.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n    <Description>Azure OPC Publisher shared code</Description>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Apache.Avro\" Version=\"1.12.0\" />\n    <PackageReference Include=\"System.Text.Json\" Version=\"9.0.9\" />\n    <PackageReference Include=\"Microsoft.IO.RecyclableMemoryStream\" Version=\"3.0.1\" />\n    <PackageReference Include=\"Furly.Extensions\" Version=\"1.1.54\" />\n    <PackageReference Include=\"OPCFoundation.NetStandard.Opc.Ua.Core\" Version=\"1.5.377.21\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa.Publisher.Models\\src\\Azure.IIoT.OpcUa.Publisher.Models.csproj\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroBinaryReader.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Opc.Ua;\n    using System;\n    using System.Buffers;\n    using System.Buffers.Binary;\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// Reads from a Avro Binary encoded stream.\n    /// </summary>\n    public sealed class AvroBinaryReader : IDisposable\n    {\n        private readonly bool _leaveOpen;\n\n        /// <summary>\n        /// Underlying stream\n        /// </summary>\n        public Stream Stream { get; }\n\n        /// <summary>\n        /// Max string\n        /// </summary>\n        public int MaxStringLength { get; set; } = 64 * 1024;\n\n        /// <summary>\n        /// Max bytes\n        /// </summary>\n        public int MaxBytesLength { get; set; } = 64 * 1024;\n\n        /// <summary>\n        /// Create avro reader\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"leaveOpen\"></param>\n        public AvroBinaryReader(Stream stream, bool leaveOpen = false)\n        {\n            Stream = stream;\n            _leaveOpen = leaveOpen;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            if (!_leaveOpen)\n            {\n                Stream.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public bool ReadBoolean()\n        {\n            var b = ReadByte();\n            switch (b)\n            {\n                case 0:\n                    return false;\n                case 1:\n                    return true;\n                default:\n                    throw new DecodingException(\n                        \"Not a boolean value in the stream: \" + b);\n            }\n        }\n\n        /// <inheritdoc/>\n        public long ReadInteger()\n        {\n            var b = ReadByte();\n            var n = b & 0x7FUL;\n            var shift = 7;\n            while ((b & 0x80) != 0)\n            {\n                b = ReadByte();\n                n |= (b & 0x7FUL) << shift;\n                shift += 7;\n            }\n            var value = (long)n;\n            return (-(value & 0x01L))\n                ^ ((value >> 1) & 0x7fffffffffffffffL);\n        }\n\n        /// <inheritdoc/>\n        public void ReadFixed(Span<byte> buffer)\n        {\n            while (!buffer.IsEmpty)\n            {\n                var n = Stream.Read(buffer);\n                if (n <= 0)\n                {\n                    throw new DecodingException(StatusCodes.BadEndOfStream,\n                        \"End of stream reached.\");\n                }\n                buffer = buffer[n..];\n            }\n        }\n\n        /// <inheritdoc/>\n        public float ReadFloat()\n        {\n            Span<byte> bytes = stackalloc byte[sizeof(float)];\n            ReadFixed(bytes);\n            return BinaryPrimitives.ReadSingleLittleEndian(bytes);\n        }\n\n        /// <inheritdoc/>\n        public double ReadDouble()\n        {\n            Span<byte> bytes = stackalloc byte[sizeof(double)];\n            ReadFixed(bytes);\n            return BinaryPrimitives.ReadDoubleLittleEndian(bytes);\n        }\n\n        /// <inheritdoc/>\n        public byte[] ReadBytes()\n        {\n            var length = ReadInteger();\n            if (length == 0)\n            {\n                return [];\n            }\n            if (MaxBytesLength > 0 && MaxBytesLength < length)\n            {\n                throw new DecodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"MaxByteStringLength {MaxBytesLength} < {length}.\");\n            }\n\n            var buffer = new byte[(int)length];\n            ReadFixed(buffer.AsSpan());\n            return buffer;\n        }\n\n        /// <inheritdoc/>\n        public string ReadString()\n        {\n            var length = ReadInteger();\n            if (length == 0)\n            {\n                return string.Empty;\n            }\n\n            if (MaxStringLength > 0 && MaxStringLength < length)\n            {\n                throw new DecodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"MaxStringLength {MaxStringLength} < {length}.\");\n            }\n\n            if (length <= 256)\n            {\n                Span<byte> buffer = stackalloc byte[(int)length];\n                ReadFixed(buffer);\n                return GetString(buffer);\n            }\n            else if (length <= 4096)\n            {\n                var bufferArray = ArrayPool<byte>.Shared.Rent((int)length);\n                try\n                {\n                    var buffer = bufferArray.AsSpan(0, (int)length);\n                    ReadFixed(buffer);\n                    return GetString(buffer);\n                }\n                finally\n                {\n                    ArrayPool<byte>.Shared.Return(bufferArray);\n                }\n            }\n            else\n            {\n                using var binaryReader = new BinaryReader(Stream,\n                    Encoding.UTF8, true);\n                var bytes = binaryReader.ReadBytes((int)length);\n                if (bytes.Length != length)\n                {\n                    throw new DecodingException(\n                        \"Could not read as many bytes from stream as expected!\");\n                }\n                return GetString(bytes);\n            }\n\n            static string GetString(ReadOnlySpan<byte> bytes)\n            {\n                if (bytes[^1] == 0)\n                {\n                    // If 0 terminated, decrease length by one\n                    // before converting to string\n                    bytes = bytes[..^1];\n                }\n                return Encoding.UTF8.GetString(bytes);\n            }\n        }\n\n        private byte ReadByte()\n        {\n            var n = Stream.ReadByte();\n            if (n >= 0)\n            {\n                return (byte)n;\n            }\n            throw new DecodingException(StatusCodes.BadEndOfStream,\n                \"Stream reached its end.\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroBinaryWriter.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using System;\n    using System.Buffers.Binary;\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// Encodes objects in a stream using Avro binary encoding.\n    /// </summary>\n    public sealed class AvroBinaryWriter : IDisposable\n    {\n        /// <summary>\n        /// Underlying stream\n        /// </summary>\n        public Stream Stream { get; }\n\n        /// <summary>\n        /// Creates a writer that writes avro binary to\n        /// the stream.\n        /// </summary>\n        /// <param name=\"stream\">The stream to which the\n        /// encoder writes.</param>\n        /// <param name=\"leaveOpen\">If the stream should\n        /// be left open on dispose.</param>\n        public AvroBinaryWriter(Stream stream, bool leaveOpen = true)\n        {\n            Stream = stream;\n            _leaveOpen = leaveOpen;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            if (!_leaveOpen)\n            {\n                Stream.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteBoolean(bool value)\n        {\n            Stream.WriteByte((byte)(value ? 0x1 : 0x0));\n        }\n\n        /// <inheritdoc/>\n        public void WriteInteger(int value)\n        {\n            var encoded = (uint)((value << 1) ^ (value >> 31));\n            do\n            {\n                var current = encoded & 0x7FU;\n                encoded >>= 7;\n\n                if (encoded != 0)\n                {\n                    current |= 0x80U;\n                }\n\n                Stream.WriteByte((byte)current);\n            }\n            while (encoded != 0U);\n        }\n\n        /// <inheritdoc/>\n        public void WriteInteger(long value)\n        {\n            var encoded = (ulong)((value << 1) ^ (value >> 63));\n            do\n            {\n                var current = encoded & 0x7FUL;\n                encoded >>= 7;\n\n                if (encoded != 0)\n                {\n                    current |= 0x80UL;\n                }\n\n                Stream.WriteByte((byte)current);\n            }\n            while (encoded != 0UL);\n        }\n\n        /// <inheritdoc/>\n        public void WriteFloat(float value)\n        {\n            Span<byte> bytes = stackalloc byte[sizeof(float)];\n            BinaryPrimitives.WriteSingleLittleEndian(bytes, value);\n            WriteFixed(bytes);\n        }\n\n        /// <inheritdoc/>\n        public void WriteDouble(double value)\n        {\n            Span<byte> bytes = stackalloc byte[sizeof(double)];\n            BinaryPrimitives.WriteDoubleLittleEndian(bytes, value);\n            WriteFixed(bytes);\n        }\n\n        /// <inheritdoc/>\n        public void WriteFixed(ReadOnlySpan<byte> buffer)\n        {\n            Stream.Write(buffer);\n        }\n\n        /// <inheritdoc/>\n        internal void WriteBytes(ReadOnlySpan<byte> value)\n        {\n            WriteInteger(value.Length);\n            WriteFixed(value);\n        }\n\n        /// <inheritdoc/>\n        public void WriteString(string value)\n        {\n            WriteBytes(Encoding.UTF8.GetBytes(value));\n        }\n\n        private readonly bool _leaveOpen;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroDecoder.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Avro;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Xml;\n\n    /// <summary>\n    /// Decodes objects from underlying decoder using a provided\n    /// Avro schema. Validation errors throw.\n    /// </summary>\n    public sealed class AvroDecoder : BaseAvroDecoder\n    {\n        /// <summary>\n        /// Schema to use\n        /// </summary>\n        public Schema Schema { get; }\n\n        /// <summary>\n        /// Schema to use\n        /// </summary>\n        public Schema Current => _schema.Current;\n\n        /// <summary>\n        /// Creates a decoder that decodes the data from the\n        /// passed in stream.\n        /// </summary>\n        /// <param name=\"stream\">The stream to which the\n        /// encoder writes.</param>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"context\">The message context to\n        /// use for the encoding.</param>\n        /// <param name=\"leaveOpen\"></param>\n        public AvroDecoder(Stream stream, Schema schema,\n            IServiceMessageContext context, bool leaveOpen = false) :\n            base(stream, context, leaveOpen)\n        {\n            Schema = schema;\n            _schema = new AvroSchemaTraverser(schema);\n        }\n\n        /// <inheritdoc/>\n        public override bool ReadBoolean(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Boolean,\n                base.ReadBoolean);\n        }\n\n        /// <inheritdoc/>\n        public override sbyte ReadSByte(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.SByte,\n                base.ReadSByte);\n        }\n\n        /// <inheritdoc/>\n        public override byte ReadByte(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Byte,\n                base.ReadByte);\n        }\n\n        /// <inheritdoc/>\n        public override short ReadInt16(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Int16,\n                base.ReadInt16);\n        }\n\n        /// <inheritdoc/>\n        public override ushort ReadUInt16(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.UInt16,\n                base.ReadUInt16);\n        }\n\n        /// <inheritdoc/>\n        public override int ReadInt32(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Int32,\n                base.ReadInt32);\n        }\n\n        /// <inheritdoc/>\n        public override uint ReadUInt32(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.UInt32,\n                base.ReadUInt32);\n        }\n\n        /// <inheritdoc/>\n        public override long ReadInt64(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Int64,\n                base.ReadInt64);\n        }\n\n        /// <inheritdoc/>\n        public override float ReadFloat(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Float,\n                base.ReadFloat);\n        }\n\n        /// <inheritdoc/>\n        public override double ReadDouble(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Double,\n                base.ReadDouble);\n        }\n\n        /// <inheritdoc/>\n        public override Uuid ReadGuid(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Guid,\n                base.ReadGuid);\n        }\n\n        /// <inheritdoc/>\n        public override string? ReadString(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.String,\n                base.ReadString);\n        }\n\n        /// <inheritdoc/>\n        public override ulong ReadUInt64(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.UInt64,\n                base.ReadUInt64);\n        }\n\n        /// <inheritdoc/>\n        public override DateTime ReadDateTime(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.DateTime,\n                base.ReadDateTime);\n        }\n\n        /// <inheritdoc/>\n        public override byte[] ReadByteString(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.ByteString,\n                base.ReadByteString);\n        }\n\n        /// <inheritdoc/>\n        public override XmlElement ReadXmlElement(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.XmlElement,\n                base.ReadXmlElement);\n        }\n\n        /// <inheritdoc/>\n        public override StatusCode ReadStatusCode(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.StatusCode,\n                base.ReadStatusCode);\n        }\n\n        /// <inheritdoc/>\n        public override NodeId ReadNodeId(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.NodeId,\n                base.ReadNodeId);\n        }\n\n        /// <inheritdoc/>\n        public override ExpandedNodeId ReadExpandedNodeId(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.ExpandedNodeId,\n                base.ReadExpandedNodeId);\n        }\n\n        /// <inheritdoc/>\n        public override QualifiedName ReadQualifiedName(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.QualifiedName,\n                base.ReadQualifiedName);\n        }\n\n        /// <inheritdoc/>\n        public override LocalizedText ReadLocalizedText(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.LocalizedText,\n                base.ReadLocalizedText);\n        }\n\n        /// <inheritdoc/>\n        public override DataValue ReadDataValue(string? fieldName)\n        {\n            // Get current field schema\n            var currentSchema = GetFieldSchema(fieldName);\n            // Should be data value compatible\n            if (!currentSchema.IsDataValue())\n            {\n                throw new DecodingException(\n                    $\"Schema {currentSchema.Fullname} is not \" +\n                    $\"as expected {currentSchema.ToJson()}.\", Schema.ToJson());\n            }\n\n            // Read type per schema\n            var result = base.ReadDataValue(fieldName);\n            ValidatedPop(currentSchema);\n            return result;\n        }\n\n        /// <inheritdoc/>\n        public override Variant ReadVariant(string? fieldName)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            var result = ReadVariant(fieldName, currentSchema);\n            ValidatedPop(currentSchema);\n            return result;\n\n            Variant ReadVariant(string? fieldName, Schema currentSchema)\n            {\n                var expectedType = _builtIns.GetSchemaForBuiltInType(\n                    BuiltInType.Variant, SchemaRank.Scalar);\n                if (currentSchema.Fullname == expectedType.Fullname)\n                {\n                    // Read as variant\n                    return base.ReadVariant(fieldName);\n                }\n\n                // Alternatively the schema could be nullable\n                if (currentSchema is UnionSchema u)\n                {\n                    // Read as nullable\n                    return ReadWithSchema(u, () => ReadNullable(fieldName,\n                        _ => ReadVariantValueWithSchema(u.Schemas[1])));\n                }\n\n                return ReadVariantValueWithSchema(currentSchema);\n\n                Variant ReadVariantValueWithSchema(Schema currentSchema)\n                {\n                    // Read as built in type\n                    if (currentSchema.IsBuiltInType(out var builtInType, out var rank))\n                    {\n                        return ReadWithSchema(currentSchema,\n                            () => ReadVariantValue(builtInType, rank));\n                    }\n\n                    // Read as encodeable\n                    var typeId = currentSchema.GetDataTypeId(Context);\n                    var systemType = Context.Factory.GetSystemType(typeId);\n                    if (systemType != null)\n                    {\n                        return new Variant(ReadWithSchema(currentSchema,\n                            () => ReadEncodeable(null, systemType, typeId)));\n                    }\n\n                    throw new DecodingException(\n                        $\"Variant schema {currentSchema.ToJson()} of \" +\n                        $\"field {fieldName ?? \"unnamed\"} is neither variant nor built \" +\n                        \"in type schema.\", Schema.ToJson());\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override DataSet ReadDataSet(string? fieldName)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            var result = ReadDataSet(currentSchema);\n            ValidatedPop(currentSchema);\n            return result;\n\n            DataSet ReadDataSet(Schema currentSchema)\n            {\n                if (currentSchema is not RecordSchema r)\n                {\n                    throw new DecodingException(\n                        $\"Invalid schema {currentSchema.ToJson()}. \" +\n                        \"Data sets must be records or maps.\", Schema.ToJson());\n                }\n                var dataSet = new List<(string, DataValue?)>();\n                var isRaw = false;\n\n                // Run through the fields and read either using variant or data values\n                foreach (var field in r.Fields)\n                {\n                    var dataValue = ReadDataSetField(field.Name);\n                    if (dataValue?.StatusCode == (StatusCode)uint.MaxValue)\n                    {\n                        isRaw = true;\n                        dataValue.StatusCode = StatusCodes.Good;\n                    }\n                    dataSet.Add((SchemaUtils.Unescape(field.Name), dataValue));\n                }\n                var dataSetFieldContentFlags = isRaw ? DataSetFieldContentFlags.RawData : 0;\n                return new DataSet(dataSet, dataSetFieldContentFlags);\n            }\n        }\n\n        /// <summary>\n        /// Read data set field\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private DataValue? ReadDataSetField(string? fieldName)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            var result = ReadDataSetField(currentSchema);\n            ValidatedPop(currentSchema);\n            return result;\n\n            DataValue? ReadDataSetFieldValue()\n            {\n                var isRaw = true;\n                if (Current is RecordSchema fieldRecord &&\n                    fieldRecord.IsDataValue())\n                {\n                    var dataValue = new DataValue();\n                    foreach (var dvf in fieldRecord.Fields)\n                    {\n                        switch (dvf.Name)\n                        {\n                            case nameof(DataValue.Value):\n                                dataValue.Value =\n                                    ReadVariant(nameof(DataValue.Value));\n                                break;\n                            case nameof(DataValue.SourceTimestamp):\n                                isRaw = false;\n                                dataValue.SourceTimestamp =\n                                    ReadDateTime(nameof(DataValue.SourceTimestamp));\n                                break;\n                            case nameof(DataValue.SourcePicoseconds):\n                                isRaw = false;\n                                dataValue.SourcePicoseconds =\n                                    ReadUInt16(nameof(DataValue.SourcePicoseconds));\n                                break;\n                            case nameof(DataValue.ServerTimestamp):\n                                isRaw = false;\n                                dataValue.ServerTimestamp =\n                                    ReadDateTime(nameof(DataValue.ServerTimestamp));\n                                break;\n                            case nameof(DataValue.ServerPicoseconds):\n                                isRaw = false;\n                                dataValue.ServerPicoseconds =\n                                    ReadUInt16(nameof(DataValue.ServerPicoseconds));\n                                break;\n                            case nameof(DataValue.StatusCode):\n                                isRaw = false;\n                                dataValue.StatusCode =\n                                    ReadStatusCode(nameof(DataValue.StatusCode));\n                                break;\n                            default:\n                                throw new DecodingException(\n                                    $\"Unknown field {dvf.Name} in dataset field.\", Schema.ToJson());\n                        }\n                    }\n                    if (isRaw)\n                    {\n                        dataValue.StatusCode = (StatusCode)uint.MaxValue;\n                    }\n                    return dataValue;\n                }\n\n                // Read value as variant\n                var value = ReadWithSchema(currentSchema, () => ReadVariant(null));\n                if (value == Variant.Null)\n                {\n                    return null;\n                }\n                return new DataValue(value, (StatusCode)uint.MaxValue);\n            }\n\n            DataValue? ReadDataSetField(Schema currentSchema)\n            {\n                if (currentSchema is UnionSchema u)\n                {\n                    return ReadWithSchema(u, () => ReadNullable(null, _ =>\n                    {\n                        _schema.Push(((UnionSchema)Current).Schemas[1]);\n                        var v = ReadDataSetFieldValue();\n                        _schema.Pop();\n                        return v!;\n                    }));\n                }\n                return ReadDataSetFieldValue();\n            }\n        }\n\n        /// <inheritdoc/>\n        public override IEncodeable ReadEncodeable(string? fieldName, Type systemType,\n            ExpandedNodeId? encodeableTypeId = null)\n        {\n            if (Activator.CreateInstance(systemType) is not IEncodeable encodeable)\n            {\n                throw new DecodingException(\n                    $\"Cannot decode type '{systemType.FullName}'.\");\n            }\n\n            var fullName = encodeable.TypeId.GetFullName(systemType.Name, Context);\n            return ValidatedRead(fieldName, fullName ?? systemType.Name,\n                f => base.ReadEncodeable(f, systemType, encodeableTypeId), fullName != null);\n        }\n\n        /// <inheritdoc/>\n        public override ExtensionObject? ReadExtensionObject(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.ExtensionObject,\n                base.ReadExtensionObject);\n        }\n\n        /// <inheritdoc/>\n        protected override ExtensionObject ReadEncodedDataType(string? fieldName)\n        {\n            return ValidatedRead(fieldName, SchemaUtils.NamespaceZeroName + \".EncodedDataType\",\n                base.ReadEncodedDataType);\n        }\n\n        /// <inheritdoc/>\n        public override int ReadEnumerated(string? fieldName)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            var result = ReadEnumerated(fieldName, currentSchema);\n            ValidatedPop(currentSchema);\n            return result;\n\n            int ReadEnumerated(string? fieldName, Schema currentSchema)\n            {\n                if (currentSchema.IsBuiltInType(out var builtInType, out var rank) &&\n                    rank == SchemaRank.Scalar &&\n                    (builtInType == BuiltInType.Int32 || builtInType == BuiltInType.Enumeration))\n                {\n                    return ReadWithSchema(currentSchema,\n                        () => base.ReadEnumerated(fieldName));\n                }\n\n                throw new EncodingException(\n                    $\"Invalid schema {currentSchema.ToJson()}. \" +\n                    \"Enumerated values must be enums.\", Schema.ToJson());\n            }\n        }\n\n        /// <inheritdoc/>\n        public override BooleanCollection ReadBooleanArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Boolean,\n               base.ReadBooleanArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override SByteCollection ReadSByteArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.SByte,\n               base.ReadSByteArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override ByteCollection ReadByteArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.ByteString,\n               base.ReadByteArray, SchemaRank.Scalar);\n        }\n\n        /// <inheritdoc/>\n        public override Int16Collection ReadInt16Array(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Int16,\n               base.ReadInt16Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override UInt16Collection ReadUInt16Array(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.UInt16,\n              base.ReadUInt16Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override Int32Collection ReadInt32Array(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Int32,\n               base.ReadInt32Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override UInt32Collection ReadUInt32Array(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.UInt32,\n               base.ReadUInt32Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override Int64Collection ReadInt64Array(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Int64,\n               base.ReadInt64Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override UInt64Collection ReadUInt64Array(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.UInt64,\n               base.ReadUInt64Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override FloatCollection ReadFloatArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Float,\n               base.ReadFloatArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override DoubleCollection ReadDoubleArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Double,\n               base.ReadDoubleArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override StringCollection ReadStringArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.String,\n               base.ReadStringArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override DateTimeCollection ReadDateTimeArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.DateTime,\n               base.ReadDateTimeArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override UuidCollection ReadGuidArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.Guid,\n               base.ReadGuidArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override ByteStringCollection ReadByteStringArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.ByteString,\n               base.ReadByteStringArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override XmlElementCollection ReadXmlElementArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.XmlElement,\n               base.ReadXmlElementArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override NodeIdCollection ReadNodeIdArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.NodeId,\n               base.ReadNodeIdArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override ExpandedNodeIdCollection ReadExpandedNodeIdArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.ExpandedNodeId,\n               base.ReadExpandedNodeIdArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override StatusCodeCollection ReadStatusCodeArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.StatusCode,\n               base.ReadStatusCodeArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override DiagnosticInfoCollection ReadDiagnosticInfoArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.DiagnosticInfo,\n               base.ReadDiagnosticInfoArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override QualifiedNameCollection ReadQualifiedNameArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.QualifiedName,\n               base.ReadQualifiedNameArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override LocalizedTextCollection ReadLocalizedTextArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.LocalizedText,\n               base.ReadLocalizedTextArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override VariantCollection ReadVariantArray(string? fieldName)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            var result = ReadVariantArray(fieldName, currentSchema);\n            ValidatedPop(currentSchema);\n            return result;\n\n            VariantCollection ReadVariantArray(string? fieldName, Schema currentSchema)\n            {\n                var expectedType = _builtIns.GetSchemaForBuiltInType(BuiltInType.Variant,\n                    SchemaRank.Collection);\n                // Write as variant collection\n                if (currentSchema.Fullname == expectedType.Fullname)\n                {\n                    return base.ReadVariantArray(fieldName);\n                }\n\n                // Write as built in type\n                if (currentSchema.IsBuiltInType(out var builtInType, out var rank))\n                {\n                    // When written in concise mode we get an array of bytes as byte string\n                    if (builtInType == BuiltInType.ByteString && rank == SchemaRank.Scalar)\n                    {\n                        var result = ReadWithSchema(currentSchema,\n                            () => ReadScalar(null, builtInType));\n                        return (result.Value as byte[])?\n                            .Select(o => new Variant(o))\n                            .ToArray();\n                    }\n                    //\n                    // Otherwise rank should be collection, and all values to write should be\n                    // scalar and of the built in type\n                    //\n                    if (rank == SchemaRank.Collection)\n                    {\n                        var result = ReadWithSchema(currentSchema,\n                            () => ReadArray(null, builtInType, null, null));\n                        if (result == null || result.Length == 0)\n                        {\n                            return Array.Empty<Variant>();\n                        }\n                        return result.Cast<object?>()\n                            .Select(o => new Variant(o))\n                            .ToArray();\n                    }\n\n                    throw new DecodingException(\n                        $\"Wrong schema {currentSchema.ToJson()} \" +\n                        $\"of field {fieldName ?? \"unnamed\"} to write variants.\",\n                        Schema.ToJson());\n                }\n\n                throw new DecodingException(\n                    $\"Variant schema {currentSchema.ToJson()} of \" +\n                    $\"field {fieldName ?? \"unnamed\"} is neither variant collection \" +\n                    \"nor built in type collection schema.\", Schema.ToJson());\n            }\n        }\n\n        /// <inheritdoc/>\n        public override DataValueCollection ReadDataValueArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.DataValue,\n                base.ReadDataValueArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override ExtensionObjectCollection ReadExtensionObjectArray(string? fieldName)\n        {\n            return ValidatedRead(fieldName, BuiltInType.ExtensionObject,\n                base.ReadExtensionObjectArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override Array? ReadEncodeableArray(string? fieldName, Type systemType,\n            ExpandedNodeId? encodeableTypeId)\n        {\n            return base.ReadEncodeableArray(fieldName, systemType, encodeableTypeId);\n        }\n\n        /// <inheritdoc/>\n        public override Array? ReadEnumeratedArray(string? fieldName, Type enumType)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            var result = ReadEnumeratedArray(fieldName, currentSchema);\n            ValidatedPop(currentSchema);\n            return result;\n\n            Array? ReadEnumeratedArray(string? fieldName, Schema currentSchema)\n            {\n                if (currentSchema is ArraySchema a && a.ItemSchema is EnumSchema e)\n                {\n                    return ReadWithSchema(currentSchema,\n                        () => base.ReadEnumeratedArray(fieldName, enumType));\n                }\n                else if (currentSchema.IsBuiltInType(out var builtInType, out var rank) &&\n                    rank == SchemaRank.Collection &&\n                    (builtInType == BuiltInType.Int32 || builtInType == BuiltInType.Enumeration))\n                {\n                    return base.ReadEnumeratedArray(fieldName, enumType);\n                }\n                else\n                {\n                    throw new EncodingException($\"Invalid schema {currentSchema.ToJson()}. \" +\n                        \"Enumerated values must be arrays of enums.\", Schema.ToJson());\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override int[] ReadEnumeratedArray(string? fieldName)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            var result = ReadEnumeratedArray(fieldName, currentSchema);\n            ValidatedPop(currentSchema);\n            return result;\n\n            int[] ReadEnumeratedArray(string? fieldName, Schema currentSchema)\n            {\n                if (currentSchema is ArraySchema a && a.ItemSchema is EnumSchema e)\n                {\n                    return ReadWithSchema(currentSchema,\n                        () => base.ReadEnumeratedArray(fieldName));\n                }\n                else if (currentSchema.IsBuiltInType(out var builtInType, out var rank) &&\n                    rank == SchemaRank.Collection &&\n                    (builtInType == BuiltInType.Int32 || builtInType == BuiltInType.Enumeration))\n                {\n                    return base.ReadEnumeratedArray(fieldName);\n                }\n                else\n                {\n                    throw new EncodingException(\n                        $\"Invalid schema {currentSchema.ToJson()}. \" +\n                        \"Enumerated values must be arrays of enums.\", Schema.ToJson());\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override T? ReadNull<T>(string? fieldName) where T : default\n        {\n            return ValidatedRead(fieldName, BuiltInType.Null,\n                base.ReadNull<T>, SchemaRank.Scalar);\n        }\n\n        /// <inheritdoc/>\n        protected override T? ReadNullable<T>(string? fieldName, Func<string?, T> reader)\n            where T : default\n        {\n            return ReadUnion(fieldName, id =>\n            {\n                // Check the schema is a nullable union schema\n                if (Current is not UnionSchema u ||\n                    u.Count != 2 || u.Schemas[0].Tag != Schema.Type.Null)\n                {\n                    throw new DecodingException(\n                        $\"Union schema {Current.ToJson()} of nullable \" +\n                        $\"field {fieldName ?? \"unnamed\"} does not match.\", Schema.ToJson());\n                }\n                switch (id)\n                {\n                    case 0:\n                        return ReadNull<T>(null);\n                    case 1:\n                        return reader(null);\n                    default:\n                        throw new DecodingException(\n                            $\"Unexpected union discriminator {id}.\");\n                }\n            });\n        }\n\n        /// <inheritdoc/>\n        public override Array? ReadArray(string? fieldName, int valueRank, BuiltInType builtInType,\n            Type? systemType = null, ExpandedNodeId? encodeableTypeId = null)\n        {\n            var currentSchema = GetFieldSchema(null);\n            if (!currentSchema.IsBuiltInType(out var expectedType, out var rank))\n            {\n                throw new DecodingException(\n                    $\"Schema {currentSchema.ToJson()} is not an array schema.\",\n                    Schema.ToJson());\n            }\n            if (rank != SchemaUtils.GetRank(valueRank) || builtInType != expectedType)\n            {\n                throw new DecodingException(\n                    $\"Schema {currentSchema.ToJson()} does not match expected rank and type.\",\n                    Schema.ToJson());\n            }\n            var result = ReadWithSchema(currentSchema,\n                () => base.ReadArray(fieldName, valueRank, builtInType, systemType, encodeableTypeId));\n            ValidatedPop(currentSchema);\n            return result;\n        }\n\n        /// <inheritdoc/>\n        protected override Array ReadArray(string? fieldName,\n            Func<object> reader, Type type)\n        {\n            return ValidatedReadArray(() => base.ReadArray(fieldName, reader, type));\n        }\n\n        /// <inheritdoc/>\n        public override T[] ReadArray<T>(string? fieldName, Func<T> reader)\n        {\n            return ValidatedReadArray(() => base.ReadArray(fieldName, () => reader()));\n        }\n\n        /// <inheritdoc/>\n        public override T ReadObject<T>(string? fieldName, Func<object?, T> reader)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            var result = reader(currentSchema);\n            ValidatedPop(currentSchema);\n            return result;\n        }\n\n        /// <inheritdoc/>\n        public void Push(Schema schema)\n        {\n            _schema.Push(schema);\n        }\n\n        /// <inheritdoc/>\n        protected override DiagnosticInfo ReadDiagnosticInfo(string? fieldName, int depth)\n        {\n            return ValidatedRead(fieldName, BuiltInType.DiagnosticInfo,\n                f => base.ReadDiagnosticInfo(f, depth));\n        }\n\n        /// <inheritdoc/>\n        public override T ReadUnion<T>(string? fieldName,\n            Func<int, T> reader)\n        {\n            // Get the union schema\n            var currentSchema = GetFieldSchema(fieldName);\n            if (currentSchema is not UnionSchema)\n            {\n                throw new DecodingException(\n                    $\"Union field {fieldName ?? \"unnamed\"} must be a union \" +\n                    $\"schema but is {currentSchema.ToJson()} schema.\", Schema.ToJson());\n            }\n            return base.ReadUnion(fieldName, reader);\n        }\n\n        /// <inheritdoc/>\n        protected override int StartUnion()\n        {\n            var index = base.StartUnion();\n            _schema.ExpectUnionItem = u =>\n            {\n                if (index < u.Schemas.Count && index >= 0)\n                {\n                    return u.Schemas[index];\n                }\n                throw new DecodingException(\n                    $\"Union index {index} not found in union {u.ToJson()}.\",\n                    Schema.ToJson());\n            };\n            return index;\n        }\n\n        /// <inheritdoc/>\n        protected override void EndUnion()\n        {\n            var unionSchema = _schema.Pop();\n            if (unionSchema is not UnionSchema)\n            {\n                throw new DecodingException(\n                    $\"Expected union schema but got {unionSchema.ToJson()} after \" +\n                    \"completing union.\", Schema.ToJson());\n            }\n            base.EndUnion();\n        }\n\n        /// <inheritdoc/>\n        protected override IEncodeable ReadEncodeableInExtensionObject(int unionId)\n        {\n            var schema = _schema.Current; // Selected through union id\n\n            // Get the type id directly from the schema and load the system type\n            var typeId = schema.GetDataTypeId(Context);\n            if (NodeId.IsNull(typeId))\n            {\n                throw new DecodingException(\n                    $\"Schema {schema.ToJson()} does not reference a valid type \" +\n                    \"id to look up system type.\", Schema.ToJson());\n            }\n\n            var systemType = Context.Factory.GetSystemType(typeId);\n            if (systemType == null)\n            {\n                throw new DecodingException(\n                    $\"A system type for schema {schema} could not befound using \" +\n                    $\"the typeid {typeId}.\");\n            }\n            return ReadEncodeable(null, systemType, typeId);\n        }\n\n        /// <summary>\n        /// Perform the read of the built in type after validating the\n        /// operation against the schema of the field if there is a field.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private T ValidatedRead<T>(string? fieldName, BuiltInType builtInType,\n            Func<string?, T> value, SchemaRank valueRank = SchemaRank.Scalar)\n        {\n            // Get expected schema\n            var expectedType = _builtIns.GetSchemaForBuiltInType(builtInType,\n                valueRank);\n            var expectedName = expectedType.Fullname;\n            return ValidatedRead(fieldName, expectedName, value);\n        }\n\n        /// <summary>\n        /// Validates reading a value against the schema\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"expectedSchemaName\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"isFullName\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private T ValidatedRead<T>(string? fieldName, string expectedSchemaName,\n            Func<string?, T> value, bool isFullName = true)\n        {\n            // Get current field schema\n            var currentSchema = GetFieldSchema(fieldName);\n\n            // Should be the same\n            var curName = isFullName ? currentSchema.Fullname : currentSchema.Name;\n            if (curName != expectedSchemaName)\n            {\n                throw new DecodingException(\n                    $\"Schema {currentSchema.Fullname} is not as \" +\n                    $\"expected {expectedSchemaName}.\", Schema.ToJson());\n            }\n\n            // Read type per schema\n            var result = value(fieldName);\n            ValidatedPop(currentSchema);\n            return result;\n        }\n\n        /// <summary>\n        /// Validated array reader\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"reader\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private T ValidatedReadArray<T>(Func<T> reader)\n        {\n            var currentSchema = GetFieldSchema(null);\n            if (currentSchema is not ArraySchema)\n            {\n                throw new DecodingException(\n                    $\"Reading array field but schema {currentSchema.ToJson()} is not \" +\n                    \"array schema.\", Schema.ToJson());\n            }\n\n            var result = reader();\n            ValidatedPop(currentSchema);\n            return result;\n        }\n\n        /// <summary>\n        /// Use specified schema by pushing it on top for reading\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"reader\"></param>\n        private T ReadWithSchema<T>(Schema schema, Func<T> reader)\n        {\n            var top = schema.AsArray();\n            _schema.Push(top);\n            var result = reader();\n            ValidatedPop(top);\n            return result;\n        }\n\n        /// <summary>\n        /// Validate pop from stack should be expected schema\n        /// </summary>\n        /// <param name=\"expectedSchema\"></param>\n        /// <exception cref=\"DecodingException\"></exception>\n        private void ValidatedPop(Schema expectedSchema)\n        {\n            // Pop array from stack\n            var completedSchema = _schema.Pop();\n            if (completedSchema != expectedSchema)\n            {\n                throw new DecodingException(\n                    $\"Failed to pop schema. Expected {expectedSchema.ToJson()} \" +\n                    $\"but got {completedSchema.ToJson()}.\", Schema.ToJson());\n            }\n        }\n\n        /// <summary>\n        /// Get next schema\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private Schema GetFieldSchema(string? fieldName)\n        {\n            _schema.ExpectedFieldName = fieldName;\n            var current = _schema.Current;\n            if (!_schema.TryMoveNext())\n            {\n                throw new DecodingException(\n                    $\"No schema for field {fieldName ?? \"unnamed\"} \" +\n                    $\"found in {current.ToJson()}.\", Schema.ToJson());\n            }\n            return _schema.Current;\n        }\n\n        private readonly AvroBuiltInSchemas _builtIns = new();\n        private readonly AvroSchemaTraverser _schema;\n    }\n\n    /// <summary>\n    /// Schemaless avro decoder\n    /// </summary>\n    internal sealed class SchemalessAvroDecoder : BaseAvroDecoder\n    {\n        /// <inheritdoc/>\n        public SchemalessAvroDecoder(Stream stream,\n            IServiceMessageContext context, bool leaveOpen = false)\n            : base(stream, context, leaveOpen)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroEncoder.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Avro;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Xml;\n\n    /// <summary>\n    /// Encodes objects via Avro schema using underlying encoder.\n    /// </summary>\n    public sealed class AvroEncoder : BaseAvroEncoder\n    {\n        /// <summary>\n        /// Schema to use\n        /// </summary>\n        public Schema Schema { get; }\n\n        /// <summary>\n        /// Current schema\n        /// </summary>\n        public Schema Current => _schema.Current;\n\n        /// <summary>\n        /// Creates an encoder that writes to the stream.\n        /// </summary>\n        /// <param name=\"stream\">The stream to which the\n        /// encoder writes.</param>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"context\">The message context to\n        /// use for the encoding.</param>\n        /// <param name=\"leaveOpen\">If the stream should\n        /// be left open on dispose.</param>\n        public AvroEncoder(Stream stream, Schema schema,\n            IServiceMessageContext context, bool leaveOpen = true) :\n            base(stream, context, leaveOpen)\n        {\n            Schema = schema;\n            _schema = new AvroSchemaTraverser(schema);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteBoolean(string? fieldName, bool value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Boolean, value,\n                base.WriteBoolean);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteSByte(string? fieldName, sbyte value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.SByte, value,\n                base.WriteSByte);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteByte(string? fieldName, byte value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Byte, value,\n                base.WriteByte);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt16(string? fieldName, short value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Int16, value,\n                base.WriteInt16);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt16(string? fieldName, ushort value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.UInt16, value,\n                base.WriteUInt16);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt32(string? fieldName, int value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Int32, value,\n                base.WriteInt32);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt32(string? fieldName, uint value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.UInt32, value,\n                base.WriteUInt32);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt64(string? fieldName, long value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Int64, value,\n                base.WriteInt64);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt64(string? fieldName, ulong value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.UInt64, value,\n                base.WriteUInt64);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteFloat(string? fieldName, float value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Float, value,\n                base.WriteFloat);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDouble(string? fieldName, double value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Double, value,\n                base.WriteDouble);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteString(string? fieldName, string? value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.String, value,\n                base.WriteString);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDateTime(string? fieldName, DateTime value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.DateTime, value,\n                base.WriteDateTime);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteGuid(string? fieldName, Uuid value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Guid, value,\n                base.WriteGuid);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteGuid(string? fieldName, Guid value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Guid, value,\n                base.WriteGuid);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteByteString(string? fieldName, byte[]? value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.ByteString, value,\n                base.WriteByteString);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteXmlElement(string? fieldName, XmlElement? value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.XmlElement, value,\n                base.WriteXmlElement);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteNodeId(string? fieldName, NodeId? value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.NodeId, value,\n                base.WriteNodeId);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteExpandedNodeId(string? fieldName,\n            ExpandedNodeId? value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.ExpandedNodeId, value,\n                base.WriteExpandedNodeId);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteStatusCode(string? fieldName, StatusCode value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.StatusCode, value,\n                base.WriteStatusCode);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteQualifiedName(string? fieldName,\n            QualifiedName? value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.QualifiedName, value,\n                base.WriteQualifiedName);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteLocalizedText(string? fieldName,\n            LocalizedText? value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.LocalizedText, value,\n                base.WriteLocalizedText);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDataValue(string? fieldName, DataValue? value)\n        {\n            // Get current field schema\n            var currentSchema = GetFieldSchema(fieldName);\n\n            // Should be the same\n            if (!currentSchema.IsDataValue())\n            {\n                throw new EncodingException(\n                    $\"Schema {currentSchema.Fullname} is not \" +\n                    $\"as expected {currentSchema.ToJson()}.\", Schema.ToJson());\n            }\n\n            // Write type per schema\n            base.WriteDataValue(fieldName, value);\n            ValidatedPop(currentSchema);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteExtensionObject(string? fieldName,\n            ExtensionObject? value)\n        {\n            ValidatedWrite(fieldName, BuiltInType.ExtensionObject, value,\n                base.WriteExtensionObject);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEncodeable(string? fieldName,\n            IEncodeable? value, Type? systemType)\n        {\n            var fullName = GetFullNameOfEncodeable(value, systemType,\n                out var typeName, out var typeId);\n            if (typeName == null)\n            {\n                // Perform unvalidated write. TODO: Throw?\n                var currentSchema = GetFieldSchema(fieldName);\n                base.WriteEncodeable(fieldName, value, systemType);\n                ValidatedPop(currentSchema);\n                return;\n            }\n            ValidatedWrite(fieldName, fullName ?? typeName,\n                value, (f, v) => base.WriteEncodeable(f, v, systemType),\n                fullName != null);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteVariant(string? fieldName, Variant value)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            WriteVariant(value, currentSchema);\n            ValidatedPop(currentSchema);\n\n            void WriteVariant(Variant value, Schema currentSchema)\n            {\n                var expectedType = _builtIns.GetSchemaForBuiltInType(\n                                    BuiltInType.Variant, SchemaRank.Scalar);\n                // Write as variant\n                if (currentSchema.Fullname == expectedType.Fullname)\n                {\n                    base.WriteVariant(null, value);\n                    return;\n                }\n\n                // Alternatively the schema could be nullable\n                if (currentSchema is UnionSchema u)\n                {\n                    WriteWithSchema(u, () => WriteNullable(null, value.Value,\n                        (_, _) => WriteVariantValueWithSchema(value, u.Schemas[1])));\n                    return;\n                }\n\n                WriteVariantValueWithSchema(value, currentSchema);\n\n                void WriteVariantValueWithSchema(Variant value, Schema currentSchema)\n                {\n                    // Write as built in type\n                    if (currentSchema.IsBuiltInType(out var builtInType, out var rank))\n                    {\n                        if (value.TypeInfo != null)\n                        {\n                            if (SchemaUtils.GetRank(value.TypeInfo.ValueRank) != rank)\n                            {\n                                throw new EncodingException(\n                                    $\"Wrong schema {currentSchema.ToJson()} \" +\n                                    $\"of field {fieldName ?? \"unnamed\"} for variant has wrong \" +\n                                    $\"rank {rank} vs. {value.TypeInfo}.\", Schema.ToJson());\n                            }\n                            if (builtInType == BuiltInType.Enumeration) // or int?\n                            {\n                                if (value.TypeInfo.BuiltInType != BuiltInType.Int32 &&\n                                    value.TypeInfo.BuiltInType != BuiltInType.Enumeration)\n                                {\n                                    throw new EncodingException(\n                                        $\"Schema {currentSchema.ToJson()} \" +\n                                        $\"of field {fieldName ?? \"unnamed\"} should be enumeration\" +\n                                        $\"or int32 to support {value.TypeInfo}.\", Schema.ToJson());\n                                }\n                            }\n                            else if (value.TypeInfo.BuiltInType != builtInType)\n                            {\n                                throw new EncodingException(\n                                    $\"Wrong schema {currentSchema.ToJson()} \" +\n                                    $\"of field {fieldName ?? \"unnamed\"} for variant of type\" +\n                                    $\"{value.TypeInfo}.\", Schema.ToJson());\n                            }\n                        }\n\n                        WriteWithSchema(currentSchema,\n                            () => WriteVariantValue(value, builtInType, rank));\n                        return;\n                    }\n\n                    var typeId = currentSchema.GetDataTypeId(Context);\n                    var encodeable = (value.Value as ExtensionObject)?.Body as IEncodeable;\n                    var systemType = encodeable?.GetType()\n                        ?? Context.Factory.GetSystemType(typeId);\n                    if (systemType != null)\n                    {\n                        WriteWithSchema(currentSchema,\n                            () => WriteEncodeable(null, encodeable, systemType));\n                        return;\n                    }\n\n                    throw new EncodingException(\n                        $\"Variant schema {currentSchema.ToJson()} of \" +\n                        $\"field {fieldName ?? \"unnamed\"} is neither variant nor built \" +\n                        \"in type schema.\", Schema.ToJson());\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEnumerated(string? fieldName,\n            Enum? value)\n        {\n            WriteEnumerated(fieldName, Convert.ToInt32(value, CultureInfo.InvariantCulture));\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEnumerated(string? fieldName, int value)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            WriteEnumeratedValue(fieldName, value, currentSchema);\n            ValidatedPop(currentSchema);\n\n            void WriteEnumeratedValue(string? fieldName, int value, Schema currentSchema)\n            {\n                if (currentSchema.IsBuiltInType(out var builtInType, out var rank) &&\n                    rank == SchemaRank.Scalar &&\n                    (builtInType == BuiltInType.Int32 || builtInType == BuiltInType.Enumeration))\n                {\n                    WriteWithSchema(currentSchema, () => base.WriteEnumerated(fieldName, value));\n                }\n                else\n                {\n                    throw new EncodingException(\n                        $\"Invalid schema {currentSchema.ToJson()}. \" +\n                        \"Enumerated values must be enums.\", Schema.ToJson());\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void WriteBooleanArray(string? fieldName,\n            IList<bool>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Boolean, values,\n                base.WriteBooleanArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteSByteArray(string? fieldName,\n            IList<sbyte>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.SByte, values,\n                base.WriteSByteArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteByteArray(string? fieldName,\n            IList<byte>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.ByteString, values,\n                base.WriteByteArray, SchemaRank.Scalar);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt16Array(string? fieldName,\n            IList<short>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Int16, values,\n                base.WriteInt16Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt16Array(string? fieldName,\n            IList<ushort>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.UInt16, values,\n                base.WriteUInt16Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt32Array(string? fieldName,\n            IList<int>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Int32, values,\n                base.WriteInt32Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt32Array(string? fieldName,\n            IList<uint>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.UInt32, values,\n                base.WriteUInt32Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt64Array(string? fieldName,\n            IList<long>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Int64, values,\n                base.WriteInt64Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt64Array(string? fieldName,\n            IList<ulong>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.UInt64, values,\n                base.WriteUInt64Array, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteFloatArray(string? fieldName,\n            IList<float>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Float, values,\n                base.WriteFloatArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDoubleArray(string? fieldName,\n            IList<double>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Double, values,\n                base.WriteDoubleArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteStringArray(string? fieldName,\n            IList<string?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.String, values,\n                base.WriteStringArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDateTimeArray(string? fieldName,\n            IList<DateTime>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.DateTime, values,\n                base.WriteDateTimeArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteGuidArray(string? fieldName,\n            IList<Uuid>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Guid, values,\n                base.WriteGuidArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteGuidArray(string? fieldName,\n            IList<Guid>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.Guid, values,\n                base.WriteGuidArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteByteStringArray(string? fieldName,\n            IList<byte[]?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.ByteString, values,\n                base.WriteByteStringArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteXmlElementArray(string? fieldName,\n            IList<XmlElement?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.XmlElement, values,\n                base.WriteXmlElementArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteNodeIdArray(string? fieldName,\n            IList<NodeId?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.NodeId, values,\n                base.WriteNodeIdArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteExpandedNodeIdArray(string? fieldName,\n            IList<ExpandedNodeId?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.ExpandedNodeId, values,\n                base.WriteExpandedNodeIdArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteStatusCodeArray(string? fieldName,\n            IList<StatusCode>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.StatusCode, values,\n                base.WriteStatusCodeArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDiagnosticInfoArray(string? fieldName,\n            IList<DiagnosticInfo?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.DiagnosticInfo, values,\n                base.WriteDiagnosticInfoArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteQualifiedNameArray(string? fieldName,\n            IList<QualifiedName?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.QualifiedName, values,\n                base.WriteQualifiedNameArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteLocalizedTextArray(string? fieldName,\n            IList<LocalizedText?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.LocalizedText, values,\n                base.WriteLocalizedTextArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteVariantArray(string? fieldName,\n            IList<Variant>? values)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            WriteVariantArray(fieldName, values, currentSchema);\n            ValidatedPop(currentSchema);\n\n            void WriteVariantArray(string? fieldName, IList<Variant>? values,\n                Schema currentSchema)\n            {\n                var expectedType = _builtIns.GetSchemaForBuiltInType(\n                    BuiltInType.Variant, SchemaRank.Collection);\n                // Write as variant collection\n                if (currentSchema.Fullname == expectedType.Fullname)\n                {\n                    base.WriteVariantArray(fieldName, values);\n                    return;\n                }\n\n                // Write as built in type\n                if (currentSchema.IsBuiltInType(out var builtInType, out var rank))\n                {\n                    // When written in concise mode we get an array of bytes as byte string\n                    if (builtInType == BuiltInType.ByteString && rank == SchemaRank.Scalar)\n                    {\n                        WriteWithSchema(currentSchema, () => WriteScalar(builtInType,\n                            values?.Select(v => v.Value).Cast<byte>().ToArray()\n                            ?? []));\n                        return;\n                    }\n                    //\n                    // Rank should be collection, and all values to write should be\n                    // scalar and of the built in type\n                    //\n                    if (rank == SchemaRank.Collection)\n                    {\n                        WriteWithSchema(currentSchema, () => WriteArray(builtInType,\n                            values?.Select(v => v.Value).ToArray()\n                            ?? []));\n                        return;\n                    }\n\n                    throw new EncodingException(\n                        $\"Wrong schema {currentSchema.ToJson()} \" +\n                        $\"of field {fieldName ?? \"unnamed\"} to write variants.\",\n                        Schema.ToJson());\n                }\n\n                throw new EncodingException(\n                    $\"Variant schema {currentSchema.ToJson()} of \" +\n                    $\"field {fieldName ?? \"unnamed\"} is neither variant collection \" +\n                    \"nor built in type collection schema.\", Schema.ToJson());\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDataValueArray(string? fieldName,\n            IList<DataValue?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.DataValue, values,\n                base.WriteDataValueArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteExtensionObjectArray(string? fieldName,\n            IList<ExtensionObject?>? values)\n        {\n            ValidatedWrite(fieldName, BuiltInType.ExtensionObject, values,\n                base.WriteExtensionObjectArray, SchemaRank.Collection);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEnumeratedArray(string? fieldName, Array? values,\n            Type? systemType)\n        {\n            var ints = values == null ? [] : Enumerable\n                .Range(0, values.GetLength(0))\n                .Select(i => Convert.ToInt32((Enum?)values.GetValue(i),\n                    CultureInfo.InvariantCulture))\n                .ToArray();\n            WriteEnumeratedArray(fieldName, ints, systemType);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEnumeratedArray(string? fieldName, int[] values,\n            Type? enumType)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            WriteEnumeratedArray(fieldName, currentSchema);\n            ValidatedPop(currentSchema);\n\n            void WriteEnumeratedArray(string? fieldName, Schema currentSchema)\n            {\n                if (currentSchema is ArraySchema a && a.ItemSchema is EnumSchema e)\n                {\n                    WriteWithSchema(currentSchema, () =>\n                        base.WriteEnumeratedArray(fieldName, values, enumType));\n                }\n                else if (currentSchema.IsBuiltInType(out var builtInType, out var rank) &&\n                    rank == SchemaRank.Collection &&\n                    (builtInType == BuiltInType.Int32 || builtInType == BuiltInType.Enumeration))\n                {\n                    base.WriteEnumeratedArray(fieldName, values, enumType);\n                }\n                else\n                {\n                    throw new EncodingException(\n                        $\"Invalid schema {currentSchema.ToJson()}. \" +\n                        \"Enumerated values must be arrays of enums.\", Schema.ToJson());\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDataSet(string? fieldName, DataSet dataSet)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            WriteDataSet(dataSet, currentSchema);\n            ValidatedPop(currentSchema);\n\n            void WriteDataSet(DataSet dataSet, Schema currentSchema)\n            {\n                if (currentSchema is not RecordSchema r)\n                {\n                    throw new EncodingException(\n                        $\"Invalid schema {currentSchema.ToJson()}. \" +\n                        \"Data sets must be records or maps.\", Schema.ToJson());\n                }\n\n                // Serialize the fields in the schema\n                var lookup = dataSet.DataSetFields.ToDictionary(f => f.Name, f => f.Value);\n                foreach (var field in r.Fields)\n                {\n                    if (!lookup.TryGetValue(SchemaUtils.Unescape(field.Name),\n                        out var dataValue))\n                    {\n                        dataValue = null;\n                    }\n                    WriteDataSetField(field.Name, dataValue, field.Schema);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Write data set field\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"dataValue\"></param>\n        /// <param name=\"schema\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void WriteDataSetField(string? fieldName, DataValue? dataValue,\n            Schema schema)\n        {\n            if (schema is not UnionSchema u)\n            {\n                WriteVariant(fieldName, dataValue?.WrappedValue ?? default);\n            }\n            else if ((u.Schemas.Count > 1 && u.Schemas[1].IsDataValue())\n                || dataValue == null)\n            {\n                WriteNullable(fieldName, dataValue, (_, v) =>\n                {\n                    var currentSchema = GetFieldSchema(fieldName);\n                    WriteDataSetFieldValue(v, currentSchema);\n                    ValidatedPop(currentSchema);\n                });\n            }\n            else\n            {\n                WriteNullable(fieldName, dataValue.Value, (_, _) =>\n                {\n                    var currentSchema = GetFieldSchema(fieldName);\n                    WriteDataSetFieldValue(dataValue, currentSchema);\n                    ValidatedPop(currentSchema);\n                });\n            }\n\n            void WriteDataSetFieldValue(DataValue value, Schema currentSchema)\n            {\n                // The field is a record that should contain the data value fields\n                if (currentSchema is RecordSchema fieldRecord &&\n                    fieldRecord.IsDataValue())\n                {\n                    foreach (var dvf in fieldRecord.Fields)\n                    {\n                        switch (dvf.Name)\n                        {\n                            case nameof(value.Value):\n                                WriteVariant(nameof(value.Value),\n                                    value.WrappedValue);\n                                break;\n                            case nameof(value.SourceTimestamp):\n                                WriteDateTime(nameof(value.SourceTimestamp),\n                                    value.SourceTimestamp);\n                                break;\n                            case nameof(value.SourcePicoseconds):\n                                WriteUInt16(nameof(value.SourcePicoseconds),\n                                    value.SourcePicoseconds);\n                                break;\n                            case nameof(value.ServerTimestamp):\n                                WriteDateTime(nameof(value.ServerTimestamp),\n                                    value.ServerTimestamp);\n                                break;\n                            case nameof(value.ServerPicoseconds):\n                                WriteUInt16(nameof(value.ServerPicoseconds),\n                                    value.ServerPicoseconds);\n                                break;\n                            case nameof(value.StatusCode):\n                                WriteStatusCode(nameof(value.StatusCode),\n                                    value.StatusCode);\n                                break;\n                            default:\n                                throw new EncodingException(\n                                    $\"Unknown field {dvf.Name} in dataset field.\");\n                        }\n                    }\n                    return;\n                }\n\n                // Write value as variant\n                WriteWithSchema(currentSchema, () => WriteVariant(null, value.WrappedValue));\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void WriteObject(string? fieldName, string? typeName, Action writer)\n        {\n            var currentSchema = GetFieldSchema(fieldName);\n            if (currentSchema is not RecordSchema r)\n            {\n                throw new EncodingException(\n                    \"Objects must be records or maps.\", Schema.ToJson());\n            }\n            if (typeName != null && r.Name != typeName)\n            {\n                throw new EncodingException(\n                    $\"Object has type {r.Name} but expected {typeName}.\", Schema.ToJson());\n            }\n            base.WriteObject(fieldName, typeName, writer);\n            ValidatedPop(currentSchema);\n        }\n\n        /// <inheritdoc/>\n        protected override void WriteDiagnosticInfo(string? fieldName,\n            DiagnosticInfo value, int depth)\n        {\n            ValidatedWrite(fieldName, BuiltInType.DiagnosticInfo, value,\n                (f, v) => base.WriteDiagnosticInfo(f, v, depth));\n        }\n\n        /// <inheritdoc/>\n        protected override void WriteEncodedDataType(string? fieldName, ExtensionObject value)\n        {\n            ValidatedWrite(fieldName, SchemaUtils.NamespaceZeroName + \".EncodedDataType\",\n                value, base.WriteEncodedDataType);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteArray(string? fieldName, object array,\n            int valueRank, BuiltInType builtInType)\n        {\n            var currentSchema = GetFieldSchema(null);\n            if (!currentSchema.IsBuiltInType(out var expectedType, out var rank))\n            {\n                throw new EncodingException(\n                    $\"Schema {currentSchema.ToJson()} is not an array schema.\",\n                    Schema.ToJson());\n            }\n            if (rank != SchemaUtils.GetRank(valueRank) || builtInType != expectedType)\n            {\n                throw new EncodingException(\n                    $\"Schema {currentSchema.ToJson()} does not match expected rank and type.\",\n                    Schema.ToJson());\n            }\n            base.WriteArray(fieldName, array, valueRank, builtInType);\n            ValidatedPop(currentSchema);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteArray<T>(string? fieldName, IList<T>? values,\n            Action<T> writer, string? typeName = null)\n        {\n            ValidatedWriteArray(\n                () => base.WriteArray(fieldName, values, writer, typeName));\n        }\n\n        /// <inheritdoc/>\n        protected override void WriteArray(string? fieldName, Array? values,\n            Action<object?> writer)\n        {\n            ValidatedWriteArray(\n                () => base.WriteArray(fieldName, values, writer));\n        }\n\n        /// <inheritdoc/>\n        public override void WriteNull<T>(string? fieldName, T? value) where T : default\n        {\n            ValidatedWrite(fieldName, BuiltInType.Null, value,\n                base.WriteNull, SchemaRank.Scalar);\n        }\n\n        /// <inheritdoc/>\n        protected override void WriteNull(BuiltInType builtInType, SchemaRank valueRank)\n        {\n            var currentSchema = GetFieldSchema(null);\n            // Should be the same\n            if (currentSchema.Tag != Schema.Type.Null &&\n                (!currentSchema.IsBuiltInType(out _, out var rank) || rank != valueRank))\n            {\n                throw new EncodingException(\n                   $\"Schema {currentSchema.Fullname} is not expected variant null type.\",\n                   Schema.ToJson());\n            }\n            base.WriteNull(builtInType, valueRank);\n            ValidatedPop(currentSchema);\n        }\n\n        /// <inheritdoc/>\n        protected override void WriteNullable<T>(string? fieldName, T? value,\n            Action<string?, T> writer) where T : class\n        {\n            base.WriteNullable(fieldName, value, (f, v) =>\n            {\n                // Check the schema is a nullable union schema\n                if (Current is not UnionSchema u ||\n                    u.Count != 2 || u.Schemas[0].Tag != Schema.Type.Null)\n                {\n                    throw new EncodingException(\n                        $\"Union schema {Current.ToJson()} of nullable \" +\n                        $\"field {fieldName ?? \"unnamed\"} does not match.\", Schema.ToJson());\n                }\n                writer(f, v);\n            });\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUnion(string? fieldName, int index,\n            Action<int> writer)\n        {\n            // Get the union schema\n            var currentSchema = GetFieldSchema(fieldName);\n            if (currentSchema is not UnionSchema)\n            {\n                throw new EncodingException(\n                    $\"Union field {fieldName ?? \"unnamed\"} must be a union \" +\n                    $\"schema but is {currentSchema.ToJson()} schema.\", Schema.ToJson());\n            }\n            base.WriteUnion(fieldName, index, writer);\n        }\n\n        /// <inheritdoc/>\n        protected override void StartUnion(int index)\n        {\n            base.StartUnion(index);\n            _schema.ExpectUnionItem = u =>\n            {\n                if (index < u.Schemas.Count && index >= 0)\n                {\n                    return u.Schemas[index];\n                }\n                throw new EncodingException(\n                    $\"Union index {index} not found in union {u.ToJson()}.\",\n                    Schema.ToJson());\n            };\n        }\n\n        /// <inheritdoc/>\n        protected override void EndUnion()\n        {\n            var unionSchema = _schema.Pop();\n            if (unionSchema is not UnionSchema)\n            {\n                throw new EncodingException(\n                    $\"Expected union schema but got {unionSchema.ToJson()} after \" +\n                    \"completing union.\", Schema.ToJson());\n            }\n            base.EndUnion();\n        }\n\n        /// <summary>\n        /// Perform the read of the built in type after validating the\n        /// operation against the schema of the field if there is a field.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void ValidatedWrite<T>(string? fieldName, BuiltInType builtInType,\n            T value, Action<string?, T> writer, SchemaRank valueRank = SchemaRank.Scalar)\n        {\n            // Get expected schema\n            var expectedType = _builtIns.GetSchemaForBuiltInType(builtInType, valueRank);\n            var expectedName = expectedType.Fullname;\n            ValidatedWrite(fieldName, expectedName, value, writer);\n        }\n\n        /// <summary>\n        /// Validates reading a value against the schema\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"expectedSchemaName\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"isFullName\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void ValidatedWrite<T>(string? fieldName, string expectedSchemaName,\n            T value, Action<string?, T> writer, bool isFullName = true)\n        {\n            // Get current field schema\n            var currentSchema = GetFieldSchema(fieldName);\n\n            // Should be the same\n            var curName = isFullName ? currentSchema.Fullname : currentSchema.Name;\n            if (curName != expectedSchemaName)\n            {\n                throw new EncodingException(\n                    $\"Schema {currentSchema.Fullname} is not as \" +\n                    $\"expected {expectedSchemaName}.\", Schema.ToJson());\n            }\n\n            // Write type per schema\n            writer(fieldName, value);\n            ValidatedPop(currentSchema);\n        }\n\n        /// <summary>\n        /// Validated array writer\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void ValidatedWriteArray(Action writer)\n        {\n            var currentSchema = GetFieldSchema(null);\n            if (currentSchema is not ArraySchema)\n            {\n                throw new EncodingException(\n                    $\"Writing array field but schema {currentSchema.ToJson()} is not \" +\n                    \"array schema.\", Schema.ToJson());\n            }\n            writer();\n            ValidatedPop(currentSchema);\n        }\n\n        /// <summary>\n        /// Use specified schema by pushing it on top for writing\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"writer\"></param>\n        private void WriteWithSchema(Schema schema, Action writer)\n        {\n            var top = schema.AsArray();\n            _schema.Push(top);\n            writer();\n            ValidatedPop(top);\n        }\n\n        /// <summary>\n        /// Validate pop from stack should be expected schema\n        /// </summary>\n        /// <param name=\"expectedSchema\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void ValidatedPop(Schema expectedSchema)\n        {\n            // Pop array from stack\n            var completedSchema = _schema.Pop();\n            if (completedSchema != expectedSchema)\n            {\n                throw new EncodingException(\n                    $\"Failed to pop schema. Expected {expectedSchema.ToJson()} \" +\n                    $\"but got {completedSchema.ToJson()}.\", Schema.ToJson());\n            }\n        }\n\n        /// <summary>\n        /// Get next schema\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"EncodingException\"></exception>\n        private Schema GetFieldSchema(string? fieldName)\n        {\n            _schema.ExpectedFieldName = fieldName;\n            var current = _schema.Current;\n            if (!_schema.TryMoveNext())\n            {\n                throw new EncodingException(\n                    $\"No schema for field {fieldName ?? \"unnamed\"} \" +\n                    $\"found in {current.ToJson()}.\", Schema.ToJson());\n            }\n            return _schema.Current;\n        }\n\n        private readonly AvroBuiltInSchemas _builtIns = new();\n        private readonly AvroSchemaTraverser _schema;\n    }\n\n    /// <summary>\n    /// Schemaless encoder\n    /// </summary>\n    internal sealed class SchemalessAvroEncoder : BaseAvroEncoder\n    {\n        /// <inheritdoc/>\n        public SchemalessAvroEncoder(Stream stream,\n            IServiceMessageContext context, bool leaveOpen = true)\n            : base(stream, context, leaveOpen)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroFileReader.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Avro;\n    using Avro.File;\n    using Avro.IO;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n\n    /// <summary>\n    /// Read avro files\n    /// </summary>\n    public sealed class AvroFileReader : IDisposable\n    {\n        /// <summary>\n        /// Read avro file\n        /// </summary>\n        /// <param name=\"fileName\"></param>\n        public AvroFileReader(string fileName)\n        {\n            if (!fileName.EndsWith(\".avro\", StringComparison.InvariantCulture))\n            {\n                fileName += \".avro\";\n            }\n\n            _leaveOpen = false;\n            fileName = fileName.SanitizeFileName();\n            _stream = new FileStream(fileName, FileMode.Open);\n            try\n            {\n                _decoder = new BinaryDecoder(_stream);\n                _codec = ReadHeader();\n            }\n            catch\n            {\n                _stream.Dispose();\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Read from stream\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        public AvroFileReader(Stream stream)\n        {\n            _leaveOpen = true;\n            _stream = stream;\n            try\n            {\n                _decoder = new BinaryDecoder(_stream);\n                _codec = ReadHeader();\n            }\n            catch\n            {\n                _stream.Dispose();\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        public IEnumerable<T> Stream<T>(Func<Schema, Stream, T> reader)\n        {\n            while (HasMore())\n            {\n                yield return Read(reader);\n            }\n        }\n\n        /// <inheritdoc/>\n        public T Read<T>(Func<Schema, Stream, T> reader)\n        {\n            if (!HasMore() || _currentBlockStream == null)\n            {\n                throw new EndOfStreamException(\"No more objects remaining!\");\n            }\n\n            var result = reader(_header.Schema, _currentBlockStream);\n            _blockRemaining--;\n            if (_blockRemaining == 0)\n            {\n                _currentBlockStream.Dispose();\n                _currentBlockStream = null;\n            }\n            return result;\n        }\n\n        /// <inheritdoc/>\n        public bool HasMore()\n        {\n            return _blockRemaining != 0 || TryMoveToNextBlock();\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _currentBlockStream?.Dispose();\n            if (!_leaveOpen)\n            {\n                _stream.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Try moving to next block\n        /// </summary>\n        /// <returns></returns>\n        /// <exception cref=\"FormatException\"></exception>\n        private bool TryMoveToNextBlock()\n        {\n            // check to ensure still data to read\n            var currentPosition = _stream.Position;\n            if (_stream.ReadByte() == -1)\n            {\n                return false;\n            }\n            _stream.Position = currentPosition;\n\n            // read block count\n            _blockRemaining = _decoder.ReadLong();\n            // read block size\n            _blockSize = _decoder.ReadLong();\n            if (_blockSize > int.MaxValue || _blockSize < 0)\n            {\n                throw new FormatException(\n                    $\"Block size {_blockSize} invalid or too large.\");\n            }\n\n            // Read and decompress block\n            var buffer = new byte[_blockSize];\n            _decoder.ReadFixed(buffer, 0, buffer.Length);\n            _currentBlockStream = AvroFileWriter.Streams.GetStream(\n                _codec.Decompress(buffer, (int)_blockSize));\n\n            // Read sync marker\n            var marker = new byte[16];\n            _decoder.ReadFixed(marker);\n            if (!marker.SequenceEqual(_header.SyncData))\n            {\n                throw new FormatException(\"Invalid sync marker found!\");\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Read header\n        /// </summary>\n        /// <returns></returns>\n        private Codec ReadHeader()\n        {\n            ReadMagicBytes();\n            ReadMetaData();\n            _decoder.ReadFixed(_header.SyncData);\n\n            var schema = GetString(_header, DataFileConstants.MetaDataSchema);\n            _header.Schema = Schema.Parse(schema);\n\n            var codec = GetString(_header, DataFileConstants.MetaDataCodec);\n            return codec == null ? Codec.CreateCodec(Codec.Type.Null) :\n                Codec.CreateCodecFromString(codec);\n        }\n\n        /// <summary>\n        /// Read magic\n        /// </summary>\n        /// <exception cref=\"FormatException\"></exception>\n        private void ReadMagicBytes()\n        {\n            var firstBytes = new byte[DataFileConstants.Magic.Length];\n            try\n            {\n                _decoder.ReadFixed(firstBytes);\n            }\n            catch (Exception e)\n            {\n                throw new FormatException(\"Not a valid data file!\", e);\n            }\n            if (!firstBytes.SequenceEqual(DataFileConstants.Magic))\n            {\n                throw new FormatException(\"Not a valid data file!\");\n            }\n        }\n\n        /// <summary>\n        /// Read metadata\n        /// </summary>\n        private void ReadMetaData()\n        {\n            // read meta data\n            var len = _decoder.ReadMapStart();\n            if (len > 0)\n            {\n                do\n                {\n                    for (long i = 0; i < len; i++)\n                    {\n                        var key = _decoder.ReadString();\n                        var val = _decoder.ReadBytes();\n                        _header.MetaData.Add(key, val);\n                    }\n                }\n                while ((len = _decoder.ReadMapNext()) != 0);\n            }\n        }\n\n        /// <inheritdoc/>\n        private static string? GetString(Header header, string key)\n        {\n            if (!header.MetaData.TryGetValue(key, out var value))\n            {\n                return null;\n            }\n            return System.Text.Encoding.UTF8.GetString(value);\n        }\n\n        private readonly Codec _codec;\n        private readonly bool _leaveOpen;\n        private readonly Stream _stream;\n        private readonly Header _header = new();\n        private Stream? _currentBlockStream;\n        private long _blockRemaining;\n        private long _blockSize;\n        private readonly BinaryDecoder _decoder;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroFileWriter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Avro.File;\n    using Avro.IO;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Storage;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Microsoft.IO;\n    using System;\n    using System.Buffers;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Write avro files\n    /// </summary>\n    public sealed class AvroFileWriter : IFileWriter, IDisposable\n    {\n        /// <summary>\n        /// Memory manager\n        /// </summary>\n        internal static RecyclableMemoryStreamManager Streams { get; } = new();\n\n        /// <inheritdoc/>\n        public bool SupportsContentType(string contentType)\n        {\n            if (_options.Value.Disabled)\n            {\n                return false;\n            }\n            return\n                contentType.Equals(ContentType.Avro,\n                    StringComparison.OrdinalIgnoreCase) ||\n                contentType.Equals(ContentType.AvroGzip,\n                    StringComparison.OrdinalIgnoreCase);\n        }\n\n        /// <summary>\n        /// Create writer\n        /// </summary>\n        /// <param name=\"options\"></param>\n        /// <param name=\"logger\"></param>\n        public AvroFileWriter(IOptions<AvroFileWriterOptions> options,\n            ILogger<AvroFileWriter> logger)\n        {\n            _options = options;\n            _logger = logger;\n        }\n\n        /// <inheritdoc/>\n        public ValueTask WriteAsync(string fileName, DateTimeOffset timestamp,\n            IEnumerable<ReadOnlySequence<byte>> buffers,\n            IReadOnlyDictionary<string, string?>? metadata, IEventSchema? schema,\n            string contentType, CancellationToken ct = default)\n        {\n            if (schema?.Id != null)\n            {\n                fileName = fileName.SanitizeFileName();\n                var file = _files.GetOrAdd(fileName + schema.Id + contentType,\n                    _ => AvroFile.Create(fileName, schema.Schema, metadata, _logger,\n                        contentType.Equals(ContentType.AvroGzip,\n                            StringComparison.OrdinalIgnoreCase)));\n                file.Write(buffers);\n            }\n            return ValueTask.CompletedTask;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            foreach (var file in _files.Values)\n            {\n                file.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// The avro file being written\n        /// </summary>\n        internal sealed class AvroFile : IDisposable\n        {\n            /// <summary>\n            /// Create avro file\n            /// </summary>\n            /// <param name=\"fileName\"></param>\n            /// <param name=\"stream\"></param>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"metadata\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"leaveOpen\"></param>\n            /// <param name=\"isGzip\"></param>\n            private AvroFile(string fileName, Stream stream, string schema,\n                IReadOnlyDictionary<string, string?>? metadata, ILogger logger,\n                bool leaveOpen, bool isGzip)\n            {\n                _logger = logger;\n                _leaveOpen = leaveOpen;\n                _isGzip = isGzip;\n                _codec = Codec.CreateCodec(Codec.Type.Deflate);\n                _fileName = fileName;\n                _stream = stream;\n                _encoder = new BinaryEncoder(_stream);\n                _blockStream = Streams.GetStream();\n                _compressedBlockStream = Streams.GetStream();\n                _syncMarker = new byte[16];\n#pragma warning disable CA5394 // Do not use insecure randomness\n                Random.Shared.NextBytes(_syncMarker);\n#pragma warning restore CA5394 // Do not use insecure randomness\n\n                // Write header\n                _encoder.WriteFixed(DataFileConstants.Magic);\n                WriteMetaData(schema, metadata?\n                    .Where(kv => !IsReservedMeta(kv.Key) && kv.Value != null)\n                    .ToDictionary(kv => kv.Key, kv => Encoding.UTF8.GetBytes(kv.Value!)));\n                _encoder.WriteFixed(_syncMarker);\n            }\n\n            /// <summary>\n            /// Create file from file name\n            /// </summary>\n            /// <param name=\"fileName\"></param>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"metadata\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"isGzip\"></param>\n            /// <returns></returns>\n            public static AvroFile Create(string fileName, string schema,\n                IReadOnlyDictionary<string, string?>? metadata, ILogger logger,\n                bool isGzip = false)\n            {\n                fileName = fileName.ReplaceLineEndings();\n                var fs = new FileStream(fileName + \".avro\", FileMode.OpenOrCreate);\n                return new AvroFile(fileName, fs, schema, metadata, logger, false, isGzip);\n            }\n\n            /// <summary>\n            /// Create file from stream\n            /// </summary>\n            /// <param name=\"stream\"></param>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"metadata\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"isGzip\"></param>\n            /// <returns></returns>\n            public static AvroFile CreateFromStream(Stream stream, string schema,\n                IReadOnlyDictionary<string, string?>? metadata, ILogger logger,\n                bool isGzip = false)\n            {\n                return new AvroFile(string.Empty, stream, schema, metadata,\n                    logger, true, isGzip);\n            }\n\n            /// <summary>\n            /// Write to file\n            /// </summary>\n            /// <param name=\"buffers\"></param>\n            /// <returns></returns>\n            public void Write(IEnumerable<ReadOnlySequence<byte>> buffers)\n            {\n                foreach (var buffer in buffers)\n                {\n                    foreach (var memory in _isGzip ? buffer.GzipDecompress() : buffer)\n                    {\n                        _blockStream.Write(memory.Span);\n                    }\n                    _blockCount++;\n\n                    if (_blockStream.Position >= kBlockSize)\n                    {\n                        WriteBlocks();\n                    }\n                }\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                WriteBlocks();\n\n                _stream.Flush();\n                _blockStream.Dispose();\n\n                _compressedBlockStream.Dispose();\n\n                if (!_leaveOpen)\n                {\n                    _stream.Dispose();\n                }\n            }\n\n            /// <summary>\n            /// Writes the blocks.\n            /// </summary>\n            private void WriteBlocks()\n            {\n                if (_blockCount <= 0)\n                {\n                    return;\n                }\n\n                // write count\n                _encoder.WriteLong(_blockCount);\n\n                // write data\n                _codec.Compress(_blockStream, _compressedBlockStream);\n                _encoder.WriteBytes(_compressedBlockStream.GetBuffer(),\n                    0, (int)_compressedBlockStream.Length);\n\n                // write sync marker\n                _encoder.WriteFixed(_syncMarker);\n                _encoder.Flush();\n\n                _logger.BlocksWritten(_blockCount, _compressedBlockStream.Length, _fileName);\n\n                // reset / re-init block\n                _blockCount = 0;\n                _blockStream.SetLength(0);\n            }\n\n            /// <summary>\n            /// Writes the meta data.\n            /// </summary>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"metadata\"></param>\n            private void WriteMetaData(string schema,\n                Dictionary<string, byte[]>? metadata)\n            {\n                metadata ??= [];\n                metadata.Add(DataFileConstants.MetaDataCodec,\n                    Encoding.UTF8.GetBytes(_codec.GetName()));\n                metadata.Add(DataFileConstants.MetaDataSchema,\n                    Encoding.UTF8.GetBytes(schema));\n\n                // write metadata\n                var size = metadata.Count;\n\n                _encoder.WriteMapStart();\n                _encoder.SetItemCount(size);\n                foreach (var metaPair in metadata)\n                {\n                    _encoder.WriteString(metaPair.Key);\n                    _encoder.WriteBytes(metaPair.Value);\n                }\n                _encoder.WriteMapEnd();\n            }\n\n            /// <inheritdoc/>\n            private static bool IsReservedMeta(string key)\n            {\n                return key.StartsWith(\n                    DataFileConstants.MetaDataReserved, StringComparison.Ordinal);\n            }\n\n            private int _blockCount;\n            private readonly Codec _codec;\n            private readonly string _fileName;\n            private readonly Stream _stream;\n            private readonly MemoryStream _blockStream;\n            private readonly MemoryStream _compressedBlockStream;\n            private readonly byte[] _syncMarker;\n            private readonly BinaryEncoder _encoder;\n            private readonly ILogger _logger;\n            private readonly bool _leaveOpen;\n            private readonly bool _isGzip;\n        }\n\n        private const int kBlockSize = 16000;\n        private readonly ConcurrentDictionary<string, AvroFile> _files = new();\n        private readonly IOptions<AvroFileWriterOptions> _options;\n        private readonly ILogger _logger;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for AvroFileWriter\n    /// </summary>\n    internal static partial class AvroFileWriterLogging\n    {\n        private const int EventClass = 0;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"{BlockCount} blocks ({Size} bytes) written to {FileName}...\")]\n        public static partial void BlocksWritten(this ILogger logger, int blockCount,\n            long size, string fileName);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroFileWriterOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    /// <summary>\n    /// Options\n    /// </summary>\n    public sealed class AvroFileWriterOptions\n    {\n        /// <summary>\n        /// Do not write avro files\n        /// </summary>\n        public bool Disabled { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroSchemaBuilder.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Avro;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Reflection;\n    using System.Runtime.Serialization;\n    using System.Xml;\n\n    /// <summary>\n    /// Encodes objects and inline builds the schema from it\n    /// This type exists mainly for testing.\n    /// </summary>\n    public sealed class AvroSchemaBuilder : BaseAvroEncoder\n    {\n        /// <summary>\n        /// Schema to use\n        /// </summary>\n        public Schema Schema => _schemas.Peek().Unwrap();\n\n        /// <summary>\n        /// Creates an encoder that writes to the stream.\n        /// </summary>\n        /// <param name=\"stream\">The stream to which the encoder writes.\n        /// </param>\n        /// <param name=\"context\">The message context to use for the\n        /// encoding.</param>\n        /// <param name=\"leaveOpen\">If the stream should be left open on\n        /// dispose.</param>\n        /// <param name=\"emitConciseSchemas\">If the builder should avoid\n        /// creating large union schemas</param>\n        public AvroSchemaBuilder(Stream stream,\n            IServiceMessageContext context, bool leaveOpen = true,\n            bool emitConciseSchemas = false) :\n            base(stream, context, leaveOpen)\n        {\n            _emitConciseSchemas = emitConciseSchemas;\n        }\n\n        /// <inheritdoc/>\n        public override void WriteBoolean(string? fieldName, bool value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Boolean);\n            base.WriteBoolean(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteSByte(string? fieldName, sbyte value)\n        {\n            using var _ = Add(fieldName, BuiltInType.SByte);\n            base.WriteSByte(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteByte(string? fieldName, byte value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Byte);\n            base.WriteByte(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt16(string? fieldName, short value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Int16);\n            base.WriteInt16(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt16(string? fieldName, ushort value)\n        {\n            using var _ = Add(fieldName, BuiltInType.UInt16);\n            base.WriteUInt16(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt32(string? fieldName, int value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Int32);\n            base.WriteInt32(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt32(string? fieldName, uint value)\n        {\n            using var _ = Add(fieldName, BuiltInType.UInt32);\n            base.WriteUInt32(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt64(string? fieldName, long value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Int64);\n            base.WriteInt64(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt64(string? fieldName, ulong value)\n        {\n            using var _ = Add(fieldName, BuiltInType.UInt64);\n            base.WriteUInt64(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteFloat(string? fieldName, float value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Float);\n            base.WriteFloat(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDouble(string? fieldName, double value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Double);\n            base.WriteDouble(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteString(string? fieldName, string? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.String);\n            base.WriteString(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDateTime(string? fieldName, DateTime value)\n        {\n            using var _ = Add(fieldName, BuiltInType.DateTime);\n            base.WriteDateTime(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteGuid(string? fieldName, Uuid value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Guid);\n            base.WriteGuid(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteGuid(string? fieldName, Guid value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Guid);\n            base.WriteGuid(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteByteString(string? fieldName, byte[]? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.ByteString);\n            base.WriteByteString(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteXmlElement(string? fieldName, XmlElement? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.XmlElement);\n            base.WriteXmlElement(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteNodeId(string? fieldName, NodeId? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.NodeId);\n            base.WriteNodeId(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteExpandedNodeId(string? fieldName,\n            ExpandedNodeId? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.ExpandedNodeId);\n            base.WriteExpandedNodeId(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteStatusCode(string? fieldName, StatusCode value)\n        {\n            using var _ = Add(fieldName, BuiltInType.StatusCode);\n            base.WriteStatusCode(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDiagnosticInfo(string? fieldName,\n            DiagnosticInfo? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.DiagnosticInfo);\n            base.WriteDiagnosticInfo(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteQualifiedName(string? fieldName,\n            QualifiedName? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.QualifiedName);\n            base.WriteQualifiedName(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteLocalizedText(string? fieldName,\n            LocalizedText? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.LocalizedText);\n            base.WriteLocalizedText(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteVariant(string? fieldName, Variant value)\n        {\n            if (_emitConciseSchemas && value != Variant.Null && !_skipInnerSchemas)\n            {\n                if (value.Value is ExtensionObject eo && eo.Body is IEncodeable e)\n                {\n                    WriteEncodeable(fieldName, e, e.GetType());\n                    return;\n                }\n\n                var rank = SchemaUtils.GetRank(value.TypeInfo.ValueRank);\n                using var __ = Add(fieldName, value.TypeInfo.BuiltInType,\n                    SchemaUtils.GetRank(value.TypeInfo.ValueRank));\n                WriteVariantValue(value, value.TypeInfo.BuiltInType, rank);\n                return;\n            }\n\n            using var _ = Add(fieldName, BuiltInType.Variant);\n            base.WriteVariant(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDataValue(string? fieldName,\n            DataValue? value)\n        {\n            if (_emitConciseSchemas && value != null &&\n                value.WrappedValue != Variant.Null)\n            {\n                using var __ = Record(fieldName,\n                    value.WrappedValue.TypeInfo.BuiltInType + \"DataValue\");\n                base.WriteDataValue(fieldName, value);\n                return;\n            }\n            using var _ = Add(fieldName, BuiltInType.DataValue);\n            base.WriteDataValue(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteExtensionObject(string? fieldName,\n            ExtensionObject? value)\n        {\n            using var _ = Add(fieldName, BuiltInType.ExtensionObject);\n            base.WriteExtensionObject(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEncodeable(string? fieldName,\n            IEncodeable? value, Type? systemType)\n        {\n            var fullName = GetFullNameOfEncodeable(value, systemType,\n                out var typeName, out var typeId);\n            if (typeName == null)\n            {\n                throw new EncodingException(\n                    \"Failed to encode a encodeable without system type\");\n            }\n            using var _ = Record(fieldName, fullName ?? typeName, typeId: typeId);\n            base.WriteEncodeable(fieldName, value, systemType);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteObject(string? fieldName, string? typeName,\n            Action writer)\n        {\n            using var _ = Record(fieldName, typeName ?? fieldName ?? \"unknown\");\n            base.WriteObject(fieldName, typeName, writer);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEnumerated(string? fieldName, Enum? value)\n        {\n            using var _ = value == null ? Add(fieldName, BuiltInType.Enumeration) :\n                Enumeration(fieldName, value.GetType());\n            base.WriteEnumerated(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEnumerated(string? fieldName, int value)\n        {\n            using var _ = Add(fieldName, BuiltInType.Enumeration);\n            base.WriteEnumerated(fieldName, value);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteBooleanArray(string? fieldName,\n            IList<bool>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.Boolean, SchemaRank.Collection);\n            base.WriteBooleanArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteSByteArray(string? fieldName,\n            IList<sbyte>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.SByte, SchemaRank.Collection);\n            base.WriteSByteArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteByteArray(string? fieldName,\n            IList<byte>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.ByteString, SchemaRank.Scalar);\n            base.WriteByteArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt16Array(string? fieldName,\n            IList<short>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.Int16, SchemaRank.Collection);\n            base.WriteInt16Array(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt16Array(string? fieldName,\n            IList<ushort>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.UInt16, SchemaRank.Collection);\n            base.WriteUInt16Array(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt32Array(string? fieldName,\n            IList<int>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.Int32, SchemaRank.Collection);\n            base.WriteInt32Array(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt32Array(string? fieldName,\n            IList<uint>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.UInt32, SchemaRank.Collection);\n            base.WriteUInt32Array(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteInt64Array(string? fieldName,\n            IList<long>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.Int64, SchemaRank.Collection);\n            base.WriteInt64Array(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteUInt64Array(string? fieldName,\n            IList<ulong>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.UInt64, SchemaRank.Collection);\n            base.WriteUInt64Array(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteFloatArray(string? fieldName,\n            IList<float>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.Float, SchemaRank.Collection);\n            base.WriteFloatArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDoubleArray(string? fieldName,\n            IList<double>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.Double, SchemaRank.Collection);\n            base.WriteDoubleArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteStringArray(string? fieldName,\n            IList<string?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.String, SchemaRank.Collection);\n            base.WriteStringArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDateTimeArray(string? fieldName,\n            IList<DateTime>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.DateTime, SchemaRank.Collection);\n            base.WriteDateTimeArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteGuidArray(string? fieldName,\n            IList<Uuid>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.Guid, SchemaRank.Collection);\n            base.WriteGuidArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteGuidArray(string? fieldName,\n            IList<Guid>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.Guid, SchemaRank.Collection);\n            base.WriteGuidArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteByteStringArray(string? fieldName,\n            IList<byte[]?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.ByteString, SchemaRank.Collection);\n            base.WriteByteStringArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteXmlElementArray(string? fieldName,\n            IList<XmlElement?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.XmlElement, SchemaRank.Collection);\n            base.WriteXmlElementArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteNodeIdArray(string? fieldName,\n            IList<NodeId?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.NodeId, SchemaRank.Collection);\n            base.WriteNodeIdArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteExpandedNodeIdArray(string? fieldName,\n            IList<ExpandedNodeId?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.ExpandedNodeId, SchemaRank.Collection);\n            base.WriteExpandedNodeIdArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteStatusCodeArray(string? fieldName,\n            IList<StatusCode>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.StatusCode, SchemaRank.Collection);\n            base.WriteStatusCodeArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDiagnosticInfoArray(string? fieldName,\n            IList<DiagnosticInfo?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.DiagnosticInfo, SchemaRank.Collection);\n            base.WriteDiagnosticInfoArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteQualifiedNameArray(string? fieldName,\n            IList<QualifiedName?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.QualifiedName, SchemaRank.Collection);\n            base.WriteQualifiedNameArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteLocalizedTextArray(string? fieldName,\n            IList<LocalizedText?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.LocalizedText, SchemaRank.Collection);\n            base.WriteLocalizedTextArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteVariantArray(string? fieldName,\n            IList<Variant>? values)\n        {\n            if (_emitConciseSchemas && values?.Count > 0 && !_skipInnerSchemas)\n            {\n                var typeInfo = values[0].TypeInfo;\n                if (typeInfo.ValueRank == ValueRanks.Scalar &&\n                    values.All(v => typeInfo.Equals(v.TypeInfo)))\n                {\n                    WriteArray(typeInfo.BuiltInType, values.Select(v => v.Value).ToArray());\n                    return;\n                }\n            }\n            using var _ = Add(fieldName, BuiltInType.Variant, SchemaRank.Collection);\n            base.WriteVariantArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDataValueArray(string? fieldName,\n            IList<DataValue?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.DataValue, SchemaRank.Collection);\n            base.WriteDataValueArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteExtensionObjectArray(string? fieldName,\n            IList<ExtensionObject?>? values)\n        {\n            using var _ = Add(fieldName, BuiltInType.ExtensionObject, SchemaRank.Collection);\n            base.WriteExtensionObjectArray(fieldName, values);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEncodeableArray(string? fieldName,\n            IList<IEncodeable>? values, Type? systemType)\n        {\n            base.WriteEncodeableArray(fieldName, values, systemType);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEnumeratedArray(string? fieldName,\n            Array? values, Type? systemType)\n        {\n            var enumType = values?.GetType().GetElementType() ?? systemType;\n            using var _ = enumType == null ?\n                Add(fieldName, BuiltInType.Enumeration, SchemaRank.Collection) :\n                Enumeration(fieldName, enumType, SchemaRank.Collection);\n            base.WriteEnumeratedArray(fieldName, values, systemType);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteEnumeratedArray(string? fieldName,\n            int[] values, Type? enumType)\n        {\n            using var _ = Add(fieldName, BuiltInType.Enumeration, SchemaRank.Collection);\n            base.WriteEnumeratedArray(fieldName, values, enumType);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteArray(string? fieldName, object array,\n            int valueRank, BuiltInType builtInType)\n        {\n            using var _ = Add(fieldName, builtInType, SchemaUtils.GetRank(valueRank));\n            base.WriteArray(fieldName, array, valueRank, builtInType);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteDataSet(string? fieldName, DataSet dataSet)\n        {\n            using var _ = Record(fieldName, fieldName + nameof(DataSet));\n            base.WriteDataSet(fieldName, dataSet);\n        }\n\n        /// <inheritdoc/>\n        public override void WriteArray<T>(string? fieldName, IList<T>? values,\n            Action<T> writer, string? typeName = null)\n        {\n            using var _ = Array(fieldName);\n            base.WriteArray(fieldName, values, writer);\n        }\n\n        /// <inheritdoc/>\n        protected override void WriteNullable<T>(string? fieldName, T? value,\n            Action<string?, T> writer) where T : class\n        {\n            using var _ = Union(fieldName, true);\n            base.WriteNullable(fieldName, value, writer);\n            if (value == null)\n            {\n                //\n                // We need to add the type to the schema even in case of\n                // null value.\n                // Try to be generic enough, but this will not work for\n                // everything at this point. Need to update if tests fail.\n                // Today we use this for DiagnosticInfo and DataValue\n                //\n                SchemaRank rank;\n                var type = typeof(T);\n                if (typeof(T).IsArray)\n                {\n                    rank = SchemaRank.Collection;\n                    type = type.GetElementType();\n                }\n                else\n                {\n                    rank = SchemaRank.Scalar;\n                }\n                var builtInType = Enum.Parse<BuiltInType>(type!.Name);\n                using var __ = Add(fieldName, builtInType, rank);\n            }\n        }\n\n        /// <summary>\n        /// Add field\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"valueRanks\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private IDisposable Add(string? fieldName, BuiltInType builtInType,\n            SchemaRank valueRanks = SchemaRank.Scalar)\n        {\n            if (_skipInnerSchemas)\n            {\n                return Nothing.ToDo;\n            }\n            _skipInnerSchemas = true;\n            var schema = _builtIns.GetSchemaForBuiltInType(builtInType,\n                valueRanks);\n            if (!_schemas.TryPeek(out var top))\n            {\n                _schemas.Push(schema.CreateRoot(fieldName));\n            }\n            else if (top is ArraySchema arr)\n            {\n                arr.ItemSchema = schema;\n            }\n            else if (top is UnionSchema u)\n            {\n                u.Schemas.Add(schema);\n            }\n            else if (top is RecordSchema r)\n            {\n                r.Fields.Add(new Field(schema, fieldName ?? kDefaultFieldName,\n                    r.Fields.Count));\n            }\n            else\n            {\n                throw new EncodingException(\"No record schema to push to\",\n                    Schema.ToJson());\n            }\n            return new Skip(this);\n        }\n\n        /// <summary>\n        /// Push enum schema\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"enumType\"></param>\n        /// <param name=\"rank\"></param>\n        /// <returns></returns>\n        private IDisposable Enumeration(string? fieldName, Type enumType,\n            SchemaRank rank = SchemaRank.Scalar)\n        {\n            if (_skipInnerSchemas)\n            {\n                return Nothing.ToDo;\n            }\n            // Get enum types from DataMemberAttribute\n            var names = enumType.GetProperties()\n                .Select(p => p.GetCustomAttribute<DataMemberAttribute>()!)\n                .Where(a => a?.Name != null)\n                .OrderBy(a => a.Order)\n                .Select(a => a.Name!)\n                .ToArray();\n            if (names.Length == 0)\n            {\n                names = Enum.GetNames(enumType);\n            }\n            Schema schema = EnumSchema.Create(enumType.Name, names);\n            if (rank == SchemaRank.Collection)\n            {\n                schema = schema.AsArray();\n            }\n            return PushSchema(fieldName, schema);\n        }\n\n        /// <summary>\n        /// Push a new record schema as field\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"typeName\"></param>\n        /// <param name=\"typeId\"></param>\n        /// <returns></returns>\n        private IDisposable Record(string? fieldName, string typeName,\n            ExpandedNodeId? typeId = null)\n        {\n            if (_skipInnerSchemas)\n            {\n                return Nothing.ToDo;\n            }\n            var schema = RecordSchema.Create(typeName, [],\n                customProperties: AvroSchema.Properties(\n                    typeId?.AsString(Context, NamespaceFormat.Uri)));\n            return PushSchema(fieldName, schema);\n        }\n\n        /// <summary>\n        /// Push a new array schema as field\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <returns></returns>\n        private IDisposable Array(string? fieldName)\n        {\n            if (_skipInnerSchemas)\n            {\n                return Nothing.ToDo;\n            }\n            return PushSchema(fieldName, AvroSchema.CreatePlaceHolder(\"Dummy\", \"\").AsArray(\n));\n        }\n\n        /// <summary>\n        /// Push a union\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"nullable\"></param>\n        /// <returns></returns>\n        private IDisposable Union(string? fieldName, bool nullable = false)\n        {\n            if (_skipInnerSchemas)\n            {\n                return Nothing.ToDo;\n            }\n            var schema = UnionSchema.Create([]);\n            if (nullable)\n            {\n                schema.Schemas.Add(AvroSchema.Null);\n            }\n            return PushSchema(fieldName, schema);\n        }\n\n        /// <summary>\n        /// Push schema\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"schema\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"EncodingException\"></exception>\n        private Pop PushSchema(string? fieldName, Schema schema)\n        {\n            if (!_schemas.TryPeek(out var top))\n            {\n                _schemas.Push(schema.CreateRoot(fieldName));\n            }\n            else if (top is ArraySchema arr)\n            {\n                arr.ItemSchema = schema;\n            }\n            else if (top is UnionSchema u)\n            {\n                u.Schemas.Add(schema);\n            }\n            else if (top is RecordSchema r)\n            {\n                r.Fields.Add(new Field(schema, fieldName ?? kDefaultFieldName,\n                    r.Fields.Count));\n            }\n            else\n            {\n                throw new EncodingException(\"No record schema to push to.\",\n                    Schema.ToJson());\n            }\n            _schemas.Push(schema);\n            return new Pop(this);\n        }\n\n        private sealed record Pop(AvroSchemaBuilder Outer) : IDisposable\n        {\n            public void Dispose()\n            {\n                Outer._schemas.Pop();\n            }\n        }\n\n        private sealed record Skip(AvroSchemaBuilder Outer) : IDisposable\n        {\n            public void Dispose()\n            {\n                Outer._skipInnerSchemas = false;\n            }\n        }\n\n        private sealed class Nothing : IDisposable\n        {\n            public static readonly Nothing ToDo = new();\n\n            public void Dispose()\n            {\n            }\n        }\n\n        private readonly Stack<Schema> _schemas = new();\n        private readonly AvroBuiltInSchemas _builtIns = new();\n        private readonly bool _emitConciseSchemas;\n        private bool _skipInnerSchemas;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/AvroSchemaTraverser.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Avro;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n\n    /// <summary>\n    /// Allows a encoder or decoder to follow the schema\n    /// </summary>\n    internal sealed class AvroSchemaTraverser\n    {\n        /// <summary>\n        /// Current schema\n        /// </summary>\n        public Schema Current => _schemas.Peek().Schema;\n\n        /// <summary>\n        /// Set Expected field name\n        /// </summary>\n        public string? ExpectedFieldName { get; set; }\n\n        /// <summary>\n        /// Set union selector\n        /// </summary>\n        public Func<UnionSchema, Schema?>? ExpectUnionItem { get; set; }\n\n        /// <summary>\n        /// Create traversal\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        public AvroSchemaTraverser(Schema schema)\n        {\n            //\n            // We need to push a root schema to start traversal\n            // Either this is already a root schema for example\n            // if the value was not a record or a record on a\n            // field or we create an artificial one using array\n            // schema to start moving to the actual schema the\n            // first time move next is called.\n            //\n            Push(schema.IsRoot() ? schema : schema.AsArray());\n        }\n\n        /// <summary>\n        /// Try to continue traversal to next schema\n        /// </summary>\n        /// <returns></returns>\n        public bool TryMoveNext()\n        {\n            return _schemas.TryPeek(out var s) && s.TryMoveNext();\n        }\n\n        /// <summary>\n        /// Push schema on stack\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        public void Push(Schema schema)\n        {\n            if (_types.TryGetValue(schema.Fullname, out var seen))\n            {\n                //\n                // Partial types must be replaced with full type\n                // to handle recursive declarations correctly.\n                //\n                schema = seen;\n            }\n            else if (schema is RecordSchema record)\n            {\n                // Add the record to the list of types\n                _types.AddOrUpdate(record.Fullname, record);\n            }\n\n            _schemas.Push(schema switch\n            {\n                RecordSchema r => new RecordTraverser(this, r),\n                ArraySchema a => new ArrayTraverser(this, a),\n                UnionSchema u => new UnionTraverser(this, u),\n                _ => new Traverser(this, schema)\n            });\n        }\n\n        /// <summary>\n        /// Validate we completed traversal\n        /// </summary>\n        public bool IsDone()\n        {\n            Debug.Assert(_schemas.Count > 0);\n            if (_schemas.Count == 1)\n            {\n                // See constructor\n                var root = _schemas.Peek();\n                return root.Schema is ArraySchema || root.Schema.IsRoot();\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Allows to pop top traverser from stack\n        /// </summary>\n        public Schema Pop()\n        {\n            var traverser = _schemas.Pop();\n            return traverser.Schema;\n        }\n\n        /// <summary>\n        /// Generic traversal\n        /// </summary>\n        private class Traverser\n        {\n            /// <summary>\n            /// Schema\n            /// </summary>\n            public Schema Schema { get; }\n\n            /// <summary>\n            /// Create record traverers\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"schema\"></param>\n            public Traverser(AvroSchemaTraverser outer, Schema schema)\n            {\n                _outer = outer;\n                Schema = schema;\n            }\n\n            /// <inheritdoc/>\n            public virtual bool TryMoveNext()\n            {\n                if (_outer.ExpectedFieldName != null)\n                {\n                    // There are no fields in here\n                    return false;\n                }\n                return true;\n            }\n\n            protected readonly AvroSchemaTraverser _outer;\n        }\n\n        /// <summary>\n        /// Array traversal\n        /// </summary>\n        private class ArrayTraverser : Traverser\n        {\n            /// <summary>\n            /// Create record traverers\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"schema\"></param>\n            public ArrayTraverser(AvroSchemaTraverser outer,\n                ArraySchema schema) : base(outer, schema)\n            {\n                _array = schema;\n            }\n\n            /// <inheritdoc/>\n            public override bool TryMoveNext()\n            {\n                if (_outer.ExpectedFieldName != null)\n                {\n                    // There are no fields in here\n                    return false;\n                }\n                _outer.Push(_array.ItemSchema);\n                return true;\n            }\n\n            private readonly ArraySchema _array;\n        }\n\n        /// <summary>\n        /// Array traversal\n        /// </summary>\n        private class UnionTraverser : Traverser\n        {\n            /// <summary>\n            /// Create union traverser\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"schema\"></param>\n            public UnionTraverser(AvroSchemaTraverser outer,\n                UnionSchema schema) : base(outer, schema)\n            {\n                _union = schema;\n            }\n\n            /// <inheritdoc/>\n            public override bool TryMoveNext()\n            {\n                if (_outer.ExpectUnionItem == null)\n                {\n                    return false;\n                }\n\n                var selected = _outer.ExpectUnionItem(_union);\n                if (selected == null)\n                {\n                    return false;\n                }\n                _outer.Push(selected);\n                return true;\n            }\n\n            private readonly UnionSchema _union;\n        }\n\n        /// <summary>\n        /// Record traverser\n        /// </summary>\n        private sealed class RecordTraverser : Traverser\n        {\n            /// <summary>\n            /// Create record traverers\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"schema\"></param>\n            public RecordTraverser(AvroSchemaTraverser outer,\n                RecordSchema schema) : base(outer, schema)\n            {\n                _record = schema;\n            }\n\n            /// <inheritdoc/>\n            public override bool TryMoveNext()\n            {\n                Debug.Assert(_pos >= 0);\n\n                if (_pos == _record.Count)\n                {\n                    _pos = 0;\n                }\n                var field = _record.Fields[_pos];\n                var fieldName = _outer.ExpectedFieldName;\n                _outer.ExpectedFieldName = null;\n                if (fieldName != null && field.Name != fieldName)\n                {\n                    var schemaField = SchemaUtils.Escape(fieldName);\n                    if (!_record.TryGetField(schemaField, out field) &&\n                        !_record.TryGetFieldAlias(schemaField, out field))\n                    {\n                        return false;\n                    }\n                    _pos = field.Pos - 1;\n                }\n                _outer.Push(field.Schema);\n                _pos++;\n                return true;\n            }\n\n            private readonly RecordSchema _record;\n            private int _pos;\n        }\n\n        private readonly Dictionary<string, RecordSchema> _types = [];\n        private readonly Stack<Traverser> _schemas = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/BaseAvroDecoder.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Buffers.Binary;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Text;\n    using System.Xml;\n\n    /// <summary>\n    /// Decodes objects from a Avro Binary encoded stream.\n    /// </summary>\n    public abstract class BaseAvroDecoder : IDecoder\n    {\n        /// <inheritdoc/>\n        public virtual EncodingType EncodingType => (EncodingType)3;\n\n        /// <inheritdoc/>\n        public virtual IServiceMessageContext Context { get; }\n\n        /// <summary>\n        /// Create avro decoder\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"leaveOpen\"></param>\n        protected BaseAvroDecoder(Stream stream, IServiceMessageContext context,\n            bool leaveOpen = false)\n        {\n            _reader = new AvroBinaryReader(stream, leaveOpen)\n            {\n                MaxBytesLength = context.MaxByteStringLength,\n                MaxStringLength = context.MaxStringLength\n            };\n            Context = context;\n            _nestingLevel = 0;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Dispose\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                _reader.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual void Close()\n        {\n            // Dispose\n        }\n\n        /// <inheritdoc/>\n        public virtual void PushNamespace(string namespaceUri)\n        {\n            // not used in the binary encoding.\n        }\n\n        /// <inheritdoc/>\n        public virtual void PopNamespace()\n        {\n            // not used in the binary encoding.\n        }\n\n        /// <inheritdoc/>\n        public virtual void SetMappingTables(NamespaceTable? namespaceUris,\n            StringTable? serverUris)\n        {\n            _namespaceMappings = null;\n\n            if (namespaceUris != null && Context.NamespaceUris != null)\n            {\n                _namespaceMappings = Context.NamespaceUris.CreateMapping(\n                    namespaceUris, false);\n            }\n\n            _serverMappings = null;\n\n            if (serverUris != null && Context.ServerUris != null)\n            {\n                _serverMappings = Context.ServerUris.CreateMapping(\n                    serverUris, false);\n            }\n        }\n\n        /// <inheritdoc/>\n        public IEncodeable DecodeMessage(Type expectedType)\n        {\n            throw ServiceResultException.Create(StatusCodes.BadNotSupported,\n                \"Not supported in this decoder.\");\n        }\n\n        /// <inheritdoc/>\n        public uint ReadSwitchField(IList<string> switches, out string fieldName)\n        {\n            fieldName = switches[0];\n            return 0; // TODO\n        }\n\n        /// <inheritdoc/>\n        public uint ReadEncodingMask(IList<string> masks)\n        {\n            return 0; // TODO\n        }\n\n        /// <inheritdoc/>\n        public virtual bool ReadBoolean(string? fieldName)\n        {\n            return _reader.ReadBoolean();\n        }\n\n        /// <inheritdoc/>\n        public virtual sbyte ReadSByte(string? fieldName)\n        {\n            return (sbyte)_reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual byte ReadByte(string? fieldName)\n        {\n            return (byte)_reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual short ReadInt16(string? fieldName)\n        {\n            return (short)_reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual ushort ReadUInt16(string? fieldName)\n        {\n            return (ushort)_reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual int ReadInt32(string? fieldName)\n        {\n            return (int)_reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual uint ReadUInt32(string? fieldName)\n        {\n            return (uint)_reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual long ReadInt64(string? fieldName)\n        {\n            return _reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual ulong ReadUInt64(string? fieldName)\n        {\n            // ulong is a union of long and fixed (> long.max)\n            var index = _reader.ReadInteger();\n            if (index == 0)\n            {\n                return (ulong)_reader.ReadInteger();\n            }\n\n            Span<byte> bytes = stackalloc byte[sizeof(ulong)];\n            _reader.ReadFixed(bytes);\n            return BinaryPrimitives.ReadUInt64LittleEndian(bytes);\n        }\n\n        /// <inheritdoc/>\n        public virtual float ReadFloat(string? fieldName)\n        {\n            return _reader.ReadFloat();\n        }\n\n        /// <inheritdoc/>\n        public virtual double ReadDouble(string? fieldName)\n        {\n            return _reader.ReadDouble();\n        }\n\n        /// <inheritdoc/>\n        public virtual Uuid ReadGuid(string? fieldName)\n        {\n#if UUID_FIXED\n            Span<byte> bytes = stackalloc byte[16];\n            _reader.ReadFixed(bytes);\n            return new Uuid(new Guid(bytes));\n#else\n            var uuid = _reader.ReadString();\n            return new Uuid(Guid.Parse(uuid));\n#endif\n        }\n\n        /// <inheritdoc/>\n        public virtual string? ReadString(string? fieldName)\n        {\n            return _reader.ReadString();\n        }\n\n        /// <inheritdoc/>\n        public virtual DateTime ReadDateTime(string? fieldName)\n        {\n            var ticks = _reader.ReadInteger();\n\n            if (ticks >= (long.MaxValue - Opc.Ua.Utils.TimeBase.Ticks))\n            {\n                return DateTime.MaxValue;\n            }\n\n            ticks += Opc.Ua.Utils.TimeBase.Ticks;\n\n            if (ticks >= DateTime.MaxValue.Ticks)\n            {\n                return DateTime.MaxValue;\n            }\n\n            if (ticks <= Opc.Ua.Utils.TimeBase.Ticks)\n            {\n                return DateTime.MinValue;\n            }\n\n            return new DateTime(ticks, DateTimeKind.Utc);\n        }\n\n        /// <inheritdoc/>\n        public virtual byte[] ReadByteString(string? fieldName)\n        {\n            return _reader.ReadBytes();\n        }\n\n        /// <inheritdoc/>\n        public virtual XmlElement ReadXmlElement(string? fieldName)\n        {\n            var xmlString = _reader.ReadString();\n            var document = new XmlDocument();\n            try\n            {\n                using var stream = new StringReader(xmlString);\n                using var reader = XmlReader.Create(stream,\n                    Opc.Ua.Utils.DefaultXmlReaderSettings());\n                document.Load(reader);\n            }\n            catch (XmlException ex)\n            {\n                throw new DecodingException(\"Xml element invalid\", ex);\n            }\n            return document.DocumentElement!;\n        }\n\n        /// <inheritdoc/>\n        public virtual NodeId ReadNodeId(string? fieldName)\n        {\n            //\n            // Node id is a record, with namespace and union of\n            // the id. The IdType value represents the union\n            // discriminator.\n            //\n            // Node id is not nullable, i=0 is a null node id.\n            //\n            var namespaceUri = ReadString(\"Namespace\");\n            var namespaceIndex = string.IsNullOrEmpty(namespaceUri) ?\n                (ushort)0 :\n                Context.NamespaceUris.GetIndexOrAppend(namespaceUri);\n            if (_namespaceMappings != null &&\n                _namespaceMappings.Length > namespaceIndex)\n            {\n                namespaceIndex = _namespaceMappings[namespaceIndex];\n            }\n            return ReadNodeId(namespaceIndex);\n        }\n\n        /// <inheritdoc/>\n        public virtual ExpandedNodeId ReadExpandedNodeId(string? fieldName)\n        {\n            //\n            // Expanded Node id is a record extending NodeId.\n            // Namespace, and union of via IdType which represents\n            // the union discriminator.  After that we write the\n            // namespace uri and then server index.\n            //\n            // ExpandedNode id is not nullable, i=0 is a null node id.\n            //\n            var namespaceUri = ReadString(\"Namespace\");\n            var namespaceIndex = string.IsNullOrEmpty(namespaceUri) ?\n                (ushort)0 :\n                Context.NamespaceUris.GetIndexOrAppend(namespaceUri);\n            if (_namespaceMappings != null &&\n                _namespaceMappings.Length > namespaceIndex)\n            {\n                namespaceIndex = _namespaceMappings[namespaceIndex];\n            }\n\n            var innerNodeId = ReadNodeId(namespaceIndex);\n            var serverUri = ReadString(\"ServerUri\");\n\n            if (NodeId.IsNull(innerNodeId))\n            {\n                return ExpandedNodeId.Null;\n            }\n\n            var serverIndex = string.IsNullOrEmpty(serverUri) ? 0u :\n                Context.ServerUris.GetIndexOrAppend(serverUri);\n            if (_serverMappings != null &&\n                _serverMappings.Length > serverIndex)\n            {\n                serverIndex = _serverMappings[serverIndex];\n            }\n            return new ExpandedNodeId(innerNodeId, namespaceUri, serverIndex);\n        }\n\n        /// <inheritdoc/>\n        public virtual StatusCode ReadStatusCode(string? fieldName)\n        {\n            return (StatusCode)_reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual DiagnosticInfo ReadDiagnosticInfo(string? fieldName)\n        {\n            return ReadDiagnosticInfo(fieldName, 0);\n        }\n\n        /// <inheritdoc/>\n        public virtual QualifiedName ReadQualifiedName(string? fieldName)\n        {\n            var namespaceUri = ReadString(\"Namespace\");\n            var name = ReadString(nameof(QualifiedName.Name));\n\n            var namespaceIndex = string.IsNullOrEmpty(namespaceUri) ?\n                (ushort)0 :\n                Context.NamespaceUris.GetIndexOrAppend(namespaceUri);\n            if (_namespaceMappings != null &&\n                _namespaceMappings.Length > namespaceIndex)\n            {\n                namespaceIndex = _namespaceMappings[namespaceIndex];\n            }\n            return new QualifiedName(name, namespaceIndex);\n        }\n\n        /// <inheritdoc/>\n        public virtual LocalizedText ReadLocalizedText(string? fieldName)\n        {\n            return new LocalizedText(\n                ReadString(nameof(LocalizedText.Locale)),\n                ReadString(nameof(LocalizedText.Text)));\n        }\n\n        /// <inheritdoc/>\n        public virtual Variant ReadVariant(string? fieldName)\n        {\n            CheckAndIncrementNestingLevel();\n            try\n            {\n                // Read Union discriminator for the variant\n                return ReadUnion(fieldName, fieldId =>\n                {\n                    if (fieldId < 0 || fieldId >= VariantUnionFieldIds.Length)\n                    {\n                        throw new DecodingException(\n                            $\"Cannot decode unknown variant union field {fieldId}.\");\n                    }\n                    var (valueRank, builtInType) = VariantUnionFieldIds[fieldId];\n                    return ReadVariantValue(builtInType, valueRank);\n                });\n            }\n            finally\n            {\n                _nestingLevel--;\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual DataValue ReadDataValue(string? fieldName)\n        {\n            return new DataValue\n            {\n                WrappedValue = ReadVariant(nameof(DataValue.Value)),\n                StatusCode = ReadStatusCode(nameof(DataValue.StatusCode)),\n                SourceTimestamp = ReadDateTime(nameof(DataValue.SourceTimestamp)),\n                SourcePicoseconds = ReadUInt16(nameof(DataValue.SourcePicoseconds)),\n                ServerTimestamp = ReadDateTime(nameof(DataValue.ServerTimestamp)),\n                ServerPicoseconds = ReadUInt16(nameof(DataValue.ServerPicoseconds))\n            };\n        }\n\n        /// <inheritdoc/>\n        public virtual T ReadObject<T>(string? fieldName, Func<object?, T> reader)\n        {\n            return reader(null);\n        }\n\n        /// <inheritdoc/>\n        public virtual DataSet ReadDataSet(string? fieldName)\n        {\n            return ReadUnion(fieldName, avroFieldContent =>\n            {\n                var fieldNames = Array.Empty<string>();\n                var dataSet = new List<(string, DataValue?)>();\n                var dataSetFieldContentMask = avroFieldContent == 0 ?\n                    0 : DataSetFieldContentFlags.RawData;\n\n                if (avroFieldContent == 1) // Raw mode\n                {\n                    //\n                    // Read map of raw variant\n                    //\n                    var variants = ReadVariantArray(null); // TODO: Read map\n                    if (variants == null && fieldNames.Length == 0)\n                    {\n                        return new DataSet(dataSet, dataSetFieldContentMask);\n                    }\n                    if (variants == null || variants.Count != fieldNames.Length)\n                    {\n                        throw new DecodingException(\n                            \"Unexpected number of fields in data set\");\n                    }\n                    for (var index = 0; index < fieldNames.Length; index++)\n                    {\n                        dataSet.Add((fieldNames[index], new DataValue(variants[index])));\n                    }\n                }\n                else if (avroFieldContent == 0)\n                {\n                    //\n                    // Read map of data values\n                    //\n                    var dataValues = ReadDataValueArray(null); // TODO: Read map\n                    if (dataValues == null && fieldNames.Length == 0)\n                    {\n                        return new DataSet(dataSet, dataSetFieldContentMask);\n                    }\n                    if (dataValues == null || dataValues.Count != fieldNames.Length)\n                    {\n                        throw new DecodingException(\n                            \"Unexpected number of fields in data set\");\n                    }\n                    for (var index = 0; index < fieldNames.Length; index++)\n                    {\n                        dataSet.Add((fieldNames[index], dataValues[index]));\n                    }\n                }\n                return new DataSet(dataSet, dataSetFieldContentMask);\n            });\n        }\n\n        /// <inheritdoc/>\n        public virtual ExtensionObject? ReadExtensionObject(string? fieldName)\n        {\n            return ReadUnion(fieldName, unionId =>\n            {\n                if (unionId != 0)\n                {\n                    return new ExtensionObject(ReadEncodeableInExtensionObject(unionId));\n                }\n                return ReadEncodedDataType(fieldName);\n            });\n        }\n\n        /// <inheritdoc/>\n        public virtual IEncodeable ReadEncodeable(string? fieldName, Type systemType,\n            ExpandedNodeId? encodeableTypeId = null)\n        {\n            if (Activator.CreateInstance(systemType) is not IEncodeable encodeable)\n            {\n                throw new DecodingException(\n                    $\"Cannot decode type '{systemType.FullName}'.\");\n            }\n\n            if (encodeableTypeId != null)\n            {\n                // set type identifier for custom complex data types before decode.\n\n                if (encodeable is IComplexTypeInstance complexTypeInstance)\n                {\n                    complexTypeInstance.TypeId = encodeableTypeId;\n                }\n            }\n\n            CheckAndIncrementNestingLevel();\n\n            try\n            {\n                encodeable.Decode(this);\n            }\n            finally\n            {\n                _nestingLevel--;\n            }\n\n            return encodeable;\n        }\n\n        /// <inheritdoc/>\n        public virtual Enum ReadEnumerated(string? fieldName, Type enumType)\n        {\n            return (Enum)Enum.ToObject(enumType, ReadEnumerated(fieldName));\n        }\n\n        /// <inheritdoc/>\n        public virtual int ReadEnumerated(string? fieldName)\n        {\n            return (int)_reader.ReadInteger();\n        }\n\n        /// <inheritdoc/>\n        public virtual T ReadEnumerated<T>(string? fieldName) where T : Enum\n        {\n            return (T)ReadEnumerated(fieldName, typeof(T));\n        }\n\n        /// <inheritdoc/>\n        public virtual BooleanCollection ReadBooleanArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadBoolean(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual SByteCollection ReadSByteArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadSByte(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual ByteCollection ReadByteArray(string? fieldName)\n        {\n            return _reader.ReadBytes();\n        }\n\n        /// <inheritdoc/>\n        public virtual Int16Collection ReadInt16Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadInt16(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual UInt16Collection ReadUInt16Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadUInt16(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual Int32Collection ReadInt32Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadInt32(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual UInt32Collection ReadUInt32Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadUInt32(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual Int64Collection ReadInt64Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadInt64(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual UInt64Collection ReadUInt64Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadUInt64(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual FloatCollection ReadFloatArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadFloat(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual DoubleCollection ReadDoubleArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadDouble(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual StringCollection ReadStringArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadString(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual DateTimeCollection ReadDateTimeArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadDateTime(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual UuidCollection ReadGuidArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadGuid(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual ByteStringCollection ReadByteStringArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadByteString(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual XmlElementCollection ReadXmlElementArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadXmlElement(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual NodeIdCollection ReadNodeIdArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadNodeId(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual ExpandedNodeIdCollection ReadExpandedNodeIdArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadExpandedNodeId(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual StatusCodeCollection ReadStatusCodeArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadStatusCode(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual DiagnosticInfoCollection ReadDiagnosticInfoArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadDiagnosticInfo(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual QualifiedNameCollection ReadQualifiedNameArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadQualifiedName(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual LocalizedTextCollection ReadLocalizedTextArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadLocalizedText(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual VariantCollection ReadVariantArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadVariant(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual DataValueCollection ReadDataValueArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadDataValue(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual ExtensionObjectCollection ReadExtensionObjectArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadExtensionObject(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual Array? ReadEncodeableArray(string? fieldName, Type systemType,\n            ExpandedNodeId? encodeableTypeId = null)\n        {\n            return ReadArray(fieldName, () => ReadEncodeable(null,\n                systemType, encodeableTypeId), systemType);\n        }\n\n        /// <inheritdoc/>\n        public virtual Array? ReadEnumeratedArray(string? fieldName, Type enumType)\n        {\n            return ReadArray(fieldName, () => ReadEnumerated(null,\n                enumType), enumType);\n        }\n\n        /// <inheritdoc/>\n        public virtual int[] ReadEnumeratedArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadEnumerated(null));\n        }\n\n        /// <inheritdoc/>\n        public virtual T[]? ReadEnumeratedArray<T>(string? fieldName) where T : Enum\n        {\n            return (T[]?)ReadEnumeratedArray(fieldName, typeof(T));\n        }\n\n        /// <inheritdoc/>\n        public virtual Array? ReadArray(string? fieldName, int valueRank, BuiltInType builtInType,\n            Type? systemType = null, ExpandedNodeId? encodeableTypeId = null)\n        {\n            var rank = SchemaUtils.GetRank(valueRank);\n            if (rank == SchemaRank.Scalar)\n            {\n                return null;\n            }\n            var array = ReadArray(fieldName, builtInType, systemType, encodeableTypeId);\n            if (array == null || rank == SchemaRank.Collection)\n            {\n                return array;\n            }\n            // read as matrix\n            var dimensions = ReadInt32Array(null);\n            if (dimensions?.Count > 0)\n            {\n                Matrix.ValidateDimensions(false, dimensions, Context.MaxArrayLength);\n                return new Matrix(array, builtInType, [.. dimensions]).ToArray();\n            }\n            throw new DecodingException(\n                \"Unexpected null or empty Dimensions for multidimensional matrix.\");\n        }\n\n        /// <summary>\n        /// Reads a DiagnosticInfo from the stream.\n        /// Limits the InnerDiagnosticInfo nesting level.\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"depth\"></param>\n        /// <exception cref=\"DecodingException\"></exception>\n        protected virtual DiagnosticInfo ReadDiagnosticInfo(string? fieldName, int depth)\n        {\n            if (depth >= DiagnosticInfo.MaxInnerDepth)\n            {\n                throw new DecodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    \"Maximum nesting level of InnerDiagnosticInfo was exceeded.\");\n            }\n            CheckAndIncrementNestingLevel();\n            try\n            {\n                return new DiagnosticInfo\n                {\n                    SymbolicId = ReadInt32(nameof(DiagnosticInfo.SymbolicId)),\n                    NamespaceUri = ReadInt32(nameof(DiagnosticInfo.NamespaceUri)),\n                    Locale = ReadInt32(nameof(DiagnosticInfo.Locale)),\n                    LocalizedText = ReadInt32(nameof(DiagnosticInfo.LocalizedText)),\n                    AdditionalInfo = ReadString(nameof(DiagnosticInfo.AdditionalInfo)),\n                    InnerStatusCode = ReadStatusCode(nameof(DiagnosticInfo.InnerStatusCode)),\n                    InnerDiagnosticInfo = ReadNullable(nameof(DiagnosticInfo.InnerDiagnosticInfo),\n                        f => ReadDiagnosticInfo(f, depth + 1))\n                };\n            }\n            finally\n            {\n                _nestingLevel--;\n            }\n        }\n\n        /// <summary>\n        /// Read null\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        public virtual T? ReadNull<T>(string? fieldName)\n        {\n            // Nothing to do\n            return default;\n        }\n\n        /// <summary>\n        /// Read nullable\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"reader\"></param>\n        protected virtual T? ReadNullable<T>(string? fieldName, Func<string?, T> reader)\n        {\n            return ReadUnion(fieldName, id =>\n            {\n                switch (id)\n                {\n                    case 0:\n                        return ReadNull<T>(fieldName);\n                    case 1:\n                        return reader(fieldName);\n                    default:\n                        throw new DecodingException(\n                            $\"Unexpected union discriminator {id}.\");\n                }\n            });\n        }\n\n        /// <summary>\n        /// Read array using specified element reader\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"reader\"></param>\n        /// <returns></returns>\n        public virtual T[] ReadArray<T>(string? fieldName, Func<T> reader)\n        {\n            return [.. ReadArray(reader)];\n        }\n\n        /// <summary>\n        /// Read array using specified element reader\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"reader\"></param>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        protected virtual Array ReadArray(string? fieldName,\n            Func<object> reader, Type type)\n        {\n            var result = ReadArray(reader);\n            var array = Array.CreateInstance(type, result.Count);\n\n            // TODO: Can we just cast to Array?\n            for (var i = 0; i < result.Count; i++)\n            {\n                array.SetValue(result[i], i);\n            }\n            return array;\n        }\n\n        /// <summary>\n        /// Read array using specified element reader\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"reader\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private List<T> ReadArray<T>(Func<T> reader)\n        {\n            var result = new List<T>();\n            var length = _reader.ReadInteger();\n            do\n            {\n                var newLength = length + result.Count;\n                if (newLength < 0 || newLength > int.MaxValue ||\n                    (Context.MaxArrayLength > 0 && Context.MaxArrayLength < newLength))\n                {\n                    throw new DecodingException(StatusCodes.BadEncodingLimitsExceeded,\n                        $\"MaxArrayLength {Context.MaxArrayLength} < {length}.\");\n                }\n                result.EnsureCapacity((int)newLength);\n                for (var i = 0; i < length; i++)\n                {\n                    result.Add(reader());\n                }\n\n                // Either another length or last block indicator\n                length = _reader.ReadInteger();\n            }\n            while (length > 0);\n            return result;\n        }\n\n        /// <summary>\n        /// Read union\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"reader\"></param>\n        public virtual T ReadUnion<T>(string? fieldName,\n            Func<int, T> reader)\n        {\n            var id = StartUnion();\n            var result = reader(id);\n            EndUnion();\n            return result;\n        }\n\n        /// <summary>\n        /// Read union selector\n        /// </summary>\n        /// <returns></returns>\n        protected virtual int StartUnion()\n        {\n            return (int)_reader.ReadInteger();\n        }\n\n        /// <summary>\n        /// End union\n        /// </summary>\n        protected virtual void EndUnion()\n        {\n        }\n\n        /// <summary>\n        /// Get the system type from the type factory if not specified by caller.\n        /// </summary>\n        /// <param name=\"systemType\">The reference to the system type, or null</param>\n        /// <param name=\"encodeableTypeId\">The encodeable type id of the system type.</param>\n        /// <returns>If the system type is assignable to <see cref=\"IEncodeable\"/> </returns>\n        private bool DetermineIEncodeableSystemType(ref Type systemType,\n            ExpandedNodeId encodeableTypeId)\n        {\n            if (encodeableTypeId != null && systemType == null)\n            {\n                systemType = Context.Factory.GetSystemType(encodeableTypeId);\n            }\n            return typeof(IEncodeable).IsAssignableFrom(systemType);\n        }\n\n        /// <summary>\n        /// Read extension object\n        /// </summary>\n        /// <param name=\"unionId\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        protected virtual IEncodeable ReadEncodeableInExtensionObject(int unionId)\n        {\n            throw new DecodingException(\n                \"Cannot decode extensible object structures without schema\");\n        }\n\n        /// <summary>\n        /// Read an encoded extension object\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        protected virtual ExtensionObject ReadEncodedDataType(string? fieldName)\n        {\n            var typeId = ReadNodeId(\"TypeId\");\n            var body = ReadByteString(\"Body\");\n\n            // convert to absolute node id.\n            var expandedTypeId = NodeId.ToExpandedNodeId(typeId, Context.NamespaceUris);\n            if (!NodeId.IsNull(typeId) && NodeId.IsNull(expandedTypeId))\n            {\n                throw new DecodingException(\n                    \"Cannot de-serialized extension objects if the NamespaceUri \" +\n                    $\"is not in the NamespaceTable: Type = {typeId}\");\n            }\n\n            var systemType = Context.Factory.GetSystemType(expandedTypeId);\n            if (systemType != null)\n            {\n                var encodeable = Activator.CreateInstance(systemType) as IEncodeable;\n                // set type identifier for custom complex data types before decode.\n                if (encodeable is IComplexTypeInstance complexTypeInstance)\n                {\n                    complexTypeInstance.TypeId = expandedTypeId;\n                }\n\n                if (encodeable != null)\n                {\n                    if (encodeable.XmlEncodingId == expandedTypeId)\n                    {\n                        var document = new XmlDocument\n                        {\n                            InnerXml = Encoding.UTF8.GetString(body)\n                        };\n                        using var decoder = new XmlDecoder(document.DocumentElement, Context);\n                        encodeable.Decode(decoder);\n                        return new ExtensionObject(expandedTypeId, encodeable);\n                    }\n                    else if (encodeable.BinaryEncodingId == expandedTypeId)\n                    {\n                        using var decoder = new BinaryDecoder(body, Context);\n                        encodeable.Decode(decoder);\n                        return new ExtensionObject(expandedTypeId, encodeable);\n                    }\n                    else if (encodeable is IJsonEncodeable je &&\n                        je.JsonEncodingId == expandedTypeId)\n                    {\n                        using var stream = new MemoryStream(body);\n                        using var decoder = new JsonDecoderEx(stream, Context);\n                        encodeable.Decode(decoder);\n                        return new ExtensionObject(expandedTypeId, encodeable);\n                    }\n                }\n            }\n            return new ExtensionObject(expandedTypeId, body);\n        }\n\n        /// <summary>\n        /// Read variant body\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        protected virtual Variant ReadVariantValue(BuiltInType builtInType,\n            SchemaRank valueRank = SchemaRank.Scalar)\n        {\n            if (valueRank == SchemaRank.Scalar)\n            {\n                return ReadScalar(null, builtInType);\n            }\n\n            // Read array\n            var array = ReadArray(null, builtInType, null, null);\n            if (array == null)\n            {\n                return new Variant(StatusCodes.BadDecodingError);\n            }\n\n            if (valueRank == SchemaRank.Collection)\n            {\n                return new Variant(array,\n                    new TypeInfo(builtInType, ValueRanks.OneDimension));\n            }\n\n            // Read matrix\n            var dimensions = ReadArray(\"Dimensions\", () => ReadInt32(null));\n            (var valid, var matrixLength) = Matrix.ValidateDimensions(\n                dimensions, array.Length, Context.MaxArrayLength);\n            if (!valid || (matrixLength != array.Length))\n            {\n                throw new DecodingException(\n                    \"ArrayDimensions does not match with the ArrayLength \" +\n                    \"in Variant object.\");\n            }\n            return new Variant(new Matrix(array, builtInType, dimensions));\n        }\n\n        /// <summary>\n        /// Read scalar element\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        protected Variant ReadScalar(string? fieldName, BuiltInType builtInType)\n        {\n            var value = new Variant();\n            switch (builtInType)\n            {\n                case BuiltInType.Null:\n                    value.Value = ReadNull<object>(fieldName);\n                    break;\n                case BuiltInType.Boolean:\n                    value.Set(ReadBoolean(fieldName));\n                    break;\n                case BuiltInType.SByte:\n                    value.Set(ReadSByte(fieldName));\n                    break;\n                case BuiltInType.Byte:\n                    value.Set(ReadByte(fieldName));\n                    break;\n                case BuiltInType.Int16:\n                    value.Set(ReadInt16(fieldName));\n                    break;\n                case BuiltInType.UInt16:\n                    value.Set(ReadUInt16(fieldName));\n                    break;\n                case BuiltInType.Int32:\n                    value.Set(ReadInt32(fieldName));\n                    break;\n                case BuiltInType.Enumeration:\n                    value.Set(ReadEnumerated(fieldName));\n                    break;\n                case BuiltInType.UInt32:\n                    value.Set(ReadUInt32(fieldName));\n                    break;\n                case BuiltInType.Int64:\n                    value.Set(ReadInt64(fieldName));\n                    break;\n                case BuiltInType.UInt64:\n                    value.Set(ReadUInt64(fieldName));\n                    break;\n                case BuiltInType.Float:\n                    value.Set(ReadFloat(fieldName));\n                    break;\n                case BuiltInType.Double:\n                    value.Set(ReadDouble(fieldName));\n                    break;\n                case BuiltInType.String:\n                    value.Set(ReadString(fieldName));\n                    break;\n                case BuiltInType.DateTime:\n                    value.Set(ReadDateTime(fieldName));\n                    break;\n                case BuiltInType.Guid:\n                    value.Set(ReadGuid(fieldName));\n                    break;\n                case BuiltInType.ByteString:\n                    value.Set(ReadByteString(fieldName));\n                    break;\n                case BuiltInType.XmlElement:\n                    try\n                    {\n                        value.Set(ReadXmlElement(fieldName));\n                    }\n                    catch\n                    {\n                        value.Set(StatusCodes.BadDecodingError);\n                    }\n                    break;\n                case BuiltInType.NodeId:\n                    value.Set(ReadNodeId(fieldName));\n                    break;\n                case BuiltInType.ExpandedNodeId:\n                    value.Set(ReadExpandedNodeId(fieldName));\n                    break;\n                case BuiltInType.StatusCode:\n                    value.Set(ReadStatusCode(fieldName));\n                    break;\n                case BuiltInType.QualifiedName:\n                    value.Set(ReadQualifiedName(fieldName));\n                    break;\n                case BuiltInType.LocalizedText:\n                    value.Set(ReadLocalizedText(fieldName));\n                    break;\n                case BuiltInType.ExtensionObject:\n                    value.Set(ReadExtensionObject(fieldName));\n                    break;\n                case BuiltInType.DataValue:\n                    value.Set(ReadDataValue(fieldName));\n                    break;\n                default:\n                    throw new DecodingException(\n                        $\"Cannot decode unknown type in Variant object (0x{builtInType:X2}).\");\n            }\n            return value;\n        }\n\n        /// <summary>\n        /// Read array\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"systemType\"></param>\n        /// <param name=\"encodeableTypeId\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        protected Array? ReadArray(string? fieldName, BuiltInType builtInType,\n            Type? systemType = null, ExpandedNodeId? encodeableTypeId = null)\n        {\n            switch (builtInType)\n            {\n                case BuiltInType.Boolean:\n                    return ReadBooleanArray(fieldName)?.ToArray();\n                case BuiltInType.SByte:\n                    return ReadSByteArray(fieldName)?.ToArray();\n                case BuiltInType.Byte:\n                    return ReadByteArray(fieldName)?.ToArray();\n                case BuiltInType.Int16:\n                    return ReadInt16Array(fieldName)?.ToArray();\n                case BuiltInType.UInt16:\n                    return ReadUInt16Array(fieldName)?.ToArray();\n                case BuiltInType.Enumeration:\n                    if (systemType != null && encodeableTypeId != null)\n                    {\n                        DetermineIEncodeableSystemType(ref systemType, encodeableTypeId);\n                        if (systemType?.IsEnum == true)\n                        {\n                            return ReadEnumeratedArray(fieldName, systemType);\n                        }\n                    }\n                    return ReadEnumeratedArray(fieldName);\n                case BuiltInType.Int32:\n                    return ReadInt32Array(fieldName)?.ToArray();\n                case BuiltInType.UInt32:\n                    return ReadUInt32Array(fieldName)?.ToArray();\n                case BuiltInType.Int64:\n                    return ReadInt64Array(fieldName)?.ToArray();\n                case BuiltInType.UInt64:\n                    return ReadUInt64Array(fieldName)?.ToArray();\n                case BuiltInType.Float:\n                    return ReadFloatArray(fieldName)?.ToArray();\n                case BuiltInType.Double:\n                    return ReadDoubleArray(fieldName)?.ToArray();\n                case BuiltInType.String:\n                    return ReadStringArray(fieldName)?.ToArray();\n                case BuiltInType.DateTime:\n                    return ReadDateTimeArray(fieldName)?.ToArray();\n                case BuiltInType.Guid:\n                    return ReadGuidArray(fieldName)?.ToArray();\n                case BuiltInType.ByteString:\n                    return ReadByteStringArray(fieldName)?.ToArray();\n                case BuiltInType.XmlElement:\n                    return ReadXmlElementArray(fieldName)?.ToArray();\n                case BuiltInType.NodeId:\n                    return ReadNodeIdArray(fieldName)?.ToArray();\n                case BuiltInType.ExpandedNodeId:\n                    return ReadExpandedNodeIdArray(fieldName)?.ToArray();\n                case BuiltInType.StatusCode:\n                    return ReadStatusCodeArray(fieldName)?.ToArray();\n                case BuiltInType.QualifiedName:\n                    return ReadQualifiedNameArray(fieldName)?.ToArray();\n                case BuiltInType.LocalizedText:\n                    return ReadLocalizedTextArray(fieldName)?.ToArray();\n                case BuiltInType.DataValue:\n                    return ReadDataValueArray(fieldName)?.ToArray();\n                case BuiltInType.Variant:\n                    if (systemType != null && encodeableTypeId != null\n                        && DetermineIEncodeableSystemType(ref systemType, encodeableTypeId))\n                    {\n                        return ReadEncodeableArray(fieldName, systemType, encodeableTypeId);\n                    }\n                    return ReadVariantArray(fieldName)?.ToArray();\n                case BuiltInType.ExtensionObject:\n                    return ReadExtensionObjectArray(fieldName)?.ToArray();\n                case BuiltInType.DiagnosticInfo:\n                    return ReadDiagnosticInfoArray(fieldName)?.ToArray();\n                default:\n                    if (systemType != null && encodeableTypeId != null\n                        && DetermineIEncodeableSystemType(ref systemType, encodeableTypeId))\n                    {\n                        return ReadEncodeableArray(fieldName, systemType, encodeableTypeId);\n                    }\n                    throw new DecodingException(\n                        $\"Cannot decode unknown type in Array object with BuiltInType: {builtInType}.\");\n            }\n        }\n\n        // TODO: Decide whether the opc ua types are records with single field\n        internal static ReadOnlySpan<(SchemaRank, BuiltInType)> VariantUnionFieldIds\n            => new (SchemaRank, BuiltInType)[]\n        {\n            (SchemaRank.Scalar, BuiltInType.Null),\n            (SchemaRank.Scalar, BuiltInType.Boolean),\n            (SchemaRank.Scalar, BuiltInType.SByte),\n            (SchemaRank.Scalar, BuiltInType.Byte),\n            (SchemaRank.Scalar, BuiltInType.Int16),\n            (SchemaRank.Scalar, BuiltInType.UInt16),\n            (SchemaRank.Scalar, BuiltInType.Int32),\n            (SchemaRank.Scalar, BuiltInType.UInt32),\n            (SchemaRank.Scalar, BuiltInType.Int64),\n            (SchemaRank.Scalar, BuiltInType.UInt64),\n            (SchemaRank.Scalar, BuiltInType.Float),\n            (SchemaRank.Scalar, BuiltInType.Double),\n            (SchemaRank.Scalar, BuiltInType.String),\n            (SchemaRank.Scalar, BuiltInType.DateTime),\n            (SchemaRank.Scalar, BuiltInType.Guid),\n            (SchemaRank.Scalar, BuiltInType.ByteString),\n            (SchemaRank.Scalar, BuiltInType.XmlElement),\n            (SchemaRank.Scalar, BuiltInType.NodeId),\n            (SchemaRank.Scalar, BuiltInType.ExpandedNodeId),\n            (SchemaRank.Scalar, BuiltInType.StatusCode),\n            (SchemaRank.Scalar, BuiltInType.QualifiedName),\n            (SchemaRank.Scalar, BuiltInType.LocalizedText),\n            (SchemaRank.Scalar, BuiltInType.ExtensionObject),\n            (SchemaRank.Scalar, BuiltInType.DataValue),\n            // (ValueRanks.Scalar, BuiltInType.Number),\n            // (ValueRanks.Scalar, BuiltInType.Integer),\n            // (ValueRanks.Scalar, BuiltInType.UInteger),\n            (SchemaRank.Scalar, BuiltInType.Enumeration),\n            (SchemaRank.Collection, BuiltInType.Boolean),\n            (SchemaRank.Collection, BuiltInType.SByte),\n            // (SchemaRank.Collection, BuiltInType.Byte),\n            (SchemaRank.Collection, BuiltInType.Int16),\n            (SchemaRank.Collection, BuiltInType.UInt16),\n            (SchemaRank.Collection, BuiltInType.Int32),\n            (SchemaRank.Collection, BuiltInType.UInt32),\n            (SchemaRank.Collection, BuiltInType.Int64),\n            (SchemaRank.Collection, BuiltInType.UInt64),\n            (SchemaRank.Collection, BuiltInType.Float),\n            (SchemaRank.Collection, BuiltInType.Double),\n            (SchemaRank.Collection, BuiltInType.String),\n            (SchemaRank.Collection, BuiltInType.DateTime),\n            (SchemaRank.Collection, BuiltInType.Guid),\n            (SchemaRank.Collection, BuiltInType.ByteString),\n            (SchemaRank.Collection, BuiltInType.XmlElement),\n            (SchemaRank.Collection, BuiltInType.NodeId),\n            (SchemaRank.Collection, BuiltInType.ExpandedNodeId),\n            (SchemaRank.Collection, BuiltInType.StatusCode),\n            (SchemaRank.Collection, BuiltInType.QualifiedName),\n            (SchemaRank.Collection, BuiltInType.LocalizedText),\n            (SchemaRank.Collection, BuiltInType.ExtensionObject),\n            (SchemaRank.Collection, BuiltInType.DataValue),\n            (SchemaRank.Collection, BuiltInType.Variant),\n            //(SchemaRank.Collection, BuiltInType.Number),\n            //(SchemaRank.Collection, BuiltInType.Integer),\n            //(SchemaRank.Collection, BuiltInType.UInteger),\n            (SchemaRank.Collection, BuiltInType.Enumeration),\n            (SchemaRank.Matrix, BuiltInType.Boolean),\n            (SchemaRank.Matrix, BuiltInType.SByte),\n            (SchemaRank.Matrix, BuiltInType.Byte),\n            (SchemaRank.Matrix, BuiltInType.Int16),\n            (SchemaRank.Matrix, BuiltInType.UInt16),\n            (SchemaRank.Matrix, BuiltInType.Int32),\n            (SchemaRank.Matrix, BuiltInType.UInt32),\n            (SchemaRank.Matrix, BuiltInType.Int64),\n            (SchemaRank.Matrix, BuiltInType.UInt64),\n            (SchemaRank.Matrix, BuiltInType.Float),\n            (SchemaRank.Matrix, BuiltInType.Double),\n            (SchemaRank.Matrix, BuiltInType.String),\n            (SchemaRank.Matrix, BuiltInType.DateTime),\n            (SchemaRank.Matrix, BuiltInType.Guid),\n            (SchemaRank.Matrix, BuiltInType.ByteString),\n            (SchemaRank.Matrix, BuiltInType.XmlElement),\n            (SchemaRank.Matrix, BuiltInType.NodeId),\n            (SchemaRank.Matrix, BuiltInType.ExpandedNodeId),\n            (SchemaRank.Matrix, BuiltInType.StatusCode),\n            (SchemaRank.Matrix, BuiltInType.QualifiedName),\n            (SchemaRank.Matrix, BuiltInType.LocalizedText),\n            (SchemaRank.Matrix, BuiltInType.ExtensionObject),\n            (SchemaRank.Matrix, BuiltInType.DataValue),\n            (SchemaRank.Matrix, BuiltInType.Variant),\n            //(SchemaRank.Matrix, BuiltInType.Number),\n            //(SchemaRank.Matrix, BuiltInType.Integer),\n            //(SchemaRank.Matrix, BuiltInType.UInteger),\n            (SchemaRank.Matrix, BuiltInType.Enumeration)\n        };\n\n        /// <summary>\n        /// Read node id\n        /// </summary>\n        /// <param name=\"namespaceIndex\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private NodeId ReadNodeId(ushort namespaceIndex)\n        {\n            const string kIdentifierName = \"Identifier\";\n            return ReadUnion(kIdentifierName, idType =>\n            {\n                switch ((IdType)idType)\n                {\n                    case IdType.Numeric:\n                        return new NodeId(ReadUInt32(kIdentifierName), namespaceIndex);\n                    case IdType.String:\n                        return new NodeId(ReadString(kIdentifierName), namespaceIndex);\n                    case IdType.Guid:\n                        return new NodeId(ReadGuid(kIdentifierName), namespaceIndex);\n                    case IdType.Opaque:\n                        return new NodeId(ReadByteString(kIdentifierName), namespaceIndex);\n                    default:\n                        throw new DecodingException(\"Unknown node id type\");\n                }\n            });\n        }\n\n        /// <summary>\n        /// Test and increment the nesting level.\n        /// </summary>\n        /// <exception cref=\"DecodingException\"></exception>\n        private void CheckAndIncrementNestingLevel()\n        {\n            if (_nestingLevel > Context.MaxEncodingNestingLevels)\n            {\n                throw new DecodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"Maximum nesting level of {Context.MaxEncodingNestingLevels} was exceeded.\");\n            }\n            _nestingLevel++;\n        }\n\n        private readonly AvroBinaryReader _reader;\n        private ushort[]? _namespaceMappings;\n        private ushort[]? _serverMappings;\n        private uint _nestingLevel;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/BaseAvroEncoder.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Buffers.Binary;\n    using System.Collections.Frozen;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Xml;\n\n    /// <summary>\n    /// Encodes objects in a stream using Avro binary encoding.\n    /// </summary>\n    public abstract class BaseAvroEncoder : IEncoder\n    {\n        /// <inheritdoc/>\n        public EncodingType EncodingType => (EncodingType)3;\n\n        /// <inheritdoc/>\n        public IServiceMessageContext Context { get; }\n\n        /// <inheritdoc/>\n        public bool UseReversibleEncoding => true;\n\n        /// <summary>\n        /// Creates an encoder that writes to the stream.\n        /// </summary>\n        /// <param name=\"stream\">The stream to which the\n        /// encoder writes.</param>\n        /// <param name=\"context\">The message context to\n        /// use for the encoding.</param>\n        /// <param name=\"leaveOpen\">If the stream should\n        /// be left open on dispose.</param>\n        protected BaseAvroEncoder(Stream stream,\n            IServiceMessageContext context, bool leaveOpen = true)\n        {\n            _writer = new AvroBinaryWriter(stream, leaveOpen);\n            Context = context;\n            _nestingLevel = 0;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <inheritdoc/>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                _writer.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void SetMappingTables(NamespaceTable? namespaceUris,\n            StringTable? serverUris)\n        {\n            _namespaceMappings = null;\n\n            if (namespaceUris != null &&\n                Context.NamespaceUris != null)\n            {\n                _namespaceMappings = namespaceUris.CreateMapping(\n                    Context.NamespaceUris, false);\n            }\n\n            _serverMappings = null;\n            if (serverUris != null &&\n                Context.ServerUris != null)\n            {\n                _serverMappings = serverUris.CreateMapping(\n                    Context.ServerUris, false);\n            }\n        }\n\n        /// <inheritdoc/>\n        public string? CloseAndReturnText()\n        {\n            throw new NotSupportedException(\"Unsupported\");\n        }\n\n        /// <inheritdoc/>\n        public void PushNamespace(string namespaceUri)\n        {\n            // not used in the binary encoding.\n        }\n\n        /// <inheritdoc/>\n        public void PopNamespace()\n        {\n            // not used in the binary encoding.\n        }\n\n        /// <inheritdoc/>\n        public int Close()\n        {\n            var position = (int)_writer.Stream.Position;\n            _writer.Stream.Flush();\n            return position;\n        }\n\n        /// <inheritdoc/>\n        public void WriteSwitchField(uint switchField, out string fieldName)\n        {\n            fieldName = string.Empty;\n            // TODO\n        }\n\n        /// <inheritdoc/>\n        public void WriteEncodingMask(uint encodingMask)\n        {\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteBoolean(string? fieldName, bool value)\n        {\n            _writer.WriteBoolean(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteSByte(string? fieldName, sbyte value)\n        {\n            _writer.WriteInteger(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteByte(string? fieldName, byte value)\n        {\n            _writer.WriteInteger(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteInt16(string? fieldName, short value)\n        {\n            _writer.WriteInteger(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteUInt16(string? fieldName, ushort value)\n        {\n            _writer.WriteInteger(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteInt32(string? fieldName, int value)\n        {\n            _writer.WriteInteger(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteUInt32(string? fieldName, uint value)\n        {\n            _writer.WriteInteger(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteInt64(string? fieldName, long value)\n        {\n            _writer.WriteInteger(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteUInt64(string? fieldName, ulong value)\n        {\n            // ulong is a union of long and fixed (> long.max)\n            var unionSelector = value < long.MaxValue ? 0 : 1;\n            _writer.WriteInteger(unionSelector);\n            if (unionSelector == 0)\n            {\n                _writer.WriteInteger((long)value);\n            }\n            else\n            {\n                Span<byte> bytes = stackalloc byte[sizeof(ulong)];\n                BinaryPrimitives.WriteUInt64LittleEndian(bytes, value);\n                _writer.WriteFixed(bytes);\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteFloat(string? fieldName, float value)\n        {\n            _writer.WriteFloat(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDouble(string? fieldName, double value)\n        {\n            _writer.WriteDouble(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDateTime(string? fieldName, DateTime value)\n        {\n            value = Opc.Ua.Utils.ToOpcUaUniversalTime(value);\n            var ticks = value.Ticks;\n\n            // check for max value.\n            if (ticks >= DateTime.MaxValue.Ticks)\n            {\n                ticks = long.MaxValue;\n            }\n            // check for min value.\n            else\n            {\n                ticks -= Opc.Ua.Utils.TimeBase.Ticks;\n\n                if (ticks <= 0)\n                {\n                    ticks = 0;\n                }\n            }\n            _writer.WriteInteger(ticks);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteGuid(string? fieldName, Uuid value)\n        {\n#if UUID_FIXED\n            _writer.WriteFixed(((Guid)value).ToByteArray());\n#else\n            _writer.WriteString(((Guid)value).ToString());\n#endif\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteGuid(string? fieldName, Guid value)\n        {\n#if UUID_FIXED\n            _writer.WriteFixed(value.ToByteArray());\n#else\n            _writer.WriteString(value.ToString());\n#endif\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteString(string? fieldName, string? value)\n        {\n            if (value == null)\n            {\n                _writer.WriteInteger(0);\n                return;\n            }\n            _writer.WriteString(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteByteString(string? fieldName, byte[]? value)\n        {\n            if (value == null)\n            {\n                _writer.WriteInteger(0);\n                return;\n            }\n\n            if (Context.MaxByteStringLength > 0 &&\n                Context.MaxByteStringLength < value.Length)\n            {\n                throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"MaxByteStringLength {Context.MaxByteStringLength} < {value.Length}.\");\n            }\n            _writer.WriteBytes(value);\n        }\n\n        /// <inheritdoc/>\n        public void WriteByteString(string? fieldName, ReadOnlySpan<byte> value)\n        {\n            WriteByteString(fieldName, value.ToArray());\n        }\n\n        /// <inheritdoc/>\n        public void WriteByteString(string? fieldName, byte[] value, int index, int count)\n        {\n            WriteByteString(fieldName, value.AsSpan().Slice(index, count));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteXmlElement(string? fieldName, XmlElement? value)\n        {\n            _writer.WriteString(value?.OuterXml ?? string.Empty);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDataSet(string? fieldName, DataSet dataSet)\n        {\n            var fieldContentMask = dataSet.DataSetFieldContentMask;\n            if (fieldContentMask.HasFlag(DataSetFieldContentFlags.RawData) ||\n                fieldContentMask == 0)\n            {\n                foreach (var (Name, Value) in dataSet.DataSetFields)\n                {\n                    WriteVariant(Name, Value?.WrappedValue ?? default);\n                }\n            }\n            else\n            {\n                foreach (var (Name, Value) in dataSet.DataSetFields)\n                {\n                    WriteNullable(Name, Value, WriteDataValue);\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteObject(string? fieldName, string? typeName, Action writer)\n        {\n            writer();\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteNodeId(string? fieldName, NodeId? value)\n        {\n            //\n            // Node id is a record, with namespace and union of\n            // the id. The IdType value represents the union\n            // discriminator.\n            //\n            // Node id is not nullable, i=0 is a null node id.\n            //\n            var namespaceIndex = value?.NamespaceIndex ?? 0;\n            if (_namespaceMappings != null &&\n                _namespaceMappings.Length > namespaceIndex)\n            {\n                namespaceIndex = _namespaceMappings[namespaceIndex];\n            }\n\n            var namespaceUri = namespaceIndex == 0 ? null :\n                Context.NamespaceUris.GetString(namespaceIndex);\n            WriteNodeId(value, namespaceUri ?? string.Empty);\n        }\n\n        /// <summary>\n        /// Write node id\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"namespaceUri\"></param>\n        private void WriteNodeId(NodeId? value, string namespaceUri)\n        {\n            const string kIdentifierName = \"Identifier\";\n            WriteString(\"Namespace\", namespaceUri);\n            //  Numeric = 0,\n            //  String = 1\n            //  Guid = 2\n            //  Opaque = 3\n            var idUnionIndex = (int)(value?.IdType ?? IdType.Numeric);\n            WriteUnion(kIdentifierName, idUnionIndex, id =>\n            {\n                switch ((IdType)id)\n                {\n                    case IdType.Numeric:\n                        WriteUInt32(kIdentifierName, (uint)(value?.Identifier ?? 0u));\n                        break;\n                    case IdType.String:\n                        WriteString(kIdentifierName, (string)value!.Identifier);\n                        break;\n                    case IdType.Guid:\n                        WriteGuid(kIdentifierName, (Guid)value!.Identifier);\n                        break;\n                    case IdType.Opaque:\n                        WriteByteString(kIdentifierName, (byte[])value!.Identifier);\n                        break;\n                }\n            });\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteExpandedNodeId(string? fieldName,\n            ExpandedNodeId? value)\n        {\n            var serverIndex = value?.ServerIndex ?? 0;\n            if (_serverMappings != null &&\n                _serverMappings.Length > serverIndex)\n            {\n                serverIndex = _serverMappings[serverIndex];\n            }\n            var serverUri = serverIndex == 0 ? null :\n                Context.ServerUris.GetString(serverIndex);\n\n            var namespaceUri = value?.NamespaceUri;\n            if (namespaceUri == null && value != null &&\n                value.NamespaceIndex != 0)\n            {\n                var namespaceIndex = value.NamespaceIndex;\n                if (_namespaceMappings != null &&\n                    _namespaceMappings.Length > namespaceIndex)\n                {\n                    namespaceIndex = _namespaceMappings[namespaceIndex];\n                }\n                namespaceUri = namespaceIndex == 0 ? null :\n                    Context.NamespaceUris.GetString(namespaceIndex);\n            }\n\n            //\n            // Expanded Node id is a record extending NodeId.\n            // Namespace, and union of via IdType which represents\n            // the union discriminator.  After that we write the\n            // namespace uri and then server index.\n            //\n            WriteNodeId(value.ToNodeId(Context.NamespaceUris, true),\n                namespaceUri ?? string.Empty);\n            WriteString(\"ServerUri\", serverUri);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteStatusCode(string? fieldName, StatusCode value)\n        {\n            _writer.WriteInteger(value.Code);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDiagnosticInfo(string? fieldName, DiagnosticInfo? value)\n        {\n            WriteDiagnosticInfo(fieldName, value ?? new DiagnosticInfo(), 0);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteQualifiedName(string? fieldName, QualifiedName? value)\n        {\n            var namespaceIndex = value?.NamespaceIndex ?? 0;\n            if (_namespaceMappings != null &&\n                _namespaceMappings.Length > namespaceIndex)\n            {\n                namespaceIndex = _namespaceMappings[namespaceIndex];\n            }\n\n            var namespaceUri = namespaceIndex == 0 ? null :\n                Context.NamespaceUris.GetString(namespaceIndex);\n            _writer.WriteString(namespaceUri ?? string.Empty);\n            _writer.WriteString(value?.Name ?? string.Empty);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteLocalizedText(string? fieldName, LocalizedText? value)\n        {\n            _writer.WriteString(value?.Locale ?? string.Empty);\n            _writer.WriteString(value?.Text ?? string.Empty);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteVariant(string? fieldName, Variant value)\n        {\n            CheckAndIncrementNestingLevel();\n            try\n            {\n                // Write union index\n                int unionId;\n                var rank = SchemaRank.Scalar;\n                if (value.Value == null)\n                {\n                    unionId = 0;\n                }\n                else\n                {\n                    rank = SchemaUtils.GetRank(value.TypeInfo!.ValueRank);\n                    unionId = ToUnionId(value.TypeInfo.BuiltInType, rank);\n                }\n                WriteUnion(fieldName, unionId, _ => WriteVariantValue(value,\n                    value.TypeInfo?.BuiltInType ?? BuiltInType.Null, rank));\n            }\n            finally\n            {\n                _nestingLevel--;\n            }\n\n            static int ToUnionId(BuiltInType builtInType, SchemaRank valueRank)\n            {\n                if (!_variableUnionId.TryGetValue((valueRank, builtInType),\n                    out var unionId))\n                {\n                    throw new EncodingException(\n                        \"Invalid built in type or value rank for variant\");\n                }\n                return unionId;\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDataValue(string? fieldName, DataValue? value)\n        {\n            // record of fields\n            value ??= new DataValue();\n            WriteVariant(nameof(value.Value), value.WrappedValue);\n            WriteStatusCode(nameof(value.StatusCode), value.StatusCode);\n            WriteDateTime(nameof(value.SourceTimestamp), value.SourceTimestamp);\n            WriteUInt16(nameof(value.SourcePicoseconds), value.SourcePicoseconds);\n            WriteDateTime(nameof(value.ServerTimestamp), value.ServerTimestamp);\n            WriteUInt16(nameof(value.ServerPicoseconds), value.ServerPicoseconds);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteExtensionObject(string? fieldName, ExtensionObject? value)\n        {\n            value ??= new ExtensionObject();\n            // Write a raw encoded data type of the schema union\n            WriteUnion(fieldName, 0, _ => WriteEncodedDataType(fieldName, value));\n        }\n\n        /// <inheritdoc/>\n        public void EncodeMessage(IEncodeable message)\n        {\n            message.Encode(this);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteEncodeable(string? fieldName, IEncodeable? value,\n            Type? systemType)\n        {\n            CheckAndIncrementNestingLevel();\n            try\n            {\n                // create a default object if a null object specified.\n                if (value == null && systemType != null)\n                {\n                    value = Activator.CreateInstance(systemType) as IEncodeable;\n                }\n                // encode the object.\n                value?.Encode(this);\n            }\n            finally\n            {\n                _nestingLevel--;\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteEnumerated(string? fieldName, Enum? value)\n        {\n            _writer.WriteInteger(Convert.ToInt32(value, CultureInfo.InvariantCulture));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteEnumerated(string? fieldName, int value)\n        {\n            _writer.WriteInteger(value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteBooleanArray(string? fieldName,\n            IList<bool>? values)\n        {\n            WriteArray(fieldName, values, v => WriteBoolean(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteSByteArray(string? fieldName,\n            IList<sbyte>? values)\n        {\n            WriteArray(fieldName, values, v => WriteSByte(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteByteArray(string? fieldName,\n            IList<byte>? values)\n        {\n            if (values == null || values.Count == 0)\n            {\n                _writer.WriteInteger(0);\n                return;\n            }\n\n            if (Context.MaxByteStringLength > 0 &&\n                Context.MaxByteStringLength < values.Count)\n            {\n                throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"MaxByteStringLength {Context.MaxByteStringLength} < {values.Count}.\");\n            }\n            // Byte array is written as byte string\n            _writer.WriteBytes(values.ToArray());\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteInt16Array(string? fieldName,\n            IList<short>? values)\n        {\n            WriteArray(fieldName, values, v => WriteInt16(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteUInt16Array(string? fieldName,\n            IList<ushort>? values)\n        {\n            WriteArray(fieldName, values, v => WriteUInt16(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteInt32Array(string? fieldName,\n            IList<int>? values)\n        {\n            WriteArray(fieldName, values, v => WriteInt32(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteUInt32Array(string? fieldName,\n            IList<uint>? values)\n        {\n            WriteArray(fieldName, values, v => WriteUInt32(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteInt64Array(string? fieldName,\n            IList<long>? values)\n        {\n            WriteArray(fieldName, values, v => WriteInt64(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteUInt64Array(string? fieldName,\n            IList<ulong>? values)\n        {\n            WriteArray(fieldName, values, v => WriteUInt64(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteFloatArray(string? fieldName,\n            IList<float>? values)\n        {\n            WriteArray(fieldName, values, v => WriteFloat(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDoubleArray(string? fieldName,\n            IList<double>? values)\n        {\n            WriteArray(fieldName, values, v => WriteDouble(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteStringArray(string? fieldName,\n            IList<string?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteString(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDateTimeArray(string? fieldName,\n            IList<DateTime>? values)\n        {\n            WriteArray(fieldName, values, v => WriteDateTime(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteGuidArray(string? fieldName,\n            IList<Uuid>? values)\n        {\n            WriteArray(fieldName, values, v => WriteGuid(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteGuidArray(string? fieldName,\n            IList<Guid>? values)\n        {\n            WriteArray(fieldName, values, v => WriteGuid(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteByteStringArray(string? fieldName,\n            IList<byte[]?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteByteString(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteXmlElementArray(string? fieldName,\n            IList<XmlElement?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteXmlElement(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteNodeIdArray(string? fieldName,\n            IList<NodeId?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteNodeId(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteExpandedNodeIdArray(string? fieldName,\n            IList<ExpandedNodeId?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteExpandedNodeId(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteStatusCodeArray(string? fieldName,\n            IList<StatusCode>? values)\n        {\n            WriteArray(fieldName, values, v => WriteStatusCode(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDiagnosticInfoArray(string? fieldName,\n            IList<DiagnosticInfo?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteDiagnosticInfo(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteQualifiedNameArray(string? fieldName,\n            IList<QualifiedName?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteQualifiedName(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteLocalizedTextArray(string? fieldName,\n            IList<LocalizedText?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteLocalizedText(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteVariantArray(string? fieldName,\n            IList<Variant>? values)\n        {\n            WriteArray(fieldName, values, v => WriteVariant(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteDataValueArray(string? fieldName,\n            IList<DataValue?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteDataValue(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteExtensionObjectArray(string? fieldName,\n            IList<ExtensionObject?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteExtensionObject(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteEncodeableArray(string? fieldName,\n            IList<IEncodeable>? values, Type? systemType)\n        {\n            WriteArray(fieldName, values, v => WriteEncodeable(null, v, systemType),\n                systemType?.Name);\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteEnumeratedArray(string? fieldName,\n            Array? values, Type? systemType)\n        {\n            WriteArray(fieldName, values, v => WriteEnumerated(null, (Enum?)v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteEnumeratedArray(string? fieldName,\n            int[] values, Type? enumType)\n        {\n            WriteArray(fieldName, values, v => WriteEnumerated(null, v));\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteArray(string? fieldName, object array,\n            int valueRank, BuiltInType builtInType)\n        {\n            var rank = SchemaUtils.GetRank(valueRank);\n            if (rank == SchemaRank.Collection)\n            {\n                switch (builtInType)\n                {\n                    case BuiltInType.Boolean:\n                        WriteArray(fieldName, (bool[])array, v => WriteBoolean(null, v));\n                        break;\n                    case BuiltInType.SByte:\n                        WriteArray(fieldName, (sbyte[])array, v => WriteSByte(null, v));\n                        break;\n                    case BuiltInType.Byte:\n                        WriteArray(fieldName, (byte[])array, v => WriteByte(null, v));\n                        break;\n                    case BuiltInType.Int16:\n                        WriteArray(fieldName, (short[])array, v => WriteInt16(null, v));\n                        break;\n                    case BuiltInType.UInt16:\n                        WriteArray(fieldName, (ushort[])array, v => WriteUInt16(null, v));\n                        break;\n                    case BuiltInType.Int32:\n                        WriteArray(fieldName, (int[])array, v => WriteInt32(null, v));\n                        break;\n                    case BuiltInType.UInt32:\n                        WriteArray(fieldName, (uint[])array, v => WriteUInt32(null, v));\n                        break;\n                    case BuiltInType.Int64:\n                        WriteArray(fieldName, (long[])array, v => WriteInt64(null, v));\n                        break;\n                    case BuiltInType.UInt64:\n                        WriteArray(fieldName, (ulong[])array, v => WriteUInt64(null, v));\n                        break;\n                    case BuiltInType.Float:\n                        WriteArray(fieldName, (float[])array, v => WriteFloat(null, v));\n                        break;\n                    case BuiltInType.Double:\n                        WriteArray(fieldName, (double[])array, v => WriteDouble(null, v));\n                        break;\n                    case BuiltInType.DateTime:\n                        WriteArray(fieldName, (DateTime[])array, v => WriteDateTime(null, v));\n                        break;\n                    case BuiltInType.Guid:\n                        WriteArray(fieldName, (Uuid[])array, v => WriteGuid(null, v));\n                        break;\n                    case BuiltInType.String:\n                        WriteArray(fieldName, (string[])array, v => WriteString(null, v));\n                        break;\n                    case BuiltInType.ByteString:\n                        WriteArray(fieldName, (byte[][])array, v => WriteByteString(null, v));\n                        break;\n                    case BuiltInType.QualifiedName:\n                        WriteArray(fieldName, (QualifiedName[])array, v => WriteQualifiedName(null, v));\n                        break;\n                    case BuiltInType.LocalizedText:\n                        WriteArray(fieldName, (LocalizedText[])array, v => WriteLocalizedText(null, v));\n                        break;\n                    case BuiltInType.NodeId:\n                        WriteArray(fieldName, (NodeId[])array, v => WriteNodeId(null, v));\n                        break;\n                    case BuiltInType.ExpandedNodeId:\n                        WriteArray(fieldName, (ExpandedNodeId[])array, v => WriteExpandedNodeId(null, v));\n                        break;\n                    case BuiltInType.StatusCode:\n                        WriteArray(fieldName, (StatusCode[])array, v => WriteStatusCode(null, v));\n                        break;\n                    case BuiltInType.XmlElement:\n                        WriteArray(fieldName, (XmlElement[])array, v => WriteXmlElement(null, v));\n                        break;\n                    case BuiltInType.Variant:\n                        // try to write IEncodeable Array\n                        if (array is IEncodeable[] encodeableArray)\n                        {\n                            WriteEncodeableArray(fieldName, encodeableArray,\n                                array.GetType().GetElementType());\n                            return;\n                        }\n                        WriteVariantArray(null, (Variant[])array);\n                        break;\n                    case BuiltInType.Enumeration:\n                        if (array is Enum[] enums)\n                        {\n                            WriteArray(fieldName, enums, v => WriteEnumerated(null, v));\n                            break;\n                        }\n                        else if (array is int[] values)\n                        {\n                            WriteArray(fieldName, values, v => WriteEnumerated(null, v));\n                            break;\n                        }\n                        throw new EncodingException(\n                            \"Unexpected type encountered while encoding an Enumeration Array.\");\n                    case BuiltInType.ExtensionObject:\n                        WriteArray(fieldName, (ExtensionObject[])array, v => WriteExtensionObject(null, v));\n                        break;\n                    case BuiltInType.DiagnosticInfo:\n                        WriteArray(fieldName, (DiagnosticInfo[])array, v => WriteDiagnosticInfo(null, v));\n                        break;\n                    case BuiltInType.DataValue:\n                        WriteArray(fieldName, (DataValue[])array, v => WriteDataValue(null, v));\n                        break;\n                    default:\n                        // try to write IEncodeable Array\n                        if (array is IEncodeable[] encodeableArray2)\n                        {\n                            WriteEncodeableArray(fieldName, encodeableArray2,\n                                array.GetType().GetElementType());\n                            return;\n                        }\n                        if (array == null)\n                        {\n                            // write zero dimension\n                            WriteInt32(null, -1);\n                            return;\n                        }\n                        throw new EncodingException(\n                            \"Unexpected type encountered while encoding an Array with \" +\n                            $\"BuiltInType: {builtInType}\");\n                }\n            }\n            else if (rank == SchemaRank.Matrix)\n            {\n                /* Multi-dimensional Arrays are encoded as an Int32 Array containing the dimensions followed by\n                 * a list of all the values in the Array. The total number of values is equal to the\n                 * product of the dimensions.\n                 * The number of values is 0 if one or more dimension is less than or equal to 0.*/\n\n                var matrix = array as Matrix;\n                if (matrix == null)\n                {\n                    if (array is not Array multiArray || multiArray.Rank != valueRank)\n                    {\n                        // there is no Dimensions to write\n                        WriteInt32(\"Dimensions\", -1);\n                        return;\n                    }\n                    matrix = new Matrix(multiArray, builtInType);\n                }\n\n                // Write the Dimensions\n                WriteInt32Array(null, matrix.Dimensions);\n\n                switch (matrix.TypeInfo.BuiltInType)\n                {\n                    case BuiltInType.Boolean:\n                        {\n                            var values = (bool[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteBoolean(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.SByte:\n                        {\n                            var values = (sbyte[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteSByte(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.Byte:\n                        {\n                            var values = (byte[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteByte(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.Int16:\n                        {\n                            var values = (short[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteInt16(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.UInt16:\n                        {\n                            var values = (ushort[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteUInt16(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.Enumeration:\n                        {\n                            if (matrix.Elements is Enum[] values)\n                            {\n                                for (var ii = 0; ii < values.Length; ii++)\n                                {\n                                    WriteEnumerated(null, values[ii]);\n                                }\n                                break;\n                            }\n                        }\n                        {\n                            if (matrix.Elements is int[] values)\n                            {\n                                for (var ii = 0; ii < values.Length; ii++)\n                                {\n                                    WriteEnumerated(null, values[ii]);\n                                }\n                                break;\n                            }\n                        }\n                        throw new EncodingException(\n                            \"Unexpected type encountered while encoding an Enumeration Matrix.\");\n                    case BuiltInType.Int32:\n                        {\n                            var values = (int[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteInt32(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.UInt32:\n                        {\n                            var values = (uint[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteUInt32(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.Int64:\n                        {\n                            var values = (long[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteInt64(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.UInt64:\n                        {\n                            var values = (ulong[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteUInt64(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.Float:\n                        {\n                            var values = (float[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteFloat(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.Double:\n                        {\n                            var values = (double[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteDouble(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.String:\n                        {\n                            var values = (string[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteString(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.DateTime:\n                        {\n                            var values = (DateTime[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteDateTime(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.Guid:\n                        {\n                            var values = (Uuid[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteGuid(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.ByteString:\n                        {\n                            var values = (byte[][])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteByteString(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.XmlElement:\n                        {\n                            var values = (XmlElement[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteXmlElement(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.NodeId:\n                        {\n                            var values = (NodeId[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteNodeId(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.ExpandedNodeId:\n                        {\n                            var values = (ExpandedNodeId[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteExpandedNodeId(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.StatusCode:\n                        {\n                            var values = (StatusCode[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteStatusCode(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.QualifiedName:\n                        {\n                            var values = (QualifiedName[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteQualifiedName(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.LocalizedText:\n                        {\n                            var values = (LocalizedText[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteLocalizedText(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.ExtensionObject:\n                        {\n                            var values = (ExtensionObject[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteExtensionObject(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.DataValue:\n                        {\n                            var values = (DataValue[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteDataValue(null, values[ii]);\n                            }\n                            break;\n                        }\n                    case BuiltInType.Variant:\n                        {\n                            if (matrix.Elements is Variant[] variants)\n                            {\n                                for (var ii = 0; ii < variants.Length; ii++)\n                                {\n                                    WriteVariant(null, variants[ii]);\n                                }\n                                break;\n                            }\n\n                            // try to write IEncodeable Array\n                            if (matrix.Elements is IEncodeable[] encodeableArray)\n                            {\n                                for (var ii = 0; ii < encodeableArray.Length; ii++)\n                                {\n                                    WriteEncodeable(null, encodeableArray[ii], null);\n                                }\n                                break;\n                            }\n\n                            if (matrix.Elements is object[] objects)\n                            {\n                                for (var ii = 0; ii < objects.Length; ii++)\n                                {\n                                    WriteVariant(null, new Variant(objects[ii]));\n                                }\n                                break;\n                            }\n                            throw new EncodingException(\n                                \"Unexpected type encountered while encoding a Matrix.\");\n                        }\n                    case BuiltInType.DiagnosticInfo:\n                        {\n                            var values = (DiagnosticInfo[])matrix.Elements;\n                            for (var ii = 0; ii < values.Length; ii++)\n                            {\n                                WriteDiagnosticInfo(null, values[ii]);\n                            }\n                            break;\n                        }\n                    default:\n                        {\n                            // try to write IEncodeable Array\n                            if (matrix.Elements is IEncodeable[] encodeableArray)\n                            {\n                                for (var ii = 0; ii < encodeableArray.Length; ii++)\n                                {\n                                    WriteEncodeable(null, encodeableArray[ii], null);\n                                }\n                                break;\n                            }\n                            throw new EncodingException(\n                                \"Unexpected type encountered while encoding a Matrix \" +\n                                $\"with BuiltInType: {matrix.TypeInfo.BuiltInType}\");\n                        }\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteNull<T>(string? fieldName, T? value)\n        {\n        }\n\n        /// <summary>\n        /// Write nullable\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"writer\"></param>\n        protected virtual void WriteNullable<T>(string? fieldName, T? value,\n            Action<string?, T> writer) where T : class\n        {\n            // Union index, first is \"null\"\n            WriteUnion(fieldName, value == null ? 0 : 1, id =>\n            {\n                switch (id)\n                {\n                    case 0:\n                        WriteNull(null, value);\n                        break;\n                    default:\n                        Debug.Assert(value != null);\n                        writer(null, value);\n                        break;\n                }\n            });\n        }\n\n        /// <summary>\n        /// Write union\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"writer\"></param>\n        public virtual void WriteUnion(string? fieldName, int index,\n            Action<int> writer)\n        {\n            StartUnion(index);\n            writer(index);\n            EndUnion();\n        }\n\n        /// <summary>\n        /// Start union\n        /// </summary>\n        /// <param name=\"index\"></param>\n        protected virtual void StartUnion(int index)\n        {\n            _writer.WriteInteger(index);\n        }\n\n        /// <inheritdoc/>\n        protected virtual void EndUnion()\n        {\n        }\n\n        /// <summary>\n        /// Write encoded data type\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"value\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        protected virtual void WriteEncodedDataType(string? fieldName, ExtensionObject value)\n        {\n            // write the type id.\n            var typeId = value.TypeId;\n            var body = value.Body;\n            if (body is IEncodeable encodeable)\n            {\n                if (body is IJsonEncodeable je)\n                {\n                    typeId = je.JsonEncodingId;\n                    body = encodeable.AsJson(Context);\n                }\n                else if (value.Encoding == ExtensionObjectEncoding.Xml)\n                {\n                    typeId = encodeable.XmlEncodingId;\n                    body = encodeable.AsXmlElement(Context);\n                }\n                else\n                {\n                    typeId = encodeable.BinaryEncodingId;\n                    body = encodeable.AsBinary(Context);\n                }\n            }\n\n            var localTypeId = ExpandedNodeId.ToNodeId(typeId, Context.NamespaceUris);\n            if (NodeId.IsNull(localTypeId) && !NodeId.IsNull(typeId))\n            {\n                if (value.Body is IEncodeable e)\n                {\n                    throw new EncodingException(\n                        $\"Cannot encode bodies of type '{e.GetType().FullName}' in \" +\n                        $\"ExtensionObject unless the NamespaceUri ({typeId.NamespaceUri}) \" +\n                        \"is in the encoder's NamespaceTable.\");\n                }\n                localTypeId = NodeId.Null;\n            }\n\n            switch (body)\n            {\n                case byte[]:\n                    break;\n                case XmlElement xml:\n                    body = Encoding.UTF8.GetBytes(\n                        xml.OuterXml ?? string.Empty);\n                    break;\n                case string str:\n                    body = Encoding.UTF8.GetBytes(str);\n                    break;\n                default:\n                    Debug.Fail(\"Should not get here\");\n                    break;\n            }\n\n            // Write a raw encoded data type of the schema union\n            WriteNodeId(\"TypeId\", localTypeId);\n            WriteByteString(\"Body\", (byte[])body);\n        }\n\n        /// <summary>\n        /// Writes a DiagnosticInfo to the stream.\n        /// Ignores InnerDiagnosticInfo field if the nesting level\n        /// <see cref=\"DiagnosticInfo.MaxInnerDepth\"/> is exceeded.\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"depth\"></param>\n        protected virtual void WriteDiagnosticInfoNullable(string? fieldName,\n            DiagnosticInfo? value, int depth)\n        {\n            if (depth >= DiagnosticInfo.MaxInnerDepth)\n            {\n                value = null;\n            }\n            WriteNullable(fieldName, value, (f, v) => WriteDiagnosticInfo(f, v, depth));\n        }\n\n        /// <summary>\n        /// Write as non nullable\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"depth\"></param>\n        protected virtual void WriteDiagnosticInfo(string? fieldName,\n            DiagnosticInfo value, int depth)\n        {\n            CheckAndIncrementNestingLevel();\n            try\n            {\n                WriteInt32(nameof(value.SymbolicId), value.SymbolicId);\n                WriteInt32(nameof(value.NamespaceUri), value.NamespaceUri);\n                WriteInt32(nameof(value.Locale), value.Locale);\n                WriteInt32(nameof(value.LocalizedText), value.LocalizedText);\n                WriteString(nameof(value.AdditionalInfo), value.AdditionalInfo);\n                WriteStatusCode(nameof(value.InnerStatusCode), value.InnerStatusCode);\n                WriteDiagnosticInfoNullable(nameof(value.InnerDiagnosticInfo),\n                    value.InnerDiagnosticInfo, depth + 1);\n            }\n            finally\n            {\n                _nestingLevel--;\n            }\n        }\n\n        /// <summary>\n        /// Writes an Variant value to the stream.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"valueRank\"></param>\n        protected void WriteVariantValue(Variant value,\n            BuiltInType builtInType, SchemaRank valueRank)\n        {\n            var valueToEncode = value.Value;\n\n            if (valueToEncode == null)\n            {\n                WriteNull(builtInType, valueRank);\n            }\n            else if (valueRank == SchemaRank.Scalar)\n            {\n                WriteScalar(builtInType, valueToEncode);\n            }\n            else if (valueToEncode is not Matrix m)\n            {\n                Debug.Assert(valueRank == SchemaRank.Collection);\n                WriteArray(builtInType, valueToEncode);\n            }\n            else\n            {\n                Debug.Assert(valueRank == SchemaRank.Matrix);\n                WriteMatrix(\"Body\", m);\n            }\n        }\n\n        /// <summary>\n        /// Lookup\n        /// </summary>\n        internal static readonly FrozenDictionary<(SchemaRank, BuiltInType), int> _variableUnionId =\n            BaseAvroDecoder.VariantUnionFieldIds\n                .ToArray()\n                .Select((f, i) => System.Collections.Generic.KeyValuePair.Create(f, i))\n                .ToFrozenDictionary();\n\n        /// <summary>\n        /// Write null value of variant\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"valueRank\"></param>\n        protected virtual void WriteNull(BuiltInType builtInType, SchemaRank valueRank)\n        {\n            // Nothing to do\n        }\n\n        /// <summary>\n        /// Write array of variant\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"valueToEncode\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        protected virtual void WriteArray(BuiltInType builtInType, object valueToEncode)\n        {\n            static T[] Cast<T>(object objects)\n            {\n                if (objects is T[] r)\n                {\n                    return r;\n                }\n                if (objects is object[] o)\n                {\n                    return o.Cast<T>().ToArray();\n                }\n                if (objects is T t)\n                {\n                    return new[] { t };\n                }\n                return Array.Empty<T>();\n            }\n            switch (builtInType)\n            {\n                case BuiltInType.Boolean:\n                    WriteBooleanArray(null, Cast<bool>(valueToEncode));\n                    break;\n                case BuiltInType.SByte:\n                    WriteSByteArray(null, Cast<sbyte>(valueToEncode));\n                    break;\n                case BuiltInType.Byte:\n                    WriteByteArray(null, Cast<byte>(valueToEncode));\n                    break;\n                case BuiltInType.Int16:\n                    WriteInt16Array(null, Cast<short>(valueToEncode));\n                    break;\n                case BuiltInType.UInt16:\n                    WriteUInt16Array(null, Cast<ushort>(valueToEncode));\n                    break;\n                case BuiltInType.Int32:\n                    WriteInt32Array(null, Cast<int>(valueToEncode));\n                    break;\n                case BuiltInType.UInt32:\n                    WriteUInt32Array(null, Cast<uint>(valueToEncode));\n                    break;\n                case BuiltInType.Int64:\n                    WriteInt64Array(null, Cast<long>(valueToEncode));\n                    break;\n                case BuiltInType.UInt64:\n                    WriteUInt64Array(null, Cast<ulong>(valueToEncode));\n                    break;\n                case BuiltInType.Float:\n                    WriteFloatArray(null, Cast<float>(valueToEncode));\n                    break;\n                case BuiltInType.Double:\n                    WriteDoubleArray(null, Cast<double>(valueToEncode));\n                    break;\n                case BuiltInType.String:\n                    WriteStringArray(null, Cast<string>(valueToEncode));\n                    break;\n                case BuiltInType.DateTime:\n                    WriteDateTimeArray(null, Cast<DateTime>(valueToEncode));\n                    break;\n                case BuiltInType.Guid:\n                    WriteGuidArray(null, Cast<Uuid>(valueToEncode));\n                    break;\n                case BuiltInType.ByteString:\n                    WriteByteStringArray(null, Cast<byte[]>(valueToEncode));\n                    break;\n                case BuiltInType.XmlElement:\n                    WriteXmlElementArray(null, Cast<XmlElement>(valueToEncode));\n                    break;\n                case BuiltInType.NodeId:\n                    WriteNodeIdArray(null, Cast<NodeId>(valueToEncode));\n                    break;\n                case BuiltInType.ExpandedNodeId:\n                    WriteExpandedNodeIdArray(null, Cast<ExpandedNodeId>(valueToEncode));\n                    break;\n                case BuiltInType.StatusCode:\n                    WriteStatusCodeArray(null, Cast<StatusCode>(valueToEncode));\n                    break;\n                case BuiltInType.QualifiedName:\n                    WriteQualifiedNameArray(null, Cast<QualifiedName>(valueToEncode));\n                    break;\n                case BuiltInType.LocalizedText:\n                    WriteLocalizedTextArray(null, Cast<LocalizedText>(valueToEncode));\n                    break;\n                case BuiltInType.ExtensionObject:\n                    WriteExtensionObjectArray(null, Cast<ExtensionObject>(valueToEncode));\n                    break;\n                case BuiltInType.DataValue:\n                    WriteDataValueArray(null, Cast<DataValue>(valueToEncode));\n                    break;\n                case BuiltInType.Enumeration:\n                    // Check whether the value to encode is int array.\n                    if (valueToEncode is int[] ints)\n                    {\n                        WriteEnumeratedArray(null, ints, null);\n                        break;\n                    }\n                    var enums = Cast<Enum>(valueToEncode);\n                    WriteEnumeratedArray(null, enums, null);\n                    break;\n                case BuiltInType.Variant:\n                    if (valueToEncode is Variant[] variants)\n                    {\n                        WriteVariantArray(null, variants);\n                        break;\n                    }\n                    if (valueToEncode is object[] objects)\n                    {\n                        WriteVariantArray(null, objects.Select(v => new Variant(v)).ToArray());\n                        break;\n                    }\n                    throw new EncodingException(\n                        $\"Unexpected type encountered while encoding array: {valueToEncode.GetType()}\");\n                case BuiltInType.DiagnosticInfo:\n                    WriteDiagnosticInfoArray(null, Cast<DiagnosticInfo>(valueToEncode));\n                    break;\n                default:\n                    throw new EncodingException(\n                        $\"Unexpected type encountered while encoding a Variant: {builtInType}\");\n            }\n        }\n\n        /// <summary>\n        /// Write scalar value\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"valueToEncode\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        protected virtual void WriteScalar(BuiltInType builtInType, object valueToEncode)\n        {\n            switch (builtInType)\n            {\n                case BuiltInType.Null:\n                    WriteNull(null, valueToEncode);\n                    return;\n                case BuiltInType.Boolean:\n                    WriteBoolean(null, (bool)valueToEncode);\n                    return;\n                case BuiltInType.SByte:\n                    WriteSByte(null, (sbyte)valueToEncode);\n                    return;\n                case BuiltInType.Byte:\n                    WriteByte(null, (byte)valueToEncode);\n                    return;\n                case BuiltInType.Int16:\n                    WriteInt16(null, (short)valueToEncode);\n                    return;\n                case BuiltInType.UInt16:\n                    WriteUInt16(null, (ushort)valueToEncode);\n                    return;\n                case BuiltInType.Int32:\n                    WriteInt32(null, (int)valueToEncode);\n                    return;\n                case BuiltInType.UInt32:\n                    WriteUInt32(null, (uint)valueToEncode);\n                    return;\n                case BuiltInType.Int64:\n                    WriteInt64(null, (long)valueToEncode);\n                    return;\n                case BuiltInType.UInt64:\n                    WriteUInt64(null, (ulong)valueToEncode);\n                    return;\n                case BuiltInType.Float:\n                    WriteFloat(null, (float)valueToEncode);\n                    return;\n                case BuiltInType.Double:\n                    WriteDouble(null, (double)valueToEncode);\n                    return;\n                case BuiltInType.String:\n                    WriteString(null, (string)valueToEncode);\n                    return;\n                case BuiltInType.DateTime:\n                    WriteDateTime(null, (DateTime)valueToEncode);\n                    return;\n                case BuiltInType.Guid:\n                    WriteGuid(null, (Uuid)valueToEncode);\n                    return;\n                case BuiltInType.ByteString:\n                    WriteByteString(null, (byte[])valueToEncode);\n                    return;\n                case BuiltInType.XmlElement:\n                    WriteXmlElement(null, (XmlElement)valueToEncode);\n                    return;\n                case BuiltInType.NodeId:\n                    WriteNodeId(null, (NodeId)valueToEncode);\n                    return;\n                case BuiltInType.ExpandedNodeId:\n                    WriteExpandedNodeId(null, (ExpandedNodeId)valueToEncode);\n                    return;\n                case BuiltInType.StatusCode:\n                    WriteStatusCode(null, (StatusCode)valueToEncode);\n                    return;\n                case BuiltInType.QualifiedName:\n                    WriteQualifiedName(null, (QualifiedName)valueToEncode);\n                    return;\n                case BuiltInType.LocalizedText:\n                    WriteLocalizedText(null, (LocalizedText)valueToEncode);\n                    return;\n                case BuiltInType.ExtensionObject:\n                    WriteExtensionObject(null, (ExtensionObject)valueToEncode);\n                    return;\n                case BuiltInType.DataValue:\n                    WriteDataValue(null, (DataValue)valueToEncode);\n                    return;\n                case BuiltInType.Enumeration:\n                    WriteEnumerated(null, Convert.ToInt32(valueToEncode,\n                        CultureInfo.InvariantCulture));\n                    return;\n                    //case BuiltInType.DiagnosticInfo:\n                    //    WriteDiagnosticInfo((DiagnosticInfo)valueToEncode);\n                    //    return;\n            }\n\n            throw new EncodingException(\n                $\"Unexpected type encountered while encoding a Variant: {builtInType}\");\n        }\n\n        /// <inheritdoc/>\n        public virtual void WriteArray<T>(string? fieldName,\n            IList<T>? values, Action<T> writer, string? typeName = null)\n        {\n            if (values == null || values.Count == 0)\n            {\n                _writer.WriteInteger(0);\n            }\n            else if (Context.MaxArrayLength > 0 && Context.MaxArrayLength < values.Count)\n            {\n                throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"MaxArrayLength {Context.MaxArrayLength} < {values.Count}.\");\n            }\n            else\n            {\n                _writer.WriteInteger(values.Count);\n                foreach (var value in values)\n                {\n                    writer(value);\n                }\n            }\n            // Array block ends with 0 length\n            _writer.WriteInteger(0);\n        }\n\n        /// <inheritdoc/>\n        protected virtual void WriteArray(string? fieldName, Array? values,\n            Action<object?> writer)\n        {\n            if (values == null || values.Length == 0)\n            {\n                _writer.WriteInteger(0);\n            }\n            else if (Context.MaxArrayLength > 0 && Context.MaxArrayLength < values.Length)\n            {\n                throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"MaxArrayLength {Context.MaxArrayLength} < {values.Length}.\");\n            }\n            else\n            {\n                // write length\n                _writer.WriteInteger(values.Length);\n\n                for (var index = 0; index < values.Length; index++)\n                {\n                    writer(values.GetValue(index));\n                }\n            }\n            // Array block ends with 0 length\n            _writer.WriteInteger(0);\n        }\n\n        /// <inheritdoc/>\n        protected virtual void WriteMatrix<T>(string? fieldName,\n            IList<T>? values, int[] dimensions, Action<T> writer, string? typeName = null)\n        {\n            WriteArray(nameof(Matrix.Dimensions), dimensions,\n                v => WriteInt32(null, v));\n            WriteArray(kDefaultFieldName, values, writer, typeName);\n        }\n\n        /// <inheritdoc/>\n        protected virtual void WriteMatrix(string? fieldName, Matrix matrix,\n            string? typeName = null)\n        {\n            WriteArray(nameof(Matrix.Dimensions), matrix.Dimensions,\n                v => WriteInt32(null, v));\n            WriteArray(kDefaultFieldName, matrix.Elements,\n                matrix.TypeInfo.ValueRank, matrix.TypeInfo.BuiltInType);\n        }\n\n        /// <summary>\n        /// Detect full name of the encodeable object\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"systemType\"></param>\n        /// <param name=\"typeName\"></param>\n        /// <param name=\"typeId\"></param>\n        /// <returns></returns>\n        protected string? GetFullNameOfEncodeable(IEncodeable? value,\n            Type? systemType, out string? typeName, out ExpandedNodeId? typeId)\n        {\n            typeName = systemType?.Name ?? value?.GetType().Name;\n            typeId = value?.TypeId;\n            if (string.IsNullOrEmpty(typeName))\n            {\n                return null;\n            }\n            var fullName = typeId?.GetFullName(typeName, Context);\n            if (string.IsNullOrEmpty(fullName) && systemType != null)\n            {\n                value = (IEncodeable?)Activator.CreateInstance(systemType);\n                typeId ??= value?.TypeId;\n                fullName = typeId?.GetFullName(typeName, Context);\n            }\n            return fullName;\n        }\n\n        /// <summary>\n        /// Test and increment the nesting level.\n        /// </summary>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void CheckAndIncrementNestingLevel()\n        {\n            if (_nestingLevel > Context.MaxEncodingNestingLevels)\n            {\n                throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"Maximum nesting level of {Context.MaxEncodingNestingLevels} was exceeded.\");\n            }\n            _nestingLevel++;\n        }\n\n        /// <summary>\n        /// Default name when field name is not provided\n        /// </summary>\n        protected const string kDefaultFieldName = \"Value\";\n\n        private readonly AvroBinaryWriter _writer;\n        private ushort[]? _namespaceMappings;\n        private ushort[]? _serverMappings;\n        private uint _nestingLevel;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/ConsoleWriter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Storage;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Text.Json;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Debug output writer\n    /// </summary>\n    public sealed class ConsoleWriter : IFileWriter, IDisposable\n    {\n        /// <inheritdoc/>\n        public bool SupportsContentType(string contentType)\n        {\n            return _options.Value.Enabled;\n        }\n\n        /// <summary>\n        /// Create writer\n        /// </summary>\n        /// <param name=\"options\"></param>\n        public ConsoleWriter(IOptions<ConsoleWriterOptions> options)\n        {\n            _options = options;\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask WriteAsync(string fileName, DateTimeOffset timestamp,\n            IEnumerable<ReadOnlySequence<byte>> buffers,\n            IReadOnlyDictionary<string, string?> metadata, IEventSchema? schema,\n            string contentType, CancellationToken ct = default)\n        {\n            Stream fs;\n            if (fileName.Contains(\"stdout\", StringComparison.InvariantCulture))\n            {\n                fs = _stdout ??= Console.OpenStandardOutput();\n            }\n            else if (fileName.Contains(\"stderr\", StringComparison.InvariantCulture))\n            {\n                fs = _stderr ??= Console.OpenStandardError();\n            }\n            else\n            {\n                return;\n            }\n\n            switch (contentType)\n            {\n                case ContentMimeType.Json:\n                    foreach (var buffer in buffers)\n                    {\n                        await fs.WriteAsync(GetIndentedJson(buffer), ct).ConfigureAwait(false);\n                    }\n                    break;\n                default:\n                    foreach (var buffer in buffers)\n                    {\n                        foreach (var memory in buffer)\n                        {\n                            await fs.WriteAsync(memory, ct).ConfigureAwait(false);\n                        }\n                    }\n                    break;\n            }\n\n            static ReadOnlyMemory<byte> GetIndentedJson(ReadOnlySequence<byte> buffer)\n            {\n                var reader = new Utf8JsonReader(buffer);\n                var json = JsonSerializer.Deserialize<JsonElement>(ref reader);\n                return JsonSerializer.SerializeToUtf8Bytes(json, kIndented);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _stdout?.Dispose();\n            _stderr?.Dispose();\n        }\n\n        private static readonly JsonSerializerOptions kIndented = new()\n        {\n            WriteIndented = true\n        };\n        private readonly IOptions<ConsoleWriterOptions> _options;\n        private Stream? _stdout;\n        private Stream? _stderr;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/ConsoleWriterOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    /// <summary>\n    /// Options\n    /// </summary>\n    public sealed class ConsoleWriterOptions\n    {\n        /// <summary>\n        /// Whether to write debug\n        /// </summary>\n        public bool Enabled { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/ContentType.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    /// <summary>\n    /// Content types\n    /// </summary>\n    public static class ContentType\n    {\n        /// <summary>\n        /// Json+Gzip encoding\n        /// </summary>\n        public const string JsonGzip =\n            \"application/json+gzip\";\n\n        /// <summary>\n        /// Avro encoding\n        /// </summary>\n        public const string Avro =\n            \"application/avro\";\n\n        /// <summary>\n        /// Avro+Gzip encoding\n        /// </summary>\n        public const string AvroGzip =\n            \"application/avro+gzip\";\n\n        /// <summary>\n        /// OPC UA json encoding as per OPC UA part 6\n        /// </summary>\n        public const string UaJson =\n            \"application/ua+json\";\n\n        /// <summary>\n        /// OPC UA json encoding but non reversible\n        /// </summary>\n        public const string UaNonReversibleJson =\n            \"application/ua+json+nr\";\n\n        /// <summary>\n        /// OPC UA UADP binary encoding\n        /// </summary>\n        public const string Uadp =\n            \"application/opcua+uadp\";\n\n        /// <summary>\n        /// For backwards compatibility with legacy publisher\n        /// </summary>\n        public const string UaLegacyPublisher =\n            \"application/opcua+uajson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/DecodingException.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Opc.Ua;\n    using System;\n\n    /// <inheritdoc/>\n    [Serializable]\n    public sealed class DecodingException : ServiceResultException\n    {\n        /// <summary>\n        /// Additional information\n        /// </summary>\n        public string? AdditionalInformation { get; set; }\n\n        /// <inheritdoc/>\n        public DecodingException(string message) :\n            base(StatusCodes.BadDecodingError, message)\n        {\n        }\n\n        /// <inheritdoc/>\n        public DecodingException(string message, Exception innerException) :\n            base(StatusCodes.BadDecodingError, message, innerException)\n        {\n        }\n\n        /// <inheritdoc/>\n        public DecodingException(string message, string additionalInformation) :\n            base(StatusCodes.BadDecodingError, message)\n        {\n            AdditionalInformation = additionalInformation;\n        }\n\n        /// <inheritdoc/>\n        public DecodingException(uint statusCode, string message) :\n            base(statusCode, message)\n        {\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            var message = \"Failed to decode. \" + base.ToString();\n            if (AdditionalInformation != null)\n            {\n                message += \"\\n\" + AdditionalInformation;\n            }\n            return message;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/EncodingException.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Opc.Ua;\n    using System;\n\n    /// <inheritdoc/>\n    [Serializable]\n    public sealed class EncodingException : ServiceResultException\n    {\n        /// <summary>\n        /// Additional information\n        /// </summary>\n        public string? AdditionalInformation { get; set; }\n\n        /// <inheritdoc/>\n        public EncodingException(string message) :\n            base(StatusCodes.BadEncodingError, message)\n        {\n        }\n\n        /// <inheritdoc/>\n        public EncodingException(string message, Exception innerException) :\n            base(StatusCodes.BadEncodingError, message, innerException)\n        {\n        }\n\n        /// <inheritdoc/>\n        public EncodingException(string message, string additionalInformation) :\n            base(StatusCodes.BadEncodingError, message)\n        {\n            AdditionalInformation = additionalInformation;\n        }\n\n        /// <inheritdoc/>\n        public EncodingException(uint statusCode, string message) :\n            base(statusCode, message)\n        {\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            var message = \"Failed to encode. \" + base.ToString();\n            if (AdditionalInformation != null)\n            {\n                message += \"\\n\" + AdditionalInformation;\n            }\n            return message;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions/EncodeableEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using System.IO;\n    using System.Text;\n    using System.Xml;\n\n    /// <summary>\n    /// Encodeable extensions\n    /// </summary>\n    public static class EncodeableEx\n    {\n        /// <summary>\n        /// Convert encodeable to xml\n        /// </summary>\n        /// <param name=\"encodeable\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static XmlElement? AsXmlElement(this IEncodeable encodeable,\n            IServiceMessageContext context)\n        {\n            // Bug in stack, do not dispose as we close below\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var encoder = new XmlEncoder(context);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            encoder.WriteExtensionObjectBody(encodeable);\n            var document = new XmlDocument\n            {\n                InnerXml = encoder.CloseAndReturnText()\n            };\n            return document.DocumentElement;\n        }\n\n        /// <summary>\n        /// Convert encodeable to binary\n        /// </summary>\n        /// <param name=\"encodeable\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static byte[] AsBinary(this IEncodeable encodeable,\n            IServiceMessageContext context)\n        {\n            using var stream = new MemoryStream();\n            using (var encoder = new BinaryEncoder(stream, context, true))\n            {\n                encodeable.Encode(encoder);\n            }\n            return stream.ToArray();\n        }\n\n        /// <summary>\n        /// Convert encodeable to json\n        /// </summary>\n        /// <param name=\"encodeable\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static string AsJson(this IEncodeable encodeable,\n            IServiceMessageContext context)\n        {\n            using var stream = new MemoryStream();\n            using (var encoder = new JsonEncoderEx(stream, context, leaveOpen: true))\n            {\n                encodeable.Encode(encoder);\n            }\n            return Encoding.UTF8.GetString(stream.ToArray());\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions/Extensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using UaStructureType = StructureType;\n\n    /// <summary>\n    /// Pub sub related opc ua extensions\n    /// </summary>\n    public static class Extensions\n    {\n        /// <summary>\n        /// Convert structure type\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        public static UaStructureType ToStackType(this StructureType? type)\n        {\n            switch (type)\n            {\n                case StructureType.StructureWithOptionalFields:\n                    return UaStructureType.StructureWithOptionalFields;\n                case StructureType.Union:\n                    return UaStructureType.Union;\n                case StructureType.StructureWithSubtypedValues:\n                    return UaStructureType.StructureWithSubtypedValues;\n                case StructureType.UnionWithSubtypedValues:\n                    return UaStructureType.UnionWithSubtypedValues;\n                default:\n                    return UaStructureType.Structure;\n            }\n        }\n\n        /// <summary>\n        /// Convert structure type\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        public static StructureType ToServiceType(this UaStructureType type)\n        {\n            switch (type)\n            {\n                case UaStructureType.StructureWithOptionalFields:\n                    return StructureType.StructureWithOptionalFields;\n                case UaStructureType.Union:\n                    return StructureType.Union;\n                case UaStructureType.StructureWithSubtypedValues:\n                    return StructureType.StructureWithSubtypedValues;\n                case UaStructureType.UnionWithSubtypedValues:\n                    return StructureType.UnionWithSubtypedValues;\n                default:\n                    return StructureType.Structure;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions/JsonSerializerUtcEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Opc.Ua;\n    using System;\n    using System.Globalization;\n\n    /// <summary>\n    /// Json serializer settings extensions\n    /// </summary>\n    public static class JsonSerializerUtcEx\n    {\n        /// <summary>\n        /// Constant for OpcUa JSON encoded DateTime.MinValue.\n        /// </summary>\n        public const string OpcUaDateTimeMinValue = \"0001-01-01T00:00:00Z\";\n\n        /// <summary>\n        /// Constant for OpcUa JSON encoded DateTime.MaxValue.\n        /// </summary>\n        public const string OpcUaDateTimeMaxValue = \"9999-12-31T23:59:59Z\";\n\n        /// <summary>\n        /// DateTime value of: 9999-12-31T23:59:59Z\n        /// </summary>\n        private static readonly DateTime kDateTimeMaxJsonValue = new(3155378975990000000);\n\n        /// <summary>\n        /// Convert to OpcUa JSON Encoded Utc string.\n        /// </summary>\n        /// <param name=\"dateTime\"></param>\n        public static string ToOpcUaJsonEncodedTime(this DateTime dateTime)\n        {\n            if (dateTime <= DateTime.MinValue)\n            {\n                return OpcUaDateTimeMinValue;\n            }\n            else if (dateTime >= kDateTimeMaxJsonValue)\n            {\n                return OpcUaDateTimeMaxValue;\n            }\n            else\n            {\n                return dateTime.ToUniversalTime().ToString(\"yyyy-MM-dd'T'HH:mm:ss.FFFFFFFK\",\n                    CultureInfo.InvariantCulture);\n            }\n        }\n\n        /// <summary>\n        /// Convert DataValue timestamps to OpcUa Encoded Utc.\n        /// </summary>\n        /// <param name=\"dataValue\"></param>\n        public static DataValue ToOpcUaUniversalTime(this DataValue dataValue)\n        {\n            dataValue.SourceTimestamp = dataValue.SourceTimestamp.ToOpcUaUniversalTime();\n            dataValue.ServerTimestamp = dataValue.ServerTimestamp.ToOpcUaUniversalTime();\n            return dataValue;\n        }\n\n        /// <summary>\n        /// Converter from OpcUa encoded Utc to DateTime.\n        /// The result is DateTime.MinValue, DateTime.MaxValue or\n        /// the Utc kind.\n        /// </summary>\n        /// <param name=\"dateTime\"></param>\n        public static DateTime ToOpcUaUniversalTime(this DateTime dateTime)\n        {\n            if (dateTime <= DateTime.MinValue)\n            {\n                return DateTime.MinValue;\n            }\n            else if (dateTime >= kDateTimeMaxJsonValue)\n            {\n                return DateTime.MaxValue;\n            }\n            else\n            {\n                if (dateTime.Kind != DateTimeKind.Utc)\n                {\n                    return dateTime.ToUniversalTime();\n                }\n            }\n            return dateTime;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions/LocalizedTextEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    /// <summary>\n    /// Localized text extensions\n    /// </summary>\n    public static class LocalizedTextEx\n    {\n        /// <summary>\n        /// Convert localized text to string\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static string? AsString(this LocalizedText? value)\n        {\n            if (value == null || value.Text == null)\n            {\n                return null;\n            }\n            var full = value.Text;\n            if (!string.IsNullOrEmpty(value.Locale))\n            {\n                return full + \"@\" + value.Locale;\n            }\n            return full;\n        }\n\n        /// <summary>\n        /// Convert string to localized text\n        /// </summary>\n        /// <param name=\"str\"></param>\n        /// <returns></returns>\n        public static LocalizedText ToLocalizedText(this string str)\n        {\n            if (string.IsNullOrEmpty(str))\n            {\n                return new LocalizedText(string.Empty);\n            }\n            var delim = str.LastIndexOf('@');\n            if (delim == -1)\n            {\n                return new LocalizedText(str);\n            }\n            return new LocalizedText(str[(delim + 1)..], str[..delim]);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions/NodeIdEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Azure.IIoT.OpcUa.Encoders.Utils;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text;\n    using System.Text.RegularExpressions;\n\n    /// <summary>\n    /// Node id extensions\n    /// </summary>\n    public static class NodeIdEx\n    {\n        /// <summary>\n        /// Creates an expanded node id from node id.\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"namespaces\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        public static ExpandedNodeId ToExpandedNodeId(this NodeId nodeId,\n            NamespaceTable? namespaces)\n        {\n            if (NodeId.IsNull(nodeId))\n            {\n                return ExpandedNodeId.Null;\n            }\n            string? ns = null;\n            if (nodeId.NamespaceIndex > 0)\n            {\n                ArgumentNullException.ThrowIfNull(namespaces);\n                ns = namespaces.GetString(nodeId.NamespaceIndex);\n            }\n            return new ExpandedNodeId(nodeId.Identifier, nodeId.NamespaceIndex, ns, 0);\n        }\n\n        /// <summary>\n        /// Convert an expanded node id to a node id.\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"namespaces\"></param>\n        /// <param name=\"allowUnknownNamespace\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public static NodeId ToNodeId(this ExpandedNodeId? nodeId, NamespaceTable namespaces,\n            bool allowUnknownNamespace = false)\n        {\n            if (nodeId?.IsNull != false)\n            {\n                return NodeId.Null;\n            }\n            if (nodeId.NamespaceIndex > 0 && namespaces == null)\n            {\n                throw new ArgumentNullException(nameof(namespaces));\n            }\n            int index = nodeId.NamespaceIndex;\n            if (!string.IsNullOrEmpty(nodeId.NamespaceUri))\n            {\n                index = namespaces.GetIndex(nodeId.NamespaceUri);\n                if (index < 0)\n                {\n                    if (!allowUnknownNamespace)\n                    {\n                        throw new ArgumentException(\n                            $\"Namespace '{nodeId.NamespaceUri}' was not found in NamespaceTable.\",\n                            nameof(nodeId));\n                    }\n                    index = 0;\n                }\n            }\n            return new NodeId(nodeId.Identifier, (ushort)index);\n        }\n\n        /// <summary>\n        /// Returns a uri that identifies the node id uniquely.  If the server\n        /// uri information is provided, and the it contains a server name at\n        /// index 0, the node id will be formatted as an expanded node id uri\n        /// (see below).  Otherwise, the  resource is the namespace and not the\n        /// server.\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        public static string? AsString(this NodeId nodeId, IServiceMessageContext context,\n            NamespaceFormat namespaceFormat)\n        {\n            if (NodeId.IsNull(nodeId))\n            {\n                return null;\n            }\n            return nodeId\n                .ToExpandedNodeId(context.NamespaceUris)\n                .AsString(context, namespaceFormat);\n        }\n\n        /// <summary>\n        /// Returns a node uri from an expanded node id.\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        public static string? AsString(this ExpandedNodeId nodeId, IServiceMessageContext context,\n            NamespaceFormat namespaceFormat)\n        {\n            if (NodeId.IsNull(nodeId))\n            {\n                return null;\n            }\n\n            var nsUri = nodeId.NamespaceUri;\n            if (string.IsNullOrEmpty(nsUri) &&\n                (namespaceFormat == NamespaceFormat.ExpandedWithNamespace0 || nodeId.NamespaceIndex != 0))\n            {\n                nsUri = context.NamespaceUris.GetString(nodeId.NamespaceIndex);\n                if (string.IsNullOrEmpty(nsUri))\n                {\n                    nsUri = null;\n                }\n            }\n            string? srvUri = null;\n            if (context.ServerUris != null &&\n                (namespaceFormat == NamespaceFormat.ExpandedWithNamespace0 || nodeId.ServerIndex != 0))\n            {\n                srvUri = context.ServerUris.GetString(nodeId.ServerIndex);\n                if (string.IsNullOrEmpty(srvUri))\n                {\n                    srvUri = null;\n                }\n            }\n            switch (namespaceFormat)\n            {\n                default:\n                    if (nsUri != null && !Uri.IsWellFormedUriString(nsUri, UriKind.Absolute))\n                    {\n                        // Fall back to nsu= format - but strip indexes\n                        return FormatNodeIdExpanded(nsUri, 0u, nodeId.IdType, nodeId.Identifier);\n                    }\n                    return FormatNodeIdUri(nsUri, srvUri, nodeId.IdType, nodeId.Identifier);\n                case NamespaceFormat.Expanded:\n                case NamespaceFormat.ExpandedWithNamespace0:\n                    return FormatNodeIdExpanded(nsUri, nodeId.ServerIndex, nodeId.IdType,\n                        nodeId.Identifier);\n                case NamespaceFormat.Index:\n                    return new ExpandedNodeId(nodeId.Identifier, nodeId.NamespaceIndex, null,\n                        nodeId.ServerIndex).ToString();\n            }\n        }\n\n        /// <summary>\n        /// Returns a node from a string\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static NodeId ToNodeId(this string? value, IServiceMessageContext context)\n        {\n            if (value == null)\n            {\n                return NodeId.Null;\n            }\n            var parts = value.Split(';');\n            if (parts.Any(s => s.StartsWith(\"ns=\", StringComparison.CurrentCulture)))\n            {\n                return NodeId.Parse(value);\n            }\n            if (parts.Any(s => s.StartsWith(\"nsu=\", StringComparison.CurrentCulture)))\n            {\n                return ExpandedNodeId.Parse(value).ToNodeId(context.NamespaceUris);\n            }\n            var identifier = ParseNodeIdUri(value, out var nsUri, out var srvUri);\n            return new NodeId(identifier, context.NamespaceUris.GetIndexOrAppend(nsUri));\n        }\n\n        /// <summary>\n        /// Returns an expanded node id from a node uri.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static ExpandedNodeId ToExpandedNodeId(this string? value, IServiceMessageContext context)\n        {\n            if (value == null)\n            {\n                return ExpandedNodeId.Null;\n            }\n            var parts = value.Split(';');\n            if (parts.Any(s =>\n                s.StartsWith(\"ns=\", StringComparison.CurrentCulture) ||\n                s.StartsWith(\"nsu=\", StringComparison.CurrentCulture)))\n            {\n                return ExpandedNodeId.Parse(value);\n            }\n            var identifier = ParseNodeIdUri(value, out var nsUri, out var srvUri);\n\n            // Allocate entry in context if does not exist\n            var nsIndex = context.NamespaceUris.GetIndexOrAppend(nsUri);\n            if (!string.IsNullOrEmpty(srvUri))\n            {\n                return new ExpandedNodeId(identifier, 0, nsUri == Namespaces.OpcUa ? null : nsUri,\n                    context.ServerUris.GetIndexOrAppend(srvUri));\n            }\n            return new ExpandedNodeId(identifier, 0, nsUri == Namespaces.OpcUa ? null : nsUri, 0);\n        }\n\n        /// <summary>\n        /// Format node id components into a uri string\n        /// </summary>\n        /// <param name=\"nsUri\"></param>\n        /// <param name=\"srvUri\"></param>\n        /// <param name=\"idType\"></param>\n        /// <param name=\"identifier\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"FormatException\"></exception>\n        private static string FormatNodeIdUri(string? nsUri, string? srvUri,\n            IdType idType, object? identifier)\n        {\n            var buffer = new StringBuilder();\n            if (nsUri != null)\n            {\n                // Append node id as fragment\n                buffer = buffer.Append(nsUri)\n                    .Append('#');\n            }\n            switch (idType)\n            {\n                case IdType.Numeric:\n                    if (srvUri == null && nsUri == null &&\n                        TryGetDataTypeName(identifier, out var typeName))\n                    {\n                        // For readability use data type name here if possible\n                        return typeName;\n                    }\n                    buffer = buffer.Append(\"i=\");\n                    if (identifier == null)\n                    {\n                        buffer.Append('0'); // null\n                        break;\n                    }\n                    buffer = buffer.AppendFormat(CultureInfo.InvariantCulture,\n                        \"{0}\", identifier);\n                    break;\n                case IdType.String:\n                    buffer = buffer.Append(\"s=\");\n                    if (identifier == null)\n                    {\n                        break; // null\n                    }\n                    buffer = buffer.Append(identifier.ToString()?.UrlEncode());\n                    break;\n                case IdType.Guid:\n                    buffer = buffer.Append(\"g=\");\n                    if (identifier == null)\n                    {\n                        buffer.Append(Guid.Empty); // null\n                        break;\n                    }\n                    buffer = buffer.Append(((Guid)identifier).ToString(\"D\").UrlEncode());\n                    break;\n                case IdType.Opaque:\n                    buffer = buffer.Append(\"b=\");\n                    if (identifier == null)\n                    {\n                        break; // null\n                    }\n                    buffer = buffer.AppendFormat(CultureInfo.InvariantCulture,\n                        \"{0}\", ((byte[])identifier).ToBase64String().UrlEncode());\n                    break;\n                default:\n                    throw new FormatException($\"Node id type {idType} is unknown!\");\n            }\n            if (srvUri != null)\n            {\n                // Pack server in front of identifier\n                buffer = buffer.Append(\"&srv=\")\n                    .Append(srvUri);\n            }\n            return buffer.ToString();\n        }\n\n        private static string FormatNodeIdExpanded(string? nsUri, uint serverIndex,\n            IdType idType, object? identifier)\n        {\n            var buffer = new StringBuilder();\n            if (serverIndex != 0)\n            {\n                buffer = buffer\n                    .Append(\"svr=\")\n                    .Append(serverIndex)\n                    .Append(';');\n            }\n            if (!string.IsNullOrEmpty(nsUri))\n            {\n                buffer = buffer\n                    .Append(\"nsu=\")\n                    .Append(nsUri.Replace(\";\", \"%3b\", StringComparison.Ordinal))\n                    .Append(';');\n            }\n            switch (idType)\n            {\n                case IdType.Numeric:\n                    buffer = buffer.Append(\"i=\")\n                        .Append(identifier == null ? 0 :\n                        (uint)identifier);\n                    break;\n                case IdType.Guid:\n                    buffer = buffer.Append(\"g=\")\n                        .Append(identifier == null ? Guid.Empty :\n                        (Guid)identifier);\n                    break;\n                case IdType.Opaque:\n                    buffer = buffer.Append(\"b=\")\n                        .Append(identifier == null ? string.Empty :\n                        Convert.ToBase64String((byte[])identifier));\n                    break;\n                default:\n                    buffer = buffer.Append(\"s=\")\n                        .Append(identifier == null ? string.Empty :\n                        identifier.ToString());\n                    break;\n            }\n            return buffer.ToString();\n        }\n\n        /// <summary>\n        /// Parses a node uri and returns components.  The format of the uri is\n        /// <para>namespaceuri(?srv=serverurn)#idtype_idasstring</para>.  Avoid url\n        /// encoding due to the problem of storage encoding again.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"nsUri\"></param>\n        /// <param name=\"srvUri\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"FormatException\"></exception>\n        private static object? ParseNodeIdUri(string value, out string nsUri, out string? srvUri)\n        {\n            // Get resource uri\n            if (!Uri.TryCreate(value, UriKind.Absolute, out var uri))\n            {\n                // Not a absolute uri, try to mitigate a potentially nonstandard namespace string\n                const string sepPattern = @\"(.+)#([isgb]{1}\\=.*)\";\n#pragma warning disable SYSLIB1045 // Convert to 'GeneratedRegexAttribute'.\n                var match = Regex.Match(value, sepPattern);\n#pragma warning restore SYSLIB1045 // Convert to 'GeneratedRegexAttribute'.\n                if (match.Success)\n                {\n                    nsUri = match.Groups[1].Value;\n                    value = match.Groups[2].Value;\n                }\n                else\n                {\n                    nsUri = Namespaces.OpcUa;\n                }\n            }\n            else\n            {\n                if (string.IsNullOrEmpty(uri.Fragment))\n                {\n                    throw new FormatException(\"Bad fragment - should contain identifier.\");\n                }\n\n                var idStart = value.IndexOf('#', StringComparison.Ordinal);\n\n                nsUri = idStart >= 0 ? value[..idStart] : uri.NoQueryAndFragment().AbsoluteUri;\n                value = uri.Fragment.TrimStart('#');\n            }\n\n            var and = value?.IndexOf('&', StringComparison.Ordinal) ?? -1;\n            if (and != -1)\n            {\n                var remainder = value![and..];\n                // See if the query contains the server identfier\n                if (remainder.StartsWith(\"&srv=\", StringComparison.Ordinal))\n                {\n                    // The uri denotes an id in a namespace on a server\n                    srvUri = remainder[5..];\n                }\n                else\n                {\n                    throw new FormatException($\"{value} does not contain ?srv=\");\n                }\n                return ParseIdentifier(value[..and]);\n            }\n            srvUri = null;\n            return ParseIdentifier(value);\n        }\n\n        /// <summary>\n        /// Parse identfier from string\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        private static object? ParseIdentifier(string? text)\n        {\n            if (text == null)\n            {\n                return null;\n            }\n            if (text.Length > 1 && text[1] is '=' or '_')\n            {\n                try\n                {\n                    return ParseIdentifier(text[0], text[2..]);\n                }\n                catch (FormatException)\n                {\n                }\n            }\n            // Try to retrieve data type identifier from text\n            if (TryGetDataTypeId(text, out var id))\n            {\n                return id;\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Parse identfier from string\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"text\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"FormatException\"></exception>\n        private static object ParseIdentifier(char type, string text)\n        {\n            switch (type)\n            {\n                case 'i':\n                    try\n                    {\n                        return Convert.ToUInt32(text.UrlDecode(),\n                            CultureInfo.InvariantCulture);\n                    }\n                    catch\n                    {\n                        return Convert.ToUInt32(text,\n                            CultureInfo.InvariantCulture);\n                    }\n                case 'b':\n                    try\n                    {\n                        return Convert.FromBase64String(text.UrlDecode());\n                    }\n                    catch\n                    {\n                        return Convert.FromBase64String(text);\n                    }\n                case 'g':\n                    if (!Guid.TryParse(text.UrlDecode(), out var guid))\n                    {\n                        return Guid.Parse(text);\n                    }\n                    return guid;\n                case 's':\n                    return text.UrlDecode();\n            }\n            throw new FormatException($\"{type} is not a known node id type\");\n        }\n\n        /// <summary>\n        /// Returns a data type id for the name\n        /// </summary>\n        /// <param name=\"text\"></param>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        private static bool TryGetDataTypeId(string text, out uint id)\n        {\n            if (Enum.TryParse<BuiltInType>(text, true, out var type))\n            {\n                id = (uint)type;\n                return true;\n            }\n            if (TypeMaps.DataTypes.Value.TryGetIdentifier(text, out id))\n            {\n                return true;\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Returns data type name for identifier\n        /// </summary>\n        /// <param name=\"identifier\"></param>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        private static bool TryGetDataTypeName(object? identifier, [NotNullWhen(true)] out string? name)\n        {\n            name = null;\n            try\n            {\n                if (identifier is not uint uid)\n                {\n                    return false;\n                }\n                if (uid <= int.MaxValue)\n                {\n                    var id = (int)uid;\n                    if (Enum.IsDefined(typeof(BuiltInType), id))\n                    {\n                        name = Enum.GetName(typeof(BuiltInType), id);\n                        if (StringComparer.OrdinalIgnoreCase.Equals(name, nameof(BuiltInType.Null)))\n                        {\n                            name = null;\n                        }\n                    }\n                }\n                if (!string.IsNullOrEmpty(name))\n                {\n                    return true;\n                }\n                if (TypeMaps.DataTypes.Value.TryGetBrowseName(uid, out name) &&\n                    StringComparer.OrdinalIgnoreCase.Equals(name, nameof(BuiltInType.Null)))\n                {\n                    name = null;\n                }\n                return !string.IsNullOrEmpty(name);\n            }\n            catch\n            {\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions/QualifiedNameEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Text;\n\n    /// <summary>\n    /// Qualified name extensions\n    /// </summary>\n    public static class QualifiedNameEx\n    {\n        /// <summary>\n        /// Returns a uri that identifies the qualified name uniquely.\n        /// </summary>\n        /// <param name=\"qn\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        public static string AsString(this QualifiedName qn, IServiceMessageContext context,\n            NamespaceFormat namespaceFormat)\n        {\n            if (qn == null || qn == QualifiedName.Null)\n            {\n                return string.Empty;\n            }\n\n            var qnName = qn.Name ?? string.Empty;\n            var buffer = new StringBuilder();\n            if (namespaceFormat == NamespaceFormat.ExpandedWithNamespace0\n                || qn.NamespaceIndex != 0\n                || qnName.Contains(':', StringComparison.Ordinal))\n            {\n                switch (namespaceFormat)\n                {\n                    default:\n                        var nsUri = context.NamespaceUris.GetString(qn.NamespaceIndex);\n                        if (!string.IsNullOrEmpty(nsUri))\n                        {\n                            buffer.Append(nsUri);\n                            // Append name as fragment\n                            if (!string.IsNullOrEmpty(qnName))\n                            {\n                                buffer.Append('#');\n                            }\n                        }\n                        break;\n                    case NamespaceFormat.ExpandedWithNamespace0:\n                    case NamespaceFormat.Expanded:\n                        var nsUri2 = context.NamespaceUris.GetString(qn.NamespaceIndex);\n                        if (!string.IsNullOrEmpty(nsUri2))\n                        {\n                            buffer.Append(\"nsu=\").Append(nsUri2).Append(';');\n                        }\n                        break;\n                    case NamespaceFormat.Index:\n                        buffer.Append(qn.NamespaceIndex).Append(':');\n                        break;\n                }\n            }\n            buffer.Append(qnName.UrlEncode());\n            return buffer.ToString();\n        }\n\n        /// <summary>\n        /// Returns a qualified name from a string\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static QualifiedName ToQualifiedName(this string? value, IServiceMessageContext context)\n        {\n            if (string.IsNullOrEmpty(value))\n            {\n                return QualifiedName.Null;\n            }\n            string? nsUri = null;\n\n            // Try to parse the index format\n            var parts = value.Split(':');\n            if (ushort.TryParse(parts[0], out var nsIndex))\n            {\n                value = value[(parts[0].Length + 1)..];\n                return new QualifiedName(\n                    string.IsNullOrEmpty(value) ? null : value.UrlDecode(),\n                    nsIndex);\n            }\n\n            // Try to parse the expanded format\n            if (value.StartsWith(\"nsu=\", StringComparison.Ordinal))\n            {\n                parts = value.Split(';');\n                value = value[(parts[0].Length + 1)..];\n                return new QualifiedName(\n                    string.IsNullOrEmpty(value) ? null : value.UrlDecode(),\n                    context.NamespaceUris.GetIndexOrAppend(parts[0][4..]));\n            }\n\n            // Try to parse as uri with fragment\n            if (Uri.TryCreate(value, UriKind.Absolute, out var uri))\n            {\n                if (string.IsNullOrEmpty(uri.Fragment))\n                {\n                    value = string.Empty;\n                }\n                else\n                {\n                    value = uri.Fragment.TrimStart('#');\n                }\n                nsUri = uri.NoQueryAndFragment().AbsoluteUri;\n            }\n            else\n            {\n                // Not a real namespace uri - split and decode\n                parts = value.Split('#');\n                if (parts.Length == 2)\n                {\n                    nsUri = parts[0];\n                    value = parts[1];\n                }\n            }\n            if (nsUri != null)\n            {\n                return new QualifiedName(\n                    string.IsNullOrEmpty(value) ? null : value.UrlDecode(),\n                    context.NamespaceUris.GetIndexOrAppend(nsUri));\n            }\n            try\n            {\n                return QualifiedName.Parse(value.UrlDecode());\n            }\n            catch\n            {\n                // Give up\n                return new QualifiedName(value);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions/StatusCodeEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua\n{\n    using Azure.IIoT.OpcUa.Encoders.Utils;\n\n    /// <summary>\n    /// Status code extensions\n    /// </summary>\n    public static class StatusCodeEx\n    {\n        /// <summary>\n        /// Get symbolic name - fast\n        /// </summary>\n        /// <param name=\"code\"></param>\n        /// <returns></returns>\n        public static string AsString(this StatusCode code)\n        {\n            if (!TypeMaps.StatusCodes.Value.TryGetBrowseName(code.CodeBits, out var name))\n            {\n                return string.Empty;\n            }\n            return name;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions/TypeInfoEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua\n{\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Typeinfo extensions\n    /// </summary>\n    public static class TypeInfoEx\n    {\n        /// <summary>\n        /// Returns default value for type\n        /// </summary>\n        /// <param name=\"typeInfo\"></param>\n        /// <returns></returns>\n        public static object GetDefaultValue(this TypeInfo typeInfo)\n        {\n            var builtInType = typeInfo.BuiltInType;\n            if (typeInfo.ValueRank == ValueRanks.Scalar)\n            {\n                // For scalar values, try to retrieve a default.\n                return TypeInfo.GetDefaultValue(builtInType);\n            }\n            if (typeInfo.ValueRank <= 1)\n            {\n                return Array.CreateInstance(\n                    TypeInfo.GetSystemType(builtInType, -1) ??\n                    typeof(object), 0);\n            }\n            return new Matrix(\n                Array.CreateInstance(\n                    TypeInfo.GetSystemType(builtInType, -1) ??\n                        typeof(object),\n                    new int[typeInfo.ValueRank]),\n                builtInType);\n        }\n\n        /// <summary>\n        /// Create Variant\n        /// </summary>\n        /// <param name=\"typeInfo\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public static Variant CreateVariant(this TypeInfo typeInfo, object value)\n        {\n            value ??= typeInfo.GetDefaultValue();\n            if (value is not Variant var)\n            {\n                var aex = new List<Exception>();\n                if (typeInfo.BuiltInType == BuiltInType.Enumeration)\n                {\n                    typeInfo = new TypeInfo(BuiltInType.Int32, typeInfo.ValueRank);\n                }\n                var systemType = TypeInfo.GetSystemType(typeInfo.BuiltInType,\n                    typeInfo.ValueRank);\n                if (typeInfo.BuiltInType == BuiltInType.Null)\n                {\n                    if (typeInfo.ValueRank == 1)\n                    {\n                        systemType = typeof(object[]);\n                    }\n                    else\n                    {\n                        return Variant.Null; // Matrix or scalar\n                    }\n                }\n                else if (value is Array arr)\n                {\n                    try\n                    {\n                        var unboxed = Array.CreateInstance(\n                            TypeInfo.GetSystemType(typeInfo.BuiltInType, -1), arr.Length);\n                        Array.Copy(arr, unboxed, arr.Length);\n                        value = unboxed;\n                    }\n                    catch (Exception ex)\n                    {\n                        aex.Add(ex);\n                        value = arr;\n                    }\n                }\n                if (typeInfo.ValueRank >= 2)\n                {\n                    systemType = typeof(Matrix);\n                }\n                var constructor = typeof(Variant).GetConstructor([\n                    systemType\n                ]);\n                try\n                {\n                    if (constructor != null)\n                    {\n                        return (Variant)constructor.Invoke([value]);\n                    }\n                }\n                catch (Exception ex)\n                {\n                    aex.Add(ex);\n                }\n                try\n                {\n                    return new Variant(value, typeInfo);\n                }\n                catch (Exception ex)\n                {\n                    aex.Add(ex);\n                    throw new ArgumentException($\"Cannot convert {value} \" +\n                        $\"({value.GetType()}/{systemType}/{typeInfo}) to Variant.\",\n                        new AggregateException(aex));\n                }\n            }\n            return var;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Extensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using System;\n    using System.Buffers;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Linq;\n\n    internal static class Extensions\n    {\n        /// <summary>\n        /// Sanitize file name\n        /// </summary>\n        /// <param name=\"fileName\"></param>\n        /// <returns></returns>\n        public static string SanitizeFileName(this string fileName)\n        {\n            if (fileName.Length > 250)\n            {\n                fileName = new string(fileName.AsSpan()[..230]);\n                fileName += fileName.ToSha1Hash();\n            }\n            return fileName;\n        }\n\n        /// <summary>\n        /// Decompress\n        /// </summary>\n        /// <param name=\"data\"></param>\n        /// <returns></returns>\n        public static ReadOnlySequence<byte> GzipDecompress(this ReadOnlySequence<byte> data)\n        {\n            using var compressedStream = new MemoryStream(data.ToArray());\n            using var gzip = new GZipStream(compressedStream, CompressionMode.Decompress);\n            return new ReadOnlySequence<byte>(gzip.ReadAsBuffer());\n        }\n\n        /// <summary>\n        /// Compress\n        /// </summary>\n        /// <param name=\"data\"></param>\n        /// <returns></returns>\n        public static ReadOnlySequence<byte> GzipCompress(this ReadOnlySequence<byte> data)\n        {\n            using var compressedStream = new MemoryStream();\n            using (var gzip = new GZipStream(compressedStream, CompressionMode.Compress))\n            {\n                foreach (var buffer in data)\n                {\n                    gzip.Write(buffer.Span);\n                }\n            }\n            return new ReadOnlySequence<byte>(compressedStream.ToArray());\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/IVariantEncoder.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Opc.Ua;\n\n    /// <summary>\n    /// Variant codec\n    /// </summary>\n    public interface IVariantEncoder\n    {\n        /// <summary>\n        /// Get context\n        /// </summary>\n        IServiceMessageContext Context { get; }\n\n        /// <summary>\n        /// Format variant as string\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"builtinType\"></param>\n        /// <returns></returns>\n        VariantValue Encode(Variant? value, out BuiltInType builtinType);\n\n        /// <summary>\n        /// Parse token to variant\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"builtinType\"></param>\n        /// <returns></returns>\n        Variant Decode(VariantValue value, BuiltInType builtinType);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/JsonDecoderEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Newtonsoft.Json;\n    using Newtonsoft.Json.Linq;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Xml;\n\n    /// <summary>\n    /// Reads objects from reader or string\n    /// </summary>\n    public sealed class JsonDecoderEx : IDecoder\n    {\n        /// <inheritdoc/>\n        public EncodingType EncodingType => EncodingType.Json;\n\n        /// <inheritdoc/>\n        public IServiceMessageContext Context { get; }\n\n        /// <summary>\n        /// Create decoder\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"useJsonLoader\"></param>\n        public JsonDecoderEx(Stream stream, IServiceMessageContext? context = null,\n            bool useJsonLoader = true) :\n            this(new JsonTextReader(new StreamReader(stream))\n            {\n                FloatParseHandling = FloatParseHandling.Double\n            }, context, useJsonLoader)\n        {\n        }\n\n        /// <summary>\n        /// Create decoder\n        /// </summary>\n        /// <param name=\"reader\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"useJsonLoader\"></param>\n        internal JsonDecoderEx(JsonReader reader, IServiceMessageContext? context,\n            bool useJsonLoader = true)\n        {\n            Context = context ?? new ServiceMessageContext();\n            _reader = !useJsonLoader ? reader : new JsonLoader(\n                reader ?? throw new ArgumentNullException(nameof(reader)));\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            if (_reader is JsonLoader loader)\n            {\n                loader.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Close()\n        {\n            // No op\n        }\n\n        /// <inheritdoc/>\n        public void PushNamespace(string namespaceUri)\n        {\n            // No op\n        }\n\n        /// <inheritdoc/>\n        public void PopNamespace()\n        {\n            // No op\n        }\n\n        /// <inheritdoc/>\n        public void SetMappingTables(NamespaceTable namespaceUris, StringTable serverUris)\n        {\n            // No op\n        }\n\n        /// <inheritdoc/>\n        public IEncodeable DecodeMessage(Type expectedType)\n        {\n            throw ServiceResultException.Create(StatusCodes.BadNotSupported,\n                \"Not supported in this decoder.\");\n        }\n\n        /// <inheritdoc/>\n        public uint ReadSwitchField(IList<string> switches, out string? fieldName)\n        {\n            var index = ReadUInt32(\"SwitchField\");\n            if (switches == null)\n            {\n                fieldName = null;\n                return 0;\n            }\n\n            if (index >= switches.Count)\n            {\n                fieldName = null;\n                return index;\n            }\n\n            fieldName = switches[(int)index];\n            return index;\n        }\n\n        /// <inheritdoc/>\n        public uint ReadEncodingMask(IList<string> masks)\n        {\n            return ReadUInt32(\"EncodingMask\");\n        }\n\n        /// <inheritdoc/>\n        public bool ReadBoolean(string? fieldName)\n        {\n            return TryGetToken(fieldName, out var value) && (bool)value;\n        }\n\n        /// <inheritdoc/>\n        public sbyte ReadSByte(string? fieldName)\n        {\n            return ReadValue<sbyte>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public byte ReadByte(string? fieldName)\n        {\n            return ReadValue<byte>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public short ReadInt16(string? fieldName)\n        {\n            return ReadValue<short>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public ushort ReadUInt16(string? fieldName)\n        {\n            return ReadValue<ushort>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public int ReadInt32(string? fieldName)\n        {\n            return ReadValue<int>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public uint ReadUInt32(string? fieldName)\n        {\n            return ReadValue<uint>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public long ReadInt64(string? fieldName)\n        {\n            return ReadValue<long>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public ulong ReadUInt64(string? fieldName)\n        {\n            return ReadValue<ulong>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public float ReadFloat(string? fieldName)\n        {\n            return ReadValue<float>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public double ReadDouble(string? fieldName)\n        {\n            return ReadValue<double>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public byte[]? ReadByteString(string? fieldName)\n        {\n            return ReadValue<byte[]>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public string? ReadString(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (token.Type == JTokenType.String)\n            {\n                return (string?)token;\n            }\n            return token.ToString(); // Return json string of token.\n        }\n\n        /// <inheritdoc/>\n        public Uuid ReadGuid(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return Uuid.Empty;\n            }\n            switch (token.Type)\n            {\n                case JTokenType.String:\n                    if (Guid.TryParse((string?)token, out var guid))\n                    {\n                        return new Uuid(guid);\n                    }\n                    return new Uuid((string?)token);\n                case JTokenType.Guid:\n                    return new Uuid((Guid)token);\n                case JTokenType.Bytes:\n                    var bytes = (byte[]?)token;\n                    if (bytes == null || bytes.Length != 16)\n                    {\n                        break;\n                    }\n                    return new Uuid(new Guid(bytes));\n            }\n            return Uuid.Empty;\n        }\n\n        /// <inheritdoc/>\n        public DateTime ReadDateTime(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return DateTime.MinValue;\n            }\n            if (token.Type == JTokenType.String)\n            {\n                var dateTimeString = (string?)token;\n                return XmlConvert.ToDateTime(dateTimeString!,\n                    XmlDateTimeSerializationMode.Utc).ToOpcUaUniversalTime();\n            }\n            var value = token.ToObject<DateTime?>();\n            if (value != null)\n            {\n                return value.Value.ToOpcUaUniversalTime();\n            }\n            return DateTime.MinValue;\n        }\n\n        /// <inheritdoc/>\n        public XmlElement? ReadXmlElement(string? fieldName)\n        {\n            var bytes = ReadByteString(fieldName);\n            if (bytes?.Length > 0)\n            {\n                var document = new XmlDocument\n                {\n                    InnerXml = Encoding.UTF8.GetString(bytes)\n                };\n                return document.DocumentElement;\n            }\n\n            // Fallback\n            if (TryGetToken(fieldName, out var token))\n            {\n                return token.ToObject<XmlElement>();\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public NodeId? ReadNodeId(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (token is JObject o)\n            {\n                _stack.Push(o);\n                // Read non reversable encoding\n                ushort namespaceIndex = 0;\n                NodeId? nodeId = null;\n                if (TryGetToken(\"Namespace\", out var namespaceToken))\n                {\n                    switch (namespaceToken.Type)\n                    {\n                        case JTokenType.String:\n                            var namespaceString = ReadString(\"Namespace\");\n                            if (namespaceString != null)\n                            {\n                                namespaceIndex = Context.NamespaceUris.GetIndexOrAppend(namespaceString);\n                            }\n                            break;\n                        case JTokenType.Integer:\n                            namespaceIndex = ReadUInt16(\"Namespace\");\n                            break;\n                    }\n                }\n                switch ((IdType)ReadByte(\"IdType\"))\n                {\n                    case IdType.Numeric:\n                        nodeId = new NodeId(ReadUInt32(\"Id\"), namespaceIndex);\n                        break;\n                    case IdType.String:\n                        nodeId = new NodeId(ReadString(\"Id\"), namespaceIndex);\n                        break;\n                    case IdType.Guid:\n                        nodeId = new NodeId(ReadGuid(\"Id\"), namespaceIndex);\n                        break;\n                    case IdType.Opaque:\n                        nodeId = new NodeId(ReadByteString(\"Id\"), namespaceIndex);\n                        break;\n                }\n                if (NodeId.IsNull(nodeId))\n                {\n                    var id = ReadString(\"Id\");\n                    _stack.Pop();\n                    nodeId = id.ToNodeId(Context);\n                    if (!NodeId.IsNull(nodeId))\n                    {\n                        return nodeId;\n                    }\n                    return NodeId.Parse(id);\n                }\n                _stack.Pop();\n                return nodeId;\n            }\n            if (token.Type == JTokenType.String)\n            {\n                var id = (string?)token;\n                var nodeId = id.ToNodeId(Context);\n                if (!NodeId.IsNull(nodeId))\n                {\n                    return nodeId;\n                }\n                return NodeId.Parse(id);\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public ExpandedNodeId? ReadExpandedNodeId(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (token is JObject o)\n            {\n                _stack.Push(o);\n                // Read non reversable encoding\n                ushort namespaceIndex = 0;\n                string? namespaceUri = null;\n                if (TryGetToken(\"Namespace\", out var namespaceToken))\n                {\n                    switch (namespaceToken.Type)\n                    {\n                        case JTokenType.String:\n                            namespaceUri = ReadString(\"Namespace\");\n                            if (namespaceUri != null)\n                            {\n                                namespaceIndex = Context.NamespaceUris.GetIndexOrAppend(namespaceUri);\n                            }\n                            break;\n                        case JTokenType.Integer:\n                            namespaceIndex = ReadUInt16(\"Namespace\");\n                            break;\n                    }\n                }\n                uint serverIndex = 0;\n                if (TryGetToken(\"ServerUri\", out var serverToken))\n                {\n                    switch (serverToken.Type)\n                    {\n                        case JTokenType.String:\n                            var serverUri = ReadString(\"ServerUri\");\n                            if (serverUri != null)\n                            {\n                                serverIndex = Context.ServerUris.GetIndexOrAppend(serverUri);\n                            }\n                            break;\n                        case JTokenType.Integer:\n                            serverIndex = ReadUInt32(\"ServerUri\");\n                            break;\n                    }\n                }\n                var idType = (IdType)ReadByte(\"IdType\");\n                NodeId? nodeId = null;\n                switch (idType)\n                {\n                    case IdType.Numeric:\n                        nodeId = new NodeId(ReadUInt32(\"Id\"), namespaceIndex);\n                        break;\n                    case IdType.String:\n                        nodeId = new NodeId(ReadString(\"Id\"), namespaceIndex);\n                        break;\n                    case IdType.Guid:\n                        nodeId = new NodeId(ReadGuid(\"Id\"), namespaceIndex);\n                        break;\n                    case IdType.Opaque:\n                        nodeId = new NodeId(ReadByteString(\"Id\"), namespaceIndex);\n                        break;\n                }\n                if (NodeId.IsNull(nodeId))\n                {\n                    var id = ReadString(\"Id\");\n                    _stack.Pop();\n                    var expandedNodeId = id.ToExpandedNodeId(Context);\n                    if (!NodeId.IsNull(expandedNodeId))\n                    {\n                        return expandedNodeId;\n                    }\n                    return ExpandedNodeId.Parse(id);\n                }\n                _stack.Pop();\n                return new ExpandedNodeId(nodeId, namespaceUri, serverIndex);\n            }\n            if (token.Type == JTokenType.String)\n            {\n                var id = (string?)token;\n\n                var nodeId = id.ToExpandedNodeId(Context);\n                if (!NodeId.IsNull(nodeId))\n                {\n                    return nodeId;\n                }\n                return ExpandedNodeId.Parse(id);\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public StatusCode ReadStatusCode(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return 0;\n            }\n            if (token is JObject o)\n            {\n                _stack.Push(o);\n                // Read non reversable encoding\n                var code = new StatusCode(ReadUInt32(\"Code\"));\n                // var status = ReadString(\"Symbol\");\n                _stack.Pop();\n                return code;\n            }\n            return ReadValue<uint>(fieldName);\n        }\n\n        /// <inheritdoc/>\n        public DiagnosticInfo? ReadDiagnosticInfo(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (token is JObject o)\n            {\n                _stack.Push(o);\n                var di = new DiagnosticInfo\n                {\n                    SymbolicId = ReadInt32(\n                        \"SymbolicId\"),\n                    NamespaceUri = ReadInt32(\n                        \"NamespaceUri\"),\n                    Locale = ReadInt32(\n                        \"Locale\"),\n                    LocalizedText = ReadInt32(\n                        \"LocalizedText\"),\n                    AdditionalInfo = ReadString(\n                        \"AdditionalInfo\"),\n                    InnerStatusCode = ReadStatusCode(\n                        \"InnerStatusCode\"),\n                    InnerDiagnosticInfo = ReadDiagnosticInfo(\n                        \"InnerDiagnosticInfo\")\n                };\n                _stack.Pop();\n                return di;\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public QualifiedName? ReadQualifiedName(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (token is JObject o)\n            {\n                _stack.Push(o);\n                try\n                {\n                    var name = ReadString(\"Name\");\n                    if (string.IsNullOrEmpty(name))\n                    {\n                        return null;\n                    }\n                    uint index;\n                    if (TryGetToken(\"Uri\", out var uri))\n                    {\n                        if (uri.Type == JTokenType.Integer)\n                        {\n                            index = (uint)uri;\n                        }\n                        else if (uri.Type == JTokenType.String)\n                        {\n                            // Reversible\n                            index = Context.NamespaceUris\n                                .GetIndexOrAppend((string?)uri);\n                        }\n                        else\n                        {\n                            // Bad uri\n                            return null;\n                        }\n                    }\n                    else\n                    {\n                        index = ReadUInt32(\"Index\");\n                    }\n                    return new QualifiedName(name, (ushort)index);\n                }\n                finally\n                {\n                    _stack.Pop();\n                }\n            }\n            if (token.Type == JTokenType.String)\n            {\n                var id = (string?)token;\n                var qn = id.ToQualifiedName(Context);\n                if (!QualifiedName.IsNull(qn))\n                {\n                    return qn;\n                }\n                return QualifiedName.Parse(id);\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public LocalizedText? ReadLocalizedText(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (token is JObject o)\n            {\n                _stack.Push(o);\n                var text = ReadString(\"Text\");\n                var locale = ReadString(\"Locale\");\n                _stack.Pop();\n                return new LocalizedText(locale, text);\n            }\n            if (token.Type == JTokenType.String)\n            {\n                var text = (string?)token;\n                if (!string.IsNullOrEmpty(text))\n                {\n                    return text.ToLocalizedText();\n                }\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public Variant ReadVariant(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return Variant.Null;\n            }\n            if (token is JObject o)\n            {\n                return TryReadVariant(o, out _);\n            }\n            return ReadVariantFromToken(token);\n        }\n\n        /// <inheritdoc/>\n        public DataValue? ReadDataValue(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (token is JObject o)\n            {\n                if (HasAnyOf(o, \"Value\", \"StatusCode\", \"SourceTimestamp\", \"ServerTimestamp\"))\n                {\n                    _stack.Push(o);\n                    var dv = new DataValue\n                    {\n                        WrappedValue = ReadVariant(\"Value\"),\n                        StatusCode = ReadStatusCode(\"StatusCode\"),\n                        SourceTimestamp = ReadDateTime(\"SourceTimestamp\"),\n                        SourcePicoseconds = ReadUInt16(\"SourcePicoseconds\"),\n                        ServerTimestamp = ReadDateTime(\"ServerTimestamp\"),\n                        ServerPicoseconds = ReadUInt16(\"ServerPicoseconds\")\n                    };\n                    _stack.Pop();\n                    return dv;\n                }\n\n                var objectVariant = TryReadVariant(o, out _);\n                if (objectVariant != Variant.Null)\n                {\n                    return new DataValue(objectVariant);\n                }\n                return null;\n            }\n\n            var tokenVariant = ReadVariantFromToken(token);\n            if (tokenVariant == Variant.Null)\n            {\n                return null;\n            }\n            return new DataValue(tokenVariant);\n        }\n\n        /// <inheritdoc/>\n        public ExtensionObject? ReadExtensionObject(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (token is JObject o && HasAnyOf(o, \"Body\", \"TypeId\"))\n            {\n                _stack.Push(o);\n\n                var typeId = ReadExpandedNodeId(\"TypeId\");\n                var encoding = ReadEncoding(\"Encoding\");\n                var extensionObject = ReadExtensionObjectBody(\"Body\",\n                    encoding, typeId);\n\n                _stack.Pop();\n                return extensionObject;\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public IEncodeable? ReadEncodeable(string? fieldName, Type systemType,\n            ExpandedNodeId? encodeableTypeId = null)\n        {\n            ArgumentNullException.ThrowIfNull(systemType);\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return null;\n            }\n            if (Activator.CreateInstance(systemType) is not IEncodeable value)\n            {\n                return null;\n            }\n            if (token is JObject o)\n            {\n                _stack.Push(o);\n                value.Decode(this);\n                _stack.Pop();\n                return value;\n            }\n            return null; // or value?\n        }\n\n        /// <inheritdoc/>\n        public Enum? ReadEnumerated(string? fieldName, Type enumType)\n        {\n            ArgumentNullException.ThrowIfNull(enumType);\n            if (!enumType.IsEnum)\n            {\n                throw new ArgumentException(\"Not an enum type\", nameof(enumType));\n            }\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return (Enum)Enum.ToObject(enumType, 0); // or null?\n            }\n            if (token.Type == JTokenType.String)\n            {\n                var val = (string?)token;\n                var index = val?.LastIndexOf('_') ?? -1;\n                if (index != -1 && int.TryParse(val![(index + 1)..],\n                    out var numeric))\n                {\n                    return (Enum)Enum.ToObject(enumType, numeric);\n                }\n                if (Enum.TryParse(enumType, val, true, out var o))\n                {\n                    return o as Enum;\n                }\n                return null;\n            }\n            if (token.Type == JTokenType.Integer)\n            {\n                return (Enum)Enum.ToObject(enumType, (int)token);\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public Array? ReadArray(string? fieldName, int valueRank, BuiltInType builtInType,\n            Type? systemType, ExpandedNodeId? encodeableTypeId)\n        {\n            if (valueRank == ValueRanks.OneDimension)\n            {\n                switch (builtInType)\n                {\n                    case BuiltInType.Boolean:\n                        return ReadBooleanArray(fieldName).ToArray();\n                    case BuiltInType.SByte:\n                        return ReadSByteArray(fieldName).ToArray();\n                    case BuiltInType.Byte:\n                        return ReadByteArray(fieldName).ToArray();\n                    case BuiltInType.Int16:\n                        return ReadInt16Array(fieldName).ToArray();\n                    case BuiltInType.UInt16:\n                        return ReadUInt16Array(fieldName).ToArray();\n                    case BuiltInType.Int32:\n                        return ReadInt32Array(fieldName).ToArray();\n                    case BuiltInType.UInt32:\n                        return ReadUInt32Array(fieldName).ToArray();\n                    case BuiltInType.Int64:\n                        return ReadInt64Array(fieldName).ToArray();\n                    case BuiltInType.UInt64:\n                        return ReadUInt64Array(fieldName).ToArray();\n                    case BuiltInType.Float:\n                        return ReadFloatArray(fieldName).ToArray();\n                    case BuiltInType.Double:\n                        return ReadDoubleArray(fieldName).ToArray();\n                    case BuiltInType.String:\n                        return ReadStringArray(fieldName).ToArray();\n                    case BuiltInType.DateTime:\n                        return ReadDateTimeArray(fieldName).ToArray();\n                    case BuiltInType.Guid:\n                        return ReadGuidArray(fieldName).ToArray();\n                    case BuiltInType.ByteString:\n                        return ReadByteStringArray(fieldName).ToArray();\n                    case BuiltInType.XmlElement:\n                        return ReadXmlElementArray(fieldName).ToArray();\n                    case BuiltInType.NodeId:\n                        return ReadNodeIdArray(fieldName).ToArray();\n                    case BuiltInType.ExpandedNodeId:\n                        return ReadExpandedNodeIdArray(fieldName).ToArray();\n                    case BuiltInType.StatusCode:\n                        return ReadStatusCodeArray(fieldName).ToArray();\n                    case BuiltInType.QualifiedName:\n                        return ReadQualifiedNameArray(fieldName).ToArray();\n                    case BuiltInType.LocalizedText:\n                        return ReadLocalizedTextArray(fieldName).ToArray();\n                    case BuiltInType.DataValue:\n                        return ReadDataValueArray(fieldName).ToArray();\n                    case BuiltInType.Enumeration:\n                        return ReadInt32Array(fieldName).ToArray();\n                    case BuiltInType.Variant:\n                        return ReadVariantArray(fieldName).ToArray();\n                    case BuiltInType.ExtensionObject:\n                        return ReadExtensionObjectArray(fieldName).ToArray();\n                    case BuiltInType.DiagnosticInfo:\n                        return ReadDiagnosticInfoArray(fieldName).ToArray();\n                    case BuiltInType.Null:\n                        ArgumentNullException.ThrowIfNull(systemType);\n                        return ReadEncodeableArray(fieldName, systemType);\n                    default:\n                        throw new DecodingException(\n                            $\"Cannot decode unknown type in Array object with BuiltInType: {builtInType}.\");\n                }\n            }\n            else if (valueRank > ValueRanks.OneDimension)\n            {\n                if (!ReadArrayField(fieldName, out var array))\n                {\n                    return null;\n                }\n                var elements = new List<object>();\n                var dimensions = new List<int>();\n                ReadMatrixPart(fieldName, array, builtInType, ref elements, ref dimensions, 0);\n\n                switch (builtInType)\n                {\n                    case BuiltInType.Boolean:\n                        return new Matrix(elements.Cast<bool>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.SByte:\n                        return new Matrix(elements.Cast<sbyte>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Byte:\n                        return new Matrix(elements.Cast<byte>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Int16:\n                        return new Matrix(elements.Cast<short>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.UInt16:\n                        return new Matrix(elements.Cast<ushort>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Int32:\n                        return new Matrix(elements.Cast<int>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.UInt32:\n                        return new Matrix(elements.Cast<uint>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Int64:\n                        return new Matrix(elements.Cast<long>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.UInt64:\n                        return new Matrix(elements.Cast<ulong>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Float:\n                        return new Matrix(elements.Cast<float>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Double:\n                        return new Matrix(elements.Cast<double>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.String:\n                        return new Matrix(elements.Cast<string>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.DateTime:\n                        return new Matrix(elements.Cast<DateTime>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Guid:\n                        return new Matrix(elements.Cast<Uuid>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.ByteString:\n                        return new Matrix(elements.Cast<byte[]>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.XmlElement:\n                        return new Matrix(elements.Cast<XmlElement>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.NodeId:\n                        return new Matrix(elements.Cast<NodeId>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.ExpandedNodeId:\n                        return new Matrix(elements.Cast<ExpandedNodeId>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.StatusCode:\n                        return new Matrix(elements.Cast<StatusCode>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.QualifiedName:\n                        return new Matrix(elements.Cast<QualifiedName>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.LocalizedText:\n                        return new Matrix(elements.Cast<LocalizedText>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.DataValue:\n                        return new Matrix(elements.Cast<DataValue>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Enumeration:\n                        return new Matrix(elements.Cast<int>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.Variant:\n                        return new Matrix(elements.Cast<Variant>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.ExtensionObject:\n                        return new Matrix(elements.Cast<ExtensionObject>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                    case BuiltInType.DiagnosticInfo:\n                        return new Matrix(elements.Cast<DiagnosticInfo>().ToArray(), builtInType, [.. dimensions]).ToArray();\n                }\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public BooleanCollection ReadBooleanArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadBoolean(null));\n        }\n\n        /// <inheritdoc/>\n        public Int16Collection ReadInt16Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadInt16(null));\n        }\n\n        /// <inheritdoc/>\n        public UInt16Collection ReadUInt16Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadUInt16(null));\n        }\n\n        /// <inheritdoc/>\n        public Int32Collection ReadInt32Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadInt32(null));\n        }\n\n        /// <inheritdoc/>\n        public UInt32Collection ReadUInt32Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadUInt32(null));\n        }\n\n        /// <inheritdoc/>\n        public Int64Collection ReadInt64Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadInt64(null));\n        }\n\n        /// <inheritdoc/>\n        public UInt64Collection ReadUInt64Array(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadUInt64(null));\n        }\n\n        /// <inheritdoc/>\n        public FloatCollection ReadFloatArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadFloat(null));\n        }\n\n        /// <inheritdoc/>\n        public DoubleCollection ReadDoubleArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadDouble(null));\n        }\n\n        /// <inheritdoc/>\n        public StringCollection ReadStringArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadString(null));\n        }\n\n        /// <inheritdoc/>\n        public IReadOnlyList<(string, string?)>? ReadStringDictionary(string? property)\n        {\n            return ReadDictionary(property, () => ReadString(null));\n        }\n\n        /// <inheritdoc/>\n        public DateTimeCollection ReadDateTimeArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadDateTime(null));\n        }\n\n        /// <inheritdoc/>\n        public UuidCollection ReadGuidArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadGuid(null));\n        }\n\n        /// <inheritdoc/>\n        public ByteStringCollection ReadByteStringArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadByteString(null));\n        }\n\n        /// <inheritdoc/>\n        public XmlElementCollection ReadXmlElementArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadXmlElement(null));\n        }\n\n        /// <inheritdoc/>\n        public NodeIdCollection ReadNodeIdArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadNodeId(null));\n        }\n\n        /// <inheritdoc/>\n        public ExpandedNodeIdCollection ReadExpandedNodeIdArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadExpandedNodeId(null));\n        }\n\n        /// <inheritdoc/>\n        public StatusCodeCollection ReadStatusCodeArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadStatusCode(null));\n        }\n\n        /// <inheritdoc/>\n        public DiagnosticInfoCollection ReadDiagnosticInfoArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadDiagnosticInfo(null));\n        }\n\n        /// <inheritdoc/>\n        public QualifiedNameCollection ReadQualifiedNameArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadQualifiedName(null));\n        }\n\n        /// <inheritdoc/>\n        public LocalizedTextCollection ReadLocalizedTextArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadLocalizedText(null));\n        }\n\n        /// <inheritdoc/>\n        public VariantCollection ReadVariantArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadVariant(null));\n        }\n\n        /// <inheritdoc/>\n        public DataValueCollection ReadDataValueArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadDataValue(null));\n        }\n\n        /// <inheritdoc/>\n        public DataSet? ReadDataSet(string? property)\n        {\n            DataSetFieldContentFlags fieldMask = 0u;\n            var couldBeRawData = false;\n            var dictionary = ReadDictionary(property, () =>\n            {\n                if (TryGetToken(property, out var token))\n                {\n                    if (token is JObject o)\n                    {\n                        if (HasAnyOf(o, \"StatusCode\"))\n                        {\n                            fieldMask |= DataSetFieldContentFlags.StatusCode;\n                        }\n                        if (HasAnyOf(o, \"SourceTimestamp\"))\n                        {\n                            fieldMask |= DataSetFieldContentFlags.SourceTimestamp;\n                        }\n                        if (HasAnyOf(o, \"ServerTimestamp\"))\n                        {\n                            fieldMask |= DataSetFieldContentFlags.ServerTimestamp;\n                        }\n                        if (HasAnyOf(o, \"SourcePicoseconds\"))\n                        {\n                            fieldMask |= DataSetFieldContentFlags.SourcePicoSeconds;\n                        }\n                        if (HasAnyOf(o, \"ServerPicoseconds\"))\n                        {\n                            fieldMask |= DataSetFieldContentFlags.ServerPicoSeconds;\n                        }\n                    }\n                    else if (token is JValue)\n                    {\n                        // Could be raw data\n                        couldBeRawData = true;\n                    }\n                }\n                return ReadDataValue(null);\n            });\n            fieldMask = ((uint)fieldMask != 0 || !couldBeRawData) ? fieldMask :\n                DataSetFieldContentFlags.RawData;\n            return dictionary == null ? null : new DataSet(dictionary, fieldMask);\n        }\n\n        /// <inheritdoc/>\n        public ExtensionObjectCollection ReadExtensionObjectArray(string? fieldName)\n        {\n            return ReadArray(fieldName, () => ReadExtensionObject(null));\n        }\n\n        /// <inheritdoc/>\n        public ByteCollection ReadByteArray(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return [];\n            }\n            if (token.Type is JTokenType.Bytes or\n                JTokenType.String)\n            {\n                var s = (string?)token;\n                if (s == null)\n                {\n                    return [];\n                }\n                return Convert.FromBase64String(s);\n            }\n            if (token is JArray a)\n            {\n                return a.Select(t => ReadToken(t,\n                    () => ReadByte(null))).ToArray();\n            }\n            return [\n                ReadToken(token, () => ReadByte(null))\n            ];\n        }\n\n        /// <inheritdoc/>\n        public SByteCollection ReadSByteArray(string? fieldName)\n        {\n            if (!TryGetToken(fieldName, out var token))\n            {\n                return [];\n            }\n            if (token.Type is JTokenType.Bytes or\n                JTokenType.String)\n            {\n                var s = (string?)token;\n                if (s == null)\n                {\n                    return [];\n                }\n                return Convert.FromBase64String(s)\n                    .Select(b => (sbyte)b).ToArray();\n            }\n            if (token is JArray a)\n            {\n                return a.Select(t => ReadToken(t,\n                    () => ReadSByte(null))).ToArray();\n            }\n            return [\n                ReadToken(token, () => ReadSByte(null))\n            ];\n        }\n\n        /// <inheritdoc/>\n        public Array ReadEncodeableArray(string? fieldName, Type systemType,\n            ExpandedNodeId? encodeableTypeId = null)\n        {\n            var values = ReadArray(fieldName, () => ReadEncodeable(\n                null, systemType, encodeableTypeId))?\n                .ToList();\n            if (values == null)\n            {\n                return Array.CreateInstance(systemType, 0);\n            }\n            var array = Array.CreateInstance(systemType, values.Count);\n            values.CopyTo((IEncodeable[])array);\n            return array;\n        }\n\n        /// <inheritdoc/>\n        public Array? ReadEnumeratedArray(string? fieldName, Type enumType)\n        {\n            var values = ReadArray(fieldName, () => ReadEnumerated(null, enumType))?\n                .ToList();\n            if (values == null)\n            {\n                return null;\n            }\n            var array = Array.CreateInstance(enumType, values.Count);\n            values.CopyTo((Enum[])array);\n            return array;\n        }\n\n        /// <summary>\n        /// Read integers\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public VariantCollection ReadIntegerArray(string? property)\n        {\n            return ReadArray(property, () => ReadInteger(null));\n        }\n\n        /// <summary>\n        /// Read integer variant value\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public Variant ReadInteger(string? property)\n        {\n            if (!TryGetToken(property, out var token))\n            {\n                return Variant.Null;\n            }\n            Variant number;\n            if (token is JObject o)\n            {\n                number = TryReadVariant(o, out _);\n            }\n            else\n            {\n                number = ReadVariantFromToken(token, false);\n            }\n            var builtInType = number.TypeInfo.BuiltInType;\n            if (builtInType is (>= BuiltInType.SByte and <= BuiltInType.UInt64)\n                or BuiltInType.Integer)\n            {\n                return number;\n            }\n\n            return Variant.Null;\n        }\n\n        /// <summary>\n        /// Read unsigned integers\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public VariantCollection ReadUIntegerArray(string? property)\n        {\n            return ReadArray(property, () => ReadUInteger(null));\n        }\n\n        /// <summary>\n        /// Read unsigned integer variant value\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public Variant ReadUInteger(string? property)\n        {\n            if (!TryGetToken(property, out var token))\n            {\n                return Variant.Null;\n            }\n            Variant number;\n            if (token is JObject o)\n            {\n                number = TryReadVariant(o, out _);\n            }\n            else\n            {\n                number = ReadVariantFromToken(token, true);\n            }\n            var builtInType = number.TypeInfo.BuiltInType;\n            if (builtInType is (>= BuiltInType.Byte and <= BuiltInType.UInt64)\n                or BuiltInType.UInteger)\n            {\n                return number;\n            }\n\n            return Variant.Null;\n        }\n\n        /// <summary>\n        /// Read numeric values\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public VariantCollection ReadNumberArray(string? property)\n        {\n            return ReadArray(property, () => ReadNumber(null));\n        }\n\n        /// <summary>\n        /// Read numeric variant value\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public Variant ReadNumber(string? property)\n        {\n            if (!TryGetToken(property, out var token))\n            {\n                return Variant.Null;\n            }\n            Variant number;\n            if (token is JObject o)\n            {\n                number = TryReadVariant(o, out _);\n            }\n            else\n            {\n                number = ReadVariantFromToken(token);\n            }\n            if (TypeInfo.IsNumericType(number.TypeInfo.BuiltInType))\n            {\n                return number;\n            }\n\n            return Variant.Null;\n        }\n\n        /// <summary>\n        /// Read extension object body\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"typeId\"></param>\n        /// <returns></returns>\n        private ExtensionObject? ReadExtensionObjectBody(string? property,\n            ExtensionObjectEncoding encoding, ExpandedNodeId? typeId)\n        {\n            if (!TryGetToken(property, out var body))\n            {\n                return null;\n            }\n            var systemType = Context.Factory.GetSystemType(typeId) ??\n                TypeInfo.GetSystemType(typeId.ToNodeId(Context.NamespaceUris),\n                    Context.Factory);\n\n            if (body.Type == JTokenType.String && encoding != ExtensionObjectEncoding.Xml)\n            {\n                // Assume binary\n                encoding = ExtensionObjectEncoding.Binary;\n            }\n\n            switch (encoding)\n            {\n                case ExtensionObjectEncoding.Binary:\n                    var bytes = ReadByteString(property);\n                    if (bytes != null && systemType != null)\n                    {\n                        using var decoder = new BinaryDecoder(bytes, Context);\n                        var encodeable = decoder.ReadEncodeable(null, systemType);\n                        if (encodeable != null)\n                        {\n                            return new ExtensionObject(encodeable.TypeId, encodeable);\n                        }\n                    }\n                    //\n                    // Unknown type, or empty then return raw bytes. We return the\n                    // data type encoding as type id, we dont know otherwise\n                    //\n                    return new ExtensionObject(NodeId.IsNull(typeId) ?\n                        DataTypeIds.ByteString : typeId, bytes);\n                case ExtensionObjectEncoding.Xml:\n                    var encoded = ReadByteString(property);\n                    XmlElement? element = null;\n                    if (encoded != null)\n                    {\n                        var xml = Encoding.UTF8.GetString(encoded);\n                        if (xml != null)\n                        {\n                            if (systemType != null)\n                            {\n                                using var stringReader = new StringReader(xml);\n                                using var reader = XmlReader.Create(stringReader);\n                                using var decoder = new XmlDecoder(systemType, reader, Context);\n                                var encodeable = decoder.ReadEncodeable(null, systemType);\n                                if (encodeable != null)\n                                {\n                                    return new ExtensionObject(encodeable.TypeId, encodeable);\n                                }\n                            }\n                            //\n                            // Unknown type, return as xmlelement\n                            //\n\n                            var doc = new XmlDocument();\n                            doc.LoadXml(xml);\n                            element = doc.DocumentElement;\n                        }\n                    }\n                    //\n                    // Unknown type, or empty then return the xml elemtn. We return the\n                    // data type encoding as type id, we dont know otherwise\n                    //\n                    return new ExtensionObject(NodeId.IsNull(typeId) ?\n                        DataTypeIds.XmlElement : typeId, element);\n                default:\n                    if (systemType != null)\n                    {\n                        var encodeable = ReadEncodeable(property, systemType);\n                        if (encodeable != null)\n                        {\n                            return new ExtensionObject(encodeable.TypeId, encodeable);\n                        }\n                    }\n                    //\n                    // Return json token, update once stack supports json extension objects.\n                    //\n                    var wrapper = new EncodeableJToken(body, typeId ?? ExpandedNodeId.Null);\n                    return new ExtensionObject(wrapper.TypeId, wrapper);\n            }\n        }\n\n        /// <summary>\n        /// Convert a token to variant\n        /// </summary>\n        /// <param name=\"token\"></param>\n        /// <param name=\"unsigned\"></param>\n        /// <returns></returns>\n        private Variant ReadVariantFromToken(JToken token, bool unsigned = false)\n        {\n            try\n            {\n                switch (token.Type)\n                {\n                    case JTokenType.Integer:\n                        try\n                        {\n                            return !unsigned ? new Variant((long)token) :\n                                new Variant((ulong)token);\n                        }\n                        catch (OverflowException)\n                        {\n                            return new Variant((ulong)token);\n                        }\n                    case JTokenType.Boolean:\n                        return new Variant((bool)token);\n                    case JTokenType.Bytes:\n                        return new Variant((byte[]?)token);\n                    case JTokenType.Date:\n                        return new Variant((DateTime)token);\n                    case JTokenType.TimeSpan:\n                        return new Variant(((TimeSpan)token).TotalMilliseconds);\n                    case JTokenType.Float:\n                        return new Variant((double)token);\n                    case JTokenType.Guid:\n                        return new Variant((Guid)token);\n                    case JTokenType.String:\n                        return new Variant((string?)token);\n                    case JTokenType.Object:\n                        var variant = TryReadVariant((JObject)token, out var found);\n                        if (found)\n                        {\n                            return variant;\n                        }\n                        try\n                        {\n                            return new Variant(token.ToObject<XmlElement>());\n                        }\n                        catch\n                        {\n                            // TODO: Try to read other structures\n                            // ...\n                            //\n                            return Variant.Null; // Give up\n                        }\n                    case JTokenType.Array:\n                        return ReadVariantFromArray((JArray)token);\n                    default:\n                        // TODO Log or throw for bad type\n                        return Variant.Null;\n                }\n            }\n            catch\n            {\n                return Variant.Null; // Give up\n            }\n        }\n\n        /// <summary>\n        /// Read variant from token\n        /// </summary>\n        /// <param name=\"array\"></param>\n        /// <param name=\"unsigned\">Force integers to be unsigned</param>\n        /// <returns></returns>\n        private Variant ReadVariantFromArray(JArray array, bool unsigned = false)\n        {\n            if (array.Count == 0)\n            {\n                return Variant.Null; // Give up\n            }\n\n            // Try to decode non reversible encoding first.\n            var dimensions = GetDimensions(array, out var type);\n            if (dimensions.Length > 1)\n            {\n                var builtInType = BuiltInType.Variant;\n                switch (type)\n                {\n                    case JTokenType.Integer:\n                        builtInType = BuiltInType.Int64;\n                        break;\n                    case JTokenType.Boolean:\n                        builtInType = BuiltInType.Boolean;\n                        break;\n                    case JTokenType.Bytes:\n                        builtInType = BuiltInType.ByteString;\n                        break;\n                    case JTokenType.Date:\n                    case JTokenType.TimeSpan:\n                        builtInType = BuiltInType.DateTime;\n                        break;\n                    case JTokenType.Float:\n                        builtInType = BuiltInType.Double;\n                        break;\n                    case JTokenType.Guid:\n                        builtInType = BuiltInType.Guid;\n                        break;\n                    case JTokenType.String:\n                        builtInType = BuiltInType.String;\n                        break;\n                }\n                return ReadVariantMatrixBody(array, dimensions, builtInType);\n            }\n\n            if (type != JTokenType.Object && array.All(j => j.Type == type))\n            {\n                try\n                {\n                    switch (array[0].Type)\n                    {\n                        case JTokenType.Integer:\n                            return !unsigned ? new Variant(array\n                                .Select(t => (long)t)\n                                .ToArray()) : new Variant(array\n                                .Select(t => (ulong)t)\n                                .ToArray());\n                        case JTokenType.Boolean:\n                            return new Variant(array\n                                .Select(t => (bool)t)\n                                .ToArray());\n                        case JTokenType.Bytes:\n                            return new Variant(array\n                                .Select(t => (byte[]?)t)\n                                .ToArray());\n                        case JTokenType.Date:\n                            return new Variant(array\n                                .Select(t => (DateTime)t)\n                                .ToArray());\n                        case JTokenType.TimeSpan:\n                            return new Variant(array\n                                .Select(t => ((TimeSpan)t).TotalMilliseconds)\n                                .ToArray());\n                        case JTokenType.Float:\n                            return new Variant(array\n                                .Select(t => (double)t)\n                                .ToArray());\n                        case JTokenType.Guid:\n                            return new Variant(array\n                                .Select(t => (Guid)t)\n                                .ToArray());\n                        case JTokenType.String:\n                            return new Variant(array\n                                .Select(t => (string?)t)\n                                .ToArray());\n                    }\n                }\n                catch\n                {\n                    // TODO Log or throw for bad type\n                    return Variant.Null; // Give up\n                }\n            }\n            var result = array\n                .Select(t => ReadVariantFromToken(t, unsigned))\n                .ToArray();\n            var validBuiltInType = Array.Find(result, v => v.TypeInfo?.BuiltInType != null).TypeInfo?.BuiltInType;\n            if (validBuiltInType == null)\n            {\n                return Variant.Null;\n            }\n            if (result\n                .Where(v => v != Variant.Null)\n                .All(v => v.TypeInfo.BuiltInType == validBuiltInType))\n            {\n                // TODO: This needs tests as it should not work.\n                return new Variant(result.Select(v => v.Value).ToArray());\n            }\n            return new Variant(result);\n        }\n\n        /// <summary>\n        /// Read variant\n        /// </summary>\n        /// <param name=\"o\"></param>\n        /// <param name=\"success\"></param>\n        /// <returns></returns>\n        private Variant TryReadVariant(JObject o, out bool success)\n        {\n            Variant variant;\n            _stack.Push(o);\n            if (TryReadBuiltInType(\"Type\", out var type))\n            {\n                variant = ReadVariantBody(\"Body\", type);\n                success = true;\n            }\n            else if (TryReadBuiltInType(\"DataType\", out type))\n            {\n                variant = ReadVariantBody(\"Value\", type);\n                success = true;\n            }\n            else\n            {\n                variant = Variant.Null;\n                success = false;\n            }\n            _stack.Pop();\n            return variant;\n        }\n\n        /// <summary>\n        /// Read variant body\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        private Variant ReadVariantBody(string? property, BuiltInType type)\n        {\n            if (!TryGetToken(property, out var token))\n            {\n                return Variant.Null;\n            }\n            if (token is JArray jarray)\n            {\n                // Check array dimensions\n                var dimensions = GetDimensions(jarray, out _);\n                if (dimensions.Length > 1)\n                {\n                    return ReadVariantMatrixBody(jarray, dimensions, type);\n                }\n                // Read body as array\n                return ReadVariantArrayBody(property, type);\n            }\n\n            if ((token.Type == JTokenType.Bytes || token.Type == JTokenType.String) &&\n                (type == BuiltInType.Byte || type == BuiltInType.SByte))\n            {\n                // Read body as array\n                return ReadVariantArrayBody(property, type);\n            }\n\n            switch (type)\n            {\n                case BuiltInType.Boolean:\n                    return new Variant(ReadBoolean(property),\n                        TypeInfo.Scalars.Boolean);\n                case BuiltInType.SByte:\n                    return new Variant(ReadSByte(property),\n                        TypeInfo.Scalars.SByte);\n                case BuiltInType.Byte:\n                    return new Variant(ReadByte(property),\n                        TypeInfo.Scalars.Byte);\n                case BuiltInType.Int16:\n                    return new Variant(ReadInt16(property),\n                        TypeInfo.Scalars.Int16);\n                case BuiltInType.UInt16:\n                    return new Variant(ReadUInt16(property),\n                        TypeInfo.Scalars.UInt16);\n                case BuiltInType.Enumeration:\n                case BuiltInType.Int32:\n                    return new Variant(ReadInt32(property),\n                        TypeInfo.Scalars.Int32);\n                case BuiltInType.UInt32:\n                    return new Variant(ReadUInt32(property),\n                        TypeInfo.Scalars.UInt32);\n                case BuiltInType.Int64:\n                    return new Variant(ReadInt64(property),\n                        TypeInfo.Scalars.Int64);\n                case BuiltInType.UInt64:\n                    return new Variant(ReadUInt64(property),\n                        TypeInfo.Scalars.UInt64);\n                case BuiltInType.Float:\n                    return new Variant(ReadFloat(property),\n                        TypeInfo.Scalars.Float);\n                case BuiltInType.Double:\n                    return new Variant(ReadDouble(property),\n                        TypeInfo.Scalars.Double);\n                case BuiltInType.String:\n                    return new Variant(ReadString(property),\n                        TypeInfo.Scalars.String);\n                case BuiltInType.ByteString:\n                    return new Variant(ReadByteString(property),\n                        TypeInfo.Scalars.ByteString);\n                case BuiltInType.DateTime:\n                    return new Variant(ReadDateTime(property),\n                        TypeInfo.Scalars.DateTime);\n                case BuiltInType.Guid:\n                    return new Variant(ReadGuid(property),\n                        TypeInfo.Scalars.Guid);\n                case BuiltInType.NodeId:\n                    return new Variant(ReadNodeId(property),\n                        TypeInfo.Scalars.NodeId);\n                case BuiltInType.ExpandedNodeId:\n                    return new Variant(ReadExpandedNodeId(property),\n                        TypeInfo.Scalars.ExpandedNodeId);\n                case BuiltInType.QualifiedName:\n                    return new Variant(ReadQualifiedName(property),\n                        TypeInfo.Scalars.QualifiedName);\n                case BuiltInType.LocalizedText:\n                    return new Variant(ReadLocalizedText(property),\n                        TypeInfo.Scalars.LocalizedText);\n                case BuiltInType.StatusCode:\n                    return new Variant(ReadStatusCode(property),\n                        TypeInfo.Scalars.StatusCode);\n                case BuiltInType.XmlElement:\n                    return new Variant(ReadXmlElement(property),\n                        TypeInfo.Scalars.XmlElement);\n                case BuiltInType.ExtensionObject:\n                    return new Variant(ReadExtensionObject(property),\n                        TypeInfo.Scalars.ExtensionObject);\n                case BuiltInType.Number:\n                case BuiltInType.UInteger:\n                case BuiltInType.Integer:\n                case BuiltInType.Variant:\n                    return ReadVariant(property);\n                default:\n                    return Variant.Null;\n            }\n        }\n\n        /// <summary>\n        /// Read variant matrix\n        /// </summary>\n        /// <param name=\"array\"></param>\n        /// <param name=\"dimensions\"></param>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private Variant ReadVariantMatrixBody(JArray array, int[] dimensions,\n            BuiltInType type)\n        {\n            var length = 1;\n            foreach (var dim in dimensions)\n            {\n                length *= dim;\n            }\n            var flatArray = TypeInfo.CreateArray(type, length);\n            var index = 0;\n            CopyToMatrixFlatArray(array, flatArray, ref index, type);\n            if (index < length)\n            {\n                throw new DecodingException(\n                    \"Read matrix is smaller than array dimensions.\");\n            }\n            return new Variant(new Matrix(flatArray, type, dimensions));\n        }\n\n        /// <summary>\n        /// Copy from array to flat matrix array\n        /// </summary>\n        /// <param name=\"array\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"type\"></param>\n        /// <exception cref=\"DecodingException\"></exception>\n        private void CopyToMatrixFlatArray(JArray array, Array target, ref int index,\n            BuiltInType type)\n        {\n            foreach (var item in array)\n            {\n                if (item is JArray next)\n                {\n                    // Recurse into inner array until we hit individual items\n                    CopyToMatrixFlatArray(next, target, ref index, type);\n                }\n                else if (index < target.GetLength(0))\n                {\n                    // Read item at top of stack\n                    _stack.Push(item);\n                    switch (type)\n                    {\n                        case BuiltInType.Boolean:\n                            target.SetValue(ReadBoolean(null), index++);\n                            break;\n                        case BuiltInType.SByte:\n                            target.SetValue(ReadSByte(null), index++);\n                            break;\n                        case BuiltInType.Byte:\n                            target.SetValue(ReadByte(null), index++);\n                            break;\n                        case BuiltInType.Int16:\n                            target.SetValue(ReadInt16(null), index++);\n                            break;\n                        case BuiltInType.UInt16:\n                            target.SetValue(ReadUInt16(null), index++);\n                            break;\n                        case BuiltInType.Enumeration:\n                        case BuiltInType.Int32:\n                            target.SetValue(ReadInt32(null), index++);\n                            break;\n                        case BuiltInType.UInt32:\n                            target.SetValue(ReadUInt32(null), index++);\n                            break;\n                        case BuiltInType.Int64:\n                            target.SetValue(ReadInt64(null), index++);\n                            break;\n                        case BuiltInType.UInt64:\n                            target.SetValue(ReadUInt64(null), index++);\n                            break;\n                        case BuiltInType.Float:\n                            target.SetValue(ReadFloat(null), index++);\n                            break;\n                        case BuiltInType.Double:\n                            target.SetValue(ReadDouble(null), index++);\n                            break;\n                        case BuiltInType.String:\n                            target.SetValue(ReadString(null), index++);\n                            break;\n                        case BuiltInType.ByteString:\n                            target.SetValue(ReadByteString(null), index++);\n                            break;\n                        case BuiltInType.DateTime:\n                            target.SetValue(ReadDateTime(null), index++);\n                            break;\n                        case BuiltInType.Guid:\n                            target.SetValue(ReadGuid(null), index++);\n                            break;\n                        case BuiltInType.NodeId:\n                            target.SetValue(ReadNodeId(null), index++);\n                            break;\n                        case BuiltInType.ExpandedNodeId:\n                            target.SetValue(ReadExpandedNodeId(null), index++);\n                            break;\n                        case BuiltInType.QualifiedName:\n                            target.SetValue(ReadQualifiedName(null), index++);\n                            break;\n                        case BuiltInType.LocalizedText:\n                            target.SetValue(ReadLocalizedText(null), index++);\n                            break;\n                        case BuiltInType.StatusCode:\n                            target.SetValue(ReadStatusCode(null), index++);\n                            break;\n                        case BuiltInType.XmlElement:\n                            target.SetValue(ReadXmlElement(null), index++);\n                            break;\n                        case BuiltInType.ExtensionObject:\n                            target.SetValue(ReadExtensionObject(null), index++);\n                            break;\n                        case BuiltInType.UInteger:\n                            target.SetValue(ReadUInteger(null), index++);\n                            break;\n                        case BuiltInType.Integer:\n                            target.SetValue(ReadInteger(null), index++);\n                            break;\n                        case BuiltInType.Number:\n                            target.SetValue(ReadNumber(null), index++);\n                            break;\n                        case BuiltInType.Variant:\n                            target.SetValue(ReadVariant(null), index++);\n                            break;\n                        default:\n                            target.SetValue(null, index++);\n                            break;\n                    }\n                    _stack.Pop();\n                }\n                else\n                {\n                    throw new DecodingException(\n                        \"Read matrix is larger than array dimensions.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Read variant array\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        private Variant ReadVariantArrayBody(string? property, BuiltInType type)\n        {\n            switch (type)\n            {\n                case BuiltInType.Boolean:\n                    return new Variant(ReadBooleanArray(property),\n                        TypeInfo.Arrays.Boolean);\n                case BuiltInType.SByte:\n                    return new Variant(ReadSByteArray(property),\n                        TypeInfo.Arrays.SByte);\n                case BuiltInType.Byte:\n                    return new Variant(ReadByteArray(property),\n                        TypeInfo.Arrays.Byte);\n                case BuiltInType.Int16:\n                    return new Variant(ReadInt16Array(property),\n                        TypeInfo.Arrays.Int16);\n                case BuiltInType.UInt16:\n                    return new Variant(ReadUInt16Array(property),\n                        TypeInfo.Arrays.UInt16);\n                case BuiltInType.Enumeration:\n                case BuiltInType.Int32:\n                    return new Variant(ReadInt32Array(property),\n                        TypeInfo.Arrays.Int32);\n                case BuiltInType.UInt32:\n                    return new Variant(ReadUInt32Array(property),\n                        TypeInfo.Arrays.UInt32);\n                case BuiltInType.Int64:\n                    return new Variant(ReadInt64Array(property),\n                        TypeInfo.Arrays.Int64);\n                case BuiltInType.UInt64:\n                    return new Variant(ReadUInt64Array(property),\n                        TypeInfo.Arrays.UInt64);\n                case BuiltInType.Float:\n                    return new Variant(ReadFloatArray(property),\n                        TypeInfo.Arrays.Float);\n                case BuiltInType.Double:\n                    return new Variant(ReadDoubleArray(property),\n                        TypeInfo.Arrays.Double);\n                case BuiltInType.String:\n                    return new Variant(ReadStringArray(property),\n                        TypeInfo.Arrays.String);\n                case BuiltInType.ByteString:\n                    return new Variant(ReadByteStringArray(property),\n                        TypeInfo.Arrays.ByteString);\n                case BuiltInType.DateTime:\n                    return new Variant(ReadDateTimeArray(property),\n                        TypeInfo.Arrays.DateTime);\n                case BuiltInType.Guid:\n                    return new Variant(ReadGuidArray(property),\n                        TypeInfo.Arrays.Guid);\n                case BuiltInType.NodeId:\n                    return new Variant(ReadNodeIdArray(property),\n                        TypeInfo.Arrays.NodeId);\n                case BuiltInType.ExpandedNodeId:\n                    return new Variant(ReadExpandedNodeIdArray(property),\n                        TypeInfo.Arrays.ExpandedNodeId);\n                case BuiltInType.QualifiedName:\n                    return new Variant(ReadQualifiedNameArray(property),\n                        TypeInfo.Arrays.QualifiedName);\n                case BuiltInType.LocalizedText:\n                    return new Variant(ReadLocalizedTextArray(property),\n                        TypeInfo.Arrays.LocalizedText);\n                case BuiltInType.StatusCode:\n                    return new Variant(ReadStatusCodeArray(property),\n                        TypeInfo.Arrays.StatusCode);\n                case BuiltInType.XmlElement:\n                    return new Variant(ReadXmlElementArray(property),\n                        TypeInfo.Arrays.XmlElement);\n                case BuiltInType.ExtensionObject:\n                    return new Variant(ReadExtensionObjectArray(property),\n                        TypeInfo.Arrays.ExtensionObject);\n                case BuiltInType.UInteger:\n                    return new Variant(ReadUIntegerArray(property),\n                        TypeInfo.Arrays.Variant);\n                case BuiltInType.Integer:\n                    return new Variant(ReadIntegerArray(property),\n                        TypeInfo.Arrays.Variant);\n                case BuiltInType.Number:\n                    return new Variant(ReadNumberArray(property),\n                        TypeInfo.Arrays.Variant);\n                case BuiltInType.Variant:\n                    return new Variant(ReadVariantArray(property),\n                        TypeInfo.Arrays.Variant);\n                default:\n                    return Variant.Null;\n            }\n        }\n\n        /// <summary>\n        /// Read value with check\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        private T? ReadValue<T>(string? property)\n        {\n            if (!TryGetToken(property, out var token))\n            {\n                return default;\n            }\n            try\n            {\n                return token.ToObject<T>();\n            }\n            catch\n            {\n                return default;\n            }\n        }\n\n        /// <summary>\n        /// Read built in type value\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        private bool TryReadBuiltInType(string? property, out BuiltInType type)\n        {\n            type = BuiltInType.Null;\n            if (!TryGetToken(property, out var token))\n            {\n                return false;\n            }\n            if (token.Type == JTokenType.String)\n            {\n                return Enum.TryParse((string?)token, true, out type);\n            }\n            try\n            {\n                type = (BuiltInType)token.ToObject<byte>();\n                return true;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Read encoding value\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        private ExtensionObjectEncoding ReadEncoding(string? property)\n        {\n            if (!TryGetToken(property, out var token))\n            {\n                return ExtensionObjectEncoding.None;\n            }\n            if (token.Type == JTokenType.String &&\n                Enum.TryParse<ExtensionObjectEncoding>((string?)token,\n                    true, out var encoding))\n            {\n                return encoding;\n            }\n            try\n            {\n                return (ExtensionObjectEncoding)token.ToObject<byte>();\n            }\n            catch\n            {\n                return ExtensionObjectEncoding.None;\n            }\n        }\n\n        /// <summary>\n        /// Read array using specified element reader\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"property\"></param>\n        /// <param name=\"reader\"></param>\n        /// <returns></returns>\n        internal T[]? ReadArray<T>(string? property, Func<T> reader)\n        {\n            if (!TryGetToken(property, out var token))\n            {\n                return null;\n            }\n            if (token is JArray a)\n            {\n                return a.Select(t => ReadToken(t, reader)).ToArray();\n            }\n            return ReadToken(token, reader).YieldReturn().ToArray();\n        }\n\n        /// <summary>\n        /// Read dictionary\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"property\"></param>\n        /// <param name=\"reader\"></param>\n        /// <returns></returns>\n        private List<(string, T?)>? ReadDictionary<T>(string? property,\n            Func<T?> reader)\n        {\n            if (!TryGetToken(property, out var token) || token is not JObject o)\n            {\n                return null;\n            }\n            var dictionary = new List<(string, T?)>();\n            foreach (var p in o.Properties())\n            {\n                dictionary.Add((p.Name, ReadToken(p.Value, reader)));\n            }\n            return dictionary;\n        }\n\n        /// <summary>\n        /// Read token using a specified reader\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"token\"></param>\n        /// <param name=\"reader\"></param>\n        /// <returns></returns>\n        private T ReadToken<T>(JToken token, Func<T> reader)\n        {\n            try\n            {\n                _stack.Push(token);\n                return reader();\n            }\n            finally\n            {\n                _stack.Pop();\n            }\n        }\n\n        /// <summary>\n        /// Test whether the object contains any of the properties\n        /// </summary>\n        /// <param name=\"o\"></param>\n        /// <param name=\"properties\"></param>\n        /// <returns></returns>\n        internal static bool HasAnyOf(JObject o, params string[] properties)\n        {\n            foreach (var property in properties)\n            {\n                if (o.TryGetValue(property,\n                    StringComparison.InvariantCultureIgnoreCase, out _))\n                {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Try get top token or named token from object\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <param name=\"token\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        internal bool TryGetToken(string? property, [NotNullWhen(true)] out JToken? token)\n        {\n            JToken? top;\n            if (_stack.Count == 0)\n            {\n                top = ReadNextToken();\n                //\n                // Check whether we read a property from the top object.\n                // If so, push the top object for reading.  Otherwise, we\n                // are reading from an array of object so we do not push\n                // which means our stack will reset to 0.\n                //\n                if (top != null && (property != null || _reader is not JsonLoader))\n                {\n                    _stack.Push(top);\n                }\n            }\n            else\n            {\n                top = _stack.Peek();\n            }\n            if (top == null)\n            {\n                // Hit end of file.\n                token = null;\n                return false;\n            }\n            if (property == null)\n            {\n                // Read top token\n                token = top;\n                return true;\n            }\n            if (top is JObject o)\n            {\n                if (!o.TryGetValue(property, out token) &&\n                    !o.TryGetValue(property,\n                        StringComparison.InvariantCultureIgnoreCase, out token))\n                {\n                    return false;\n                }\n                switch (token.Type)\n                {\n                    case JTokenType.Comment:\n                    case JTokenType.Constructor:\n                    case JTokenType.None:\n                    case JTokenType.Property:\n                    case JTokenType.Raw:\n                    case JTokenType.Undefined:\n                    case JTokenType.Null:\n                        return false;\n                }\n                return true;\n            }\n            throw new DecodingException(\"Expected object at top of stack\");\n        }\n\n        /// <summary>\n        /// Read next root token from reader\n        /// </summary>\n        /// <returns></returns>\n        private JToken? ReadNextToken()\n        {\n            if (_reader == null)\n            {\n                return null;\n            }\n            if (_reader.TokenType == JsonToken.EndObject &&\n                string.IsNullOrEmpty(_reader.Path))\n            {\n                return null;\n            }\n            if (_reader is JsonLoader loader)\n            {\n                loader.Reset();\n            }\n\n            return JToken.ReadFrom(_reader,\n                new JsonLoadSettings\n                {\n                    CommentHandling = CommentHandling.Ignore,\n                    LineInfoHandling = LineInfoHandling.Ignore\n                });\n        }\n\n        /// <summary>\n        /// Read array field\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"array\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private bool ReadArrayField(string? fieldName,\n            [NotNullWhen(true)] out List<object>? array)\n        {\n            object? token;\n            if (!string.IsNullOrEmpty(fieldName))\n            {\n                var context = _stack.Peek().ToObject<Dictionary<string, object>>();\n                if (context == null || !context.TryGetValue(fieldName, out token))\n                {\n                    array = null;\n                    return false;\n                }\n            }\n            else\n            {\n                token = _stack.Peek();\n            }\n            array = token as List<object>;\n            if (array == null)\n            {\n                return false;\n            }\n            if (Context.MaxArrayLength > 0 && Context.MaxArrayLength < array.Count)\n            {\n                throw new DecodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"Maximum nesting level of {Context.MaxEncodingNestingLevels} was exceeded.\");\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Read the Matrix part (simple array or array of arrays)\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"currentArray\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"elements\"></param>\n        /// <param name=\"dimensions\"></param>\n        /// <param name=\"level\"></param>\n        /// <exception cref=\"DecodingException\"></exception>\n        private void ReadMatrixPart(string? fieldName, List<object>? currentArray,\n            BuiltInType builtInType, ref List<object> elements, ref List<int> dimensions, int level)\n        {\n            try\n            {\n                if (currentArray?.Count > 0)\n                {\n                    var hasInnerArray = false;\n                    for (var i = 0; i < currentArray.Count; i++)\n                    {\n                        if (i == 0 && dimensions.Count <= level)\n                        {\n                            // remember dimension length\n                            dimensions.Add(currentArray.Count);\n                        }\n                        if (currentArray[i] is List<object>)\n                        {\n                            hasInnerArray = true;\n\n                            if (!TryGetToken(fieldName, out var token))\n                            {\n                                return;\n                            }\n                            _stack.Push(token);\n                            ReadMatrixPart(null, currentArray[i] as List<object>,\n                                builtInType, ref elements, ref dimensions, level + 1);\n                            _stack.Pop();\n                        }\n                        else\n                        {\n                            break; // do not continue reading array of array\n                        }\n                    }\n                    if (!hasInnerArray)\n                    {\n                        // read array from one dimension\n                        if (ReadArray(null, ValueRanks.OneDimension, builtInType, null, null)\n                            is System.Collections.IList part && part.Count > 0)\n                        {\n                            // add part elements to final list\n                            foreach (var item in part)\n                            {\n                                elements.Add(item);\n                            }\n                        }\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                throw new DecodingException(ex.Message, ex);\n            }\n        }\n\n        /// <summary>\n        /// Returns dimensions of the multi dimensional array assuming\n        /// it is not jagged.\n        /// </summary>\n        /// <param name=\"token\"></param>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        private static int[] GetDimensions(JArray token, out JTokenType type)\n        {\n            var dimensions = new List<int>();\n            type = JTokenType.Undefined;\n            var array = token;\n            while (array != null && array.Count != 0)\n            {\n                dimensions.Add(array.Count);\n                type = array[0].Type;\n                array = array[0] as JArray;\n            }\n            return [.. dimensions];\n        }\n\n        /// <summary>\n        /// Works around missing object endings, etc.\n        /// </summary>\n        private class JsonLoader : JsonReader\n        {\n            /// <inheritdoc/>\n            public override string Path => _reader.Path;\n\n            /// <inheritdoc/>\n            public override object? Value => _reader.Value;\n\n            /// <inheritdoc/>\n            public override JsonToken TokenType\n            {\n                get\n                {\n                    if (_eofDepth >= 0)\n                    {\n                        return JsonToken.EndObject;\n                    }\n                    if (_eos)\n                    {\n                        return JsonToken.Null;\n                    }\n                    if (_reset)\n                    {\n                        return JsonToken.None;\n                    }\n                    return _reader.TokenType;\n                }\n            }\n\n            /// <inheritdoc/>\n            public override int Depth\n            {\n                get\n                {\n                    if (_eofDepth >= 0)\n                    {\n                        return --_eofDepth;\n                    }\n                    if (_reader.Depth > 0 && _inArray)\n                    {\n                        return _reader.Depth - 1;\n                    }\n                    return _reader.Depth;\n                }\n            }\n\n            /// <summary>\n            /// Create loader\n            /// </summary>\n            /// <param name=\"reader\"></param>\n            public JsonLoader(JsonReader reader)\n            {\n                _reader = reader;\n                _eofDepth = -1;\n            }\n\n            /// <inheritdoc/>\n            public override bool Read()\n            {\n                if (!_reader.Read())\n                {\n                    _eofDepth = Depth;\n                    return true;\n                }\n\n                // Handle streaming\n                if (_reader.Depth == 0 &&\n                   ((_inArray && _reader.TokenType == JsonToken.EndArray) ||\n                   (!_inArray && _reader.TokenType == JsonToken.StartArray)))\n                {\n                    _inArray = !_inArray;\n                    _eos |= !_inArray && _reset;\n                    // Skip to start object\n                    _reader.Read();\n                }\n\n                // Next token is start of object\n                _reset = false;\n                return true;\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                _reader.Close();\n            }\n\n            /// <summary>\n            /// Reset loader\n            /// </summary>\n            public void Reset()\n            {\n                _reset = true;\n            }\n\n            private readonly JsonReader _reader;\n            private int _eofDepth;\n            private bool _inArray;\n            private bool _reset;\n            private bool _eos;\n        }\n\n        private readonly JsonReader? _reader;\n        private readonly Stack<JToken> _stack = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/JsonEncoderEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Newtonsoft.Json;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Xml;\n\n    /// <summary>\n    /// Writes objects to a json\n    /// </summary>\n    public sealed class JsonEncoderEx : IEncoder\n    {\n        /// <inheritdoc/>\n        public EncodingType EncodingType => EncodingType.Json;\n\n        /// <inheritdoc/>\n        public IServiceMessageContext Context { get; }\n\n        /// <inheritdoc/>\n        public bool UseReversibleEncoding { get; set; } = true;\n\n        /// <summary>\n        /// Encode nodes as uri\n        /// </summary>\n        public bool UseUriEncoding { get; set; } = true;\n\n        /// <summary>\n        /// Namespace format to use\n        /// </summary>\n        public NamespaceFormat NamespaceFormat { get; set; }\n            = Publisher.Models.NamespaceFormat.Uri; // backcompat\n\n        /// <summary>\n        /// Encode using microsoft variant\n        /// </summary>\n        public bool UseAdvancedEncoding { get; set; }\n\n        /// <summary>\n        /// Ignore null values\n        /// </summary>\n        public bool IgnoreNullValues { get; set; }\n\n        /// <summary>\n        /// Ignore default primitive values\n        /// </summary>\n        public bool IgnoreDefaultValues { get; set; }\n\n        /// <summary>\n        /// State of the writer\n        /// </summary>\n        public enum JsonEncoding\n        {\n            /// <summary>\n            /// Start writing object (default)\n            /// </summary>\n            StartObject,\n\n            /// <summary>\n            /// Start writing array\n            /// </summary>\n            Array,\n\n            /// <summary>\n            /// Assume object or array already written\n            /// </summary>\n            Token\n        }\n\n        /// <summary>\n        /// Create encoder\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"formatting\"></param>\n        /// <param name=\"leaveOpen\"></param>\n        public JsonEncoderEx(Stream stream, IServiceMessageContext? context = null,\n            JsonEncoding encoding = JsonEncoding.StartObject,\n            Newtonsoft.Json.Formatting formatting = Newtonsoft.Json.Formatting.None,\n            bool leaveOpen = true) :\n            this(new StreamWriter(stream, new UTF8Encoding(false), leaveOpen: leaveOpen),\n                context, encoding, formatting, leaveOpen)\n        {\n        }\n\n        /// <summary>\n        /// Create encoder\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"formatting\"></param>\n        /// <param name=\"leaveOpen\"></param>\n        public JsonEncoderEx(TextWriter writer, IServiceMessageContext? context = null,\n            JsonEncoding encoding = JsonEncoding.StartObject,\n            Newtonsoft.Json.Formatting formatting = Newtonsoft.Json.Formatting.None,\n            bool leaveOpen = true) :\n            this(new JsonTextWriter(writer)\n            {\n                AutoCompleteOnClose = true,\n                DateFormatHandling = DateFormatHandling.IsoDateFormat,\n                FloatFormatHandling = FloatFormatHandling.String,\n                Formatting = formatting,\n                CloseOutput = !leaveOpen\n            }, context, encoding, true)\n        {\n        }\n\n        /// <summary>\n        /// Create encoder\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"ownedWriter\"></param>\n        public JsonEncoderEx(JsonWriter writer, IServiceMessageContext? context = null,\n            JsonEncoding encoding = JsonEncoding.StartObject, bool ownedWriter = false)\n        {\n            _namespaces = new Stack<string>();\n            Context = context ?? new ServiceMessageContext();\n            _ownedWriter = ownedWriter;\n            _writer = writer ?? throw new ArgumentNullException(nameof(writer));\n            _encoding = encoding;\n            switch (encoding)\n            {\n                case JsonEncoding.StartObject:\n                    _writer.WriteStartObject();\n                    break;\n                case JsonEncoding.Array:\n                    _writer.WriteStartArray();\n                    break;\n            }\n        }\n\n        /// <inheritdoc/>\n        public int Close()\n        {\n            if (_writer != null)\n            {\n                switch (_encoding)\n                {\n                    case JsonEncoding.StartObject:\n                        _writer.WriteEndObject();\n                        break;\n                    case JsonEncoding.Array:\n                        _writer.WriteEndArray();\n                        break;\n                }\n\n                _writer.Flush();\n                if (_ownedWriter)\n                {\n                    _writer.Close();\n                }\n                _writer = null;\n            }\n            return -1; // Not supported\n        }\n\n        /// <inheritdoc/>\n        public string? CloseAndReturnText()\n        {\n            throw new NotSupportedException();\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Close();\n        }\n\n        /// <inheritdoc/>\n        public void SetMappingTables(NamespaceTable namespaceUris,\n            StringTable serverUris)\n        {\n            _namespaceMappings = null;\n\n            if (namespaceUris != null && Context.NamespaceUris != null)\n            {\n                _namespaceMappings = namespaceUris.CreateMapping(\n                    Context.NamespaceUris, false);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void PushNamespace(string namespaceUri)\n        {\n            _namespaces.Push(namespaceUri);\n        }\n\n        /// <inheritdoc/>\n        public void PopNamespace()\n        {\n            _namespaces.Pop();\n        }\n\n        /// <inheritdoc/>\n        public void WriteSwitchField(uint switchField, out string? fieldName)\n        {\n            fieldName = null;\n            WriteUInt32(\"SwitchField\", switchField);\n        }\n\n        /// <inheritdoc/>\n        public void WriteEncodingMask(uint encodingMask)\n        {\n            WriteUInt32(\"EncodingMask\", encodingMask);\n        }\n\n        /// <inheritdoc/>\n        public void WriteSByte(string? fieldName, sbyte value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteByte(string? fieldName, byte value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteInt16(string? fieldName, short value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteUInt16(string? fieldName, ushort value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteInt32(string? fieldName, int value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteUInt32(string? fieldName, uint value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteInt64(string? fieldName, long value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                if (UseAdvancedEncoding)\n                {\n                    _writer?.WriteValue(value);\n                }\n                else\n                {\n                    _writer?.WriteValue(value.ToString(CultureInfo.InvariantCulture));\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteUInt64(string? fieldName, ulong value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                if (UseAdvancedEncoding)\n                {\n                    _writer?.WriteValue(value);\n                }\n                else\n                {\n                    _writer?.WriteValue(value.ToString(CultureInfo.InvariantCulture));\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteBoolean(string? fieldName, bool value)\n        {\n            if (PreWriteValue(fieldName, value))\n            {\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteString(string? fieldName, string? value)\n        {\n            if (value == null)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                if (!string.IsNullOrEmpty(fieldName))\n                {\n                    _writer?.WritePropertyName(fieldName);\n                }\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteFloat(string? fieldName, float value)\n        {\n            if (!string.IsNullOrEmpty(fieldName))\n            {\n                if (IgnoreDefaultValues && Math.Abs(value) < float.Epsilon)\n                {\n                    return;\n                }\n                _writer?.WritePropertyName(fieldName);\n            }\n            if (float.IsPositiveInfinity(value))\n            {\n                _writer?.WriteValue(\"Infinity\");\n            }\n            else if (float.IsNegativeInfinity(value))\n            {\n                _writer?.WriteValue(\"-Infinity\");\n            }\n            else if (float.IsNaN(value))\n            {\n                _writer?.WriteValue(\"NaN\");\n            }\n            else\n            {\n                _writer?.WriteRawValue(value.ToString(\"G9\", CultureInfo.InvariantCulture));\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteDouble(string? fieldName, double value)\n        {\n            if (!string.IsNullOrEmpty(fieldName))\n            {\n                if (IgnoreDefaultValues && Math.Abs(value) < double.Epsilon)\n                {\n                    return;\n                }\n                _writer?.WritePropertyName(fieldName);\n            }\n            if (double.IsPositiveInfinity(value))\n            {\n                _writer?.WriteValue(\"Infinity\");\n            }\n            else if (double.IsNegativeInfinity(value))\n            {\n                _writer?.WriteValue(\"-Infinity\");\n            }\n            else if (double.IsNaN(value))\n            {\n                _writer?.WriteValue(\"NaN\");\n            }\n            else\n            {\n                _writer?.WriteRawValue(value.ToString(\"G17\", CultureInfo.InvariantCulture));\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteDateTime(string? fieldName, DateTime value)\n        {\n            if (value == default)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                if (!string.IsNullOrEmpty(fieldName))\n                {\n                    _writer?.WritePropertyName(fieldName);\n                }\n                _writer?.WriteValue(value.ToOpcUaJsonEncodedTime());\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteGuid(string? fieldName, Uuid value)\n        {\n            if (value == default)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                if (!string.IsNullOrEmpty(fieldName))\n                {\n                    _writer?.WritePropertyName(fieldName);\n                }\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteGuid(string? fieldName, Guid value)\n        {\n            if (value == default)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                if (!string.IsNullOrEmpty(fieldName))\n                {\n                    _writer?.WritePropertyName(fieldName);\n                }\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteByteString(string? fieldName, byte[]? value)\n        {\n            if (value == null || value.Length == 0)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                if (!string.IsNullOrEmpty(fieldName))\n                {\n                    _writer?.WritePropertyName(fieldName);\n                }\n                // check the length.\n                if (Context.MaxByteStringLength > 0 &&\n                    Context.MaxByteStringLength < value.Length)\n                {\n                    throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                        $\"Maximum nesting level of {Context.MaxEncodingNestingLevels} was exceeded.\");\n                }\n                _writer?.WriteValue(value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteByteString(string? fieldName, ReadOnlySpan<byte> value)\n        {\n            WriteByteString(fieldName, value.ToArray());\n        }\n\n        /// <inheritdoc/>\n        public void WriteByteString(string? fieldName, byte[] value, int index, int count)\n        {\n            WriteByteString(fieldName, value.AsSpan().Slice(index, count));\n        }\n\n        /// <inheritdoc/>\n        public void WriteXmlElement(string? fieldName, XmlElement? value)\n        {\n            if (value == null)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                if (!string.IsNullOrEmpty(fieldName))\n                {\n                    _writer?.WritePropertyName(fieldName);\n                }\n                _writer?.WriteValue(Encoding.UTF8.GetBytes(value.OuterXml));\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteNodeId(string? fieldName, NodeId? value)\n        {\n            if (value == null || NodeId.IsNull(value))\n            {\n                WriteNull(fieldName);\n            }\n            else if (UseAdvancedEncoding)\n            {\n                if (UseUriEncoding || UseReversibleEncoding)\n                {\n                    WriteString(fieldName, value.AsString(Context,\n                        NamespaceFormat));\n                }\n                else\n                {\n                    WriteString(fieldName, value.ToString());\n                }\n            }\n            else\n            {\n                PushObject(fieldName);\n                if (value.IdType != IdType.Numeric)\n                {\n                    WriteByte(\"IdType\", (byte)value.IdType);\n                }\n                switch (value.IdType)\n                {\n                    case IdType.Numeric:\n                        WriteUInt32(\"Id\", (uint)value.Identifier);\n                        break;\n                    case IdType.String:\n                        WriteString(\"Id\", (string)value.Identifier);\n                        break;\n                    case IdType.Guid:\n                        WriteGuid(\"Id\", (Guid)value.Identifier);\n                        break;\n                    case IdType.Opaque:\n                        WriteByteString(\"Id\", (byte[])value.Identifier);\n                        break;\n                }\n                switch (value.NamespaceIndex)\n                {\n                    case 0:\n                        // default namespace - nothing to do\n                        break;\n                    case 1:\n                        // always as integer\n                        WriteUInt16(\"Namespace\", value.NamespaceIndex);\n                        break;\n                    default:\n                        var namespaceUri = Context.NamespaceUris.GetString(value.NamespaceIndex);\n                        if (namespaceUri != null && !UseReversibleEncoding)\n                        {\n                            WriteString(\"Namespace\", namespaceUri);\n                        }\n                        else\n                        {\n                            WriteUInt16(\"Namespace\", value.NamespaceIndex);\n                        }\n                        break;\n                }\n                PopObject();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteExpandedNodeId(string? fieldName, ExpandedNodeId? value)\n        {\n            if (value == null || NodeId.IsNull(value))\n            {\n                WriteNull(fieldName);\n            }\n            else if (UseAdvancedEncoding)\n            {\n                if (UseUriEncoding || UseReversibleEncoding)\n                {\n                    WriteString(fieldName, value.AsString(Context,\n                        NamespaceFormat));\n                }\n                else\n                {\n                    WriteString(fieldName, value.ToString());\n                }\n            }\n            else\n            {\n                PushObject(fieldName);\n                if (value.IdType != IdType.Numeric)\n                {\n                    WriteByte(\"IdType\", (byte)value.IdType);\n                }\n                switch (value.IdType)\n                {\n                    case IdType.Numeric:\n                        WriteUInt32(\"Id\", (uint)value.Identifier);\n                        break;\n                    case IdType.String:\n                        WriteString(\"Id\", (string)value.Identifier);\n                        break;\n                    case IdType.Guid:\n                        WriteGuid(\"Id\", (Guid)value.Identifier);\n                        break;\n                    case IdType.Opaque:\n                        WriteByteString(\"Id\", (byte[])value.Identifier);\n                        break;\n                }\n                var namespaceIndex = value.NamespaceIndex;\n                if (namespaceIndex == 0 && !string.IsNullOrEmpty(value.NamespaceUri))\n                {\n                    namespaceIndex = (ushort)Context.NamespaceUris.GetIndexOrAppend(value.NamespaceUri);\n                }\n                switch (namespaceIndex)\n                {\n                    case 0:\n                        // default namespace - nothing to do\n                        break;\n                    case 1:\n                        // namespace 1 always as integer\n                        WriteUInt16(\"Namespace\", namespaceIndex);\n                        break;\n                    default:\n                        var namespaceUri = UseReversibleEncoding ?\n                            null : Context.NamespaceUris.GetString(namespaceIndex);\n                        if (namespaceUri != null)\n                        {\n                            WriteString(\"Namespace\", namespaceUri);\n                        }\n                        else\n                        {\n                            WriteUInt16(\"Namespace\", namespaceIndex);\n                        }\n                        break;\n                }\n                if (value.ServerIndex != 0)\n                {\n                    var serverUri = Context.ServerUris.GetString(value.ServerIndex);\n                    if (serverUri != null)\n                    {\n                        WriteString(\"ServerUri\", serverUri);\n                    }\n                    else\n                    {\n                        WriteUInt32(\"ServerUri\", value.ServerIndex);\n                    }\n                }\n                PopObject();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteStatusCode(string? fieldName, StatusCode value)\n        {\n            if (value == StatusCodes.Good)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                var symbol = string.Empty;\n                if (!UseReversibleEncoding || UseAdvancedEncoding)\n                {\n                    symbol = value.AsString();\n                }\n                if (!UseReversibleEncoding || !string.IsNullOrEmpty(symbol))\n                {\n                    PushObject(fieldName);\n                    WriteString(\"Symbol\", symbol);\n                    WriteUInt32(\"Code\", value.Code);\n                    PopObject();\n                }\n                else\n                {\n                    WriteUInt32(fieldName, value.Code);\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteDiagnosticInfo(string? fieldName, DiagnosticInfo value)\n        {\n            if (value == null)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                PushObject(fieldName);\n                if (value.SymbolicId >= 0)\n                {\n                    WriteInt32(\"SymbolicId\", value.SymbolicId);\n                }\n                if (value.NamespaceUri >= 0)\n                {\n                    WriteInt32(\"NamespaceUri\", value.NamespaceUri);\n                }\n                if (value.Locale >= 0)\n                {\n                    WriteInt32(\"Locale\", value.Locale);\n                }\n                if (value.LocalizedText >= 0)\n                {\n                    WriteInt32(\"LocalizedText\", value.LocalizedText);\n                }\n                if (value.AdditionalInfo != null)\n                {\n                    WriteString(\"AdditionalInfo\", value.AdditionalInfo);\n                }\n                if (value.InnerStatusCode != StatusCodes.Good)\n                {\n                    WriteStatusCode(\"InnerStatusCode\", value.InnerStatusCode);\n                }\n                if (value.InnerDiagnosticInfo != null)\n                {\n                    WriteDiagnosticInfo(\"InnerDiagnosticInfo\", value.InnerDiagnosticInfo);\n                }\n                PopObject();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteQualifiedName(string? fieldName, QualifiedName? value)\n        {\n            if (value == null || QualifiedName.IsNull(value))\n            {\n                WriteNull(fieldName);\n            }\n            else if (UseReversibleEncoding)\n            {\n                if (UseUriEncoding && UseAdvancedEncoding)\n                {\n                    WriteString(fieldName, value.AsString(Context,\n                        NamespaceFormat));\n                }\n                else\n                {\n                    // Back compat to json encoding\n                    PushObject(fieldName);\n                    WriteString(\"Name\", value.Name);\n                    if (value.NamespaceIndex > 0)\n                    {\n                        WriteUInt16(\"Uri\", value.NamespaceIndex);\n                    }\n                    PopObject();\n                }\n            }\n            else\n            {\n                PushObject(fieldName);\n                WriteString(\"Name\", value.Name);\n                WriteNamespaceIndex(value.NamespaceIndex);\n                PopObject();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteLocalizedText(string? fieldName, LocalizedText? value)\n        {\n            if (value == null || LocalizedText.IsNullOrEmpty(value))\n            {\n                WriteNull(fieldName);\n            }\n            else if (UseReversibleEncoding)\n            {\n                PushObject(fieldName);\n                WriteString(\"Text\", value.Text);\n                if (!string.IsNullOrEmpty(value.Locale))\n                {\n                    WriteString(\"Locale\", value.Locale);\n                }\n                PopObject();\n            }\n            else\n            {\n                WriteString(fieldName, value.Text);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteVariant(string? fieldName, Variant value)\n        {\n            var variant = value;\n            if (UseAdvancedEncoding &&\n                value.Value is Variant[] vararray &&\n                value.TypeInfo.ValueRank == 1 &&\n                vararray.Length > 0)\n            {\n                var type = vararray[0].TypeInfo?.BuiltInType;\n                var rank = vararray[0].TypeInfo?.ValueRank;\n\n                if (vararray.All(v => v.TypeInfo?.BuiltInType == type))\n                {\n                    try\n                    {\n                        // Demote and encode as simple array\n                        variant = new TypeInfo(type ?? BuiltInType.Null, 1)\n                            .CreateVariant(vararray\n                                .Select(v => v.Value)\n                                .ToArray());\n                    }\n                    catch\n                    {\n                        // Fails when different ranks are in use in array\n                        variant = value;\n                    }\n                }\n            }\n\n            var valueRank = variant.TypeInfo?.ValueRank ?? -1;\n            var builtInType = variant.TypeInfo?.BuiltInType ?? BuiltInType.Null;\n\n            if (UseReversibleEncoding)\n            {\n                PushObject(fieldName);\n                WriteBuiltInType(\"Type\", builtInType);\n                fieldName = \"Body\";\n            }\n\n            if (!string.IsNullOrEmpty(fieldName))\n            {\n                _writer?.WritePropertyName(fieldName);\n            }\n\n            WriteVariantContents(variant.Value, valueRank, builtInType);\n\n            if (UseReversibleEncoding)\n            {\n                PopObject();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteDataValue(string? fieldName, DataValue? value)\n        {\n            if (value == null)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                if (value.StatusCode != StatusCodes.Good ||\n                    value.SourceTimestamp != DateTime.MinValue ||\n                    value.ServerTimestamp != DateTime.MinValue ||\n                    value.SourcePicoseconds != 0 ||\n                    value.ServerPicoseconds != 0)\n                {\n                    PushObject(fieldName);\n                    if (value.WrappedValue.TypeInfo != null &&\n                        value.WrappedValue.TypeInfo.BuiltInType != BuiltInType.Null)\n                    {\n                        WriteVariant(\"Value\", value.WrappedValue);\n                    }\n\n                    if (value.StatusCode != StatusCodes.Good)\n                    {\n                        WriteStatusCode(\"StatusCode\", value.StatusCode);\n                    }\n                    if (value.SourceTimestamp != DateTime.MinValue)\n                    {\n                        WriteDateTime(\"SourceTimestamp\", value.SourceTimestamp);\n                        if (value.SourcePicoseconds != 0)\n                        {\n                            WriteUInt16(\"SourcePicoseconds\", value.SourcePicoseconds);\n                        }\n                    }\n                    if (value.ServerTimestamp != DateTime.MinValue)\n                    {\n                        WriteDateTime(\"ServerTimestamp\", value.ServerTimestamp);\n                        if (value.ServerPicoseconds != 0)\n                        {\n                            WriteUInt16(\"ServerPicoseconds\", value.ServerPicoseconds);\n                        }\n                    }\n                    PopObject();\n                }\n                else\n                {\n                    // raw value\n                    if (value.WrappedValue.TypeInfo != null &&\n                        value.WrappedValue.TypeInfo.BuiltInType != BuiltInType.Null)\n                    {\n                        WriteVariant(fieldName, value.WrappedValue);\n                    }\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteExtensionObject(string? fieldName, ExtensionObject? value)\n        {\n            if (value == null)\n            {\n                WriteNull(fieldName);\n                return;\n            }\n\n            var body = value.Body;\n\n            if (UseReversibleEncoding)\n            {\n                PushObject(fieldName);\n                var typeId = value.TypeId;\n                if (body is IJsonEncodeable withType)\n                {\n                    typeId = withType.JsonEncodingId;\n                }\n                if (!NodeId.IsNull(typeId))\n                {\n                    WriteExpandedNodeId(\"TypeId\", typeId);\n                }\n                else if (!UseAdvancedEncoding)\n                {\n                    throw new EncodingException(\n                       \"Cannot encode extension object without type id.\");\n                }\n                if (UseAdvancedEncoding)\n                {\n                    // Backcompat\n                    if (body is XmlElement)\n                    {\n                        WriteString(\"Encoding\", nameof(ExtensionObjectEncoding.Xml));\n                    }\n                    else if (body is not byte[] and not null)\n                    {\n                        WriteString(\"Encoding\", nameof(ExtensionObjectEncoding.Json));\n                    }\n                }\n                else\n                {\n                    // https://reference.opcfoundation.org/Core/Part6/v105/docs/5.4.2.16\n                    WriteInt32(\"Encoding\", body switch\n                    {\n                        byte[] => 1,        // Byte string\n                        XmlElement => 2,    // Xml\n                        _ => 0,             // Structure - omitted in default encoding.\n                    });\n                }\n                fieldName = \"Body\";\n            }\n            switch (body)\n            {\n                case EncodeableJToken jt:\n                    if (!string.IsNullOrEmpty(fieldName))\n                    {\n                        _writer?.WritePropertyName(fieldName);\n                    }\n                    _writer?.WriteRaw(jt.JToken.ToString());\n                    break;\n                case IEncodeable encodeable:\n                    PushObject(fieldName);\n                    encodeable.Encode(this);\n                    PopObject();\n                    break;\n                case XmlElement xml:\n                    WriteXmlElement(fieldName, xml);\n                    break;\n                case byte[] buffer:\n                    WriteByteString(fieldName, buffer);\n                    break;\n                case null:\n                    WriteNull(fieldName);\n                    break;\n                default:\n                    throw new EncodingException(\"Unexpected value encountered while \" +\n                        $\"encoding body:{body}\");\n            }\n            if (UseReversibleEncoding)\n            {\n                PopObject();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void EncodeMessage(IEncodeable message)\n        {\n            message.Encode(this);\n        }\n\n        /// <inheritdoc/>\n        public void WriteEncodeable(string? fieldName, IEncodeable? value,\n            Type systemType)\n        {\n            if (value == null)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                PushObject(fieldName);\n                value.Encode(this);\n                PopObject();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteEnumerated(string? fieldName, Enum value)\n        {\n            if (value == null)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                var numeric = Convert.ToInt32(value, CultureInfo.InvariantCulture);\n                if (UseReversibleEncoding)\n                {\n                    if (PreWriteValue(fieldName, numeric))\n                    {\n                        _writer?.WriteValue(numeric);\n                    }\n                }\n                else\n                {\n                    WriteString(fieldName, $\"{value}_{numeric}\");\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteBooleanArray(string? fieldName, IList<bool>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteSByteArray(string? fieldName, IList<sbyte>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteByteArray(string? fieldName, IList<byte>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteInt16Array(string? fieldName, IList<short>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteUInt16Array(string? fieldName, IList<ushort>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteInt32Array(string? fieldName, IList<int>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteUInt32Array(string? fieldName, IList<uint>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteInt64Array(string? fieldName, IList<long>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteUInt64Array(string? fieldName, IList<ulong>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteFloatArray(string? fieldName, IList<float>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteDoubleArray(string? fieldName, IList<double>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteStringArray(string? fieldName, IList<string?>? values)\n        {\n            WriteArray(fieldName, values, v => _writer?.WriteValue(v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteStringDictionary(string? property,\n            IEnumerable<(string, string?)> values)\n        {\n            WriteDictionary(property, values, WriteString);\n        }\n\n        /// <inheritdoc/>\n        public void WriteDateTimeArray(string? fieldName, IList<DateTime>? values)\n        {\n            WriteArray(fieldName, values, v => WriteDateTime(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteGuidArray(string? fieldName, IList<Uuid>? values)\n        {\n            WriteArray(fieldName, values, v => WriteGuid(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteGuidArray(string? fieldName, IList<Guid>? values)\n        {\n            WriteArray(fieldName, values, v => WriteGuid(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteByteStringArray(string? fieldName, IList<byte[]?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteByteString(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteXmlElementArray(string? fieldName, IList<XmlElement?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteXmlElement(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteNodeIdArray(string? fieldName, IList<NodeId?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteNodeId(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteExpandedNodeIdArray(string? fieldName, IList<ExpandedNodeId?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteExpandedNodeId(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteStatusCodeArray(string? fieldName, IList<StatusCode>? values)\n        {\n            WriteArray(fieldName, values, v => WriteStatusCode(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteDiagnosticInfoArray(string? fieldName, IList<DiagnosticInfo>? values)\n        {\n            WriteArray(fieldName, values, v => WriteDiagnosticInfo(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteQualifiedNameArray(string? fieldName, IList<QualifiedName?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteQualifiedName(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteLocalizedTextArray(string? fieldName, IList<LocalizedText?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteLocalizedText(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteVariantArray(string? fieldName, IList<Variant>? values)\n        {\n            WriteArray(fieldName, values, v => WriteVariant(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteDataValueArray(string? fieldName, IList<DataValue?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteDataValue(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteExtensionObjectArray(string? fieldName, IList<ExtensionObject?>? values)\n        {\n            WriteArray(fieldName, values, v => WriteExtensionObject(null, v));\n        }\n\n        /// <inheritdoc/>\n        public void WriteEncodeableArray(string? fieldName, IList<IEncodeable>? values,\n            Type systemType)\n        {\n            WriteArray(fieldName, values, v => WriteEncodeable(null, v, systemType));\n        }\n\n        /// <inheritdoc/>\n        public void WriteDataSet(string? property, DataSet? dataSet)\n        {\n            if (dataSet == null)\n            {\n                WriteNull(property);\n                return;\n            }\n            var useUriEncoding = UseUriEncoding;\n            var useReversibleEncoding = UseReversibleEncoding;\n            try\n            {\n                var fieldContentMask = dataSet.DataSetFieldContentMask;\n                var writeSingleValue = (dataSet.DataSetFields.Count == 1) &&\n                   fieldContentMask.HasFlag(DataSetFieldContentFlags.SingleFieldDegradeToValue);\n                if (fieldContentMask.HasFlag(DataSetFieldContentFlags.RawData))\n                {\n                    //\n                    // If the DataSetFieldContentMask results in a RawData representation,\n                    // the field value is a Variant encoded using the non-reversible OPC UA\n                    // JSON Data Encoding defined in OPC 10000-6\n                    //\n                    UseUriEncoding = true;\n                    UseReversibleEncoding = false;\n                    Write(property, dataSet.DataSetFields,\n                        (k, v) => WriteVariant(k, v?.WrappedValue ?? default), writeSingleValue);\n                }\n                else if (fieldContentMask == 0)\n                {\n                    //\n                    // If the DataSetFieldContentMask results in a Variant representation,\n                    // the field value is encoded as a Variant encoded using the reversible\n                    // OPC UA JSON Data Encoding defined in OPC 10000-6.\n                    //\n                    UseUriEncoding = false;\n                    UseReversibleEncoding = true;\n                    Write(property, dataSet.DataSetFields,\n                        (k, v) => WriteVariant(k, v?.WrappedValue ?? default), writeSingleValue);\n                }\n                else\n                {\n                    //\n                    // If the DataSetFieldContentMask results in a DataValue representation,\n                    // the field value is a DataValue encoded using the non-reversible OPC UA\n                    // JSON Data Encoding or reversible depending on encoder configuration.\n                    //\n                    Write(property, dataSet.DataSetFields, (k, value) =>\n                    {\n                        PushObject(k);\n                        try\n                        {\n                            WriteVariant(\"Value\", value?.WrappedValue ?? default);\n                            if (value != null)\n                            {\n                                if (fieldContentMask.HasFlag(DataSetFieldContentFlags.StatusCode))\n                                {\n                                    WriteStatusCode(\"StatusCode\", value.StatusCode);\n                                }\n                                if (fieldContentMask.HasFlag(DataSetFieldContentFlags.SourceTimestamp))\n                                {\n                                    WriteDateTime(\"SourceTimestamp\", value.SourceTimestamp);\n                                    if (fieldContentMask.HasFlag(DataSetFieldContentFlags.SourcePicoSeconds))\n                                    {\n                                        WriteUInt16(\"SourcePicoseconds\", value.SourcePicoseconds);\n                                    }\n                                }\n                                if (fieldContentMask.HasFlag(DataSetFieldContentFlags.ServerTimestamp))\n                                {\n                                    WriteDateTime(\"ServerTimestamp\", value.ServerTimestamp);\n                                    if (fieldContentMask.HasFlag(DataSetFieldContentFlags.ServerPicoSeconds))\n                                    {\n                                        WriteUInt16(\"ServerPicoseconds\", value.ServerPicoseconds);\n                                    }\n                                }\n                            }\n                        }\n                        finally\n                        {\n                            PopObject();\n                        }\n                    }, writeSingleValue);\n                }\n\n                void Write<T>(string? property, IEnumerable<(string, T)> values, Action<string?, T> writer,\n                    bool writeSingleValue)\n                {\n                    if (writeSingleValue)\n                    {\n                        writer(property, values.Single().Item2);\n                    }\n                    else\n                    {\n                        WriteDictionary(property, values, writer);\n                    }\n                }\n            }\n            finally\n            {\n                UseUriEncoding = useUriEncoding;\n                UseReversibleEncoding = useReversibleEncoding;\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteObjectArray(string? property, IList<object>? values)\n        {\n            PushArray(property, values?.Count ?? 0);\n            if (values != null)\n            {\n                foreach (var value in values)\n                {\n                    WriteVariant(\"Variant\", new Variant(value));\n                }\n            }\n            PopArray();\n        }\n\n        /// <inheritdoc/>\n        public void WriteEnumeratedArray(string? fieldName, Array? values, Type systemType)\n        {\n            if (values == null)\n            {\n                WriteNull(fieldName);\n            }\n            else\n            {\n                PushArray(fieldName, values.Length);\n                // encode each element in the array.\n                if (systemType.IsEnum)\n                {\n                    foreach (Enum value in values)\n                    {\n                        WriteEnumerated(null, value);\n                    }\n                }\n                else if (systemType == typeof(int))\n                {\n                    foreach (int value in values)\n                    {\n                        WriteInt32(null, value);\n                    }\n                }\n                else\n                {\n                    throw new ArgumentException(\"Not an enum type\", nameof(systemType));\n                }\n                PopArray();\n            }\n        }\n\n        /// <summary>\n        /// Writes the contents of an Variant to the stream.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void WriteVariantContents(object value, int valueRank,\n            BuiltInType builtInType)\n        {\n            // Handle special value ranks\n            if (valueRank is <= (-2) or 0)\n            {\n                if (valueRank < -3)\n                {\n                    throw new EncodingException(\n                        $\"Bad variant: Value rank '{valueRank}' is invalid.\");\n                }\n                // Cannot deduce rank - write null\n                if (value == null)\n                {\n                    WriteNull(null);\n                    return;\n                }\n                // Handle one or more (0), Any (-2) or scalar or one dimension (-3)\n                if (value.GetType().IsArray)\n                {\n                    var rank = value.GetType().GetArrayRank();\n                    if (valueRank == -3 && rank != 1)\n                    {\n                        throw new EncodingException(\n                            \"Bad variant: Scalar or one dimension with matrix value.\");\n                    }\n                    // Write as array or matrix\n                    valueRank = rank;\n                }\n                else\n                {\n                    if (valueRank == 0)\n                    {\n                        throw new EncodingException(\n                            \"Bad variant: One or more dimension rank with scalar value.\");\n                    }\n                    // Force write as scalar\n                    valueRank = -1;\n                }\n            }\n\n            // write scalar.\n            if (valueRank == -1)\n            {\n                switch (builtInType)\n                {\n                    case BuiltInType.Null:\n                        WriteNull(null);\n                        return;\n                    case BuiltInType.Boolean:\n                        WriteBoolean(null, ToTypedScalar<bool>(value));\n                        return;\n                    case BuiltInType.SByte:\n                        WriteSByte(null, ToTypedScalar<sbyte>(value));\n                        return;\n                    case BuiltInType.Byte:\n                        WriteByte(null, ToTypedScalar<byte>(value));\n                        return;\n                    case BuiltInType.Int16:\n                        WriteInt16(null, ToTypedScalar<short>(value));\n                        return;\n                    case BuiltInType.UInt16:\n                        WriteUInt16(null, ToTypedScalar<ushort>(value));\n                        return;\n                    case BuiltInType.Int32:\n                        WriteInt32(null, ToTypedScalar<int>(value));\n                        return;\n                    case BuiltInType.UInt32:\n                        WriteUInt32(null, ToTypedScalar<uint>(value));\n                        return;\n                    case BuiltInType.Int64:\n                        WriteInt64(null, ToTypedScalar<long>(value));\n                        return;\n                    case BuiltInType.UInt64:\n                        WriteUInt64(null, ToTypedScalar<ulong>(value));\n                        return;\n                    case BuiltInType.Float:\n                        WriteFloat(null, ToTypedScalar<float>(value));\n                        return;\n                    case BuiltInType.Double:\n                        WriteDouble(null, ToTypedScalar<double>(value));\n                        return;\n                    case BuiltInType.String:\n                        WriteString(null, ToTypedScalar<string>(value, null));\n                        return;\n                    case BuiltInType.DateTime:\n                        WriteDateTime(null, ToTypedScalar<DateTime>(value));\n                        return;\n                    case BuiltInType.Guid:\n                        WriteGuid(null, ToTypedScalar<Uuid>(value));\n                        return;\n                    case BuiltInType.ByteString:\n                        WriteByteString(null, ToTypedScalar(value, Array.Empty<byte>()));\n                        return;\n                    case BuiltInType.XmlElement:\n                        WriteXmlElement(null, ToTypedScalar<XmlElement>(value, null));\n                        return;\n                    case BuiltInType.NodeId:\n                        WriteNodeId(null, ToTypedScalar<NodeId>(value, null));\n                        return;\n                    case BuiltInType.ExpandedNodeId:\n                        WriteExpandedNodeId(null, ToTypedScalar<ExpandedNodeId>(value, null));\n                        return;\n                    case BuiltInType.StatusCode:\n                        WriteStatusCode(null, ToTypedScalar<StatusCode>(value));\n                        return;\n                    case BuiltInType.QualifiedName:\n                        WriteQualifiedName(null, ToTypedScalar<QualifiedName>(value, null));\n                        return;\n                    case BuiltInType.LocalizedText:\n                        WriteLocalizedText(null, ToTypedScalar<LocalizedText>(value, null));\n                        return;\n                    case BuiltInType.ExtensionObject:\n                        WriteExtensionObject(null, ToTypedScalar<ExtensionObject>(value, null));\n                        return;\n                    case BuiltInType.DataValue:\n                        WriteDataValue(null, ToTypedScalar<DataValue>(value, null));\n                        return;\n                    case BuiltInType.Enumeration:\n                        WriteInt32(null, ToTypedScalar<int>(value));\n                        return;\n                    case BuiltInType.Number:\n                    case BuiltInType.Integer:\n                    case BuiltInType.UInteger:\n                    case BuiltInType.Variant:\n                        throw new EncodingException(\n                            \"Bad variant: Unexpected type encountered while encoding \" +\n                            value.GetType());\n                }\n            }\n\n            // write array.\n            if (valueRank == 1)\n            {\n                switch (builtInType)\n                {\n                    case BuiltInType.Null:\n                        WriteNull(null);\n                        return;\n                    case BuiltInType.Boolean:\n                        WriteBooleanArray(null, ToTypedArray<bool>(value));\n                        return;\n                    case BuiltInType.SByte:\n                        WriteSByteArray(null, ToTypedArray<sbyte>(value));\n                        return;\n                    case BuiltInType.Byte:\n                        WriteByteArray(null, ToTypedArray<byte>(value));\n                        return;\n                    case BuiltInType.Int16:\n                        WriteInt16Array(null, ToTypedArray<short>(value));\n                        return;\n                    case BuiltInType.UInt16:\n                        WriteUInt16Array(null, ToTypedArray<ushort>(value));\n                        return;\n                    case BuiltInType.Int32:\n                        WriteInt32Array(null, ToTypedArray<int>(value));\n                        return;\n                    case BuiltInType.UInt32:\n                        WriteUInt32Array(null, ToTypedArray<uint>(value));\n                        return;\n                    case BuiltInType.Int64:\n                        WriteInt64Array(null, ToTypedArray<long>(value));\n                        return;\n                    case BuiltInType.UInt64:\n                        WriteUInt64Array(null, ToTypedArray<ulong>(value));\n                        return;\n                    case BuiltInType.Float:\n                        WriteFloatArray(null, ToTypedArray<float>(value));\n                        return;\n                    case BuiltInType.Double:\n                        WriteDoubleArray(null, ToTypedArray<double>(value));\n                        return;\n                    case BuiltInType.String:\n                        WriteStringArray(null, ToTypedArray<string>(value, null));\n                        return;\n                    case BuiltInType.DateTime:\n                        WriteDateTimeArray(null, ToTypedArray<DateTime>(value));\n                        return;\n                    case BuiltInType.Guid:\n                        WriteGuidArray(null, ToTypedArray<Uuid>(value));\n                        return;\n                    case BuiltInType.ByteString:\n                        WriteByteStringArray(null, ToTypedArray<byte[]>(value, null));\n                        return;\n                    case BuiltInType.XmlElement:\n                        WriteXmlElementArray(null, ToTypedArray<XmlElement>(value, null));\n                        return;\n                    case BuiltInType.NodeId:\n                        WriteNodeIdArray(null, ToTypedArray<NodeId>(value, null));\n                        return;\n                    case BuiltInType.ExpandedNodeId:\n                        WriteExpandedNodeIdArray(null, ToTypedArray<ExpandedNodeId>(value, null));\n                        return;\n                    case BuiltInType.StatusCode:\n                        WriteStatusCodeArray(null, ToTypedArray<StatusCode>(value));\n                        return;\n                    case BuiltInType.QualifiedName:\n                        WriteQualifiedNameArray(null, ToTypedArray<QualifiedName>(value, null));\n                        return;\n                    case BuiltInType.LocalizedText:\n                        WriteLocalizedTextArray(null, ToTypedArray<LocalizedText>(value, null));\n                        return;\n                    case BuiltInType.ExtensionObject:\n                        WriteExtensionObjectArray(null, ToTypedArray<ExtensionObject>(value, null));\n                        return;\n                    case BuiltInType.DataValue:\n                        WriteDataValueArray(null, ToTypedArray<DataValue>(value, null));\n                        return;\n                    case BuiltInType.Enumeration:\n                        if (value is not Enum[] enums)\n                        {\n                            throw new EncodingException(\n                                \"Bad enum: Unexpected type encountered while encoding \" +\n                                $\"enumeration type: {value.GetType()}\");\n                        }\n                        var values = new string[enums.Length];\n                        for (var index = 0; index < enums.Length; index++)\n                        {\n                            var text = enums[index].ToString();\n                            text += \"_\";\n                            text += ((int)(object)enums[index])\n                                .ToString(CultureInfo.InvariantCulture);\n                            values[index] = text;\n                        }\n\n                        WriteStringArray(null, values);\n                        return;\n                    case BuiltInType.Number:\n                    case BuiltInType.UInteger:\n                    case BuiltInType.Integer:\n                    case BuiltInType.Variant:\n                        if (value is Variant[] variants)\n                        {\n                            WriteVariantArray(null, variants);\n                            return;\n                        }\n                        if (value is object[] objects)\n                        {\n                            WriteObjectArray(null, objects);\n                            return;\n                        }\n                        throw new EncodingException(\n                            \"Bad variant: Unexpected type encountered while encoding an array\" +\n                            $\" of Variants: {value.GetType()}\");\n                }\n            }\n\n            if (valueRank > 1)\n            {\n                // Write matrix\n                if (value == null)\n                {\n                    WriteNull(null);\n                    return;\n                }\n\n                // TODO: JSON array encoding only for\n                // non reversible encoding, otherwise\n                // flatten array and add Dimension.\n                // if (!UseReversibleEncoding) {\n                if (value is Matrix matrix)\n                {\n                    var index = 0;\n                    WriteMatrix(matrix, 0, ref index, builtInType);\n                    return;\n                }\n            }\n\n            // Should never happen.\n            throw new EncodingException(\n                $\"Bad variant: Type '{value.GetType().FullName}' is not allowed in Variant.\");\n        }\n\n        /// <summary>\n        /// Cast to array\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        private static IList<T> ToTypedArray<T>(object value) where T : struct\n        {\n            return ToTypedArray(value, default(T));\n        }\n\n        /// <summary>\n        /// Cast to array\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"value\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <param name=\"outerException\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"EncodingException\"></exception>\n        private static IList<T?> ToTypedArray<T>(object? value, T? defaultValue,\n            Func<Exception, Exception>? outerException = null)\n        {\n            if (value == null)\n            {\n                return [];\n            }\n            if (value is T[] t)\n            {\n                return t;\n            }\n            if (value is not Array arr)\n            {\n                return ToTypedScalar(value, defaultValue).YieldReturn().ToArray();\n            }\n            if (arr.Length == 0)\n            {\n                return [];\n            }\n            var result = new T?[arr.Length];\n            for (var index = 0; index < arr.Length; index++)\n            {\n                var item = arr.GetValue(index);\n                if (item == null)\n                {\n                    result[index] = defaultValue;\n                    continue;\n                }\n                if (item is not byte[] and\n                    Array itemArray)\n                {\n                    return ToTypedArray(itemArray, defaultValue,\n                        ex => GetException(value, arr, item, ex));\n                }\n                try\n                {\n                    result[index] = (T?)item;\n                }\n                catch\n                {\n                    try\n                    {\n                        result[index] = item.As<T?>();\n                    }\n                    catch (Exception ex)\n                    {\n                        if (outerException != null)\n                        {\n                            ex = outerException(ex);\n                        }\n                        throw GetException(value, arr, item, ex);\n                    }\n                }\n            }\n            return result;\n\n            static EncodingException GetException(object value, Array arr, object item,\n                Exception ex)\n            {\n                return new EncodingException(\"Bad variant: \" +\n                    $\"Value '{value}' with length {arr.Length} of type '{value.GetType().FullName}'\" +\n                    $\" with item '{item}' of type '{item.GetType().FullName}' is not of type \" +\n                    $\"'{typeof(T).GetType().FullName}'.\", ex);\n            }\n        }\n\n        /// <summary>\n        /// Cast to primitive scalar\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        private static T ToTypedScalar<T>(object value) where T : struct\n        {\n            return ToTypedScalar(value, default(T));\n        }\n\n        /// <summary>\n        /// Cast to array\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"value\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"EncodingException\"></exception>\n        [return: NotNullIfNotNull(nameof(defaultValue))]\n        private static T? ToTypedScalar<T>(object? value, T? defaultValue)\n        {\n            try\n            {\n                if (value == null)\n                {\n                    return defaultValue;\n                }\n                if (value is T t)\n                {\n                    return t;\n                }\n                return (T)value;\n            }\n            catch (Exception ex)\n            {\n                throw new EncodingException(\n                    $\"Bad variant: Value '{value}' of type '{value?.GetType().FullName}' \" +\n                    $\"is not a scalar of type '{typeof(T).GetType().FullName}'.\", ex);\n            }\n        }\n\n        /// <summary>\n        /// Write multi dimensional array\n        /// </summary>\n        /// <param name=\"matrix\"></param>\n        /// <param name=\"dim\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"builtInType\"></param>\n        private void WriteMatrix(Matrix matrix, int dim, ref int index,\n            BuiltInType builtInType)\n        {\n            var arrayLen = matrix.Dimensions[dim];\n            if (dim == matrix.Dimensions.Length - 1)\n            {\n                // Create a slice of values for the top dimension\n                var copy = Array.CreateInstance(\n                    matrix.Elements.GetType()!.GetElementType()!, arrayLen);\n                Array.Copy(matrix.Elements, index, copy, 0, arrayLen);\n                // Write slice as value rank\n                WriteVariantContents(copy, 1, builtInType);\n                index += arrayLen;\n            }\n            else\n            {\n                PushArray(null, arrayLen);\n                for (var i = 0; i < arrayLen; i++)\n                {\n                    WriteMatrix(matrix, dim + 1, ref index, builtInType);\n                }\n                PopArray();\n            }\n        }\n\n        /// <summary>\n        /// Write multi dimensional array in structure.\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"matrix\"></param>\n        /// <param name=\"dim\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"typeInfo\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void WriteStructureMatrix(string? fieldName,\n            Matrix matrix, int dim, ref int index, TypeInfo typeInfo)\n        {\n            // check the nesting level for avoiding a stack overflow.\n            if (_nestingLevel > Context.MaxEncodingNestingLevels)\n            {\n                throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"Maximum nesting level of {Context.MaxEncodingNestingLevels} was exceeded.\");\n            }\n\n            _nestingLevel++;\n\n            try\n            {\n                var arrayLen = matrix.Dimensions[dim];\n                if (dim == matrix.Dimensions.Length - 1)\n                {\n                    // Create a slice of values for the top dimension\n                    var copy = Array.CreateInstance(\n                        matrix.Elements.GetType()!.GetElementType()!, arrayLen);\n                    Array.Copy(matrix.Elements, index, copy, 0, arrayLen);\n                    // Write slice as value rank\n\n                    WriteVariantContents(copy, 1, typeInfo.BuiltInType);\n                    index += arrayLen;\n                }\n                else\n                {\n                    PushArray(fieldName, arrayLen);\n                    for (var i = 0; i < arrayLen; i++)\n                    {\n                        WriteStructureMatrix(null, matrix, dim + 1, ref index, typeInfo);\n                    }\n                    PopArray();\n                }\n            }\n            finally\n            {\n                _nestingLevel--;\n            }\n        }\n\n        /// <summary>\n        /// Write type\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <param name=\"type\"></param>\n        private void WriteBuiltInType(string? property, BuiltInType type)\n        {\n            if (UseAdvancedEncoding)\n            {\n                WriteString(property, type.ToString());\n            }\n            else\n            {\n                WriteByte(property, (byte)type);\n            }\n        }\n\n        /// <summary>\n        /// Writes namespace\n        /// </summary>\n        /// <param name=\"namespaceIndex\"></param>\n        private void WriteNamespaceIndex(ushort namespaceIndex)\n        {\n            if (namespaceIndex > 1)\n            {\n                var uri = Context.NamespaceUris.GetString(namespaceIndex);\n                if (!string.IsNullOrEmpty(uri))\n                {\n                    WriteString(\"Uri\", uri);\n                    return;\n                }\n            }\n            if (_namespaceMappings != null &&\n                _namespaceMappings.Length > namespaceIndex)\n            {\n                namespaceIndex = _namespaceMappings[namespaceIndex];\n            }\n            if (namespaceIndex != 0)\n            {\n                WriteUInt32(\"Index\", namespaceIndex);\n            }\n        }\n\n        /// <summary>\n        /// Encode an array according to its valueRank and BuiltInType\n        /// </summary>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"array\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        public void WriteArray(string fieldName, object array, int valueRank,\n            BuiltInType builtInType)\n        {\n            // write array.\n            if (valueRank == ValueRanks.OneDimension)\n            {\n                switch (builtInType)\n                {\n                    case BuiltInType.Boolean:\n                        WriteBooleanArray(fieldName, (bool[])array);\n                        return;\n                    case BuiltInType.SByte:\n                        WriteSByteArray(fieldName, (sbyte[])array);\n                        return;\n                    case BuiltInType.Byte:\n                        WriteByteArray(fieldName, (byte[])array);\n                        return;\n                    case BuiltInType.Int16:\n                        WriteInt16Array(fieldName, (short[])array);\n                        return;\n                    case BuiltInType.UInt16:\n                        WriteUInt16Array(fieldName, (ushort[])array);\n                        return;\n                    case BuiltInType.Int32:\n                        WriteInt32Array(fieldName, (int[])array);\n                        return;\n                    case BuiltInType.UInt32:\n                        WriteUInt32Array(fieldName, (uint[])array);\n                        return;\n                    case BuiltInType.Int64:\n                        WriteInt64Array(fieldName, (long[])array);\n                        return;\n                    case BuiltInType.UInt64:\n                        WriteUInt64Array(fieldName, (ulong[])array);\n                        return;\n                    case BuiltInType.Float:\n                        WriteFloatArray(fieldName, (float[])array);\n                        return;\n                    case BuiltInType.Double:\n                        WriteDoubleArray(fieldName, (double[])array);\n                        return;\n                    case BuiltInType.String:\n                        WriteStringArray(fieldName, (string[])array);\n                        return;\n                    case BuiltInType.DateTime:\n                        WriteDateTimeArray(fieldName, (DateTime[])array);\n                        return;\n                    case BuiltInType.Guid:\n                        WriteGuidArray(fieldName, (Uuid[])array);\n                        return;\n                    case BuiltInType.ByteString:\n                        WriteByteStringArray(fieldName, (byte[][])array);\n                        return;\n                    case BuiltInType.XmlElement:\n                        WriteXmlElementArray(fieldName, (XmlElement[])array);\n                        return;\n                    case BuiltInType.NodeId:\n                        WriteNodeIdArray(fieldName, (NodeId[])array);\n                        return;\n                    case BuiltInType.ExpandedNodeId:\n                        WriteExpandedNodeIdArray(fieldName, (ExpandedNodeId[])array);\n                        return;\n                    case BuiltInType.StatusCode:\n                        WriteStatusCodeArray(fieldName, (StatusCode[])array);\n                        return;\n                    case BuiltInType.QualifiedName:\n                        WriteQualifiedNameArray(fieldName, (QualifiedName[])array);\n                        return;\n                    case BuiltInType.LocalizedText:\n                        WriteLocalizedTextArray(fieldName, (LocalizedText[])array);\n                        return;\n                    case BuiltInType.ExtensionObject:\n                        WriteExtensionObjectArray(fieldName, (ExtensionObject[])array);\n                        return;\n                    case BuiltInType.DataValue:\n                        WriteDataValueArray(fieldName, (DataValue[])array);\n                        return;\n                    case BuiltInType.DiagnosticInfo:\n                        WriteDiagnosticInfoArray(fieldName, (DiagnosticInfo[])array);\n                        return;\n                    case BuiltInType.Enumeration:\n                        if (array is not Array enumArray)\n                        {\n                            throw new EncodingException(\n                                \"Unexpected non Array type encountered while encoding an array of enumeration.\");\n                        }\n                        var enumType = enumArray.GetType().GetElementType();\n                        Debug.Assert(enumType != null);\n                        WriteEnumeratedArray(fieldName, enumArray, enumType);\n                        return;\n                    // case BuiltInType.Variant:\n                    default:\n                        if (array is IEncodeable[] encodeables)\n                        {\n                            var elementType = array.GetType().GetElementType();\n                            if (elementType != null)\n                            {\n                                WriteEncodeableArray(fieldName, encodeables, elementType);\n                                return;\n                            }\n                        }\n                        switch (array)\n                        {\n                            case Variant[] variants:\n                                WriteVariantArray(fieldName, variants);\n                                return;\n                            case object[] objects:\n                                WriteObjectArray(fieldName, objects);\n                                return;\n                            case null:\n                                WriteObjectArray(fieldName, null);\n                                return;\n                        }\n                        throw new EncodingException(\"Unexpected type encountered \" +\n                            $\"while encoding an array of Variants: {array.GetType()}\");\n                }\n            }\n            // write matrix.\n            else if (valueRank > ValueRanks.OneDimension)\n            {\n                if (array is Matrix matrix)\n                {\n                    var index = 0;\n                    WriteStructureMatrix(fieldName, matrix, 0, ref index, matrix.TypeInfo);\n                    return;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Write array to stream\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"property\"></param>\n        /// <param name=\"values\"></param>\n        /// <param name=\"writer\"></param>\n        internal void WriteArray<T>(string? property, IList<T>? values,\n            Action<T> writer)\n        {\n            if (values == null)\n            {\n                WriteNull(property);\n            }\n            else\n            {\n                PushArray(property, values.Count);\n                foreach (var value in values)\n                {\n                    writer(value);\n                }\n                PopArray();\n            }\n        }\n\n        /// <inheritdoc/>\n        internal void WriteObject<T>(string? property, T value, Action<T> writer)\n            where T : class\n        {\n            if (value == null)\n            {\n                WriteNull(property);\n            }\n            else\n            {\n                PushObject(property);\n                writer(value);\n                PopObject();\n            }\n        }\n\n        /// <summary>\n        /// Write array to stream\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"property\"></param>\n        /// <param name=\"values\"></param>\n        /// <param name=\"writer\"></param>\n        private void WriteDictionary<T>(string? property,\n            IEnumerable<(string Key, T Value)>? values, Action<string, T> writer)\n        {\n            if (values == null)\n            {\n                WriteNull(property);\n            }\n            else\n            {\n                PushObject(property);\n                foreach (var (Key, Value) in values)\n                {\n                    writer(Key, Value);\n                }\n                PopObject();\n            }\n        }\n\n        /// <summary>\n        /// Check whether to write the simple value.  If so\n        /// andthis is not called in the context of array\n        /// write (property == null) write property.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"property\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns>true if should write value.</returns>\n        private bool PreWriteValue<T>(string? property, T value) where T : struct\n        {\n            if (!string.IsNullOrEmpty(property))\n            {\n                if (IgnoreDefaultValues && EqualityComparer<T>.Default.Equals(value, default))\n                {\n                    return false;\n                }\n                _writer?.WritePropertyName(property);\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Write null\n        /// </summary>\n        /// <param name=\"property\"></param>\n        private void WriteNull(string? property)\n        {\n            if (!string.IsNullOrEmpty(property))\n            {\n                if (IgnoreNullValues || IgnoreDefaultValues)\n                {\n                    // only skip null if not in array context.\n                    return;\n                }\n                _writer?.WritePropertyName(property);\n            }\n            _writer?.WriteNull();\n        }\n\n        /// <summary>\n        /// Push new object\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void PushObject(string? property)\n        {\n            if (_nestingLevel > Context.MaxEncodingNestingLevels)\n            {\n                throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"Maximum nesting level of {Context.MaxEncodingNestingLevels} was exceeded\");\n            }\n            if (!string.IsNullOrEmpty(property))\n            {\n                _writer?.WritePropertyName(property);\n            }\n            _writer?.WriteStartObject();\n            _nestingLevel++;\n        }\n\n        /// <summary>\n        /// Pop structure\n        /// </summary>\n        private void PopObject()\n        {\n            _writer?.WriteEndObject();\n            _nestingLevel--;\n        }\n\n        /// <summary>\n        /// Push new array\n        /// </summary>\n        /// <param name=\"property\"></param>\n        /// <param name=\"count\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void PushArray(string? property, int count)\n        {\n            if (Context.MaxArrayLength > 0 && Context.MaxArrayLength < count)\n            {\n                throw new EncodingException(StatusCodes.BadEncodingLimitsExceeded,\n                    $\"MaxArrayLength {Context.MaxArrayLength} < {count}.\");\n            }\n            if (!string.IsNullOrEmpty(property))\n            {\n                _writer?.WritePropertyName(property);\n            }\n            _writer?.WriteStartArray();\n        }\n\n        /// <summary>\n        /// Pop array\n        /// </summary>\n        private void PopArray()\n        {\n            _writer?.WriteEndArray();\n        }\n\n        private JsonWriter? _writer;\n        private readonly JsonEncoding _encoding;\n        private readonly Stack<string> _namespaces;\n        private ushort[]? _namespaceMappings;\n        private readonly bool _ownedWriter;\n        private uint _nestingLevel;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/JsonVariantEncoder.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Utils;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n\n    /// <summary>\n    /// Variant encoder implementation\n    /// </summary>\n    public sealed class JsonVariantEncoder : IVariantEncoder\n    {\n        /// <inheritdoc/>\n        public IServiceMessageContext Context { get; }\n\n        /// <summary>\n        /// Create encoder\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"serializer\"></param>\n        public JsonVariantEncoder(IServiceMessageContext context, IJsonSerializer serializer)\n        {\n            Context = context;\n            _serializer = serializer;\n        }\n\n        /// <inheritdoc/>\n        public VariantValue Encode(Variant? value, out BuiltInType builtinType)\n        {\n            if (value == null || value == Variant.Null)\n            {\n                builtinType = BuiltInType.Null;\n                return VariantValue.Null;\n            }\n            using var stream = new MemoryStream();\n            using (var encoder = new JsonEncoderEx(stream, Context)\n            {\n                UseAdvancedEncoding = true\n            })\n            {\n                encoder.WriteVariant(nameof(value), value.Value);\n            }\n            var token = _serializer.Parse(stream.ToArray());\n            Enum.TryParse((string?)token.GetByPath(\"value.Type\"),\n                true, out builtinType);\n            return token.GetByPath(\"value.Body\");\n        }\n\n        /// <inheritdoc/>\n        public Variant Decode(VariantValue value, BuiltInType builtinType)\n        {\n            if (value.IsNull())\n            {\n                return Variant.Null;\n            }\n\n            //\n            // Sanitize json input from user\n            //\n            value = Sanitize(value, builtinType == BuiltInType.String);\n\n            string json;\n            if (builtinType == BuiltInType.Null ||\n                (builtinType == BuiltInType.Variant &&\n                    value.IsObject))\n            {\n                //\n                // Let the decoder try and decode the json variant.\n                //\n                json = _serializer.SerializeToString(new { value });\n            }\n            else\n            {\n                //\n                // Give decoder a hint as to the type to use to decode.\n                //\n                json = _serializer.SerializeToString(new\n                {\n                    value = new\n                    {\n                        Body = value,\n                        Type = (byte)builtinType\n                    }\n                });\n            }\n\n            //\n            // Decode json to a real variant\n            //\n            using var text = new StringReader(json);\n            using var reader = new Newtonsoft.Json.JsonTextReader(text);\n            using var decoder = new JsonDecoderEx(reader, Context);\n            return decoder.ReadVariant(nameof(value));\n        }\n\n        /// <summary>\n        /// Sanitizes user input by removing quotes around non strings,\n        /// or adding array brackets to comma seperated values that are\n        /// not string type and recursing through arrays to do the same.\n        /// The output is a pure json token that can be passed to the\n        /// json decoder.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"isString\"></param>\n        /// <returns></returns>\n        internal VariantValue Sanitize(VariantValue value, bool isString)\n        {\n            if (value.IsNull())\n            {\n                return value;\n            }\n\n            if (!value.TryGetString(out var asString, true, CultureInfo.InvariantCulture))\n            {\n                asString = _serializer.SerializeToString(value);\n            }\n\n            if (!value.IsObject && !value.IsListOfValues && !value.IsString)\n            {\n                //\n                // If this should be a string - return as such\n                //\n                return isString ? asString : value;\n            }\n\n            if (string.IsNullOrWhiteSpace(asString))\n            {\n                return value;\n            }\n\n            //\n            // Try to parse string as json\n            //\n            if (!value.IsString)\n            {\n                asString = asString.Replace(\"\\\\\\\"\", \"\\\"\", StringComparison.Ordinal);\n            }\n            var token = Try.Op(() => _serializer.Parse(asString));\n            if (token is not null)\n            {\n                value = token;\n            }\n\n            if (value.IsString)\n            {\n                //\n                // try to split the string as comma seperated list\n                //\n                var elements = asString.Split(',');\n                if (isString)\n                {\n                    //\n                    // If all elements are quoted, then this is a\n                    // string array\n                    //\n                    if (elements.Length > 1)\n                    {\n                        var array = new List<string>();\n                        foreach (var element in elements)\n                        {\n                            var trimmed = element.Trim().TrimQuotes();\n                            if (trimmed == element)\n                            {\n                                // Treat entire string as value\n                                return value;\n                            }\n                            array.Add(trimmed);\n                        }\n                        // No need to sanitize contents\n                        return _serializer.FromObject(array);\n                    }\n                }\n                else\n                {\n                    //\n                    // First trim any quotes from string before splitting.\n                    //\n                    if (elements.Length > 1)\n                    {\n                        //\n                        // Parse as array\n                        //\n                        var trimmed = elements.Select(e => e.TrimQuotes()).ToArray();\n                        try\n                        {\n                            value = _serializer.Parse(\n                                \"[\" + trimmed.Aggregate((x, y) => x + \",\" + y) + \"]\");\n                        }\n                        catch\n                        {\n                            value = _serializer.Parse(\n                                \"[\\\"\" + trimmed.Aggregate((x, y) => x + \"\\\",\\\"\" + y) + \"\\\"]\");\n                        }\n                    }\n                    else\n                    {\n                        //\n                        // Try to remove next layer of quotes and try again.\n                        //\n                        var trimmed = asString.Trim().TrimQuotes();\n                        if (trimmed != asString)\n                        {\n                            return Sanitize(trimmed, isString);\n                        }\n                    }\n                }\n            }\n\n            if (value.IsListOfValues)\n            {\n                //\n                // Sanitize each element accordingly\n                //\n                return _serializer.FromObject(value.Values\n                    .Select(t => Sanitize(t, isString)));\n            }\n            return value;\n        }\n\n        private readonly IJsonSerializer _serializer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/MessageSchemaTypes.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    /// <summary>\n    /// Publisher related message schemas\n    /// </summary>\n    public static class MessageSchemaTypes\n    {\n        /// <summary>\n        /// Monitored item message\n        /// </summary>\n        public const string MonitoredItemMessageJson =\n            \"application/x-monitored-item-json-v1\";\n\n        /// <summary>\n        /// Json network message\n        /// </summary>\n        public const string NetworkMessageJson =\n            \"application/x-network-message-json-v1\";\n\n        /// <summary>\n        /// Uadp network message\n        /// </summary>\n        public const string NetworkMessageUadp =\n            \"application/x-network-message-uadp-v1\";\n\n        /// <summary>\n        /// Avro network message\n        /// </summary>\n        public const string NetworkMessageAvro =\n            \"application/x-network-message-avro-v0\";\n\n        /// <summary>\n        /// Message contains discovery events\n        /// </summary>\n        public const string DiscoveryEvents =\n            \"application/x-discovery-event-v2-json\";\n\n        /// <summary>\n        /// Message contains discovery progress messages\n        /// </summary>\n        public const string DiscoveryMessage =\n            \"application/x-discovery-message-v2-json\";\n\n        /// <summary>\n        /// Runtime state message\n        /// </summary>\n        public const string RuntimeStateMessage =\n            \"application/x-runtimestate-message-v2-json\";\n\n        /// <summary>\n        /// Writer group diagnostics message\n        /// </summary>\n        public const string WriterGroupDiagnosticsMessage =\n            \"application/x-writergroup-diagnostics-message-v2-json\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Models/DataSet.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Models\n{\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Encodable dataset message payload\n    /// </summary>\n    public class DataSet\n    {\n        /// <summary>\n        /// Field mask\n        /// </summary>\n        public DataSetFieldContentFlags DataSetFieldContentMask { get; set; }\n\n        /// <summary>\n        /// Entries\n        /// </summary>\n        public IReadOnlyList<(string Name, DataValue? Value)> DataSetFields { get; }\n\n        /// <summary>\n        /// Create payload\n        /// </summary>\n        /// <param name=\"values\"></param>\n        /// <param name=\"fieldContentMask\"></param>\n        public DataSet(IDictionary<string, DataValue?> values,\n            DataSetFieldContentFlags? fieldContentMask = null)\n            : this(fieldContentMask)\n        {\n            DataSetFields = values.Select(kv => (kv.Key, kv.Value)).ToList();\n        }\n\n        /// <summary>\n        /// Create payload\n        /// </summary>\n        /// <param name=\"values\"></param>\n        /// <param name=\"fieldContentMask\"></param>\n        public DataSet(IReadOnlyList<(string, DataValue?)> values,\n            DataSetFieldContentFlags? fieldContentMask)\n            : this(fieldContentMask)\n        {\n            DataSetFields = values;\n        }\n\n        /// <summary>\n        /// Create payload\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"fieldContentMask\"></param>\n        public DataSet(string field, DataValue? value,\n            DataSetFieldContentFlags? fieldContentMask)\n            : this(fieldContentMask)\n        {\n            DataSetFields = new[] { (field, value) };\n        }\n\n        /// <summary>\n        /// Create default dataset\n        /// </summary>\n        /// <param name=\"fieldContentMask\"></param>\n        public DataSet(DataSetFieldContentFlags? fieldContentMask = null)\n        {\n            DataSetFieldContentMask = fieldContentMask ??\n                PubSubMessage.DefaultDataSetFieldContentFlags;\n            DataSetFields = Array.Empty<(string, DataValue?)>();\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (obj is not DataSet set)\n            {\n                return false;\n            }\n            if (!DataSetFields.SequenceEqualsSafe(set.DataSetFields,\n                (x, y) => x.Name == y.Name &&\n                    Utils.IsEqual(x.Value?.Value, y.Value?.Value)))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return HashCode.Combine(DataSetFields.Select(s => s.Name));\n        }\n\n        /// <summary>\n        /// Remove field from dataset\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <returns></returns>\n        internal DataSet Remove(string field)\n        {\n            return new DataSet(DataSetFields\n                .Where(b => b.Name != field)\n                .ToList(), DataSetFieldContentMask);\n        }\n\n        /// <summary>\n        /// Set field from dataset to different value\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        internal DataSet Set(string field, DataValue? value)\n        {\n            return new DataSet(DataSetFields\n                .Select(b => (b.Name, b.Name == field ? value : b.Value))\n                .ToList(), DataSetFieldContentMask);\n        }\n\n        /// <summary>\n        /// Set field from dataset to different value\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"additionalFlags\"></param>\n        /// <returns></returns>\n        internal DataSet Add(string field, DataValue? value,\n            DataSetFieldContentFlags? additionalFlags = null)\n        {\n            var fieldContentMask = DataSetFieldContentMask;\n            if (additionalFlags.HasValue)\n            {\n                fieldContentMask |= additionalFlags.Value;\n            }\n            return new DataSet(DataSetFields\n                .Append((field, value))\n                .ToList(), fieldContentMask);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Models/EncodeableDictionary.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Models\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Encodeable dictionary carrying field names and values\n    /// </summary>\n    public class EncodeableDictionary : List<KeyDataValuePair>, IEncodeable, IJsonEncodeable\n    {\n        /// <inheritdoc/>\n        public ExpandedNodeId TypeId =>\n            \"s=\" + nameof(EncodeableDictionary);\n\n        /// <inheritdoc/>\n        public ExpandedNodeId BinaryEncodingId =>\n            \"s=\" + nameof(EncodeableDictionary) + \"_Encoding_DefaultBinary\";\n\n        /// <inheritdoc/>\n        public ExpandedNodeId XmlEncodingId =>\n            \"s=\" + nameof(EncodeableDictionary) + \"_Encoding_DefaultXml\";\n\n        /// <inheritdoc/>\n        public ExpandedNodeId JsonEncodingId =>\n            \"s=\" + nameof(EncodeableDictionary) + \"_Encoding_DefaultJson\";\n\n        /// <summary>\n        /// Initializes the dictionary with default values.\n        /// </summary>\n        public EncodeableDictionary() { }\n\n        /// <summary>\n        /// Initializes the dictionary with an initial capacity.\n        /// </summary>\n        /// <param name=\"capacity\"></param>\n        public EncodeableDictionary(int capacity)\n            : base(capacity)\n        {\n        }\n\n        /// <summary>\n        /// Initializes the dictionary with another collection.\n        /// </summary>\n        /// <param name=\"collection\"></param>\n        public EncodeableDictionary(IEnumerable<KeyDataValuePair> collection)\n            : base(collection)\n        {\n        }\n\n        /// <inheritdoc/>\n        public virtual void Encode(IEncoder encoder)\n        {\n            // Get valid dictionary for encoding.\n            var dictionary = this\n                .Where(x => !string.IsNullOrEmpty(x.Key) &&\n                    x.Value?.Value != null &&\n                    (x.Value.Value is not LocalizedText lt ||\n                      lt.Locale != null || lt.Text != null))\n                .ToDictionary(x => x.Key, x => x.Value);\n\n            foreach (var keyValuePair in dictionary)\n            {\n                encoder.WriteDataValue(keyValuePair.Key, keyValuePair.Value);\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual void Decode(IDecoder decoder)\n        {\n            // Only JSON decoder that can decode a dictionary is supported.\n            if (decoder is not JsonDecoderEx jsonDecoder)\n            {\n                throw new FormatException(\n                    $\"Cannot decode using the decoder: {decoder.GetType()}.\");\n            }\n            var dataSet = jsonDecoder.ReadDataSet(null);\n            if (dataSet != null)\n            {\n                foreach (var (Name, Value) in dataSet.DataSetFields)\n                {\n                    Add(new KeyDataValuePair\n                    {\n                        Key = Name,\n                        Value = Value\n                    });\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (this == encodeable)\n            {\n                return true;\n            }\n            if (encodeable is not EncodeableDictionary encodableDictionary)\n            {\n                return false;\n            }\n            if (!Utils.IsEqual(this, encodableDictionary))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public object Clone()\n        {\n            return new EncodeableDictionary(this);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Models/EncodeableJToken.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Models\n{\n    using Newtonsoft.Json.Linq;\n    using Opc.Ua;\n    using System;\n\n    /// <summary>\n    /// Encodeable wrapper for Json tokens\n    /// </summary>\n    public sealed class EncodeableJToken : IEncodeable, IJsonEncodeable\n    {\n        /// <summary>\n        /// The encoded object\n        /// </summary>\n        public JToken JToken { get; private set; }\n\n        /// <summary>\n        /// Create encodeable token\n        /// </summary>\n        /// <param name=\"jToken\"></param>\n        /// <param name=\"typeId\"></param>\n        public EncodeableJToken(JToken jToken, ExpandedNodeId typeId)\n        {\n            JToken = jToken ?? throw new ArgumentNullException(nameof(jToken));\n            TypeId = typeId;\n        }\n\n        /// <inheritdoc/>\n        public ExpandedNodeId TypeId { get; private set; }\n\n        /// <inheritdoc/>\n        public ExpandedNodeId JsonEncodingId =>\n            \"s=\" + nameof(EncodeableJToken) + \"_Encoding_DefaultJson\";\n\n        /// <inheritdoc/>\n        public ExpandedNodeId BinaryEncodingId =>\n            \"s=\" + nameof(EncodeableJToken) + \"_Encoding_DefaultBinary\";\n\n        /// <inheritdoc/>\n        public ExpandedNodeId XmlEncodingId =>\n            \"s=\" + nameof(EncodeableJToken) + \"_Encoding_DefaultXml\";\n\n        /// <inheritdoc/>\n        public void Decode(IDecoder decoder)\n        {\n            TypeId = decoder.ReadExpandedNodeId(nameof(TypeId));\n            JToken = JToken.Parse(decoder.ReadString(nameof(JToken)));\n        }\n\n        /// <inheritdoc/>\n        public void Encode(IEncoder encoder)\n        {\n            encoder.WriteExpandedNodeId(nameof(TypeId), TypeId);\n            encoder.WriteString(nameof(JToken), JToken.ToString());\n        }\n\n        /// <inheritdoc/>\n        public bool IsEqual(IEncodeable encodeable)\n        {\n            if (encodeable is EncodeableJToken wrapper)\n            {\n                return TypeId == wrapper.TypeId &&\n                    JToken.EqualityComparer.Equals(wrapper.JToken, JToken);\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public object Clone()\n        {\n            return new EncodeableJToken(JToken, TypeId);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Models/EncodeableVariantValue.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Models\n{\n    using Furly.Extensions.Serializers;\n    using Opc.Ua;\n    using System;\n\n    /// <summary>\n    /// Encodeable wrapper for Json tokens\n    /// </summary>\n    public sealed class EncodeableVariantValue : IEncodeable, IJsonEncodeable\n    {\n        /// <summary>\n        /// The encoded object\n        /// </summary>\n        public VariantValue Value { get; private set; }\n\n        /// <summary>\n        /// Create encodeable token\n        /// </summary>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"value\"></param>\n        public EncodeableVariantValue(IJsonSerializer serializer, VariantValue? value = null)\n        {\n            _serializer = serializer ?? throw new ArgumentNullException(nameof(serializer));\n            Value = value ?? VariantValue.Null;\n        }\n\n        /// <inheritdoc/>\n        public ExpandedNodeId TypeId =>\n            \"s=\" + nameof(EncodeableVariantValue);\n\n        /// <inheritdoc/>\n        public ExpandedNodeId BinaryEncodingId =>\n            \"s=\" + nameof(EncodeableVariantValue) + \"_Encoding_DefaultBinary\";\n\n        /// <inheritdoc/>\n        public ExpandedNodeId XmlEncodingId =>\n            \"s=\" + nameof(EncodeableVariantValue) + \"_Encoding_DefaultXml\";\n\n        /// <inheritdoc/>\n        public ExpandedNodeId JsonEncodingId =>\n            \"s=\" + nameof(EncodeableVariantValue) + \"_Encoding_DefaultJson\";\n\n        /// <inheritdoc/>\n        public void Decode(IDecoder decoder)\n        {\n            Value = _serializer.Parse(decoder.ReadString(nameof(Value)));\n        }\n\n        /// <inheritdoc/>\n        public void Encode(IEncoder encoder)\n        {\n            encoder.WriteString(nameof(Value), _serializer.SerializeToString(Value));\n        }\n\n        /// <inheritdoc/>\n        public bool IsEqual(IEncodeable encodeable)\n        {\n            if (encodeable is EncodeableVariantValue wrapper)\n            {\n                return wrapper.Value == Value;\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public object Clone()\n        {\n            return new EncodeableVariantValue(_serializer, Value);\n        }\n\n        private readonly IJsonSerializer _serializer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Models/KeyDataValuePair.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Models\n{\n    using Opc.Ua;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Encodable Key DataValue Pair\n    /// </summary>\n    public class KeyDataValuePair : IEncodeable, IJsonEncodeable\n    {\n        /// <summary>\n        /// Constructor only to be used when deserializing.\n        /// </summary>\n        public KeyDataValuePair() : this(string.Empty, null)\n        {\n        }\n\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        /// <param name=\"key\"></param>\n        /// <param name=\"value\"></param>\n        public KeyDataValuePair(string key, DataValue? value)\n        {\n            Key = key;\n            Value = value;\n        }\n\n        /// <summary>\n        /// Key\n        /// </summary>\n        [DataMember(Name = \"Key\", IsRequired = true, Order = 1)]\n        public string Key { get; set; }\n\n        /// <summary>\n        /// Value\n        /// </summary>\n        [DataMember(Name = \"Value\", IsRequired = true, Order = 2)]\n        public DataValue? Value { get; set; }\n\n        /// <inheritdoc/>\n        public virtual ExpandedNodeId? TypeId { get; }\n\n        /// <inheritdoc/>\n        public virtual ExpandedNodeId? BinaryEncodingId { get; }\n\n        /// <inheritdoc/>\n        public virtual ExpandedNodeId? XmlEncodingId { get; }\n\n        /// <inheritdoc/>\n        public virtual ExpandedNodeId? JsonEncodingId { get; }\n\n        /// <inheritdoc/>\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.WriteString(\"Key\", Key);\n            encoder.WriteDataValue(Key, Value);\n        }\n\n        /// <inheritdoc/>\n        public virtual void Decode(IDecoder decoder)\n        {\n            Key = decoder.ReadString(\"Key\");\n            Value = decoder.ReadDataValue(Key);\n        }\n\n        /// <inheritdoc/>\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n            if (encodeable is not KeyDataValuePair value)\n            {\n                return false;\n            }\n            if (!Utils.IsEqual(Key, value.Key))\n            {\n                return false;\n            }\n            if (!Utils.IsEqual(Value, value.Value))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public object Clone()\n        {\n            var clone = (KeyDataValuePair)MemberwiseClone();\n            clone.Key = Utils.Clone(Key);\n            clone.Value = Utils.Clone(Value);\n            return clone;\n        }\n    }\n\n    /// <summary>\n    /// A collection of KeyDataValuePair objects.\n    /// </summary>\n    public class KeyDataValuePairCollection : List<KeyDataValuePair>\n    {\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public KeyDataValuePairCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        /// <param name=\"capacity\"></param>\n        public KeyDataValuePairCollection(int capacity)\n            : base(capacity)\n        {\n        }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        /// <param name=\"collection\"></param>\n        public KeyDataValuePairCollection(IEnumerable<KeyDataValuePair> collection)\n            : base(collection)\n        {\n        }\n\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        /// <param name=\"values\"></param>\n        public static implicit operator KeyDataValuePairCollection(KeyDataValuePair[] values)\n        {\n            if (values != null)\n            {\n                return new KeyDataValuePairCollection(values);\n            }\n            return [];\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        /// <param name=\"values\"></param>\n        public static explicit operator KeyDataValuePair[]?(KeyDataValuePairCollection values)\n        {\n            if (values != null)\n            {\n                return [.. values];\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public new object MemberwiseClone()\n        {\n            var clone = new KeyDataValuePairCollection(Count);\n            for (var ii = 0; ii < Count; ii++)\n            {\n                clone.Add((KeyDataValuePair)Utils.Clone(this[ii]));\n            }\n            return clone;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/AvroDataSetMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Avro;\n    using System;\n    using System.Linq;\n\n    /// <summary>\n    /// Avro binary data set message\n    /// </summary>\n    public class AvroDataSetMessage : BaseDataSetMessage\n    {\n        /// <summary>\n        /// Dataset writer name\n        /// </summary>\n        public string? DataSetWriterName { get; set; }\n\n        /// <summary>\n        /// Dataset name\n        /// </summary>\n        public string? DataSetName { get; set; }\n\n        /// <summary>\n        /// Dataset header\n        /// </summary>\n        internal bool WithDataSetHeader { get; set; }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not AvroDataSetMessage wrapper)\n            {\n                return false;\n            }\n            if (!base.Equals(obj))\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterName, DataSetWriterName))\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.DataSetName, DataSetName))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(base.GetHashCode());\n            hash.Add(DataSetWriterName);\n            return hash.ToHashCode();\n        }\n\n        /// <inheritdoc/>\n        internal virtual void Encode(BaseAvroEncoder encoder, bool withDataSetHeader)\n        {\n            WithDataSetHeader = withDataSetHeader;\n\n            //\n            // Messages can be either written in the context of an array\n            // or as a single message or as one of a union of possible\n            // messages. Only if we are in a union we need to write the\n            // union index. Also, we need to get the type name from the\n            // schema so that we can properly validate we are writing the\n            // type. This can be optimized in the future.\n            //\n            var typeName = DataSetName ?? nameof(AvroDataSetMessage);\n            if (encoder is AvroEncoder schemas)\n            {\n                var currentSchema = schemas.Current;\n                if (currentSchema is ArraySchema arr)\n                {\n                    // Writing an array of messages\n                    currentSchema = arr.ItemSchema;\n                }\n                if (currentSchema is UnionSchema u)\n                {\n                    if (DataSetWriterId < u.Count)\n                    {\n                        typeName = u[DataSetWriterId].Name;\n                    }\n\n                    encoder.WriteUnion(null, DataSetWriterId,\n                        _ => Encode(typeName));\n                }\n                else\n                {\n                    Encode(currentSchema.Name);\n                }\n            }\n            else\n            {\n                Encode(typeName);\n            }\n\n            void Encode(string typeName)\n            {\n                if (!WithDataSetHeader)\n                {\n                    // If no header, write payload record directly\n                    encoder.WriteDataSet(null, Payload);\n                    return;\n                }\n\n                // If header, write data set message\n                encoder.WriteObject(null, typeName, () =>\n                {\n                    WriteDataSetMessageHeader(encoder);\n                    // Write payload\n                    encoder.WriteDataSet(nameof(Payload), Payload);\n                });\n            }\n        }\n\n        /// <inheritdoc/>\n        internal virtual bool TryDecode(AvroDecoder decoder, bool withDataSetHeader)\n        {\n            // Reset content\n            DataSetMessageContentMask = 0;\n            MessageType = MessageType.KeyFrame;\n            DataSetWriterId = 0;\n            DataSetWriterName = null;\n            SequenceNumber = 0;\n            MetaDataVersion = null;\n            Timestamp = DateTimeOffset.MinValue;\n            WithDataSetHeader = withDataSetHeader;\n\n            //\n            // Messages can be either written in the context of an array\n            // or as a single message or as one of a union of possible\n            // messages. Only if we are in a union we need to write the\n            // union index. Also, we need to get the type name from the\n            // schema so that we can properly validate we are writing the\n            // type. This can be optimized in the future.\n            //\n            var current = decoder.Current;\n            if (current is ArraySchema arr)\n            {\n                // Reading in the context of an array schema\n                current = arr.ItemSchema;\n            }\n            if (current is UnionSchema union)\n            {\n                return decoder.ReadUnion(null, unionId =>\n                {\n                    DataSetWriterId = (ushort)unionId;\n                    if (!TryDecodeWithHeader())\n                    {\n                        return TryDecodeAsDataSet();\n                    }\n                    return true;\n                });\n            }\n\n            if (!TryDecodeWithHeader())\n            {\n                return TryDecodeAsDataSet();\n            }\n            return true;\n\n            bool TryDecodeAsDataSet()\n            {\n                // Fall back to read the current schema as data set\n                WithDataSetHeader = false;\n                Payload = decoder.ReadDataSet(null);\n                return true;\n            }\n\n            bool TryDecodeWithHeader()\n            {\n                return decoder.ReadObject(null, schema =>\n                {\n                    if (schema is not RecordSchema recordSchema)\n                    {\n                        return false;\n                    }\n\n                    // Try first to read the object with header\n                    if (recordSchema.Fields.Count > 0 &&\n                        recordSchema.Fields[0].Name == nameof(MessageType))\n                    {\n                        WithDataSetHeader = true;\n                        DataSetName = recordSchema.Name;\n                        if (DataSetName == nameof(AvroDataSetMessage))\n                        {\n                            DataSetName = null;\n                        }\n                        if (!TryReadDataSetMessageHeader(decoder))\n                        {\n                            return false;\n                        }\n                        // Read payload\n                        Payload = decoder.ReadDataSet(nameof(Payload));\n                        return true;\n                    }\n\n                    return false;\n                });\n            }\n        }\n\n        /// <summary>\n        /// Write data set message header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        private void WriteDataSetMessageHeader(BaseAvroEncoder encoder)\n        {\n            switch (MessageType)\n            {\n                case MessageType.KeyFrame:\n                    encoder.WriteString(nameof(MessageType), \"ua-keyframe\");\n                    break;\n                case MessageType.Event:\n                    encoder.WriteString(nameof(MessageType), \"ua-event\");\n                    break;\n                case MessageType.KeepAlive:\n                    encoder.WriteString(nameof(MessageType), \"ua-keepalive\");\n                    break;\n                case MessageType.Condition:\n                    encoder.WriteString(nameof(MessageType), \"ua-condition\");\n                    break;\n                case MessageType.DeltaFrame:\n                    encoder.WriteString(nameof(MessageType), \"ua-deltaframe\");\n                    break;\n            }\n\n            encoder.WriteString(nameof(DataSetWriterName), DataSetWriterName);\n            encoder.WriteUInt16(nameof(DataSetWriterId), DataSetWriterId); // Do we need this?\n            encoder.WriteUInt32(nameof(SequenceNumber), SequenceNumber);\n            encoder.WriteEncodeable(nameof(MetaDataVersion), MetaDataVersion,\n                typeof(Opc.Ua.ConfigurationVersionDataType));\n            encoder.WriteDateTime(nameof(Timestamp), Timestamp?.UtcDateTime ?? default);\n\n            var status = Status ?? Payload.DataSetFields\n                .FirstOrDefault(s => Opc.Ua.StatusCode.IsNotGood(\n                    s.Value?.StatusCode ?? Opc.Ua.StatusCodes.BadNoData)).Value?.StatusCode\n                        ?? Opc.Ua.StatusCodes.Good;\n            encoder.WriteStatusCode(nameof(Status), status);\n        }\n\n        /// <summary>\n        /// Read the data set message header\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <returns></returns>\n        private bool TryReadDataSetMessageHeader(AvroDecoder decoder)\n        {\n            var messageType = decoder.ReadString(nameof(MessageType));\n            if (messageType != null)\n            {\n                if (messageType.Equals(\"ua-deltaframe\", StringComparison.Ordinal))\n                {\n                    MessageType = MessageType.DeltaFrame;\n                }\n                else if (messageType.Equals(\"ua-event\", StringComparison.Ordinal))\n                {\n                    MessageType = MessageType.Event;\n                }\n                else if (messageType.Equals(\"ua-keepalive\", StringComparison.Ordinal))\n                {\n                    MessageType = MessageType.KeepAlive;\n                }\n                else if (messageType.Equals(\"ua-condition\", StringComparison.Ordinal))\n                {\n                    MessageType = MessageType.Condition;\n                }\n                else if (messageType.Equals(\"ua-keyframe\", StringComparison.Ordinal))\n                {\n                    MessageType = MessageType.KeyFrame;\n                }\n                else\n                {\n                    // Continue and treat this as payload.\n                    return false;\n                }\n            }\n            DataSetWriterName = decoder.ReadString(nameof(DataSetWriterName));\n            DataSetWriterId = decoder.ReadUInt16(nameof(DataSetWriterId));// Do we need this?\n            SequenceNumber = decoder.ReadUInt32(nameof(SequenceNumber));\n            MetaDataVersion = (Opc.Ua.ConfigurationVersionDataType?)decoder.ReadEncodeable(\n                    nameof(MetaDataVersion), typeof(Opc.Ua.ConfigurationVersionDataType));\n            Timestamp = decoder.ReadDateTime(nameof(Timestamp));\n            Status = decoder.ReadStatusCode(nameof(Status));\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/AvroNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Avro;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Linq;\n    using System.Text;\n\n    /// <summary>\n    /// Avro Network message\n    /// </summary>\n    public class AvroNetworkMessage : BaseNetworkMessage\n    {\n        /// <inheritdoc/>\n        public override string MessageSchema =>\n            MessageSchemaTypes.NetworkMessageAvro;\n\n        /// <inheritdoc/>\n        public override string ContentType => UseGzipCompression ?\n            Encoders.ContentType.AvroGzip : Encoders.ContentType.Avro;\n\n        /// <inheritdoc/>\n        public override string ContentEncoding => Encoding.UTF8.WebName;\n\n        /// <summary>\n        /// Ua data message type\n        /// </summary>\n        public const string MessageTypeUaData = \"ua-data\";\n\n        /// <summary>\n        /// Message schema\n        /// </summary>\n        public Schema? Schema { get; set; }\n\n        /// <summary>\n        /// Message id\n        /// </summary>\n        public Func<string> MessageId { get; set; } =\n            () => Guid.NewGuid().ToString();\n\n        /// <summary>\n        /// Message type\n        /// </summary>\n        internal string MessageType { get; set; } = MessageTypeUaData;\n\n        /// <summary>\n        /// Get flag that indicates if message has network message header\n        /// </summary>\n        public bool HasNetworkMessageHeader\n            => (NetworkMessageContentMask & NetworkMessageContentFlags.NetworkMessageHeader) != 0;\n\n        /// <summary>\n        /// Flag that indicates if the Network message contains a single dataset message\n        /// </summary>\n        public bool HasSingleDataSetMessage\n            => (NetworkMessageContentMask & NetworkMessageContentFlags.SingleDataSetMessage) != 0;\n\n        /// <summary>\n        /// Flag that indicates if the Network message dataSets have header\n        /// </summary>\n        public bool HasDataSetMessageHeader\n            => (NetworkMessageContentMask & NetworkMessageContentFlags.DataSetMessageHeader) != 0;\n\n        /// <summary>\n        /// Use gzip compression\n        /// </summary>\n        public bool UseGzipCompression { get; set; }\n\n        /// <summary>\n        /// Setting to generate concise schemas during encoding\n        /// </summary>\n        internal bool EmitConciseSchema { get; set; }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not AvroNetworkMessage wrapper)\n            {\n                return false;\n            }\n            if (!base.Equals(obj))\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.MessageId(), MessageId()) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterGroup, DataSetWriterGroup))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(base.GetHashCode());\n            hash.Add(MessageId);\n            hash.Add(DataSetWriterGroup);\n            return hash.ToHashCode();\n        }\n\n        /// <inheritdoc/>\n        public override bool TryDecode(Opc.Ua.IServiceMessageContext context, Stream stream,\n            IDataSetMetaDataResolver? resolver)\n        {\n            if (Schema == null)\n            {\n                return false;\n            }\n            var compression = UseGzipCompression ?\n                new GZipStream(stream, CompressionMode.Decompress, leaveOpen: true) : null;\n            try\n            {\n                using var decoder = new AvroDecoder((Stream?)compression ?? stream,\n                    Schema, context, true);\n\n                return TryReadNetworkMessage(decoder);\n            }\n            finally\n            {\n                compression?.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public override bool TryDecode(Opc.Ua.IServiceMessageContext context,\n            Queue<ReadOnlySequence<byte>> reader, IDataSetMetaDataResolver? resolver)\n        {\n            // Decodes a single buffer\n            if (Schema == null)\n            {\n                return false;\n            }\n            if (reader.TryPeek(out var buffer))\n            {\n                using var memoryStream = buffer.IsSingleSegment ?\n                    Memory.GetStream(buffer.FirstSpan) :\n                    Memory.GetStream(buffer.ToArray());\n                var compression = UseGzipCompression ?\n                    new GZipStream(memoryStream, CompressionMode.Decompress, leaveOpen: true) : null;\n                try\n                {\n                    using var decoder = new AvroDecoder((Stream?)compression ?? memoryStream,\n                        Schema, context);\n\n                    if (!TryReadNetworkMessage(decoder) ||\n                        memoryStream.Position != memoryStream.Length)\n                    {\n                        return false;\n                    }\n\n                    // Complete the buffer\n                    reader.Dequeue();\n                    return true;\n                }\n                finally\n                {\n                    compression?.Dispose();\n                }\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public override IReadOnlyList<ReadOnlySequence<byte>> Encode(\n            Opc.Ua.IServiceMessageContext context,\n            int maxChunkSize, IDataSetMetaDataResolver? resolver = null)\n        {\n            var chunks = new List<ReadOnlySequence<byte>>();\n            var messages = Messages.OfType<AvroDataSetMessage>().ToArray().AsSpan();\n            var messageId = MessageId;\n            try\n            {\n                if (HasSingleDataSetMessage)\n                {\n                    for (var i = 0; i < messages.Length; i++)\n                    {\n                        EncodeMessages(messages.Slice(i, 1));\n                    }\n                }\n                else\n                {\n                    EncodeMessages(messages);\n                }\n            }\n            finally\n            {\n                MessageId = messageId;\n            }\n            return chunks;\n\n            void EncodeMessages(Span<AvroDataSetMessage> messages)\n            {\n                ReadOnlySequence<byte> messageBuffer;\n                using (var memoryStream = Memory.GetStream())\n                {\n                    var compression = UseGzipCompression ?\n                        new GZipStream(memoryStream,\n                        CompressionLevel.Optimal, leaveOpen: true) : null;\n                    try\n                    {\n                        var stream = (Stream?)compression ?? memoryStream;\n                        if (Schema == null)\n                        {\n                            using var encoder = new AvroSchemaBuilder(stream, context,\n                                emitConciseSchemas: EmitConciseSchema);\n                            WriteMessages(encoder, messages);\n                            Schema = encoder.Schema;\n                        }\n                        else\n                        {\n                            using var encoder = new AvroEncoder(stream, Schema, context);\n                            WriteMessages(encoder, messages);\n                        }\n                    }\n                    finally\n                    {\n                        compression?.Dispose();\n                    }\n\n                    messageBuffer = memoryStream.GetReadOnlySequence();\n\n                    // TODO: instead of copy using ToArray we shall include the\n                    // stream with the message and dispose it later when it is\n                    // consumed.\n                    messageBuffer = new ReadOnlySequence<byte>(messageBuffer.ToArray());\n                }\n\n                if (messageBuffer.Length < maxChunkSize)\n                {\n                    chunks.Add(messageBuffer);\n                }\n                else if (messages.Length == 1)\n                {\n                    chunks.Add(default);\n                }\n                else\n                {\n                    // Split\n                    var len = messages.Length / 2;\n                    var first = messages[..len];\n                    var second = messages[len..];\n\n                    EncodeMessages(first);\n                    EncodeMessages(second);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Write message span\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"messages\"></param>\n        private void WriteMessages(BaseAvroEncoder encoder, Span<AvroDataSetMessage> messages)\n        {\n            var messagesToInclude = messages.ToArray();\n            WriteNetworkMessage(encoder, messagesToInclude);\n        }\n\n        /// <summary>\n        /// Try decode\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <returns></returns>\n        private bool TryReadNetworkMessage(AvroDecoder decoder)\n        {\n            // Reset\n            DataSetWriterGroup = null;\n            DataSetClassId = default;\n            NetworkMessageContentMask = NetworkMessageContentFlags.DataSetMessageHeader;\n            MessageId = () => Guid.NewGuid().ToString();\n            PublisherId = null;\n            Messages.Clear();\n\n            var current = decoder.Current;\n            var result = decoder.ReadObject(null, schema =>\n            {\n                if (schema is not RecordSchema recordSchema)\n                {\n                    // Should always be a record at the start\n                    return (bool?)null;\n                }\n\n                if (recordSchema.Fields.Count == 6 &&\n                    recordSchema.Fields[0].Name == nameof(MessageId) &&\n                    recordSchema.Fields[5].Name == nameof(Messages))\n                {\n                    // Read network message header\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.NetworkMessageHeader;\n\n                    var messageId = decoder.ReadString(nameof(MessageId));\n                    if (messageId != null)\n                    {\n                        MessageId = () => messageId;\n                    }\n                    var messageType = decoder.ReadString(nameof(MessageType));\n                    if (!string.Equals(messageType, MessageTypeUaData,\n                        StringComparison.OrdinalIgnoreCase))\n                    {\n                        // Not a dataset network message\n                        return false;\n                    }\n                    PublisherId = decoder.ReadString(nameof(PublisherId));\n                    DataSetClassId = decoder.ReadGuid(nameof(DataSetClassId));\n                    DataSetWriterGroup = decoder.ReadString(nameof(DataSetWriterGroup));\n\n                    // Header and content is array of messages\n                    return TryReadDataSetMessageArray(decoder, nameof(Messages));\n                }\n\n                if (recordSchema.Fields.Count == 1 &&\n                    recordSchema.Fields[0].Name == nameof(Messages))\n                {\n                    // No header and content is array of messages\n                    return TryReadDataSetMessageArray(decoder, nameof(Messages));\n                }\n\n                // No header thus content must be single data set message\n                NetworkMessageContentMask |= NetworkMessageContentFlags.SingleDataSetMessage;\n                return null;\n            });\n\n            if (!result.HasValue)\n            {\n                // Reposition the schema\n                decoder.Push(current);\n                return TryReadDataSetMessage(decoder);\n            }\n            return result.Value;\n\n            bool TryReadDataSetMessageArray(AvroDecoder decoder, string fieldName)\n            {\n                // Read objects from field name\n                var result = decoder.ReadArray(fieldName, () => TryReadDataSetMessage(decoder));\n                if (result.Length == 1)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.SingleDataSetMessage;\n                }\n                return result.All(s => s);\n            }\n\n            bool TryReadDataSetMessage(AvroDecoder decoder)\n            {\n                var message = new AvroDataSetMessage();\n                if (message.TryDecode(decoder, HasDataSetMessageHeader))\n                {\n                    if (!message.WithDataSetHeader)\n                    {\n                        NetworkMessageContentMask &= ~NetworkMessageContentFlags.DataSetMessageHeader;\n                    }\n                    Messages.Add(message);\n                    return true;\n                }\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Encode with set messages\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"messages\"></param>\n        private void WriteNetworkMessage(BaseAvroEncoder encoder,\n            AvroDataSetMessage[] messages)\n        {\n            if (!HasNetworkMessageHeader && HasSingleDataSetMessage)\n            {\n                Debug.Assert(messages.Length == 1);\n                // Writes data set message or just data set\n                messages[0].Encode(encoder, HasDataSetMessageHeader);\n                return;\n            }\n\n            var typeName = nameof(AvroNetworkMessage);\n            if (encoder is AvroEncoder schemas)\n            {\n                var schema = schemas.Current;\n                if (schema is ArraySchema arr)\n                {\n                    schema = arr.ItemSchema;\n                }\n                typeName = schema.Name;\n            }\n\n            // Write network message\n            encoder.WriteObject(null, typeName, () =>\n            {\n                if (HasNetworkMessageHeader)\n                {\n                    encoder.WriteString(nameof(MessageId), MessageId());\n                    encoder.WriteString(nameof(MessageType), MessageType);\n                    encoder.WriteString(nameof(PublisherId), PublisherId);\n                    encoder.WriteGuid(nameof(DataSetClassId), DataSetClassId);\n                    encoder.WriteString(nameof(DataSetWriterGroup), DataSetWriterGroup);\n                }\n\n                // We write array regardless of single or multi message\n                encoder.WriteArray(nameof(Messages), messages,\n                    v => v.Encode(encoder, HasDataSetMessageHeader));\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/BaseDataSetMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n\n    /// <summary>\n    /// Data set message\n    /// </summary>\n    public abstract class BaseDataSetMessage\n    {\n        /// <summary>\n        /// Content mask\n        /// </summary>\n        public DataSetMessageContentFlags DataSetMessageContentMask { get; set; }\n\n        /// <summary>\n        /// Dataset message type\n        /// </summary>\n        public MessageType MessageType { get; set; }\n\n        /// <summary>\n        /// Dataset writer id\n        /// </summary>\n        public ushort DataSetWriterId { get; set; }\n\n        /// <summary>\n        /// Metadata version\n        /// </summary>\n        public Opc.Ua.ConfigurationVersionDataType? MetaDataVersion { get; set; }\n\n        /// <summary>\n        /// Sequence number\n        /// </summary>\n        public uint SequenceNumber { get; set; }\n\n        /// <summary>\n        /// Timestamp\n        /// </summary>\n        public DateTimeOffset? Timestamp { get; set; }\n\n        /// <summary>\n        /// Picoseconds\n        /// </summary>\n        public uint Picoseconds { get; set; }\n\n        /// <summary>\n        /// Status\n        /// </summary>\n        public Opc.Ua.StatusCode? Status { get; set; }\n\n        /// <summary>\n        /// Payload\n        /// </summary>\n        public DataSet Payload { get; set; } = new DataSet();\n\n        /// <summary>\n        /// Endpoint url\n        /// </summary>\n        public string? EndpointUrl { get; set; }\n\n        /// <summary>\n        /// Application uri\n        /// </summary>\n        public string? ApplicationUri { get; set; }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not BaseDataSetMessage wrapper)\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterId, DataSetWriterId) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.SequenceNumber, SequenceNumber) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.Status ?? Opc.Ua.StatusCodes.Good, Status ?? Opc.Ua.StatusCodes.Good) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.Timestamp, Timestamp) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.MessageType, MessageType) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.MetaDataVersion, MetaDataVersion) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.EndpointUrl, EndpointUrl) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.ApplicationUri, ApplicationUri))\n            {\n                return false;\n            }\n            if (wrapper.Payload == null || Payload == null)\n            {\n                return wrapper.Payload == Payload;\n            }\n            return wrapper.Payload.Equals(Payload);\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(MessageType);\n            hash.Add(DataSetWriterId);\n            hash.Add(SequenceNumber);\n            hash.Add(MetaDataVersion);\n            hash.Add(Timestamp);\n            hash.Add(Picoseconds);\n            hash.Add(Status);\n            hash.Add(Payload);\n            hash.Add(EndpointUrl);\n            hash.Add(ApplicationUri);\n            return hash.ToHashCode();\n        }\n\n        internal const string MessageTypeName = \"DataSetMessage\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/BaseNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Encodeable Network message\n    /// <see href=\"https://reference.opcfoundation.org/v104/Core/docs/Part14/7.2.3/\"/>\n    /// </summary>\n    public abstract class BaseNetworkMessage : PubSubMessage\n    {\n        /// <summary>\n        /// Message content\n        /// </summary>\n        public NetworkMessageContentFlags NetworkMessageContentMask { get; set; }\n\n        /// <summary>\n        /// Dataset class id in case of ua-data message\n        /// </summary>\n        public Guid DataSetClassId { get; set; }\n\n        /// <summary>\n        /// Data set metadata in case this is a metadata message\n        /// </summary>\n        public PublishedDataSetMetaDataModel? MetaData { get; set; }\n\n        /// <summary>\n        /// DataSet Messages\n        /// </summary>\n#pragma warning disable CA2227 // Collection properties should be read only\n        public IList<BaseDataSetMessage> Messages { get; set; } = [];\n#pragma warning restore CA2227 // Collection properties should be read only\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not BaseNetworkMessage wrapper)\n            {\n                return false;\n            }\n            if (!base.Equals(obj))\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.DataSetClassId, DataSetClassId) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.Messages, Messages))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(base.GetHashCode());\n            hash.Add(DataSetClassId);\n            foreach (var item in Messages)\n            {\n                hash.Add(item);\n            }\n            return hash.ToHashCode();\n        }\n\n        internal const string MessageTypeName = \"NetworkMessage\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/EncoderExtensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Newtonsoft.Json.Linq;\n    using System;\n\n    /// <summary>\n    /// Encoder extensions\n    /// </summary>\n    internal static class EncoderExtensions\n    {\n        /// <summary>\n        /// Test for\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public static bool HasField(this JsonDecoderEx decoder, string property)\n        {\n            if (!decoder.TryGetToken(null, out var token))\n            {\n                return false;\n            }\n            if (token is JObject o && o.TryGetValue(property,\n                    StringComparison.InvariantCultureIgnoreCase, out _))\n            {\n                return true;\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Test for array\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public static bool IsArray(this JsonDecoderEx decoder, string? property)\n        {\n            if (!decoder.TryGetToken(property, out var token))\n            {\n                return false;\n            }\n            return token is JArray;\n        }\n\n        /// <summary>\n        /// Test for array\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        public static bool IsObject(this JsonDecoderEx decoder, string? property)\n        {\n            if (!decoder.TryGetToken(property, out var token))\n            {\n                return false;\n            }\n            return token is JObject;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/IDataSetMetaDataResolver.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n\n    /// <summary>\n    /// Resolve metadata during encoding and decoding\n    /// </summary>\n    public interface IDataSetMetaDataResolver\n    {\n        /// <summary>\n        /// Find data set metadata or return null if not found.\n        /// </summary>\n        /// <param name=\"writerId\"></param>\n        /// <param name=\"majorVersion\"></param>\n        /// <param name=\"minorVersion\"></param>\n        /// <returns></returns>\n        PublishedDataSetMetaDataModel Find(ushort writerId,\n            uint majorVersion = 0, uint minorVersion = 0);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/JsonDataSetMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Linq;\n\n    /// <summary>\n    /// Data set message\n    /// </summary>\n    public class JsonDataSetMessage : BaseDataSetMessage\n    {\n        /// <summary>\n        /// Compatibility with 2.8 when encoding and decoding\n        /// </summary>\n        public bool UseCompatibilityMode { get; set; }\n\n        /// <summary>\n        /// Dataset writer name\n        /// </summary>\n        public string? DataSetWriterName { get; set; }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not JsonDataSetMessage wrapper)\n            {\n                return false;\n            }\n            if (!base.Equals(obj))\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterName, DataSetWriterName))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(base.GetHashCode());\n\n            hash.Add(DataSetWriterName);\n            return hash.ToHashCode();\n        }\n\n        /// <inheritdoc/>\n        internal virtual void Encode(JsonEncoderEx encoder, string? publisherId, bool withHeader,\n            string? property)\n        {\n            if (withHeader)\n            {\n                if ((DataSetMessageContentMask & DataSetMessageContentFlags.DataSetWriterId) != 0)\n                {\n                    if (!UseCompatibilityMode)\n                    {\n                        encoder.WriteUInt16(nameof(DataSetWriterId), DataSetWriterId);\n                    }\n                    else\n                    {\n                        // Up to version 2.8 we wrote the string id as id which is not per standard\n                        encoder.WriteString(nameof(DataSetWriterId), DataSetWriterName);\n                    }\n                }\n                if ((DataSetMessageContentMask & DataSetMessageContentFlags.SequenceNumber) != 0)\n                {\n                    encoder.WriteUInt32(nameof(SequenceNumber), SequenceNumber);\n                }\n                if ((DataSetMessageContentMask & DataSetMessageContentFlags.MetaDataVersion) != 0)\n                {\n                    encoder.WriteEncodeable(nameof(MetaDataVersion), MetaDataVersion,\n                        typeof(Opc.Ua.ConfigurationVersionDataType));\n                }\n                if ((DataSetMessageContentMask & DataSetMessageContentFlags.Timestamp) != 0)\n                {\n                    encoder.WriteDateTime(nameof(Timestamp), Timestamp?.UtcDateTime ?? default);\n                }\n                if ((DataSetMessageContentMask & DataSetMessageContentFlags.Status) != 0)\n                {\n                    var status = Status ?? Payload.DataSetFields\n                        .FirstOrDefault(s => Opc.Ua.StatusCode.IsNotGood(s.Value?.StatusCode ??\n                            Opc.Ua.StatusCodes.BadNoData)).Value?.StatusCode ?? Opc.Ua.StatusCodes.Good;\n                    if (!UseCompatibilityMode)\n                    {\n                        encoder.WriteUInt32(nameof(Status), status.Code);\n                    }\n                    else\n                    {\n                        // Up to version 2.8 we wrote the full status code\n                        encoder.WriteStatusCode(nameof(Status), status);\n                    }\n                }\n                if ((DataSetMessageContentMask & DataSetMessageContentFlags.MessageType) != 0)\n                {\n                    switch (MessageType)\n                    {\n                        case MessageType.KeyFrame:\n                            encoder.WriteString(nameof(MessageType), \"ua-keyframe\");\n                            break;\n                        case MessageType.Event:\n                            encoder.WriteString(nameof(MessageType), \"ua-event\");\n                            break;\n                        case MessageType.KeepAlive:\n                            encoder.WriteString(nameof(MessageType), \"ua-keepalive\");\n                            break;\n                        case MessageType.Condition:\n                            encoder.WriteString(nameof(MessageType), \"ua-condition\");\n                            break;\n                        case MessageType.DeltaFrame:\n                            encoder.WriteString(nameof(MessageType), \"ua-deltaframe\");\n                            break;\n                    }\n                }\n                if (!UseCompatibilityMode &&\n                    (DataSetMessageContentMask & DataSetMessageContentFlags.DataSetWriterName) != 0)\n                {\n                    encoder.WriteString(nameof(DataSetWriterName), DataSetWriterName);\n                }\n                WritePayload(encoder, nameof(Payload));\n            }\n            else\n            {\n                WritePayload(encoder, property);\n            }\n\n            void WritePayload(JsonEncoderEx jsonEncoder, string? propertyName = null)\n            {\n                var useReversibleEncoding =\n                    (DataSetMessageContentMask & DataSetMessageContentFlags.ReversibleFieldEncoding) != 0;\n                var prevReversibleEncoding = jsonEncoder.UseReversibleEncoding;\n                try\n                {\n                    jsonEncoder.UseReversibleEncoding = useReversibleEncoding;\n\n                    // if propertyname is null we are already inside the object\n                    jsonEncoder.WriteDataSet(propertyName, Payload);\n                }\n                finally\n                {\n                    // Restore original reversible setting\n                    jsonEncoder.UseReversibleEncoding = prevReversibleEncoding;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        internal virtual bool TryDecode(JsonDecoderEx jsonDecoder, string? property, ref bool withHeader,\n            ref string? publisherId)\n        {\n            if (TryReadDataSetMessageHeader(jsonDecoder, out var dataSetMessageContentMask))\n            {\n                withHeader |= true;\n                DataSetMessageContentMask = dataSetMessageContentMask;\n                var payload = jsonDecoder.ReadDataSet(nameof(Payload));\n                if (payload != null)\n                {\n                    Payload = payload;\n                }\n                return true;\n            }\n            else if (withHeader)\n            {\n                // Previously we found a header, not now, we fail here\n                return false;\n            }\n            else\n            {\n                // Reset content\n                DataSetMessageContentMask = 0;\n                MessageType = MessageType.KeyFrame;\n                DataSetWriterId = 0;\n                DataSetWriterName = null;\n                SequenceNumber = 0;\n                MetaDataVersion = null;\n                Timestamp = DateTimeOffset.MinValue;\n\n                var payload = property != null && jsonDecoder.HasField(property) ?\n                    // Read payload off of the property name\n                    jsonDecoder.ReadDataSet(property) :\n                    // Read the current object as dataset\n                    jsonDecoder.ReadDataSet(null);\n\n                if (payload != null)\n                {\n                    Payload = payload;\n                }\n                return true;\n            }\n\n            // Read the data set message header\n            bool TryReadDataSetMessageHeader(JsonDecoderEx jsonDecoder, out DataSetMessageContentFlags dataSetMessageContentMask)\n            {\n                dataSetMessageContentMask = 0;\n                if (jsonDecoder.HasField(nameof(DataSetWriterId)))\n                {\n                    DataSetWriterId = jsonDecoder.ReadUInt16(nameof(DataSetWriterId));\n                    if (DataSetWriterId == 0)\n                    {\n                        // Up to version 2.8 we wrote the string id as id which is not per standard\n                        DataSetWriterName = jsonDecoder.ReadString(nameof(DataSetWriterId));\n                        if (DataSetWriterName != null)\n                        {\n                            UseCompatibilityMode = true;\n                            dataSetMessageContentMask |= DataSetMessageContentFlags.DataSetWriterId;\n                            dataSetMessageContentMask |= DataSetMessageContentFlags.DataSetWriterName;\n                        }\n                        else\n                        {\n                            // Continue and treat all of this as payload.\n                            return false;\n                        }\n                    }\n                    else\n                    {\n                        dataSetMessageContentMask |= DataSetMessageContentFlags.DataSetWriterId;\n                    }\n                }\n\n                if (jsonDecoder.HasField(nameof(MetaDataVersion)))\n                {\n                    MetaDataVersion = (Opc.Ua.ConfigurationVersionDataType?)jsonDecoder.ReadEncodeable(\n                        nameof(MetaDataVersion), typeof(Opc.Ua.ConfigurationVersionDataType));\n                    if (MetaDataVersion != null)\n                    {\n                        dataSetMessageContentMask |= DataSetMessageContentFlags.MetaDataVersion;\n                    }\n                    else\n                    {\n                        // Continue and treat all of this as payload.\n                        return false;\n                    }\n                }\n\n                if (jsonDecoder.HasField(nameof(SequenceNumber)))\n                {\n                    SequenceNumber = jsonDecoder.ReadUInt32(nameof(SequenceNumber));\n                    dataSetMessageContentMask |= DataSetMessageContentFlags.SequenceNumber;\n                }\n\n                if (jsonDecoder.HasField(nameof(Timestamp)))\n                {\n                    Timestamp = jsonDecoder.ReadDateTime(nameof(Timestamp));\n                    dataSetMessageContentMask |= DataSetMessageContentFlags.Timestamp;\n                }\n\n                if (jsonDecoder.HasField(nameof(Status)))\n                {\n                    UseCompatibilityMode = jsonDecoder.IsObject(nameof(Status));\n                    dataSetMessageContentMask |= DataSetMessageContentFlags.Status;\n                    if (!UseCompatibilityMode)\n                    {\n                        Status = jsonDecoder.ReadUInt32(nameof(Status));\n                    }\n                    else\n                    {\n                        // Up to version 2.8 we wrote the string id as id which is not per standard\n                        Status = jsonDecoder.ReadStatusCode(nameof(Status));\n                    }\n                }\n\n                if (jsonDecoder.HasField(nameof(MessageType)))\n                {\n                    var messageType = jsonDecoder.ReadString(nameof(MessageType));\n                    dataSetMessageContentMask |= DataSetMessageContentFlags.MessageType;\n\n                    if (messageType != null)\n                    {\n                        if (messageType.Equals(\"ua-deltaframe\", StringComparison.Ordinal))\n                        {\n                            MessageType = MessageType.DeltaFrame;\n                        }\n                        else if (messageType.Equals(\"ua-event\", StringComparison.Ordinal))\n                        {\n                            MessageType = MessageType.Event;\n                        }\n                        else if (messageType.Equals(\"ua-keepalive\", StringComparison.Ordinal))\n                        {\n                            MessageType = MessageType.KeepAlive;\n                        }\n                        else if (messageType.Equals(\"ua-condition\", StringComparison.Ordinal))\n                        {\n                            MessageType = MessageType.Condition;\n                        }\n                        else if (messageType.Equals(\"ua-keyframe\", StringComparison.Ordinal))\n                        {\n                            MessageType = MessageType.KeyFrame;\n                        }\n                        else\n                        {\n                            // Continue and treat this as payload.\n                            return false;\n                        }\n                    }\n                }\n\n                if (jsonDecoder.HasField(nameof(DataSetWriterName)))\n                {\n                    DataSetWriterName = jsonDecoder.ReadString(nameof(DataSetWriterName));\n                    dataSetMessageContentMask |= DataSetMessageContentFlags.DataSetWriterName;\n                }\n                return jsonDecoder.HasField(nameof(Payload));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/JsonMetadataMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Text;\n\n    /// <summary>\n    /// Json discovery metdata message\n    /// <see href=\"https://reference.opcfoundation.org/v104/Core/docs/Part14/7.2.3/\"/>\n    /// </summary>\n    public class JsonMetaDataMessage : PubSubMessage\n    {\n        /// <inheritdoc/>\n        public override string MessageSchema\n            => MessageSchemaTypes.NetworkMessageJson;\n\n        /// <inheritdoc/>\n        public override string ContentType\n            => UseGzipCompression ? Encoders.ContentType.JsonGzip : ContentMimeType.Json;\n\n        /// <inheritdoc/>\n        public override string ContentEncoding => Encoding.UTF8.WebName;\n\n        /// <summary>\n        /// Ua meta data message type\n        /// </summary>\n        public const string MessageTypeUaMetadata = \"ua-metadata\";\n\n        /// <summary>\n        /// Message type\n        /// </summary>\n        internal string MessageType { get; set; } = MessageTypeUaMetadata;\n\n        /// <summary>\n        /// Flag that indicates if advanced encoding should be used\n        /// </summary>\n        public bool UseAdvancedEncoding { get; set; }\n\n        /// <summary>\n        /// Namespace format to use\n        /// </summary>\n        public NamespaceFormat NamespaceFormat { get; set; }\n\n        /// <summary>\n        /// Use gzip compression\n        /// </summary>\n        public bool UseGzipCompression { get; set; }\n\n        /// <summary>\n        /// Message id\n        /// </summary>\n        public string? MessageId { get; set; }\n\n        /// <summary>\n        /// Data set writer name in case of ua-metadata message\n        /// </summary>\n        public ushort DataSetWriterId { get; set; }\n\n        /// <summary>\n        /// Data set writer name in case of ua-metadata message\n        /// </summary>\n        public string? DataSetWriterName { get; set; }\n\n        /// <summary>\n        /// Data set metadata in case this is a metadata message\n        /// </summary>\n        public PublishedDataSetMetaDataModel? MetaData { get; set; }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (!base.Equals(obj))\n            {\n                return false;\n            }\n            if (obj is not JsonMetaDataMessage wrapper)\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.MessageId, MessageId) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterGroup, DataSetWriterGroup) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterName, DataSetWriterName) ||\n                !wrapper.MetaData.IsSameAs(MetaData) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterId, DataSetWriterId))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(base.GetHashCode());\n            hash.Add(MessageId);\n            hash.Add(DataSetWriterGroup);\n            hash.Add(DataSetWriterName);\n            hash.Add(DataSetWriterId);\n            hash.Add(MetaData);\n            return hash.ToHashCode();\n        }\n\n        /// <inheritdoc/>\n        public override bool TryDecode(Opc.Ua.IServiceMessageContext context, Stream stream,\n            IDataSetMetaDataResolver? resolver)\n        {\n            throw new NotImplementedException();\n        }\n\n        /// <inheritdoc/>\n        public override bool TryDecode(Opc.Ua.IServiceMessageContext context,\n            Queue<ReadOnlySequence<byte>> reader, IDataSetMetaDataResolver? resolver)\n        {\n            if (reader.TryPeek(out var buffer))\n            {\n                using var memoryStream = buffer.IsSingleSegment ?\n                    Memory.GetStream(buffer.FirstSpan) :\n                    Memory.GetStream(buffer.ToArray());\n                var compression = UseGzipCompression ?\n                    new GZipStream(memoryStream, CompressionMode.Decompress, leaveOpen: true) : null;\n                try\n                {\n                    using var decoder = new JsonDecoderEx(\n                        (Stream?)compression ?? memoryStream, context, useJsonLoader: false);\n                    if (TryDecode(decoder))\n                    {\n                        reader.Dequeue();\n                    }\n                }\n                finally\n                {\n                    compression?.Dispose();\n                }\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public override IReadOnlyList<ReadOnlySequence<byte>> Encode(\n            Opc.Ua.IServiceMessageContext context,\n            int maxChunkSize, IDataSetMetaDataResolver? resolver)\n        {\n            var chunks = new List<ReadOnlySequence<byte>>();\n            using var memoryStream = Memory.GetStream();\n            var compression = UseGzipCompression ?\n                new GZipStream(memoryStream, CompressionLevel.Optimal, leaveOpen: true) : null;\n            try\n            {\n                using var encoder = new JsonEncoderEx(\n                    (Stream?)compression ?? memoryStream, context)\n                {\n                    UseAdvancedEncoding = UseAdvancedEncoding,\n                    NamespaceFormat = NamespaceFormat,\n                    UseUriEncoding = UseAdvancedEncoding,\n                    IgnoreDefaultValues = true,\n                    IgnoreNullValues = true,\n                    UseReversibleEncoding = false\n                };\n                Encode(encoder);\n            }\n            finally\n            {\n                compression?.Dispose();\n            }\n            var messageBuffer = memoryStream.GetReadOnlySequence();\n            if (messageBuffer.Length < maxChunkSize)\n            {\n                // TODO: instead of copy using ToArray we shall include the\n                // stream with the message and dispose it later when it is\n                // consumed.\n                chunks.Add(new ReadOnlySequence<byte>(messageBuffer.ToArray()));\n            }\n            else\n            {\n                chunks.Add(default);\n            }\n            return chunks;\n        }\n\n        /// <summary>\n        /// Encode metadata\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        internal void Encode(Opc.Ua.IEncoder encoder)\n        {\n            if (MetaData == null)\n            {\n                throw new EncodingException(\"No metadata to encode.\");\n            }\n            encoder.WriteString(nameof(MessageId), MessageId);\n            encoder.WriteString(nameof(MessageType), MessageType);\n\n            if (!string.IsNullOrEmpty(PublisherId))\n            {\n                encoder.WriteString(nameof(PublisherId), PublisherId);\n            }\n            if (DataSetWriterId != 0)\n            {\n                encoder.WriteUInt16(nameof(DataSetWriterId), DataSetWriterId);\n            }\n            if (!string.IsNullOrEmpty(DataSetWriterGroup))\n            {\n                encoder.WriteString(nameof(DataSetWriterGroup), DataSetWriterGroup);\n            }\n            var dataSetMetaData = MetaData.ToStackModel(encoder.Context);\n            encoder.WriteEncodeable(nameof(MetaData), dataSetMetaData,\n                typeof(Opc.Ua.DataSetMetaDataType));\n            if (!string.IsNullOrEmpty(DataSetWriterName))\n            {\n                encoder.WriteString(nameof(DataSetWriterName), DataSetWriterName);\n            }\n        }\n\n        /// <inheritdoc/>\n        internal bool TryDecode(Opc.Ua.IDecoder decoder)\n        {\n            MessageId = decoder.ReadString(nameof(MessageId));\n            var messageType = decoder.ReadString(nameof(MessageType));\n            if (!messageType.Equals(MessageTypeUaMetadata, StringComparison.OrdinalIgnoreCase))\n            {\n                return false;\n            }\n            PublisherId = decoder.ReadString(nameof(PublisherId));\n            DataSetWriterId = decoder.ReadUInt16(nameof(DataSetWriterId));\n            var dataSetMetaData = (Opc.Ua.DataSetMetaDataType)decoder.ReadEncodeable(\n                nameof(MetaData), typeof(Opc.Ua.DataSetMetaDataType));\n            MetaData = dataSetMetaData.ToServiceModel(decoder.Context);\n            DataSetWriterName = decoder.ReadString(nameof(DataSetWriterName));\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/JsonNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Linq;\n    using System.Text;\n\n    /// <summary>\n    /// Json Network message\n    /// <see href=\"https://reference.opcfoundation.org/v104/Core/docs/Part14/7.2.3/\"/>\n    /// </summary>\n    public class JsonNetworkMessage : BaseNetworkMessage\n    {\n        /// <inheritdoc/>\n        public override string MessageSchema => HasSamplesPayload ?\n            MessageSchemaTypes.MonitoredItemMessageJson : MessageSchemaTypes.NetworkMessageJson;\n\n        /// <inheritdoc/>\n        public override string ContentType => UseGzipCompression ?\n            Encoders.ContentType.JsonGzip : ContentMimeType.Json;\n\n        /// <inheritdoc/>\n        public override string ContentEncoding => Encoding.UTF8.WebName;\n\n        /// <summary>\n        /// Ua data message type\n        /// </summary>\n        public const string MessageTypeUaData = \"ua-data\";\n\n        /// <summary>\n        /// Message id\n        /// </summary>\n        public Func<string> MessageId { get; set; } = () => Guid.NewGuid().ToString();\n\n        /// <summary>\n        /// Message type\n        /// </summary>\n        internal string MessageType { get; set; } = MessageTypeUaData;\n\n        /// <summary>\n        /// Get flag that indicates if message has network message header\n        /// </summary>\n        public bool HasNetworkMessageHeader\n            => (NetworkMessageContentMask & NetworkMessageContentFlags.NetworkMessageHeader) != 0;\n\n        /// <summary>\n        /// Flag that indicates if the Network message contains a single dataset message\n        /// </summary>\n        public bool HasSingleDataSetMessage\n            => (NetworkMessageContentMask & NetworkMessageContentFlags.SingleDataSetMessage) != 0;\n\n        /// <summary>\n        /// Flag that indicates if the Network message dataSets have header\n        /// </summary>\n        public bool HasDataSetMessageHeader\n            => (NetworkMessageContentMask & NetworkMessageContentFlags.DataSetMessageHeader) != 0;\n\n        /// <summary>\n        /// Flag that indicates if the Network message payload is monitored item samples\n        /// </summary>\n        public bool HasSamplesPayload\n        {\n            get\n            {\n                if (_hasSamplesPayload == null)\n                {\n                    if (Messages.Count > 0)\n                    {\n                        _hasSamplesPayload = Messages.Any(m => m is MonitoredItemMessage);\n                    }\n                    else\n                    {\n                        return false;\n                    }\n                }\n                return _hasSamplesPayload.Value;\n            }\n            set => _hasSamplesPayload = value;\n        }\n\n        /// <summary>\n        /// Sets the message schema to use\n        /// </summary>\n        internal string? MessageSchemaToUse\n        {\n            get => MessageSchema;\n            set\n            {\n                HasSamplesPayload = value?.Equals(\n                    MessageSchemaTypes.MonitoredItemMessageJson, StringComparison.OrdinalIgnoreCase) == true;\n            }\n        }\n\n        /// <summary>\n        /// Flag that indicates if advanced encoding should be used\n        /// </summary>\n        public bool UseAdvancedEncoding { get; set; }\n\n        /// <summary>\n        /// Namespace format to use\n        /// </summary>\n        public NamespaceFormat NamespaceFormat { get; set; }\n\n        /// <summary>\n        /// Wrap the resulting message into an array. This is for legacy compatiblity\n        /// where we used to encode a set of network messages in arrays. This is the\n        /// default in OPC Publisher 2.+ if strict compliance with standard is not\n        /// enabled.\n        /// </summary>\n        public bool UseArrayEnvelope { get; set; }\n\n        /// <summary>\n        /// Use gzip compression\n        /// </summary>\n        public bool UseGzipCompression { get; set; }\n\n        /// <summary>\n        /// Returns the starting state of the json encoder\n        /// </summary>\n        private JsonEncoderEx.JsonEncoding JsonEncoderStartingState\n        {\n            get\n            {\n                if (!HasNetworkMessageHeader)\n                {\n                    if (!HasSingleDataSetMessage || UseArrayEnvelope)\n                    {\n                        return JsonEncoderEx.JsonEncoding.Array;\n                    }\n                    if (!HasDataSetMessageHeader)\n                    {\n                        return JsonEncoderEx.JsonEncoding.Token;\n                    }\n                }\n                if (UseArrayEnvelope)\n                {\n                    return JsonEncoderEx.JsonEncoding.Array;\n                }\n                return JsonEncoderEx.JsonEncoding.StartObject;\n            }\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not JsonNetworkMessage wrapper)\n            {\n                return false;\n            }\n            if (!base.Equals(obj))\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.MessageId(), MessageId()) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterGroup, DataSetWriterGroup))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(base.GetHashCode());\n            hash.Add(MessageId);\n            hash.Add(DataSetWriterGroup);\n            return hash.ToHashCode();\n        }\n\n        /// <inheritdoc/>\n        public override bool TryDecode(Opc.Ua.IServiceMessageContext context, Stream stream,\n            IDataSetMetaDataResolver? resolver)\n        {\n            var compression = UseGzipCompression ?\n                new GZipStream(stream, CompressionMode.Decompress, leaveOpen: true) : null;\n            try\n            {\n                using var decoder = new JsonDecoderEx((Stream?)compression ?? stream,\n                    context, useJsonLoader: false);\n                var readArray = decoder.ReadArray(null, () => TryReadNetworkMessage(decoder));\n                if (readArray?.All(s => s) != true ||\n                    stream.Length != stream.Position)\n                {\n                    return false;\n                }\n                return true;\n            }\n            finally\n            {\n                compression?.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public override bool TryDecode(Opc.Ua.IServiceMessageContext context,\n            Queue<ReadOnlySequence<byte>> reader, IDataSetMetaDataResolver? resolver = null)\n        {\n            // Decodes a single buffer\n            if (reader.TryPeek(out var buffer))\n            {\n                using var memoryStream = buffer.IsSingleSegment ?\n                    Memory.GetStream(buffer.FirstSpan) :\n                    Memory.GetStream(buffer.ToArray());\n                var compression = UseGzipCompression ?\n                    new GZipStream(memoryStream, CompressionMode.Decompress, leaveOpen: true) : null;\n                try\n                {\n                    using var decoder = new JsonDecoderEx((Stream?)compression ?? memoryStream,\n                        context, useJsonLoader: false);\n                    var readArray = decoder.ReadArray(null, () => TryReadNetworkMessage(decoder));\n                    if (readArray?.All(s => s) != true)\n                    {\n                        return false;\n                    }\n                    // Complete the buffer\n                    reader.Dequeue();\n                    return true;\n                }\n                finally\n                {\n                    compression?.Dispose();\n                }\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public override IReadOnlyList<ReadOnlySequence<byte>> Encode(Opc.Ua.IServiceMessageContext context,\n            int maxChunkSize, IDataSetMetaDataResolver? resolver = null)\n        {\n            var chunks = new List<ReadOnlySequence<byte>>();\n            var messages = Messages.OfType<JsonDataSetMessage>().ToArray().AsSpan();\n            var messageId = MessageId;\n            try\n            {\n                if (HasSingleDataSetMessage && !UseArrayEnvelope)\n                {\n                    for (var i = 0; i < messages.Length; i++)\n                    {\n                        EncodeMessages(messages.Slice(i, 1));\n                    }\n                }\n                else\n                {\n                    EncodeMessages(messages);\n                }\n            }\n            finally\n            {\n                MessageId = messageId;\n            }\n            return chunks;\n\n            void EncodeMessages(Span<JsonDataSetMessage> messages)\n            {\n                ReadOnlySequence<byte> messageBuffer;\n                using (var memoryStream = Memory.GetStream())\n                {\n                    var compression = UseGzipCompression ?\n                        new GZipStream(memoryStream, CompressionLevel.Optimal, leaveOpen: true) : null;\n                    try\n                    {\n                        using var encoder = new JsonEncoderEx(\n                            (Stream?)compression ?? memoryStream, context, JsonEncoderStartingState)\n                        {\n                            UseAdvancedEncoding = UseAdvancedEncoding,\n                            UseUriEncoding = UseAdvancedEncoding,\n                            NamespaceFormat = NamespaceFormat,\n                            IgnoreDefaultValues = true,\n                            IgnoreNullValues = true,\n                            UseReversibleEncoding = false\n                        };\n                        WriteMessages(encoder, messages);\n                    }\n                    finally\n                    {\n                        compression?.Dispose();\n                    }\n\n                    messageBuffer = memoryStream.GetReadOnlySequence();\n\n                    // TODO: instead of copy using ToArray we shall include the\n                    // stream with the message and dispose it later when it is\n                    // consumed.\n                    messageBuffer = new ReadOnlySequence<byte>(messageBuffer.ToArray());\n                }\n\n                if (messageBuffer.Length < maxChunkSize)\n                {\n                    chunks.Add(messageBuffer);\n                }\n                else if (messages.Length == 1)\n                {\n                    chunks.Add(default);\n                }\n                else\n                {\n                    // Split\n                    var len = messages.Length / 2;\n                    var first = messages[..len];\n                    var second = messages[len..];\n\n                    EncodeMessages(first);\n                    EncodeMessages(second);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Write message span\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"messages\"></param>\n        private void WriteMessages(JsonEncoderEx encoder, Span<JsonDataSetMessage> messages)\n        {\n            var messagesToInclude = messages.ToArray();\n            if (UseArrayEnvelope)\n            {\n                if (HasSingleDataSetMessage || HasNetworkMessageHeader)\n                {\n                    // Legacy compatibility - n network messages with 1 message each inside array\n                    for (var i = 0; i < messages.Length; i++)\n                    {\n                        var single = messages.Slice(i, 1).ToArray();\n                        if (HasDataSetMessageHeader || HasNetworkMessageHeader)\n                        {\n                            encoder.WriteObject(null, Messages, _ => WriteNetworkMessage(encoder, single));\n                        }\n                        else\n                        {\n                            // Write single messages into the array envelope\n                            WriteNetworkMessage(encoder, single);\n                        }\n                    }\n                }\n                else\n                {\n                    // Write all messages into the array envelope\n                    WriteNetworkMessage(encoder, messagesToInclude);\n                }\n            }\n            else\n            {\n                WriteNetworkMessage(encoder, messagesToInclude);\n            }\n        }\n\n        /// <summary>\n        /// Try decode\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <returns></returns>\n        private bool TryReadNetworkMessage(JsonDecoderEx decoder)\n        {\n            if (!HasSamplesPayload && TryReadNetworkMessageHeader(decoder, out var networkMessageContentMask))\n            {\n                if (decoder.IsObject(nameof(Messages)))\n                {\n                    // Single message\n                    networkMessageContentMask |= NetworkMessageContentFlags.SingleDataSetMessage;\n                }\n                else if (!decoder.IsArray(nameof(Messages)))\n                {\n                    // Messages property is neither object nor array. We might be inside a single dataset\n                    // TODO: Should we throw?\n                    return false;\n                }\n                NetworkMessageContentMask = networkMessageContentMask;\n                return TryReadDataSetMessages(decoder, nameof(Messages));\n            }\n            // Reset\n            NetworkMessageContentMask = 0;\n            DataSetWriterGroup = null;\n            DataSetClassId = default;\n            MessageId = () => Guid.NewGuid().ToString();\n            PublisherId = null;\n\n            if (decoder.IsObject(null))\n            {\n                // Treat this object as the single message\n                NetworkMessageContentMask |= NetworkMessageContentFlags.SingleDataSetMessage;\n            }\n            else if (!decoder.IsArray(null))\n            {\n                // This object we are reading is neither an object nor array\n                return false;\n            }\n\n            return TryReadDataSetMessages(decoder, null);\n\n            bool TryReadDataSetMessages(JsonDecoderEx decoder, string? property)\n            {\n                var hasDataSetMessageHeader = false;\n                string? publisherId = null;\n                var messages = decoder.ReadArray<BaseDataSetMessage?>(property, () =>\n                {\n                    var message = !HasSamplesPayload ? new JsonDataSetMessage() : new MonitoredItemMessage();\n                    if (!message.TryDecode(decoder, property, ref hasDataSetMessageHeader, ref publisherId))\n                    {\n                        return null;\n                    }\n                    return message;\n                });\n                if (messages == null)\n                {\n                    return false;\n                }\n                // Add decoded messages to messages array\n                foreach (var message in messages)\n                {\n                    if (message == null)\n                    {\n                        // Reset\n                        Messages.Clear();\n                        return false;\n                    }\n                    Messages.Add(message);\n                }\n                if (hasDataSetMessageHeader)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.DataSetMessageHeader;\n                }\n                if (publisherId != null)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.PublisherId;\n                    PublisherId = null;\n                }\n                return true;\n            }\n        }\n\n        /// <summary>\n        /// Encode with set messages\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"messages\"></param>\n        private void WriteNetworkMessage(JsonEncoderEx encoder, JsonDataSetMessage[] messages)\n        {\n            var publisherId =\n                (NetworkMessageContentMask & NetworkMessageContentFlags.PublisherId) == 0\n                    ? null : PublisherId;\n            if (HasNetworkMessageHeader)\n            {\n                WriteNetworkMessageHeader(encoder);\n\n                if (HasSingleDataSetMessage)\n                {\n                    if (HasDataSetMessageHeader)\n                    {\n                        // Write as a single object under messages property\n                        encoder.WriteObject(nameof(Messages), messages[0],\n                            v => v.Encode(encoder, publisherId, true, null));\n                    }\n                    else\n                    {\n                        // Write raw data set object under messages property\n                        messages[0].Encode(encoder, publisherId, false, nameof(Messages));\n                    }\n                }\n                else if (HasDataSetMessageHeader)\n                {\n                    // Write as array of objects\n                    encoder.WriteArray(nameof(Messages), messages, v =>\n                        encoder.WriteObject(null, v, v => v.Encode(encoder, publisherId, true, null)));\n                }\n                else\n                {\n                    // Write as array of dataset payload tokens\n                    encoder.WriteArray(nameof(Messages), messages,\n                        v => v.Encode(encoder, publisherId, false, null));\n                }\n            }\n            else\n            {\n                // The encoder was set up as array or object beforehand\n                if (HasSingleDataSetMessage)\n                {\n                    // Write object content to current object\n                    messages[0].Encode(encoder, publisherId, HasDataSetMessageHeader, null);\n                }\n                else if (HasDataSetMessageHeader)\n                {\n                    // Write each object to the array that is the initial state of the encoder\n                    foreach (var message in messages)\n                    {\n                        // Write as array of dataset messages with payload\n                        encoder.WriteObject(null, message, v => v.Encode(encoder, publisherId, true, null));\n                    }\n                }\n                else\n                {\n                    // Writes dataset directly the encoder was set up as token\n                    foreach (var message in messages)\n                    {\n                        message.Encode(encoder, publisherId, false, null);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Read network message header\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <param name=\"networkMessageContentMask\"></param>\n        /// <returns></returns>\n        private bool TryReadNetworkMessageHeader(JsonDecoderEx decoder,\n            out NetworkMessageContentFlags networkMessageContentMask)\n        {\n            networkMessageContentMask = 0;\n            if (!decoder.HasField(nameof(MessageId)) || HasSamplesPayload)\n            {\n                return false;\n            }\n            var messageId = decoder.ReadString(nameof(MessageId));\n            if (messageId == null)\n            {\n                // Field is there but not of type string, cannot be a network message header\n                return false;\n            }\n            MessageId = () => messageId;\n            var messageType = decoder.ReadString(nameof(MessageType));\n            if (!string.Equals(messageType, MessageTypeUaData, StringComparison.OrdinalIgnoreCase))\n            {\n                // Not a dataset network message\n                return false;\n            }\n            networkMessageContentMask |= NetworkMessageContentFlags.NetworkMessageHeader;\n\n            if (decoder.HasField(nameof(PublisherId)))\n            {\n                PublisherId = decoder.ReadString(nameof(PublisherId));\n                if (PublisherId != null)\n                {\n                    networkMessageContentMask |= NetworkMessageContentFlags.PublisherId;\n                }\n                else\n                {\n                    // publisher is not string type,\n                    // TODO\n                    return false;\n                }\n            }\n\n            if (decoder.HasField(nameof(DataSetClassId)))\n            {\n                var dataSetClassId = decoder.ReadString(nameof(DataSetClassId));\n                if (dataSetClassId != null && Guid.TryParse(dataSetClassId, out var result))\n                {\n                    DataSetClassId = result;\n                    networkMessageContentMask |= NetworkMessageContentFlags.DataSetClassId;\n                }\n                else\n                {\n                    // class id is not guid or string\n                    return false;\n                }\n            }\n\n            if (decoder.HasField(nameof(DataSetWriterGroup)))\n            {\n                DataSetWriterGroup = decoder.ReadString(nameof(DataSetWriterGroup));\n                if (DataSetWriterGroup == null)\n                {\n                    // writer group is not string type\n                    // TODO\n                    return false;\n                }\n            }\n            return decoder.HasField(nameof(Messages));\n        }\n\n        /// <summary>\n        /// Write network message header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        private void WriteNetworkMessageHeader(JsonEncoderEx encoder)\n        {\n            // The encoder was set up as object beforehand based on IsJsonArray result\n            encoder.WriteString(nameof(MessageId), MessageId());\n            encoder.WriteString(nameof(MessageType), MessageType);\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.PublisherId) != 0)\n            {\n                encoder.WriteString(nameof(PublisherId), PublisherId);\n            }\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.DataSetClassId) != 0 &&\n                DataSetClassId != Guid.Empty)\n            {\n                encoder.WriteString(nameof(DataSetClassId), DataSetClassId.ToString());\n            }\n            if (!string.IsNullOrEmpty(DataSetWriterGroup))\n            {\n                encoder.WriteString(nameof(DataSetWriterGroup), DataSetWriterGroup);\n            }\n        }\n\n        private bool? _hasSamplesPayload;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/MessageType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    /// <summary>\n    /// Message type\n    /// </summary>\n    public enum MessageType\n    {\n        /// <summary>\n        /// Delta frame\n        /// </summary>\n        DeltaFrame,\n\n        /// <summary>\n        /// Key frame\n        /// </summary>\n        KeyFrame,\n\n        /// <summary>\n        /// Event\n        /// </summary>\n        Event,\n\n        /// <summary>\n        /// Keep alive\n        /// </summary>\n        KeepAlive,\n\n        /// <summary>\n        /// Condition\n        /// </summary>\n        Condition,\n\n        /// <summary>\n        /// Metadata\n        /// </summary>\n        Metadata,\n\n        /// <summary>\n        /// Close notification\n        /// </summary>\n        Closed\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/MonitoredItemMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Encoders.Utils;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Samples message\n    /// </summary>\n    public class MonitoredItemMessage : JsonDataSetMessage\n    {\n        /// <summary>\n        /// Node Id in string format as configured\n        /// </summary>\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// Writer group name (dont change then name for backcompat)\n        /// </summary>\n        public string? WriterGroupId { get; set; }\n\n        /// <summary>\n        /// Display name\n        /// </summary>\n        public string? DisplayName => Payload.DataSetFields.SingleOrDefault().Name;\n\n        /// <summary>\n        /// Data value for variable change notification\n        /// </summary>\n        public Opc.Ua.DataValue? Value => Payload.DataSetFields.SingleOrDefault().Value;\n\n        /// <summary>\n        /// Extension fields\n        /// </summary>\n        public IReadOnlyList<ExtensionFieldModel>? ExtensionFields { get; set; }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not MonitoredItemMessage wrapper)\n            {\n                return false;\n            }\n            if (!base.Equals(obj))\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.NodeId, NodeId))\n            {\n                return false;\n            }\n            if (!wrapper.ExtensionFields.SetEqualsSafe(ExtensionFields,\n                (a, b) => a?.Equals(b) ?? b == null))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(base.GetHashCode());\n\n            hash.Add(NodeId);\n            hash.Add(ExtensionFields);\n            return hash.ToHashCode();\n        }\n\n        /// <inheritdoc/>\n        internal override void Encode(JsonEncoderEx encoder, string? publisherId, bool withHeader,\n            string? property)\n        {\n            //\n            // If not writing with samples header or writing to a property we fail. This is a\n            // configuration error, rather than throwing constantly we just do not emit anything\n            // instead.\n            //\n            if (!withHeader || property != null)\n            {\n                return;\n            }\n\n            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.NodeId))\n            {\n                encoder.WriteString(nameof(NodeId), NodeId);\n            }\n            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.EndpointUrl))\n            {\n                encoder.WriteString(nameof(EndpointUrl), EndpointUrl);\n            }\n            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ApplicationUri))\n            {\n                encoder.WriteString(nameof(ApplicationUri), ApplicationUri);\n            }\n            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.DisplayName) &&\n                !string.IsNullOrEmpty(DisplayName))\n            {\n                encoder.WriteString(nameof(DisplayName), DisplayName);\n            }\n            if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Timestamp))\n            {\n                encoder.WriteDateTime(nameof(Timestamp), Timestamp?.UtcDateTime ?? default);\n            }\n\n            var valuePayload = Value;\n            if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Status))\n            {\n                var status = Status;\n                if (status == null)\n                {\n                    status = valuePayload != null ?\n                        Opc.Ua.StatusCode.IsNotGood(valuePayload.StatusCode) ?\n                            valuePayload.StatusCode : Opc.Ua.StatusCodes.Good :\n                       (Opc.Ua.StatusCode?)Opc.Ua.StatusCodes.BadNoData;\n                }\n                encoder.WriteString(nameof(Status), status.Value.AsString());\n            }\n\n            // Create a copy of the data value and update the timestamps and status\n            var value = new Opc.Ua.DataValue(valuePayload?.WrappedValue ?? Opc.Ua.Variant.Null);\n            if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Status) ||\n                Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.StatusCode))\n            {\n                value.StatusCode = valuePayload?.StatusCode ?? Opc.Ua.StatusCodes.BadNoData;\n            }\n\n            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.SourceTimestamp))\n            {\n                value.SourceTimestamp = valuePayload?.SourceTimestamp ?? DateTime.MinValue;\n                if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.SourcePicoSeconds))\n                {\n                    value.SourcePicoseconds = valuePayload?.SourcePicoseconds ?? 0;\n                }\n            }\n            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ServerTimestamp))\n            {\n                value.ServerTimestamp = valuePayload?.ServerTimestamp ?? DateTime.MinValue;\n                if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ServerPicoSeconds))\n                {\n                    value.ServerPicoseconds = valuePayload?.ServerPicoseconds ?? 0;\n                }\n            }\n\n            var reversibleMode = encoder.UseReversibleEncoding;\n            try\n            {\n                encoder.UseReversibleEncoding =\n                    DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.ReversibleFieldEncoding);\n                encoder.WriteDataValue(nameof(Value), value);\n            }\n            finally\n            {\n                encoder.UseReversibleEncoding = reversibleMode;\n            }\n\n            if (DataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.SequenceNumber))\n            {\n                encoder.WriteUInt32(nameof(SequenceNumber), SequenceNumber);\n            }\n\n            if (Payload.DataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ExtensionFields))\n            {\n                var extensionFields = (nameof(DataSetWriterId), DataSetWriterName)\n                    .YieldReturn();\n                if (publisherId != null)\n                {\n                    extensionFields = extensionFields\n                        .Append((nameof(JsonNetworkMessage.PublisherId), publisherId));\n                }\n                if (WriterGroupId != null)\n                {\n                    extensionFields = extensionFields\n                        .Append((nameof(WriterGroupId), WriterGroupId));\n                }\n                if (ExtensionFields != null)\n                {\n                    extensionFields = extensionFields.Concat(ExtensionFields\n                        .Where(e => e.DataSetFieldName is\n                            not (nameof(DataSetWriterId)) and\n                            not (nameof(EndpointUrl)) and\n                            not (nameof(ApplicationUri)) and\n                            not (nameof(WriterGroupId)) and\n                            not (nameof(JsonNetworkMessage.PublisherId)))\n                        .Select(e => (e.DataSetFieldName, e.Value.Value?.ToString())));\n                }\n\n                // We already wrote application uri and endpoint uri, so do not write again\n                encoder.WriteStringDictionary(nameof(ExtensionFields), extensionFields);\n            }\n        }\n\n        /// <inheritdoc/>\n        internal override bool TryDecode(JsonDecoderEx decoder, string? property, ref bool withHeader,\n            ref string? publisherId)\n        {\n            // If reading from property return false as this means we are a standard dataset message\n            if (property != null)\n            {\n                return false;\n            }\n\n            var value = decoder.ReadDataValue(nameof(Value));\n            DataSetFieldContentFlags dataSetFieldContentMask = 0u;\n            if (value != null)\n            {\n                if (value.ServerTimestamp != DateTime.MinValue)\n                {\n                    dataSetFieldContentMask |= DataSetFieldContentFlags.ServerTimestamp;\n                }\n                if (value.ServerPicoseconds != 0)\n                {\n                    dataSetFieldContentMask |= DataSetFieldContentFlags.ServerPicoSeconds;\n                }\n                if (value.SourceTimestamp != DateTime.MinValue)\n                {\n                    dataSetFieldContentMask |= DataSetFieldContentFlags.SourceTimestamp;\n                }\n                if (value.SourcePicoseconds != 0)\n                {\n                    dataSetFieldContentMask |= DataSetFieldContentFlags.SourcePicoSeconds;\n                }\n                if (value.StatusCode != 0)\n                {\n                    dataSetFieldContentMask |= DataSetFieldContentFlags.StatusCode;\n                }\n            }\n\n            // Read header\n            DataSetMessageContentMask = 0u;\n            var displayName = decoder.ReadString(nameof(DisplayName));\n            if (displayName != null)\n            {\n                dataSetFieldContentMask |= DataSetFieldContentFlags.DisplayName;\n            }\n            NodeId = decoder.ReadString(nameof(NodeId));\n            if (NodeId != null)\n            {\n                dataSetFieldContentMask |= DataSetFieldContentFlags.NodeId;\n            }\n            EndpointUrl = decoder.ReadString(nameof(EndpointUrl));\n            if (EndpointUrl != null)\n            {\n                dataSetFieldContentMask |= DataSetFieldContentFlags.EndpointUrl;\n            }\n            ApplicationUri = decoder.ReadString(nameof(ApplicationUri));\n            if (ApplicationUri != null)\n            {\n                dataSetFieldContentMask |= DataSetFieldContentFlags.ApplicationUri;\n            }\n            var timestamp = decoder.ReadDateTime(nameof(Timestamp));\n            if (timestamp != DateTime.MinValue)\n            {\n                Timestamp = timestamp;\n                DataSetMessageContentMask |= DataSetMessageContentFlags.Timestamp;\n            }\n            var status = decoder.ReadString(nameof(Status));\n            if (status != null)\n            {\n                if (TypeMaps.StatusCodes.Value.TryGetIdentifier(status, out var statusCode))\n                {\n                    Status = statusCode;\n                }\n                else\n                {\n                    Status = status == \"Good\" ? Opc.Ua.StatusCodes.Good : Opc.Ua.StatusCodes.Bad;\n                }\n            }\n            SequenceNumber = decoder.ReadUInt32(nameof(SequenceNumber));\n            if (SequenceNumber != 0)\n            {\n                DataSetMessageContentMask |= DataSetMessageContentFlags.SequenceNumber;\n            }\n            var stringDictionary = decoder.ReadStringDictionary(nameof(ExtensionFields));\n            if (stringDictionary?.Count > 0)\n            {\n                dataSetFieldContentMask |= DataSetFieldContentFlags.ExtensionFields;\n                var extensionFields = new List<ExtensionFieldModel>();\n                foreach (var (name, v) in stringDictionary)\n                {\n                    if (name == nameof(DataSetWriterId))\n                    {\n                        DataSetWriterName = v;\n                    }\n                    else if (name == nameof(JsonNetworkMessage.PublisherId))\n                    {\n                        publisherId = v;\n                    }\n                    else if (name == nameof(WriterGroupId))\n                    {\n                        WriterGroupId = v;\n                    }\n                    else\n                    {\n                        extensionFields.Add(new ExtensionFieldModel\n                        {\n                            DataSetFieldName = name,\n                            Value = v\n                        });\n                    }\n                }\n                ExtensionFields = extensionFields;\n            }\n            else\n            {\n                ExtensionFields = null;\n            }\n\n            withHeader |= DataSetMessageContentMask != 0;\n            if (value != null || dataSetFieldContentMask != 0)\n            {\n                Payload = Payload.Add(displayName ?? string.Empty, value, dataSetFieldContentMask);\n                return true;\n            }\n            // Only return true if we otherwise read a header value\n            return withHeader;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/PubSubMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using Microsoft.IO;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.IO;\n\n    /// <summary>\n    /// Encodeable PubSub messages\n    /// <see href=\"https://reference.opcfoundation.org/v104/Core/docs/Part14/7.2.3/\"/>\n    /// </summary>\n    public abstract class PubSubMessage\n    {\n        /// <summary>\n        /// Network message defaults\n        /// </summary>\n        public const NetworkMessageContentFlags DefaultNetworkMessageContentFlags =\n            NetworkMessageContentFlags.NetworkMessageHeader |\n            NetworkMessageContentFlags.NetworkMessageNumber |\n            NetworkMessageContentFlags.DataSetMessageHeader |\n            NetworkMessageContentFlags.PublisherId |\n            NetworkMessageContentFlags.DataSetClassId;\n\n        /// <summary>\n        /// Default field mask\n        /// </summary>\n        public const DataSetFieldContentFlags DefaultDataSetFieldContentFlags =\n            DataSetFieldContentFlags.StatusCode |\n            DataSetFieldContentFlags.SourcePicoSeconds |\n            DataSetFieldContentFlags.SourceTimestamp |\n            DataSetFieldContentFlags.ServerPicoSeconds |\n            DataSetFieldContentFlags.ServerTimestamp;\n\n        /// <summary>\n        /// Default message flags\n        /// </summary>\n        public const DataSetMessageContentFlags DefaultDataSetMessageContentFlags =\n            DataSetMessageContentFlags.DataSetWriterId |\n            DataSetMessageContentFlags.DataSetWriterName |\n            DataSetMessageContentFlags.MetaDataVersion |\n            DataSetMessageContentFlags.MajorVersion |\n            DataSetMessageContentFlags.MinorVersion |\n            DataSetMessageContentFlags.SequenceNumber |\n            DataSetMessageContentFlags.Timestamp |\n            DataSetMessageContentFlags.MessageType |\n            DataSetMessageContentFlags.Status;\n\n        /// <summary>\n        /// Message schema\n        /// </summary>\n        public abstract string MessageSchema { get; }\n\n        /// <summary>\n        /// Content type\n        /// </summary>\n        public abstract string ContentType { get; }\n\n        /// <summary>\n        /// Content encoding\n        /// </summary>\n        public abstract string? ContentEncoding { get; }\n\n        /// <summary>\n        /// Publisher identifier\n        /// </summary>\n        public string? PublisherId { get; set; }\n\n        /// <summary>\n        /// Dataset writerGroup\n        /// </summary>\n        public string? DataSetWriterGroup { get; set; }\n\n        /// <summary>\n        /// Memory stream manager\n        /// </summary>\n        protected static RecyclableMemoryStreamManager Memory { get; }\n            = new RecyclableMemoryStreamManager();\n\n        /// <summary>\n        /// Decode the network message from the wire representation\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"reader\"></param>\n        /// <param name=\"resolver\"></param>\n        public abstract bool TryDecode(Opc.Ua.IServiceMessageContext context,\n            Queue<ReadOnlySequence<byte>> reader,\n            IDataSetMetaDataResolver? resolver = null);\n\n        /// <summary>\n        /// Decode the network message from the wire representation\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"resolver\"></param>\n        public abstract bool TryDecode(Opc.Ua.IServiceMessageContext context,\n            Stream stream, IDataSetMetaDataResolver? resolver = null);\n\n        /// <summary>\n        /// Encode the network message into network message chunks\n        /// wire representation.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"maxChunkSize\"></param>\n        /// <param name=\"resolver\"></param>\n        /// <returns></returns>\n        public abstract IReadOnlyList<ReadOnlySequence<byte>> Encode(\n            Opc.Ua.IServiceMessageContext context, int maxChunkSize,\n            IDataSetMetaDataResolver? resolver = null);\n\n        /// <summary>\n        /// Create metadata message\n        /// </summary>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"publisherId\"></param>\n        /// <param name=\"writerGroupName\"></param>\n        /// <param name=\"dataSetWriterName\"></param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"metaData\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"standardsCompliant\"></param>\n        /// <param name=\"message\"></param>\n        /// <returns></returns>\n        public static bool TryCreateMetaDataMessage(MessageEncoding encoding,\n            string? publisherId, string writerGroupName, string dataSetWriterName,\n            ushort dataSetWriterId, PublishedDataSetMetaDataModel metaData,\n            NamespaceFormat namespaceFormat, bool standardsCompliant,\n            [NotNullWhen(true)] out PubSubMessage? message)\n        {\n            if (encoding.HasFlag(MessageEncoding.Json))\n            {\n                message = new JsonMetaDataMessage\n                {\n                    UseAdvancedEncoding = !standardsCompliant,\n                    NamespaceFormat = namespaceFormat,\n                    UseGzipCompression = encoding.HasFlag(MessageEncoding.IsGzipCompressed),\n                    DataSetWriterId = dataSetWriterId,\n                    MetaData = metaData,\n                    MessageId = Guid.NewGuid().ToString(),\n                    DataSetWriterName = dataSetWriterName,\n                    PublisherId = publisherId,\n                    DataSetWriterGroup = writerGroupName\n                };\n            }\n            else if (encoding.HasFlag(MessageEncoding.Uadp))\n            {\n                message = new UadpMetaDataMessage\n                {\n                    DataSetWriterId = dataSetWriterId,\n                    MetaData = metaData,\n                    PublisherId = publisherId,\n                    DataSetWriterGroup = writerGroupName\n                };\n            }\n            else\n            {\n                message = default;\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Create dataset message\n        /// </summary>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"dataSetWriterName\"></param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"dataSetMessageContentFlags\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"payload\"></param>\n        /// <param name=\"timestamp\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"standardsCompliant\"></param>\n        /// <param name=\"endpointUrl\"></param>\n        /// <param name=\"applicationUri\"></param>\n        /// <param name=\"metaData\"></param>\n        /// <param name=\"message\"></param>\n        /// <returns></returns>\n        public static bool TryCreateDataSetMessage(MessageEncoding encoding,\n            string dataSetWriterName, ushort dataSetWriterId,\n            DataSetMessageContentFlags? dataSetMessageContentFlags,\n            MessageType messageType, DataSet payload, DateTimeOffset? timestamp,\n            uint sequenceNumber, bool standardsCompliant, string? endpointUrl,\n            string? applicationUri, PublishedDataSetMetaDataModel? metaData,\n            [NotNullWhen(true)] out BaseDataSetMessage? message)\n        {\n            dataSetMessageContentFlags ??= DefaultDataSetMessageContentFlags;\n            var version = new Opc.Ua.ConfigurationVersionDataType\n            {\n                MajorVersion = metaData?.DataSetMetaData.MajorVersion ?? 1,\n                MinorVersion = metaData?.MinorVersion ?? 0\n            };\n\n            if (encoding.HasFlag(MessageEncoding.Json))\n            {\n                message = new JsonDataSetMessage\n                {\n                    UseCompatibilityMode = !standardsCompliant,\n                    DataSetWriterName = dataSetWriterName,\n                    DataSetWriterId = dataSetWriterId,\n                    MessageType = messageType,\n                    MetaDataVersion = version,\n                    ApplicationUri = applicationUri,\n                    EndpointUrl = endpointUrl,\n                    DataSetMessageContentMask = dataSetMessageContentFlags.Value,\n                    Timestamp = timestamp,\n                    SequenceNumber = sequenceNumber,\n                    Payload = payload\n                };\n            }\n            else if (encoding.HasFlag(MessageEncoding.Avro))\n            {\n                message = new AvroDataSetMessage\n                {\n                    DataSetWriterName = dataSetWriterName,\n                    DataSetWriterId = dataSetWriterId,\n                    MessageType = messageType,\n                    MetaDataVersion = version,\n                    DataSetMessageContentMask = dataSetMessageContentFlags.Value,\n                    Timestamp = timestamp,\n                    SequenceNumber = sequenceNumber,\n                    Payload = payload\n                };\n            }\n            else if (encoding.HasFlag(MessageEncoding.Uadp))\n            {\n                message = new UadpDataSetMessage\n                {\n                    DataSetWriterId = dataSetWriterId,\n                    MessageType = messageType,\n                    MetaDataVersion = version,\n                    DataSetMessageContentMask = dataSetMessageContentFlags.Value,\n                    Timestamp = timestamp,\n                    SequenceNumber = sequenceNumber,\n                    Payload = payload\n                };\n            }\n            else\n            {\n                message = default;\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Create monitored item message\n        /// </summary>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"writerGroupName\"></param>\n        /// <param name=\"dataSetMessageContentFlags\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"timestamp\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"payload\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"endpointUrl\"></param>\n        /// <param name=\"applicationUri\"></param>\n        /// <param name=\"standardsCompliant\"></param>\n        /// <param name=\"extensionFields\"></param>\n        /// <param name=\"message\"></param>\n        /// <returns></returns>\n        public static bool TryCreateMonitoredItemMessage(MessageEncoding encoding,\n            string? writerGroupName, DataSetMessageContentFlags? dataSetMessageContentFlags,\n            MessageType messageType, DateTimeOffset? timestamp, uint sequenceNumber,\n            DataSet payload, string? nodeId, string? endpointUrl, string? applicationUri,\n            bool standardsCompliant, IReadOnlyList<ExtensionFieldModel>? extensionFields,\n            [NotNullWhen(true)] out BaseDataSetMessage? message)\n        {\n            if (encoding.HasFlag(MessageEncoding.Json))\n            {\n                message = new MonitoredItemMessage\n                {\n                    UseCompatibilityMode = !standardsCompliant,\n                    ApplicationUri = applicationUri,\n                    EndpointUrl = endpointUrl,\n                    NodeId = nodeId,\n                    ExtensionFields = extensionFields,\n                    WriterGroupId = writerGroupName,\n                    MessageType = messageType,\n                    DataSetMessageContentMask = dataSetMessageContentFlags\n                      ?? DefaultDataSetMessageContentFlags,\n                    Timestamp = timestamp,\n                    SequenceNumber = sequenceNumber,\n                    Payload = payload\n                };\n            }\n            else\n            {\n                message = default;\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Create network message\n        /// </summary>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"publisherId\"></param>\n        /// <param name=\"writerGroupName\"></param>\n        /// <param name=\"networkMessageContentFlags\"></param>\n        /// <param name=\"dataSetClassId\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"timestamp\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"standardsCompliant\"></param>\n        /// <param name=\"isBatched\"></param>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"message\"></param>\n        /// <returns></returns>\n        public static bool TryCreateNetworkMessage(MessageEncoding encoding,\n            string publisherId, string writerGroupName,\n            NetworkMessageContentFlags? networkMessageContentFlags,\n            Guid dataSetClassId, Func<ushort> sequenceNumber, DateTimeOffset timestamp,\n            NamespaceFormat namespaceFormat, bool standardsCompliant, bool isBatched,\n            IEventSchema? schema, [NotNullWhen(true)] out BaseNetworkMessage? message)\n        {\n            if (encoding.HasFlag(MessageEncoding.Json))\n            {\n                message = new JsonNetworkMessage\n                {\n                    UseAdvancedEncoding = !standardsCompliant,\n                    UseGzipCompression = encoding.HasFlag(MessageEncoding.IsGzipCompressed),\n                    NamespaceFormat = namespaceFormat,\n                    UseArrayEnvelope = !standardsCompliant && isBatched,\n                    MessageId = () => Guid.NewGuid().ToString(),\n                    NetworkMessageContentMask = networkMessageContentFlags\n                        ?? DefaultNetworkMessageContentFlags,\n                    PublisherId = publisherId,\n                    DataSetClassId = dataSetClassId,\n                    DataSetWriterGroup = writerGroupName\n                };\n            }\n            else if (encoding.HasFlag(MessageEncoding.Avro))\n            {\n                message = new AvroNetworkMessage\n                {\n                    Schema = (schema is Schemas.Avro.IAvroSchema s) ? s.Schema :\n                        schema == null ? null : Avro.Schema.Parse(schema.Schema),\n                    UseGzipCompression = encoding.HasFlag(MessageEncoding.IsGzipCompressed),\n                    MessageId = () => Guid.NewGuid().ToString(),\n                    NetworkMessageContentMask = networkMessageContentFlags\n                        ?? DefaultNetworkMessageContentFlags,\n                    PublisherId = publisherId,\n                    DataSetClassId = dataSetClassId,\n                    DataSetWriterGroup = writerGroupName\n                };\n            }\n            else if (encoding.HasFlag(MessageEncoding.Uadp))\n            {\n                message = new UadpNetworkMessage\n                {\n                    //   WriterGroupId = writerGroup.Index,\n                    //   GroupVersion = writerGroup.Version,\n                    SequenceNumber = sequenceNumber,\n                    Timestamp = timestamp,\n                    PicoSeconds = 0,\n                    NetworkMessageContentMask = networkMessageContentFlags\n                        ?? DefaultNetworkMessageContentFlags,\n                    PublisherId = publisherId,\n                    DataSetClassId = dataSetClassId,\n                    DataSetWriterGroup = writerGroupName\n                };\n            }\n            else\n            {\n                message = default;\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Create network message schema\n        /// </summary>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"networkMessage\"></param>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public static bool TryCreateNetworkMessageSchema(MessageEncoding encoding,\n            PublishedNetworkMessageSchemaModel networkMessage,\n            [NotNullWhen(true)] out IEventSchema? schema, SchemaOptions? options = null)\n        {\n            if (encoding.HasFlag(MessageEncoding.Json) && options?.PreferAvroOverJsonSchema == true)\n            {\n                schema = new Schemas.Avro.JsonNetworkMessage(networkMessage, options);\n            }\n            else if (encoding.HasFlag(MessageEncoding.Json))\n            {\n                schema = new Schemas.Json.JsonNetworkMessage(networkMessage, options);\n            }\n            else if (encoding.HasFlag(MessageEncoding.Avro))\n            {\n                schema = new Schemas.Avro.AvroNetworkMessage(networkMessage, options);\n            }\n            else if (encoding.HasFlag(MessageEncoding.Uadp))\n            {\n                schema = new Schemas.Uadp.UadpNetworkMessage(networkMessage);\n            }\n            else\n            {\n                schema = default;\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Decode pub sub messages from a single network buffer. If the message\n        /// was chunked, the message might not be fully reconstituted.\n        /// </summary>\n        /// <param name=\"buffer\"></param>\n        /// <param name=\"contentType\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"resolver\"></param>\n        /// <param name=\"messageSchema\"></param>\n        /// <returns></returns>\n        public static PubSubMessage? Decode(ReadOnlySequence<byte> buffer, string contentType,\n            Opc.Ua.IServiceMessageContext context, IDataSetMetaDataResolver? resolver = null,\n            string? messageSchema = null)\n        {\n            var reader = new Queue<ReadOnlySequence<byte>>();\n            reader.Enqueue(buffer);\n            return DecodeOne(reader, contentType, context, resolver, messageSchema);\n        }\n\n        /// <summary>\n        /// Decode all messages from the provided chunk reader. The reader\n        /// is a queue of byte sequences, each representing a network buffer.\n        /// </summary>\n        /// <param name=\"reader\"></param>\n        /// <param name=\"contentType\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"resolver\"></param>\n        /// <param name=\"messageSchema\"></param>\n        /// <returns></returns>\n        public static IEnumerable<PubSubMessage> Decode(Queue<ReadOnlySequence<byte>> reader,\n            string contentType, Opc.Ua.IServiceMessageContext context,\n            IDataSetMetaDataResolver? resolver = null, string? messageSchema = null)\n        {\n            while (true)\n            {\n                var message = DecodeOne(reader, contentType, context, resolver, messageSchema);\n                if (message == null)\n                {\n                    yield break;\n                }\n                else\n                {\n                    yield return message;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Decode messages from stream. The stream will be read until the\n        /// entire message has been loaded. UADP messages can be chunked\n        /// the stream therefore must include all chunks to decode successfully.\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"contentType\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"resolver\"></param>\n        /// <param name=\"messageSchema\"></param>\n        /// <returns></returns>\n        public static IEnumerable<PubSubMessage> Decode(Stream stream,\n            string contentType, Opc.Ua.IServiceMessageContext context,\n            IDataSetMetaDataResolver? resolver = null, string? messageSchema = null)\n        {\n            while (stream.Position != stream.Length)\n            {\n                PubSubMessage message;\n                long pos;\n#pragma warning disable CA1308 // Normalize strings to uppercase\n                switch (contentType.ToLowerInvariant())\n                {\n                    case Encoders.ContentType.JsonGzip:\n                    case ContentMimeType.Json:\n                    case Encoders.ContentType.UaJson:\n                    case Encoders.ContentType.UaLegacyPublisher:\n                    case Encoders.ContentType.UaNonReversibleJson:\n                        message = new JsonNetworkMessage\n                        {\n                            MessageSchemaToUse = messageSchema,\n                            UseGzipCompression = contentType.Equals(\n                                Encoders.ContentType.JsonGzip,\n                                StringComparison.OrdinalIgnoreCase)\n                        };\n                        pos = stream.Position;\n                        if (message.TryDecode(context, stream, resolver))\n                        {\n                            yield return message;\n                        }\n                        else\n                        {\n                            stream.Position = pos;\n                            message = new JsonMetaDataMessage();\n                            if (message.TryDecode(context, stream, resolver))\n                            {\n                                yield return message;\n                            }\n                            else\n                            {\n                                yield break;\n                            }\n                        }\n                        break;\n                    case ContentMimeType.Binary:\n                    case Encoders.ContentType.Uadp:\n                        message = new UadpNetworkMessage();\n                        pos = stream.Position;\n                        if (message.TryDecode(context, stream, resolver))\n                        {\n                            yield return message;\n                        }\n                        else\n                        {\n                            stream.Position = pos;\n                            message = new UadpDiscoveryMessage();\n                            if (message.TryDecode(context, stream, resolver))\n                            {\n                                yield return message;\n                            }\n                            else\n                            {\n                                yield break;\n                            }\n                        }\n                        break;\n\n                    case Encoders.ContentType.Avro:\n                    case Encoders.ContentType.AvroGzip:\n                    case ContentMimeType.AvroBinary:\n                        message = new AvroNetworkMessage\n                        {\n                            Schema = Avro.Schema.Parse(messageSchema),\n                            UseGzipCompression = contentType.Equals(\n                                Encoders.ContentType.AvroGzip, StringComparison.OrdinalIgnoreCase)\n                        };\n                        if (message.TryDecode(context, stream, resolver))\n                        {\n                            yield return message;\n                        }\n                        else\n                        {\n                            yield break;\n                        }\n                        break;\n                    default:\n                        break;\n                }\n#pragma warning restore CA1308 // Normalize strings to uppercase\n            }\n        }\n\n        /// <summary>\n        /// Decode one pub sub messages from the chunks provided by the reader\n        /// Avro and JSON do not support chunking hence only ever one chunk is\n        /// pulled from the reader.\n        /// </summary>\n        /// <param name=\"reader\"></param>\n        /// <param name=\"contentType\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"resolver\"></param>\n        /// <param name=\"messageSchema\"></param>\n        /// <returns></returns>\n        internal static PubSubMessage? DecodeOne(Queue<ReadOnlySequence<byte>> reader,\n            string contentType, Opc.Ua.IServiceMessageContext context,\n            IDataSetMetaDataResolver? resolver, string? messageSchema = null)\n        {\n            if (reader.Count == 0)\n            {\n                return null;\n            }\n            PubSubMessage message;\n#pragma warning disable CA1308 // Normalize strings to uppercase\n            switch (contentType.ToLowerInvariant())\n            {\n                case Encoders.ContentType.JsonGzip:\n                case ContentMimeType.Json:\n                case Encoders.ContentType.UaJson:\n                case Encoders.ContentType.UaLegacyPublisher:\n                case Encoders.ContentType.UaNonReversibleJson:\n                    message = new JsonNetworkMessage\n                    {\n                        MessageSchemaToUse = messageSchema,\n                        UseGzipCompression = contentType.Equals(\n                            Encoders.ContentType.JsonGzip, StringComparison.OrdinalIgnoreCase)\n                    };\n                    if (message.TryDecode(context, reader, resolver))\n                    {\n                        return message;\n                    }\n                    if (reader.Count == 0)\n                    {\n                        return null;\n                    }\n                    message = new JsonMetaDataMessage();\n                    if (message.TryDecode(context, reader, resolver))\n                    {\n                        return message;\n                    }\n                    break;\n                case ContentMimeType.Binary:\n                case Encoders.ContentType.Uadp:\n                    message = new UadpNetworkMessage();\n                    if (message.TryDecode(context, reader, resolver))\n                    {\n                        return message;\n                    }\n                    if (reader.Count == 0)\n                    {\n                        return null;\n                    }\n                    message = new UadpDiscoveryMessage();\n                    if (message.TryDecode(context, reader, resolver))\n                    {\n                        return message;\n                    }\n                    break;\n\n                case Encoders.ContentType.Avro:\n                case Encoders.ContentType.AvroGzip:\n                case ContentMimeType.AvroBinary:\n                    message = new AvroNetworkMessage\n                    {\n                        Schema = Avro.Schema.Parse(messageSchema),\n                        UseGzipCompression = contentType.Equals(\n                            Encoders.ContentType.AvroGzip, StringComparison.OrdinalIgnoreCase)\n                    };\n                    if (message.TryDecode(context, reader, resolver))\n                    {\n                        return message;\n                    }\n                    if (reader.Count == 0)\n                    {\n                        return null;\n                    }\n                    break;\n                default:\n                    break;\n            }\n#pragma warning restore CA1308 // Normalize strings to uppercase\n            // Failed\n            return null;\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not PubSubMessage wrapper)\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.PublisherId, PublisherId))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(PublisherId);\n            return hash.ToHashCode();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/StackExtensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Metadata extensions\n    /// </summary>\n    internal static class StackExtensions\n    {\n        /// <summary>\n        /// Compare\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this PublishedDataSetMetaDataModel? model,\n            PublishedDataSetMetaDataModel? that)\n        {\n            if (model == null && that == null)\n            {\n                return true;\n            }\n            if (model == null || that == null)\n            {\n                return false;\n            }\n            return\n                model.DataSetMetaData.IsSameAs(that.DataSetMetaData) &&\n                model.MinorVersion == that.MinorVersion &&\n                model.StructureDataTypes.SequenceEqualsSafe(that.StructureDataTypes, IsSameAs) &&\n                model.EnumDataTypes.SequenceEqualsSafe(that.EnumDataTypes, IsSameAs) &&\n                model.SimpleDataTypes.SequenceEqualsSafe(that.SimpleDataTypes, IsSameAs) &&\n                model.Fields.SequenceEqualsSafe(that.Fields, IsSameAs)\n               ;\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static DataSetMetaDataType ToStackModel(\n            this PublishedDataSetMetaDataModel model, IServiceMessageContext context)\n        {\n            return new DataSetMetaDataType\n            {\n                Name = model.DataSetMetaData.Name,\n                Description = model.DataSetMetaData.Description,\n                DataSetClassId = (Uuid)model.DataSetMetaData.DataSetClassId,\n                Namespaces = context.NamespaceUris.ToArray(),\n                StructureDataTypes = model.StructureDataTypes?\n                    .Select(s => s.ToStackModel(context)).ToArray(),\n                EnumDataTypes = model.EnumDataTypes?\n                    .Select(e => e.ToStackModel(context)).ToArray(),\n                SimpleDataTypes = model.SimpleDataTypes?\n                    .Select(e => e.ToStackModel(context)).ToArray(),\n                Fields = model.Fields\n                    .Select(e => e.ToStackModel(context)).ToArray(),\n                ConfigurationVersion = new ConfigurationVersionDataType\n                {\n                    MajorVersion = model.DataSetMetaData.MajorVersion ?? 1,\n                    MinorVersion = model.MinorVersion\n                }\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static PublishedDataSetMetaDataModel? ToServiceModel(\n            this DataSetMetaDataType? model, IServiceMessageContext? context = null)\n        {\n            if (model == null)\n            {\n                return null;\n            }\n            var localContext = new ServiceMessageContext();\n            if (model.Namespaces != null)\n            {\n                foreach (var ns in model.Namespaces)\n                {\n                    localContext.NamespaceUris.GetIndexOrAppend(ns);\n                }\n            }\n            if (context != null)\n            {\n                for (var i = 0; i < context.NamespaceUris.Count; i++)\n                {\n                    localContext.NamespaceUris.GetIndexOrAppend(\n                        context.NamespaceUris.GetString((uint)i));\n                }\n            }\n            context = localContext;\n            return new PublishedDataSetMetaDataModel\n            {\n                DataSetMetaData = new DataSetMetaDataModel\n                {\n                    Name = model.Name,\n                    Description = model.Description.AsString(),\n                    DataSetClassId = model.DataSetClassId,\n                    MajorVersion = model.ConfigurationVersion.MajorVersion\n                },\n                MinorVersion = model.ConfigurationVersion.MinorVersion,\n                StructureDataTypes = model.StructureDataTypes?\n                    .Select(s => s.ToServiceModel(context)).ToArray(),\n                EnumDataTypes = model.EnumDataTypes?\n                    .Select(e => e.ToServiceModel(context)).ToArray(),\n                SimpleDataTypes = model.SimpleDataTypes?\n                    .Select(e => e.ToServiceModel(context)).ToArray(),\n                Fields = model.Fields\n                    .Select(e => e.ToServiceModel(context)).ToArray()\n            };\n        }\n\n        /// <summary>\n        /// Compare\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        private static bool IsSameAs(this EnumDescriptionModel? model,\n            EnumDescriptionModel? that)\n        {\n            if (model == null && that == null)\n            {\n                return true;\n            }\n            if (model == null || that == null)\n            {\n                return false;\n            }\n            return\n                model.BuiltInType == that.BuiltInType &&\n                model.DataTypeId == that.DataTypeId &&\n                model.Name == that.Name &&\n                model.IsOptionSet == that.IsOptionSet &&\n                model.Fields.SequenceEqualsSafe(that.Fields, IsSameAs)\n               ;\n        }\n\n        /// <summary>\n        /// Convert to type description\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static EnumDescription ToStackModel(this EnumDescriptionModel model,\n            IServiceMessageContext context)\n        {\n            return new EnumDescription\n            {\n                BuiltInType = model.BuiltInType ?? (byte)BuiltInType.Null,\n                DataTypeId = model.DataTypeId.ToNodeId(context),\n                Name = model.Name.ToQualifiedName(context),\n                EnumDefinition = new EnumDefinition\n                {\n                    Fields = model.Fields.Select(f => f.ToStackModel()).ToArray(),\n                    IsOptionSet = model.IsOptionSet\n                }\n            };\n        }\n\n        /// <summary>\n        /// Convert to type description\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static EnumDescriptionModel ToServiceModel(this EnumDescription model,\n            IServiceMessageContext context)\n        {\n            ArgumentNullException.ThrowIfNull(model.EnumDefinition);\n            return new EnumDescriptionModel\n            {\n                BuiltInType = model.BuiltInType,\n                DataTypeId = (model.DataTypeId\n                    .AsString(context, NamespaceFormat.Expanded)) ?? string.Empty,\n                Name = model.Name\n                    .AsString(context, NamespaceFormat.Expanded),\n                Fields = model.EnumDefinition.Fields\n                    .Select(f => f.ToServiceModel()).ToArray(),\n                IsOptionSet = model.EnumDefinition.IsOptionSet\n            };\n        }\n\n        /// <summary>\n        /// Compare\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        private static bool IsSameAs(this EnumFieldDescriptionModel? model,\n            EnumFieldDescriptionModel? that)\n        {\n            if (model == null && that == null)\n            {\n                return true;\n            }\n            if (model == null || that == null)\n            {\n                return false;\n            }\n            return\n                model.Name == that.Name &&\n                model.DisplayName == that.DisplayName &&\n                model.Value == that.Value;\n        }\n\n        /// <summary>\n        /// Convert to field\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        private static EnumField ToStackModel(this EnumFieldDescriptionModel model)\n        {\n            return new EnumField\n            {\n                Name = model.Name,\n                DisplayName = model.DisplayName,\n                Value = model.Value\n            };\n        }\n\n        /// <summary>\n        /// Convert to field\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        private static EnumFieldDescriptionModel ToServiceModel(this EnumField model)\n        {\n            return new EnumFieldDescriptionModel\n            {\n                Name = model.Name,\n                DisplayName = model.DisplayName.AsString(),\n                Value = model.Value\n            };\n        }\n\n        /// <summary>\n        /// Compare\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        private static bool IsSameAs(this StructureDescriptionModel? model,\n            StructureDescriptionModel? that)\n        {\n            if (model == null && that == null)\n            {\n                return true;\n            }\n            if (model == null || that == null)\n            {\n                return false;\n            }\n            return\n                model.Name == that.Name &&\n                model.DataTypeId == that.DataTypeId &&\n                model.BaseDataType == that.BaseDataType &&\n                model.DefaultEncodingId == that.DefaultEncodingId &&\n                model.StructureType == that.StructureType &&\n                model.Fields.SequenceEqualsSafe(that.Fields, IsSameAs);\n        }\n\n        /// <summary>\n        /// Convert to type description\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static StructureDescription ToStackModel(\n            this StructureDescriptionModel model, IServiceMessageContext context)\n        {\n            return new StructureDescription\n            {\n                Name = model.Name.ToQualifiedName(context),\n                DataTypeId = model.DataTypeId.ToNodeId(context),\n                StructureDefinition = new StructureDefinition\n                {\n                    BaseDataType = model.BaseDataType.ToNodeId(context),\n                    DefaultEncodingId = model.DefaultEncodingId.ToNodeId(context),\n                    FirstExplicitFieldIndex = 0,\n                    StructureType = model.StructureType.ToStackType(),\n                    Fields = model.Fields.Select(f => f.ToStackModel(context)).ToArray()\n                }\n            };\n        }\n\n        /// <summary>\n        /// Convert to type description\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static StructureDescriptionModel ToServiceModel(\n            this StructureDescription model, IServiceMessageContext context)\n        {\n            ArgumentNullException.ThrowIfNull(model.StructureDefinition);\n            return new StructureDescriptionModel\n            {\n                Name = model.Name\n                    .AsString(context, NamespaceFormat.Expanded),\n                DataTypeId = (model.DataTypeId\n                    .AsString(context, NamespaceFormat.Expanded)) ?? string.Empty,\n                BaseDataType = model.StructureDefinition.BaseDataType\n                    .AsString(context, NamespaceFormat.Expanded),\n                DefaultEncodingId = model.StructureDefinition.DefaultEncodingId\n                    .AsString(context, NamespaceFormat.Expanded),\n                // FirstExplicitFieldIndex = 0,\n                StructureType = model.StructureDefinition.StructureType.ToServiceType(),\n                Fields = model.StructureDefinition.Fields\n                    .Select(f => f.ToServiceModel(context)).ToArray()\n            };\n        }\n\n        /// <summary>\n        /// Compare\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        private static bool IsSameAs(this StructureFieldDescriptionModel? model,\n            StructureFieldDescriptionModel? that)\n        {\n            if (model == null && that == null)\n            {\n                return true;\n            }\n            if (model == null || that == null)\n            {\n                return false;\n            }\n            return\n                model.Name == that.Name &&\n                model.ArrayDimensions.SequenceEqualsSafe(that.ArrayDimensions) &&\n                model.IsOptional == that.IsOptional &&\n                model.DataType == that.DataType &&\n                model.Description == that.Description &&\n                model.MaxStringLength == that.MaxStringLength &&\n                model.ValueRank == that.ValueRank;\n        }\n\n        /// <summary>\n        /// Convert to field\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static StructureField ToStackModel(\n            this StructureFieldDescriptionModel model, IServiceMessageContext context)\n        {\n            return new StructureField\n            {\n                Name = model.Name,\n                ArrayDimensions = model.ArrayDimensions?\n                    .ToArray(),\n                IsOptional = model.IsOptional,\n                DataType = model.DataType\n                    .ToNodeId(context),\n                Description = model.Description,\n                MaxStringLength = model.MaxStringLength,\n                ValueRank = model.ValueRank\n            };\n        }\n\n        /// <summary>\n        /// Convert to field\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static StructureFieldDescriptionModel ToServiceModel(\n            this StructureField model, IServiceMessageContext context)\n        {\n            return new StructureFieldDescriptionModel\n            {\n                Name = model.Name,\n                ArrayDimensions = model.ArrayDimensions?\n                    .ToArray(),\n                IsOptional = model.IsOptional,\n                DataType = (model.DataType\n                    .AsString(context, NamespaceFormat.Expanded)) ?? string.Empty,\n                Description = model.Description.AsString(),\n                MaxStringLength = model.MaxStringLength,\n                ValueRank = model.ValueRank\n            };\n        }\n\n        /// <summary>\n        /// Compare\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        private static bool IsSameAs(this SimpleTypeDescriptionModel? model,\n            SimpleTypeDescriptionModel? that)\n        {\n            if (model == null && that == null)\n            {\n                return true;\n            }\n            if (model == null || that == null)\n            {\n                return false;\n            }\n            return\n                model.BaseDataType == that.BaseDataType &&\n                model.BuiltInType == that.BuiltInType &&\n                model.DataTypeId == that.DataTypeId &&\n                model.Name == that.Name;\n        }\n\n        /// <summary>\n        /// Convert to type description\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static SimpleTypeDescription ToStackModel(\n            this SimpleTypeDescriptionModel model, IServiceMessageContext context)\n        {\n            return new SimpleTypeDescription\n            {\n                BaseDataType = model.BaseDataType.ToNodeId(context),\n                BuiltInType = model.BuiltInType ?? (byte)BuiltInType.Null,\n                Name = model.Name.ToQualifiedName(context),\n                DataTypeId = model.DataTypeId.ToNodeId(context)\n            };\n        }\n\n        /// <summary>\n        /// Convert to type description\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static SimpleTypeDescriptionModel ToServiceModel(\n            this SimpleTypeDescription model, IServiceMessageContext context)\n        {\n            return new SimpleTypeDescriptionModel\n            {\n                BaseDataType = model.BaseDataType\n                    .AsString(context, NamespaceFormat.Expanded),\n                BuiltInType = model.BuiltInType,\n                Name = model.Name\n                    .AsString(context, NamespaceFormat.Expanded),\n                DataTypeId = (model.DataTypeId\n                    .AsString(context, NamespaceFormat.Expanded)) ?? string.Empty\n            };\n        }\n\n        /// <summary>\n        /// Compare\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        private static bool IsSameAs(this PublishedFieldMetaDataModel? model,\n            PublishedFieldMetaDataModel? that)\n        {\n            if (model == null && that == null)\n            {\n                return true;\n            }\n            if (model == null || that == null)\n            {\n                return false;\n            }\n            return\n                model.Name == that.Name &&\n                model.Id == that.Id &&\n                model.ArrayDimensions.SequenceEqualsSafe(that.ArrayDimensions) &&\n                model.BuiltInType == that.BuiltInType &&\n                model.DataType == that.DataType &&\n                model.Description == that.Description &&\n                model.MaxStringLength == that.MaxStringLength &&\n                model.ValueRank == that.ValueRank &&\n                model.Flags == that.Flags;\n        }\n\n        /// <summary>\n        /// Convert to field metadata\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static FieldMetaData ToStackModel(\n            this PublishedFieldMetaDataModel field, IServiceMessageContext context)\n        {\n            return new FieldMetaData\n            {\n                Name = field.Name,\n                DataSetFieldId = (Uuid)field.Id,\n                ArrayDimensions = field.ArrayDimensions?\n                    .ToArray(),\n                BuiltInType = field.BuiltInType,\n                DataType = field.DataType\n                    .ToNodeId(context),\n                Description = field.Description,\n                MaxStringLength = field.MaxStringLength,\n                ValueRank = field.ValueRank,\n                FieldFlags = field.Flags,\n                Properties = null // TODO\n            };\n        }\n\n        /// <summary>\n        /// Convert to field metadata\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private static PublishedFieldMetaDataModel ToServiceModel(\n            this FieldMetaData field, IServiceMessageContext context)\n        {\n            return new PublishedFieldMetaDataModel\n            {\n                Name = field.Name,\n                Id = field.DataSetFieldId,\n                ArrayDimensions = field.ArrayDimensions?\n                    .ToArray(),\n                BuiltInType = field.BuiltInType,\n                DataType = field.DataType\n                    .AsString(context, NamespaceFormat.Expanded),\n                Description = field.Description.AsString(),\n                MaxStringLength = field.MaxStringLength,\n                ValueRank = field.ValueRank,\n                Flags = field.FieldFlags,\n                Properties = null // TODO\n            };\n        }\n\n        /// <summary>\n        /// Compare\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        private static bool IsSameAs(this DataSetMetaDataModel? model,\n            DataSetMetaDataModel? that)\n        {\n            if (model == null && that == null)\n            {\n                return true;\n            }\n            if (model == null || that == null)\n            {\n                return false;\n            }\n            return\n                model.Name == that.Name &&\n                model.Description == that.Description &&\n                model.DataSetClassId == that.DataSetClassId &&\n                model.MajorVersion == that.MajorVersion;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/UadpDataSetMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Xml;\n\n    /// <summary>\n    /// Data set message\n    /// </summary>\n    public class UadpDataSetMessage : BaseDataSetMessage\n    {\n        /// <summary>\n        /// Get and set the configured size of the message\n        /// </summary>\n        public ushort ConfiguredSize { get; set; }\n\n        /// <summary>\n        /// Get and set the DataSetOffset of the message\n        /// </summary>\n        public ushort DataSetOffset { get; set; }\n\n        /// <summary>\n        /// Get or set decoded payload size (hold it here for now)\n        /// </summary>\n        internal ushort PayloadSizeInStream { get; set; }\n\n        /// <summary>\n        /// Get and Set the startPosition in decoder\n        /// </summary>\n        internal int StartPositionInStream { get; set; }\n\n        /// <summary>\n        /// Get or set timestamp pico seconds\n        /// </summary>\n        public ushort PicoSeconds { get; set; }\n\n        /// <summary>\n        /// The possible values for the DataSetFlags1 encoding byte.\n        /// </summary>\n        [Flags]\n        internal enum DataSetFlags1EncodingMask : byte\n        {\n            None = 0,\n            MessageIsValid = 1,\n            FieldTypeRawData = 2,\n            FieldTypeDataValue = 4,\n            FieldTypeUsedBits = FieldTypeRawData | FieldTypeDataValue,\n            DataSetMessageSequenceNumber = 8,\n            Status = 16,\n            ConfigurationVersionMajorVersion = 32,\n            ConfigurationVersionMinorVersion = 64,\n            DataSetFlags2 = 128,\n\n            DataSetFlags1UsedBits =\n                MessageIsValid |\n                DataSetMessageSequenceNumber |\n                Status |\n                ConfigurationVersionMajorVersion |\n                ConfigurationVersionMinorVersion |\n                DataSetFlags2\n        }\n\n        /// <summary>\n        /// The possible values for the DataSetFlags2 encoding byte.\n        /// </summary>\n        [Flags]\n        internal enum DataSetFlags2EncodingMask : byte\n        {\n            DataKeyFrame = 0,\n            DataDeltaFrame = 1,\n            Event = 2,\n            KeepAlive = DataDeltaFrame | Event,\n            Reserved1 = 4,\n            MessageTypeBits = KeepAlive | Reserved1,\n            Timestamp = 16,\n            PicoSeconds = 32,\n            Reserved2 = 64,\n            ReservedForExtendedFlags = 128\n        }\n\n        /// <summary>\n        /// Get DataSetFlags1\n        /// </summary>\n        internal DataSetFlags1EncodingMask DataSetFlags1\n        {\n            get\n            {\n                if (_dataSetFlags1 == null)\n                {\n                    _dataSetFlags1 = DataSetFlags1EncodingMask.MessageIsValid;\n\n                    // DataSetFlags1: Bit range 1-2: Field Encoding\n                    _dataSetFlags1 &= ~DataSetFlags1EncodingMask.FieldTypeUsedBits;\n                    if ((Payload.DataSetFieldContentMask & DataSetFieldContentFlags.RawData) != 0)\n                    {\n                        _dataSetFlags1 |= DataSetFlags1EncodingMask.FieldTypeRawData;\n                    }\n                    else if (Payload.DataSetFieldContentMask != 0)\n                    {\n                        _dataSetFlags1 |= DataSetFlags1EncodingMask.FieldTypeDataValue;\n                    }\n\n                    if ((DataSetMessageContentMask & DataSetMessageContentFlags.SequenceNumber) != 0)\n                    {\n                        // DataSetFlags1: Bit range 3: sequence\n                        _dataSetFlags1 |= DataSetFlags1EncodingMask.DataSetMessageSequenceNumber;\n                    }\n                    if ((DataSetMessageContentMask & DataSetMessageContentFlags.Status) != 0)\n                    {\n                        // DataSetFlags1: Bit range 4: status\n                        _dataSetFlags1 |= DataSetFlags1EncodingMask.Status;\n                    }\n                    if ((DataSetMessageContentMask & DataSetMessageContentFlags.MajorVersion) != 0)\n                    {\n                        // DataSetFlags1: Bit range 5: major version\n                        _dataSetFlags1 |= DataSetFlags1EncodingMask.ConfigurationVersionMajorVersion;\n                    }\n                    if ((DataSetMessageContentMask & DataSetMessageContentFlags.MinorVersion) != 0)\n                    {\n                        // DataSetFlags1: Bit range 6: minor version\n                        _dataSetFlags1 |= DataSetFlags1EncodingMask.ConfigurationVersionMinorVersion;\n                    }\n\n                    // DataSetFlags1: Bit 7 if needed\n                    if ((DataSetMessageContentMask & (DataSetMessageContentFlags.Timestamp |\n                                                      DataSetMessageContentFlags.PicoSeconds)) != 0)\n                    {\n                        _dataSetFlags1 |= DataSetFlags1EncodingMask.DataSetFlags2;\n                    }\n                    if (MessageType != MessageType.KeyFrame)\n                    {\n                        _dataSetFlags1 |= DataSetFlags1EncodingMask.DataSetFlags2;\n                    }\n                }\n                return _dataSetFlags1.Value;\n            }\n            private set\n            {\n                _dataSetFlags1 = value;\n                if ((value & DataSetFlags1EncodingMask.MessageIsValid) != 0)\n                {\n                    // DataSetFlags1: Bit range 1-2: Field Encoding\n                    if ((value & DataSetFlags1EncodingMask.FieldTypeRawData) != 0)\n                    {\n                        Payload.DataSetFieldContentMask = DataSetFieldContentFlags.RawData;\n                    }\n                    else if ((value & DataSetFlags1EncodingMask.FieldTypeDataValue) != 0)\n                    {\n                        Payload.DataSetFieldContentMask = DataSetFieldContentFlags.StatusCode\n                                                        | DataSetFieldContentFlags.SourceTimestamp\n                                                        | DataSetFieldContentFlags.ServerTimestamp\n                                                        | DataSetFieldContentFlags.SourcePicoSeconds\n                                                        | DataSetFieldContentFlags.ServerPicoSeconds;\n                    }\n                    else\n                    {\n                        Payload.DataSetFieldContentMask = 0;\n                    }\n\n                    // DataSetFlags1: Bit range 3: sequence\n                    if ((value & DataSetFlags1EncodingMask.DataSetMessageSequenceNumber) != 0)\n                    {\n                        DataSetMessageContentMask |= DataSetMessageContentFlags.SequenceNumber;\n                    }\n                    if ((value & DataSetFlags1EncodingMask.Status) != 0)\n                    {\n                        // DataSetFlags1: Bit range 4: status\n                        DataSetMessageContentMask |= DataSetMessageContentFlags.Status;\n                    }\n                    if ((value & DataSetFlags1EncodingMask.ConfigurationVersionMajorVersion) != 0)\n                    {\n                        // DataSetFlags1: Bit range 5: major version\n                        DataSetMessageContentMask |= DataSetMessageContentFlags.MajorVersion;\n                    }\n                    if ((value & DataSetFlags1EncodingMask.ConfigurationVersionMinorVersion) != 0)\n                    {\n                        // DataSetFlags1: Bit range 6: minor version\n                        DataSetMessageContentMask |= DataSetMessageContentFlags.MinorVersion;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get DataSetFlags2\n        /// </summary>\n        /// <exception cref=\"EncodingException\"></exception>\n        internal DataSetFlags2EncodingMask DataSetFlags2\n        {\n            get\n            {\n                if (_dataSetFlags2 == null)\n                {\n                    _dataSetFlags2 = 0;\n\n                    // Bit range 0-3: DataSetMessage type\n                    switch (MessageType)\n                    {\n                        case MessageType.DeltaFrame:\n                            _dataSetFlags2 |= DataSetFlags2EncodingMask.DataDeltaFrame;\n                            break;\n                        case MessageType.Event:\n                            _dataSetFlags2 |= DataSetFlags2EncodingMask.Event;\n                            break;\n                        case MessageType.KeepAlive:\n                            _dataSetFlags2 |= DataSetFlags2EncodingMask.KeepAlive;\n                            break;\n                        case MessageType.Condition:\n                            _dataSetFlags2 |= DataSetFlags2EncodingMask.Event | DataSetFlags2EncodingMask.Reserved1;\n                            break;\n                        case MessageType.KeyFrame:\n                            // Default is key frame\n                            break;\n                        default:\n                            throw new EncodingException(\n                                $\"Message type {MessageType} not valid for data set messages.\");\n                    }\n\n                    // Bit range 4-5: timestamp\n                    if ((DataSetMessageContentMask & DataSetMessageContentFlags.Timestamp) != 0)\n                    {\n                        _dataSetFlags2 |= DataSetFlags2EncodingMask.Timestamp;\n                    }\n                    if ((DataSetMessageContentMask & DataSetMessageContentFlags.PicoSeconds) != 0)\n                    {\n                        _dataSetFlags2 |= DataSetFlags2EncodingMask.PicoSeconds;\n                    }\n                }\n                return _dataSetFlags2.Value;\n            }\n            private set\n            {\n                _dataSetFlags2 = value;\n\n                // Bit range 0-3: DataSetMessage type\n                switch (value & DataSetFlags2EncodingMask.MessageTypeBits)\n                {\n                    case DataSetFlags2EncodingMask.DataDeltaFrame:\n                        MessageType = MessageType.DeltaFrame;\n                        break;\n                    case DataSetFlags2EncodingMask.Event:\n                        MessageType = MessageType.Event;\n                        break;\n                    case DataSetFlags2EncodingMask.KeepAlive:\n                        MessageType = MessageType.KeepAlive;\n                        break;\n                    default:\n                        // Default is key frame\n                        MessageType = MessageType.KeyFrame;\n                        break;\n                }\n\n                // Bit range 4-5: timestamp\n                if ((value & DataSetFlags2EncodingMask.Timestamp) != 0)\n                {\n                    DataSetMessageContentMask |= DataSetMessageContentFlags.Timestamp;\n                }\n                if ((value & DataSetFlags2EncodingMask.PicoSeconds) != 0)\n                {\n                    DataSetMessageContentMask |= DataSetMessageContentFlags.PicoSeconds;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        internal void Encode(BinaryEncoder binaryEncoder, IDataSetMetaDataResolver? resolver)\n        {\n            StartPositionInStream = binaryEncoder.Position;\n            if (DataSetOffset > 0 && StartPositionInStream < DataSetOffset)\n            {\n                StartPositionInStream = DataSetOffset;\n                binaryEncoder.Position = DataSetOffset;\n            }\n\n            WriteDataSetMessageHeader(binaryEncoder);\n\n            var metadata = resolver?.Find(DataSetWriterId,\n                MetaDataVersion?.MajorVersion ?? 1, MetaDataVersion?.MinorVersion ?? 0);\n\n            if ((DataSetFlags2 & DataSetFlags2EncodingMask.DataDeltaFrame) != 0)\n            {\n                WritePayloadDeltaFrame(binaryEncoder, metadata);\n            }\n            else\n            {\n                //\n                // Every other type is encoded as key frame. Technically we should also encode\n                // as keyframe if delta frame would be larger, but we skip this for now.\n                //\n                WritePayloadKeyFrame(binaryEncoder, metadata);\n            }\n\n            PayloadSizeInStream = (ushort)(binaryEncoder.Position - StartPositionInStream);\n            if (ConfiguredSize > 0 && PayloadSizeInStream < ConfiguredSize)\n            {\n                PayloadSizeInStream = ConfiguredSize;\n                binaryEncoder.Position = StartPositionInStream + PayloadSizeInStream;\n            }\n        }\n\n        /// <summary>\n        /// Decode data set message\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <param name=\"resolver\"></param>\n        /// <exception cref=\"DecodingException\"></exception>\n        internal bool TryDecode(BinaryDecoder decoder, IDataSetMetaDataResolver? resolver)\n        {\n            if (decoder is not BinaryDecoder binaryDecoder)\n            {\n                throw new DecodingException(\"Must use Binary decoder here\");\n            }\n            try\n            {\n                if (!TryReadDataSetMessageHeader(binaryDecoder))\n                {\n                    return false;\n                }\n\n                var metadata = resolver?.Find(DataSetWriterId,\n                    MetaDataVersion?.MajorVersion ?? 1, MetaDataVersion?.MinorVersion ?? 0);\n                if ((DataSetFlags2 & DataSetFlags2EncodingMask.DataDeltaFrame) != 0)\n                {\n                    ReadPayloadDeltaFrame(binaryDecoder, metadata);\n                }\n                else\n                {\n                    ReadPayloadKeyFrame(binaryDecoder, metadata);\n                }\n                return true;\n            }\n            catch (EndOfStreamException)\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Read DataSet message header\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        private bool TryReadDataSetMessageHeader(BinaryDecoder decoder)\n        {\n            DataSetFlags1 = (DataSetFlags1EncodingMask)decoder.ReadByte(null);\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.MessageIsValid) == 0)\n            {\n                // Invalid message\n                return false;\n            }\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.DataSetFlags2) != 0)\n            {\n                DataSetFlags2 = (DataSetFlags2EncodingMask)decoder.ReadByte(null);\n            }\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.DataSetMessageSequenceNumber) != 0)\n            {\n                SequenceNumber = decoder.ReadUInt16(null);\n            }\n            if ((DataSetFlags2 & DataSetFlags2EncodingMask.Timestamp) != 0)\n            {\n                Timestamp = decoder.ReadDateTime(null);\n            }\n            if ((DataSetFlags2 & DataSetFlags2EncodingMask.PicoSeconds) != 0)\n            {\n                PicoSeconds = decoder.ReadUInt16(null);\n            }\n\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.Status) != 0)\n            {\n                // This is the high order 16 bits of the StatusCode DataType representing\n                // the numeric value of the Severity and SubCode of the StatusCode DataType.\n                var code = decoder.ReadUInt16(null);\n                Status = (uint)code << 16;\n            }\n\n            uint minorVersion = 1;\n            uint majorVersion = 0;\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.ConfigurationVersionMajorVersion) != 0)\n            {\n                majorVersion = decoder.ReadUInt32(null);\n            }\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.ConfigurationVersionMinorVersion) != 0)\n            {\n                minorVersion = decoder.ReadUInt32(null);\n            }\n            MetaDataVersion = new ConfigurationVersionDataType()\n            {\n                MinorVersion = minorVersion,\n                MajorVersion = majorVersion\n            };\n            return true;\n        }\n\n        /// <summary>\n        /// Write DataSet message header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        private void WriteDataSetMessageHeader(BinaryEncoder encoder)\n        {\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.MessageIsValid) != 0)\n            {\n                encoder.WriteByte(null, (byte)DataSetFlags1);\n            }\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.DataSetFlags2) != 0)\n            {\n                encoder.WriteByte(null, (byte)DataSetFlags2);\n            }\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.DataSetMessageSequenceNumber) != 0)\n            {\n                encoder.WriteUInt16(null, (ushort)SequenceNumber);\n            }\n            if ((DataSetFlags2 & DataSetFlags2EncodingMask.Timestamp) != 0)\n            {\n                encoder.WriteDateTime(null, Timestamp?.UtcDateTime ?? default);\n            }\n            if ((DataSetFlags2 & DataSetFlags2EncodingMask.PicoSeconds) != 0)\n            {\n                encoder.WriteUInt16(null, PicoSeconds);\n            }\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.Status) != 0)\n            {\n                // This is the high order 16 bits of the StatusCode DataType representing\n                // the numeric value of the Severity and SubCode of the StatusCode DataType.\n                var status = Status ?? Payload.DataSetFields\n                    .FirstOrDefault(s => StatusCode.IsNotGood(s.Value?.StatusCode ?? StatusCodes.BadNoData)).Value?\n                        .StatusCode ?? StatusCodes.Good;\n                encoder.WriteUInt16(null, (ushort)(status.Code >> 16));\n            }\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.ConfigurationVersionMajorVersion) != 0)\n            {\n                encoder.WriteUInt32(null, MetaDataVersion?.MajorVersion ?? 1);\n            }\n            if ((DataSetFlags1 & DataSetFlags1EncodingMask.ConfigurationVersionMinorVersion) != 0)\n            {\n                encoder.WriteUInt32(null, MetaDataVersion?.MinorVersion ?? 0);\n            }\n        }\n\n        /// <summary>\n        /// Read message data key frame from decoder\n        /// </summary>\n        /// <param name=\"binaryDecoder\"></param>\n        /// <param name=\"metadata\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private void ReadPayloadKeyFrame(BinaryDecoder binaryDecoder, PublishedDataSetMetaDataModel? metadata)\n        {\n            var fieldType = DataSetFlags1 & DataSetFlags1EncodingMask.FieldTypeUsedBits;\n            ushort dataSetFieldCount;\n            if (fieldType == DataSetFlags1EncodingMask.FieldTypeRawData)\n            {\n                if (metadata != null)\n                {\n                    // metadata should provide field count\n                    dataSetFieldCount = (ushort)metadata.Fields.Count;\n                }\n                else\n                {\n                    throw new DecodingException(\"Requires metadata to decode\");\n                }\n            }\n            else\n            {\n                dataSetFieldCount = binaryDecoder.ReadUInt16(null);\n            }\n\n            // check configuration version\n            var fields = Payload.DataSetFields.ToList();\n            switch (fieldType)\n            {\n                case 0:\n                    for (var i = 0; i < dataSetFieldCount; i++)\n                    {\n                        var fieldMetaData = GetFieldMetadata(metadata, i);\n                        fields.Add((fieldMetaData?.Name ?? i.ToString(CultureInfo.InvariantCulture),\n                            new DataValue(binaryDecoder.ReadVariant(null))));\n                    }\n                    break;\n                case DataSetFlags1EncodingMask.FieldTypeDataValue:\n                    for (var i = 0; i < dataSetFieldCount; i++)\n                    {\n                        var fieldMetaData = GetFieldMetadata(metadata, i);\n                        fields.Add((fieldMetaData?.Name ?? i.ToString(CultureInfo.InvariantCulture),\n                            binaryDecoder.ReadDataValue(null)));\n                    }\n                    break;\n                case DataSetFlags1EncodingMask.FieldTypeRawData:\n                    for (var i = 0; i < dataSetFieldCount; i++)\n                    {\n                        var fieldMetaData = GetFieldMetadata(metadata, i);\n                        if (fieldMetaData != null)\n                        {\n                            var decodedValue = ReadRawData(binaryDecoder, fieldMetaData);\n                            fields.Add((fieldMetaData.Name, new DataValue(new Variant(decodedValue))));\n                        }\n                    }\n                    break;\n                default:\n                    throw new DecodingException($\"Reserved field type {fieldType} not allowed.\");\n            }\n            Payload = new Models.DataSet(fields, Payload.DataSetFieldContentMask);\n        }\n\n        /// <summary>\n        /// Write payload data\n        /// </summary>\n        /// <param name=\"binaryEncoder\"></param>\n        /// <param name=\"metadata\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void WritePayloadKeyFrame(BinaryEncoder binaryEncoder, PublishedDataSetMetaDataModel? metadata)\n        {\n            var fieldType = DataSetFlags1 & DataSetFlags1EncodingMask.FieldTypeUsedBits;\n            switch (fieldType)\n            {\n                case 0:\n                    Debug.Assert(Payload.DataSetFields.Count <= ushort.MaxValue);\n                    binaryEncoder.WriteUInt16(null, (ushort)Payload.DataSetFields.Count);\n                    foreach (var (_, Value) in Payload.DataSetFields)\n                    {\n                        binaryEncoder.WriteVariant(null, Value?.WrappedValue ?? default);\n                    }\n                    break;\n                case DataSetFlags1EncodingMask.FieldTypeDataValue:\n                    Debug.Assert(Payload.DataSetFields.Count <= ushort.MaxValue);\n                    binaryEncoder.WriteUInt16(null, (ushort)Payload.DataSetFields.Count);\n                    foreach (var (_, Value) in Payload.DataSetFields)\n                    {\n                        binaryEncoder.WriteDataValue(null, Value);\n                    }\n                    break;\n                case DataSetFlags1EncodingMask.FieldTypeRawData:\n                    // DataSetFieldCount is not written for RawData\n                    var values = Payload.DataSetFields.ToList();\n                    for (var i = 0; i < values.Count; i++)\n                    {\n                        var fieldMetaData = GetFieldMetadata(metadata, i);\n                        WriteFieldAsRawData(binaryEncoder,\n                            values[i].Value?.WrappedValue ?? default, fieldMetaData);\n                    }\n                    break;\n                default:\n                    throw new EncodingException(\n                        $\"Reserved field type {fieldType} not allowed.\");\n            }\n        }\n\n        /// <summary>\n        /// Read message data delta frame from decoder\n        /// </summary>\n        /// <param name=\"binaryDecoder\"></param>\n        /// <param name=\"metadata\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"DecodingException\"></exception>\n        private void ReadPayloadDeltaFrame(BinaryDecoder binaryDecoder, PublishedDataSetMetaDataModel? metadata)\n        {\n            var fieldType = DataSetFlags1 & DataSetFlags1EncodingMask.FieldTypeUsedBits;\n            var fieldCount = binaryDecoder.ReadUInt16(null);\n\n            var fields = Payload.DataSetFields.ToList();\n            for (var i = 0; i < fieldCount; i++)\n            {\n                var fieldIndex = binaryDecoder.ReadUInt16(null);\n                var fieldMetaData = GetFieldMetadata(metadata, fieldIndex);\n                switch (fieldType)\n                {\n                    case 0:\n                        fields.Add((fieldMetaData?.Name ?? fieldIndex.ToString(CultureInfo.InvariantCulture),\n                            new DataValue(binaryDecoder.ReadVariant(null))));\n                        break;\n                    case DataSetFlags1EncodingMask.FieldTypeDataValue:\n                        fields.Add((fieldMetaData?.Name ?? fieldIndex.ToString(CultureInfo.InvariantCulture),\n                            binaryDecoder.ReadDataValue(null)));\n                        break;\n                    case DataSetFlags1EncodingMask.FieldTypeRawData:\n                        if (fieldMetaData != null)\n                        {\n                            var decodedValue = ReadRawData(binaryDecoder, fieldMetaData);\n                            fields.Add((fieldMetaData.Name,\n                                new DataValue(new Variant(decodedValue))));\n                        }\n                        break;\n                    default:\n                        throw new DecodingException($\"Reserved field type {fieldType} not allowed.\");\n                }\n            }\n            Payload = new Models.DataSet(fields, Payload.DataSetFieldContentMask);\n        }\n\n        /// <summary>\n        /// Write payload data delta frame\n        /// </summary>\n        /// <param name=\"binaryEncoder\"></param>\n        /// <param name=\"metadata\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        private void WritePayloadDeltaFrame(BinaryEncoder binaryEncoder, PublishedDataSetMetaDataModel? metadata)\n        {\n            // ignore null fields\n            var fieldCount = Payload.DataSetFields.Count(value => value.Value?.Value != null);\n            Debug.Assert(fieldCount <= ushort.MaxValue);\n            binaryEncoder.WriteUInt16(null, (ushort)fieldCount);\n\n            var fieldType = DataSetFlags1 & DataSetFlags1EncodingMask.FieldTypeUsedBits;\n            var values = Payload.DataSetFields.ToList();\n            for (var i = 0; i < values.Count; i++)\n            {\n                var (Name, Value) = values[i];\n                if (Value?.Value == null)\n                {\n                    continue;\n                }\n\n                // write field index corresponding to metadata\n                var fieldIndex = GetFieldIndex(metadata, Name, i);\n                binaryEncoder.WriteUInt16(null, fieldIndex);\n                switch (fieldType)\n                {\n                    case 0:\n                        binaryEncoder.WriteVariant(null, Value.WrappedValue);\n                        break;\n                    case DataSetFlags1EncodingMask.FieldTypeDataValue:\n                        binaryEncoder.WriteDataValue(null, Value);\n                        break;\n                    case DataSetFlags1EncodingMask.FieldTypeRawData:\n                        var fieldMetadata = GetFieldMetadata(metadata, fieldIndex);\n                        WriteFieldAsRawData(binaryEncoder, Value.WrappedValue, fieldMetadata);\n                        break;\n                    default:\n                        throw new EncodingException($\"Reserved field type {fieldType} not allowed.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get field index in metadata if metadata was provided.\n        /// </summary>\n        /// <param name=\"metadata\"></param>\n        /// <param name=\"key\"></param>\n        /// <param name=\"pos\"></param>\n        /// <returns></returns>\n        private static ushort GetFieldIndex(PublishedDataSetMetaDataModel? metadata, string key, int pos)\n        {\n            if (metadata?.Fields != null)\n            {\n                for (var i = 0; i < metadata.Fields.Count; i++)\n                {\n                    if (metadata.Fields[i].Name == key)\n                    {\n                        return (ushort)i;\n                    }\n                }\n                // Assign a unique new one after the fields in metadata\n                var idx = metadata.Fields.Count + pos;\n                Debug.Assert(idx <= ushort.MaxValue);\n                return (ushort)idx;\n            }\n            return (ushort)pos;\n        }\n\n        /// <summary>\n        /// Get field metadata for the index\n        /// </summary>\n        /// <param name=\"metadata\"></param>\n        /// <param name=\"fieldIndex\"></param>\n        /// <returns></returns>\n        private static PublishedFieldMetaDataModel? GetFieldMetadata(PublishedDataSetMetaDataModel? metadata,\n            int fieldIndex)\n        {\n            if (metadata?.Fields == null)\n            {\n                return null;\n            }\n            if (fieldIndex < 0 || fieldIndex >= metadata.Fields.Count)\n            {\n                return null;\n            }\n            return metadata.Fields[fieldIndex];\n        }\n\n        /// <summary>\n        /// Encodes field value as RawData\n        /// </summary>\n        /// <param name=\"binaryEncoder\"></param>\n        /// <param name=\"variant\"></param>\n        /// <param name=\"fieldMetaData\"></param>\n        private static void WriteFieldAsRawData(BinaryEncoder binaryEncoder, Variant variant,\n            PublishedFieldMetaDataModel? fieldMetaData)\n        {\n            var builtInType = (BuiltInType?)fieldMetaData?.BuiltInType\n                ?? variant.TypeInfo?.BuiltInType ?? BuiltInType.Null;\n            var valueRank = fieldMetaData?.ValueRank\n                ?? variant.TypeInfo?.ValueRank ?? 0;\n            if (builtInType == BuiltInType.Null)\n            {\n                return;\n            }\n            var valueToEncode = variant.Value;\n            if (valueRank == ValueRanks.Scalar)\n            {\n                switch (builtInType)\n                {\n                    case BuiltInType.Boolean:\n                        binaryEncoder.WriteBoolean(null,\n                            Convert.ToBoolean(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.SByte:\n                        binaryEncoder.WriteSByte(null,\n                            Convert.ToSByte(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.Byte:\n                        binaryEncoder.WriteByte(null,\n                            Convert.ToByte(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.Int16:\n                        binaryEncoder.WriteInt16(null,\n                            Convert.ToInt16(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.UInt16:\n                        binaryEncoder.WriteUInt16(null,\n                            Convert.ToUInt16(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.Int32:\n                        binaryEncoder.WriteInt32(null,\n                            Convert.ToInt32(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.UInt32:\n                        binaryEncoder.WriteUInt32(null,\n                            Convert.ToUInt32(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.Int64:\n                        binaryEncoder.WriteInt64(null,\n                            Convert.ToInt64(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.UInt64:\n                        binaryEncoder.WriteUInt64(null,\n                            Convert.ToUInt64(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.Float:\n                        binaryEncoder.WriteFloat(null,\n                            Convert.ToSingle(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.Double:\n                        binaryEncoder.WriteDouble(null,\n                            Convert.ToDouble(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.DateTime:\n                        binaryEncoder.WriteDateTime(null,\n                            Convert.ToDateTime(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.Enumeration:\n                        binaryEncoder.WriteInt32(null,\n                            Convert.ToInt32(valueToEncode, CultureInfo.InvariantCulture));\n                        break;\n                    case BuiltInType.Guid:\n                        binaryEncoder.WriteGuid(null, (Uuid)valueToEncode);\n                        break;\n                    case BuiltInType.String:\n                        binaryEncoder.WriteString(null, valueToEncode as string);\n                        break;\n                    case BuiltInType.ByteString:\n                        binaryEncoder.WriteByteString(null, (byte[])valueToEncode);\n                        break;\n                    case BuiltInType.QualifiedName:\n                        binaryEncoder.WriteQualifiedName(null, valueToEncode as QualifiedName);\n                        break;\n                    case BuiltInType.LocalizedText:\n                        binaryEncoder.WriteLocalizedText(null, valueToEncode as LocalizedText);\n                        break;\n                    case BuiltInType.NodeId:\n                        binaryEncoder.WriteNodeId(null, valueToEncode as NodeId);\n                        break;\n                    case BuiltInType.ExpandedNodeId:\n                        binaryEncoder.WriteExpandedNodeId(null, valueToEncode as ExpandedNodeId);\n                        break;\n                    case BuiltInType.StatusCode:\n                        binaryEncoder.WriteStatusCode(null, (StatusCode)valueToEncode);\n                        break;\n                    case BuiltInType.XmlElement:\n                        binaryEncoder.WriteXmlElement(null, valueToEncode as XmlElement);\n                        break;\n                    case BuiltInType.ExtensionObject:\n                        binaryEncoder.WriteExtensionObject(null, valueToEncode as ExtensionObject);\n                        break;\n                }\n            }\n            else if (valueRank >= ValueRanks.OneDimension)\n            {\n                binaryEncoder.WriteArray(null, valueToEncode, valueRank, builtInType);\n            }\n        }\n\n        /// <summary>\n        /// Decode RawData type (for SimpleTypeDescription!?)\n        /// </summary>\n        /// <param name=\"binaryDecoder\"></param>\n        /// <param name=\"fieldMetaData\"></param>\n        /// <returns></returns>\n        private static object? ReadRawData(BinaryDecoder binaryDecoder, PublishedFieldMetaDataModel fieldMetaData)\n        {\n            if (fieldMetaData.BuiltInType != (byte)BuiltInType.Null)\n            {\n                try\n                {\n                    switch (fieldMetaData.ValueRank)\n                    {\n                        case ValueRanks.Scalar:\n                            return ReadRawScalar(binaryDecoder, fieldMetaData.BuiltInType);\n                        case ValueRanks.OneDimension:\n                        case ValueRanks.TwoDimensions:\n                            return binaryDecoder.ReadArray(null, fieldMetaData.ValueRank,\n                                (BuiltInType)fieldMetaData.BuiltInType);\n\n                        case ValueRanks.OneOrMoreDimensions:\n                        case ValueRanks.Any:// Scalar or Array with any number of dimensions\n                        case ValueRanks.ScalarOrOneDimension:\n                            // not implemented\n                            return StatusCodes.BadNotSupported;\n                        default:\n                            // not implemented\n                            return StatusCodes.BadNotSupported;\n                    }\n                }\n                catch (ServiceResultException sre)\n                {\n                    return sre.StatusCode;\n                }\n                catch\n                {\n                    return StatusCodes.BadDecodingError;\n                }\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Read a scalar type\n        /// </summary>\n        /// <param name=\"binaryDecoder\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <returns>The decoded object</returns>\n        private static object? ReadRawScalar(BinaryDecoder binaryDecoder, byte builtInType)\n        {\n            switch ((BuiltInType)builtInType)\n            {\n                case BuiltInType.Boolean:\n                    return binaryDecoder.ReadBoolean(null);\n                case BuiltInType.SByte:\n                    return binaryDecoder.ReadSByte(null);\n                case BuiltInType.Byte:\n                    return binaryDecoder.ReadByte(null);\n                case BuiltInType.Int16:\n                    return binaryDecoder.ReadInt16(null);\n                case BuiltInType.UInt16:\n                    return binaryDecoder.ReadUInt16(null);\n                case BuiltInType.Int32:\n                    return binaryDecoder.ReadInt32(null);\n                case BuiltInType.UInt32:\n                    return binaryDecoder.ReadUInt32(null);\n                case BuiltInType.Int64:\n                    return binaryDecoder.ReadInt64(null);\n                case BuiltInType.UInt64:\n                    return binaryDecoder.ReadUInt64(null);\n                case BuiltInType.Float:\n                    return binaryDecoder.ReadFloat(null);\n                case BuiltInType.Double:\n                    return binaryDecoder.ReadDouble(null);\n                case BuiltInType.String:\n                    return binaryDecoder.ReadString(null);\n                case BuiltInType.DateTime:\n                    return binaryDecoder.ReadDateTime(null);\n                case BuiltInType.Guid:\n                    return binaryDecoder.ReadGuid(null);\n                case BuiltInType.ByteString:\n                    return binaryDecoder.ReadByteString(null);\n                case BuiltInType.XmlElement:\n                    return binaryDecoder.ReadXmlElement(null);\n                case BuiltInType.NodeId:\n                    return binaryDecoder.ReadNodeId(null);\n                case BuiltInType.ExpandedNodeId:\n                    return binaryDecoder.ReadExpandedNodeId(null);\n                case BuiltInType.StatusCode:\n                    return binaryDecoder.ReadStatusCode(null);\n                case BuiltInType.QualifiedName:\n                    return binaryDecoder.ReadQualifiedName(null);\n                case BuiltInType.LocalizedText:\n                    return binaryDecoder.ReadLocalizedText(null);\n                case BuiltInType.DataValue:\n                    return binaryDecoder.ReadDataValue(null);\n                case BuiltInType.Enumeration:\n                    return binaryDecoder.ReadInt32(null);\n                case BuiltInType.Variant:\n                    return binaryDecoder.ReadVariant(null);\n                case BuiltInType.ExtensionObject:\n                    return binaryDecoder.ReadExtensionObject(null);\n                default:\n                    return null;\n            }\n        }\n\n        private DataSetFlags1EncodingMask? _dataSetFlags1;\n        private DataSetFlags2EncodingMask? _dataSetFlags2;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/UadpDiscoveryMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n\n    /// <summary>\n    /// Discovery announcements and probes base class\n    /// <see href=\"https://reference.opcfoundation.org/v104/Core/docs/Part14/7.2.3/\"/>\n    /// </summary>\n    public class UadpDiscoveryMessage : UadpNetworkMessage\n    {\n        /// <summary>\n        /// Whether this is a discovery probe\n        /// </summary>\n        internal bool IsProbe { get; set; }\n\n        /// <summary>\n        /// Data set writer name in case of ua-metadata message\n        /// </summary>\n        public ushort DataSetWriterId { get; set; }\n\n        /// <summary>\n        /// If discovery request\n        /// </summary>\n        internal ushort[]? DataSetWriterIds { get; set; }\n\n        /// <summary>\n        /// Discovery type\n        /// </summary>\n        internal byte DiscoveryType { get; set; }\n\n        /// <summary>\n        /// The possible types of UADP network discovery announcement types\n        /// </summary>\n        [Flags]\n        internal enum UADPDiscoveryAnnouncementType\n        {\n            Reserved = 0,\n            PublisherEndpoints = 1,\n            DataSetMetaData = 2,\n            DataSetWriterConfiguration =\n                PublisherEndpoints | DataSetMetaData,\n            PubSubConnectionsConfiguration = 4,\n            ApplicationInformation =\n                PublisherEndpoints | PubSubConnectionsConfiguration\n        }\n\n        /// <summary>\n        /// The possible types of UADP discovery probe types\n        /// </summary>\n        [Flags]\n        internal enum UADPDiscoveryProbeType\n        {\n            Reserved = 0,\n            PublisherInformationProbe = 1,\n            FindApplicationsProbe = 2\n        }\n\n        /// <summary>\n        /// The possible types of UADP publisher info probe message\n        /// </summary>\n        [Flags]\n        internal enum PublisherInformationProbeMessageType\n        {\n            Reserved = 0,\n            PublisherServerEndpoints = 1,\n            DataSetMetaData = 2,\n            DataSetWriterConfiguration =\n                PublisherServerEndpoints | DataSetMetaData,\n            WriterGroupConfiguration = 4,\n            PubSubConnectionsConfiguration =\n                PublisherServerEndpoints | WriterGroupConfiguration\n        }\n\n        /// <inheritdoc/>\n        public override IReadOnlyList<ReadOnlySequence<byte>> Encode(Opc.Ua.IServiceMessageContext context,\n            int maxChunkSize, IDataSetMetaDataResolver? resolver)\n        {\n            var messages = new List<ReadOnlySequence<byte>>();\n            var isChunkMessage = false;\n            var remainingChunks = EncodePayloadChunks(context, resolver).AsSpan();\n\n            // Re-evaluate flags every go around\n            UadpFlags =\n                UADPFlagsEncodingMask.PublisherId\n              | UADPFlagsEncodingMask.ExtendedFlags1;\n            ExtendedFlags1 =\n                ExtendedFlags1EncodingMask.Security\n              | ExtendedFlags1EncodingMask.PublisherIdTypeString\n              | ExtendedFlags1EncodingMask.ExtendedFlags2;\n            ExtendedFlags2 = IsProbe ?\n                ExtendedFlags2EncodingMask.DiscoveryProbe :\n                ExtendedFlags2EncodingMask.DiscoveryAnnouncement;\n\n            while (remainingChunks.Length == 1)\n            {\n                using var stream = Memory.GetStream();\n                using var encoder = new Opc.Ua.BinaryEncoder(stream, context, leaveOpen: true);\n                var writeSpan = remainingChunks;\n                while (true)\n                {\n                    WriteNetworkMessageHeaderFlags(encoder, isChunkMessage);\n                    WriteNetworkMessageHeader(encoder);\n\n                    if (!TryWritePayload(encoder, maxChunkSize, ref writeSpan,\n                        ref remainingChunks, ref isChunkMessage))\n                    {\n                        encoder.Position = 0; // Restart writing\n                        continue;\n                    }\n\n                    WriteSecurityFooter(encoder);\n                    WriteSignature(encoder);\n                    break;\n                }\n                stream.SetLength(encoder.Position);\n\n                var messageBuffer = stream.GetReadOnlySequence();\n\n                // TODO: instead of copy using ToArray we shall include the\n                // stream with the message and dispose it later when it is\n                // consumed. To get here the bug in BinaryEncoder that it\n                // disposes the underlying stream even if leaveOpen: true\n                // is set must be fixed.\n                messages.Add(new ReadOnlySequence<byte>(messageBuffer.ToArray()));\n            }\n            Debug.Assert(remainingChunks.Length == 0);\n            return messages;\n        }\n\n        /// <inheritdoc/>\n        protected override bool TryReadNetworkMessageHeader(Opc.Ua.BinaryDecoder binaryDecoder,\n            bool isFirstChunk)\n        {\n            if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.DiscoveryProbe) != 0)\n            {\n                // Read probetype\n                DiscoveryType = binaryDecoder.ReadByte(null);\n                DataSetWriterIds = [.. binaryDecoder.ReadUInt16Array(null)];\n                IsProbe = true;\n                return true;\n            }\n            if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.DiscoveryAnnouncement) != 0)\n            {\n                // Read announcement type\n                DiscoveryType = binaryDecoder.ReadByte(null);\n                _sequenceNumber = binaryDecoder.ReadUInt16(null);\n                IsProbe = false;\n                return true;\n            }\n            // Not a discovery message\n            return false;\n        }\n\n        /// <summary>\n        /// Write discovery header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        private void WriteNetworkMessageHeader(Opc.Ua.BinaryEncoder encoder)\n        {\n            if (IsProbe)\n            {\n                // Write probe type\n                encoder.WriteByte(null, DiscoveryType);\n                encoder.WriteUInt16Array(null, DataSetWriterIds ?? []);\n                ExtendedFlags2 &= ~ExtendedFlags2EncodingMask.DiscoveryAnnouncement;\n                ExtendedFlags2 |= ExtendedFlags2EncodingMask.DiscoveryProbe;\n            }\n            else\n            {\n                // Write announcement type\n                encoder.WriteByte(null, DiscoveryType);\n                encoder.WriteUInt16(null, SequenceNumber());\n                ExtendedFlags2 &= ~ExtendedFlags2EncodingMask.DiscoveryProbe;\n                ExtendedFlags2 |= ExtendedFlags2EncodingMask.DiscoveryAnnouncement;\n            }\n        }\n\n        /// <inheritdoc/>\n        protected override Message[] EncodePayloadChunks(Opc.Ua.IServiceMessageContext context,\n            IDataSetMetaDataResolver? resolver)\n        {\n            if (MetaData == null)\n            {\n                throw new InvalidOperationException(\"Metadata is null or empty\");\n            }\n            using var stream = Memory.GetStream();\n            using var encoder = new Opc.Ua.BinaryEncoder(stream, context, leaveOpen: true);\n            if (!IsProbe)\n            {\n                switch ((UADPDiscoveryAnnouncementType)DiscoveryType)\n                {\n                    case UADPDiscoveryAnnouncementType.DataSetMetaData:\n                        encoder.WriteUInt16(null, DataSetWriterId);\n                        encoder.WriteEncodeable(null, MetaData.ToStackModel(context),\n                            typeof(Opc.Ua.DataSetMetaDataType));\n                        // temporary write StatusCode.Good\n                        encoder.WriteStatusCode(null, Opc.Ua.StatusCodes.Good);\n                        break;\n                    case UADPDiscoveryAnnouncementType.DataSetWriterConfiguration:\n                    case UADPDiscoveryAnnouncementType.PublisherEndpoints:\n                    case UADPDiscoveryAnnouncementType.PubSubConnectionsConfiguration:\n                    case UADPDiscoveryAnnouncementType.ApplicationInformation:\n                        // not implemented\n                        break;\n                }\n            }\n            else\n            {\n                switch ((UADPDiscoveryProbeType)DiscoveryType)\n                {\n                    case UADPDiscoveryProbeType.PublisherInformationProbe:\n                    case UADPDiscoveryProbeType.FindApplicationsProbe:\n                        // not implemented\n                        break;\n                }\n            }\n\n            // TODO: instead of copy using ToArray we shall include the\n            // stream with the message and dispose it later when it is\n            // consumed. To get here the bug in BinaryEncoder that it\n            // disposes the underlying stream even if leaveOpen: true\n            // is set must be fixed.\n            return [new Message(stream.ToArray(), DataSetWriterId)];\n        }\n\n        /// <inheritdoc/>\n        protected override void DecodePayloadChunks(Opc.Ua.IServiceMessageContext context,\n            IReadOnlyList<byte[]> buffers, IDataSetMetaDataResolver? resolver)\n        {\n            if (buffers.Count == 0)\n            {\n                return;\n            }\n            Debug.Assert(buffers.Count == 1);\n            using var stream = Memory.GetStream(buffers[0]);\n            using var decoder = new Opc.Ua.BinaryDecoder(stream, context);\n            if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.DiscoveryAnnouncement) != 0)\n            {\n                switch ((UADPDiscoveryAnnouncementType)DiscoveryType)\n                {\n                    case UADPDiscoveryAnnouncementType.DataSetMetaData:\n                        DataSetWriterId = decoder.ReadUInt16(null);\n                        var metaData = (Opc.Ua.DataSetMetaDataType)decoder.ReadEncodeable(null,\n                            typeof(Opc.Ua.DataSetMetaDataType));\n                        MetaData = metaData.ToServiceModel(context);\n                        // temporary read\n                        var status = decoder.ReadStatusCode(null);\n                        break;\n                    case UADPDiscoveryAnnouncementType.DataSetWriterConfiguration:\n                    case UADPDiscoveryAnnouncementType.PublisherEndpoints:\n                    case UADPDiscoveryAnnouncementType.PubSubConnectionsConfiguration:\n                    case UADPDiscoveryAnnouncementType.ApplicationInformation:\n                        // not implemented\n                        break;\n                }\n            }\n            else if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.DiscoveryProbe) != 0)\n            {\n                switch ((UADPDiscoveryProbeType)DiscoveryType)\n                {\n                    case UADPDiscoveryProbeType.PublisherInformationProbe:\n                    case UADPDiscoveryProbeType.FindApplicationsProbe:\n                        // not implemented\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (ReferenceEquals(this, obj))\n            {\n                return true;\n            }\n            if (obj is not UadpDiscoveryMessage wrapper)\n            {\n                return false;\n            }\n            if (!base.Equals(obj))\n            {\n                return false;\n            }\n            if (!Opc.Ua.Utils.IsEqual(wrapper.DataSetWriterId, DataSetWriterId) ||\n                !Opc.Ua.Utils.IsEqual(wrapper.MetaData, MetaData))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            var hash = new HashCode();\n            hash.Add(base.GetHashCode());\n            hash.Add(DataSetWriterId);\n            hash.Add(MetaData);\n            return hash.ToHashCode();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/UadpMetadataMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    /// <summary>\n    /// Data set metadata announcement\n    /// <see href=\"https://reference.opcfoundation.org/v104/Core/docs/Part14/7.2.3/\"/>\n    /// </summary>\n    public class UadpMetaDataMessage : UadpDiscoveryMessage\n    {\n        /// <summary>\n        /// Create metadata message\n        /// </summary>\n        public UadpMetaDataMessage()\n        {\n            IsProbe = false;\n            DiscoveryType = (byte)UADPDiscoveryAnnouncementType.DataSetMetaData;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/PubSub/UadpNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Microsoft.IO;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n\n    /// <summary>\n    /// Encodeable Network message\n    /// <see href=\"https://reference.opcfoundation.org/v104/Core/docs/Part14/7.2.3/\"/>\n    /// </summary>\n    public class UadpNetworkMessage : BaseNetworkMessage\n    {\n        /// <inheritdoc/>\n        public override string MessageSchema => MessageSchemaTypes.NetworkMessageUadp;\n\n        /// <inheritdoc/>\n        public override string ContentType => ContentMimeType.Binary;\n\n        /// <inheritdoc/>\n        public override string? ContentEncoding => null;\n\n        /// <summary>\n        /// Writer group id\n        /// </summary>\n        public ushort WriterGroupId { get; set; }\n\n        /// <summary>\n        /// Get and Set VersionTime type: it represents the time in seconds since the year 2000\n        /// </summary>\n        public uint GroupVersion { get; set; }\n\n        /// <summary>\n        /// Get and Set NetworkMessageNumber\n        /// </summary>\n        public ushort NetworkMessageNumber { get; set; }\n\n        /// <summary>\n        /// Get and Set SequenceNumber\n        /// </summary>\n        public Func<ushort> SequenceNumber { get; set; }\n\n        /// <summary>\n        /// Get and Set Timestamp\n        /// </summary>\n        public DateTimeOffset Timestamp { get; set; }\n\n        /// <summary>\n        /// PicoSeconds\n        /// </summary>\n        public ushort PicoSeconds { get; set; }\n\n        /// <summary>\n        /// Get and Set SecurityFlags\n        /// </summary>\n        internal SecurityFlagsEncodingMask SecurityFlags { get; set; }\n\n        /// <summary>\n        /// Get and Set SecurityTokenId has IntegerId type\n        /// </summary>\n        public uint SecurityTokenId { get; set; }\n\n        /// <summary>\n        /// Get and Set NonceLength\n        /// </summary>\n        public byte NonceLength { get; set; }\n\n        /// <summary>\n        /// Get and Set MessageNonce contains [NonceLength]\n        /// </summary>\n        public ReadOnlyMemory<byte> MessageNonce { get; set; }\n\n        /// <summary>\n        /// Get and Set SecurityFooterSize\n        /// </summary>\n        public ushort SecurityFooterSize { get; set; }\n\n        /// <summary>\n        /// Get and Set SecurityFooter\n        /// </summary>\n        public ReadOnlyMemory<byte> SecurityFooter { get; set; }\n\n        /// <summary>\n        /// Get and Set Signature\n        /// </summary>\n        public ReadOnlyMemory<byte> Signature { get; set; }\n\n        /// <summary>\n        /// The possible values for the NetworkMessage UADPFlags encoding byte.\n        /// </summary>\n        [Flags]\n        internal enum UADPFlagsEncodingMask : byte\n        {\n            None = 0,\n            VersionBit1 = 1,\n            VersionBit2 = 2,\n            VersionBit3 = 4,\n            VersionBit4 = 8,\n            VersionMask = VersionBit1 | VersionBit2 | VersionBit3 | VersionBit4,\n            PublisherId = 16,\n            GroupHeader = 32,\n            PayloadHeader = 64,\n            ExtendedFlags1 = 128,\n        }\n\n        /// <summary>\n        /// The possible values for the NetworkMessage ExtendedFlags1 encoding byte.\n        /// </summary>\n        [Flags]\n        internal enum ExtendedFlags1EncodingMask : byte\n        {\n            None = 0,\n            PublisherIdTypeByte = None,\n            PublisherIdTypeUInt16 = 1,\n            PublisherIdTypeUInt32 = 2,\n            PublisherIdTypeUInt64 = PublisherIdTypeUInt16 | PublisherIdTypeUInt32,\n            PublisherIdTypeString = 4,\n            PublisherIdTypeBits = PublisherIdTypeUInt64 | PublisherIdTypeString,\n            DataSetClassId = 8,\n            Security = 16,\n            Timestamp = 32,\n            PicoSeconds = 64,\n            ExtendedFlags2 = 128,\n        }\n\n        /// <summary>\n        /// The possible values for the NetworkMessage ExtendedFlags2 encoding byte.\n        /// </summary>\n        [Flags]\n        internal enum ExtendedFlags2EncodingMask : byte\n        {\n            None = 0,\n            ChunkMessage = 1,\n            PromotedFields = 2,\n            DiscoveryProbe = 4,\n            DiscoveryAnnouncement = 8,\n            DiscoveryTypeBit3 = 16,\n            DiscoveryTypeBits = DiscoveryProbe | DiscoveryAnnouncement | DiscoveryTypeBit3,\n            ActionHeaderEnabled = 32\n        }\n\n        /// <summary>\n        /// The possible values for the NetworkMessage GroupFlags encoding byte.\n        /// </summary>\n        [Flags]\n        internal enum GroupFlagsEncodingMask : byte\n        {\n            None = 0,\n            WriterGroupId = 1,\n            GroupVersion = 2,\n            NetworkMessageNumber = 4,\n            SequenceNumber = 8\n        }\n\n        /// <summary>\n        /// The possible values for the NetworkMessage SecurityFlags encoding byte.\n        /// </summary>\n        [Flags]\n        internal enum SecurityFlagsEncodingMask : byte\n        {\n            None = 0,\n            NetworkMessageSigned = 1,\n            NetworkMessageEncrypted = 2,\n            SecurityFooter = 4,\n            ForceKeyReset = 8,\n            Reserved = 16\n        }\n\n        /// <summary>\n        /// Set All flags before encode/decode for a NetworkMessage that contains DataSet messages\n        /// </summary>\n        internal UADPFlagsEncodingMask UadpFlags\n        {\n            get\n            {\n                if (_uadpFlags == null)\n                {\n                    // Bit range 0-3: Version of the UADP NetworkMessage, always 1.\n                    _uadpFlags = UADPFlagsEncodingMask.VersionBit1;\n\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.PublisherId) != 0)\n                    {\n                        // UADPFlags: Bit 4: PublisherId enabled\n                        _uadpFlags |= UADPFlagsEncodingMask.PublisherId;\n                    }\n                    if ((NetworkMessageContentMask & (NetworkMessageContentFlags.GroupHeader |\n                                                      NetworkMessageContentFlags.WriterGroupId |\n                                                      NetworkMessageContentFlags.GroupVersion |\n                                                      NetworkMessageContentFlags.NetworkMessageNumber |\n                                                      NetworkMessageContentFlags.SequenceNumber)) != 0)\n                    {\n                        // UADPFlags: Bit 5: GroupHeader enabled\n                        _uadpFlags |= UADPFlagsEncodingMask.GroupHeader;\n                    }\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.PayloadHeader) != 0)\n                    {\n                        // UADPFlags: Bit 6: PayloadHeader enabled\n                        _uadpFlags |= UADPFlagsEncodingMask.PayloadHeader;\n                    }\n\n                    if ((NetworkMessageContentMask & (NetworkMessageContentFlags.DataSetClassId |\n                                                      NetworkMessageContentFlags.Timestamp |\n                                                      NetworkMessageContentFlags.Picoseconds |\n                                                      NetworkMessageContentFlags.PromotedFields)) != 0)\n                    {\n                        // UADPFlags: Bit 7: Enable ExtendedFlags1\n                        _uadpFlags |= UADPFlagsEncodingMask.ExtendedFlags1;\n                    }\n\n                    if (!string.IsNullOrEmpty(PublisherId) &&\n                        (NetworkMessageContentMask & NetworkMessageContentFlags.PublisherId) != 0)\n                    {\n                        // UADPFlags: Bit 7: Enable ExtendedFlags1\n                        _uadpFlags |= UADPFlagsEncodingMask.ExtendedFlags1;\n                    }\n                }\n                return _uadpFlags.Value;\n            }\n            set\n            {\n                _uadpFlags = value;\n\n                // UADPFlags: Bit 4: PublisherId enabled\n                if ((value & UADPFlagsEncodingMask.PublisherId) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.PublisherId;\n                }\n                // UADPFlags: Bit 6: PayloadHeader enabled\n                if ((value & UADPFlagsEncodingMask.PayloadHeader) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.PayloadHeader;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get and Set GroupFlags\n        /// </summary>\n        internal GroupFlagsEncodingMask GroupFlags\n        {\n            get\n            {\n                if (_groupFlags == null)\n                {\n                    _groupFlags = 0;\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.WriterGroupId) != 0)\n                    {\n                        // GroupFlags: Bit 0: WriterGroupId enabled\n                        _groupFlags |= GroupFlagsEncodingMask.WriterGroupId;\n                    }\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.GroupVersion) != 0)\n                    {\n                        // GroupFlags: Bit 1: GroupVersion enabled\n                        _groupFlags |= GroupFlagsEncodingMask.GroupVersion;\n                    }\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.NetworkMessageNumber) != 0)\n                    {\n                        // GroupFlags: Bit 2: NetworkMessageNumber enabled\n                        _groupFlags |= GroupFlagsEncodingMask.NetworkMessageNumber;\n                    }\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.SequenceNumber) != 0)\n                    {\n                        // GroupFlags: Bit 3: SequenceNumber enabled\n                        _groupFlags |= GroupFlagsEncodingMask.SequenceNumber;\n                    }\n                }\n                return _groupFlags.Value;\n            }\n            set\n            {\n                _groupFlags = value;\n\n                // GroupFlags: Bit 0: WriterGroupId enabled\n                if ((value & GroupFlagsEncodingMask.WriterGroupId) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.WriterGroupId;\n                }\n                // GroupFlags: Bit 1: GroupVersion enabled\n                if ((value & GroupFlagsEncodingMask.GroupVersion) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.GroupVersion;\n                }\n                // GroupFlags: Bit 2: NetworkMessageNumber enabled\n                if ((value & GroupFlagsEncodingMask.NetworkMessageNumber) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.NetworkMessageNumber;\n                }\n                // GroupFlags: Bit 3: SequenceNumber enabled\n                if ((value & GroupFlagsEncodingMask.SequenceNumber) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.SequenceNumber;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get and set ExtendedFlags2\n        /// </summary>\n        internal ExtendedFlags2EncodingMask ExtendedFlags2\n        {\n            get\n            {\n                if (_extendedFlags2 == null)\n                {\n                    _extendedFlags2 = 0;\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.PromotedFields) != 0)\n                    {\n                        // ExtendedFlags2: Bit 1: PromotedFields enabled\n                        _extendedFlags2 |= ExtendedFlags2EncodingMask.PromotedFields;\n                    }\n\n                    // Bit range 2-4: UADP NetworkMessage type\n                    // 000 NetworkMessage with DataSetMessage payload for now\n                }\n                return _extendedFlags2.Value;\n            }\n            set\n            {\n                _extendedFlags2 = value;\n\n                // ExtendedFlags2: Bit 1: PromotedFields enabled\n                if ((value & ExtendedFlags2EncodingMask.PromotedFields) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.PromotedFields;\n                }\n\n                // Bit range 2-4: UADP NetworkMessage type\n                // 000 NetworkMessage with DataSetMessage payload for now\n            }\n        }\n\n        /// <summary>\n        /// Set All flags before encode/decode for a NetworkMessage that contains DataSet messages\n        /// </summary>\n        internal ExtendedFlags1EncodingMask ExtendedFlags1\n        {\n            get\n            {\n                if (_extendedFlags1 == null)\n                {\n                    _extendedFlags1 = 0;\n\n                    // ExtendedFlags1: Bit range 0-2: PublisherId Type\n                    if (!string.IsNullOrEmpty(PublisherId) &&\n                        (NetworkMessageContentMask & NetworkMessageContentFlags.PublisherId) != 0)\n                    {\n                        if (byte.TryParse(PublisherId, out _))\n                        {\n                            _extendedFlags1 |= ExtendedFlags1EncodingMask.PublisherIdTypeByte;\n                        }\n                        else if (ushort.TryParse(PublisherId, out _))\n                        {\n                            _extendedFlags1 |= ExtendedFlags1EncodingMask.PublisherIdTypeUInt16;\n                        }\n                        else if (uint.TryParse(PublisherId, out _))\n                        {\n                            _extendedFlags1 |= ExtendedFlags1EncodingMask.PublisherIdTypeUInt32;\n                        }\n                        else if (ulong.TryParse(PublisherId, out _))\n                        {\n                            _extendedFlags1 |= ExtendedFlags1EncodingMask.PublisherIdTypeUInt64;\n                        }\n                        else\n                        {\n                            _extendedFlags1 |= ExtendedFlags1EncodingMask.PublisherIdTypeString;\n                        }\n                    }\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.DataSetClassId) != 0)\n                    {\n                        // ExtendedFlags1 Bit 3: DataSetClassId enabled\n                        _extendedFlags1 |= ExtendedFlags1EncodingMask.DataSetClassId;\n                    }\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.Timestamp) != 0)\n                    {\n                        // ExtendedFlags1: Bit 5: Timestamp enabled\n                        _extendedFlags1 |= ExtendedFlags1EncodingMask.Timestamp;\n                    }\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.Picoseconds) != 0)\n                    {\n                        // ExtendedFlags1: Bit 6: PicoSeconds enabled\n                        _extendedFlags1 |= ExtendedFlags1EncodingMask.PicoSeconds;\n                    }\n                    if ((NetworkMessageContentMask & NetworkMessageContentFlags.PromotedFields) != 0)\n                    {\n                        // ExtendedFlags1: Bit 7: ExtendedFlags2 enabled\n                        _extendedFlags1 |= ExtendedFlags1EncodingMask.ExtendedFlags2;\n                        // Bit range 2-4: UADP NetworkMessage type\n                        // 000 NetworkMessage with DataSetMessage payload for now\n                    }\n\n                    // ExtendedFlags1: Bit 4: Security enabled\n                    // Disable security for now\n                    _extendedFlags1 &= ~ExtendedFlags1EncodingMask.Security;\n                    // The security footer size shall be omitted if bit 2 of the SecurityFlags is false.\n                    SecurityFlags &= ~SecurityFlagsEncodingMask.SecurityFooter;\n                }\n                return _extendedFlags1.Value;\n            }\n            set\n            {\n                _extendedFlags1 = value;\n\n                // ExtendedFlags1: Bit range 0-2: PublisherId Type\n\n                // ExtendedFlags1 Bit 3: DataSetClassId enabled\n                if ((value & ExtendedFlags1EncodingMask.DataSetClassId) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.DataSetClassId;\n                }\n                // ExtendedFlags1 Bit 5: Timestamp enabled\n                if ((value & ExtendedFlags1EncodingMask.Timestamp) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.Timestamp;\n                }\n                // ExtendedFlags1 Bit 6: PicoSeconds enabled\n                if ((value & ExtendedFlags1EncodingMask.PicoSeconds) != 0)\n                {\n                    NetworkMessageContentMask |= NetworkMessageContentFlags.Picoseconds;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create message\n        /// </summary>\n        public UadpNetworkMessage()\n        {\n            SequenceNumber = () => _sequenceNumber;\n        }\n\n        /// <inheritdoc/>\n        public override bool TryDecode(Opc.Ua.IServiceMessageContext context, Stream stream,\n            IDataSetMetaDataResolver? resolver)\n        {\n            var chunks = new List<Message>();\n            while (stream.Position != stream.Length)\n            {\n                using var binaryDecoder = new Opc.Ua.BinaryDecoder(stream, context);\n                ReadNetworkMessageHeaderFlags(binaryDecoder);\n\n                // decode network message header according to the header flags\n                if (!TryReadNetworkMessageHeader(binaryDecoder, chunks.Count == 0))\n                {\n                    return false;\n                }\n\n                var buffers = ReadPayload(binaryDecoder, chunks).ToArray();\n\n                ReadSecurityFooter(binaryDecoder);\n                ReadSignature(binaryDecoder);\n\n                // Processing completed\n                if (buffers.Length != 0 || chunks.Count == 0)\n                {\n                    if (buffers.Length > 0)\n                    {\n                        DecodePayloadChunks(context, buffers, resolver);\n                        // Process all messages in the buffer\n                    }\n                    break;\n                }\n                // Still not processed all chunks, continue reading\n                continue;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override bool TryDecode(Opc.Ua.IServiceMessageContext context,\n            Queue<ReadOnlySequence<byte>> reader, IDataSetMetaDataResolver? resolver)\n        {\n            var chunks = new List<Message>();\n            while (reader.TryPeek(out var buffer))\n            {\n                using var binaryDecoder = new Opc.Ua.BinaryDecoder(buffer.ToArray(), context);\n                ReadNetworkMessageHeaderFlags(binaryDecoder);\n\n                // decode network message header according to the header flags\n                if (!TryReadNetworkMessageHeader(binaryDecoder, chunks.Count == 0))\n                {\n                    return false;\n                }\n\n                var buffers = ReadPayload(binaryDecoder, chunks).ToArray();\n\n                ReadSecurityFooter(binaryDecoder);\n                ReadSignature(binaryDecoder);\n\n                // Processing completed\n                reader.Dequeue();\n                if (buffers.Length != 0 || chunks.Count == 0)\n                {\n                    if (buffers.Length > 0)\n                    {\n                        DecodePayloadChunks(context, buffers, resolver);\n                        // Process all messages in the buffer\n                    }\n                    break;\n                }\n                // Still not processed all chunks, continue reading\n                continue;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override IReadOnlyList<ReadOnlySequence<byte>> Encode(\n            Opc.Ua.IServiceMessageContext context, int maxChunkSize, IDataSetMetaDataResolver? resolver)\n        {\n            var messages = new List<ReadOnlySequence<byte>>();\n            var isChunkMessage = false;\n            var remainingChunks = EncodePayloadChunks(context, resolver).AsSpan();\n\n            // Write one message even if it does not contain anything (heartbeat)\n            do\n            {\n                // Re-evaluate flags every go around\n                _uadpFlags = null;\n                _groupFlags = null;\n                _extendedFlags1 = null;\n                _extendedFlags2 = null;\n\n                var networkMessageNumber = NetworkMessageNumber++;\n\n                using var stream = Memory.GetStream();\n                using var encoder = new Opc.Ua.BinaryEncoder(stream, context, leaveOpen: true);\n                //\n                // Try to write all unless we are writing chunk messages.\n                // Write span is the span of chunks that should go into\n                // the current message. We start with all remaining chunks\n                // and then limit it when trying to write payload.\n                //\n                var writeSpan = remainingChunks;\n\n                //\n                // There is a maximum of 256 messages per network message\n                // due to the payload header count field being just a byte.\n                //\n                if (writeSpan.Length > byte.MaxValue)\n                {\n                    writeSpan = writeSpan[..byte.MaxValue];\n                }\n#if DEBUG\n                var remaining = remainingChunks.Length;\n#endif\n                while (true)\n                {\n                    WriteNetworkMessageHeaderFlags(encoder, isChunkMessage);\n\n                    WriteGroupMessageHeader(encoder, networkMessageNumber);\n                    WritePayloadHeader(encoder, writeSpan, isChunkMessage);\n                    WriteExtendedNetworkMessageHeader(encoder);\n                    WriteSecurityHeader(encoder);\n\n                    if (!TryWritePayload(encoder, maxChunkSize, ref writeSpan,\n                        ref remainingChunks, ref isChunkMessage))\n                    {\n                        encoder.Position = 0; // Restart writing\n                        continue;\n                    }\n\n                    WriteSecurityFooter(encoder);\n                    WriteSignature(encoder);\n#if DEBUG\n                    //\n                    // Now remaining chunks should be equal (in case we are\n                    // writing a chunk message) or less than when we started.\n                    //\n                    Debug.Assert(\n                        (isChunkMessage && remaining == remainingChunks.Length) ||\n                        (!isChunkMessage && remaining > remainingChunks.Length));\n#endif\n                    break;\n                }\n                stream.SetLength(encoder.Position);\n\n                var messageBuffer = stream.GetReadOnlySequence();\n\n                // TODO: instead of copy using ToArray we shall include the\n                // stream with the message and dispose it later when it is\n                // consumed. To get here the bug in BinaryEncoder that it\n                // disposes the underlying stream even if leaveOpen: true\n                // is set must be fixed.\n                messages.Add(new ReadOnlySequence<byte>(messageBuffer.ToArray()));\n            }\n            while (remainingChunks.Length > 0);\n\n            Debug.Assert(!isChunkMessage);\n            return messages;\n        }\n\n        /// <summary>\n        /// Try read network message\n        /// </summary>\n        /// <param name=\"binaryDecoder\"></param>\n        /// <param name=\"isFirstChunk\"></param>\n        /// <returns></returns>\n        protected virtual bool TryReadNetworkMessageHeader(Opc.Ua.BinaryDecoder binaryDecoder,\n            bool isFirstChunk)\n        {\n            if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.DiscoveryTypeBits) != 0)\n            {\n                return false;\n            }\n            if (!TryReadGroupMessageHeader(binaryDecoder) ||\n                !TryReadPayloadHeader(binaryDecoder, isFirstChunk) ||\n                !TryReadExtendedNetworkMessageHeader(binaryDecoder) ||\n                !TryReadSecurityHeader(binaryDecoder))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Decode payload buffers\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"buffers\"></param>\n        /// <param name=\"resolver\"></param>\n        protected virtual void DecodePayloadChunks(Opc.Ua.IServiceMessageContext context,\n            IReadOnlyList<byte[]> buffers, IDataSetMetaDataResolver? resolver)\n        {\n            var payloadLength = buffers.Sum(b => b.Length);\n            using var stream = new RecyclableMemoryStream(Memory, Guid.NewGuid(),\n                PublisherId + _sequenceNumber, payloadLength);\n            foreach (var buffer in buffers)\n            {\n                stream.Write(buffer);\n            }\n            stream.Position = 0;\n            using var decoder = new Opc.Ua.BinaryDecoder(stream, context);\n            foreach (var message in Messages.Cast<UadpDataSetMessage>())\n            {\n                if (!message.TryDecode(decoder, resolver))\n                {\n                    return;\n                }\n            }\n            //\n            // Read remaining messages from buffer if possible.\n            // This is the case if the payload header was missing\n            // and we must use the data set message decoder to\n            // sort out the offset and lengths of the encoding.\n            //\n            while (decoder.Position < payloadLength)\n            {\n                var extra = new UadpDataSetMessage();\n                if (!extra.TryDecode(decoder, resolver))\n                {\n                    break;\n                }\n                Messages.Add(extra);\n            }\n        }\n\n        /// <summary>\n        /// Encode payload buffers\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"resolver\"></param>\n        /// <returns></returns>\n        protected virtual Message[] EncodePayloadChunks(Opc.Ua.IServiceMessageContext context,\n            IDataSetMetaDataResolver? resolver)\n        {\n            var chunks = new Message[Messages.Count];\n            for (var i = 0; i < Messages.Count; i++)\n            {\n                var message = (UadpDataSetMessage)Messages[i];\n                using var stream = Memory.GetStream();\n                using var encoder = new Opc.Ua.BinaryEncoder(stream, context, leaveOpen: true);\n                message.Encode(encoder, resolver);\n\n                // TODO: instead of copy using ToArray we shall include the\n                // stream with the message and dispose it later when it is\n                // consumed. To get here the bug in BinaryEncoder that it\n                // disposes the underlying stream even if leaveOpen: true\n                // is set must be fixed.\n                chunks[i] = new Message(stream.ToArray(), message.DataSetWriterId);\n            }\n            return chunks;\n        }\n\n        /// <summary>\n        /// Read Network Message Header\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        private void ReadNetworkMessageHeaderFlags(Opc.Ua.BinaryDecoder decoder)\n        {\n            UadpFlags = (UADPFlagsEncodingMask)decoder.ReadByte(null);\n\n            // Decode the ExtendedFlags1\n            if ((UadpFlags & UADPFlagsEncodingMask.ExtendedFlags1) != 0)\n            {\n                ExtendedFlags1 = (ExtendedFlags1EncodingMask)decoder.ReadByte(null);\n            }\n\n            // Decode the ExtendedFlags2\n            if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.ExtendedFlags2) != 0)\n            {\n                ExtendedFlags2 = (ExtendedFlags2EncodingMask)decoder.ReadByte(null);\n            }\n\n            // Decode PublisherId\n            if ((UadpFlags & UADPFlagsEncodingMask.PublisherId) != 0)\n            {\n                switch (ExtendedFlags1 & ExtendedFlags1EncodingMask.PublisherIdTypeBits)\n                {\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeUInt16:\n                        PublisherId = decoder.ReadUInt16(null).ToString(CultureInfo.InvariantCulture);\n                        break;\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeUInt32:\n                        PublisherId = decoder.ReadUInt32(null).ToString(CultureInfo.InvariantCulture);\n                        break;\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeUInt64:\n                        PublisherId = decoder.ReadUInt64(null).ToString(CultureInfo.InvariantCulture);\n                        break;\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeString:\n                        PublisherId = decoder.ReadString(null);\n                        break;\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeByte:\n                        PublisherId = decoder.ReadByte(null).ToString(CultureInfo.InvariantCulture);\n                        break;\n                }\n            }\n\n            // Decode DataSetClassId\n            if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.DataSetClassId) != 0)\n            {\n                DataSetClassId = decoder.ReadGuid(null);\n            }\n        }\n\n        /// <summary>\n        /// Write Network Message Header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"isChunkMessage\"></param>\n        /// <exception cref=\"EncodingException\"></exception>\n        protected void WriteNetworkMessageHeaderFlags(Opc.Ua.BinaryEncoder encoder, bool isChunkMessage)\n        {\n            if (isChunkMessage)\n            {\n                UadpFlags |= UADPFlagsEncodingMask.ExtendedFlags1;\n                ExtendedFlags1 |= ExtendedFlags1EncodingMask.ExtendedFlags2;\n                ExtendedFlags2 |= ExtendedFlags2EncodingMask.ChunkMessage;\n            }\n\n            encoder.WriteByte(null, (byte)UadpFlags);\n            if ((UadpFlags & UADPFlagsEncodingMask.ExtendedFlags1) != 0)\n            {\n                encoder.WriteByte(null, (byte)ExtendedFlags1);\n            }\n            if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.ExtendedFlags2) != 0)\n            {\n                encoder.WriteByte(null, (byte)ExtendedFlags2);\n            }\n            if ((UadpFlags & UADPFlagsEncodingMask.PublisherId) != 0)\n            {\n                if (PublisherId == null)\n                {\n                    throw new EncodingException(\"NetworkMessageHeader cannot be encoded. PublisherId \" +\n                        \"is null but it is expected to be encoded.\");\n                }\n\n                switch (ExtendedFlags1 & ExtendedFlags1EncodingMask.PublisherIdTypeBits)\n                {\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeByte:\n                        encoder.WriteByte(null, byte.Parse(PublisherId, CultureInfo.InvariantCulture));\n                        break;\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeUInt16:\n                        encoder.WriteUInt16(null, ushort.Parse(PublisherId, CultureInfo.InvariantCulture));\n                        break;\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeUInt32:\n                        encoder.WriteUInt32(null, uint.Parse(PublisherId, CultureInfo.InvariantCulture));\n                        break;\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeUInt64:\n                        encoder.WriteUInt64(null, ulong.Parse(PublisherId, CultureInfo.InvariantCulture));\n                        break;\n                    case ExtendedFlags1EncodingMask.PublisherIdTypeString:\n                        encoder.WriteString(null, PublisherId);\n                        break;\n                    default:\n                        // Reserved - no type provided\n                        break;\n                }\n            }\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.DataSetClassId) != 0)\n            {\n                encoder.WriteGuid(null, DataSetClassId);\n            }\n        }\n\n        /// <summary>\n        /// Read Group Message Header\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        private bool TryReadGroupMessageHeader(Opc.Ua.BinaryDecoder decoder)\n        {\n            // Decode GroupHeader (that holds GroupFlags)\n            if ((UadpFlags & UADPFlagsEncodingMask.GroupHeader) != 0)\n            {\n                GroupFlags = (GroupFlagsEncodingMask)decoder.ReadByte(null);\n            }\n            // Decode WriterGroupId\n            if ((GroupFlags & GroupFlagsEncodingMask.WriterGroupId) != 0)\n            {\n                WriterGroupId = decoder.ReadUInt16(null);\n            }\n            // Decode GroupVersion\n            if ((GroupFlags & GroupFlagsEncodingMask.GroupVersion) != 0)\n            {\n                GroupVersion = decoder.ReadUInt32(null);\n            }\n            // Decode NetworkMessageNumber\n            if ((GroupFlags & GroupFlagsEncodingMask.NetworkMessageNumber) != 0)\n            {\n                NetworkMessageNumber = decoder.ReadUInt16(null);\n            }\n            // Decode SequenceNumber\n            if ((GroupFlags & GroupFlagsEncodingMask.SequenceNumber) != 0)\n            {\n                _sequenceNumber = decoder.ReadUInt16(null);\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Write Group Message Header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"networkMessageNumber\"></param>\n        private void WriteGroupMessageHeader(Opc.Ua.BinaryEncoder encoder, ushort networkMessageNumber)\n        {\n            if ((NetworkMessageContentMask &\n                    (NetworkMessageContentFlags.GroupHeader |\n                     NetworkMessageContentFlags.WriterGroupId |\n                     NetworkMessageContentFlags.GroupVersion |\n                     NetworkMessageContentFlags.NetworkMessageNumber |\n                     NetworkMessageContentFlags.SequenceNumber)) != 0)\n            {\n                encoder.WriteByte(null, (byte)GroupFlags);\n            }\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.WriterGroupId) != 0)\n            {\n                encoder.WriteUInt16(null, WriterGroupId);\n            }\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.GroupVersion) != 0)\n            {\n                encoder.WriteUInt32(null, GroupVersion);\n            }\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.NetworkMessageNumber) != 0)\n            {\n                encoder.WriteUInt16(null, networkMessageNumber);\n            }\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.SequenceNumber) != 0)\n            {\n                encoder.WriteUInt16(null, SequenceNumber());\n            }\n        }\n\n        /// <summary>\n        /// Read Payload Header\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <param name=\"isFirstChunk\"></param>\n        private bool TryReadPayloadHeader(Opc.Ua.BinaryDecoder decoder, bool isFirstChunk)\n        {\n            // Decode PayloadHeader\n            if ((UadpFlags & UADPFlagsEncodingMask.PayloadHeader) != 0)\n            {\n                if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.ChunkMessage) != 0)\n                {\n                    var dataSetWriterId = decoder.ReadUInt16(null);\n                    // https://reference.opcfoundation.org/Core/Part14/v104/docs/7.2.2.2.4\n\n                    if (isFirstChunk)\n                    {\n                        Messages.Add(new UadpDataSetMessage\n                        {\n                            DataSetWriterId = dataSetWriterId\n                        });\n                    }\n                }\n                else\n                {\n                    var count = decoder.ReadByte(null);\n                    for (var i = 0; i < count; i++)\n                    {\n                        Messages.Add(new UadpDataSetMessage\n                        {\n                            DataSetWriterId = decoder.ReadUInt16(null)\n                        });\n                    }\n                }\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Write Payload Header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"messages\"></param>\n        /// <param name=\"isChunkMessage\"></param>\n        private void WritePayloadHeader(Opc.Ua.BinaryEncoder encoder, ReadOnlySpan<Message> messages,\n            bool isChunkMessage)\n        {\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.PayloadHeader) != 0)\n            {\n                // Write data set message payload header\n                if (isChunkMessage)\n                {\n                    Debug.Assert(messages.Length >= 1);\n                    // https://reference.opcfoundation.org/Core/Part14/v104/docs/7.2.2.2.4\n\n                    // Write chunked NetworkMessage Payload Header (Table 77)\n                    encoder.WriteUInt16(null, messages[0].DataSetWriterId);\n                }\n                else\n                {\n                    Debug.Assert(messages.Length <= byte.MaxValue);\n                    encoder.WriteByte(null, (byte)messages.Length);\n                    // Collect DataSetSetMessages headers\n                    foreach (var message in messages)\n                    {\n                        encoder.WriteUInt16(null, message.DataSetWriterId);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Read extended network message header\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        private bool TryReadExtendedNetworkMessageHeader(Opc.Ua.BinaryDecoder decoder)\n        {\n            // Decode Timestamp\n            if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.Timestamp) != 0)\n            {\n                Timestamp = decoder.ReadDateTime(null);\n            }\n            // Decode PicoSeconds\n            if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.PicoSeconds) != 0)\n            {\n                PicoSeconds = decoder.ReadUInt16(null);\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Write extended network message header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        private void WriteExtendedNetworkMessageHeader(Opc.Ua.BinaryEncoder encoder)\n        {\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.Timestamp) != 0)\n            {\n                encoder.WriteDateTime(null, Timestamp.UtcDateTime);\n            }\n            if ((NetworkMessageContentMask & NetworkMessageContentFlags.Picoseconds) != 0)\n            {\n                encoder.WriteUInt16(null, PicoSeconds);\n            }\n        }\n\n        /// <summary>\n        /// Read security header\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        private bool TryReadSecurityHeader(Opc.Ua.BinaryDecoder decoder)\n        {\n            if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.Security) != 0)\n            {\n                SecurityFlags = (SecurityFlagsEncodingMask)decoder.ReadByte(null);\n\n                SecurityTokenId = decoder.ReadUInt32(null);\n                NonceLength = decoder.ReadByte(null);\n                MessageNonce = decoder.ReadByteArray(null).ToArray();\n\n                if ((SecurityFlags & SecurityFlagsEncodingMask.SecurityFooter) != 0)\n                {\n                    SecurityFooterSize = decoder.ReadUInt16(null);\n                }\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Write security header\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        private void WriteSecurityHeader(Opc.Ua.BinaryEncoder encoder)\n        {\n            if ((ExtendedFlags1 & ExtendedFlags1EncodingMask.Security) != 0)\n            {\n                encoder.WriteByte(null, (byte)SecurityFlags);\n\n                encoder.WriteUInt32(null, SecurityTokenId);\n                encoder.WriteByte(null, NonceLength);\n                MessageNonce = new byte[NonceLength];\n                encoder.WriteByteArray(null, MessageNonce.ToArray());\n\n                if ((SecurityFlags & SecurityFlagsEncodingMask.SecurityFooter) != 0)\n                {\n                    encoder.WriteUInt16(null, SecurityFooterSize);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Decode payload size and prepare for decoding payload\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        /// <param name=\"chunks\"></param>\n        private List<byte[]> ReadPayload(Opc.Ua.BinaryDecoder decoder, List<Message> chunks)\n        {\n            var messages = new List<byte[]>();\n            if ((ExtendedFlags2 & ExtendedFlags2EncodingMask.ChunkMessage) != 0)\n            {\n                // Write Chunked NetworkMessage Payload Fields (Table 78)\n                // https://reference.opcfoundation.org/Core/Part14/v104/docs/7.2.2.2.4\n                var messageSequenceNumber = decoder.ReadUInt16(null);\n                var chunkOffset = decoder.ReadUInt32(null);\n                var totalSize = decoder.ReadUInt32(null);\n                var buffer = decoder.ReadByteString(null);\n\n                var chunk = new Message(buffer, Messages.Count > 0 ? Messages[0].DataSetWriterId : (ushort)0)\n                {\n                    ChunkOffset = chunkOffset,\n                    TotalSize = totalSize,\n                    MessageSequenceNumber = messageSequenceNumber\n                };\n                chunks.Add(chunk);\n\n                var messageBuffer = Message.GetMessageBufferFromChunks(chunks);\n                if (messageBuffer == null)\n                {\n                    return messages;\n                }\n                messages.Add(messageBuffer);\n            }\n            else\n            {\n                if ((UadpFlags & UADPFlagsEncodingMask.PayloadHeader) != 0)\n                {\n                    // Read PayloadHeader Sizes\n                    for (var i = 0; i < Messages.Count; i++)\n                    {\n                        var messageSize = decoder.ReadUInt16(null);\n                        messages.Add(new byte[messageSize]);\n                    }\n                    foreach (var buffer in messages)\n                    {\n                        var read = decoder.BaseStream.Read(buffer);\n                        Debug.Assert(read == buffer.Length);\n                    }\n                }\n                else\n                {\n                    var buffer = decoder.BaseStream.ReadAsBuffer().Array;\n                    if (buffer != null)\n                    {\n                        Messages.Add(new UadpDataSetMessage());\n                        messages.Add(buffer);\n                    }\n                }\n            }\n            return messages;\n        }\n\n        /// <summary>\n        /// Write payload. The approach is to try and write everything into a single message\n        /// first. If we get here and find we could not do it we split the messages into\n        /// either a smaller set (writeSpan) or into a single message we write as chunked\n        /// messages. If we return false we restart the entire encoding process.\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"maxMessageSize\"></param>\n        /// <param name=\"writeSpan\">The sequence to write to the current message</param>\n        /// <param name=\"remainingChunks\">The remaining chunks to write after this\n        /// message returns true</param>\n        /// <param name=\"isChunkMessage\">Sets chunk mode on or off</param>\n        /// <returns></returns>\n        /// <exception cref=\"EncodingException\"></exception>\n        protected bool TryWritePayload(Opc.Ua.BinaryEncoder encoder, int maxMessageSize,\n            ref Span<Message> writeSpan, ref Span<Message> remainingChunks, ref bool isChunkMessage)\n        {\n            const int kChunkHeaderSize =\n                  2  // MessageSequenceNumber\n                + 4  // ChunkOffset\n                + 4  // TotalOffset\n                + 4  // ByteString Length\n                ;\n\n            var payloadOffset = encoder.Position;\n            var available = maxMessageSize - payloadOffset\n                    - SecurityFooterSize - Signature.Length - kChunkHeaderSize;\n            if (available < 0)\n            {\n                if (writeSpan.Length <= 1)\n                {\n                    // Nothing fits. We should not be here - fail catastrophically...\n                    throw new EncodingException(\n                        \"Max message size too small for header for single message\");\n                }\n\n                // Try to limit the number of messages by half\n                writeSpan = writeSpan[..(writeSpan.Length / 2)];\n                return false;\n            }\n\n            if (writeSpan.Length == 0)\n            {\n                // Nothing to do\n                return true;\n            }\n\n            var hasHeader = (NetworkMessageContentMask & NetworkMessageContentFlags.PayloadHeader) != 0;\n            var headerSize = hasHeader ? 2 : 0;\n            var chunk = writeSpan[0];\n            //\n            // We break any message into chunks that a) does not fit in available space,\n            // or b) exceeds the ushort size fields. We count the header size in here to\n            // avoid dropping into the else and failing to fit the first chunk.\n            //\n            if (isChunkMessage ||\n                (chunk.Remaining + headerSize) > available ||\n                chunk.Remaining > ushort.MaxValue)\n            {\n                if (!isChunkMessage)\n                {\n                    isChunkMessage = true;\n                    writeSpan = writeSpan[..1];\n                    // Restart writing the complete buffer now in chunk message mode\n                    return false;\n                }\n\n                available = Math.Min(available, ushort.MaxValue);\n\n                // Write Chunked NetworkMessage Payload Fields (Table 78)\n                // https://reference.opcfoundation.org/Core/Part14/v104/docs/7.2.2.2.4\n                encoder.WriteUInt16(null, chunk.MessageSequenceNumber);\n                encoder.WriteUInt32(null, chunk.ChunkOffset);\n                encoder.WriteUInt32(null, (uint)chunk.ChunkData.Length);\n\n                var chunkLength = Math.Min(chunk.Remaining, available);\n                encoder.WriteInt32(null, chunkLength); // Write byte string\n                encoder.WriteRawBytes(chunk.ChunkData.ToArray(), (int)chunk.ChunkOffset, chunkLength);\n                chunk.ChunkOffset += (uint)chunkLength;\n\n                if (chunk.Remaining == 0)\n                {\n                    // Completed\n                    writeSpan = remainingChunks = remainingChunks[1..];\n                    isChunkMessage = false;\n                }\n                else\n                {\n                    // Write more into next message\n                    chunk.MessageSequenceNumber++;\n                }\n            }\n            else\n            {\n                var writeCount = 0;\n                for (; writeCount < writeSpan.Length; writeCount++)\n                {\n                    var currentChunk = writeSpan[writeCount];\n                    if ((currentChunk.Remaining + headerSize) > available)\n                    {\n                        break;\n                    }\n                    available -= currentChunk.Remaining + headerSize;\n                }\n\n                if (writeSpan.Length != writeCount)\n                {\n                    // Restart by limiting the number of chunks we will write to this message to what fits\n                    writeSpan = remainingChunks[..writeCount];\n                    return false;\n                }\n\n                // https://reference.opcfoundation.org/Core/Part14/v104/docs/7.2.2.3.3\n                if (hasHeader)\n                {\n                    foreach (var buffer in writeSpan)\n                    {\n                        Debug.Assert(buffer.ChunkData.Length <= ushort.MaxValue);\n                        encoder.WriteUInt16(null, (ushort)buffer.ChunkData.Length);\n                    }\n                }\n                foreach (var buffer in writeSpan)\n                {\n                    encoder.WriteRawBytes(buffer.ChunkData.ToArray(), 0, buffer.ChunkData.Length);\n                }\n                remainingChunks = remainingChunks[writeCount..];\n                writeSpan = default;\n            }\n            // Write security header after and finish message\n            return true;\n        }\n\n        /// <summary>\n        /// Read security footer\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        protected void ReadSecurityFooter(Opc.Ua.BinaryDecoder decoder)\n        {\n            if ((SecurityFlags & SecurityFlagsEncodingMask.SecurityFooter) != 0)\n            {\n                SecurityFooter = decoder.ReadByteArray(null).ToArray().AsMemory();\n            }\n        }\n\n        /// <summary>\n        /// Write security footer\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        protected void WriteSecurityFooter(Opc.Ua.BinaryEncoder encoder)\n        {\n            if ((SecurityFlags & SecurityFlagsEncodingMask.SecurityFooter) != 0)\n            {\n                encoder.WriteByteArray(null, SecurityFooter.ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Read signature\n        /// </summary>\n        /// <param name=\"decoder\"></param>\n        protected void ReadSignature(Opc.Ua.BinaryDecoder decoder)\n        {\n            if ((SecurityFlags & SecurityFlagsEncodingMask.SecurityFooter) != 0)\n            {\n                Signature = decoder.ReadByteArray(null).ToArray();\n            }\n        }\n\n        /// <summary>\n        /// Write signature\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        protected void WriteSignature(Opc.Ua.BinaryEncoder encoder)\n        {\n            if ((SecurityFlags & SecurityFlagsEncodingMask.SecurityFooter) != 0 &&\n                Signature.Length > 0)\n            {\n                encoder.WriteByteArray(null, Signature.ToArray());\n            }\n        }\n\n        /// <summary>\n        /// Track messages\n        /// </summary>\n        protected sealed class Message\n        {\n            /// <summary>\n            /// Data set writer of the dataset message\n            /// </summary>\n            public ushort DataSetWriterId { get; }\n\n            /// <summary>\n            /// Current message sequence number\n            /// </summary>\n            public ushort MessageSequenceNumber { get; set; }\n\n            /// <summary>\n            /// Chunk offset\n            /// </summary>\n            public uint ChunkOffset { get; set; }\n\n            /// <summary>\n            /// Full message buffer\n            /// </summary>\n            public uint TotalSize { get; set; }\n\n            /// <summary>\n            /// Chunk length\n            /// </summary>\n            public int Remaining => ChunkData.Length - (int)ChunkOffset;\n\n            /// <summary>\n            /// Full message buffer\n            /// </summary>\n            public ReadOnlyMemory<byte> ChunkData { get; }\n\n            /// <summary>\n            /// Get message buffer from chunk list\n            /// </summary>\n            /// <param name=\"chunks\"></param>\n            /// <returns></returns>\n            public static byte[]? GetMessageBufferFromChunks(IList<Message> chunks)\n            {\n                if (chunks.Count == 0)\n                {\n                    return null;\n                }\n                var totalSize = chunks[0].TotalSize;\n                if (!chunks.All(a => a.TotalSize == totalSize))\n                {\n                    chunks.Clear();\n                    return [];\n                }\n                var total = chunks.Sum(c => c.ChunkData.Length);\n                if (total >= totalSize)\n                {\n                    var message = new byte[total];\n                    int? firstIndex = null;\n                    foreach (var c in chunks.OrderBy(a => a.MessageSequenceNumber))\n                    {\n                        if (firstIndex == null)\n                        {\n                            firstIndex = c.MessageSequenceNumber;\n                        }\n                        else\n                        {\n                            firstIndex++;\n                            if (c.MessageSequenceNumber != firstIndex)\n                            {\n                                chunks.Clear();\n                                return [];\n                            }\n                        }\n                        Array.Copy(c.ChunkData.ToArray(), 0, message, c.ChunkOffset,\n                            c.ChunkData.Length);\n                    }\n                    chunks.Clear();\n                    return message;\n                }\n                return null;\n            }\n\n            /// <summary>\n            /// Create chunk\n            /// </summary>\n            /// <param name=\"buffer\"></param>\n            /// <param name=\"dataSetWriterId\"></param>\n            public Message(byte[] buffer, ushort dataSetWriterId)\n            {\n                ChunkData = buffer;\n                TotalSize = (uint)buffer.Length;\n                ChunkOffset = 0;\n                DataSetWriterId = dataSetWriterId;\n                MessageSequenceNumber = 0;\n            }\n        }\n\n        private UADPFlagsEncodingMask? _uadpFlags;\n        private GroupFlagsEncodingMask? _groupFlags;\n        private ExtendedFlags2EncodingMask? _extendedFlags2;\n        private ExtendedFlags1EncodingMask? _extendedFlags1;\n        /// <summary> To update sequence number </summary>\n        protected ushort _sequenceNumber;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/AvroBuiltInSchemas.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using global::Avro;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Provides the Avro schemas of built in types and objects\n    /// for the Avro binary encoding\n    /// </summary>\n    internal class AvroBuiltInSchemas : BaseBuiltInSchemas<Schema>\n    {\n        private static Schema EnumerationSchema\n        {\n            get\n            {\n                // Enumeration is a record of type int\n                return Primitive((int)BuiltInType.Enumeration,\n                    nameof(BuiltInType.Enumeration), \"int\");\n            }\n        }\n\n        private Schema DiagnosticInfoSchema\n        {\n            get\n            {\n                return RecordSchema.Create(nameof(BuiltInType.DiagnosticInfo),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.Int32), \"SymbolicId\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.Int32), \"NamespaceUri\", 1),\n                        new (GetSchemaForBuiltInType(BuiltInType.Int32), \"Locale\", 2),\n                        new (GetSchemaForBuiltInType(BuiltInType.Int32), \"LocalizedText\", 3),\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"AdditionalInfo\", 4),\n                        new (GetSchemaForBuiltInType(BuiltInType.StatusCode), \"InnerStatusCode\", 5),\n                        new (GetSchemaForBuiltInType(BuiltInType.DiagnosticInfo).AsNullable(),\n                            \"InnerDiagnosticInfo\", 6)\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.DiagnosticInfo) });\n            }\n        }\n\n        private Schema VariantSchema\n        {\n            get\n            {\n                var types = AvroSchema.Null.YieldReturn()\n                    .Concat(GetPossibleTypes(SchemaRank.Scalar))\n                    .Concat(GetPossibleTypes(SchemaRank.Collection))\n                    .Concat(GetPossibleTypes(SchemaRank.Matrix))\n                    .ToList();\n                return RecordSchema.Create(nameof(BuiltInType.Variant),\n                [\n                    new (UnionSchema.Create(types), kSingleFieldName, 0)\n                ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.Variant) });\n                IEnumerable<Schema> GetPossibleTypes(SchemaRank valueRank)\n                {\n                    for (var i = 1; i <= 29; i++)\n                    {\n                        if (i == (int)BuiltInType.DiagnosticInfo)\n                        {\n                            continue;\n                        }\n                        if (i == 26 || i == 27 || i == 28)\n                        {\n                            continue;\n                        }\n                        if (i == (int)BuiltInType.Variant && valueRank == SchemaRank.Scalar)\n                        {\n                            continue; // Array of variant is allowed\n                        }\n                        if (i == (int)BuiltInType.Byte && valueRank == SchemaRank.Collection)\n                        {\n                            continue; // Array of bytes is not allowed\n                        }\n                        yield return GetSchemaForBuiltInType((BuiltInType)i, valueRank);\n                    }\n                }\n            }\n        }\n\n        private Schema ExtensionObjectSchema\n        {\n            get\n            {\n                return RecordSchema.Create(nameof(BuiltInType.ExtensionObject),\n                    [\n                        new (AvroSchema.AsUnion(RecordSchema.Create(\"EncodedDataType\",\n                            [\n                                new (GetSchemaForBuiltInType(BuiltInType.NodeId), \"TypeId\", 0),\n                                new (GetSchemaForBuiltInType(BuiltInType.ByteString), \"Body\", 1)\n                            ], SchemaUtils.NamespaceZeroName)), kSingleFieldName, 0)\n                            // ...\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.ExtensionObject) });\n            }\n        }\n\n        private Schema QualifiedNameSchema\n        {\n            get\n            {\n                return RecordSchema.Create(nameof(BuiltInType.QualifiedName),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"Namespace\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"Name\", 1)\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.QualifiedName) });\n            }\n        }\n\n        private Schema LocalizedTextSchema\n        {\n            get\n            {\n                return RecordSchema.Create(nameof(BuiltInType.LocalizedText),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"Locale\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"Text\", 1)\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.LocalizedText) });\n            }\n        }\n\n        private Schema NodeIdSchema\n        {\n            get\n            {\n                var idType = AvroSchema.AsUnion(\n                    GetSchemaForBuiltInType(BuiltInType.UInt32),\n                    GetSchemaForBuiltInType(BuiltInType.String),\n                    GetSchemaForBuiltInType(BuiltInType.Guid),\n                    GetSchemaForBuiltInType(BuiltInType.ByteString));\n                return RecordSchema.Create(nameof(BuiltInType.NodeId),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"Namespace\", 0),\n                        new (idType, \"Identifier\", 1)\n                    ],\n                    SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.NodeId) });\n            }\n        }\n\n        private Schema ExpandedNodeIdSchema\n        {\n            get\n            {\n                var idType = AvroSchema.AsUnion(\n                    GetSchemaForBuiltInType(BuiltInType.UInt32),\n                    GetSchemaForBuiltInType(BuiltInType.String),\n                    GetSchemaForBuiltInType(BuiltInType.Guid),\n                    GetSchemaForBuiltInType(BuiltInType.ByteString));\n                return RecordSchema.Create(nameof(BuiltInType.ExpandedNodeId),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"Namespace\", 0),\n                        new (idType, \"Identifier\", 1),\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"ServerUri\", 3)\n                    ],\n                    SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.ExpandedNodeId) });\n            }\n        }\n\n        private Schema DataValueSchema\n        {\n            get\n            {\n                return RecordSchema.Create(nameof(BuiltInType.DataValue),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.Variant), \"Value\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.StatusCode), \"StatusCode\", 1),\n                        new (GetSchemaForBuiltInType(BuiltInType.DateTime), \"SourceTimestamp\", 2),\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt16), \"SourcePicoseconds\", 3),\n                        new (GetSchemaForBuiltInType(BuiltInType.DateTime), \"ServerTimestamp\", 4),\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt16), \"ServerPicoseconds\", 5)\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.DataValue) });\n            }\n        }\n\n        private static Schema UlongSchema\n        {\n            get\n            {\n                return RecordSchema.Create(nameof(BuiltInType.UInt64),\n                    [\n                        new (UnionSchema.Create(\n                        [\n                            PrimitiveSchema.NewInstance(\"int\"),\n                            FixedSchema.Create(\"ulong\", 8, SchemaUtils.NamespaceZeroName)\n                        ]), kSingleFieldName, 0)\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.DataValue) });\n            }\n        }\n\n        /// <inheritdoc/>\n        public override Schema GetSchemaForBuiltInType(BuiltInType builtInType,\n            SchemaRank rank = SchemaRank.Scalar)\n        {\n            // Always use byte string for byte arrays\n            if (builtInType == BuiltInType.Byte && rank == SchemaRank.Collection)\n            {\n                builtInType = BuiltInType.ByteString;\n                rank = SchemaRank.Scalar;\n            }\n\n            // TODO: Placeholder caching is needed to avoid stack overflow\n            // However we should clear the cache every time we completed the\n            // api lookup, to avoid getting placeholder items leaking out\n            // to an outside caller.\n            if (!_builtIn.TryGetValue((builtInType, rank), out var schema))\n            {\n                // Before we create the schema add a place\n                // holder here to break any recursin.\n\n                _builtIn.Add((builtInType, rank),\n                    PlaceHolder(builtInType, rank));\n\n                switch (rank)\n                {\n                    case SchemaRank.Matrix:\n                        schema = MatrixType((int)builtInType, builtInType.ToString());\n                        break;\n                    case SchemaRank.Collection:\n                        schema = CollectionType((int)builtInType, builtInType.ToString());\n                        break;\n                    default:\n                        schema = Get((int)builtInType);\n                        break;\n                }\n                _builtIn[(builtInType, rank)] = schema;\n            }\n            return schema;\n\n            Schema Get(int id) => id switch\n            {\n                0 => AvroSchema.Null,\n\n                1 => Primitive(id, \"Boolean\", \"boolean\"),\n\n                2 => Primitive(id, \"SByte\", \"int\"),\n                3 => Primitive(id, \"Byte\", \"int\"),\n                4 => Primitive(id, \"Int16\", \"int\"),\n                5 => Primitive(id, \"UInt16\", \"int\"),\n                6 => Primitive(id, \"Int32\", \"int\"),\n                7 => Primitive(id, \"UInt32\", \"int\"),\n                8 => Primitive(id, \"Int64\", \"int\"),\n\n                9 => UlongSchema,\n\n                10 => Primitive(id, \"Float\", \"float\"),\n                11 => Primitive(id, \"Double\", \"double\"),\n                12 => Primitive(id, \"String\", \"string\"),\n                13 => Primitive(id, \"DateTime\", \"long\"),\n#if UUID_FIXED\n                14 => Fixed(id, \"Guid\", \"uuid\", 16),\n#else\n                14 => Primitive(id, \"Guid\", \"string\", \"uuid\"),\n#endif\n                15 => Primitive(id, \"ByteString\", \"bytes\"),\n                16 => Primitive(id, \"XmlElement\", \"string\"),\n\n                17 => NodeIdSchema,\n                18 => ExpandedNodeIdSchema,\n                19 => Primitive(id, \"StatusCode\", \"long\"),\n\n                20 => QualifiedNameSchema,\n                21 => LocalizedTextSchema,\n                22 => ExtensionObjectSchema,\n                23 => DataValueSchema,\n                24 => VariantSchema,\n                25 => DiagnosticInfoSchema,\n\n                26 => VariantSchema, // Primitive(id, \"Number\", \"string\"),\n                27 => VariantSchema, // Primitive(id, \"Integer\", \"string\"),\n                28 => VariantSchema, // Primitive(id, \"UInteger\", \"string\"),\n\n                29 => EnumerationSchema,\n                _ => throw new ArgumentException($\"Built in type {id} unknown\")\n            };\n        }\n\n        /// <inheritdoc/>\n        public override Schema GetSchemaForExtendableType(string name, string ns,\n            string dataTypeId, Schema bodyType)\n        {\n            // Extension objects are records of fields\n            // 1. Encoding Node Id\n            // 2. A union of\n            //   1. null\n            //   2. A encodeable type\n            //   3. A record with\n            //     1. ExtensionObjectEncoding type enum\n            //     2. bytes that are either binary opc ua or xml/json utf 8\n\n            var encodingType = EnumSchema.Create(\"ExtensionObjectEncoding\", new string[]\n            {\n                \"None\",\n                \"Binary\",\n                \"Xml\",\n                \"Reserved1\",\n                \"ByteString\"\n            });\n            return RecordSchema.Create(name + nameof(BuiltInType.ExtensionObject),\n                [\n                    new (GetSchemaForBuiltInType(BuiltInType.NodeId), \"TypeId\", 0),\n                    new (UnionSchema.Create(\n                    [\n                        AvroSchema.Null,\n                        bodyType,\n                        RecordSchema.Create(\"Encoded\",\n                        [\n                            new (encodingType, \"Encoding\", 0),\n                            new (GetSchemaForBuiltInType(BuiltInType.ByteString), \"Bytes\", 1)\n                        ])\n                    ]), \"Body\", 1)\n                ], ns, new[] { dataTypeId });\n        }\n\n        /// <inheritdoc/>\n        public override Schema GetSchemaForDataSetField(string ns, bool asDataValue,\n            Schema valueSchema, BuiltInType builtInType)\n        {\n            var variantSchema = GetSchemaForBuiltInType(BuiltInType.Variant);\n#if USE_VARIANT_FOR_DATAVALUE\n            valueSchema = variantSchema;\n#endif\n            var schemaName = string.Empty;\n            var space = SchemaUtils.NamespaceZeroName;\n            if (valueSchema.Fullname != variantSchema.Fullname)\n            {\n                // Variant is by default already nullable\n                schemaName = valueSchema.Name;\n                space = ns;\n                valueSchema = valueSchema.AsNullable();\n            }\n\n            if (asDataValue)\n            {\n                return RecordSchema.Create(schemaName + nameof(BuiltInType.DataValue),\n                    [\n                        new (valueSchema, \"Value\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.StatusCode), \"StatusCode\", 1),\n                        new (GetSchemaForBuiltInType(BuiltInType.DateTime), \"SourceTimestamp\", 2),\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt16), \"SourcePicoseconds\", 3),\n                        new (GetSchemaForBuiltInType(BuiltInType.DateTime), \"ServerTimestamp\", 4),\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt16), \"ServerPicoseconds\", 5)\n                    ], space).AsNullable();\n            }\n            return valueSchema;\n        }\n\n        /// <inheritdoc/>\n        public override Schema GetSchemaForRank(Schema schema, SchemaRank rank)\n        {\n            switch (rank)\n            {\n                case SchemaRank.Matrix:\n                    return MatrixType(schema);\n                case SchemaRank.Collection:\n                    return CollectionType(schema);\n                default:\n                    return schema;\n            }\n        }\n\n        /// <summary>\n        /// Get data typeid\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        private static string GetDataTypeId(BuiltInType builtInType)\n        {\n            return \"i_\" + (int)builtInType;\n        }\n\n        /// <summary>\n        /// Create primitive opc ua built in type\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"type\"></param>\n        /// <param name=\"logicalType\"></param>\n        /// <returns></returns>\n        internal static Schema Primitive(int builtInType, string name,\n            string type, string? logicalType = null)\n        {\n            var baseType = logicalType == null ?\n                PrimitiveSchema.NewInstance(type) : Schema.Parse(\n    $$\"\"\"{\"type\": \"{{type}}\", \"logicalType\": \"{{logicalType}}\"}\"\"\");\n            return RecordSchema.Create(name,\n            [\n                new (baseType, kSingleFieldName, 0)\n            ], SchemaUtils.NamespaceZeroName,\n                new[] { GetDataTypeId((BuiltInType)builtInType) });\n        }\n\n        /// <summary>\n        /// Create primitive opc ua built in type\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"baseName\"></param>\n        /// <param name=\"size\"></param>\n        /// <returns></returns>\n        internal static Schema Fixed(int builtInType, string name,\n            string baseName, int size)\n        {\n            var baseType = FixedSchema.Create(baseName, size);\n            return RecordSchema.Create(name,\n            [\n                new (baseType, kSingleFieldName, 0)\n            ], SchemaUtils.NamespaceZeroName,\n                new[] { GetDataTypeId((BuiltInType)builtInType) });\n        }\n\n        /// <summary>\n        /// Create collection opc ua built in type\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        internal Schema CollectionType(int builtInType, string name)\n        {\n            var baseType = GetSchemaForBuiltInType((BuiltInType)builtInType);\n            return CollectionType(baseType, name, SchemaUtils.NamespaceZeroName);\n        }\n\n        /// <summary>\n        /// Create collection type\n        /// </summary>\n        /// <param name=\"baseType\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"space\"></param>\n        /// <returns></returns>\n        private static RecordSchema CollectionType(Schema baseType, string? name = null,\n            string? space = null)\n        {\n            name ??= baseType.Name;\n            if (space == null && baseType is NamedSchema n)\n            {\n                space = n.Namespace;\n            }\n            space ??= SchemaUtils.PublisherNamespace;\n            return RecordSchema.Create(name + nameof(SchemaRank.Collection),\n            [\n                new (baseType.AsArray(), kSingleFieldName, 0)\n            ], space);\n        }\n\n        /// <summary>\n        /// Create matrix opc ua built in type\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        internal Schema MatrixType(int builtInType, string name)\n        {\n            var baseType = GetSchemaForBuiltInType((BuiltInType)builtInType);\n            return MatrixType(baseType, name, SchemaUtils.NamespaceZeroName);\n        }\n\n        /// <summary>\n        /// Create matrix type\n        /// </summary>\n        /// <param name=\"baseType\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"space\"></param>\n        /// <returns></returns>\n        private RecordSchema MatrixType(Schema baseType, string? name = null,\n            string? space = null)\n        {\n            name ??= baseType.Name;\n            if (space == null && baseType is NamedSchema n)\n            {\n                space = n.Namespace;\n            }\n            space ??= SchemaUtils.PublisherNamespace;\n            return RecordSchema.Create(name + nameof(SchemaRank.Matrix),\n            [\n                new (GetSchemaForBuiltInType(BuiltInType.Int32,\n                    SchemaRank.Collection), \"Dimensions\", 0),\n                new (baseType.AsArray(), kSingleFieldName, 0)\n            ], space);\n        }\n\n        /// <summary>\n        /// Create a place holder\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"rank\"></param>\n        /// <returns></returns>\n        private static AvroSchema.PlaceHolder PlaceHolder(BuiltInType builtInType,\n            SchemaRank rank)\n        {\n            var name = builtInType.ToString();\n            if (rank != SchemaRank.Scalar)\n            {\n                name += rank;\n            }\n            return AvroSchema.CreatePlaceHolder(name, SchemaUtils.NamespaceZeroName);\n        }\n\n        private const string kSingleFieldName = \"Value\";\n        private readonly Dictionary<(BuiltInType, SchemaRank), Schema> _builtIn = [];\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/AvroDataSet.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using global::Avro;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Extensions to convert metadata into avro schema. Note that this class\n    /// generates a schema that complies with the avro representation in\n    /// <see cref=\"AvroEncoder.WriteDataSet(string?, Models.DataSet?)\"/>.\n    /// </summary>\n    public class AvroDataSet : BaseDataSetSchema<Schema>, IAvroSchema, IEventSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.AvroSchema;\n\n        /// <inheritdoc/>\n        public string Name => Schema.Fullname;\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        string IEventSchema.Schema => Schema.ToString();\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        public override Schema Schema { get; }\n\n        /// <summary>\n        /// Get avro schema for a dataset\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"dataSet\"></param>\n        /// <param name=\"dataSetFieldContentFlags\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        public AvroDataSet(string id, PublishedDataSetMetaDataModel dataSet,\n            DataSetFieldContentFlags? dataSetFieldContentFlags = null,\n            SchemaOptions? options = null, HashSet<string>? uniqueNames = null)\n            : base(dataSetFieldContentFlags, new AvroBuiltInSchemas(), options)\n        {\n            Id = id;\n            Schema = Compile(dataSet.DataSetMetaData?.Name, dataSet, uniqueNames)\n                ?? AvroSchema.Null;\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return Schema.ToString();\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<Schema> GetDataSetFieldSchemas(string? name,\n            PublishedDataSetMetaDataModel dataSet, HashSet<string>? uniqueNames)\n        {\n            var singleValue = dataSet.Fields.Count == 1;\n            GetEncodingMode(out var omitFieldName, out var fieldsAreDataValues,\n                singleValue);\n            if (omitFieldName)\n            {\n                var set = new HashSet<Schema>();\n                foreach (var fieldMetadata in dataSet.Fields)\n                {\n                    if (fieldMetadata?.DataType != null)\n                    {\n                        set.Add(LookupSchema(fieldMetadata.DataType,\n                            SchemaUtils.GetRank(fieldMetadata.ValueRank),\n                            fieldMetadata.ArrayDimensions));\n                    }\n                }\n                return set.Select(s => s.AsNullable());\n            }\n\n            var ns = _options.Namespace != null ?\n                SchemaUtils.NamespaceUriToNamespace(_options.Namespace) :\n                SchemaUtils.PublisherNamespace;\n\n            var fields = new List<Field>();\n            var pos = 0;\n            foreach (var fieldMetadata in dataSet.Fields)\n            {\n                // Now collect the fields of the payload\n                pos++;\n                if (fieldMetadata?.DataType != null)\n                {\n                    var schema = LookupSchema(fieldMetadata.DataType,\n                        SchemaUtils.GetRank(fieldMetadata.ValueRank),\n                        fieldMetadata.ArrayDimensions);\n                    if (fieldMetadata.Name != null)\n                    {\n                        // TODO: Add properties to the field type\n                        schema = Encoding.GetSchemaForDataSetField(ns, fieldsAreDataValues,\n                            schema, (Opc.Ua.BuiltInType)fieldMetadata.BuiltInType);\n\n                        fields.Add(new Field(schema, SchemaUtils.Escape(fieldMetadata.Name), pos));\n                    }\n                }\n            }\n            // Type name of the message record\n            name ??= dataSet.DataSetMetaData.Name;\n            if (string.IsNullOrEmpty(name))\n            {\n                // Type name of the message record\n                name = \"DataSet\";\n            }\n            else\n            {\n                name = SchemaUtils.Escape(name);\n            }\n            return RecordSchema.Create(MakeUnique(name, uniqueNames), fields).YieldReturn();\n        }\n\n        /// <inheritdoc/>\n        protected override Schema CreateStructureSchema(StructureDescriptionModel description,\n            SchemaRank rank, Schema? baseTypeSchema)\n        {\n            //\n            // |---------------|------------|----------------|\n            // | Field Value   | Reversible | Non-Reversible |\n            // |---------------|------------|----------------|\n            // | NULL          | Omitted    | JSON null      |\n            // | Default Value | Omitted    | Default Value  |\n            // |---------------|------------|----------------|\n            //\n            var fields = new List<Field>();\n            var pos = 0;\n            if (baseTypeSchema is RecordSchema b)\n            {\n                foreach (var field in b.Fields)\n                {\n                    fields.Add(new Field(field.Schema, field.Name, pos++,\n                        field.Aliases, field.Documentation, field.DefaultValue));\n                    // Can we copy type property to the field to show inheritance\n                }\n            }\n\n            foreach (var field in description.Fields)\n            {\n                var schema = LookupSchema(field.DataType,\n                    SchemaUtils.GetRank(field.ValueRank), field.ArrayDimensions);\n                if (field.IsOptional)\n                {\n                    schema = schema.AsNullable();\n                }\n                fields.Add(new Field(schema, SchemaUtils.Escape(field.Name), pos++));\n            }\n\n            var (ns1, dt) = SchemaUtils.SplitNodeId(description.DataTypeId, Context, true);\n            var name = SchemaUtils.SplitQualifiedName(description.Name, Context, ns1);\n            var scalar = RecordSchema.Create(name, fields, ns1, new[] { dt },\n                customProperties: AvroSchema.Properties(description.DataTypeId));\n            return Encoding.GetSchemaForRank(scalar, rank);\n        }\n\n        /// <inheritdoc/>\n        protected override Schema CreateEnumSchema(EnumDescriptionModel description,\n            SchemaRank rank)\n        {\n            var (ns, dt) = SchemaUtils.SplitNodeId(description.DataTypeId, Context, true);\n            var symbols = description.Fields\n                .Select(e => SchemaUtils.Escape(e.Name))\n                .ToList();\n            var scalar = EnumSchema.Create(\n                SchemaUtils.SplitQualifiedName(description.Name, Context, ns),\n                symbols, ns, new[] { dt },\n                customProperties: AvroSchema.Properties(description.DataTypeId),\n                defaultSymbol: symbols[0]);\n            // TODO: Build doc from fields descriptions\n            return Encoding.GetSchemaForRank(scalar, rank);\n        }\n\n        /// <inheritdoc/>\n        protected override Schema CreateUnionSchema(IReadOnlyList<Schema> schemas)\n        {\n            return schemas.AsUnion();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/AvroDataSetMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using global::Avro;\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Avro Dataset message avro schema\n    /// </summary>\n    public sealed class AvroDataSetMessage : BaseDataSetMessage\n    {\n        /// <inheritdoc/>\n        public override Schema Schema { get; }\n\n        /// <inheritdoc/>\n        protected override BaseDataSetSchema<Schema> DataSetSchema { get; }\n\n        /// <summary>\n        /// Get avro schema for a dataset\n        /// </summary>\n        /// <param name=\"dataSetMessage\"></param>\n        /// <param name=\"networkMessageContentFlags\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        internal AvroDataSetMessage(PublishedDataSetMessageSchemaModel dataSetMessage,\n            NetworkMessageContentFlags networkMessageContentFlags,\n            SchemaOptions options, HashSet<string> uniqueNames) : base(dataSetMessage.Id)\n        {\n            DataSetSchema = new AvroDataSet(dataSetMessage.Id, dataSetMessage.MetaData,\n                dataSetMessage.DataSetFieldContentFlags, options, uniqueNames);\n            Schema = Compile(dataSetMessage.TypeName, dataSetMessage.DataSetMessageContentFlags\n                    ?? PubSubMessage.DefaultDataSetMessageContentFlags,\n                uniqueNames, networkMessageContentFlags, options);\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<Field> CollectFields(\n            DataSetMessageContentFlags dataSetMessageContentFlags,\n            NetworkMessageContentFlags networkMessageContentFlags, Schema valueSchema)\n        {\n            var encoding = new AvroBuiltInSchemas();\n            var version = RecordSchema.Create(nameof(ConfigurationVersionDataType),\n                [\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.UInt32),\n                    \"MajorVersion\", 0),\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.UInt32),\n                    \"MinorVersion\", 1)\n            ], SchemaUtils.NamespaceZeroName,\n                new[] { \"i_\" + DataTypes.ConfigurationVersionDataType });\n\n            return new List<Field>\n            {\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                    nameof(DataSetMessageContentFlags.MessageType), 0),\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                    nameof(DataSetMessageContentFlags.DataSetWriterName), 1),\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.UInt16),\n                    nameof(DataSetMessageContentFlags.DataSetWriterId), 2),\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.UInt32),\n                    nameof(DataSetMessageContentFlags.SequenceNumber), 3),\n                new(version,\n                    nameof(DataSetMessageContentFlags.MetaDataVersion), 4),\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.DateTime),\n                    nameof(DataSetMessageContentFlags.Timestamp), 5),\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.StatusCode),\n                    nameof(DataSetMessageContentFlags.Status), 6),\n\n                new(valueSchema, nameof(PubSub.AvroDataSetMessage.Payload), 7)\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/AvroNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using global::Avro;\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Network message avro schema\n    /// </summary>\n    public sealed class AvroNetworkMessage : BaseNetworkMessage\n    {\n        /// <inheritdoc/>\n        public override Schema Schema { get; }\n\n        /// <summary>\n        /// Get avro schema for a writer group\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public AvroNetworkMessage(PublishedNetworkMessageSchemaModel networkMessage,\n            SchemaOptions? options = null) : base(networkMessage.Id, networkMessage.Version)\n        {\n            Schema = Compile(networkMessage, options);\n        }\n\n        /// <inheritdoc/>\n        protected override Schema Compile(PublishedDataSetMessageSchemaModel dataSetMessage,\n            NetworkMessageContentFlags networkMessageContentFlags,\n            SchemaOptions options, HashSet<string> uniqueNames)\n        {\n            return new AvroDataSetMessage(dataSetMessage, networkMessageContentFlags, options,\n                uniqueNames).Schema;\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<Field> CollectFields(\n            NetworkMessageContentFlags contentMask, Schema payloadType)\n        {\n            var HasNetworkMessageHeader = contentMask\n                .HasFlag(NetworkMessageContentFlags.NetworkMessageHeader);\n\n            var encoding = new AvroBuiltInSchemas();\n            return HasNetworkMessageHeader ?\n                [\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                        nameof(PubSub.AvroNetworkMessage.MessageId), 0),\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                        nameof(PubSub.AvroNetworkMessage.MessageType), 1),\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                        nameof(PubSub.AvroNetworkMessage.PublisherId), 2),\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.Guid),\n                        nameof(PubSub.AvroNetworkMessage.DataSetClassId), 3),\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                        nameof(PubSub.AvroNetworkMessage.DataSetWriterGroup), 4),\n\n                    new(payloadType, nameof(PubSub.AvroNetworkMessage.Messages), 5)\n                ] :\n                [\n                    new(payloadType, nameof(PubSub.AvroNetworkMessage.Messages), 0)\n                ];\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/AvroSchema.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using global::Avro;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Text.Json;\n\n    /// <summary>\n    /// Avro schema extensions\n    /// </summary>\n    internal static class AvroSchema\n    {\n        /// <summary>\n        /// Null schema\n        /// </summary>\n        public static Schema Null { get; } = PrimitiveSchema.NewInstance(\"null\");\n\n        /// <summary>\n        /// Set data type\n        /// </summary>\n        /// <param name=\"dataTypeId\"></param>\n        /// <returns></returns>\n        public static PropertyMap Properties(string? dataTypeId)\n        {\n            return new PropertyMap()\n                .AddProperty(kUaDataTypeIdKey, dataTypeId);\n        }\n\n        /// <summary>\n        /// Get the property map\n        /// </summary>\n        /// <param name=\"properties\"></param>\n        /// <param name=\"key\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static PropertyMap AddProperty(this PropertyMap properties,\n            string key, string? value)\n        {\n            if (value != null)\n            {\n                // Need to add json strings\n                properties.Add(key, \"\\\"\" + value + \"\\\"\");\n            }\n            return properties;\n        }\n\n        /// <summary>\n        /// Get the data type id\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static ExpandedNodeId GetDataTypeId(this Schema schema,\n            IServiceMessageContext context)\n        {\n            var type = schema.GetProperty(kUaDataTypeIdKey);\n            if (type == null &&\n                schema is NamedSchema ns &&\n                context.NamespaceUris.TryFindNamespace(ns.Namespace,\n                    out var namespaceIndex, out var namespaceUri))\n            {\n                return new ExpandedNodeId(ns.Name,\n                    (ushort)namespaceIndex, namespaceUri, 0);\n            }\n            if (type == null)\n            {\n                return ExpandedNodeId.Null;\n            }\n            return type.TrimQuotes().ToExpandedNodeId(context);\n        }\n\n        /// <summary>\n        /// Create nullable\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <returns></returns>\n        public static Schema AsNullable(this Schema schema)\n        {\n            if (schema == Null)\n            {\n                return schema;\n            }\n            if (schema is UnionSchema u)\n            {\n                if (!u.Schemas.Contains(Null))\n                {\n                    u.Schemas.Insert(0, Null);\n                }\n                else\n                {\n                    Debug.Assert(u.Schemas[0] == Null);\n                }\n                return u;\n            }\n            return UnionSchema.Create(\n            [\n                Null,\n                schema\n            ]);\n        }\n\n        /// <summary>\n        /// Returns the schema as formatted json\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public static string ToJson(this Schema schema,\n            JsonSerializerOptions? options = null)\n        {\n            var json = schema.ToString();\n            var document = JsonDocument.Parse(json);\n            return JsonSerializer.Serialize(document, options ?? kIndented);\n        }\n\n        /// <summary>\n        /// Is data value\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <returns></returns>\n        public static bool IsDataValue(this Schema schema)\n        {\n            if (schema is not RecordSchema r)\n            {\n                return false;\n            }\n            return r.Fields.Count == 6 && r.Fields\n                .Select(r => r.Name).SequenceEqual(new[]\n                {\n                    \"Value\",\n                    \"StatusCode\",\n                    \"SourceTimestamp\",\n                    \"SourcePicoseconds\",\n                    \"ServerTimestamp\",\n                    \"ServerPicoseconds\"\n                });\n        }\n\n        /// <summary>\n        /// Test for built in type\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <returns></returns>\n        public static bool IsBuiltInType(this Schema schema,\n            out BuiltInType builtInType, out SchemaRank valueRank)\n        {\n            valueRank = SchemaRank.Scalar;\n            if (schema is RecordSchema ns &&\n                ns.SchemaName.Namespace == SchemaUtils.NamespaceZeroName)\n            {\n                var name = ns.Name;\n                if (name.EndsWith(nameof(SchemaRank.Collection),\n                    StringComparison.InvariantCulture))\n                {\n                    valueRank = SchemaRank.Collection;\n                    name = name[..^nameof(SchemaRank.Collection).Length];\n                }\n                else if (name.EndsWith(nameof(SchemaRank.Matrix),\n                    StringComparison.InvariantCulture))\n                {\n                    valueRank = SchemaRank.Matrix;\n                    name = name[..^nameof(SchemaRank.Matrix).Length];\n                }\n                if (Enum.TryParse(name, out builtInType))\n                {\n                    return true;\n                }\n            }\n            if (schema is ArraySchema a)\n            {\n                valueRank = SchemaRank.Collection;\n                schema = a.ItemSchema;\n            }\n            if (schema is EnumSchema)\n            {\n                builtInType = BuiltInType.Enumeration;\n                return true;\n            }\n            builtInType = BuiltInType.Null;\n            return false;\n        }\n\n        /// <summary>\n        /// Create array\n        /// </summary>\n        /// <param name=\"itemSchema\"></param>\n        /// <param name=\"isRoot\"></param>\n        /// <returns></returns>\n        public static Schema AsArray(this Schema itemSchema, bool isRoot = false)\n        {\n            var schema = ArraySchema.Create(itemSchema, isRoot ? new PropertyMap\n            {\n                [\"root\"] = \"true\"\n            } : null);\n            if (isRoot)\n            {\n                schema.CreateRoot();\n            }\n            return schema;\n        }\n\n        /// <summary>\n        /// Create\n        /// </summary>\n        /// <param name=\"schemas\"></param>\n        /// <returns></returns>\n        public static Schema AsUnion(params Schema[] schemas)\n        {\n            return schemas.AsUnion(customProperties: null);\n        }\n\n        /// <summary>\n        /// Create\n        /// </summary>\n        /// <param name=\"schemas\"></param>\n        /// <param name=\"customProperties\"></param>\n        /// <returns></returns>\n        public static UnionSchema AsUnion(this IEnumerable<Schema> schemas,\n            PropertyMap? customProperties = null)\n        {\n            var types = schemas.Distinct(\n                Compare.Using<Schema>((a, b) => a?.Fullname == b?.Fullname)).ToList();\n            return UnionSchema.Create(types, customProperties);\n        }\n\n        /// <summary>\n        /// Create root schema for a schema or field at the root\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <returns></returns>\n        public static RecordSchema CreateRoot(this Schema schema, string? fieldName = null)\n        {\n            return RecordSchema.Create(kRootSchemaName,\n            [\n                new (schema, fieldName ?? kRootFieldName, 0)\n            ], kRootNamespace);\n        }\n\n        /// <summary>\n        /// Check whether to skip the dummy root during validation\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <returns></returns>\n        public static bool IsRoot(this Schema schema)\n        {\n            return schema is RecordSchema r && r.Name == kRootSchemaName &&\n                r.Fields.Count == 1 && r.Namespace == kRootNamespace;\n        }\n\n        /// <summary>\n        /// Unwrap a root place holder\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <returns></returns>\n        public static Schema Unwrap(this Schema schema)\n        {\n            if (schema.IsRoot())\n            {\n                var root = (RecordSchema)schema;\n                if (root.Fields.Count == 1 &&\n                    root.Fields[0].Name == kRootFieldName)\n                {\n                    root = root.Fields[0].Schema as RecordSchema;\n                    if (root != null)\n                    {\n                        return root;\n                    }\n                }\n            }\n            return schema;\n        }\n\n        /// <summary>\n        /// Create derived schema\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"ns\"></param>\n        /// <returns></returns>\n        public static PlaceHolder CreatePlaceHolder(string name,\n            string ns)\n        {\n            return new PlaceHolder(Schema.Type.Record,\n                new SchemaName(name, ns, null, null));\n        }\n\n        /// <summary>\n        /// Derived schema\n        /// </summary>\n        public class PlaceHolder : NamedSchema\n        {\n            /// <inheritdoc/>\n            public PlaceHolder(Type type, SchemaName name,\n                IList<string>? aliases = null, PropertyMap? props = null,\n                SchemaNames? names = null, string? doc = null)\n                : base(type, name, GetSchemaNames(aliases, name),\n                      props, names ?? new SchemaNames(), doc)\n            {\n            }\n\n            internal static IList<SchemaName>? GetSchemaNames(\n                IEnumerable<string>? aliases, SchemaName typeName)\n            {\n                if (aliases == null)\n                {\n                    return null;\n                }\n                return aliases.Select(alias => new SchemaName(\n                    alias, typeName.Namespace, null, null)).ToList();\n            }\n        }\n\n        private const string kRootFieldName = \"Value\";\n        private const string kRootSchemaName = \"Type\";\n        private const string kRootNamespace = \"org.apache.avro\";\n\n        private const string kUaDataTypeIdKey = \"uaDataTypeId\";\n\n        private static readonly JsonSerializerOptions kIndented = new()\n        {\n            WriteIndented = true\n        };\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/BaseDataSetMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using global::Avro;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Base Dataset message avro schema\n    /// </summary>\n    public abstract class BaseDataSetMessage : IEventSchema, IAvroSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.AvroSchema;\n\n        /// <inheritdoc/>\n        public string Name => Schema.Fullname;\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        string IEventSchema.Schema => Schema.ToString();\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        public abstract Schema Schema { get; }\n\n        /// <summary>\n        /// The data set schema\n        /// </summary>\n        protected abstract BaseDataSetSchema<Schema> DataSetSchema { get; }\n\n        /// <summary>\n        /// Create based dataset message\n        /// </summary>\n        /// <param name=\"id\"></param>\n        protected BaseDataSetMessage(string id)\n        {\n            Id = id;\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return Schema.ToString();\n        }\n\n        /// <summary>\n        /// Compile the data set message schema\n        /// </summary>\n        /// <param name=\"typeName\"></param>\n        /// <param name=\"dataSetMessageContentFlags\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <param name=\"networkMessageContentFlags\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        protected virtual Schema Compile(string? typeName,\n            DataSetMessageContentFlags dataSetMessageContentFlags, HashSet<string> uniqueNames,\n            NetworkMessageContentFlags networkMessageContentFlags, SchemaOptions options)\n        {\n            if (!networkMessageContentFlags.HasFlag(NetworkMessageContentFlags.DataSetMessageHeader))\n            {\n                // Not a data set message\n                return DataSetSchema.Schema;\n            }\n\n            var fields = CollectFields(dataSetMessageContentFlags, networkMessageContentFlags,\n                DataSetSchema.Schema);\n\n            typeName = GetTypeName(typeName, uniqueNames);\n            var ns = options.Namespace != null ?\n                SchemaUtils.NamespaceUriToNamespace(options.Namespace) :\n                SchemaUtils.PublisherNamespace;\n            return RecordSchema.Create(typeName, fields.ToList(), ns);\n        }\n\n        /// <summary>\n        /// Collect fields of the message schema\n        /// </summary>\n        /// <param name=\"dataSetMessageContentFlags\"></param>\n        /// <param name=\"networkMessageContentFlags\"></param>\n        /// <param name=\"valueSchema\"></param>\n        /// <returns></returns>\n        protected abstract IEnumerable<Field> CollectFields(\n            DataSetMessageContentFlags dataSetMessageContentFlags,\n            NetworkMessageContentFlags networkMessageContentFlags, Schema valueSchema);\n\n        /// <summary>\n        /// Create a type name\n        /// </summary>\n        /// <param name=\"typeName\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <param name=\"defaultName\"></param>\n        /// <returns></returns>\n        protected static string GetTypeName(string? typeName, HashSet<string>? uniqueNames,\n            string? defaultName = null)\n        {\n            // Type name of the message record\n            typeName ??= string.Empty;\n            typeName = SchemaUtils.Escape(typeName) + (defaultName ?? PubSub.BaseDataSetMessage.MessageTypeName);\n\n            if (uniqueNames != null)\n            {\n                var uniqueName = typeName;\n                for (var index = 1; uniqueNames.Contains(uniqueName); index++)\n                {\n                    uniqueName = typeName + index;\n                }\n                uniqueNames.Add(uniqueName);\n                typeName = uniqueName;\n            }\n            return typeName;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/BaseNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using global::Avro;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Network message avro schema\n    /// </summary>\n    public abstract class BaseNetworkMessage : IEventSchema, IAvroSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.AvroSchema;\n\n        /// <inheritdoc/>\n        public string Name => Schema.Fullname;\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        string IEventSchema.Schema => Schema.ToString();\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        public abstract Schema Schema { get; }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return Schema.ToString();\n        }\n\n        /// <summary>\n        /// Create network message schema\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"version\"></param>\n        protected BaseNetworkMessage(string id, ulong version)\n        {\n            Version = version;\n            Id = id;\n        }\n\n        /// <summary>\n        /// Compile the schema for the data sets\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        protected virtual Schema Compile(PublishedNetworkMessageSchemaModel networkMessage,\n            SchemaOptions? options = null)\n        {\n            options ??= new SchemaOptions();\n            var networkMessageContentFlags = networkMessage.NetworkMessageContentFlags\n                    ?? PubSubMessage.DefaultNetworkMessageContentFlags;\n            var dataSetMessages = networkMessage.DataSetMessages;\n            var typeName = networkMessage.TypeName;\n            var MonitoredItemMessage = networkMessageContentFlags\n                .HasFlag(NetworkMessageContentFlags.MonitoredItemMessage);\n            if (MonitoredItemMessage)\n            {\n                networkMessageContentFlags &= ~NetworkMessageContentFlags.NetworkMessageHeader;\n            }\n\n            var dataSetMessageSchemas = dataSetMessages\n                .Select((dataSet, i) => dataSet != null ?\n                    Compile(dataSet, networkMessageContentFlags, options, _uniqueNames) :\n                    AvroSchema.CreatePlaceHolder(\"Empty\" + i, SchemaUtils.PublisherNamespace))\n                .ToList();\n\n            if (dataSetMessageSchemas.Count == 0)\n            {\n                return AvroSchema.Null;\n            }\n\n            Schema? payloadType;\n            if (networkMessageContentFlags.HasFlag(NetworkMessageContentFlags.MonitoredItemMessage))\n            {\n                return dataSetMessageSchemas\n                    .SelectMany(kv => kv is UnionSchema u ? u.Schemas : kv.YieldReturn())\n                    .AsUnion();\n            }\n\n            if (dataSetMessageSchemas.Count > 1)\n            {\n                payloadType = dataSetMessageSchemas.AsUnion();\n            }\n            else\n            {\n                payloadType = dataSetMessageSchemas[0];\n            }\n\n            var HasSingleDataSetMessage = networkMessageContentFlags\n                .HasFlag(NetworkMessageContentFlags.SingleDataSetMessage);\n            var HasNetworkMessageHeader = networkMessageContentFlags\n                .HasFlag(NetworkMessageContentFlags.NetworkMessageHeader);\n            if (!HasNetworkMessageHeader && HasSingleDataSetMessage)\n            {\n                // No network message header\n                return payloadType;\n            }\n\n            payloadType = payloadType.AsArray();\n            var fields = CollectFields(networkMessageContentFlags, payloadType);\n\n            var ns = options.Namespace != null ?\n                SchemaUtils.NamespaceUriToNamespace(options.Namespace) :\n                SchemaUtils.PublisherNamespace;\n            return RecordSchema.Create(GetName(typeName), fields.ToList(), ns);\n        }\n\n        /// <summary>\n        /// Collect fields\n        /// </summary>\n        /// <param name=\"contentMask\"></param>\n        /// <param name=\"payloadType\"></param>\n        /// <returns></returns>\n        protected abstract IEnumerable<Field> CollectFields(\n            NetworkMessageContentFlags contentMask, Schema payloadType);\n\n        /// <summary>\n        /// Get schema\n        /// </summary>\n        /// <param name=\"dataSetMessage\"></param>\n        /// <param name=\"networkMessageContentFlags\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        protected abstract Schema Compile(PublishedDataSetMessageSchemaModel dataSetMessage,\n            NetworkMessageContentFlags networkMessageContentFlags, SchemaOptions options,\n            HashSet<string> uniqueNames);\n\n        /// <summary>\n        /// Get name of the type\n        /// </summary>\n        /// <param name=\"typeName\"></param>\n        /// <returns></returns>\n        private string GetName(string? typeName)\n        {\n            // Type name of the message record\n            typeName ??= string.Empty;\n            typeName = SchemaUtils.Escape(typeName) + PubSub.BaseNetworkMessage.MessageTypeName;\n            return MakeUnique(typeName);\n        }\n\n        /// <summary>\n        /// Make unique\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        private string MakeUnique(string name)\n        {\n            var uniqueName = name;\n            for (var index = 1; _uniqueNames.Contains(uniqueName); index++)\n            {\n                uniqueName = name + index;\n            }\n            _uniqueNames.Add(uniqueName);\n            return uniqueName;\n        }\n\n        private readonly HashSet<string> _uniqueNames = [];\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/IAvroSchema.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using global::Avro;\n\n    /// <summary>\n    /// Avro schema\n    /// </summary>\n    public interface IAvroSchema\n    {\n        /// <summary>\n        /// The avro schema\n        /// </summary>\n        Schema Schema { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/JsonBuiltInSchemas.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using global::Avro;\n    using Opc.Ua;\n    using DataSetFieldContentFlags = Publisher.Models.DataSetFieldContentFlags;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Provides the json encodings of built in types and objects in Avro schema\n    /// </summary>\n    internal class JsonBuiltInSchemas : BaseBuiltInSchemas<Schema>\n    {\n        private Schema EnumerationSchema\n        {\n            get\n            {\n                if (_reversibleEncoding)\n                {\n                    // Enumeration values shall be encoded as a JSON number\n                    // for the reversible encoding.\n                    return PrimitiveType(\"int\");\n                }\n\n                // For the non - reversible form, Enumeration values are\n                // encoded as a JSON string with the following format:\n                // <name>_<value>\n                return PrimitiveType(\"string\");\n            }\n        }\n\n        private Schema DiagnosticInfoSchema\n        {\n            get\n            {\n                return RecordSchema.Create(nameof(BuiltInType.DiagnosticInfo),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.Int32), \"SymbolicId\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.Int32), \"NamespaceUri\", 1),\n                        new (GetSchemaForBuiltInType(BuiltInType.Int32), \"Locale\", 2),\n                        new (GetSchemaForBuiltInType(BuiltInType.Int32), \"LocalizedText\", 3),\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"AdditionalInfo\", 4),\n                        new (GetSchemaForBuiltInType(BuiltInType.StatusCode), \"InnerStatusCode\", 5),\n                        new (GetSchemaForBuiltInType(BuiltInType.DiagnosticInfo).AsNullable(),\n                            \"InnerDiagnosticInfo\", 6)\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.DiagnosticInfo) });\n            }\n        }\n\n        private Schema VariantSchema\n        {\n            get\n            {\n                if (!_reversibleEncoding)\n                {\n                    // For the non-reversible form, Variant values shall be\n                    // encoded as a JSON value containing only the value of\n                    // the Body field. The Type and Dimensions fields are\n                    // dropped. Multi-dimensional arrays are encoded as a\n                    // multi-dimensional JSON array as described in 5.4.5.\n\n                    // TODO\n                }\n\n                var types = AvroSchema.Null.YieldReturn()\n                    .Concat(GetPossibleTypes(SchemaRank.Scalar))\n                    .Concat(GetPossibleTypes(SchemaRank.Collection))\n                    .Concat(GetPossibleTypes(SchemaRank.Matrix))\n                    .ToList();\n                return RecordSchema.Create(nameof(BuiltInType.Variant),\n                [\n                    new (types.AsUnion(), \"Value\", 0)\n                ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.Variant) });\n\n                IEnumerable<Schema> GetPossibleTypes(SchemaRank valueRank)\n                {\n                    for (var i = 1; i <= 29; i++)\n                    {\n                        if (i == (int)BuiltInType.DiagnosticInfo)\n                        {\n                            continue;\n                        }\n                        if (i == (int)BuiltInType.Variant && valueRank == SchemaRank.Scalar)\n                        {\n                            continue; // Array of variant is allowed\n                        }\n                        yield return GetSchemaForBuiltInType((BuiltInType)i, valueRank);\n                    }\n                }\n            }\n        }\n\n        private Schema ExtensionObjectSchema\n        {\n            get\n            {\n                if (!_reversibleEncoding)\n                {\n                    // For the non-reversible form, ExtensionObject values\n                    // shall be encoded as a JSON value containing only the\n                    // value of the Body field. The TypeId and Encoding\n                    // fields are dropped.\n\n                    // TODO\n                }\n\n                var bodyType = AvroSchema.AsUnion(\n                    GetSchemaForBuiltInType(BuiltInType.Null),\n                    GetSchemaForBuiltInType(BuiltInType.String),\n                    GetSchemaForBuiltInType(BuiltInType.XmlElement),\n                    GetSchemaForBuiltInType(BuiltInType.ByteString));\n                var encodingType = EnumSchema.Create(\"Encoding\", new string[]\n                {\n                    \"Structure\",\n                    \"ByteString\",\n                    \"XmlElement\"\n                });\n                return RecordSchema.Create(nameof(BuiltInType.ExtensionObject),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.NodeId), \"TypeId\", 0),\n                        new (encodingType, \"Encoding\", 1),\n                        new (bodyType, \"Body\", 2)\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.ExtensionObject) });\n            }\n        }\n\n        private Schema StatusCodeSchema\n        {\n            get\n            {\n                if (_reversibleEncoding)\n                {\n                    //\n                    // StatusCode values shall be encoded as a JSON number for\n                    // the reversible encoding. If the StatusCode is Good (0)\n                    // it is only encoded if it is an element of a JSON array.\n                    //\n#if !DERIVE_PRIMITIVE\n                    return PrimitiveType(\"int\");\n#else\n                    return DerivedSchema.Create(nameof(BuiltInType.StatusCode),\n                        GetSchemaForBuiltInType(BuiltInType.UInt32),\n                        SchemaUtils.NamespaceZeroName,\n                            new[] { GetDataTypeId(BuiltInType.StatusCode) });\n#endif\n                }\n\n                // For the non - reversible form, StatusCode values\n                // shall be encoded as a JSON object with the fields\n                // defined here.\n                return RecordSchema.Create(nameof(BuiltInType.StatusCode),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt32), \"Code\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"Symbol\", 1)\n                    ], SchemaUtils.NamespaceZeroName);\n            }\n        }\n\n        private Schema QualifiedNameSchema\n        {\n            get\n            {\n                Field field;\n                if (_reversibleEncoding)\n                {\n                    // For reversible encoding this field is a JSON number\n                    // with the NamespaceIndex. The field is omitted if the\n                    // NamespaceIndex is 0.\n                    field = new(GetSchemaForBuiltInType(BuiltInType.UInt32), \"Uri\", 1);\n                }\n                else\n                {\n                    // For non-reversible encoding this field is the JSON\n                    // string containing the NamespaceUri associated with\n                    // the NamespaceIndex unless the NamespaceIndex is 0.\n                    // If the NamespaceIndex is 0 the field is omitted.\n                    field = new(GetSchemaForBuiltInType(BuiltInType.String), \"Uri\", 1);\n                }\n                return RecordSchema.Create(nameof(BuiltInType.QualifiedName),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.String), \"Name\", 0),\n                        field\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.QualifiedName) });\n            }\n        }\n\n        private Schema LocalizedTextSchema\n        {\n            get\n            {\n                if (_reversibleEncoding)\n                {\n                    return RecordSchema.Create(nameof(BuiltInType.LocalizedText),\n                        [\n                            new (GetSchemaForBuiltInType(BuiltInType.String), \"Locale\", 0),\n                            new (GetSchemaForBuiltInType(BuiltInType.String), \"Text\", 1)\n                        ], SchemaUtils.NamespaceZeroName,\n                        new[] { GetDataTypeId(BuiltInType.LocalizedText) });\n                }\n\n                // For the non-reversible form, LocalizedText value shall\n                // be encoded as a JSON string containing the Text component.\n#if !DERIVE_PRIMITIVE\n                return PrimitiveType(\"string\");\n#else\n                    return DerivedSchema.Create(nameof(BuiltInType.LocalizedText),\n                        GetSchemaForBuiltInType(BuiltInType.String),\n                        SchemaUtils.NamespaceZeroName,\n                            new[] { GetDataTypeId(BuiltInType.LocalizedText) });\n#endif\n            }\n        }\n\n        private Schema NodeIdSchema\n        {\n            get\n            {\n                var idType = AvroSchema.AsUnion(\n                    GetSchemaForBuiltInType(BuiltInType.UInt32),\n                    GetSchemaForBuiltInType(BuiltInType.String),\n                    GetSchemaForBuiltInType(BuiltInType.Guid),\n                    GetSchemaForBuiltInType(BuiltInType.ByteString));\n                var idTypeType = EnumSchema.Create(\"IdentifierType\", new string[]\n                {\n                    \"UInt32\",\n                    \"String\",\n                    \"Guid\",\n                    \"ByteString\"\n                }, SchemaUtils.NamespaceZeroName);\n\n                Field field;\n                if (_reversibleEncoding)\n                {\n                    // For reversible encoding this field is a JSON number\n                    // with the NamespaceIndex. The field is omitted if the\n                    // NamespaceIndex is 0.\n                    field = new(GetSchemaForBuiltInType(BuiltInType.UInt32), \"Namespace\", 2);\n                }\n                else\n                {\n                    // For non-reversible encoding this field is the JSON\n                    // string containing the NamespaceUri associated with\n                    // the NamespaceIndex unless the NamespaceIndex is 0.\n                    // If the NamespaceIndex is 0 the field is omitted.\n                    field = new(GetSchemaForBuiltInType(BuiltInType.String), \"Namespace\", 2);\n                }\n                return RecordSchema.Create(nameof(BuiltInType.NodeId),\n                    [\n                        new (idTypeType, \"IdType\", 0),\n                        new (idType, \"Id\", 1),\n                        field\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.NodeId) });\n            }\n        }\n\n        private Schema ExpandedNodeIdSchema\n        {\n            get\n            {\n                var idType = AvroSchema.AsUnion(\n                    GetSchemaForBuiltInType(BuiltInType.UInt32),\n                    GetSchemaForBuiltInType(BuiltInType.String),\n                    GetSchemaForBuiltInType(BuiltInType.Guid),\n                    GetSchemaForBuiltInType(BuiltInType.ByteString));\n                var idTypeType = EnumSchema.Create(\"IdentifierType\", new string[]\n                {\n                    \"UInt32\",\n                    \"String\",\n                    \"Guid\",\n                    \"ByteString\"\n                }, SchemaUtils.NamespaceZeroName);\n\n                Field field;\n                if (_reversibleEncoding)\n                {\n                    // For reversible encoding this field is a JSON number with\n                    // the ServerIndex. The field is omitted if the ServerIndex\n                    // is 0.\n                    field = new(GetSchemaForBuiltInType(BuiltInType.UInt16), \"ServerUri\", 3);\n                }\n                else\n                {\n                    // For non-reversible encoding this field is the JSON string\n                    // containing the ServerUri associated with the ServerIndex\n                    // unless the ServerIndex is 0. If the ServerIndex is 0 the\n                    // field is omitted.\n                    field = new(GetSchemaForBuiltInType(BuiltInType.String), \"ServerUri\", 3);\n                }\n                return RecordSchema.Create(nameof(BuiltInType.ExpandedNodeId),\n                    [\n                        new (idTypeType, \"IdType\", 0),\n                        new (idType, \"Id\", 1),\n                        // For reversible encoding this field is a JSON string\n                        // with the NamespaceUri if the NamespaceUri is specified.\n                        // Otherwise, it is a JSON number with the NamespaceIndex.\n                        // The field is omitted if the NamespaceIndex is 0.\n                        // For non-reversible encoding this field is the JSON string\n                        // containing the NamespaceUri or the NamespaceUri associated\n                        // with the NamespaceIndex unless the NamespaceIndex is 0\n                        // or 1. If the NamespaceIndex is 0 the field is omitted.\n                        new(AvroSchema.AsUnion(\n                            GetSchemaForBuiltInType(BuiltInType.UInt32),\n                            GetSchemaForBuiltInType(BuiltInType.String)),\n                            \"Namespace\", 2),\n                        field\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.ExpandedNodeId) });\n            }\n        }\n\n        private Schema DataValueSchema\n        {\n            get\n            {\n                return RecordSchema.Create(nameof(BuiltInType.DataValue),\n                    [\n                        new (GetSchemaForBuiltInType(BuiltInType.Variant), \"Value\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.StatusCode), \"Status\", 1),\n                        new (GetSchemaForBuiltInType(BuiltInType.DateTime), \"SourceTimestamp\", 2),\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt16), \"SourcePicoSeconds\", 3),\n                        new (GetSchemaForBuiltInType(BuiltInType.DateTime), \"ServerTimestamp\", 4),\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt16), \"ServerPicoSeconds\", 5)\n                    ], SchemaUtils.NamespaceZeroName,\n                    new[] { GetDataTypeId(BuiltInType.DataValue) });\n            }\n        }\n\n        /// <summary>\n        /// Create avro schema for json encoder\n        /// </summary>\n        /// <param name=\"reversibleEncoding\"></param>\n        /// <param name=\"useUriEncoding\"></param>\n        public JsonBuiltInSchemas(bool reversibleEncoding, bool useUriEncoding)\n        {\n            _reversibleEncoding = reversibleEncoding;\n            _useUriEncoding = useUriEncoding;\n        }\n\n        /// <summary>\n        /// Create encoding schema\n        /// </summary>\n        /// <param name=\"fieldContentMask\"></param>\n        public JsonBuiltInSchemas(DataSetFieldContentFlags fieldContentMask)\n        {\n            if ((fieldContentMask & DataSetFieldContentFlags.RawData) != 0)\n            {\n                //\n                // If the DataSetFieldContentMask results in a RawData\n                // representation, the field value is a Variant encoded\n                // using the non-reversible OPC UA JSON Data Encoding\n                // defined in OPC 10000-6\n                //\n                _useUriEncoding = true;\n                _reversibleEncoding = false;\n            }\n            else if (fieldContentMask == 0)\n            {\n                //\n                // If the DataSetFieldContentMask results in a Variant\n                // representation, the field value is encoded as a Variant\n                // encoded using the reversible OPC UA JSON Data Encoding\n                // defined in OPC 10000-6.\n                //\n                _useUriEncoding = false;\n                _reversibleEncoding = true;\n            }\n            else\n            {\n                //\n                // If the DataSetFieldContentMask results in a DataValue\n                // representation, the field value is a DataValue encoded\n                // using the non-reversible OPC UA JSON Data Encoding or\n                // reversible depending on encoder configuration.\n                //\n                _reversibleEncoding = false;\n                _useUriEncoding = false;\n            }\n        }\n\n        /// <summary>\n        /// Get built in schema. See\n        /// https://reference.opcfoundation.org/Core/Part6/v104/docs/5.1.2#_Ref131507956\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"rank\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public override Schema GetSchemaForBuiltInType(BuiltInType builtInType,\n            SchemaRank rank = SchemaRank.Scalar)\n        {\n            // Always use byte string for byte arrays\n            if (builtInType == BuiltInType.Byte && rank == SchemaRank.Collection)\n            {\n                builtInType = BuiltInType.ByteString;\n                rank = SchemaRank.Scalar;\n            }\n            if (!_builtIn.TryGetValue(builtInType, out var schema))\n            {\n                // Before we create the schema add a place\n                // holder here to break any recursion.\n\n                _builtIn.Add(builtInType, PlaceHolder(builtInType));\n\n                schema = Get((int)builtInType);\n                _builtIn[builtInType] = schema;\n            }\n            if (rank != SchemaRank.Scalar)\n            {\n                schema = schema.AsArray();\n            }\n            return schema;\n\n            Schema Get(int id) => id switch\n            {\n                0 => AvroSchema.Null,\n\n                1 => PrimitiveType(\"boolean\"),\n                2 => PrimitiveType(\"int\"),\n                3 => PrimitiveType(\"int\"),\n                4 => PrimitiveType(\"int\"),\n                5 => PrimitiveType(\"int\"),\n                6 => PrimitiveType(\"int\"),\n                7 => PrimitiveType(\"int\"),\n\n                // As per part 6 encoding, long is encoded as string\n                8 => PrimitiveType(\"string\"),\n                9 => PrimitiveType(\"string\"),\n\n                10 => PrimitiveType(\"float\"),\n                11 => PrimitiveType(\"double\"),\n                12 => PrimitiveType(\"string\"),\n                13 => PrimitiveType(\"string\"),\n                14 => LogicalType(\"string\", \"uuid\"),\n                15 => PrimitiveType(\"bytes\"),\n                16 => PrimitiveType(\"string\"),\n\n                17 => NodeIdSchema,\n                18 => ExpandedNodeIdSchema,\n                19 => StatusCodeSchema,\n                20 => QualifiedNameSchema,\n                21 => LocalizedTextSchema,\n                22 => ExtensionObjectSchema,\n                23 => DataValueSchema,\n                24 => VariantSchema,\n                25 => DiagnosticInfoSchema,\n\n                26 => PrimitiveType(\"string\"),\n\n                // Should this be string? As per json encoding, long is string\n                27 => PrimitiveType(\"string\"),\n                28 => PrimitiveType(\"string\"),\n\n                29 => EnumerationSchema,\n                _ => throw new ArgumentException($\"Built in type {id} unknown\")\n            };\n        }\n\n        /// <inheritdoc/>\n        public override Schema GetSchemaForExtendableType(string name, string ns,\n            string dataTypeId, Schema bodyType)\n        {\n            var encodingType = EnumSchema.Create(\"Encoding\", new string[]\n            {\n                \"Structure\",\n                \"ByteString\",\n                \"XmlElement\"\n            });\n            return RecordSchema.Create(name + nameof(BuiltInType.ExtensionObject),\n                [\n                    new (GetSchemaForBuiltInType(BuiltInType.NodeId), \"TypeId\", 0),\n                    new (encodingType, \"Encoding\", 1),\n                    new (bodyType, \"Body\", 2)\n                ], ns, new[] { dataTypeId });\n        }\n\n        /// <inheritdoc/>\n        public override Schema GetSchemaForDataSetField(string ns, bool asDataValue,\n            Schema valueSchema, BuiltInType builtInType)\n        {\n            if (asDataValue)\n            {\n                return RecordSchema.Create(valueSchema.Name + nameof(BuiltInType.DataValue),\n                    [\n                        new (valueSchema, \"Value\", 0),\n                        new (GetSchemaForBuiltInType(BuiltInType.StatusCode), \"Status\", 1),\n                        new (GetSchemaForBuiltInType(BuiltInType.DateTime), \"SourceTimestamp\", 2),\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt16), \"SourcePicoseconds\", 3),\n                        new (GetSchemaForBuiltInType(BuiltInType.DateTime), \"ServerTimestamp\", 4),\n                        new (GetSchemaForBuiltInType(BuiltInType.UInt16), \"ServerPicoseconds\", 5)\n                    ], ns).AsNullable();\n            }\n            return valueSchema;\n        }\n\n        /// <inheritdoc/>\n        public override Schema GetSchemaForRank(Schema schema, SchemaRank rank)\n        {\n            switch (rank)\n            {\n                case SchemaRank.Matrix:\n                    // Variant schema\n                    return GetSchemaForBuiltInType(BuiltInType.Variant);\n                case SchemaRank.Collection:\n                    return schema.AsArray();\n                default:\n                    return schema;\n            }\n        }\n\n        /// <summary>\n        /// Get data typeid\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        private static string GetDataTypeId(BuiltInType builtInType)\n        {\n            return \"i_\" + (int)builtInType;\n        }\n\n        /// <summary>\n        /// Create logical opc ua derived type\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"logicalType\"></param>\n        /// <returns></returns>\n        internal static Schema LogicalType(string type, string logicalType)\n        {\n            return Schema.Parse(\n                $$\"\"\"{\"type\": \"{{type}}\", \"logicalType\": \"{{logicalType}}\"}\"\"\");\n        }\n\n        /// <summary>\n        /// Create primitive opc ua built in type\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        internal static Schema PrimitiveType(string type)\n        {\n            return PrimitiveSchema.NewInstance(type);\n        }\n\n        /// <summary>\n        /// Create a place holder\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        private static AvroSchema.PlaceHolder PlaceHolder(BuiltInType builtInType)\n        {\n            return AvroSchema.CreatePlaceHolder(builtInType.ToString(),\n                SchemaUtils.NamespaceZeroName);\n        }\n\n        private readonly Dictionary<BuiltInType, Schema> _builtIn = [];\n        private readonly bool _reversibleEncoding;\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly bool _useUriEncoding;\n#pragma warning restore IDE0052 // Remove unread private members\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/JsonDataSet.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using global::Avro;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Extensions to convert metadata into avro schema. Note that this class\n    /// generates a schema that complies with the json representation in\n    /// <see cref=\"JsonEncoderEx\"/>.WriteDataSet.\n    /// This depends on the network settings and reversible vs. nonreversible\n    /// encoding mode.\n    /// </summary>\n    public class JsonDataSet : BaseDataSetSchema<Schema>, IAvroSchema,\n        IEventSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.AvroSchema;\n\n        /// <inheritdoc/>\n        public string Name => Schema.Fullname;\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        string IEventSchema.Schema => Schema.ToString();\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        public override Schema Schema { get; }\n\n        /// <summary>\n        /// Get avro schema for a dataset\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"dataSet\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        public JsonDataSet(string id, PublishedDataSetMetaDataModel dataSet,\n            DataSetFieldContentFlags? dataSetFieldContentMask = null,\n            SchemaOptions? options = null, HashSet<string>? uniqueNames = null)\n            : base(dataSetFieldContentMask, new JsonBuiltInSchemas(\n                dataSetFieldContentMask ?? default), options)\n        {\n            Id = id;\n            Schema = Compile(dataSet.DataSetMetaData?.Name, dataSet, uniqueNames)\n                ?? AvroSchema.Null;\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return Schema.ToString();\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<Schema> GetDataSetFieldSchemas(string? name,\n            PublishedDataSetMetaDataModel dataSet, HashSet<string>? uniqueNames)\n        {\n            var singleValue = dataSet.Fields.Count == 1;\n            GetEncodingMode(out var omitFieldName, out var fieldsAreDataValues,\n                singleValue);\n            if (omitFieldName)\n            {\n                var set = new HashSet<Schema>();\n                foreach (var fieldMetadata in dataSet.Fields)\n                {\n                    if (fieldMetadata?.DataType != null)\n                    {\n                        set.Add(LookupSchema(fieldMetadata.DataType,\n                            SchemaUtils.GetRank(fieldMetadata.ValueRank),\n                            fieldMetadata.ArrayDimensions));\n                    }\n                }\n                return set.Select(s => s.AsNullable());\n            }\n\n            var ns = _options.Namespace != null ?\n                SchemaUtils.NamespaceUriToNamespace(_options.Namespace) :\n                SchemaUtils.PublisherNamespace;\n\n            var fields = new List<Field>();\n            var pos = 0;\n            foreach (var fieldMetadata in dataSet.Fields)\n            {\n                // Now collect the fields of the payload\n                pos++;\n                if (fieldMetadata?.DataType != null)\n                {\n                    var schema = LookupSchema(fieldMetadata.DataType,\n                        SchemaUtils.GetRank(fieldMetadata.ValueRank),\n                        fieldMetadata.ArrayDimensions);\n                    if (fieldMetadata.Name != null)\n                    {\n                        // TODO: Add properties to the field type\n                        schema = Encoding.GetSchemaForDataSetField(ns, fieldsAreDataValues,\n                            schema, (Opc.Ua.BuiltInType)fieldMetadata.BuiltInType);\n\n                        fields.Add(new Field(schema, SchemaUtils.Escape(fieldMetadata.Name), pos));\n                    }\n                }\n            }\n            if (fields.Count == 0)\n            {\n                return [];\n            }\n            // Type name of the message record\n            name ??= dataSet.DataSetMetaData.Name;\n            if (string.IsNullOrEmpty(name))\n            {\n                // Type name of the message record\n                name = \"DataSet\";\n            }\n            else\n            {\n                name = SchemaUtils.Escape(name);\n            }\n            return RecordSchema.Create(MakeUnique(name, uniqueNames), fields).YieldReturn();\n        }\n\n        /// <inheritdoc/>\n        protected override Schema CreateStructureSchema(StructureDescriptionModel description,\n            SchemaRank rank, Schema? baseTypeSchema)\n        {\n            //\n            // |---------------|------------|----------------|\n            // | Field Value   | Reversible | Non-Reversible |\n            // |---------------|------------|----------------|\n            // | NULL          | Omitted    | JSON null      |\n            // | Default Value | Omitted    | Default Value  |\n            // |---------------|------------|----------------|\n            //\n            var fields = new List<Field>();\n            var pos = 0;\n            if (baseTypeSchema is RecordSchema b)\n            {\n                foreach (var field in b.Fields)\n                {\n                    fields.Add(new Field(field.Schema, field.Name, pos++,\n                        field.Aliases, field.Documentation, field.DefaultValue));\n                    // Can we copy type property to the field to show inheritance\n                }\n            }\n\n            foreach (var field in description.Fields)\n            {\n                var schema = LookupSchema(field.DataType,\n                    SchemaUtils.GetRank(field.ValueRank), field.ArrayDimensions);\n                if (field.IsOptional)\n                {\n                    schema = schema.AsNullable();\n                }\n                fields.Add(new Field(schema, SchemaUtils.Escape(field.Name), pos++));\n            }\n\n            var (ns1, dt) = SchemaUtils.SplitNodeId(description.DataTypeId, Context, true);\n            var scalar = RecordSchema.Create(\n                SchemaUtils.SplitQualifiedName(description.Name, Context, ns1),\n                fields, ns1, new[] { dt },\n                customProperties: AvroSchema.Properties(description.DataTypeId));\n            return Encoding.GetSchemaForRank(scalar, rank);\n        }\n\n        /// <inheritdoc/>\n        protected override Schema CreateEnumSchema(EnumDescriptionModel description,\n            SchemaRank rank)\n        {\n            var (ns, dt) = SchemaUtils.SplitNodeId(description.DataTypeId, Context, true);\n            var symbols = description.Fields\n                .Select(e => SchemaUtils.Escape(e.Name))\n                .ToList();\n            var scalar = EnumSchema.Create(\n                SchemaUtils.SplitQualifiedName(description.Name, Context, ns),\n                symbols, ns, new[] { dt },\n                customProperties: AvroSchema.Properties(description.DataTypeId),\n                defaultSymbol: symbols[0]);\n            // TODO: Build doc from fields descriptions\n            return Encoding.GetSchemaForRank(scalar, rank);\n        }\n\n        /// <inheritdoc/>\n        protected override Schema CreateUnionSchema(IReadOnlyList<Schema> schemas)\n        {\n            return schemas.AsUnion();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/JsonDataSetMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using global::Avro;\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Dataset message avro schema\n    /// </summary>\n    public sealed class JsonDataSetMessage : BaseDataSetMessage\n    {\n        /// <inheritdoc/>\n        public override Schema Schema { get; }\n\n        /// <inheritdoc/>\n        protected override BaseDataSetSchema<Schema> DataSetSchema { get; }\n\n        /// <summary>\n        /// Get avro schema for a writer\n        /// </summary>\n        /// <param name=\"dataSetMessage\"></param>\n        /// <param name=\"networkMessageContentFlags\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        internal JsonDataSetMessage(PublishedDataSetMessageSchemaModel dataSetMessage,\n            NetworkMessageContentFlags networkMessageContentFlags,\n            SchemaOptions options, HashSet<string> uniqueNames) : base(dataSetMessage.Id)\n        {\n            DataSetSchema = new JsonDataSet(dataSetMessage.Id, dataSetMessage.MetaData,\n                dataSetMessage.DataSetFieldContentFlags, options, uniqueNames);\n            Schema = Compile(dataSetMessage.TypeName, dataSetMessage.DataSetMessageContentFlags\n                    ?? PubSubMessage.DefaultDataSetMessageContentFlags,\n                uniqueNames, networkMessageContentFlags, options);\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<Field> CollectFields(\n            DataSetMessageContentFlags dataSetMessageContentFlags,\n            NetworkMessageContentFlags networkMessageContentFlags, Schema valueSchema)\n        {\n            var useCompatibilityMode = networkMessageContentFlags\n                .HasFlag(NetworkMessageContentFlags.UseCompatibilityMode);\n\n            var encoding = new JsonBuiltInSchemas(true, true);\n            var pos = 0;\n            var fields = new List<Field>();\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.DataSetWriterId))\n            {\n                if (!useCompatibilityMode)\n                {\n                    fields.Add(\n                        new(encoding.GetSchemaForBuiltInType(BuiltInType.UInt16),\n                            nameof(DataSetMessageContentFlags.DataSetWriterId), pos++));\n                }\n                else\n                {\n                    // Up to version 2.8 we wrote the string id as id which is not per standard\n                    fields.Add(\n                        new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                            nameof(DataSetMessageContentFlags.DataSetWriterId), pos++));\n                }\n            }\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.SequenceNumber))\n            {\n                fields.Add(\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.UInt32),\n                        nameof(DataSetMessageContentFlags.SequenceNumber), pos++));\n            }\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.MetaDataVersion))\n            {\n                var version = RecordSchema.Create(nameof(ConfigurationVersionDataType),\n                    [\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.UInt32),\n                        \"MajorVersion\", 0),\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.UInt32),\n                        \"MinorVersion\", 1)\n                ], SchemaUtils.NamespaceZeroName,\n                    new[] { \"i_\" + DataTypes.ConfigurationVersionDataType });\n                fields.Add(new(version, nameof(DataSetMessageContentFlags.MetaDataVersion), pos++));\n            }\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.Timestamp))\n            {\n                fields.Add(new(encoding.GetSchemaForBuiltInType(BuiltInType.DateTime),\n                    nameof(DataSetMessageContentFlags.Timestamp), pos++));\n            }\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.Status))\n            {\n                if (!useCompatibilityMode)\n                {\n                    fields.Add(new(encoding.GetSchemaForBuiltInType(BuiltInType.StatusCode),\n                        nameof(DataSetMessageContentFlags.Status), pos++));\n                }\n                else\n                {\n                    // Up to version 2.8 we wrote the full status code\n                    fields.Add(new(new JsonBuiltInSchemas(false, false)\n                        .GetSchemaForBuiltInType(BuiltInType.StatusCode),\n                            nameof(DataSetMessageContentFlags.Status), pos++));\n                }\n            }\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.MessageType))\n            {\n                fields.Add(\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                        nameof(DataSetMessageContentFlags.MessageType), pos++));\n            }\n            if (!useCompatibilityMode &&\n                dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.DataSetWriterName))\n            {\n                fields.Add(\n                    new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                        nameof(DataSetMessageContentFlags.DataSetWriterName), pos++));\n            }\n\n            fields.Add(new(valueSchema, nameof(PubSub.JsonDataSetMessage.Payload), pos++));\n            return fields;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/JsonNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using global::Avro;\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Json Network message avro schema\n    /// </summary>\n    public sealed class JsonNetworkMessage : BaseNetworkMessage\n    {\n        /// <inheritdoc/>\n        public override Schema Schema { get; }\n\n        /// <summary>\n        /// Get avro schema for a network message\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"useCompatibilityMode\"></param>\n        /// <param name=\"useArrayEnvelope\"></param>\n        public JsonNetworkMessage(PublishedNetworkMessageSchemaModel networkMessage,\n            SchemaOptions? options = null, bool useCompatibilityMode = false, bool useArrayEnvelope = false)\n            : base(networkMessage.Id, networkMessage.Version)\n        {\n            networkMessage = SetAdditionalFlags(networkMessage, useCompatibilityMode, useArrayEnvelope);\n            Schema = Compile(networkMessage, options);\n        }\n\n        /// <inheritdoc/>\n        protected override Schema Compile(PublishedDataSetMessageSchemaModel dataSetMessage,\n            NetworkMessageContentFlags networkMessageContentFlags, SchemaOptions options,\n            HashSet<string> uniqueNames)\n        {\n            if (networkMessageContentFlags.HasFlag(NetworkMessageContentFlags.MonitoredItemMessage))\n            {\n                return new MonitoredItemMessage(dataSetMessage, networkMessageContentFlags,\n                    options, uniqueNames).Schema;\n            }\n            return new JsonDataSetMessage(dataSetMessage, networkMessageContentFlags,\n                options, uniqueNames).Schema;\n        }\n\n        /// <inheritdoc/>\n        protected override Schema Compile(PublishedNetworkMessageSchemaModel networkMessage,\n            SchemaOptions? options)\n        {\n            var messageSchema = base.Compile(networkMessage, options);\n\n            if (networkMessage.NetworkMessageContentFlags?\n                .HasFlag(NetworkMessageContentFlags.UseArrayEnvelope) ?? false)\n            {\n                // set array as root\n                return messageSchema.AsArray(true);\n            }\n            return messageSchema;\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<Field> CollectFields(\n            NetworkMessageContentFlags contentMask, Schema payloadType)\n        {\n            var encoding = new JsonBuiltInSchemas(true, false);\n            var pos = 0;\n            var fields = new List<Field>\n            {\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                    nameof(PubSub.JsonNetworkMessage.MessageId), pos++),\n                new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                    nameof(PubSub.JsonNetworkMessage.MessageType), pos++)\n            };\n\n            if (contentMask.HasFlag(NetworkMessageContentFlags.PublisherId))\n            {\n                fields.Add(new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                    nameof(PubSub.JsonNetworkMessage.PublisherId), pos++));\n            }\n            if (contentMask.HasFlag(NetworkMessageContentFlags.DataSetClassId))\n            {\n                fields.Add(new(encoding.GetSchemaForBuiltInType(BuiltInType.Guid),\n                    nameof(PubSub.JsonNetworkMessage.DataSetClassId), pos++));\n            }\n\n            fields.Add(new(encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                nameof(PubSub.JsonNetworkMessage.DataSetWriterGroup), pos++));\n\n            // Now write messages - this is either one of or array of one of\n            fields.Add(new(payloadType, nameof(PubSub.JsonNetworkMessage.Messages), pos++));\n            return fields;\n        }\n\n        /// <summary>\n        /// Set additional flags\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        /// <param name=\"useCompatibilityMode\"></param>\n        /// <param name=\"useArrayEnvelope\"></param>\n        /// <returns></returns>\n        private static PublishedNetworkMessageSchemaModel SetAdditionalFlags(\n            PublishedNetworkMessageSchemaModel networkMessage,\n            bool useCompatibilityMode, bool useArrayEnvelope)\n        {\n            var networkMessageContentFlags = networkMessage.NetworkMessageContentFlags;\n            if (useCompatibilityMode)\n            {\n                networkMessageContentFlags |= NetworkMessageContentFlags.UseCompatibilityMode;\n            }\n            if (useArrayEnvelope)\n            {\n                networkMessageContentFlags |= NetworkMessageContentFlags.UseArrayEnvelope;\n            }\n            return networkMessage with { NetworkMessageContentFlags = networkMessageContentFlags };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Avro/MonitoredItemMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Avro\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using global::Avro;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Monitored item message avro schema\n    /// </summary>\n    public sealed class MonitoredItemMessage : BaseDataSetMessage\n    {\n        /// <inheritdoc/>\n        public override Schema Schema { get; }\n\n        /// <inheritdoc/>\n        protected override BaseDataSetSchema<Schema> DataSetSchema { get; }\n\n        /// <summary>\n        /// Get avro schema for a monitored item message\n        /// </summary>\n        /// <param name=\"dataSetMessage\"></param>\n        /// <param name=\"networkMessageContentFlags\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        internal MonitoredItemMessage(PublishedDataSetMessageSchemaModel dataSetMessage,\n            NetworkMessageContentFlags networkMessageContentFlags,\n            SchemaOptions options, HashSet<string> uniqueNames) : base(dataSetMessage.Id)\n        {\n            DataSetSchema = new JsonDataSet(dataSetMessage.Id, dataSetMessage.MetaData,\n                dataSetMessage.DataSetFieldContentFlags, options, uniqueNames);\n            _dataSetFieldContentMask = dataSetMessage.DataSetFieldContentFlags\n                    ?? PubSubMessage.DefaultDataSetFieldContentFlags;\n            Schema = Compile(dataSetMessage.TypeName, dataSetMessage.DataSetMessageContentFlags\n                    ?? PubSubMessage.DefaultDataSetMessageContentFlags, uniqueNames,\n                networkMessageContentFlags, options);\n        }\n\n        /// <inheritdoc/>\n        protected override Schema Compile(string? typeName,\n            DataSetMessageContentFlags dataSetMessageContentFlags, HashSet<string> uniqueNames,\n            NetworkMessageContentFlags networkMessageContentFlags, SchemaOptions options)\n        {\n            if (DataSetSchema.Schema is not RecordSchema dataSetSchema)\n            {\n                return AvroSchema.Null;\n            }\n\n            // TODO: Events are encoded as dictionary, not single values\n\n            // For each value in the data set, compile a message from it\n            var items = new List<Schema>();\n            foreach (var property in dataSetSchema.Fields)\n            {\n                var fields = CollectFields(dataSetMessageContentFlags, networkMessageContentFlags,\n                    property.Schema);\n                var name = GetTypeName(typeName, uniqueNames, nameof(PubSub.MonitoredItemMessage));\n                var ns = options.Namespace != null ?\n                    SchemaUtils.NamespaceUriToNamespace(options.Namespace) :\n                    SchemaUtils.PublisherNamespace;\n                items.Add(RecordSchema.Create(name, fields.ToList(), ns));\n            }\n            return items.AsUnion();\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<Field> CollectFields(\n            DataSetMessageContentFlags dataSetMessageContentFlags,\n            NetworkMessageContentFlags networkMessageContentFlags, Schema valueSchema)\n        {\n            var encoding = new JsonBuiltInSchemas(false, true);\n            var pos = 0;\n            var fields = new List<Field>();\n\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.NodeId))\n            {\n                fields.Add(\n                   new(encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String).AsNullable(),\n                       nameof(PubSub.MonitoredItemMessage.NodeId), pos++));\n            }\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.EndpointUrl))\n            {\n                fields.Add(\n                    new(encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String).AsNullable(),\n                       nameof(PubSub.MonitoredItemMessage.EndpointUrl), pos++));\n            }\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ApplicationUri))\n            {\n                fields.Add(\n                    new(encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String).AsNullable(),\n                        nameof(PubSub.MonitoredItemMessage.ApplicationUri), pos++));\n            }\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.DisplayName))\n            {\n                fields.Add(\n                    new(encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String).AsNullable(),\n                        nameof(PubSub.MonitoredItemMessage.DisplayName), pos++));\n            }\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.Timestamp))\n            {\n                fields.Add(\n                    new(encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.DateTime).AsNullable(),\n                        nameof(PubSub.MonitoredItemMessage.Timestamp), pos++));\n            }\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.Status))\n            {\n                fields.Add(\n                    new(encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String).AsNullable(),\n                        nameof(PubSub.MonitoredItemMessage.Status), pos++));\n            }\n\n            fields.Add(new(valueSchema, nameof(PubSub.MonitoredItemMessage.Value), pos++));\n\n            if (dataSetMessageContentFlags.HasFlag(DataSetMessageContentFlags.SequenceNumber))\n            {\n                fields.Add(\n                  new(encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.UInt32).AsNullable(),\n                      nameof(PubSub.MonitoredItemMessage.SequenceNumber), pos++));\n            }\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ExtensionFields))\n            {\n                fields.Add(\n                    new(MapSchema.CreateMap(\n                        encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.Variant)).AsNullable(),\n                        nameof(PubSub.MonitoredItemMessage.ExtensionFields), pos++));\n            }\n            return fields;\n        }\n\n        private readonly DataSetFieldContentFlags _dataSetFieldContentMask;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/BaseBuiltInSchemas.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    using Opc.Ua;\n\n    /// <summary>\n    /// Represents schemas for the encoding of the built in types\n    /// as per part 6 of the OPC UA specification.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public abstract class BaseBuiltInSchemas<T>\n    {\n        /// <summary>\n        /// Get schema for built in type\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"rank\"></param>\n        /// <returns></returns>\n        public abstract T GetSchemaForBuiltInType(\n            BuiltInType builtInType, SchemaRank rank = SchemaRank.Scalar);\n\n        /// <summary>\n        /// Get a schema for a data value field with the\n        /// specified value schema. The union field in the\n        /// value variant will then be made a reserved\n        /// identifer\n        /// </summary>\n        /// <param name=\"ns\"></param>\n        /// <param name=\"asDataValue\"></param>\n        /// <param name=\"valueSchema\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        public abstract T GetSchemaForDataSetField(string ns,\n            bool asDataValue, T valueSchema, BuiltInType builtInType);\n\n        /// <summary>\n        /// Get the schema definition for a type that can\n        /// be any type in a hierarchy extension object\n        /// schema\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"ns\"></param>\n        /// <param name=\"dataTypeId\"></param>\n        /// <param name=\"bodyType\"></param>\n        /// <returns></returns>\n        public abstract T GetSchemaForExtendableType(\n            string name, string ns, string dataTypeId, T bodyType);\n\n        /// <summary>\n        /// Get schema for specified value rank\n        /// schema\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"rank\"></param>\n        /// <returns></returns>\n        public abstract T GetSchemaForRank(T schema, SchemaRank rank);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/BaseDataSetSchema.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n\n    /// <summary>\n    /// Extensions to convert metadata into avro schema. Note that this class\n    /// generates a schema that complies with the json representation in\n    /// <see cref=\"JsonEncoderEx\"/>.WriteDataSet.\n    /// This depends on the network settings and reversible vs. nonreversible\n    /// encoding mode.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public abstract class BaseDataSetSchema<T> where T : class\n    {\n        /// <summary>\n        /// The schema of the data set\n        /// </summary>\n        public abstract T Schema { get; }\n\n        /// <summary>\n        /// Encoding schema for the data set\n        /// </summary>\n        protected BaseBuiltInSchemas<T> Encoding { get; }\n\n        /// <summary>\n        /// Message context\n        /// </summary>\n        internal ServiceMessageContext Context { get; }\n\n        /// <summary>\n        /// Get avro schema for a dataset\n        /// </summary>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        protected BaseDataSetSchema(\n            DataSetFieldContentFlags? dataSetFieldContentMask,\n            BaseBuiltInSchemas<T> encoding, SchemaOptions? options = null)\n        {\n            _dataSetFieldContentMask = dataSetFieldContentMask ?? default;\n            _options = options ?? new SchemaOptions();\n            Context = new ServiceMessageContext\n            {\n                NamespaceUris = new NamespaceTable()\n            };\n            Encoding = encoding;\n        }\n\n        /// <summary>\n        /// Compile\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataSet\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        protected T? Compile(string? name, PublishedDataSetMetaDataModel dataSet,\n            HashSet<string>? uniqueNames)\n        {\n            // Collect types\n            CollectTypes(dataSet);\n\n            var schemas = GetDataSetFieldSchemas(name, dataSet, uniqueNames).ToList();\n            if (schemas.Count == 0)\n            {\n                return default;\n            }\n            if (schemas.Count != 1)\n            {\n                return CreateUnionSchema(schemas);\n            }\n            return schemas[0];\n        }\n\n        /// <summary>\n        /// Create data set schemas\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataSet\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        protected abstract IEnumerable<T> GetDataSetFieldSchemas(string? name,\n            PublishedDataSetMetaDataModel dataSet, HashSet<string>? uniqueNames);\n\n        /// <summary>\n        /// Create record schema for the structure\n        /// </summary>\n        /// <param name=\"description\"></param>\n        /// <param name=\"rank\"></param>\n        /// <param name=\"baseTypeSchema\"></param>\n        /// <returns></returns>\n        protected abstract T CreateStructureSchema(\n            StructureDescriptionModel description, SchemaRank rank,\n            T? baseTypeSchema = default);\n\n        /// <summary>\n        /// Create enum schema for the enum description\n        /// </summary>\n        /// <param name=\"description\"></param>\n        /// <param name=\"rank\"></param>\n        /// <returns></returns>\n        protected abstract T CreateEnumSchema(EnumDescriptionModel description,\n            SchemaRank rank);\n\n        /// <summary>\n        /// Create union schema\n        /// </summary>\n        /// <param name=\"schemas\"></param>\n        /// <returns></returns>\n        protected abstract T CreateUnionSchema(IReadOnlyList<T> schemas);\n\n        /// <summary>\n        /// Collect types from data set\n        /// </summary>\n        /// <param name=\"dataSet\"></param>\n        private void CollectTypes(PublishedDataSetMetaDataModel dataSet)\n        {\n            if (dataSet.StructureDataTypes != null)\n            {\n                foreach (var t in dataSet.StructureDataTypes)\n                {\n                    if (!_types.ContainsKey(t.DataTypeId))\n                    {\n                        _types.Add(t.DataTypeId, new StructureType(t));\n                    }\n                }\n            }\n            if (dataSet.SimpleDataTypes != null)\n            {\n                foreach (var t in dataSet.SimpleDataTypes)\n                {\n                    if (!_types.ContainsKey(t.DataTypeId))\n                    {\n                        _types.Add(t.DataTypeId, new SimpleType(t));\n                    }\n                }\n            }\n            if (dataSet.EnumDataTypes != null)\n            {\n                foreach (var t in dataSet.EnumDataTypes)\n                {\n                    if (!_types.ContainsKey(t.DataTypeId))\n                    {\n                        _types.Add(t.DataTypeId, new EnumType(t));\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Lookup the schema for the data type and make the type an array if\n        /// it has such value rank. Make the resulting schema nullable.\n        /// Return the name of the root schema.\n        /// </summary>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <param name=\"arrayDimensions\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        protected T LookupSchema(string dataType,\n            SchemaRank valueRank = SchemaRank.Scalar,\n            IReadOnlyList<uint>? arrayDimensions = null)\n        {\n            T? schema = null;\n\n            if (arrayDimensions?.Count > 1)\n            {\n                valueRank = SchemaRank.Matrix;\n            }\n\n            if (_types.TryGetValue(dataType, out var description))\n            {\n                schema = description.GetSchema(this, valueRank);\n            }\n\n            schema ??= GetBuiltInDataTypeSchema(dataType, valueRank);\n            return schema\n                ?? throw new ArgumentException($\"No Schema found for {dataType}\");\n\n            T? GetBuiltInDataTypeSchema(string dataType, SchemaRank valueRank)\n            {\n                var nodeId = dataType.ToExpandedNodeId(Context);\n                if (nodeId.IdType == IdType.Numeric)\n                {\n                    var id = nodeId.Identifier as uint?;\n                    if (id >= 0 && id <= 29)\n                    {\n                        return Encoding.GetSchemaForBuiltInType((BuiltInType)id, valueRank);\n                    }\n                }\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Create a type name\n        /// </summary>\n        /// <param name=\"typeName\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        protected static string MakeUnique(string typeName, HashSet<string>? uniqueNames)\n        {\n            if (uniqueNames != null)\n            {\n                var uniqueName = typeName;\n                for (var index = 1; uniqueNames.Contains(uniqueName); index++)\n                {\n                    uniqueName = typeName + index;\n                }\n                uniqueNames.Add(uniqueName);\n                typeName = uniqueName;\n            }\n            return typeName;\n        }\n\n        /// <summary>\n        /// Avro type\n        /// </summary>\n        private abstract record class TypedDescription\n        {\n            /// <summary>\n            /// Get schema\n            /// </summary>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"rank\"></param>\n            /// <returns></returns>\n            public abstract T? GetSchema(BaseDataSetSchema<T> schema, SchemaRank rank);\n        }\n\n        /// <summary>\n        /// Simple type\n        /// </summary>\n        /// <param name=\"Description\"></param>\n        private record class SimpleType(SimpleTypeDescriptionModel Description)\n            : TypedDescription\n        {\n            /// <inheritdoc/>\n            public override T? GetSchema(BaseDataSetSchema<T> schemas, SchemaRank rank)\n            {\n                if (Description.DataTypeId == \"i=\" + Description.BuiltInType)\n                {\n                    // Emit the built in type definition here instead\n                    Debug.Assert(Description.BuiltInType.HasValue);\n                    return schemas.Encoding.GetSchemaForBuiltInType(\n                        (BuiltInType)Description.BuiltInType.Value, rank);\n                }\n                // Derive from base type or built in type\n                if (Description.BaseDataType != null)\n                {\n                    // Derive from base type or built in type\n                    return schemas.LookupSchema(Description.BaseDataType, rank);\n                }\n\n                // Derive from base type or built in type\n                return schemas.Encoding.GetSchemaForBuiltInType((BuiltInType)\n                    (Description.BuiltInType ?? (byte?)BuiltInType.String), rank);\n            }\n        }\n\n        /// <summary>\n        /// Record\n        /// </summary>\n        /// <param name=\"Description\"></param>\n        private record class StructureType(StructureDescriptionModel Description)\n            : TypedDescription\n        {\n            /// <inheritdoc/>\n            public override T? GetSchema(BaseDataSetSchema<T> schemas, SchemaRank rank)\n            {\n                if (_cache[(int)rank] != null)\n                {\n                    return _cache[(int)rank];\n                }\n\n                // Get super types\n                T? baseSchema = default;\n                if (Description.BaseDataType != null &&\n                    schemas._types.TryGetValue(Description.BaseDataType, out var def) &&\n                    def is StructureType baseDescription)\n                {\n                    baseSchema = baseDescription.GetSchema(schemas, rank);\n                }\n\n                _cache[(int)rank] = schemas.CreateStructureSchema(Description, rank, baseSchema);\n                return _cache[(int)rank];\n            }\n\n            private readonly T?[] _cache = new T?[3];\n        }\n\n        /// <summary>\n        /// Enum type\n        /// </summary>\n        /// <param name=\"Description\"></param>\n        private record class EnumType(EnumDescriptionModel Description)\n            : TypedDescription\n        {\n            /// <inheritdoc/>\n            public override T? GetSchema(BaseDataSetSchema<T> schemas, SchemaRank rank)\n            {\n                if (_cache[(int)rank] != null)\n                {\n                    return _cache[(int)rank];\n                }\n\n                if (Description.IsOptionSet)\n                {\n                    // Flags\n                    // ...\n                }\n\n                _cache[(int)rank] = schemas.CreateEnumSchema(Description, rank);\n                return _cache[(int)rank];\n            }\n            private readonly T?[] _cache = new T?[3];\n        }\n\n        /// <summary>\n        /// Determine field encoding\n        /// </summary>\n        /// <param name=\"writeSingleValue\"></param>\n        /// <param name=\"dataValueRepresentation\"></param>\n        /// <param name=\"isSingleFieldDataSet\"></param>\n        protected void GetEncodingMode(out bool writeSingleValue,\n            out bool dataValueRepresentation, bool isSingleFieldDataSet)\n        {\n            writeSingleValue = isSingleFieldDataSet && _dataSetFieldContentMask\n                .HasFlag(Publisher.Models.DataSetFieldContentFlags.SingleFieldDegradeToValue);\n            dataValueRepresentation = !_dataSetFieldContentMask\n                .HasFlag(Publisher.Models.DataSetFieldContentFlags.RawData)\n                && _dataSetFieldContentMask != 0;\n        }\n\n        /// <summary> Schema options </summary>\n        protected readonly SchemaOptions _options;\n        private readonly DataSetFieldContentFlags _dataSetFieldContentMask;\n        private readonly Dictionary<string, TypedDescription> _types = [];\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonBuiltInSchemas.cs",
    "content": "﻿//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using Opc.Ua;\n    using DataSetFieldContentFlags = Publisher.Models.DataSetFieldContentFlags;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Provides the json encodings of built in types and objects in Avro schema\n    /// </summary>\n    internal class JsonBuiltInSchemas : BaseBuiltInSchemas<JsonSchema>\n    {\n        /// <summary>\n        /// Schema definitions\n        /// </summary>\n        public Dictionary<string, JsonSchema> Schemas { get; }\n\n        private JsonSchema EnumerationSchema\n        {\n            get\n            {\n                if (_reversibleEncoding)\n                {\n                    // Enumeration values shall be encoded as a JSON number\n                    // for the reversible encoding.\n                    return Simple((int)BuiltInType.Enumeration,\n                        SchemaType.Integer, \"int32\");\n                }\n\n                // For the non - reversible form, Enumeration values are\n                // encoded as a JSON string with the following format:\n                // <name>_<value>\n                return Simple((int)BuiltInType.Enumeration,\n                    SchemaType.String);\n            }\n        }\n\n        private JsonSchema DiagnosticInfoSchema\n        {\n            get\n            {\n                return new JsonSchema\n                {\n                    Title = GetTitle(BuiltInType.DiagnosticInfo),\n                    Id = GetId(BuiltInType.DiagnosticInfo),\n                    Type = SchemaType.Object,\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"SymbolicId\"] = GetSchemaForBuiltInType(BuiltInType.Int32),\n                        [\"NamespaceUri\"] = GetSchemaForBuiltInType(BuiltInType.Int32),\n                        [\"Locale\"] = GetSchemaForBuiltInType(BuiltInType.Int32),\n                        [\"LocalizedText\"] = GetSchemaForBuiltInType(BuiltInType.Int32),\n                        [\"AdditionalInfo\"] = GetSchemaForBuiltInType(BuiltInType.String),\n                        [\"InnerStatusCode\"] = GetSchemaForBuiltInType(BuiltInType.StatusCode),\n                        [\"InnerDiagnosticInfo\"] = new JsonSchema\n                        {\n                            // Self reference\n                            Reference = UriOrFragment.Self\n                        }\n                    },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        private JsonSchema VariantSchema\n        {\n            get\n            {\n                var any = new JsonSchema\n                {\n                    Title = \"Any\",\n                    Types = new[] {\n                        SchemaType.Number,\n                        SchemaType.Null,\n                        SchemaType.Object,\n                        SchemaType.Array,\n                        SchemaType.String,\n                        SchemaType.Integer,\n                        SchemaType.Boolean\n                    }\n                };\n                if (!_reversibleEncoding)\n                {\n                    // For the non-reversible form, Variant values shall be\n                    // encoded as a JSON value containing only the value of\n                    // the Body field. The Type and Dimensions fields are\n                    // dropped. Multi-dimensional arrays are encoded as a\n                    // multi-dimensional JSON array as described in 5.4.5.\n                    return any;\n                }\n                return new JsonSchema\n                {\n                    Id = GetId(BuiltInType.Variant),\n                    Type = SchemaType.Object,\n                    Title = GetTitle(BuiltInType.Variant),\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"Type\"] = GetSchemaForBuiltInType(BuiltInType.Byte),\n                        [\"Body\"] = any,\n                        [\"Dimensions\"] = GetSchemaForBuiltInType(BuiltInType.UInt32,\n                            SchemaRank.Collection)\n                    },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        private JsonSchema ExtensionObjectSchema\n        {\n            get\n            {\n                if (!_reversibleEncoding)\n                {\n                    // For the non-reversible form, ExtensionObject values\n                    // shall be encoded as a JSON value containing only the\n                    // value of the Body field. The TypeId and Encoding\n                    // fields are dropped.\n                    return new JsonSchema\n                    {\n                        Types = new[] { SchemaType.Object }\n                    };\n                }\n                return new JsonSchema\n                {\n                    Id = GetId(BuiltInType.ExtensionObject),\n                    Type = SchemaType.Object,\n                    Title = GetTitle(BuiltInType.ExtensionObject),\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"TypeId\"] = GetSchemaForBuiltInType(BuiltInType.NodeId),\n                        [\"Encoding\"] = GetSchemaForBuiltInType(BuiltInType.Byte),\n                        [\"Body\"] = new JsonSchema\n                        {\n                            Types = new[] { SchemaType.Object }\n                        }\n                    },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        private JsonSchema StatusCodeSchema\n        {\n            get\n            {\n                if (_reversibleEncoding)\n                {\n                    //\n                    // StatusCode values shall be encoded as a JSON number for\n                    // the reversible encoding. If the StatusCode is Good (0)\n                    // it is only encoded if it is an element of a JSON array.\n                    //\n                    return Simple((int)BuiltInType.StatusCode,\n                        SchemaType.Integer, \"uint32\");\n                }\n\n                // For the non - reversible form, StatusCode values\n                // shall be encoded as a JSON object with the fields\n                // defined here.\n                return new JsonSchema\n                {\n                    Id = GetId(BuiltInType.StatusCode),\n                    Type = SchemaType.Object,\n                    Title = GetTitle(BuiltInType.StatusCode),\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"Code\"] = GetSchemaForBuiltInType(BuiltInType.UInt32),\n                        [\"Symbol\"] = GetSchemaForBuiltInType(BuiltInType.String)\n                    },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        private JsonSchema QualifiedNameSchema\n        {\n            get\n            {\n                if (_encodeNamespacedValuesAsUri)\n                {\n                    return Simple((int)BuiltInType.QualifiedName, SchemaType.String,\n                        \"opcuaQualifiedName\");\n                }\n\n                // For non-reversible encoding this field is the JSON\n                // string containing the NamespaceUri associated with\n                // the NamespaceIndex unless the NamespaceIndex is 0.\n                // If the NamespaceIndex is 0 the field is omitted.\n                return new JsonSchema\n                {\n                    Title = GetTitle(BuiltInType.QualifiedName),\n                    Id = GetId(BuiltInType.QualifiedName),\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"Name\"] = GetSchemaForBuiltInType(BuiltInType.String),\n                        [\"Uri\"] = GetSchemaForBuiltInType(\n                            _reversibleEncoding ? BuiltInType.UInt32 : BuiltInType.String)\n                    },\n                    Required = new[] { \"Name\" },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        private JsonSchema LocalizedTextSchema\n        {\n            get\n            {\n                if (!_reversibleEncoding)\n                {\n                    // For the non-reversible form, LocalizedText value shall\n                    // be encoded as a JSON string containing the Text component.\n                    return Simple((int)BuiltInType.LocalizedText, SchemaType.String);\n                }\n                return new JsonSchema\n                {\n                    Title = GetTitle(BuiltInType.LocalizedText),\n                    Type = SchemaType.Object,\n                    Id = GetId(BuiltInType.LocalizedText),\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"Locale\"] = new JsonSchema\n                        {\n                            Title = GetTitle(BuiltInType.String),\n                            Type = SchemaType.String,\n                            Format = \"rfc3066\"\n                        },\n                        [\"Text\"] = GetSchemaForBuiltInType(BuiltInType.String)\n                    },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        private JsonSchema NodeIdSchema\n        {\n            get\n            {\n                if (_encodeNamespacedValuesAsUri)\n                {\n                    return Simple((int)BuiltInType.NodeId, SchemaType.String,\n                        \"opcuaNodeId\");\n                }\n\n                return new JsonSchema\n                {\n                    Title = GetTitle(BuiltInType.NodeId),\n                    Type = SchemaType.Object,\n                    Id = GetId(BuiltInType.NodeId),\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"IdentifierType\"] = GetSchemaForBuiltInType(BuiltInType.Byte),\n                        [\"Id\"] = new[]\n                        {\n                            GetSchemaForBuiltInType(BuiltInType.UInt32),\n                            GetSchemaForBuiltInType(BuiltInType.ByteString),\n                            GetSchemaForBuiltInType(BuiltInType.Guid),\n                            GetSchemaForBuiltInType(BuiltInType.String)\n                        }\n                        .AsUnion(Schemas, \"NodeIdentifer\"),\n                        //\n                        // For reversible encoding this field is a JSON number\n                        // with the NamespaceIndex. The field is omitted if the\n                        // NamespaceIndex is 0.\n                        //\n                        // For non-reversible encoding this field is the JSON\n                        // string containing the NamespaceUri associated with\n                        // the NamespaceIndex unless the NamespaceIndex is 0.\n                        // If the NamespaceIndex is 0 the field is omitted.\n                        //\n                        [\"Namespace\"] = GetSchemaForBuiltInType(\n                            _reversibleEncoding ? BuiltInType.UInt32 : BuiltInType.String)\n                    },\n                    Required = new[] { \"IdentifierType\" },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        private JsonSchema ExpandedNodeIdSchema\n        {\n            get\n            {\n                if (_encodeNamespacedValuesAsUri)\n                {\n                    return Simple((int)BuiltInType.ExpandedNodeId, SchemaType.String,\n                        \"opcuaExpandedNodeId\");\n                }\n                return new JsonSchema\n                {\n                    Title = GetTitle(BuiltInType.ExpandedNodeId),\n                    Type = SchemaType.Object,\n                    Id = GetId(BuiltInType.ExpandedNodeId),\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"IdentifierType\"] = GetSchemaForBuiltInType(BuiltInType.Byte),\n                        [\"Id\"] = new[]\n                        {\n                            GetSchemaForBuiltInType(BuiltInType.UInt32),\n                            GetSchemaForBuiltInType(BuiltInType.ByteString),\n                            GetSchemaForBuiltInType(BuiltInType.Guid),\n                            GetSchemaForBuiltInType(BuiltInType.String)\n                        }\n                        .AsUnion(Schemas, \"NodeIdentifer\"),\n                        //\n                        // For reversible encoding this field is a JSON number\n                        // with the NamespaceIndex. The field is omitted if the\n                        // NamespaceIndex is 0.\n                        //\n                        // For non-reversible encoding this field is the JSON\n                        // string containing the NamespaceUri associated with\n                        // the NamespaceIndex unless the NamespaceIndex is 0.\n                        // If the NamespaceIndex is 0 the field is omitted.\n                        //\n                        [\"Namespace\"] = GetSchemaForBuiltInType(\n                            _reversibleEncoding ? BuiltInType.UInt32 : BuiltInType.String),\n                        //\n                        // For reversible encoding this field is a JSON string\n                        // with the NamespaceUri if the NamespaceUri is specified.\n                        // Otherwise, it is a JSON number with the NamespaceIndex.\n                        // The field is omitted if the NamespaceIndex is 0.\n                        //\n                        // For non-reversible encoding this field is the JSON string\n                        // containing the NamespaceUri or the NamespaceUri associated\n                        // with the NamespaceIndex unless the NamespaceIndex is 0\n                        // or 1. If the NamespaceIndex is 0 the field is omitted.\n                        //\n                        [\"ServerUri\"] = GetSchemaForBuiltInType(\n                            _reversibleEncoding ? BuiltInType.UInt16 : BuiltInType.String)\n                    },\n                    Required = new[] { \"IdentifierType\" },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        private JsonSchema DataValueSchema\n        {\n            get\n            {\n                return new JsonSchema\n                {\n                    Title = GetTitle(BuiltInType.DataValue),\n                    Type = SchemaType.Object,\n                    Id = GetId(BuiltInType.DataValue),\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"Value\"] = GetSchemaForBuiltInType(BuiltInType.Variant),\n                        [\"Status\"] = GetSchemaForBuiltInType(BuiltInType.StatusCode),\n                        [\"SourceTimestamp\"] = GetSchemaForBuiltInType(BuiltInType.DateTime),\n                        [\"SourcePicoSeconds\"] = GetSchemaForBuiltInType(BuiltInType.UInt16),\n                        [\"ServerTimestamp\"] = GetSchemaForBuiltInType(BuiltInType.DateTime),\n                        [\"ServerPicoSeconds\"] = GetSchemaForBuiltInType(BuiltInType.UInt16)\n                    },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            }\n        }\n\n        /// <summary>\n        /// Create avro schema for json encoder\n        /// </summary>\n        /// <param name=\"reversibleEncoding\"></param>\n        /// <param name=\"useUriEncoding\"></param>\n        /// <param name=\"definitions\"></param>\n        public JsonBuiltInSchemas(bool reversibleEncoding,\n            bool useUriEncoding, Dictionary<string, JsonSchema>? definitions)\n        {\n            Schemas = definitions ?? [];\n            _reversibleEncoding = reversibleEncoding;\n            _encodeNamespacedValuesAsUri = useUriEncoding;\n        }\n\n        /// <summary>\n        /// Create encoding schema\n        /// </summary>\n        /// <param name=\"fieldContentMask\"></param>\n        /// <param name=\"definitions\"></param>\n        public JsonBuiltInSchemas(DataSetFieldContentFlags fieldContentMask,\n            Dictionary<string, JsonSchema>? definitions = null)\n        {\n            Schemas = definitions ?? [];\n            _encodeNamespacedValuesAsUri = true;\n\n            if ((fieldContentMask & DataSetFieldContentFlags.RawData) != 0)\n            {\n                //\n                // If the DataSetFieldContentMask results in a RawData\n                // representation, the field value is a Variant encoded\n                // using the non-reversible OPC UA JSON Data Encoding\n                // defined in OPC 10000-6\n                //\n                _reversibleEncoding = false;\n            }\n            else if (fieldContentMask == 0)\n            {\n                //\n                // If the DataSetFieldContentMask results in a Variant\n                // representation, the field value is encoded as a Variant\n                // encoded using the reversible OPC UA JSON Data Encoding\n                // defined in OPC 10000-6.\n                //\n                _reversibleEncoding = true;\n            }\n            else\n            {\n                //\n                // If the DataSetFieldContentMask results in a DataValue\n                // representation, the field value is a DataValue encoded\n                // using the non-reversible OPC UA JSON Data Encoding or\n                // reversible depending on encoder configuration.\n                //\n                _reversibleEncoding = false;\n            }\n        }\n\n        /// <summary>\n        /// Get built in schema. See\n        /// https://reference.opcfoundation.org/Core/Part6/v104/docs/5.1.2#_Ref131507956\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"rank\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public override JsonSchema GetSchemaForBuiltInType(BuiltInType builtInType,\n            SchemaRank rank = SchemaRank.Scalar)\n        {\n            if (rank == SchemaRank.Matrix)\n            {\n                return GetSchemaForBuiltInType(BuiltInType.Variant);\n            }\n            // Always use byte string for byte arrays\n            if (builtInType == BuiltInType.Byte && rank == SchemaRank.Collection)\n            {\n                builtInType = BuiltInType.ByteString;\n                rank = SchemaRank.Scalar;\n            }\n            var typeDefinitionName = GetDefinitionName(builtInType);\n            if (!Schemas.TryGetValue(typeDefinitionName, out var schema))\n            {\n                schema = CreateSchemaForBuiltInType((int)builtInType);\n                Schemas.Add(typeDefinitionName, schema);\n            }\n            if (schema.Id != null)\n            {\n                schema = Reference(builtInType);\n            }\n            if (rank != SchemaRank.Scalar)\n            {\n                return new JsonSchema\n                {\n                    Type = SchemaType.Array,\n                    Items = new[] { schema }\n                };\n            }\n            return schema;\n\n            JsonSchema CreateSchemaForBuiltInType(int id) => id switch\n            {\n                1 => Simple(id, SchemaType.Boolean),\n                2 => Simple(id, SchemaType.Integer, \"int8\",\n                    Limit.From(sbyte.MinValue), Limit.From(sbyte.MaxValue), Const.From(0)),\n                3 => Simple(id, SchemaType.Integer, \"byte\",\n                    Limit.From(byte.MinValue), Limit.From(byte.MaxValue), Const.From(0)),\n                4 => Simple(id, SchemaType.Integer, \"int16\",\n                    Limit.From(short.MinValue), Limit.From(short.MaxValue), Const.From(0)),\n                5 => Simple(id, SchemaType.Integer, \"uint16\",\n                    Limit.From(ushort.MinValue), Limit.From(ushort.MaxValue), Const.From(0)),\n                6 => Simple(id, SchemaType.Integer, \"int32\",\n                    Limit.From(int.MinValue), Limit.From(int.MaxValue), Const.From(0)),\n                7 => Simple(id, SchemaType.Integer, \"uint32\",\n                    Limit.From(uint.MinValue), Limit.From(uint.MaxValue), Const.From(0)),\n\n                // As per part 6 encoding, long is encoded as string\n                8 => Simple(id, SchemaType.String, \"int64\"),\n                9 => Simple(id, SchemaType.String, \"uint64\"),\n\n                10 => Simple(id, SchemaType.Number, \"float\",\n                    Limit.From(float.MinValue), Limit.From(float.MaxValue), Const.From(0f)),\n                11 => Simple(id, SchemaType.Number, \"double\",\n                    Limit.From(double.MinValue), Limit.From(double.MaxValue), Const.From(0d)),\n                12 => Simple(id, SchemaType.String),\n                13 => Simple(id, SchemaType.String, \"date-time\"),\n                14 => Simple(id, SchemaType.String, \"uuid\"),\n                15 => Simple(id, SchemaType.String, \"byte\"),\n                16 => Simple(id, SchemaType.String, \"xmlelement\"),\n\n                17 => NodeIdSchema,\n                18 => ExpandedNodeIdSchema,\n                19 => StatusCodeSchema,\n                20 => QualifiedNameSchema,\n                21 => LocalizedTextSchema,\n                22 => ExtensionObjectSchema,\n                23 => DataValueSchema,\n                24 => VariantSchema,\n                25 => DiagnosticInfoSchema,\n\n                26 => Simple(id, SchemaType.Number),\n\n                // Should this be string? As per json encoding, long is string\n                27 => Simple(id, SchemaType.Integer),\n                28 => Simple(id, SchemaType.Integer, \"unsigned\", Limit.From(0)),\n\n                29 => EnumerationSchema,\n                _ => throw new ArgumentException($\"Built in type {id} unknown\")\n            };\n        }\n\n        /// <inheritdoc/>\n        public override JsonSchema GetSchemaForExtendableType(string name, string ns,\n            string dataTypeId, JsonSchema bodyType)\n        {\n            return GetSchemaForBuiltInType(BuiltInType.ExtensionObject);\n        }\n\n        /// <inheritdoc/>\n        public override JsonSchema GetSchemaForDataSetField(string ns, bool asDataValue,\n            JsonSchema valueSchema, BuiltInType builtInType)\n        {\n            var fieldSchema = valueSchema.Resolve(Schemas);\n            var isArray = fieldSchema.Type == SchemaType.Array &&\n                fieldSchema.Items?.Count == 1;\n            if (isArray)\n            {\n                fieldSchema = fieldSchema.Items![0].Resolve(Schemas);\n            }\n            var type = fieldSchema.Id?.Fragment ?? fieldSchema.Format\n                ?? fieldSchema.Type.ToString();\n            if (isArray)\n            {\n                type += \"Array\";\n            }\n\n            if (_reversibleEncoding)\n            {\n                // For reversible encoding, the field is a variant formatted object\n                valueSchema = GetSchemaForTypedVariant(ns, type,\n                    valueSchema, builtInType);\n            }\n\n            if (!asDataValue)\n            {\n                // Raw mode\n                return valueSchema;\n            }\n\n            var id = new UriOrFragment(type + nameof(DataValue), ns);\n            return Schemas.Reference(id, id =>\n            {\n                return new JsonSchema\n                {\n                    Id = id,\n                    Title = $\"Dataset Field of Type {type}\",\n                    Type = SchemaType.Object,\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"Value\"] = valueSchema,\n                        [\"Status\"] = GetSchemaForBuiltInType(BuiltInType.StatusCode),\n                        [\"SourceTimestamp\"] = GetSchemaForBuiltInType(BuiltInType.DateTime),\n                        [\"SourcePicoSeconds\"] = GetSchemaForBuiltInType(BuiltInType.UInt16),\n                        [\"ServerTimestamp\"] = GetSchemaForBuiltInType(BuiltInType.DateTime),\n                        [\"ServerPicoSeconds\"] = GetSchemaForBuiltInType(BuiltInType.UInt16)\n                    },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            });\n        }\n\n        /// <inheritdoc/>\n        public override JsonSchema GetSchemaForRank(JsonSchema schema, SchemaRank rank)\n        {\n            switch (rank)\n            {\n                case SchemaRank.Matrix:\n                    // Variant schema\n                    return GetSchemaForBuiltInType(BuiltInType.Variant);\n                case SchemaRank.Collection:\n                    return schema.AsArray();\n                default:\n                    return schema;\n            }\n        }\n\n        /// <summary>\n        /// Generate a typed variant\n        /// </summary>\n        /// <param name=\"ns\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"valueSchema\"></param>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        private JsonSchema GetSchemaForTypedVariant(string ns, string name, JsonSchema valueSchema,\n            BuiltInType builtInType)\n        {\n            var id = new UriOrFragment(name + nameof(Variant), ns);\n            return Schemas.Reference(id, id =>\n            {\n                return new JsonSchema\n                {\n                    Id = id,\n                    Title = $\"Variant Field of Type {name}\",\n                    Type = SchemaType.Object,\n                    Properties = new Dictionary<string, JsonSchema>\n                    {\n                        [\"Type\"] = new JsonSchema\n                        {\n                            Type = SchemaType.Integer,\n                            Const = Const.From((int)builtInType)\n                        },\n                        [\"Body\"] = valueSchema\n                    },\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            });\n        }\n\n        /// <summary>\n        /// Get data typeid\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        private static UriOrFragment GetId(BuiltInType builtInType)\n        {\n            return new UriOrFragment(builtInType.ToString(), Namespaces.OpcUa);\n        }\n\n        /// <summary>\n        /// Create a definition name\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        private static string GetDefinitionName(BuiltInType builtInType)\n        {\n            return SchemaUtils.NamespaceZeroName + \".\" + builtInType;\n        }\n\n        /// <summary>\n        /// Create primitive opc ua built in type\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <param name=\"type\"></param>\n        /// <param name=\"format\"></param>\n        /// <param name=\"minValue\"></param>\n        /// <param name=\"maxValue\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        private static JsonSchema Simple(int builtInType,\n            SchemaType type, string? format = null, Limit? minValue = null,\n            Limit? maxValue = null, Const? defaultValue = null)\n        {\n            return new JsonSchema\n            {\n                Title = GetTitle((BuiltInType)builtInType),\n                Id = GetId((BuiltInType)builtInType),\n                Minimum = minValue,\n                Maximum = maxValue,\n                Default = defaultValue,\n                Type = type,\n                Format = format\n            };\n        }\n\n        /// <summary>\n        /// Create a reference\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        private static JsonSchema Reference(BuiltInType builtInType)\n        {\n            return new JsonSchema\n            {\n                Reference = new UriOrFragment(GetDefinitionName(builtInType))\n            };\n        }\n\n        /// <summary>\n        /// Create a title\n        /// </summary>\n        /// <param name=\"builtInType\"></param>\n        /// <returns></returns>\n        private static string GetTitle(BuiltInType builtInType)\n        {\n            return $\"OPC UA built in type {builtInType}\";\n        }\n\n        private readonly bool _reversibleEncoding;\n        private readonly bool _encodeNamespacedValuesAsUri;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonDataSet.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Extensions to convert metadata into json schema. Note that this class\n    /// generates a schema that complies with the json representation in\n    /// <see cref=\"JsonEncoderEx\"/>.WriteDataSet.\n    /// This depends on the network settings and reversible vs. nonreversible\n    /// encoding mode.\n    /// </summary>\n    public sealed class JsonDataSet : BaseDataSetSchema<JsonSchema>,\n        IEventSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.Json;\n\n        /// <inheritdoc/>\n        public string Name { get; }\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        string IEventSchema.Schema => Schema.ToJsonString();\n\n        /// <inheritdoc/>\n        public override JsonSchema Schema => new()\n        {\n            Definitions = Definitions,\n            Type = Ref == null ? SchemaType.Null : SchemaType.None,\n            Reference = Ref?.Reference\n        };\n\n        /// <summary>\n        /// Schema reference\n        /// </summary>\n        public JsonSchema? Ref { get; }\n\n        /// <summary>\n        /// Definitions\n        /// </summary>\n        internal Dictionary<string, JsonSchema> Definitions\n            => ((JsonBuiltInSchemas)Encoding).Schemas;\n\n        /// <summary>\n        /// Get json schema for a dataset\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"dataSet\"></param>\n        /// <param name=\"dataSetFieldContentFlags\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"def\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        public JsonDataSet(string id, PublishedDataSetMetaDataModel dataSet,\n            DataSetFieldContentFlags? dataSetFieldContentFlags = null,\n            SchemaOptions? options = null, Dictionary<string, JsonSchema>? def = null,\n            HashSet<string>? uniqueNames = null)\n            : base(dataSetFieldContentFlags, new JsonBuiltInSchemas(\n                dataSetFieldContentFlags ?? default, def), options)\n        {\n            var name = dataSet.DataSetMetaData?.Name;\n            Id = id;\n            Name = name ?? \"DataSet\";\n            Ref = Compile(name, dataSet, uniqueNames);\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return Schema.ToJsonString();\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<JsonSchema> GetDataSetFieldSchemas(string? name,\n            PublishedDataSetMetaDataModel dataSet, HashSet<string>? uniqueNames)\n        {\n            var singleValue = dataSet.Fields.Count == 1;\n            GetEncodingMode(out var omitFieldName, out var fieldsAreDataValues,\n                singleValue);\n            if (omitFieldName)\n            {\n                var set = new HashSet<JsonSchema>();\n                foreach (var fieldMetadata in dataSet.Fields)\n                {\n                    if (fieldMetadata?.DataType != null)\n                    {\n                        var schema = LookupSchema(fieldMetadata.DataType,\n                            SchemaUtils.GetRank(fieldMetadata.ValueRank),\n                            fieldMetadata.ArrayDimensions);\n                        set.Add(schema);\n                    }\n                }\n                return set;\n            }\n\n            var ns = _options.GetNamespaceUri();\n            var properties = new Dictionary<string, JsonSchema>();\n            var required = new List<string>();\n            foreach (var fieldMetadata in dataSet.Fields)\n            {\n                if (fieldMetadata?.DataType != null)\n                {\n                    var schema = LookupSchema(fieldMetadata.DataType,\n                        SchemaUtils.GetRank(fieldMetadata.ValueRank),\n                        fieldMetadata.ArrayDimensions);\n                    if (fieldMetadata.Name != null)\n                    {\n                        // TODO: Add properties to the field type\n                        schema = Encoding.GetSchemaForDataSetField(ns, fieldsAreDataValues,\n                            schema, (Opc.Ua.BuiltInType)fieldMetadata.BuiltInType);\n\n                        schema.Description = fieldMetadata.Description;\n                        properties.Add(fieldMetadata.Name, schema);\n                    }\n                }\n            }\n            var type = MakeUnique(name ?? dataSet.DataSetMetaData.Name ?? \"DataSet\", uniqueNames);\n            return Definitions.Reference(_options.GetSchemaId(type), id => new JsonSchema\n            {\n                Id = id,\n                Title = type,\n                Type = SchemaType.Object,\n                Properties = properties,\n                Required = required\n            }).YieldReturn();\n        }\n\n        /// <inheritdoc/>\n        protected override JsonSchema CreateStructureSchema(StructureDescriptionModel description,\n            SchemaRank rank, JsonSchema? baseTypeSchema)\n        {\n            var scalar = Definitions.Reference(description.DataTypeId\n                .GetSchemaId(description.Name, Context), id =>\n            {\n                //\n                // |---------------|------------|----------------|\n                // | Field Value   | Reversible | Non-Reversible |\n                // |---------------|------------|----------------|\n                // | NULL          | Omitted    | JSON null      |\n                // | Default Value | Omitted    | Default Value  |\n                // |---------------|------------|----------------|\n                //\n                var properties = new Dictionary<string, JsonSchema>();\n                var required = new List<string>();\n                for (var i = 0; i < description.Fields.Count; i++)\n                {\n                    var field = description.Fields[i];\n                    var schema = LookupSchema(field.DataType,\n                        SchemaUtils.GetRank(field.ValueRank), field.ArrayDimensions);\n                    if (!field.IsOptional)\n                    {\n                        required.Add(field.Name);\n                    }\n                    schema.Description = field.Description;\n                    properties.Add(field.Name, schema);\n                }\n                return new JsonSchema\n                {\n                    Id = id,\n                    Title = description.Name,\n                    Type = SchemaType.Object,\n                    AllOf = baseTypeSchema == null ? null : new[] { baseTypeSchema },\n                    Properties = properties,\n                    Required = required,\n                    AdditionalProperties = new JsonSchema { Allowed = false }\n                };\n            });\n\n            return Encoding.GetSchemaForRank(scalar, rank);\n        }\n\n        /// <inheritdoc/>\n        protected override JsonSchema CreateEnumSchema(EnumDescriptionModel description,\n            SchemaRank rank)\n        {\n            var scalar = Definitions.Reference(description.DataTypeId\n                .GetSchemaId(description.Name, Context), id =>\n            {\n                var fields = description.Fields\n                    .Select(f => new Const<long>(f.Value)).ToArray();\n\n                // TODO: Build doc from fields descriptions\n\n                return new JsonSchema\n                {\n                    Id = id,\n                    Title = description.Name,\n                    Enum = fields,\n                    Type = SchemaType.Integer,\n                    Format = \"int32\"\n                };\n            });\n            return Encoding.GetSchemaForRank(scalar, rank);\n        }\n\n        /// <inheritdoc/>\n        protected override JsonSchema CreateUnionSchema(IReadOnlyList<JsonSchema> schemas)\n        {\n            return schemas.AsUnion(Definitions);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonDataSetMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using Opc.Ua;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// DataSet message Json schema\n    /// </summary>\n    public sealed class JsonDataSetMessage : IEventSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.Json;\n\n        /// <inheritdoc/>\n        public string Name { get; }\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        string IEventSchema.Schema => ToString()!;\n\n        /// <summary>\n        /// Compatibility with 2.8 when encoding and decoding\n        /// </summary>\n        public bool UseCompatibilityMode { get; }\n\n        /// <summary>\n        /// Schema reference\n        /// </summary>\n        public JsonSchema? Ref { get; }\n\n        /// <summary>\n        /// Definitions\n        /// </summary>\n        internal Dictionary<string, JsonSchema> Definitions => _dataSet.Definitions;\n\n        /// <summary>\n        /// Definitions\n        /// </summary>\n        internal ServiceMessageContext Context => _dataSet.Context;\n\n        /// <summary>\n        /// Get json schema for a writer\n        /// </summary>\n        /// <param name=\"dataSetMessage\"></param>\n        /// <param name=\"withDataSetMessageHeader\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"definitions\"></param>\n        /// <param name=\"useCompatibilityMode\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        internal JsonDataSetMessage(PublishedDataSetMessageSchemaModel dataSetMessage,\n            bool withDataSetMessageHeader, SchemaOptions options,\n            Dictionary<string, JsonSchema> definitions, bool useCompatibilityMode,\n            HashSet<string> uniqueNames)\n        {\n            _options = options;\n            _withDataSetMessageHeader = withDataSetMessageHeader;\n            _dataSet = new JsonDataSet(dataSetMessage.Id, dataSetMessage.MetaData,\n                dataSetMessage.DataSetFieldContentFlags, options, definitions, uniqueNames);\n            UseCompatibilityMode = useCompatibilityMode;\n            Id = dataSetMessage.Id;\n            Name = GetName(dataSetMessage.TypeName, uniqueNames);\n            Ref = Compile(dataSetMessage.DataSetMessageContentFlags\n                ?? PubSubMessage.DefaultDataSetMessageContentFlags);\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return new JsonSchema\n            {\n                Type = Ref == null ? SchemaType.Null : SchemaType.None,\n                Definitions = Definitions,\n                Reference = Ref?.Reference\n            }.ToJsonString();\n        }\n\n        /// <summary>\n        /// Compile the data set message schema\n        /// </summary>\n        /// <param name=\"dataSetMessageContentMask\"></param>\n        /// <returns></returns>\n        private JsonSchema? Compile(DataSetMessageContentFlags dataSetMessageContentMask)\n        {\n            if (_dataSet.Ref == null)\n            {\n                return null;\n            }\n\n            if (!_withDataSetMessageHeader)\n            {\n                // Not a data set message\n                return _dataSet.Ref;\n            }\n\n            var encoding = new JsonBuiltInSchemas(true, true, Definitions);\n            var properties = new Dictionary<string, JsonSchema>();\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.DataSetWriterId))\n            {\n                if (!UseCompatibilityMode)\n                {\n                    properties.Add(nameof(DataSetMessageContentFlags.DataSetWriterId),\n                        encoding.GetSchemaForBuiltInType(BuiltInType.UInt16));\n                }\n                else\n                {\n                    // Up to version 2.8 we wrote the string id as id which is not per standard\n                    properties.Add(nameof(DataSetMessageContentFlags.DataSetWriterId),\n                        encoding.GetSchemaForBuiltInType(BuiltInType.String));\n                }\n            }\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.SequenceNumber))\n            {\n                properties.Add(nameof(DataSetMessageContentFlags.SequenceNumber),\n                    encoding.GetSchemaForBuiltInType(BuiltInType.UInt32));\n            }\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.MetaDataVersion))\n            {\n                var version = Definitions.Reference(\n                    DataTypeIds.ConfigurationVersionDataType.GetSchemaId(Context),\n                    id => new JsonSchema\n                    {\n                        Id = id,\n                        Type = SchemaType.Object,\n                        Properties = new Dictionary<string, JsonSchema>\n                        {\n                            [\"MajorVersion\"] = encoding.GetSchemaForBuiltInType(BuiltInType.UInt32),\n                            [\"MinorVersion\"] = encoding.GetSchemaForBuiltInType(BuiltInType.UInt32)\n                        }\n                    });\n                properties.Add(nameof(DataSetMessageContentFlags.MetaDataVersion), version);\n            }\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Timestamp))\n            {\n                properties.Add(nameof(DataSetMessageContentFlags.Timestamp),\n                    encoding.GetSchemaForBuiltInType(BuiltInType.DateTime));\n            }\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Status))\n            {\n                if (!UseCompatibilityMode)\n                {\n                    properties.Add(nameof(DataSetMessageContentFlags.Status),\n                        encoding.GetSchemaForBuiltInType(BuiltInType.StatusCode));\n                }\n                else\n                {\n                    // Up to version 2.8 we wrote the full status code\n                    properties.Add(nameof(DataSetMessageContentFlags.Status),\n                        new JsonBuiltInSchemas(false, false, Definitions)\n                        .GetSchemaForBuiltInType(BuiltInType.StatusCode));\n                }\n            }\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.MessageType))\n            {\n                properties.Add(nameof(DataSetMessageContentFlags.MessageType),\n                    encoding.GetSchemaForBuiltInType(BuiltInType.String));\n            }\n            if (!UseCompatibilityMode &&\n                dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.DataSetWriterName))\n            {\n                properties.Add(nameof(DataSetMessageContentFlags.DataSetWriterName),\n                    encoding.GetSchemaForBuiltInType(BuiltInType.String));\n            }\n\n            properties.Add(nameof(PubSub.JsonDataSetMessage.Payload), _dataSet.Ref);\n\n            return Definitions.Reference(_options.GetSchemaId(Name), id => new JsonSchema\n            {\n                Id = id,\n                Type = SchemaType.Object,\n                AdditionalProperties = new JsonSchema { Allowed = false },\n                Properties = properties,\n                Required = properties.Keys.ToList()\n            });\n        }\n\n        /// <summary>\n        /// Get name of the type\n        /// </summary>\n        /// <param name=\"typeName\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        private static string GetName(string? typeName, HashSet<string>? uniqueNames)\n        {\n            // Type name of the message record\n            typeName ??= string.Empty;\n            typeName += BaseDataSetMessage.MessageTypeName;\n            if (uniqueNames != null)\n            {\n                var uniqueName = typeName;\n                for (var index = 1; uniqueNames.Contains(uniqueName); index++)\n                {\n                    uniqueName = typeName + index;\n                }\n                uniqueNames.Add(uniqueName);\n                typeName = uniqueName;\n            }\n            return typeName;\n        }\n\n        private readonly JsonDataSet _dataSet;\n        private readonly SchemaOptions _options;\n        private readonly bool _withDataSetMessageHeader;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Network message json schema\n    /// </summary>\n    public sealed class JsonNetworkMessage : IEventSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.JsonSchema;\n\n        /// <inheritdoc/>\n        public string Name { get; }\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        string IEventSchema.Schema => ToString()!;\n\n        /// <summary>\n        /// Schema reference\n        /// </summary>\n        public JsonSchema? Ref { get; }\n\n        /// <summary>\n        /// Definitions\n        /// </summary>\n        internal Dictionary<string, JsonSchema> Definitions { get; }\n\n        /// <summary>\n        /// Compatibility with 2.8 when encoding and decoding\n        /// </summary>\n        public bool UseCompatibilityMode { get; }\n\n        /// <summary>\n        /// Get avro schema for a writer group\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"useCompatibilityMode\"></param>\n        /// <param name=\"definitions\"></param>\n        public JsonNetworkMessage(PublishedNetworkMessageSchemaModel networkMessage,\n            SchemaOptions? options = null, bool useCompatibilityMode = false,\n            Dictionary<string, JsonSchema>? definitions = null)\n        {\n            ArgumentNullException.ThrowIfNull(networkMessage);\n\n            UseCompatibilityMode = useCompatibilityMode;\n            Definitions = definitions ?? [];\n            _options = options ?? new SchemaOptions();\n\n            Version = networkMessage.Version;\n            Id = networkMessage.Id;\n            Name = GetName(networkMessage.TypeName);\n            Ref = Compile(networkMessage);\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return new JsonSchema\n            {\n                Type = Ref == null ? SchemaType.Null : Ref.Type,\n                Items = Ref?.Items,\n                Definitions = Definitions,\n                Reference = Ref?.Reference\n            }.ToJsonString();\n        }\n\n        /// <summary>\n        /// Compile the schema for the data sets\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        /// <returns></returns>\n        private JsonSchema? Compile(PublishedNetworkMessageSchemaModel networkMessage)\n        {\n            var dataSetMessages = networkMessage.DataSetMessages;\n            var networkMessageContentFlags = networkMessage.NetworkMessageContentFlags\n                ?? PubSubMessage.DefaultNetworkMessageContentFlags;\n            var MonitoredItemMessage = networkMessageContentFlags\n                .HasFlag(NetworkMessageContentFlags.MonitoredItemMessage);\n            if (MonitoredItemMessage)\n            {\n                networkMessageContentFlags &= ~NetworkMessageContentFlags.NetworkMessageHeader;\n            }\n\n            var dataSetSchemas = dataSetMessages\n                .Where(dataSet => dataSet != null)\n                .Select(dataSet => GetSchema(dataSet!, networkMessageContentFlags))\n                .Where(r => r != null)\n                .ToList();\n\n            if (dataSetSchemas.Count == 0)\n            {\n                return null;\n            }\n\n            if (MonitoredItemMessage)\n            {\n                return CollapseUnions(dataSetSchemas);\n            }\n\n            var dataSetMessageSchemas = dataSetSchemas.Count > 1 ?\n                dataSetSchemas.AsUnion(Definitions,\n                    id: _options.GetSchemaId(MakeUnique(\"DataSets\"))) :\n                dataSetSchemas[0];\n\n            var HasSingleDataSetMessage = networkMessageContentFlags\n                .HasFlag(NetworkMessageContentFlags.SingleDataSetMessage);\n            var payloadType = HasSingleDataSetMessage ?\n                dataSetMessageSchemas : dataSetMessageSchemas.AsArray();\n            if ((networkMessageContentFlags &\n                ~(NetworkMessageContentFlags.SingleDataSetMessage |\n                  NetworkMessageContentFlags.DataSetMessageHeader |\n                  NetworkMessageContentFlags.MonitoredItemMessage)) == 0u)\n            {\n                // No network message header\n                return payloadType;\n            }\n\n            var encoding = new JsonBuiltInSchemas(true, false, Definitions);\n            var properties = new Dictionary<string, JsonSchema>\n            {\n                [nameof(PubSub.JsonNetworkMessage.MessageId)] =\n                    encoding.GetSchemaForBuiltInType(BuiltInType.String),\n                [nameof(PubSub.JsonNetworkMessage.MessageType)] =\n                    encoding.GetSchemaForBuiltInType(BuiltInType.String)\n            };\n\n            if (networkMessageContentFlags.HasFlag(NetworkMessageContentFlags.PublisherId))\n            {\n                properties.Add(nameof(PubSub.JsonNetworkMessage.PublisherId),\n                    encoding.GetSchemaForBuiltInType(BuiltInType.String));\n            }\n            if (networkMessageContentFlags.HasFlag(NetworkMessageContentFlags.DataSetClassId))\n            {\n                properties.Add(nameof(PubSub.JsonNetworkMessage.DataSetClassId),\n                    encoding.GetSchemaForBuiltInType(BuiltInType.Guid));\n            }\n\n            properties.Add(nameof(PubSub.JsonNetworkMessage.DataSetWriterGroup),\n                encoding.GetSchemaForBuiltInType(BuiltInType.String));\n\n            // Now write messages - this is either one of or array of one of\n            properties.Add(nameof(PubSub.JsonNetworkMessage.Messages), payloadType);\n\n            var messageSchema = Definitions.Reference(_options.GetSchemaId(Name),\n                id => new JsonSchema\n                {\n                    Id = id,\n                    Type = Ref == null ? SchemaType.Null : SchemaType.None,\n                    AdditionalProperties = new JsonSchema { Allowed = false },\n                    Properties = properties,\n                    Required = properties.Keys.ToList()\n                });\n\n            if (networkMessageContentFlags\n                .HasFlag(NetworkMessageContentFlags.UseArrayEnvelope))\n            {\n                return messageSchema.AsArray(BaseNetworkMessage.MessageTypeName + \"s\");\n            }\n            return messageSchema;\n        }\n\n        /// <summary>\n        /// Collapse the unions into one\n        /// </summary>\n        /// <param name=\"dataSets\"></param>\n        /// <returns></returns>\n        private JsonSchema CollapseUnions(List<JsonSchema> dataSets)\n        {\n            // Collapse all unions into one\n            var messages = new List<JsonSchema>();\n            foreach (var dataSet in dataSets)\n            {\n                if (dataSet.OneOf == null)\n                {\n                    messages.Add(dataSet);\n                    continue;\n                }\n                // Remove dataset schema from definitions\n                messages.AddRange(dataSet.OneOf);\n                if (dataSet.Reference?.Fragment != null)\n                {\n                    Definitions.Remove(dataSet.Reference.Fragment);\n                }\n            }\n            return messages.AsUnion(Definitions, id: _options.GetSchemaId(\n                MakeUnique(nameof(MonitoredItemMessage) + \"s\")));\n        }\n\n        /// <summary>\n        /// Get data set message schema\n        /// </summary>\n        /// <param name=\"dataSetMessage\"></param>\n        /// <param name=\"networkMessageContentFlags\"></param>\n        /// <returns></returns>\n        private JsonSchema GetSchema(PublishedDataSetMessageSchemaModel dataSetMessage,\n            NetworkMessageContentFlags networkMessageContentFlags)\n        {\n            if (networkMessageContentFlags.HasFlag(NetworkMessageContentFlags.MonitoredItemMessage))\n            {\n                return new MonitoredItemMessage(dataSetMessage,\n                    networkMessageContentFlags.HasFlag(NetworkMessageContentFlags.DataSetMessageHeader),\n                    _options, Definitions, _uniqueNames).Ref!;\n            }\n            return new JsonDataSetMessage(dataSetMessage,\n                networkMessageContentFlags.HasFlag(NetworkMessageContentFlags.DataSetMessageHeader),\n                _options, Definitions, UseCompatibilityMode, _uniqueNames).Ref!;\n        }\n\n        /// <summary>\n        /// Get name of the type\n        /// </summary>\n        /// <param name=\"typeName\"></param>\n        /// <returns></returns>\n        private string GetName(string? typeName)\n        {\n            // Type name of the message record\n            typeName ??= string.Empty;\n            typeName += BaseNetworkMessage.MessageTypeName;\n            return MakeUnique(typeName);\n        }\n\n        /// <summary>\n        /// Make unique\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        private string MakeUnique(string name)\n        {\n            var uniqueName = name;\n            for (var index = 1; _uniqueNames.Contains(uniqueName); index++)\n            {\n                uniqueName = name + index;\n            }\n            _uniqueNames.Add(uniqueName);\n            return uniqueName;\n        }\n\n        private readonly SchemaOptions _options;\n        private readonly HashSet<string> _uniqueNames = [];\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonSchema.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text.Json;\n\n    /// <summary>\n    /// Json Schema object - constraints for a schema with the defined\n    /// types. see https://www.learnjsonschema.com/2020-12/\n    /// </summary>\n    public record class JsonSchema\n    {\n        /// <summary>\n        /// Allows everything, serializes to true\n        /// </summary>\n        public bool? Allowed { get; set; }\n\n        /// <summary>\n        /// The absolute id of the schema\n        /// </summary>\n        public UriOrFragment? Id { get; set; }\n\n        /// <summary>\n        /// Schema version\n        /// </summary>\n        public string? SchemaVersion { get; set; }\n\n        /// <summary>\n        /// Title annotation\n        /// </summary>\n        public string? Title { get; set; }\n\n        /// <summary>\n        /// Description annotation\n        /// </summary>\n        public string? Description { get; set; }\n\n        /// <summary>\n        /// Comment annotation\n        /// </summary>\n        public string? Comment { get; set; }\n\n        /// <summary>\n        /// Examples\n        /// </summary>\n        public IReadOnlyList<string>? Examples { get; set; }\n\n        /// <summary>\n        /// Schema types\n        /// </summary>\n        public IReadOnlyList<SchemaType> Types { get; set; }\n            = Array.Empty<SchemaType>();\n\n        /// <summary>\n        /// Enum values\n        /// </summary>\n        public IReadOnlyList<Const>? Enum { get; set; }\n\n        /// <summary>\n        /// Gets or sets the maximum valid number of properties.\n        /// </summary>\n        public int? MaxProperties { get; set; }\n\n        /// <summary>\n        /// Gets or sets the maximum valid number of properties.\n        /// </summary>\n        public int? MinProperties { get; set; }\n\n        /// <summary>\n        /// ReadOnly  annotation\n        /// </summary>\n        public bool? ReadOnly { get; set; }\n\n        /// <summary>\n        /// WriteOnly annotation\n        /// </summary>\n        public bool? WriteOnly { get; set; }\n\n        /// <summary>\n        /// The schemas for the fields of the object\n        /// </summary>\n        public IReadOnlyDictionary<string, JsonSchema>? Properties { get; set; }\n\n        /// <summary>\n        /// The schemas for the fields of the object\n        /// </summary>\n        public JsonSchema? PropertyNames { get; set; }\n\n        /// <summary>\n        /// Required properties\n        /// </summary>\n        public IReadOnlyList<string>? Required { get; set; }\n\n        /// <summary>\n        /// Required properties\n        /// </summary>\n        public IReadOnlyList<string>? Contains { get; set; }\n\n        /// <summary>\n        /// Gets or sets a dictionary that maps property names to the conditions\n        /// that an instance containing those property names must satisfy.\n        /// </summary>\n        public IReadOnlyDictionary<string, Dependency>? Dependencies { get; set; }\n\n        /// <summary>\n        /// Additional properties (allowed or schema)\n        /// </summary>\n        public JsonSchema? AdditionalProperties { get; set; }\n\n        /// <summary>\n        /// Gets or sets a set of schemas against all of which\n        /// the instance must validate successfully.\n        /// </summary>\n        public IReadOnlyList<JsonSchema>? AllOf { get; set; }\n\n        /// <summary>\n        /// Gets or sets a set of schemas against any of which\n        /// the instance must validate successfully.\n        /// </summary>\n        public IReadOnlyList<JsonSchema>? AnyOf { get; set; }\n\n        /// <summary>\n        /// Gets or sets a set of schemas against exactly one of\n        /// which the instance must validate successfully.\n        /// </summary>\n        public IReadOnlyList<JsonSchema>? OneOf { get; set; }\n\n        /// <summary>\n        /// Gets or sets a schemas against which the instance\n        /// must not validate successfully.\n        /// </summary>\n        public JsonSchema? Not { get; set; }\n\n        /// <summary>\n        /// Array items allowed\n        /// </summary>\n        public IReadOnlyList<JsonSchema>? Items { get; set; }\n\n        /// <summary>\n        /// Additional items\n        /// </summary>\n        public JsonSchema? AdditionalItems { get; set; }\n\n        /// <summary>\n        /// Gets or sets the maximum length of a string\n        /// </summary>\n        public int? MaxLength { get; set; }\n\n        /// <summary>\n        /// Gets or sets the minimum length of a string\n        /// </summary>\n        public int? MinLength { get; set; }\n\n        /// <summary>\n        /// Gets or sets the default value.\n        /// </summary>\n        public Const? Default { get; set; }\n\n        /// <summary>\n        /// Gets or sets a const value.\n        /// </summary>\n        public Const? Const { get; set; }\n\n        /// <summary>\n        /// Gets or sets a regular expression which string must match\n        /// </summary>\n        public string? Pattern { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value of which a numeric schema\n        /// instance must be a multiple.\n        /// </summary>\n        public Const? MultipleOf { get; set; }\n\n        /// <summary>\n        /// Gets or sets the maximum valid value of integer\n        /// or number schema.\n        /// </summary>\n        public Limit? Maximum { get; set; }\n\n        /// <summary>\n        /// Gets or sets the minimum valid value.\n        /// </summary>\n        public Limit? Minimum { get; set; }\n\n        /// <summary>\n        /// Gets or sets the minimum valid number of elements\n        /// in an array.\n        /// </summary>\n        public int? MinItems { get; set; }\n\n        /// <summary>\n        /// Gets or sets the maximum valid elements in an array.\n        /// </summary>\n        public int? MaxItems { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value that specifies elements must be unique.\n        /// </summary>\n        public bool? UniqueItems { get; set; }\n\n        /// <summary>\n        /// Gets or sets the URI of a schema that is incorporated\n        /// by reference into the current schema.\n        /// </summary>\n        public UriOrFragment? Reference { get; set; }\n\n        /// <summary>\n        /// Gets or sets a string specifying the required format\n        /// of a string-valued property.\n        /// </summary>\n        public string? Format { get; set; }\n\n        /// <summary>\n        /// Gets or sets a dictionary mapping schema names\n        /// to sub-schemas which can be referenced by properties\n        /// defined elsewhere in the current schema.\n        /// </summary>\n        public IReadOnlyDictionary<string, JsonSchema>? Definitions { get; set; }\n\n        /// <summary>\n        /// Get Schema type\n        /// </summary>\n        /// <returns></returns>\n        public SchemaType Type\n        {\n            get => Types?.Count > 0 ?\n                Types[0] : SchemaType.None;\n            set => Types = value == SchemaType.None ?\n                Array.Empty<SchemaType>() : [value];\n        }\n    }\n\n    /// <summary>\n    /// Represents the valid values for the \"type\" keyword in a JSON schema.\n    /// </summary>\n    public enum SchemaType\n    {\n        /// <summary>\n        /// Invalid\n        /// </summary>\n        None,\n\n#pragma warning disable CA1720 // Identifier contains type name\n        /// <summary>\n        /// Array\n        /// </summary>\n        Array,\n\n        /// <summary>\n        /// Boolean\n        /// </summary>\n        Boolean,\n\n        /// <summary>\n        /// Integer\n        /// </summary>\n        Integer,\n\n        /// <summary>\n        /// Number\n        /// </summary>\n        Number,\n\n        /// <summary>\n        /// Null\n        /// </summary>\n        Null,\n\n        /// <summary>\n        /// Object\n        /// </summary>\n        Object,\n\n        /// <summary>\n        /// String\n        /// </summary>\n        String,\n#pragma warning restore CA1720 // Identifier contains type name\n    }\n\n    /// <summary>\n    /// Const base class\n    /// </summary>\n    public abstract record Const\n    {\n        /// <summary>\n        /// Write value to writer\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        internal abstract void Write(Utf8JsonWriter writer);\n\n        /// <summary>\n        /// Create const\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static Const From<T>(T value)\n        {\n            return new Const<T>(value);\n        }\n    }\n\n    /// <summary>\n    /// Limit value\n    /// </summary>\n    /// <param name=\"Value\"></param>\n    /// <param name=\"Exclusive\"></param>\n    public record class Limit(Const Value, bool Exclusive = false)\n    {\n        /// <summary>\n        /// Create limit\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"value\"></param>\n        /// <param name=\"exclusive\"></param>\n        /// <returns></returns>\n        public static Limit From<T>(T value, bool exclusive = false)\n        {\n            return new Limit(Const.From(value), exclusive);\n        }\n    }\n\n    /// <summary>\n    /// Const value\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    /// <param name=\"Value\"></param>\n    public record class Const<T>(T Value) : Const\n    {\n        /// <inheritdoc/>\n        internal override void Write(Utf8JsonWriter writer)\n        {\n            JsonSerializer.Serialize(writer, Value);\n        }\n    }\n\n    /// <summary>\n    /// Describes that conditions that must be satisfied when an object contains\n    /// a property with the specified name.\n    /// </summary>\n    public record class Dependency\n    {\n        /// <summary>\n        /// Gets the schema against which an instance must validate successfully if it\n        /// has a property of the name associated with this dependency.\n        /// </summary>\n        public JsonSchema? SchemaDependency { get; }\n\n        /// <summary>\n        /// Gets the set of property names which an instance must also have if it has a\n        /// property of the name associated with this dependency.\n        /// </summary>\n        public IReadOnlyList<string>? PropertyDependencies { get; }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Dependency\"/> class from the\n        /// specified schema dependency.\n        /// </summary>\n        /// <param name=\"schemaDependency\">\n        /// The schema against which an instance must validate successfully if it\n        /// has a property of the name associated with this dependency.\n        /// </param>\n        public Dependency(JsonSchema schemaDependency)\n        {\n            SchemaDependency = schemaDependency;\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Dependency\"/> class from the\n        /// specified property dependencies.\n        /// </summary>\n        /// <param name=\"propertyDependencies\">\n        /// The set of property names which an instance must also have if it has a\n        /// property of the name associated with this dependency.\n        /// </param>\n        public Dependency(IList<string> propertyDependencies)\n        {\n            PropertyDependencies = propertyDependencies.ToList();\n        }\n    }\n\n    /// <summary>\n    /// Represents a value that is either a URI reference according to\n    /// RFC 2396, or a bare fragment.\n    /// </summary>\n    public record class UriOrFragment\n    {\n        /// <summary>\n        /// Value\n        /// </summary>\n        public string Fragment { get; }\n\n        /// <summary>\n        /// Value\n        /// </summary>\n        public string? Namespace { get; }\n\n        /// <summary>\n        /// Self reference\n        /// </summary>\n        public static readonly UriOrFragment Self = new(\"#\");\n\n        /// <summary>\n        /// Create a fragment\n        /// </summary>\n        /// <param name=\"fragment\"></param>\n        /// <param name=\"namespace\"></param>\n        public UriOrFragment(string fragment, string? @namespace = null)\n        {\n            Fragment = fragment;\n            Namespace = @namespace;\n        }\n\n        /// <summary>\n        /// Value\n        /// </summary>\n        public override string ToString()\n        {\n            if (Namespace != null)\n            {\n                return Namespace + \"#\" + Fragment.UrlEncode();\n            }\n            return Fragment.UrlEncode();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonSchemaExtensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n\n    /// <summary>\n    /// Extensions\n    /// </summary>\n    internal static class JsonSchemaExtensions\n    {\n        /// <summary>\n        /// Create a reference\n        /// </summary>\n        /// <param name=\"definitions\"></param>\n        /// <param name=\"id\"></param>\n        /// <param name=\"schema\"></param>\n        /// <returns></returns>\n        public static JsonSchema Reference(this Dictionary<string, JsonSchema> definitions,\n            UriOrFragment id, Func<UriOrFragment, JsonSchema> schema)\n        {\n            var name = ToFragment(id);\n\n            if (!definitions.ContainsKey(name))\n            {\n                definitions.Add(name, schema(id));\n            }\n            return new JsonSchema\n            {\n                Reference = new UriOrFragment(name)\n            };\n        }\n\n        /// <summary>\n        /// Convert to fragment\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public static string ToFragment(this UriOrFragment id)\n        {\n            if (id.Namespace == null)\n            {\n                return id.Fragment;\n            }\n            return SchemaUtils.NamespaceUriToNamespace(id.Namespace)\n                + \".\" + SchemaUtils.Escape(id.Fragment);\n        }\n\n        /// <summary>\n        /// Make union type from schemas\n        /// </summary>\n        /// <param name=\"schemas\"></param>\n        /// <param name=\"definitions\"></param>\n        /// <param name=\"title\"></param>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public static JsonSchema AsUnion(this IEnumerable<JsonSchema> schemas,\n            Dictionary<string, JsonSchema> definitions, string? title = null,\n            UriOrFragment? id = null)\n        {\n            var s = schemas.ToList();\n            if (s.Count == 0)\n            {\n                throw new ArgumentException(\"Union must have at least one schema\",\n                    nameof(schemas));\n            }\n            if (id == null)\n            {\n                return Create(definitions, title, s, null);\n            }\n            return definitions.Reference(id, id => Create(definitions, title, s, id));\n\n            static JsonSchema Create(Dictionary<string, JsonSchema> definitions,\n                string? title, List<JsonSchema> s, UriOrFragment? id)\n            {\n                return new JsonSchema\n                {\n                    Id = id,\n                    Title = title,\n                    Types = s\n                        .Select(s => Resolve(s, definitions).Type)\n                        .Distinct()\n                        .ToArray(),\n                    OneOf = s\n                };\n            }\n        }\n\n        /// <summary>\n        /// Make array from schema\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"title\"></param>\n        /// <returns></returns>\n        public static JsonSchema AsArray(this JsonSchema schema, string? title = null)\n        {\n            return new JsonSchema\n            {\n                Title = title,\n                Type = SchemaType.Array,\n                Items = new[] { schema }\n            };\n        }\n\n        /// <summary>\n        /// Make array from schema\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"definitions\"></param>\n        /// <returns></returns>\n        public static JsonSchema Resolve(this JsonSchema schema,\n            Dictionary<string, JsonSchema> definitions)\n        {\n            if (schema.Reference == null)\n            {\n                Debug.Assert(schema.Type != SchemaType.None);\n                return schema;\n            }\n            if (schema.Reference.Namespace == null)\n            {\n                return definitions[schema.Reference.Fragment];\n            }\n            return definitions.Values.First(d => d.Id == schema.Reference);\n        }\n\n        /// <summary>\n        /// Convert to string\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"indented\"></param>\n        /// <returns></returns>\n        public static string ToJsonString(this JsonSchema schema, bool indented = false)\n        {\n            return JsonSchemaWriter.SerializeAsString(schema, indented);\n        }\n\n        /// <summary>\n        /// Get namespace\n        /// </summary>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public static string GetNamespaceUri(this SchemaOptions options)\n        {\n            return options.Namespace ?? SchemaUtils.PublisherNamespaceUri;\n        }\n\n        /// <summary>\n        /// Create identifier of a schema in the namespace\n        /// configured in the options\n        /// </summary>\n        /// <param name=\"options\"></param>\n        /// <param name=\"fragment\"></param>\n        /// <returns></returns>\n        public static UriOrFragment GetSchemaId(this SchemaOptions options,\n            string fragment)\n        {\n            return new UriOrFragment(fragment, options.GetNamespaceUri());\n        }\n\n        /// <summary>\n        /// Create identifier of a schema\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static UriOrFragment GetSchemaId(this NodeId nodeId,\n            IServiceMessageContext context)\n        {\n            return nodeId.AsString(context, NamespaceFormat.Uri).GetSchemaId(context);\n        }\n\n        /// <summary>\n        /// Create identifier of a schema\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static UriOrFragment GetSchemaId(this string? nodeId,\n            IServiceMessageContext context)\n        {\n            var (ns, n) = SchemaUtils.SplitNodeId(nodeId, context, false);\n            return new UriOrFragment(n, ns);\n        }\n\n        /// <summary>\n        /// Get schema id from a node with a display name as name\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static UriOrFragment GetSchemaId(this string? nodeId, string name,\n            IServiceMessageContext context)\n        {\n            var qn = name.ToQualifiedName(context);\n            var ns = qn.NamespaceIndex != 0 ?\n                context.NamespaceUris.GetString(qn.NamespaceIndex) :\n                SchemaUtils.SplitNodeId(nodeId, context, false).Namespace;\n            return new UriOrFragment(qn.Name, ns);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonSchemaVersion.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    /// <summary>\n    /// Versions\n    /// </summary>\n    public static class JsonSchemaVersion\n    {\n        /// <summary>\n        /// http://json-schema.org/draft-04/schema#\n        /// </summary>\n        public const string Draft4 = \"http://json-schema.org/draft-04/schema#\";\n\n        /// <summary>\n        /// http://json-schema.org/draft-06/schema#\n        /// </summary>\n        public const string Draft6 = \"http://json-schema.org/draft-06/schema#\";\n\n        /// <summary>\n        /// http://json-schema.org/draft-07/schema#\n        /// </summary>\n        public const string Draft7 = \"http://json-schema.org/draft-07/schema#\";\n\n        /// <summary>\n        /// http://json-schema.org/draft/2020-12/schema#\"\n        /// </summary>\n        public const string Draft202012 = \"http://json-schema.org/draft/2020-12/schema#\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonSchemaVocabulary.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using System;\n\n    /// <summary>\n    /// Schema vocabulary\n    /// </summary>\n    internal static class JsonSchemaVocabulary\n    {\n        public static ReadOnlySpan<byte> Schema => \"$schema\"u8;\n        public static ReadOnlySpan<byte> Id => \"$id\"u8;\n        public static ReadOnlySpan<byte> IdPreDraft6 => \"id\"u8;\n        public static ReadOnlySpan<byte> Defs => \"$defs\"u8;\n        public static ReadOnlySpan<byte> Definitions => \"definitions\"u8;\n        public static ReadOnlySpan<byte> Ref => \"$ref\"u8;\n        public static ReadOnlySpan<byte> Title => \"title\"u8;\n        public static ReadOnlySpan<byte> Type => \"type\"u8;\n        public static ReadOnlySpan<byte> Enum => \"enum\"u8;\n        public static ReadOnlySpan<byte> Description => \"description\"u8;\n        public static ReadOnlySpan<byte> Examples => \"examples\"u8;\n        public static ReadOnlySpan<byte> Comment => \"$comment\"u8;\n        public static ReadOnlySpan<byte> Items => \"items\"u8;\n        public static ReadOnlySpan<byte> Format => \"format\"u8;\n        public static ReadOnlySpan<byte> Const => \"const\"u8;\n        public static ReadOnlySpan<byte> ReadOnly => \"readOnly\"u8;\n        public static ReadOnlySpan<byte> WriteOnly => \"writeOnly\"u8;\n        public static ReadOnlySpan<byte> Default => \"default\"u8;\n        public static ReadOnlySpan<byte> Minimum => \"minimum\"u8;\n        public static ReadOnlySpan<byte> Maximum => \"maximum\"u8;\n        public static ReadOnlySpan<byte> MultipleOf => \"multipleOf\"u8;\n        public static ReadOnlySpan<byte> ExclusiveMinimum => \"exclusiveMinimum\"u8;\n        public static ReadOnlySpan<byte> ExclusiveMaximum => \"exclusiveMaximum\"u8;\n        public static ReadOnlySpan<byte> Required => \"required\"u8;\n        public static ReadOnlySpan<byte> Properties => \"properties\"u8;\n        public static ReadOnlySpan<byte> MinProperties => \"minProperties\"u8;\n        public static ReadOnlySpan<byte> MaxProperties => \"maxProperties\"u8;\n        public static ReadOnlySpan<byte> Dependencies => \"dependencies\"u8;\n        public static ReadOnlySpan<byte> PropertyNames => \"propertyNames\"u8;\n        public static ReadOnlySpan<byte> AdditionalProperties => \"additionalProperties\"u8;\n        public static ReadOnlySpan<byte> MinLength => \"minLength\"u8;\n        public static ReadOnlySpan<byte> MaxLength => \"maxLength\"u8;\n        public static ReadOnlySpan<byte> MinItems => \"minItems\"u8;\n        public static ReadOnlySpan<byte> MaxItems => \"maxItems\"u8;\n        public static ReadOnlySpan<byte> UniqueItems => \"uniqueItems\"u8;\n        public static ReadOnlySpan<byte> AdditionalItems => \"additionalItems\"u8;\n        public static ReadOnlySpan<byte> Contains => \"contains\"u8;\n        public static ReadOnlySpan<byte> AllOf => \"allOf\"u8;\n        public static ReadOnlySpan<byte> OneOf => \"oneOf\"u8;\n        public static ReadOnlySpan<byte> AnyOf => \"anyOf\"u8;\n        public static ReadOnlySpan<byte> Not => \"not\"u8;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/JsonSchemaWriter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Text.Json;\n\n    /// <summary>\n    /// Json Schema writer\n    /// </summary>\n    public sealed class JsonSchemaWriter : IDisposable\n    {\n        /// <summary>\n        /// Create writer\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"options\"></param>\n        public JsonSchemaWriter(Stream stream, JsonWriterOptions options)\n        {\n            _writer = new Utf8JsonWriter(stream, options);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _writer.Dispose();\n        }\n\n        /// <summary>\n        /// Convert to string\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"indented\"></param>\n        /// <returns></returns>\n        public static string SerializeAsString(JsonSchema schema, bool indented = false)\n        {\n            schema.SchemaVersion ??= JsonSchemaVersion.Draft7;\n\n            using var stream = new MemoryStream();\n            using (var writer = new JsonSchemaWriter(stream, new JsonWriterOptions { Indented = indented }))\n            {\n                writer.Write(schema);\n            }\n            return Encoding.UTF8.GetString(stream.ToArray());\n        }\n\n        /// <summary>\n        /// Write schema\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        public void Write(JsonSchema schema)\n        {\n            Write(schema, Current != JsonSchemaVersion.Draft4);\n        }\n\n        /// <summary>\n        /// Write schema\n        /// </summary>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"allowTrueSchema\"></param>\n        private void Write(JsonSchema schema, bool allowTrueSchema)\n        {\n            if (schema.Allowed != null && allowTrueSchema) // TODO: should we throw here?\n            {\n                // From draft6 on\n                //\n                // booleans as schemas\tallowable anywhere, not just\n                // \"additionalProperties\" and \"additionalItems\"\ttrue is\n                // equivalent to {}, false is equivalent to {\"not\": {}},\n                // but the intent is more clear and implementations can\n                // optimize these cases more easily\n                //\n                _writer.WriteBooleanValue(schema.Allowed.Value);\n                return;\n            }\n\n            _writer.WriteStartObject();\n            var pop = false;\n            if (schema.SchemaVersion != null && Current != schema.SchemaVersion)\n            {\n                _schemaVersion.Push(schema.SchemaVersion!);\n                _writer.WriteString(JsonSchemaVocabulary.Schema, schema.SchemaVersion);\n                pop = true;\n            }\n            try\n            {\n                try\n                {\n                    if (schema.Reference != null)\n                    {\n                        // Write the reference\n                        Write(JsonSchemaVocabulary.Ref, schema.Reference);\n                        return;\n                    }\n\n                    if (schema.Id != null)\n                    {\n                        Write(Current != JsonSchemaVersion.Draft4\n                            ? JsonSchemaVocabulary.Id : JsonSchemaVocabulary.IdPreDraft6,\n                            schema.Id);\n                    }\n\n                    Write(JsonSchemaVocabulary.Title, schema.Title);\n                    Write(JsonSchemaVocabulary.Description, schema.Description);\n                    if (Current != JsonSchemaVersion.Draft4)\n                    {\n                        Write(JsonSchemaVocabulary.Examples, schema.Examples);\n                        if (Current != JsonSchemaVersion.Draft6)\n                        {\n                            Write(JsonSchemaVocabulary.Comment, schema.Comment);\n                        }\n                    }\n\n                    Write(JsonSchemaVocabulary.Type, schema.Types);\n\n                    Write(JsonSchemaVocabulary.Enum, schema.Enum);\n\n                    Write(JsonSchemaVocabulary.Items, schema.Items, true);\n                    Write(JsonSchemaVocabulary.MinItems, schema.MinItems);\n                    Write(JsonSchemaVocabulary.MaxItems, schema.MaxItems);\n                    Write(JsonSchemaVocabulary.UniqueItems, schema.UniqueItems);\n                    Write(JsonSchemaVocabulary.AdditionalItems, schema.AdditionalItems, true);\n                    if (Current != JsonSchemaVersion.Draft4)\n                    {\n                        Write(JsonSchemaVocabulary.Contains, schema.Contains);\n                    }\n                    Write(JsonSchemaVocabulary.AllOf, schema.AllOf);\n                    Write(JsonSchemaVocabulary.OneOf, schema.OneOf);\n                    Write(JsonSchemaVocabulary.AnyOf, schema.AnyOf);\n                    Write(JsonSchemaVocabulary.Not, schema.Not, Current != JsonSchemaVersion.Draft4);\n\n                    Write(JsonSchemaVocabulary.Properties, schema.Properties);\n                    Write(JsonSchemaVocabulary.MinProperties, schema.MinProperties);\n                    Write(JsonSchemaVocabulary.MaxProperties, schema.MaxProperties);\n                    Write(JsonSchemaVocabulary.Required, schema.Required);\n                    Write(JsonSchemaVocabulary.AdditionalProperties, schema.AdditionalProperties, true);\n                    Write(JsonSchemaVocabulary.Dependencies, schema.Dependencies);\n                    if (Current != JsonSchemaVersion.Draft4)\n                    {\n                        Write(JsonSchemaVocabulary.PropertyNames, schema.PropertyNames, true);\n                    }\n\n                    Write(JsonSchemaVocabulary.Minimum, schema.Minimum);\n                    Write(JsonSchemaVocabulary.Maximum, schema.Maximum);\n                    Write(JsonSchemaVocabulary.Default, schema.Default);\n                    Write(JsonSchemaVocabulary.Format, schema.Format);\n                    Write(JsonSchemaVocabulary.MultipleOf, schema.MultipleOf);\n                    if (Current != JsonSchemaVersion.Draft4)\n                    {\n                        Write(JsonSchemaVocabulary.Const, schema.Const);\n                        if (Current != JsonSchemaVersion.Draft6)\n                        {\n                            if (schema.ReadOnly.HasValue)\n                            {\n                                Write(JsonSchemaVocabulary.ReadOnly, schema.ReadOnly);\n                            }\n                            else\n                            {\n                                Write(JsonSchemaVocabulary.WriteOnly, schema.WriteOnly);\n                            }\n                        }\n                    }\n\n                    Write(JsonSchemaVocabulary.MinLength, schema.MinLength);\n                    Write(JsonSchemaVocabulary.MaxLength, schema.MaxLength);\n                }\n                finally\n                {\n                    Write(Current != JsonSchemaVersion.Draft202012 ?\n                        JsonSchemaVocabulary.Definitions :\n                        JsonSchemaVocabulary.Defs, schema.Definitions);\n                }\n            }\n            finally\n            {\n                _writer.WriteEndObject();\n                if (pop)\n                {\n                    _schemaVersion.Pop();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Write schema\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"schema\"></param>\n        private void Write(ReadOnlySpan<char> name, JsonSchema schema)\n        {\n            if (name.Length != 0)\n            {\n                _writer.WritePropertyName(name);\n            }\n            Write(schema);\n        }\n\n        /// <summary>\n        /// Write schema\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"schema\"></param>\n        /// <param name=\"allowTrueSchema\"></param>\n        private void Write(ReadOnlySpan<byte> name, JsonSchema? schema,\n            bool allowTrueSchema)\n        {\n            if (schema == null)\n            {\n                return;\n            }\n            if (name.Length != 0)\n            {\n                _writer.WritePropertyName(name);\n            }\n            Write(schema, allowTrueSchema);\n        }\n\n        /// <summary>\n        /// Write schemas\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"schemas\"></param>\n        private void Write(ReadOnlySpan<byte> name,\n            IReadOnlyDictionary<string, JsonSchema>? schemas)\n        {\n            if (schemas == null || schemas.Count == 0)\n            {\n                return;\n            }\n            if (name.Length != 0)\n            {\n                _writer.WritePropertyName(name);\n            }\n            _writer.WriteStartObject();\n            try\n            {\n                foreach (var kv in schemas)\n                {\n                    Write(kv.Key, kv.Value);\n                }\n            }\n            finally\n            {\n                _writer.WriteEndObject();\n            }\n        }\n\n        /// <summary>\n        /// Write schemas\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"schemas\"></param>\n        /// <param name=\"allowSingleItem\"></param>\n        private void Write(ReadOnlySpan<byte> name,\n            IReadOnlyList<JsonSchema>? schemas, bool allowSingleItem = false)\n        {\n            if (schemas == null)\n            {\n                return;\n            }\n            if (name.Length != 0)\n            {\n                _writer.WritePropertyName(name);\n            }\n            if (schemas.Count == 1 && allowSingleItem)\n            {\n                Write(schemas[0], Current != JsonSchemaVersion.Draft4);\n                return;\n            }\n\n            _writer.WriteStartArray();\n            try\n            {\n                foreach (var schema in schemas)\n                {\n                    Write(schema);\n                }\n            }\n            finally\n            {\n                _writer.WriteEndArray();\n            }\n        }\n\n        /// <summary>\n        /// Write limit\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"limit\"></param>\n        private void Write(ReadOnlySpan<byte> name, Limit? limit)\n        {\n            if (limit == null)\n            {\n                return;\n            }\n            if (limit.Exclusive)\n            {\n                if (name.SequenceCompareTo(JsonSchemaVocabulary.Minimum) == 0)\n                {\n                    if (Current != JsonSchemaVersion.Draft4)\n                    {\n                        name = JsonSchemaVocabulary.ExclusiveMinimum;\n                    }\n                    else\n                    {\n                        Write(JsonSchemaVocabulary.ExclusiveMinimum, limit.Exclusive);\n                    }\n                }\n                else if (name.SequenceCompareTo(JsonSchemaVocabulary.Maximum) == 0)\n                {\n                    if (Current != JsonSchemaVersion.Draft4)\n                    {\n                        name = JsonSchemaVocabulary.ExclusiveMaximum;\n                    }\n                    else\n                    {\n                        Write(JsonSchemaVocabulary.ExclusiveMaximum, limit.Exclusive);\n                    }\n                }\n            }\n            Write(name, limit.Value);\n        }\n\n        /// <summary>\n        /// Write const\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"constValue\"></param>\n        private void Write(ReadOnlySpan<byte> name, Const? constValue)\n        {\n            if (constValue == null)\n            {\n                return;\n            }\n            if (name.Length != 0)\n            {\n                _writer.WritePropertyName(name);\n            }\n            constValue.Write(_writer);\n        }\n\n        /// <summary>\n        /// Write enum\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"constValues\"></param>\n        private void Write(ReadOnlySpan<byte> name, IReadOnlyList<Const>? constValues)\n        {\n            if (constValues == null)\n            {\n                return;\n            }\n            if (name.Length != 0)\n            {\n                _writer.WritePropertyName(name);\n            }\n            _writer.WriteStartArray();\n            foreach (var constValue in constValues)\n            {\n                constValue.Write(_writer);\n            }\n            _writer.WriteEndArray();\n        }\n\n        /// <summary>\n        /// Write uri or fragment\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"uriOrFragment\"></param>\n        private void Write(ReadOnlySpan<byte> name, UriOrFragment? uriOrFragment)\n        {\n            if (uriOrFragment == null)\n            {\n                return;\n            }\n            if (uriOrFragment.Fragment == \"#\")\n            {\n                _writer.WriteString(name, \"#\");\n            }\n            else if (uriOrFragment.Namespace != null)\n            {\n                _writer.WriteString(name, uriOrFragment.ToString());\n            }\n            else if (Current != JsonSchemaVersion.Draft202012)\n            {\n                _writer.WriteString(name, \"#/definitions/\" + uriOrFragment.Fragment);\n            }\n            else\n            {\n                _writer.WriteString(name, \"#/$defs/\" + uriOrFragment.Fragment);\n            }\n        }\n\n        /// <summary>\n        /// Write dependencies\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dependencies\"></param>\n        private void Write(ReadOnlySpan<byte> name,\n            IReadOnlyDictionary<string, Dependency>? dependencies)\n        {\n            if (dependencies == null || dependencies.Count == 0) // Draft6 allows empty array\n            {\n                return;\n            }\n            _writer.WritePropertyName(name);\n            _writer.WriteStartObject();\n            foreach (var kv in dependencies)\n            {\n                Write(kv.Key, kv.Value);\n            }\n            _writer.WriteEndObject();\n        }\n\n        /// <summary>\n        /// Write dependency\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dependency\"></param>\n        private void Write(ReadOnlySpan<char> name, Dependency dependency)\n        {\n            _writer.WritePropertyName(name);\n\n            if (dependency.SchemaDependency != null)\n            {\n                Write(dependency.SchemaDependency);\n            }\n            else if (dependency.PropertyDependencies != null)\n            {\n                _writer.WriteStartArray();\n                foreach (var arrayElement in dependency.PropertyDependencies)\n                {\n                    _writer.WriteStringValue(arrayElement);\n                }\n                _writer.WriteEndArray();\n            }\n        }\n\n        /// <summary>\n        /// Write schema types\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"schemaType\"></param>\n        private void Write(ReadOnlySpan<byte> name, IReadOnlyList<SchemaType>? schemaType)\n        {\n            if (schemaType == null)\n            {\n                return;\n            }\n#pragma warning disable CA1308 // Normalize strings to uppercase\n            var types = schemaType.Select(st => st.ToString().ToLowerInvariant()).ToArray();\n#pragma warning restore CA1308 // Normalize strings to uppercase\n            if (types.Length == 1)\n            {\n                _writer.WriteString(name, types[0]);\n                return;\n            }\n\n            if (name.Length > 0)\n            {\n                _writer.WritePropertyName(name);\n            }\n            _writer.WriteStartArray();\n            foreach (var type in types)\n            {\n                _writer.WriteStringValue(type);\n            }\n            _writer.WriteEndArray();\n        }\n\n        /// <summary>\n        /// Write value\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"value\"></param>\n        private void Write(ReadOnlySpan<byte> name, string? value)\n        {\n            if (value == null)\n            {\n                return;\n            }\n            _writer.WriteString(name, value);\n        }\n\n        /// <summary>\n        /// Write values\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"values\"></param>\n        private void Write(ReadOnlySpan<byte> name, IReadOnlyList<string>? values)\n        {\n            if (values == null || values.Count == 0) // Draft8 allows empty array\n            {\n                return;\n            }\n            if (name.Length > 0)\n            {\n                _writer.WritePropertyName(name);\n            }\n            _writer.WriteStartArray();\n            foreach (var type in values)\n            {\n                _writer.WriteStringValue(type);\n            }\n            _writer.WriteEndArray();\n        }\n\n        /// <summary>\n        /// Write value\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"value\"></param>\n        private void Write(ReadOnlySpan<byte> name, int? value)\n        {\n            if (value == null)\n            {\n                return;\n            }\n            _writer.WriteNumber(name, value.Value);\n        }\n\n        /// <summary>\n        /// Write value\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"value\"></param>\n        private void Write(ReadOnlySpan<byte> name, bool? value)\n        {\n            if (value == null)\n            {\n                return;\n            }\n            _writer.WriteBoolean(name, value.Value);\n        }\n\n        private string Current => _schemaVersion.Count == 0\n            ? string.Empty : _schemaVersion.Peek();\n        private readonly Stack<string> _schemaVersion = new();\n        private readonly Utf8JsonWriter _writer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Json/MonitoredItemMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Json\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Monitored item message json schema\n    /// </summary>\n    public sealed class MonitoredItemMessage : IEventSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.Json;\n\n        /// <inheritdoc/>\n        public string Name { get; }\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        string IEventSchema.Schema => ToString()!;\n\n        /// <summary>\n        /// Schema reference\n        /// </summary>\n        public JsonSchema? Ref { get; }\n\n        /// <summary>\n        /// Definitions\n        /// </summary>\n        internal Dictionary<string, JsonSchema> Definitions { get; }\n\n        /// <summary>\n        /// Get json schema for monitored item message\n        /// </summary>\n        /// <param name=\"dataSetMessage\"></param>\n        /// <param name=\"withDataSetMessageHeader\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"definitions\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        internal MonitoredItemMessage(PublishedDataSetMessageSchemaModel dataSetMessage,\n            bool withDataSetMessageHeader, SchemaOptions options,\n            Dictionary<string, JsonSchema> definitions, HashSet<string> uniqueNames)\n        {\n            _options = options;\n            _withDataSetMessageHeader = withDataSetMessageHeader;\n            _dataSet = new JsonDataSet(dataSetMessage.Id, dataSetMessage.MetaData,\n                dataSetMessage.DataSetFieldContentFlags, options, definitions, uniqueNames);\n            Definitions = definitions ?? [];\n            Id = dataSetMessage.Id;\n            Name = GetName(dataSetMessage.TypeName, uniqueNames);\n            _dataSetFieldContentMask = dataSetMessage.DataSetFieldContentFlags\n                    ?? PubSubMessage.DefaultDataSetFieldContentFlags;\n            Ref = Compile(dataSetMessage.TypeName, dataSetMessage.DataSetMessageContentFlags\n                    ?? PubSubMessage.DefaultDataSetMessageContentFlags, uniqueNames);\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return new JsonSchema\n            {\n                Type = Ref == null ? SchemaType.Null : SchemaType.None,\n                Definitions = Definitions,\n                Reference = Ref?.Reference\n            }.ToJsonString();\n        }\n\n        /// <summary>\n        /// Compile the message schemas into a union of messages\n        /// </summary>\n        /// <param name=\"typeName\"></param>\n        /// <param name=\"dataSetContentMask\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        private JsonSchema? Compile(string? typeName,\n            DataSetMessageContentFlags dataSetContentMask, HashSet<string> uniqueNames)\n        {\n            // TODO: Events are encoded as dictionary, not single values\n\n            if (_dataSet.Ref?.Reference?.Fragment == null)\n            {\n                return null;\n            }\n            // Resolve the data set schema\n            var dataSetSchema = _dataSet.Ref.Resolve(_dataSet.Definitions);\n            if (dataSetSchema?.Properties == null)\n            {\n                return null;\n            }\n            // Remove dataset schema from definitions\n            _dataSet.Definitions.Remove(_dataSet.Ref.Reference.Fragment);\n\n            // For each value in the data set, compile a message from it\n            var items = new List<JsonSchema>();\n            foreach (var property in dataSetSchema.Properties)\n            {\n                var name = GetName(typeName, uniqueNames);\n                var valueSchema = Compile(name, dataSetContentMask, property.Value);\n                if (valueSchema != null)\n                {\n                    items.Add(valueSchema);\n                }\n            }\n            return items.AsUnion(_dataSet.Definitions, Name);\n        }\n\n        /// <summary>\n        /// Compile the message schema for the value\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataSetMessageContentMask\"></param>\n        /// <param name=\"valueSchema\"></param>\n        /// <returns></returns>\n        private JsonSchema? Compile(string name, DataSetMessageContentFlags dataSetMessageContentMask,\n            JsonSchema valueSchema)\n        {\n            var encoding = new JsonBuiltInSchemas(true, true, Definitions);\n            var properties = new Dictionary<string, JsonSchema>();\n\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.NodeId))\n            {\n                properties.Add(nameof(PubSub.MonitoredItemMessage.NodeId),\n                   encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String));\n            }\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.EndpointUrl))\n            {\n                properties.Add(nameof(PubSub.MonitoredItemMessage.EndpointUrl),\n                    encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String));\n            }\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ApplicationUri))\n            {\n                properties.Add(nameof(PubSub.MonitoredItemMessage.ApplicationUri),\n                    encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String));\n            }\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.DisplayName))\n            {\n                properties.Add(nameof(PubSub.MonitoredItemMessage.DisplayName),\n                    encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String));\n            }\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Timestamp))\n            {\n                properties.Add(nameof(PubSub.MonitoredItemMessage.Timestamp),\n                    encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.DateTime));\n            }\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.Status))\n            {\n                properties.Add(nameof(PubSub.MonitoredItemMessage.Status),\n                    encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.String));\n            }\n\n            properties.Add(nameof(PubSub.MonitoredItemMessage.Value), valueSchema);\n\n            if (dataSetMessageContentMask.HasFlag(DataSetMessageContentFlags.SequenceNumber))\n            {\n                properties.Add(nameof(PubSub.MonitoredItemMessage.SequenceNumber),\n                    encoding.GetSchemaForBuiltInType(Opc.Ua.BuiltInType.UInt32));\n            }\n            if (_dataSetFieldContentMask.HasFlag(DataSetFieldContentFlags.ExtensionFields))\n            {\n                properties.Add(nameof(PubSub.MonitoredItemMessage.ExtensionFields), new JsonSchema\n                {\n                    Type = SchemaType.Object,\n                    AdditionalProperties = new JsonSchema { Allowed = true }\n                });\n            }\n            return Definitions.Reference(_options.GetSchemaId(name), id => new JsonSchema\n            {\n                Id = id,\n                Type = SchemaType.Object,\n                AdditionalProperties = new JsonSchema { Allowed = false },\n                Properties = properties\n            });\n        }\n\n        /// <summary>\n        /// Get name of the type\n        /// </summary>\n        /// <param name=\"typeName\"></param>\n        /// <param name=\"uniqueNames\"></param>\n        /// <returns></returns>\n        private static string GetName(string? typeName, HashSet<string>? uniqueNames)\n        {\n            // Type name of the message record\n            typeName ??= string.Empty;\n            typeName += nameof(PubSub.MonitoredItemMessage);\n            if (uniqueNames != null)\n            {\n                var uniqueName = typeName;\n                for (var index = 1; uniqueNames.Contains(uniqueName); index++)\n                {\n                    uniqueName = typeName + index;\n                }\n                uniqueNames.Add(uniqueName);\n                typeName = uniqueName;\n            }\n            return typeName;\n        }\n\n        private readonly DataSetFieldContentFlags _dataSetFieldContentMask;\n        private readonly SchemaOptions _options;\n        private readonly bool _withDataSetMessageHeader;\n        private readonly JsonDataSet _dataSet;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/SchemaOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    /// <summary>\n    /// Options for the schema generation\n    /// </summary>\n    public record class SchemaOptions\n    {\n        /// <summary>\n        /// Namespace to use as root for the schema\n        /// </summary>\n        public string? Namespace { get; set; }\n\n        /// <summary>\n        /// Prefer generating avro schema over json schema\n        /// </summary>\n        public bool? PreferAvroOverJsonSchema { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/SchemaRank.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    /// <summary>\n    /// Schema rank\n    /// </summary>\n    public enum SchemaRank\n    {\n        /// <summary>\n        /// Schema is scalar\n        /// </summary>\n        Scalar = 0,\n\n        /// <summary>\n        /// Schema is array\n        /// </summary>\n        Collection = 1,\n\n        /// <summary>\n        /// Schema is matrix\n        /// </summary>\n        Matrix = 2,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/SchemaUtils.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text.RegularExpressions;\n\n    /// <summary>\n    /// Schema utils\n    /// </summary>\n    internal static partial class SchemaUtils\n    {\n        /// <summary>\n        /// Namespace zero\n        /// </summary>\n        public const string NamespaceZeroName = \"org.opcfoundation.UA\";\n\n        /// <summary>\n        /// Publisher namespace\n        /// </summary>\n        public const string PublisherNamespace = \"org.github.microsoft.opc.publisher\";\n\n        /// <summary>\n        /// Publisher namespace uri\n        /// </summary>\n        public const string PublisherNamespaceUri = \"http://github.org/microsoft/opcpublisher\";\n\n        /// <summary>\n        /// Safely Convert a uri to a namespace\n        /// </summary>\n        /// <param name=\"ns\"></param>\n        /// <returns></returns>\n        public static string NamespaceUriToNamespace(string ns)\n        {\n            if (Uri.TryCreate(ns, new UriCreationOptions\n            {\n                DangerousDisablePathAndQueryCanonicalization = false\n            }, out var result))\n            {\n#pragma warning disable CA1308 // Normalize strings to uppercase\n                return result.Host.Split('.', StringSplitOptions.RemoveEmptyEntries)\n                    .Reverse()\n                    .Where(c => c != \"www\")\n                    .Select(s => s.ToLowerInvariant())\n                    .Concat(result.AbsolutePath.Split('/',\n                        StringSplitOptions.RemoveEmptyEntries))\n                    .Select(Escape)\n                    .Aggregate((a, b) => $\"{a}.{b}\");\n#pragma warning restore CA1308 // Normalize strings to uppercase\n            }\n            else\n            {\n                return ns.Split('/', StringSplitOptions.RemoveEmptyEntries)\n                    .Select(Escape)\n                    .Aggregate((a, b) => $\"{a}.{b}\");\n            }\n        }\n\n        /// <summary>\n        /// Get schema rank\n        /// </summary>\n        /// <param name=\"valueRank\"></param>\n        /// <returns></returns>\n        public static SchemaRank GetRank(int valueRank)\n        {\n            switch (valueRank)\n            {\n                case ValueRanks.Scalar:\n                    return SchemaRank.Scalar;\n                case ValueRanks.OneDimension:\n                case ValueRanks.ScalarOrOneDimension:\n                    return SchemaRank.Collection;\n                default:\n                    return SchemaRank.Matrix;\n            }\n        }\n\n        /// <summary>\n        /// Find index in namespace table\n        /// </summary>\n        /// <param name=\"namespaces\"></param>\n        /// <param name=\"avroNamespace\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"namespaceUri\"></param>\n        /// <returns></returns>\n        public static bool TryFindNamespace(this NamespaceTable namespaces,\n            string avroNamespace, out uint index, out string? namespaceUri)\n        {\n            if (avroNamespace == NamespaceZeroName)\n            {\n                namespaceUri = Namespaces.OpcUa;\n                index = 0;\n                return true;\n            }\n            for (var i = 1u; i < namespaces.Count; i++)\n            {\n                namespaceUri = namespaces.GetString(i);\n                var converted = NamespaceUriToNamespace(namespaceUri);\n                if (converted == avroNamespace)\n                {\n                    index = i;\n                    return true;\n                }\n            }\n            index = 0;\n            namespaceUri = null;\n            return false;\n        }\n\n        /// <summary>\n        /// Create namespace\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"escape\"></param>\n        /// <returns></returns>\n        public static (string Namespace, string Id) SplitNodeId(string? nodeId,\n            IServiceMessageContext context, bool escape)\n        {\n            var id = nodeId.ToExpandedNodeId(context);\n            string ns;\n            if (id.NamespaceIndex == 0 && id.NamespaceUri == null)\n            {\n                ns = escape ? NamespaceZeroName : Namespaces.OpcUa;\n            }\n            else\n            {\n                ns = id.NamespaceUri;\n                if (escape)\n                {\n                    ns = NamespaceUriToNamespace(ns);\n                }\n            }\n            var c = escape ? '_' : '=';\n            var name = id.IdType switch\n            {\n                IdType.Opaque => \"b\",\n                IdType.Guid => \"g\",\n                IdType.String => \"s\",\n                _ => \"i\"\n            } + c + id.Identifier;\n            if (escape)\n            {\n                name = Escape(name);\n            }\n            return (ns, name);\n        }\n\n        /// <summary>\n        /// Create namespace\n        /// </summary>\n        /// <param name=\"qualifiedName\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"outerNamespace\"></param>\n        /// <returns></returns>\n        public static string SplitQualifiedName(string qualifiedName,\n            IServiceMessageContext context, string? outerNamespace = null)\n        {\n            var qn = qualifiedName.ToQualifiedName(context);\n            string avroStyleNamespace;\n            if (qn.NamespaceIndex == 0)\n            {\n                avroStyleNamespace = NamespaceZeroName;\n            }\n            else\n            {\n                var uri = context.NamespaceUris.GetString(qn.NamespaceIndex);\n                avroStyleNamespace = NamespaceUriToNamespace(uri);\n            }\n            var name = Escape(qn.Name);\n            if (!string.Equals(outerNamespace, avroStyleNamespace,\n                StringComparison.OrdinalIgnoreCase))\n            {\n                // Qualify if the name is in a different namespace\n                name = $\"{avroStyleNamespace}.{name}\";\n            }\n            return name;\n        }\n\n        /// <summary>\n        /// Create identifier of a schema\n        /// </summary>\n        /// <param name=\"typeId\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static string? GetFullName(this ExpandedNodeId? typeId, string name,\n            IServiceMessageContext context)\n        {\n            if (typeId == null)\n            {\n                return null;\n            }\n            if (string.IsNullOrEmpty(typeId.NamespaceUri))\n            {\n                typeId = new ExpandedNodeId(typeId.Identifier, 0, Namespaces.OpcUa, 0);\n            }\n            var typeIdString = typeId.AsString(context, NamespaceFormat.Uri);\n            var qn = name.ToQualifiedName(context);\n            var ns = qn.NamespaceIndex != 0 ?\n                context.NamespaceUris.GetString(qn.NamespaceIndex) :\n                SplitNodeId(typeIdString, context, false).Namespace;\n            return NamespaceUriToNamespace(ns) + \".\" + Escape(qn.Name);\n        }\n\n        /// <summary>\n        /// Escape a name to only contain asciinumeric and escape\n        /// underscore and other characters with _ and the\n        /// ascii code of the character.\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public static string Escape(string name)\n        {\n            return EscapeAvroRegex().Replace(name, match =>\n                $\"_x{((int)match.Value[0]).ToString(CultureInfo.InvariantCulture)}_\");\n        }\n\n        /// <summary>\n        /// Unesacpe\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public static string Unescape(string name)\n        {\n            return UnescapeAvroRegex().Replace(name, match =>\n                ((char)int.Parse(match.Groups[1].ValueSpan, CultureInfo.InvariantCulture)).ToString());\n        }\n\n        [GeneratedRegex(\"[^a-zA-Z0-9]\")]\n        private static partial Regex EscapeAvroRegex();\n\n        [GeneratedRegex(\"_x([0-9]*)_\")]\n        private static partial Regex UnescapeAvroRegex();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Schemas/Uadp/UadpNetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas.Uadp\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using System;\n    using System.Linq;\n    using System.Text.Json;\n\n    /// <summary>\n    /// Network message schema for uadp. Enables a consumer\n    /// to decode a network message using a resolver\n    /// </summary>\n    public sealed class UadpNetworkMessage : IEventSchema\n    {\n        /// <inheritdoc/>\n        public string Type => ContentMimeType.Json;\n\n        /// <inheritdoc/>\n        public string Name { get; }\n\n        /// <inheritdoc/>\n        public ulong Version { get; }\n\n        /// <inheritdoc/>\n        public string Id { get; }\n\n        /// <inheritdoc/>\n        public string Schema { get; }\n\n        /// <summary>\n        /// Get avro schema for a writer group\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        public UadpNetworkMessage(PublishedNetworkMessageSchemaModel networkMessage)\n        {\n            ArgumentNullException.ThrowIfNull(networkMessage);\n\n            Schema = JsonSerializer.Serialize(networkMessage);\n            var minor = networkMessage.DataSetMessages?\n                .Max(dataSet => dataSet?.MetaData?.MinorVersion ?? 0) ?? 0;\n            var major = networkMessage.DataSetMessages?\n                .Max(dataSet => dataSet?.MetaData?.DataSetMetaData.MajorVersion ?? 0) ?? 0;\n            Id = networkMessage.Id;\n            Version = ((ulong)major << 32) + minor;\n            Name = networkMessage.TypeName ?? string.Empty;\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return Schema;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/Utils/TypeMaps.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Utils\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Reflection;\n\n    /// <summary>\n    /// Caches constant identifier definitions of a generated type\n    /// </summary>\n    public sealed class TypeMaps\n    {\n        /// <summary>\n        /// Data types type map\n        /// </summary>\n        public static Lazy<TypeMaps> DataTypes { get; } =\n            new Lazy<TypeMaps>(() => new TypeMaps(typeof(DataTypes)), true);\n\n        /// <summary>\n        /// Reference types type map\n        /// </summary>\n        public static Lazy<TypeMaps> ReferenceTypes { get; } =\n            new Lazy<TypeMaps>(() => new TypeMaps(typeof(ReferenceTypes)), true);\n\n        /// <summary>\n        /// Object types type map\n        /// </summary>\n        public static Lazy<TypeMaps> ObjectTypes { get; } =\n            new Lazy<TypeMaps>(() => new TypeMaps(typeof(ObjectTypes)), true);\n\n        /// <summary>\n        /// Attributes type map\n        /// </summary>\n        public static Lazy<TypeMaps> Attributes { get; } =\n            new Lazy<TypeMaps>(() => new TypeMaps(typeof(Attributes)), true);\n\n        /// <summary>\n        /// Attributes type map\n        /// </summary>\n        public static Lazy<TypeMaps> StatusCodes { get; } =\n            new Lazy<TypeMaps>(() => new TypeMaps(typeof(StatusCodes)), true);\n\n        /// <summary>\n        /// Identifiers\n        /// </summary>\n        public IEnumerable<uint> Identifiers => _forward.Keys;\n\n        /// <summary>\n        /// Identifiers\n        /// </summary>\n        public IEnumerable<string> BrowseNames => _reverse.Keys;\n\n        /// <summary>\n        /// Initialize map\n        /// </summary>\n        /// <param name=\"type\"></param>\n        private TypeMaps(Type type)\n        {\n            var fields = type.GetFields(\n                BindingFlags.Public | BindingFlags.Static);\n            foreach (var field in fields)\n            {\n                try\n                {\n                    var value = (uint?)field.GetValue(type);\n                    if (value.HasValue)\n                    {\n                        _reverse.Add(field.Name, value.Value);\n                        _forward.Add(value.Value, field.Name);\n                    }\n                }\n                catch\n                {\n                    continue;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get browse name\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public bool TryGetBrowseName(uint id, [NotNullWhen(true)] out string? value)\n        {\n            if (_forward.TryGetValue(id, out value) && value != null)\n            {\n                return true;\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Get identifier\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public bool TryGetIdentifier(string value, out uint id)\n        {\n            return _reverse.TryGetValue(value, out id);\n        }\n\n        private readonly SortedDictionary<uint, string> _forward = [];\n        private readonly SortedDictionary<string, uint> _reverse = [];\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/ZipFileReader.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Text;\n\n    /// <summary>\n    /// Read zip files\n    /// </summary>\n    public sealed class ZipFileReader : IDisposable\n    {\n        /// <summary>\n        /// Read zip file\n        /// </summary>\n        /// <param name=\"fileName\"></param>\n        public ZipFileReader(string fileName)\n        {\n            if (!fileName.EndsWith(ZipFileWriter.FileSuffix,\n                StringComparison.InvariantCulture))\n            {\n                fileName += ZipFileWriter.FileSuffix;\n            }\n            fileName = fileName.SanitizeFileName();\n            var stream = new FileStream(fileName, FileMode.Open);\n            try\n            {\n                _zip = new ZipArchive(stream, ZipArchiveMode.Read, false);\n            }\n            catch (Exception ex)\n            {\n                stream.Dispose();\n                throw new FormatException(\"Bad zip file\", ex);\n            }\n            try\n            {\n                _schema = ReadHeader(out _contentType);\n                _suffix = ZipFileWriter.Suffix(_contentType);\n            }\n            catch\n            {\n                _zip.Dispose();\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Read from stream\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        public ZipFileReader(Stream stream)\n        {\n            try\n            {\n                _zip = new ZipArchive(stream, ZipArchiveMode.Read, false);\n            }\n            catch (Exception ex)\n            {\n                throw new FormatException(\"Bad zip file\", ex);\n            }\n            try\n            {\n                _schema = ReadHeader(out _contentType);\n                _suffix = ZipFileWriter.Suffix(_contentType);\n            }\n            catch\n            {\n                _zip.Dispose();\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        public IEnumerable<T> Stream<T>(Func<string?, Stream, T> reader)\n        {\n            while (HasMore())\n            {\n                yield return Read(reader);\n            }\n        }\n\n        /// <inheritdoc/>\n        public T Read<T>(Func<string?, Stream, T> reader)\n        {\n            var entry = GetEntry();\n            if (entry == null)\n            {\n                throw new EndOfStreamException(\"No more entries in zip file\");\n            }\n            using var stream = entry.Open();\n            var result = reader(_schema, stream);\n            _sequenceNumber++;\n            return result;\n        }\n\n        private ZipArchiveEntry? GetEntry()\n        {\n            return _zip.GetEntry(_sequenceNumber + _suffix);\n        }\n\n        /// <inheritdoc/>\n        public bool HasMore()\n        {\n            return GetEntry() != null;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _zip.Dispose();\n        }\n\n        /// <summary>\n        /// Writes the schema.\n        /// </summary>\n        /// <param name=\"contentType\"></param>\n        /// <exception cref=\"FormatException\"></exception>\n        private string? ReadHeader(out ZipFileWriter.ContentType contentType)\n        {\n            var entry = _zip.GetEntry(ZipFileWriter.ContentTypeFile);\n            if (entry == null || entry.Length != 1)\n            {\n                throw new FormatException(\"Not a valid zip file with stream data\");\n            }\n            using var contentTypeStream = entry.Open();\n            contentType = (ZipFileWriter.ContentType)contentTypeStream.ReadByte();\n            switch (contentType)\n            {\n                case ZipFileWriter.ContentType.Json:\n                case ZipFileWriter.ContentType.JsonGzip:\n                case ZipFileWriter.ContentType.Binary:\n                    break;\n                default:\n                    throw new FormatException(\"Content type of zip file is invalid.\");\n            }\n            entry = _zip.GetEntry(ZipFileWriter.MessageSchemaFile);\n            if (entry != null)\n            {\n                using var schemaStream = entry.Open();\n                return schemaStream.ReadAsString(Encoding.UTF8);\n            }\n            return null;\n        }\n\n        private int _sequenceNumber = 1;\n        private readonly ZipArchive _zip;\n        private readonly string? _schema;\n        private readonly string _suffix;\n        private readonly ZipFileWriter.ContentType _contentType;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Encoders/ZipFileWriter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Storage;\n    using System;\n    using System.Buffers;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Write messages as zip files\n    /// </summary>\n    public sealed class ZipFileWriter : IFileWriter, IDisposable\n    {\n        /// <inheritdoc/>\n        public bool SupportsContentType(string contentType)\n        {\n            return GetContentType(contentType) != ContentType.None;\n        }\n\n        /// <inheritdoc/>\n        public ValueTask WriteAsync(string fileName, DateTimeOffset timestamp,\n            IEnumerable<ReadOnlySequence<byte>> buffers,\n            IReadOnlyDictionary<string, string?> metadata, IEventSchema? schema,\n            string contentType, CancellationToken ct = default)\n        {\n            fileName = fileName.SanitizeFileName();\n            var file = _files.GetOrAdd(fileName + schema?.Id + contentType,\n                _ => ZipFile.Create(fileName, schema?.Schema,\n                    GetContentType(contentType)));\n            file.Write(timestamp, buffers);\n            return ValueTask.CompletedTask;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            foreach (var file in _files.Values)\n            {\n                file.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// The zip file being written\n        /// </summary>\n        internal sealed class ZipFile : IDisposable\n        {\n            /// <summary>\n            /// Create zip file\n            /// </summary>\n            /// <param name=\"stream\"></param>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"leaveOpen\"></param>\n            /// <param name=\"contentType\"></param>\n            private ZipFile(Stream stream, string? schema, bool leaveOpen,\n                ContentType contentType)\n            {\n                _zip = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen);\n                _contentType = contentType;\n                WriteHeader(schema, contentType);\n                _suffix = Suffix(contentType);\n            }\n\n            /// <summary>\n            /// Create file from file name\n            /// </summary>\n            /// <param name=\"fileName\"></param>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"contentType\"></param>\n            /// <returns></returns>\n            public static ZipFile Create(string fileName, string? schema,\n                ContentType contentType)\n            {\n                fileName = fileName.ReplaceLineEndings();\n                var fs = new FileStream(fileName + FileSuffix, FileMode.OpenOrCreate);\n                return new ZipFile(fs, schema, false, contentType);\n            }\n\n            /// <summary>\n            /// Create file from stream\n            /// </summary>\n            /// <param name=\"stream\"></param>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"contentType\"></param>\n            /// <returns></returns>\n            public static ZipFile CreateFromStream(Stream stream, string? schema,\n                ContentType contentType)\n            {\n                return new ZipFile(stream, schema, true, contentType);\n            }\n\n            /// <summary>\n            /// Write to file\n            /// </summary>\n            /// <param name=\"timestamp\"></param>\n            /// <param name=\"buffers\"></param>\n            /// <returns></returns>\n            public void Write(DateTimeOffset timestamp, IEnumerable<ReadOnlySequence<byte>> buffers)\n            {\n                foreach (var buffer in buffers)\n                {\n                    var entry = _zip.CreateEntry(Interlocked.Increment(ref _sequenceNumber) +\n                        _suffix, CompressionLevel.Optimal);\n                    entry.LastWriteTime = timestamp;\n                    using var stream = entry.Open();\n                    foreach (var memory in _contentType == ContentType.JsonGzip ?\n                        buffer.GzipDecompress() : buffer)\n                    {\n                        stream.Write(memory.Span);\n                    }\n                }\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                _zip.Dispose();\n            }\n\n            /// <summary>\n            /// Writes the schema.\n            /// </summary>\n            /// <param name=\"schema\"></param>\n            /// <param name=\"contentType\"></param>\n            private void WriteHeader(string? schema, ContentType contentType)\n            {\n                if (schema is not null)\n                {\n                    var entry = _zip.CreateEntry(MessageSchemaFile, CompressionLevel.Optimal);\n                    using var stream = entry.Open();\n                    stream.Write(Encoding.UTF8.GetBytes(schema));\n                }\n                {\n                    var entry = _zip.CreateEntry(ContentTypeFile, CompressionLevel.NoCompression);\n                    using var stream = entry.Open();\n                    stream.WriteByte((byte)contentType);\n                }\n            }\n\n            private int _sequenceNumber;\n            private readonly string _suffix;\n            private readonly ZipArchive _zip;\n            private readonly ContentType _contentType;\n        }\n\n        internal enum ContentType\n        {\n            None,\n            Json,\n            JsonGzip,\n            Binary\n        }\n\n        /// <summary>\n        /// Return type\n        /// </summary>\n        /// <param name=\"contentType\"></param>\n        /// <returns></returns>\n        internal static ContentType GetContentType(string contentType)\n        {\n#pragma warning disable CA1308 // Normalize strings to uppercase\n            switch (contentType.ToLowerInvariant())\n            {\n                case Encoders.ContentType.JsonGzip:\n                    return ContentType.JsonGzip;\n                case ContentMimeType.Json:\n                case Encoders.ContentType.UaJson:\n                case Encoders.ContentType.UaLegacyPublisher:\n                case Encoders.ContentType.UaNonReversibleJson:\n                    return ContentType.Json;\n                case ContentMimeType.Binary:\n                case Encoders.ContentType.Uadp:\n                    return ContentType.Binary;\n            }\n#pragma warning restore CA1308 // Normalize strings to uppercase\n            return ContentType.None;\n        }\n\n        /// <summary>\n        /// Get suffix for content type\n        /// </summary>\n        /// <param name=\"contentType\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"FormatException\"></exception>\n        internal static string Suffix(ContentType contentType)\n        {\n            return contentType switch\n            {\n                ContentType.Json or ContentType.JsonGzip => \".json\",\n                ContentType.Binary => \".bin\",\n                _ => throw new FormatException(\"Invalid content type\")\n            };\n        }\n\n        internal const string FileSuffix = \".zip\";\n        internal const string MessageSchemaFile = \"schema.json\";\n        internal const string ContentTypeFile = \"content-type\";\n        private readonly ConcurrentDictionary<string, ZipFile> _files = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Exceptions/ConnectionException.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Exceptions\n{\n    using System;\n    using System.IO;\n\n    /// <summary>\n    /// Thrown when failing to connect to resource\n    /// </summary>\n    public class ConnectionException : IOException\n    {\n        /// <inheritdoc/>\n        public ConnectionException(string message) :\n            base(message)\n        {\n        }\n\n        /// <inheritdoc/>\n        public ConnectionException(string message, Exception innerException) :\n            base(message, innerException)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Exceptions/ServerBusyException.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Exceptions\n{\n    using Furly.Exceptions;\n    using System;\n\n    /// <summary>\n    /// Thrown when failing to connect to resource\n    /// </summary>\n    public class ServerBusyException : ExternalDependencyException\n    {\n        /// <inheritdoc/>\n        public ServerBusyException(string message) :\n            base(message)\n        {\n        }\n\n        /// <inheritdoc/>\n        public ServerBusyException(string message, Exception innerException) :\n            base(message, innerException)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Extensions/LinqEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace System.Linq\n{\n    using System.Collections;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Enumerable extensions\n    /// </summary>\n    public static class LinqEx2\n    {\n        /// <summary>\n        /// Merge enumerable b into set a.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"a\"></param>\n        /// <param name=\"b\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(a))]\n        public static IReadOnlySet<T>? MergeWith<T>(this IReadOnlySet<T>? a, IEnumerable<T>? b)\n        {\n            if (b?.Any() ?? false)\n            {\n                if (a == null)\n                {\n                    return b.ToHashSetSafe();\n                }\n\n                return a.Concat(b).ToHashSet();\n            }\n            return a;\n        }\n\n        /// <summary>\n        /// Creates a hash set from enumerable or null if enumerable is null.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"enumerable\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(enumerable))]\n        public static HashSet<T>? ToHashSetSafe<T>(this IEnumerable<T>? enumerable)\n        {\n            if (enumerable == null)\n            {\n                return null;\n            }\n            return new HashSet<T>(enumerable);\n        }\n\n        /// <summary>\n        /// Flattens a enumerable of enumerables\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public static IEnumerable Flatten(this IEnumerable obj)\n        {\n            foreach (var item in obj)\n            {\n                if (item is IEnumerable contained)\n                {\n                    contained = contained.Flatten();\n                    foreach (var cont in contained)\n                    {\n                        yield return cont;\n                    }\n                    yield break;\n                }\n                yield return item;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Extensions/StreamEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace System.IO\n{\n    using System.Text;\n\n    /// <summary>\n    /// Stream extensions\n    /// </summary>\n    public static class StreamEx\n    {\n        /// <summary>\n        /// Helper extension to convert an entire stream into a string...\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"encoder\"></param>\n        /// <returns></returns>\n        public static string ReadAsString(this Stream stream, Encoding encoder)\n        {\n            // Try to read as much as possible\n            var buffer = stream.ReadAsBuffer();\n            if (buffer.Array == null)\n            {\n                return string.Empty;\n            }\n            return encoder.GetString(buffer.Array, 0, buffer.Count);\n        }\n\n        /// <summary>\n        /// Helper extension to convert an entire stream into a buffer...\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <returns></returns>\n        public static ArraySegment<byte> ReadAsBuffer(this Stream stream)\n        {\n            // Try to read as much as possible\n            var body = new byte[1024];\n            var offset = 0;\n            try\n            {\n                while (true)\n                {\n                    var read = stream.Read(body, offset, body.Length - offset);\n                    if (read <= 0)\n                    {\n                        break;\n                    }\n\n                    offset += read;\n                    if (offset == body.Length)\n                    {\n                        // Grow\n                        var newbuf = new byte[body.Length * 2];\n                        Buffer.BlockCopy(body, 0, newbuf, 0, body.Length);\n                        body = newbuf;\n                    }\n                }\n            }\n            catch (IOException) { }\n            return new ArraySegment<byte>(body, 0, offset);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Extensions/StringEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace System\n{\n    using System.Security.Cryptography;\n    using System.Text;\n\n    /// <summary>\n    /// String helper extensions\n    /// </summary>\n    public static class StringEx\n    {\n        /// <summary>\n        /// Hashes the string\n        /// </summary>\n        /// <param name=\"str\">string to hash</param>\n        /// <returns></returns>\n        public static string ToSha1Hash(this string str)\n        {\n            return Encoding.UTF8.GetBytes(str).ToSha1Hash();\n        }\n\n        /// <summary>\n        /// Hashes the string\n        /// </summary>\n        /// <param name=\"bytestr\">string to hash</param>\n        /// <returns></returns>\n        [Diagnostics.CodeAnalysis.SuppressMessage(\"Security\", \"CA5350:Do Not Use Weak Cryptographic Algorithms\",\n        Justification = \"SHA1 not used for crypto operation.\")]\n        public static string ToSha1Hash(this byte[] bytestr)\n        {\n            var hash = SHA1.HashData(bytestr);\n            return hash.ToBase16String(false);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Extensions/TimerEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa\n{\n    using System;\n    using System.Diagnostics;\n    using System.Threading;\n\n    /// <summary>\n    /// Timer expired event argument\n    /// </summary>\n    public class ElapsedEventArgs : EventArgs\n    {\n        /// <summary>\n        /// Signal time\n        /// </summary>\n        public DateTimeOffset SignalTime { get; }\n\n        internal ElapsedEventArgs(DateTimeOffset localTime)\n        {\n            SignalTime = localTime;\n        }\n    }\n\n    /// <summary>\n    /// Handles recurring events in an application. This is a simplfied\n    /// version of the System.Timers.Timer class but uses a TimeProvider\n    /// provided ITimer instead of the default System.Threading.Timer.\n    /// </summary>\n    public sealed class TimerEx : IDisposable\n    {\n        /// <summary>\n        /// Gets or sets a value indicating whether the Timer raises\n        /// the Tick event each time the specified Interval has elapsed,\n        /// when Enabled is set to true.\n        /// </summary>\n        public bool AutoReset\n        {\n            get => _autoReset;\n            set\n            {\n                if (_autoReset != value)\n                {\n                    _autoReset = value;\n                    if (_timer != null)\n                    {\n                        UpdateTimer();\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the Timer\n        /// is able to raise events at a defined interval.\n        /// The default value by design is false, don't change it.\n        /// </summary>\n        public bool Enabled\n        {\n            get => _enabled;\n            set\n            {\n                if (_enabled != value)\n                {\n                    if (!value)\n                    {\n                        if (_timer != null)\n                        {\n                            _cookie = null;\n                            _timer.Dispose();\n                            _timer = null;\n                        }\n                        _enabled = value;\n                    }\n                    else\n                    {\n                        _enabled = value;\n                        if (_timer == null)\n                        {\n                            ObjectDisposedException.ThrowIf(_disposed, this);\n\n                            _cookie = new object();\n                            _timer = _timeProvider.CreateTimer(_callback,\n                                _cookie, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                            _timer.Change(_interval,\n                                _autoReset ? _interval : Timeout.InfiniteTimeSpan);\n                        }\n                        else\n                        {\n                            UpdateTimer();\n                        }\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create new timer\n        /// </summary>\n        /// <param name=\"timeProvider\"></param>\n        public TimerEx(TimeProvider? timeProvider = null)\n        {\n            _interval = Timeout.InfiniteTimeSpan;\n            _enabled = false;\n            _autoReset = true;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _callback = new TimerCallback(MyTimerCallback);\n        }\n\n        /// <summary>\n        /// Create timer with interval\n        /// </summary>\n        /// <param name=\"interval\">\n        /// The time between events. The value in milliseconds must be greater\n        /// than zero and less than or equal to <see cref=\"int.MaxValue\"/>.\n        /// </param>\n        /// <param name=\"timeProvider\"></param>\n        public TimerEx(TimeSpan interval, TimeProvider? timeProvider = null) :\n            this(timeProvider)\n        {\n            _interval = interval;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Close();\n            _disposed = true;\n        }\n\n        private void UpdateTimer()\n        {\n            Debug.Assert(_timer != null, $\"{nameof(_timer)} was expected not to be null\");\n            _timer.Change(_interval, _autoReset ? _interval : Timeout.InfiniteTimeSpan);\n        }\n\n        /// <summary>\n        /// Gets or sets the interval on which to raise events.\n        /// </summary>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public TimeSpan Interval\n        {\n            get => _interval;\n            set\n            {\n                if (value <= TimeSpan.Zero)\n                {\n                    throw new ArgumentException(\"Bad interval\");\n                }\n\n                _interval = value;\n                if (_timer != null)\n                {\n                    UpdateTimer();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Occurs when the Interval> has elapsed.\n        /// </summary>\n        public event EventHandler<ElapsedEventArgs> Elapsed\n        {\n            add => _onIntervalElapsed += value;\n            remove => _onIntervalElapsed -= value;\n        }\n\n        /// <summary>\n        /// Closes the current timer object.\n        /// </summary>\n        public void Close()\n        {\n            _enabled = false;\n\n            if (_timer != null)\n            {\n                _timer.Dispose();\n                _timer = null;\n            }\n        }\n\n        /// <summary>\n        /// Starts the timing by setting Enabled property.\n        /// </summary>\n        public void Start()\n        {\n            Enabled = true;\n        }\n\n        /// <summary>\n        /// Stops the timing by setting the Enabled property.\n        /// </summary>\n        public void Stop()\n        {\n            Enabled = false;\n        }\n\n        private void MyTimerCallback(object? state)\n        {\n            // System.Threading.Timer will not cancel the work item queued before the timer is stopped.\n            // We don't want to handle the callback after a timer is stopped.\n            if (state != _cookie)\n            {\n                return;\n            }\n\n            if (!_autoReset)\n            {\n                _enabled = false;\n            }\n\n            var elapsedEventArgs = new ElapsedEventArgs(_timeProvider.GetUtcNow());\n            try\n            {\n                // To avoid race between remove handler and raising the event\n                _onIntervalElapsed?.Invoke(this, elapsedEventArgs);\n            }\n            catch\n            {\n                // Silently eat user exception\n            }\n        }\n\n        private TimeSpan _interval;\n        private bool _enabled;\n        private readonly TimeProvider _timeProvider;\n        private EventHandler<ElapsedEventArgs>? _onIntervalElapsed;\n        private bool _autoReset;\n        private bool _disposed;\n        private ITimer? _timer;\n        private readonly TimerCallback _callback;\n        private object? _cookie;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/IMetricsContext.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa\n{\n    using System.Diagnostics;\n\n    /// <summary>\n    /// Metrics context\n    /// </summary>\n    public interface IMetricsContext\n    {\n        /// <summary>\n        /// Tag list\n        /// </summary>\n        TagList TagList { get; }\n\n        /// <summary>\n        /// Null metrics context\n        /// </summary>\n        public static IMetricsContext Empty { get; }\n            = new EmptyContext();\n\n        /// <summary>\n        /// Empty context\n        /// </summary>\n        private sealed class EmptyContext : IMetricsContext\n        {\n            /// <inheritdoc/>\n            public TagList TagList { get; }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"Azure.IIoT.OpcUa.Tests\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Diagnostics.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using System.Diagnostics;\n    using System.Diagnostics.Metrics;\n\n    /// <summary>\n    /// Industrial iot diagnostics\n    /// </summary>\n    public sealed class Diagnostics : IMeterFactory\n    {\n        /// <summary>\n        /// Version\n        /// </summary>\n        public const string Version = \"2.9\";\n\n        /// <summary>\n        /// namespace\n        /// </summary>\n        public const string Namespace = \"Azure.Industrial-IoT\";\n\n        /// <summary>\n        /// Metrics\n        /// </summary>\n        public static readonly Meter Meter = NewMeter();\n\n        /// <summary>\n        /// Metrics\n        /// </summary>\n        public static Meter NewMeter()\n        {\n            return new(Namespace, Version);\n        }\n\n        /// <summary>\n        /// Tracing\n        /// </summary>\n        public static ActivitySource NewActivitySource()\n        {\n            return new(Namespace, Version);\n        }\n\n        /// <inheritdoc/>\n        public Meter Create(MeterOptions options)\n        {\n            return Diagnostics.NewMeter();\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/AggregateConfigurationModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    /// <summary>\n    /// Aggregate configuration model extensions\n    /// </summary>\n    public static class AggregateConfigurationModelEx\n    {\n        /// <summary>\n        /// Compare filters\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this AggregateConfigurationModel? model,\n            AggregateConfigurationModel? other)\n        {\n            if (ReferenceEquals(model, other))\n            {\n                return true;\n            }\n            if (model is null || other is null)\n            {\n                return false;\n            }\n            if (model.PercentDataBad != other.PercentDataBad)\n            {\n                return false;\n            }\n            if (model.PercentDataGood != other.PercentDataGood)\n            {\n                return false;\n            }\n            if (model.TreatUncertainAsBad != other.TreatUncertainAsBad)\n            {\n                return false;\n            }\n            if (model.UseSlopedExtrapolation != other.UseSlopedExtrapolation)\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/AggregateFilterModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    /// <summary>\n    /// Aggregate filter model extensions\n    /// </summary>\n    public static class AggregateFilterModelEx\n    {\n        /// <summary>\n        /// Compare filters\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this AggregateFilterModel? model,\n            AggregateFilterModel? other)\n        {\n            if (ReferenceEquals(model, other))\n            {\n                return true;\n            }\n            if (model is null || other is null)\n            {\n                return false;\n            }\n            if (model.AggregateTypeId != other.AggregateTypeId)\n            {\n                return false;\n            }\n            if (model.ProcessingInterval != other.ProcessingInterval)\n            {\n                return false;\n            }\n            if (model.StartTime != other.StartTime)\n            {\n                return false;\n            }\n            if (!model.AggregateConfiguration.IsSameAs(other.AggregateConfiguration))\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/ApplicationInfoModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Service model extensions for discovery service\n    /// </summary>\n    public static class ApplicationInfoModelEx\n    {\n        /// <summary>\n        /// Create unique application id\n        /// </summary>\n        /// <param name=\"siteOrGatewayId\"></param>\n        /// <param name=\"applicationUri\"></param>\n        /// <param name=\"applicationType\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(applicationUri))]\n        public static string? CreateApplicationId(string? siteOrGatewayId,\n            string? applicationUri, ApplicationType? applicationType)\n        {\n            if (string.IsNullOrEmpty(applicationUri))\n            {\n                return null;\n            }\n#pragma warning disable CA1308 // Normalize strings to uppercase\n            applicationUri = applicationUri.ToLowerInvariant();\n#pragma warning restore CA1308 // Normalize strings to uppercase\n            var type = applicationType ?? ApplicationType.Server;\n            var id = $\"{siteOrGatewayId ?? \"\"}-{type}-{applicationUri}\";\n            var prefix = applicationType == ApplicationType.Client ? \"uac\" : \"uas\";\n            return prefix + id.ToSha1Hash();\n        }\n\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this ApplicationInfoModel? model,\n            ApplicationInfoModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            return\n                StringComparer.OrdinalIgnoreCase.Equals(that.ApplicationUri, model.ApplicationUri) &&\n                that.ApplicationType == model.ApplicationType;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/ApplicationRegistrationModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Service model extensions for discovery service\n    /// </summary>\n    public static class ApplicationRegistrationModelEx\n    {\n        /// <summary>\n        /// Add or update a server list\n        /// </summary>\n        /// <param name=\"discovered\"></param>\n        /// <param name=\"server\"></param>\n        public static void AddOrUpdate(this List<ApplicationRegistrationModel> discovered,\n            ApplicationRegistrationModel server)\n        {\n            var actual = discovered\n                .Find(s => s.Application.IsSameAs(server.Application));\n            if (actual != null)\n            {\n                // Merge server info\n                actual.UnionWith(server);\n            }\n            else\n            {\n                discovered.Add(server);\n            }\n        }\n\n        /// <summary>\n        /// Create Union with server\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"server\"></param>\n        public static void UnionWith(this ApplicationRegistrationModel model,\n            ApplicationRegistrationModel server)\n        {\n            if (model.Application == null)\n            {\n                model.Application = server.Application;\n            }\n            else\n            {\n                model.Application.Capabilities = model.Application.Capabilities.MergeWith(\n                    server?.Application?.Capabilities);\n                model.Application.DiscoveryUrls = model.Application.DiscoveryUrls.MergeWith(\n                    server?.Application?.DiscoveryUrls);\n                model.Application.HostAddresses = model.Application.HostAddresses.MergeWith(\n                    server?.Application?.HostAddresses);\n            }\n\n            if (server?.Endpoints?.Any() ?? false)\n            {\n                if (model.Endpoints == null)\n                {\n                    model.Endpoints = server.Endpoints;\n                }\n                else\n                {\n                    foreach (var ep in server.Endpoints)\n                    {\n                        var found = model.Endpoints.Where(ep.IsSameAs).ToList();\n                        if (found.Count == 0)\n                        {\n                            model.Endpoints = model.Endpoints.Append(ep).ToList();\n                        }\n                        foreach (var existing in found)\n                        {\n                            if (existing.Endpoint == null)\n                            {\n                                existing.Endpoint = ep.Endpoint;\n                                continue;\n                            }\n                            existing.Endpoint?.UnionWith(ep.Endpoint);\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/AuthenticationMethodModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Authentication method model extensions\n    /// </summary>\n    public static class AuthenticationMethodModelEx\n    {\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this IReadOnlyList<AuthenticationMethodModel>? model,\n            IReadOnlyList<AuthenticationMethodModel>? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            if (model.Count != that.Count)\n            {\n                return false;\n            }\n            foreach (var a in model)\n            {\n                if (!that.Any(b => b.IsSameAs(a)))\n                {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this AuthenticationMethodModel? model,\n            AuthenticationMethodModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            if (model.Configuration != null && that.Configuration != null &&\n                !VariantValue.DeepEquals(model.Configuration, that.Configuration))\n            {\n                return false;\n            }\n            return\n                model.Id == that.Id &&\n                model.SecurityPolicy == that.SecurityPolicy &&\n                model.CredentialType == that.CredentialType;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/ConditionHandlingOptionsModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Condition options extensions\n    /// </summary>\n    public static class ConditionHandlingOptionsModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ConditionHandlingOptionsModel? Clone(this ConditionHandlingOptionsModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n\n        /// <summary>\n        /// Check if models are equal\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        public static bool IsSameAs(this ConditionHandlingOptionsModel? model,\n            ConditionHandlingOptionsModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            if (model.SnapshotInterval != that.SnapshotInterval)\n            {\n                return false;\n            }\n            if (model.UpdateInterval != that.UpdateInterval)\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/ConnectionModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Connection endpoint model extensions\n    /// </summary>\n    public static class ConnectionModelEx\n    {\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this ConnectionModel? model, ConnectionModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            if (that.Group != model.Group)\n            {\n                return false;\n            }\n            if (that.Options != model.Options)\n            {\n                return false;\n            }\n            if (!that.Endpoint.IsSameAs(model.Endpoint))\n            {\n                return false;\n            }\n            if (that.Diagnostics?.AuditId != model.Diagnostics?.AuditId)\n            {\n                return false;\n            }\n            if (!that.User.IsSameAs(model.User))\n            {\n                return false;\n            }\n            if (!that.Locales.SequenceEqualsSafe(model.Locales))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Is this reverse connected\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <returns></returns>\n        public static bool IsReverseConnect(this ConnectionModel connection)\n        {\n            return connection.Options.HasFlag(ConnectionOptions.UseReverseConnect)\n                && connection.GetEndpointUrls().Any();\n        }\n\n        /// <summary>\n        /// Get endpont urls to try from connection\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <returns></returns>\n        public static IEnumerable<Uri> GetEndpointUrls(this ConnectionModel connection)\n        {\n            if (connection.Endpoint?.Url == null)\n            {\n                return [];\n            }\n            var endpoints = new Uri(connection.Endpoint.Url).YieldReturn();\n            if (connection.Endpoint.AlternativeUrls != null)\n            {\n                endpoints = endpoints.Concat(connection.Endpoint.AlternativeUrls\n                    .Where(u => !string.IsNullOrEmpty(u))\n                    .Select(u => new Uri(u)));\n            }\n            return endpoints.Where(u => !connection.Options.HasFlag(ConnectionOptions.UseReverseConnect) ||\n                string.Equals(u.Scheme, \"opc.tcp\", // Only allow tcp scheme\n                    StringComparison.OrdinalIgnoreCase));\n        }\n\n        /// <summary>\n        /// Create unique hash\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static int CreateConsistentHash(this ConnectionModel model)\n        {\n            var hashCode = HashCode.Combine(\n                model.Endpoint?.CreateConsistentHash() ?? 0,\n                model.User ?? new CredentialModel(),\n                model.Diagnostics?.AuditId ?? string.Empty,\n                model.Group ?? string.Empty,\n                model.Options);\n            foreach (var l in model.Locales ?? Enumerable.Empty<string>())\n            {\n                hashCode = HashCode.Combine(hashCode, l);\n            }\n            return hashCode;\n        }\n\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ConnectionModel? Clone(this ConnectionModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                Endpoint = model.Endpoint.Clone(),\n                User = model.User.Clone(),\n                Diagnostics = model.Diagnostics.Clone()\n            });\n        }\n\n        /// <summary>\n        /// Returns a string that uniquiely identifies the connection based on\n        /// endpoint url, hash and associated group\n        /// </summary>\n        /// <param name=\"model\"></param>\n        public static string? CreateConnectionId(this ConnectionModel? model)\n        {\n            if (string.IsNullOrEmpty(model?.Endpoint?.Url))\n            {\n                return null;\n            }\n            return !string.IsNullOrEmpty(model.Group) ?\n                $\"{model.Endpoint?.Url}_{CreateConsistentHash(model):X8}_{model.Group}\" :\n                $\"{model.Endpoint?.Url}_{CreateConsistentHash(model):X8}\";\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/ContentFilterElementModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Content filter element extensions\n    /// </summary>\n    public static class ContentFilterElementModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ContentFilterElementModel? Clone(this ContentFilterElementModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                FilterOperands = model.FilterOperands?\n                    .Select(f => f.Clone())\n                    .ToList()\n            });\n        }\n\n        /// <summary>\n        /// Compare elements\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this ContentFilterElementModel? model, ContentFilterElementModel? other)\n        {\n            if (ReferenceEquals(model, other))\n            {\n                return true;\n            }\n            if (model is null || other is null)\n            {\n                return false;\n            }\n            if (model.FilterOperator != other.FilterOperator)\n            {\n                return false;\n            }\n            if (!model.FilterOperands.SetEqualsSafe(other.FilterOperands,\n                (x, y) => x.IsSameAs(y)))\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/ContentFilterModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Content filter extensions\n    /// </summary>\n    public static class ContentFilterModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ContentFilterModel? Clone(this ContentFilterModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                Elements = model.Elements?\n                    .Select(e => e.Clone())\n                    .ToList()\n            });\n        }\n\n        /// <summary>\n        /// Compare operands\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this ContentFilterModel? model, ContentFilterModel? other)\n        {\n            if (ReferenceEquals(model, other))\n            {\n                return true;\n            }\n            if (model is null || other is null)\n            {\n                return false;\n            }\n            if (!model.Elements.SetEqualsSafe(other.Elements,\n                (x, y) => x.IsSameAs(y)))\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/CredentialModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Credential model extensions\n    /// </summary>\n    public static class CredentialModelEx\n    {\n        /// <summary>\n        /// Get password\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static string? GetPassword(this CredentialModel? model)\n        {\n            if (model?.Type == CredentialType.UserName &&\n                model.Value != null)\n            {\n                return model.Value.Password;\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Get user name\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static string? GetUserName(this CredentialModel? model)\n        {\n            if (model?.Type == CredentialType.UserName &&\n                model.Value != null)\n            {\n                return model.Value.User;\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this CredentialModel? model, CredentialModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n\n            model ??= new CredentialModel();\n            that ??= new CredentialModel();\n\n            if (that.Type != model.Type)\n            {\n                return false;\n            }\n            if (!that.Value.IsSameAs(model.Value))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Deep clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static CredentialModel? Clone(this CredentialModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                Value = model.Value.Clone()\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/DataChangeFilterModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    /// <summary>\n    /// Data change filter model extensions\n    /// </summary>\n    public static class DataChangeFilterModelEx\n    {\n        /// <summary>\n        /// Compare filters\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this DataChangeFilterModel? model, DataChangeFilterModel? other)\n        {\n            if (ReferenceEquals(model, other))\n            {\n                return true;\n            }\n            if (model is null || other is null)\n            {\n                return false;\n            }\n            //\n            // Null is default and equals to StatusValue, but we allow StatusValue == 1\n            // to be set specifically to enable a user to force a data filter to be\n            // applied (otherwise it is not if nothing else is set)\n            //\n            if (model.DataChangeTrigger != other.DataChangeTrigger)\n            {\n                return false;\n            }\n            // Null is None == no deadband\n            if (model.DeadbandType != other.DeadbandType)\n            {\n                return false;\n            }\n            if (model.DeadbandValue != other.DeadbandValue)\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/DataSetMetaDataModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Dataset metadata extensions\n    /// </summary>\n    public static class DataSetMetaDataModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static DataSetMetaDataModel? Clone(this DataSetMetaDataModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/DataSetWriterModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Dataset writer model ex\n    /// </summary>\n    public static class DataSetWriterModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static DataSetWriterModel? Clone(this DataSetWriterModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                DataSet = model.DataSet.Clone(),\n                MessageSettings = model.MessageSettings.Clone()\n            });\n        }\n\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        private static DataSetWriterMessageSettingsModel? Clone(this DataSetWriterMessageSettingsModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/DiagnosticsModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Diagnostics model extensions\n    /// </summary>\n    public static class DiagnosticsModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static DiagnosticsModel? Clone(this DiagnosticsModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/DiscoveryConfigModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Discovery configuration model extensions\n    /// </summary>\n    public static class DiscoveryConfigModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static DiscoveryConfigModel? Clone(this DiscoveryConfigModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                DiscoveryUrls = model.DiscoveryUrls?.Count > 0 ?\n                    model.DiscoveryUrls.ToList() : null,\n                Locales = model.Locales?.Count > 0 ?\n                    model.Locales.ToList() : null,\n                PortRangesToScan = string.IsNullOrEmpty(model.PortRangesToScan) ?\n                    null : model.PortRangesToScan,\n                AddressRangesToScan = string.IsNullOrEmpty(model.AddressRangesToScan) ?\n                    null : model.AddressRangesToScan,\n                IdleTimeBetweenScans = model.IdleTimeBetweenScans < TimeSpan.Zero ?\n                    null : model.IdleTimeBetweenScans,\n                MaxNetworkProbes = model.MaxNetworkProbes <= 0 ?\n                    null : model.MaxNetworkProbes,\n                MaxPortProbes = model.MaxPortProbes <= 0 ?\n                    null : model.MaxPortProbes,\n                MinPortProbesPercent = model.MinPortProbesPercent <= 0 ?\n                    null : model.MinPortProbesPercent,\n                NetworkProbeTimeout = model.NetworkProbeTimeout <= TimeSpan.Zero ?\n                    null : model.NetworkProbeTimeout,\n                PortProbeTimeout = model.PortProbeTimeout <= TimeSpan.Zero ?\n                    null : model.PortProbeTimeout\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/DiscoveryRequestModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Discovery request model extensions\n    /// </summary>\n    public static class DiscoveryRequestModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static DiscoveryRequestModel? Clone(this DiscoveryRequestModel? model,\n            TimeProvider timeProvider)\n        {\n            return model == null ? null : (model with\n            {\n                Configuration = model.Configuration.Clone(),\n                Context = model.Context?.Clone(timeProvider)\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/EndpointModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Endpoint model extensions\n    /// </summary>\n    public static class EndpointModelEx\n    {\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this EndpointModel? model, EndpointModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            if (!that.HasSameSecurityProperties(model))\n            {\n                return false;\n            }\n            if (!that.GetAllUrls().SequenceEqualsSafe(model.GetAllUrls()))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool HasSameSecurityProperties(this EndpointModel? model, EndpointModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            if (!that.Certificate.SequenceEqualsSafe(model.Certificate))\n            {\n                return false;\n            }\n            if (that.SecurityPolicy != model.SecurityPolicy &&\n                that.SecurityPolicy != null && model.SecurityPolicy != null)\n            {\n                return false;\n            }\n            if ((that.SecurityMode ?? SecurityMode.NotNone) !=\n                    (model.SecurityMode ?? SecurityMode.NotNone))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Create unique hash\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <returns></returns>\n        public static int CreateConsistentHash(this EndpointModel endpoint)\n        {\n            var hashCode = -1971667340;\n            hashCode = (hashCode * -1521134295) +\n                endpoint.GetAllUrls().SequenceGetHashSafe();\n            hashCode = (hashCode * -1521134295) +\n                endpoint.Certificate.SequenceGetHashSafe();\n            hashCode = (hashCode * -1521134295) +\n                EqualityComparer<string>.Default.GetHashCode(\n                    endpoint.SecurityPolicy ?? string.Empty);\n            hashCode = (hashCode * -1521134295) +\n                EqualityComparer<SecurityMode?>.Default.GetHashCode(\n                    endpoint.SecurityMode ?? SecurityMode.NotNone);\n\n            return hashCode;\n        }\n\n        /// <summary>\n        /// Get all urls\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static IEnumerable<string> GetAllUrls(this EndpointModel? model)\n        {\n            if (model != null)\n            {\n                if (model.Url != null)\n                {\n                    yield return model.Url;\n                }\n                if (model.AlternativeUrls != null)\n                {\n                    foreach (var url in model.AlternativeUrls)\n                    {\n                        yield return url;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create Union with endpoint\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"endpoint\"></param>\n        public static void UnionWith(this EndpointModel model,\n            EndpointModel? endpoint)\n        {\n            if (endpoint == null)\n            {\n                return;\n            }\n\n            var alternativeUrls = model.AlternativeUrls.MergeWith(\n                endpoint.AlternativeUrls)?.ToHashSet() ?? [];\n            if (model.Url != null)\n            {\n                if (endpoint.Url != null)\n                {\n                    alternativeUrls.Add(endpoint.Url);\n                }\n                alternativeUrls.Remove(model.Url);\n            }\n            else\n            {\n                model.Url = endpoint.Url;\n            }\n            model.AlternativeUrls = alternativeUrls;\n        }\n\n        /// <summary>\n        /// Deep clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static EndpointModel? Clone(this EndpointModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                AlternativeUrls = model.AlternativeUrls.ToHashSetSafe()\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/EndpointRegistrationModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    /// <summary>\n    /// Service model extensions for discovery service\n    /// </summary>\n    public static class EndpointRegistrationModelEx\n    {\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this EndpointRegistrationModel? model,\n            EndpointRegistrationModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            if (!model.Endpoint.HasSameSecurityProperties(that.Endpoint))\n            {\n                return false;\n            }\n            if (!model.AuthenticationMethods.IsSameAs(that.AuthenticationMethods))\n            {\n                return false;\n            }\n            return\n                model.EndpointUrl == that.EndpointUrl &&\n                model.SiteId == that.SiteId &&\n                model.DiscovererId == that.DiscovererId &&\n                model.SecurityLevel == that.SecurityLevel;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/EventFilterModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Event filter extensions\n    /// </summary>\n    public static class EventFilterModelEx\n    {\n        /// <summary>\n        /// Compare filters\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this EventFilterModel? model, EventFilterModel? other)\n        {\n            if (ReferenceEquals(model, other))\n            {\n                return true;\n            }\n            if (model is null || other is null)\n            {\n                return false;\n            }\n            if (!model.SelectClauses.SetEqualsSafe(other.SelectClauses,\n                (x, y) => x.IsSameAs(y)))\n            {\n                return false;\n            }\n            if (!model.WhereClause.IsSameAs(other.WhereClause))\n            {\n                return false;\n            }\n            if (model.TypeDefinitionId != other.TypeDefinitionId)\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/FileSystemServicesEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Diagnostics;\n    using System.IO;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// File system services extensions\n    /// </summary>\n    public static class FileSystemServicesEx\n    {\n        /// <summary>\n        /// Copy from server to provided stream (e.g. file)\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"service\"></param>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"file\"></param>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<ServiceResultModel> CopyToAsync<T>(this IFileSystemServices<T> service,\n            T endpoint, FileSystemObjectModel file, Stream stream, CancellationToken ct = default)\n        {\n            var open = await service.OpenReadAsync(endpoint, file, ct).ConfigureAwait(false);\n            if (open.ErrorInfo != null)\n            {\n                Debug.Assert(open.Result == null);\n                return open.ErrorInfo;\n            }\n            Debug.Assert(open.Result != null);\n            await using (var _ = open.Result.ConfigureAwait(false))\n            {\n                await open.Result.CopyToAsync(stream, ct).ConfigureAwait(false);\n            }\n            return new ServiceResultModel();\n        }\n\n        /// <summary>\n        /// Copy from stream (e.g. file) to file on server\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"service\"></param>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"file\"></param>\n        /// <param name=\"stream\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<ServiceResultModel> CopyFromAsync<T>(this IFileSystemServices<T> service,\n            T endpoint, FileSystemObjectModel file, Stream stream, FileOpenWriteOptionsModel? options = null,\n            CancellationToken ct = default)\n        {\n            var open = await service.OpenWriteAsync(endpoint, file, options, ct).ConfigureAwait(false);\n            if (open.ErrorInfo != null)\n            {\n                Debug.Assert(open.Result == null);\n                return open.ErrorInfo;\n            }\n            Debug.Assert(open.Result != null);\n            await using (var _ = open.Result.ConfigureAwait(false))\n            {\n                await stream.CopyToAsync(open.Result, ct).ConfigureAwait(false);\n            }\n            return new ServiceResultModel();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/FilterOperandModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Content filter element extensions\n    /// </summary>\n    public static class FilterOperandModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static FilterOperandModel? Clone(this FilterOperandModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n\n        /// <summary>\n        /// Compare operands\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this FilterOperandModel? model, FilterOperandModel? other)\n        {\n            if (ReferenceEquals(model, other))\n            {\n                return true;\n            }\n            if (model is null || other is null)\n            {\n                return false;\n            }\n            if (model.AttributeId != other.AttributeId)\n            {\n                return false;\n            }\n            if (model.Index != other.Index)\n            {\n                return false;\n            }\n            if (!VariantValue.DeepEquals(model.Value, other.Value))\n            {\n                return false;\n            }\n            if (!model.BrowsePath.SequenceEqualsSafe(other.BrowsePath))\n            {\n                return false;\n            }\n            if (model.IndexRange != other.IndexRange)\n            {\n                return false;\n            }\n            if (model.NodeId != other.NodeId)\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/ModelChangeHandlingOptionsModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Published model change items extensions\n    /// </summary>\n    public static class ModelChangeHandlingOptionsModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ModelChangeHandlingOptionsModel? Clone(this ModelChangeHandlingOptionsModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n\n        /// <summary>\n        /// Check if models are equal\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        public static bool IsSameAs(this ModelChangeHandlingOptionsModel? model,\n            ModelChangeHandlingOptionsModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n            if (model.RebrowseIntervalTimespan != that.RebrowseIntervalTimespan)\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/NodeServicesEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Utils;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Node services extensions\n    /// </summary>\n    public static class NodeServicesEx\n    {\n        /// <summary>\n        /// Browse all references if max references is null and user\n        /// wants all. If user has requested maximum to return use\n        /// <see cref=\"INodeServices{T}.BrowseFirstAsync\"/>\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"service\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        public static async Task<BrowseFirstResponseModel> BrowseAsync<T>(\n            this INodeServices<T> service, T connection, BrowseFirstRequestModel request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(service);\n            ArgumentNullException.ThrowIfNull(request);\n\n            if (request.MaxReferencesToReturn != null)\n            {\n                return await service.BrowseFirstAsync(connection,\n                    request, ct).ConfigureAwait(false);\n            }\n            var result = await service.BrowseFirstAsync(connection,\n                request, ct).ConfigureAwait(false);\n            var references = new List<NodeReferenceModel>();\n            if (result.References != null)\n            {\n                references.AddRange(result.References);\n            }\n            var continuationToken = result.ContinuationToken;\n            while (continuationToken != null)\n            {\n                try\n                {\n                    var next = await service.BrowseNextAsync(connection,\n                        new BrowseNextRequestModel\n                        {\n                            ContinuationToken = continuationToken,\n                            Header = request.Header,\n                            NodeIdsOnly = request.NodeIdsOnly,\n                            ReadVariableValues = request.ReadVariableValues,\n                            TargetNodesOnly = request.TargetNodesOnly\n                        }, ct).ConfigureAwait(false);\n                    if (next.References != null)\n                    {\n                        references.AddRange(next.References);\n                    }\n                    continuationToken = next.ContinuationToken;\n                }\n                catch (Exception) when (continuationToken != null)\n                {\n                    await Try.Async(() => service.BrowseNextAsync(connection,\n                        new BrowseNextRequestModel\n                        {\n                            ContinuationToken = continuationToken,\n                            Abort = true\n                        })).ConfigureAwait(false);\n                    throw;\n                }\n            }\n            return result with\n            {\n                References = references,\n                ContinuationToken = null\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/OpcNodeModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Config.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Messaging;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Dataset source extensions\n    /// </summary>\n    public static class OpcNodeModelEx\n    {\n        /// <summary>\n        /// Get comparer class for OpcNodeModel objects.\n        /// </summary>\n        public static EqualityComparer<OpcNodeModel> Comparer { get; } =\n            new OpcNodeModelComparer();\n\n        /// <summary>\n        /// Try get the id element of the node\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public static bool TryGetId(this OpcNodeModel node, [NotNullWhen(true)] out string? id)\n        {\n            id = !string.IsNullOrWhiteSpace(node.Id) ?\n                node.Id : !string.IsNullOrWhiteSpace(node.ExpandedNodeId) ?\n                node.ExpandedNodeId : node.BrowsePath?.Count > 0 ?\n                Opc.Ua.ObjectIds.RootFolder.ToString() : node.ModelChangeHandling != null ?\n                Opc.Ua.ObjectIds.Server.ToString() : null;\n            return id != null;\n        }\n\n        /// <summary>\n        /// Check if nodes are equal\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <param name=\"includeTriggeredNodes\"></param>\n        public static bool IsSame(this OpcNodeModel? model, OpcNodeModel? that,\n            bool includeTriggeredNodes = true)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (model is null || that is null)\n            {\n                return false;\n            }\n\n            if (!string.Equals(model.Id ?? string.Empty,\n                that.Id ?? string.Empty, StringComparison.OrdinalIgnoreCase))\n            {\n                return false;\n            }\n\n            if (!string.Equals(model.DisplayName ?? string.Empty,\n                that.DisplayName ?? string.Empty, StringComparison.OrdinalIgnoreCase))\n            {\n                return false;\n            }\n\n            if (!string.Equals(model.Topic ?? string.Empty,\n                that.Topic ?? string.Empty, StringComparison.OrdinalIgnoreCase))\n            {\n                return false;\n            }\n\n            if ((model.QualityOfService ?? QoS.AtLeastOnce) !=\n                (that.QualityOfService ?? QoS.AtLeastOnce))\n            {\n                return false;\n            }\n\n            if (!string.Equals(model.DataSetFieldId ?? string.Empty,\n                that.DataSetFieldId ?? string.Empty, StringComparison.OrdinalIgnoreCase))\n            {\n                return false;\n            }\n\n            if (model.DataSetClassFieldId != that.DataSetClassFieldId)\n            {\n                return false;\n            }\n\n            if (!string.Equals(model.ExpandedNodeId,\n                that.ExpandedNodeId, StringComparison.OrdinalIgnoreCase))\n            {\n                return false;\n            }\n\n            if (model.GetNormalizedPublishingInterval() != that.GetNormalizedPublishingInterval())\n            {\n                return false;\n            }\n\n            if (model.GetNormalizedSamplingInterval() != that.GetNormalizedSamplingInterval())\n            {\n                return false;\n            }\n\n            if (model.GetNormalizedHeartbeatInterval() != that.GetNormalizedHeartbeatInterval())\n            {\n                return false;\n            }\n\n            if ((model.HeartbeatBehavior ?? HeartbeatBehavior.WatchdogLKV) !=\n                (that.HeartbeatBehavior ?? HeartbeatBehavior.WatchdogLKV))\n            {\n                return false;\n            }\n\n            if ((model.SkipFirst ?? false) != (that.SkipFirst ?? false))\n            {\n                return false;\n            }\n\n            if ((model.DiscardNew ?? false) != (that.DiscardNew ?? false))\n            {\n                return false;\n            }\n\n            if (model.QueueSize != that.QueueSize)\n            {\n                return false;\n            }\n\n            //\n            // Null is default and equals to StatusValue, but we allow StatusValue == 1\n            // to be set specifically to enable a user to force a data filter to be\n            // applied (otherwise it is not if nothing else is set)\n            //\n            if (model.DataChangeTrigger != that.DataChangeTrigger)\n            {\n                return false;\n            }\n\n            // Null is None == no deadband\n            if (model.DeadbandType != that.DeadbandType)\n            {\n                return false;\n            }\n\n            if (model.DeadbandValue != that.DeadbandValue)\n            {\n                return false;\n            }\n\n            if (!model.EventFilter.IsSameAs(that.EventFilter))\n            {\n                return false;\n            }\n\n            if (!model.ModelChangeHandling.IsSameAs(that.ModelChangeHandling))\n            {\n                return false;\n            }\n\n            if (!model.ConditionHandling.IsSameAs(that.ConditionHandling))\n            {\n                return false;\n            }\n\n            if ((model.UseCyclicRead ?? false) != (that.UseCyclicRead ?? false))\n            {\n                return false;\n            }\n            if (model.GetNormalizedCyclicReadMaxAge() != that.GetNormalizedCyclicReadMaxAge())\n            {\n                return false;\n            }\n            if ((model.RegisterNode ?? false) != (that.RegisterNode ?? false))\n            {\n                return false;\n            }\n            if (includeTriggeredNodes &&\n                model.TriggeredNodes?.SetEqualsSafe(that.TriggeredNodes,\n                    (a, b) => a.IsSame(b, false)) == false)\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Returns the hashcode for a node\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"includeTriggerNodes\"></param>\n        public static int GetHashCode(this OpcNodeModel model, bool includeTriggerNodes = true)\n        {\n            var hash = new HashCode();\n            hash.Add(model.Id);\n            hash.Add(model.DisplayName);\n            hash.Add(model.DataSetFieldId);\n            hash.Add(model.DataSetClassFieldId);\n            hash.Add(model.ExpandedNodeId);\n            hash.Add(model.QualityOfService);\n            hash.Add(model.Topic);\n            hash.Add(model.GetNormalizedPublishingInterval());\n            hash.Add(model.GetNormalizedSamplingInterval());\n            hash.Add(model.GetNormalizedHeartbeatInterval());\n            hash.Add(model.HeartbeatBehavior ?? HeartbeatBehavior.WatchdogLKV);\n            hash.Add(model.SkipFirst ?? false);\n            hash.Add(model.DiscardNew ?? false);\n            hash.Add(model.QueueSize);\n            if (model.DataChangeTrigger == null)\n            {\n                //\n                // Null is default and equals to StatusValue, but we allow StatusValue == 1\n                // to be set specifically to enable a user to force a data filter to be\n                // applied (otherwise it is not if nothing else is set)\n                //\n                hash.Add(-1);\n            }\n            else\n            {\n                hash.Add(model.DataChangeTrigger);\n            }\n            hash.Add(model.DeadbandValue);\n            if (model.DeadbandType == null)\n            {\n                // Null is None == no deadband\n                hash.Add(-1);\n            }\n            else\n            {\n                hash.Add(model.DeadbandType);\n            }\n\n            hash.Add(model.ModelChangeHandling?.RebrowseIntervalTimespan);\n            hash.Add(model.ConditionHandling?.UpdateInterval);\n            hash.Add(model.ConditionHandling?.SnapshotInterval);\n            hash.Add(model.UseCyclicRead);\n            hash.Add(model.GetNormalizedCyclicReadMaxAge());\n            hash.Add(model.RegisterNode);\n\n            if (includeTriggerNodes)\n            {\n                model.TriggeredNodes?.ForEach(n => hash.Add(GetHashCode(n, false)));\n            }\n\n            return hash.ToHashCode();\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a node's HeartbeatInterval\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"defaultHeatbeatTimespan\"></param>\n        /// <returns></returns>\n        public static TimeSpan? GetNormalizedHeartbeatInterval(\n            this OpcNodeModel model, TimeSpan? defaultHeatbeatTimespan = null)\n        {\n            return model.HeartbeatIntervalTimespan\n                .GetTimeSpanFromSeconds(model.HeartbeatInterval, defaultHeatbeatTimespan);\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a node's PublishingInterval\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"defaultPublishingTimespan\"></param>\n        public static TimeSpan? GetNormalizedPublishingInterval(\n            this OpcNodeModel model, TimeSpan? defaultPublishingTimespan = null)\n        {\n            return model.OpcPublishingIntervalTimespan\n                .GetTimeSpanFromMiliseconds(model.OpcPublishingInterval, defaultPublishingTimespan);\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a node's SamplingInterval\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"defaultSamplingTimespan\"></param>\n        public static TimeSpan? GetNormalizedSamplingInterval(\n            this OpcNodeModel model, TimeSpan? defaultSamplingTimespan = null)\n        {\n            return model.OpcSamplingIntervalTimespan\n                .GetTimeSpanFromMiliseconds(model.OpcSamplingInterval, defaultSamplingTimespan);\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a node's CyclicReadMaxAge\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"defaultCyclicReadMaxAgeTimespan\"></param>\n        public static TimeSpan? GetNormalizedCyclicReadMaxAge(\n            this OpcNodeModel model, TimeSpan? defaultCyclicReadMaxAgeTimespan = null)\n        {\n            return model.CyclicReadMaxAgeTimespan\n                .GetTimeSpanFromMiliseconds(model.CyclicReadMaxAge, defaultCyclicReadMaxAgeTimespan);\n        }\n\n        /// <summary>\n        /// Returns a the timespan value from the timespan when defined, respectively from\n        /// the seconds representing integer. The Timespan value wins when provided\n        /// </summary>\n        /// <param name=\"timespan\"></param>\n        /// <param name=\"seconds\"></param>\n        /// <param name=\"defaultTimespan\"></param>\n        public static TimeSpan? GetTimeSpanFromSeconds(\n            this TimeSpan? timespan,\n            int? seconds,\n            TimeSpan? defaultTimespan = null)\n        {\n            return timespan ?? (seconds.HasValue\n                    ? TimeSpan.FromSeconds(seconds.Value)\n                    : defaultTimespan);\n        }\n\n        /// <summary>\n        /// Returns a the timespan value from the timespan when defined, respectively from\n        /// the miliseconds representing integer. The Timespan value wins when provided\n        /// </summary>\n        /// <param name=\"timespan\"></param>\n        /// <param name=\"miliseconds\"></param>\n        /// <param name=\"defaultTimespan\"></param>\n        public static TimeSpan? GetTimeSpanFromMiliseconds(\n            this TimeSpan? timespan,\n            int? miliseconds,\n            TimeSpan? defaultTimespan = null)\n        {\n            return timespan ?? (miliseconds.HasValue\n                    ? TimeSpan.FromMilliseconds(miliseconds.Value)\n                    : defaultTimespan);\n        }\n\n        /// <summary>\n        /// Equality comparer for OpcNodeModel objects.\n        /// </summary>\n        private class OpcNodeModelComparer : EqualityComparer<OpcNodeModel>\n        {\n            /// <inheritdoc/>\n            public override bool Equals(OpcNodeModel? node1, OpcNodeModel? node2)\n            {\n                return node1.IsSame(node2);\n            }\n\n            /// <inheritdoc/>\n            public override int GetHashCode(OpcNodeModel node)\n            {\n                return OpcNodeModelEx.GetHashCode(node);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedDataItemsModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Data items extensions\n    /// </summary>\n    public static class PublishedDataItemsModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedDataItemsModel? Clone(this PublishedDataItemsModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                PublishedData = model.PublishedData?.Select(d => d.Clone()).ToList()\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedDataSetEventModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Events extensions\n    /// </summary>\n    public static class PublishedDataSetEventModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedDataSetEventModel? Clone(this PublishedDataSetEventModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                Filter = model.Filter.Clone(),\n                Triggering = model.Triggering.Clone(),\n                SelectedFields = model.SelectedFields?\n                    .Select(f => f.Clone())\n                    .ToList(),\n                ConditionHandling = model.ConditionHandling.Clone()\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedDataSetModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Published dataset extensions\n    /// </summary>\n    public static class PublishedDataSetModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedDataSetModel? Clone(this PublishedDataSetModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                DataSetMetaData = model.DataSetMetaData.Clone(),\n                DataSetSource = model.DataSetSource.Clone(),\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedDataSetSettingsModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    /// <summary>\n    /// Settings extensions\n    /// </summary>\n    public static class PublishedDataSetSettingsModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static PublishedDataSetSettingsModel? Clone(this PublishedDataSetSettingsModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedDataSetSourceModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Dataset source extensions\n    /// </summary>\n    public static class PublishedDataSetSourceModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedDataSetSourceModel? Clone(this PublishedDataSetSourceModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                PublishedEvents = model.PublishedEvents.Clone(),\n                PublishedVariables = model.PublishedVariables.Clone(),\n                Connection = model.Connection.Clone(),\n                SubscriptionSettings = model.SubscriptionSettings.Clone()\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedDataSetTriggerModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// trigger models extensions\n    /// </summary>\n    public static class PublishedDataSetTriggerModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedDataSetTriggerModel? Clone(this PublishedDataSetTriggerModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                PublishedVariables = model.PublishedVariables.Clone(),\n                PublishedEvents = model.PublishedEvents.Clone()\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedDataSetVariableModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Events extensions\n    /// </summary>\n    public static class PublishedDataSetVariableModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedDataSetVariableModel? Clone(this PublishedDataSetVariableModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                Triggering = model.Triggering.Clone(),\n                SubstituteValue = model.SubstituteValue?.Copy()\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedEventItemsModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Data items extensions\n    /// </summary>\n    public static class PublishedEventItemsModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedEventItemsModel? Clone(this PublishedEventItemsModel? model)\n        {\n            return model == null ? null : (model with\n            {\n                PublishedData = model.PublishedData?.Select(d => d.Clone()).ToList()\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/PublishedNodesEntryModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Config.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Text;\n\n    /// <summary>\n    /// PublishedNodesEntryModel extensions\n    /// </summary>\n    public static class PublishedNodesEntryModelEx\n    {\n        /// <summary>\n        /// Get unique identifier for the group\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static string GetUniqueWriterGroupId(this PublishedNodesEntryModel model)\n        {\n            var id = new StringBuilder();\n            if (!string.IsNullOrEmpty(model.PublisherId))\n            {\n                id.Append(model.PublisherId);\n            }\n            if (!string.IsNullOrEmpty(model.DataSetWriterGroup))\n            {\n                id.Append(model.DataSetWriterGroup);\n            }\n            if (!string.IsNullOrEmpty(model.WriterGroupRootNodeId))\n            {\n                id.Append(model.WriterGroupRootNodeId);\n            }\n            if (!string.IsNullOrEmpty(model.WriterGroupType))\n            {\n                id.Append(model.WriterGroupType);\n            }\n            if (model.WriterGroupTransport != null)\n            {\n                id.Append(model.WriterGroupTransport);\n            }\n            if (!string.IsNullOrEmpty(model.WriterGroupTransportConfiguration))\n            {\n                id.Append(model.WriterGroupTransportConfiguration);\n            }\n            if (model.WriterGroupQualityOfService != null)\n            {\n                id.Append(model.WriterGroupQualityOfService.Value);\n            }\n            if (!string.IsNullOrEmpty(model.WriterGroupQueueName))\n            {\n                id.Append(model.WriterGroupQueueName);\n            }\n            if (model.MessageEncoding != null)\n            {\n                id.Append(model.MessageEncoding.Value);\n            }\n            if (model.MessagingMode != null)\n            {\n                id.Append(model.MessagingMode.Value);\n            }\n            if (model.BatchSize != null)\n            {\n                id.Append(model.BatchSize.Value);\n            }\n            var batchTriggerInterval = model.GetNormalizedBatchTriggerInterval();\n            if (batchTriggerInterval != null)\n            {\n                id.Append(batchTriggerInterval.Value.TotalMilliseconds);\n            }\n            if (model.WriterGroupPartitions != null)\n            {\n                id.Append(model.WriterGroupPartitions.Value);\n            }\n            if (model.WriterGroupMessageTtlTimepan != null)\n            {\n                id.Append(model.WriterGroupMessageTtlTimepan.Value);\n            }\n            if (model.WriterGroupMessageRetention == true)\n            {\n                id.AppendLine();\n            }\n            return id.ToString().ToSha1Hash();\n        }\n\n        /// <summary>\n        /// Validates if the entry has same group as the model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        public static bool HasSameWriterGroup(this PublishedNodesEntryModel model,\n            PublishedNodesEntryModel that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n            if (!string.Equals(model.PublisherId ?? string.Empty,\n                that.PublisherId ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.DataSetWriterGroup,\n                that.DataSetWriterGroup, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.WriterGroupType ?? string.Empty,\n                that.WriterGroupType ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.WriterGroupRootNodeId ?? string.Empty,\n                that.WriterGroupRootNodeId ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (model.WriterGroupTransport != that.WriterGroupTransport)\n            {\n                return false;\n            }\n            if (!string.Equals(model.WriterGroupTransportConfiguration ?? string.Empty,\n                that.WriterGroupTransportConfiguration ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (model.WriterGroupQualityOfService != that.WriterGroupQualityOfService)\n            {\n                return false;\n            }\n            if (!string.Equals(model.WriterGroupQueueName ?? string.Empty,\n                that.WriterGroupQueueName ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (model.MessageEncoding != that.MessageEncoding)\n            {\n                return false;\n            }\n            if (model.MessagingMode != that.MessagingMode)\n            {\n                return false;\n            }\n            if (model.BatchSize != that.BatchSize)\n            {\n                return false;\n            }\n            if (model.GetNormalizedBatchTriggerInterval() !=\n                that.GetNormalizedBatchTriggerInterval())\n            {\n                return false;\n            }\n            if (model.WriterGroupPartitions != that.WriterGroupPartitions)\n            {\n                return false;\n            }\n            if (model.WriterGroupMessageRetention != that.WriterGroupMessageRetention)\n            {\n                return false;\n            }\n            if (model.WriterGroupMessageTtlTimepan != that.WriterGroupMessageTtlTimepan)\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Create connection from entry\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"credential\"></param>\n        /// <returns></returns>\n        public static ConnectionModel ToConnectionModel(this PublishedNodesEntryModel entry,\n            Func<PublishedNodesEntryModel, CredentialModel>? credential = null)\n        {\n            credential ??= e => e.ToCredentialModel();\n            return new ConnectionModel\n            {\n                Options =\n                    (entry.UseReverseConnect == true ?\n                            ConnectionOptions.UseReverseConnect : ConnectionOptions.None) |\n                    (entry.DisableSubscriptionTransfer == true ?\n                            ConnectionOptions.NoSubscriptionTransfer : ConnectionOptions.None) |\n                    (entry.DumpConnectionDiagnostics == true ?\n                            ConnectionOptions.DumpDiagnostics : ConnectionOptions.None),\n                Endpoint = new EndpointModel\n                {\n                    Url = entry.EndpointUrl,\n                    SecurityPolicy = entry.EndpointSecurityPolicy,\n                    SecurityMode = entry.EndpointSecurityMode ??\n                    ((entry.UseSecurity ?? false) ? // Default for backcompat is no security\n                        SecurityMode.NotNone : SecurityMode.None)\n                },\n                User =\n                    entry.OpcAuthenticationMode == OpcAuthenticationMode.UsernamePassword ||\n                    entry.OpcAuthenticationMode == OpcAuthenticationMode.Certificate ?\n                        credential(entry) : null\n            };\n        }\n\n        /// <summary>\n        /// Create a new published nodes entry model. This is used only for the legacy\n        /// API to start, stop, bulk and list nodes. If the connection model uses the\n        /// group field it is used as writer group identifier.\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedNodesEntryModel? ToPublishedNodesEntry(this ConnectionModel model)\n        {\n            if (model?.Endpoint is null)\n            {\n                return null;\n            }\n\n            var useSecurity =\n                model.Endpoint.SecurityMode == SecurityMode.None ? false :\n                model.Endpoint.SecurityMode == SecurityMode.NotNone ? true :\n                (bool?)null;\n\n            return new PublishedNodesEntryModel\n            {\n                EndpointUrl = model.Endpoint.Url,\n                UseSecurity = useSecurity,\n                EndpointSecurityMode = !useSecurity.HasValue ? model.Endpoint.SecurityMode : null,\n                EndpointSecurityPolicy = model.Endpoint.SecurityPolicy,\n                OpcAuthenticationMode = ToOpcAuthenticationMode(model.User?.Type),\n                OpcAuthenticationPassword = model.User.GetPassword(),\n                OpcAuthenticationUsername = model.User.GetUserName(),\n                DataSetWriterGroup = model.Group,\n                UseReverseConnect =\n                    model.Options.HasFlag(ConnectionOptions.UseReverseConnect) ? true : null,\n                DisableSubscriptionTransfer =\n                    model.Options.HasFlag(ConnectionOptions.NoSubscriptionTransfer) ? true : null,\n                MessageEncoding = MessageEncoding.Json,\n                MessagingMode = MessagingMode.FullSamples,\n                OpcNodes = []\n            };\n        }\n\n        /// <summary>\n        /// Convert to mode\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        internal static OpcAuthenticationMode ToOpcAuthenticationMode(this CredentialType? type)\n        {\n            switch (type)\n            {\n                case CredentialType.UserName:\n                    return OpcAuthenticationMode.UsernamePassword;\n                case CredentialType.X509Certificate:\n                    return OpcAuthenticationMode.Certificate;\n                default:\n                    return OpcAuthenticationMode.Anonymous;\n            }\n        }\n\n        /// <summary>\n        /// Convert to credential model\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        internal static CredentialModel ToCredentialModel(this PublishedNodesEntryModel entry)\n        {\n            switch (entry.OpcAuthenticationMode)\n            {\n                case OpcAuthenticationMode.UsernamePassword:\n                case OpcAuthenticationMode.Certificate:\n                    var user = entry.OpcAuthenticationUsername ?? string.Empty;\n                    var password = entry.OpcAuthenticationPassword ?? string.Empty;\n                    if ((!string.IsNullOrEmpty(entry.EncryptedAuthUsername) && string.IsNullOrEmpty(user)) ||\n                        (!string.IsNullOrEmpty(entry.EncryptedAuthPassword) && string.IsNullOrEmpty(password)))\n                    {\n                        throw new NotSupportedException(\"No crypto provider to decrypt encrypted username.\");\n                    }\n                    return new CredentialModel\n                    {\n                        Type = entry.OpcAuthenticationMode == OpcAuthenticationMode.Certificate ?\n                            CredentialType.X509Certificate :\n                            CredentialType.UserName,\n                        Value = new UserIdentityModel { User = user, Password = password }\n                    };\n            }\n            return new CredentialModel\n            {\n                Type = CredentialType.None\n            };\n        }\n\n        /// <summary>\n        /// Return a cloaked published nodes entry that can be used as lookup input to\n        /// <see cref=\"HasSameDataSet(PublishedNodesEntryModel, PublishedNodesEntryModel)\"/>\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static PublishedNodesEntryModel? ToDataSetEntry(this PublishedNodesEntryModel? model)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return model with\n            {\n                NodeId = null,\n                EncryptedAuthPassword = null,\n                OpcAuthenticationPassword = null,\n                OpcNodes = null\n            };\n        }\n\n        /// <summary>\n        /// Get a unique data set writer id from the entry model. Excludes the\n        /// writer group which is assumed be scoping this id already.\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"publishingInterval\"></param>\n        /// <returns></returns>\n        public static string GetUniqueDataSetWriterId(this PublishedNodesEntryModel model,\n            TimeSpan? publishingInterval = null)\n        {\n            var id = new StringBuilder();\n            if (!string.IsNullOrEmpty(model.DataSetWriterId))\n            {\n                id.Append(model.DataSetWriterId);\n            }\n            if (!string.IsNullOrEmpty(model.EndpointUrl))\n            {\n                id.Append(model.EndpointUrl);\n            }\n            if (model.UseReverseConnect == true)\n            {\n                id.AppendLine();\n            }\n            if (model.DisableSubscriptionTransfer == true)\n            {\n                id.AppendLine();\n            }\n            var securityMode = model.EndpointSecurityMode ??\n                ((model.UseSecurity ?? false) ? SecurityMode.NotNone : SecurityMode.None);\n            if (securityMode != SecurityMode.None)\n            {\n                id.Append(securityMode);\n            }\n            if (!string.IsNullOrEmpty(model.EndpointSecurityPolicy))\n            {\n                id.Append(model.EndpointSecurityPolicy);\n            }\n            if (model.OpcAuthenticationMode != OpcAuthenticationMode.Anonymous)\n            {\n                id.Append(model.OpcAuthenticationMode);\n            }\n            if (!string.IsNullOrEmpty(model.OpcAuthenticationUsername))\n            {\n                id.Append(model.OpcAuthenticationUsername);\n            }\n            if (!string.IsNullOrEmpty(model.OpcAuthenticationPassword))\n            {\n                id.Append(model.OpcAuthenticationPassword.ToSha1Hash());\n            }\n            if (!string.IsNullOrEmpty(model.EncryptedAuthUsername))\n            {\n                id.Append(model.EncryptedAuthUsername);\n            }\n            if (!string.IsNullOrEmpty(model.EncryptedAuthPassword))\n            {\n                id.Append(model.EncryptedAuthPassword.ToSha1Hash());\n            }\n            if (!string.IsNullOrEmpty(model.DataSetName))\n            {\n                id.Append(model.DataSetName);\n            }\n            var publishingIntervalResolved = publishingInterval ??\n                model.GetNormalizedDataSetPublishingInterval();\n            if (publishingIntervalResolved != null)\n            {\n                id.Append(publishingIntervalResolved.Value.TotalMilliseconds);\n            }\n            if (model.DataSetClassId != Guid.Empty)\n            {\n                id.Append(model.DataSetClassId);\n            }\n            if (model.DataSetKeyFrameCount != null)\n            {\n                id.Append(model.DataSetKeyFrameCount.Value);\n            }\n            if (model.DataSetType != null)\n            {\n                id.Append(model.DataSetType);\n            }\n            if (model.DataSetRootNodeId != null)\n            {\n                id.Append(model.DataSetRootNodeId);\n            }\n            if (model.DisableSubscriptionTransfer != null)\n            {\n                id.Append(model.DisableSubscriptionTransfer.Value);\n            }\n            if (model.SendKeepAliveDataSetMessages == true)\n            {\n                id.AppendLine();\n            }\n            if (model.SendKeepAliveAsKeyFrameMessages == true)\n            {\n                id.AppendLine();\n            }\n            if (model.Priority != null)\n            {\n                id.Append(model.Priority.Value);\n            }\n            if (model.MaxKeepAliveCount != null)\n            {\n                id.Append(model.MaxKeepAliveCount.Value);\n            }\n            var metadataUpdateTime = model.GetNormalizedMetaDataUpdateTime();\n            if (metadataUpdateTime != null)\n            {\n                id.Append(metadataUpdateTime.Value.TotalMilliseconds);\n            }\n            var samplingInterval = model.GetNormalizedDataSetSamplingInterval();\n            if (samplingInterval != null)\n            {\n                id.Append(samplingInterval.Value.TotalMilliseconds);\n            }\n            var heartbeatInterval = model.GetNormalizedDefaultHeartbeatInterval();\n            if (heartbeatInterval != null)\n            {\n                id.Append(heartbeatInterval.Value.TotalMilliseconds);\n            }\n            if (model.DefaultHeartbeatBehavior != null)\n            {\n                id.Append(model.DefaultHeartbeatBehavior.Value);\n            }\n            if (model.QualityOfService != null)\n            {\n                id.Append(model.QualityOfService.Value);\n            }\n            if (!string.IsNullOrEmpty(model.QueueName))\n            {\n                id.Append(model.QueueName);\n            }\n            if (!string.IsNullOrEmpty(model.MetaDataQueueName))\n            {\n                id.Append(model.MetaDataQueueName);\n            }\n            if ((model.DataSetRouting ?? DataSetRoutingMode.None)\n                != DataSetRoutingMode.None)\n            {\n                id.Append(model.DataSetRouting.ToString());\n            }\n            if (model.RepublishAfterTransfer != null)\n            {\n                id.Append(model.RepublishAfterTransfer.Value);\n            }\n            if (model.OpcNodeWatchdogTimespan != null)\n            {\n                id.Append(model.OpcNodeWatchdogTimespan.Value);\n            }\n            if (model.DataSetWriterWatchdogBehavior != null)\n            {\n                id.Append(model.DataSetWriterWatchdogBehavior.Value);\n            }\n            if (model.OpcNodeWatchdogCondition != null)\n            {\n                id.Append(model.OpcNodeWatchdogCondition.Value);\n            }\n            if (model.DataSetFetchDisplayNames != null)\n            {\n                id.Append(model.DataSetFetchDisplayNames.Value);\n            }\n            if (model.MessageTtlTimespan != null)\n            {\n                id.Append(model.MessageTtlTimespan.Value);\n            }\n            if (model.MessageRetention == true)\n            {\n                id.AppendLine();\n            }\n            if (!string.IsNullOrEmpty(model.DataSetSourceUri))\n            {\n                id.Append(model.DataSetSourceUri);\n            }\n            if (!string.IsNullOrEmpty(model.DataSetSubject))\n            {\n                id.Append(model.DataSetSubject);\n            }\n            Debug.Assert(id.Length != 0); // Should always have an endpoint mixed in\n            return id.ToString().ToSha1Hash();\n        }\n\n        /// <summary>\n        /// Validates if the entry has same data set definition as the model.\n        /// Comarison excludes OpcNodes and publishing intervals.\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        public static bool HasSameDataSet(this PublishedNodesEntryModel model,\n            PublishedNodesEntryModel that)\n        {\n            if (!model.HasSameWriterGroup(that))\n            {\n                return false;\n            }\n\n            if (model.EndpointUrl != that.EndpointUrl)\n            {\n                return false;\n            }\n            if ((model.UseReverseConnect ?? false) !=\n                (that.UseReverseConnect ?? false))\n            {\n                return false;\n            }\n            if ((model.DisableSubscriptionTransfer ?? false) !=\n                (that.DisableSubscriptionTransfer ?? false))\n            {\n                return false;\n            }\n            if ((model.UseSecurity ?? false) != (that.UseSecurity ?? false))\n            {\n                return false;\n            }\n            if ((model.EndpointSecurityMode ??\n                    ((model.UseSecurity ?? false) ? SecurityMode.NotNone : SecurityMode.None)) !=\n                (that.EndpointSecurityMode ??\n                    ((that.UseSecurity ?? false) ? SecurityMode.NotNone : SecurityMode.None)))\n            {\n                return false;\n            }\n            if (model.EndpointSecurityPolicy != that.EndpointSecurityPolicy)\n            {\n                return false;\n            }\n            if (model.OpcAuthenticationMode != that.OpcAuthenticationMode)\n            {\n                return false;\n            }\n            if (!string.Equals(model.OpcAuthenticationUsername ?? string.Empty,\n                that.OpcAuthenticationUsername ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.OpcAuthenticationPassword ?? string.Empty,\n                that.OpcAuthenticationPassword ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.EncryptedAuthUsername ?? string.Empty,\n                that.EncryptedAuthUsername ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.EncryptedAuthPassword ?? string.Empty,\n                that.EncryptedAuthPassword ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (model.MaxKeepAliveCount != that.MaxKeepAliveCount)\n            {\n                return false;\n            }\n            if (!string.Equals(model.DataSetWriterId ?? string.Empty,\n                that.DataSetWriterId ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.DataSetName ?? string.Empty,\n                that.DataSetName ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.DataSetType ?? string.Empty,\n                that.DataSetType ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.DataSetRootNodeId ?? string.Empty,\n                that.DataSetRootNodeId ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.DataSetSourceUri ?? string.Empty,\n                that.DataSetSourceUri ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.DataSetSubject ?? string.Empty,\n                that.DataSetSubject ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (model.DataSetClassId != that.DataSetClassId)\n            {\n                return false;\n            }\n            if (model.DataSetKeyFrameCount != that.DataSetKeyFrameCount)\n            {\n                return false;\n            }\n            if (model.DisableSubscriptionTransfer != that.DisableSubscriptionTransfer)\n            {\n                return false;\n            }\n            if ((model.SendKeepAliveDataSetMessages ?? false) !=\n                (that.SendKeepAliveDataSetMessages ?? false))\n            {\n                return false;\n            }\n            if ((model.SendKeepAliveAsKeyFrameMessages ?? false) !=\n                (that.SendKeepAliveAsKeyFrameMessages ?? false))\n            {\n                return false;\n            }\n            if (model.Priority != that.Priority)\n            {\n                return false;\n            }\n            if (model.GetNormalizedMetaDataUpdateTime() !=\n                that.GetNormalizedMetaDataUpdateTime())\n            {\n                return false;\n            }\n            if (model.GetNormalizedDataSetSamplingInterval() !=\n                that.GetNormalizedDataSetSamplingInterval())\n            {\n                return false;\n            }\n            if (model.GetNormalizedDefaultHeartbeatInterval() !=\n                that.GetNormalizedDefaultHeartbeatInterval())\n            {\n                return false;\n            }\n            if (model.DefaultHeartbeatBehavior != that.DefaultHeartbeatBehavior)\n            {\n                return false;\n            }\n            if (model.QualityOfService != that.QualityOfService)\n            {\n                return false;\n            }\n            if (!string.Equals(model.QueueName ?? string.Empty,\n                that.QueueName ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n            if (!string.Equals(model.MetaDataQueueName ?? string.Empty,\n                that.MetaDataQueueName ?? string.Empty, StringComparison.Ordinal))\n            {\n                return false;\n            }\n\n            if ((model.DataSetRouting ?? DataSetRoutingMode.None) !=\n                (that.DataSetRouting ?? DataSetRoutingMode.None))\n            {\n                return false;\n            }\n            if (model.RepublishAfterTransfer != that.RepublishAfterTransfer)\n            {\n                return false;\n            }\n            if (model.OpcNodeWatchdogTimespan != that.OpcNodeWatchdogTimespan)\n            {\n                return false;\n            }\n            if (model.DataSetWriterWatchdogBehavior != that.DataSetWriterWatchdogBehavior)\n            {\n                return false;\n            }\n            if (model.OpcNodeWatchdogCondition != that.OpcNodeWatchdogCondition)\n            {\n                return false;\n            }\n            if (model.DataSetFetchDisplayNames != that.DataSetFetchDisplayNames)\n            {\n                return false;\n            }\n            if (model.MessageRetention != that.MessageRetention)\n            {\n                return false;\n            }\n            if (model.MessageTtlTimespan != that.MessageTtlTimespan)\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a PublishedNodesEntryModel's MetaDataUpdateTime\n        /// </summary>\n        /// <param name=\"model\"></param>\n        public static TimeSpan? GetNormalizedMetaDataUpdateTime(\n            this PublishedNodesEntryModel model)\n        {\n            return model.MetaDataUpdateTimeTimespan\n                .GetTimeSpanFromMiliseconds(model.MetaDataUpdateTime);\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a PublishedNodesEntryModel's BatchTriggerInterval\n        /// </summary>\n        /// <param name=\"model\"></param>\n        public static TimeSpan? GetNormalizedBatchTriggerInterval(\n            this PublishedNodesEntryModel model)\n        {\n            return model.BatchTriggerIntervalTimespan\n                .GetTimeSpanFromMiliseconds(model.BatchTriggerInterval);\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a PublishedNodesEntryModel's SamplingInterval\n        /// </summary>\n        /// <param name=\"model\"></param>\n        public static TimeSpan? GetNormalizedDataSetSamplingInterval(\n            this PublishedNodesEntryModel model)\n        {\n            return model.DataSetSamplingIntervalTimespan\n                .GetTimeSpanFromMiliseconds(model.DataSetSamplingInterval);\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a PublishedNodesEntryModel's DefaultHeartbeatInterval\n        /// </summary>\n        /// <param name=\"model\"></param>\n        public static TimeSpan? GetNormalizedDefaultHeartbeatInterval(\n            this PublishedNodesEntryModel model)\n        {\n            return model.DefaultHeartbeatIntervalTimespan\n                .GetTimeSpanFromMiliseconds(model.DefaultHeartbeatInterval);\n        }\n\n        /// <summary>\n        /// Retrieves the timespan flavor of a PublishedNodesEntryModel's DataSetPublishingInterval\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"defaultPublishingTimespan\"></param>\n        public static TimeSpan? GetNormalizedDataSetPublishingInterval(\n            this PublishedNodesEntryModel model, TimeSpan? defaultPublishingTimespan = null)\n        {\n            return model.DataSetPublishingIntervalTimespan\n                .GetTimeSpanFromMiliseconds(model.DataSetPublishingInterval, defaultPublishingTimespan);\n        }\n\n        /// <summary>\n        /// Promote the default publishing interval of the model to all of\n        /// its nodes to support apples to apples comparison.\n        /// </summary>\n        /// <param name=\"model\"></param>\n        public static PublishedNodesEntryModel PropagatePublishingIntervalToNodes(\n            this PublishedNodesEntryModel model)\n        {\n            if (model.OpcNodes != null && model.OpcNodes.Count != 0)\n            {\n                var rootInterval = model.GetNormalizedDataSetPublishingInterval();\n                if (rootInterval == null)\n                {\n                    return model;\n                }\n                foreach (var node in model.OpcNodes)\n                {\n                    var nodeInterval = node.GetNormalizedPublishingInterval();\n                    if (nodeInterval == null)\n                    {\n                        // Set publishing interval from root\n                        node.OpcPublishingIntervalTimespan = rootInterval;\n                    }\n                }\n            }\n            // Remove root interval\n            model.DataSetPublishingInterval = null;\n            model.DataSetPublishingIntervalTimespan = null;\n            return model;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/RegistryOperationContextModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n\n    /// <summary>\n    /// Operation extensions\n    /// </summary>\n    public static class RegistryOperationContextModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <returns></returns>\n        public static OperationContextModel? Clone(\n            this OperationContextModel? model, TimeProvider timeProvider)\n        {\n            model = model.Validate(timeProvider);\n            return new OperationContextModel\n            {\n                AuthorityId = model.AuthorityId,\n                Time = model.Time\n            };\n        }\n\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <returns></returns>\n        public static OperationContextModel Validate(\n            this OperationContextModel? context, TimeProvider timeProvider)\n        {\n            if (context == null)\n            {\n                context = new OperationContextModel\n                {\n                    AuthorityId = null, // Should throw if configured\n                    Time = timeProvider.GetUtcNow()\n                };\n            }\n            return context;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/SimpleAttributeOperandModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Attribute operand extensions\n    /// </summary>\n    public static class SimpleAttributeOperandModelEx\n    {\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static SimpleAttributeOperandModel? Clone(this SimpleAttributeOperandModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n\n        /// <summary>\n        /// Compare operands\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this SimpleAttributeOperandModel? model, SimpleAttributeOperandModel? other)\n        {\n            if (ReferenceEquals(model, other))\n            {\n                return true;\n            }\n            if (model is null || other is null)\n            {\n                return false;\n            }\n            if (model.AttributeId != other.AttributeId)\n            {\n                return false;\n            }\n            if (!model.BrowsePath.SequenceEqualsSafe(other.BrowsePath))\n            {\n                return false;\n            }\n            if (model.IndexRange != other.IndexRange)\n            {\n                return false;\n            }\n            if (model.TypeDefinitionId != other.TypeDefinitionId)\n            {\n                return false;\n            }\n            if (model.DisplayName != other.DisplayName)\n            {\n                return false;\n            }\n            if (model.DataSetClassFieldId != other.DataSetClassFieldId)\n            {\n                return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/UserIdentityModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// User Identity model extensions\n    /// </summary>\n    public static class UserIdentityModelEx\n    {\n        /// <summary>\n        /// Equality comparison\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"that\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this UserIdentityModel? model, UserIdentityModel? that)\n        {\n            if (ReferenceEquals(model, that))\n            {\n                return true;\n            }\n\n            model ??= new UserIdentityModel();\n            that ??= new UserIdentityModel();\n\n            if ((that.User ?? string.Empty) != (model.User ?? string.Empty))\n            {\n                return false;\n            }\n            if ((that.Password ?? string.Empty) != (model.Password ?? string.Empty))\n            {\n                return false;\n            }\n            if ((that.Thumbprint ?? string.Empty) != (model.Thumbprint ?? string.Empty))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Deep clone\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static UserIdentityModel? Clone(this UserIdentityModel? model)\n        {\n            return model == null ? null : (model with { });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/X509CertificateChainModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Security.Cryptography.X509Certificates;\n\n    /// <summary>\n    /// Certificate Chain extensions\n    /// </summary>\n    public static class X509CertificateChainModelEx\n    {\n        /// <summary>\n        /// Convert raw buffer to certificate chain\n        /// </summary>\n        /// <param name=\"rawCertificates\"></param>\n        /// <returns></returns>\n        public static X509CertificateChainModel ToCertificateChain(\n            this byte[] rawCertificates)\n        {\n            var certificates = new List<X509Certificate2>();\n            try\n            {\n                while (true)\n                {\n                    var cur = X509CertificateLoader.LoadCertificate(rawCertificates);\n                    certificates.Add(cur);\n                    if (cur.RawData.Length >= rawCertificates.Length)\n                    {\n                        break;\n                    }\n                    rawCertificates = rawCertificates.AsSpan()[cur.RawData.Length..]\n                        .ToArray();\n                }\n                return new X509CertificateChainModel\n                {\n                    Chain = certificates\n                        .ConvertAll(c => c.ToServiceModel())\n                };\n            }\n            finally\n            {\n                certificates.ForEach(c => c.Dispose());\n            }\n        }\n\n        /// <summary>\n        /// Gets the leaf thumprint\n        /// </summary>\n        /// <param name=\"rawCertificates\"></param>\n        /// <returns></returns>\n        public static string? ToThumbprint(this byte[] rawCertificates)\n        {\n            try\n            {\n                var chain = rawCertificates.ToCertificateChain()?.Chain;\n                if (chain?.Count > 0)\n                {\n                    return chain[chain.Count - 1]?.Thumbprint;\n                }\n                return null;\n            }\n            catch\n            {\n                // Fall back to sha1 which was the previous thumprint algorithm\n                return rawCertificates.ToSha1Hash();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Extensions/X509CertificateModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Security.Cryptography.X509Certificates;\n\n    /// <summary>\n    /// Certificate extension\n    /// </summary>\n    public static class X509CertificateModelEx\n    {\n        /// <summary>\n        /// To service model\n        /// </summary>\n        /// <param name=\"cert\"></param>\n        /// <returns></returns>\n        public static X509CertificateModel ToServiceModel(this X509Certificate2 cert)\n        {\n            return new X509CertificateModel\n            {\n                Pfx = cert.Export(X509ContentType.Pfx),\n                NotAfterUtc = cert.NotAfter,\n                NotBeforeUtc = cert.NotBefore,\n                SerialNumber = cert.GetSerialNumberString(),\n                Subject = cert.Subject,\n                HasPrivateKey = cert.HasPrivateKey,\n                Thumbprint = cert.Thumbprint,\n                SelfSigned = IsSelfIssued(cert) ? true : null\n            };\n        }\n\n        /// <summary>\n        /// Test self issued - no validation is done on signature.\n        /// </summary>\n        /// <param name=\"cert\"></param>\n        /// <returns></returns>\n        private static bool IsSelfIssued(this X509Certificate2 cert)\n        {\n            return cert.IssuerName.RawData\n                .SequenceEqualsSafe(cert.SubjectName.RawData);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/ICertificateServices.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Get endpoint certificate\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface ICertificateServices<T>\n    {\n        /// <summary>\n        /// Get endpoint certificate\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<X509CertificateChainModel> GetEndpointCertificateAsync(\n            T endpoint, CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/IConnectionServices.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Connection services\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IConnectionServices<T>\n    {\n        /// <summary>\n        /// Test connection\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<TestConnectionResponseModel> TestConnectionAsync(T endpoint,\n            TestConnectionRequestModel request, CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/IFileSystemServices.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// File system services expose services as per the file transfer specification\n    /// https://reference.opcfoundation.org/Core/Part20/v105/docs/#4.3.3.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IFileSystemServices<T>\n    {\n        /// <summary>\n        /// Get all file systems on the server\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<ServiceResponse<FileSystemObjectModel>> GetFileSystemsAsync(\n            T endpoint, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get all directories under a filesystem or directory\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"fileSystemOrDirectory\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<IEnumerable<FileSystemObjectModel>>> GetDirectoriesAsync(\n            T endpoint, FileSystemObjectModel fileSystemOrDirectory,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get all files in a directory or filesystem\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"fileSystemOrDirectory\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<IEnumerable<FileSystemObjectModel>>> GetFilesAsync(\n            T endpoint, FileSystemObjectModel fileSystemOrDirectory,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get parent directory or filesystem\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"fileOrDirectoryObject\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<FileSystemObjectModel>> GetParentAsync(T endpoint,\n            FileSystemObjectModel fileOrDirectoryObject, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get file information for a file\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"file\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<FileInfoModel>> GetFileInfoAsync(T endpoint,\n            FileSystemObjectModel file, CancellationToken ct = default);\n\n        /// <summary>\n        /// Opens the file for reading. Closing the stream will close the file.\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"file\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<Stream>> OpenReadAsync(T endpoint, FileSystemObjectModel file,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Opens the file for writing, closing the stream will close the file.\n        /// Optionally options can be provided to control the write mode and\n        /// alternative close methods to use.\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"file\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<Stream>> OpenWriteAsync(T endpoint, FileSystemObjectModel file,\n            FileOpenWriteOptionsModel? options = null, CancellationToken ct = default);\n\n        /// <summary>\n        /// Create parent directory under a file system or directory.\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"fileSystemOrDirectory\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<FileSystemObjectModel>> CreateDirectoryAsync(T endpoint,\n            FileSystemObjectModel fileSystemOrDirectory, string name,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Create a file in the directory\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"fileSystemOrDirectory\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<FileSystemObjectModel>> CreateFileAsync(T endpoint,\n            FileSystemObjectModel fileSystemOrDirectory, string name,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete a file or directory with the name from the directory\n        /// or filesystem. If the name is omitted the object is itself\n        /// deleted from its parent object.\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"fileOrDirectoryObject\"></param>\n        /// <param name=\"parentFileSystemOrDirectory\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResultModel> DeleteFileSystemObjectAsync(T endpoint,\n            FileSystemObjectModel fileOrDirectoryObject,\n            FileSystemObjectModel? parentFileSystemOrDirectory = null,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/IHistoryServices.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Historian services\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IHistoryServices<T>\n    {\n        /// <summary>\n        /// Replace events\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryReplaceEventsAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Insert events\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryInsertEventsAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Update or replace events\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryUpsertEventsAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete events\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryDeleteEventsAsync(T endpoint,\n            HistoryUpdateRequestModel<DeleteEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete values at specified times\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryDeleteValuesAtTimesAsync(T endpoint,\n            HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete modified values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryDeleteModifiedValuesAsync(T endpoint,\n            HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryDeleteValuesAsync(T endpoint,\n            HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Replace values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryReplaceValuesAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Insert values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryInsertValuesAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Update or replace values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryUpsertValuesAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read historic events\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricEventModel[]>> HistoryReadEventsAsync(\n            T endpoint, HistoryReadRequestModel<ReadEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read next set of events\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadNextResponseModel<HistoricEventModel[]>> HistoryReadEventsNextAsync(\n            T endpoint, HistoryReadNextRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Read historic values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read historic values at times\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAtTimesAsync(\n            T endpoint, HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read processed historic values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadProcessedValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read modified values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadModifiedValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read next set of historic values\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadNextResponseModel<HistoricValueModel[]>> HistoryReadValuesNextAsync(\n            T endpoint, HistoryReadNextRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Stream values\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAsync(T endpoint,\n            HistoryReadRequestModel<ReadValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Stream modified historic values\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<HistoricValueModel> HistoryStreamModifiedValuesAsync(T endpoint,\n            HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Stream historic values at times\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAtTimesAsync(T endpoint,\n            HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Stream processed historic values\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<HistoricValueModel> HistoryStreamProcessedValuesAsync(T endpoint,\n            HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Stream modified historic events\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<HistoricEventModel> HistoryStreamEventsAsync(T endpoint,\n            HistoryReadRequestModel<ReadEventsDetailsModel> request,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/INetworkDiscovery.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Network discovery services\n    /// </summary>\n    public interface INetworkDiscovery\n    {\n        /// <summary>\n        /// Discovery server in network with discovery url.\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task RegisterAsync(ServerRegistrationRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Start a discovery run for servers in network.\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task DiscoverAsync(DiscoveryRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Cancel a discovery run that is ongoing\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task CancelAsync(DiscoveryCancelRequestModel request,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/INodeServices.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Node services expose the OPC UA service sets\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface INodeServices<T>\n    {\n        /// <summary>\n        /// Get the capabilities of the server\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServerCapabilitiesModel> GetServerCapabilitiesAsync(T endpoint,\n            RequestHeaderModel? header, CancellationToken ct = default);\n\n        /// <summary>\n        /// Browse nodes on server\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\">Browse request</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<BrowseFirstResponseModel> BrowseFirstAsync(T endpoint,\n            BrowseFirstRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Browse remainder of references\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\">Continuation token</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<BrowseNextResponseModel> BrowseNextAsync(T endpoint,\n            BrowseNextRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Stream node and references\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\">Continuation token</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<BrowseStreamChunkModel> BrowseAsync(T endpoint,\n            BrowseStreamRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Browse by path\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<BrowsePathResponseModel> BrowsePathAsync(T endpoint,\n            BrowsePathRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get the node metadata which includes the fields\n        /// and meta data of the type and can be used when constructing\n        /// event filters or calling methods to pass the correct arguments.\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<NodeMetadataResponseModel> GetMetadataAsync(T endpoint,\n            NodeMetadataRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Compile a query into a filter\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\">The query to compile</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The compiled query</returns>\n        Task<QueryCompilationResponseModel> CompileQueryAsync(T endpoint,\n            QueryCompilationRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Read node value\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ValueReadResponseModel> ValueReadAsync(T endpoint,\n            ValueReadRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Write node value\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ValueWriteResponseModel> ValueWriteAsync(T endpoint,\n            ValueWriteRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get meta data for method call (input and output arguments)\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<MethodMetadataResponseModel> GetMethodMetadataAsync(\n            T endpoint, MethodMetadataRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Call method\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<MethodCallResponseModel> MethodCallAsync(T endpoint,\n            MethodCallRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Read node attributes in batch\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ReadResponseModel> ReadAsync(T endpoint,\n            ReadRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Write node attributes in batch\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<WriteResponseModel> WriteAsync(T endpoint,\n            WriteRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get history server capabilities\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryServerCapabilitiesModel> HistoryGetServerCapabilitiesAsync(\n            T endpoint, RequestHeaderModel? header, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get a node's history configuration\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryConfigurationResponseModel> HistoryGetConfigurationAsync(\n            T endpoint, HistoryConfigurationRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read node history\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<VariantValue>> HistoryReadAsync(T endpoint,\n            HistoryReadRequestModel<VariantValue> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read node history continuation\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadNextResponseModel<VariantValue>> HistoryReadNextAsync(\n            T endpoint, HistoryReadNextRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Update node history\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryUpdateAsync(T endpoint,\n            HistoryUpdateRequestModel<VariantValue> request,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/IPublishServices.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Publish services\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IPublishServices<T>\n    {\n        /// <summary>\n        /// Start publishing values from a node\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishStartResponseModel> PublishStartAsync(T endpoint,\n            PublishStartRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Stop publishing values from a node\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishStopResponseModel> PublishStopAsync(T endpoint,\n            PublishStopRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Configure node values to publish and unpublish in bulk\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishBulkResponseModel> PublishBulkAsync(T endpoint,\n            PublishBulkRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get all published nodes for a server endpoint.\n        /// </summary>\n        /// <param name=\"endpoint\">Server endpoint to talk to</param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishedItemListResponseModel> PublishListAsync(T endpoint,\n            PublishedItemListRequestModel request, CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/IServerDiscovery.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Server discovery interface\n    /// </summary>\n    public interface IServerDiscovery\n    {\n        /// <summary>\n        /// Find a server using the endpoint url in the query\n        /// object. Returns a application registration object only\n        /// if the endpoint is part of the application's endpoint\n        /// list.\n        /// </summary>\n        /// <param name=\"query\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ApplicationRegistrationModel> FindServerAsync(\n            ServerEndpointQueryModel query,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/src/Publisher/Runtime.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using System;\n\n    /// <summary>\n    /// Runtime operations\n    /// </summary>\n    public static class Runtime\n    {\n        /// <summary>\n        /// Crash the process with optional exception\n        /// </summary>\n        public static Action<string, Exception?> FailFast { get; set; }\n            = Environment.FailFast;\n\n        /// <summary>\n        /// Exit process\n        /// </summary>\n        public static Action<int> Exit { get; set; }\n            = Environment.Exit;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Azure.IIoT.OpcUa.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ParallelAlgorithm>aggressive</ParallelAlgorithm>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.0\" />\n    <PackageReference Include=\"coverlet.msbuild\" Version=\"6.0.4\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"Neovolve.Logging.Xunit\" Version=\"6.3.0\" />\n    <PackageReference Include=\"xunit\" Version=\"2.9.3\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"3.1.5\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"Furly.Extensions.Newtonsoft\" Version=\"1.1.54\" />\n    <PackageReference Include=\"JsonSchema.Net\" Version=\"7.4.0\" />\n    <PackageReference Include=\"Microsoft.Json.Schema\" Version=\"2.3.0\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\Azure.IIoT.OpcUa.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Encoders\\Schemas\\**\\*.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"Resources\\*.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/AvroBaseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Opc.Ua;\n    using System;\n    using System.Buffers;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Xml;\n    using Xunit;\n\n    /// <summary>\n    /// Tests for the Json encoder and decoder class.\n    /// </summary>\n    public sealed class AvroBaseTests\n    {\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void TestBoolean(bool value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteBoolean(null, value);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(value, decoder.ReadBoolean(null));\n        }\n\n        [Theory]\n        [InlineData(0u)]\n        [InlineData(1000u)]\n        [InlineData(long.MaxValue)]\n        public void TestLong(long value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteInt64(null, value);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(value, decoder.ReadInt64(null));\n        }\n\n        [Theory]\n        [InlineData(0.0)]\n        [InlineData(Math.PI)]\n        [InlineData(double.MaxValue)]\n        public void TestDouble(double value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteDouble(null, value);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(value, decoder.ReadDouble(null));\n        }\n\n        [Theory]\n        [InlineData(0.0f)]\n        [InlineData((float)Math.PI)]\n        [InlineData(float.MaxValue)]\n        public void TestFloat(float value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteFloat(null, value);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(value, decoder.ReadFloat(null));\n        }\n\n        [Theory]\n        [InlineData(\"test\")]\n        [InlineData(\"12345\")]\n        [InlineData(\"12345678901234567890123456789012345678901234567890123456789012345678901234567890\")]\n        public void TestString(string value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteString(null, value);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(value, decoder.ReadString(null));\n        }\n\n        [Theory]\n        [InlineData(\"test\")]\n        [InlineData(\"12345\")]\n        public void TestByteString(string value)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Encoding.UTF8.GetBytes(value);\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteByteString(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadByteString(null));\n        }\n\n        [Theory]\n        [InlineData(0u)]\n        [InlineData(1000u)]\n        [InlineData(long.MaxValue)]\n        [InlineData(ulong.MaxValue)]\n        public void TestULong(ulong value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteUInt64(null, value);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(value, decoder.ReadUInt64(null));\n        }\n\n        [Theory]\n        [InlineData(StatusCodes.Good)]\n        [InlineData(StatusCodes.Bad)]\n        [InlineData(StatusCodes.Uncertain)]\n        public void TestStatusCode(uint value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteStatusCode(null, value);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(value, decoder.ReadStatusCode(null));\n        }\n\n        [Theory]\n        [InlineData(StatusCodes.Good)]\n        [InlineData(\"test\")]\n        [InlineData(12345)]\n        public void TestVariant(object value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteVariant(null, new Variant(value));\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(value, decoder.ReadVariant(null).Value);\n        }\n\n        [Theory]\n        [InlineData(DiagnosticsLevel.Advanced)]\n        [InlineData(BuiltInType.Int32)]\n        public void TestVariantWithEnumeration(object value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteVariant(null, new Variant(value));\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(Convert.ToInt32(value, CultureInfo.InvariantCulture), decoder.ReadVariant(null).Value);\n        }\n\n        public static TheoryData<VariantHolder> GetValues()\n        {\n            return new TheoryData<VariantHolder>(VariantVariants.GetValues().Select(v => new VariantHolder(v)));\n        }\n\n        [Theory]\n        [MemberData(nameof(GetValues))]\n        public void TestVariantVariants(VariantHolder value)\n        {\n            var expected = value.Variant;\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadVariant(null));\n        }\n\n        [Theory]\n        [InlineData(\"test\")]\n        [InlineData(12345u)]\n        public void TestNodeId(object value)\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            var expected = new NodeId(value, ns);\n            encoder.WriteNodeId(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadNodeId(null));\n        }\n\n        [Theory]\n        [InlineData(\"test\")]\n        [InlineData(12345u)]\n        public void TestExpandedNodeId(object value)\n        {\n            var context = new ServiceMessageContext();\n            context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var srv = context.ServerUris.GetIndexOrAppend(\"Super\");\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            var expected = new ExpandedNodeId(value, 0, \"test.org\", srv);\n            encoder.WriteExpandedNodeId(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadExpandedNodeId(null));\n        }\n\n        [Fact]\n        public void TestDataValue()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            var expected = new DataValue();\n            encoder.WriteDataValue(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadDataValue(null));\n        }\n\n        [Fact]\n        public void TestDataValueNull()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteDataValue(null, null);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.True(Opc.Ua.Utils.IsEqual(new DataValue(),\n                decoder.ReadDataValue(null)));\n        }\n\n        [Fact]\n        public void TestGuid()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteGuid(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadGuid(null));\n        }\n        [Fact]\n        public void TestDateTime()\n        {\n            var context = new ServiceMessageContext();\n            var expected = DateTime.UtcNow;\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteDateTime(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadDateTime(null));\n        }\n        [Fact]\n        public void TestXmlElement()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new XmlDocument();\n            expected.LoadXml(\"<test></test>\");\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteXmlElement(null, expected.DocumentElement);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = new XmlDocument();\n            actual.Load(decoder.ReadXmlElement(null).CreateNavigator().ReadSubtree());\n            Assert.Equal(expected.OuterXml, actual.OuterXml);\n        }\n        [Fact]\n        public void TestQualifiedName()\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var expected = new QualifiedName(\"test\", ns);\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteQualifiedName(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadQualifiedName(null));\n        }\n\n        [Fact]\n        public void TestLocalizedText()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new LocalizedText(\"test\", \"en\");\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteLocalizedText(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadLocalizedText(null));\n        }\n\n        [Fact]\n        public void TestExtensionObject()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExtensionObject(new NodeId(1234), new byte[] { 0, 1, 2, 3 });\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteExtensionObject(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadExtensionObject(null);\n            Assert.Equal(expected.TypeId, actual.TypeId);\n            Assert.Equal(expected.Body, actual.Body);\n        }\n\n        [Fact]\n        public void TestStatusCodeArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new StatusCode[] { StatusCodes.Good, StatusCodes.Bad };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteStatusCodeArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadStatusCodeArray(null);\n            Assert.Equal(expected, actual);\n        }\n\n        [Fact]\n        public void TestNodeIdArray()\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var expected = new NodeId[] { new(123, ns), new(456, ns) };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteNodeIdArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadNodeIdArray(null);\n            Assert.Equal(expected, actual);\n        }\n\n        [Fact]\n        public void TestExpandedNodeIdArray()\n        {\n            var context = new ServiceMessageContext();\n            context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var srv = context.ServerUris.GetIndexOrAppend(\"Super\");\n            var expected = new ExpandedNodeId[] { new(123u, 0, \"test.org\", srv), new(456u, 0, \"test.org\", srv) };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteExpandedNodeIdArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadExpandedNodeIdArray(null);\n            Assert.Equal(expected, actual);\n        }\n\n        [Fact]\n        public void TestInt16()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteInt16(null, 123);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(123, decoder.ReadInt16(null));\n        }\n\n        [Fact]\n        public void TestSByte()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteSByte(null, 123);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(123, decoder.ReadSByte(null));\n        }\n\n        [Fact]\n        public void TestByte()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteByte(null, 123);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(123, decoder.ReadByte(null));\n        }\n\n        [Fact]\n        public void TestDiagnosticInfo()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DiagnosticInfo() { AdditionalInfo = \"dd\" };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteDiagnosticInfo(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var result = decoder.ReadDiagnosticInfo(null);\n            AssertEqual(expected, result);\n        }\n\n        [Fact]\n        public void TestEnum()\n        {\n            var context = new ServiceMessageContext();\n            const DiagnosticsLevel expected = DiagnosticsLevel.Basic;\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteEnumerated(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var result = decoder.ReadEnumerated<DiagnosticsLevel>(null);\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void TestEnumArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DiagnosticsLevel[] { DiagnosticsLevel.Basic, DiagnosticsLevel.Advanced };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteEnumeratedArray(null, expected, null);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadEnumeratedArray<DiagnosticsLevel>(null);\n            Assert.Equal(expected, actual);\n        }\n\n        [Fact]\n        public void TestDiagnosticInfoArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DiagnosticInfo[] { new() { AdditionalInfo = \"dd\" }, new() { AdditionalInfo = string.Empty } };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteDiagnosticInfoArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadDiagnosticInfoArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                var result = actual[i];\n                AssertEqual(expected[i], result);\n            }\n        }\n\n        private static void AssertEqual(DiagnosticInfo x, DiagnosticInfo y)\n        {\n            if (x == y)\n            {\n                return;\n            }\n            Assert.NotNull(x);\n            Assert.NotNull(y);\n            Assert.Equal(x.NamespaceUri, y.NamespaceUri);\n            Assert.Equal(x.LocalizedText, y.LocalizedText);\n            Assert.Equal(x.Locale, y.Locale);\n            Assert.Equal(x.AdditionalInfo, y.AdditionalInfo);\n            Assert.Equal(x.InnerStatusCode, y.InnerStatusCode);\n            Assert.Equal(x.NamespaceUri, y.NamespaceUri);\n            AssertEqual(x.InnerDiagnosticInfo, y.InnerDiagnosticInfo);\n        }\n\n        [Fact]\n        public void TestBooleanArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new bool[] { true, false };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteBooleanArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadBooleanArray(null));\n        }\n\n        [Fact]\n        public void TestSByteArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new sbyte[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteSByteArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadSByteArray(null));\n        }\n\n        [Fact]\n        public void TestByteArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteByteArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadByteArray(null));\n        }\n\n        [Fact]\n        public void TestInt16Array()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new short[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteInt16Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadInt16Array(null));\n        }\n\n        [Fact]\n        public void TestUInt16Array()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ushort[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteUInt16Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadUInt16Array(null));\n        }\n\n        [Fact]\n        public void TestInt32Array()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new int[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteInt32Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadInt32Array(null));\n        }\n\n        [Fact]\n        public void TestUInt32Array()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new uint[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteUInt32Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadUInt32Array(null));\n        }\n\n        [Fact]\n        public void TestInt64Array()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new long[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteInt64Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadInt64Array(null));\n        }\n\n        [Fact]\n        public void TestUInt64Array()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ulong[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteUInt64Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadUInt64Array(null));\n        }\n\n        [Fact]\n        public void TestFloatArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new float[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteFloatArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadFloatArray(null));\n        }\n\n        [Fact]\n        public void TestDoubleArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new double[] { 1, 2, 3 };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteDoubleArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadDoubleArray(null));\n        }\n\n        [Fact]\n        public void TestStringArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new string[] { \"1\", \"2\", \"3\" };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteStringArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadStringArray(null));\n        }\n\n        [Fact]\n        public void TestDateTimeArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DateTime[] { DateTime.UtcNow, DateTime.UtcNow, DateTime.UtcNow };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteDateTimeArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadDateTimeArray(null));\n        }\n\n        [Fact]\n        public void TestGuidArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Uuid[] { (Uuid)Guid.NewGuid(), (Uuid)Guid.NewGuid(), (Uuid)Guid.NewGuid() };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteGuidArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadGuidArray(null));\n        }\n\n        [Fact]\n        public void TestXmlElementArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new XmlDocument();\n            expected.LoadXml(\"<test></test>\");\n            var expectedArray = new XmlElement[] { expected.DocumentElement, expected.DocumentElement };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteXmlElementArray(null, expectedArray);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actualArray = decoder.ReadXmlElementArray(null);\n            Assert.Equal(expectedArray.Length, actualArray.Count);\n            for (var i = 0; i < expectedArray.Length; i++)\n            {\n                var actual = new XmlDocument();\n                actual.Load(actualArray[i].CreateNavigator().ReadSubtree());\n                Assert.Equal(expected.OuterXml, actual.OuterXml);\n            }\n        }\n\n        [Fact]\n        public void TestQualifiedNameArray()\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var expected = new QualifiedName[] { new(\"test\", ns), new(\"test\", ns) };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteQualifiedNameArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadQualifiedNameArray(null));\n        }\n\n        [Fact]\n        public void TestLocalizedTextArray1()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new LocalizedText[] { new(\"test\", \"en\"), new(\"test\", \"en\") };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteLocalizedTextArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadLocalizedTextArray(null));\n        }\n\n        [Fact]\n        public void TestLocalizedTextArray2()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new LocalizedText[] { new(\"test\", \"en\"), new(\"test\", \"en\") };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteArray(null, expected, ValueRanks.OneDimension, BuiltInType.LocalizedText);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var result = decoder.ReadArray(null, ValueRanks.OneDimension, BuiltInType.LocalizedText);\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void TestExtensionObjectArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExtensionObject[] { new(new NodeId(1234), new byte[] { 0, 1, 2, 3 }), new(new NodeId(1234), new byte[] { 0, 1, 2, 3 }) };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteExtensionObjectArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadExtensionObjectArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i].TypeId, actual[i].TypeId);\n                Assert.Equal(expected[i].Body, actual[i].Body);\n            }\n        }\n\n        [Fact]\n        public void TestDataValueArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DataValue[] { new(), new() };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteDataValueArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadDataValueArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i], actual[i]);\n            }\n        }\n\n        [Fact]\n        public void TestVariantArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant[] { new(123), new(\"test\") };\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var actual = decoder.ReadVariantArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i].Value, actual[i].Value);\n            }\n        }\n\n        public static TheoryData<VariantsHolder> GetVariantArrays()\n        {\n            return new TheoryData<VariantsHolder>(VariantVariants.GetValues()\n                .Select(v => new VariantsHolder(Enumerable.Repeat(v, 3).ToArray(), v.TypeInfo)));\n        }\n\n        [Theory]\n        [MemberData(nameof(GetVariantArrays))]\n        public void TestVariantArrayVariants(VariantsHolder value)\n        {\n            var expected = value.Variants.ToArray();\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            Assert.Equal(expected, decoder.ReadVariantArray(null));\n        }\n\n        [Fact]\n        public void TestVariantWithEnumerations()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant(new[] { DiagnosticsLevel.Advanced, DiagnosticsLevel.Advanced });\n            using var stream = new MemoryStream();\n            using var encoder = new SchemalessAvroEncoder(stream, context, true);\n            encoder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var decoder = new SchemalessAvroDecoder(stream, context);\n            var result = decoder.ReadVariant(null).Value;\n            Assert.Equal(new int[] { 1, 1 }, result);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/AvroDataSetTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Avro;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using Xunit;\n\n    public class AvroDataSetTests\n    {\n        [Fact]\n        public void ReadWriteProgramDiagnostic2DataTypeStream()\n        {\n            // Create dummy type\n            var expected = VariantVariants.Complex;\n\n            const int count = 100;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new SchemalessAvroEncoder(stream, context))\n                {\n                    for (var i = 0; i < count; i++)\n                    {\n                        encoder.WriteEncodeable(null, expected, expected.GetType());\n                    }\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new SchemalessAvroDecoder(stream, context))\n            {\n                for (var i = 0; i < count; i++)\n                {\n                    var result = decoder.ReadEncodeable(null, expected.GetType());\n                    Assert.True(result.IsEqual(expected));\n                }\n            }\n        }\n\n        [Fact]\n        public void ReadWriteDataValueWithIntStream()\n        {\n            // Create dummy\n            var expected = new DataValue(new Variant(12345));\n            const int count = 10000;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new SchemalessAvroEncoder(stream, context))\n                {\n                    for (var i = 0; i < count; i++)\n                    {\n                        encoder.WriteDataValue(null, expected);\n                    }\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new SchemalessAvroDecoder(stream, context))\n            {\n                for (var i = 0; i < count; i++)\n                {\n                    var result = decoder.ReadDataValue(null);\n                    Assert.Equal(expected, result);\n                }\n            }\n        }\n\n        [Fact]\n        public void ReadWriteDataValueWithStringStream()\n        {\n            // Create dummy\n            var expected = new DataValue(new Variant(\"TestTestTestTest\"\n                + Guid.NewGuid()));\n            const int count = 10000;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new SchemalessAvroEncoder(stream, context))\n                {\n                    for (var i = 0; i < count; i++)\n                    {\n                        encoder.WriteDataValue(null, expected);\n                    }\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new SchemalessAvroDecoder(stream, context))\n            {\n                for (var i = 0; i < count; i++)\n                {\n                    var result = decoder.ReadDataValue(null);\n                    Assert.Equal(expected, result);\n                }\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteProgramDiagnostic2DataTypeSchema(bool concise)\n        {\n            // Create dummy type\n            var expected = VariantVariants.Complex;\n            const int count = 100;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteArray(null, Enumerable\n                        .Repeat(expected, count)\n                        .ToList(), v => encoder.WriteEncodeable(null, v, v.GetType()));\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            {\n                var json = schema.ToJson();\n                Assert.NotNull(json);\n                using var decoder = new AvroDecoder(stream, schema, context);\n                var results = decoder.ReadArray(null,\n                    () => decoder.ReadEncodeable(null, expected.GetType()));\n                Assert.Equal(count, results.Length);\n                for (var i = 0; i < count; i++)\n                {\n                    Assert.True(results[i].IsEqual(expected));\n                }\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataValueArrayWithIntAndSchema(bool concise)\n        {\n            // Create dummy\n            var expected = new DataValue(new Variant(12345));\n            const int count = 10000;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteArray(null, Enumerable\n                        .Repeat(expected, count)\n                        .ToList(), v => encoder.WriteDataValue(null, v));\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var results = decoder.ReadArray(null,\n                    () => decoder.ReadDataValue(null));\n                Assert.Equal(count, results.Length);\n                for (var i = 0; i < count; i++)\n                {\n                    Assert.Equal(expected, results[i]);\n                }\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataValueArrayWithStringAndSchema(bool concise)\n        {\n            // Create dummy\n            var expected = new DataValue(new Variant(\"TestTestTestTest\"\n                + Guid.NewGuid()));\n            const int count = 10000;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteArray(null, Enumerable\n                        .Repeat(expected, count)\n                        .ToList(), v => encoder.WriteDataValue(null, v));\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var results = decoder.ReadArray(null,\n                    () => decoder.ReadDataValue(null));\n                Assert.Equal(count, results.Length);\n                for (var i = 0; i < count; i++)\n                {\n                    Assert.Equal(expected, results[i]);\n                }\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetTest1(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234), StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow),\n                [\"http://microsoft.com\"] = new DataValue(new Variant(-222222222), StatusCodes.Bad, DateTime.MinValue, DateTime.UtcNow),\n                [\"1111111111111111111111111\"] = new DataValue(new Variant(false), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"@#$%^&*()_+~!@#$%^*(){}\"] = new DataValue(new Variant(new byte[] { 0, 2, 4, 6 }), StatusCodes.Good),\n                [\"1245\"] = new DataValue(new Variant(\"hello\"), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"...\"] = new DataValue(new Variant(\"imbricated\"))\n            });\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteDataSet(null, expected);\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            var json = schema.ToJson();\n            Assert.NotNull(json);\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var result = decoder.ReadDataSet(null);\n                Assert.True(expected.Equals(result));\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetTest2(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234), StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow),\n                [\"http://microsoft.com\"] = null,\n                [\"1111111111111111111111111\"] = new DataValue(new Variant(false), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"@#$%^&*()_+~!@#$%^*(){}\"] = new DataValue(new Variant(new byte[] { 0, 2, 4, 6 }), StatusCodes.Good),\n                [\"1245\"] = null,\n                [\"...\"] = new DataValue(new Variant(\"imbricated\"))\n            });\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteDataSet(null, expected);\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            var json = schema.ToJson();\n            Assert.NotNull(json);\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var result = decoder.ReadDataSet(null);\n                Assert.True(expected.Equals(result));\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetArrayRawTest1(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234), StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow),\n                [\"http://microsoft.com\"] = new DataValue(new Variant(-222222222), StatusCodes.Bad, DateTime.MinValue, DateTime.UtcNow),\n                [\"1111111111111111111111111\"] = new DataValue(new Variant(false), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"@#$%^&*()_+~!@#$%^*(){}\"] = new DataValue(new Variant(new byte[] { 0, 2, 4, 6 }), StatusCodes.Good),\n                [\"1245\"] = new DataValue(new Variant(\"hello\"), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"...\"] = new DataValue(new Variant(\"imbricated\"))\n            }, DataSetFieldContentFlags.RawData);\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteDataSet(null, expected);\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var result = decoder.ReadDataSet(null);\n                Assert.True(expected.Equals(result));\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetArrayRawTest2(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = null,\n                [\"http://microsoft.com\"] = new DataValue(new Variant(-222222222), StatusCodes.Bad, DateTime.MinValue, DateTime.UtcNow),\n                [\"1111111111111111111111111\"] = null,\n                [\"@#$%^&*()_+~!@#$%^*(){}\"] = new DataValue(new Variant(new byte[] { 0, 2, 4, 6 }), StatusCodes.Good),\n                [\"1245\"] = new DataValue(new Variant(\"hello\"), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"...\"] = null\n            }, DataSetFieldContentFlags.RawData);\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteDataSet(null, expected);\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var result = decoder.ReadDataSet(null);\n                Assert.True(expected.Equals(result));\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetWithSingleEntryTest(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234),\n                    StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow)\n            });\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteDataSet(null, expected);\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var result = decoder.ReadDataSet(null);\n                Assert.Equal(expected.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value,\n                    result.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value);\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetWithSingleComplexEntryTest(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(VariantVariants.Complex),\n                    StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow)\n            });\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteDataSet(null, expected);\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var result = decoder.ReadDataSet(null);\n                Assert.True(result.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value.Value is ExtensionObject);\n                var eo = (ExtensionObject)result.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value.Value;\n                Assert.True(eo.Body is IEncodeable);\n                var e = (IEncodeable)eo.Body;\n                Assert.Equal(VariantVariants.Complex.AsJson(context), e.AsJson(context));\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetWithSingleValueRawTest(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234),\n                    StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow)\n            }, DataSetFieldContentFlags.RawData);\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteDataSet(null, expected);\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var result = decoder.ReadDataSet(null);\n                Assert.Equal(expected.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value.Value,\n                    result.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value.Value);\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetWithSingleComplexValueRawTest(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(VariantVariants.Complex),\n                    StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow)\n            }, DataSetFieldContentFlags.RawData);\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteDataSet(null, expected);\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var result = decoder.ReadDataSet(null);\n                Assert.True(result.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value.Value is ExtensionObject);\n                var eo = (ExtensionObject)result.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value.Value;\n                Assert.True(eo.Body is IEncodeable);\n                var e = (IEncodeable)eo.Body;\n                Assert.Equal(VariantVariants.Complex.AsJson(context), e.AsJson(context));\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void ReadWriteDataSetArrayRawStreamTest(bool concise)\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234), StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow),\n                [\"http://microsoft.com\"] = new DataValue(new Variant(-222222222), StatusCodes.Bad, DateTime.MinValue, DateTime.UtcNow),\n                [\"1111111111111111111111111\"] = new DataValue(new Variant(false), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"@#$%^&*()_+~!@#$%^*(){}\"] = new DataValue(new Variant(new byte[] { 0, 2, 4, 6 }), StatusCodes.Good),\n                [\"1245\"] = new DataValue(new Variant(\"hello\"), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"...\"] = new DataValue(new Variant(\"imbricated\"))\n            }, DataSetFieldContentFlags.RawData);\n\n            const int count = 10000;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            Schema schema;\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new AvroSchemaBuilder(stream, context, emitConciseSchemas: concise))\n                {\n                    encoder.WriteArray(null, Enumerable\n                        .Repeat(expected, count)\n                        .ToList(), v => encoder.WriteDataSet(null, v));\n                    schema = encoder.Schema;\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new AvroDecoder(stream, schema, context))\n            {\n                var results = decoder.ReadArray(null,\n                    () => decoder.ReadDataSet(null));\n                Assert.Equal(count, results.Length);\n                for (var i = 0; i < count; i++)\n                {\n                    Assert.True(expected.Equals(results[i]));\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/AvroEncoderTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Xml;\n    using Xunit;\n\n    /// <summary>\n    /// Tests for the Json builder and decoder class.\n    /// </summary>\n    public sealed class AvroEncoderTests\n    {\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void TestBoolean(bool value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteBoolean(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteBoolean(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadBoolean(null));\n        }\n\n        [Theory]\n        [InlineData(0u)]\n        [InlineData(1000u)]\n        [InlineData(long.MaxValue)]\n        public void TestLong(long value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteInt64(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteInt64(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadInt64(null));\n        }\n\n        [Theory]\n        [InlineData(0.0)]\n        [InlineData(Math.PI)]\n        [InlineData(double.MaxValue)]\n        public void TestDouble(double value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteDouble(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDouble(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadDouble(null));\n        }\n\n        [Theory]\n        [InlineData(0.0f)]\n        [InlineData((float)Math.PI)]\n        [InlineData(float.MaxValue)]\n        public void TestFloat(float value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteFloat(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteFloat(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadFloat(null));\n        }\n\n        [Theory]\n        [InlineData(\"\")]\n        [InlineData(\"test\")]\n        [InlineData(\"12345\")]\n        [InlineData(\"12345678901234567890123456789012345678901234567890123456789012345678901234567890\")]\n        public void TestString(string value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteString(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteString(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadString(null));\n        }\n\n        [Theory]\n        [InlineData(1096)]\n        [InlineData(4096)]\n        [InlineData(65535)]\n        public void TestStringLengths(int length)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            var buffer = new char[length];\n            buffer.AsSpan().Fill('a');\n            var value = new string(buffer);\n            builder.WriteString(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteString(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadString(null));\n        }\n\n        [Fact]\n        public void TestLargeStringLengthThrows()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            var buffer = new char[80000];\n            buffer.AsSpan().Fill('a');\n            var value = new string(buffer);\n            builder.WriteString(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteString(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Throws<DecodingException>(() => decoder.ReadString(null));\n        }\n\n        [Fact]\n        public void TestStringWithZeroTerminator()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            const string value = \"teststring\";\n            builder.WriteString(null, value + '\\0');\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteString(null, value + '\\0');\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadString(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(127)]\n        [InlineData(257)]\n        [InlineData(5000)]\n        [InlineData(100000)]\n        public void TestByteString(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[length];\n#pragma warning disable CA5394 // Do not use insecure randomness\n            Random.Shared.NextBytes(expected);\n#pragma warning restore CA5394 // Do not use insecure randomness\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteByteString(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteByteString(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadByteString(null));\n        }\n\n        [Theory]\n        [InlineData(0u)]\n        [InlineData(1000u)]\n        [InlineData(long.MaxValue)]\n        [InlineData(ulong.MaxValue)]\n        public void TestULong(ulong value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteUInt64(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteUInt64(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadUInt64(null));\n        }\n\n        [Theory]\n        [InlineData(StatusCodes.Good)]\n        [InlineData(StatusCodes.Bad)]\n        [InlineData(StatusCodes.Uncertain)]\n        public void TestStatusCode(uint value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteStatusCode(null, value);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteStatusCode(null, value);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadStatusCode(null));\n        }\n\n        [Theory]\n        [InlineData(false, StatusCodes.Good)]\n        [InlineData(false, \"test\")]\n        [InlineData(false, 12345)]\n        [InlineData(true, StatusCodes.Good)]\n        [InlineData(true, \"test\")]\n        [InlineData(true, 12345)]\n        public void TestVariant(bool concise, object value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteVariant(null, new Variant(value));\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariant(null, new Variant(value));\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(value, decoder.ReadVariant(null).Value);\n        }\n\n        [Theory]\n        [InlineData(StatusCodes.Good)]\n        [InlineData(\"test\")]\n        [InlineData(12345)]\n        public void TestVariantWithNullableValue(object value)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant(value);\n\n            var schemas = new AvroBuiltInSchemas();\n            var valueSchema = schemas.GetSchemaForBuiltInType(expected.TypeInfo.BuiltInType);\n            var schema = valueSchema.AsNullable().CreateRoot();\n\n            using (var stream = new MemoryStream())\n            using (var encoder = new AvroEncoder(stream, schema, context, true))\n            {\n                encoder.WriteVariant(null, expected);\n                stream.Position = 0;\n                using var decoder = new AvroDecoder(stream, schema, context);\n                var variant = decoder.ReadVariant(null);\n                Assert.Equal(expected, variant);\n            }\n\n            using (var stream = new MemoryStream())\n            using (var encoder = new AvroEncoder(stream, schema, context, true))\n            {\n                encoder.WriteVariant(null, Variant.Null);\n                stream.Position = 0;\n                using var decoder = new AvroDecoder(stream, schema, context);\n                var variant = decoder.ReadVariant(null);\n                Assert.Equal(Variant.Null, variant);\n            }\n        }\n\n        public static TheoryData<VariantHolder> GetValues()\n        {\n            return new TheoryData<VariantHolder>(VariantVariants.GetValues().Select(v => new VariantHolder(v)));\n        }\n\n        [Theory]\n        [MemberData(nameof(GetValues))]\n        public void TestVariantVariants(VariantHolder value)\n        {\n            var expected = value.Variant;\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, false);\n            builder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariant(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected.Value, decoder.ReadVariant(null).Value);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void TestVariantWithComplexEncodeable(bool concise)\n        {\n            var expected = new Variant(VariantVariants.Complex);\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariant(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n\n            var value = decoder.ReadVariant(null).Value;\n            Assert.True(value is ExtensionObject);\n            var eo = (ExtensionObject)value;\n            Assert.True(eo.Body is IEncodeable);\n            var e = (IEncodeable)eo.Body;\n            Assert.Equal(VariantVariants.Complex.AsJson(context), e.AsJson(context));\n        }\n\n        [Theory]\n        [MemberData(nameof(GetValues))]\n        public void TestVariantVariantsConcise(VariantHolder value)\n        {\n            var expected = value.Variant;\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, true);\n            builder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariant(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadVariant(null));\n        }\n\n        [Theory]\n        [InlineData(\"test\")]\n        [InlineData(12345u)]\n        public void TestNodeId(object value)\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            var expected = new NodeId(value, ns);\n            builder.WriteNodeId(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteNodeId(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadNodeId(null));\n        }\n\n        [Fact]\n        public void TestNodeIdOpaque()\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            var expected = new NodeId(Guid.NewGuid().ToByteArray(), ns);\n            builder.WriteNodeId(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteNodeId(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadNodeId(null));\n        }\n\n        [Fact]\n        public void TestNodeIdGuid()\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            var expected = new NodeId(Guid.NewGuid(), ns);\n            builder.WriteNodeId(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteNodeId(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadNodeId(null));\n        }\n\n        [Fact]\n        public void TestExpandedNodeIdOpaque()\n        {\n            var context = new ServiceMessageContext();\n            context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var srv = context.ServerUris.GetIndexOrAppend(\"Super\");\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            var expected = new ExpandedNodeId(Guid.NewGuid().ToByteArray(), 0, \"test.org\", srv);\n            builder.WriteExpandedNodeId(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteExpandedNodeId(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadExpandedNodeId(null));\n        }\n\n        [Theory]\n        [InlineData(false, StatusCodes.Good)]\n        [InlineData(false, \"test\")]\n        [InlineData(false, 12345)]\n        [InlineData(true, StatusCodes.Good)]\n        [InlineData(true, \"test\")]\n        [InlineData(true, 12345)]\n        public void TestDataValue(bool concise, object value)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            var expected = new DataValue\n            {\n                Value = value,\n                StatusCode = StatusCodes.Bad,\n                ServerPicoseconds = 10,\n                ServerTimestamp = DateTime.UtcNow\n            };\n            builder.WriteDataValue(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDataValue(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadDataValue(null));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void TestDataValueEmpty(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            var expected = new DataValue();\n            builder.WriteDataValue(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDataValue(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadDataValue(null));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void TestDataValueNull(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteDataValue(null, null);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDataValue(null, null);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.True(Opc.Ua.Utils.IsEqual(new DataValue(),\n                decoder.ReadDataValue(null)));\n        }\n\n        [Fact]\n        public void TestGuid()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteGuid(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteGuid(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadGuid(null));\n        }\n        [Fact]\n        public void TestDateTime()\n        {\n            var context = new ServiceMessageContext();\n            var expected = DateTime.UtcNow;\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteDateTime(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDateTime(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadDateTime(null));\n        }\n\n        [Fact]\n        public void TestXmlElement1()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new XmlDocument();\n            expected.LoadXml(\"<test></test>\");\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteXmlElement(null, expected.DocumentElement);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteXmlElement(null, expected.DocumentElement);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = new XmlDocument();\n            actual.Load(decoder.ReadXmlElement(null).CreateNavigator().ReadSubtree());\n            Assert.Equal(expected.OuterXml, actual.OuterXml);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void TestXmlElement2(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, concise);\n            var expected = VariantVariants.XmlElement;\n            builder.WriteXmlElement(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteXmlElement(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = new XmlDocument();\n            actual.Load(decoder.ReadXmlElement(null).CreateNavigator().ReadSubtree());\n            Assert.Equal(expected.OuterXml, actual.OuterXml);\n        }\n\n        [Fact]\n        public void TestQualifiedName()\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var expected = new QualifiedName(\"test\", ns);\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteQualifiedName(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteQualifiedName(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadQualifiedName(null));\n        }\n\n        [Fact]\n        public void TestLocalizedText()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new LocalizedText(\"test\", \"en\");\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteLocalizedText(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteLocalizedText(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadLocalizedText(null));\n        }\n\n        [Fact]\n        public void TestExtensionObject()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExtensionObject(new NodeId(1234), new byte[] { 0, 1, 2, 3 });\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteExtensionObject(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteExtensionObject(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadExtensionObject(null);\n            Assert.Equal(expected.TypeId, actual.TypeId);\n            Assert.Equal(expected.Body, actual.Body);\n        }\n\n        [Fact]\n        public void TestStatusCodeArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new StatusCode[] { StatusCodes.Good, StatusCodes.Bad };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteStatusCodeArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteStatusCodeArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadStatusCodeArray(null);\n            Assert.Equal(expected, actual);\n        }\n\n        [Fact]\n        public void TestNodeIdArray()\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var expected = new NodeId[] { new(123, ns), new(456, ns) };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteNodeIdArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteNodeIdArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadNodeIdArray(null);\n            Assert.Equal(expected, actual);\n        }\n\n        [Fact]\n        public void TestExpandedNodeIdArray()\n        {\n            var context = new ServiceMessageContext();\n            context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var srv = context.ServerUris.GetIndexOrAppend(\"Super\");\n            var expected = new ExpandedNodeId[] { new(123u, 0, \"test.org\", srv), new(456u, 0, \"test.org\", srv) };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteExpandedNodeIdArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteExpandedNodeIdArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadExpandedNodeIdArray(null);\n            Assert.Equal(expected, actual);\n        }\n\n        [Fact]\n        public void TestInt16()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteInt16(null, 123);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteInt16(null, 123);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(123, decoder.ReadInt16(null));\n        }\n\n        [Fact]\n        public void TestSByte()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteSByte(null, 123);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteSByte(null, 123);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(123, decoder.ReadSByte(null));\n        }\n\n        [Fact]\n        public void TestByte()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteByte(null, 123);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteByte(null, 123);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(123, decoder.ReadByte(null));\n        }\n\n        [Fact]\n        public void TestDiagnosticInfo()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DiagnosticInfo { AdditionalInfo = \"dd\" };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteDiagnosticInfo(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDiagnosticInfo(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var result = decoder.ReadDiagnosticInfo(null);\n            AssertEqual(expected, result);\n        }\n\n        [Fact]\n        public void TestDiagnosticInfoWithInner()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DiagnosticInfo\n            {\n                AdditionalInfo = \"outer\",\n                InnerDiagnosticInfo = new DiagnosticInfo { AdditionalInfo = \"inner\" }\n            };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteDiagnosticInfo(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDiagnosticInfo(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var result = decoder.ReadDiagnosticInfo(null);\n            AssertEqual(expected, result);\n        }\n\n        [Fact]\n        public void TestEnum()\n        {\n            var context = new ServiceMessageContext();\n            const DiagnosticsLevel expected = DiagnosticsLevel.Basic;\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteEnumerated(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteEnumerated(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var result = decoder.ReadEnumerated<DiagnosticsLevel>(null);\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void TestEnumAsInteger()\n        {\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            const int expected = 1;\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteEnumerated(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteEnumerated(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var result = decoder.ReadEnumerated<DiagnosticsLevel>(null);\n            Assert.Equal((DiagnosticsLevel)expected, result);\n        }\n\n        [Fact]\n        public void TestEnumArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DiagnosticsLevel[] { DiagnosticsLevel.Basic, DiagnosticsLevel.Advanced };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteEnumeratedArray(null, expected, null);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteEnumeratedArray(null, expected, null);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadEnumeratedArray<DiagnosticsLevel>(null);\n            Assert.Equal(expected, actual);\n        }\n\n        [Fact]\n        public void TestDiagnosticInfoArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DiagnosticInfo[] { new() { AdditionalInfo = \"dd\" }, new() { AdditionalInfo = string.Empty } };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteDiagnosticInfoArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDiagnosticInfoArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadDiagnosticInfoArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                var result = actual[i];\n                AssertEqual(expected[i], result);\n            }\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestBooleanArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => v % 2 == 0).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteBooleanArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteBooleanArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadBooleanArray(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestSByteArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => (sbyte)v).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteSByteArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteSByteArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadSByteArray(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestByteArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => (byte)v).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteByteArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteByteArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadByteArray(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestInt16Array(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => (short)v).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteInt16Array(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteInt16Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadInt16Array(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestUInt16Array(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => (ushort)v).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteUInt16Array(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteUInt16Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadUInt16Array(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestInt32Array(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteInt32Array(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteInt32Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadInt32Array(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestUInt32Array(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => (uint)v).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteUInt32Array(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteUInt32Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadUInt32Array(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestInt64Array(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => uint.MaxValue + v).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteInt64Array(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteInt64Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadInt64Array(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestUInt64Array(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => (ulong)(long.MaxValue + v)).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteUInt64Array(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteUInt64Array(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadUInt64Array(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestFloatArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => (float)v).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteFloatArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteFloatArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadFloatArray(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestDoubleArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => (double)v).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteDoubleArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDoubleArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadDoubleArray(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestStringArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length)\n                .Select(v => v.ToString(CultureInfo.InvariantCulture)).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteStringArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteStringArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadStringArray(null));\n        }\n\n        [Theory]\n        [InlineData(0, 0)]\n        [InlineData(1, 1)]\n        [InlineData(3, 0)]\n        [InlineData(3, 3)]\n        [InlineData(4096, 0)]\n        [InlineData(4096, 4096)]\n        public void TestByteStringArray(int length, int bytestringLength)\n        {\n            var context = new ServiceMessageContext();\n            var buffer = new byte[bytestringLength];\n#pragma warning disable CA5394 // Do not use insecure randomness\n            Random.Shared.NextBytes(buffer);\n#pragma warning restore CA5394 // Do not use insecure randomness\n            var expected = Enumerable.Range(0, length).Select(_ => buffer).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteByteStringArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteByteStringArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadByteStringArray(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestDateTimeArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(_ => DateTime.UtcNow).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteDateTimeArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDateTimeArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadDateTimeArray(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestUuidArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(_ => (Uuid)Guid.NewGuid()).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteGuidArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteGuidArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadGuidArray(null));\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestGuidArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(_ => Guid.NewGuid()).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteGuidArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteGuidArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadGuidArray(null).Select(g => (Guid)g).ToArray());\n        }\n\n        [Fact]\n        public void TestXmlElementArray1()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new XmlDocument();\n            expected.LoadXml(\"<test></test>\");\n            var expectedArray = new XmlElement[] { expected.DocumentElement, expected.DocumentElement };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteXmlElementArray(null, expectedArray);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteXmlElementArray(null, expectedArray);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actualArray = decoder.ReadXmlElementArray(null);\n            Assert.Equal(expectedArray.Length, actualArray.Count);\n            for (var i = 0; i < expectedArray.Length; i++)\n            {\n                var actual = new XmlDocument();\n                actual.Load(actualArray[i].CreateNavigator().ReadSubtree());\n                Assert.Equal(expected.OuterXml, actual.OuterXml);\n            }\n        }\n\n        [Fact]\n        public void TestXmlElementArray2()\n        {\n            var context = new ServiceMessageContext();\n            var expected = VariantVariants.XmlElement;\n            var expectedArray = new XmlElement[] { expected, expected };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteXmlElementArray(null, expectedArray);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteXmlElementArray(null, expectedArray);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actualArray = decoder.ReadXmlElementArray(null);\n            Assert.Equal(expectedArray.Length, actualArray.Count);\n            for (var i = 0; i < expectedArray.Length; i++)\n            {\n                var actual = new XmlDocument();\n                actual.Load(actualArray[i].CreateNavigator().ReadSubtree());\n                Assert.Equal(expected.OuterXml, actual.OuterXml);\n            }\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(1)]\n        [InlineData(3)]\n        [InlineData(4096)]\n        public void TestQualifiedNameArray(int length)\n        {\n            var context = new ServiceMessageContext();\n            var ns = context.NamespaceUris.GetIndexOrAppend(\"test.org\");\n            var expected = Enumerable.Range(0, length).Select(v => new QualifiedName(\"test\" + v, ns)).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteQualifiedNameArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteQualifiedNameArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadQualifiedNameArray(null));\n        }\n\n        [Theory]\n        [InlineData(false, 0)]\n        [InlineData(false, 1)]\n        [InlineData(false, 3)]\n        [InlineData(false, 4096)]\n        [InlineData(true, 0)]\n        [InlineData(true, 1)]\n        [InlineData(true, 3)]\n        [InlineData(true, 4096)]\n        public void TestLocalizedTextArray1(bool concise, int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => new LocalizedText(\"test\" + v, \"en\")).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteLocalizedTextArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteLocalizedTextArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            Assert.Equal(expected, decoder.ReadLocalizedTextArray(null));\n        }\n\n        [Theory]\n        [InlineData(false, 0)]\n        [InlineData(false, 1)]\n        [InlineData(false, 3)]\n        [InlineData(false, 4096)]\n        [InlineData(true, 0)]\n        [InlineData(true, 1)]\n        [InlineData(true, 3)]\n        [InlineData(true, 4096)]\n        public void TestLocalizedTextArray2(bool concise, int length)\n        {\n            var context = new ServiceMessageContext();\n            var expected = Enumerable.Range(0, length).Select(v => new LocalizedText(\"test\" + v, \"en\")).ToArray();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteArray(null, expected, ValueRanks.OneDimension, BuiltInType.LocalizedText);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteArray(null, expected, ValueRanks.OneDimension, BuiltInType.LocalizedText);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var result = decoder.ReadArray(null, ValueRanks.OneDimension, BuiltInType.LocalizedText);\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void TestExtensionObjectArray()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExtensionObject[] { new(new NodeId(1234), new byte[] { 0, 1, 2, 3 }), new(new NodeId(1234), new byte[] { 0, 1, 2, 3 }) };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true);\n            builder.WriteExtensionObjectArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteExtensionObjectArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadExtensionObjectArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i].TypeId, actual[i].TypeId);\n                Assert.Equal(expected[i].Body, actual[i].Body);\n            }\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void TestDataValueArray1(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DataValue[] { new(), new() };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteDataValueArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDataValueArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadDataValueArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i], actual[i]);\n            }\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void TestDataValueArray2(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new DataValue[] {\n                new() { Value = new Variant(100) },\n                new() { Value = new Variant(200) }\n            };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteDataValueArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteDataValueArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadDataValueArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i], actual[i]);\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void TestVariantArrayWithDifferentTypes1(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant[] { new(123), new(\"test\") };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            var actual = decoder.ReadVariantArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i].Value, actual[i].Value);\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void TestVariantArrayWithDifferentTypes2(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new VariantCollection {\n                new Variant(4L),\n                new Variant(\"test\"),\n                new Variant(new long[] {1, 2, 3, 4, 5 }),\n                new Variant([\"1\", \"2\", \"3\", \"4\", \"5\"])\n            };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadVariantArray(null);\n            Assert.Equal(expected.Count, actual.Count);\n            for (var i = 0; i < expected.Count; i++)\n            {\n                Assert.Equal(expected[i].Value, actual[i].Value);\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void TestVariantArrayWithDifferentTypes3(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new VariantCollection {\n                new Variant(new VariantCollection {\n                    new Variant(4L),\n                    new Variant(\"test\"),\n                    new Variant(new long[] {1, 2, 3, 4, 5 }),\n                    new Variant([\"1\", \"2\", \"3\", \"4\", \"5\"])\n                })\n            };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var actual = decoder.ReadVariantArray(null);\n            Assert.Equal(expected.Count, actual.Count);\n            for (var i = 0; i < expected.Count; i++)\n            {\n                Assert.Equal(expected[i].Value, actual[i].Value);\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void TestVariantArrayWithSameTypes(bool concise)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant[] { new(123), new(321), new(0) };\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, concise);\n            builder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            var actual = decoder.ReadVariantArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i].Value, actual[i].Value);\n            }\n        }\n\n        public static TheoryData<VariantsHolder> GetVariantArrays()\n        {\n            return new TheoryData<VariantsHolder>(VariantVariants.GetValues()\n                .Select(v => new VariantsHolder(Enumerable.Repeat(v, 3).ToArray(), v.TypeInfo)));\n        }\n\n        [Theory]\n        [MemberData(nameof(GetVariantArrays))]\n        public void TestVariantArrayVariants(VariantsHolder value)\n        {\n            var expected = value.Variants.ToArray();\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, false);\n            builder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            var actual = decoder.ReadVariantArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                Assert.Equal(expected[i].Value, actual[i].Value);\n            }\n        }\n\n        [Theory]\n        [MemberData(nameof(GetVariantArrays))]\n        public void TestVariantArrayVariantsConcise(VariantsHolder value)\n        {\n            var expected = value.Variants.ToArray();\n            var context = new ServiceMessageContext();\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, true);\n            builder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariantArray(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            var actual = decoder.ReadVariantArray(null);\n            Assert.Equal(expected.Length, actual.Count);\n            for (var i = 0; i < expected.Length; i++)\n            {\n                var result = actual[i];\n                if (result.Value is not null && expected[i].Value is null)\n                {\n                    switch (result.TypeInfo.BuiltInType)\n                    {\n                        case BuiltInType.String:\n                            Assert.Equal(string.Empty, result.Value);\n                            return;\n                        case BuiltInType.ByteString:\n                            Assert.Equal(Array.Empty<byte>(), result.Value);\n                            return;\n                        case BuiltInType.NodeId:\n                            Assert.Equal(NodeId.Null, result.Value);\n                            return;\n                        case BuiltInType.ExpandedNodeId:\n                            Assert.Equal(ExpandedNodeId.Null, result.Value);\n                            return;\n                        case BuiltInType.QualifiedName:\n                            Assert.Equal(QualifiedName.Null, result.Value);\n                            return;\n                        case BuiltInType.LocalizedText:\n                            Assert.Equal(new LocalizedText(string.Empty, string.Empty), result.Value);\n                            return;\n                        case BuiltInType.ExtensionObject:\n                            Assert.Equal(ExtensionObject.Null, result.Value);\n                            return;\n                        case BuiltInType.DataValue:\n                            Assert.Equal(new DataValue(), result.Value);\n                            return;\n                    }\n                }\n                Assert.Equal(expected[i].Value, result.Value);\n            }\n        }\n\n        [Fact]\n        public void TestVariantWithArray1()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant(Enumerable.Repeat(\"test\", 3).ToArray());\n\n            var schemas = new AvroBuiltInSchemas();\n            var valueSchema = schemas.GetSchemaForBuiltInType(expected.TypeInfo.BuiltInType,\n                SchemaRank.Collection);\n            var schema = valueSchema.AsNullable().CreateRoot();\n\n            using (var stream = new MemoryStream())\n            using (var encoder = new AvroEncoder(stream, schema, context, true))\n            {\n                encoder.WriteVariant(null, expected);\n                stream.Position = 0;\n                using var decoder = new AvroDecoder(stream, schema, context);\n                var variant = decoder.ReadVariant(null);\n                Assert.Equal(expected, variant);\n            }\n\n            using (var stream = new MemoryStream())\n            using (var encoder = new AvroEncoder(stream, schema, context, true))\n            {\n                encoder.WriteVariant(null, Variant.Null);\n                stream.Position = 0;\n                using var decoder = new AvroDecoder(stream, schema, context);\n                var variant = decoder.ReadVariant(null);\n                Assert.Equal(Variant.Null, variant);\n            }\n        }\n\n        [Fact]\n        public void TestVariantWithArray2()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant(Enumerable.Repeat(\"test\", 3).ToArray());\n\n            var schemas = new AvroBuiltInSchemas();\n            var valueSchema = schemas.GetSchemaForBuiltInType(expected.TypeInfo.BuiltInType,\n                SchemaRank.Collection);\n            var schema = valueSchema.CreateRoot();\n\n            using var stream = new MemoryStream();\n            using var encoder = new AvroEncoder(stream, schema, context, true);\n            encoder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, schema, context);\n            var variant = decoder.ReadVariant(null);\n            Assert.Equal(expected, variant);\n        }\n\n        [Theory]\n        [InlineData(DiagnosticsLevel.Advanced)]\n        [InlineData(BuiltInType.Int32)]\n        public void TestVariantWithEnumeration(object value)\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant(value);\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, true);\n            builder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            var result = decoder.ReadVariant(null);\n            Assert.Equal(Convert.ToInt32(value, CultureInfo.InvariantCulture), result.Value);\n        }\n\n        [Fact]\n        public void TestVariantWithEnumerations()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new Variant(new[] { DiagnosticsLevel.Advanced, DiagnosticsLevel.Advanced });\n            using var stream = new MemoryStream();\n            using var builder = new AvroSchemaBuilder(stream, context, true, true);\n            builder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var encoder = new AvroEncoder(stream, builder.Schema, context, true);\n            encoder.WriteVariant(null, expected);\n            stream.Position = 0;\n            using var decoder = new AvroDecoder(stream, builder.Schema, context);\n            var json = builder.Schema.ToJson();\n            Assert.NotNull(json);\n            var result = decoder.ReadVariant(null);\n            Assert.Equal(new int[] { 1, 1 }, result);\n        }\n\n        private static void AssertEqual(DiagnosticInfo x, DiagnosticInfo y)\n        {\n            if (x == y)\n            {\n                return;\n            }\n            Assert.NotNull(x);\n            Assert.NotNull(y);\n            Assert.Equal(x.NamespaceUri, y.NamespaceUri);\n            Assert.Equal(x.LocalizedText, y.LocalizedText);\n            Assert.Equal(x.Locale, y.Locale);\n            Assert.Equal(x.AdditionalInfo, y.AdditionalInfo);\n            Assert.Equal(x.InnerStatusCode, y.InnerStatusCode);\n            Assert.Equal(x.NamespaceUri, y.NamespaceUri);\n            AssertEqual(x.InnerDiagnosticInfo, y.InnerDiagnosticInfo);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/AvroFileWriterTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Avro;\n    using Furly;\n    using Furly.Extensions.Logging;\n    using Furly.Extensions.Messaging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Text;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    /// <summary>\n    /// Test avro file writer\n    /// </summary>\n    public sealed class AvroFileWriterTests\n    {\n        [Fact]\n        public void SupportsContentTypeTests()\n        {\n            using var writer = new AvroFileWriter(Options.Create(new AvroFileWriterOptions()),\n                Log.Console<AvroFileWriter>());\n            Assert.True(writer.SupportsContentType(ContentType.Avro));\n            Assert.True(writer.SupportsContentType(ContentType.AvroGzip));\n            Assert.False(writer.SupportsContentType(ContentType.Uadp));\n            Assert.False(writer.SupportsContentType(ContentMimeType.Binary));\n        }\n        [Fact]\n        public void SupportsNothingWhenDisabledTests()\n        {\n            using var writer = new AvroFileWriter(Options.Create(\n                new AvroFileWriterOptions { Disabled = true }),\n                Log.Console<AvroFileWriter>());\n            Assert.False(writer.SupportsContentType(ContentType.Avro));\n            Assert.False(writer.SupportsContentType(ContentType.AvroGzip));\n            Assert.False(writer.SupportsContentType(ContentType.Uadp));\n        }\n\n        [Fact]\n        public async Task TestAvroFileWriter1Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                using (var writer = new AvroFileWriter(Options.Create(new AvroFileWriterOptions()),\n                    Log.Console<AvroFileWriter>()))\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        new ReadOnlySequence<byte>([1, 2, 3])\n                    }, null, new DummyEventSchema(), ContentType.Avro);\n                }\n\n                Assert.True(File.Exists(file + \".avro\"));\n                using var reader = new AvroFileReader(file);\n                Assert.True(reader.HasMore());\n                var result = reader.Read((s, t) =>\n                {\n                    var buffer = t.ReadAsBuffer();\n                    Assert.Equal(1, buffer[0]);\n                    Assert.Equal(2, buffer[1]);\n                    Assert.Equal(3, buffer[2]);\n                    Assert.Equal(3, buffer.Count);\n                    Assert.True(s is UnionSchema);\n                    return 123;\n                });\n                Assert.False(reader.HasMore());\n                Assert.Equal(123, result);\n            }\n            finally\n            {\n                File.Delete(file + \".avro\");\n            }\n        }\n\n        [Fact]\n        public async Task TestAvroFileWriter2Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                using (var writer = new AvroFileWriter(Options.Create(new AvroFileWriterOptions()),\n                    Log.Console<AvroFileWriter>()))\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        new ReadOnlySequence<byte>([1, 2, 3]),\n                        new ReadOnlySequence<byte>([1, 2, 3]),\n                        new ReadOnlySequence<byte>([1, 2, 3])\n                    }, null, new DummyEventSchema(), ContentType.Avro);\n                }\n\n                using var reader = new AvroFileReader(file);\n                for (var i = 0; i < 3; i++)\n                {\n                    Assert.True(reader.HasMore());\n                    var result = reader.Read((s, t) =>\n                    {\n                        Assert.Equal(1, t.ReadByte());\n                        Assert.Equal(2, t.ReadByte());\n                        Assert.Equal(3, t.ReadByte());\n                        Assert.True(s is UnionSchema);\n                        return 123;\n                    });\n                    Assert.Equal(123, result);\n                }\n                Assert.False(reader.HasMore());\n            }\n            finally\n            {\n                File.Delete(file + \".avro\");\n            }\n        }\n\n        [Fact]\n        public async Task TestAvroFileWriter3Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                using (var writer = new AvroFileWriter(Options.Create(new AvroFileWriterOptions()),\n                    Log.Console<AvroFileWriter>()))\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, Array.Empty<ReadOnlySequence<byte>>(),\n                        null, new DummyEventSchema(), ContentType.Avro);\n                }\n\n                Assert.True(File.Exists(file + \".avro\"));\n                using var reader = new AvroFileReader(file);\n                Assert.False(reader.HasMore());\n                Assert.Throws<EndOfStreamException>(() => reader.Read((s, t) => 123));\n            }\n            finally\n            {\n                File.Delete(file + \".avro\");\n            }\n        }\n\n        [Fact]\n        public async Task TestAvroFileWriter4Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                const string expected = \"teststring\";\n                var buffer = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(expected));\n                using (var writer = new AvroFileWriter(Options.Create(new AvroFileWriterOptions()),\n                    Log.Console<AvroFileWriter>()))\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer.GzipCompress()\n                    }, new Dictionary<string, string>\n                    {\n                        [\"testmeta\"] = \"mtest\"\n                    }, new DummyEventSchema(), ContentType.AvroGzip);\n                }\n\n                Assert.True(File.Exists(file + \".avro\"));\n                using var reader = new AvroFileReader(file);\n                Assert.True(reader.HasMore());\n                var result = reader.Read((s, t) =>\n                {\n                    var buffer = t.ReadAsBuffer();\n                    Assert.Equal(expected, Encoding.UTF8.GetString(buffer));\n                    return 123;\n                });\n                Assert.False(reader.HasMore());\n                Assert.Equal(123, result);\n            }\n            finally\n            {\n                File.Delete(file + \".avro\");\n            }\n        }\n\n        [Fact]\n        public async Task TestAvroFileWriter5Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                const string expected = \"teststring\";\n                var buffer = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(expected));\n                using (var writer = new AvroFileWriter(Options.Create(new AvroFileWriterOptions()),\n                    Log.Console<AvroFileWriter>()))\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer.GzipCompress(),\n                        buffer.GzipCompress(),\n                        buffer.GzipCompress()\n                    }, null, new DummyEventSchema(), ContentType.AvroGzip);\n                }\n\n                Assert.True(File.Exists(file + \".avro\"));\n                using var reader = new AvroFileReader(file);\n                Assert.True(reader.HasMore());\n                var result = reader.Read((s, t) =>\n                {\n                    var buffer = t.ReadAsBuffer();\n                    Assert.Equal(expected + expected + expected, Encoding.UTF8.GetString(buffer));\n                    return 123;\n                });\n                Assert.Equal(123, result);\n                Assert.True(reader.HasMore());\n            }\n            finally\n            {\n                File.Delete(file + \".avro\");\n            }\n        }\n\n        [Theory]\n        [InlineData(\"\")]\n        [InlineData(\"ab\")]\n        [InlineData(\"badheader\")]\n        public async Task TestBadHeader1Async(string data)\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                await File.WriteAllTextAsync(file + \".avro\", data);\n                Assert.Throws<FormatException>(() => new AvroFileReader(file));\n            }\n            finally\n            {\n                File.Delete(file + \".avro\");\n            }\n        }\n\n        private sealed class DummyEventSchema : IEventSchema\n        {\n            public string Id => \"test\";\n            public string Schema => \"[]\";\n            public string Type => \"test\";\n            public string Name => \"test\";\n            public ulong Version => 1;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Extensions/ExpandedNodeIdExTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using Xunit;\n\n    public class ExpandedNodeIdExTests\n    {\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringNoUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            var result = (\"s=\" + expected).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            result = (\"s_\" + expected).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringUrlEncodedNoUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            var result = (\"s=\" + expected.UrlEncode()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromString()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#s=\" + expected).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(0, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringUrnNamespace()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"urn:contosos\";\n            var result = (uri + \"#s=\" + expected).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(0, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringInvalidUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"invalidUri\";\n            var result = (uri + \"#s=\" + expected).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(0, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringWithNamespaceIndex()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var result = (\"ns=\" + context.NamespaceUris.GetIndexOrAppend(uri) + \";s=\" + expected)\n                .ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringWithNsu()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var index = context.NamespaceUris.GetIndexOrAppend(uri);\n            var result = (\"nsu=\" + uri + \";s=\" + expected)\n                .ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(uri, result.NamespaceUri);\n            Assert.Equal(0, result.NamespaceIndex);\n            Assert.Equal(1, index);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringWithNsuBadNamespace()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"contosos\";\n            var index = context.NamespaceUris.GetIndexOrAppend(uri);\n            var result = (\"nsu=\" + uri + \";s=\" + expected)\n                .ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(uri, result.NamespaceUri);\n            Assert.Equal(0, result.NamespaceIndex);\n            Assert.Equal(1, index);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringWithNsuUrnNamespace()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"urn:contosos\";\n            var index = context.NamespaceUris.GetIndexOrAppend(uri);\n            var result = (\"nsu=\" + uri + \";s=\" + expected)\n                .ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(uri, result.NamespaceUri);\n            Assert.Equal(0, result.NamespaceIndex);\n            Assert.Equal(1, index);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromStringUrlEncoded()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#s=\" + expected.UrlEncode()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(0, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromBufferNoUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 0, 34, 23, 255, 6, 34, 65, 0, 0, 2, 0 };\n            var result = (\"b=\" + expected.ToBase64String()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            result = (\"b_\" + expected.ToBase64String()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromBufferUrlEncodedNoUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 0, 34, 23, 255, 6, 34, 65, 0, 0, 2, 0 };\n            var result = (\"b=\" + expected.ToBase64String().UrlEncode()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromBuffer()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 0, 34, 23, 255, 6, 34, 65, 0, 0, 2, 0 };\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#b=\" + expected.ToBase64String()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(0, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromBufferUrlEncoded()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 0, 34, 23, 255, 6, 34, 65, 0, 0, 2, 0 };\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#b=\" + expected.ToBase64String().UrlEncode()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(0, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromBufferWithNamespaceIndex()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid().ToByteArray();\n            const string uri = \"http://contosos.com/UA\";\n            var result = (\"ns=\" + context.NamespaceUris.GetIndexOrAppend(uri) +\n                \";b=\" + expected.ToBase64String())\n                .ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromBufferWithNsu()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid().ToByteArray();\n            const string uri = \"http://contosos.com/UA\";\n            var index = context.NamespaceUris.GetIndexOrAppend(uri);\n            var result = (\"nsu=\" + uri + \";b=\" + expected.ToBase64String())\n                .ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(uri, result.NamespaceUri);\n            Assert.Equal(0, result.NamespaceIndex);\n            Assert.Equal(1, index);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromGuidNoUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            var result = (\"g=\" + expected).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            result = (\"g_\" + expected).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromGuidUrlEncodedNoUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            var result = (\"g=\" + expected.ToString().UrlEncode()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromGuid()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            const string uri = \"http://contosos.com/UA/\";\n            var result = (uri + \"#g=\" + expected).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(0, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromGuidUrlEncoded()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            const string uri = \"http://contosos.com/UA/\";\n            var result = (uri + \"#g=\" + expected.ToString().UrlEncode()).ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(0, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromGuidWithNamespaceIndex()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            const string uri = \"http://contosos.com/UA\";\n            var result = (\"ns=\" + context.NamespaceUris.GetIndexOrAppend(uri) + \";g=\" + expected)\n                .ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeExpandedNodeIdFromGuidWithNsu()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            const string uri = \"http://contosos.com/UA\";\n            var index = context.NamespaceUris.GetIndexOrAppend(uri);\n            var result = (\"nsu=\" + uri + \";g=\" + expected)\n                .ToExpandedNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(uri, result.NamespaceUri);\n            Assert.Equal(0, result.NamespaceIndex);\n            Assert.Equal(1, index);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithString()\n        {\n            var context = new ServiceMessageContext();\n            const string uri = \"http://contoso.com/UA\";\n            context.NamespaceUris.GetIndexOrAppend(uri);\n            var expected = new ExpandedNodeId(\"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\", 0, uri, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithStringAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExpandedNodeId(\"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\", 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithGuid()\n        {\n            var context = new ServiceMessageContext();\n            const string uri = \"http://contoso.com/UA\";\n            var expected = new ExpandedNodeId(Guid.NewGuid(), 0, uri, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithGuidAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExpandedNodeId(Guid.NewGuid());\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithInt()\n        {\n            var context = new ServiceMessageContext();\n            const string uri = \"http://contoso.com/UA\";\n            context.NamespaceUris.GetIndexOrAppend(uri);\n            var expected = new ExpandedNodeId(1u, 0, uri, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithIntAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExpandedNodeId(111111111, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithBuffer()\n        {\n            var context = new ServiceMessageContext();\n\n            const string uri = \"http://contoso.com/UA\";\n            context.NamespaceUris.GetIndexOrAppend(uri);\n            var expected = new ExpandedNodeId(Guid.NewGuid().ToByteArray(), 0, uri, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithBufferAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExpandedNodeId(Guid.NewGuid().ToByteArray(), 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithEmptyString()\n        {\n            var context = new ServiceMessageContext();\n            const string uri = \"http://contoso.com/UA\";\n            context.NamespaceUris.GetIndexOrAppend(uri);\n            var expected = new ExpandedNodeId(\"\", 0, uri, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithEmptyStringAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExpandedNodeId(\"\", 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            AssertEqual(ExpandedNodeId.Null, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithNullString()\n        {\n            var context = new ServiceMessageContext();\n            const string uri = \"http://contoso.com/UA\";\n            context.NamespaceUris.GetIndexOrAppend(uri);\n            var expected = new ExpandedNodeId(null, 0, uri, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            Assert.Equal(expected, result1);\n            Assert.Equal(expected, result2);\n            Assert.True(Utils.IsEqual(result1, result2));\n\n            Assert.Equal(string.Empty, result1.Identifier);\n            Assert.Equal(expected.NamespaceIndex, result1.NamespaceIndex);\n            Assert.Equal(string.Empty, result2.Identifier);\n            Assert.Equal(expected.NamespaceIndex, result2.NamespaceIndex);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeIdWithNullStringAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new ExpandedNodeId((string)null, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            Assert.Equal(ExpandedNodeId.Null, result1);\n            Assert.Equal(ExpandedNodeId.Null, result2);\n            Assert.True(Utils.IsEqual(result1, result2));\n        }\n\n        [Fact]\n        public void EncodeDecodeNullExpandedNodeId()\n        {\n            var context = new ServiceMessageContext();\n            var expected = ExpandedNodeId.Null;\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToExpandedNodeId(context);\n            var result2 = s2.ToExpandedNodeId(context);\n\n            Assert.Equal(expected, result1);\n            Assert.Equal(expected, result2);\n            Assert.True(Utils.IsEqual(result1, result2));\n        }\n\n        private static void AssertEqual(ExpandedNodeId expected,\n            ExpandedNodeId result1, ExpandedNodeId result2)\n        {\n            Assert.Equal(expected.Identifier, result1.Identifier);\n            Assert.Equal(expected.Identifier, result2.Identifier);\n\n            Assert.Equal(expected, result1);\n            Assert.Equal(expected, result2);\n            Assert.True(Utils.IsEqual(result1, result2));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Extensions/LocalizedTextExTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Xunit;\n\n    public class LocalizedTextExTests\n    {\n        [Fact]\n        public void DecodeLocalizedTextWithLocale()\n        {\n            var expected = new LocalizedText(\"en-US\", \"text\");\n            var result = \"text@en-US\".ToLocalizedText();\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void DecodeLocalizedTextWithLocale2()\n        {\n            var expected = new LocalizedText(\"en-US\", \"text@\");\n            var result = \"text@@en-US\".ToLocalizedText();\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void DecodeLocalizedTextWithoutLocale()\n        {\n            var expected = new LocalizedText(\"text\");\n            var result = \"text\".ToLocalizedText();\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void DecodeLocalizedTextWithoutLocale1()\n        {\n            var expected = new LocalizedText(\"text\");\n            var result = \"text@\".ToLocalizedText();\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void DecodeLocalizedTextWithTwoAtAndLocale()\n        {\n            var expected = new LocalizedText(\"en-US\", \"text@contoso.org\");\n            var result = \"text@contoso.org@en-US\".ToLocalizedText();\n            Assert.Equal(expected, result);\n        }\n\n        [Fact]\n        public void DecodeLocalizedTextWithTwoAtAndWithoutLocale()\n        {\n            var expected = new LocalizedText(\"text@contoso.org\");\n            var result = \"text@contoso.org@\".ToLocalizedText();\n            Assert.Equal(expected, result);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Extensions/NodeIdExTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using Xunit;\n\n    public class NodeIdExTests\n    {\n        [Fact]\n        public void DecodeNodeIdFromStringNoUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            var result = (\"s=\" + expected).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            result = (\"s_\" + expected).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromStringUrlEncodedNoUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            var result = (\"s=\" + expected.UrlEncode()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromString()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#s=\" + expected).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromStringInvalidUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"invalidUri\";\n            var result = (uri + \"#s=\" + expected).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromStringUrnUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"urn:contosos\";\n            var result = (uri + \"#s=\" + expected).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromStringWithNamespaceIndex()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var result = (\"ns=\" + context.NamespaceUris.GetIndexOrAppend(uri) + \";s=\" + expected)\n                .ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromStringWithNsu()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var index = context.NamespaceUris.GetIndexOrAppend(uri);\n            var result = (\"nsu=\" + uri + \";s=\" + expected)\n                .ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n            Assert.Equal(1, index);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromStringUrlEncoded()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#s=\" + expected.UrlEncode()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromIntUrl()\n        {\n            var context = new ServiceMessageContext();\n            const string uri = \"http://contosos.com#i=1\";\n            var result = uri.ToExpandedNodeId(context);\n            Assert.Equal(\"http://contosos.com\", result.NamespaceUri);\n        }\n\n        [Fact]\n        public void ParseNodeIdUsingAbsoluteUri()\n        {\n            const string value = \"http://contosos.com#i=1\";\n            Uri.TryCreate(value, UriKind.Absolute, out var uri);\n            Assert.NotEqual(\"http://contosos.com\", uri.NoQueryAndFragment().AbsoluteUri);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromBufferNoUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 0, 34, 23, 255, 6, 34, 65, 0, 0, 2, 0 };\n            var result = (\"b=\" + expected.ToBase64String()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            result = (\"b_\" + expected.ToBase64String()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromBufferUrlEncodedNoUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 0, 34, 23, 255, 6, 34, 65, 0, 0, 2, 0 };\n            var result = (\"b=\" + expected.ToBase64String().UrlEncode()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromBuffer()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 0, 34, 23, 255, 6, 34, 65, 0, 0, 2, 0 };\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#b=\" + expected.ToBase64String()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromBufferUrlEncoded()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new byte[] { 0, 34, 23, 255, 6, 34, 65, 0, 0, 2, 0 };\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#b=\" + expected.ToBase64String().UrlEncode()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromBufferWithNamespaceIndex()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid().ToByteArray();\n            const string uri = \"http://contosos.com/UA\";\n            var result = (\"ns=\" + context.NamespaceUris.GetIndexOrAppend(uri) +\n                \";b=\" + expected.ToBase64String())\n                .ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromBufferWithNsu()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid().ToByteArray();\n            const string uri = \"http://contosos.com/UA\";\n            var index = context.NamespaceUris.GetIndexOrAppend(uri);\n            var result = (\"nsu=\" + uri + \";b=\" + expected.ToBase64String())\n                .ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n            Assert.Equal(1, index);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromGuidNoUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            var result = (\"g=\" + expected).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            result = (\"g_\" + expected).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromGuidUrlEncodedNoUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            var result = (\"g=\" + expected.ToString().UrlEncode()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromGuid()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            const string uri = \"http://contosos.com/UA/\";\n            var result = (uri + \"#g=\" + expected).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromGuidUrlEncoded()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            const string uri = \"http://contosos.com/UA/\";\n            var result = (uri + \"#g=\" + expected.ToString().UrlEncode()).ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromGuidWithNamespaceIndex()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            const string uri = \"http://contosos.com/UA\";\n            var result = (\"ns=\" + context.NamespaceUris.GetIndexOrAppend(uri) + \";g=\" + expected)\n                .ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeNodeIdFromGuidWithNsu()\n        {\n            var context = new ServiceMessageContext();\n            var expected = Guid.NewGuid();\n            const string uri = \"http://contosos.com/UA\";\n            var index = context.NamespaceUris.GetIndexOrAppend(uri);\n            var result = (\"nsu=\" + uri + \";g=\" + expected)\n                .ToNodeId(context);\n            Assert.Equal(expected, result.Identifier);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n            Assert.Equal(1, index);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithString()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(\"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\",\n                context.NamespaceUris.GetIndexOrAppend(\"http://contoso.com/UA\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithStringAndInvalidUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(\"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\",\n                context.NamespaceUris.GetIndexOrAppend(\"contoso\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            Assert.Equal(s1, s2);\n            Assert.Contains(\"nsu=\", s2, StringComparison.Ordinal);\n            Assert.DoesNotContain(\"ns=\", s2, StringComparison.Ordinal);\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithStringAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(\"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\", 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithGuid()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(Guid.NewGuid(),\n                context.NamespaceUris.GetIndexOrAppend(\"http://contoso.com/UA\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithGuidAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(Guid.NewGuid(), 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithInt()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(1,\n                context.NamespaceUris.GetIndexOrAppend(\"http://contoso.com/UA\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithIntAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(111111111, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithBuffer()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(Guid.NewGuid().ToByteArray(),\n                context.NamespaceUris.GetIndexOrAppend(\"http://contoso.com/UA\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithBufferAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(Guid.NewGuid().ToByteArray(), 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithEmptyString()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new NodeId(\"\",\n                context.NamespaceUris.GetIndexOrAppend(\"http://contoso.com/UA\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithEmptyStringAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var input = new NodeId(\"\", 0);\n\n            var s1 = input.AsString(context, NamespaceFormat.Uri);\n            var s2 = input.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(NodeId.Null, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeIdWithNullStringAndDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var input = new NodeId((string)null, 0); // == NodeId.Null\n\n            var s1 = input.AsString(context, NamespaceFormat.Uri);\n            var s2 = input.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(NodeId.Null, result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeNullNodeId()\n        {\n            var context = new ServiceMessageContext();\n            var expected = NodeId.Null;\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToNodeId(context);\n            var result2 = s2.ToNodeId(context);\n\n            AssertEqual(expected, result1, result2);\n        }\n\n        private static void AssertEqual(NodeId expected,\n            NodeId result1, NodeId result2)\n        {\n            Assert.Equal(expected.Identifier, result1.Identifier);\n            Assert.Equal(expected.NamespaceIndex, result1.NamespaceIndex);\n            Assert.Equal(expected.Identifier, result2.Identifier);\n            Assert.Equal(expected.NamespaceIndex, result2.NamespaceIndex);\n\n            Assert.Equal(expected, result1);\n            Assert.Equal(expected, result2);\n            Assert.True(Utils.IsEqual(result1, result2));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Extensions/QualifiedNameExTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using Xunit;\n\n    public class QualifiedNameExTests\n    {\n        [Fact]\n        public void DecodeQnFromStringNoUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            var result = expected.ToQualifiedName(context);\n            Assert.Equal(expected, result.Name);\n        }\n\n        [Fact]\n        public void DecodeQnFromStringUrlEncodedNoUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            var result = expected.UrlEncode().ToQualifiedName(context);\n            Assert.Equal(expected, result.Name);\n        }\n\n        [Fact]\n        public void DecodeQnFromString()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#\" + expected).ToQualifiedName(context);\n            Assert.Equal(expected, result.Name);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeQnFromStringUrlEncoded()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"http://contosos.com/UA\";\n            var result = (uri + \"#\" + expected.UrlEncode()).ToQualifiedName(context);\n            Assert.Equal(expected, result.Name);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeQnFromStringUrlEncodedBadNamespaceUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"contosos\";\n            var result = (uri + \"#\" + expected.UrlEncode()).ToQualifiedName(context);\n            Assert.Equal(expected, result.Name);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeQnFromStringUrnNamespaceUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"urn:contosos\";\n            var result = (uri + \"#\" + expected).ToQualifiedName(context);\n            Assert.Equal(expected, result.Name);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void DecodeQnFromStringUrlEncodedUrnNamespaceUri()\n        {\n            var context = new ServiceMessageContext();\n            const string expected = \"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\";\n            const string uri = \"urn:contosos\";\n            var result = (uri + \"#\" + expected.UrlEncode()).ToQualifiedName(context);\n            Assert.Equal(expected, result.Name);\n            Assert.Equal(uri, context.NamespaceUris.GetString(1));\n            Assert.Equal(1, result.NamespaceIndex);\n        }\n\n        [Fact]\n        public void EncodeDecodeQualifiedName()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new QualifiedName(\"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\",\n                context.NamespaceUris.GetIndexOrAppend(\"http://contoso.com/UA\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToQualifiedName(context);\n            var result2 = s2.ToQualifiedName(context);\n\n            Assert.Equal(expected, result1);\n            Assert.Equal(result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeQualifiedNameDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new QualifiedName(\"   space    tests /(%)§;#;;#;()§$\\\"))\\\"\\\")(§\", 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToQualifiedName(context);\n            var result2 = s2.ToQualifiedName(context);\n\n            Assert.Equal(expected, result1);\n            Assert.Equal(result1, result2);\n        }\n\n        [Fact]\n        public void EncodeDecodeQualifiedNameWithEmptyString()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new QualifiedName(\"\",\n                context.NamespaceUris.GetIndexOrAppend(\"http://contoso.com/UA\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToQualifiedName(context);\n            var result2 = s2.ToQualifiedName(context);\n\n            // BUG IN Stack: Assert.Equal(expected, result1);\n            Assert.Null(result1.Name);\n            Assert.Equal(expected.NamespaceIndex, result1.NamespaceIndex);\n            // BUG IN Stack: Assert.Equal(expected, result2);\n            Assert.Null(result2.Name);\n            Assert.Equal(expected.NamespaceIndex, result2.NamespaceIndex);\n            // BUG IN Stack: Assert.True(Utils.IsEqual(result1, result2));\n        }\n\n        [Fact]\n        public void EncodeDecodeQualifiedNameWithEmptyStringDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new QualifiedName(\"\", 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToQualifiedName(context);\n            var result2 = s2.ToQualifiedName(context);\n\n            // BUG IN Stack: Assert.Equal(expected, result1);\n            Assert.Null(result1.Name);\n            Assert.Equal(expected.NamespaceIndex, result1.NamespaceIndex);\n            // BUG IN Stack: Assert.Equal(expected, result2);\n            Assert.Null(result2.Name);\n            Assert.Equal(expected.NamespaceIndex, result2.NamespaceIndex);\n            // BUG IN Stack: Assert.True(Utils.IsEqual(result1, result2));\n        }\n\n        [Fact]\n        public void EncodeDecodeQualifiedNameWithNullString()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new QualifiedName(null,\n                context.NamespaceUris.GetIndexOrAppend(\"http://contoso.com/UA\"));\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToQualifiedName(context);\n            var result2 = s2.ToQualifiedName(context);\n\n            // BUG IN Stack: Assert.Equal(expected, result1);\n            Assert.Equal(expected.Name, result1.Name);\n            Assert.Equal(expected.NamespaceIndex, result1.NamespaceIndex);\n            // BUG IN Stack: Assert.Equal(expected, result2);\n            Assert.Equal(expected.Name, result2.Name);\n            Assert.Equal(expected.NamespaceIndex, result2.NamespaceIndex);\n            // BUG IN Stack: Assert.True(Utils.IsEqual(result1, result2));\n        }\n\n        [Fact]\n        public void EncodeDecodeQualifiedNameWithNullStringDefaultUri()\n        {\n            var context = new ServiceMessageContext();\n            var expected = new QualifiedName(null, 0);\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToQualifiedName(context);\n            var result2 = s2.ToQualifiedName(context);\n\n            // BUG IN Stack: Assert.Equal(expected, result1);\n            Assert.Equal(expected.Name, result1.Name);\n            Assert.Equal(expected.NamespaceIndex, result1.NamespaceIndex);\n            // BUG IN Stack: Assert.Equal(expected, result2);\n            Assert.Equal(expected.Name, result2.Name);\n            Assert.Equal(expected.NamespaceIndex, result2.NamespaceIndex);\n            // BUG IN Stack: Assert.True(Utils.IsEqual(result1, result2));\n        }\n\n        [Fact]\n        public void EncodeDecodeNullQualifiedName()\n        {\n            var context = new ServiceMessageContext();\n            var expected = QualifiedName.Null;\n\n            var s1 = expected.AsString(context, NamespaceFormat.Uri);\n            var s2 = expected.AsString(context, NamespaceFormat.Expanded);\n\n            var result1 = s1.ToQualifiedName(context);\n            var result2 = s2.ToQualifiedName(context);\n\n            Assert.Equal(expected, result1);\n            // BUG IN Stack: Assert.Equal(expected, result2);\n            Assert.Equal(expected.Name, result2.Name);\n            Assert.Equal(expected.NamespaceIndex, result2.NamespaceIndex);\n            // BUG IN Stack: Assert.True(Utils.IsEqual(result1, result2));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Extensions/TypeInfoExTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Xunit;\n\n    public class TypeInfoExTests\n    {\n        [Fact]\n        public void ScalarBoolNullTest1()\n        {\n            var variant = TypeInfo.Scalars.Boolean.CreateVariant(null);\n            Assert.Equal(false, variant.Value);\n        }\n\n        [Fact]\n        public void ScalarBoolTest1()\n        {\n            var variant = TypeInfo.Scalars.Boolean.CreateVariant(true);\n            Assert.Equal(true, variant.Value);\n        }\n\n        [Fact]\n        public void ScalarByteTest1()\n        {\n            var variant = TypeInfo.Scalars.Byte.CreateVariant((byte)5);\n            Assert.Equal((byte)5, variant.Value);\n        }\n\n        [Fact]\n        public void ScalarByteNullTest1()\n        {\n            var variant = TypeInfo.Scalars.Byte.CreateVariant(null);\n            Assert.Equal((byte)0, variant.Value);\n        }\n\n        [Fact]\n        public void ScalarStringTest1()\n        {\n            var variant = TypeInfo.Scalars.String.CreateVariant(\"test\");\n            Assert.Equal(\"test\", variant.Value);\n        }\n\n        [Fact]\n        public void ScalarExtensionObjectTest1()\n        {\n            var variant = TypeInfo.Scalars.ExtensionObject.CreateVariant(new ExtensionObject(\"s=test\"));\n            Assert.Equal(new ExtensionObject(\"s=test\"), variant.Value);\n        }\n\n        [Fact]\n        public void ArrayBoolNullTest1()\n        {\n            var variant = TypeInfo.Arrays.Boolean.CreateVariant(null);\n            Assert.Equal(System.Array.Empty<bool>(), variant.Value);\n        }\n\n        [Fact]\n        public void ArrayByteTest1()\n        {\n            var variant = TypeInfo.Arrays.Byte.CreateVariant(new byte[] { 1, 2, 3 });\n            Assert.Equal(new byte[] { 1, 2, 3 }, variant.Value);\n        }\n\n        [Fact]\n        public void ArrayStringTest1()\n        {\n            var variant = TypeInfo.Arrays.String.CreateVariant(new string[] { \"\", \"\", \"\" });\n            Assert.Equal(new string[] { \"\", \"\", \"\" }, variant.Value);\n        }\n\n        [Fact]\n        public void ArrayStringNullTest1()\n        {\n            var variant = TypeInfo.Arrays.String.CreateVariant(null);\n            Assert.Equal(System.Array.Empty<string>(), variant.Value);\n        }\n\n        [Fact]\n        public void ArrayExtensionObjectTest1()\n        {\n            var expected = new[] {\n                new ExtensionObject(new ExpandedNodeId(\"test1\", 0)),\n                new ExtensionObject(new ExpandedNodeId(\"test2\", 0)),\n                new ExtensionObject(new ExpandedNodeId(\"test3\", 0)),\n                new ExtensionObject(new ExpandedNodeId(\"test4\", 0))\n            };\n            var variant = TypeInfo.Arrays.ExtensionObject.CreateVariant(expected);\n            Assert.Equal(expected, variant.Value);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/JsonDataSetTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using Xunit;\n\n    public class JsonDataSetTests\n    {\n        [Fact]\n        public void ReadWriteProgramDiagnostic2DataTypeStream()\n        {\n            // Create dummy type\n            var expected = VariantVariants.Complex;\n\n            const int count = 100;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context,\n                        JsonEncoderEx.JsonEncoding.Array))\n                {\n                    for (var i = 0; i < count; i++)\n                    {\n                        encoder.WriteEncodeable(null, expected, expected.GetType());\n                    }\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new JsonDecoderEx(stream, context))\n            {\n                for (var i = 0; i < count; i++)\n                {\n                    var result = decoder.ReadEncodeable(null, expected.GetType());\n                    Assert.True(result.IsEqual(expected));\n                }\n                var eof = decoder.ReadEncodeable(null, expected.GetType());\n                Assert.Null(eof);\n            }\n        }\n\n        [Fact]\n        public void ReadWriteDataValueWithIntStream()\n        {\n            // Create dummy\n            var expected = new DataValue(new Variant(12345));\n            const int count = 10000;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context,\n                        JsonEncoderEx.JsonEncoding.Array))\n                {\n                    for (var i = 0; i < count; i++)\n                    {\n                        encoder.WriteDataValue(null, expected);\n                    }\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new JsonDecoderEx(stream, context))\n            {\n                for (var i = 0; i < count; i++)\n                {\n                    var result = decoder.ReadDataValue(null);\n                    Assert.Equal(expected, result);\n                }\n                var eof = decoder.ReadDataValue(null);\n                Assert.Null(eof);\n            }\n        }\n\n        [Fact]\n        public void ReadWriteDataValueWithStringStream()\n        {\n            // Create dummy\n            var expected = new DataValue(new Variant(\"TestTestTestTest\"\n                + Guid.NewGuid()));\n            const int count = 10000;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context,\n                        JsonEncoderEx.JsonEncoding.Array))\n                {\n                    for (var i = 0; i < count; i++)\n                    {\n                        encoder.WriteDataValue(null, expected);\n                    }\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new JsonDecoderEx(stream, context))\n            {\n                for (var i = 0; i < count; i++)\n                {\n                    var result = decoder.ReadDataValue(null);\n                    Assert.Equal(expected, result);\n                }\n                var eof = decoder.ReadDataValue(null);\n                Assert.Null(eof);\n            }\n        }\n\n        [Fact]\n        public void ReadWriteDataSetArrayTest()\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234), StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow),\n                [\"http://microsoft.com\"] = new DataValue(new Variant(-222222222), StatusCodes.Bad, DateTime.MinValue, DateTime.UtcNow),\n                [\"1111111111111111111111111\"] = new DataValue(new Variant(false), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"@#$%^&*()_+~!@#$%^*(){}\"] = new DataValue(new Variant(new byte[] { 0, 2, 4, 6 }), StatusCodes.Good),\n                [\"1245\"] = new DataValue(new Variant(\"hello\"), StatusCodes.Bad, DateTime.UtcNow, DateTime.MinValue),\n                [\"...\"] = new DataValue(new Variant(\"imbricated\"))\n            });\n\n            const int count = 10000;\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context,\n                        JsonEncoderEx.JsonEncoding.Array))\n                {\n                    for (var i = 0; i < count; i++)\n                    {\n                        encoder.WriteDataSet(null, expected);\n                    }\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new JsonDecoderEx(stream, context))\n            {\n                for (var i = 0; i < count; i++)\n                {\n                    var result = decoder.ReadDataSet(null);\n                    Assert.Equal(expected, result);\n                }\n                var eof = decoder.ReadDataSet(null);\n                Assert.Null(eof);\n            }\n        }\n\n        [Fact]\n        public void ReadWriteDataSetWithSingleEntryTest()\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234), StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow)\n            });\n\n            expected.DataSetFieldContentMask |= DataSetFieldContentFlags.SingleFieldDegradeToValue;\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context,\n                        JsonEncoderEx.JsonEncoding.Array))\n                {\n                    encoder.WriteDataSet(null, expected);\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new JsonDecoderEx(stream, context))\n            {\n                var result = decoder.ReadDataValue(null);\n                Assert.Equal(expected.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value, result);\n            }\n        }\n\n        [Fact]\n        public void ReadWriteDataSetWithSingleValueRawTest()\n        {\n            // Create dummy\n            var expected = new DataSet(new Dictionary<string, DataValue>\n            {\n                [\"abcd\"] = new DataValue(new Variant(1234), StatusCodes.Good, DateTime.UtcNow, DateTime.UtcNow)\n            });\n\n            expected.DataSetFieldContentMask |= DataSetFieldContentFlags.SingleFieldDegradeToValue;\n            expected.DataSetFieldContentMask |= DataSetFieldContentFlags.RawData;\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context,\n                        JsonEncoderEx.JsonEncoding.Array))\n                {\n                    encoder.WriteDataSet(null, expected);\n                }\n                buffer = stream.ToArray();\n            }\n            using (var stream = new MemoryStream(buffer))\n            using (var decoder = new JsonDecoderEx(stream, context))\n            {\n                var result = decoder.ReadInt32(null);\n                Assert.Equal(expected.DataSetFields.FirstOrDefault(f => f.Name == \"abcd\").Value.Value, result);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Models/EncodeableDictionaryTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Models\n{\n    using Opc.Ua;\n    using System.IO;\n    using Xunit;\n\n    public class EncodeableDictionaryTests\n    {\n        [Fact]\n        public void WriteReadKeyDataValuePairs()\n        {\n            const string expectedKey1 = \"Key1\";\n            const string expectedKey2 = \"Key2\";\n            const string expectedKey3 = \"Key3\";\n            var expectedValue1 = new DataValue(new Variant(123));\n            var expectedValue2 = new DataValue(new Variant(456));\n            var expectedValue3 = new DataValue(new Variant(789));\n\n            var encodeableDictionary = new EncodeableDictionary {\n                new KeyDataValuePair { Key = expectedKey1, Value = expectedValue1 },\n                new KeyDataValuePair { Key = expectedKey2, Value = expectedValue2 },\n                new KeyDataValuePair { Key = expectedKey3, Value = expectedValue3 }\n            };\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context, JsonEncoderEx.JsonEncoding.StartObject))\n                {\n                    encodeableDictionary.Encode(encoder);\n                }\n\n                // Encoder must be closed before getting buffer.\n                buffer = stream.ToArray();\n            }\n\n            using (var stream = new MemoryStream(buffer))\n            {\n                using var decoder = new JsonDecoderEx(stream, context);\n                var actual = new EncodeableDictionary();\n                actual.Decode(decoder);\n                Assert.Equal(3, actual.Count);\n                Assert.Equal(expectedKey1, actual[0].Key);\n                Assert.Equal(expectedValue1, actual[0].Value);\n                Assert.Equal(expectedKey2, actual[1].Key);\n                Assert.Equal(expectedValue2, actual[1].Value);\n                Assert.Equal(expectedKey3, actual[2].Key);\n                Assert.Equal(expectedValue3, actual[2].Value);\n                var eof = decoder.ReadDataValue(null);\n                Assert.Null(eof);\n            }\n        }\n\n        [Fact]\n        public void WriteReadNoKeyDataValuePairs()\n        {\n            var encodeableDictionary = new EncodeableDictionary();\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context, JsonEncoderEx.JsonEncoding.StartObject))\n                {\n                    encodeableDictionary.Encode(encoder);\n                }\n\n                // Encoder must be closed before getting buffer.\n                buffer = stream.ToArray();\n            }\n\n            using (var stream = new MemoryStream(buffer))\n            {\n                using var decoder = new JsonDecoderEx(stream, context);\n                var actual = new EncodeableDictionary();\n                actual.Decode(decoder);\n                Assert.Empty(actual);\n                var eof = decoder.ReadDataValue(null);\n                Assert.Null(eof);\n            }\n        }\n\n        [Fact]\n        public void WriteReadEmptyKeyDataValuePairs()\n        {\n            var value = new DataValue(new Variant(123));\n\n            var encodeableDictionary = new EncodeableDictionary {\n                new KeyDataValuePair { Key = string.Empty, Value = value },\n                new KeyDataValuePair { Key = string.Empty, Value = value },\n                new KeyDataValuePair { Key = string.Empty, Value = value }\n            };\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context, JsonEncoderEx.JsonEncoding.StartObject))\n                {\n                    encodeableDictionary.Encode(encoder);\n                }\n\n                // Encoder must be closed before getting buffer.\n                buffer = stream.ToArray();\n            }\n\n            using (var stream = new MemoryStream(buffer))\n            {\n                using var decoder = new JsonDecoderEx(stream, context);\n                var actual = new EncodeableDictionary();\n                actual.Decode(decoder);\n                Assert.Empty(actual);\n                var eof = decoder.ReadDataValue(null);\n                Assert.Null(eof);\n            }\n        }\n\n        [Fact]\n        public void WriteReadNoNullKeyDataValuePairs()\n        {\n            const string expectedKey1 = \"Key1\";\n            const string expectedKey2 = \"Key2\";\n            const string expectedKey3 = \"Key3\";\n\n            var encodeableDictionary = new EncodeableDictionary {\n                new KeyDataValuePair { Key = expectedKey1, Value = null },\n                new KeyDataValuePair { Key = expectedKey2, Value = null },\n                new KeyDataValuePair { Key = expectedKey3, Value = null }\n            };\n\n            byte[] buffer;\n            var context = new ServiceMessageContext();\n            using (var stream = new MemoryStream())\n            {\n                using (var encoder = new JsonEncoderEx(stream, context, JsonEncoderEx.JsonEncoding.StartObject))\n                {\n                    encodeableDictionary.Encode(encoder);\n                }\n\n                // Encoder must be closed before getting buffer.\n                buffer = stream.ToArray();\n            }\n\n            using (var stream = new MemoryStream(buffer))\n            {\n                using var decoder = new JsonDecoderEx(stream, context);\n                var actual = new EncodeableDictionary();\n                actual.Decode(decoder);\n                Assert.Empty(actual);\n                var eof = decoder.ReadDataValue(null);\n                Assert.Null(eof);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/AvroNetworkMessageEncoderDecoderTests1.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Avro;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Xunit;\n\n    /// <summary>\n    /// Avro encoder decoder tests\n    /// </summary>\n    public class AvroNetworkMessageEncoderDecoderTests1\n    {\n        public const NetworkMessageContentFlags NetworkMessageContentMaskDefault =\n            NetworkMessageContentFlags.NetworkMessageHeader |\n            NetworkMessageContentFlags.DataSetMessageHeader;\n\n        public const DataSetFieldContentFlags DataSetFieldContentFlagsDefault =\n            DataSetFieldContentFlags.SourceTimestamp |\n            DataSetFieldContentFlags.ServerTimestamp |\n            DataSetFieldContentFlags.SourcePicoSeconds |\n            DataSetFieldContentFlags.ServerPicoSeconds |\n            DataSetFieldContentFlags.StatusCode;\n\n        [Theory]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1, MessageType.KeyFrame)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 3, MessageType.Condition)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 1, MessageType.DeltaFrame)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1, MessageType.KeyFrame)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 3, MessageType.KeepAlive)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 1, MessageType.Event)]\n        public void EncodeDecodeNetworkMessage(bool compress,\n            NetworkMessageContentFlags contentMask, int numberOfMessages, MessageType messageType)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    messageType: messageType, statusCode: StatusCodes.Good))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            context = new ServiceMessageContext();\n            buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n            Assert.Equal(schema, networkMessage.Schema);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = PubSubMessage.Decode(buffer, networkMessage.ContentType, context, messageSchema: json);\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1, MessageType.KeyFrame)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 3, MessageType.Condition)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 1, MessageType.DeltaFrame)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1, MessageType.KeyFrame)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 3, MessageType.KeepAlive)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 1, MessageType.Event)]\n        public void EncodeDecodeNetworkMessageWithNullableDataValue(bool compress,\n            NetworkMessageContentFlags contentMask, int numberOfMessages, MessageType messageType)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    messageType: messageType, statusCode: null))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            // Set null data value\n            messages.ForEach(messages => messages.Payload = messages.Payload.Set(\"6\", null));\n            // Reencode with the schema\n            context = new ServiceMessageContext();\n            buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n            Assert.Equal(schema, networkMessage.Schema);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = PubSubMessage.Decode(buffer, networkMessage.ContentType, context, messageSchema: json);\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1, MessageType.KeyFrame)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 3, MessageType.Condition)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 1, MessageType.DeltaFrame)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1, MessageType.KeyFrame)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 3, MessageType.KeepAlive)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 1, MessageType.Event)]\n        public void EncodeDecodeNetworkMessageWithMissingDataValue(bool compress,\n            NetworkMessageContentFlags contentMask, int numberOfMessages, MessageType messageType)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    messageType: messageType, statusCode: null))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            // Set null data value\n            messages.ForEach(messages => messages.Payload = messages.Payload.Remove(\"6\"));\n            // Reencode with the schema\n            context = new ServiceMessageContext();\n            buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n            Assert.Equal(schema, networkMessage.Schema);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = PubSubMessage.Decode(buffer, networkMessage.ContentType, context, messageSchema: json);\n            // Result will contain the removed field in the data set as it was serialized as null\n            ((BaseNetworkMessage)result).Messages.ToList().ForEach(m =>\n            {\n                Assert.Null(m.Payload.DataSetFields.FirstOrDefault(f => f.Name == \"6\").Value);\n                m.Payload = m.Payload.Remove(\"6\");\n            });\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessages(bool compress,\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber, messageType: MessageType.DeltaFrame))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var m = buffers\n                .Select(buffer => (BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json))\n                .ToList();\n            var result = m[0];\n            result.Messages = m.SelectMany(m => m.Messages).ToList();\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesWithNullableDataValue(bool compress,\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber, messageType: MessageType.DeltaFrame))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            // Set null data value\n            messages.ForEach(messages => messages.Payload = messages.Payload.Set(\"6\", null));\n            // Reencode with the schema\n            context = new ServiceMessageContext();\n            buffers = networkMessage.Encode(context, maxMessageSize);\n            Assert.Equal(schema, networkMessage.Schema);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var m = buffers\n                .Select(buffer => (BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json))\n                .ToList();\n            var result = m[0];\n            result.Messages = m.SelectMany(m => m.Messages).ToList();\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoNetworkMessageHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber, messageType: MessageType.Event))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask & ~NetworkMessageContentFlags.NetworkMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .ToList();\n            Assert.Equal(networkMessage.Messages, result);\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoNetworkMessageHeaderRaw(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    dataSetFieldContentMask: DataSetFieldContentFlags.RawData, messageType: MessageType.Condition))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask & ~NetworkMessageContentFlags.NetworkMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList();\n            var serializer = new NewtonsoftJsonSerializer();\n            var expected = serializer.Parse(serializer.SerializeToString(messages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList()));\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoDataSetMessageHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~NetworkMessageContentFlags.DataSetMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .Select(m => m.Payload)\n                .ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoDataSetMessageHeaderWithNullableDataValues(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~NetworkMessageContentFlags.DataSetMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            // Set null data value\n            messages.ForEach(messages => messages.Payload = messages.Payload.Set(\"6\", null));\n            // Reencode with the schema\n            context = new ServiceMessageContext();\n            buffers = networkMessage.Encode(context, maxMessageSize);\n            Assert.Equal(schema, networkMessage.Schema);\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .Select(m => m.Payload)\n                .ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoDataSetMessageHeaderRaw(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    dataSetFieldContentMask: DataSetFieldContentFlags.RawData))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~NetworkMessageContentFlags.DataSetMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList();\n            var serializer = new NewtonsoftJsonSerializer();\n\n            var expected = serializer.Parse(serializer.SerializeToString(messages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList()));\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .Select(m => m.Payload)\n                .ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(5, 256 * 1024)]\n        [InlineData(10, 256 * 1024)]\n        [InlineData(15, 256 * 1024)]\n        [InlineData(5, 1024)]\n        [InlineData(10, 1024)]\n        [InlineData(15, 1024)]\n        public void EncodeDecodeSingleMessageWithUnionSchemas(int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(NetworkMessageContentFlags.SingleDataSetMessage, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            var json = schema.ToJson();\n            var union = UnionSchema.Create(Enumerable.Range(0, 4)\n                .Select(i => Schema.Parse(schema.ToJson().Replace(\"\\\"DataSet\\\"\", $\"\\\"DataSet{i}\\\"\", StringComparison.InvariantCulture)))\n                .ToList());\n            json = union.ToJson();\n\n            // Re-encode\n            networkMessage.Schema = union;\n            buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .Select(m => m.Payload)\n                .ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeaderRaw(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    dataSetFieldContentMask: DataSetFieldContentFlags.RawData))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            // Compare payload as raw data equivalent\n            var serializer = new NewtonsoftJsonSerializer();\n            var result = serializer.Parse(serializer.SerializeToString(buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList()));\n            var expected = serializer.Parse(serializer.SerializeToString(messages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList()));\n\n            Assert.Equal(expected, result);\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeaderRawAndNullableDataValue(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    dataSetFieldContentMask: DataSetFieldContentFlags.RawData))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            // Set null data value\n            messages.ForEach(messages => messages.Payload = messages.Payload.Set(\"6\", null));\n            // Reencode with the schema\n            context = new ServiceMessageContext();\n            buffers = networkMessage.Encode(context, maxMessageSize);\n            Assert.Equal(schema, networkMessage.Schema);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            // Compare payload as raw data equivalent\n            var serializer = new NewtonsoftJsonSerializer();\n            var result = serializer.Parse(serializer.SerializeToString(buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList()));\n            var expected = serializer.Parse(serializer.SerializeToString(messages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList()));\n\n            Assert.Equal(expected, result);\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeaderRawAndMissingDataValue(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    dataSetFieldContentMask: DataSetFieldContentFlags.RawData))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            // Set null data value\n            messages.ForEach(messages => messages.Payload = messages.Payload.Remove(\"6\"));\n            // Reencode with the schema\n            context = new ServiceMessageContext();\n            buffers = networkMessage.Encode(context, maxMessageSize);\n            Assert.Equal(schema, networkMessage.Schema);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            // Compare payload as raw data equivalent\n            var serializer = new NewtonsoftJsonSerializer();\n            var result = serializer.Parse(serializer.SerializeToString(buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Where(m => m.Name != \"6\")\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList()));\n            var expected = serializer.Parse(serializer.SerializeToString(messages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value?.Value))\n                .ToList()));\n\n            Assert.Equal(expected, result);\n        }\n\n        /// <summary>\n        /// Convert timestamps of payload to OpcUa Utc.\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        private static void ConvertToOpcUaUniversalTime(BaseNetworkMessage networkMessage)\n        {\n            // convert DataSet Payload DataValue timestamps to OpcUa Utc\n            foreach (var dataSetMessage in networkMessage.Messages)\n            {\n                var expectedPayload = new Dictionary<string, DataValue>();\n                foreach (var (Name, Value) in dataSetMessage.Payload.DataSetFields)\n                {\n                    expectedPayload[Name] = Value == null ? null : new DataValue(Value).ToOpcUaUniversalTime();\n                }\n                dataSetMessage.Payload = new DataSet(expectedPayload,\n                    DataSetFieldContentFlags.StatusCode |\n                    DataSetFieldContentFlags.SourceTimestamp);\n            }\n        }\n\n        /// <summary>\n        /// Create network message\n        /// </summary>\n        /// <param name=\"contentMask\"></param>\n        /// <param name=\"messages\"></param>\n        private static AvroNetworkMessage CreateNetworkMessage(\n            NetworkMessageContentFlags contentMask, List<BaseDataSetMessage> messages)\n        {\n            return new AvroNetworkMessage\n            {\n                MessageId = () => \"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n                Messages = messages,\n                DataSetWriterGroup = \"group\",\n                DataSetClassId = Guid.NewGuid(),\n                PublisherId = \"PublisherId\",\n                NetworkMessageContentMask = contentMask\n            };\n        }\n\n        /// <summary>\n        /// Create dataset message\n        /// </summary>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"statusCode\"></param>\n        private static AvroDataSetMessage CreateDataSetMessage(int sequenceNumber,\n            DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault,\n            MessageType messageType = MessageType.KeyFrame, uint? statusCode = StatusCodes.Bad)\n        {\n            return new AvroDataSetMessage\n            {\n                DataSetWriterName = \"WriterId\",\n                DataSetWriterId = 3,\n                MetaDataVersion = new ConfigurationVersionDataType { MajorVersion = 1, MinorVersion = 1 },\n                SequenceNumber = (ushort)sequenceNumber,\n                Status = statusCode,\n                Timestamp = DateTimeOffset.UtcNow,\n                MessageType = messageType,\n                Picoseconds = 1,\n                Payload = CreateDataSet(dataSetFieldContentMask)\n            };\n        }\n\n        /// <summary>\n        /// Create dataset\n        /// </summary>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static DataSet CreateDataSet(DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new DataSet(new Dictionary<string, DataValue> {\n                { \"1\", new DataValue(new Variant(true), StatusCodes.Good, DateTime.Now, DateTime.UtcNow) },\n                { \"2\", new DataValue(new Variant(0.5), StatusCodes.Good, DateTime.Now) },\n                { \"3\", new DataValue(Variant.Null, StatusCodes.Good, DateTime.Now) },\n                { \"4\", new DataValue(new Variant([\"test\", \"Test\"]), StatusCodes.Good, DateTime.Now) },\n                { \"5\", new DataValue(new Variant(Array.Empty<float>()), StatusCodes.Good, DateTime.Now) },\n                { \"6\", new DataValue() },\n                { \"7\", new DataValue(\"abcd\") }\n            }, dataSetFieldContentMask);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/AvroNetworkMessageEncoderDecoderTests2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Xunit;\n\n    /// <summary>\n    /// Avro encoder decoder tests\n    /// </summary>\n    public class AvroNetworkMessageEncoderDecoderTests2\n    {\n        public const NetworkMessageContentFlags NetworkMessageContentMaskDefault =\n            NetworkMessageContentFlags.NetworkMessageHeader |\n            NetworkMessageContentFlags.DataSetMessageHeader;\n\n        public const DataSetFieldContentFlags DataSetFieldContentFlagsDefault =\n            DataSetFieldContentFlags.SourceTimestamp |\n            DataSetFieldContentFlags.ServerTimestamp |\n            DataSetFieldContentFlags.SourcePicoSeconds |\n            DataSetFieldContentFlags.ServerPicoSeconds |\n            DataSetFieldContentFlags.StatusCode;\n\n        [Theory]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 1)]\n        public void EncodeDecodeNetworkMessage(bool compress,\n            NetworkMessageContentFlags contentMask, int numberOfMessages)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            context = new ServiceMessageContext();\n            buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n            Assert.Equal(schema, networkMessage.Schema);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = PubSubMessage.Decode(buffer, networkMessage.ContentType, context, messageSchema: json);\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessages(bool compress,\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var m = buffers\n                .Select(buffer => (BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json))\n                .ToList();\n            var result = m[0];\n            result.Messages = m.SelectMany(m => m.Messages).ToList();\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoNetworkMessageHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask & ~NetworkMessageContentFlags.NetworkMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .ToList();\n            Assert.Equal(networkMessage.Messages, result);\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoDataSetMessageHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~NetworkMessageContentFlags.DataSetMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .Select(m => m.Payload)\n                .ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .Select(m => m.Payload)\n                .ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeaderRaw(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber,\n                    dataSetFieldContentMask: DataSetFieldContentFlags.RawData))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            var schema = networkMessage.Schema;\n            Assert.NotNull(schema);\n            var json = schema.ToJson();\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            // Compare payload as raw data equivalent\n            var serializer = new NewtonsoftJsonSerializer();\n            var result = serializer.Parse(serializer.SerializeToString(buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: json)).Messages)\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value.Value))\n                .ToList()));\n            var expected = serializer.Parse(serializer.SerializeToString(messages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value.Value))\n                .ToList()));\n\n            Assert.Equal(expected, result);\n        }\n\n        /// <summary>\n        /// Convert timestamps of payload to OpcUa Utc.\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        private static void ConvertToOpcUaUniversalTime(BaseNetworkMessage networkMessage)\n        {\n            // convert DataSet Payload DataValue timestamps to OpcUa Utc\n            foreach (var dataSetMessage in networkMessage.Messages)\n            {\n                var expectedPayload = new Dictionary<string, DataValue>();\n                foreach (var (Name, Value) in dataSetMessage.Payload.DataSetFields)\n                {\n                    expectedPayload[Name] = new DataValue(Value).ToOpcUaUniversalTime();\n                }\n                dataSetMessage.Payload = new DataSet(expectedPayload,\n                    DataSetFieldContentFlags.StatusCode |\n                    DataSetFieldContentFlags.SourceTimestamp);\n            }\n        }\n\n        /// <summary>\n        /// Create network message\n        /// </summary>\n        /// <param name=\"contentMask\"></param>\n        /// <param name=\"messages\"></param>\n        private static AvroNetworkMessage CreateNetworkMessage(\n            NetworkMessageContentFlags contentMask, List<BaseDataSetMessage> messages)\n        {\n            return new AvroNetworkMessage\n            {\n                MessageId = () => \"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n                Messages = messages,\n                DataSetWriterGroup = \"group\",\n                DataSetClassId = Guid.NewGuid(),\n                PublisherId = \"PublisherId\",\n                EmitConciseSchema = true,\n                NetworkMessageContentMask = contentMask\n            };\n        }\n\n        /// <summary>\n        /// Create dataset message\n        /// </summary>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static AvroDataSetMessage CreateDataSetMessage(int sequenceNumber,\n            DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new AvroDataSetMessage\n            {\n                DataSetWriterName = \"WriterId\",\n                DataSetWriterId = 3,\n                MetaDataVersion = new ConfigurationVersionDataType { MajorVersion = 1, MinorVersion = 1 },\n                SequenceNumber = (ushort)sequenceNumber,\n                Status = StatusCodes.Bad,\n                Timestamp = DateTimeOffset.UtcNow,\n                MessageType = MessageType.KeyFrame,\n                Picoseconds = 1,\n                Payload = CreateDataSet(dataSetFieldContentMask)\n            };\n        }\n\n        /// <summary>\n        /// Create dataset\n        /// </summary>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static DataSet CreateDataSet(DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new DataSet(new Dictionary<string, DataValue> {\n                { \"1\", new DataValue(new Variant(true), StatusCodes.Good, DateTime.Now, DateTime.UtcNow) },\n                { \"2\", new DataValue(new Variant(0.5), StatusCodes.Good, DateTime.Now) },\n                { \"3\", new DataValue(\"abcd\") }\n            }, dataSetFieldContentMask);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/AvroNetworkMessageFileWriterReaderTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Logging;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using Xunit;\n\n    /// <summary>\n    /// Avro file reader/writer tests\n    /// </summary>\n    public class AvroNetworkMessageFileWriterReaderTests\n    {\n        public const NetworkMessageContentFlags NetworkMessageContentMaskDefault =\n            NetworkMessageContentFlags.NetworkMessageHeader |\n            NetworkMessageContentFlags.DataSetMessageHeader;\n\n        public const DataSetFieldContentFlags DataSetFieldContentFlagsDefault =\n            DataSetFieldContentFlags.SourceTimestamp |\n            DataSetFieldContentFlags.ServerTimestamp |\n            DataSetFieldContentFlags.SourcePicoSeconds |\n            DataSetFieldContentFlags.ServerPicoSeconds |\n            DataSetFieldContentFlags.StatusCode;\n\n        [Theory]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(true, NetworkMessageContentMaskDefault, 15, 1024)]\n        public void ReadWriteNetworkMessages(bool compress,\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            using var file = new MemoryStream();\n            using (var writer = AvroFileWriter.AvroFile.CreateFromStream(\n                file, networkMessage.Schema.ToJson(), new Dictionary<string, string>(), Log.Console(\"test\"), compress))\n            {\n                writer.Write(buffers);\n            }\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n            networkMessage.UseGzipCompression = false; // Unset compression flag now as we are reading the file\n\n            file.Seek(0, SeekOrigin.Begin);\n            using (var reader = new AvroFileReader(file))\n            {\n                var m = reader\n                    .Stream((schema, stream) => PubSubMessage.Decode(stream, networkMessage.ContentType,\n                        context, messageSchema: schema.ToJson()).ToList())\n                    .SelectMany(m => m.Cast<BaseNetworkMessage>())\n                    .ToList();\n\n                var result = m[0];\n                result.Messages = m.SelectMany(m => m.Messages).ToList();\n                Assert.Equal(networkMessage, result);\n            }\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void ReadWriteNetworkMessagesNoNetworkMessageHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask & ~NetworkMessageContentFlags.NetworkMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            using var file = new MemoryStream();\n            using (var writer = AvroFileWriter.AvroFile.CreateFromStream(\n                file, networkMessage.Schema.ToJson(), new Dictionary<string, string>(), Log.Console(\"test\")))\n            {\n                writer.Write(buffers);\n            }\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n            file.Seek(0, SeekOrigin.Begin);\n            using var reader = new AvroFileReader(file);\n            var result = reader\n                .Stream((schema, stream) => PubSubMessage.Decode(stream, networkMessage.ContentType,\n                    context, messageSchema: schema.ToJson()).ToList())\n                .SelectMany(m => m.Cast<BaseNetworkMessage>().ToList())\n                .SelectMany(m => m.Messages)\n                .ToList();\n\n            Assert.Equal(networkMessage.Messages, result);\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void ReadWriteNetworkMessagesNoDataSetMessageHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~NetworkMessageContentFlags.DataSetMessageHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            using var file = new MemoryStream();\n            using (var writer = AvroFileWriter.AvroFile.CreateFromStream(\n                file, networkMessage.Schema.ToJson(), new Dictionary<string, string>(), Log.Console(\"test\")))\n            {\n                writer.Write(buffers);\n            }\n            ConvertToOpcUaUniversalTime(networkMessage);\n            file.Seek(0, SeekOrigin.Begin);\n            using var reader = new AvroFileReader(file);\n            var result = reader\n                .Stream((schema, stream) => PubSubMessage.Decode(stream, networkMessage.ContentType,\n                    context, messageSchema: schema.ToJson()).ToList())\n                .SelectMany(m => m.Cast<BaseNetworkMessage>().ToList())\n                .SelectMany(m => m.Messages).Select(m => m.Payload)\n                .ToList();\n\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(NetworkMessageContentMaskDefault, 15, 1024)]\n        public void ReadWriteNetworkMessagesNoHeader(\n            NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n            using var file = new MemoryStream();\n            using (var writer = AvroFileWriter.AvroFile.CreateFromStream(\n                file, networkMessage.Schema.ToJson(), new Dictionary<string, string>(), Log.Console(\"test\")))\n            {\n                writer.Write(buffers);\n            }\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n            file.Seek(0, SeekOrigin.Begin);\n            using var reader = new AvroFileReader(file);\n            var result = reader\n                .Stream((schema, stream) => PubSubMessage.Decode(stream, networkMessage.ContentType,\n                     context, messageSchema: schema.ToJson()).ToList())\n                .SelectMany(m => m.Cast<BaseNetworkMessage>())\n                .SelectMany(m => m.Messages.Select(m => m.Payload))\n                .ToList();\n\n            var expected = networkMessage.Messages.Select(m => m.Payload).ToList();\n            Assert.All(expected, (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        /// <summary>\n        /// Convert timestamps of payload to OpcUa Utc.\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        private static void ConvertToOpcUaUniversalTime(BaseNetworkMessage networkMessage)\n        {\n            // convert DataSet Payload DataValue timestamps to OpcUa Utc\n            foreach (var dataSetMessage in networkMessage.Messages)\n            {\n                var expectedPayload = new Dictionary<string, DataValue>();\n                foreach (var (Name, Value) in dataSetMessage.Payload.DataSetFields)\n                {\n                    expectedPayload[Name] = new DataValue(Value).ToOpcUaUniversalTime();\n                }\n                dataSetMessage.Payload = new DataSet(expectedPayload,\n                    DataSetFieldContentFlags.StatusCode |\n                    DataSetFieldContentFlags.SourceTimestamp);\n            }\n        }\n\n        /// <summary>\n        /// Create network message\n        /// </summary>\n        /// <param name=\"contentMask\"></param>\n        /// <param name=\"messages\"></param>\n        private static AvroNetworkMessage CreateNetworkMessage(\n            NetworkMessageContentFlags contentMask, List<BaseDataSetMessage> messages)\n        {\n            return new AvroNetworkMessage\n            {\n                MessageId = () => \"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n                Messages = messages,\n                DataSetWriterGroup = \"group\",\n                DataSetClassId = Guid.NewGuid(),\n                PublisherId = \"PublisherId\",\n                EmitConciseSchema = true,\n                NetworkMessageContentMask = contentMask\n            };\n        }\n\n        /// <summary>\n        /// Create dataset message\n        /// </summary>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static AvroDataSetMessage CreateDataSetMessage(int sequenceNumber,\n            DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new AvroDataSetMessage\n            {\n                DataSetWriterName = \"WriterId\",\n                DataSetWriterId = 3,\n                MetaDataVersion = new ConfigurationVersionDataType { MajorVersion = 1, MinorVersion = 1 },\n                SequenceNumber = (ushort)sequenceNumber,\n                Status = StatusCodes.Bad,\n                Timestamp = DateTimeOffset.UtcNow,\n                MessageType = MessageType.KeyFrame,\n                Picoseconds = 1,\n                Payload = CreateDataSet(dataSetFieldContentMask)\n            };\n        }\n\n        /// <summary>\n        /// Create dataset\n        /// </summary>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static DataSet CreateDataSet(DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new DataSet(new Dictionary<string, DataValue> {\n                { \"1\", new DataValue(new Variant(true), StatusCodes.Good, DateTime.Now, DateTime.UtcNow) },\n                { \"2\", new DataValue(new Variant(0.5), StatusCodes.Good, DateTime.Now) },\n                { \"3\", new DataValue(\"abcd\") }\n            }, dataSetFieldContentMask);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/JsonNetworkMessageEncoderDecoderTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Xunit;\n\n    /// <summary>\n    /// Json encoder decoder tests\n    /// </summary>\n    public class JsonNetworkMessageEncoderDecoderTests\n    {\n        public const NetworkMessageContentFlags NetworkMessageContentMaskDefault =\n            NetworkMessageContentFlags.PublisherId |\n            NetworkMessageContentFlags.NetworkMessageHeader |\n            NetworkMessageContentFlags.DataSetMessageHeader |\n            NetworkMessageContentFlags.DataSetClassId;\n\n        public const DataSetMessageContentFlags DataSetMessageContentMaskDefault =\n            DataSetMessageContentFlags.DataSetWriterName |\n            DataSetMessageContentFlags.MessageType |\n            DataSetMessageContentFlags.DataSetWriterId |\n            DataSetMessageContentFlags.SequenceNumber |\n            DataSetMessageContentFlags.MetaDataVersion |\n            DataSetMessageContentFlags.Timestamp |\n            DataSetMessageContentFlags.Status;\n\n        public const DataSetFieldContentFlags DataSetFieldContentFlagsDefault =\n            DataSetFieldContentFlags.SourceTimestamp |\n            DataSetFieldContentFlags.ServerTimestamp |\n            DataSetFieldContentFlags.SourcePicoSeconds |\n            DataSetFieldContentFlags.ServerPicoSeconds |\n            DataSetFieldContentFlags.StatusCode;\n\n        [Theory]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 3)]\n        public void EncodeDecodeNetworkMessage(bool useArrayEnvelope, bool compress,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = PubSubMessage.Decode(buffer, networkMessage.ContentType, context);\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 3)]\n        public void EncodeDecodeNetworkMessageReversible(bool useArrayEnvelope, bool compress,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber,\n                    DataSetMessageContentMaskDefault | DataSetMessageContentFlags.ReversibleFieldEncoding))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = PubSubMessage.Decode(buffer, networkMessage.ContentType, context);\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        public void EncodeDecodeNetworkMessages(bool useArrayEnvelope, bool compress,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var m = buffers\n                .Select(buffer => (BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context))\n                .ToList();\n            var result = m[0];\n            result.Messages = m.SelectMany(m => m.Messages).ToList();\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        public void EncodeDecodeNetworkMessagesReversible(bool useArrayEnvelope, bool compress,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber,\n                    DataSetMessageContentMaskDefault | DataSetMessageContentFlags.ReversibleFieldEncoding))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var m = buffers\n                .Select(buffer => (BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context))\n                .ToList();\n            var result = m[0];\n            result.Messages = m.SelectMany(m => m.Messages).ToList();\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        public void EncodeDecodeNetworkMessagesNoNetworkMessageHeader(bool useArrayEnvelope,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask & ~NetworkMessageContentFlags.NetworkMessageHeader, messages);\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context)).Messages)\n                .ToList();\n            Assert.Equal(networkMessage.Messages, result);\n        }\n\n        [Theory]\n        [InlineData(false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        public void EncodeDecodeNetworkMessagesNoDataSetMessageHeader(bool useArrayEnvelope,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~NetworkMessageContentFlags.DataSetMessageHeader, messages);\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context)).Messages)\n                .Select(m => m.Payload)\n                .ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeader(bool useArrayEnvelope,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context)).Messages)\n                .Select(m => m.Payload)\n                .ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeaderRaw(bool useArrayEnvelope,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber,\n                    dataSetFieldContentMask: DataSetFieldContentFlags.RawData))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask\n                & ~(NetworkMessageContentFlags.NetworkMessageHeader | NetworkMessageContentFlags.DataSetMessageHeader), messages);\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            // Compare payload as raw data equivalent\n            var serializer = new NewtonsoftJsonSerializer();\n            var result = serializer.Parse(serializer.SerializeToString(buffers\n                .SelectMany(buffer => ((BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context)).Messages)\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value.Value))\n                .ToList()));\n            var expected = serializer.Parse(serializer.SerializeToString(messages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value.Value))\n                .ToList()));\n\n            Assert.Equal(expected, result);\n        }\n\n        /// <summary>\n        /// Convert timestamps of payload to OpcUa Utc.\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        private static void ConvertToOpcUaUniversalTime(BaseNetworkMessage networkMessage)\n        {\n            // convert DataSet Payload DataValue timestamps to OpcUa Utc\n            foreach (var dataSetMessage in networkMessage.Messages)\n            {\n                var expectedPayload = new Dictionary<string, DataValue>();\n                foreach (var (Name, Value) in dataSetMessage.Payload.DataSetFields)\n                {\n                    expectedPayload[Name] = new DataValue(Value).ToOpcUaUniversalTime();\n                }\n                dataSetMessage.Payload = new DataSet(expectedPayload,\n                    DataSetFieldContentFlags.StatusCode |\n                    DataSetFieldContentFlags.SourceTimestamp);\n            }\n        }\n\n        /// <summary>\n        /// Create network message\n        /// </summary>\n        /// <param name=\"contentMask\"></param>\n        /// <param name=\"messages\"></param>\n        private static JsonNetworkMessage CreateNetworkMessage(\n            NetworkMessageContentFlags contentMask, List<BaseDataSetMessage> messages)\n        {\n            return new JsonNetworkMessage\n            {\n                MessageId = () => \"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n                Messages = messages,\n                DataSetWriterGroup = \"group\",\n                DataSetClassId = Guid.NewGuid(),\n                PublisherId = \"PublisherId\",\n                NetworkMessageContentMask = contentMask\n            };\n        }\n\n        /// <summary>\n        /// Create dataset message\n        /// </summary>\n        /// <param name=\"useCompatibilityMode\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"dataSetMessageContentMask\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static JsonDataSetMessage CreateDataSetMessage(bool useCompatibilityMode, int sequenceNumber,\n            DataSetMessageContentFlags dataSetMessageContentMask = DataSetMessageContentMaskDefault,\n            DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new JsonDataSetMessage\n            {\n                DataSetWriterName = \"WriterId\",\n                DataSetWriterId = (ushort)(useCompatibilityMode ? 0 : 3),\n                MetaDataVersion = new ConfigurationVersionDataType { MajorVersion = 1, MinorVersion = 1 },\n                SequenceNumber = (ushort)sequenceNumber,\n                Status = StatusCodes.Bad,\n                Timestamp = DateTimeOffset.UtcNow,\n                UseCompatibilityMode = useCompatibilityMode,\n                MessageType = MessageType.KeyFrame,\n                Picoseconds = 1,\n                Payload = CreateDataSet(dataSetFieldContentMask),\n                DataSetMessageContentMask = dataSetMessageContentMask\n            };\n        }\n\n        /// <summary>\n        /// Create dataset\n        /// </summary>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static DataSet CreateDataSet(DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new DataSet(new Dictionary<string, DataValue> {\n                { \"1\", new DataValue(new Variant(true), StatusCodes.Good, DateTime.Now, DateTime.UtcNow) },\n                { \"2\", new DataValue(new Variant(0.5), StatusCodes.Good, DateTime.Now) },\n                { \"3\", new DataValue(\"abcd\") }\n            }, dataSetFieldContentMask);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/JsonNetworkMessageEncoderTests1.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using Xunit;\n\n    public class JsonNetworkMessageEncoderTests1\n    {\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void MultipleMessagesNoNetworkMessageHeaderAndNoDataSetMessageHeaderRawEncoding(bool useArrayEnvelope)\n        {\n            var simple = CreateMessage(0x18, 0x62, 0x3f);\n            simple.UseArrayEnvelope = useArrayEnvelope;\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"Temperature\":25,\n    \"Pressure\":1013,\n    \"Humidity\":42\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void MultipleMessagesNoNetworkMessageHeaderAndNoDataSetMessageHeaderVariantEncoding(bool useArrayEnvelope)\n        {\n            var simple = CreateMessage(0x18, 0x62, 0);\n            simple.UseArrayEnvelope = useArrayEnvelope;\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n\n            // TODO: According to spec if no datavalue fields are selected,\n            // the value is encoded as variant using reversible encoding\n            // Even if the datatset mask flag is not set. This is not logical.\n            // The pub sub formatter behaves differently, it uses raw encoding.\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"Temperature\":{\"Type\":6,\"Body\":25},\n    \"Pressure\":{\"Type\":6,\"Body\":1013},\n    \"Humidity\":{\"Type\":6,\"Body\":42}\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void MultipleMessagesNoNetworkMessageHeaderAndNoDataSetMessageHeader(bool useArrayEnvelope)\n        {\n            var simple = CreateMessage(0x18, 0x62, 0x1f);\n            simple.UseArrayEnvelope = useArrayEnvelope;\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void MultipleMessagesNoNetworkMessageHeaderAndSubsetofDataSetMessageContent(bool useArrayEnvelope)\n        {\n            var simple = CreateMessage(0x1a, 0x62, 0x1f);\n            simple.UseArrayEnvelope = useArrayEnvelope;\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n    }\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void MultipleMessagesAllSwitchesSelectedAndReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1b, 0xff, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  [\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29766,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-keyframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":25},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1013},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":42},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n      }\n    }\n  ]\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void MultipleMessagesAllSwitchesSelectedAndReversableFieldEncodingWithArrayEnvelope()\n        {\n            var simple = CreateMessage(0x1b, 0xff, 0x1f);\n            simple.UseArrayEnvelope = true;\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    [\n      {\n        \"DataSetWriterId\":100,\n        \"SequenceNumber\":29766,\n        \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n        \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n        \"Status\":1073741824,\n        \"MessageType\":\"ua-keyframe\",\n        \"DataSetWriterName\":\"Writer100\",\n        \"Payload\":\n        {\n          \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":25},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n          \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1013},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n          \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":42},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n        }\n      }\n    ]\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void MultipleMessagesAllSwitchesSelectedNoReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1b, 0x7f, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  [\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29766,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-keyframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n      }\n    }\n  ]\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageNoNetworkMessageHeaderAndNoDataSetMessageHeader()\n        {\n            var simple = CreateMessage(0x1c, 0x62, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n  \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n  \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageNoNetworkMessageHeaderAndSubsetofDataSetMessageContent()\n        {\n            var simple = CreateMessage(0x1e, 0x62, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n  \"MessageType\":\"ua-keyframe\",\n  \"DataSetWriterName\":\"Writer100\",\n  \"Payload\":\n  {\n    \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedAndReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1f, 0xff, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  {\n    \"DataSetWriterId\":100,\n    \"SequenceNumber\":29766,\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n    \"Status\":1073741824,\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":25},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1013},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":42},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n    }\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedNoReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1f, 0x7f, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  {\n    \"DataSetWriterId\":100,\n    \"SequenceNumber\":29766,\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n    \"Status\":1073741824,\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n    }\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedRawValueEncoding()\n        {\n            var simple = CreateMessage(0x1f, 0x7f, 0x3f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  {\n    \"DataSetWriterId\":100,\n    \"SequenceNumber\":29766,\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n    \"Status\":1073741824,\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":25,\n      \"Pressure\":1013,\n      \"Humidity\":42\n    }\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedJustStatusFieldAndArrayEnvelope()\n        {\n            var simple = CreateMessage(0x1f, 0x7f, 0x1);\n            simple.UseArrayEnvelope = true;\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29766,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-keyframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":25},\n        \"Pressure\":{\"Value\":1013},\n        \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"}}\n      }\n    }\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedNoReversableFieldEncodingWithArrayEnvelope()\n        {\n            var simple = CreateMessage(0x1f, 0x7f, 0x1f);\n            simple.UseArrayEnvelope = true;\n            var buffers = simple.Encode(new ServiceMessageContext(), 1024);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29766,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-keyframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n      }\n    }\n  }\n]\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        private static JsonNetworkMessage CreateMessage(uint messageMask, uint datasetMask, uint fieldMask)\n        {\n            return new JsonNetworkMessage\n            {\n                DataSetClassId = Guid.Parse(\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\"),\n                NetworkMessageContentMask = PubSubMessageContentFlagHelper.StackToNetworkMessageContentFlags(messageMask),\n                MessageId = () => \"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n                PublisherId = \"MyPublisher\",\n                Messages = [\n                    new JsonDataSetMessage {\n                        DataSetMessageContentMask = PubSubMessageContentFlagHelper.StackToDataSetMessageContentFlags(datasetMask),\n                        DataSetWriterId = 100,\n                        SequenceNumber = 29766,\n                        MetaDataVersion = new ConfigurationVersionDataType\n                        {\n                            MajorVersion = 672338910, MinorVersion = 672341762\n                        },\n                        Timestamp = DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture),\n                        Status = 1073741824,\n                        MessageType = MessageType.KeyFrame,\n                        DataSetWriterName = \"Writer100\",\n                        Payload = new DataSet(new Dictionary<string, DataValue>\n                        {\n    [\"Temperature\"] = new DataValue(25, StatusCodes.Good,\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture)),\n    [\"Pressure\"] = new DataValue(1013, StatusCodes.Good,\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture)),\n    [\"Humidiy\"] = new DataValue(42, StatusCodes.Uncertain,\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture))\n                        }, PubSubMessageContentFlagHelper.StackToDataSetFieldContentFlags(fieldMask))\n                    }\n                ]\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/JsonNetworkMessageEncoderTests2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using Xunit;\n\n    public class JsonNetworkMessageEncoderTests2\n    {\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void MultipleMessagesNoNetworkMessageHeaderAndNoDataSetMessageHeaderRawEncoding(bool useArrayEnvelope)\n        {\n            var simple = CreateMessage(0x18, 0x62, 0x3f);\n            simple.UseArrayEnvelope = useArrayEnvelope;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"Temperature\":25,\n    \"Pressure\":1013,\n    \"Humidity\":42\n  },\n  {\n    \"Temperature\":26,\n    \"Pressure\":1014,\n    \"Humidity\":43\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void MultipleMessagesNoNetworkMessageHeaderAndNoDataSetMessageHeaderVariantEncoding(bool useArrayEnvelope)\n        {\n            var simple = CreateMessage(0x18, 0x62, 0);\n            simple.UseArrayEnvelope = useArrayEnvelope;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n\n            // TODO: According to spec if no datavalue fields are selected,\n            // the value is encoded as variant using reversible encoding\n            // Even if the datatset mask flag is not set. This is not logical.\n            // The pub sub formatter behaves differently, it uses raw encoding.\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"Temperature\":{\"Type\":6,\"Body\":25},\n    \"Pressure\":{\"Type\":6,\"Body\":1013},\n    \"Humidity\":{\"Type\":6,\"Body\":42}\n  },\n  {\n    \"Temperature\":{\"Type\":6,\"Body\":26},\n    \"Pressure\":{\"Type\":6,\"Body\":1014},\n    \"Humidity\":{\"Type\":6,\"Body\":43}\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void MultipleMessagesNoNetworkMessageHeaderAndNoDataSetMessageHeader(bool useArrayEnvelope)\n        {\n            var simple = CreateMessage(0x18, 0x62, 0x1f);\n            simple.UseArrayEnvelope = useArrayEnvelope;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n  },\n  {\n    \"Temperature\":{\"Value\":26,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n    \"Pressure\":{\"Value\":1014,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n    \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void MultipleMessagesNoNetworkMessageHeaderAndSubsetofDataSetMessageContent(bool useArrayEnvelope)\n        {\n            var simple = CreateMessage(0x1a, 0x62, 0x1f);\n            simple.UseArrayEnvelope = useArrayEnvelope;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n    }\n  },\n  {\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"MessageType\":\"ua-deltaframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":26,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n      \"Pressure\":{\"Value\":1014,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n      \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n    }\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void MultipleMessagesAllSwitchesSelectedAndReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1b, 0xff, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  [\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29766,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-keyframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":25},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1013},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":42},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n      }\n    },\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29767,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.556Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-deltaframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":26},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n        \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1014},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n        \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":43},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n      }\n    }\n  ]\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void MultipleMessagesWithNetworkMessageHeaderButNoDataMessageHeaderAndReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x19, 0x80, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  [\n    {\n      \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":25},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1013},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":42},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n    },\n    {\n      \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":26},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n      \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1014},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n      \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":43},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n    }\n  ]\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void MultipleMessagesAllSwitchesSelectedAndReversableFieldEncodingWithArrayEnvelope()\n        {\n            var simple = CreateMessage(0x1b, 0xff, 0x1f);\n            simple.UseArrayEnvelope = true;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    [\n      {\n        \"DataSetWriterId\":100,\n        \"SequenceNumber\":29766,\n        \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n        \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n        \"Status\":1073741824,\n        \"MessageType\":\"ua-keyframe\",\n        \"DataSetWriterName\":\"Writer100\",\n        \"Payload\":\n        {\n          \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":25},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n          \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1013},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n          \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":42},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n        }\n      }\n    ]\n  },\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    [\n      {\n        \"DataSetWriterId\":100,\n        \"SequenceNumber\":29767,\n        \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n        \"Timestamp\":\"2021-09-27T18:45:19.556Z\",\n        \"Status\":1073741824,\n        \"MessageType\":\"ua-deltaframe\",\n        \"DataSetWriterName\":\"Writer100\",\n        \"Payload\":\n        {\n          \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":26},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n          \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1014},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n          \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":43},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n        }\n      }\n    ]\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void MultipleMessagesAllSwitchesSelectedNoReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1b, 0x7f, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  [\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29766,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-keyframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n      }\n    },\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29767,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.556Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-deltaframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":26,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n        \"Pressure\":{\"Value\":1014,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n        \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n      }\n    }\n  ]\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageNoNetworkMessageHeaderAndNoDataSetMessageHeader()\n        {\n            var simple = CreateMessage(0x1c, 0x62, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            Assert.Equal(2, buffers.Count);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n  \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n  \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffers[0]));\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"Temperature\":{\"Value\":26,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n  \"Pressure\":{\"Value\":1014,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n  \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffers[1]));\n        }\n\n        [Fact]\n        public void SingleMessageNoNetworkMessageHeaderAndNoDataSetMessageHeaderWithArrayEnvelope()\n        {\n            var simple = CreateMessage(0x1c, 0x62, 0x1f);\n            simple.UseArrayEnvelope = true;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n  },\n  {\n    \"Temperature\":{\"Value\":26,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n    \"Pressure\":{\"Value\":1014,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n    \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageNoNetworkMessageHeaderAndSubsetofDataSetMessageContent()\n        {\n            var simple = CreateMessage(0x1e, 0x62, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            Assert.Equal(2, buffers.Count);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n  \"MessageType\":\"ua-keyframe\",\n  \"DataSetWriterName\":\"Writer100\",\n  \"Payload\":\n  {\n    \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffers[0]));\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n  \"MessageType\":\"ua-deltaframe\",\n  \"DataSetWriterName\":\"Writer100\",\n  \"Payload\":\n  {\n    \"Temperature\":{\"Value\":26,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n    \"Pressure\":{\"Value\":1014,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n    \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffers[1]));\n        }\n\n        [Fact]\n        public void SingleMessageNoNetworkMessageHeaderAndSubsetofDataSetMessageContentWithArrayEnvelope()\n        {\n            var simple = CreateMessage(0x1e, 0x62, 0x1f);\n            simple.UseArrayEnvelope = true;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n    }\n  },\n  {\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"MessageType\":\"ua-deltaframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":26,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n      \"Pressure\":{\"Value\":1014,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n      \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n    }\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedAndReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1f, 0xff, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            Assert.Equal(2, buffers.Count);\n            var buffer = buffers[0];\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  {\n    \"DataSetWriterId\":100,\n    \"SequenceNumber\":29766,\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n    \"Status\":1073741824,\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":25},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1013},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":42},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n    }\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageWithNetworkButNoDataSetMessageHeaderAndReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1d, 0x80, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            Assert.Equal(2, buffers.Count);\n            var buffer = buffers[0];\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  {\n    \"Temperature\":{\"Value\":{\"Type\":6,\"Body\":25},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Pressure\":{\"Value\":{\"Type\":6,\"Body\":1013},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n    \"Humidity\":{\"Value\":{\"Type\":6,\"Body\":42},\"StatusCode\":1073741824,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedNoReversableFieldEncoding()\n        {\n            var simple = CreateMessage(0x1f, 0x7f, 0x1f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            Assert.Equal(2, buffers.Count);\n            var buffer = buffers[0];\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  {\n    \"DataSetWriterId\":100,\n    \"SequenceNumber\":29766,\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n    \"Status\":1073741824,\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n      \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n    }\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedRawValueEncoding()\n        {\n            var simple = CreateMessage(0x1f, 0x7f, 0x3f);\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            Assert.Equal(2, buffers.Count);\n            var buffer = buffers[0];\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n{\n  \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n  \"MessageType\":\"ua-data\",\n  \"PublisherId\":\"MyPublisher\",\n  \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n  \"Messages\":\n  {\n    \"DataSetWriterId\":100,\n    \"SequenceNumber\":29766,\n    \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n    \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n    \"Status\":1073741824,\n    \"MessageType\":\"ua-keyframe\",\n    \"DataSetWriterName\":\"Writer100\",\n    \"Payload\":\n    {\n      \"Temperature\":25,\n      \"Pressure\":1013,\n      \"Humidity\":42\n    }\n  }\n}\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedJustStatusFieldAndArrayEnvelope()\n        {\n            var simple = CreateMessage(0x1f, 0x7f, 0x1);\n            simple.UseArrayEnvelope = true;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29766,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-keyframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":25},\n        \"Pressure\":{\"Value\":1013},\n        \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"}}\n      }\n    }\n  },\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29767,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.556Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-deltaframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":26},\n        \"Pressure\":{\"Value\":1014},\n        \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"}}\n      }\n    }\n  }\n]\n\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        [Fact]\n        public void SingleMessageAllSwitchesSelectedNoReversableFieldEncodingWithArrayEnvelope()\n        {\n            var simple = CreateMessage(0x1f, 0x7f, 0x1f);\n            simple.UseArrayEnvelope = true;\n            var buffers = simple.Encode(new ServiceMessageContext(), 4096);\n            var buffer = Assert.Single(buffers);\n            Assert.Equal(new NewtonsoftJsonSerializer().Parse(\"\"\"\n\n[\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29766,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.555Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-keyframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":25,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Pressure\":{\"Value\":1013,\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"},\n        \"Humidity\":{\"Value\":42,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.555Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.555Z\"}\n      }\n    }\n  },\n  {\n    \"MessageId\":\"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n    \"MessageType\":\"ua-data\",\n    \"PublisherId\":\"MyPublisher\",\n    \"DataSetClassId\":\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\",\n    \"Messages\":\n    {\n      \"DataSetWriterId\":100,\n      \"SequenceNumber\":29767,\n      \"MetaDataVersion\":{\"MajorVersion\":672338910,\"MinorVersion\":672341762},\n      \"Timestamp\":\"2021-09-27T18:45:19.556Z\",\n      \"Status\":1073741824,\n      \"MessageType\":\"ua-deltaframe\",\n      \"DataSetWriterName\":\"Writer100\",\n      \"Payload\":\n      {\n        \"Temperature\":{\"Value\":26,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n        \"Pressure\":{\"Value\":1014,\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"},\n        \"Humidity\":{\"Value\":43,\"StatusCode\":{\"Code\":1073741824,\"Symbol\":\"Uncertain\"},\"SourceTimestamp\":\"2021-09-27T18:45:19.556Z\",\"ServerTimestamp\":\"2021-09-27T18:45:19.556Z\"}\n      }\n    }\n  }\n]\n\"\"\"), new NewtonsoftJsonSerializer().Parse(buffer));\n        }\n\n        private static JsonNetworkMessage CreateMessage(uint messageMask, uint datasetMask, uint fieldMask)\n        {\n            return new JsonNetworkMessage\n            {\n                DataSetClassId = Guid.Parse(\"5ae1a63a-9757-4aa7-ab71-0d88931266fc\"),\n                NetworkMessageContentMask = PubSubMessageContentFlagHelper.StackToNetworkMessageContentFlags(messageMask),\n                MessageId = () => \"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n                PublisherId = \"MyPublisher\",\n                Messages = [\n                    new JsonDataSetMessage {\n                        DataSetMessageContentMask = PubSubMessageContentFlagHelper.StackToDataSetMessageContentFlags(datasetMask),\n                        DataSetWriterId = 100,\n                        SequenceNumber = 29766,\n                        MetaDataVersion = new ConfigurationVersionDataType\n                        {\n                            MajorVersion = 672338910, MinorVersion = 672341762\n                        },\n                        Timestamp = DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture),\n                        Status = 1073741824,\n                        MessageType = MessageType.KeyFrame,\n                        DataSetWriterName = \"Writer100\",\n                        Payload = new DataSet(new Dictionary<string, DataValue>\n                        {\n    [\"Temperature\"] = new DataValue(25, StatusCodes.Good,\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture)),\n    [\"Pressure\"] = new DataValue(1013, StatusCodes.Good,\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture)),\n    [\"Humidiy\"] = new DataValue(42, StatusCodes.Uncertain,\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.555Z\", CultureInfo.InvariantCulture))\n                        }, (DataSetFieldContentFlags)fieldMask)\n                    },\n                    new JsonDataSetMessage {\n                        DataSetMessageContentMask = PubSubMessageContentFlagHelper.StackToDataSetMessageContentFlags(datasetMask),\n                        DataSetWriterId = 100,\n                        SequenceNumber = 29767,\n                        MetaDataVersion = new ConfigurationVersionDataType\n                        {\n                            MajorVersion = 672338910,\n                            MinorVersion = 672341762\n                        },\n                        Timestamp = DateTime.Parse(\"2021-09-27T18:45:19.556Z\", CultureInfo.InvariantCulture),\n                        Status = 1073741824,\n                        MessageType = MessageType.DeltaFrame,\n                        DataSetWriterName = \"Writer100\",\n                        Payload = new DataSet(new Dictionary<string, DataValue>\n                        {\n    [\"Temperature\"] = new DataValue(26, StatusCodes.Good,\n        DateTime.Parse(\"2021-09-27T18:45:19.556Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.556Z\", CultureInfo.InvariantCulture)),\n    [\"Pressure\"] = new DataValue(1014, StatusCodes.Good,\n        DateTime.Parse(\"2021-09-27T18:45:19.556Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.556Z\", CultureInfo.InvariantCulture)),\n    [\"Humidiy\"] = new DataValue(43, StatusCodes.Uncertain,\n        DateTime.Parse(\"2021-09-27T18:45:19.556Z\", CultureInfo.InvariantCulture),\n        DateTime.Parse(\"2021-09-27T18:45:19.556Z\", CultureInfo.InvariantCulture))\n                        }, PubSubMessageContentFlagHelper.StackToDataSetFieldContentFlags(fieldMask))\n                    }\n                ]\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/MonitoredItemMessageEncoderDecoderTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Xunit;\n\n    /// <summary>\n    /// Monitored item json encoder decoder tests\n    /// </summary>\n    public class MonitoredItemMessageEncoderDecoderTests\n    {\n        public const NetworkMessageContentFlags NetworkMessageContentMaskDefault =\n            NetworkMessageContentFlags.PublisherId |\n            // Important: No NetworkMessageContentFlags.NetworkMessageHeader |\n            NetworkMessageContentFlags.DataSetMessageHeader |\n            NetworkMessageContentFlags.DataSetClassId;\n\n        public const DataSetMessageContentFlags DataSetMessageContentMaskDefault =\n            DataSetMessageContentFlags.MessageType |\n            DataSetMessageContentFlags.DataSetWriterId |\n            DataSetMessageContentFlags.SequenceNumber |\n            DataSetMessageContentFlags.MetaDataVersion |\n            DataSetMessageContentFlags.Timestamp |\n            DataSetMessageContentFlags.Status;\n\n        public const DataSetFieldContentFlags DataSetFieldContentFlagsDefault =\n            DataSetFieldContentFlags.ApplicationUri | // Important\n            DataSetFieldContentFlags.EndpointUrl | // Important\n            DataSetFieldContentFlags.NodeId | // Important\n            DataSetFieldContentFlags.DisplayName | // Important\n            DataSetFieldContentFlags.SourceTimestamp |\n            DataSetFieldContentFlags.ServerTimestamp |\n            DataSetFieldContentFlags.SourcePicoSeconds |\n            DataSetFieldContentFlags.ServerPicoSeconds |\n            DataSetFieldContentFlags.StatusCode;\n\n        [Theory]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 3)]\n        public void EncodeDecodeNetworkMessage(bool useArrayEnvelope, bool compress,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = ((BaseNetworkMessage)PubSubMessage\n                   .Decode(buffer, networkMessage.ContentType, context, messageSchema: networkMessage.MessageSchema)).Messages;\n            Assert.Equal(messages, result);\n        }\n\n        [Theory]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 1)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 3)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 1)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 3)]\n        public void EncodeDecodeNetworkMessageReversible(bool useArrayEnvelope, bool compress,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber,\n                    DataSetMessageContentMaskDefault | DataSetMessageContentFlags.ReversibleFieldEncoding))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000));\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = ((BaseNetworkMessage)PubSubMessage\n                   .Decode(buffer, networkMessage.ContentType, context, messageSchema: networkMessage.MessageSchema)).Messages;\n            Assert.Equal(messages, result);\n        }\n\n        [Theory]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        public void EncodeDecodeNetworkMessages(bool useArrayEnvelope, bool compress,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .Select(buffer => (BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: networkMessage.MessageSchema))\n                .SelectMany(m => m.Messages).ToList();\n            Assert.Equal(messages, result);\n        }\n\n        [Theory]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, false, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, false, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 10, 256 * 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 15, 256 * 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 256 * 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(false, true, false, NetworkMessageContentMaskDefault, 10, 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(false, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault, 15, 1024)]\n        [InlineData(true, true, true, NetworkMessageContentMaskDefault | NetworkMessageContentFlags.SingleDataSetMessage, 5, 1024)]\n        public void EncodeDecodeNetworkMessagesReversible(bool useArrayEnvelope, bool compress,\n            bool useCompatibilityMode, NetworkMessageContentFlags contentMask, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(useCompatibilityMode, sequenceNumber,\n                    DataSetMessageContentMaskDefault | DataSetMessageContentFlags.ReversibleFieldEncoding))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(contentMask, messages);\n            networkMessage.UseGzipCompression = compress;\n            networkMessage.UseArrayEnvelope = useArrayEnvelope;\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = buffers\n                .Select(buffer => (BaseNetworkMessage)PubSubMessage\n                    .Decode(buffer, networkMessage.ContentType, context, messageSchema: networkMessage.MessageSchema))\n                .SelectMany(m => m.Messages).ToList();\n            Assert.Equal(messages, result);\n        }\n\n        /// <summary>\n        /// Convert timestamps of payload to OpcUa Utc.\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        private static void ConvertToOpcUaUniversalTime(BaseNetworkMessage networkMessage)\n        {\n            // convert DataSet Payload DataValue timestamps to OpcUa Utc\n            foreach (var dataSetMessage in networkMessage.Messages)\n            {\n                var expectedPayload = new Dictionary<string, DataValue>();\n                foreach (var (Name, Value) in dataSetMessage.Payload.DataSetFields)\n                {\n                    expectedPayload[Name] = new DataValue(Value).ToOpcUaUniversalTime();\n                }\n                dataSetMessage.Payload = new DataSet(expectedPayload,\n                    DataSetFieldContentFlags.ApplicationUri | // Important\n                    DataSetFieldContentFlags.EndpointUrl | // Important\n                    DataSetFieldContentFlags.NodeId | // Important\n                    DataSetFieldContentFlags.DisplayName | // Important\n                    DataSetFieldContentFlags.StatusCode |\n                    DataSetFieldContentFlags.SourceTimestamp);\n            }\n        }\n\n        /// <summary>\n        /// Create network message\n        /// </summary>\n        /// <param name=\"contentMask\"></param>\n        /// <param name=\"messages\"></param>\n        private static JsonNetworkMessage CreateNetworkMessage(\n            NetworkMessageContentFlags contentMask, List<BaseDataSetMessage> messages)\n        {\n            return new JsonNetworkMessage\n            {\n                MessageId = () => \"9279C0B3-DA88-45A4-AF74-451CEBF82DB0\",\n                Messages = messages,\n                DataSetWriterGroup = \"group\",\n                DataSetClassId = Guid.NewGuid(),\n                PublisherId = \"PublisherId\",\n                NetworkMessageContentMask = contentMask\n            };\n        }\n\n        /// <summary>\n        /// Create dataset message\n        /// </summary>\n        /// <param name=\"useCompatibilityMode\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"dataSetMessageContentMask\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static MonitoredItemMessage CreateDataSetMessage(bool useCompatibilityMode, int sequenceNumber,\n            DataSetMessageContentFlags dataSetMessageContentMask = DataSetMessageContentMaskDefault,\n            DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new MonitoredItemMessage\n            {\n                EndpointUrl = \"EndpointUrl\",\n                ApplicationUri = \"ApplicationUrl\",\n                NodeId = \"NodeId\",\n                SequenceNumber = (ushort)sequenceNumber,\n                UseCompatibilityMode = useCompatibilityMode,\n                Status = StatusCodes.Bad,\n                Timestamp = DateTimeOffset.UtcNow,\n                Payload = CreateDataSet(dataSetFieldContentMask),\n                DataSetMessageContentMask = dataSetMessageContentMask\n            };\n        }\n\n        /// <summary>\n        /// Create dataset\n        /// </summary>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static DataSet CreateDataSet(DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new DataSet(new Dictionary<string, DataValue>\n            {\n                { \"1\", new DataValue(new Variant(\"test\"), StatusCodes.Good, DateTime.Now, DateTime.UtcNow) }\n            }, dataSetFieldContentMask);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/PubSubMessageContentFlagHelper.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n\n    /// <summary>\n    /// Stack types conversions\n    /// </summary>\n    internal static class PubSubMessageContentFlagHelper\n    {\n        /// <summary>\n        /// Get network message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <returns></returns>\n        public static NetworkMessageContentFlags StackToNetworkMessageContentFlags(uint mask)\n        {\n            NetworkMessageContentFlags result = 0u;\n            if ((mask & (uint)JsonNetworkMessageContentMask.PublisherId) != 0)\n            {\n                result |= NetworkMessageContentFlags.PublisherId;\n            }\n            if ((mask & (uint)JsonNetworkMessageContentMask.DataSetClassId) != 0)\n            {\n                result |= NetworkMessageContentFlags.DataSetClassId;\n            }\n            if ((mask & (uint)JsonNetworkMessageContentMask.ReplyTo) != 0)\n            {\n                result |= NetworkMessageContentFlags.ReplyTo;\n            }\n            if ((mask & (uint)JsonNetworkMessageContentMask.NetworkMessageHeader) != 0)\n            {\n                result |= NetworkMessageContentFlags.NetworkMessageHeader;\n            }\n            else\n            {\n                // If not set, bits 3, 4 and 5 can also not be set\n                result = 0;\n            }\n            if ((mask & 0x8000000) != 0)\n            {\n                // If monitored item message, then no network message header\n                result = 0;\n            }\n            if ((mask & (uint)JsonNetworkMessageContentMask.DataSetMessageHeader) != 0)\n            {\n                result |= NetworkMessageContentFlags.DataSetMessageHeader;\n            }\n            if ((mask & (uint)JsonNetworkMessageContentMask.SingleDataSetMessage) != 0)\n            {\n                result |= NetworkMessageContentFlags.SingleDataSetMessage;\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Get dataset message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <returns></returns>\n        public static DataSetMessageContentFlags StackToDataSetMessageContentFlags(uint mask)\n        {\n            DataSetMessageContentFlags result = 0u;\n            if ((mask & (uint)JsonDataSetMessageContentMask.Timestamp) != 0)\n            {\n                result |= DataSetMessageContentFlags.Timestamp;\n            }\n            if ((mask & (uint)JsonDataSetMessageContentMask.Status) != 0)\n            {\n                result |= DataSetMessageContentFlags.Status;\n            }\n            if ((mask & (uint)JsonDataSetMessageContentMask.MetaDataVersion) != 0)\n            {\n                result |= DataSetMessageContentFlags.MetaDataVersion;\n            }\n            if ((mask & (uint)JsonDataSetMessageContentMask.SequenceNumber) != 0)\n            {\n                result |= DataSetMessageContentFlags.SequenceNumber;\n            }\n            if ((mask & (uint)JsonDataSetMessageContentMask.DataSetWriterId) != 0)\n            {\n                result |= DataSetMessageContentFlags.DataSetWriterId;\n            }\n            if ((mask & (uint)JsonDataSetMessageContentMask.MessageType) != 0)\n            {\n                result |= DataSetMessageContentFlags.MessageType;\n            }\n            if ((mask & (uint)JsonDataSetMessageContentMask.DataSetWriterName) != 0)\n            {\n                result |= DataSetMessageContentFlags.DataSetWriterName;\n            }\n            if ((mask & (uint)JsonDataSetMessageContentMask.FieldEncoding1) != 0)\n            {\n                result |= DataSetMessageContentFlags.ReversibleFieldEncoding;\n            }\n\n            //     if (fieldMask != null)\n            //     {\n            //         if ((fieldMask & DataSetFieldContentFlags.NodeId) != 0)\n            //         {\n            //             result |= JsonDataSetMessageContentMaskEx.NodeId;\n            //         }\n            //         if ((fieldMask & DataSetFieldContentFlags.DisplayName) != 0)\n            //         {\n            //             result |= JsonDataSetMessageContentMaskEx.DisplayName;\n            //         }\n            //         if ((fieldMask & DataSetFieldContentFlags.ExtensionFields) != 0)\n            //         {\n            //             result |= JsonDataSetMessageContentMaskEx.ExtensionFields;\n            //         }\n            //         if ((fieldMask & DataSetFieldContentFlags.EndpointUrl) != 0)\n            //         {\n            //             result |= JsonDataSetMessageContentMaskEx.EndpointUrl;\n            //         }\n            //         if ((fieldMask & DataSetFieldContentFlags.ApplicationUri) != 0)\n            //         {\n            //             result |= JsonDataSetMessageContentMaskEx.ApplicationUri;\n            //         }\n            //     }\n            return result;\n        }\n\n        /// <summary>\n        /// Get dataset message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <returns></returns>\n        public static DataSetFieldContentFlags StackToDataSetFieldContentFlags(uint mask)\n        {\n            DataSetFieldContentFlags result = 0;\n            if ((mask & (uint)DataSetFieldContentMask.StatusCode) != 0)\n            {\n                result |= DataSetFieldContentFlags.StatusCode;\n            }\n            if ((mask & (uint)DataSetFieldContentMask.SourceTimestamp) != 0)\n            {\n                result |= DataSetFieldContentFlags.SourceTimestamp;\n            }\n            if ((mask & (uint)DataSetFieldContentMask.ServerTimestamp) != 0)\n            {\n                result |= DataSetFieldContentFlags.ServerTimestamp;\n            }\n            if ((mask & (uint)DataSetFieldContentMask.SourcePicoSeconds) != 0)\n            {\n                result |= DataSetFieldContentFlags.SourcePicoSeconds;\n            }\n            if ((mask & (uint)DataSetFieldContentMask.ServerPicoSeconds) != 0)\n            {\n                result |= DataSetFieldContentFlags.ServerPicoSeconds;\n            }\n            if ((mask & (uint)DataSetFieldContentMask.RawData) != 0)\n            {\n                result |= DataSetFieldContentFlags.RawData;\n            }\n            if ((mask & 64) != 0)\n            {\n                result |= DataSetFieldContentFlags.SingleFieldDegradeToValue;\n            }\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/PubSub/UadpNetworkMessageEncoderDecoderTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.PubSub\n{\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Xunit;\n\n    /// <summary>\n    /// Uadp encoder decoder tests\n    /// </summary>\n    public class UadpNetworkMessageEncoderDecoderTests : IDataSetMetaDataResolver\n    {\n        /// <summary>\n        /// All\n        /// </summary>\n        public const NetworkMessageContentFlags NetworkMessageContentMaskDefault =\n            NetworkMessageContentFlags.PublisherId |\n            NetworkMessageContentFlags.GroupHeader |\n            NetworkMessageContentFlags.WriterGroupId |\n            NetworkMessageContentFlags.GroupVersion |\n            NetworkMessageContentFlags.NetworkMessageNumber |\n            NetworkMessageContentFlags.SequenceNumber |\n            NetworkMessageContentFlags.PayloadHeader |\n            NetworkMessageContentFlags.Timestamp |\n            NetworkMessageContentFlags.Picoseconds |\n            NetworkMessageContentFlags.DataSetClassId |\n            NetworkMessageContentFlags.PromotedFields;\n\n        public const DataSetMessageContentFlags DataSetMessageContentMaskDefault =\n            DataSetMessageContentFlags.PicoSeconds |\n            DataSetMessageContentFlags.SequenceNumber |\n            DataSetMessageContentFlags.MajorVersion |\n            DataSetMessageContentFlags.MinorVersion |\n            DataSetMessageContentFlags.Timestamp |\n            DataSetMessageContentFlags.Status;\n\n        public const DataSetFieldContentFlags DataSetFieldContentFlagsDefault =\n            DataSetFieldContentFlags.SourceTimestamp |\n            DataSetFieldContentFlags.ServerTimestamp |\n            DataSetFieldContentFlags.SourcePicoSeconds |\n            DataSetFieldContentFlags.ServerPicoSeconds |\n            DataSetFieldContentFlags.StatusCode;\n\n        [Theory]\n        [InlineData(MessageType.KeyFrame, 1)]\n        [InlineData(MessageType.KeyFrame, 3)]\n        [InlineData(MessageType.KeyFrame, 10)]\n        [InlineData(MessageType.Event, 1)]\n        [InlineData(MessageType.Event, 3)]\n        [InlineData(MessageType.Event, 10)]\n        [InlineData(MessageType.DeltaFrame, 1)]\n        [InlineData(MessageType.DeltaFrame, 3)]\n        [InlineData(MessageType.DeltaFrame, 10)]\n        public void EncodeDecodeNetworkMessage(MessageType type, int numberOfMessages)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(type, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(NetworkMessageContentMaskDefault, messages);\n\n            var context = new ServiceMessageContext();\n            var buffer = Assert.Single(networkMessage.Encode(context, 256 * 1000, this));\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var result = PubSubMessage.Decode(buffer, networkMessage.ContentType, context, this);\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(MessageType.KeyFrame, 8, 100)]\n        [InlineData(MessageType.KeyFrame, 10, 100)]\n        [InlineData(MessageType.KeyFrame, 100, 100)]\n        [InlineData(MessageType.KeyFrame, 1000, 100)]\n        [InlineData(MessageType.KeyFrame, 194, 100)]\n        [InlineData(MessageType.KeyFrame, 8, 1024)]\n        [InlineData(MessageType.KeyFrame, 10, 1024)]\n        [InlineData(MessageType.KeyFrame, 100, 1024)]\n        [InlineData(MessageType.KeyFrame, 1000, 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 1024)]\n        [InlineData(MessageType.KeyFrame, 8, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 10, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 100, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 1000, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.Event, 1, 100)]\n        [InlineData(MessageType.Event, 5, 100)]\n        [InlineData(MessageType.Event, 194, 100)]\n        [InlineData(MessageType.Event, 1, 1024)]\n        [InlineData(MessageType.Event, 5, 1024)]\n        [InlineData(MessageType.Event, 194, 1024)]\n        [InlineData(MessageType.Event, 1, 256 * 1024)]\n        [InlineData(MessageType.Event, 5, 256 * 1024)]\n        [InlineData(MessageType.Event, 194, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 100)]\n        [InlineData(MessageType.DeltaFrame, 5, 100)]\n        [InlineData(MessageType.DeltaFrame, 194, 100)]\n        [InlineData(MessageType.DeltaFrame, 1, 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 256 * 1024)]\n        public void EncodeDecodeNetworkMessages(MessageType type, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(type, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(NetworkMessageContentMaskDefault, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize, this);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var decodedMessages = PubSubMessage\n                .Decode(CreateReader(buffers), networkMessage.ContentType, context, this)\n                .OfType<UadpNetworkMessage>()\n                .ToList();\n            var result = decodedMessages[0];\n            result.Messages = decodedMessages.SelectMany(m => m.Messages).ToList();\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(MessageType.KeyFrame, 1, 100)]\n        [InlineData(MessageType.KeyFrame, 5, 100)]\n        [InlineData(MessageType.KeyFrame, 194, 100)]\n        [InlineData(MessageType.KeyFrame, 1, 1024)]\n        [InlineData(MessageType.KeyFrame, 5, 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 1024)]\n        [InlineData(MessageType.KeyFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 100)]\n        [InlineData(MessageType.DeltaFrame, 5, 100)]\n        [InlineData(MessageType.DeltaFrame, 194, 100)]\n        [InlineData(MessageType.DeltaFrame, 1, 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.Event, 1, 100)]\n        [InlineData(MessageType.Event, 194, 100)]\n        [InlineData(MessageType.Event, 1, 1024)]\n        [InlineData(MessageType.Event, 194, 1024)]\n        [InlineData(MessageType.Event, 194, 256 * 1024)]\n        public void EncodeDecodeNetworkMessagesNoGroupHeader(MessageType type, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(type, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(\n                NetworkMessageContentMaskDefault & ~NetworkMessageContentFlags.GroupHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize, this);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var m = PubSubMessage\n                .Decode(CreateReader(buffers), networkMessage.ContentType, context, this)\n                .OfType<UadpNetworkMessage>()\n                .ToList();\n            var result = m[0];\n            result.Messages = m.SelectMany(m => m.Messages).ToList();\n            Assert.Equal(networkMessage, result);\n        }\n\n        [Theory]\n        [InlineData(MessageType.KeyFrame, 1, 100)]\n        [InlineData(MessageType.KeyFrame, 5, 100)]\n        [InlineData(MessageType.KeyFrame, 194, 100)]\n        [InlineData(MessageType.KeyFrame, 1, 1024)]\n        [InlineData(MessageType.KeyFrame, 5, 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 1024)]\n        [InlineData(MessageType.KeyFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 100)]\n        [InlineData(MessageType.DeltaFrame, 5, 100)]\n        [InlineData(MessageType.DeltaFrame, 194, 100)]\n        [InlineData(MessageType.DeltaFrame, 1, 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.Event, 1, 100)]\n        [InlineData(MessageType.Event, 194, 100)]\n        [InlineData(MessageType.Event, 1, 1024)]\n        [InlineData(MessageType.Event, 194, 1024)]\n        [InlineData(MessageType.Event, 194, 256 * 1024)]\n        public void EncodeDecodeNetworkMessagesNoPayloadHeader(MessageType type, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(type, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(\n                NetworkMessageContentMaskDefault & ~NetworkMessageContentFlags.PayloadHeader, messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize, this);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n            var m = PubSubMessage\n                .Decode(CreateReader(buffers), networkMessage.ContentType, context, this)\n                .OfType<UadpNetworkMessage>()\n                .ToList();\n            var result = m.SelectMany(m => m.Messages).Select(m => m.Payload).ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(MessageType.KeyFrame, 1, 100)]\n        [InlineData(MessageType.KeyFrame, 5, 100)]\n        [InlineData(MessageType.KeyFrame, 194, 100)]\n        [InlineData(MessageType.KeyFrame, 1, 1024)]\n        [InlineData(MessageType.KeyFrame, 5, 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 1024)]\n        [InlineData(MessageType.KeyFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 100)]\n        [InlineData(MessageType.DeltaFrame, 5, 100)]\n        [InlineData(MessageType.DeltaFrame, 194, 100)]\n        [InlineData(MessageType.DeltaFrame, 1, 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.Event, 1, 100)]\n        [InlineData(MessageType.Event, 194, 100)]\n        [InlineData(MessageType.Event, 1, 1024)]\n        [InlineData(MessageType.Event, 194, 1024)]\n        [InlineData(MessageType.Event, 194, 256 * 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeaders(MessageType type, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(type, sequenceNumber))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(NetworkMessageContentMaskDefault\n                & ~(NetworkMessageContentFlags.GroupHeader | NetworkMessageContentFlags.PayloadHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize, this);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            var m = PubSubMessage\n                .Decode(CreateReader(buffers), networkMessage.ContentType, context, this)\n                .OfType<UadpNetworkMessage>()\n                .ToList();\n            var result = m.SelectMany(m => m.Messages).Select(m => m.Payload).ToList();\n            Assert.All(networkMessage.Messages.Select(m => m.Payload), (p, i) => Assert.True(result[i].Equals(p)));\n        }\n\n        [Theory]\n        [InlineData(MessageType.KeyFrame, 1, 100)]\n        [InlineData(MessageType.KeyFrame, 5, 100)]\n        [InlineData(MessageType.KeyFrame, 194, 100)]\n        [InlineData(MessageType.KeyFrame, 1, 1024)]\n        [InlineData(MessageType.KeyFrame, 5, 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 1024)]\n        [InlineData(MessageType.KeyFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.KeyFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 100)]\n        [InlineData(MessageType.DeltaFrame, 5, 100)]\n        [InlineData(MessageType.DeltaFrame, 194, 100)]\n        [InlineData(MessageType.DeltaFrame, 1, 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 1024)]\n        [InlineData(MessageType.DeltaFrame, 1, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 5, 256 * 1024)]\n        [InlineData(MessageType.DeltaFrame, 194, 256 * 1024)]\n        [InlineData(MessageType.Event, 1, 100)]\n        [InlineData(MessageType.Event, 194, 100)]\n        [InlineData(MessageType.Event, 1, 1024)]\n        [InlineData(MessageType.Event, 194, 1024)]\n        [InlineData(MessageType.Event, 194, 256 * 1024)]\n        public void EncodeDecodeNetworkMessagesNoHeaderRaw(MessageType type, int numberOfMessages, int maxMessageSize)\n        {\n            var messages = Enumerable\n                .Range(3, numberOfMessages)\n                .Select(sequenceNumber => (BaseDataSetMessage)CreateDataSetMessage(type, sequenceNumber,\n                    dataSetFieldContentMask: DataSetFieldContentFlags.RawData))\n                .ToList();\n            var networkMessage = CreateNetworkMessage(NetworkMessageContentMaskDefault\n                & ~(NetworkMessageContentFlags.GroupHeader | NetworkMessageContentFlags.PayloadHeader), messages);\n\n            var context = new ServiceMessageContext();\n            var buffers = networkMessage.Encode(context, maxMessageSize, this);\n\n            ConvertToOpcUaUniversalTime(networkMessage);\n\n            // Compare payload as raw data equivalent\n            var serializer = new NewtonsoftJsonSerializer();\n\n            var decodedMessages = PubSubMessage\n                .Decode(CreateReader(buffers), networkMessage.ContentType, context, this)\n                .OfType<UadpNetworkMessage>()\n                .SelectMany(m => m.Messages)\n                .ToList();\n\n            var result = serializer.Parse(serializer.SerializeToString(decodedMessages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value.Value))\n                .ToList()));\n            var expected = serializer.Parse(serializer.SerializeToString(messages\n                .SelectMany(m => m.Payload.DataSetFields)\n                .Select(v => (v.Name, v.Value.Value))\n                .ToList()));\n\n            Assert.Equal(expected, result);\n        }\n\n        /// <summary>\n        /// Convert timestamps of payload to OpcUa Utc.\n        /// </summary>\n        /// <param name=\"networkMessage\"></param>\n        private static void ConvertToOpcUaUniversalTime(BaseNetworkMessage networkMessage)\n        {\n            // convert DataSet Payload DataValue timestamps to OpcUa Utc\n            foreach (var dataSetMessage in networkMessage.Messages)\n            {\n                var expectedPayload = new Dictionary<string, DataValue>();\n                foreach (var (Name, Value) in dataSetMessage.Payload.DataSetFields)\n                {\n                    expectedPayload[Name] = new DataValue(Value).ToOpcUaUniversalTime();\n                }\n                dataSetMessage.Payload = new DataSet(expectedPayload,\n                    DataSetFieldContentFlags.StatusCode |\n                    DataSetFieldContentFlags.SourceTimestamp);\n            }\n        }\n\n        /// <summary>\n        /// Create network message\n        /// </summary>\n        /// <param name=\"contentMask\"></param>\n        /// <param name=\"messages\"></param>\n        private UadpNetworkMessage CreateNetworkMessage(\n            NetworkMessageContentFlags contentMask, List<BaseDataSetMessage> messages)\n        {\n            return new UadpNetworkMessage\n            {\n                Messages = messages,\n                WriterGroupId = 4,\n                Timestamp = DateTimeOffset.UtcNow,\n                PicoSeconds = 65,\n                SequenceNumber = () => _lastSequenceNumber++,\n                DataSetClassId = Guid.NewGuid(),\n                PublisherId = \"PublisherId\",\n                NetworkMessageContentMask = contentMask\n            };\n        }\n        private ushort _lastSequenceNumber;\n\n        /// <summary>\n        /// Create dataset message\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"dataSetMessageContentMask\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static UadpDataSetMessage CreateDataSetMessage(MessageType type, int sequenceNumber,\n            DataSetMessageContentFlags dataSetMessageContentMask = DataSetMessageContentMaskDefault,\n            DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return new UadpDataSetMessage\n            {\n                DataSetWriterId = 3,\n                MetaDataVersion = new ConfigurationVersionDataType { MajorVersion = 1, MinorVersion = 1 },\n                SequenceNumber = (ushort)sequenceNumber,\n                Status = StatusCodes.Bad,\n                Timestamp = DateTimeOffset.UtcNow,\n                MessageType = type,\n                Picoseconds = 1,\n                Payload = CreateDataSet(type == MessageType.DeltaFrame, dataSetFieldContentMask),\n                DataSetMessageContentMask = dataSetMessageContentMask\n            };\n        }\n\n        public PublishedDataSetMetaDataModel Find(ushort writerId, uint majorVersion = 0, uint minorVersion = 0)\n        {\n            // Return independent on whether we receive valid writer id or major minor versions\n            // In raw mode without payload headers there is no way to decode key frames without\n            // preconfigured writer id and versioning, so we assume we have it by some means\n            return new PublishedDataSetMetaDataModel\n            {\n                DataSetMetaData = new DataSetMetaDataModel(),\n                Fields = new[] {\n                    new PublishedFieldMetaDataModel { Name = \"1\", BuiltInType = (byte)BuiltInType.Int32, ValueRank = ValueRanks.Scalar },\n                    new PublishedFieldMetaDataModel { Name = \"2\", BuiltInType = (byte)BuiltInType.Float, ValueRank = ValueRanks.Scalar },\n                    new PublishedFieldMetaDataModel { Name = \"3\", BuiltInType = (byte)BuiltInType.String, ValueRank = ValueRanks.Scalar }\n                }\n            };\n        }\n\n        /// <summary>\n        /// Create dataset\n        /// </summary>\n        /// <param name=\"deltaFrame\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private static DataSet CreateDataSet(bool deltaFrame,\n            DataSetFieldContentFlags dataSetFieldContentMask = DataSetFieldContentFlagsDefault)\n        {\n            return !deltaFrame ? new DataSet(new Dictionary<string, DataValue>\n            {\n                { \"1\", new DataValue(new Variant(5), StatusCodes.Good, DateTime.Now, DateTime.UtcNow) },\n                { \"2\", new DataValue(new Variant(0.5), StatusCodes.Good, DateTime.Now) },\n                { \"3\", new DataValue(\"abcd\") }\n            }, dataSetFieldContentMask) : new DataSet(new Dictionary<string, DataValue>\n            {\n                { \"3\", new DataValue(\"abcd\") }\n            }, dataSetFieldContentMask);\n        }\n\n        private static Queue<ReadOnlySequence<byte>> CreateReader(IReadOnlyList<ReadOnlySequence<byte>> buffers)\n        {\n            var reader = new Queue<ReadOnlySequence<byte>>();\n            foreach (var buffer in buffers)\n            {\n                reader.Enqueue(buffer);\n            }\n            return reader;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/SchemaUtilsTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    using System.Linq;\n    using Xunit;\n\n    public class SchemaUtilsTests\n    {\n        [Theory]\n        [InlineData(\"Test\")]\n        [InlineData(\"\")]\n        [InlineData(\"Test.Test\")]\n        [InlineData(\"Test.Test.Test\")]\n        [InlineData(\"%§$%&/()=?\")]\n        [InlineData(\"           \")]\n        [InlineData(\"     sd     \")]\n        [InlineData(\"a ac d\")]\n        [InlineData(\"a/b/c/d\")]\n        [InlineData(\"§$§§\\\"\\\"§\")]\n        [InlineData(\"黄色) 黄色] 桃子{ 黑色 狗[ 紫色 桃子] 狗 红色 葡萄% 桃子? 猫 猴子 绵羊\")]\n        [InlineData(\"蓝色 紫色 蓝色 红色$\")]\n        [InlineData(\"_x84_\")]\n        [InlineData(\"_x8432\")]\n        [InlineData(\"x8$x8\")]\n        public void TestEscapeUnespace(string value)\n        {\n            var escaped = SchemaUtils.Escape(value);\n            Assert.True(escaped.All(c => c.Equals('_') || char.IsLetterOrDigit(c)));\n\n            var unsescaped = SchemaUtils.Unescape(escaped);\n            Assert.Equal(value, unsescaped);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroNetworkMessageAvroSchemaTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.IO;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class AvroNetworkMessageAvroSchemaTests\n    {\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateAvroNetworkMessageSchemasAsync(string messageMetaDataFile)\n        {\n            var message = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            var schema = new AvroNetworkMessage(message);\n\n            var json = schema.ToString();\n            var document = JsonDocument.Parse(json);\n            json = JsonSerializer.Serialize(document, kIndented);\n            Assert.NotNull(json);\n            await AssertAsync(\"NetworkMessageDefault\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateAvroNetworkMessageWithNsAsync(string messageMetaDataFile)\n        {\n            var message = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            var schema = new AvroNetworkMessage(message, new SchemaOptions\n            {\n                Namespace = \"http://www.microsoft.com\"\n            });\n\n            var json = schema.ToString();\n            await AssertAsync(\"NetworkMessage\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateMessageSchemaWithoutNetworkHeaderAsync(string messageMetaDataFile)\n        {\n            var message = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            message = message with\n            {\n                NetworkMessageContentFlags =\n                    NetworkMessageContentFlags.DataSetMessageHeader\n            };\n\n            var schema = new AvroNetworkMessage(message);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Multiple\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSingleMessageSchemaAsync(string messageMetaDataFile)\n        {\n            var message = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            message = message with\n            {\n                NetworkMessageContentFlags =\n                    NetworkMessageContentFlags.DataSetMessageHeader\n                    | NetworkMessageContentFlags.SingleDataSetMessage\n            };\n\n            var schema = new AvroNetworkMessage(message);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Single\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSingleMessageSchemaWithoutHeaderAsync(string messageMetaDataFile)\n        {\n            var message = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            message = message with\n            {\n                NetworkMessageContentFlags =\n                        NetworkMessageContentFlags.SingleDataSetMessage\n            };\n\n            var schema = new AvroNetworkMessage(message);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Default\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateRawMessageSchemaAsync(string messageMetaDataFile)\n        {\n            var message = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            message = message with\n            {\n                NetworkMessageContentFlags =\n                    NetworkMessageContentFlags.SingleDataSetMessage,\n                DataSetMessages = message.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags = 0u,\n                    DataSetFieldContentFlags = DataSetFieldContentFlags.RawData\n                }).ToList()\n            };\n\n            var schema = new AvroNetworkMessage(message);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Raw\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateRawMessageSchemaReversibleAsync(string messageMetaDataFile)\n        {\n            var message = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            message = message with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.SingleDataSetMessage,\n                DataSetMessages = message.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags = DataSetMessageContentFlags.ReversibleFieldEncoding,\n                    DataSetFieldContentFlags = 0u\n\n                }).ToList()\n            };\n\n            var schema = new AvroNetworkMessage(message);\n\n            var json = schema.ToString();\n            await AssertAsync(\"RawReversible\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        private static async ValueTask<T> LoadAsync<T>(string file)\n        {\n            await using var fs = new FileStream(file, FileMode.Open,\n                FileAccess.Read, FileShare.Read);\n            return await JsonSerializer.DeserializeAsync<T>(fs);\n        }\n\n        private static readonly JsonSerializerOptions kIndented = new()\n        {\n            WriteIndented = true\n        };\n\n        private static async Task AssertAsync(string name, string messageMetaDataFile, string json)\n        {\n            var document = JsonDocument.Parse(json);\n            json = JsonSerializer.Serialize(document, kIndented).ReplaceLineEndings();\n            Assert.NotNull(json);\n#if WRITE\n            var folder = Path.Combine(\".\", \"AvroSchema\", name);\n            if (!Directory.Exists(folder))\n            {\n                Directory.CreateDirectory(folder);\n            }\n            await File.WriteAllTextAsync(Path.Combine(folder, Path.GetFileName(messageMetaDataFile)), json);\n#else\n            var folder = Path.Combine(\".\", \"Encoders\", \"Schemas\", \"AvroSchema\", name);\n            var expected = await File.ReadAllTextAsync(Path.Combine(folder, Path.GetFileName(messageMetaDataFile)));\n            Assert.Equal(expected.ReplaceLineEndings(), json);\n#endif\n        }\n\n        public static TheoryData<string> GetMessageMetaDataFiles()\n        {\n            var resources = Directory.GetFiles(Path.Combine(\".\", \"Resources\"), \"*.json\");\n            return new TheoryData<string>(resources);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Default/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTimeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"DateTime\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_13\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt32DataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"UInt32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_7\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"BooleanDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Boolean\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_1\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Int32DataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Int32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_6\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DoubleDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Double\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_11\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"double\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DataValue\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Variant\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_24\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"Boolean\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByte\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_2\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Byte\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_3\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_4\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      \"UInt16\",\n                      \"Int32\",\n                      \"UInt32\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_8\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_23\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"int\",\n                              {\n                                \"type\": \"fixed\",\n                                \"name\": \"ulong\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"size\": 8\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Float\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_10\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"float\"\n                          }\n                        ]\n                      },\n                      \"Double\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"DateTime\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Guid\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_14\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"string\",\n                              \"logicalType\": \"uuid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteString\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_15\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"bytes\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElement\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_16\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_17\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_18\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          },\n                          {\n                            \"name\": \"ServerUri\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      \"StatusCode\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedName\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_20\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Name\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedText\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_21\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Locale\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Text\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObject\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_22\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"EncodedDataType\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"TypeId\",\n                                    \"type\": \"NodeId\"\n                                  },\n                                  {\n                                    \"name\": \"Body\",\n                                    \"type\": \"ByteString\"\n                                  }\n                                ]\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      \"DataValue\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Enumeration\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_29\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Boolean\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByteCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"SByte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Float\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Double\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"String\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DateTime\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"GuidCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Guid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ByteString\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElementCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"XmlElement\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExpandedNodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCodeCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"StatusCode\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedNameCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"QualifiedName\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObjectCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExtensionObject\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValueCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DataValue\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Variant\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EnumerationCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Enumeration\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Boolean\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByteMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"SByte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Byte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Float\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Double\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"String\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DateTime\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"GuidMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Guid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ByteString\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElementMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"XmlElement\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeIdMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExpandedNodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCodeMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"StatusCode\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedNameMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"QualifiedName\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObjectMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExtensionObject\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValueMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DataValue\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Variant\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EnumerationMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Enumeration\"\n                            }\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"UInt16\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Default/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"State\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ServerStateDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"enum\",\n                  \"name\": \"ServerState\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_x95_852\"\n                  ],\n                  \"symbols\": [\n                    \"Running\",\n                    \"Failed\",\n                    \"NoConfiguration\",\n                    \"Suspended\",\n                    \"Shutdown\",\n                    \"Test\",\n                    \"CommunicationFault\",\n                    \"Unknown\"\n                  ],\n                  \"default\": \"Running\",\n                  \"uaDataTypeId\": \"i=852\"\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Default/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"CurrentTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTimeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"DateTime\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_13\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EngineeringUnits\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"StringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"String\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_12\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"AssetId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DataValue\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Variant\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_24\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Boolean\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_1\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByte\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_2\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Byte\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_3\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_4\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      \"UInt16\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_6\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_7\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_8\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_23\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"int\",\n                              {\n                                \"type\": \"fixed\",\n                                \"name\": \"ulong\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"size\": 8\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Float\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_10\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"float\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Double\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_11\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"double\"\n                          }\n                        ]\n                      },\n                      \"String\",\n                      \"DateTime\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Guid\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_14\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"string\",\n                              \"logicalType\": \"uuid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteString\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_15\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"bytes\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElement\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_16\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_17\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_18\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          },\n                          {\n                            \"name\": \"ServerUri\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      \"StatusCode\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedName\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_20\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Name\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedText\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_21\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Locale\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Text\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObject\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_22\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"EncodedDataType\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"TypeId\",\n                                    \"type\": \"NodeId\"\n                                  },\n                                  {\n                                    \"name\": \"Body\",\n                                    \"type\": \"ByteString\"\n                                  }\n                                ]\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      \"DataValue\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Enumeration\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_29\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Boolean\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByteCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"SByte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Float\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Double\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"String\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DateTime\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"GuidCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Guid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ByteString\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElementCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"XmlElement\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExpandedNodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCodeCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"StatusCode\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedNameCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"QualifiedName\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObjectCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExtensionObject\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValueCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DataValue\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Variant\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EnumerationCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Enumeration\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Boolean\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByteMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"SByte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Byte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Float\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Double\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"String\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DateTime\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"GuidMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Guid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ByteString\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElementMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"XmlElement\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeIdMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExpandedNodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCodeMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"StatusCode\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedNameMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"QualifiedName\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObjectMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExtensionObject\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValueMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DataValue\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Variant\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EnumerationMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Enumeration\"\n                            }\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Important\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"BooleanDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.Boolean\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Variance\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"FloatDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.Float\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Default/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"NodeId\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_17\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Namespace\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"Identifier\",\n                      \"type\": [\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"UInt32\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_7\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"int\"\n                            }\n                          ]\n                        },\n                        \"String\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"Guid\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_14\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": {\n                                \"type\": \"string\",\n                                \"logicalType\": \"uuid\"\n                              }\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"ByteString\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_15\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"bytes\"\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedText\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_21\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Locale\",\n                      \"type\": \"String\"\n                    },\n                    {\n                      \"name\": \"Text\",\n                      \"type\": \"String\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdCollectionDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"NodeIdCollection\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": {\n                        \"type\": \"array\",\n                        \"items\": \"NodeId\"\n                      }\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextCollectionDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedTextCollection\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": {\n                        \"type\": \"array\",\n                        \"items\": \"LocalizedText\"\n                      }\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ByteStringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.ByteString\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataTypeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"TimeZoneDataType\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_x95_8912\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Offset\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Int16\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_4\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"DaylightSavingInOffset\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Boolean\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_1\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          }\n                        ]\n                      }\n                    }\n                  ],\n                  \"uaDataTypeId\": \"i=8912\"\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.LocalizedTextDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTimeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.DateTime\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt16DataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.UInt16\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"StringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.String\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.DateTimeDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Default/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"UInt32DataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"UInt32\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_7\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"int\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_19\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"DateTime\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_13\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"UInt16\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_5\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"BooleanDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Boolean\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_1\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"boolean\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Int32DataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Int32\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_6\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"int\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"DoubleDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Double\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_11\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"double\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Default/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ByteStringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"ByteString\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_15\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"bytes\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedText\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_21\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Locale\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"Text\",\n                      \"type\": \"String\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"StringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.String\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataTypeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"CycleStepDataType\",\n                  \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                  \"aliases\": [\n                    \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Name\",\n                      \"type\": \"org.opcfoundation.UA.String\"\n                    },\n                    {\n                      \"name\": \"Duration\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Double\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_11\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"double\"\n                          }\n                        ]\n                      }\n                    }\n                  ],\n                  \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Multiple/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"i_x61_2258\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.DateTime\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32DataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.UInt32\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"Boolean\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_1\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Value\",\n                                    \"type\": \"boolean\"\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32DataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"Int32\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_6\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Value\",\n                                    \"type\": \"int\"\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"Double\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_11\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Value\",\n                                    \"type\": \"double\"\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ns_x61_23_x59_i_x61_1259\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValue\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Variant\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_24\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"null\",\n                                    \"Boolean\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByte\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_2\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Byte\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_3\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_4\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    \"UInt16\",\n                                    \"Int32\",\n                                    \"UInt32\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_8\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_23\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": [\n                                            \"int\",\n                                            {\n                                              \"type\": \"fixed\",\n                                              \"name\": \"ulong\",\n                                              \"namespace\": \"org.opcfoundation.UA\",\n                                              \"size\": 8\n                                            }\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Float\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_10\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"float\"\n                                        }\n                                      ]\n                                    },\n                                    \"Double\",\n                                    \"String\",\n                                    \"DateTime\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Guid\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_14\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"string\",\n                                            \"logicalType\": \"uuid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteString\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_15\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"bytes\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElement\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_16\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_17\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Identifier\",\n                                          \"type\": [\n                                            \"UInt32\",\n                                            \"String\",\n                                            \"Guid\",\n                                            \"ByteString\"\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_18\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Identifier\",\n                                          \"type\": [\n                                            \"UInt32\",\n                                            \"String\",\n                                            \"Guid\",\n                                            \"ByteString\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"ServerUri\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    \"StatusCode\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedName\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_20\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Name\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedText\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_21\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Locale\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Text\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObject\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_22\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": [\n                                            {\n                                              \"type\": \"record\",\n                                              \"name\": \"EncodedDataType\",\n                                              \"namespace\": \"org.opcfoundation.UA\",\n                                              \"fields\": [\n                                                {\n                                                  \"name\": \"TypeId\",\n                                                  \"type\": \"NodeId\"\n                                                },\n                                                {\n                                                  \"name\": \"Body\",\n                                                  \"type\": \"ByteString\"\n                                                }\n                                              ]\n                                            }\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    \"DataValue\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Enumeration\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_29\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"BooleanCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Boolean\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByteCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"SByte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt16Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt32Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"FloatCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Float\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DoubleCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Double\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StringCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"String\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DateTimeCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DateTime\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"GuidCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Guid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteStringCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ByteString\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElementCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"XmlElement\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeIdCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"NodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeIdCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExpandedNodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StatusCodeCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"StatusCode\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedNameCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"QualifiedName\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedTextCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"LocalizedText\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObjectCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExtensionObject\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValueCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DataValue\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"VariantCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Variant\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EnumerationCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Enumeration\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"BooleanMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Boolean\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByteMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"SByte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Byte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt16Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt32Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"FloatMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Float\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DoubleMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Double\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StringMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"String\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DateTimeMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DateTime\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"GuidMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Guid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteStringMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ByteString\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElementMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"XmlElement\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeIdMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"NodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeIdMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExpandedNodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StatusCodeMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"StatusCode\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedNameMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"QualifiedName\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedTextMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"LocalizedText\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObjectMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExtensionObject\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValueMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DataValue\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"VariantMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Variant\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EnumerationMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Enumeration\"\n                                          }\n                                        }\n                                      ]\n                                    }\n                                  ]\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Multiple/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"State\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ServerStateDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"enum\",\n                                \"name\": \"ServerState\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_x95_852\"\n                                ],\n                                \"symbols\": [\n                                  \"Running\",\n                                  \"Failed\",\n                                  \"NoConfiguration\",\n                                  \"Suspended\",\n                                  \"Shutdown\",\n                                  \"Test\",\n                                  \"CommunicationFault\",\n                                  \"Unknown\"\n                                ],\n                                \"default\": \"Running\",\n                                \"uaDataTypeId\": \"i=852\"\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Multiple/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"CurrentTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.DateTime\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EngineeringUnits\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.String\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"AssetId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValue\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Variant\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_24\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"null\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Boolean\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_1\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"boolean\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByte\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_2\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Byte\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_3\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_4\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    \"UInt16\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_6\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    \"UInt32\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_8\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_23\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": [\n                                            \"int\",\n                                            {\n                                              \"type\": \"fixed\",\n                                              \"name\": \"ulong\",\n                                              \"namespace\": \"org.opcfoundation.UA\",\n                                              \"size\": 8\n                                            }\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Float\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_10\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"float\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Double\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_11\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"double\"\n                                        }\n                                      ]\n                                    },\n                                    \"String\",\n                                    \"DateTime\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Guid\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_14\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"string\",\n                                            \"logicalType\": \"uuid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteString\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_15\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"bytes\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElement\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_16\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_17\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Identifier\",\n                                          \"type\": [\n                                            \"UInt32\",\n                                            \"String\",\n                                            \"Guid\",\n                                            \"ByteString\"\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_18\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Identifier\",\n                                          \"type\": [\n                                            \"UInt32\",\n                                            \"String\",\n                                            \"Guid\",\n                                            \"ByteString\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"ServerUri\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    \"StatusCode\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedName\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_20\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Name\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedText\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_21\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Locale\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Text\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObject\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_22\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": [\n                                            {\n                                              \"type\": \"record\",\n                                              \"name\": \"EncodedDataType\",\n                                              \"namespace\": \"org.opcfoundation.UA\",\n                                              \"fields\": [\n                                                {\n                                                  \"name\": \"TypeId\",\n                                                  \"type\": \"NodeId\"\n                                                },\n                                                {\n                                                  \"name\": \"Body\",\n                                                  \"type\": \"ByteString\"\n                                                }\n                                              ]\n                                            }\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    \"DataValue\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Enumeration\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_29\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"BooleanCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Boolean\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByteCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"SByte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt16Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt32Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"FloatCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Float\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DoubleCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Double\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StringCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"String\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DateTimeCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DateTime\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"GuidCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Guid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteStringCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ByteString\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElementCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"XmlElement\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeIdCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"NodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeIdCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExpandedNodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StatusCodeCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"StatusCode\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedNameCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"QualifiedName\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedTextCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"LocalizedText\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObjectCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExtensionObject\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValueCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DataValue\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"VariantCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Variant\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EnumerationCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Enumeration\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"BooleanMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Boolean\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByteMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"SByte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Byte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt16Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt32Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"FloatMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Float\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DoubleMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Double\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StringMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"String\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DateTimeMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DateTime\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"GuidMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Guid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteStringMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ByteString\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElementMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"XmlElement\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeIdMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"NodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeIdMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExpandedNodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StatusCodeMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"StatusCode\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedNameMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"QualifiedName\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedTextMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"LocalizedText\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObjectMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExtensionObject\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValueMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DataValue\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"VariantMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Variant\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EnumerationMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Enumeration\"\n                                          }\n                                        }\n                                      ]\n                                    }\n                                  ]\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Important\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.Boolean\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Variance\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.Float\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Multiple/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"ConditionClassId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"NodeId\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_17\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Namespace\",\n                                    \"type\": \"String\"\n                                  },\n                                  {\n                                    \"name\": \"Identifier\",\n                                    \"type\": [\n                                      \"UInt32\",\n                                      \"String\",\n                                      {\n                                        \"type\": \"record\",\n                                        \"name\": \"Guid\",\n                                        \"namespace\": \"org.opcfoundation.UA\",\n                                        \"aliases\": [\n                                          \"org.opcfoundation.UA.i_14\"\n                                        ],\n                                        \"fields\": [\n                                          {\n                                            \"name\": \"Value\",\n                                            \"type\": {\n                                              \"type\": \"string\",\n                                              \"logicalType\": \"uuid\"\n                                            }\n                                          }\n                                        ]\n                                      },\n                                      {\n                                        \"type\": \"record\",\n                                        \"name\": \"ByteString\",\n                                        \"namespace\": \"org.opcfoundation.UA\",\n                                        \"aliases\": [\n                                          \"org.opcfoundation.UA.i_15\"\n                                        ],\n                                        \"fields\": [\n                                          {\n                                            \"name\": \"Value\",\n                                            \"type\": \"bytes\"\n                                          }\n                                        ]\n                                      }\n                                    ]\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"ConditionClassName\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"LocalizedText\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_21\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Locale\",\n                                    \"type\": \"String\"\n                                  },\n                                  {\n                                    \"name\": \"Text\",\n                                    \"type\": \"String\"\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"ConditionSubClassId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdCollectionDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"NodeIdCollection\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Value\",\n                                    \"type\": {\n                                      \"type\": \"array\",\n                                      \"items\": \"NodeId\"\n                                    }\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"ConditionSubClassName\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextCollectionDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"LocalizedTextCollection\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Value\",\n                                    \"type\": {\n                                      \"type\": \"array\",\n                                      \"items\": \"LocalizedText\"\n                                    }\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EventId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.ByteString\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EventType\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"LocalTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"TimeZoneDataTypeDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"TimeZoneDataType\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_x95_8912\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Offset\",\n                                    \"type\": {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_4\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    }\n                                  },\n                                  {\n                                    \"name\": \"DaylightSavingInOffset\",\n                                    \"type\": {\n                                      \"type\": \"record\",\n                                      \"name\": \"Boolean\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_1\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"boolean\"\n                                        }\n                                      ]\n                                    }\n                                  }\n                                ],\n                                \"uaDataTypeId\": \"i=8912\"\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Message\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.LocalizedTextDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ReceiveTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.DateTime\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Severity\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16DataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.UInt16\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"SourceName\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.String\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"SourceNode\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Time\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.DateTimeDataValue\"\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Multiple/PlcSimulation.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": [\n          {\n            \"type\": \"record\",\n            \"name\": \"DataSetMessage\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"MessageType\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"String\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_12\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"DataSetWriterName\",\n                \"type\": \"org.opcfoundation.UA.String\"\n              },\n              {\n                \"name\": \"DataSetWriterId\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"UInt16\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_5\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SequenceNumber\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"UInt32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_7\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"MetaDataVersion\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"ConfigurationVersionDataType\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_14593\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"MajorVersion\",\n                      \"type\": \"UInt32\"\n                    },\n                    {\n                      \"name\": \"MinorVersion\",\n                      \"type\": \"UInt32\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"Timestamp\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"DateTime\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_13\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_19\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"Payload\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"DataSet\",\n                  \"fields\": [\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"UInt32DataValue\",\n                          \"namespace\": \"org.github.microsoft.opc.publisher\",\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": [\n                                \"null\",\n                                \"org.opcfoundation.UA.UInt32\"\n                              ]\n                            },\n                            {\n                              \"name\": \"StatusCode\",\n                              \"type\": \"org.opcfoundation.UA.StatusCode\"\n                            },\n                            {\n                              \"name\": \"SourceTimestamp\",\n                              \"type\": \"org.opcfoundation.UA.DateTime\"\n                            },\n                            {\n                              \"name\": \"SourcePicoseconds\",\n                              \"type\": \"org.opcfoundation.UA.UInt16\"\n                            },\n                            {\n                              \"name\": \"ServerTimestamp\",\n                              \"type\": \"org.opcfoundation.UA.DateTime\"\n                            },\n                            {\n                              \"name\": \"ServerPicoseconds\",\n                              \"type\": \"org.opcfoundation.UA.UInt16\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"BooleanDataValue\",\n                          \"namespace\": \"org.github.microsoft.opc.publisher\",\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": [\n                                \"null\",\n                                {\n                                  \"type\": \"record\",\n                                  \"name\": \"Boolean\",\n                                  \"namespace\": \"org.opcfoundation.UA\",\n                                  \"aliases\": [\n                                    \"org.opcfoundation.UA.i_1\"\n                                  ],\n                                  \"fields\": [\n                                    {\n                                      \"name\": \"Value\",\n                                      \"type\": \"boolean\"\n                                    }\n                                  ]\n                                }\n                              ]\n                            },\n                            {\n                              \"name\": \"StatusCode\",\n                              \"type\": \"org.opcfoundation.UA.StatusCode\"\n                            },\n                            {\n                              \"name\": \"SourceTimestamp\",\n                              \"type\": \"org.opcfoundation.UA.DateTime\"\n                            },\n                            {\n                              \"name\": \"SourcePicoseconds\",\n                              \"type\": \"org.opcfoundation.UA.UInt16\"\n                            },\n                            {\n                              \"name\": \"ServerTimestamp\",\n                              \"type\": \"org.opcfoundation.UA.DateTime\"\n                            },\n                            {\n                              \"name\": \"ServerPicoseconds\",\n                              \"type\": \"org.opcfoundation.UA.UInt16\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"Int32DataValue\",\n                          \"namespace\": \"org.github.microsoft.opc.publisher\",\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": [\n                                \"null\",\n                                {\n                                  \"type\": \"record\",\n                                  \"name\": \"Int32\",\n                                  \"namespace\": \"org.opcfoundation.UA\",\n                                  \"aliases\": [\n                                    \"org.opcfoundation.UA.i_6\"\n                                  ],\n                                  \"fields\": [\n                                    {\n                                      \"name\": \"Value\",\n                                      \"type\": \"int\"\n                                    }\n                                  ]\n                                }\n                              ]\n                            },\n                            {\n                              \"name\": \"StatusCode\",\n                              \"type\": \"org.opcfoundation.UA.StatusCode\"\n                            },\n                            {\n                              \"name\": \"SourceTimestamp\",\n                              \"type\": \"org.opcfoundation.UA.DateTime\"\n                            },\n                            {\n                              \"name\": \"SourcePicoseconds\",\n                              \"type\": \"org.opcfoundation.UA.UInt16\"\n                            },\n                            {\n                              \"name\": \"ServerTimestamp\",\n                              \"type\": \"org.opcfoundation.UA.DateTime\"\n                            },\n                            {\n                              \"name\": \"ServerPicoseconds\",\n                              \"type\": \"org.opcfoundation.UA.UInt16\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"DoubleDataValue\",\n                          \"namespace\": \"org.github.microsoft.opc.publisher\",\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": [\n                                \"null\",\n                                {\n                                  \"type\": \"record\",\n                                  \"name\": \"Double\",\n                                  \"namespace\": \"org.opcfoundation.UA\",\n                                  \"aliases\": [\n                                    \"org.opcfoundation.UA.i_11\"\n                                  ],\n                                  \"fields\": [\n                                    {\n                                      \"name\": \"Value\",\n                                      \"type\": \"double\"\n                                    }\n                                  ]\n                                }\n                              ]\n                            },\n                            {\n                              \"name\": \"StatusCode\",\n                              \"type\": \"org.opcfoundation.UA.StatusCode\"\n                            },\n                            {\n                              \"name\": \"SourceTimestamp\",\n                              \"type\": \"org.opcfoundation.UA.DateTime\"\n                            },\n                            {\n                              \"name\": \"SourcePicoseconds\",\n                              \"type\": \"org.opcfoundation.UA.UInt16\"\n                            },\n                            {\n                              \"name\": \"ServerTimestamp\",\n                              \"type\": \"org.opcfoundation.UA.DateTime\"\n                            },\n                            {\n                              \"name\": \"ServerPicoseconds\",\n                              \"type\": \"org.opcfoundation.UA.UInt16\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n                      ]\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"record\",\n            \"name\": \"DataSetMessage1\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"MessageType\",\n                \"type\": \"org.opcfoundation.UA.String\"\n              },\n              {\n                \"name\": \"DataSetWriterName\",\n                \"type\": \"org.opcfoundation.UA.String\"\n              },\n              {\n                \"name\": \"DataSetWriterId\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"SequenceNumber\",\n                \"type\": \"org.opcfoundation.UA.UInt32\"\n              },\n              {\n                \"name\": \"MetaDataVersion\",\n                \"type\": \"org.opcfoundation.UA.ConfigurationVersionDataType\"\n              },\n              {\n                \"name\": \"Timestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"Payload\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"DataSet1\",\n                  \"fields\": [\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n                      ]\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Multiple/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"EventId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"ByteString\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_15\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Value\",\n                                    \"type\": \"bytes\"\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Message\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"LocalizedText\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_21\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Locale\",\n                                    \"type\": \"String\"\n                                  },\n                                  {\n                                    \"name\": \"Text\",\n                                    \"type\": \"String\"\n                                  }\n                                ]\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.String\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"CycleStepDataTypeDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"CycleStepDataType\",\n                                \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Name\",\n                                    \"type\": \"org.opcfoundation.UA.String\"\n                                  },\n                                  {\n                                    \"name\": \"Duration\",\n                                    \"type\": {\n                                      \"type\": \"record\",\n                                      \"name\": \"Double\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_11\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"double\"\n                                        }\n                                      ]\n                                    }\n                                  }\n                                ],\n                                \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessage/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTimeDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"DateTime\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_13\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt32DataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"UInt32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_7\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"BooleanDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Boolean\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_1\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Int32DataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Int32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_6\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DoubleDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Double\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_11\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"double\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DataValue\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Variant\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_24\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"Boolean\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByte\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_2\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Byte\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_3\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_4\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      \"UInt16\",\n                      \"Int32\",\n                      \"UInt32\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_8\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_23\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"int\",\n                              {\n                                \"type\": \"fixed\",\n                                \"name\": \"ulong\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"size\": 8\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Float\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_10\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"float\"\n                          }\n                        ]\n                      },\n                      \"Double\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"DateTime\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Guid\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_14\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"string\",\n                              \"logicalType\": \"uuid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteString\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_15\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"bytes\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElement\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_16\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_17\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_18\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          },\n                          {\n                            \"name\": \"ServerUri\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      \"StatusCode\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedName\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_20\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Name\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedText\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_21\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Locale\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Text\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObject\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_22\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"EncodedDataType\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"TypeId\",\n                                    \"type\": \"NodeId\"\n                                  },\n                                  {\n                                    \"name\": \"Body\",\n                                    \"type\": \"ByteString\"\n                                  }\n                                ]\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      \"DataValue\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Enumeration\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_29\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Boolean\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByteCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"SByte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Float\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Double\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"String\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DateTime\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"GuidCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Guid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ByteString\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElementCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"XmlElement\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExpandedNodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCodeCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"StatusCode\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedNameCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"QualifiedName\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObjectCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExtensionObject\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValueCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DataValue\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Variant\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EnumerationCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Enumeration\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Boolean\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByteMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"SByte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Byte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Float\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Double\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"String\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DateTime\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"GuidMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Guid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ByteString\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElementMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"XmlElement\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeIdMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExpandedNodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCodeMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"StatusCode\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedNameMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"QualifiedName\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObjectMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExtensionObject\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValueMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DataValue\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Variant\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EnumerationMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Enumeration\"\n                            }\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"UInt16\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessage/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"com.microsoft\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"PublisherId\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetClassId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Guid\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": {\n              \"type\": \"string\",\n              \"logicalType\": \"uuid\"\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"State\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ServerStateDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"enum\",\n                                \"name\": \"ServerState\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_x95_852\"\n                                ],\n                                \"symbols\": [\n                                  \"Running\",\n                                  \"Failed\",\n                                  \"NoConfiguration\",\n                                  \"Suspended\",\n                                  \"Shutdown\",\n                                  \"Test\",\n                                  \"CommunicationFault\",\n                                  \"Unknown\"\n                                ],\n                                \"default\": \"Running\",\n                                \"uaDataTypeId\": \"i=852\"\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessage/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"com.microsoft\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"PublisherId\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetClassId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Guid\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": {\n              \"type\": \"string\",\n              \"logicalType\": \"uuid\"\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"CurrentTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.DateTime\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EngineeringUnits\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.String\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"AssetId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValue\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Variant\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_24\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"null\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Boolean\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_1\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"boolean\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByte\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_2\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Byte\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_3\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_4\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    \"UInt16\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_6\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    \"UInt32\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_8\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_23\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": [\n                                            \"int\",\n                                            {\n                                              \"type\": \"fixed\",\n                                              \"name\": \"ulong\",\n                                              \"namespace\": \"org.opcfoundation.UA\",\n                                              \"size\": 8\n                                            }\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Float\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_10\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"float\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Double\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_11\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"double\"\n                                        }\n                                      ]\n                                    },\n                                    \"String\",\n                                    \"DateTime\",\n                                    \"Guid\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteString\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_15\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"bytes\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElement\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_16\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_17\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Identifier\",\n                                          \"type\": [\n                                            \"UInt32\",\n                                            \"String\",\n                                            \"Guid\",\n                                            \"ByteString\"\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_18\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Identifier\",\n                                          \"type\": [\n                                            \"UInt32\",\n                                            \"String\",\n                                            \"Guid\",\n                                            \"ByteString\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"ServerUri\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    \"StatusCode\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedName\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_20\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Name\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedText\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_21\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Locale\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Text\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObject\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_22\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": [\n                                            {\n                                              \"type\": \"record\",\n                                              \"name\": \"EncodedDataType\",\n                                              \"namespace\": \"org.opcfoundation.UA\",\n                                              \"fields\": [\n                                                {\n                                                  \"name\": \"TypeId\",\n                                                  \"type\": \"NodeId\"\n                                                },\n                                                {\n                                                  \"name\": \"Body\",\n                                                  \"type\": \"ByteString\"\n                                                }\n                                              ]\n                                            }\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    \"DataValue\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Enumeration\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_29\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"BooleanCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Boolean\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByteCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"SByte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt16Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt32Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"FloatCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Float\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DoubleCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Double\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StringCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"String\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DateTimeCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DateTime\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"GuidCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Guid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteStringCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ByteString\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElementCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"XmlElement\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeIdCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"NodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeIdCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExpandedNodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StatusCodeCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"StatusCode\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedNameCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"QualifiedName\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedTextCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"LocalizedText\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObjectCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExtensionObject\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValueCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DataValue\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"VariantCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Variant\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EnumerationCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Enumeration\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"BooleanMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Boolean\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByteMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"SByte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Byte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt16Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt32Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"FloatMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Float\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DoubleMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Double\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StringMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"String\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DateTimeMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DateTime\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"GuidMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Guid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteStringMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ByteString\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElementMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"XmlElement\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeIdMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"NodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeIdMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExpandedNodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StatusCodeMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"StatusCode\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedNameMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"QualifiedName\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedTextMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"LocalizedText\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObjectMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExtensionObject\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValueMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DataValue\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"VariantMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Variant\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EnumerationMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Enumeration\"\n                                          }\n                                        }\n                                      ]\n                                    }\n                                  ]\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Important\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.Boolean\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Variance\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.Float\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessage/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"NodeId\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_17\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Namespace\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"Identifier\",\n                      \"type\": [\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"UInt32\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_7\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"int\"\n                            }\n                          ]\n                        },\n                        \"String\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"Guid\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_14\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": {\n                                \"type\": \"string\",\n                                \"logicalType\": \"uuid\"\n                              }\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"ByteString\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_15\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"bytes\"\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedText\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_21\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Locale\",\n                      \"type\": \"String\"\n                    },\n                    {\n                      \"name\": \"Text\",\n                      \"type\": \"String\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdCollectionDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"NodeIdCollection\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": {\n                        \"type\": \"array\",\n                        \"items\": \"NodeId\"\n                      }\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextCollectionDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedTextCollection\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": {\n                        \"type\": \"array\",\n                        \"items\": \"LocalizedText\"\n                      }\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ByteStringDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.ByteString\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataTypeDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"TimeZoneDataType\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_x95_8912\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Offset\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Int16\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_4\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"DaylightSavingInOffset\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Boolean\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_1\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          }\n                        ]\n                      }\n                    }\n                  ],\n                  \"uaDataTypeId\": \"i=8912\"\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.LocalizedTextDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTimeDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.DateTime\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt16DataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.UInt16\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"StringDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.String\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.DateTimeDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessage/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"UInt32DataValue\",\n            \"namespace\": \"com.microsoft\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"UInt32\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_7\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"int\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_19\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"DateTime\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_13\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"UInt16\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_5\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"BooleanDataValue\",\n            \"namespace\": \"com.microsoft\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Boolean\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_1\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"boolean\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Int32DataValue\",\n            \"namespace\": \"com.microsoft\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Int32\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_6\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"int\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"DoubleDataValue\",\n            \"namespace\": \"com.microsoft\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Double\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_11\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"double\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.DoubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.DoubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.DoubleDataValue\"\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.UInt32DataValue\"\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessage/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ByteStringDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"ByteString\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_15\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"bytes\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedText\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_21\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Locale\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"Text\",\n                      \"type\": \"String\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"StringDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.String\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataTypeDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"CycleStepDataType\",\n                  \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                  \"aliases\": [\n                    \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Name\",\n                      \"type\": \"org.opcfoundation.UA.String\"\n                    },\n                    {\n                      \"name\": \"Duration\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Double\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_11\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"double\"\n                          }\n                        ]\n                      }\n                    }\n                  ],\n                  \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessageDefault/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTimeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"DateTime\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_13\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt32DataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"UInt32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_7\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"BooleanDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Boolean\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_1\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Int32DataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Int32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_6\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DoubleDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Double\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_11\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"double\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DataValue\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Variant\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_24\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"Boolean\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByte\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_2\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Byte\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_3\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_4\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      \"UInt16\",\n                      \"Int32\",\n                      \"UInt32\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_8\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_23\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"int\",\n                              {\n                                \"type\": \"fixed\",\n                                \"name\": \"ulong\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"size\": 8\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Float\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_10\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"float\"\n                          }\n                        ]\n                      },\n                      \"Double\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"DateTime\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Guid\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_14\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"string\",\n                              \"logicalType\": \"uuid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteString\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_15\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"bytes\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElement\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_16\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_17\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_18\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          },\n                          {\n                            \"name\": \"ServerUri\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      \"StatusCode\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedName\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_20\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Name\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedText\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_21\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Locale\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Text\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObject\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_22\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"EncodedDataType\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"TypeId\",\n                                    \"type\": \"NodeId\"\n                                  },\n                                  {\n                                    \"name\": \"Body\",\n                                    \"type\": \"ByteString\"\n                                  }\n                                ]\n                              }\n                            ]\n                          }\n                        ]\n                      },\n                      \"DataValue\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Enumeration\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_29\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Boolean\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByteCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"SByte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64Collection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Float\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Double\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"String\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DateTime\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"GuidCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Guid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ByteString\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElementCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"XmlElement\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExpandedNodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCodeCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"StatusCode\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedNameCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"QualifiedName\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObjectCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExtensionObject\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValueCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DataValue\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Variant\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EnumerationCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Enumeration\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Boolean\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"SByteMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"SByte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Byte\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int16Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt16Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt16\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt32Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt32\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int64Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Int64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"UInt64Matrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"UInt64\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Float\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DoubleMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Double\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"String\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DateTime\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"GuidMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Guid\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteStringMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ByteString\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"XmlElementMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"XmlElement\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeIdMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExpandedNodeId\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCodeMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"StatusCode\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedNameMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"QualifiedName\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObjectMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"ExtensionObject\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValueMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"DataValue\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Variant\"\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EnumerationMatrix\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Dimensions\",\n                            \"type\": \"Int32Collection\"\n                          },\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"Enumeration\"\n                            }\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"UInt16\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessageDefault/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"PublisherId\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetClassId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Guid\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": {\n              \"type\": \"string\",\n              \"logicalType\": \"uuid\"\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"State\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ServerStateDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              {\n                                \"type\": \"enum\",\n                                \"name\": \"ServerState\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_x95_852\"\n                                ],\n                                \"symbols\": [\n                                  \"Running\",\n                                  \"Failed\",\n                                  \"NoConfiguration\",\n                                  \"Suspended\",\n                                  \"Shutdown\",\n                                  \"Test\",\n                                  \"CommunicationFault\",\n                                  \"Unknown\"\n                                ],\n                                \"default\": \"Running\",\n                                \"uaDataTypeId\": \"i=852\"\n                              }\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessageDefault/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"PublisherId\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetClassId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Guid\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": {\n              \"type\": \"string\",\n              \"logicalType\": \"uuid\"\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"DataSetWriterId\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SequenceNumber\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"UInt32\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"UInt32\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Timestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"CurrentTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DateTimeDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.DateTime\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EngineeringUnits\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"StringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.String\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"AssetId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValue\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Variant\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_24\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"null\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Boolean\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_1\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"boolean\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByte\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_2\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Byte\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_3\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_4\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    \"UInt16\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_6\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    \"UInt32\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_8\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_23\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": [\n                                            \"int\",\n                                            {\n                                              \"type\": \"fixed\",\n                                              \"name\": \"ulong\",\n                                              \"namespace\": \"org.opcfoundation.UA\",\n                                              \"size\": 8\n                                            }\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Float\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_10\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"float\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Double\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_11\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"double\"\n                                        }\n                                      ]\n                                    },\n                                    \"String\",\n                                    \"DateTime\",\n                                    \"Guid\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteString\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_15\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"bytes\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElement\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_16\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_17\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Identifier\",\n                                          \"type\": [\n                                            \"UInt32\",\n                                            \"String\",\n                                            \"Guid\",\n                                            \"ByteString\"\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_18\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Identifier\",\n                                          \"type\": [\n                                            \"UInt32\",\n                                            \"String\",\n                                            \"Guid\",\n                                            \"ByteString\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"ServerUri\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    \"StatusCode\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedName\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_20\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Name\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedText\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_21\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Locale\",\n                                          \"type\": \"String\"\n                                        },\n                                        {\n                                          \"name\": \"Text\",\n                                          \"type\": \"String\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObject\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_22\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": [\n                                            {\n                                              \"type\": \"record\",\n                                              \"name\": \"EncodedDataType\",\n                                              \"namespace\": \"org.opcfoundation.UA\",\n                                              \"fields\": [\n                                                {\n                                                  \"name\": \"TypeId\",\n                                                  \"type\": \"NodeId\"\n                                                },\n                                                {\n                                                  \"name\": \"Body\",\n                                                  \"type\": \"ByteString\"\n                                                }\n                                              ]\n                                            }\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    \"DataValue\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Enumeration\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_29\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"BooleanCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Boolean\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByteCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"SByte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt16Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt32Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64Collection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"FloatCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Float\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DoubleCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Double\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StringCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"String\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DateTimeCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DateTime\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"GuidCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Guid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteStringCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ByteString\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElementCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"XmlElement\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeIdCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"NodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeIdCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExpandedNodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StatusCodeCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"StatusCode\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedNameCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"QualifiedName\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedTextCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"LocalizedText\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObjectCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExtensionObject\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValueCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DataValue\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"VariantCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Variant\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EnumerationCollection\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Enumeration\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"BooleanMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Boolean\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"SByteMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"SByte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Byte\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int16Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt16Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt16\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int32Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt32Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt32\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"Int64Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Int64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"UInt64Matrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"UInt64\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"FloatMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Float\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DoubleMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Double\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StringMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"String\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DateTimeMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DateTime\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"GuidMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Guid\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ByteStringMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ByteString\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"XmlElementMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"XmlElement\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeIdMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"NodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeIdMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExpandedNodeId\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"StatusCodeMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"StatusCode\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedNameMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"QualifiedName\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"LocalizedTextMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"LocalizedText\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObjectMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"ExtensionObject\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValueMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"DataValue\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"VariantMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Variant\"\n                                          }\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EnumerationMatrix\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Dimensions\",\n                                          \"type\": \"Int32Collection\"\n                                        },\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": {\n                                            \"type\": \"array\",\n                                            \"items\": \"Enumeration\"\n                                          }\n                                        }\n                                      ]\n                                    }\n                                  ]\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Important\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"BooleanDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.Boolean\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Variance\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"FloatDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": [\n                              \"null\",\n                              \"org.opcfoundation.UA.Float\"\n                            ]\n                          },\n                          {\n                            \"name\": \"StatusCode\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"org.opcfoundation.UA.DateTime\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"org.opcfoundation.UA.UInt16\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessageDefault/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"NodeId\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_17\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Namespace\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"Identifier\",\n                      \"type\": [\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"UInt32\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_7\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"int\"\n                            }\n                          ]\n                        },\n                        \"String\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"Guid\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_14\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": {\n                                \"type\": \"string\",\n                                \"logicalType\": \"uuid\"\n                              }\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"ByteString\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_15\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"bytes\"\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedText\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_21\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Locale\",\n                      \"type\": \"String\"\n                    },\n                    {\n                      \"name\": \"Text\",\n                      \"type\": \"String\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdCollectionDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"NodeIdCollection\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": {\n                        \"type\": \"array\",\n                        \"items\": \"NodeId\"\n                      }\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextCollectionDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedTextCollection\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": {\n                        \"type\": \"array\",\n                        \"items\": \"LocalizedText\"\n                      }\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ByteStringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.ByteString\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataTypeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"TimeZoneDataType\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_x95_8912\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Offset\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Int16\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_4\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"DaylightSavingInOffset\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Boolean\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_1\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          }\n                        ]\n                      }\n                    }\n                  ],\n                  \"uaDataTypeId\": \"i=8912\"\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.LocalizedTextDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTimeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.DateTime\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt16DataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.UInt16\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"StringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.String\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.DateTimeDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessageDefault/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"UInt32DataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"UInt32\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_7\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"int\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_19\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"DateTime\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_13\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"long\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"UInt16\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_5\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"BooleanDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Boolean\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_1\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"boolean\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Int32DataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Int32\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_6\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"int\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"DoubleDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": [\n                  \"null\",\n                  {\n                    \"type\": \"record\",\n                    \"name\": \"Double\",\n                    \"namespace\": \"org.opcfoundation.UA\",\n                    \"aliases\": [\n                      \"org.opcfoundation.UA.i_11\"\n                    ],\n                    \"fields\": [\n                      {\n                        \"name\": \"Value\",\n                        \"type\": \"double\"\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"name\": \"StatusCode\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"org.opcfoundation.UA.DateTime\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"org.opcfoundation.UA.UInt16\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/NetworkMessageDefault/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ByteStringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"ByteString\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_15\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"bytes\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DateTime\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_13\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"LocalizedText\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_21\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Locale\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"String\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_12\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"Text\",\n                      \"type\": \"String\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"StringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                \"org.opcfoundation.UA.String\"\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataTypeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"CycleStepDataType\",\n                  \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                  \"aliases\": [\n                    \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Name\",\n                      \"type\": \"org.opcfoundation.UA.String\"\n                    },\n                    {\n                      \"name\": \"Duration\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"Double\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_11\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"double\"\n                          }\n                        ]\n                      }\n                    }\n                  ],\n                  \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n                }\n              ]\n            },\n            {\n              \"name\": \"StatusCode\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"org.opcfoundation.UA.DateTime\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"org.opcfoundation.UA.UInt16\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Raw/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTime\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_13\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"long\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt32\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_7\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Boolean\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_1\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"boolean\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Int32\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_6\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Double\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_11\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"double\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Double\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Double\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Double\"\n      ]\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Variant\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_24\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": [\n              \"null\",\n              \"Boolean\",\n              {\n                \"type\": \"record\",\n                \"name\": \"SByte\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_2\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Byte\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_3\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_4\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              \"Int32\",\n              \"UInt32\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_8\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"int\",\n                      {\n                        \"type\": \"fixed\",\n                        \"name\": \"ulong\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"size\": 8\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Float\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_10\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"float\"\n                  }\n                ]\n              },\n              \"Double\",\n              {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"DateTime\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Guid\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"string\",\n                      \"logicalType\": \"uuid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteString\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_15\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"bytes\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElement\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_16\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Identifier\",\n                    \"type\": [\n                      \"UInt32\",\n                      \"String\",\n                      \"Guid\",\n                      \"ByteString\"\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_18\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Identifier\",\n                    \"type\": [\n                      \"UInt32\",\n                      \"String\",\n                      \"Guid\",\n                      \"ByteString\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ServerUri\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedName\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_20\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedText\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_21\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Locale\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Text\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObject\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_22\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EncodedDataType\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"TypeId\",\n                            \"type\": \"NodeId\"\n                          },\n                          {\n                            \"name\": \"Body\",\n                            \"type\": \"ByteString\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValue\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"Variant\"\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"UInt16\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Enumeration\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_29\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Boolean\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByteCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"SByte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Float\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Double\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StringCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"String\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DateTime\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"GuidCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Guid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ByteString\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElementCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"XmlElement\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"NodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeIdCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExpandedNodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCodeCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"StatusCode\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedNameCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"QualifiedName\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"LocalizedText\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObjectCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExtensionObject\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValueCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DataValue\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Variant\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"EnumerationCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Enumeration\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Boolean\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByteMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"SByte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Byte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Float\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Double\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StringMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"String\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DateTime\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"GuidMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Guid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ByteString\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElementMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"XmlElement\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"NodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeIdMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExpandedNodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCodeMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"StatusCode\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedNameMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"QualifiedName\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"LocalizedText\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObjectMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExtensionObject\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValueMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DataValue\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Variant\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"EnumerationMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Enumeration\"\n                    }\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Raw/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"State\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"enum\",\n          \"name\": \"ServerState\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_x95_852\"\n          ],\n          \"symbols\": [\n            \"Running\",\n            \"Failed\",\n            \"NoConfiguration\",\n            \"Suspended\",\n            \"Shutdown\",\n            \"Test\",\n            \"CommunicationFault\",\n            \"Unknown\"\n          ],\n          \"default\": \"Running\",\n          \"uaDataTypeId\": \"i=852\"\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Raw/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"CurrentTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTime\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_13\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"long\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EngineeringUnits\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"String\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_12\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"AssetId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Variant\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_24\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Boolean\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_1\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"boolean\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByte\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_2\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Byte\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_3\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_4\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_6\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_8\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"int\",\n                      {\n                        \"type\": \"fixed\",\n                        \"name\": \"ulong\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"size\": 8\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Float\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_10\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"float\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Double\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_11\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"double\"\n                  }\n                ]\n              },\n              \"String\",\n              \"DateTime\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Guid\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"string\",\n                      \"logicalType\": \"uuid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteString\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_15\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"bytes\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElement\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_16\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Identifier\",\n                    \"type\": [\n                      \"UInt32\",\n                      \"String\",\n                      \"Guid\",\n                      \"ByteString\"\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_18\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Identifier\",\n                    \"type\": [\n                      \"UInt32\",\n                      \"String\",\n                      \"Guid\",\n                      \"ByteString\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ServerUri\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedName\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_20\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedText\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_21\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Locale\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Text\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObject\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_22\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EncodedDataType\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"TypeId\",\n                            \"type\": \"NodeId\"\n                          },\n                          {\n                            \"name\": \"Body\",\n                            \"type\": \"ByteString\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValue\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"Variant\"\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"UInt16\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Enumeration\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_29\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Boolean\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByteCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"SByte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Float\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Double\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StringCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"String\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DateTime\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"GuidCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Guid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ByteString\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElementCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"XmlElement\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"NodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeIdCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExpandedNodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCodeCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"StatusCode\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedNameCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"QualifiedName\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"LocalizedText\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObjectCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExtensionObject\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValueCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DataValue\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Variant\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"EnumerationCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Enumeration\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Boolean\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByteMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"SByte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Byte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Float\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Double\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StringMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"String\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DateTime\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"GuidMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Guid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ByteString\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElementMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"XmlElement\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"NodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeIdMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExpandedNodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCodeMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"StatusCode\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedNameMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"QualifiedName\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"LocalizedText\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObjectMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExtensionObject\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValueMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DataValue\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Variant\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"EnumerationMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Enumeration\"\n                    }\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Important\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Boolean\"\n      ]\n    },\n    {\n      \"name\": \"Variance\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Float\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Raw/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeId\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_17\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Namespace\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Identifier\",\n              \"type\": [\n                {\n                  \"type\": \"record\",\n                  \"name\": \"UInt32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_7\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                },\n                \"String\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Guid\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_14\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": {\n                        \"type\": \"string\",\n                        \"logicalType\": \"uuid\"\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"record\",\n                  \"name\": \"ByteString\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_15\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"bytes\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedText\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_21\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Locale\",\n              \"type\": \"String\"\n            },\n            {\n              \"name\": \"Text\",\n              \"type\": \"String\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdCollection\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": \"NodeId\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextCollection\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": \"LocalizedText\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.ByteString\"\n      ]\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.NodeId\"\n      ]\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataType\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_x95_8912\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Offset\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Int16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_4\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"DaylightSavingInOffset\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Boolean\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_1\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"boolean\"\n                  }\n                ]\n              }\n            }\n          ],\n          \"uaDataTypeId\": \"i=8912\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.LocalizedText\"\n      ]\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTime\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_13\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"long\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt16\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_5\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.String\"\n      ]\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.NodeId\"\n      ]\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.DateTime\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Raw/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"UInt32\",\n            \"namespace\": \"org.opcfoundation.UA\",\n            \"aliases\": [\n              \"org.opcfoundation.UA.i_7\"\n            ],\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Boolean\",\n            \"namespace\": \"org.opcfoundation.UA\",\n            \"aliases\": [\n              \"org.opcfoundation.UA.i_1\"\n            ],\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"boolean\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Int32\",\n            \"namespace\": \"org.opcfoundation.UA\",\n            \"aliases\": [\n              \"org.opcfoundation.UA.i_6\"\n            ],\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Double\",\n            \"namespace\": \"org.opcfoundation.UA\",\n            \"aliases\": [\n              \"org.opcfoundation.UA.i_11\"\n            ],\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"double\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.Double\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.Double\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.Double\"\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Raw/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ByteString\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_15\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"bytes\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedText\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_21\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Locale\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Text\",\n              \"type\": \"String\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.String\"\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataType\",\n          \"namespace\": \"org.opcfoundation.SimpleEvents\",\n          \"aliases\": [\n            \"org.opcfoundation.SimpleEvents.i_x95_183\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Name\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"Duration\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Double\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_11\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"double\"\n                  }\n                ]\n              }\n            }\n          ],\n          \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/RawReversible/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTime\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_13\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"long\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt32\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_7\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Boolean\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_1\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"boolean\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Int32\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_6\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"Double\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_11\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"double\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Double\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Double\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.UInt32\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Double\"\n      ]\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Variant\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_24\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": [\n              \"null\",\n              \"Boolean\",\n              {\n                \"type\": \"record\",\n                \"name\": \"SByte\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_2\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Byte\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_3\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_4\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              \"Int32\",\n              \"UInt32\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_8\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"int\",\n                      {\n                        \"type\": \"fixed\",\n                        \"name\": \"ulong\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"size\": 8\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Float\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_10\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"float\"\n                  }\n                ]\n              },\n              \"Double\",\n              {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              \"DateTime\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Guid\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"string\",\n                      \"logicalType\": \"uuid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteString\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_15\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"bytes\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElement\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_16\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Identifier\",\n                    \"type\": [\n                      \"UInt32\",\n                      \"String\",\n                      \"Guid\",\n                      \"ByteString\"\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_18\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Identifier\",\n                    \"type\": [\n                      \"UInt32\",\n                      \"String\",\n                      \"Guid\",\n                      \"ByteString\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ServerUri\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedName\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_20\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedText\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_21\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Locale\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Text\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObject\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_22\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EncodedDataType\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"TypeId\",\n                            \"type\": \"NodeId\"\n                          },\n                          {\n                            \"name\": \"Body\",\n                            \"type\": \"ByteString\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValue\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"Variant\"\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"UInt16\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Enumeration\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_29\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Boolean\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByteCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"SByte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Float\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Double\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StringCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"String\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DateTime\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"GuidCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Guid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ByteString\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElementCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"XmlElement\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"NodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeIdCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExpandedNodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCodeCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"StatusCode\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedNameCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"QualifiedName\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"LocalizedText\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObjectCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExtensionObject\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValueCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DataValue\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Variant\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"EnumerationCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Enumeration\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Boolean\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByteMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"SByte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Byte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Float\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Double\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StringMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"String\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DateTime\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"GuidMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Guid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ByteString\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElementMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"XmlElement\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"NodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeIdMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExpandedNodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCodeMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"StatusCode\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedNameMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"QualifiedName\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"LocalizedText\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObjectMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExtensionObject\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValueMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DataValue\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Variant\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"EnumerationMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Enumeration\"\n                    }\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/RawReversible/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"State\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"enum\",\n          \"name\": \"ServerState\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_x95_852\"\n          ],\n          \"symbols\": [\n            \"Running\",\n            \"Failed\",\n            \"NoConfiguration\",\n            \"Suspended\",\n            \"Shutdown\",\n            \"Test\",\n            \"CommunicationFault\",\n            \"Unknown\"\n          ],\n          \"default\": \"Running\",\n          \"uaDataTypeId\": \"i=852\"\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/RawReversible/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"CurrentTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTime\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_13\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"long\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EngineeringUnits\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"String\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_12\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"AssetId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Variant\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_24\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Boolean\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_1\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"boolean\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByte\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_2\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Byte\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_3\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_4\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_5\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_6\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_7\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_8\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"int\",\n                      {\n                        \"type\": \"fixed\",\n                        \"name\": \"ulong\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"size\": 8\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Float\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_10\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"float\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Double\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_11\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"double\"\n                  }\n                ]\n              },\n              \"String\",\n              \"DateTime\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Guid\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"string\",\n                      \"logicalType\": \"uuid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteString\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_15\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"bytes\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElement\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_16\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Identifier\",\n                    \"type\": [\n                      \"UInt32\",\n                      \"String\",\n                      \"Guid\",\n                      \"ByteString\"\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_18\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Identifier\",\n                    \"type\": [\n                      \"UInt32\",\n                      \"String\",\n                      \"Guid\",\n                      \"ByteString\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ServerUri\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_19\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"long\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedName\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_20\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedText\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_21\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Locale\",\n                    \"type\": \"String\"\n                  },\n                  {\n                    \"name\": \"Text\",\n                    \"type\": \"String\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObject\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_22\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"EncodedDataType\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"TypeId\",\n                            \"type\": \"NodeId\"\n                          },\n                          {\n                            \"name\": \"Body\",\n                            \"type\": \"ByteString\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValue\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"Variant\"\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"UInt16\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Enumeration\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_29\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Boolean\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByteCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"SByte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64Collection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Float\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Double\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StringCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"String\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DateTime\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"GuidCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Guid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ByteString\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElementCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"XmlElement\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"NodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeIdCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExpandedNodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCodeCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"StatusCode\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedNameCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"QualifiedName\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"LocalizedText\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObjectCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExtensionObject\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValueCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DataValue\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Variant\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"EnumerationCollection\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Enumeration\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Boolean\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"SByteMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"SByte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Byte\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int16Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt16\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt32\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"Int64Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Int64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt64Matrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"UInt64\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Float\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Double\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StringMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"String\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DateTime\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"GuidMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Guid\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ByteString\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"XmlElementMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"XmlElement\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"NodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeIdMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExpandedNodeId\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCodeMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"StatusCode\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedNameMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"QualifiedName\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"LocalizedText\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObjectMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"ExtensionObject\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValueMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"DataValue\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Variant\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"EnumerationMatrix\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Dimensions\",\n                    \"type\": \"Int32Collection\"\n                  },\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"Enumeration\"\n                    }\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Important\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Boolean\"\n      ]\n    },\n    {\n      \"name\": \"Variance\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.Float\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/RawReversible/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeId\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_17\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Namespace\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Identifier\",\n              \"type\": [\n                {\n                  \"type\": \"record\",\n                  \"name\": \"UInt32\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_7\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                },\n                \"String\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Guid\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_14\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": {\n                        \"type\": \"string\",\n                        \"logicalType\": \"uuid\"\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"record\",\n                  \"name\": \"ByteString\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_15\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"bytes\"\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedText\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_21\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Locale\",\n              \"type\": \"String\"\n            },\n            {\n              \"name\": \"Text\",\n              \"type\": \"String\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdCollection\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": \"NodeId\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedTextCollection\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": \"LocalizedText\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.ByteString\"\n      ]\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.NodeId\"\n      ]\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataType\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_x95_8912\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Offset\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Int16\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_4\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"DaylightSavingInOffset\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Boolean\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_1\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"boolean\"\n                  }\n                ]\n              }\n            }\n          ],\n          \"uaDataTypeId\": \"i=8912\"\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.LocalizedText\"\n      ]\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"DateTime\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_13\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"long\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"UInt16\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_5\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.String\"\n      ]\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.NodeId\"\n      ]\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.DateTime\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/RawReversible/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"UInt32\",\n            \"namespace\": \"org.opcfoundation.UA\",\n            \"aliases\": [\n              \"org.opcfoundation.UA.i_7\"\n            ],\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Boolean\",\n            \"namespace\": \"org.opcfoundation.UA\",\n            \"aliases\": [\n              \"org.opcfoundation.UA.i_1\"\n            ],\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"boolean\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Int32\",\n            \"namespace\": \"org.opcfoundation.UA\",\n            \"aliases\": [\n              \"org.opcfoundation.UA.i_6\"\n            ],\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"Double\",\n            \"namespace\": \"org.opcfoundation.UA\",\n            \"aliases\": [\n              \"org.opcfoundation.UA.i_11\"\n            ],\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"double\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.Double\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.Double\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.Double\"\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.opcfoundation.UA.UInt32\"\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/RawReversible/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ByteString\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_15\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"bytes\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"LocalizedText\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_21\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Locale\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"String\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_12\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Text\",\n              \"type\": \"String\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": [\n        \"null\",\n        \"org.opcfoundation.UA.String\"\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataType\",\n          \"namespace\": \"org.opcfoundation.SimpleEvents\",\n          \"aliases\": [\n            \"org.opcfoundation.SimpleEvents.i_x95_183\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Name\",\n              \"type\": \"org.opcfoundation.UA.String\"\n            },\n            {\n              \"name\": \"Duration\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Double\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_11\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"double\"\n                  }\n                ]\n              }\n            }\n          ],\n          \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Single/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageType\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterName\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetWriterId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt16\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_5\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SequenceNumber\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt32\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_7\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MetaDataVersion\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"ConfigurationVersionDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14593\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"MajorVersion\",\n            \"type\": \"UInt32\"\n          },\n          {\n            \"name\": \"MinorVersion\",\n            \"type\": \"UInt32\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Timestamp\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DateTime\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_13\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Status\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"StatusCode\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_19\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"i_x61_2258\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.DateTime\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt32DataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.UInt32\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Boolean\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_1\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"Int32DataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Int32\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_6\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"DoubleDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"Double\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_11\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"double\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n            ]\n          },\n          {\n            \"name\": \"ns_x61_23_x59_i_x61_1259\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValue\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"Variant\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_24\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": [\n                            \"null\",\n                            \"Boolean\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"SByte\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_2\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Byte\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_3\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int16\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_4\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            \"UInt16\",\n                            \"Int32\",\n                            \"UInt32\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int64\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_8\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt64\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_23\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"int\",\n                                    {\n                                      \"type\": \"fixed\",\n                                      \"name\": \"ulong\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"size\": 8\n                                    }\n                                  ]\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Float\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_10\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"float\"\n                                }\n                              ]\n                            },\n                            \"Double\",\n                            \"String\",\n                            \"DateTime\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Guid\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_14\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"string\",\n                                    \"logicalType\": \"uuid\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ByteString\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_15\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"bytes\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"XmlElement\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_16\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"NodeId\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_17\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": \"String\"\n                                },\n                                {\n                                  \"name\": \"Identifier\",\n                                  \"type\": [\n                                    \"UInt32\",\n                                    \"String\",\n                                    \"Guid\",\n                                    \"ByteString\"\n                                  ]\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExpandedNodeId\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_18\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": \"String\"\n                                },\n                                {\n                                  \"name\": \"Identifier\",\n                                  \"type\": [\n                                    \"UInt32\",\n                                    \"String\",\n                                    \"Guid\",\n                                    \"ByteString\"\n                                  ]\n                                },\n                                {\n                                  \"name\": \"ServerUri\",\n                                  \"type\": \"String\"\n                                }\n                              ]\n                            },\n                            \"StatusCode\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"QualifiedName\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_20\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": \"String\"\n                                },\n                                {\n                                  \"name\": \"Name\",\n                                  \"type\": \"String\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"LocalizedText\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_21\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Locale\",\n                                  \"type\": \"String\"\n                                },\n                                {\n                                  \"name\": \"Text\",\n                                  \"type\": \"String\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExtensionObject\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_22\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EncodedDataType\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"TypeId\",\n                                          \"type\": \"NodeId\"\n                                        },\n                                        {\n                                          \"name\": \"Body\",\n                                          \"type\": \"ByteString\"\n                                        }\n                                      ]\n                                    }\n                                  ]\n                                }\n                              ]\n                            },\n                            \"DataValue\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Enumeration\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_29\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"BooleanCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Boolean\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"SByteCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"SByte\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int16Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int16\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt16Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt16\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int32Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int32\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt32Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt32\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int64Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int64\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt64Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt64\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"FloatCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Float\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DoubleCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Double\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"StringCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"String\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DateTimeCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"DateTime\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"GuidCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Guid\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ByteStringCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ByteString\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"XmlElementCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"XmlElement\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"NodeIdCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"NodeId\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExpandedNodeIdCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ExpandedNodeId\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCodeCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"StatusCode\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"QualifiedNameCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"QualifiedName\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"LocalizedTextCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"LocalizedText\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExtensionObjectCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ExtensionObject\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DataValueCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"DataValue\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"VariantCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Variant\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"EnumerationCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Enumeration\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"BooleanMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Boolean\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"SByteMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"SByte\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ByteMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Byte\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int16Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int16\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt16Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt16\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int32Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int32\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt32Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt32\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int64Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int64\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt64Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt64\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"FloatMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Float\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DoubleMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Double\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"StringMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"String\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DateTimeMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"DateTime\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"GuidMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Guid\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ByteStringMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ByteString\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"XmlElementMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"XmlElement\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"NodeIdMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"NodeId\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExpandedNodeIdMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ExpandedNodeId\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCodeMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"StatusCode\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"QualifiedNameMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"QualifiedName\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"LocalizedTextMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"LocalizedText\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExtensionObjectMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ExtensionObject\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DataValueMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"DataValue\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"VariantMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Variant\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"EnumerationMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Enumeration\"\n                                  }\n                                }\n                              ]\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"UInt16\"\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Single/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageType\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterName\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetWriterId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt16\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_5\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SequenceNumber\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt32\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_7\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MetaDataVersion\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"ConfigurationVersionDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14593\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"MajorVersion\",\n            \"type\": \"UInt32\"\n          },\n          {\n            \"name\": \"MinorVersion\",\n            \"type\": \"UInt32\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Timestamp\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DateTime\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_13\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Status\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"StatusCode\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_19\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"State\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"ServerStateDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"enum\",\n                        \"name\": \"ServerState\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_x95_852\"\n                        ],\n                        \"symbols\": [\n                          \"Running\",\n                          \"Failed\",\n                          \"NoConfiguration\",\n                          \"Suspended\",\n                          \"Shutdown\",\n                          \"Test\",\n                          \"CommunicationFault\",\n                          \"Unknown\"\n                        ],\n                        \"default\": \"Running\",\n                        \"uaDataTypeId\": \"i=852\"\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Single/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageType\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterName\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetWriterId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt16\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_5\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SequenceNumber\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt32\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_7\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MetaDataVersion\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"ConfigurationVersionDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14593\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"MajorVersion\",\n            \"type\": \"UInt32\"\n          },\n          {\n            \"name\": \"MinorVersion\",\n            \"type\": \"UInt32\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Timestamp\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DateTime\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_13\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Status\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"StatusCode\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_19\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"CurrentTime\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.DateTime\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"EngineeringUnits\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"StringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.String\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"AssetId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValue\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"Variant\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_24\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": [\n                            \"null\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Boolean\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_1\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"boolean\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"SByte\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_2\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Byte\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_3\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int16\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_4\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            \"UInt16\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int32\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_6\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            \"UInt32\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int64\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_8\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt64\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_23\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"int\",\n                                    {\n                                      \"type\": \"fixed\",\n                                      \"name\": \"ulong\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"size\": 8\n                                    }\n                                  ]\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Float\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_10\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"float\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Double\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_11\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"double\"\n                                }\n                              ]\n                            },\n                            \"String\",\n                            \"DateTime\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Guid\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_14\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"string\",\n                                    \"logicalType\": \"uuid\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ByteString\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_15\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"bytes\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"XmlElement\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_16\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"NodeId\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_17\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": \"String\"\n                                },\n                                {\n                                  \"name\": \"Identifier\",\n                                  \"type\": [\n                                    \"UInt32\",\n                                    \"String\",\n                                    \"Guid\",\n                                    \"ByteString\"\n                                  ]\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExpandedNodeId\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_18\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": \"String\"\n                                },\n                                {\n                                  \"name\": \"Identifier\",\n                                  \"type\": [\n                                    \"UInt32\",\n                                    \"String\",\n                                    \"Guid\",\n                                    \"ByteString\"\n                                  ]\n                                },\n                                {\n                                  \"name\": \"ServerUri\",\n                                  \"type\": \"String\"\n                                }\n                              ]\n                            },\n                            \"StatusCode\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"QualifiedName\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_20\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": \"String\"\n                                },\n                                {\n                                  \"name\": \"Name\",\n                                  \"type\": \"String\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"LocalizedText\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_21\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Locale\",\n                                  \"type\": \"String\"\n                                },\n                                {\n                                  \"name\": \"Text\",\n                                  \"type\": \"String\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExtensionObject\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_22\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"EncodedDataType\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"TypeId\",\n                                          \"type\": \"NodeId\"\n                                        },\n                                        {\n                                          \"name\": \"Body\",\n                                          \"type\": \"ByteString\"\n                                        }\n                                      ]\n                                    }\n                                  ]\n                                }\n                              ]\n                            },\n                            \"DataValue\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Enumeration\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_29\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"BooleanCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Boolean\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"SByteCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"SByte\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int16Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int16\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt16Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt16\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int32Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int32\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt32Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt32\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int64Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int64\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt64Collection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt64\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"FloatCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Float\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DoubleCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Double\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"StringCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"String\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DateTimeCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"DateTime\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"GuidCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Guid\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ByteStringCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ByteString\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"XmlElementCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"XmlElement\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"NodeIdCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"NodeId\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExpandedNodeIdCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ExpandedNodeId\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCodeCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"StatusCode\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"QualifiedNameCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"QualifiedName\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"LocalizedTextCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"LocalizedText\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExtensionObjectCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ExtensionObject\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DataValueCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"DataValue\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"VariantCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Variant\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"EnumerationCollection\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Enumeration\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"BooleanMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Boolean\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"SByteMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"SByte\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ByteMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Byte\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int16Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int16\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt16Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt16\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int32Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int32\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt32Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt32\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"Int64Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Int64\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"UInt64Matrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"UInt64\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"FloatMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Float\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DoubleMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Double\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"StringMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"String\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DateTimeMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"DateTime\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"GuidMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Guid\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ByteStringMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ByteString\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"XmlElementMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"XmlElement\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"NodeIdMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"NodeId\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExpandedNodeIdMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ExpandedNodeId\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCodeMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"StatusCode\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"QualifiedNameMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"QualifiedName\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"LocalizedTextMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"LocalizedText\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExtensionObjectMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"ExtensionObject\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DataValueMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"DataValue\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"VariantMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Variant\"\n                                  }\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"EnumerationMatrix\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Dimensions\",\n                                  \"type\": \"Int32Collection\"\n                                },\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": {\n                                    \"type\": \"array\",\n                                    \"items\": \"Enumeration\"\n                                  }\n                                }\n                              ]\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Important\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"BooleanDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.Boolean\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Variance\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"FloatDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.Float\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Single/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageType\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterName\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetWriterId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt16\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_5\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SequenceNumber\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt32\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_7\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MetaDataVersion\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"ConfigurationVersionDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14593\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"MajorVersion\",\n            \"type\": \"UInt32\"\n          },\n          {\n            \"name\": \"MinorVersion\",\n            \"type\": \"UInt32\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Timestamp\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DateTime\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_13\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Status\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"StatusCode\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_19\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"ConditionClassId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_17\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Identifier\",\n                            \"type\": [\n                              \"UInt32\",\n                              \"String\",\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"Guid\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_14\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Value\",\n                                    \"type\": {\n                                      \"type\": \"string\",\n                                      \"logicalType\": \"uuid\"\n                                    }\n                                  }\n                                ]\n                              },\n                              {\n                                \"type\": \"record\",\n                                \"name\": \"ByteString\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"aliases\": [\n                                  \"org.opcfoundation.UA.i_15\"\n                                ],\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Value\",\n                                    \"type\": \"bytes\"\n                                  }\n                                ]\n                              }\n                            ]\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"ConditionClassName\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedText\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_21\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Locale\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Text\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"ConditionSubClassId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdCollectionDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"NodeId\"\n                            }\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"ConditionSubClassName\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextCollectionDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedTextCollection\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"LocalizedText\"\n                            }\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"EventId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.ByteString\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"EventType\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n            ]\n          },\n          {\n            \"name\": \"LocalTime\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"TimeZoneDataTypeDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"TimeZoneDataType\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_x95_8912\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Offset\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Int16\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_4\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"DaylightSavingInOffset\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Boolean\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_1\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"boolean\"\n                                }\n                              ]\n                            }\n                          }\n                        ],\n                        \"uaDataTypeId\": \"i=8912\"\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Message\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.LocalizedTextDataValue\"\n            ]\n          },\n          {\n            \"name\": \"ReceiveTime\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"DateTimeDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.DateTime\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Severity\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"UInt16DataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.UInt16\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"SourceName\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"StringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.String\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"SourceNode\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n            ]\n          },\n          {\n            \"name\": \"Time\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.DateTimeDataValue\"\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Single/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSetMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"MessageType\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"String\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_12\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            }\n          ]\n        }\n      },\n      {\n        \"name\": \"DataSetWriterName\",\n        \"type\": \"org.opcfoundation.UA.String\"\n      },\n      {\n        \"name\": \"DataSetWriterId\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"UInt16\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_5\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"UInt32\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_7\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      },\n      {\n        \"name\": \"MetaDataVersion\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"ConfigurationVersionDataType\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_14593\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"MajorVersion\",\n              \"type\": \"UInt32\"\n            },\n            {\n              \"name\": \"MinorVersion\",\n              \"type\": \"UInt32\"\n            }\n          ]\n        }\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"DateTime\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_13\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"long\"\n            }\n          ]\n        }\n      },\n      {\n        \"name\": \"Status\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"StatusCode\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_19\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"long\"\n            }\n          ]\n        }\n      },\n      {\n        \"name\": \"Payload\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"DataSet\",\n          \"fields\": [\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"UInt32DataValue\",\n                  \"namespace\": \"org.github.microsoft.opc.publisher\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": [\n                        \"null\",\n                        \"org.opcfoundation.UA.UInt32\"\n                      ]\n                    },\n                    {\n                      \"name\": \"StatusCode\",\n                      \"type\": \"org.opcfoundation.UA.StatusCode\"\n                    },\n                    {\n                      \"name\": \"SourceTimestamp\",\n                      \"type\": \"org.opcfoundation.UA.DateTime\"\n                    },\n                    {\n                      \"name\": \"SourcePicoseconds\",\n                      \"type\": \"org.opcfoundation.UA.UInt16\"\n                    },\n                    {\n                      \"name\": \"ServerTimestamp\",\n                      \"type\": \"org.opcfoundation.UA.DateTime\"\n                    },\n                    {\n                      \"name\": \"ServerPicoseconds\",\n                      \"type\": \"org.opcfoundation.UA.UInt16\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"BooleanDataValue\",\n                  \"namespace\": \"org.github.microsoft.opc.publisher\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"Boolean\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_1\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"boolean\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"StatusCode\",\n                      \"type\": \"org.opcfoundation.UA.StatusCode\"\n                    },\n                    {\n                      \"name\": \"SourceTimestamp\",\n                      \"type\": \"org.opcfoundation.UA.DateTime\"\n                    },\n                    {\n                      \"name\": \"SourcePicoseconds\",\n                      \"type\": \"org.opcfoundation.UA.UInt16\"\n                    },\n                    {\n                      \"name\": \"ServerTimestamp\",\n                      \"type\": \"org.opcfoundation.UA.DateTime\"\n                    },\n                    {\n                      \"name\": \"ServerPicoseconds\",\n                      \"type\": \"org.opcfoundation.UA.UInt16\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"Int32DataValue\",\n                  \"namespace\": \"org.github.microsoft.opc.publisher\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"Int32\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_6\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"int\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"StatusCode\",\n                      \"type\": \"org.opcfoundation.UA.StatusCode\"\n                    },\n                    {\n                      \"name\": \"SourceTimestamp\",\n                      \"type\": \"org.opcfoundation.UA.DateTime\"\n                    },\n                    {\n                      \"name\": \"SourcePicoseconds\",\n                      \"type\": \"org.opcfoundation.UA.UInt16\"\n                    },\n                    {\n                      \"name\": \"ServerTimestamp\",\n                      \"type\": \"org.opcfoundation.UA.DateTime\"\n                    },\n                    {\n                      \"name\": \"ServerPicoseconds\",\n                      \"type\": \"org.opcfoundation.UA.UInt16\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"DoubleDataValue\",\n                  \"namespace\": \"org.github.microsoft.opc.publisher\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"Double\",\n                          \"namespace\": \"org.opcfoundation.UA\",\n                          \"aliases\": [\n                            \"org.opcfoundation.UA.i_11\"\n                          ],\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"double\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"StatusCode\",\n                      \"type\": \"org.opcfoundation.UA.StatusCode\"\n                    },\n                    {\n                      \"name\": \"SourceTimestamp\",\n                      \"type\": \"org.opcfoundation.UA.DateTime\"\n                    },\n                    {\n                      \"name\": \"SourcePicoseconds\",\n                      \"type\": \"org.opcfoundation.UA.UInt16\"\n                    },\n                    {\n                      \"name\": \"ServerTimestamp\",\n                      \"type\": \"org.opcfoundation.UA.DateTime\"\n                    },\n                    {\n                      \"name\": \"ServerPicoseconds\",\n                      \"type\": \"org.opcfoundation.UA.UInt16\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.DoubleDataValue\"\n              ]\n            }\n          ]\n        }\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSetMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"MessageType\",\n        \"type\": \"org.opcfoundation.UA.String\"\n      },\n      {\n        \"name\": \"DataSetWriterName\",\n        \"type\": \"org.opcfoundation.UA.String\"\n      },\n      {\n        \"name\": \"DataSetWriterId\",\n        \"type\": \"org.opcfoundation.UA.UInt16\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": \"org.opcfoundation.UA.UInt32\"\n      },\n      {\n        \"name\": \"MetaDataVersion\",\n        \"type\": \"org.opcfoundation.UA.ConfigurationVersionDataType\"\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": \"org.opcfoundation.UA.DateTime\"\n      },\n      {\n        \"name\": \"Status\",\n        \"type\": \"org.opcfoundation.UA.StatusCode\"\n      },\n      {\n        \"name\": \"Payload\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"DataSet1\",\n          \"fields\": [\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.UInt32DataValue\"\n              ]\n            }\n          ]\n        }\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/AvroSchema/Single/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageType\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"String\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_12\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DataSetWriterName\",\n      \"type\": \"org.opcfoundation.UA.String\"\n    },\n    {\n      \"name\": \"DataSetWriterId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt16\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_5\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SequenceNumber\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"UInt32\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_7\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MetaDataVersion\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"ConfigurationVersionDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14593\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"MajorVersion\",\n            \"type\": \"UInt32\"\n          },\n          {\n            \"name\": \"MinorVersion\",\n            \"type\": \"UInt32\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Timestamp\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DateTime\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_13\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Status\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"StatusCode\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_19\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": \"long\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"EventId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"ByteStringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ByteString\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_15\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"bytes\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Message\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedTextDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"LocalizedText\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_21\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Locale\",\n                            \"type\": \"String\"\n                          },\n                          {\n                            \"name\": \"Text\",\n                            \"type\": \"String\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"StringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"org.opcfoundation.UA.String\"\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"CycleStepDataTypeDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"CycleStepDataType\",\n                        \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                        \"aliases\": [\n                          \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Name\",\n                            \"type\": \"org.opcfoundation.UA.String\"\n                          },\n                          {\n                            \"name\": \"Duration\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Double\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_11\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"double\"\n                                }\n                              ]\n                            }\n                          }\n                        ],\n                        \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"StatusCode\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"org.opcfoundation.UA.DateTime\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"org.opcfoundation.UA.UInt16\"\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Default/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"intDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"booleanDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"boolean\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"doubleDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"double\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Default/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"State\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"ServerStateDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"enum\",\n                \"name\": \"ServerState\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_x95_852\"\n                ],\n                \"symbols\": [\n                  \"Running\",\n                  \"Failed\",\n                  \"NoConfiguration\",\n                  \"Suspended\",\n                  \"Shutdown\",\n                  \"Test\",\n                  \"CommunicationFault\",\n                  \"Unknown\"\n                ],\n                \"default\": \"Running\",\n                \"uaDataTypeId\": \"i=852\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Default/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"CurrentTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EngineeringUnits\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"AssetId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"VariantDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"Variant\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_24\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": [\n                      \"null\",\n                      \"boolean\",\n                      \"int\",\n                      \"string\",\n                      \"float\",\n                      \"double\",\n                      \"bytes\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_17\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"IdType\",\n                            \"type\": {\n                              \"type\": \"enum\",\n                              \"name\": \"IdentifierType\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"symbols\": [\n                                \"UInt32\",\n                                \"String\",\n                                \"Guid\",\n                                \"ByteString\"\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"Id\",\n                            \"type\": [\n                              \"int\",\n                              \"string\",\n                              \"bytes\"\n                            ]\n                          },\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExpandedNodeId\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_18\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"IdType\",\n                            \"type\": \"IdentifierType\"\n                          },\n                          {\n                            \"name\": \"Id\",\n                            \"type\": [\n                              \"int\",\n                              \"string\",\n                              \"bytes\"\n                            ]\n                          },\n                          {\n                            \"name\": \"Namespace\",\n                            \"type\": [\n                              \"int\",\n                              \"string\"\n                            ]\n                          },\n                          {\n                            \"name\": \"ServerUri\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      \"StatusCode\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"QualifiedName\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_20\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Name\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"Uri\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ExtensionObject\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_22\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"TypeId\",\n                            \"type\": \"NodeId\"\n                          },\n                          {\n                            \"name\": \"Encoding\",\n                            \"type\": {\n                              \"type\": \"enum\",\n                              \"name\": \"Encoding\",\n                              \"symbols\": [\n                                \"Structure\",\n                                \"ByteString\",\n                                \"XmlElement\"\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"Body\",\n                            \"type\": [\n                              \"null\",\n                              \"string\",\n                              \"bytes\"\n                            ]\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"DataValue\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"aliases\": [\n                          \"org.opcfoundation.UA.i_23\"\n                        ],\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"Variant\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoSeconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoSeconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"array\",\n                        \"items\": \"boolean\"\n                      }\n                    ]\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Important\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"booleanDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"boolean\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Variance\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"floatDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"float\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Default/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"IdType\",\n                    \"type\": {\n                      \"type\": \"enum\",\n                      \"name\": \"IdentifierType\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"symbols\": [\n                        \"UInt32\",\n                        \"String\",\n                        \"Guid\",\n                        \"ByteString\"\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Id\",\n                    \"type\": [\n                      \"int\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"arrayDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": \"org.opcfoundation.UA.NodeId\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.arrayDataValue\"\n      ]\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"bytesDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"bytes\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataTypeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"TimeZoneDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_x95_8912\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Offset\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"DaylightSavingInOffset\",\n                    \"type\": \"boolean\"\n                  }\n                ],\n                \"uaDataTypeId\": \"i=8912\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"intDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Default/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"intDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"booleanDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"boolean\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"doubleDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"double\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.doubleDataValue\"\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Default/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"bytesDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"bytes\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataTypeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"CycleStepDataType\",\n                \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                \"aliases\": [\n                  \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Duration\",\n                    \"type\": \"double\"\n                  }\n                ],\n                \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Multiple/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"i_x61_2258\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"stringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"intDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"booleanDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"doubleDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"double\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.doubleDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.doubleDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.intDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.doubleDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ns_x61_23_x59_i_x61_1259\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.stringDataValue\"\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Multiple/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"State\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ServerStateDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"enum\",\n                              \"name\": \"ServerState\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_x95_852\"\n                              ],\n                              \"symbols\": [\n                                \"Running\",\n                                \"Failed\",\n                                \"NoConfiguration\",\n                                \"Suspended\",\n                                \"Shutdown\",\n                                \"Test\",\n                                \"CommunicationFault\",\n                                \"Unknown\"\n                              ],\n                              \"default\": \"Running\",\n                              \"uaDataTypeId\": \"i=852\"\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Multiple/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"CurrentTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"stringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EngineeringUnits\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.stringDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"AssetId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Variant\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_24\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"null\",\n                                    \"boolean\",\n                                    \"int\",\n                                    \"string\",\n                                    \"float\",\n                                    \"double\",\n                                    \"bytes\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_17\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"IdType\",\n                                          \"type\": {\n                                            \"type\": \"enum\",\n                                            \"name\": \"IdentifierType\",\n                                            \"namespace\": \"org.opcfoundation.UA\",\n                                            \"symbols\": [\n                                              \"UInt32\",\n                                              \"String\",\n                                              \"Guid\",\n                                              \"ByteString\"\n                                            ]\n                                          }\n                                        },\n                                        {\n                                          \"name\": \"Id\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_18\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"IdType\",\n                                          \"type\": \"IdentifierType\"\n                                        },\n                                        {\n                                          \"name\": \"Id\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"ServerUri\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    \"StatusCode\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedName\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_20\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Name\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"Uri\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObject\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_22\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"TypeId\",\n                                          \"type\": \"NodeId\"\n                                        },\n                                        {\n                                          \"name\": \"Encoding\",\n                                          \"type\": {\n                                            \"type\": \"enum\",\n                                            \"name\": \"Encoding\",\n                                            \"symbols\": [\n                                              \"Structure\",\n                                              \"ByteString\",\n                                              \"XmlElement\"\n                                            ]\n                                          }\n                                        },\n                                        {\n                                          \"name\": \"Body\",\n                                          \"type\": [\n                                            \"null\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValue\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_23\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"Variant\"\n                                        },\n                                        {\n                                          \"name\": \"Status\",\n                                          \"type\": \"StatusCode\"\n                                        },\n                                        {\n                                          \"name\": \"SourceTimestamp\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"SourcePicoSeconds\",\n                                          \"type\": \"int\"\n                                        },\n                                        {\n                                          \"name\": \"ServerTimestamp\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"ServerPicoSeconds\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"array\",\n                                      \"items\": \"boolean\"\n                                    }\n                                  ]\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Important\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"booleanDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Variance\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"floatDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"float\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Multiple/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"ConditionClassId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"NodeIdDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"NodeId\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_17\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"IdType\",\n                                  \"type\": {\n                                    \"type\": \"enum\",\n                                    \"name\": \"IdentifierType\",\n                                    \"namespace\": \"org.opcfoundation.UA\",\n                                    \"symbols\": [\n                                      \"UInt32\",\n                                      \"String\",\n                                      \"Guid\",\n                                      \"ByteString\"\n                                    ]\n                                  }\n                                },\n                                {\n                                  \"name\": \"Id\",\n                                  \"type\": [\n                                    \"int\",\n                                    \"string\",\n                                    \"bytes\"\n                                  ]\n                                },\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"ConditionClassName\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"stringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"ConditionSubClassId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"arrayDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"array\",\n                              \"items\": \"org.opcfoundation.UA.NodeId\"\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"ConditionSubClassName\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.arrayDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"EventId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"bytesDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"bytes\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EventType\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"LocalTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"TimeZoneDataTypeDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"TimeZoneDataType\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_x95_8912\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Offset\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"DaylightSavingInOffset\",\n                                  \"type\": \"boolean\"\n                                }\n                              ],\n                              \"uaDataTypeId\": \"i=8912\"\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Message\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.stringDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ReceiveTime\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.stringDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Severity\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"intDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"SourceName\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.stringDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"SourceNode\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Time\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.stringDataValue\"\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Multiple/PlcSimulation.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": [\n          {\n            \"type\": \"record\",\n            \"name\": \"DataSetMessage\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Payload\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"DataSet\",\n                  \"fields\": [\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"intDataValue\",\n                          \"namespace\": \"org.github.microsoft.opc.publisher\",\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"int\"\n                            },\n                            {\n                              \"name\": \"Status\",\n                              \"type\": {\n                                \"type\": \"record\",\n                                \"name\": \"StatusCode\",\n                                \"namespace\": \"org.opcfoundation.UA\",\n                                \"fields\": [\n                                  {\n                                    \"name\": \"Code\",\n                                    \"type\": \"int\"\n                                  },\n                                  {\n                                    \"name\": \"Symbol\",\n                                    \"type\": \"string\"\n                                  }\n                                ]\n                              }\n                            },\n                            {\n                              \"name\": \"SourceTimestamp\",\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"name\": \"SourcePicoseconds\",\n                              \"type\": \"int\"\n                            },\n                            {\n                              \"name\": \"ServerTimestamp\",\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"name\": \"ServerPicoseconds\",\n                              \"type\": \"int\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"booleanDataValue\",\n                          \"namespace\": \"org.github.microsoft.opc.publisher\",\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"boolean\"\n                            },\n                            {\n                              \"name\": \"Status\",\n                              \"type\": \"org.opcfoundation.UA.StatusCode\"\n                            },\n                            {\n                              \"name\": \"SourceTimestamp\",\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"name\": \"SourcePicoseconds\",\n                              \"type\": \"int\"\n                            },\n                            {\n                              \"name\": \"ServerTimestamp\",\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"name\": \"ServerPicoseconds\",\n                              \"type\": \"int\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n                      \"type\": [\n                        \"null\",\n                        {\n                          \"type\": \"record\",\n                          \"name\": \"doubleDataValue\",\n                          \"namespace\": \"org.github.microsoft.opc.publisher\",\n                          \"fields\": [\n                            {\n                              \"name\": \"Value\",\n                              \"type\": \"double\"\n                            },\n                            {\n                              \"name\": \"Status\",\n                              \"type\": \"org.opcfoundation.UA.StatusCode\"\n                            },\n                            {\n                              \"name\": \"SourceTimestamp\",\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"name\": \"SourcePicoseconds\",\n                              \"type\": \"int\"\n                            },\n                            {\n                              \"name\": \"ServerTimestamp\",\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"name\": \"ServerPicoseconds\",\n                              \"type\": \"int\"\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n                      ]\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"record\",\n            \"name\": \"DataSetMessage1\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Payload\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"DataSet1\",\n                  \"fields\": [\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    },\n                    {\n                      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n                      \"type\": [\n                        \"null\",\n                        \"org.github.microsoft.opc.publisher.intDataValue\"\n                      ]\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Multiple/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"EventId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"bytesDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"bytes\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Message\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"stringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.stringDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"CycleStepDataTypeDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"CycleStepDataType\",\n                              \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                              \"aliases\": [\n                                \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Name\",\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"name\": \"Duration\",\n                                  \"type\": \"double\"\n                                }\n                              ],\n                              \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessage/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"intDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"booleanDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"boolean\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"doubleDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"double\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.stringDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessage/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"com.microsoft\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"PublisherId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetClassId\",\n      \"type\": {\n        \"type\": \"string\",\n        \"logicalType\": \"uuid\"\n      }\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"State\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ServerStateDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"enum\",\n                              \"name\": \"ServerState\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_x95_852\"\n                              ],\n                              \"symbols\": [\n                                \"Running\",\n                                \"Failed\",\n                                \"NoConfiguration\",\n                                \"Suspended\",\n                                \"Shutdown\",\n                                \"Test\",\n                                \"CommunicationFault\",\n                                \"Unknown\"\n                              ],\n                              \"default\": \"Running\",\n                              \"uaDataTypeId\": \"i=852\"\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessage/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"com.microsoft\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"PublisherId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetClassId\",\n      \"type\": {\n        \"type\": \"string\",\n        \"logicalType\": \"uuid\"\n      }\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"CurrentTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"stringDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EngineeringUnits\",\n                    \"type\": [\n                      \"null\",\n                      \"com.microsoft.stringDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"AssetId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Variant\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_24\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"null\",\n                                    \"boolean\",\n                                    \"int\",\n                                    \"string\",\n                                    \"float\",\n                                    \"double\",\n                                    \"bytes\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_17\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"IdType\",\n                                          \"type\": {\n                                            \"type\": \"enum\",\n                                            \"name\": \"IdentifierType\",\n                                            \"namespace\": \"org.opcfoundation.UA\",\n                                            \"symbols\": [\n                                              \"UInt32\",\n                                              \"String\",\n                                              \"Guid\",\n                                              \"ByteString\"\n                                            ]\n                                          }\n                                        },\n                                        {\n                                          \"name\": \"Id\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_18\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"IdType\",\n                                          \"type\": \"IdentifierType\"\n                                        },\n                                        {\n                                          \"name\": \"Id\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"ServerUri\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    \"StatusCode\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedName\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_20\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Name\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"Uri\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObject\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_22\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"TypeId\",\n                                          \"type\": \"NodeId\"\n                                        },\n                                        {\n                                          \"name\": \"Encoding\",\n                                          \"type\": {\n                                            \"type\": \"enum\",\n                                            \"name\": \"Encoding\",\n                                            \"symbols\": [\n                                              \"Structure\",\n                                              \"ByteString\",\n                                              \"XmlElement\"\n                                            ]\n                                          }\n                                        },\n                                        {\n                                          \"name\": \"Body\",\n                                          \"type\": [\n                                            \"null\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValue\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_23\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"Variant\"\n                                        },\n                                        {\n                                          \"name\": \"Status\",\n                                          \"type\": \"StatusCode\"\n                                        },\n                                        {\n                                          \"name\": \"SourceTimestamp\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"SourcePicoSeconds\",\n                                          \"type\": \"int\"\n                                        },\n                                        {\n                                          \"name\": \"ServerTimestamp\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"ServerPicoSeconds\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"array\",\n                                      \"items\": \"boolean\"\n                                    }\n                                  ]\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Important\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"booleanDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Variance\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"floatDataValue\",\n                        \"namespace\": \"com.microsoft\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"float\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessage/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"IdType\",\n                    \"type\": {\n                      \"type\": \"enum\",\n                      \"name\": \"IdentifierType\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"symbols\": [\n                        \"UInt32\",\n                        \"String\",\n                        \"Guid\",\n                        \"ByteString\"\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Id\",\n                    \"type\": [\n                      \"int\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"arrayDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": \"org.opcfoundation.UA.NodeId\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.arrayDataValue\"\n      ]\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"bytesDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"bytes\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataTypeDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"TimeZoneDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_x95_8912\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Offset\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"DaylightSavingInOffset\",\n                    \"type\": \"boolean\"\n                  }\n                ],\n                \"uaDataTypeId\": \"i=8912\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"intDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.stringDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessage/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"intDataValue\",\n            \"namespace\": \"com.microsoft\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"booleanDataValue\",\n            \"namespace\": \"com.microsoft\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"boolean\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"doubleDataValue\",\n            \"namespace\": \"com.microsoft\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"double\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.doubleDataValue\"\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"com.microsoft.intDataValue\"\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessage/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"bytesDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"bytes\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": [\n        \"null\",\n        \"com.microsoft.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataTypeDataValue\",\n          \"namespace\": \"com.microsoft\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"CycleStepDataType\",\n                \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                \"aliases\": [\n                  \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Duration\",\n                    \"type\": \"double\"\n                  }\n                ],\n                \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessageDefault/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"intDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"booleanDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"boolean\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"doubleDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"double\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.intDataValue\"\n      ]\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.doubleDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessageDefault/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"PublisherId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetClassId\",\n      \"type\": {\n        \"type\": \"string\",\n        \"logicalType\": \"uuid\"\n      }\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"State\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"ServerStateDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"enum\",\n                              \"name\": \"ServerState\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_x95_852\"\n                              ],\n                              \"symbols\": [\n                                \"Running\",\n                                \"Failed\",\n                                \"NoConfiguration\",\n                                \"Suspended\",\n                                \"Shutdown\",\n                                \"Test\",\n                                \"CommunicationFault\",\n                                \"Unknown\"\n                              ],\n                              \"default\": \"Running\",\n                              \"uaDataTypeId\": \"i=852\"\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessageDefault/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"NetworkMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MessageId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"PublisherId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetClassId\",\n      \"type\": {\n        \"type\": \"string\",\n        \"logicalType\": \"uuid\"\n      }\n    },\n    {\n      \"name\": \"DataSetWriterGroup\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Messages\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"record\",\n          \"name\": \"DataSetMessage\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"MetaDataVersion\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"ConfigurationVersionDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_14593\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"MajorVersion\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"MinorVersion\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"MessageType\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"DataSetWriterName\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Payload\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"DataSet\",\n                \"fields\": [\n                  {\n                    \"name\": \"CurrentTime\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"stringDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"StatusCode\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"fields\": [\n                                {\n                                  \"name\": \"Code\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"Symbol\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"EngineeringUnits\",\n                    \"type\": [\n                      \"null\",\n                      \"org.github.microsoft.opc.publisher.stringDataValue\"\n                    ]\n                  },\n                  {\n                    \"name\": \"AssetId\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"VariantDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": {\n                              \"type\": \"record\",\n                              \"name\": \"Variant\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_24\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": [\n                                    \"null\",\n                                    \"boolean\",\n                                    \"int\",\n                                    \"string\",\n                                    \"float\",\n                                    \"double\",\n                                    \"bytes\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"NodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_17\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"IdType\",\n                                          \"type\": {\n                                            \"type\": \"enum\",\n                                            \"name\": \"IdentifierType\",\n                                            \"namespace\": \"org.opcfoundation.UA\",\n                                            \"symbols\": [\n                                              \"UInt32\",\n                                              \"String\",\n                                              \"Guid\",\n                                              \"ByteString\"\n                                            ]\n                                          }\n                                        },\n                                        {\n                                          \"name\": \"Id\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExpandedNodeId\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_18\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"IdType\",\n                                          \"type\": \"IdentifierType\"\n                                        },\n                                        {\n                                          \"name\": \"Id\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"Namespace\",\n                                          \"type\": [\n                                            \"int\",\n                                            \"string\"\n                                          ]\n                                        },\n                                        {\n                                          \"name\": \"ServerUri\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    \"StatusCode\",\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"QualifiedName\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_20\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Name\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"Uri\",\n                                          \"type\": \"string\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"ExtensionObject\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_22\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"TypeId\",\n                                          \"type\": \"NodeId\"\n                                        },\n                                        {\n                                          \"name\": \"Encoding\",\n                                          \"type\": {\n                                            \"type\": \"enum\",\n                                            \"name\": \"Encoding\",\n                                            \"symbols\": [\n                                              \"Structure\",\n                                              \"ByteString\",\n                                              \"XmlElement\"\n                                            ]\n                                          }\n                                        },\n                                        {\n                                          \"name\": \"Body\",\n                                          \"type\": [\n                                            \"null\",\n                                            \"string\",\n                                            \"bytes\"\n                                          ]\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"record\",\n                                      \"name\": \"DataValue\",\n                                      \"namespace\": \"org.opcfoundation.UA\",\n                                      \"aliases\": [\n                                        \"org.opcfoundation.UA.i_23\"\n                                      ],\n                                      \"fields\": [\n                                        {\n                                          \"name\": \"Value\",\n                                          \"type\": \"Variant\"\n                                        },\n                                        {\n                                          \"name\": \"Status\",\n                                          \"type\": \"StatusCode\"\n                                        },\n                                        {\n                                          \"name\": \"SourceTimestamp\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"SourcePicoSeconds\",\n                                          \"type\": \"int\"\n                                        },\n                                        {\n                                          \"name\": \"ServerTimestamp\",\n                                          \"type\": \"string\"\n                                        },\n                                        {\n                                          \"name\": \"ServerPicoSeconds\",\n                                          \"type\": \"int\"\n                                        }\n                                      ]\n                                    },\n                                    {\n                                      \"type\": \"array\",\n                                      \"items\": \"boolean\"\n                                    }\n                                  ]\n                                }\n                              ]\n                            }\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Important\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"booleanDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"boolean\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  },\n                  {\n                    \"name\": \"Variance\",\n                    \"type\": [\n                      \"null\",\n                      {\n                        \"type\": \"record\",\n                        \"name\": \"floatDataValue\",\n                        \"namespace\": \"org.github.microsoft.opc.publisher\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Value\",\n                            \"type\": \"float\"\n                          },\n                          {\n                            \"name\": \"Status\",\n                            \"type\": \"org.opcfoundation.UA.StatusCode\"\n                          },\n                          {\n                            \"name\": \"SourceTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"SourcePicoseconds\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"ServerTimestamp\",\n                            \"type\": \"string\"\n                          },\n                          {\n                            \"name\": \"ServerPicoseconds\",\n                            \"type\": \"int\"\n                          }\n                        ]\n                      }\n                    ]\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessageDefault/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"NodeIdDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"IdType\",\n                    \"type\": {\n                      \"type\": \"enum\",\n                      \"name\": \"IdentifierType\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"symbols\": [\n                        \"UInt32\",\n                        \"String\",\n                        \"Guid\",\n                        \"ByteString\"\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Id\",\n                    \"type\": [\n                      \"int\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"arrayDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"array\",\n                \"items\": \"org.opcfoundation.UA.NodeId\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.arrayDataValue\"\n      ]\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"bytesDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"bytes\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataTypeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"TimeZoneDataType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_x95_8912\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Offset\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"DaylightSavingInOffset\",\n                    \"type\": \"boolean\"\n                  }\n                ],\n                \"uaDataTypeId\": \"i=8912\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"intDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n      ]\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessageDefault/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"intDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"booleanDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"boolean\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"doubleDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"double\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.doubleDataValue\"\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": [\n          \"null\",\n          \"org.github.microsoft.opc.publisher.intDataValue\"\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/NetworkMessageDefault/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"bytesDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"bytes\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              }\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"stringDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": [\n        \"null\",\n        \"org.github.microsoft.opc.publisher.stringDataValue\"\n      ]\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": [\n        \"null\",\n        {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataTypeDataValue\",\n          \"namespace\": \"org.github.microsoft.opc.publisher\",\n          \"fields\": [\n            {\n              \"name\": \"Value\",\n              \"type\": {\n                \"type\": \"record\",\n                \"name\": \"CycleStepDataType\",\n                \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                \"aliases\": [\n                  \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Duration\",\n                    \"type\": \"double\"\n                  }\n                ],\n                \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n              }\n            },\n            {\n              \"name\": \"Status\",\n              \"type\": \"org.opcfoundation.UA.StatusCode\"\n            },\n            {\n              \"name\": \"SourceTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"SourcePicoseconds\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"ServerTimestamp\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"ServerPicoseconds\",\n              \"type\": \"int\"\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Raw/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": \"boolean\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": \"double\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": \"double\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": \"double\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": \"double\"\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": \"string\"\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Raw/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"State\",\n      \"type\": {\n        \"type\": \"enum\",\n        \"name\": \"ServerState\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_x95_852\"\n        ],\n        \"symbols\": [\n          \"Running\",\n          \"Failed\",\n          \"NoConfiguration\",\n          \"Suspended\",\n          \"Shutdown\",\n          \"Test\",\n          \"CommunicationFault\",\n          \"Unknown\"\n        ],\n        \"default\": \"Running\",\n        \"uaDataTypeId\": \"i=852\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Raw/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"CurrentTime\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"EngineeringUnits\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"AssetId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Variant\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_24\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": [\n              \"null\",\n              \"boolean\",\n              \"int\",\n              \"string\",\n              \"float\",\n              \"double\",\n              \"bytes\",\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"IdType\",\n                    \"type\": {\n                      \"type\": \"enum\",\n                      \"name\": \"IdentifierType\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"symbols\": [\n                        \"UInt32\",\n                        \"String\",\n                        \"Guid\",\n                        \"ByteString\"\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Id\",\n                    \"type\": [\n                      \"int\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_18\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"IdType\",\n                    \"type\": \"IdentifierType\"\n                  },\n                  {\n                    \"name\": \"Id\",\n                    \"type\": [\n                      \"int\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": [\n                      \"int\",\n                      \"string\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ServerUri\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"StatusCode\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"fields\": [\n                  {\n                    \"name\": \"Code\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Symbol\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedName\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_20\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Uri\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObject\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_22\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"TypeId\",\n                    \"type\": \"NodeId\"\n                  },\n                  {\n                    \"name\": \"Encoding\",\n                    \"type\": {\n                      \"type\": \"enum\",\n                      \"name\": \"Encoding\",\n                      \"symbols\": [\n                        \"Structure\",\n                        \"ByteString\",\n                        \"XmlElement\"\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Body\",\n                    \"type\": [\n                      \"null\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValue\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"Variant\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoSeconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoSeconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"array\",\n                \"items\": \"boolean\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Important\",\n      \"type\": \"boolean\"\n    },\n    {\n      \"name\": \"Variance\",\n      \"type\": \"float\"\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Raw/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"NodeId\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_17\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"IdType\",\n            \"type\": {\n              \"type\": \"enum\",\n              \"name\": \"IdentifierType\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"symbols\": [\n                \"UInt32\",\n                \"String\",\n                \"Guid\",\n                \"ByteString\"\n              ]\n            }\n          },\n          {\n            \"name\": \"Id\",\n            \"type\": [\n              \"int\",\n              \"string\",\n              \"bytes\"\n            ]\n          },\n          {\n            \"name\": \"Namespace\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": \"org.opcfoundation.UA.NodeId\"\n      }\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": \"string\"\n      }\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": \"bytes\"\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": \"org.opcfoundation.UA.NodeId\"\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"TimeZoneDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_x95_8912\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Offset\",\n            \"type\": \"int\"\n          },\n          {\n            \"name\": \"DaylightSavingInOffset\",\n            \"type\": \"boolean\"\n          }\n        ],\n        \"uaDataTypeId\": \"i=8912\"\n      }\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": \"org.opcfoundation.UA.NodeId\"\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": \"string\"\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Raw/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": \"boolean\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": \"double\"\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": \"int\"\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Raw/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": \"bytes\"\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"CycleStepDataType\",\n        \"namespace\": \"org.opcfoundation.SimpleEvents\",\n        \"aliases\": [\n          \"org.opcfoundation.SimpleEvents.i_x95_183\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Name\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"Duration\",\n            \"type\": \"double\"\n          }\n        ],\n        \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/RawReversible/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"i_x61_2258\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n      \"type\": \"boolean\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n      \"type\": \"double\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n      \"type\": \"double\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n      \"type\": \"double\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n      \"type\": \"double\"\n    },\n    {\n      \"name\": \"ns_x61_23_x59_i_x61_1259\",\n      \"type\": \"string\"\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/RawReversible/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"State\",\n      \"type\": {\n        \"type\": \"enum\",\n        \"name\": \"ServerState\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_x95_852\"\n        ],\n        \"symbols\": [\n          \"Running\",\n          \"Failed\",\n          \"NoConfiguration\",\n          \"Suspended\",\n          \"Shutdown\",\n          \"Test\",\n          \"CommunicationFault\",\n          \"Unknown\"\n        ],\n        \"default\": \"Running\",\n        \"uaDataTypeId\": \"i=852\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/RawReversible/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"CurrentTime\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"EngineeringUnits\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"AssetId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"Variant\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_24\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Value\",\n            \"type\": [\n              \"null\",\n              \"boolean\",\n              \"int\",\n              \"string\",\n              \"float\",\n              \"double\",\n              \"bytes\",\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_17\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"IdType\",\n                    \"type\": {\n                      \"type\": \"enum\",\n                      \"name\": \"IdentifierType\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"symbols\": [\n                        \"UInt32\",\n                        \"String\",\n                        \"Guid\",\n                        \"ByteString\"\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Id\",\n                    \"type\": [\n                      \"int\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExpandedNodeId\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_18\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"IdType\",\n                    \"type\": \"IdentifierType\"\n                  },\n                  {\n                    \"name\": \"Id\",\n                    \"type\": [\n                      \"int\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  },\n                  {\n                    \"name\": \"Namespace\",\n                    \"type\": [\n                      \"int\",\n                      \"string\"\n                    ]\n                  },\n                  {\n                    \"name\": \"ServerUri\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"QualifiedName\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_20\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Name\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Uri\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"LocalizedText\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_21\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Locale\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Text\",\n                    \"type\": \"string\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"ExtensionObject\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_22\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"TypeId\",\n                    \"type\": \"NodeId\"\n                  },\n                  {\n                    \"name\": \"Encoding\",\n                    \"type\": {\n                      \"type\": \"enum\",\n                      \"name\": \"Encoding\",\n                      \"symbols\": [\n                        \"Structure\",\n                        \"ByteString\",\n                        \"XmlElement\"\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Body\",\n                    \"type\": [\n                      \"null\",\n                      \"string\",\n                      \"bytes\"\n                    ]\n                  }\n                ]\n              },\n              {\n                \"type\": \"record\",\n                \"name\": \"DataValue\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"aliases\": [\n                  \"org.opcfoundation.UA.i_23\"\n                ],\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"Variant\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoSeconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoSeconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"array\",\n                \"items\": \"boolean\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Important\",\n      \"type\": \"boolean\"\n    },\n    {\n      \"name\": \"Variance\",\n      \"type\": \"float\"\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/RawReversible/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"ConditionClassId\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"NodeId\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_17\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"IdType\",\n            \"type\": {\n              \"type\": \"enum\",\n              \"name\": \"IdentifierType\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"symbols\": [\n                \"UInt32\",\n                \"String\",\n                \"Guid\",\n                \"ByteString\"\n              ]\n            }\n          },\n          {\n            \"name\": \"Id\",\n            \"type\": [\n              \"int\",\n              \"string\",\n              \"bytes\"\n            ]\n          },\n          {\n            \"name\": \"Namespace\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ConditionClassName\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"LocalizedText\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_21\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Locale\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"Text\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ConditionSubClassId\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": \"org.opcfoundation.UA.NodeId\"\n      }\n    },\n    {\n      \"name\": \"ConditionSubClassName\",\n      \"type\": {\n        \"type\": \"array\",\n        \"items\": \"org.opcfoundation.UA.LocalizedText\"\n      }\n    },\n    {\n      \"name\": \"EventId\",\n      \"type\": \"bytes\"\n    },\n    {\n      \"name\": \"EventType\",\n      \"type\": \"org.opcfoundation.UA.NodeId\"\n    },\n    {\n      \"name\": \"LocalTime\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"TimeZoneDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_x95_8912\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Offset\",\n            \"type\": \"int\"\n          },\n          {\n            \"name\": \"DaylightSavingInOffset\",\n            \"type\": \"boolean\"\n          }\n        ],\n        \"uaDataTypeId\": \"i=8912\"\n      }\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": \"org.opcfoundation.UA.LocalizedText\"\n    },\n    {\n      \"name\": \"ReceiveTime\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Severity\",\n      \"type\": \"int\"\n    },\n    {\n      \"name\": \"SourceName\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"SourceNode\",\n      \"type\": \"org.opcfoundation.UA.NodeId\"\n    },\n    {\n      \"name\": \"Time\",\n      \"type\": \"string\"\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/RawReversible/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n        \"type\": \"boolean\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n        \"type\": \"double\"\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSet1\",\n    \"fields\": [\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n        \"type\": \"int\"\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/RawReversible/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSet\",\n  \"fields\": [\n    {\n      \"name\": \"EventId\",\n      \"type\": \"bytes\"\n    },\n    {\n      \"name\": \"Message\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"LocalizedText\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_21\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Locale\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"Text\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"CycleStepDataType\",\n        \"namespace\": \"org.opcfoundation.SimpleEvents\",\n        \"aliases\": [\n          \"org.opcfoundation.SimpleEvents.i_x95_183\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"Name\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"Duration\",\n            \"type\": \"double\"\n          }\n        ],\n        \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Samples/CyclicReads.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"stringDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    \"StatusCode\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"intDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"booleanDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"boolean\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage4\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage5\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"doubleDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"double\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage6\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage7\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage8\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage9\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage10\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage11\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage12\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage13\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage14\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage15\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage16\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage17\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage18\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage19\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage20\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage21\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage22\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage23\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"stringDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Samples/KeepAlive.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"ServerStateDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": {\n                  \"type\": \"enum\",\n                  \"name\": \"ServerState\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_x95_852\"\n                  ],\n                  \"symbols\": [\n                    \"Running\",\n                    \"Failed\",\n                    \"NoConfiguration\",\n                    \"Suspended\",\n                    \"Shutdown\",\n                    \"Test\",\n                    \"CommunicationFault\",\n                    \"Unknown\"\n                  ],\n                  \"default\": \"Running\",\n                  \"uaDataTypeId\": \"i=852\"\n                }\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    \"StatusCode\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Samples/KeyFrames.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"stringDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    \"StatusCode\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"stringDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"VariantDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"org.opcfoundation.UA.Variant\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"booleanDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"boolean\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage4\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"floatDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"float\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Samples/PendingAlarms.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"NodeIdDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"NodeId\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_17\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"IdType\",\n                      \"type\": {\n                        \"type\": \"enum\",\n                        \"name\": \"IdentifierType\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"symbols\": [\n                          \"UInt32\",\n                          \"String\",\n                          \"Guid\",\n                          \"ByteString\"\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"Id\",\n                      \"type\": [\n                        \"int\",\n                        \"string\",\n                        \"bytes\"\n                      ]\n                    },\n                    {\n                      \"name\": \"Namespace\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    \"NodeId\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    \"StatusCode\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"stringDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"arrayDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": {\n                  \"type\": \"array\",\n                  \"items\": \"org.opcfoundation.UA.NodeId\"\n                }\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"arrayDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage4\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"bytesDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"bytes\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage5\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"NodeIdDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage6\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"TimeZoneDataTypeDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"TimeZoneDataType\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"aliases\": [\n                    \"org.opcfoundation.UA.i_x95_8912\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Offset\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"DaylightSavingInOffset\",\n                      \"type\": \"boolean\"\n                    }\n                  ],\n                  \"uaDataTypeId\": \"i=8912\"\n                }\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage7\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"stringDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage8\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"stringDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage9\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"intDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage10\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"stringDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage11\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"NodeIdDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage12\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"stringDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Samples/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"intDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    \"StatusCode\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"booleanDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"boolean\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage4\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"doubleDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"double\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage5\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage6\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage7\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage8\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage9\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage10\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage11\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage12\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage13\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"doubleDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage14\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage15\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage16\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage17\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage18\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage19\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage20\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage21\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"intDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Samples/SimpleEvents.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"bytesDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"bytes\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"StatusCode\",\n                  \"namespace\": \"org.opcfoundation.UA\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Code\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Symbol\",\n                      \"type\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    \"StatusCode\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"stringDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          \"stringDataValue\"\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"record\",\n            \"name\": \"CycleStepDataTypeDataValue\",\n            \"namespace\": \"org.github.microsoft.opc.publisher\",\n            \"fields\": [\n              {\n                \"name\": \"Value\",\n                \"type\": {\n                  \"type\": \"record\",\n                  \"name\": \"CycleStepDataType\",\n                  \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                  \"aliases\": [\n                    \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                  ],\n                  \"fields\": [\n                    {\n                      \"name\": \"Name\",\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"name\": \"Duration\",\n                      \"type\": \"double\"\n                    }\n                  ],\n                  \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n                }\n              },\n              {\n                \"name\": \"Status\",\n                \"type\": \"org.opcfoundation.UA.StatusCode\"\n              },\n              {\n                \"name\": \"SourceTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"SourcePicoseconds\",\n                \"type\": \"int\"\n              },\n              {\n                \"name\": \"ServerTimestamp\",\n                \"type\": \"string\"\n              },\n              {\n                \"name\": \"ServerPicoseconds\",\n                \"type\": \"int\"\n              }\n            ]\n          }\n        ]\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/SamplesRaw/CyclicReads.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"boolean\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage4\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage5\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage6\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage7\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage8\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage9\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage10\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage11\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage12\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage13\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage14\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage15\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage16\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage17\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage18\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage19\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage20\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage21\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage22\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage23\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/SamplesRaw/KeepAlive.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": {\n          \"type\": \"enum\",\n          \"name\": \"ServerState\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_x95_852\"\n          ],\n          \"symbols\": [\n            \"Running\",\n            \"Failed\",\n            \"NoConfiguration\",\n            \"Suspended\",\n            \"Shutdown\",\n            \"Test\",\n            \"CommunicationFault\",\n            \"Unknown\"\n          ],\n          \"default\": \"Running\",\n          \"uaDataTypeId\": \"i=852\"\n        }\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/SamplesRaw/KeyFrames.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"org.opcfoundation.UA.Variant\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"boolean\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage4\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"float\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/SamplesRaw/PendingAlarms.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"NodeId\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_17\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"IdType\",\n              \"type\": {\n                \"type\": \"enum\",\n                \"name\": \"IdentifierType\",\n                \"namespace\": \"org.opcfoundation.UA\",\n                \"symbols\": [\n                  \"UInt32\",\n                  \"String\",\n                  \"Guid\",\n                  \"ByteString\"\n                ]\n              }\n            },\n            {\n              \"name\": \"Id\",\n              \"type\": [\n                \"int\",\n                \"string\",\n                \"bytes\"\n              ]\n            },\n            {\n              \"name\": \"Namespace\",\n              \"type\": \"string\"\n            }\n          ]\n        }\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    \"NodeId\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": {\n          \"type\": \"array\",\n          \"items\": \"org.opcfoundation.UA.NodeId\"\n        }\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": {\n          \"type\": \"array\",\n          \"items\": \"string\"\n        }\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage4\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"bytes\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage5\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"org.opcfoundation.UA.NodeId\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage6\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"TimeZoneDataType\",\n          \"namespace\": \"org.opcfoundation.UA\",\n          \"aliases\": [\n            \"org.opcfoundation.UA.i_x95_8912\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Offset\",\n              \"type\": \"int\"\n            },\n            {\n              \"name\": \"DaylightSavingInOffset\",\n              \"type\": \"boolean\"\n            }\n          ],\n          \"uaDataTypeId\": \"i=8912\"\n        }\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage7\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage8\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage9\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage10\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage11\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"org.opcfoundation.UA.NodeId\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage12\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/SamplesRaw/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"boolean\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage4\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage5\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage6\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage7\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage8\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage9\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage10\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage11\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage12\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage13\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"double\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage14\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage15\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage16\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage17\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage18\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage19\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage20\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage21\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"int\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/SamplesRaw/SimpleEvents.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"bytes\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": {\n              \"type\": \"record\",\n              \"name\": \"Variant\",\n              \"namespace\": \"org.opcfoundation.UA\",\n              \"aliases\": [\n                \"org.opcfoundation.UA.i_24\"\n              ],\n              \"fields\": [\n                {\n                  \"name\": \"Value\",\n                  \"type\": [\n                    \"null\",\n                    \"boolean\",\n                    \"int\",\n                    \"string\",\n                    \"float\",\n                    \"double\",\n                    \"bytes\",\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExpandedNodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_18\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": \"IdentifierType\"\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": [\n                            \"int\",\n                            \"string\"\n                          ]\n                        },\n                        {\n                          \"name\": \"ServerUri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"QualifiedName\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_20\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Uri\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"ExtensionObject\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_22\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"TypeId\",\n                          \"type\": \"NodeId\"\n                        },\n                        {\n                          \"name\": \"Encoding\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"Encoding\",\n                            \"symbols\": [\n                              \"Structure\",\n                              \"ByteString\",\n                              \"XmlElement\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Body\",\n                          \"type\": [\n                            \"null\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"record\",\n                      \"name\": \"DataValue\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_23\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": \"Variant\"\n                        },\n                        {\n                          \"name\": \"Status\",\n                          \"type\": \"StatusCode\"\n                        },\n                        {\n                          \"name\": \"SourceTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"SourcePicoSeconds\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"ServerTimestamp\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"ServerPicoSeconds\",\n                          \"type\": \"int\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"array\",\n                      \"items\": \"boolean\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage2\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"MonitoredItemMessage3\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"NodeId\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"EndpointUrl\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"ApplicationUri\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"DisplayName\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Timestamp\",\n        \"type\": [\n          \"null\",\n          \"string\"\n        ]\n      },\n      {\n        \"name\": \"Value\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"CycleStepDataType\",\n          \"namespace\": \"org.opcfoundation.SimpleEvents\",\n          \"aliases\": [\n            \"org.opcfoundation.SimpleEvents.i_x95_183\"\n          ],\n          \"fields\": [\n            {\n              \"name\": \"Name\",\n              \"type\": \"string\"\n            },\n            {\n              \"name\": \"Duration\",\n              \"type\": \"double\"\n            }\n          ],\n          \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n        }\n      },\n      {\n        \"name\": \"SequenceNumber\",\n        \"type\": [\n          \"null\",\n          \"int\"\n        ]\n      },\n      {\n        \"name\": \"ExtensionFields\",\n        \"type\": [\n          \"null\",\n          {\n            \"type\": \"map\",\n            \"values\": \"org.opcfoundation.UA.Variant\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Single/CyclicReads.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"i_x61_2258\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"stringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"intDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"booleanDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"boolean\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"doubleDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"double\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.doubleDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.doubleDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.intDataValue\"\n            ]\n          },\n          {\n            \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.doubleDataValue\"\n            ]\n          },\n          {\n            \"name\": \"ns_x61_23_x59_i_x61_1259\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.stringDataValue\"\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Single/KeepAlive.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MetaDataVersion\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"ConfigurationVersionDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14593\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"MajorVersion\",\n            \"type\": \"int\"\n          },\n          {\n            \"name\": \"MinorVersion\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetWriterName\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"State\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"ServerStateDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"enum\",\n                      \"name\": \"ServerState\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_x95_852\"\n                      ],\n                      \"symbols\": [\n                        \"Running\",\n                        \"Failed\",\n                        \"NoConfiguration\",\n                        \"Suspended\",\n                        \"Shutdown\",\n                        \"Test\",\n                        \"CommunicationFault\",\n                        \"Unknown\"\n                      ],\n                      \"default\": \"Running\",\n                      \"uaDataTypeId\": \"i=852\"\n                    }\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Single/KeyFrames.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"MetaDataVersion\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"ConfigurationVersionDataType\",\n        \"namespace\": \"org.opcfoundation.UA\",\n        \"aliases\": [\n          \"org.opcfoundation.UA.i_14593\"\n        ],\n        \"fields\": [\n          {\n            \"name\": \"MajorVersion\",\n            \"type\": \"int\"\n          },\n          {\n            \"name\": \"MinorVersion\",\n            \"type\": \"int\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MessageType\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"DataSetWriterName\",\n      \"type\": \"string\"\n    },\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"CurrentTime\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"stringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"EngineeringUnits\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.stringDataValue\"\n            ]\n          },\n          {\n            \"name\": \"AssetId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"VariantDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"Variant\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_24\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Value\",\n                          \"type\": [\n                            \"null\",\n                            \"boolean\",\n                            \"int\",\n                            \"string\",\n                            \"float\",\n                            \"double\",\n                            \"bytes\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"NodeId\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_17\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"IdType\",\n                                  \"type\": {\n                                    \"type\": \"enum\",\n                                    \"name\": \"IdentifierType\",\n                                    \"namespace\": \"org.opcfoundation.UA\",\n                                    \"symbols\": [\n                                      \"UInt32\",\n                                      \"String\",\n                                      \"Guid\",\n                                      \"ByteString\"\n                                    ]\n                                  }\n                                },\n                                {\n                                  \"name\": \"Id\",\n                                  \"type\": [\n                                    \"int\",\n                                    \"string\",\n                                    \"bytes\"\n                                  ]\n                                },\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExpandedNodeId\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_18\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"IdType\",\n                                  \"type\": \"IdentifierType\"\n                                },\n                                {\n                                  \"name\": \"Id\",\n                                  \"type\": [\n                                    \"int\",\n                                    \"string\",\n                                    \"bytes\"\n                                  ]\n                                },\n                                {\n                                  \"name\": \"Namespace\",\n                                  \"type\": [\n                                    \"int\",\n                                    \"string\"\n                                  ]\n                                },\n                                {\n                                  \"name\": \"ServerUri\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            \"StatusCode\",\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"QualifiedName\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_20\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Name\",\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"name\": \"Uri\",\n                                  \"type\": \"string\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"ExtensionObject\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_22\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"TypeId\",\n                                  \"type\": \"NodeId\"\n                                },\n                                {\n                                  \"name\": \"Encoding\",\n                                  \"type\": {\n                                    \"type\": \"enum\",\n                                    \"name\": \"Encoding\",\n                                    \"symbols\": [\n                                      \"Structure\",\n                                      \"ByteString\",\n                                      \"XmlElement\"\n                                    ]\n                                  }\n                                },\n                                {\n                                  \"name\": \"Body\",\n                                  \"type\": [\n                                    \"null\",\n                                    \"string\",\n                                    \"bytes\"\n                                  ]\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"record\",\n                              \"name\": \"DataValue\",\n                              \"namespace\": \"org.opcfoundation.UA\",\n                              \"aliases\": [\n                                \"org.opcfoundation.UA.i_23\"\n                              ],\n                              \"fields\": [\n                                {\n                                  \"name\": \"Value\",\n                                  \"type\": \"Variant\"\n                                },\n                                {\n                                  \"name\": \"Status\",\n                                  \"type\": \"StatusCode\"\n                                },\n                                {\n                                  \"name\": \"SourceTimestamp\",\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"name\": \"SourcePicoSeconds\",\n                                  \"type\": \"int\"\n                                },\n                                {\n                                  \"name\": \"ServerTimestamp\",\n                                  \"type\": \"string\"\n                                },\n                                {\n                                  \"name\": \"ServerPicoSeconds\",\n                                  \"type\": \"int\"\n                                }\n                              ]\n                            },\n                            {\n                              \"type\": \"array\",\n                              \"items\": \"boolean\"\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Important\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"booleanDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"boolean\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Variance\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"floatDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"float\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Single/PendingAlarms.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"ConditionClassId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"NodeIdDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"NodeId\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_17\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"IdType\",\n                          \"type\": {\n                            \"type\": \"enum\",\n                            \"name\": \"IdentifierType\",\n                            \"namespace\": \"org.opcfoundation.UA\",\n                            \"symbols\": [\n                              \"UInt32\",\n                              \"String\",\n                              \"Guid\",\n                              \"ByteString\"\n                            ]\n                          }\n                        },\n                        {\n                          \"name\": \"Id\",\n                          \"type\": [\n                            \"int\",\n                            \"string\",\n                            \"bytes\"\n                          ]\n                        },\n                        {\n                          \"name\": \"Namespace\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"ConditionClassName\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"stringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"ConditionSubClassId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"arrayDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"array\",\n                      \"items\": \"org.opcfoundation.UA.NodeId\"\n                    }\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"ConditionSubClassName\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.arrayDataValue\"\n            ]\n          },\n          {\n            \"name\": \"EventId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"bytesDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"bytes\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"EventType\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n            ]\n          },\n          {\n            \"name\": \"LocalTime\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"TimeZoneDataTypeDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"TimeZoneDataType\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"aliases\": [\n                        \"org.opcfoundation.UA.i_x95_8912\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Offset\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"DaylightSavingInOffset\",\n                          \"type\": \"boolean\"\n                        }\n                      ],\n                      \"uaDataTypeId\": \"i=8912\"\n                    }\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Message\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.stringDataValue\"\n            ]\n          },\n          {\n            \"name\": \"ReceiveTime\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.stringDataValue\"\n            ]\n          },\n          {\n            \"name\": \"Severity\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"intDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"SourceName\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.stringDataValue\"\n            ]\n          },\n          {\n            \"name\": \"SourceNode\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.NodeIdDataValue\"\n            ]\n          },\n          {\n            \"name\": \"Time\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.stringDataValue\"\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Single/PlcSimulation.json",
    "content": "[\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSetMessage\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"Payload\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"DataSet\",\n          \"fields\": [\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_StepUp\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"intDataValue\",\n                  \"namespace\": \"org.github.microsoft.opc.publisher\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"Status\",\n                      \"type\": {\n                        \"type\": \"record\",\n                        \"name\": \"StatusCode\",\n                        \"namespace\": \"org.opcfoundation.UA\",\n                        \"fields\": [\n                          {\n                            \"name\": \"Code\",\n                            \"type\": \"int\"\n                          },\n                          {\n                            \"name\": \"Symbol\",\n                            \"type\": \"string\"\n                          }\n                        ]\n                      }\n                    },\n                    {\n                      \"name\": \"SourceTimestamp\",\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"name\": \"SourcePicoseconds\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"ServerTimestamp\",\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"name\": \"ServerPicoseconds\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_AlternatingBoolean\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"booleanDataValue\",\n                  \"namespace\": \"org.github.microsoft.opc.publisher\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"boolean\"\n                    },\n                    {\n                      \"name\": \"Status\",\n                      \"type\": \"org.opcfoundation.UA.StatusCode\"\n                    },\n                    {\n                      \"name\": \"SourceTimestamp\",\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"name\": \"SourcePicoseconds\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"ServerTimestamp\",\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"name\": \"ServerPicoseconds\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomSignedInt32\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_RandomUnsignedInt32\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_DipData\",\n              \"type\": [\n                \"null\",\n                {\n                  \"type\": \"record\",\n                  \"name\": \"doubleDataValue\",\n                  \"namespace\": \"org.github.microsoft.opc.publisher\",\n                  \"fields\": [\n                    {\n                      \"name\": \"Value\",\n                      \"type\": \"double\"\n                    },\n                    {\n                      \"name\": \"Status\",\n                      \"type\": \"org.opcfoundation.UA.StatusCode\"\n                    },\n                    {\n                      \"name\": \"SourceTimestamp\",\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"name\": \"SourcePicoseconds\",\n                      \"type\": \"int\"\n                    },\n                    {\n                      \"name\": \"ServerTimestamp\",\n                      \"type\": \"string\"\n                    },\n                    {\n                      \"name\": \"ServerPicoseconds\",\n                      \"type\": \"int\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar2\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastUIntScalar3\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar2\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_FastRandomUIntScalar3\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_NegativeTrendData\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.doubleDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_PositiveTrendData\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.doubleDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SpikeData\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.doubleDataValue\"\n              ]\n            }\n          ]\n        }\n      }\n    ]\n  },\n  {\n    \"type\": \"record\",\n    \"name\": \"DataSetMessage1\",\n    \"namespace\": \"org.github.microsoft.opc.publisher\",\n    \"fields\": [\n      {\n        \"name\": \"Payload\",\n        \"type\": {\n          \"type\": \"record\",\n          \"name\": \"DataSet1\",\n          \"fields\": [\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar2\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowUIntScalar3\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar2\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_SlowRandomUIntScalar3\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            },\n            {\n              \"name\": \"nsu_x61_http_x58__x47__x47_opcfoundation_x46_org_x47_UA_x47_Plc_x47_Applications_x59_s_x61_BadSlowRandomUIntScalar1\",\n              \"type\": [\n                \"null\",\n                \"org.github.microsoft.opc.publisher.intDataValue\"\n              ]\n            }\n          ]\n        }\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JavroSchema/Single/SimpleEvents.json",
    "content": "{\n  \"type\": \"record\",\n  \"name\": \"DataSetMessage\",\n  \"namespace\": \"org.github.microsoft.opc.publisher\",\n  \"fields\": [\n    {\n      \"name\": \"Payload\",\n      \"type\": {\n        \"type\": \"record\",\n        \"name\": \"DataSet\",\n        \"fields\": [\n          {\n            \"name\": \"EventId\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"bytesDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"bytes\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"StatusCode\",\n                      \"namespace\": \"org.opcfoundation.UA\",\n                      \"fields\": [\n                        {\n                          \"name\": \"Code\",\n                          \"type\": \"int\"\n                        },\n                        {\n                          \"name\": \"Symbol\",\n                          \"type\": \"string\"\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"Message\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"stringDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CycleId\",\n            \"type\": [\n              \"null\",\n              \"org.github.microsoft.opc.publisher.stringDataValue\"\n            ]\n          },\n          {\n            \"name\": \"http_x58__x47__x47_opcfoundation_x46_org_x47_SimpleEvents_x35_CurrentStep\",\n            \"type\": [\n              \"null\",\n              {\n                \"type\": \"record\",\n                \"name\": \"CycleStepDataTypeDataValue\",\n                \"namespace\": \"org.github.microsoft.opc.publisher\",\n                \"fields\": [\n                  {\n                    \"name\": \"Value\",\n                    \"type\": {\n                      \"type\": \"record\",\n                      \"name\": \"CycleStepDataType\",\n                      \"namespace\": \"org.opcfoundation.SimpleEvents\",\n                      \"aliases\": [\n                        \"org.opcfoundation.SimpleEvents.i_x95_183\"\n                      ],\n                      \"fields\": [\n                        {\n                          \"name\": \"Name\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"name\": \"Duration\",\n                          \"type\": \"double\"\n                        }\n                      ],\n                      \"uaDataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\"\n                    }\n                  },\n                  {\n                    \"name\": \"Status\",\n                    \"type\": \"org.opcfoundation.UA.StatusCode\"\n                  },\n                  {\n                    \"name\": \"SourceTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"SourcePicoseconds\",\n                    \"type\": \"int\"\n                  },\n                  {\n                    \"name\": \"ServerTimestamp\",\n                    \"type\": \"string\"\n                  },\n                  {\n                    \"name\": \"ServerPicoseconds\",\n                    \"type\": \"int\"\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonNetworkMessageAvroSchemaTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Avro;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.IO;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class JsonNetworkMessageAvroSchemaTests\n    {\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateJsonNetworkMessageSchemasAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            var document = JsonDocument.Parse(json);\n            json = JsonSerializer.Serialize(document, kIndented);\n            Assert.NotNull(json);\n            await AssertAsync(\"NetworkMessageDefault\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateJsonNetworkMessageWithNsAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            var schema = new JsonNetworkMessage(messageMetaData, new SchemaOptions\n            {\n                Namespace = \"http://www.microsoft.com\"\n            });\n\n            var json = schema.ToString();\n            await AssertAsync(\"NetworkMessage\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateMessageSchemaWithoutNetworkHeaderAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.DataSetMessageHeader\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Multiple\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSingleMessageSchemaAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags =\n                    NetworkMessageContentFlags.DataSetMessageHeader\n                    | NetworkMessageContentFlags.SingleDataSetMessage\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Single\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSingleMessageSchemaWithoutHeaderAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.SingleDataSetMessage\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Default\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateRawMessageSchemaAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.SingleDataSetMessage,\n                DataSetMessages = messageMetaData.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags = 0u,\n                    DataSetFieldContentFlags = DataSetFieldContentFlags.RawData\n                }).ToList()\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Raw\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateRawMessageSchemaReversibleAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.SingleDataSetMessage,\n                DataSetMessages = messageMetaData.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags = DataSetMessageContentFlags.ReversibleFieldEncoding,\n                    DataSetFieldContentFlags = 0u\n\n                }).ToList()\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"RawReversible\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSamplesMessageSchemaAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags =\n                        NetworkMessageContentFlags.MonitoredItemMessage |\n                        NetworkMessageContentFlags.DataSetMessageHeader,\n                DataSetMessages = messageMetaData.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags =\n                        DataSetMessageContentFlags.Timestamp |\n                        DataSetMessageContentFlags.DataSetWriterId |\n                        DataSetMessageContentFlags.SequenceNumber,\n                    DataSetFieldContentFlags =\n                        DataSetFieldContentFlags.StatusCode |\n                        DataSetFieldContentFlags.SourceTimestamp |\n                        DataSetFieldContentFlags.ServerTimestamp |\n                        DataSetFieldContentFlags.ApplicationUri |\n                        DataSetFieldContentFlags.ExtensionFields |\n                        DataSetFieldContentFlags.NodeId |\n                        DataSetFieldContentFlags.DisplayName |\n                        DataSetFieldContentFlags.EndpointUrl\n                }).ToList()\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Samples\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSamplesMessageSchemaRawAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags =\n                    NetworkMessageContentFlags.MonitoredItemMessage |\n                    NetworkMessageContentFlags.DataSetMessageHeader,\n                DataSetMessages = messageMetaData.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags =\n                        DataSetMessageContentFlags.Timestamp |\n                        DataSetMessageContentFlags.SequenceNumber,\n                    DataSetFieldContentFlags =\n                        DataSetFieldContentFlags.ApplicationUri |\n                        DataSetFieldContentFlags.ExtensionFields |\n                        DataSetFieldContentFlags.NodeId |\n                        DataSetFieldContentFlags.DisplayName |\n                        DataSetFieldContentFlags.EndpointUrl |\n                        DataSetFieldContentFlags.RawData\n                }).ToList()\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"SamplesRaw\", messageMetaDataFile, json);\n\n            var schema2 = global::Avro.Schema.Parse(json);\n            Assert.NotNull(schema2);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        private static async ValueTask<T> LoadAsync<T>(string file)\n        {\n            await using var fs = new FileStream(file, FileMode.Open,\n                FileAccess.Read, FileShare.Read);\n            return await JsonSerializer.DeserializeAsync<T>(fs);\n        }\n\n        private static readonly JsonSerializerOptions kIndented = new()\n        {\n            WriteIndented = true\n        };\n\n        private static async Task AssertAsync(string name, string messageMetaDataFile, string json)\n        {\n            var document = JsonDocument.Parse(json);\n            json = JsonSerializer.Serialize(document, kIndented).ReplaceLineEndings();\n            Assert.NotNull(json);\n#if WRITE\n            var folder = Path.Combine(\".\", \"JavroSchema\", name);\n            if (!Directory.Exists(folder))\n            {\n                Directory.CreateDirectory(folder);\n            }\n            await File.WriteAllTextAsync(Path.Combine(folder, Path.GetFileName(messageMetaDataFile)), json);\n#else\n            var folder = Path.Combine(\".\", \"Encoders\", \"Schemas\", \"JavroSchema\", name);\n            var expected = await File.ReadAllTextAsync(Path.Combine(folder, Path.GetFileName(messageMetaDataFile)));\n            Assert.Equal(expected.ReplaceLineEndings(), json);\n#endif\n        }\n\n        public static TheoryData<string> GetMessageMetaDataFiles()\n        {\n            var resources = Directory.GetFiles(Path.Combine(\".\", \"Resources\"), \"*.json\");\n            return new TheoryData<string>(resources);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonNetworkMessageJsonSchemaTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders.Schemas\n{\n    using Azure.IIoT.OpcUa.Encoders.Schemas.Json;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Microsoft.Json.Schema;\n    using System.IO;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class JsonNetworkMessageJsonSchemaTests\n    {\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateNetworkMessageJsonSchemasAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            var document = JsonDocument.Parse(json);\n            json = JsonSerializer.Serialize(document, kIndented);\n            Assert.NotNull(json);\n            await AssertAsync(\"NetworkMessageDefault\", messageMetaDataFile, json);\n\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n\n            // var instance = JsonNode.Parse(\"{\\\"foo\\\":\\\"a value\\\",\\\"bar\\\":42}\");\n            // var results = schema2.Evaluate(instance);\n            // Assert.True(results.IsValid);\n            // Assert.False(results.HasErrors);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateJsonNetworkMessageWithNsAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            var schema = new JsonNetworkMessage(messageMetaData, new SchemaOptions\n            {\n                Namespace = \"http://www.microsoft.com\"\n            });\n\n            var json = schema.ToString();\n            await AssertAsync(\"NetworkMessage\", messageMetaDataFile, json);\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateMessageSchemaWithoutNetworkHeaderAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.DataSetMessageHeader\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Multiple\", messageMetaDataFile, json);\n\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSingleMessageSchemaAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.DataSetMessageHeader\n                    | NetworkMessageContentFlags.SingleDataSetMessage\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Single\", messageMetaDataFile, json);\n\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSingleMessageSchemaWithoutHeaderAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.SingleDataSetMessage\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Default\", messageMetaDataFile, json);\n\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateRawMessageSchemaAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.SingleDataSetMessage,\n                DataSetMessages = messageMetaData.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags = 0u,\n                    DataSetFieldContentFlags = DataSetFieldContentFlags.RawData\n                }).ToList()\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Raw\", messageMetaDataFile, json);\n\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateRawMessageSchemaReversibleAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags = NetworkMessageContentFlags.SingleDataSetMessage,\n                DataSetMessages = messageMetaData.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags = DataSetMessageContentFlags.ReversibleFieldEncoding,\n                    DataSetFieldContentFlags = 0u\n\n                }).ToList()\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"RawReversible\", messageMetaDataFile, json);\n\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSamplesMessageSchemaAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags =\n                    NetworkMessageContentFlags.MonitoredItemMessage |\n                    NetworkMessageContentFlags.DataSetMessageHeader,\n                DataSetMessages = messageMetaData.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags =\n                        DataSetMessageContentFlags.Timestamp |\n                        DataSetMessageContentFlags.DataSetWriterId |\n                        DataSetMessageContentFlags.SequenceNumber,\n                    DataSetFieldContentFlags =\n                        DataSetFieldContentFlags.StatusCode |\n                        DataSetFieldContentFlags.SourceTimestamp |\n                        DataSetFieldContentFlags.ServerTimestamp |\n                        DataSetFieldContentFlags.ApplicationUri |\n                        DataSetFieldContentFlags.ExtensionFields |\n                        DataSetFieldContentFlags.NodeId |\n                        DataSetFieldContentFlags.DisplayName |\n                        DataSetFieldContentFlags.EndpointUrl\n                }).ToList()\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"Samples\", messageMetaDataFile, json);\n\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetMessageMetaDataFiles))]\n        public async Task CreateSamplesMessageSchemaRawAsync(string messageMetaDataFile)\n        {\n            var messageMetaData = await LoadAsync<PublishedNetworkMessageSchemaModel>(messageMetaDataFile);\n            messageMetaData = messageMetaData with\n            {\n                NetworkMessageContentFlags =\n                    NetworkMessageContentFlags.MonitoredItemMessage |\n                    NetworkMessageContentFlags.DataSetMessageHeader,\n                DataSetMessages = messageMetaData.DataSetMessages.Select(d => d with\n                {\n                    DataSetMessageContentFlags =\n                        DataSetMessageContentFlags.Timestamp |\n                        DataSetMessageContentFlags.SequenceNumber,\n                    DataSetFieldContentFlags =\n                        DataSetFieldContentFlags.ApplicationUri |\n                        DataSetFieldContentFlags.ExtensionFields |\n                        DataSetFieldContentFlags.NodeId |\n                        DataSetFieldContentFlags.DisplayName |\n                        DataSetFieldContentFlags.EndpointUrl |\n                        DataSetFieldContentFlags.RawData\n                }).ToList()\n            };\n\n            var schema = new JsonNetworkMessage(messageMetaData);\n\n            var json = schema.ToString();\n            await AssertAsync(\"SamplesRaw\", messageMetaDataFile, json);\n\n            var schema2 = SchemaReader.ReadSchema(json, \".\");\n            Assert.NotNull(schema2);\n            // var schema2 = global::Json.Schema.JsonSchema.FromText(json);\n            //Assert.Equal(schema.Schema, schema2);\n        }\n\n        private static async ValueTask<T> LoadAsync<T>(string file)\n        {\n            await using var fs = new FileStream(file, FileMode.Open,\n                FileAccess.Read, FileShare.Read);\n            return await JsonSerializer.DeserializeAsync<T>(fs);\n        }\n\n        private static readonly JsonSerializerOptions kIndented = new()\n        {\n            WriteIndented = true\n        };\n\n        private static async Task AssertAsync(string name, string messageMetaDataFile, string json)\n        {\n            var document = JsonDocument.Parse(json);\n            json = JsonSerializer.Serialize(document, kIndented).ReplaceLineEndings();\n            Assert.NotNull(json);\n#if WRITE\n            var folder = Path.Combine(\".\", \"JsonSchema\", name);\n            if (!Directory.Exists(folder))\n            {\n                Directory.CreateDirectory(folder);\n            }\n            await File.WriteAllTextAsync(Path.Combine(folder, Path.GetFileName(messageMetaDataFile)), json);\n#else\n            var folder = Path.Combine(\".\", \"Encoders\", \"Schemas\", \"JsonSchema\", name);\n            var expected = await File.ReadAllTextAsync(Path.Combine(folder, Path.GetFileName(messageMetaDataFile)));\n            Assert.Equal(expected.ReplaceLineEndings(), json);\n#endif\n        }\n\n        public static TheoryData<string> GetMessageMetaDataFiles()\n        {\n            var resources = Directory.GetFiles(Path.Combine(\".\", \"Resources\"), \"*.json\");\n            return new TheoryData<string>(resources);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Default/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"i=2258\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"ns=23;i=1259\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Default/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ServerStateDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ServerStateDataValue\",\n      \"title\": \"Dataset Field of Type ServerState\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"State\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ServerStateDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Default/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"title\": \"Any\",\n      \"type\": [\n        \"number\",\n        \"null\",\n        \"object\",\n        \"array\",\n        \"string\",\n        \"integer\",\n        \"boolean\"\n      ]\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"org.github.microsoft.opcpublisher.FloatDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#FloatDataValue\",\n      \"title\": \"Dataset Field of Type Float\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"CurrentTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"EngineeringUnits\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"AssetId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        },\n        \"Important\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"Variance\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.FloatDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Default/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdDataValue\",\n      \"title\": \"Dataset Field of Type NodeId\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdArrayDataValue\",\n      \"title\": \"Dataset Field of Type NodeIdArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextArrayDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedTextArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#TimeZoneDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt16DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt16DataValue\",\n      \"title\": \"Dataset Field of Type UInt16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"ConditionClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"ConditionClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"ConditionSubClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdArrayDataValue\"\n        },\n        \"ConditionSubClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\"\n        },\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"EventType\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"LocalTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"ReceiveTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"Severity\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt16DataValue\"\n        },\n        \"SourceName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"SourceNode\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"Time\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Default/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSets\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSet1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet1\",\n      \"title\": \"DataSet1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSets\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSets\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Default/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#CycleStepDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Multiple/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"array\",\n  \"items\": {\n    \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n  },\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"i=2258\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"ns=23;i=1259\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Multiple/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"array\",\n  \"items\": {\n    \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n  },\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ServerStateDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ServerStateDataValue\",\n      \"title\": \"Dataset Field of Type ServerState\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"State\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ServerStateDataValue\"\n        }\n      }\n    },\n    \"org.opcfoundation.UA.i_x61_14593\": {\n      \"$id\": \"http://opcfoundation.org/UA/#i%3d14593\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MajorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"MinorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MetaDataVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.i_x61_14593\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetWriterName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"MetaDataVersion\",\n        \"MessageType\",\n        \"DataSetWriterName\",\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Multiple/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"array\",\n  \"items\": {\n    \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n  },\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"title\": \"Any\",\n      \"type\": [\n        \"number\",\n        \"null\",\n        \"object\",\n        \"array\",\n        \"string\",\n        \"integer\",\n        \"boolean\"\n      ]\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"org.github.microsoft.opcpublisher.FloatDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#FloatDataValue\",\n      \"title\": \"Dataset Field of Type Float\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"CurrentTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"EngineeringUnits\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"AssetId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        },\n        \"Important\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"Variance\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.FloatDataValue\"\n        }\n      }\n    },\n    \"org.opcfoundation.UA.i_x61_14593\": {\n      \"$id\": \"http://opcfoundation.org/UA/#i%3d14593\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MajorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"MinorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MetaDataVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.i_x61_14593\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetWriterName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"MetaDataVersion\",\n        \"MessageType\",\n        \"DataSetWriterName\",\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Multiple/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"array\",\n  \"items\": {\n    \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n  },\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdDataValue\",\n      \"title\": \"Dataset Field of Type NodeId\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdArrayDataValue\",\n      \"title\": \"Dataset Field of Type NodeIdArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextArrayDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedTextArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#TimeZoneDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt16DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt16DataValue\",\n      \"title\": \"Dataset Field of Type UInt16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"ConditionClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"ConditionClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"ConditionSubClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdArrayDataValue\"\n        },\n        \"ConditionSubClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\"\n        },\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"EventType\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"LocalTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"ReceiveTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"Severity\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt16DataValue\"\n        },\n        \"SourceName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"SourceNode\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"Time\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Multiple/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"array\",\n  \"items\": {\n    \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSets\"\n  },\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet1\",\n      \"title\": \"DataSet1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet1\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSets\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSets\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Multiple/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"array\",\n  \"items\": {\n    \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n  },\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#CycleStepDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessage/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/com.microsoft.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"com.microsoft.DateTimeDataValue\": {\n      \"$id\": \"http://www.microsoft.com#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.UInt32DataValue\": {\n      \"$id\": \"http://www.microsoft.com#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"com.microsoft.BooleanDataValue\": {\n      \"$id\": \"http://www.microsoft.com#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"com.microsoft.Int32DataValue\": {\n      \"$id\": \"http://www.microsoft.com#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"com.microsoft.DoubleDataValue\": {\n      \"$id\": \"http://www.microsoft.com#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"com.microsoft.NumberDataValue\": {\n      \"$id\": \"http://www.microsoft.com#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.DataSet\": {\n      \"$id\": \"http://www.microsoft.com#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"i=2258\": {\n          \"$ref\": \"#/definitions/com.microsoft.DateTimeDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/com.microsoft.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/com.microsoft.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/com.microsoft.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/com.microsoft.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/com.microsoft.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/com.microsoft.DoubleDataValue\"\n        },\n        \"ns=23;i=1259\": {\n          \"$ref\": \"#/definitions/com.microsoft.NumberDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessage/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/com.microsoft.NetworkMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"com.microsoft.ServerStateDataValue\": {\n      \"$id\": \"http://www.microsoft.com#ServerStateDataValue\",\n      \"title\": \"Dataset Field of Type ServerState\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.DataSet\": {\n      \"$id\": \"http://www.microsoft.com#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"State\": {\n          \"$ref\": \"#/definitions/com.microsoft.ServerStateDataValue\"\n        }\n      }\n    },\n    \"org.opcfoundation.UA.i_x61_14593\": {\n      \"$id\": \"http://opcfoundation.org/UA/#i%3d14593\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MajorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"MinorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"com.microsoft.DataSetMessage\": {\n      \"$id\": \"http://www.microsoft.com#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MetaDataVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.i_x61_14593\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetWriterName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Payload\": {\n          \"$ref\": \"#/definitions/com.microsoft.DataSet\"\n        }\n      },\n      \"required\": [\n        \"MetaDataVersion\",\n        \"MessageType\",\n        \"DataSetWriterName\",\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Guid\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Guid\",\n      \"title\": \"OPC UA built in type Guid\",\n      \"type\": \"string\",\n      \"format\": \"uuid\"\n    },\n    \"com.microsoft.NetworkMessage\": {\n      \"$id\": \"http://www.microsoft.com#NetworkMessage\",\n      \"type\": \"null\",\n      \"properties\": {\n        \"MessageId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"PublisherId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetClassId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Guid\"\n        },\n        \"DataSetWriterGroup\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Messages\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/com.microsoft.DataSetMessage\"\n          }\n        }\n      },\n      \"required\": [\n        \"MessageId\",\n        \"MessageType\",\n        \"PublisherId\",\n        \"DataSetClassId\",\n        \"DataSetWriterGroup\",\n        \"Messages\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessage/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/com.microsoft.NetworkMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"com.microsoft.DateTimeDataValue\": {\n      \"$id\": \"http://www.microsoft.com#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.StringDataValue\": {\n      \"$id\": \"http://www.microsoft.com#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"title\": \"Any\",\n      \"type\": [\n        \"number\",\n        \"null\",\n        \"object\",\n        \"array\",\n        \"string\",\n        \"integer\",\n        \"boolean\"\n      ]\n    },\n    \"com.microsoft.NumberDataValue\": {\n      \"$id\": \"http://www.microsoft.com#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"com.microsoft.BooleanDataValue\": {\n      \"$id\": \"http://www.microsoft.com#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"com.microsoft.FloatDataValue\": {\n      \"$id\": \"http://www.microsoft.com#FloatDataValue\",\n      \"title\": \"Dataset Field of Type Float\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.DataSet\": {\n      \"$id\": \"http://www.microsoft.com#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"CurrentTime\": {\n          \"$ref\": \"#/definitions/com.microsoft.DateTimeDataValue\"\n        },\n        \"EngineeringUnits\": {\n          \"$ref\": \"#/definitions/com.microsoft.StringDataValue\"\n        },\n        \"AssetId\": {\n          \"$ref\": \"#/definitions/com.microsoft.NumberDataValue\"\n        },\n        \"Important\": {\n          \"$ref\": \"#/definitions/com.microsoft.BooleanDataValue\"\n        },\n        \"Variance\": {\n          \"$ref\": \"#/definitions/com.microsoft.FloatDataValue\"\n        }\n      }\n    },\n    \"org.opcfoundation.UA.i_x61_14593\": {\n      \"$id\": \"http://opcfoundation.org/UA/#i%3d14593\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MajorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"MinorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"com.microsoft.DataSetMessage\": {\n      \"$id\": \"http://www.microsoft.com#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MetaDataVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.i_x61_14593\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetWriterName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Payload\": {\n          \"$ref\": \"#/definitions/com.microsoft.DataSet\"\n        }\n      },\n      \"required\": [\n        \"MetaDataVersion\",\n        \"MessageType\",\n        \"DataSetWriterName\",\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Guid\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Guid\",\n      \"title\": \"OPC UA built in type Guid\",\n      \"type\": \"string\",\n      \"format\": \"uuid\"\n    },\n    \"com.microsoft.NetworkMessage\": {\n      \"$id\": \"http://www.microsoft.com#NetworkMessage\",\n      \"type\": \"null\",\n      \"properties\": {\n        \"MessageId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"PublisherId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetClassId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Guid\"\n        },\n        \"DataSetWriterGroup\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Messages\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/com.microsoft.DataSetMessage\"\n          }\n        }\n      },\n      \"required\": [\n        \"MessageId\",\n        \"MessageType\",\n        \"PublisherId\",\n        \"DataSetClassId\",\n        \"DataSetWriterGroup\",\n        \"Messages\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessage/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/com.microsoft.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"com.microsoft.NodeIdDataValue\": {\n      \"$id\": \"http://www.microsoft.com#NodeIdDataValue\",\n      \"title\": \"Dataset Field of Type NodeId\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"com.microsoft.LocalizedTextDataValue\": {\n      \"$id\": \"http://www.microsoft.com#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.NodeIdArrayDataValue\": {\n      \"$id\": \"http://www.microsoft.com#NodeIdArrayDataValue\",\n      \"title\": \"Dataset Field of Type NodeIdArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.LocalizedTextArrayDataValue\": {\n      \"$id\": \"http://www.microsoft.com#LocalizedTextArrayDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedTextArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"com.microsoft.ByteStringDataValue\": {\n      \"$id\": \"http://www.microsoft.com#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.TimeZoneDataTypeDataValue\": {\n      \"$id\": \"http://www.microsoft.com#TimeZoneDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.DateTimeDataValue\": {\n      \"$id\": \"http://www.microsoft.com#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.UInt16DataValue\": {\n      \"$id\": \"http://www.microsoft.com#UInt16DataValue\",\n      \"title\": \"Dataset Field of Type UInt16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.StringDataValue\": {\n      \"$id\": \"http://www.microsoft.com#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.DataSet\": {\n      \"$id\": \"http://www.microsoft.com#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"ConditionClassId\": {\n          \"$ref\": \"#/definitions/com.microsoft.NodeIdDataValue\"\n        },\n        \"ConditionClassName\": {\n          \"$ref\": \"#/definitions/com.microsoft.LocalizedTextDataValue\"\n        },\n        \"ConditionSubClassId\": {\n          \"$ref\": \"#/definitions/com.microsoft.NodeIdArrayDataValue\"\n        },\n        \"ConditionSubClassName\": {\n          \"$ref\": \"#/definitions/com.microsoft.LocalizedTextArrayDataValue\"\n        },\n        \"EventId\": {\n          \"$ref\": \"#/definitions/com.microsoft.ByteStringDataValue\"\n        },\n        \"EventType\": {\n          \"$ref\": \"#/definitions/com.microsoft.NodeIdDataValue\"\n        },\n        \"LocalTime\": {\n          \"$ref\": \"#/definitions/com.microsoft.TimeZoneDataTypeDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/com.microsoft.LocalizedTextDataValue\"\n        },\n        \"ReceiveTime\": {\n          \"$ref\": \"#/definitions/com.microsoft.DateTimeDataValue\"\n        },\n        \"Severity\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt16DataValue\"\n        },\n        \"SourceName\": {\n          \"$ref\": \"#/definitions/com.microsoft.StringDataValue\"\n        },\n        \"SourceNode\": {\n          \"$ref\": \"#/definitions/com.microsoft.NodeIdDataValue\"\n        },\n        \"Time\": {\n          \"$ref\": \"#/definitions/com.microsoft.DateTimeDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessage/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/com.microsoft.DataSets\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"com.microsoft.UInt32DataValue\": {\n      \"$id\": \"http://www.microsoft.com#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"com.microsoft.BooleanDataValue\": {\n      \"$id\": \"http://www.microsoft.com#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"com.microsoft.Int32DataValue\": {\n      \"$id\": \"http://www.microsoft.com#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"com.microsoft.DoubleDataValue\": {\n      \"$id\": \"http://www.microsoft.com#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.DataSet\": {\n      \"$id\": \"http://www.microsoft.com#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/com.microsoft.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/com.microsoft.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/com.microsoft.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/com.microsoft.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/com.microsoft.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/com.microsoft.DoubleDataValue\"\n        }\n      }\n    },\n    \"com.microsoft.DataSet1\": {\n      \"$id\": \"http://www.microsoft.com#DataSet1\",\n      \"title\": \"DataSet1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/com.microsoft.UInt32DataValue\"\n        }\n      }\n    },\n    \"com.microsoft.DataSets\": {\n      \"$id\": \"http://www.microsoft.com#DataSets\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/com.microsoft.DataSet\"\n        },\n        {\n          \"$ref\": \"#/definitions/com.microsoft.DataSet1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessage/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/com.microsoft.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"com.microsoft.ByteStringDataValue\": {\n      \"$id\": \"http://www.microsoft.com#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"com.microsoft.LocalizedTextDataValue\": {\n      \"$id\": \"http://www.microsoft.com#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.StringDataValue\": {\n      \"$id\": \"http://www.microsoft.com#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.CycleStepDataTypeDataValue\": {\n      \"$id\": \"http://www.microsoft.com#CycleStepDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"com.microsoft.DataSet\": {\n      \"$id\": \"http://www.microsoft.com#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"EventId\": {\n          \"$ref\": \"#/definitions/com.microsoft.ByteStringDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/com.microsoft.LocalizedTextDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n          \"$ref\": \"#/definitions/com.microsoft.StringDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n          \"$ref\": \"#/definitions/com.microsoft.CycleStepDataTypeDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessageDefault/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"i=2258\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"ns=23;i=1259\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessageDefault/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NetworkMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ServerStateDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ServerStateDataValue\",\n      \"title\": \"Dataset Field of Type ServerState\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"State\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ServerStateDataValue\"\n        }\n      }\n    },\n    \"org.opcfoundation.UA.i_x61_14593\": {\n      \"$id\": \"http://opcfoundation.org/UA/#i%3d14593\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MajorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"MinorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MetaDataVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.i_x61_14593\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetWriterName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"MetaDataVersion\",\n        \"MessageType\",\n        \"DataSetWriterName\",\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Guid\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Guid\",\n      \"title\": \"OPC UA built in type Guid\",\n      \"type\": \"string\",\n      \"format\": \"uuid\"\n    },\n    \"org.github.microsoft.opcpublisher.NetworkMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NetworkMessage\",\n      \"type\": \"null\",\n      \"properties\": {\n        \"MessageId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"PublisherId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetClassId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Guid\"\n        },\n        \"DataSetWriterGroup\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Messages\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n          }\n        }\n      },\n      \"required\": [\n        \"MessageId\",\n        \"MessageType\",\n        \"PublisherId\",\n        \"DataSetClassId\",\n        \"DataSetWriterGroup\",\n        \"Messages\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessageDefault/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NetworkMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"title\": \"Any\",\n      \"type\": [\n        \"number\",\n        \"null\",\n        \"object\",\n        \"array\",\n        \"string\",\n        \"integer\",\n        \"boolean\"\n      ]\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"org.github.microsoft.opcpublisher.FloatDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#FloatDataValue\",\n      \"title\": \"Dataset Field of Type Float\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"CurrentTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"EngineeringUnits\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"AssetId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        },\n        \"Important\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"Variance\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.FloatDataValue\"\n        }\n      }\n    },\n    \"org.opcfoundation.UA.i_x61_14593\": {\n      \"$id\": \"http://opcfoundation.org/UA/#i%3d14593\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MajorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"MinorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MetaDataVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.i_x61_14593\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetWriterName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"MetaDataVersion\",\n        \"MessageType\",\n        \"DataSetWriterName\",\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Guid\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Guid\",\n      \"title\": \"OPC UA built in type Guid\",\n      \"type\": \"string\",\n      \"format\": \"uuid\"\n    },\n    \"org.github.microsoft.opcpublisher.NetworkMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NetworkMessage\",\n      \"type\": \"null\",\n      \"properties\": {\n        \"MessageId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"PublisherId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetClassId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Guid\"\n        },\n        \"DataSetWriterGroup\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Messages\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n          }\n        }\n      },\n      \"required\": [\n        \"MessageId\",\n        \"MessageType\",\n        \"PublisherId\",\n        \"DataSetClassId\",\n        \"DataSetWriterGroup\",\n        \"Messages\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessageDefault/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdDataValue\",\n      \"title\": \"Dataset Field of Type NodeId\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdArrayDataValue\",\n      \"title\": \"Dataset Field of Type NodeIdArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextArrayDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedTextArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#TimeZoneDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt16DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt16DataValue\",\n      \"title\": \"Dataset Field of Type UInt16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"ConditionClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"ConditionClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"ConditionSubClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdArrayDataValue\"\n        },\n        \"ConditionSubClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\"\n        },\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"EventType\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"LocalTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"ReceiveTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"Severity\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt16DataValue\"\n        },\n        \"SourceName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"SourceNode\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"Time\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessageDefault/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSets\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSet1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet1\",\n      \"title\": \"DataSet1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSets\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSets\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/NetworkMessageDefault/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#CycleStepDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Raw/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"i=2258\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"ns=23;i=1259\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Raw/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"State\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Raw/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"title\": \"Any\",\n      \"type\": [\n        \"number\",\n        \"null\",\n        \"object\",\n        \"array\",\n        \"string\",\n        \"integer\",\n        \"boolean\"\n      ]\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"CurrentTime\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"EngineeringUnits\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"AssetId\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"Important\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Variance\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Raw/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"ConditionClassId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"ConditionClassName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"ConditionSubClassId\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        },\n        \"ConditionSubClassName\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        },\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"EventType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"LocalTime\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"ReceiveTime\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Severity\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"SourceName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"SourceNode\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"Time\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Raw/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSets\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSet1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet1\",\n      \"title\": \"DataSet1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSets\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSets\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Raw/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/RawReversible/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeVariant\",\n      \"title\": \"Variant Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 13\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.github.microsoft.opcpublisher.UInt32Variant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32Variant\",\n      \"title\": \"Variant Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 7\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanVariant\",\n      \"title\": \"Variant Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 1\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32Variant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32Variant\",\n      \"title\": \"Variant Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 6\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleVariant\",\n      \"title\": \"Variant Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 11\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"org.github.microsoft.opcpublisher.NumberVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberVariant\",\n      \"title\": \"Variant Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 26\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"i=2258\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleVariant\"\n        },\n        \"ns=23;i=1259\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberVariant\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/RawReversible/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.ServerStateVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ServerStateVariant\",\n      \"title\": \"Variant Field of Type ServerState\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 29\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"State\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ServerStateVariant\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/RawReversible/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeVariant\",\n      \"title\": \"Variant Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 13\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.StringVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringVariant\",\n      \"title\": \"Variant Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 12\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Byte\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Byte\",\n      \"title\": \"OPC UA built in type Byte\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 255,\n      \"default\": 0,\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Variant\",\n      \"title\": \"OPC UA built in type Variant\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Byte\"\n        },\n        \"Body\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"Dimensions\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.VariantVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#VariantVariant\",\n      \"title\": \"Variant Field of Type Variant\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 24\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Variant\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanVariant\",\n      \"title\": \"Variant Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 1\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"org.github.microsoft.opcpublisher.FloatVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#FloatVariant\",\n      \"title\": \"Variant Field of Type Float\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 10\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"CurrentTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeVariant\"\n        },\n        \"EngineeringUnits\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringVariant\"\n        },\n        \"AssetId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.VariantVariant\"\n        },\n        \"Important\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanVariant\"\n        },\n        \"Variance\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.FloatVariant\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/RawReversible/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdVariant\",\n      \"title\": \"Variant Field of Type NodeId\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 17\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Locale\": {\n          \"title\": \"OPC UA built in type String\",\n          \"type\": \"string\",\n          \"format\": \"rfc3066\"\n        },\n        \"Text\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextVariant\",\n      \"title\": \"Variant Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 21\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdArrayVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdArrayVariant\",\n      \"title\": \"Variant Field of Type NodeIdArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 17\n        },\n        \"Body\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextArrayVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextArrayVariant\",\n      \"title\": \"Variant Field of Type LocalizedTextArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 21\n        },\n        \"Body\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringVariant\",\n      \"title\": \"Variant Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 15\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.TimeZoneDataTypeVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#TimeZoneDataTypeVariant\",\n      \"title\": \"Variant Field of Type TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 22\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeVariant\",\n      \"title\": \"Variant Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 13\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.UInt16Variant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt16Variant\",\n      \"title\": \"Variant Field of Type UInt16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 5\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringVariant\",\n      \"title\": \"Variant Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 12\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"ConditionClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdVariant\"\n        },\n        \"ConditionClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextVariant\"\n        },\n        \"ConditionSubClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdArrayVariant\"\n        },\n        \"ConditionSubClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextArrayVariant\"\n        },\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringVariant\"\n        },\n        \"EventType\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdVariant\"\n        },\n        \"LocalTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.TimeZoneDataTypeVariant\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextVariant\"\n        },\n        \"ReceiveTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeVariant\"\n        },\n        \"Severity\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt16Variant\"\n        },\n        \"SourceName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringVariant\"\n        },\n        \"SourceNode\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdVariant\"\n        },\n        \"Time\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeVariant\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/RawReversible/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSets\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.github.microsoft.opcpublisher.UInt32Variant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32Variant\",\n      \"title\": \"Variant Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 7\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanVariant\",\n      \"title\": \"Variant Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 1\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32Variant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32Variant\",\n      \"title\": \"Variant Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 6\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleVariant\",\n      \"title\": \"Variant Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 11\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleVariant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleVariant\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSet1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet1\",\n      \"title\": \"DataSet1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32Variant\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSets\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSets\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/RawReversible/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringVariant\",\n      \"title\": \"Variant Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 15\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Locale\": {\n          \"title\": \"OPC UA built in type String\",\n          \"type\": \"string\",\n          \"format\": \"rfc3066\"\n        },\n        \"Text\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextVariant\",\n      \"title\": \"Variant Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 21\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringVariant\",\n      \"title\": \"Variant Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 12\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.CycleStepDataTypeVariant\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#CycleStepDataTypeVariant\",\n      \"title\": \"Variant Field of Type CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Type\": {\n          \"type\": \"integer\",\n          \"const\": 22\n        },\n        \"Body\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringVariant\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextVariant\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringVariant\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.CycleStepDataTypeVariant\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Samples/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage5\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage5\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage6\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage6\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage7\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage7\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage8\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage8\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage9\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage9\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage10\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage10\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage11\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage11\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage12\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage12\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage13\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage13\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage14\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage14\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage15\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage15\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage16\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage17\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage17\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage18\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage18\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage19\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage19\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage20\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage20\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage21\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage21\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage22\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage22\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage23\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage23\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage24\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage24\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage5\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage6\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage7\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage8\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage9\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage10\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage11\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage12\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage13\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage14\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage15\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage16\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage17\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage18\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage19\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage20\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage21\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage22\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage23\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage24\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Samples/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ServerStateDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ServerStateDataValue\",\n      \"title\": \"Dataset Field of Type ServerState\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ServerStateDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Samples/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"title\": \"Any\",\n      \"type\": [\n        \"number\",\n        \"null\",\n        \"object\",\n        \"array\",\n        \"string\",\n        \"integer\",\n        \"boolean\"\n      ]\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"org.github.microsoft.opcpublisher.FloatDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#FloatDataValue\",\n      \"title\": \"Dataset Field of Type Float\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage5\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage5\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.FloatDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage5\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Samples/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdDataValue\",\n      \"title\": \"Dataset Field of Type NodeId\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdArrayDataValue\",\n      \"title\": \"Dataset Field of Type NodeIdArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextArrayDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedTextArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#TimeZoneDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt16DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt16DataValue\",\n      \"title\": \"Dataset Field of Type UInt16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdArrayDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage5\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage5\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage6\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage6\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage7\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage7\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage8\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage8\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage9\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage9\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage10\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage10\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt16DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage11\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage11\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage12\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage12\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage13\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage13\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage5\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage6\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage7\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage8\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage9\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage10\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage11\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage12\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage13\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Samples/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage5\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage5\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage6\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage6\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage7\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage7\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage8\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage8\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage9\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage9\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage10\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage10\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage11\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage11\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage12\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage12\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage13\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage13\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage14\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage14\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage16\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage17\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage17\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage18\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage18\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage19\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage19\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage20\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage20\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage21\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage21\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage22\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage22\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage23\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage23\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage5\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage6\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage7\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage8\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage9\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage10\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage11\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage12\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage13\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage14\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage16\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage17\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage18\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage19\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage20\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage21\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage22\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage23\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Samples/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#CycleStepDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/SamplesRaw/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage5\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage5\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage6\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage6\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage7\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage7\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage8\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage8\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage9\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage9\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage10\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage10\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage11\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage11\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage12\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage12\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage13\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage13\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage14\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage14\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage15\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage15\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage16\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage17\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage17\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage18\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage18\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage19\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage19\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage20\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage20\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage21\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage21\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage22\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage22\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage23\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage23\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage24\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage24\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage5\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage6\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage7\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage8\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage9\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage10\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage11\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage12\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage13\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage14\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage15\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage16\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage17\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage18\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage19\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage20\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage21\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage22\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage23\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage24\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/SamplesRaw/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/SamplesRaw/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"title\": \"Any\",\n      \"type\": [\n        \"number\",\n        \"null\",\n        \"object\",\n        \"array\",\n        \"string\",\n        \"integer\",\n        \"boolean\"\n      ]\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage5\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage5\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage5\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/SamplesRaw/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage5\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage5\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage6\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage6\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage7\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage7\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage8\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage8\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage9\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage9\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage10\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage10\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage11\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage11\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage12\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage12\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage13\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage13\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage5\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage6\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage7\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage8\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage9\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage10\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage11\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage12\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage13\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/SamplesRaw/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage5\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage5\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage6\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage6\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage7\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage7\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage8\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage8\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage9\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage9\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage10\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage10\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage11\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage11\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage12\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage12\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage13\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage13\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage14\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage14\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage16\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage17\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage17\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage18\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage18\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage19\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage19\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage20\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage20\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage21\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage21\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage22\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage22\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage23\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage23\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage5\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage6\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage7\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage8\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage9\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage10\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage11\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage12\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage13\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage14\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage16\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage17\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage18\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage19\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage20\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage21\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage22\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage23\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/SamplesRaw/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessages\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage2\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage2\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage3\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage3\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessage4\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessage4\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"NodeId\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"EndpointUrl\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"ApplicationUri\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DisplayName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Timestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        },\n        \"SequenceNumber\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"ExtensionFields\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.MonitoredItemMessages\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#MonitoredItemMessages\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage1\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage2\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage3\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.MonitoredItemMessage4\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Single/CyclicReads.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Number\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Number\",\n      \"title\": \"OPC UA built in type Number\",\n      \"type\": \"number\"\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Number\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"i=2258\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"ns=23;i=1259\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Single/KeepAlive.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ServerState\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ServerState\",\n      \"title\": \"ServerState\",\n      \"type\": \"integer\",\n      \"enum\": [\n        0,\n        1,\n        2,\n        3,\n        4,\n        5,\n        6,\n        7\n      ],\n      \"format\": \"int32\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ServerStateDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ServerStateDataValue\",\n      \"title\": \"Dataset Field of Type ServerState\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ServerState\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"State\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ServerStateDataValue\"\n        }\n      }\n    },\n    \"org.opcfoundation.UA.i_x61_14593\": {\n      \"$id\": \"http://opcfoundation.org/UA/#i%3d14593\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MajorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"MinorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MetaDataVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.i_x61_14593\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetWriterName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"MetaDataVersion\",\n        \"MessageType\",\n        \"DataSetWriterName\",\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Single/KeyFrames.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Variant\": {\n      \"title\": \"Any\",\n      \"type\": [\n        \"number\",\n        \"null\",\n        \"object\",\n        \"array\",\n        \"string\",\n        \"integer\",\n        \"boolean\"\n      ]\n    },\n    \"org.github.microsoft.opcpublisher.NumberDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NumberDataValue\",\n      \"title\": \"Dataset Field of Type Number\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"title\": \"Any\",\n          \"type\": [\n            \"number\",\n            \"null\",\n            \"object\",\n            \"array\",\n            \"string\",\n            \"integer\",\n            \"boolean\"\n          ]\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Float\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Float\",\n      \"title\": \"OPC UA built in type Float\",\n      \"type\": \"number\",\n      \"minimum\": -3.4028235E+38,\n      \"maximum\": 3.4028235E+38,\n      \"default\": 0,\n      \"format\": \"float\"\n    },\n    \"org.github.microsoft.opcpublisher.FloatDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#FloatDataValue\",\n      \"title\": \"Dataset Field of Type Float\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Float\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"CurrentTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"EngineeringUnits\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"AssetId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NumberDataValue\"\n        },\n        \"Important\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"Variance\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.FloatDataValue\"\n        }\n      }\n    },\n    \"org.opcfoundation.UA.i_x61_14593\": {\n      \"$id\": \"http://opcfoundation.org/UA/#i%3d14593\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MajorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"MinorVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"MetaDataVersion\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.i_x61_14593\"\n        },\n        \"MessageType\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"DataSetWriterName\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"MetaDataVersion\",\n        \"MessageType\",\n        \"DataSetWriterName\",\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Single/PendingAlarms.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.NodeId\": {\n      \"$id\": \"http://opcfoundation.org/UA/#NodeId\",\n      \"title\": \"OPC UA built in type NodeId\",\n      \"type\": \"string\",\n      \"format\": \"opcuaNodeId\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdDataValue\",\n      \"title\": \"Dataset Field of Type NodeId\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.NodeIdArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#NodeIdArrayDataValue\",\n      \"title\": \"Dataset Field of Type NodeIdArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.NodeId\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextArrayDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedTextArray\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n          }\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int16\",\n      \"title\": \"OPC UA built in type Int16\",\n      \"type\": \"integer\",\n      \"minimum\": -32768,\n      \"maximum\": 32767,\n      \"default\": 0,\n      \"format\": \"int16\"\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.opcfoundation.UA.TimeZoneDataType\": {\n      \"$id\": \"http://opcfoundation.org/UA/#TimeZoneDataType\",\n      \"title\": \"TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Offset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int16\"\n        },\n        \"DaylightSavingInOffset\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        }\n      },\n      \"required\": [\n        \"Offset\",\n        \"DaylightSavingInOffset\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#TimeZoneDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type TimeZoneDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.TimeZoneDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DateTimeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DateTimeDataValue\",\n      \"title\": \"Dataset Field of Type DateTime\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.UInt16DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt16DataValue\",\n      \"title\": \"Dataset Field of Type UInt16\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"ConditionClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"ConditionClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"ConditionSubClassId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdArrayDataValue\"\n        },\n        \"ConditionSubClassName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextArrayDataValue\"\n        },\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"EventType\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"LocalTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.TimeZoneDataTypeDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"ReceiveTime\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        },\n        \"Severity\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt16DataValue\"\n        },\n        \"SourceName\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"SourceNode\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.NodeIdDataValue\"\n        },\n        \"Time\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DateTimeDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Single/PlcSimulation.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSets\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.UInt32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#UInt32DataValue\",\n      \"title\": \"Dataset Field of Type UInt32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Boolean\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Boolean\",\n      \"title\": \"OPC UA built in type Boolean\",\n      \"type\": \"boolean\"\n    },\n    \"org.github.microsoft.opcpublisher.BooleanDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#BooleanDataValue\",\n      \"title\": \"Dataset Field of Type Boolean\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Boolean\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Int32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Int32\",\n      \"title\": \"OPC UA built in type Int32\",\n      \"type\": \"integer\",\n      \"minimum\": -2147483648,\n      \"maximum\": 2147483647,\n      \"default\": 0,\n      \"format\": \"int32\"\n    },\n    \"org.github.microsoft.opcpublisher.Int32DataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#Int32DataValue\",\n      \"title\": \"Dataset Field of Type Int32\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Int32\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.github.microsoft.opcpublisher.DoubleDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DoubleDataValue\",\n      \"title\": \"Dataset Field of Type Double\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.BooleanDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.Int32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DoubleDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet1\",\n      \"title\": \"DataSet1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        },\n        \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.UInt32DataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage1\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage1\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet1\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSets\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSets\",\n      \"type\": \"object\",\n      \"oneOf\": [\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\"\n        },\n        {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage1\"\n        }\n      ]\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Schemas/JsonSchema/Single/SimpleEvents.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSetMessage\",\n  \"definitions\": {\n    \"org.opcfoundation.UA.ByteString\": {\n      \"$id\": \"http://opcfoundation.org/UA/#ByteString\",\n      \"title\": \"OPC UA built in type ByteString\",\n      \"type\": \"string\",\n      \"format\": \"byte\"\n    },\n    \"org.opcfoundation.UA.UInt32\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt32\",\n      \"title\": \"OPC UA built in type UInt32\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 4294967295,\n      \"default\": 0,\n      \"format\": \"uint32\"\n    },\n    \"org.opcfoundation.UA.String\": {\n      \"$id\": \"http://opcfoundation.org/UA/#String\",\n      \"title\": \"OPC UA built in type String\",\n      \"type\": \"string\"\n    },\n    \"org.opcfoundation.UA.StatusCode\": {\n      \"$id\": \"http://opcfoundation.org/UA/#StatusCode\",\n      \"title\": \"OPC UA built in type StatusCode\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Code\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt32\"\n        },\n        \"Symbol\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.DateTime\": {\n      \"$id\": \"http://opcfoundation.org/UA/#DateTime\",\n      \"title\": \"OPC UA built in type DateTime\",\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"org.opcfoundation.UA.UInt16\": {\n      \"$id\": \"http://opcfoundation.org/UA/#UInt16\",\n      \"title\": \"OPC UA built in type UInt16\",\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 65535,\n      \"default\": 0,\n      \"format\": \"uint16\"\n    },\n    \"org.github.microsoft.opcpublisher.ByteStringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#ByteStringDataValue\",\n      \"title\": \"Dataset Field of Type ByteString\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.ByteString\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.LocalizedText\": {\n      \"$id\": \"http://opcfoundation.org/UA/#LocalizedText\",\n      \"title\": \"OPC UA built in type LocalizedText\",\n      \"type\": \"string\"\n    },\n    \"org.github.microsoft.opcpublisher.LocalizedTextDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#LocalizedTextDataValue\",\n      \"title\": \"Dataset Field of Type LocalizedText\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.LocalizedText\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.StringDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#StringDataValue\",\n      \"title\": \"Dataset Field of Type String\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.opcfoundation.UA.Double\": {\n      \"$id\": \"http://opcfoundation.org/UA/#Double\",\n      \"title\": \"OPC UA built in type Double\",\n      \"type\": \"number\",\n      \"minimum\": -1.7976931348623157E+308,\n      \"maximum\": 1.7976931348623157E+308,\n      \"default\": 0,\n      \"format\": \"double\"\n    },\n    \"org.opcfoundation.SimpleEvents.CycleStepDataType\": {\n      \"$id\": \"http://opcfoundation.org/SimpleEvents#CycleStepDataType\",\n      \"title\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Name\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.String\"\n        },\n        \"Duration\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.Double\"\n        }\n      },\n      \"required\": [\n        \"Name\",\n        \"Duration\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#CycleStepDataTypeDataValue\",\n      \"title\": \"Dataset Field of Type CycleStepDataType\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Value\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.SimpleEvents.CycleStepDataType\"\n        },\n        \"Status\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.StatusCode\"\n        },\n        \"SourceTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"SourcePicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        },\n        \"ServerTimestamp\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.DateTime\"\n        },\n        \"ServerPicoSeconds\": {\n          \"$ref\": \"#/definitions/org.opcfoundation.UA.UInt16\"\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"org.github.microsoft.opcpublisher.DataSet\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSet\",\n      \"title\": \"DataSet\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"EventId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.ByteStringDataValue\"\n        },\n        \"Message\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.LocalizedTextDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CycleId\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.StringDataValue\"\n        },\n        \"http://opcfoundation.org/SimpleEvents#CurrentStep\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.CycleStepDataTypeDataValue\"\n        }\n      }\n    },\n    \"org.github.microsoft.opcpublisher.DataSetMessage\": {\n      \"$id\": \"http://github.org/microsoft/opcpublisher#DataSetMessage\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"Payload\": {\n          \"$ref\": \"#/definitions/org.github.microsoft.opcpublisher.DataSet\"\n        }\n      },\n      \"required\": [\n        \"Payload\"\n      ],\n      \"additionalProperties\": false\n    }\n  }\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderBooleanTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderBooleanTests\n    {\n        [Fact]\n        public void DecodeEncodeBooleanFromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(true);\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(true, true, false);\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromJValueTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(true);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromJArrayTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(true, true, false);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"true\";\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"true, true, false\";\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[true, true, false]\";\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant(System.Array.Empty<bool>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"true\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromStringTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"true, true, false\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromStringTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[true, true, false]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"true\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  'true'\";\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"true\\\",'true',\\\"false\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"true\\\",'true',\\\"false\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Boolean\",\n                Body = true\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Boolean\",\n                Body = new bool[] { true, true, false }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Boolean\",\n                Body = System.Array.Empty<bool>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<bool>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Boolean\",\n                Body = true\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Boolean\",\n                Body = new bool[] { true, true, false }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Boolean\",\n                Body = true\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"BOOLEAN\",\n                BODY = new bool[] { true, true, false }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Boolean\",\n                Body = System.Array.Empty<bool>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<bool>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"boolean\",\n                Body = true\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Boolean\",\n                body = new bool[] { true, true, false }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"Boolean\",\n                Value = true\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanFromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"Boolean\",\n                Value = true\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(true);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(true), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Boolean\",\n                value = new bool[] { true, true, false }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([true, true, false]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(true, true, false), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeBooleanMatrixFromStringJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new bool[,,] {\n                { { true, false, true }, { true, false, true }, { true, false, true } },\n                { { true, false, true }, { true, false, true }, { true, false, true } },\n                { { true, false, true }, { true, false, true }, { true, false, true } },\n                { { true, false, true }, { true, false, true }, { true, false, true } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanMatrixFromStringJsonTypeBoolean()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new bool[,,] {\n                { { true, false, true }, { true, false, true }, { true, false, true } },\n                { { true, false, true }, { true, false, true }, { true, false, true } },\n                { { true, false, true }, { true, false, true }, { true, false, true } },\n                { { true, false, true }, { true, false, true }, { true, false, true } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Boolean);\n            var expected = new Variant((object)new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanMatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Boolean\",\n                body = new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanMatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Boolean\",\n                value = new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanMatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Boolean\",\n                body = new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeBooleanMatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Boolean\",\n                value = new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new bool[,,] {\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } },\n                    { { true, false, true }, { true, false, true }, { true, false, true } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderByteTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderByteTests\n    {\n        [Fact]\n        public void DecodeEncodeByteFromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(123);\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray((byte)123, (byte)124, (byte)125);\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayTypeByteStringFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(\"{|}\"u8.ToArray());\n            var variant = codec.Decode(str, BuiltInType.ByteString);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromJValueTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(123);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromJArrayTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray((byte)123, (byte)124, (byte)125);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant(System.Array.Empty<byte>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromStringTypeIntegerIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromStringTypeIntegerIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(new Variant[] {\n                new(123L), new(124L), new(125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromStringTypeIntegerIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromStringTypeNumberIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromStringTypeNumberIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(123L), new(124L), new(125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromStringTypeNumberIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeByteArrayFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromStringTypeNullIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"123\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '123'\";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"123\\\",'124',\\\"125\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"123\\\",'124',\\\"125\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Byte\",\n                Body = 123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Byte\",\n                Body = \"{|}\"u8.ToArray()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Byte\",\n                Body = System.Array.Empty<byte>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<byte>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonTokenTypeVariant3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"ByteString\",\n                Body = \"{|}\"u8.ToArray()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"{|}\"u8.ToArray()), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Byte\",\n                Body = 123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonStringTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Byte\",\n                Body = \"{|}\"u8.ToArray()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonStringTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"ByteString\",\n                Body = \"{|}\"u8.ToArray()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"{|}\"u8.ToArray()), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Byte\",\n                Body = (byte)123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"BYTE\",\n                BODY = \"{|}\"u8.ToArray()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Byte\",\n                Body = System.Array.Empty<byte>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<byte>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"byte\",\n                Body = (byte)123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Byte\",\n                body = \"{|}\"u8.ToArray()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"Byte\",\n                Value = 123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteFromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"Byte\",\n                Value = (byte)123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((byte)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"Byte\",\n                value = \"{|}\"u8.ToArray()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(\"{|}\"u8.ToArray());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((byte)123, (byte)124, (byte)125), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeByteMatrixFromStringJsonTypeByte()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new byte[,,] {\n                { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant((object)new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteMatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Byte\",\n                body = new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteMatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Byte\",\n                value = new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteMatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Byte\",\n                body = new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeByteMatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Byte\",\n                value = new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new byte[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderDoubleTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderDoubleTests\n    {\n        [Fact]\n        public void DecodeEncodeDoubleFromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123.123);\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(-123.123, 124.124, 0.0);\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromJValueTypeNullIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123.123);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromJArrayTypeNullIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(-123.123, 124.124, 0.0);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromString1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123\";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant(-123.0);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.0), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123, 124.124, 0.0\";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123.123, 124.124, 0.0]\";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant(System.Array.Empty<double>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromStringTypeNumberIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromStringTypeNumberIsDouble1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123.123, 124.124, 0.0]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(-123.123), new(124.124), new(0.0)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromStringTypeNumberIsDouble2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromStringTypeNullIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromStringTypeNullIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123, 124.124, 0.0\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromStringTypeNullIsDouble2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123.123, 124.124, 0.0]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123.123\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '-123.123'\";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123.123\\\",'124.124',\\\"0.0\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"-123.123\\\",'124.124',\\\"0.0\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Double\",\n                Body = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Double\",\n                Body = new double[] { -123.123, 124.124, 0.0 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Double\",\n                Body = System.Array.Empty<double>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<double>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Double\",\n                Body = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Double\",\n                Body = new double[] { -123.123, 124.124, 0.0 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Double\",\n                Body = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"DOUBLE\",\n                BODY = new double[] { -123.123, 124.124, 0.0 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Double\",\n                Body = System.Array.Empty<double>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<double>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"double\",\n                Body = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Double\",\n                body = new double[] { -123.123, 124.124, 0.0 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"Double\",\n                Value = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleFromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"Double\",\n                Value = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"Double\",\n                value = new double[] { -123.123, 124.124, 0.0 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeDoubleMatrixFromStringJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new double[,,] {\n                { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleMatrixFromStringJsonTypeDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new double[,,] {\n                { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Double);\n            var expected = new Variant((object)new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleMatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Double\",\n                body = new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleMatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Double\",\n                value = new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleMatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Double\",\n                body = new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeDoubleMatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Double\",\n                value = new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new double[,,] {\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } },\n                    { { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 }, { 123.456, 124.567, 125.0 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Opc.Ua;\n\n    /// <summary>\n    /// Variant encoder extensions\n    /// </summary>\n    public static class Extensions\n    {\n        /// <summary>\n        /// Format variant as string\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static VariantValue Encode(this IVariantEncoder encoder, Variant value)\n        {\n            return encoder.Encode(value, out _);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderFloatTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderFloatTests\n    {\n        [Fact]\n        public void DecodeEncodeFloatFromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123.123f);\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(-123.123f, 124.124f, 0.0f);\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromJArrayTypeNullIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(-123.123f, 124.124f, 0.0f);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str,\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromString1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123\";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant(-123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123, 124.124, 0.0\";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123.123, 124.124, 0.0]\";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant(System.Array.Empty<float>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromStringTypeNumberIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromStringTypeNumberIsDouble1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123.123, 124.124, 0.0]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(-123.123), new(124.124), new(0.0)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromStringTypeNumberIsDouble2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromStringTypeNullIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123),\n                encoded);\n        }\n        [Fact]\n        public void DecodeEncodeFloatArrayFromStringTypeNullIsDouble()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123.123, 124.124, 0.0\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromStringTypeNullIsDouble2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123.123, 124.124, 0.0]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123, 124.124, 0.0]);\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123, 124.124, 0.0),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123.123\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '-123.123'\";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123.123\\\",'124.124',\\\"0.0\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"-123.123\\\",'124.124',\\\"0.0\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Float\",\n                Body = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Float\",\n                Body = new float[] { -123.123f, 124.124f, 0.0f }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Float\",\n                Body = System.Array.Empty<float>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<float>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Float\",\n                Body = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Float\",\n                Body = new float[] { -123.123f, 124.124f, 0.0f }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Float\",\n                Body = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"FLOAT\",\n                BODY = new float[] { -123.123f, 124.124f, 0.0f }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Float\",\n                Body = System.Array.Empty<float>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<float>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"float\",\n                Body = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Float\",\n                body = new float[] { -123.123f, 124.124f, 0.0f }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"Float\",\n                Value = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatFromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"Float\",\n                Value = -123.123f\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123.123f);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123.123f),\n                encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"Float\",\n                value = new float[] { -123.123f, 124.124f, 0.0f }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123.123f, 124.124f, 0.0f]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123.123f, 124.124f, 0.0f),\n                encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeFloatMatrixFromStringJsonTypeFloat()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new float[,,] {\n                { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Float);\n            var expected = new Variant((object)new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatMatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Float\",\n                body = new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatMatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Float\",\n                value = new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatMatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Float\",\n                body = new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeFloatMatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Float\",\n                value = new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new float[,,] {\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } },\n                    { { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f }, { -123.456f, 124.567f, -125.0f } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderInt16Tests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderInt16Tests\n    {\n        [Fact]\n        public void DecodeEncodeInt16FromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123);\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray((short)-123, (short)-124, (short)-125);\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromJValueTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromJArrayTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray((short)-123, (short)-124, (short)-125);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123, -124, -125\";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant(System.Array.Empty<short>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromStringTypeIntegerIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromStringTypeIntegerIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(new Variant[] {\n                new(-123L), new(-124L), new(-125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromStringTypeIntegerIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromStringTypeNumberIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromStringTypeNumberIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(-123L), new(-124L), new(-125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromStringTypeNumberIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123, -124, -125\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromStringTypeNullIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '-123'\";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123\\\",'-124',\\\"-125\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"-123\\\",'-124',\\\"-125\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int16\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int16\",\n                Body = new short[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int16\",\n                Body = System.Array.Empty<short>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<short>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Int16\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Int16\",\n                Body = new short[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int16\",\n                Body = (short)-123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"INT16\",\n                BODY = new short[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int16\",\n                Body = System.Array.Empty<short>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<short>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"int16\",\n                Body = (short)-123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int16\",\n                body = new short[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"Int16\",\n                Value = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16FromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"Int16\",\n                Value = (short)-123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((short)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16ArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"Int16\",\n                value = new short[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new short[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((short)-123, (short)-124, (short)-125), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeInt16MatrixFromStringJsonTypeInt16()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new short[,,] {\n                { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant((object)new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16MatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int16\",\n                body = new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16MatrixFromVariantJsonTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Int16\",\n                value = new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16MatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int16\",\n                body = new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt16MatrixFromVariantJsonTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Int16\",\n                value = new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new short[,,] {\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } },\n                    { { -123, 124, -125 }, { -123, 124, -125 }, { -123, 124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderInt32Tests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderInt32Tests\n    {\n        [Fact]\n        public void DecodeEncodeInt32FromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123);\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(-123, -124, -125);\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromJValueTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromJArrayTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(-123, -124, -125);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123, -124, -125\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant(System.Array.Empty<int>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromStringTypeIntegerIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromStringTypeIntegerIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(new Variant[] {\n                new(-123L), new(-124L), new(-125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromStringTypeIntegerIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromStringTypeNumberIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromStringTypeNumberIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(-123L), new(-124L), new(-125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromStringTypeNumberIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123, -124, -125\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromStringTypeNullIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '-123'\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123\\\",'-124',\\\"-125\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"-123\\\",'-124',\\\"-125\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int32\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int32\",\n                Body = new int[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int32\",\n                Body = System.Array.Empty<int>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<int>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Int32\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Int32\",\n                Body = new int[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int32\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"INT32\",\n                BODY = new int[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int32\",\n                Body = System.Array.Empty<int>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<int>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"int32\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int32\",\n                body = new int[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"Int32\",\n                Value = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32FromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"Int32\",\n                Value = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32ArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"Int32\",\n                value = new int[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([-123, -124, -125]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123, -124, -125), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeInt32MatrixFromStringJsonStringTypeInt32()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new int[,,] {\n                { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant((object)new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32MatrixFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int32\",\n                body = new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32MatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Int32\",\n                value = new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32MatrixFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int32\",\n                body = new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt32MatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Int32\",\n                value = new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new int[,,] {\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } },\n                    { { 123, -124, 125 }, { 123, -124, 125 }, { 123, -124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderInt64Tests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderInt64Tests\n    {\n        [Fact]\n        public void DecodeEncodeInt64FromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123L);\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(-123L, -124L, -125L);\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromJValueTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123L);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromJArrayTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(-123L, -124L, -125L);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123, -124, -125\";\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(System.Array.Empty<long>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromStringTypeIntegerIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromStringTypeIntegerIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(new Variant[] {\n                new(-123L), new(-124L), new(-125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromStringTypeIntegerIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromStringTypeNumberIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromStringTypeNumberIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(-123L), new(-124L), new(-125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromStringTypeNumberIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123, -124, -125\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromStringTypeNullIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '-123'\";\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123\\\",'-124',\\\"-125\\\"\";\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"-123\\\",'-124',\\\"-125\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int64\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int64\",\n                Body = new long[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int64\",\n                Body = System.Array.Empty<long>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<long>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Int64\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"Int64\",\n                Body = new long[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int64\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"INT64\",\n                BODY = new long[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"Int64\",\n                Body = System.Array.Empty<long>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<long>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"int64\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int64\",\n                body = new long[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"Int64\",\n                Value = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64FromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"Int64\",\n                Value = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123L), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64ArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"Int64\",\n                value = new long[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(-123L, -124L, -125L), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeInt64MatrixFromStringJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new long[,,] {\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new long[,,] {\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n            });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64MatrixFromStringJsonTypeInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new long[,,] {\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Int64);\n            var expected = new Variant((object)new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64MatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int64\",\n                body = new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64MatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Int64\",\n                value = new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64MatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"Int64\",\n                body = new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeInt64MatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"Int64\",\n                value = new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new long[,,] {\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } },\n                    { { 123L, -124L, -125L }, { 123L, -124L, -125L }, { 123L, -124L, -125L } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderMiscTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System.Xml;\n    using Xunit;\n\n    public class VariantEncoderMiscTests\n    {\n        [Fact]\n        public void DecodeEncodeStringAsUInt32()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.UInt32);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringAsInt32()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-1\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant(-1);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringAsSbyte()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-12\";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant((sbyte)-12);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringAsByte()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"1\";\n            var variant = codec.Decode(str, BuiltInType.Byte);\n            var expected = new Variant((byte)1);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeString1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\\\\\"fffffffff\\\\\\\"\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(str);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"fffffffff\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(str);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"fffffffff\\\"\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(\"fffffffff\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(\"fffffffff\", encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeIntArray1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"1,2,3,4,5,6\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant([1, 2, 3, 4, 5, 6]);\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeIntArray2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[1,2,3,4,5,6]\";\n            var variant = codec.Decode(str, BuiltInType.Int32);\n            var expected = new Variant([1, 2, 3, 4, 5, 6]);\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"test1\\\", \\\"test2\\\"\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant([\"test1\", \"test2\"]);\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEmptyStringArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(System.Array.Empty<string>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.True(encoded.Equals(str));\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEmptyShortArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Int16);\n            var expected = new Variant(System.Array.Empty<short>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.True(encoded.Equals(str));\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void EncodeDecodeXmlElement()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var doc = new XmlDocument();\n            doc.LoadXml(\n          \"\"\"\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n            <note>\n                <to>Tove</to>\n                <from>Jani</from>\n                <heading test=\"1.0\">Reminder</heading>\n                <author><nothing/></author>\n                <body>Don't forget me this weekend!</body>\n            </note>\n\"\"\"\n            );\n            var expected = new Variant(doc.DocumentElement);\n            var encoded = codec.Encode(expected);\n            var variant = codec.Decode(encoded, BuiltInType.XmlElement);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeLocalizedText()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var expected = new Variant(new LocalizedText(\"en-US\", \"text\"));\n            var encoded = codec.Encode(expected);\n            var variant = codec.Decode(encoded, BuiltInType.LocalizedText);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeLocalizedTextFromString1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"text@en-US\";\n            var expected = new Variant(new LocalizedText(\"en-US\", \"text\"));\n            var variant = codec.Decode(str, BuiltInType.LocalizedText);\n            var encoded = codec.Encode(expected);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeLocalizedTextFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"text\";\n            var expected = new Variant(new LocalizedText(\"text\"));\n            var variant = codec.Decode(str, BuiltInType.LocalizedText);\n            var encoded = codec.Encode(expected);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeNodeId()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n\n            var expected = new Variant(new NodeId(2354));\n\n            var encoded = codec.Encode(expected);\n            var variant = codec.Decode(encoded, BuiltInType.NodeId);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeId1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n\n            var expected = new Variant(new ExpandedNodeId(2354u, 0, \"http://test.org/test\", 0));\n\n            var encoded = codec.Encode(expected);\n            var variant = codec.Decode(encoded, BuiltInType.ExpandedNodeId);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeId2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n\n            var expected = new Variant(new ExpandedNodeId(2354u, 0, \"http://test/\", 0));\n\n            var encoded = codec.Encode(expected);\n            var variant = codec.Decode(encoded, BuiltInType.ExpandedNodeId);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeExpandedNodeId3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n\n            var expected1 = new Variant(new ExpandedNodeId(2354u, 0, \"http://test/\", 0));\n            var expected2 = new Variant(new ExpandedNodeId(2354u, 0, \"http://test/UA\", 0));\n            var expected3 = new Variant(new ExpandedNodeId(2355u, 0, \"http://test/\", 0));\n            var expected4 = new Variant(new ExpandedNodeId(2355u, 0, null, 0));\n            var expected5 = new Variant(new ExpandedNodeId(new NodeId(2355u, 1), \"http://test/\", 0));\n\n            var encoded1 = codec.Encode(expected1);\n            var encoded2 = codec.Encode(expected2);\n            var encoded3 = codec.Encode(expected3);\n            var encoded4 = codec.Encode(expected4);\n            var encoded5 = codec.Encode(expected5);\n\n            var variant1 = codec.Decode(encoded1, BuiltInType.ExpandedNodeId);\n            var variant2 = codec.Decode(encoded2, BuiltInType.ExpandedNodeId);\n            var variant3 = codec.Decode(encoded3, BuiltInType.ExpandedNodeId);\n            var variant4 = codec.Decode(encoded4, BuiltInType.ExpandedNodeId);\n            var variant5 = codec.Decode(encoded5, BuiltInType.ExpandedNodeId);\n\n            Assert.Equal(expected1, variant1);\n            Assert.Equal(expected2, variant2);\n            Assert.Equal(expected3, variant3);\n            Assert.Equal(expected4, variant4);\n            Assert.Equal(expected5, variant5);\n        }\n\n        [Fact]\n        public void EncodeDecodeArgument1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n\n            var expected = new Variant(new ExtensionObject\n            {\n                Body = new Argument(\"something1\", new NodeId(2354), -1, \"somedesciroeioi\")\n                {\n                    ArrayDimensions = System.Array.Empty<uint>()\n                },\n                TypeId = DataTypeIds.Argument\n            });\n\n            var encoded = codec.Encode(expected);\n            var variant = codec.Decode(encoded, BuiltInType.ExtensionObject);\n            var obj = variant.Value as ExtensionObject;\n\n            Assert.NotNull(obj);\n            Assert.Equal(ExtensionObjectEncoding.EncodeableObject, obj.Encoding);\n            Assert.True(obj.Body is Argument);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeArgument2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n\n            var expected = new Variant(new ExtensionObject\n            {\n                Body = new Argument(\"something2\", new NodeId(2334), -1, \"asdfsadfffd\")\n                {\n                    ArrayDimensions = System.Array.Empty<uint>()\n                }.AsXmlElement(ServiceMessageContext.GlobalContext),\n                TypeId = new ExpandedNodeId(444444, \"http://test.org\")\n            });\n\n            var encoded = codec.Encode(expected);\n            var variant = codec.Decode(encoded, BuiltInType.ExtensionObject);\n            var obj = variant.Value as ExtensionObject;\n\n            Assert.NotNull(obj);\n            Assert.Equal(ExtensionObjectEncoding.Xml, obj.Encoding);\n            Assert.True(obj.Body is XmlElement);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void EncodeDecodeArgument3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n\n            var expected = new Variant(new ExtensionObject\n            {\n                Body = new Argument(\"something3\", new NodeId(2364), -1, \"dd f s fdd fd\")\n                {\n                    ArrayDimensions = System.Array.Empty<uint>()\n                }.AsBinary(ServiceMessageContext.GlobalContext),\n                TypeId = new ExpandedNodeId(444445, \"http://test.org/\")\n            });\n\n            var encoded = codec.Encode(expected);\n            var variant = codec.Decode(encoded, BuiltInType.ExtensionObject);\n            var obj = variant.Value as ExtensionObject;\n\n            Assert.NotNull(obj);\n            Assert.Equal(ExtensionObjectEncoding.Binary, obj.Encoding);\n            Assert.True(obj.Body is byte[]);\n            Assert.Equal(expected, variant);\n        }\n\n        private readonly IJsonSerializer _serializer = new NewtonsoftJsonSerializer();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderSByteTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderSByteTests\n    {\n        [Fact]\n        public void DecodeEncodeSByteFromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123);\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125);\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromJValueTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(-123);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromJArrayTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123, -124, -125\";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant(System.Array.Empty<sbyte>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromStringTypeIntegerIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromStringTypeIntegerIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(new Variant[] {\n                new(-123L), new(-124L), new(-125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromStringTypeIntegerIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromStringTypeNumberIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromStringTypeNumberIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(-123L), new(-124L), new(-125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromStringTypeNumberIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(-123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeSByteArrayFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"-123, -124, -125\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromStringTypeNullIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[-123, -124, -125]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123\\\"\";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '-123'\";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"-123\\\",'-124',\\\"-125\\\"\";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"-123\\\",'-124',\\\"-125\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"SByte\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"SByte\",\n                Body = new sbyte[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"SByte\",\n                Body = System.Array.Empty<sbyte>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<sbyte>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"SByte\",\n                Body = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"SByte\",\n                Body = new sbyte[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"SByte\",\n                Body = (sbyte)-123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"SBYTE\",\n                BODY = new sbyte[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"SByte\",\n                Body = System.Array.Empty<sbyte>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<sbyte>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"sbyte\",\n                Body = (sbyte)-123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"SByte\",\n                body = new sbyte[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"SByte\",\n                Value = -123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteFromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"SByte\",\n                Value = (sbyte)-123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((sbyte)-123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(-123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"SByte\",\n                value = new sbyte[] { -123, -124, -125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new sbyte[] { -123, -124, -125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((sbyte)-123, (sbyte)-124, (sbyte)-125), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeSByteMatrixFromStringJsonTypeSByte()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new sbyte[,,] {\n                { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n            });\n            var variant = codec.Decode(str, BuiltInType.SByte);\n            var expected = new Variant((object)new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteMatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"SByte\",\n                body = new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteMatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"SByte\",\n                value = new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteMatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"SByte\",\n                body = new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeSByteMatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"SByte\",\n                value = new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new sbyte[,,] {\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } },\n                    { { 123, -124, -125 }, { 123, -124, -125 }, { 123, -124, -125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderStringTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderStringTests\n    {\n        [Fact]\n        public void DecodeEncodeStringFromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(\"\");\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(\"\", \"\", \"\");\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant([\"\", \"\", \"\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromJValueTypeNullIsString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(\"\");\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromJArrayTypeNullIsString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(\"\", \"\", \"\");\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([\"\", \"\", \"\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(\"123\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"123\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(\"123, 124, 125\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[test, test, test]\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(str);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant([\"123\", \"124\", \"125\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"123\", \"124\", \"125\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromString4()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(System.Array.Empty<string>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromStringTypeNullIsString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"test\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(\"test\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"test\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromStringTypeNullIsString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"test, test, test\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([\"test\", \"test\", \"test\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"test\", \"test\", \"test\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromStringTypeNullIsString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[\\\"test\\\", \\\"test\\\", \\\"test\\\"]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([\"test\", \"test\", \"test\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"test\", \"test\", \"test\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromStringTypeNullIsString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[test, test, test]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([\"[test\", \"test\", \"test]\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"[test\", \"test\", \"test]\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromQuotedString1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"test\\\"\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(\"test\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"test\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"\\\\\\\"test\\\\\\\"\\\"\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(\"\\\"test\\\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"\\\"test\\\"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  'test'\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant(\"test\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"test\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromQuotedString1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"test\\\",'test',\\\"test\\\"\";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant([\"test\", \"test\", \"test\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"test\", \"test\", \"test\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"test\\\",'test',\\\"test\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant([\"test\", \"test\", \"test\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"test\", \"test\", \"test\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromQuotedString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"\\\\\\\"test\\\\\\\"\\\",'\\\\\\\"test\\\\\\\"',\\\"\\\\\\\"test\\\\\\\"\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant([\"test\", \"test\", \"test\"]);\n            // TODO: var expected = new Variant(new string[] { \"\\\"test\\\"\", \"\\\"test\\\"\", \"\\\"test\\\"\" });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            // TODO: Assert.Equal(_serializer.FromArray(\"\\\"test\\\"\", \"\\\"test\\\"\", \"\\\"test\\\"\"), encoded);\n            Assert.Equal(_serializer.FromArray(\"test\", \"test\", \"test\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"String\",\n                Body = \"\"\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"String\",\n                Body = new string[] { \"\", \"\", \"\" }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([\"\", \"\", \"\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"\", \"\", \"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"String\",\n                Body = System.Array.Empty<string>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<string>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"String\",\n                Body = \"\"\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"String\",\n                Body = new string[] { \"\", \"\", \"\" }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([\"\", \"\", \"\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"\", \"\", \"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"String\",\n                Body = \"\"\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"STRING\",\n                BODY = new string[] { \"\", \"\", \"\" }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([\"\", \"\", \"\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"\", \"\", \"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"String\",\n                Body = System.Array.Empty<string>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<string>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"string\",\n                Body = \"\"\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"String\",\n                body = new string[] { \"\", \"\", \"\" }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([\"\", \"\", \"\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"\", \"\", \"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"String\",\n                Value = \"\"\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringFromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"String\",\n                Value = \"\"\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(\"\");\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(\"\"), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"String\",\n                value = new string[] { \"\", \"\", \"\" }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([\"\", \"\", \"\"]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(\"\", \"\", \"\"), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeStringMatrixFromStringJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new string[,,] {\n                { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringMatrixFromStringJsonTypeString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new string[,,] {\n                { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n            });\n            var variant = codec.Decode(str, BuiltInType.String);\n            var expected = new Variant((object)new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringMatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"String\",\n                body = new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringMatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"String\",\n                value = new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((object)new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringMatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"String\",\n                body = new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeStringMatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"String\",\n                value = new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((object)new string[,,] {\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } },\n                    { { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" }, { \"test\", \"zhf\", \"33\" } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderUInt16Tests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderUInt16Tests\n    {\n        [Fact]\n        public void DecodeEncodeUInt16FromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(123);\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray((ushort)123, (ushort)124, (ushort)125);\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromJValueTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(123);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromJArrayTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray((ushort)123, (ushort)124, (ushort)125);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant(System.Array.Empty<ushort>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromStringTypeIntegerIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromStringTypeIntegerIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(new Variant[] {\n                new(123L), new(124L), new(125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromStringTypeIntegerIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Integer);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromStringTypeNumberIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromStringTypeNumberIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(123L), new(124L), new(125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromStringTypeNumberIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromStringTypeNullIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"123\\\"\";\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '123'\";\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"123\\\",'124',\\\"125\\\"\";\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"123\\\",'124',\\\"125\\\"] \";\n            var variant = codec.Decode(str, BuiltInType.UInt16);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt16\",\n                Body = 123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt16\",\n                Body = new ushort[] { 123, 124, 125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt16\",\n                Body = System.Array.Empty<ushort>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<ushort>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"UInt16\",\n                Body = 123\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"UInt16\",\n                Body = new ushort[] { 123, 124, 125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt16\",\n                Body = (ushort)123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"UINT16\",\n                BODY = new ushort[] { 123, 124, 125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt16\",\n                Body = System.Array.Empty<ushort>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<ushort>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"uint16\",\n                Body = (ushort)123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt16\",\n                body = new ushort[] { 123, 124, 125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"UInt16\",\n                Value = 123\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16FromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"UInt16\",\n                Value = (ushort)123\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant((ushort)123);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16ArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"UInt16\",\n                value = new ushort[] { 123, 124, 125 }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(new ushort[] { 123, 124, 125 });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray((ushort)123, (ushort)124, (ushort)125), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeUInt16MatrixFromStringJsonStringTypeUInt16()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new ushort[,,] {\n                { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt16);\n            var expected = new Variant((object)new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16MatrixFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt16\",\n                body = new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant((object)new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16MatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"UInt16\",\n                value = new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant((object)new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16MatrixFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt16\",\n                body = new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant((object)new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt16MatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"UInt16\",\n                value = new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant((object)new ushort[,,] {\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } },\n                    { { 123, 124, 125 }, { 123, 124, 125 }, { 123, 124, 125 } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderUInt32Tests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderUInt32Tests\n    {\n        [Fact]\n        public void DecodeEncodeUInt32FromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(123u);\n            var variant = codec.Decode(str, BuiltInType.UInt32);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(123u, 124u, 125u);\n            var variant = codec.Decode(str, BuiltInType.UInt32);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromJValueTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(123u);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromJArrayTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(123u, 124u, 125u);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(new long[] { 123u, 124u, 125u });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant(System.Array.Empty<uint>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromStringTypeIntegerIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Integer);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromStringTypeIntegerIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Integer);\n            var expected = new Variant(new Variant[] {\n                new(123L), new(124L), new(125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromStringTypeIntegerIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Integer);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromStringTypeNumberIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Number);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromStringTypeNumberIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(123L), new(124L), new(125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromStringTypeNumberIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant(new long[] { 123u, 124u, 125u });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromStringTypeNullIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant(new long[] { 123u, 124u, 125u });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"123\\\"\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '123'\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"123\\\",'124',\\\"125\\\"\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"123\\\",'124',\\\"125\\\"] \";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt32\",\n                Body = 123u\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt32\",\n                Body = new uint[] { 123u, 124u, 125u }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt32\",\n                Body = System.Array.Empty<uint>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<uint>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"UInt32\",\n                Body = 123u\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"UInt32\",\n                Body = new uint[] { 123u, 124u, 125u }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt32\",\n                Body = 123u\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"UINT32\",\n                BODY = new uint[] { 123u, 124u, 125u }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt32\",\n                Body = System.Array.Empty<uint>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<uint>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"uint32\",\n                Body = 123u\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt32\",\n                body = new uint[] { 123u, 124u, 125u }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"UInt32\",\n                Value = 123u\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32FromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"UInt32\",\n                Value = 123u\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant(123u);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123u), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32ArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"UInt32\",\n                value = new uint[] { 123u, 124u, 125u }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([123u, 124u, 125u]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123u, 124u, 125u), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeUInt32MatrixFromStringJsonStringTypeUInt32()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new uint[,,] {\n                { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt32);\n            var expected = new Variant((object)new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32MatrixFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt32\",\n                body = new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant((object)new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32MatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"UInt32\",\n                value = new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant((object)new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32MatrixFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt32\",\n                body = new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant((object)new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt32MatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"UInt32\",\n                value = new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant((object)new uint[,,] {\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } },\n                    { { 123u, 124u, 125u }, { 123u, 124u, 125u }, { 123u, 124u, 125u } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/Services/VariantEncoderUInt64Tests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Opc.Ua;\n    using Xunit;\n\n    public class VariantEncoderUInt64Tests\n    {\n        [Fact]\n        public void DecodeEncodeUInt64FromJValue()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(123Lu);\n            var variant = codec.Decode(str, BuiltInType.UInt64);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromJArray()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(123Lu, 124Lu, 125Lu);\n            var variant = codec.Decode(str, BuiltInType.UInt64);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromJValueTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(123Lu);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromJArrayTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromArray(123Lu, 124Lu, 125Lu);\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([123L, 124L, 125L]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(str, encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromString3()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant(System.Array.Empty<ulong>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromStringTypeIntegerIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Integer);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromStringTypeIntegerIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Integer);\n            var expected = new Variant(new Variant[] {\n                new(123L), new(124L), new(125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromStringTypeIntegerIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Integer);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromStringTypeNumberIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Number);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromStringTypeNumberIsInt641()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Number);\n            var expected = new Variant(new Variant[] {\n                new(123L), new(124L), new(125L)\n            });\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromStringTypeNumberIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Number);\n            var expected = new Variant(System.Array.Empty<Variant>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant(123L);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromStringTypeNullIsInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"123, 124, 125\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant([123L, 124L, 125L]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromStringTypeNullIsInt642()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[123, 124, 125]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant([123L, 124L, 125L]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromStringTypeNullIsNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"[]\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = Variant.Null;\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.Equal(expected, variant);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"123\\\"\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromSinglyQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"  '123'\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromQuotedString()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \"\\\"123\\\",'124',\\\"125\\\"\";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromQuotedString2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            const string str = \" [\\\"123\\\",'124',\\\"125\\\"] \";\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromVariantJsonTokenTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt64\",\n                Body = 123Lu\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromVariantJsonTokenTypeVariant1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt64\",\n                Body = new ulong[] { 123Lu, 124Lu, 125Lu }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromVariantJsonTokenTypeVariant2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt64\",\n                Body = System.Array.Empty<ulong>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant(System.Array.Empty<ulong>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"UInt64\",\n                Body = 123Lu\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromVariantJsonStringTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"UInt64\",\n                Body = new ulong[] { 123Lu, 124Lu, 125Lu }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromVariantJsonTokenTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt64\",\n                Body = 123Lu\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromVariantJsonTokenTypeNull1()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                TYPE = \"UINT64\",\n                BODY = new ulong[] { 123Lu, 124Lu, 125Lu }\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromVariantJsonTokenTypeNull2()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                Type = \"UInt64\",\n                Body = System.Array.Empty<ulong>()\n            });\n            var variant = codec.Decode(str, BuiltInType.Null);\n            var expected = new Variant(System.Array.Empty<ulong>());\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                Type = \"uint64\",\n                Body = 123Lu\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromVariantJsonStringTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt64\",\n                body = new ulong[] { 123Lu, 124Lu, 125Lu }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                DataType = \"UInt64\",\n                Value = 123Lu\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64FromVariantJsonStringTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                DataType = \"UInt64\",\n                Value = 123Lu\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant(123Lu);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromObject(123Lu), encoded);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64ArrayFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.FromObject(new\n            {\n                dataType = \"UInt64\",\n                value = new ulong[] { 123Lu, 124Lu, 125Lu }\n            });\n            var variant = codec.Decode(str, BuiltInType.Variant);\n            var expected = new Variant([123Lu, 124Lu, 125Lu]);\n            var encoded = codec.Encode(variant);\n            Assert.Equal(expected, variant);\n            Assert.Equal(_serializer.FromArray(123Lu, 124Lu, 125Lu), encoded);\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        [Fact]\n        public void DecodeEncodeUInt64MatrixFromStringJsonTypeUInt64()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new ulong[,,] {\n                { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n            }\n            );\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.UInt64);\n            var expected = new Variant((object)new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64MatrixFromVariantJsonTypeVariant()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt64\",\n                body = new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant((object)new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64MatrixFromVariantJsonTokenTypeVariantMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"UInt64\",\n                value = new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Variant);\n            var expected = new Variant((object)new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64MatrixFromVariantJsonTypeNull()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                type = \"UInt64\",\n                body = new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant((object)new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n\n        [Fact]\n        public void DecodeEncodeUInt64MatrixFromVariantJsonTokenTypeNullMsftEncoding()\n        {\n            var codec = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var str = _serializer.SerializeToString(new\n            {\n                dataType = \"UInt64\",\n                value = new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                }\n            });\n            var variant = codec.Decode(_serializer.FromObject(str), BuiltInType.Null);\n            var expected = new Variant((object)new ulong[,,] {\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } },\n                    { { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu }, { 123Lu, 124Lu, 125Lu } }\n                });\n            var encoded = codec.Encode(variant);\n            Assert.NotNull(encoded);\n            Assert.True(expected.Value is Matrix);\n            Assert.True(variant.Value is Matrix);\n            Assert.Equal(((Matrix)expected.Value).Elements, ((Matrix)variant.Value).Elements);\n            Assert.Equal(((Matrix)expected.Value).Dimensions, ((Matrix)variant.Value).Dimensions);\n        }\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/VariantVariants.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Security.Cryptography;\n    using System.Text;\n    using System.Xml;\n\n    public sealed record class VariantsHolder(\n        IReadOnlyList<Variant> Variants, TypeInfo TypeInfo)\n    {\n        public override string ToString()\n        {\n            return TypeInfo.ToString();\n        }\n    }\n\n    public sealed record class VariantHolder(Variant Variant)\n    {\n        public override string ToString()\n        {\n            return Variant.TypeInfo.ToString();\n        }\n    }\n\n    public static class VariantVariants\n    {\n        public static IEnumerable<Variant> GetValues()\n        {\n            yield return new Variant(true);\n            yield return new Variant(false);\n            yield return new Variant((sbyte)1);\n            yield return new Variant((sbyte)-1);\n            yield return new Variant((sbyte)0);\n            yield return new Variant(sbyte.MaxValue);\n            yield return new Variant(sbyte.MinValue);\n            yield return new Variant((short)1);\n            yield return new Variant((short)-1);\n            yield return new Variant((short)0);\n            yield return new Variant(short.MaxValue);\n            yield return new Variant(short.MinValue);\n            yield return new Variant(1);\n            yield return new Variant(-1);\n            yield return new Variant(0);\n            yield return new Variant(int.MaxValue);\n            yield return new Variant(int.MinValue);\n            yield return new Variant(1L);\n            yield return new Variant(-1L);\n            yield return new Variant(0L);\n            yield return new Variant(long.MaxValue);\n            yield return new Variant(long.MinValue);\n            yield return new Variant(1UL);\n            yield return new Variant(0UL);\n            yield return new Variant(ulong.MaxValue);\n            yield return new Variant(11790719998462990154);\n            yield return new Variant(10042278942021613161);\n            yield return new Variant(1u);\n            yield return new Variant(0u);\n            yield return new Variant(uint.MaxValue);\n            yield return new Variant((ushort)1);\n            yield return new Variant((ushort)0);\n            yield return new Variant(ushort.MaxValue);\n            yield return new Variant((byte)1);\n            yield return new Variant((byte)0);\n            yield return new Variant(byte.MaxValue);\n            yield return new Variant(1.0);\n            yield return new Variant(-1.0);\n            yield return new Variant(0.0);\n            yield return new Variant(double.MaxValue);\n            yield return new Variant(double.MinValue);\n            yield return new Variant(double.PositiveInfinity);\n            yield return new Variant(double.NegativeInfinity);\n            yield return new Variant(1.0f);\n            yield return new Variant(-1.0f);\n            yield return new Variant(0.0f);\n            yield return new Variant(float.MaxValue);\n            yield return new Variant(float.MinValue);\n            yield return new Variant(float.PositiveInfinity);\n            yield return new Variant(float.NegativeInfinity);\n            // yield return new Variant((decimal)1.0);\n            // yield return new Variant((decimal)-1.0);\n            // yield return new Variant((decimal)0.0);\n            // yield return new Variant((decimal)1234567);\n            // yield return new Variant(decimal.MaxValue);\n            // yield return new Variant(decimal.MinValue);\n            yield return new Variant(Guid.NewGuid());\n            yield return new Variant(Guid.Empty);\n            yield return new Variant(DateTime.UtcNow);\n            yield return new Variant(DateTime.MaxValue);\n            yield return new Variant(DateTime.MinValue);\n            yield return new Variant(string.Empty);\n            yield return new Variant((string)null);\n            yield return new Variant(\" str ing\");\n            yield return new Variant(\"zeroterminated\" + '\\0');\n            yield return new Variant(Array.Empty<byte>());\n            yield return new Variant((byte[])null);\n            yield return new Variant(new byte[1000]);\n            yield return new Variant(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 });\n            yield return new Variant(Encoding.UTF8.GetBytes(\"utf-8-string\"));\n            yield return new Variant(new NodeId([1, 2, 3, 4, 5, 6, 7, 8], 0));\n            yield return new Variant(new NodeId(\"test\", 0));\n            yield return new Variant(new NodeId(1u, 0));\n            yield return new Variant(new NodeId(Guid.NewGuid(), 0));\n            yield return new Variant(NodeId.Null);\n            yield return new Variant((NodeId)null);\n            yield return new Variant(new ExpandedNodeId([1, 2, 3, 4, 5, 6, 7, 8], 0));\n            yield return new Variant(new ExpandedNodeId(\"test\", 0));\n            yield return new Variant(new ExpandedNodeId(1u, 0));\n            yield return new Variant(new ExpandedNodeId(Guid.NewGuid(), 0));\n            yield return new Variant((ExpandedNodeId)null);\n            yield return new Variant(new LocalizedText(\"en\", \"text\"));\n            yield return new Variant(new LocalizedText(\"text2\"));\n            yield return new Variant(new LocalizedText(string.Empty));\n            yield return new Variant((LocalizedText)null);\n            yield return new Variant(new QualifiedName(\"en\", 0));\n            yield return new Variant(new QualifiedName(string.Empty, 0));\n            yield return new Variant((QualifiedName)null);\n            yield return new Variant((StatusCode)StatusCodes.Bad);\n            yield return new Variant((StatusCode)StatusCodes.UncertainDependentValueChanged);\n            yield return new Variant(new DataValue(StatusCodes.BadNoCommunication));\n            yield return new Variant(new DataValue(new Variant(123)));\n            yield return new Variant(XmlElement);\n        }\n\n        public static XmlElement XmlElement\n        {\n            get\n            {\n                var doc = new XmlDocument();\n                doc.LoadXml(\n              \"\"\"\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n            <note>\n                <to>Tove</to>\n                <from>Jani</from>\n                <heading test=\"1.0\">Reminder</heading>\n                <author><nothing/></author>\n                <body>Don't forget me this weekend!</body>\n            </note>\n\"\"\"\n                );\n                return doc.DocumentElement;\n            }\n        }\n\n        public static readonly ProgramDiagnostic2DataType Complex = new()\n        {\n            CreateClientName = \"Testname\",\n            CreateSessionId = new NodeId(Guid.NewGuid()),\n            InvocationCreationTime = DateTime.UtcNow,\n            LastMethodCall = \"swappido\",\n            LastMethodCallTime = DateTime.UtcNow,\n            LastMethodInputArguments = [\n                    new Argument(\"something1\",\n                        new NodeId(2354), -1, \"somedesciroeioi\") { ArrayDimensions = Array.Empty<uint>() },\n                    new Argument(\"something2\",\n                        new NodeId(23), -1, \"fdsadfsdaf\") { ArrayDimensions = Array.Empty<uint>() },\n                    new Argument(\"something3\",\n                        new NodeId(44), 1, \"fsadf  sadfsdfsadfsd\") { ArrayDimensions = Array.Empty<uint>() },\n                    new Argument(\"something4\",\n                        new NodeId(23), 1, \"dfad  sdafdfdf  fasdf\") { ArrayDimensions = Array.Empty<uint>() }\n                ],\n            LastMethodInputValues = [\n                    new Variant(4L),\n                    new Variant(\"test\"),\n                    new Variant(new long[] {1, 2, 3, 4, 5 }),\n                    new Variant([\"1\", \"2\", \"3\", \"4\", \"5\"])\n                ],\n            LastMethodOutputArguments = [\n                    new Argument(\"foo1\",\n                        new NodeId(2354), -1, \"somedesciroeioi\") { ArrayDimensions = Array.Empty<uint>() },\n                    new Argument(\"foo2\",\n                        new NodeId(33), -1, \"fdsadfsdaf\") { ArrayDimensions = Array.Empty<uint>() },\n                    new Argument(\"adfsdafsdsdsafdsfa\",\n                        new NodeId(\"absc\", 0), 1, \"fsadf  sadfsdfsadfsd\") { ArrayDimensions = Array.Empty<uint>() },\n                    new Argument(\"ddddd\",\n                        new NodeId(25), 1, \"dfad  sdafdfdf  fasdf\") { ArrayDimensions = Array.Empty<uint>() }\n                ],\n            LastMethodOutputValues = [\n                    new Variant(4L),\n                    new Variant(\"test\"),\n                    new Variant(new long[] {1, 2, 3, 4, 5 }),\n                    new Variant([\"1\", \"2\", \"3\", \"4\", \"5\"])\n                ],\n            LastMethodReturnStatus =\n                    StatusCodes.BadAggregateConfigurationRejected,\n            LastMethodSessionId = new NodeId(RandomNumberGenerator.GetBytes(32)),\n            LastTransitionTime = DateTime.UtcNow - TimeSpan.FromDays(23)\n        };\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Encoders/ZipFileWriterTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Encoders\n{\n    using Furly;\n    using Furly.Extensions.Messaging;\n    using System;\n    using System.Buffers;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    /// <summary>\n    /// Test file writers\n    /// </summary>\n    public sealed class ZipFileWriterTests\n    {\n        [Fact]\n        public void SupportsContentTypeTests()\n        {\n            using var writer = new ZipFileWriter();\n            Assert.False(writer.SupportsContentType(ContentType.Avro));\n            Assert.False(writer.SupportsContentType(ContentType.AvroGzip));\n            Assert.False(writer.SupportsContentType(\"test\"));\n            Assert.True(writer.SupportsContentType(ContentType.Uadp));\n            Assert.True(writer.SupportsContentType(ContentType.JsonGzip));\n            Assert.True(writer.SupportsContentType(ContentMimeType.Binary));\n            Assert.True(writer.SupportsContentType(ContentMimeType.UaNonReversibleJson));\n            Assert.True(writer.SupportsContentType(ContentMimeType.UaLegacyPublisher));\n            Assert.True(writer.SupportsContentType(ContentMimeType.UaJson));\n            Assert.Throws<FormatException>(() => ZipFileWriter.Suffix(ZipFileWriter.ContentType.None));\n        }\n\n        [Fact]\n        public async Task TestZipFileWriter1Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                using (var writer = new ZipFileWriter())\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        new ReadOnlySequence<byte>([1, 2, 3])\n                    }, null, new DummyEventSchema(), ContentType.Uadp);\n                }\n\n                Assert.True(File.Exists(file + \".zip\"));\n                using var reader = new ZipFileReader(file);\n                Assert.True(reader.HasMore());\n                var result = reader.Read((s, t) =>\n                {\n                    var buffer = t.ReadAsBuffer();\n                    Assert.Equal(1, buffer[0]);\n                    Assert.Equal(2, buffer[1]);\n                    Assert.Equal(3, buffer[2]);\n                    Assert.Equal(3, buffer.Count);\n                    Assert.Equal(\"[]\", s);\n                    return 123;\n                });\n                Assert.False(reader.HasMore());\n                Assert.Equal(123, result);\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        [Fact]\n        public async Task TestZipFileWriter2Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                using (var writer = new ZipFileWriter())\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        new ReadOnlySequence<byte>([1, 2, 3])\n                    }, null, new DummyEventSchema(), ContentType.Uadp);\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        new ReadOnlySequence<byte>([1, 2, 3])\n                    }, null, new DummyEventSchema(), ContentType.Uadp);\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                     {\n                        new ReadOnlySequence<byte>([1, 2, 3])\n                    }, null, new DummyEventSchema(), ContentType.Uadp);\n                }\n\n                using var reader = new ZipFileReader(file);\n                for (var i = 0; i < 3; i++)\n                {\n                    Assert.True(reader.HasMore());\n                    var result = reader.Read((s, t) =>\n                    {\n                        Assert.Equal(1, t.ReadByte());\n                        Assert.Equal(2, t.ReadByte());\n                        Assert.Equal(3, t.ReadByte());\n                        Assert.Equal(\"[]\", s);\n                        return 123;\n                    });\n                    Assert.Equal(123, result);\n                }\n                Assert.False(reader.HasMore());\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        [Fact]\n        public async Task TestZipFileWriter3Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                using (var writer = new ZipFileWriter())\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, Array.Empty<ReadOnlySequence<byte>>(),\n                        null, null, ContentType.Uadp);\n                }\n\n                Assert.True(File.Exists(file + \".zip\"));\n                using var reader = new ZipFileReader(file);\n                Assert.False(reader.HasMore());\n\n                Assert.Throws<EndOfStreamException>(() => reader.Read((s, t) => 123));\n                Assert.False(reader.HasMore());\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        [Fact]\n        public async Task TestZipFileWriter4Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                const string expected = \"{\\\"teststring\\\": 1}\";\n                var buffer = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(expected));\n                using (var writer = new ZipFileWriter())\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer.GzipCompress()\n                    }, null, new DummyEventSchema(), ContentType.JsonGzip);\n                }\n\n                Assert.True(File.Exists(file + \".zip\"));\n                using var reader = new ZipFileReader(file);\n                Assert.True(reader.HasMore());\n                var result = reader.Read((s, t) =>\n                {\n                    var buffer = t.ReadAsBuffer();\n                    Assert.Equal(expected, Encoding.UTF8.GetString(buffer));\n                    return 123;\n                });\n                Assert.False(reader.HasMore());\n                Assert.Equal(123, result);\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        [Fact]\n        public async Task TestZipFileWriter5Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                const string expected = \"{\\\"teststring\\\": 1}\";\n                var buffer = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(expected));\n                using (var writer = new ZipFileWriter())\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer.GzipCompress()\n                    }, null, new DummyEventSchema(), ContentType.JsonGzip);\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer.GzipCompress()\n                    }, null, new DummyEventSchema(), ContentType.JsonGzip);\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer.GzipCompress()\n                    }, null, new DummyEventSchema(), ContentType.JsonGzip);\n                }\n\n                Assert.True(File.Exists(file + \".zip\"));\n                using var reader = new ZipFileReader(file);\n                Assert.True(reader.HasMore());\n                var result = reader.Read((s, t) =>\n                {\n                    var buffer = t.ReadAsBuffer();\n                    Assert.Equal(expected, Encoding.UTF8.GetString(buffer));\n                    return 123;\n                });\n                Assert.Equal(123, result);\n                Assert.True(reader.HasMore());\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        [Fact]\n        public async Task TestZipFileWriter6Async()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                const string expected = \"{\\\"teststring\\\": 1}\";\n                var buffer = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(expected));\n                using (var writer = new ZipFileWriter())\n                {\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer\n                    }, null, new DummyEventSchema(), ContentMimeType.Json);\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer\n                    }, null, new DummyEventSchema(), ContentMimeType.Json);\n                    await writer.WriteAsync(file, DateTime.UtcNow, new[]\n                    {\n                        buffer\n                    }, null, new DummyEventSchema(), ContentMimeType.Json);\n                }\n\n                Assert.True(File.Exists(file + \".zip\"));\n                using var reader = new ZipFileReader(file);\n                Assert.True(reader.HasMore());\n                var result = reader.Stream((s, t) =>\n                {\n                    var buffer = t.ReadAsBuffer();\n                    Assert.Equal(expected, Encoding.UTF8.GetString(buffer));\n                    return 123;\n                }).ToList();\n                Assert.Equal(3, result.Count);\n                Assert.All(result, a => Assert.Equal(123, a));\n                Assert.False(reader.HasMore());\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        [Theory]\n        [InlineData(\"\")]\n        [InlineData(\"ab\")]\n        [InlineData(\"badheader\")]\n        public async Task TestBadHeader1Async(string data)\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                await File.WriteAllTextAsync(file + \".zip\", data);\n                Assert.Throws<FormatException>(() => new ZipFileReader(file));\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        [Theory]\n        [InlineData(null)]\n        [InlineData(\"\")]\n        [InlineData(\"ab\")]\n        [InlineData(\"badcontentType\")]\n        public void TestBadHeader2(string data)\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                using (var s = File.Open(file + \".zip\", FileMode.Create))\n                using (var zip = new ZipArchive(s, ZipArchiveMode.Create))\n                {\n                    var entry = zip.CreateEntry(ZipFileWriter.ContentTypeFile);\n                    using var stream = entry.Open();\n                    if (data == null)\n                    {\n                        stream.WriteByte(0);\n                    }\n                    else\n                    {\n                        stream.Write(Encoding.UTF8.GetBytes(data));\n                    }\n                }\n                Assert.Throws<FormatException>(() => new ZipFileReader(file));\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        [Fact]\n        public void TestBadHeader3()\n        {\n            var file = Path.GetTempFileName();\n            try\n            {\n                using (var s = File.Open(file + \".zip\", FileMode.Create))\n                using (var zip = new ZipArchive(s, ZipArchiveMode.Create))\n                {\n                    var entry = zip.CreateEntry(\"1.json\");\n                    using var stream = entry.Open();\n                    stream.Write(Encoding.UTF8.GetBytes(\"data\"));\n                }\n                Assert.Throws<FormatException>(() => new ZipFileReader(file));\n            }\n            finally\n            {\n                File.Delete(file + \".zip\");\n            }\n        }\n\n        private sealed class DummyEventSchema : IEventSchema\n        {\n            public string Id => \"test\";\n            public string Schema => \"[]\";\n            public string Type => \"test\";\n            public string Name => \"test\";\n            public ulong Version => 1;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage\n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given\n// a specific target and scoped to a namespace, type, member, etc.\n\nusing System.Diagnostics.CodeAnalysis;\n\n[assembly: SuppressMessage(\"Reliability\", \"CA2007:Consider calling ConfigureAwait on the awaited task\", Justification = \"xunit\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Publisher/Extensions/OpcNodeModelExTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Config.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Globalization;\n    using Xunit;\n\n    public class OpcNodeModelExTests\n    {\n        [Fact]\n        public void ComparerTest()\n        {\n            var comparer = OpcNodeModelEx.Comparer;\n\n            var opcNode1 = new OpcNodeModel();\n            var opcNode2 = new OpcNodeModel();\n\n            Assert.True(comparer.Equals(opcNode1, opcNode2));\n            Assert.True(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode1 = new OpcNodeModel\n            {\n                Id = \"id\",\n                OpcPublishingInterval = 1500,\n                OpcSamplingInterval = 2500,\n                HeartbeatInterval = 35,\n                QueueSize = 123,\n                DataChangeTrigger = DataChangeTriggerType.StatusValue,\n                DeadbandType = DeadbandType.Absolute,\n                DeadbandValue = 0.1\n            };\n\n            static OpcNodeModel NewNode() => new()\n            {\n                Id = \"id\",\n                OpcPublishingIntervalTimespan = TimeSpan.Parse(\"00:00:01.5\", CultureInfo.InvariantCulture),\n                OpcSamplingIntervalTimespan = TimeSpan.Parse(\"00:00:02.500\", CultureInfo.InvariantCulture),\n                HeartbeatIntervalTimespan = TimeSpan.Parse(\"00:00:35\", CultureInfo.InvariantCulture),\n                SkipFirst = true,\n                QueueSize = 123,\n                DataChangeTrigger = DataChangeTriggerType.StatusValue,\n                DeadbandType = DeadbandType.Absolute,\n                DeadbandValue = 0.1\n            };\n\n            opcNode2 = NewNode();\n            opcNode2.SkipFirst = false;\n            Assert.True(comparer.Equals(opcNode1, opcNode2));\n            Assert.True(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            // Set skip first to true like factory\n            opcNode2 = NewNode();\n            opcNode1.SkipFirst = true;\n            Assert.True(comparer.Equals(opcNode1, opcNode2));\n            Assert.True(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            Assert.True(comparer.Equals(opcNode1, opcNode2));\n            Assert.True(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            opcNode2.SkipFirst = false;\n            opcNode2.QueueSize = 123;\n\n            Assert.False(comparer.Equals(opcNode1, opcNode2));\n            Assert.False(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            opcNode2.SkipFirst = true;\n            opcNode2.QueueSize = 321;\n\n            Assert.False(comparer.Equals(opcNode1, opcNode2));\n            Assert.False(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            opcNode2.SkipFirst = true;\n            opcNode2.QueueSize = 123;\n            opcNode2.DataChangeTrigger = DataChangeTriggerType.Status;\n\n            Assert.False(comparer.Equals(opcNode1, opcNode2));\n            Assert.False(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            opcNode2.SkipFirst = null;\n            opcNode2.QueueSize = null;\n            opcNode2.DataChangeTrigger = null;\n\n            Assert.False(comparer.Equals(opcNode1, opcNode2));\n            Assert.False(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            opcNode2.DataChangeTrigger = null;\n\n            Assert.False(comparer.Equals(opcNode1, opcNode2));\n            Assert.False(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            opcNode2.DeadbandType = DeadbandType.Percent;\n\n            Assert.False(comparer.Equals(opcNode1, opcNode2));\n            Assert.False(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            opcNode2.DeadbandType = null;\n\n            Assert.False(comparer.Equals(opcNode1, opcNode2));\n            Assert.False(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n\n            opcNode2 = NewNode();\n            opcNode2.DeadbandValue = null;\n\n            Assert.False(comparer.Equals(opcNode1, opcNode2));\n            Assert.False(comparer.GetHashCode(opcNode1) == comparer.GetHashCode(opcNode2));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Publisher/Models/PublishedNodesEntryModelTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Config.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using System;\n    using Xunit;\n\n    public class PublishedNodesEntryModelTests\n    {\n        [Fact]\n        public void UseSecurityDeserializationTest()\n        {\n            var newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n\n            var modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            var model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.Null(model.UseSecurity);\n\n            modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"UseSecurity\": false,\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.False(model.UseSecurity);\n\n            modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"UseSecurity\": true,\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.True(model.UseSecurity);\n        }\n\n        [Fact]\n        public void UseSecuritySerializationTest()\n        {\n            var newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n\n            var model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                OpcNodes =\n                [\n                    new()\n                    {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            var modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.DoesNotContain(\"\\\"UseSecurity\\\":false\", modeJson, StringComparison.Ordinal);\n\n            model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                UseSecurity = false,\n                OpcNodes =\n                [\n                    new()\n                    {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"UseSecurity\\\":false\", modeJson, StringComparison.Ordinal);\n\n            model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                UseSecurity = true,\n                OpcNodes =\n                [\n                    new()\n                    {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"UseSecurity\\\":true\", modeJson, StringComparison.Ordinal);\n        }\n\n        [Fact]\n        public void OpcAuthenticationModeDeserializationTest()\n        {\n            var newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n\n            var modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            var model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.Equal(OpcAuthenticationMode.Anonymous, model.OpcAuthenticationMode);\n\n            modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"OpcAuthenticationMode\": \"anonymous\",\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.Equal(OpcAuthenticationMode.Anonymous, model.OpcAuthenticationMode);\n\n            modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"OpcAuthenticationMode\": \"usernamePassword\",\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, model.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void OpcAuthenticationModeSerializationTest()\n        {\n            var newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n\n            var model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            var modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"OpcAuthenticationMode\\\":\\\"Anonymous\\\"\", modeJson, StringComparison.Ordinal);\n\n            model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                OpcAuthenticationMode = OpcAuthenticationMode.Anonymous,\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"OpcAuthenticationMode\\\":\\\"Anonymous\\\"\", modeJson, StringComparison.Ordinal);\n\n            model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                OpcAuthenticationMode = OpcAuthenticationMode.UsernamePassword,\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"OpcAuthenticationMode\\\":\\\"UsernamePassword\\\"\", modeJson, StringComparison.Ordinal);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Resources/CyclicReads.json",
    "content": "{\n    \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n    \"Version\": 1,\n    \"DataSetMessages\": [\n        {\n            \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n            \"MetaData\": {\n                \"MinorVersion\": 2035898649,\n                \"DataSetMetaData\": {\n                    \"Name\": null,\n                    \"DataSetClassId\": \"00000000-0000-0000-0000-000000000000\",\n                    \"Description\": null,\n                    \"MajorVersion\": null\n                },\n                \"Fields\": [\n                    {\n                        \"Name\": \"i=2258\",\n                        \"Id\": \"0a8fa57d-53f1-4d36-a6bf-aea8c266236a\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 13,\n                        \"DataType\": \"i=294\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\",\n                        \"Id\": \"b4966f7d-c3b8-456b-a34d-33375e96a44f\",\n                        \"Description\": \"Constantly increasing value\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\",\n                        \"Id\": \"a0fbd59d-bf90-481d-8148-0cf3f95f72db\",\n                        \"Description\": \"Alternating boolean value\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 1,\n                        \"DataType\": \"i=1\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\",\n                        \"Id\": \"2fd5d646-b318-4794-8f76-900a5349e473\",\n                        \"Description\": \"Random signed 32 bit integer value\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 6,\n                        \"DataType\": \"i=6\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\",\n                        \"Id\": \"e18cd56a-62cd-4513-ac53-95acec4175d9\",\n                        \"Description\": \"Random unsigned 32 bit integer value\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\",\n                        \"Id\": \"2a46ec59-56f8-4d48-a8a3-b3ae6fb2e416\",\n                        \"Description\": \"Value with random dips\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 11,\n                        \"DataType\": \"i=11\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\",\n                        \"Id\": \"2031bf9e-d182-4ccf-86cf-0c41a2dda649\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\",\n                        \"Id\": \"08d04674-0330-48ef-a0b8-e84d12305262\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\",\n                        \"Id\": \"bc08ef8e-c316-496f-bbb8-3274530ccd17\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\",\n                        \"Id\": \"02c26a87-ef62-4196-9cfd-4ea01f1fbb4a\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\",\n                        \"Id\": \"43e3f216-61a4-4d59-801a-3d4e27e23c0a\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\",\n                        \"Id\": \"c3130fd7-318f-4889-9c48-dd316341d300\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\",\n                        \"Id\": \"baf8c090-104a-4b51-8e26-433258108cae\",\n                        \"Description\": \"Value with a slow negative trend\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 11,\n                        \"DataType\": \"i=11\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\",\n                        \"Id\": \"2717fada-a74b-4277-923c-f759e29db569\",\n                        \"Description\": \"Value with a slow positive trend\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 11,\n                        \"DataType\": \"i=11\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                        \"Id\": \"386cfed8-026d-44c2-8f93-ed615cb9c7c2\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                        \"Id\": \"353428b9-10b9-4045-a1f4-cf8068b9010e\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                        \"Id\": \"0df6f7e9-e2d9-4bcd-ae46-f068356a8f13\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                        \"Id\": \"83d68c47-e6c2-4002-8d1c-1cfa80063c5a\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                        \"Id\": \"208b6ac5-2996-47c9-a361-8f129d8cc1d1\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                        \"Id\": \"99b85816-0e7e-4d14-adc2-ffbf47e9c344\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                        \"Id\": \"9c9178c5-5037-42f8-8c5a-f70f51464270\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                        \"Id\": \"1885cb44-3ebd-4246-b522-b3271c867e9b\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\",\n                        \"Id\": \"03161fb9-a405-4950-b4d2-efdedf7c47a5\",\n                        \"Description\": \"Value with random spikes\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 11,\n                        \"DataType\": \"i=11\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"ns=23;i=1259\",\n                        \"Id\": \"bdc40f73-e20d-4102-8baa-ed171cbc4bd1\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 26,\n                        \"DataType\": \"i=26\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    }\n                ],\n                \"StructureDataTypes\": [],\n                \"EnumDataTypes\": [],\n                \"SimpleDataTypes\": [\n                    {\n                        \"DataTypeId\": \"i=294\",\n                        \"Name\": \"UtcTime\",\n                        \"BaseDataType\": \"i=13\",\n                        \"BuiltInType\": 13\n                    }\n                ]\n            },\n            \"DataSetMessageContentFlags\": 0,\n            \"DataSetFieldContentFlags\": 3080199,\n            \"TypeName\": null\n        }\n    ],\n    \"NetworkMessageContentFlags\": 8192,\n    \"TypeName\": null\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Resources/KeepAlive.json",
    "content": "{\n    \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n    \"Version\": 1,\n    \"DataSetMessages\": [\n        {\n            \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n            \"MetaData\": {\n                \"MinorVersion\": 3632325695,\n                \"DataSetMetaData\": {\n                    \"Name\": null,\n                    \"DataSetClassId\": \"00000000-0000-0000-0000-000000000000\",\n                    \"Description\": null,\n                    \"MajorVersion\": null\n                },\n                \"Fields\": [\n                    {\n                        \"Name\": \"State\",\n                        \"Id\": \"081ffb7a-b0e4-484a-a57e-8065c350ad1c\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 29,\n                        \"DataType\": \"i=852\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    }\n                ],\n                \"StructureDataTypes\": [],\n                \"EnumDataTypes\": [\n                    {\n                        \"DataTypeId\": \"i=852\",\n                        \"Name\": \"ServerState\",\n                        \"Fields\": [\n                            {\n                                \"Name\": \"Running\",\n                                \"Value\": 0,\n                                \"DisplayName\": \"Running\",\n                                \"Description\": null\n                            },\n                            {\n                                \"Name\": \"Failed\",\n                                \"Value\": 1,\n                                \"DisplayName\": \"Failed\",\n                                \"Description\": null\n                            },\n                            {\n                                \"Name\": \"NoConfiguration\",\n                                \"Value\": 2,\n                                \"DisplayName\": \"NoConfiguration\",\n                                \"Description\": null\n                            },\n                            {\n                                \"Name\": \"Suspended\",\n                                \"Value\": 3,\n                                \"DisplayName\": \"Suspended\",\n                                \"Description\": null\n                            },\n                            {\n                                \"Name\": \"Shutdown\",\n                                \"Value\": 4,\n                                \"DisplayName\": \"Shutdown\",\n                                \"Description\": null\n                            },\n                            {\n                                \"Name\": \"Test\",\n                                \"Value\": 5,\n                                \"DisplayName\": \"Test\",\n                                \"Description\": null\n                            },\n                            {\n                                \"Name\": \"CommunicationFault\",\n                                \"Value\": 6,\n                                \"DisplayName\": \"CommunicationFault\",\n                                \"Description\": null\n                            },\n                            {\n                                \"Name\": \"Unknown\",\n                                \"Value\": 7,\n                                \"DisplayName\": \"Unknown\",\n                                \"Description\": null\n                            }\n                        ],\n                        \"BuiltInType\": null,\n                        \"IsOptionSet\": false\n                    }\n                ],\n                \"SimpleDataTypes\": []\n            },\n            \"DataSetMessageContentFlags\": 868,\n            \"DataSetFieldContentFlags\": 458755,\n            \"TypeName\": null\n        }\n    ],\n    \"NetworkMessageContentFlags\": 6901,\n    \"TypeName\": null\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Resources/KeyFrames.json",
    "content": "{\n    \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n    \"Version\": 1,\n    \"DataSetMessages\": [\n        {\n            \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n            \"MetaData\": {\n                \"MinorVersion\": 275393594,\n                \"DataSetMetaData\": {\n                    \"Name\": null,\n                    \"DataSetClassId\": \"00000000-0000-0000-0000-000000000000\",\n                    \"Description\": null,\n                    \"MajorVersion\": null\n                },\n                \"Fields\": [\n                    {\n                        \"Name\": \"CurrentTime\",\n                        \"Id\": \"b94d9c20-63ef-419f-a76e-ffcb280a3b13\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 13,\n                        \"DataType\": \"i=294\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"EngineeringUnits\",\n                        \"Id\": \"6995a326-df96-4e00-9247-f7eea034f810\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 12,\n                        \"DataType\": \"i=12\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"AssetId\",\n                        \"Id\": \"9a647079-3f64-4ab4-9b86-437a3438b931\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 24,\n                        \"DataType\": \"i=24\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"Important\",\n                        \"Id\": \"3d8f7712-0d10-4390-b5bb-7c6484816c68\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 1,\n                        \"DataType\": \"i=1\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"Variance\",\n                        \"Id\": \"fa7707aa-4b5d-477e-a441-f5cd203b0523\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 10,\n                        \"DataType\": \"i=10\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    }\n                ],\n                \"StructureDataTypes\": [],\n                \"EnumDataTypes\": [],\n                \"SimpleDataTypes\": [\n                    {\n                        \"DataTypeId\": \"i=294\",\n                        \"Name\": \"UtcTime\",\n                        \"BaseDataType\": \"i=13\",\n                        \"BuiltInType\": 13\n                    }\n                ]\n            },\n            \"DataSetMessageContentFlags\": 868,\n            \"DataSetFieldContentFlags\": 458755,\n            \"TypeName\": null\n        }\n    ],\n    \"NetworkMessageContentFlags\": 6901,\n    \"TypeName\": null\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Resources/PendingAlarms.json",
    "content": "{\n    \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n    \"Version\": 1,\n    \"DataSetMessages\": [\n        {\n            \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n            \"MetaData\": {\n                \"MinorVersion\": 2585633434,\n                \"DataSetMetaData\": {\n                    \"Name\": null,\n                    \"DataSetClassId\": \"00000000-0000-0000-0000-000000000000\",\n                    \"Description\": null,\n                    \"MajorVersion\": null\n                },\n                \"Fields\": [\n                    {\n                        \"Name\": \"ConditionClassId\",\n                        \"Id\": \"d46eb7cd-98d4-4a82-bfd4-adfd098e982c\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 17,\n                        \"DataType\": \"i=17\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"ConditionClassName\",\n                        \"Id\": \"2da0aa36-960e-4409-b124-14dd6f668d29\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 21,\n                        \"DataType\": \"i=21\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"ConditionSubClassId\",\n                        \"Id\": \"3a16f3f9-7dab-482d-8330-41a5cf07e6cb\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 17,\n                        \"DataType\": \"i=17\",\n                        \"ValueRank\": 1,\n                        \"ArrayDimensions\": [\n                            0\n                        ],\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"ConditionSubClassName\",\n                        \"Id\": \"3b995804-43a6-4ced-ba94-393a2ab458c1\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 21,\n                        \"DataType\": \"i=21\",\n                        \"ValueRank\": 1,\n                        \"ArrayDimensions\": [\n                            0\n                        ],\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"EventId\",\n                        \"Id\": \"c6437e7e-02d5-4522-87cf-9191072e73f6\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 15,\n                        \"DataType\": \"i=15\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"EventType\",\n                        \"Id\": \"a13496e8-fb1d-482c-a624-80afc6482290\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 17,\n                        \"DataType\": \"i=17\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"LocalTime\",\n                        \"Id\": \"9a72a21a-9530-4049-ae24-253442ff2c56\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 22,\n                        \"DataType\": \"i=8912\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"Message\",\n                        \"Id\": \"06e2bdcd-889f-4383-b619-a64d03cb6736\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 21,\n                        \"DataType\": \"i=21\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"ReceiveTime\",\n                        \"Id\": \"5479a4b9-57ce-45e0-b1ad-c8656be69b7c\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 13,\n                        \"DataType\": \"i=294\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"Severity\",\n                        \"Id\": \"e98bb881-66b6-4bdd-8e07-0a0f8745f655\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 5,\n                        \"DataType\": \"i=5\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"SourceName\",\n                        \"Id\": \"9d7858f8-e9b1-486b-a4c3-675b04b94f0a\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 12,\n                        \"DataType\": \"i=12\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"SourceNode\",\n                        \"Id\": \"782a5509-524f-42da-9d10-273e69aa28db\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 17,\n                        \"DataType\": \"i=17\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"Time\",\n                        \"Id\": \"9e644e13-fe64-4969-8728-ec11ae75426c\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 13,\n                        \"DataType\": \"i=294\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    }\n                ],\n                \"StructureDataTypes\": [\n                    {\n                        \"DataTypeId\": \"i=8912\",\n                        \"Name\": \"TimeZoneDataType\",\n                        \"StructureType\": 0,\n                        \"Fields\": [\n                            {\n                                \"Name\": \"Offset\",\n                                \"DataType\": \"i=4\",\n                                \"Description\": null,\n                                \"IsOptional\": false,\n                                \"ValueRank\": -1,\n                                \"ArrayDimensions\": [],\n                                \"MaxStringLength\": 0\n                            },\n                            {\n                                \"Name\": \"DaylightSavingInOffset\",\n                                \"DataType\": \"i=1\",\n                                \"Description\": null,\n                                \"IsOptional\": false,\n                                \"ValueRank\": -1,\n                                \"ArrayDimensions\": [],\n                                \"MaxStringLength\": 0\n                            }\n                        ],\n                        \"BaseDataType\": \"i=22\",\n                        \"DefaultEncodingId\": \"i=8917\"\n                    }\n                ],\n                \"EnumDataTypes\": [],\n                \"SimpleDataTypes\": [\n                    {\n                        \"DataTypeId\": \"i=294\",\n                        \"Name\": \"UtcTime\",\n                        \"BaseDataType\": \"i=13\",\n                        \"BuiltInType\": 13\n                    }\n                ]\n            },\n            \"DataSetMessageContentFlags\": 0,\n            \"DataSetFieldContentFlags\": 3080199,\n            \"TypeName\": null\n        }\n    ],\n    \"NetworkMessageContentFlags\": 8192,\n    \"TypeName\": null\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Resources/PlcSimulation.json",
    "content": "{\n    \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n    \"Version\": 1,\n    \"DataSetMessages\": [\n        {\n            \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n            \"MetaData\": {\n                \"MinorVersion\": 3595526521,\n                \"DataSetMetaData\": {\n                    \"Name\": null,\n                    \"DataSetClassId\": \"00000000-0000-0000-0000-000000000000\",\n                    \"Description\": null,\n                    \"MajorVersion\": null\n                },\n                \"Fields\": [\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\",\n                        \"Id\": \"d18eeb8c-22a8-4d73-a8be-136895c965dd\",\n                        \"Description\": \"Constantly increasing value\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\",\n                        \"Id\": \"45279d6e-f564-4a37-afa2-381d3d43cdba\",\n                        \"Description\": \"Alternating boolean value\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 1,\n                        \"DataType\": \"i=1\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\",\n                        \"Id\": \"fbe38400-24f2-4e3a-898c-08dafe585df8\",\n                        \"Description\": \"Random signed 32 bit integer value\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 6,\n                        \"DataType\": \"i=6\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\",\n                        \"Id\": \"5dacaaaf-803e-491d-a651-615229b3a511\",\n                        \"Description\": \"Random unsigned 32 bit integer value\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\",\n                        \"Id\": \"3230161b-224a-45d4-b9ef-c859d024b447\",\n                        \"Description\": \"Value with random dips\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 11,\n                        \"DataType\": \"i=11\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\",\n                        \"Id\": \"03433afc-8667-43fa-ba9c-4981eddd49d2\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\",\n                        \"Id\": \"0a258a02-fb3d-4aa0-8ba5-d22c4d3e776a\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\",\n                        \"Id\": \"73c1ea83-5206-46e0-9bae-3fb80970653a\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\",\n                        \"Id\": \"4a304488-9b9f-4a2e-9dc2-fab34ef63f91\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\",\n                        \"Id\": \"6c589007-ed13-40bf-a7d7-33ff19086ddf\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\",\n                        \"Id\": \"6fda4154-e6ba-4bbf-a55a-06640d112384\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\",\n                        \"Id\": \"52cb7518-a46c-4ff9-9a6b-da749a3224f2\",\n                        \"Description\": \"Value with a slow negative trend\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 11,\n                        \"DataType\": \"i=11\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\",\n                        \"Id\": \"ff379c49-83d7-4358-be4c-a97b1942e793\",\n                        \"Description\": \"Value with a slow positive trend\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 11,\n                        \"DataType\": \"i=11\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\",\n                        \"Id\": \"ed45d2b2-4514-46d3-8ff5-f02a858f1fa8\",\n                        \"Description\": \"Value with random spikes\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 11,\n                        \"DataType\": \"i=11\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    }\n                ],\n                \"StructureDataTypes\": [],\n                \"EnumDataTypes\": [],\n                \"SimpleDataTypes\": []\n            },\n            \"DataSetMessageContentFlags\": 0,\n            \"DataSetFieldContentFlags\": 3080199,\n            \"TypeName\": null\n        },\n        {\n            \"Id\": \"754714A3-DF97-484D-BC95-66C48EB61B9A\",\n            \"MetaData\": {\n                \"MinorVersion\": 3598940497,\n                \"DataSetMetaData\": {\n                    \"Name\": null,\n                    \"DataSetClassId\": \"00000000-0000-0000-0000-000000000000\",\n                    \"Description\": null,\n                    \"MajorVersion\": null\n                },\n                \"Fields\": [\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                        \"Id\": \"d1920dbc-c101-46e7-bd61-63441b370774\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                        \"Id\": \"1df5f88a-e287-4949-a45b-a22d8cba9644\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                        \"Id\": \"5d2028d7-74b6-4570-b4eb-17c77bdc1ad3\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                        \"Id\": \"7965119c-90c0-4325-a327-c3dd355845e6\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                        \"Id\": \"873b721b-8c5a-499c-bcf4-7435b1f35f45\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                        \"Id\": \"8595fa98-23f3-4887-88c0-a58dbb019cab\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                        \"Id\": \"2712a010-2aa4-4065-b00c-79ba068bbfa2\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                        \"Id\": \"31fcd44e-3059-47fa-8eab-8cfea0c9173b\",\n                        \"Description\": \"Constantly increasing value(s)\",\n                        \"Flags\": 0,\n                        \"BuiltInType\": 7,\n                        \"DataType\": \"i=7\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    }\n                ],\n                \"StructureDataTypes\": [],\n                \"EnumDataTypes\": [],\n                \"SimpleDataTypes\": []\n            },\n            \"DataSetMessageContentFlags\": 0,\n            \"DataSetFieldContentFlags\": 3080199,\n            \"TypeName\": null\n        }\n    ],\n    \"NetworkMessageContentFlags\": 8192,\n    \"TypeName\": null\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa/tests/Resources/SimpleEvents.json",
    "content": "{\n    \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n    \"Version\": 1,\n    \"DataSetMessages\": [\n        {\n            \"Id\": \"c0b8f1a2-3e4f-4b5c-8d6e-7f8a9b0c1d2e\",\n            \"MetaData\": {\n                \"MinorVersion\": 173068024,\n                \"DataSetMetaData\": {\n                    \"Name\": null,\n                    \"DataSetClassId\": \"00000000-0000-0000-0000-000000000000\",\n                    \"Description\": null,\n                    \"MajorVersion\": null\n                },\n                \"Fields\": [\n                    {\n                        \"Name\": \"EventId\",\n                        \"Id\": \"0e461d96-defd-4b43-8414-c2e3676e440f\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 15,\n                        \"DataType\": \"i=15\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"Message\",\n                        \"Id\": \"df0e9f02-943a-41a3-9f16-e766dd0a7644\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 21,\n                        \"DataType\": \"i=21\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"http://opcfoundation.org/SimpleEvents#CycleId\",\n                        \"Id\": \"09377953-35be-4d90-ae56-010d9172adf9\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 12,\n                        \"DataType\": \"i=12\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    },\n                    {\n                        \"Name\": \"http://opcfoundation.org/SimpleEvents#CurrentStep\",\n                        \"Id\": \"505473a1-4a65-41d1-a451-68848a06bca6\",\n                        \"Description\": null,\n                        \"Flags\": 0,\n                        \"BuiltInType\": 22,\n                        \"DataType\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\",\n                        \"ValueRank\": -1,\n                        \"ArrayDimensions\": null,\n                        \"MaxStringLength\": 0,\n                        \"Properties\": null\n                    }\n                ],\n                \"StructureDataTypes\": [\n                    {\n                        \"DataTypeId\": \"nsu=http://opcfoundation.org/SimpleEvents;i=183\",\n                        \"Name\": \"nsu=http://opcfoundation.org/SimpleEvents;CycleStepDataType\",\n                        \"StructureType\": 0,\n                        \"Fields\": [\n                            {\n                                \"Name\": \"Name\",\n                                \"DataType\": \"i=12\",\n                                \"Description\": null,\n                                \"IsOptional\": false,\n                                \"ValueRank\": -1,\n                                \"ArrayDimensions\": [],\n                                \"MaxStringLength\": 0\n                            },\n                            {\n                                \"Name\": \"Duration\",\n                                \"DataType\": \"i=11\",\n                                \"Description\": null,\n                                \"IsOptional\": false,\n                                \"ValueRank\": -1,\n                                \"ArrayDimensions\": [],\n                                \"MaxStringLength\": 0\n                            }\n                        ],\n                        \"BaseDataType\": \"i=22\",\n                        \"DefaultEncodingId\": null\n                    }\n                ],\n                \"EnumDataTypes\": [],\n                \"SimpleDataTypes\": []\n            },\n            \"DataSetMessageContentFlags\": 0,\n            \"DataSetFieldContentFlags\": 3080199,\n            \"TypeName\": null\n        }\n    ],\n    \"NetworkMessageContentFlags\": 8192,\n    \"TypeName\": null\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Azure.IIoT.OpcUa.Publisher.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Extensions.FileProviders.Physical\" Version=\"9.0.9\" />\n    <PackageReference Include=\"Microsoft.Extensions.Hosting.Abstractions\" Version=\"9.0.9\" />\n    <PackageReference Include=\"Microsoft.Extensions.Diagnostics.ResourceMonitoring\" Version=\"9.9.0\" />\n    <PackageReference Include=\"Nito.AsyncEx\" Version=\"5.1.2\" />\n    <PackageReference Include=\"Furly.Azure.IoT.Edge\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Azure.IoT.Operations\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Irony\" Version=\"1.5.3\" />\n    <PackageReference Include=\"OPCFoundation.NetStandard.Opc.Ua.Client.ComplexTypes\" Version=\"1.5.377.21\" />\n    <PackageReference Include=\"OPCFoundation.NetStandard.Opc.Ua.Client\" Version=\"1.5.377.21\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa\\src\\Azure.IIoT.OpcUa.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Constants.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    /// <summary>\n    /// Constants for diagnostics\n    /// </summary>\n    internal static class Constants\n    {\n        /// <summary>\n        /// Connection group identifier tag\n        /// </summary>\n        public const string ConnectionGroupTag = \"connectionGroupId\";\n\n        /// <summary>\n        /// Default dataset writer id\n        /// </summary>\n        public const string DefaultDataSetWriterName = \"<<UnknownDataSet>>\";\n\n        /// <summary>\n        /// Writer group identifier tag\n        /// </summary>\n        public const string WriterGroupNameTag = \"writerGroupName\";\n\n        /// <summary>\n        /// Writer group identifier tag\n        /// </summary>\n        public const string WriterGroupIdTag = \"writerGroupId\";\n\n        /// <summary>\n        /// Default writer group id\n        /// </summary>\n        public const string DefaultWriterGroupName = \"<<UnknownWriterGroup>>\";\n\n        /// <summary>\n        /// Publisher identifier tag\n        /// </summary>\n        public const string PublisherIdTag = \"publisherId\";\n\n        /// <summary>\n        /// Default publisher id\n        /// </summary>\n        public const string DefaultPublisherId = \"<<UnknownPublisher>>\";\n\n        /// <summary>\n        /// Site identifier tag\n        /// </summary>\n        public const string SiteIdTag = \"siteId\";\n\n        /// <summary>\n        /// Default Site id\n        /// </summary>\n        public const string DefaultSiteId = \"<<UnknownSite>>\";\n\n        /// <summary>\n        /// Default event  name\n        /// </summary>\n        public const string DefaultEventName = \"<<UnknownEvent>>\";\n\n        /// <summary>\n        /// Default context name\n        /// </summary>\n        public const string DefaultContextName = \"<<UnknownContext>>\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Discovery/NetworkDiscovery.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Discovery\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Probe;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Scanner;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Furly.Exceptions;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Utils;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.Metrics;\n    using System.Linq;\n    using System.Net;\n    using System.Net.Sockets;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Channels;\n    using System.Threading.Tasks;\n    using Opc.Ua;\n\n    /// <summary>\n    /// Provides network discovery of endpoints\n    /// </summary>\n    public sealed class NetworkDiscovery : INetworkDiscovery, IDiscoveryServices, IDisposable\n    {\n        /// <summary>\n        /// Running in container\n        /// </summary>\n        public static bool IsContainer => StringComparer.OrdinalIgnoreCase.Equals(\n            Environment.GetEnvironmentVariable(\"DOTNET_RUNNING_IN_CONTAINER\")\n                ?? string.Empty, \"true\");\n\n        /// <summary>\n        /// Create services\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"events\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"metrics\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public NetworkDiscovery(IEndpointDiscovery client, IEventClient events,\n            IJsonSerializer serializer, IOptions<PublisherOptions> options,\n            ILoggerFactory loggerFactory, IDiscoveryProgress? progress = null,\n            IMetricsContext? metrics = null, TimeProvider? timeProvider = null)\n        {\n            _loggerFactory = loggerFactory;\n            _serializer = serializer;\n            _client = client;\n            _events = events;\n            _options = options;\n            _metrics = metrics ?? IMetricsContext.Empty;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _request = new DiscoveryRequest(progress ??\n                new ProgressLogger(loggerFactory.CreateLogger<ProgressLogger>()),\n                _timeProvider);\n\n            _channel = Channel.CreateUnbounded<DiscoveryRequest>();\n            _logger = loggerFactory.CreateLogger<NetworkDiscovery>();\n            _topic = new TopicBuilder(options.Value).EventsTopic;\n            _runner = Task.Run(() => ProcessDiscoveryRequestsAsync(_cts.Token));\n            _timer = _timeProvider.CreateTimer(_ => OnScanScheduling(), null,\n                TimeSpan.FromSeconds(20), Timeout.InfiniteTimeSpan);\n        }\n\n        /// <inheritdoc/>\n        public Task RegisterAsync(ServerRegistrationRequestModel request,\n            CancellationToken ct)\n        {\n            if (request.DiscoveryUrl == null)\n            {\n                throw new ArgumentException(\"Missing discovery url\", nameof(request));\n            }\n            return DiscoverAsync(new DiscoveryRequestModel\n            {\n                Id = request.Id,\n                Discovery = DiscoveryMode.Off,\n                Configuration = new DiscoveryConfigModel\n                {\n                    DiscoveryUrls = new List<string> { request.DiscoveryUrl }\n                }\n            }, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task DiscoverAsync(DiscoveryRequestModel request,\n            CancellationToken ct)\n        {\n            kDiscoverAsync.Add(1, _metrics.TagList);\n            ArgumentNullException.ThrowIfNull(request);\n            var task = new DiscoveryRequest(request, _request.Progress, _timeProvider);\n            var scheduled = _channel.Writer.TryWrite(task);\n            if (!scheduled)\n            {\n                task.Dispose();\n                _logger.DiscoveryRequestNotScheduled();\n                var ex = new ResourceExhaustionException(\"Failed to schedule task\");\n                task.Progress.OnDiscoveryError(request, ex);\n                throw ex;\n            }\n            await _lock.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                if (_pending.Count != 0)\n                {\n                    task.Progress.OnDiscoveryPending(task.Request, _pending.Count);\n                }\n                _pending.Add(task);\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task CancelAsync(DiscoveryCancelRequestModel request,\n            CancellationToken ct)\n        {\n            kCancelAsync.Add(1, _metrics.TagList);\n            ArgumentNullException.ThrowIfNull(request);\n            await _lock.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                foreach (var task in _pending.Where(r => r.Request.Id == request.Id))\n                {\n                    // Cancel the task\n                    task.Cancel();\n                }\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<IEnumerable<DiscoveredEndpointModel>> FindServersAsync(\n            DiscoveryRequestModel request, IDiscoveryProgress? progress, CancellationToken ct)\n        {\n            progress ??= _request.Progress;\n            var task = new DiscoveryRequest(request, progress, _timeProvider, cancellationToken: ct);\n            var results = await DiscoverServersAsync(task).ConfigureAwait(false);\n            return results.Select(r => r.Discovered);\n        }\n\n        /// <inheritdoc/>\n        public Task<IEnumerable<DiscoveredEndpointModel>> FindEndpointsAsync(Uri discoveryUrl,\n            IReadOnlyList<string>? locales, bool findServersOnNetwork, CancellationToken ct)\n        {\n            return _client.FindEndpointsAsync(discoveryUrl, locales, findServersOnNetwork, ct);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            try\n            {\n                _timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                Try.Async(StopDiscoveryRequestProcessingAsync).Wait();\n            }\n            finally\n            {\n                // Dispose\n                _cts.Dispose();\n                _timer.Dispose();\n                _lock.Dispose();\n                _request.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Scan timer expired\n        /// </summary>\n        private void OnScanScheduling()\n        {\n            try\n            {\n                _timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                _lock.Wait();\n                try\n                {\n                    foreach (var task in _pending.Where(r => r.IsScan))\n                    {\n                        // Cancel any current scan tasks if any\n                        task.Cancel();\n                    }\n\n                    // Add new discovery request\n                    if (_request.Mode != DiscoveryMode.Off)\n                    {\n                        // Push request\n                        var task = _request.Clone();\n                        if (_channel.Writer.TryWrite(task))\n                        {\n                            _pending.Add(task);\n                        }\n                        else\n                        {\n                            task.Dispose();\n                        }\n                    }\n                }\n                finally\n                {\n                    _lock.Release();\n                }\n            }\n            catch (ObjectDisposedException ex)\n            {\n                _logger.ObjectDisposedTimerFiring(ex);\n            }\n        }\n\n        /// <summary>\n        /// Stop discovery request processing\n        /// </summary>\n        /// <returns></returns>\n        private async Task StopDiscoveryRequestProcessingAsync()\n        {\n            _channel.Writer.TryComplete();\n            _timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            await _lock.WaitAsync().ConfigureAwait(false);\n            try\n            {\n                // Cancel all requests first\n                foreach (var request in _pending)\n                {\n                    request.Cancel();\n                }\n            }\n            finally\n            {\n                _lock.Release();\n            }\n\n            // Try cancel discovery and wait for completion of runner\n            Try.Op(() => _cts?.Cancel());\n            try\n            {\n                await _runner.ConfigureAwait(false);\n            }\n            catch (OperationCanceledException) { }\n            catch (Exception ex)\n            {\n                _logger.UnexpectedExceptionStoppingProcessor(ex);\n            }\n        }\n\n        /// <summary>\n        /// Process discovery requests\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task ProcessDiscoveryRequestsAsync(CancellationToken ct)\n        {\n            _logger.StartingDiscoveryProcessor();\n            // Process all discovery requests\n            await foreach (var request in _channel.Reader.ReadAllAsync(ct).ConfigureAwait(false))\n            {\n                try\n                {\n                    try\n                    {\n                        // Update pending queue size\n                        await ReportPendingRequestsAsync().ConfigureAwait(false);\n                        await ProcessDiscoveryRequestAsync(request).ConfigureAwait(false);\n                    }\n                    finally\n                    {\n                        // If the request is scan request, schedule next one\n                        if (!ct.IsCancellationRequested && (request?.IsScan ?? false))\n                        {\n                            // Re-schedule another scan when idle time expired\n                            _timer.Change(\n                                request.Request.Configuration?.IdleTimeBetweenScans ??\n                                    TimeSpan.FromHours(1),\n                                Timeout.InfiniteTimeSpan);\n                        }\n                    }\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.DiscoveryProcessorErrorOccurred(ex);\n                }\n            }\n            // Send cancellation for all pending items\n            await CancelPendingRequestsAsync().ConfigureAwait(false);\n            _logger.StoppedDiscoveryProcessor();\n        }\n\n        /// <summary>\n        /// Process the provided discovery request\n        /// </summary>\n        /// <param name=\"request\"></param>\n        private async Task ProcessDiscoveryRequestAsync(DiscoveryRequest request)\n        {\n            _logger.ProcessingDiscoveryRequest();\n            request.Progress.OnDiscoveryStarted(request.Request);\n            object? diagnostics = null;\n\n            //\n            // Discover servers\n            //\n            try\n            {\n                var results = await DiscoverServersAsync(request).ConfigureAwait(false);\n                // Merge results\n                var registrations = results.ConvertAll(r => r.Discovered.ToServiceModel(\n                    r.Host, _options.Value.SiteId, _events.Identity, _serializer));\n                var discovered = new List<ApplicationRegistrationModel> ();\n                foreach (var registration in registrations)\n                {\n                    discovered.AddOrUpdate(registration);\n                }\n\n                request.Token.ThrowIfCancellationRequested();\n                //\n                // Upload results\n                //\n                await SendDiscoveryResultsAsync(request, discovered, _timeProvider.GetUtcNow(),\n                    diagnostics, request.Token).ConfigureAwait(false);\n\n                request.Progress.OnDiscoveryFinished(request.Request);\n            }\n            catch (OperationCanceledException)\n            {\n                request.Progress.OnDiscoveryCancelled(request.Request);\n            }\n            catch (Exception ex)\n            {\n                request.Progress.OnDiscoveryError(request.Request, ex);\n            }\n            finally\n            {\n                if (request != null)\n                {\n                    await _lock.WaitAsync().ConfigureAwait(false);\n                    try\n                    {\n                        _pending.Remove(request);\n                        Try.Op(request.Dispose);\n                    }\n                    finally\n                    {\n                        _lock.Release();\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Run a network discovery\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <returns></returns>\n        private async Task<List<(DiscoveredEndpointModel Discovered, string Host)>> DiscoverServersAsync(\n            DiscoveryRequest request)\n        {\n            var discoveryUrls = await GetDiscoveryUrlsAsync(request.DiscoveryUrls).ConfigureAwait(false);\n            if (request.Mode == DiscoveryMode.Off)\n            {\n                return await DiscoverServersAsync(request, discoveryUrls,\n                    request.Configuration.Locales).ConfigureAwait(false);\n            }\n\n            _logger.StartDiscoveryRun(request.Mode);\n            var watch = Stopwatch.StartNew();\n\n            //\n            // Set up scanner pipeline and start discovery\n            //\n            var local = request.Mode == DiscoveryMode.Local;\n#if !NO_WATCHDOG\n            _counter = 0;\n#endif\n            var addresses = new List<IPAddress>();\n            request.Progress.OnNetScanStarted(request.Request, 0, 0, request.TotalAddresses);\n            using (var netscanner = new NetworkScanner(_loggerFactory.CreateLogger<NetworkScanner>(),\n                (scanner, reply) =>\n                {\n                    request.Progress.OnNetScanResult(request.Request, scanner.ActiveProbes,\n                        scanner.ScanCount, request.TotalAddresses, addresses.Count, reply.Address);\n                    addresses.Add(reply.Address);\n                }, local, local ? null : request.AddressRanges, request.NetworkClass,\n                request.Configuration.MaxNetworkProbes, request.Configuration.NetworkProbeTimeout,\n                request.Token))\n            {\n                // Log progress\n                var progress = _timeProvider.CreateTimer(_ => ProgressTimer(\n                    () => request.Progress.OnNetScanProgress(request.Request, netscanner.ActiveProbes,\n                        netscanner.ScanCount, request.TotalAddresses, addresses.Count)),\n                    null, kProgressInterval, kProgressInterval);\n                await using (progress.ConfigureAwait(false))\n                {\n                    await netscanner.WaitToCompleteAsync().ConfigureAwait(false);\n                }\n                request.Progress.OnNetScanFinished(request.Request, netscanner.ActiveProbes,\n                    netscanner.ScanCount, request.TotalAddresses, addresses.Count);\n            }\n            request.Token.ThrowIfCancellationRequested();\n\n            await AddLoopbackAddressesAsync(addresses).ConfigureAwait(false);\n            if (addresses.Count == 0)\n            {\n                return [];\n            }\n\n            var ports = new List<IPEndPoint>();\n            var totalPorts = request.TotalPorts * addresses.Count;\n            var probe = new ServerProbe(_logger);\n#if !NO_WATCHDOG\n            _counter = 0;\n#endif\n            request.Progress.OnPortScanStart(request.Request, 0, 0, totalPorts);\n            using (var portscan = new PortScanner(_loggerFactory.CreateLogger<PortScanner>(),\n                addresses.SelectMany(address =>\n                {\n                    var ranges = request.PortRanges ?? PortRange.OpcUa;\n                    return ranges.SelectMany(x => x.GetEndpoints(address));\n                }), (scanner, ep) =>\n                {\n                    request.Progress.OnPortScanResult(request.Request, scanner.ActiveProbes,\n                        scanner.ScanCount, totalPorts, ports.Count, ep);\n                    ports.Add(ep);\n                }, probe, request.Configuration.MaxPortProbes,\n                request.Configuration.MinPortProbesPercent,\n                request.Configuration.PortProbeTimeout, request.Token))\n            {\n                var progress = _timeProvider.CreateTimer(_ => ProgressTimer(\n                    () => request.Progress.OnPortScanProgress(request.Request, portscan.ActiveProbes,\n                        portscan.ScanCount, totalPorts, ports.Count)),\n                    null, kProgressInterval, kProgressInterval);\n                await using (progress.ConfigureAwait(false))\n                {\n                    await portscan.WaitToCompleteAsync().ConfigureAwait(false);\n                }\n                request.Progress.OnPortScanFinished(request.Request, portscan.ActiveProbes,\n                    portscan.ScanCount, totalPorts, ports.Count);\n            }\n            request.Token.ThrowIfCancellationRequested();\n            if (ports.Count == 0)\n            {\n                return [];\n            }\n\n            //\n            // Collect discovery urls\n            //\n            foreach (var ep in ports)\n            {\n                request.Token.ThrowIfCancellationRequested();\n                var resolved = await ep.TryResolveAsync().ConfigureAwait(false);\n                var url = new Uri(\"opc.tcp://\" + resolved);\n                discoveryUrls.AddOrUpdate(ep, url);\n            }\n            request.Token.ThrowIfCancellationRequested();\n\n            //\n            // Create application model list from discovered endpoints...\n            //\n            var discovered = await DiscoverServersAsync(request, discoveryUrls,\n                request.Configuration.Locales).ConfigureAwait(false);\n\n            _logger.DiscoveryTookAndFoundServers(watch.Elapsed, discovered.Count);\n            return discovered;\n        }\n\n        /// <summary>\n        /// Discover servers using opcua discovery and filter by optional locale\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"discoveryUrls\"></param>\n        /// <param name=\"locales\"></param>\n        /// <returns></returns>\n        private async Task<List<(DiscoveredEndpointModel Discovered, string Host)>> DiscoverServersAsync(\n            DiscoveryRequest request, Dictionary<IPEndPoint, Uri> discoveryUrls,\n            IReadOnlyList<string>? locales)\n        {\n            kDiscoverServersAsync.Add(1, _metrics.TagList);\n            var discovered = new List<(DiscoveredEndpointModel Discovered, string Host)> ();\n            var count = 0;\n            request.Progress.OnServerDiscoveryStarted(request.Request, 1, count, discoveryUrls.Count);\n            foreach (var item in discoveryUrls)\n            {\n                request.Token.ThrowIfCancellationRequested();\n                var url = item.Value;\n\n                request.Progress.OnFindEndpointsStarted(request.Request, 1, count, discoveryUrls.Count,\n                    discovered.Count, url, item.Key.Address);\n\n                // Find endpoints at the real accessible ip address\n                var eps = await _client.FindEndpointsAsync(new UriBuilder(url)\n                {\n                    Host = item.Key.Address.ToString()\n                }.Uri, locales, findServersOnNetwork: true, request.Token).ConfigureAwait(false);\n\n                count++;\n                var endpoints = 0;\n                foreach (var ep in eps)\n                {\n                    discovered.Add((ep, item.Key.ToString()));\n                    endpoints++;\n                }\n                request.Progress.OnFindEndpointsFinished(request.Request, 1, count, discoveryUrls.Count,\n                    discovered.Count, url, item.Key.Address, endpoints);\n            }\n\n            request.Progress.OnServerDiscoveryFinished(request.Request, 1, discoveryUrls.Count,\n                discoveryUrls.Count, discovered.Count);\n            request.Token.ThrowIfCancellationRequested();\n            return discovered;\n        }\n\n        /// <summary>\n        /// Get all reachable addresses from urls\n        /// </summary>\n        /// <param name=\"discoveryUrls\"></param>\n        /// <returns></returns>\n        private async Task<Dictionary<IPEndPoint, Uri>> GetDiscoveryUrlsAsync(\n            IEnumerable<Uri> discoveryUrls)\n        {\n            var result = new Dictionary<IPEndPoint, Uri>();\n            if (discoveryUrls?.Any() ?? false)\n            {\n                var results = await Task.WhenAll(discoveryUrls\n                    .Select(GetHostEntryAsync)\n                    .ToArray()).ConfigureAwait(false);\n                foreach (var entry in results\n                    .SelectMany(v => v)\n                    .Where(a => a.Item2 != null))\n                {\n                    result.AddOrUpdate(entry.Item1, entry.Item2);\n                }\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Get a reachable host address from url\n        /// </summary>\n        /// <param name=\"discoveryUrl\"></param>\n        /// <returns></returns>\n        private async Task<List<Tuple<IPEndPoint, Uri>>> GetHostEntryAsync(\n            Uri discoveryUrl)\n        {\n            var list = new List<Tuple<IPEndPoint, Uri>>();\n            try\n            {\n                var host = discoveryUrl.DnsSafeHost;\n\n                // check first if host is an IP Address since the Dns.GetHostEntryAsync\n                // throws a socket exception when called with an IP address\n                try\n                {\n                    var hostIp = IPAddress.Parse(host);\n                    var ep = new IPEndPoint(hostIp,\n                            discoveryUrl.IsDefaultPort ? 4840 : discoveryUrl.Port);\n                    list.Add(Tuple.Create(ep, discoveryUrl));\n                    return list;\n                }\n                catch\n                {\n                    // Parsing failed, therefore not an IP address, continue with dns\n                    // resolution\n                }\n\n                while (!string.IsNullOrEmpty(host))\n                {\n                    try\n                    {\n                        var entry = await Dns.GetHostEntryAsync(host).ConfigureAwait(false);\n                        // only pick-up the IPV4 addresses\n                        var foundIpv4 = false;\n                        foreach (var address in entry.AddressList\n                            .Where(a => a.AddressFamily == AddressFamily.InterNetwork))\n                        {\n                            var ep = new IPEndPoint(address,\n                                discoveryUrl.IsDefaultPort ? 4840 : discoveryUrl.Port);\n                            list.Add(Tuple.Create(ep, discoveryUrl));\n                            foundIpv4 = true;\n                        }\n                        if (!foundIpv4)\n                        {\n                            // if no IPV4 responsive, try IPV6 as fallback\n                            foreach (var address in entry.AddressList\n                                .Where(a => a.AddressFamily != AddressFamily.InterNetwork))\n                            {\n                                var ep = new IPEndPoint(address,\n                                    discoveryUrl.IsDefaultPort ? 4840 : discoveryUrl.Port);\n                                list.Add(Tuple.Create(ep, discoveryUrl));\n                            }\n                        }\n\n                        // Check local host\n                        if (StringComparer.OrdinalIgnoreCase.Equals(host, \"localhost\") && IsContainer)\n                        {\n                            // Also resolve docker internal since we are in a container\n                            host = Environment.GetEnvironmentVariable(kIoTEdgeGatewayHostNameEnvVar);\n                            continue;\n                        }\n                        break;\n                    }\n                    catch (SocketException se)\n                    {\n                        _logger.FailedToResolveHostForDiscoveryUrl(discoveryUrl, se.Message);\n                        return list;\n                    }\n                    catch (Exception e)\n                    {\n                        _logger.FailedToResolveHostForDiscoveryUrlException(e, discoveryUrl);\n                        return list;\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.FailedToGetHostEntry(ex);\n            }\n            return list;\n        }\n\n        /// <summary>\n        /// Add localhost ip to list if not already in it.\n        /// </summary>\n        /// <param name=\"addresses\"></param>\n        /// <returns></returns>\n        private async Task AddLoopbackAddressesAsync(List<IPAddress> addresses)\n        {\n            // Check local host\n            var hostName = Environment.GetEnvironmentVariable(kIoTEdgeGatewayHostNameEnvVar);\n            try\n            {\n                if (IsContainer)\n                {\n                    // Resolve docker host since we are running in a container\n                    if (string.IsNullOrEmpty(hostName))\n                    {\n                        _logger.GatewayHostNameNotSet();\n                        return;\n                    }\n                    _logger.ResolveIpForGatewayHostName(hostName);\n                    var entry = await Dns.GetHostEntryAsync(hostName).ConfigureAwait(false);\n                    foreach (var address in entry.AddressList\n                                .Where(a => a.AddressFamily == AddressFamily.InterNetwork)\n                                .Where(a => !addresses.Any(b => a.Equals(b))))\n                    {\n                        _logger.IncludingGatewayHostAddress(address);\n                        addresses.Add(address);\n                    }\n                }\n                else\n                {\n                    // Add loopback address\n                    addresses.Add(IPAddress.Loopback);\n                }\n            }\n            catch (SocketException se)\n            {\n                _logger.FailedToAddAddressForGatewayHost(hostName, se.Message);\n            }\n            catch (Exception e)\n            {\n                _logger.FailedToAddAddressForGatewayHostException(e, hostName);\n            }\n        }\n\n        /// <summary>\n        /// Upload results\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"discovered\"></param>\n        /// <param name=\"timestamp\"></param>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task SendDiscoveryResultsAsync(DiscoveryRequest request,\n            List<ApplicationRegistrationModel> discovered, DateTimeOffset timestamp,\n            object? diagnostics, CancellationToken ct)\n        {\n            _logger.UploadingResults(discovered.Count);\n            var buffers = discovered\n                .SelectMany(server => (server.Endpoints ?? Array.Empty<EndpointRegistrationModel>())\n                    .Select(registration => new DiscoveryEventModel\n                    {\n                        Application = server.Application,\n                        Registration = registration,\n                        TimeStamp = timestamp\n                    }))\n                .Append(new DiscoveryEventModel\n                {\n                    Registration = null, // last\n                    Result = new DiscoveryResultModel\n                    {\n                        DiscoveryConfig = request.Configuration,\n                        Id = request.Request.Id,\n                        Context = request.Request.Context,\n                        RegisterOnly = request.Mode == DiscoveryMode.Off,\n                        Diagnostics = diagnostics == null ? null :\n                            _serializer.FromObject(diagnostics)\n                    },\n                    TimeStamp = timestamp\n                })\n                .Select((discovery, i) =>\n                {\n                    discovery.Index = i;\n                    return _serializer.SerializeToMemory(discovery);\n                })\n                .ToList();\n\n            await _events.SendEventAsync(_topic, buffers, _serializer.MimeType,\n                Encoding.UTF8.WebName, e => e.AddProperty(OpcUa.Constants.MessagePropertySchemaKey,\n                    MessageSchemaTypes.DiscoveryEvents), ct: ct).ConfigureAwait(false);\n            _logger.ResultsUploaded(discovered.Count);\n        }\n\n        /// <summary>\n        /// Cancel all remaining pending requests\n        /// </summary>\n        /// <returns></returns>\n        private async Task CancelPendingRequestsAsync()\n        {\n            _logger.CancellingAllPendingRequests();\n            await _lock.WaitAsync().ConfigureAwait(false);\n            try\n            {\n                foreach (var request in _pending)\n                {\n                    request.Progress.OnDiscoveryCancelled(request.Request);\n                    Try.Op(request.Dispose);\n                }\n                _pending.Clear();\n            }\n            finally\n            {\n                _lock.Release();\n            }\n            _logger.PendingRequestsCancelled();\n        }\n\n        /// <summary>\n        /// Send pending queue size\n        /// </summary>\n        /// <returns></returns>\n        private async Task ReportPendingRequestsAsync()\n        {\n            // Notify all listeners about the request's place in queue\n            await _lock.WaitAsync().ConfigureAwait(false);\n            try\n            {\n                for (var pos = 0; pos < _pending.Count; pos++)\n                {\n                    var item = _pending[pos];\n                    if (!item.Token.IsCancellationRequested)\n                    {\n                        item.Progress.OnDiscoveryPending(item.Request, pos);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.FailedToSendPendingEvent(ex);\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <summary>\n        /// Called in intervals to check and log progress.\n        /// </summary>\n        /// <param name=\"log\"></param>\n        /// <exception cref=\"ThreadStateException\"></exception>\n        private void ProgressTimer(Action log)\n        {\n            if ((_counter % 3) == 0)\n            {\n                _logger.GcMemWorkingSetPrivateMemHandles(\n                    GC.GetTotalMemory(false) / 1024,\n                    Process.GetCurrentProcess().WorkingSet64 / 1024,\n                    Process.GetCurrentProcess().PrivateMemorySize64 / 1024,\n                    Process.GetCurrentProcess().HandleCount);\n            }\n            ++_counter;\n#if !NO_WATCHDOG\n            if ((_counter % 200) == 0 && _counter >= 2000)\n            {\n                throw new ThreadStateException(\"Stuck\");\n            }\n#endif\n            log();\n        }\n\n#if !NO_WATCHDOG\n        private int _counter;\n#endif\n        private static readonly Counter<int> kDiscoverAsync = Diagnostics.Meter.CreateCounter<int>(\n            \"iiot_edge_discovery_discover\", \"calls\", \"call to discover\");\n        private static readonly Counter<int> kCancelAsync = Diagnostics.Meter.CreateCounter<int>(\n            \"iiot_edge_discovery_cancel\", \"calls\", \"call to cancel\");\n        private static readonly Counter<int> kDiscoverServersAsync = Diagnostics.Meter.CreateCounter<int>(\n            \"iiot_edge_discovery_discover_servers\", \"calls\", \"call to discoverServersAsync\");\n\n        /// <summary> Progress reporting every 3 seconds </summary>\n        private static readonly TimeSpan kProgressInterval = TimeSpan.FromSeconds(3);\n\n        private const string kIoTEdgeGatewayHostNameEnvVar = \"IOTEDGE_GATEWAYHOSTNAME\";\n        private readonly ILogger _logger;\n        private readonly ILoggerFactory _loggerFactory;\n        private readonly IJsonSerializer _serializer;\n        private readonly IEventClient _events;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly Channel<DiscoveryRequest> _channel;\n        private readonly IMetricsContext _metrics;\n        private readonly IEndpointDiscovery _client;\n        private readonly Task _runner;\n        private readonly ITimer _timer;\n        private readonly TimeProvider _timeProvider;\n        private readonly string _topic;\n        private readonly SemaphoreSlim _lock = new(1, 1);\n        private readonly List<DiscoveryRequest> _pending = [];\n        private readonly CancellationTokenSource _cts = new();\n        private readonly DiscoveryRequest _request;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for NetworkDiscovery\n    /// </summary>\n    internal static partial class NetworkDiscoveryLogging\n    {\n        private const int EventClass = 0;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Discovery request not scheduled, internal server error!\")]\n        public static partial void DiscoveryRequestNotScheduled(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Object disposed but still timer is firing\")]\n        public static partial void ObjectDisposedTimerFiring(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"Unexpected exception stopping processor thread.\")]\n        public static partial void UnexpectedExceptionStoppingProcessor(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Starting discovery processor...\")]\n        public static partial void StartingDiscoveryProcessor(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"Discovery processor error occurred - continue...\")]\n        public static partial void DiscoveryProcessorErrorOccurred(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"Stopped discovery processor.\")]\n        public static partial void StoppedDiscoveryProcessor(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Debug,\n            Message = \"Processing discovery request...\")]\n        public static partial void ProcessingDiscoveryRequest(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"Start {Mode} discovery run...\")]\n        public static partial void StartDiscoveryRun(this ILogger logger, DiscoveryMode mode);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"Discovery took {Elapsed} and found {Count} servers.\")]\n        public static partial void DiscoveryTookAndFoundServers(this ILogger logger, TimeSpan elapsed, int count);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"Uploading {Count} results...\")]\n        public static partial void UploadingResults(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Information,\n            Message = \"{Count} results uploaded.\")]\n        public static partial void ResultsUploaded(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"Cancelling all pending requests...\")]\n        public static partial void CancellingAllPendingRequests(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"Pending requests cancelled...\")]\n        public static partial void PendingRequestsCancelled(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"Gateway host name not set\")]\n        public static partial void GatewayHostNameNotSet(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Debug,\n            Message = \"Resolve IP for gateway host name: {Address}\")]\n        public static partial void ResolveIpForGatewayHostName(this ILogger logger, string address);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Information,\n            Message = \"Including gateway host address {Address}\")]\n        public static partial void IncludingGatewayHostAddress(this ILogger logger, IPAddress address);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Warning,\n            Message = \"Failed to add address for gateway host {HostName} due to {Error}.\")]\n        public static partial void FailedToAddAddressForGatewayHost(this ILogger logger, string? hostName, string error);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Error,\n            Message = \"Failed to add address for gateway host {HostName}.\")]\n        public static partial void FailedToAddAddressForGatewayHostException(this ILogger logger, Exception ex, string? hostName);\n\n        [LoggerMessage(EventId = EventClass + 19, Level = LogLevel.Warning,\n            Message = \"Failed to send pending event\")]\n        public static partial void FailedToSendPendingEvent(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 20, Level = LogLevel.Information,\n            Message = \"GC Mem: {Gcmem} kb, Working set / Private Mem: {Privmem} kb / {Privmemsize} kb, Handles: {Handles}\")]\n        public static partial void GcMemWorkingSetPrivateMemHandles(this ILogger logger, long gcmem, long privmem, long privmemsize, int handles);\n\n        [LoggerMessage(EventId = EventClass + 21, Level = LogLevel.Warning,\n            Message = \"Failed to resolve the host for {DiscoveryUrl} due to {Message}\")]\n        public static partial void FailedToResolveHostForDiscoveryUrl(this ILogger logger, Uri discoveryUrl, string message);\n\n        [LoggerMessage(EventId = EventClass + 22, Level = LogLevel.Error,\n            Message = \"Failed to resolve the host for {DiscoveryUrl}\")]\n        public static partial void FailedToResolveHostForDiscoveryUrlException(this ILogger logger, Exception ex, Uri discoveryUrl);\n\n        [LoggerMessage(EventId = EventClass + 23, Level = LogLevel.Debug,\n            Message = \"Failed to get host entry.\")]\n        public static partial void FailedToGetHostEntry(this ILogger logger, Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Discovery/ProgressLogger.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Discovery\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Microsoft.Extensions.Logging;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Net;\n\n    /// <summary>\n    /// Discovery progress logger\n    /// </summary>\n    public class ProgressLogger : IDiscoveryProgress\n    {\n        /// <summary>\n        /// Create listener\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        internal ProgressLogger(ILogger logger, TimeProvider? timeProvider = null)\n        {\n            _logger = logger;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n        }\n\n        /// <inheritdoc/>\n        public void OnDiscoveryPending(DiscoveryRequestModel request,\n            int pending)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                EventType = DiscoveryProgressType.Pending,\n                Request = request,\n                Total = pending\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnDiscoveryStarted(DiscoveryRequestModel request)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                EventType = DiscoveryProgressType.Started,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnDiscoveryCancelled(DiscoveryRequestModel request)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.Cancelled,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnDiscoveryError(DiscoveryRequestModel request,\n            Exception ex)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.Error,\n                Request = request,\n                Result = ex.Message,\n                ResultDetails = new Dictionary<string, string>\n                {\n                    [\"exception\"] = ex.ToString()\n                }\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnDiscoveryFinished(DiscoveryRequestModel request)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.Finished,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnNetScanStarted(DiscoveryRequestModel request,\n            int workers, int progress, int total)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.NetworkScanStarted,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnNetScanResult(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered, IPAddress address)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.NetworkScanResult,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Result = address.ToString(),\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnNetScanProgress(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.NetworkScanProgress,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnNetScanFinished(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.NetworkScanFinished,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnPortScanStart(DiscoveryRequestModel request,\n            int workers, int progress, int total)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.PortScanStarted,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnPortScanResult(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered, IPEndPoint ep)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                TimeStamp = _timeProvider.GetUtcNow(),\n                EventType = DiscoveryProgressType.PortScanResult,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Result = ep.ToString(),\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnPortScanProgress(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                EventType = DiscoveryProgressType.PortScanProgress,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnPortScanFinished(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                EventType = DiscoveryProgressType.PortScanFinished,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnServerDiscoveryStarted(DiscoveryRequestModel request,\n            int workers, int progress, int total)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                EventType = DiscoveryProgressType.ServerDiscoveryStarted,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnFindEndpointsStarted(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered, Uri url, IPAddress address)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                EventType = DiscoveryProgressType.EndpointsDiscoveryStarted,\n                RequestDetails = new Dictionary<string, string>\n                {\n                    [\"url\"] = url.ToString(),\n                    [\"address\"] = address.ToString()\n                },\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Request = request.Clone(_timeProvider)\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnFindEndpointsFinished(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered, Uri url,\n            IPAddress address, int endpoints)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                EventType = DiscoveryProgressType.EndpointsDiscoveryFinished,\n                RequestDetails = new Dictionary<string, string>\n                {\n                    [\"url\"] = url.ToString(),\n                    [\"address\"] = address.ToString()\n                },\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Result = endpoints.ToString(CultureInfo.InvariantCulture),\n                Request = request\n            });\n        }\n\n        /// <inheritdoc/>\n        public void OnServerDiscoveryFinished(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered)\n        {\n            Send(new DiscoveryProgressModel\n            {\n                EventType = DiscoveryProgressType.ServerDiscoveryFinished,\n                Workers = workers,\n                Progress = progress,\n                Total = total,\n                Discovered = discovered,\n                Request = request\n            });\n        }\n\n        /// <summary>\n        /// Send progress\n        /// </summary>\n        /// <param name=\"progress\"></param>\n        protected virtual void Send(DiscoveryProgressModel progress)\n        {\n            progress.TimeStamp = _timeProvider.GetUtcNow();\n            var requestId = progress.Request?.Id;\n            switch (progress.EventType)\n            {\n                case DiscoveryProgressType.Pending:\n                    _logger.DiscoveryPending(requestId);\n                    break;\n                case DiscoveryProgressType.Started:\n                    _logger.DiscoveryStarted(requestId);\n                    break;\n                case DiscoveryProgressType.Cancelled:\n                    _logger.DiscoveryCancelled(requestId);\n                    break;\n                case DiscoveryProgressType.Error:\n                    _logger.DiscoveryError(requestId, progress.Result);\n                    break;\n                case DiscoveryProgressType.Finished:\n                    _logger.DiscoveryFinished(requestId);\n                    break;\n                case DiscoveryProgressType.NetworkScanStarted:\n                    _logger.NetworkScanStarted(requestId, progress.Workers);\n                    break;\n                case DiscoveryProgressType.NetworkScanResult:\n                    _logger.NetworkScanResult(requestId, progress.Result, progress.Progress);\n                    break;\n                case DiscoveryProgressType.NetworkScanProgress:\n                    _logger.NetworkScanProgress(requestId, progress.Progress, progress.Discovered, progress.Workers);\n                    break;\n                case DiscoveryProgressType.NetworkScanFinished:\n                    _logger.NetworkScanFinished(requestId, progress.Discovered, progress.Progress);\n                    break;\n                case DiscoveryProgressType.PortScanStarted:\n                    _logger.PortScanStarted(requestId, progress.Workers);\n                    break;\n                case DiscoveryProgressType.PortScanResult:\n                    _logger.PortScanResult(requestId, progress.Result, progress.Progress);\n                    break;\n                case DiscoveryProgressType.PortScanProgress:\n                    _logger.PortScanProgress(requestId, progress.Progress, progress.Discovered, progress.Workers);\n                    break;\n                case DiscoveryProgressType.PortScanFinished:\n                    _logger.PortScanFinished(requestId, progress.Discovered, progress.Progress);\n                    break;\n                case DiscoveryProgressType.ServerDiscoveryStarted:\n                    _logger.ServerDiscoveryStarted(requestId, progress.Total);\n                    break;\n                case DiscoveryProgressType.EndpointsDiscoveryStarted:\n                    _logger.EndpointsDiscoveryStarted(requestId, progress.RequestDetails?[\"url\"]);\n                    break;\n                case DiscoveryProgressType.EndpointsDiscoveryFinished:\n                    if (!progress.Discovered.HasValue || progress.Discovered == 0)\n                    {\n                        _logger.NoEndpointsDiscovered(requestId, progress.RequestDetails?[\"url\"]);\n                    }\n                    _logger.EndpointsDiscoveryFinished(requestId, progress.Discovered ?? 0, progress.RequestDetails?[\"url\"]);\n                    break;\n                case DiscoveryProgressType.ServerDiscoveryFinished:\n                    _logger.ServerDiscoveryFinished(requestId, progress.Discovered);\n                    break;\n            }\n        }\n\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for ProgressLogger\n    /// </summary>\n    internal static partial class ProgressLoggerLogging\n    {\n        private const int EventClass = 30;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Trace,\n            Message = \"{RequestId}: Discovery operations pending.\")]\n        internal static partial void DiscoveryPending(this ILogger logger, string? requestId);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"{RequestId}: Discovery operation started.\")]\n        internal static partial void DiscoveryStarted(this ILogger logger, string? requestId);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"{RequestId}: Discovery operation cancelled.\")]\n        internal static partial void DiscoveryCancelled(this ILogger logger, string? requestId);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"{RequestId}: Error {Error} during discovery run.\")]\n        internal static partial void DiscoveryError(this ILogger logger, string? requestId,\n            string? error);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"{RequestId}: Discovery operation completed.\")]\n        internal static partial void DiscoveryFinished(this ILogger logger, string? requestId);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"{RequestId}: Starting network scan ({Active} probes active)...\")]\n        internal static partial void NetworkScanStarted(this ILogger logger, string? requestId,\n            int? active);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"{RequestId}: Found address {Address} ({Scanned} scanned)...\")]\n        internal static partial void NetworkScanResult(this ILogger logger, string? requestId,\n            string? address, int? scanned);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"{RequestId}: {Scanned} addresses scanned - {Discovered} discovered ({Active} probes active)...\")]\n        internal static partial void NetworkScanProgress(this ILogger logger, string? requestId,\n            int? scanned, int? discovered, int? active);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"{RequestId}: Found {Count} addresses. ({Scanned} scanned)...\")]\n        internal static partial void NetworkScanFinished(this ILogger logger, string? requestId,\n            int? count, int? scanned);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"{RequestId}: Starting port scanning ({Active} probes active)...\")]\n        internal static partial void PortScanStarted(this ILogger logger, string? requestId,\n            int? active);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Information,\n            Message = \"{RequestId}: Found server {Endpoint} ({Scanned} scanned)...\")]\n        internal static partial void PortScanResult(this ILogger logger, string? requestId,\n            string? endpoint, int? scanned);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"{RequestId}: {Scanned} ports scanned - {Discovered} discovered ({Active} probes active)...\")]\n        internal static partial void PortScanProgress(this ILogger logger, string? requestId,\n            int? scanned, int? discovered, int? active);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"{RequestId}: Found {Count} ports on servers ({Scanned} scanned)...\")]\n        internal static partial void PortScanFinished(this ILogger logger, string? requestId,\n            int? count, int? scanned);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"{RequestId}: Searching {Count} discovery urls for endpoints...\")]\n        internal static partial void ServerDiscoveryStarted(this ILogger logger, string? requestId,\n            int? count);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Information,\n            Message = \"{RequestId}: Trying to find endpoints on {Details}...\")]\n        internal static partial void EndpointsDiscoveryStarted(this ILogger logger, string? requestId,\n            string? details);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Information,\n            Message = \"{RequestId}: No endpoints discovered on {Details}.\")]\n        internal static partial void NoEndpointsDiscovered(this ILogger logger, string? requestId,\n            string? details);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Information,\n            Message = \"{RequestId}: Found {Count} endpoints on {Details}.\")]\n        internal static partial void EndpointsDiscoveryFinished(this ILogger logger, string? requestId,\n            int count, string? details);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Information,\n            Message = \"{RequestId}: Found total of {Count} servers ...\")]\n        internal static partial void ServerDiscoveryFinished(this ILogger logger, string? requestId,\n            int? count);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Discovery/ProgressPublisher.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Discovery\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Channels;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Discovery progress message sender\n    /// </summary>\n    public sealed class ProgressPublisher : ProgressLogger, IDisposable\n    {\n        /// <summary>\n        /// Create listener\n        /// </summary>\n        /// <param name=\"events\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public ProgressPublisher(IEnumerable<IEventClient> events, IJsonSerializer serializer,\n            IOptions<PublisherOptions> options, ILogger<ProgressPublisher> logger,\n            TimeProvider? timeProvider = null)\n            : base(logger, timeProvider)\n        {\n            _serializer = serializer ?? throw new ArgumentNullException(nameof(serializer));\n            _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n            _options = options;\n\n            if (_options.Value.AllowedEventAndDiagnosticsTransports.Count > 0)\n            {\n                var allowed = _options.Value.AllowedEventAndDiagnosticsTransports\n                    .Select(t => t.ToString())\n                    .ToHashSet(StringComparer.OrdinalIgnoreCase);\n                events = events\n                    .Where(e => allowed.Contains(e.Name))\n                    .ToList();\n            }\n\n            _events = events.Reverse().ToList();\n            _channel = Channel.CreateUnbounded<DiscoveryProgressModel>(\n                new UnboundedChannelOptions\n                {\n                    SingleReader = true,\n                    SingleWriter = false\n                });\n            _sender = Task.Factory.StartNew(SendProgressAsync,\n                default, TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap();\n        }\n\n        /// <inheritdoc/>\n        protected override void Send(DiscoveryProgressModel progress)\n        {\n            base.Send(progress);\n            if (!_channel.Writer.TryWrite(progress))\n            {\n                _logger.CannotSendIfProgressPublisherDisposed();\n                ObjectDisposedException.ThrowIf(true, this);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            if (!_sender.IsCompleted)\n            {\n                _channel.Writer.Complete();\n                _sender.GetAwaiter().GetResult();\n            }\n        }\n\n        /// <summary>\n        /// Send progress\n        /// </summary>\n        /// <returns></returns>\n        private async Task SendProgressAsync()\n        {\n            await foreach (var progress in _channel.Reader.ReadAllAsync().ConfigureAwait(false))\n            {\n                var eventsTopic = _topicCache.GetOrAdd(\n                    (progress.EventType.ToString(), progress.RequestId),\n                id => new TopicBuilder(_options.Value, variables: new Dictionary<string, string>\n                {\n                    [PublisherConfig.EventNameVariableName] =\n                        id.Item1 ?? Constants.DefaultEventName,\n                    [PublisherConfig.EventContextVariableName] =\n                        id.Item2 ?? Constants.DefaultContextName,\n                    [PublisherConfig.EventSourceVariableName] =\n                        \"discovery\",\n                    [PublisherConfig.EncodingVariableName] =\n                        MessageEncoding.Json.ToString()\n                    // ...\n                }).EventsTopic);\n\n                await Task.WhenAll(_events.Select(SendOneEventAsync)).ConfigureAwait(false);\n\n                async Task SendOneEventAsync(IEventClient events)\n                {\n                    try\n                    {\n                        await events.SendEventAsync(eventsTopic,\n                            _serializer.SerializeToMemory(progress with { DiscovererId = events.Identity }),\n                            _serializer.MimeType, Encoding.UTF8.WebName,\n                            eventMessage =>\n                            {\n                                if (_options.Value.EnableCloudEvents == true)\n                                {\n                                    eventMessage = eventMessage.AsCloudEvent(new CloudEventHeader\n                                    {\n                                        Id = Guid.NewGuid().ToString(\"N\"),\n                                        Source = new Uri(\"urn:\" + _options.Value.PublisherId),\n                                        Subject = progress.EventType.ToString(),\n                                        Type = MessageSchemaTypes.DiscoveryMessage\n                                    });\n                                }\n                                else\n                                {\n                                    eventMessage.AddProperty(OpcUa.Constants.MessagePropertySchemaKey,\n                                       MessageSchemaTypes.DiscoveryMessage);\n                                }\n                            }).ConfigureAwait(false);\n                    }\n                    catch (Exception ex)\n                    {\n                        _logger.FailedToSendDiscoveryProgress(ex);\n                    }\n                }\n            }\n        }\n\n        private readonly ILogger _logger;\n        private readonly IJsonSerializer _serializer;\n        private readonly Task _sender;\n        private readonly Channel<DiscoveryProgressModel> _channel;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly ConcurrentDictionary<(string, string?), string> _topicCache = new();\n        private readonly List<IEventClient> _events;\n    }\n\n    internal static partial class ProgressPublisherLogging\n    {\n        private const int EventClass = 60;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Cannot send if progress publisher is already disposed.\")]\n        public static partial void CannotSendIfProgressPublisherDisposed(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Failed to send discovery progress.\")]\n        public static partial void FailedToSendDiscoveryProgress(this ILogger logger, Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Discovery/ServerDiscovery.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Discovery\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Furly.Exceptions;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Server discovery on top of OPC UA endpoint discovery\n    /// </summary>\n    public sealed class ServerDiscovery : IServerDiscovery\n    {\n        /// <summary>\n        /// Create services\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"options\"></param>\n        public ServerDiscovery(IEndpointDiscovery client, IJsonSerializer serializer,\n            IOptions<PublisherOptions> options)\n        {\n            _serializer = serializer ?? throw new ArgumentNullException(nameof(serializer));\n            _client = client ?? throw new ArgumentNullException(nameof(client));\n            _options = options ?? throw new ArgumentNullException(nameof(options));\n        }\n\n        /// <inheritdoc/>\n        public async Task<ApplicationRegistrationModel> FindServerAsync(\n            ServerEndpointQueryModel query, CancellationToken ct)\n        {\n            if (query?.DiscoveryUrl == null)\n            {\n                throw new ArgumentException(\"Discovery url missing\", nameof(query));\n            }\n\n            var discoveryUrl = new Uri(query.DiscoveryUrl);\n\n            // Find endpoints at the real accessible ip address\n            var eps = await _client.FindEndpointsAsync(discoveryUrl,\n                findServersOnNetwork: true, ct: ct).ConfigureAwait(false);\n\n            // Match endpoints\n            foreach (var ep in eps)\n            {\n                if ((ep.Description.SecurityMode.ToServiceType() ?? SecurityMode.None)\n                    != (query.SecurityMode ?? SecurityMode.None))\n                {\n                    // no match\n                    continue;\n                }\n                if (query.SecurityPolicy != null &&\n                    query.SecurityPolicy != ep.Description.SecurityPolicyUri)\n                {\n                    // no match\n                    continue;\n                }\n                if (query.Certificate != null &&\n                    query.Certificate != ep.Description.ServerCertificate.ToThumbprint())\n                {\n                    // no match\n                    continue;\n                }\n                return ep.ToServiceModel(discoveryUrl.Host, _options.Value.SiteId,\n                    _options.Value.PublisherId ?? Constants.DefaultPublisherId, _serializer);\n            }\n            throw new ResourceNotFoundException(\"Endpoints could not be found.\");\n        }\n\n        private readonly IJsonSerializer _serializer;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly IEndpointDiscovery _client;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Extensions/ContainerBuilderEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Discovery;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Storage;\n    using Autofac;\n\n    /// <summary>\n    /// Container builder extensions\n    /// </summary>\n    public static class ContainerBuilderEx\n    {\n        /// <summary>\n        /// Configure services\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public static void AddPublisherCore(this ContainerBuilder builder)\n        {\n            builder.AddOpcUaStack();\n\n            builder.RegisterType<PublisherConfig>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<PublisherModule>()\n                .AsImplementedInterfaces().SingleInstance();\n\n            builder.RegisterType<PhysicalFileProviderFactory>()\n                .AsImplementedInterfaces().SingleInstance();\n            builder.RegisterType<PublishedNodesProvider>()\n                .AsImplementedInterfaces().SingleInstance();\n            builder.RegisterType<PublishedNodesConverter>()\n                .SingleInstance();\n            builder.RegisterType<PublishedNodesJsonServices>()\n                .AsImplementedInterfaces().SingleInstance();\n            builder.RegisterType<PublisherService>()\n                .AsImplementedInterfaces().SingleInstance();\n            builder.RegisterType<PublisherDiagnosticCollector>()\n                .AsImplementedInterfaces().SingleInstance();\n            builder.RegisterType<RuntimeStateReporter>()\n                .AsImplementedInterfaces().SingleInstance();\n\n            builder.RegisterType<WriterGroupScopeFactory>()\n                .AsImplementedInterfaces().SingleInstance();\n            builder.RegisterType<NodeServices<ConnectionModel>>()\n                .AsImplementedInterfaces().InstancePerLifetimeScope();\n            builder.RegisterType<ConfigurationServices>()\n                .AsImplementedInterfaces().InstancePerLifetimeScope();\n            builder.RegisterType<HistoryServices<ConnectionModel>>()\n                .AsImplementedInterfaces().InstancePerLifetimeScope();\n            builder.RegisterType<FileSystemServices<ConnectionModel>>()\n                .AsImplementedInterfaces().InstancePerLifetimeScope();\n            builder.RegisterType<ServerDiscovery>()\n                .AsImplementedInterfaces().InstancePerLifetimeScope();\n            builder.RegisterType<NetworkDiscovery>()\n                .AsImplementedInterfaces().InstancePerLifetimeScope();\n            builder.RegisterType<ProgressPublisher>()\n                .AsImplementedInterfaces().InstancePerLifetimeScope();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Extensions/DataSetWriterModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using System;\n\n    /// <summary>\n    /// Data set extensions\n    /// </summary>\n    internal static class DataSetWriterModelEx\n    {\n        /// <summary>\n        /// Check whether there is anything the writer can publish\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <returns></returns>\n        public static bool HasDataToPublish(this DataSetWriterModel? writer)\n        {\n            var source = writer?.DataSet?.DataSetSource;\n            if (source != null)\n            {\n                if (source.PublishedEvents?.PublishedData?.Count > 0 ||\n                    source.PublishedVariables?.PublishedData?.Count > 0)\n                {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Get connection to create subscription in\n        /// </summary>\n        /// <param name=\"dataSetWriter\"></param>\n        /// <param name=\"writerGroupId\"></param>\n        /// <param name=\"options\"></param>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public static ConnectionIdentifier GetConnection(this DataSetWriterModel dataSetWriter,\n            string? writerGroupId, PublisherOptions options)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriter);\n\n            if (dataSetWriter.DataSet?.DataSetSource?.Connection == null)\n            {\n                throw new ArgumentException(\"Connection missing from data source\", nameof(dataSetWriter));\n            }\n\n            var connection = dataSetWriter.DataSet.DataSetSource.Connection;\n\n            if (connection.Group == null && options.DisableSessionPerWriterGroup != true)\n            {\n                connection = connection with\n                {\n                    Group = writerGroupId\n                };\n            }\n\n            if (!connection.Options.HasFlag(ConnectionOptions.UseReverseConnect) &&\n                options.DefaultUseReverseConnect == true)\n            {\n                connection = connection with\n                {\n                    Options = connection.Options | ConnectionOptions.UseReverseConnect\n                };\n            }\n\n            if (!connection.Options.HasFlag(ConnectionOptions.NoComplexTypeSystem) &&\n                options.DisableComplexTypeSystem == true)\n            {\n                connection = connection with\n                {\n                    Options = connection.Options | ConnectionOptions.NoComplexTypeSystem\n                };\n            }\n\n            if (!connection.Options.HasFlag(ConnectionOptions.NoSubscriptionTransfer) &&\n                options.DisableSubscriptionTransfer == true)\n            {\n                connection = connection with\n                {\n                    Options = connection.Options | ConnectionOptions.NoSubscriptionTransfer\n                };\n            }\n            return new ConnectionIdentifier(connection);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Extensions/PublishedDataSetSourceModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Source model extensions\n    /// </summary>\n    public static class PublishedDataSetSourceModelEx\n    {\n        /// <summary>\n        /// Create subscription\n        /// </summary>\n        /// <param name=\"subscriptionSettings\"></param>\n        /// <param name=\"fetchBrowsePathFromRootOverride\"></param>\n        /// <param name=\"ignoreConfiguredPublishingIntervals\"></param>\n        /// <returns></returns>\n        public static SubscriptionModel ToSubscriptionModel(\n            this PublishedDataSetSettingsModel? subscriptionSettings,\n            bool? fetchBrowsePathFromRootOverride, bool? ignoreConfiguredPublishingIntervals)\n        {\n            return new SubscriptionModel\n            {\n                Priority = subscriptionSettings?.Priority,\n                MaxNotificationsPerPublish = subscriptionSettings?.MaxNotificationsPerPublish,\n                LifetimeCount = subscriptionSettings?.LifeTimeCount,\n                KeepAliveCount = subscriptionSettings?.MaxKeepAliveCount,\n                PublishingInterval = ignoreConfiguredPublishingIntervals == true ?\n                       null : subscriptionSettings?.PublishingInterval,\n                UseDeferredAcknoledgements = subscriptionSettings?.UseDeferredAcknoledgements,\n                EnableImmediatePublishing = subscriptionSettings?.EnableImmediatePublishing,\n                EnableSequentialPublishing = subscriptionSettings?.EnableSequentialPublishing,\n                RepublishAfterTransfer = subscriptionSettings?.RepublishAfterTransfer,\n                MonitoredItemWatchdogTimeout = subscriptionSettings?.MonitoredItemWatchdogTimeout,\n                WatchdogCondition = subscriptionSettings?.MonitoredItemWatchdogCondition,\n                WatchdogBehavior = subscriptionSettings?.WatchdogBehavior,\n                ResolveBrowsePathFromRoot = fetchBrowsePathFromRootOverride\n            };\n        }\n\n        /// <summary>\n        /// Convert dataset source to monitored item\n        /// </summary>\n        /// <param name=\"dataSetSource\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        public static IReadOnlyList<BaseMonitoredItemModel> ToMonitoredItems(\n            this PublishedDataSetSourceModel dataSetSource, NamespaceFormat namespaceFormat)\n        {\n            var monitoredItems = Enumerable.Empty<BaseMonitoredItemModel>();\n            if (dataSetSource.PublishedVariables?.PublishedData != null)\n            {\n                monitoredItems = monitoredItems\n                    .Concat(dataSetSource.PublishedVariables\n                        .ToMonitoredItems(dataSetSource.SubscriptionSettings, namespaceFormat));\n            }\n            if (dataSetSource.PublishedEvents?.PublishedData != null)\n            {\n                monitoredItems = monitoredItems\n                    .Concat(dataSetSource.PublishedEvents\n                        .ToMonitoredItems(dataSetSource.SubscriptionSettings, namespaceFormat));\n            }\n            return monitoredItems.ToList();\n        }\n\n        /// <summary>\n        /// Convert to monitored items including heartbeat handling.\n        /// </summary>\n        /// <param name=\"dataItems\"></param>\n        /// <param name=\"settings\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"includeTriggering\"></param>\n        /// <returns></returns>\n        internal static IEnumerable<BaseMonitoredItemModel> ToMonitoredItems(\n            this PublishedDataItemsModel dataItems, PublishedDataSetSettingsModel? settings,\n            NamespaceFormat namespaceFormat, bool includeTriggering = true)\n        {\n            if (dataItems?.PublishedData != null)\n            {\n                foreach (var publishedData in dataItems.PublishedData)\n                {\n                    var item = publishedData?.ToMonitoredItemTemplate(settings,\n                        namespaceFormat, includeTriggering);\n                    if (item != null)\n                    {\n                        yield return item;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Convert to monitored items\n        /// </summary>\n        /// <param name=\"eventItems\"></param>\n        /// <param name=\"settings\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"includeTriggering\"></param>\n        /// <returns></returns>\n        internal static IEnumerable<BaseMonitoredItemModel> ToMonitoredItems(\n            this PublishedEventItemsModel eventItems, PublishedDataSetSettingsModel? settings,\n            NamespaceFormat namespaceFormat, bool includeTriggering = true)\n        {\n            if (eventItems?.PublishedData != null)\n            {\n                foreach (var publishedData in eventItems.PublishedData)\n                {\n                    var monitoredItem = publishedData?.ToMonitoredItemTemplate(settings,\n                        namespaceFormat, includeTriggering);\n                    if (monitoredItem == null)\n                    {\n                        continue;\n                    }\n                    yield return monitoredItem;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Convert to monitored item\n        /// </summary>\n        /// <param name=\"publishedEvent\"></param>\n        /// <param name=\"settings\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"includeTriggering\"></param>\n        /// <returns></returns>\n        internal static BaseMonitoredItemModel? ToMonitoredItemTemplate(\n            this PublishedDataSetEventModel publishedEvent, PublishedDataSetSettingsModel? settings,\n            NamespaceFormat namespaceFormat, bool includeTriggering = true)\n        {\n            if (publishedEvent == null)\n            {\n                return null;\n            }\n\n            var eventNotifier = publishedEvent.EventNotifier\n                ?? Opc.Ua.ObjectIds.Server.ToString();\n\n            if (publishedEvent.ModelChangeHandling != null)\n            {\n                return new MonitoredAddressSpaceModel\n                {\n                    DataSetFieldId = publishedEvent.Id\n                        ?? eventNotifier,\n                    DataSetFieldName = publishedEvent.PublishedEventName\n                        ?? string.Empty,\n                    FetchDataSetFieldName = publishedEvent.ReadEventNameFromNode\n                        ?? settings?.ResolveDisplayName,\n                    RebrowsePeriod =\n                        publishedEvent.ModelChangeHandling.RebrowseIntervalTimespan,\n                    TriggeredItems = includeTriggering ? null : ToMonitoredItems(\n                        publishedEvent.Triggering, settings, namespaceFormat),\n                    AttributeId = null,\n                    DiscardNew = false,\n                    MonitoringMode = publishedEvent.MonitoringMode,\n                    StartNodeId = eventNotifier,\n                    NamespaceFormat = namespaceFormat,\n                    RootNodeId = Opc.Ua.ObjectIds.RootFolder.ToString()\n                };\n            }\n\n            return new EventMonitoredItemModel\n            {\n                DataSetFieldId = publishedEvent.Id\n                    ?? eventNotifier,\n                DataSetFieldName = publishedEvent.PublishedEventName\n                    ?? string.Empty,\n                EventFilter = new EventFilterModel\n                {\n                    SelectClauses = publishedEvent.SelectedFields?\n                        .Select(s => s.Clone()!)\n                        .Where(s => s != null)\n                        .ToArray(),\n                    WhereClause = publishedEvent.Filter?.Clone(),\n                    TypeDefinitionId = publishedEvent.TypeDefinitionId\n                },\n                DiscardNew = publishedEvent.DiscardNew,\n                QueueSize = publishedEvent.QueueSize,\n                AttributeId = null,\n                MonitoringMode = publishedEvent.MonitoringMode,\n                StartNodeId = eventNotifier,\n                RelativePath = publishedEvent.BrowsePath,\n                NamespaceFormat = namespaceFormat,\n                FetchDataSetFieldName = publishedEvent.ReadEventNameFromNode\n                    ?? settings?.ResolveDisplayName,\n                TriggeredItems = includeTriggering ? null : ToMonitoredItems(\n                    publishedEvent.Triggering, settings, namespaceFormat),\n                ConditionHandling = publishedEvent.ConditionHandling.Clone()\n            };\n        }\n\n        /// <summary>\n        /// Convert published dataset variable to monitored item\n        /// </summary>\n        /// <param name=\"publishedVariable\"></param>\n        /// <param name=\"settings\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"includeTriggering\"></param>\n        /// <returns></returns>\n        internal static DataMonitoredItemModel? ToMonitoredItemTemplate(\n            this PublishedDataSetVariableModel publishedVariable, PublishedDataSetSettingsModel? settings,\n            NamespaceFormat namespaceFormat, bool includeTriggering = true)\n        {\n            if (string.IsNullOrEmpty(publishedVariable.PublishedVariableNodeId))\n            {\n                return null;\n            }\n            return new DataMonitoredItemModel\n            {\n                DataSetFieldId = publishedVariable.Id\n                    ?? publishedVariable.PublishedVariableNodeId,\n                DataSetClassFieldId = publishedVariable.DataSetClassFieldId,\n                DataSetFieldName = publishedVariable.PublishedVariableDisplayName\n                    ?? string.Empty,\n                DataChangeFilter = ToDataChangeFilter(publishedVariable),\n                SamplingUsingCyclicRead = publishedVariable.SamplingUsingCyclicRead,\n                CyclicReadMaxAge = publishedVariable.CyclicReadMaxAge,\n                SkipFirst = publishedVariable.SkipFirst,\n                DiscardNew = publishedVariable.DiscardNew,\n                RegisterRead = publishedVariable.RegisterNodeForSampling,\n                StartNodeId = publishedVariable.PublishedVariableNodeId,\n                QueueSize = publishedVariable.ServerQueueSize,\n                RelativePath = publishedVariable.BrowsePath,\n                AttributeId = publishedVariable.Attribute,\n                IndexRange = publishedVariable.IndexRange,\n                MonitoringMode = publishedVariable.MonitoringMode,\n                FetchDataSetFieldName = publishedVariable.ReadDisplayNameFromNode\n                    ?? settings?.ResolveDisplayName,\n                SamplingInterval = publishedVariable.SamplingIntervalHint\n                    ?? settings?.DefaultSamplingInterval,\n                HeartbeatInterval = publishedVariable.HeartbeatInterval\n                    ?? settings?.DefaultHeartbeatInterval,\n                HeartbeatBehavior = publishedVariable.HeartbeatBehavior\n                    ?? settings?.DefaultHeartbeatBehavior,\n                AggregateFilter = null,\n                AutoSetQueueSize = null,\n                NamespaceFormat = namespaceFormat,\n                TriggeredItems = includeTriggering ? null : ToMonitoredItems(\n                    publishedVariable.Triggering, settings, namespaceFormat)\n            };\n        }\n\n        /// <summary>\n        /// Convert triggering to monitored items\n        /// </summary>\n        /// <param name=\"triggering\"></param>\n        /// <param name=\"settings\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        private static List<BaseMonitoredItemModel>? ToMonitoredItems(\n            this PublishedDataSetTriggerModel? triggering, PublishedDataSetSettingsModel? settings,\n            NamespaceFormat namespaceFormat)\n        {\n            if (triggering?.PublishedVariables == null && triggering?.PublishedEvents == null)\n            {\n                return null;\n            }\n            var monitoredItems = Enumerable.Empty<BaseMonitoredItemModel>();\n            if (triggering.PublishedVariables?.PublishedData != null)\n            {\n                monitoredItems = monitoredItems\n                    .Concat(triggering.PublishedVariables\n                        .ToMonitoredItems(settings, namespaceFormat, false));\n            }\n            if (triggering.PublishedEvents?.PublishedData != null)\n            {\n                monitoredItems = monitoredItems\n                    .Concat(triggering.PublishedEvents\n                        .ToMonitoredItems(settings, namespaceFormat, false));\n            }\n            return monitoredItems.ToList();\n        }\n\n        /// <summary>\n        /// Convert to data change filter\n        /// </summary>\n        /// <param name=\"publishedVariable\"></param>\n        /// <returns></returns>\n        private static DataChangeFilterModel? ToDataChangeFilter(\n            this PublishedDataSetVariableModel publishedVariable)\n        {\n            if (publishedVariable.DataChangeTrigger == null &&\n                publishedVariable.DeadbandType == null &&\n                publishedVariable.DeadbandValue == null)\n            {\n                return null;\n            }\n            return new DataChangeFilterModel\n            {\n                DataChangeTrigger = publishedVariable.DataChangeTrigger,\n                DeadbandType = publishedVariable.DeadbandType,\n                DeadbandValue = publishedVariable.DeadbandValue\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Extensions/RequestHeaderModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n\n    /// <summary>\n    /// Helpers for request header\n    /// </summary>\n    public static class RequestHeaderModelEx\n    {\n        /// <summary>\n        /// Get namespace format for the response\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public static NamespaceFormat GetNamespaceFormat(this RequestHeaderModel? header,\n            IOptions<PublisherOptions>? options = null)\n        {\n            return header?.NamespaceFormat ?? options?.Value.DefaultNamespaceFormat\n                ?? NamespaceFormat.Uri;\n        }\n\n        /// <summary>\n        /// Convert to string based on request header\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public static string AsString(this RequestHeaderModel? header, NodeId nodeId,\n            IServiceMessageContext context, IOptions<PublisherOptions>? options = null)\n        {\n            return nodeId.AsString(context, header.GetNamespaceFormat(options)) ?? string.Empty;\n        }\n\n        /// <summary>\n        /// Convert to string based on request header\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public static string AsString(this RequestHeaderModel? header, ExpandedNodeId nodeId,\n            IServiceMessageContext context, IOptions<PublisherOptions>? options = null)\n        {\n            return nodeId.AsString(context, header.GetNamespaceFormat(options)) ?? string.Empty;\n        }\n\n        /// <summary>\n        /// Convert to string based on request header\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"qualifiedName\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public static string AsString(this RequestHeaderModel? header, QualifiedName qualifiedName,\n            IServiceMessageContext context, IOptions<PublisherOptions>? options = null)\n        {\n            return qualifiedName.AsString(context, header.GetNamespaceFormat(options)) ?? string.Empty;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IApiKeyProvider.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    /// <summary>\n    /// Provide api key\n    /// </summary>\n    public interface IApiKeyProvider\n    {\n        /// <summary>\n        /// Api key\n        /// </summary>\n        string? ApiKey { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IAssetConfiguration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Asset configuration services. Manages assets in the configuration\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IAssetConfiguration<T>\n    {\n        /// <summary>\n        /// Create an asset from the entry and the configuration provided in the Web of\n        /// Things Asset configuration file. The entry in the request object must contain\n        /// a data set name which will be used as the asset name. The writer id can stay\n        /// empty and will be the asset id on successful return. The server must support the\n        /// WoT profile as per <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\"/>.\n        /// The asset will be created and the configuration updated to reference it. A wait\n        /// time can be provided in the request to have the server settle after uploading\n        /// the configuration.\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAssetAsync(\n            PublishedNodeCreateAssetRequestModel<T> request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get a list of entries representing the assets in the server. This will not touch\n        /// the configuration, it will obtain the list from the server. If the server does not\n        /// support <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\"/> the\n        /// result will be empty.\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> GetAllAssetsAsync(\n            PublishedNodesEntryModel entry, RequestHeaderModel? header = null,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete the asset referenced by the entry. The entry in the request must contain\n        /// the asset id to delete. The asset id is the data set writer id.\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServiceResultModel> DeleteAssetAsync(PublishedNodeDeleteAssetRequestModel request,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IClientDiagnostics.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Control plane to reset client connections and retrieve\n    /// diagnostics.\n    /// </summary>\n    public interface IClientDiagnostics\n    {\n        /// <summary>\n        /// Get all active connections\n        /// </summary>\n        IReadOnlyList<ConnectionModel> ActiveConnections { get; }\n\n        /// <summary>\n        /// Get diagnostic information of all channels.\n        /// </summary>\n        /// <returns></returns>\n        IReadOnlyList<ChannelDiagnosticModel> ChannelDiagnostics { get; }\n\n        /// <summary>\n        /// Reset all connections that are currently running\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task ResetAllConnectionsAsync(CancellationToken ct = default);\n\n        /// <summary>\n        /// Watch diagnostic information of all connections.\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<ChannelDiagnosticModel> WatchChannelDiagnosticsAsync(\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get connection diagnostics\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<ConnectionDiagnosticsModel> GetConnectionDiagnosticsAsync(\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IConfigurationServices.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    /// <summary>\n    /// Configuration services using node services to explore and expand\n    /// requests based on the server address space.\n    /// </summary>\n    public interface IConfigurationServices\n    {\n        /// <summary>\n        /// Expand the provided entry into configuration entries and return them one\n        /// by one with the error items last. The configuration is not updated but\n        /// the resulting entries without error info can be added in a later call to\n        /// the publisher configuration api.\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> ExpandAsync(\n            PublishedNodesEntryModel entry, PublishedNodeExpansionModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Create one or more writer entries by expanding the provided entry into the\n        /// configuration. The expanded items are added to the configuration.\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAsync(\n            PublishedNodesEntryModel entry, PublishedNodeExpansionModel request,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IDiagnosticCollector.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Publisher collector collects metrics from for writer groups\n    /// inside the publisher during runtime.\n    /// </summary>\n    public interface IDiagnosticCollector\n    {\n        /// <summary>\n        /// Remove writer group from collector\n        /// </summary>\n        /// <param name=\"writerGroupId\">String with the id of the\n        /// writer group or null for the default writer group</param>\n        /// <returns></returns>\n        bool RemoveWriterGroup(string writerGroupId);\n\n        /// <summary>\n        /// Reset collector diagnostic info\n        /// </summary>\n        /// <param name=\"writerGroupId\">String with the id of the\n        /// writer group or null for the default writer group</param>\n        void ResetWriterGroup(string writerGroupId);\n\n        /// <summary>\n        /// Try get copy of diagnostics from collector.\n        /// </summary>\n        /// <param name=\"writerGroupId\">String with the id of the\n        /// writer group or null for the default writer group</param>\n        /// <param name=\"diagnostic\"></param>\n        /// <returns></returns>\n        bool TryGetDiagnosticsForWriterGroup(string writerGroupId,\n            [NotNullWhen(true)] out WriterGroupDiagnosticModel? diagnostic);\n\n        /// <summary>\n        /// Enumerate diagnostics\n        /// </summary>\n        /// <returns></returns>\n        IEnumerable<(string, WriterGroupDiagnosticModel)> EnumerateDiagnostics();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IDiscoveryProgress.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using System;\n    using System.Net;\n\n    /// <summary>\n    /// Discovery progress listener\n    /// </summary>\n    public interface IDiscoveryProgress\n    {\n        /// <summary>\n        /// Pending requests ahead of this one.\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"pending\"></param>\n        void OnDiscoveryPending(DiscoveryRequestModel request,\n            int pending);\n\n        /// <summary>\n        /// Discovery started\n        /// </summary>\n        /// <param name=\"request\"></param>\n        void OnDiscoveryStarted(DiscoveryRequestModel request);\n\n        /// <summary>\n        /// Network scanning completed\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        void OnNetScanFinished(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered);\n\n        /// <summary>\n        /// Network scanning progress\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        void OnNetScanProgress(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered);\n\n        /// <summary>\n        /// Network scanning result\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        /// <param name=\"address\"></param>\n        void OnNetScanResult(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered,\n            IPAddress address);\n\n        /// <summary>\n        /// Network scanning started\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        void OnNetScanStarted(DiscoveryRequestModel request,\n            int workers, int progress, int total);\n\n        /// <summary>\n        /// Port scanning completed\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        void OnPortScanFinished(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered);\n\n        /// <summary>\n        /// Port scanning progress\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        void OnPortScanProgress(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered);\n\n        /// <summary>\n        /// Port scan result\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        /// <param name=\"ep\"></param>\n        void OnPortScanResult(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered, IPEndPoint ep);\n\n        /// <summary>\n        /// Port scan started\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        void OnPortScanStart(DiscoveryRequestModel request,\n            int workers, int progress, int total);\n\n        /// <summary>\n        /// Server discovery started\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        void OnServerDiscoveryStarted(DiscoveryRequestModel request,\n            int workers, int progress, int total);\n\n        /// <summary>\n        /// Finding endpoints started\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        /// <param name=\"url\"></param>\n        /// <param name=\"address\"></param>\n        void OnFindEndpointsStarted(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered,\n            Uri url, IPAddress address);\n\n        /// <summary>\n        /// Finding endpoints completed\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        /// <param name=\"url\"></param>\n        /// <param name=\"address\"></param>\n        /// <param name=\"endpoints\"></param>\n        void OnFindEndpointsFinished(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered,\n            Uri url, IPAddress address, int endpoints);\n\n        /// <summary>\n        /// Server discovery complete\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"workers\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"total\"></param>\n        /// <param name=\"discovered\"></param>\n        void OnServerDiscoveryFinished(DiscoveryRequestModel request,\n            int workers, int progress, int total, int discovered);\n\n        /// <summary>\n        /// Discovery cancelled\n        /// </summary>\n        /// <param name=\"request\"></param>\n        void OnDiscoveryCancelled(DiscoveryRequestModel request);\n\n        /// <summary>\n        /// Discovery finished successfully\n        /// </summary>\n        /// <param name=\"request\"></param>\n        void OnDiscoveryFinished(DiscoveryRequestModel request);\n\n        /// <summary>\n        /// Discovery finished with error\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ex\"></param>\n        void OnDiscoveryError(DiscoveryRequestModel request,\n            Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IDiscoveryServices.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Discovery service interface\n    /// </summary>\n    public interface IDiscoveryServices\n    {\n        /// <summary>\n        /// Discover and return results of discovery run\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<IEnumerable<DiscoveredEndpointModel>> FindServersAsync(\n            DiscoveryRequestModel request, IDiscoveryProgress? progress = null,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Try get unique set of endpoints from all servers found on discovery\n        /// server endpoint url, filtered by optional prioritized locale list.\n        /// </summary>\n        /// <param name=\"discoveryUrl\"></param>\n        /// <param name=\"locales\"></param>\n        /// <param name=\"findServersOnNetwork\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<IEnumerable<DiscoveredEndpointModel>> FindEndpointsAsync(\n            Uri discoveryUrl, IReadOnlyList<string>? locales = null,\n            bool findServersOnNetwork = true, CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IMessageEncoder.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Furly.Extensions.Messaging;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Encoder to encode data set writer messages\n    /// </summary>\n    public interface IMessageEncoder\n    {\n        /// <summary>\n        /// Encodes the list of notifications into network messages to send\n        /// </summary>\n        /// <param name=\"factory\">Factory to create empty messages</param>\n        /// <param name=\"notifications\">Notifications to encode</param>\n        /// <param name=\"maxMessageSize\">Maximum size of messages</param>\n        /// <param name=\"asBatch\">Encode in batch mode</param>\n        IEnumerable<(IEvent Event, Action OnSent)> Encode(Func<IEvent> factory,\n            IEnumerable<OpcUaSubscriptionNotification> notifications,\n            int maxMessageSize, bool asBatch);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IMessageSink.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n\n    /// <summary>\n    /// Message sink for a writer group\n    /// </summary>\n    public interface IMessageSink\n    {\n        /// <summary>\n        /// Subscribe to writer messages\n        /// </summary>\n        /// <param name=\"notification\"></param>\n        void OnMessage(OpcUaSubscriptionNotification notification);\n\n        /// <summary>\n        /// Called when ValueChangesCount or DataChangesCount are resetted\n        /// </summary>\n        void OnCounterReset();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/INodeServicesInternal.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Opc.Ua;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Internal node services interface\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface INodeServicesInternal<T>\n    {\n        /// <summary>\n        /// Read node history\n        /// </summary>\n        /// <typeparam name=\"TInput\"></typeparam>\n        /// <typeparam name=\"TOutput\"></typeparam>\n        /// <param name=\"connectionId\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"decode\"></param>\n        /// <param name=\"encode\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<TOutput>> HistoryReadAsync<TInput, TOutput>(\n            T connectionId, HistoryReadRequestModel<TInput> request,\n            Func<TInput, IOpcUaSession, ExtensionObject> decode,\n            Func<ExtensionObject, IOpcUaSession, TOutput> encode,\n            CancellationToken ct = default)\n            where TInput : class where TOutput : class;\n\n        /// <summary>\n        /// Read node history continuation\n        /// </summary>\n        /// <typeparam name=\"TOutput\"></typeparam>\n        /// <param name=\"connectionId\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"encode\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadNextResponseModel<TOutput>> HistoryReadNextAsync<TOutput>(\n            T connectionId, HistoryReadNextRequestModel request,\n            Func<ExtensionObject, IOpcUaSession, TOutput> encode,\n            CancellationToken ct = default)\n            where TOutput : class;\n\n        /// <summary>\n        /// Update node history\n        /// </summary>\n        /// <typeparam name=\"TInput\"></typeparam>\n        /// <param name=\"connectionId\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"decode\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryUpdateAsync<TInput>(\n            T connectionId, HistoryUpdateRequestModel<TInput> request,\n            Func<NodeId, TInput, IOpcUaSession, Task<ExtensionObject>> decode,\n            CancellationToken ct = default) where TInput : class;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IProcessControl.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    /// <summary>\n    /// Process control provider\n    /// </summary>\n    public interface IProcessControl\n    {\n        /// <summary>\n        /// Shutdown publisher\n        /// </summary>\n        /// <param name=\"failFast\"></param>\n        /// <returns>false if shutdown failed</returns>\n        bool Shutdown(bool failFast);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IPublishedNodesServices.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Enables remote configuration of the publisher\n    /// </summary>\n    public interface IPublishedNodesServices : IPublishServices<ConnectionModel>\n    {\n        /// <summary>\n        /// Create a published nodes entry for a specific writer group\n        /// and dataset writer. The entry must specify a unique writer\n        /// group and dataset writer id. If the entry is found it is\n        /// replaced, if it is not found, it is created. If more than\n        /// one entry is found an error is returned. The entry can\n        /// include nodes which will be the initial set. The entries\n        /// must all specify a unique dataSetFieldId.\n        /// </summary>\n        /// <param name=\"entry\">The entry to create for the writer</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task CreateOrUpdateDataSetWriterEntryAsync(\n            PublishedNodesEntryModel entry, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get the published nodes entry for a specific writer group\n        /// and dataset writer. Dedicated errors are returned if no,\n        /// or no unique entry could be found. THe entry does not\n        /// contain the nodes\n        /// </summary>\n        /// <param name=\"writerGroupId\">The writer group</param>\n        /// <param name=\"dataSetWriterId\">The data set writer</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishedNodesEntryModel> GetDataSetWriterEntryAsync(\n            string writerGroupId, string dataSetWriterId,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Add Nodes to a dedicated data set writer in a writer group.\n        /// Each node must have a unique DataSetFieldId. If the field\n        /// already exists, the node is updated. If a node does not\n        /// have a dataset field id an error is returned.\n        /// </summary>\n        /// <param name=\"writerGroupId\">The writer group</param>\n        /// <param name=\"dataSetWriterId\">The data set writer</param>\n        /// <param name=\"nodes\">Nodes to add or update</param>\n        /// <param name=\"insertAfterFieldId\">Field after which to\n        /// insert the nodes. If not specified, nodes are added at the\n        /// end of the entry</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task AddOrUpdateNodesAsync(string writerGroupId, string dataSetWriterId,\n            IReadOnlyList<OpcNodeModel> nodes, string? insertAfterFieldId = null,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Remove Nodes with the data set field ids from a data set\n        /// writer in a writer group. If the field is not found, no\n        /// error is returned.\n        /// </summary>\n        /// <param name=\"writerGroupId\">The writer group</param>\n        /// <param name=\"dataSetWriterId\">The data set writer</param>\n        /// <param name=\"dataSetFieldIds\">Fields to add</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task RemoveNodesAsync(string writerGroupId, string dataSetWriterId,\n            IReadOnlyList<string> dataSetFieldIds, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get Nodes from a data set writer in a writer group.\n        /// </summary>\n        /// <param name=\"writerGroupId\">The writer group</param>\n        /// <param name=\"dataSetWriterId\">The data set writer</param>\n        /// <param name=\"dataSetFieldId\">the field id after which to start.\n        /// If not specified, nodes from the beginning are returned.</param>\n        /// <param name=\"count\">Number of nodes to return</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<IReadOnlyList<OpcNodeModel>> GetNodesAsync(string writerGroupId,\n            string dataSetWriterId, string? dataSetFieldId = null,\n            int? count = null, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get a node from a data set writer in a writer group.\n        /// </summary>\n        /// <param name=\"writerGroupId\">The writer group</param>\n        /// <param name=\"dataSetWriterId\">The data set writer</param>\n        /// <param name=\"dataSetFieldId\">the field id after which to start.\n        /// If not specified, nodes from the beginning are returned.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<OpcNodeModel> GetNodeAsync(string writerGroupId,\n            string dataSetWriterId, string dataSetFieldId,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Remove the published nodes entry for a specific data set\n        /// writer in a writer group. Dedicated errors are returned if no,\n        /// or no unique entry could be found.\n        /// </summary>\n        /// <param name=\"writerGroupId\">The writer group</param>\n        /// <param name=\"dataSetWriterId\">The data set writer</param>\n        /// <param name=\"force\">Force delete all writers even if more than\n        /// one were found. Does not error when none were found.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task RemoveDataSetWriterEntryAsync(string writerGroupId,\n            string dataSetWriterId, bool force = false,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Add nodes to be published to the configuration\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        Task PublishNodesAsync(PublishedNodesEntryModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Remove node from the actual configuration\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        Task UnpublishNodesAsync(PublishedNodesEntryModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Resets the configuration for an endpoint\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        Task UnpublishAllNodesAsync(PublishedNodesEntryModel? request = null,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Replace all configured endpoints with the new set.\n        /// Using an empty list will remove all entries.\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        Task SetConfiguredEndpointsAsync(IReadOnlyList<PublishedNodesEntryModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Update nodes of endpoints in the published nodes configuration.\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        Task AddOrUpdateEndpointsAsync(IReadOnlyList<PublishedNodesEntryModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// returns the endpoints currently part of the configuration\n        /// </summary>\n        /// <param name=\"includeNodes\"></param>\n        /// <param name=\"ct\"></param>\n        Task<List<PublishedNodesEntryModel>> GetConfiguredEndpointsAsync(\n            bool includeNodes = false, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get the configuration nodes for an endpoint\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        Task<List<OpcNodeModel>> GetConfiguredNodesOnEndpointAsync(\n            PublishedNodesEntryModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Gets the diagnostic information for a specific endpoint\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        Task<List<PublishDiagnosticInfoModel>> GetDiagnosticInfoAsync(\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IPublisher.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Collections.Immutable;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Publisher\n    /// </summary>\n    public interface IPublisher\n    {\n        /// <summary>\n        /// Current version number of the configuration\n        /// </summary>\n        uint Version { get; }\n\n        /// <summary>\n        /// Last change time\n        /// </summary>\n        DateTimeOffset LastChange { get; }\n\n        /// <summary>\n        /// Gets a snapshot of the list of writer groups in publisher.\n        /// </summary>\n        ImmutableList<WriterGroupModel> WriterGroups { get; }\n\n        /// <summary>\n        /// Try update configuration\n        /// </summary>\n        /// <param name=\"writerGroups\"></param>\n        /// <returns></returns>\n        bool TryUpdate(IEnumerable<WriterGroupModel> writerGroups);\n\n        /// <summary>\n        /// Update configuration\n        /// </summary>\n        /// <param name=\"writerGroups\"></param>\n        /// <returns></returns>\n        Task UpdateAsync(IEnumerable<WriterGroupModel> writerGroups);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IRuntimeStateReporter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Interface for runtime state reporting.\n    /// </summary>\n    public interface IRuntimeStateReporter\n    {\n        /// <summary>\n        /// Send restart announcement.\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask SendRestartAnnouncementAsync(CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/ISslCertProvider.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using System.Security.Cryptography.X509Certificates;\n\n    /// <summary>\n    /// Ssl certificate provider\n    /// </summary>\n    public interface ISslCertProvider\n    {\n        /// <summary>\n        /// Certificate\n        /// </summary>\n        X509Certificate2? Certificate { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IStorageProvider.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using System;\n    using System.IO;\n\n    /// <summary>\n    /// Interface for utilities provider for published nodes file.\n    /// </summary>\n    public interface IStorageProvider\n    {\n        /// <summary>\n        /// Occurs when published nodes file is changed.\n        /// </summary>\n        event EventHandler<FileSystemEventArgs> Changed;\n\n        /// <summary>\n        /// Get last write time of published nodes file.\n        /// </summary>\n        DateTime GetLastWriteTime();\n\n        /// <summary>\n        /// Read content of published nodes file as string.\n        /// </summary>\n        string ReadContent();\n\n        /// <summary>\n        /// Write new content to published nodes file\n        /// </summary>\n        /// <param name=\"content\"> Content to be written. </param>\n        /// <param name=\"disableRaisingEvents\"> If set FileSystemWatcher\n        /// notifications will be disabled while updating the file.</param>\n        void WriteContent(string content, bool disableRaisingEvents = false);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IWriterGroupControl.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Writer group controller\n    /// </summary>\n    public interface IWriterGroupControl\n    {\n        /// <summary>\n        /// Start group\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask StartAsync(CancellationToken ct);\n\n        /// <summary>\n        /// Update group\n        /// </summary>\n        /// <param name=\"writerGroup\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask UpdateAsync(WriterGroupModel writerGroup,\n            CancellationToken ct);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IWriterGroupDiagnostics.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    /// <summary>\n    /// Writer group diagnostics control\n    /// </summary>\n    public interface IWriterGroupDiagnostics\n    {\n        /// <summary>\n        /// Reset diagnostics for writer group\n        /// </summary>\n        void ResetWriterGroupDiagnostics();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IWriterGroupScope.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using System;\n\n    /// <summary>\n    /// Writer group scope\n    /// </summary>\n    public interface IWriterGroupScope : IDisposable\n    {\n        /// <summary>\n        /// Resolve writer group\n        /// </summary>\n        IWriterGroupControl WriterGroup { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/IWriterGroupScopeFactory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n\n    /// <summary>\n    /// Creates writer group scopes\n    /// </summary>\n    public interface IWriterGroupScopeFactory\n    {\n        /// <summary>\n        /// Create a writer group container containing everything\n        /// needed to resolve the writer group processing engine.\n        /// </summary>\n        /// <param name=\"writerGroup\"></param>\n        /// <returns></returns>\n        IWriterGroupScope Create(WriterGroupModel writerGroup);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Models/AssetDeviceConfiguration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Base data set and event model\n    /// </summary>\n    public abstract record class DataSetEventConfiguration\n    {\n        /// <summary>\n        /// The encoding format to use for messages. Allowed values\n        /// include:\n        /// - Avro: Avro binary encoding\n        /// - Json: Standard JSON encoding\n        /// </summary>\n        [DataMember(Name = \"messageEncoding\", Order = 1,\n            EmitDefaultValue = false)]\n        public MessageEncoding? MessageEncoding { get; set; }\n\n        /// <summary>\n        /// Priority of the writer subscription.\n        /// </summary>\n        [DataMember(Name = \"priority\", Order = 2,\n            EmitDefaultValue = false)]\n        public byte? Priority { get; set; }\n\n        /// <summary>\n        /// The optional dataset class id as it shall appear in dataset\n        /// messages and dataset metadata. Used to uniquely identify the\n        /// type of dataset being published. Default: Guid.Empty\n        /// </summary>\n        [DataMember(Name = \"dataSetClassId\", Order = 3,\n            EmitDefaultValue = false)]\n        public Guid DataSetClassId { get; set; }\n\n        /// <summary>\n        /// Adapt the sampling interval property\n        /// </summary>\n        [DataMember(Name = \"samplingInterval\", Order = 4,\n            EmitDefaultValue = false)]\n        public int? SamplingInterval { get; set; }\n\n        /// <summary>\n        /// Adapt the publishing interval property\n        /// </summary>\n        [DataMember(Name = \"publishingInterval\", Order = 5,\n            EmitDefaultValue = false)]\n        public int? PublishingInterval { get; set; }\n\n        /// <summary>\n        /// Adapt the key frame count property\n        /// </summary>\n        [DataMember(Name = \"keyFrameCount\", Order = 6,\n            EmitDefaultValue = false)]\n        public uint? KeyFrameCount { get; set; }\n\n        /// <summary>\n        /// Defines how many publishing timer expirations to wait\n        /// before sending a keep-alive message when no notifications\n        /// are pending. Works with SendKeepAliveDataSetMessages to\n        /// maintain connection awareness. Keep-alive messages help\n        /// detect connection issues even when no data changes are\n        /// occurring.\n        /// </summary>\n        [DataMember(Name = \"maxKeepAliveCount\", Order = 7,\n            EmitDefaultValue = false)]\n        public uint? MaxKeepAliveCount { get; set; }\n\n        /// <summary>\n        /// Controls whether to send keep alive messages for this\n        /// dataset when a subscription keep alive notification is\n        /// received. Keep alive messages help maintain connection\n        /// status awareness. Only valid if the messaging mode supports\n        /// keep alive messages. Default: false\n        /// </summary>\n        [DataMember(Name = \"sendKeepAliveDataSetMessages\", Order = 8,\n            EmitDefaultValue = false)]\n        public bool? SendKeepAliveDataSetMessages { get; set; }\n\n        /// <summary>\n        /// When sending of keep alive messages is enabled, this\n        /// flag controls whether the keep alive messages are sent\n        /// as key frames. Key frames contain all current values.\n        /// </summary>\n        [DataMember(Name = \"sendKeepAliveAsKeyFrameMessages\", Order = 9,\n            EmitDefaultValue = false)]\n        public bool? SendKeepAliveAsKeyFrameMessages { get; set; }\n\n        /// <summary>\n        /// Defines what action to take when the watchdog timer\n        /// triggers. Available behaviors:\n        /// - Diagnostic: Log the event only\n        /// - Reset: Reset the subscription\n        /// - FailFast: Terminate the connection\n        /// - ExitProcess: Shut down the publisher\n        /// </summary>\n        [DataMember(Name = \"dataSetWriterWatchdogBehavior\", Order = 10,\n            EmitDefaultValue = false)]\n        public SubscriptionWatchdogBehavior? DataSetWriterWatchdogBehavior { get; set; }\n\n        /// <summary>\n        /// Specifies the condition that triggers the watchdog\n        /// behavior. Options:\n        /// - WhenAnyAreLate: Execute when any monitored item is late\n        ///   (default)\n        /// - WhenAllAreLate: Execute only when all items are late\n        /// </summary>\n        [DataMember(Name = \"opcNodeWatchdogCondition\", Order = 11,\n            EmitDefaultValue = false)]\n        public MonitoredItemWatchdogCondition? OpcNodeWatchdogCondition { get; set; }\n\n        /// <summary>\n        /// The timeout duration used to monitor whether monitored\n        /// items in the subscription are continuously reporting fresh\n        /// data. This watchdog mechanism helps detect stale data or\n        /// connectivity issues. When this timeout expires, the\n        /// configured DataSetWriterWatchdogBehavior is triggered based\n        /// on OpcNodeWatchdogCondition. Expressed as a TimeSpan value.\n        /// </summary>\n        [DataMember(Name = \"opcNodeWatchdogTimespan\", Order = 12,\n            EmitDefaultValue = false)]\n        public TimeSpan? OpcNodeWatchdogTimespan { get; set; }\n\n        /// <summary>\n        /// Controls whether to republish missed values after a\n        /// subscription is transferred during reconnect handling. Only\n        /// applies when DisableSubscriptionTransfer is false. Helps\n        /// ensure no data is lost during connection interruptions.\n        /// Default: true\n        /// </summary>\n        [DataMember(Name = \"republishAfterTransfer\", Order = 13,\n            EmitDefaultValue = false)]\n        public bool? RepublishAfterTransfer { get; set; }\n    }\n\n    /// <summary>\n    /// Dataset reource additional configuration model.\n    /// </summary>\n    [DataContract]\n    public sealed record class DataSetConfiguration : DataSetEventConfiguration;\n\n    /// <summary>\n    /// Dataset Data point additional configuration model\n    /// </summary>\n    [DataContract]\n    public sealed record class DataSetDataPointConfiguration : OpcNodeModel\n    {\n        /// <summary>\n        /// Adapt the sampling interval property\n        /// </summary>\n        [DataMember(Name = \"samplingInterval\", Order = 100,\n            EmitDefaultValue = false)]\n        public int? SamplingInterval\n        {\n            get => OpcSamplingInterval;\n            set => OpcSamplingInterval = value;\n        }\n\n        /// <summary>\n        /// Adapt the publishing interval property\n        /// </summary>\n        [DataMember(Name = \"publishingInterval\", Order = 101,\n            EmitDefaultValue = false)]\n        public int? PublishingInterval\n        {\n            get => OpcPublishingInterval;\n            set => OpcPublishingInterval = value;\n        }\n    }\n\n    /// <summary>\n    /// EventGroup reource additional configuration model.\n    /// </summary>\n    [DataContract]\n    public sealed record class EventGroupConfiguration : DataSetEventConfiguration;\n\n    /// <summary>\n    /// Management group reource additional configuration model.\n    /// </summary>\n    [DataContract]\n    public sealed record class ManagementGroupConfiguration\n    {\n        /// <summary>\n        /// The encoding format to use for messages. Allowed values\n        /// include:\n        /// - Avro: Avro binary encoding\n        /// - Json: Standard JSON encoding\n        /// </summary>\n        [DataMember(Name = \"messageEncoding\", Order = 1,\n            EmitDefaultValue = false)]\n        public MessageEncoding? MessageEncoding { get; set; }\n\n        /// <summary>\n        /// Priority of the writer subscription.\n        /// </summary>\n        [DataMember(Name = \"priority\", Order = 2,\n            EmitDefaultValue = false)]\n        public byte? Priority { get; set; }\n\n        /// <summary>\n        /// The optional dataset class id as it shall appear in dataset\n        /// messages and dataset metadata. Used to uniquely identify the\n        /// type of dataset being published. Default: Guid.Empty\n        /// </summary>\n        [DataMember(Name = \"dataSetClassId\", Order = 3,\n            EmitDefaultValue = false)]\n        public Guid DataSetClassId { get; set; }\n    }\n\n    /// <summary>\n    /// Management group action reource additional configuration model.\n    /// </summary>\n    [DataContract]\n    public sealed record class ActionConfiguration\n    {\n        /// <summary>\n        /// Compiled method metadata\n        /// </summary>\n        [DataMember(Name = \"_io\", Order = 0,\n            EmitDefaultValue = false)]\n        public required byte[] CompiledMetadata { get; set; }\n    }\n\n    /// <summary>\n    /// Event reource additional configuration model.\n    /// </summary>\n    [DataContract]\n    public sealed record class EventConfiguration : DataSetEventConfiguration\n    {\n        /// <summary>\n        /// Size of the server-side queue for this monitored item.\n        /// Controls how many values can be buffered during slow\n        /// connections. Values are discarded according to DiscardNew\n        /// when queue is full. Default is 1 unless otherwise\n        /// configured. Larger queues help prevent data loss but use\n        /// more server memory.\n        /// </summary>\n        [DataMember(Name = \"queueSize\", Order = 105,\n            EmitDefaultValue = false)]\n        public uint? QueueSize { get; set; }\n\n        /// <summary>\n        /// Controls queue overflow behavior for monitored items.\n        /// True: Discard newest values when queue is full (LIFO).\n        /// False: Discard oldest values when queue is full (FIFO,\n        /// default). Use True to preserve historical data during\n        /// connection issues. Use False to maintain current value\n        /// accuracy.\n        /// </summary>\n        [DataMember(Name = \"discardNew\", Order = 106,\n            EmitDefaultValue = false)]\n        public bool? DiscardNew { get; set; }\n\n        /// <summary>\n        /// Event Filter to apply. When specified the node is assmed\n        /// to be an event notifier node to subscribe to.\n        /// </summary>\n        [DataMember(Name = \"eventFilter\", Order = 107,\n            EmitDefaultValue = false)]\n        public EventFilterModel? EventFilter { get; set; }\n\n        /// <summary>\n        /// Settings for pending condition handling\n        /// </summary>\n        [DataMember(Name = \"conditionHandling\", Order = 108,\n            EmitDefaultValue = false)]\n        public ConditionHandlingOptionsModel? ConditionHandling { get; set; }\n\n        /// <summary>\n        /// Controls handling of initial value notification. True:\n        /// Suppress first value from monitored item. False: Publish\n        /// initial value (default). Useful when only changes are\n        /// relevant. Server always sends initial value on creation.\n        /// </summary>\n        [DataMember(Name = \"skipFirst\", Order = 109,\n            EmitDefaultValue = false)]\n        public bool? SkipFirst { get; set; }\n    }\n\n    /// <summary>\n    /// Event data point configuration\n    /// </summary>\n    [DataContract]\n    public sealed record class EventDataPointConfiguration : SimpleAttributeOperandModel;\n\n    /// <summary>\n    /// Endpoint additional configuration for devices. Property names are\n    /// the same as in <see cref=\"PublishedNodesEntryModel\"/> but this\n    /// configuration is used when parsing device endpoint configuration\n    /// from a ADR device resource.\n    /// </summary>\n    [DataContract]\n    public sealed record class DeviceEndpointConfiguration\n    {\n        /// <summary>\n        /// The specific security mode to use for the specified endpoint.\n        /// If the security mode is not available with any configured\n        /// security policy connectivity will fail. Default:\n        /// <see cref=\"SecurityMode.NotNone\"/>\n        /// </summary>\n        [DataMember(Name = \"endpointSecurityMode\", Order = 0,\n            EmitDefaultValue = false)]\n        public SecurityMode? EndpointSecurityMode { get; set; }\n\n        /// <summary>\n        /// The security policy URI to use for the endpoint connection.\n        /// Overrides UseSecurity setting and refines\n        /// EndpointSecurityMode choice. Examples include\n        /// \"http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256\".\n        /// If the specified policy is not available with the chosen\n        /// security mode, connectivity will fail. This allows enforcing\n        /// specific security requirements.\n        /// </summary>\n        [DataMember(Name = \"endpointSecurityPolicy\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? EndpointSecurityPolicy { get; set; }\n\n        /// <summary>\n        /// Use reverse connect to connect ot the endpoint\n        /// </summary>\n        [DataMember(Name = \"useReverseConnect\", Order = 2,\n            EmitDefaultValue = false)]\n        public bool? UseReverseConnect { get; set; }\n\n        /// <summary>\n        /// Specifies the authentication mode for connecting to the OPC\n        /// UA server. Supported modes:\n        /// - Anonymous: No authentication (default)\n        /// - UsernamePassword: Username and password authentication\n        /// - Certificate: Certificate-based authentication using X.509\n        ///   certificates\n        /// When using credentials or certificates, encrypted\n        /// communication should be enabled via UseSecurity or\n        /// EndpointSecurityMode to protect secrets. For certificate\n        /// auth, the certificate must be in the User certificate\n        /// store.\n        /// </summary>\n        [DataMember(Name = \"opcAuthenticationMode\", Order = 4)]\n        public OpcAuthenticationMode OpcAuthenticationMode { get; set; }\n\n        /// <summary>\n        /// The plaintext username for UsernamePassword authentication,\n        /// or the subject name of the certificate for Certificate\n        /// authentication. When using Certificate mode, this refers to\n        /// a certificate in the User certificate store of the PKI\n        /// configuration.\n        /// </summary>\n        [DataMember(Name = \"opcAuthenticationUsername\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? OpcAuthenticationUsername { get; set; }\n\n        /// <summary>\n        /// The plaintext password for UsernamePassword authentication,\n        /// or the password protecting the private key for Certificate\n        /// authentication. For Certificate mode, this must match the\n        /// password used when adding the certificate to the PKI store.\n        /// </summary>\n        [DataMember(Name = \"opcAuthenticationPassword\", Order = 6,\n            EmitDefaultValue = false)]\n        public string? OpcAuthenticationPassword { get; set; }\n\n        /// <summary>\n        /// Enables detailed server diagnostics logging for the\n        /// connection. When enabled, provides additional diagnostic\n        /// information useful for troubleshooting connectivity,\n        /// authentication, and subscription issues. The diagnostics\n        /// data is included in the publisher's logs. Default: false\n        /// </summary>\n        [DataMember(Name = \"dumpConnectionDiagnostics\", Order = 10,\n            EmitDefaultValue = false)]\n        public bool? DumpConnectionDiagnostics { get; set; }\n\n        /// <summary>\n        /// Controls whether subscription transfer is disabled during\n        /// reconnect. When false (default), attempts to transfer\n        /// subscriptions on reconnect to maintain data continuity. Set\n        /// to true to fix interoperability issues with servers that\n        /// don't support subscription transfer. Can be configured\n        /// globally via command line options.\n        /// </summary>\n        [DataMember(Name = \"disableSubscriptionTransfer\", Order = 11,\n            EmitDefaultValue = false)]\n        public bool? DisableSubscriptionTransfer { get; set; }\n\n        /// <summary>\n        /// Runs asset discovery on the endpoint\n        /// </summary>\n        [DataMember(Name = \"runAssetDiscovery\", Order = 13,\n            EmitDefaultValue = false)]\n        public bool? RunAssetDiscovery { get; set; }\n\n        /// <summary>\n        /// Finds assets for the selected types.\n        /// </summary>\n        [DataMember(Name = \"assetTypes\", Order = 14,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? AssetTypes { get; set; }\n\n        /// <summary>\n        /// Source of this endpoint configuration\n        /// </summary>\n        [DataMember(Name = \"source\", Order = 15,\n            EmitDefaultValue = false)]\n        public string? Source { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Models/DataSetWriterContext.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Messaging;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Context to add to notification to convey data required for\n    /// data set messages emitted by writer in a writer group.\n    /// </summary>\n    public record class DataSetWriterContext\n    {\n        /// <summary>\n        /// The allocated identifier of the writer\n        /// </summary>\n        public required ushort DataSetWriterId { get; init; }\n\n        /// <summary>\n        /// Topic for the message\n        /// </summary>\n        public required string Topic { get; init; }\n\n        /// <summary>\n        /// Requested qos\n        /// </summary>\n        public required QoS? Qos { get; init; }\n\n        /// <summary>\n        /// Requested Retain\n        /// </summary>\n        public bool? Retain { get; init; }\n\n        /// <summary>\n        /// Requested Time to live\n        /// </summary>\n        public TimeSpan? Ttl { get; init; }\n\n        /// <summary>\n        /// Publisher id\n        /// </summary>\n        public required string PublisherId { get; init; }\n\n        /// <summary>\n        /// Dataset writer model reference\n        /// </summary>\n        public required DataSetWriterModel Writer { get; init; }\n\n        /// <summary>\n        /// Dataset writer name unique in the context of the group\n        /// </summary>\n        public required string WriterName { get; init; }\n\n        /// <summary>\n        /// Metadata for the dataset\n        /// </summary>\n        public required PublishedDataSetMessageSchemaModel? MetaData { get; init; }\n\n        /// <summary>\n        /// Extension fields\n        /// </summary>\n        public required IReadOnlyList<(string, Opc.Ua.DataValue?)> ExtensionFields { get; init; }\n\n        /// <summary>\n        /// Sequence number inside the writer\n        /// </summary>\n        public required Func<uint> NextWriterSequenceNumber { get; init; }\n\n        /// <summary>\n        /// Writer group model reference\n        /// </summary>\n        public required WriterGroupModel WriterGroup { get; init; }\n\n        /// <summary>\n        /// The applicable network message schema\n        /// </summary>\n        public required IEventSchema? Schema { get; init; }\n\n        /// <summary>\n        /// The cloud event header\n        /// </summary>\n        public required CloudEventHeader? CloudEvent { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Models/DiscoveryRequest.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Discovery;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models;\n    using Furly.Extensions.Utils;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Net;\n    using System.Net.Sockets;\n    using System.Threading;\n\n    /// <summary>\n    /// Discovery request wrapper\n    /// </summary>\n    internal sealed class DiscoveryRequest : IDisposable\n    {\n        /// <summary>\n        /// Cancellation token to cancel request\n        /// </summary>\n        public CancellationToken Token => _cts.Token;\n\n        /// <summary>\n        /// Request is a scan request\n        /// </summary>\n        public bool IsScan { get; }\n\n        /// <summary>\n        /// Progress reporter\n        /// </summary>\n        public IDiscoveryProgress Progress { get; }\n\n        /// <summary>\n        /// Original discovery request model\n        /// </summary>\n        public DiscoveryRequestModel Request { get; }\n\n        /// <summary>\n        /// Network class\n        /// </summary>\n        public NetworkClass NetworkClass { get; }\n\n        /// <summary>\n        /// Address ranges to use or null to use from network info\n        /// </summary>\n        public IEnumerable<AddressRange>? AddressRanges { get; }\n\n        /// <summary>\n        /// Total addresses to be scanned\n        /// </summary>\n        public int TotalAddresses { get; }\n\n        /// <summary>\n        /// Port ranges to use if not from discovery mode\n        /// </summary>\n        public IEnumerable<PortRange>? PortRanges { get; }\n\n        /// <summary>\n        /// Total ports to be scanned\n        /// </summary>\n        public int TotalPorts { get; }\n\n        /// <summary>\n        /// Discovery mode\n        /// </summary>\n        public DiscoveryMode Mode =>\n            Request.Discovery ?? DiscoveryMode.Off;\n\n        /// <summary>\n        /// Discovery configuration\n        /// </summary>\n        public DiscoveryConfigModel Configuration =>\n            Request.Configuration ?? new DiscoveryConfigModel();\n\n        /// <summary>\n        /// Discovery urls\n        /// </summary>\n        public IEnumerable<Uri> DiscoveryUrls =>\n            Configuration.DiscoveryUrls?.Select(s => new Uri(s)) ??\n                [];\n\n        /// <summary>\n        /// Create request wrapper\n        /// </summary>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public DiscoveryRequest(IDiscoveryProgress progress, TimeProvider timeProvider) :\n            this(null, null, progress, timeProvider)\n        {\n        }\n\n        /// <summary>\n        /// Create request wrapper\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public DiscoveryRequest(DiscoveryMode? mode, DiscoveryConfigModel? configuration,\n            IDiscoveryProgress progress, TimeProvider timeProvider) :\n            this(new DiscoveryRequestModel\n            {\n                Id = string.Empty,\n                Configuration = configuration.Clone(),\n                Context = null,\n                Discovery = mode\n            }, progress, timeProvider, NetworkClass.Wired, true)\n        {\n        }\n\n        /// <summary>\n        /// Create request wrapper\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"progress\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"networkClass\"></param>\n        /// <param name=\"isScan\"></param>\n        /// <param name=\"cancellationToken\"></param>\n        public DiscoveryRequest(DiscoveryRequestModel request, IDiscoveryProgress progress,\n            TimeProvider timeProvider, NetworkClass networkClass = NetworkClass.Wired,\n            bool isScan = false, CancellationToken cancellationToken = default)\n        {\n            _timeProvider = timeProvider;\n            Progress = progress;\n            Request = request?.Clone(_timeProvider) ?? throw new ArgumentNullException(nameof(request));\n\n            _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);\n            NetworkClass = networkClass;\n            IsScan = isScan;\n\n            if (Request.Configuration == null)\n            {\n                Request.Configuration = new DiscoveryConfigModel();\n            }\n\n            if (Request.Discovery == null ||\n                Request.Discovery == DiscoveryMode.Off)\n            {\n                // Report empty configuration if off, but keep the\n                // discovery urls details from the original request\n                Request.Configuration = new DiscoveryConfigModel()\n                {\n                    DiscoveryUrls = Request.Configuration.DiscoveryUrls?.ToList(),\n                    Locales = Request.Configuration.Locales?.ToList()\n                };\n                Request.Discovery = DiscoveryMode.Off;\n                return;\n            }\n\n            // Parse whatever provided\n\n            if (!string.IsNullOrEmpty(Request.Configuration.PortRangesToScan) &&\n                PortRange.TryParse(Request.Configuration.PortRangesToScan,\n                    out var ports))\n            {\n                PortRanges = ports;\n                Request.Discovery = DiscoveryMode.Fast;\n            }\n\n            if (!string.IsNullOrEmpty(Request.Configuration.AddressRangesToScan) &&\n                AddressRange.TryParse(Request.Configuration.AddressRangesToScan,\n                    out var addresses))\n            {\n                AddressRanges = addresses;\n                Request.Discovery = DiscoveryMode.Fast;\n            }\n\n            // Set default ranges\n\n            if (AddressRanges == null)\n            {\n                IEnumerable<NetInterface> interfaces;\n                switch (Request.Discovery)\n                {\n                    case DiscoveryMode.Local:\n                        interfaces = NetworkInformationEx.GetAllNetInterfaces(NetworkClass);\n                        AddressRanges = AddLocalHost(interfaces\n                            .Select(t => new AddressRange(t, true)))\n                            .Distinct();\n                        break;\n                    case DiscoveryMode.Fast:\n                        interfaces = NetworkInformationEx.GetAllNetInterfaces(NetworkClass.Wired);\n                        AddressRanges = AddLocalHost(interfaces\n                            .Select(t => new AddressRange(t, false, 24))\n                            .Concat(interfaces\n                                .Where(t => t.Gateway?.Equals(IPAddress.Any) == false &&\n                                            !t.Gateway.Equals(IPAddress.None))\n                                .Select(i => new AddressRange(i.Gateway!, 32)))\n                            .Distinct());\n                        break;\n                    case DiscoveryMode.Network:\n                    case DiscoveryMode.Scan:\n                        interfaces = NetworkInformationEx.GetAllNetInterfaces(NetworkClass);\n                        AddressRanges = AddLocalHost(interfaces\n                            .Select(t => new AddressRange(t, false))\n                            .Concat(interfaces\n                                .Where(t => t.Gateway?.Equals(IPAddress.Any) == false &&\n                                            !t.Gateway.Equals(IPAddress.None))\n                                .Select(i => new AddressRange(i.Gateway!, 32)))\n                            .Distinct());\n                        break;\n                    default:\n                        AddressRanges = [];\n                        break;\n                }\n            }\n\n            if (PortRanges == null)\n            {\n                switch (Request.Discovery)\n                {\n                    case DiscoveryMode.Local:\n                        PortRanges = PortRange.All;\n                        break;\n                    case DiscoveryMode.Fast:\n                        PortRanges = PortRange.WellKnown;\n                        break;\n                    case DiscoveryMode.Scan:\n                        PortRanges = PortRange.Unassigned;\n                        break;\n                    case DiscoveryMode.Network:\n                        PortRanges = PortRange.OpcUa;\n                        break;\n                    default:\n                        PortRanges = [];\n                        break;\n                }\n            }\n\n            // Update reported configuration with used settings\n\n            if (AddressRanges?.Any() == true)\n            {\n                Request.Configuration.AddressRangesToScan = AddressRange.Format(AddressRanges);\n                TotalAddresses = AddressRanges?.Sum(r => r.Count) ?? 0;\n            }\n\n            if (PortRanges?.Any() == true)\n            {\n                Request.Configuration.PortRangesToScan = PortRange.Format(PortRanges);\n                TotalPorts = PortRanges?.Sum(r => r.Count) ?? 0;\n            }\n\n            Request.Configuration.IdleTimeBetweenScans ??= kDefaultIdleTime;\n            Request.Configuration.PortProbeTimeout ??= kDefaultPortProbeTimeout;\n            Request.Configuration.NetworkProbeTimeout ??= kDefaultNetworkProbeTimeout;\n        }\n\n        /// <summary>\n        /// Create request wrapper\n        /// </summary>\n        /// <param name=\"request\"></param>\n        private DiscoveryRequest(DiscoveryRequest request) :\n            this(request.Request, request.Progress, request._timeProvider, request.NetworkClass, request.IsScan)\n        {\n        }\n\n        /// <summary>\n        /// Cancel request\n        /// </summary>\n        public void Cancel()\n        {\n            Try.Op(_cts.Cancel);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _cts.Dispose();\n        }\n\n        /// <summary>\n        /// Clone options\n        /// </summary>\n        /// <returns></returns>\n        internal DiscoveryRequest Clone()\n        {\n            return new DiscoveryRequest(this);\n        }\n\n        /// <summary>\n        /// Add hosta address as fake address range\n        /// </summary>\n        /// <param name=\"ranges\"></param>\n        /// <returns></returns>\n        public static IEnumerable<AddressRange> AddLocalHost(IEnumerable<AddressRange> ranges)\n        {\n            if (NetworkDiscovery.IsContainer)\n            {\n                try\n                {\n                    var addresses = Dns.GetHostAddresses(\"host.docker.internal\");\n                    var listedRanges = ranges.ToList();\n                    return listedRanges.Concat(addresses\n                        // Select ip4 addresses only\n                        .Where(a => a.AddressFamily == AddressFamily.InterNetwork)\n                        .Select(a => new IPv4Address(a))\n                        // Check we do not already have them in the existing ranges\n                        .Where(a => !listedRanges\n                            .Any(r => a >= r.Low && a <= r.High))\n                        // Select either the local or a small subnet around it\n                        .Select(a => new AddressRange(a, 32, \"localhost\")));\n                }\n                catch\n                {\n                }\n            }\n            return ranges;\n        }\n\n        /// <summary> Default idle time is 6 hours </summary>\n        private static readonly TimeSpan kDefaultIdleTime = TimeSpan.FromHours(6);\n        /// <summary> Default port probe timeout is 5 seconds </summary>\n        private static readonly TimeSpan kDefaultPortProbeTimeout = TimeSpan.FromSeconds(5);\n        /// <summary> Default icmp timeout is 3 seconds </summary>\n        private static readonly TimeSpan kDefaultNetworkProbeTimeout = TimeSpan.FromSeconds(3);\n\n        private readonly TimeProvider _timeProvider;\n        private readonly CancellationTokenSource _cts;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Models/MessagingProfile.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text;\n\n    /// <summary>\n    /// Messaging profiles supported by OPC Publisher\n    /// </summary>\n    public sealed class MessagingProfile\n    {\n        /// <summary>\n        /// Messaging mode\n        /// </summary>\n        public MessagingMode MessagingMode { get; }\n\n        /// <summary>\n        /// Returns true if messaging profiles supports metadata\n        /// </summary>\n        public bool SupportsMetadata\n        {\n            get\n            {\n                switch (MessagingMode)\n                {\n                    case MessagingMode.FullSamples:\n                    case MessagingMode.Samples:\n                    case MessagingMode.RawDataSets:\n                        return false;\n                    default:\n                        return true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Returns true if messaging profiles supports keyframes\n        /// </summary>\n        public bool SupportsKeyFrames\n        {\n            get\n            {\n                switch (MessagingMode)\n                {\n                    case MessagingMode.FullSamples:\n                    case MessagingMode.Samples:\n                        return false;\n                    default:\n                        return true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Returns true if messaging profiles supports keep alive\n        /// </summary>\n        public bool SupportsKeepAlive\n        {\n            get\n            {\n                switch (MessagingMode)\n                {\n                    case MessagingMode.FullSamples:\n                    case MessagingMode.Samples:\n                        return false;\n                    default:\n                        return true;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Messaging encoding\n        /// </summary>\n        public MessageEncoding MessageEncoding { get; }\n\n        /// <summary>\n        /// Dataset message content mask\n        /// </summary>\n        public DataSetMessageContentFlags DataSetMessageContentMask { get; }\n\n        /// <summary>\n        /// Network message content mask\n        /// </summary>\n        public NetworkMessageContentFlags NetworkMessageContentMask { get; }\n\n        /// <summary>\n        /// Content mask for data set message field\n        /// </summary>\n        public DataSetFieldContentFlags DataSetFieldContentMask { get; }\n\n        /// <summary>\n        /// Get supported options\n        /// </summary>\n        public static IEnumerable<MessagingProfile> Supported => kProfiles.Values;\n\n        /// <summary>\n        /// Get encoding\n        /// </summary>\n        /// <param name=\"messageMode\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <returns></returns>\n        public static MessagingProfile Get(MessagingMode messageMode,\n            MessageEncoding encoding)\n        {\n            var key = (messageMode, GetMessageEncoding(encoding));\n            return kProfiles[key];\n        }\n\n        /// <summary>\n        /// Find profile\n        /// </summary>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"networkMessageContentMask\"></param>\n        /// <param name=\"dataSetMessageContentMask\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        /// <returns></returns>\n        public static MessagingProfile? Find(MessageEncoding? messageType,\n            NetworkMessageContentFlags? networkMessageContentMask,\n            DataSetMessageContentFlags? dataSetMessageContentMask,\n            DataSetFieldContentFlags? dataSetFieldContentMask)\n        {\n            // TODO: Use hash code from custom messaging profile?\n            return kProfiles.Values\n                .FirstOrDefault(p =>\n                    (messageType == null ||\n                        p.MessageEncoding == messageType) &&\n                    (networkMessageContentMask == null ||\n                        p.NetworkMessageContentMask == networkMessageContentMask) &&\n                    (dataSetMessageContentMask == null ||\n                        p.DataSetMessageContentMask == dataSetMessageContentMask) &&\n                    (dataSetFieldContentMask == null ||\n                        p.DataSetFieldContentMask == dataSetFieldContentMask))\n                ;\n        }\n\n        /// <summary>\n        /// Is this configuration supported\n        /// </summary>\n        /// <param name=\"messageMode\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <returns></returns>\n        public static bool IsSupported(MessagingMode messageMode,\n            MessageEncoding encoding)\n        {\n            var key = (messageMode, GetMessageEncoding(encoding));\n            return kProfiles.ContainsKey(key);\n        }\n\n        /// <summary>\n        /// Create message encoding profile\n        /// </summary>\n        /// <param name=\"messagingMode\"></param>\n        /// <param name=\"messageEncoding\"></param>\n        /// <param name=\"dataSetMessageContentMask\"></param>\n        /// <param name=\"networkMessageContentMask\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        private MessagingProfile(MessagingMode messagingMode,\n            MessageEncoding messageEncoding,\n            DataSetMessageContentFlags dataSetMessageContentMask,\n            NetworkMessageContentFlags networkMessageContentMask,\n            DataSetFieldContentFlags dataSetFieldContentMask)\n        {\n            MessagingMode = messagingMode;\n            MessageEncoding = messageEncoding;\n            DataSetMessageContentMask = dataSetMessageContentMask;\n            NetworkMessageContentMask = networkMessageContentMask;\n            DataSetFieldContentMask = dataSetFieldContentMask;\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            return obj is MessagingProfile profile &&\n                DataSetMessageContentMask == profile.DataSetMessageContentMask &&\n                NetworkMessageContentMask == profile.NetworkMessageContentMask &&\n                DataSetFieldContentMask == profile.DataSetFieldContentMask;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return HashCode.Combine(\n                DataSetMessageContentMask,\n                NetworkMessageContentMask,\n                DataSetFieldContentMask);\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            return $\"{MessagingMode}|{MessageEncoding}\";\n        }\n\n        /// <inheritdoc/>\n        public string ToExpandedString()\n        {\n            return new StringBuilder(\"| \")\n                .Append(MessagingMode)\n                .Append(\" | \")\n                .Append(MessageEncoding)\n                .Append(\" | \")\n                .Append(NetworkMessageContentMask)\n                .Append(\"<br>(\")\n                .AppendFormat(CultureInfo.InvariantCulture, \"0x{0:X}\", StackTypesEx.ToStackType(\n                    NetworkMessageContentMask, MessageEncoding))\n                .Append(\") | \")\n                .Append(DataSetMessageContentMask)\n                .Append(\"<br>(\")\n                .AppendFormat(CultureInfo.InvariantCulture, \"0x{0:X}\", StackTypesEx.ToStackType(\n                    DataSetMessageContentMask, DataSetFieldContentMask, MessageEncoding))\n                .Append(\") | \")\n                .Append(DataSetFieldContentMask)\n                .Append(\"<br>(\")\n                .AppendFormat(CultureInfo.InvariantCulture, \"0x{0:X}\", (uint)StackTypesEx.ToStackType(\n                    DataSetFieldContentMask))\n                .Append(\") | \")\n                .Append(SupportsMetadata ? \"X\" : \" \")\n                .Append(\" | \")\n                .Append(SupportsKeyFrames ? \"X\" : \" \")\n                .Append(\" | \")\n                .Append(SupportsKeepAlive ? \"X\" : \" \")\n                .AppendLine(\" |\")\n                .ToString();\n        }\n\n        static MessagingProfile()\n        {\n            //\n            // New message profiles supported in 2.5\n            //\n\n            // Sample mode\n            AddProfile(MessagingMode.Samples, BuildDataSetContentMask(false, false, true),\n                    BuildNetworkMessageContentMask(true),\n                    BuildDataSetFieldContentMask(false, true),\n                    MessageEncoding.Json);\n            AddProfile(MessagingMode.FullSamples, BuildDataSetContentMask(true, false, true),\n                    BuildNetworkMessageContentMask(true),\n                    BuildDataSetFieldContentMask(true, true),\n                    MessageEncoding.Json);\n\n            //\n            // New message profiles supported in 2.6\n            //\n\n            // Pub sub\n            AddProfile(MessagingMode.PubSub, BuildDataSetContentMask(),\n                    BuildNetworkMessageContentMask(),\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Json);\n            AddProfile(MessagingMode.FullNetworkMessages, BuildDataSetContentMask(true),\n                    BuildNetworkMessageContentMask(),\n                    BuildDataSetFieldContentMask(true),\n                    MessageEncoding.Json);\n\n            //\n            // New message profiles supported in 2.9\n            //\n\n            // Pub sub gzipped\n            AddProfile(MessagingMode.PubSub, BuildDataSetContentMask(),\n                    BuildNetworkMessageContentMask(),\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.JsonGzip);\n            AddProfile(MessagingMode.FullNetworkMessages, BuildDataSetContentMask(true),\n                    BuildNetworkMessageContentMask(),\n                    BuildDataSetFieldContentMask(true),\n                    MessageEncoding.JsonGzip);\n\n            // Reversible encodings\n            AddProfile(MessagingMode.PubSub, BuildDataSetContentMask(false, true),\n                    BuildNetworkMessageContentMask(),\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n            AddProfile(MessagingMode.FullNetworkMessages, BuildDataSetContentMask(true, true),\n                    BuildNetworkMessageContentMask(),\n                    BuildDataSetFieldContentMask(true),\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n            AddProfile(MessagingMode.Samples, BuildDataSetContentMask(false, true, true),\n                    BuildNetworkMessageContentMask(true),\n                    BuildDataSetFieldContentMask(false, true),\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n            AddProfile(MessagingMode.FullSamples, BuildDataSetContentMask(true, true, true),\n                    BuildNetworkMessageContentMask(true),\n                    BuildDataSetFieldContentMask(true, true),\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n\n            // Without network message header\n            AddProfile(MessagingMode.DataSetMessages, BuildDataSetContentMask(),\n                    NetworkMessageContentFlags.DataSetMessageHeader,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Json, MessageEncoding.JsonGzip);\n            AddProfile(MessagingMode.DataSetMessages, BuildDataSetContentMask(false, true),\n                    NetworkMessageContentFlags.DataSetMessageHeader,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n            AddProfile(MessagingMode.SingleDataSetMessage, BuildDataSetContentMask(),\n                    NetworkMessageContentFlags.DataSetMessageHeader | NetworkMessageContentFlags.SingleDataSetMessage,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Json, MessageEncoding.JsonGzip);\n            AddProfile(MessagingMode.SingleDataSetMessage, BuildDataSetContentMask(false, true),\n                    NetworkMessageContentFlags.DataSetMessageHeader | NetworkMessageContentFlags.SingleDataSetMessage,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n\n            AddProfile(MessagingMode.DataSets, 0,\n                    0,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Json, MessageEncoding.JsonGzip);\n            AddProfile(MessagingMode.SingleDataSet, 0,\n                    NetworkMessageContentFlags.SingleDataSetMessage,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Json, MessageEncoding.JsonGzip);\n            AddProfile(MessagingMode.DataSets, 0,\n                    0,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n            AddProfile(MessagingMode.SingleDataSet, 0,\n                    NetworkMessageContentFlags.SingleDataSetMessage,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n            AddProfile(MessagingMode.RawDataSets, 0,\n                    0,\n                    DataSetFieldContentFlags.RawData,\n                    MessageEncoding.Json, MessageEncoding.JsonGzip);\n            AddProfile(MessagingMode.SingleRawDataSet, 0,\n                    NetworkMessageContentFlags.SingleDataSetMessage,\n                    DataSetFieldContentFlags.RawData,\n                    MessageEncoding.Json, MessageEncoding.JsonGzip);\n            AddProfile(MessagingMode.RawDataSets, 0,\n                    0,\n                    DataSetFieldContentFlags.RawData,\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n            AddProfile(MessagingMode.SingleRawDataSet, 0,\n                    NetworkMessageContentFlags.SingleDataSetMessage,\n                    DataSetFieldContentFlags.RawData,\n                    MessageEncoding.JsonReversible, MessageEncoding.JsonReversibleGzip);\n\n            // Uadp encoding\n            AddProfile(MessagingMode.PubSub, BuildDataSetContentMask(),\n                    BuildNetworkMessageContentMask(),\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Uadp);\n            AddProfile(MessagingMode.FullNetworkMessages, BuildDataSetContentMask(true),\n                    BuildNetworkMessageContentMask(),\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Uadp);\n            AddProfile(MessagingMode.DataSetMessages, BuildDataSetContentMask(),\n                    NetworkMessageContentFlags.DataSetMessageHeader,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Uadp);\n            AddProfile(MessagingMode.SingleDataSetMessage, BuildDataSetContentMask(),\n                    NetworkMessageContentFlags.DataSetMessageHeader | NetworkMessageContentFlags.SingleDataSetMessage,\n                    BuildDataSetFieldContentMask(),\n                    MessageEncoding.Uadp);\n            AddProfile(MessagingMode.RawDataSets, 0,\n                    0,\n                    DataSetFieldContentFlags.RawData,\n                    MessageEncoding.Uadp);\n            AddProfile(MessagingMode.SingleRawDataSet, 0,\n                    NetworkMessageContentFlags.SingleDataSetMessage,\n                    DataSetFieldContentFlags.RawData,\n                    MessageEncoding.Uadp);\n        }\n\n        /// <summary>\n        /// Get a markdown compatible string of all message profiles\n        /// </summary>\n        /// <returns></returns>\n        public static string GetAllAsMarkdownTable()\n        {\n            var builder = new StringBuilder();\n            builder.Append(\n@\"| Messaging Mode<br>(--mm) | Message Encoding<br>(--me) | NetworkMessageContentMask | DataSetMessageContentMask | DataSetFieldContentMask | Metadata supported | KeyFrames supported | KeepAlive supported | Schema publishing |\n   |--------------------------|----------------------------|---------------------------|---------------------------|-------------------------|--------------------|---------------------|---------------------|-------------------|\n\");\n            foreach (var profile in kProfiles)\n            {\n                builder.Append(profile.Value.ToExpandedString());\n            }\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Massage the message encoding\n        /// </summary>\n        /// <param name=\"encoding\"></param>\n        /// <returns></returns>\n        private static MessageEncoding GetMessageEncoding(MessageEncoding encoding)\n        {\n            if (encoding == 0)\n            {\n                return MessageEncoding.Json;\n            }\n            return encoding;\n        }\n\n        private static void AddProfile(MessagingMode messagingMode,\n            DataSetMessageContentFlags dataSetMessageContentMask,\n            NetworkMessageContentFlags networkMessageContentMask,\n            DataSetFieldContentFlags dataSetFieldContentMask,\n            params MessageEncoding[] messageEncoding)\n        {\n            foreach (var encoding in messageEncoding)\n            {\n                kProfiles.Add((messagingMode, encoding),\n                    new MessagingProfile(messagingMode, encoding,\n                        dataSetMessageContentMask,\n                        networkMessageContentMask,\n                        dataSetFieldContentMask));\n            }\n        }\n\n        /// <summary>\n        /// From published nodes jobs converter\n        /// </summary>\n        /// <param name=\"fullFeaturedMessage\"></param>\n        /// <param name=\"isSampleMessage\"></param>\n        /// <returns></returns>\n        private static DataSetFieldContentFlags BuildDataSetFieldContentMask(\n            bool fullFeaturedMessage = false, bool isSampleMessage = false)\n        {\n            return\n                DataSetFieldContentFlags.StatusCode |\n                DataSetFieldContentFlags.SourceTimestamp |\n                (fullFeaturedMessage ?\n                     (DataSetFieldContentFlags.ServerTimestamp |\n                      DataSetFieldContentFlags.ApplicationUri |\n                      DataSetFieldContentFlags.EndpointUrl |\n                      DataSetFieldContentFlags.ExtensionFields) : 0) |\n                (isSampleMessage ?\n                     (DataSetFieldContentFlags.NodeId |\n                      DataSetFieldContentFlags.DisplayName |\n                      DataSetFieldContentFlags.EndpointUrl) :\n                      DataSetFieldContentFlags.ServerTimestamp)\n                ;\n        }\n\n        private static DataSetMessageContentFlags BuildDataSetContentMask(\n            bool fullFeaturedMessage = false, bool reversibleEncoding = false,\n            bool isSampleMessage = false)\n        {\n            return\n                (reversibleEncoding ?\n                     DataSetMessageContentFlags.ReversibleFieldEncoding : 0) |\n                (fullFeaturedMessage ?\n                    (DataSetMessageContentFlags.Timestamp |\n                     DataSetMessageContentFlags.DataSetWriterId |\n                     DataSetMessageContentFlags.SequenceNumber) : 0) |\n                (!isSampleMessage ?\n                    (DataSetMessageContentFlags.Timestamp |\n                     DataSetMessageContentFlags.SequenceNumber) : 0) |\n                DataSetMessageContentFlags.MetaDataVersion |\n                DataSetMessageContentFlags.MajorVersion |\n                DataSetMessageContentFlags.MinorVersion |\n                DataSetMessageContentFlags.DataSetWriterName |\n                DataSetMessageContentFlags.MessageType;\n        }\n\n        private static NetworkMessageContentFlags BuildNetworkMessageContentMask(\n            bool isSampleMessage = false)\n        {\n            return (isSampleMessage ?\n                NetworkMessageContentFlags.MonitoredItemMessage\n                 : (NetworkMessageContentFlags.NetworkMessageHeader |\n                    NetworkMessageContentFlags.PublisherId |\n                    NetworkMessageContentFlags.SequenceNumber |\n                    NetworkMessageContentFlags.Timestamp |\n                    NetworkMessageContentFlags.WriterGroupId |\n                    NetworkMessageContentFlags.PayloadHeader |\n                    NetworkMessageContentFlags.DataSetClassId |\n                    NetworkMessageContentFlags.NetworkMessageNumber)) |\n                NetworkMessageContentFlags.DataSetMessageHeader;\n        }\n\n        private static readonly Dictionary<(MessagingMode, MessageEncoding), MessagingProfile> kProfiles = [];\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/Extensions/Extensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Irony.Parsing\n{\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Parser extensions\n    /// </summary>\n    internal static class Extensions\n    {\n        /// <summary>\n        /// Get children\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <returns></returns>\n        public static IEnumerable<ParseTreeNode> GetChildren(\n            this ParseTreeNode? node)\n        {\n            if (node?.ChildNodes == null)\n            {\n                return [];\n            }\n            return node.ChildNodes;\n        }\n\n        /// <summary>\n        /// Get children\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <param name=\"name\"></param>\n        /// <returns></returns>\n        public static IEnumerable<ParseTreeNode> GetChildren(\n            this ParseTreeNode? node, string name)\n        {\n            if (node?.ChildNodes == null)\n            {\n                return [];\n            }\n            return node.ChildNodes.Where(\n                node => node.Term?.Name == name);\n        }\n\n        /// <summary>\n        /// Get child at Index\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public static ParseTreeNode? GetChild(\n            this ParseTreeNode? node, int index)\n        {\n            if (node?.ChildNodes == null ||\n                index >= node.ChildNodes.Count)\n            {\n                return null;\n            }\n            return node.ChildNodes[index];\n        }\n\n        /// <summary>\n        /// Get first node in the list\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"expectedIndex\"></param>\n        /// <returns></returns>\n        public static ParseTreeNode? GetChild(this ParseTreeNode? node,\n            string name, ref int expectedIndex)\n        {\n            if (node?.ChildNodes == null)\n            {\n                return null;\n            }\n            if (expectedIndex < node.ChildNodes.Count)\n            {\n                var found = node.ChildNodes[expectedIndex];\n                if (found.Term.Name == name)\n                {\n                    expectedIndex++;\n                    return found;\n                }\n            }\n            return node.ChildNodes.Find(node => node.Term?.Name == name);\n        }\n\n        /// <summary>\n        /// Get first node in the list\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"expectedIndex\"></param>\n        /// <param name=\"syntaxTree\"></param>\n        /// <returns></returns>\n        public static ParseTreeNode GetChild(this ParseTreeNode? node,\n            string name, ref int expectedIndex, ParseTree syntaxTree)\n        {\n            var child = GetChild(node, name, ref expectedIndex);\n            return child ?? throw ParserException.Create(\"Child node {name} not found in node.\",\n                syntaxTree, node);\n        }\n\n        /// <summary>\n        /// Get child at Index\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"syntaxTree\"></param>\n        /// <returns></returns>\n        public static ParseTreeNode GetChild(this ParseTreeNode? node,\n            int index, ParseTree syntaxTree)\n        {\n            return GetChild(node, index)\n                ?? throw ParserException.Create($\"No Child at index {index} found in node.\",\n                syntaxTree, node);\n        }\n\n        /// <summary>\n        /// Get child token text\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"syntaxTree\"></param>\n        /// <returns></returns>\n        public static string GetChildTokenText(this ParseTreeNode? node,\n            int index, ParseTree syntaxTree)\n        {\n            var child = GetChild(node, index, syntaxTree);\n            var token = child?.FindTokenAndGetText();\n            return token ?? throw ParserException.Create($\"No token value in node {node} at child {index}.\",\n                syntaxTree,\n                node, child);\n        }\n\n        /// <summary>\n        /// Get child token text\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        public static string GetChildTokenText(this ParseTreeNode? node,\n            int index, string defaultValue)\n        {\n            var child = GetChild(node, index);\n            return child?.FindTokenAndGetText() ?? defaultValue;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/FilterModelBuilder.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Parser\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Encoders.Utils;\n    using Furly.Extensions.Serializers;\n    using Irony.Parsing;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Data;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Builds event filter and query filters from a syntax tree.\n    /// We do not bother with AST generation as the output of the\n    /// parser is good enough for us to build the models\n    /// </summary>\n    internal sealed class FilterModelBuilder\n    {\n        /// <summary>\n        /// Create event builder\n        /// </summary>\n        /// <param name=\"syntaxTree\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"serializer\"></param>\n        private FilterModelBuilder(ParseTree syntaxTree,\n            IFilterParserContext context, IJsonSerializer serializer)\n        {\n            _serializer = serializer;\n            _context = context;\n            _syntaxTree = syntaxTree;\n\n            var index = 0;\n            var selectStmt = syntaxTree.Root\n                .GetChild(\"selectStmt\", ref index, _syntaxTree);\n\n            index = 0;\n            var prefixList = selectStmt\n                .GetChild(\"prefixList\", ref index);\n\n            //\n            // Get the prefix to namespace uri lookup table from\n            // the prefix declarations. Prefixes are optional and\n            // if not specified namespace indexes and node ids\n            // are allowed to be used inline.\n            //\n            _prefixToNamespaceUri = prefixList\n                .GetChildren()\n                .ToDictionary(\n                    n => n.GetChildTokenText(0, _syntaxTree), // prefix\n                    n => ExpandNamespaceUri(\n                         n.GetChildTokenText(1, _syntaxTree))) // nsuri\n                        ?? [];\n\n            var selList = selectStmt\n                .GetChild(\"selList\", ref index);\n            _fromClauseOpt = selectStmt\n                .GetChild(\"fromClauseOpt\", ref index);\n            _whereClauseOpt = selectStmt\n                .GetChild(\"whereClauseOpt\", ref index);\n\n            //\n            // Get the selected source type list. We maintain order\n            // to ensure we pick the first declared one in case of\n            // ambiguity.\n            //\n            index = 0;\n            _typeToAliasOrdered = _fromClauseOpt\n                .GetChild(\"typeList\", ref index)\n                .GetChildren(\"type\")\n                .Select(id =>\n                {\n                    var typeName = id\n                        .GetChildTokenText(0, _syntaxTree)\n                        .TrimMatchingChar('´');\n                    var type = ExpandSimpleIdentifier(typeName, id, true);\n                    var alias = id.GetChildTokenText(1, string.Empty);\n                    return (type, alias);\n                })\n                .ToList();\n\n            if (_typeToAliasOrdered.Count == 0)\n            {\n                // from clause is optional, default to BaseEventType.\n                _typeToAliasOrdered = new List<(string, string)>\n                {\n                    (Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                        string.Empty)\n                };\n            }\n\n            index = 0;\n            _fieldItemList = selList\n                .GetChild(\"fieldItemList\", ref index)\n                .GetChildren()\n                .ToList();\n        }\n\n        /// <summary>\n        /// Build the event filter model using the builder\n        /// </summary>\n        /// <param name=\"syntaxTree\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"ct\"></param>\n        public static Task<EventFilterModel> BuildEventFilterAsync(\n            ParseTree syntaxTree, IFilterParserContext context,\n            IJsonSerializer serializer, CancellationToken ct)\n        {\n            var builder = new FilterModelBuilder(syntaxTree,\n                context, serializer);\n            return builder.BuildEventFilterAsync(ct);\n        }\n\n        /// <summary>\n        /// Build event filter model\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task<EventFilterModel> BuildEventFilterAsync(\n            CancellationToken ct)\n        {\n            await LoadBuilderContextAsync(ct).ConfigureAwait(false);\n\n            BuildSelectClauses();\n\n            BuildContentFilter();\n\n            var elements = GetContentFilterElements().ToList();\n            return new EventFilterModel\n            {\n                SelectClauses = _selectClauses.ToList(),\n                WhereClause = elements.Count != 0 ?\n                    new ContentFilterModel\n                    {\n                        Elements = elements\n                    } : null\n            };\n        }\n\n        /// <summary>\n        /// Load the builder context from the parser context\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task LoadBuilderContextAsync(CancellationToken ct)\n        {\n            // Get valid identifier lookup table\n            foreach (var typeId in _typeToAliasOrdered.Select(t => t.type).Distinct())\n            {\n                var identifiers = await _context.GetIdentifiersAsync(typeId,\n                    ct).ConfigureAwait(false);\n\n                var identifierTable = new Dictionary<ImmutableRelativePath, IdentifierMetaData>();\n                foreach (var identifier in identifiers)\n                {\n                    // Ordered from super type to sub type so we override here\n                    identifierTable.AddOrUpdate(new ImmutableRelativePath(identifier.BrowsePath), identifier);\n                }\n                _validIdsForType.AddOrUpdate(typeId, identifierTable);\n            }\n        }\n\n        /// <summary>\n        /// Get content filter elements\n        /// </summary>\n        private IEnumerable<ContentFilterElementModel> GetContentFilterElements()\n        {\n            // Adjust all existing filter element indexes\n            // Reverse the list\n            _contentFilter.Reverse();\n            foreach (var filterElement in _contentFilter)\n            {\n                var element = filterElement.Element;\n\n                if (element.FilterOperands?.Any(operand => operand.Index != null) != true)\n                {\n                    yield return element;\n                }\n                else\n                {\n                    var operands = new List<FilterOperandModel>();\n                    foreach (var operand in element.FilterOperands)\n                    {\n                        if (operand.Index != null)\n                        {\n                            for (var index = 0; index < _contentFilter.Count; index++)\n                            {\n                                if (operand.Index == _contentFilter[index].Id)\n                                {\n                                    operands.Add(operand with\n                                    {\n                                        Index = (uint)index\n                                    });\n                                    break;\n                                }\n                            }\n                        }\n                        else\n                        {\n                            operands.Add(operand);\n                        }\n                    }\n                    yield return element with\n                    {\n                        FilterOperands = operands\n                    };\n                }\n            }\n        }\n\n        /// <summary>\n        /// Build select clauses\n        /// </summary>\n        /// <returns></returns>\n        private void BuildSelectClauses()\n        {\n            // Selected item indexed by name or alias\n            if (_fieldItemList.Count != 0)\n            {\n                foreach (var item in _fieldItemList)\n                {\n                    var index = 0;\n                    var fieldSource = item\n                        .GetChild(\"fieldSource\", ref index, _syntaxTree)\n                        ;\n                    var path = ExpandPathIdentifier(fieldSource, out var type,\n                        out var displayName, out _, out var attribute);\n\n                    var operand = new SimpleAttributeOperandModel\n                    {\n                        AttributeId = attribute,\n                        BrowsePath = path,\n                        DisplayName = displayName,\n                        IndexRange = null, // TODO\n                        TypeDefinitionId = type\n                    };\n\n                    var aliasOpt = item\n                        .GetChild(\"aliasOpt\", ref index, _syntaxTree)\n                        .FindTokenAndGetText();\n                    if (aliasOpt != null)\n                    {\n                        //\n                        // If an alias for later use was declared store it\n                        // for later lookup\n                        //\n                        _aliasForId.Add(aliasOpt, operand);\n                    }\n                    _selectClauses.Add(operand);\n                }\n            }\n            else\n            {\n                // Select everything from every item\n                foreach (var id in _validIdsForType.SelectMany(kv => kv.Value))\n                {\n                    _selectClauses.Add(new SimpleAttributeOperandModel\n                    {\n                        AttributeId = NodeAttribute.Value,\n                        BrowsePath = id.Value.BrowsePath,\n                        DisplayName = \"/\" + id.Value.DisplayName.Trim('/')\n                            + \".Value\",\n                        TypeDefinitionId = id.Value.TypeDefinitionId\n                    });\n                }\n            }\n        }\n\n        /// <summary>\n        /// Build where clauses\n        /// </summary>\n        /// <returns></returns>\n        private void BuildContentFilter()\n        {\n            // Filter stack\n            var expression = _whereClauseOpt.GetChild(0);\n            if (expression == null)\n            {\n                return;\n            }\n\n            // Process first expression\n            ProcessExpression(expression);\n        }\n\n        /// <summary>\n        /// Process any filter expression\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ParserException\"></exception>\n        private FilterOperandModel ProcessExpression(ParseTreeNode expression)\n        {\n            var index = 0;\n            var exprName = expression.Term?.Name;\n            switch (exprName)\n            {\n                case \"unExpr\":\n                    var unop = expression.GetChild(\"unOp\", ref index,\n                        _syntaxTree);\n                    var unexpr = expression.GetChild(index,\n                        _syntaxTree);\n                    return ProcessExpression(unop, unexpr);\n                case \"binExpr\":\n                    var lhs = expression.GetChild(index++, _syntaxTree);\n                    var binOp = expression.GetChild(\"binOp\", ref index,\n                        _syntaxTree);\n                    var rhs = expression.GetChild(index,\n                        _syntaxTree);\n                    return ProcessExpression(binOp, lhs, rhs);\n                case \"fnExpr\":\n                    var obj = expression.GetChild(index++, _syntaxTree);\n                    var fnOp = expression.GetChild(\"fnOp\", ref index,\n                        _syntaxTree);\n                    var args = expression.GetChild(\"exprList\", ref index,\n                        _syntaxTree);\n                    return ProcessExpression(fnOp, obj\n                        .YieldReturn()\n                        .Concat(args.GetChildren())\n                        .ToArray());\n                case \"literal\":\n                    return ProcessLiteralOperand(expression);\n                case \"id\":\n                    return ProcessIdentifierOperand(expression);\n                case \"parSelectStmt\":\n                    throw ParserException.Create(\n                        \"Unsupported expression found.\",\n                        _syntaxTree, expression);\n                default:\n                    throw ParserException.Create(\n                        $\"Unsupported expression {exprName} found.\",\n                        _syntaxTree, expression);\n            }\n        }\n\n        /// <summary>\n        /// Process element expression\n        /// </summary>\n        /// <param name=\"op\"></param>\n        /// <param name=\"operandExpressions\"></param>\n        /// <exception cref=\"ParserException\"></exception>\n        private FilterOperandModel ProcessExpression(ParseTreeNode op,\n            params ParseTreeNode[] operandExpressions)\n        {\n            var filterOp = GetFilterOperator(op, out var negate,\n                out var exprValidator);\n            // Push the elements onto the stack\n\n            // Process the children first and push each into the list\n            var elements = new List<FilterOperandModel>();\n            foreach (var expression in operandExpressions)\n            {\n                var operand = ProcessExpression(expression);\n\n                if (filterOp == FilterOperatorType.OfType &&\n                    operand.AttributeId == NodeAttribute.NodeId)\n                {\n                    //\n                    // Switch simple operand with NodeId attribute\n                    // into a literal with node type.\n                    //\n                    operand = new FilterOperandModel\n                    {\n                        Value = operand.NodeId,\n                        DataType = operand.AttributeId.ToString()\n                    };\n                }\n                elements.Add(operand);\n            }\n\n            var error = exprValidator(elements);\n            if (!string.IsNullOrEmpty(error))\n            {\n                throw ParserException.Create(error, _syntaxTree,\n                    op.YieldReturn().Concat(operandExpressions).ToArray());\n            }\n\n            _contentFilter.Add(new ContentFilterElement2Model(_contentFilter.Count + 1,\n                new ContentFilterElementModel\n                {\n                    FilterOperator = filterOp,\n                    FilterOperands = elements\n                }));\n\n            if (negate)\n            {\n                // Shift all indexes and insert another negating element\n                _contentFilter.Add(new ContentFilterElement2Model(_contentFilter.Count + 1,\n                    new ContentFilterElementModel\n                    {\n                        FilterOperator = FilterOperatorType.Not,\n                        FilterOperands = new[] {\n                            new FilterOperandModel\n                            {\n                                Index = (uint)_contentFilter.Count\n                            }\n                        }\n                    }));\n            }\n\n            // Return an element used by others\n            return new FilterOperandModel\n            {\n                Index = (uint)_contentFilter.Count\n            };\n        }\n\n        /// <summary>\n        /// Process identifier expression and push onto the stack\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        private FilterOperandModel ProcessIdentifierOperand(\n            ParseTreeNode expression)\n        {\n            // a browse path identifier\n            var path = ExpandPathIdentifier(expression,\n                out var type, out _, out var alias, out var attribute);\n            return new FilterOperandModel\n            {\n                AttributeId = attribute,\n                BrowsePath = path,\n                Alias = string.IsNullOrEmpty(alias) ? null : alias,\n                IndexRange = null, // TODO\n                NodeId = type\n            };\n        }\n\n        private FilterOperandModel ProcessLiteralOperand(\n            ParseTreeNode expression)\n        {\n            var index = 0;\n            var value = expression\n                .GetChild(\"value\", ref index, _syntaxTree)\n                .GetChild(0, _syntaxTree);\n\n            var dataType = expression\n                .GetChild(index)?\n                .FindTokenAndGetText()?\n                .TrimMatchingChar('´');\n\n            var str = value.Term?.Name;\n            if (value.Term is StringLiteral)\n            {\n                str = value.FindTokenAndGetText()?.TrimQuotes();\n\n                // Expand any namespaced simple identifiers\n                if (dataType != null && str != null)\n                {\n                    if (dataType.Equals(\"NodeId\",\n                            StringComparison.OrdinalIgnoreCase) ||\n                        dataType.Equals(\"ExpandedNodeId\",\n                            StringComparison.OrdinalIgnoreCase))\n                    {\n                        str = ExpandSimpleIdentifier(str, value, true);\n                    }\n                    else if (dataType.Equals(\"QualifiedName\",\n                        StringComparison.OrdinalIgnoreCase))\n                    {\n                        str = ExpandSimpleIdentifier(str, value, false);\n                    }\n                }\n                str = $\"\\\"{str}\\\"\";\n            }\n            else if (value.Term is NumberLiteral)\n            {\n                str = value.FindTokenAndGetText();\n            }\n\n            if (string.IsNullOrEmpty(str))\n            {\n                str = \"null\";\n            }\n\n            return new FilterOperandModel\n            {\n                DataType = dataType,\n                Value = _serializer.Parse(str)\n            };\n        }\n\n        /// <summary>\n        /// Convert filter operator\n        /// </summary>\n        /// <param name=\"op\"></param>\n        /// <param name=\"negate\"></param>\n        /// <param name=\"validator\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ParserException\"></exception>\n        private FilterOperatorType GetFilterOperator(ParseTreeNode op, out bool negate,\n            out Func<List<FilterOperandModel>, string?> validator)\n        {\n            negate = false;\n            var opStr = op.FindTokenAndGetText();\n            FilterOperatorType filterOp;\n            switch (opStr.ToUpperInvariant())\n            {\n                case \"NOT\":\n                case \"!\":\n                    filterOp = FilterOperatorType.Not;\n                    validator = l => ValidateExact(1, l);\n                    break;\n                case \"=\":\n                case \"==\":\n                    filterOp = FilterOperatorType.Equals;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \">\":\n                    filterOp = FilterOperatorType.GreaterThan;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"<\":\n                    filterOp = FilterOperatorType.LessThan;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \">=\":\n                    filterOp = FilterOperatorType.GreaterThan;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"<=\":\n                    filterOp = FilterOperatorType.LessThanOrEqual;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"LIKE\":\n                    filterOp = FilterOperatorType.Like;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"<>\":\n                case \"!=\":\n                    negate = true;\n                    filterOp = FilterOperatorType.Equals;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"!<\":\n                    negate = true;\n                    filterOp = FilterOperatorType.LessThan;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"!>\":\n                    negate = true;\n                    filterOp = FilterOperatorType.GreaterThan;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"AND\":\n                    filterOp = FilterOperatorType.And;\n                    validator = l => ValidateExact(2, l, true);\n                    break;\n                case \"OR\":\n                    filterOp = FilterOperatorType.Or;\n                    validator = l => ValidateExact(2, l, true);\n                    break;\n                case \"CAST\":\n                    filterOp = FilterOperatorType.Cast;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"&\":\n                    filterOp = FilterOperatorType.BitwiseAnd;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"|\":\n                    filterOp = FilterOperatorType.BitwiseOr;\n                    validator = l => ValidateExact(2, l);\n                    break;\n                case \"IN\":\n                    filterOp = FilterOperatorType.InList;\n                    validator = l => ValidateMin(1, l);\n                    break;\n                case \"BETWEEN\":\n                    filterOp = FilterOperatorType.Between;\n                    validator = l => ValidateExact(3, l);\n                    break;\n                case \"RELATEDTO\":\n                    filterOp = FilterOperatorType.RelatedTo;\n                    validator = ValidateRelatedTo;\n                    break;\n                case \"ISNULL\":\n                    filterOp = FilterOperatorType.IsNull;\n                    validator = l => ValidateExact(1, l);\n                    break;\n                case \"OFTYPE\":\n                    filterOp = FilterOperatorType.OfType;\n                    validator = l => ValidateExact(1, l);\n                    break;\n                case \"INVIEW\":\n                    filterOp = FilterOperatorType.InView;\n                    validator = l => ValidateExact(1, l);\n                    break;\n                default:\n                    throw ParserException.Create($\"Operand {opStr} not supported\",\n                        _syntaxTree, op);\n            }\n            return filterOp;\n\n            //\n            // Generic expression validation. Validates the exact length of\n            // provided operands.\n            //\n            string? ValidateExact(int exact, List<FilterOperandModel> operands,\n                bool reverseOperands = false)\n            {\n                if (exact != operands.Count)\n                {\n                    return $\"Operator {opStr} ({filterOp}) requires {exact} \" +\n                        $\"operand(s) but only {operands.Count} provided.\";\n                }\n                if (reverseOperands && operands.All(o => o.Index != null))\n                {\n                    //\n                    // Call reverse on the operands to match the specification\n                    // examples (validated in our tests)\n                    //\n                    operands.Reverse();\n                }\n                return null;\n            }\n\n            //\n            // Special case related to, which can have 3-6 operands\n            //\n            string? ValidateRelatedTo(IList<FilterOperandModel> operands)\n            {\n                if (operands.Count < 3)\n                {\n                    return $\"Operator {opStr} ({filterOp}) requires at least \" +\n                        $\"3 operands, but {operands.Count} provided.\";\n                }\n                if (operands.Count > 6)\n                {\n                    return $\"Operator {opStr} ({filterOp}) requires at most \" +\n                        $\"6 operands, but {operands.Count} provided.\";\n                }\n                return null;\n            }\n\n            //\n            // Validate minimum operands are provided.\n            //\n            string? ValidateMin(int min, IList<FilterOperandModel> operands)\n            {\n                if (operands.Count < min)\n                {\n                    return $\"Operator {opStr} ({filterOp}) requires at least \" +\n                        $\"{min} operand(s), but {operands.Count} provided.\";\n                }\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Fix up a namespace uri\n        /// </summary>\n        /// <param name=\"namespaceUri\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        private static string ExpandNamespaceUri(string namespaceUri)\n        {\n            namespaceUri = namespaceUri.Trim();\n            if (namespaceUri[0] == '<' && namespaceUri[^1] == '>')\n            {\n                // Trim prefix quotes\n                namespaceUri = namespaceUri[1..^1];\n            }\n            return namespaceUri.TrimQuotes().TrimEnd('#');\n        }\n\n        /// <summary>\n        /// Expands a path identifier into the components of a simple or\n        /// full operand identifier.\n        /// </summary>\n        /// <param name=\"pathIdNode\"></param>\n        /// <param name=\"typeDefinitionId\"></param>\n        /// <param name=\"displayName\"></param>\n        /// <param name=\"alias\"></param>\n        /// <param name=\"attribute\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ParserException\"></exception>\n        private IReadOnlyList<string> ExpandPathIdentifier(ParseTreeNode pathIdNode,\n            out string typeDefinitionId, out string displayName, out string alias,\n            out NodeAttribute attribute)\n        {\n            var pathId = pathIdNode.FindTokenAndGetText().TrimMatchingChar('´');\n            // Check first if the id is an alias for a selector.\n            if (_aliasForId.TryGetValue(pathId, out var operand) &&\n                operand.BrowsePath != null &&\n                operand.DisplayName != null)\n            {\n                typeDefinitionId = operand.TypeDefinitionId!;\n                displayName = operand.DisplayName;\n                attribute = operand.AttributeId ?? NodeAttribute.Value;\n                alias = pathId;\n                return operand.BrowsePath;\n            }\n\n            //\n            // A path can start with a type or type alias, if not the\n            // default alias is assumed (empty string). If the path starts\n            // with a aggregate, hierachical or other relationship, then\n            // it is a path starting from an implicit type.\n            //\n            List<RelativePathElementModel> pathElements;\n            string typeOrTypeAlias;\n            try\n            {\n                pathElements = pathId.ToRelativePath(out typeOrTypeAlias)\n                    .ToList();\n            }\n            catch (FormatException formatException)\n            {\n                throw ParserException.Create(formatException.Message,\n                    formatException, _syntaxTree, pathIdNode);\n            }\n\n            //\n            // Extract attribute. The attribute is appended using a . which\n            // also stands for an aggregates reference element.\n            //\n            var last = pathElements.LastOrDefault();\n            NodeAttribute? nodeAttribute = null;\n            if (last?.IsAggregatesReference() == true &&\n                    last.NoSubtypes != true && last.IsInverse != true &&\n                Enum.TryParse<NodeAttribute>(last.TargetName, true, out var attr))\n            {\n                pathElements.Remove(last);\n                nodeAttribute = attr;\n                // Not an attribute - leave as is\n            }\n\n            // Check whether the alias points to a type\n            var aliasedTypes = _typeToAliasOrdered\n                .Where(typeAndAlias => typeAndAlias.alias == typeOrTypeAlias)\n                ;\n            if (!aliasedTypes.Any())\n            {\n                if (string.IsNullOrEmpty(typeOrTypeAlias))\n                {\n                    //\n                    // Try to resolve the path from all specified types\n                    // with precedence of order of declaration.\n                    //\n                    aliasedTypes = _typeToAliasOrdered;\n                }\n                else\n                {\n                    //\n                    // If the type alias is actually a valid type, then put\n                    // it first (without any alias).\n                    //\n                    var typeId = ExpandSimpleIdentifier(typeOrTypeAlias,\n                        pathIdNode, true);\n                    if (_typeToAliasOrdered\n                        .Any(typeAndAlias => typeAndAlias.type == typeId))\n                    {\n                        aliasedTypes = (typeId, string.Empty).YieldReturn();\n                    }\n                }\n            }\n\n            if (pathElements.Count == 0)\n            {\n                //\n                // There was only a type alias here. This is allowed\n                // and means we want the type and an empty path after\n                // We select node id of the type instead of value.\n                //\n                var aliasedType = aliasedTypes.FirstOrDefault();\n                if (!string.IsNullOrEmpty(aliasedType.type))\n                {\n                    attribute = nodeAttribute ?? NodeAttribute.NodeId;\n                    displayName = \"/.\" + attribute.ToString();\n                    typeDefinitionId = aliasedType.type;\n                    alias = aliasedType.alias;\n                    return Array.Empty<string>();\n                }\n                throw ParserException.Create(\"Could not find \" +\n                    $\"type {typeOrTypeAlias} in candidates declared in FROM.\",\n                    _syntaxTree, pathIdNode, _fromClauseOpt);\n            }\n\n            //\n            // The browse path is now pathElements.\n            // We need to expand it to incorporate the prefixes\n            // and resolve any session namespace indexes.\n            //\n\n            pathElements = pathElements.ConvertAll(element => element with\n            {\n                TargetName = ExpandSimpleIdentifier(\n                    element.TargetName, pathIdNode, false),\n                ReferenceTypeId = ExpandSimpleIdentifier(\n                    element.ReferenceTypeId, pathIdNode, true),\n            });\n\n            //\n            // We now have candidate types in order of declaration\n            // Try to resolve a valid identifier on these types.\n            //\n            // Try to uniquely identify the path in the valid ids\n            var browsePath = new ImmutableRelativePath(pathElements.AsString());\n            foreach (var aliasedType in aliasedTypes)\n            {\n                var ids = _validIdsForType[aliasedType.type];\n                Debug.Assert(ids != null);\n\n                if (ids.TryGetValue(browsePath, out var metadata))\n                {\n                    // Found it.\n                    attribute = nodeAttribute ?? NodeAttribute.Value;\n                    displayName = \"/\" + metadata.DisplayName.Trim('/')\n                        + \".\" + attribute;\n                    typeDefinitionId = metadata.TypeDefinitionId;\n                    alias = aliasedType.alias;\n                    return browsePath.Path;\n                }\n\n                // TODO: if we do not find it we could still use the context\n                // to translate the browse path into a node etc. or just\n                // return a stand in item.\n            }\n\n            var candidates = string.Join(\", \", aliasedTypes.Select(a => a.type));\n            if (string.IsNullOrEmpty(candidates))\n            {\n                throw ParserException.Create(\"Could not find \" +\n                    $\"candidate types that contain {browsePath}. \" +\n                    \"Make sure to declare a candidate type in FROM.\", _syntaxTree,\n                    pathIdNode, _fromClauseOpt);\n            }\n            var available = string.Join(\", \", aliasedTypes\n                .SelectMany(a => _validIdsForType[a.type].Keys)\n                .Distinct());\n            throw ParserException.Create(\n                $\"Could not find {browsePath} in one of the candidate types \" +\n                $\"{candidates} provided in FROM.\\nAvailable paths: {available}\",\n                _syntaxTree, pathIdNode, _fromClauseOpt);\n        }\n\n        /// <summary>\n        /// Expand an identifier into a full string using lookup tables\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <param name=\"idNode\"></param>\n        /// <param name=\"isNodeId\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ParserException\"></exception>\n        private string ExpandSimpleIdentifier(string id, ParseTreeNode? idNode,\n            bool isNodeId)\n        {\n            if (id.Length > 1 && id[0] == '[' && id[^1] == ']')\n            {\n                id = id[1..^1];\n            }\n            if (Uri.TryCreate(id, UriKind.Absolute, out var uri) &&\n                !string.IsNullOrEmpty(uri.Host))\n            {\n                // Uri - keep as is\n                return id;\n            }\n\n            var parts = id.Split(':', StringSplitOptions.TrimEntries |\n                StringSplitOptions.RemoveEmptyEntries);\n            if (parts.Length > 1)\n            {\n                if (!isNodeId && parts.Length > 2)\n                {\n                    // We assume that a node id can contain > 1 colon\n                    throw ParserException.Create(\n                        $\"Malformed identifier {id} contains > 1 colon character.\",\n                        _syntaxTree, idNode);\n                }\n\n                id = id[(parts[0].Length + 1)..];\n                if (_prefixToNamespaceUri.TryGetValue(parts[0], out var namespaceUri) ||\n                    TryGetNamespace(parts[0], out namespaceUri))\n                {\n                    if (string.IsNullOrEmpty(namespaceUri))\n                    {\n                        return TranslateOpcUaIdentifier(id); // Default ua namespace\n                    }\n                    return namespaceUri + \"#\" + id;\n                }\n\n                if (!isNodeId) // We assume that a node id can contain 1..n colons\n                {\n                    throw ParserException.Create(\"Failed to retrieve \" +\n                        $\"namespace for prefix {parts[0]} of identifier {id}.\",\n                        _syntaxTree, idNode);\n                }\n\n                //\n                // If this is a node id then let the resolver convert the string\n                // later in the context of the session. Otherwise we assume that\n                // if this is a path we have thrown earlier in case we could not\n                // parse it here.\n                //\n                return id; // Custom node identifier\n\n                bool TryGetNamespace(string prefix, out string? namespaceUri)\n                {\n                    if (prefix.StartsWith(\"ns\", StringComparison.InvariantCulture))\n                    {\n                        prefix = prefix[2..];\n                    }\n                    if (uint.TryParse(prefix, out var index))\n                    {\n                        return _context.TryGetNamespaceUri(index, out namespaceUri);\n                    }\n                    namespaceUri = null;\n                    return false;\n                }\n            }\n\n            return TranslateOpcUaIdentifier(id);\n\n            static string TranslateOpcUaIdentifier(string id)\n            {\n                // Try convert object type identifiers\n                if (TypeMaps.ObjectTypes.Value.TryGetIdentifier(id,\n                    out var identifier))\n                {\n                    return new Opc.Ua.NodeId(identifier).ToString();\n                }\n                return id;\n            }\n        }\n\n        /// <summary>\n        /// Compare attribute operands. We have to use a comparer because reord\n        /// do not compare arrays or read only lists by value.\n        /// </summary>\n        private sealed class SimpleAttributeOperandComperer :\n            IEqualityComparer<SimpleAttributeOperandModel>\n        {\n            /// <inheritdoc/>\n            public bool Equals(SimpleAttributeOperandModel? x, SimpleAttributeOperandModel? y)\n            {\n                return x.IsSameAs(y);\n            }\n\n            /// <inheritdoc/>\n            public int GetHashCode([DisallowNull] SimpleAttributeOperandModel obj)\n            {\n                return HashCode.Combine(obj.IndexRange, obj.AttributeId, obj.DisplayName,\n                    obj.DataSetClassFieldId, obj.TypeDefinitionId, obj.BrowsePath == null ? 0 :\n                    new ImmutableRelativePath(obj.BrowsePath).GetHashCode());\n            }\n        }\n\n        private record class ContentFilterElement2Model(int Id, ContentFilterElementModel Element);\n        private readonly List<ContentFilterElement2Model> _contentFilter = [];\n        private readonly HashSet<SimpleAttributeOperandModel> _selectClauses =\n            new(new SimpleAttributeOperandComperer());\n        private readonly IJsonSerializer _serializer;\n        private readonly IFilterParserContext _context;\n        private readonly ParseTree _syntaxTree;\n        private readonly List<ParseTreeNode> _fieldItemList;\n        private readonly ParseTreeNode? _fromClauseOpt;\n        private readonly ParseTreeNode? _whereClauseOpt;\n\n        /// <summary>\n        /// Lookup tables\n        /// </summary>\n        private readonly Dictionary<string,\n            string> _prefixToNamespaceUri;\n        private readonly Dictionary<string,\n            SimpleAttributeOperandModel> _aliasForId = [];\n        private readonly Dictionary<string,\n            Dictionary<ImmutableRelativePath, IdentifierMetaData>> _validIdsForType = [];\n        private readonly IReadOnlyList<(string type, string alias)> _typeToAliasOrdered;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/FilterQueryGrammar.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Parser\n{\n    using Irony.Parsing;\n\n    /// <summary>\n    /// Grammar to parse event filter sql into event filter models.\n    /// Based on Irony sample which is loosely based on SQL89 grammar\n    /// from Gold parser\n    /// </summary>\n    [Language(\"EventFilterGrammar\", \"1\",\n        \"Sql grammar for OPC UA event filter construction.\")]\n    public class FilterQueryGrammar : Grammar\n    {\n        /// <summary>\n        /// Create grammar\n        /// </summary>\n        public FilterQueryGrammar() : base(false) // SQL is case insensitive\n        {\n            //\n            // Simple alpha numeric identifiers, e.g, prefixes or\n            // namespace indexes.\n            //\n            var prefixId = new IdentifierTerminal(\"prefixId\");\n\n            // Covers most node id and qualified name identifiers\n            var id = new IdentifierTerminal(\"id\", \"=:/.;<>[]\", \"[/<.\");\n            // Allow quoting to support any character in the id\n            var quoted = new StringLiteral(\"uaDefaultIdQuoted\");\n            quoted.AddStartEnd(\"´\", StringOptions.AllowsAllEscapes);\n            quoted.SetOutputTerminal(this, id);\n\n            // Filter statement\n            var semiOpt = new NonTerminal(\"semiOpt\")\n            {\n                Rule = Empty | \";\"\n            };\n            var stmt = new NonTerminal(\"stmt\");\n            var stmtLine = new NonTerminal(\"stmtLine\")\n            {\n                Rule = stmt + semiOpt\n            };\n            var stmtList = new NonTerminal(\"stmtList\");\n            stmtList.Rule = MakePlusRule(stmtList, stmtLine);\n            Root = stmtList; // Set as root of parse tree\n            var namespaceUri = new StringLiteral(\"namespaceUri\");\n            namespaceUri.AddStartEnd(\"<\", \">\", StringOptions.NoEscapes);\n            namespaceUri.AddStartEnd(\"http://\", \"#\",\n              StringOptions.NoEscapes);\n            namespaceUri.AddStartEnd(\"https://\", \"#\",\n              StringOptions.NoEscapes);\n            var PREFIX = ToTerm(\"PREFIX\");\n            var prefixDecl = new NonTerminal(\"prefixDecl\")\n            {\n                Rule = PREFIX + prefixId + namespaceUri\n            };\n            var prefixList = new NonTerminal(\"prefixList\");\n            prefixList.Rule = MakePlusRule(prefixList, prefixDecl);\n            var prefixListOpt = new NonTerminal(\"prefixListOpt\")\n            {\n                Rule = Empty | prefixList\n            };\n\n            //\n            // From selector which selects a type using the provided type\n            // identifier and optionally assigns it an alias, e.g. from\n            // BaseEventType E. It is optional, the default is assumed\n            // to be \"FROM BaseEventType\".\n            //\n            var typeAliasOpt = new NonTerminal(\"typeAliasOpt\")\n            {\n                Rule = Empty | prefixId\n            };\n            var type = new NonTerminal(\"type\")\n            {\n                Rule = id + typeAliasOpt\n            };\n            var comma = ToTerm(\",\");\n            var typeList = new NonTerminal(\"typeList\");\n            typeList.Rule = MakePlusRule(typeList, comma, type);\n\n            var FROM = ToTerm(\"FROM\");\n            var fromClauseOpt = new NonTerminal(\"fromClauseOpt\")\n            {\n                Rule = Empty | (FROM + typeList)\n            };\n\n            //\n            // Projection selector which selects fields by browse path\n            // from the FROM selected type identifier. Field source is\n            // either a simple browse path (default / first from statement)\n            // Or qualified, e.g., E.f:path1/f:path2/x:path3\n            //\n            var AS = ToTerm(\"AS\");\n            var asOpt = new NonTerminal(\"asOpt\")\n            {\n                Rule = Empty | AS\n            };\n            var aliasOpt = new NonTerminal(\"aliasOpt\")\n            {\n                Rule = Empty | (asOpt + prefixId)\n            };\n            var fieldSource = new NonTerminal(\"fieldSource\")\n            {\n                Rule = id\n            };\n            var fieldItem = new NonTerminal(\"fieldItem\")\n            {\n                Rule = fieldSource + aliasOpt\n            };\n            var fieldItemList = new NonTerminal(\"fieldItemList\");\n            fieldItemList.Rule = MakePlusRule(fieldItemList, comma,\n              fieldItem);\n            var selList = new NonTerminal(\"selList\")\n            {\n                Rule = fieldItemList | \"*\"\n            };\n\n            //\n            // Where expression filter based on boolean logic. An expression\n            // can be a unary, binary, or complex expression (related_to).\n            // The expressions correspond to the defined filter operands\n            //\n            var WHERE = ToTerm(\"WHERE\");\n            var expression = new NonTerminal(\"expression\");\n            var whereClauseOpt = new NonTerminal(\"whereClauseOpt\")\n            {\n                Rule = Empty | (WHERE + expression)\n            };\n\n            //\n            // Full select stmt which can be used inside filter\n            // as expression (TODO)\n            //\n            var SELECT = ToTerm(\"SELECT\");\n            var selectStmt = new NonTerminal(\"selectStmt\")\n            {\n                Rule = prefixListOpt + SELECT + selList +\n                fromClauseOpt + whereClauseOpt\n            };\n            stmt.Rule = selectStmt;\n\n            //\n            // Unary expression\n            //\n            var NOT = ToTerm(\"NOT\") | \"!\";\n            var unOp = new NonTerminal(\"unOp\")\n            {\n                Rule =\n              NOT                       // Not_7\n              | \"ISNULL\"                // IsNull_1\n              | \"INVIEW\"                // InView_13\n              | \"OFTYPE\"                // OfType_14\n            };\n            var unExpr = new NonTerminal(\"unExpr\")\n            {\n                Rule = unOp + expression\n            };\n\n            RegisterOperators(10,\n                NOT);\n            RegisterOperators(9,\n                \"ISNULL\", \"INVIEW\", \"OFTYPE\");\n\n            //\n            // Binary expressions\n            //\n            var binOp = new NonTerminal(\"binOp\")\n            {\n                Rule =\n              ToTerm(\"=\") | \"==\"        // Equals_0\n              | \">\"                     // GreaterThan_2\n              | \"<\"                     // LessThan_3\n              | \">=\"                    // GreaterThanOrEqual_4\n              | \"<=\"                    // LessThanOrEqual_5\n              | \"LIKE\"                  // Like_6\n              | \"<>\" | \"!=\"             // Not_7 + Equals_0\n              | \"!<\"                    // Not_7 + LessThan_3\n              | \"!>\"                    // Not_7 + GreaterThan_2\n              | \"AND\"                   // And_10\n              | \"OR\"                    // Or_11\n              | \"&\"                     // BitwiseAnd_16\n              | \"|\"                     // BitwiseOr_17\n            };\n            var binExpr = new NonTerminal(\"binExpr\")\n            {\n                Rule = expression + binOp + expression\n            };\n\n            // Operators\n            RegisterOperators(9,\n              \"=\", \"==\", \">\", \"<\", \">=\", \"<=\", \"<>\",\n              \"!=\", \"!<\", \"!>\", \"LIKE\");\n            RegisterOperators(8,\n              \"&\", \"|\");\n            RegisterOperators(5,\n              \"AND\");\n            RegisterOperators(4,\n              \"OR\");\n\n            //\n            // Now cover any special functions including IN(...),\n            // BETWEEN(...), RELATEDTO(...)\n            //\n            var fnOp = new NonTerminal(\"fnOp\")\n            {\n                Rule =\n                ToTerm(\"IN\")            // InList_9\n              | \"CAST\"                  // Cast_12\n              | \"BETWEEN\"               // Between_8\n              | \"RELATEDTO\"             // RelatedTo_15\n            };\n            var exprList = new NonTerminal(\"exprList\");\n            exprList.Rule = MakePlusRule(exprList, comma, expression);\n            var fnArgsList = new NonTerminal(\"fnArgsList\")\n            {\n                Rule = \"(\" + exprList + \")\"\n            };\n            var fnExpr = new NonTerminal(\"fnExpr\")\n            {\n                Rule = expression + fnOp + fnArgsList\n            };\n            RegisterOperators(9,\n                \"IN\", \"BETWEEN\", \"RELATEDTO\", \"CAST\");\n\n            //\n            // Literal expression. A literal expression is essentially\n            // a constant which can be a number, string, or a string\n            // qualified by a type using the double hat operator.\n            //\n            var anyNumber = new NumberLiteral(\"number\");\n            var anyString = new StringLiteral(\"string\", \"'\",\n              StringOptions.AllowsDoubledQuote);\n            var anyBoolean = new NonTerminal(\"boolean\")\n            {\n                Rule = ToTerm(\"true\") | \"false\"\n            };\n            var typeOpt = new NonTerminal(\"typeOpt\")\n            {\n                Rule = Empty | (\"^^\" + id)\n            };\n            var value = new NonTerminal(\"value\")\n            {\n                Rule = anyNumber | anyString | anyBoolean\n            };\n            var literal = new NonTerminal(\"literal\")\n            {\n                Rule = value + typeOpt\n            };\n\n            //\n            // A selector selects a value either using a browse\n            // path construct or a more complex select statement\n            //\n            var parSelectStmt = new NonTerminal(\"parSelectStmt\")\n            {\n                Rule = \"(\" + selectStmt + \")\"\n            };\n\n            var parExpression = new NonTerminal(\"parExpression\")\n            {\n                Rule = \"(\" + expression + \")\"\n            };\n\n            //\n            // Expression is func, unary, binary, literal, inner\n            // select or an expression in paranthesis\n            //\n            expression.Rule =\n                unExpr | binExpr | fnExpr\n              | literal | id\n              | parSelectStmt\n              | parExpression\n              ;\n\n            //\n            // Support for sql comments\n            //\n            var comment = new CommentTerminal(\"comment\", \"/*\", \"*/\");\n            var lineComment = new CommentTerminal(\"line_comment\",\n              \"--\", \"\\n\", \"\\r\\n\");\n            NonGrammarTerminals.Add(comment);\n            NonGrammarTerminals.Add(lineComment);\n\n            MarkPunctuation(\",\", \"(\", \")\", \"*\", \"^^\");\n            MarkPunctuation(semiOpt, asOpt, PREFIX, SELECT, FROM, WHERE);\n\n            MarkTransient(stmt, parExpression, stmtLine, expression,\n              typeAliasOpt, asOpt, typeOpt, prefixListOpt, fnArgsList);\n            //\n            // Set flag InheritPrecedence so that it inherits precedence\n            // value from it's children, and this precedence is used\n            // in conflict resolution when binOp node is sitting on the\n            // stack\n            //\n            binOp.SetFlag(TermFlags.InheritPrecedence);\n            unOp.SetFlag(TermFlags.InheritPrecedence);\n            fnOp.SetFlag(TermFlags.InheritPrecedence);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/FilterQueryParser.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Parser\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Irony.Parsing;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Parses strings into an event filter for simpler event\n    /// subscription.\n    /// </summary>\n    public sealed class FilterQueryParser : IFilterParser\n    {\n        /// <summary>\n        /// Create parser\n        /// </summary>\n        /// <param name=\"serializer\"></param>\n        public FilterQueryParser(IJsonSerializer serializer)\n        {\n            _serializer = serializer;\n        }\n\n        /// <inheritdoc/>\n        public async Task<EventFilterModel> ParseEventFilterAsync(string query,\n            IFilterParserContext context, CancellationToken ct)\n        {\n            var parser = new Parser(_grammar);\n            var syntaxTree = parser.Parse(query);\n            if (syntaxTree.HasErrors())\n            {\n                throw ParserException.Create(\"Parsing query failed.\",\n                    syntaxTree);\n            }\n\n            // Build event filter from syntax tree\n            return await FilterModelBuilder.BuildEventFilterAsync(\n                syntaxTree, context, _serializer, ct).ConfigureAwait(false);\n        }\n\n        private readonly IJsonSerializer _serializer;\n        private readonly FilterQueryGrammar _grammar = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/IFilterParser.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Parser\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Filter parser provides ability to convert filter query strings\n    /// into content filters for query and subscription\n    /// </summary>\n    public interface IFilterParser\n    {\n        /// <summary>\n        /// Parse query string into event filter model\n        /// </summary>\n        /// <param name=\"query\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<EventFilterModel> ParseEventFilterAsync(string query,\n            IFilterParserContext context, CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/IFilterParserContext.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Parser\n{\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Identifier metadata\n    /// </summary>\n    /// <param name=\"TypeDefinitionId\"></param>\n    /// <param name=\"BrowsePath\"></param>\n    /// <param name=\"DisplayName\"></param>\n    public record IdentifierMetaData(string TypeDefinitionId,\n        IReadOnlyList<string> BrowsePath, string DisplayName);\n\n    /// <summary>\n    /// Event filter parser context\n    /// </summary>\n    public interface IFilterParserContext\n    {\n        /// <summary>\n        /// Get valid identifiers\n        /// </summary>\n        /// <param name=\"typeId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<IEnumerable<IdentifierMetaData>> GetIdentifiersAsync(\n            string typeId, CancellationToken ct = default);\n\n        /// <summary>\n        /// Resolve namespace uri\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"namespaceUri\"></param>\n        /// <returns></returns>\n        bool TryGetNamespaceUri(uint index, out string? namespaceUri);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/ParserException.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Parser\n{\n    using Irony.Parsing;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text;\n\n    /// <summary>\n    /// Parser exception contains more information regarding source\n    /// of the parser error than format exception provides\n    /// </summary>\n    public class ParserException : FormatException\n    {\n        /// <inheritdoc/>\n        public ParserException()\n        {\n        }\n\n        /// <inheritdoc/>\n        public ParserException(string message)\n            : base(message)\n        {\n        }\n\n        /// <inheritdoc/>\n        public ParserException(string message, Exception innerException)\n            : base(message, innerException)\n        {\n        }\n\n        /// <inheritdoc/>\n        internal static Exception Create(string message,\n            ParseTree syntaxTree, params ParseTreeNode?[] nodes)\n        {\n            return new ParserException(BuildMessage(message, syntaxTree, nodes));\n        }\n\n        /// <inheritdoc/>\n        internal static Exception Create(string message, Exception innerException,\n            ParseTree syntaxTree, params ParseTreeNode[] nodes)\n        {\n            return new ParserException(BuildMessage(message, syntaxTree, nodes),\n                innerException);\n        }\n\n        /// <summary>\n        /// Create message\n        /// </summary>\n        /// <param name=\"message\"></param>\n        /// <param name=\"syntaxTree\"></param>\n        /// <param name=\"nodes\"></param>\n        /// <returns></returns>\n        private static string BuildMessage(string message, ParseTree syntaxTree,\n            ParseTreeNode?[] nodes)\n        {\n            var lines = syntaxTree.SourceText.Split(\"\\n\")\n                .Select(line => line.Trim('\\r'))\n                .ToArray();\n\n            var errors = lines\n                .Select(line =>\n                {\n                    var pointer = new char[line.Length + 10];\n                    Array.Fill(pointer, ' ');\n                    return (pointer, new List<string>());\n                })\n                .ToArray();\n\n            foreach (var msg in syntaxTree.ParserMessages)\n            {\n                var entry = errors[msg.Location.Line];\n                entry.pointer[msg.Location.Column] = '^';\n                var m =\n                    $\"<--- (col:{msg.Location.Column}) {msg.Message} ----\";\n                entry.Item2.Add(m.PadLeft(msg.Location.Column + m.Length));\n            }\n\n            foreach (var node in nodes)\n            {\n                if (node == null)\n                {\n                    continue;\n                }\n                var entry = errors[node.Span.Location.Line];\n                var len = node.Span.EndPosition - node.Span.Location.Position;\n                for (var start = node.Span.Location.Column;\n                    start < node.Span.Location.Column + len &&\n                    start < entry.pointer.Length; start++)\n                {\n                    entry.pointer[start] = '~';\n                }\n                var m =\n                    $\"<--- (col:{node.Span.Location.Column}|len:{len}) ----\";\n                entry.Item2.Add(m.PadLeft(node.Span.Location.Column + m.Length));\n            }\n\n            var sb = new StringBuilder(message);\n            sb.AppendLine();\n            for (var line = 0; line < lines.Length; line++)\n            {\n                sb.AppendLine(lines[line]);\n                if (errors[line].Item2.Count > 0)\n                {\n                    sb.AppendLine(\n                        new string(errors[line].pointer));\n                    errors[line].Item2\n                        .ForEach(e => sb.AppendLine(e));\n                }\n            }\n            return sb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/RelativePathParser.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Parser\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.Utils;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Text;\n\n    /// <summary>\n    /// Relative path parser according to\n    /// https://reference.opcfoundation.org/v104/Core/docs/Part4/A.2/\n    /// </summary>\n    internal static class RelativePathParser\n    {\n        /// <summary>\n        /// Convert to path object\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <param name=\"prefix\"></param>\n        /// <returns></returns>\n        public static IEnumerable<RelativePathElementModel> ToRelativePath(\n            this string path, out string prefix)\n        {\n            if (path.Length == 0)\n            {\n                prefix = string.Empty;\n                return [];\n            }\n\n            var index = 0;\n            prefix = ExtractTargetName(path, ref index);\n            if (index == path.Length)\n            {\n                return [];\n            }\n            return Parse(path[index..]);\n        }\n\n        /// <summary>\n        /// Format relative path element information\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <param name=\"prefix\"></param>\n        /// <returns></returns>\n        public static IReadOnlyList<string> AsString(this IEnumerable<RelativePathElementModel> path,\n            string? prefix = null)\n        {\n            var result = new List<string>();\n            var value = new StringBuilder(prefix ?? string.Empty);\n            foreach (var element in path)\n            {\n                var writeReference = false;\n                if (element.IsAggregatesReference())\n                {\n                    value.Append('.');\n                }\n                else if (element.IsHierarchicalReference())\n                {\n                    value.Append('/');\n                }\n                else\n                {\n                    value.Append('<');\n                    writeReference = true;\n                }\n                if (element.IsInverse ?? false)\n                {\n                    value.Append('!');\n                }\n                if (element.NoSubtypes ?? false)\n                {\n                    value.Append('#');\n                }\n                if (writeReference)\n                {\n                    if (!element.ReferenceTypeId.StartsWith(\"i=\",\n                            StringComparison.InvariantCulture) ||\n                        !uint.TryParse(element.ReferenceTypeId.AsSpan(2), out var id) ||\n                        !TypeMaps.ReferenceTypes.Value.TryGetBrowseName(id,\n                            out var reference))\n                    {\n                        reference = element.ReferenceTypeId;\n                    }\n                    value.Append(reference)\n                        .Append('>');\n                }\n                var escape = element.TargetName.AsSpan().IndexOfAny(kAllowedChars) != -1;\n                if (escape)\n                {\n                    value.Append('[');\n                }\n                value.Append(element.TargetName);\n                if (escape)\n                {\n                    value.Append(']');\n                }\n                result.Add(value.ToString());\n                value.Clear();\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Returns true if this is a aggregates reference.\n        /// A aggregate is either HasComponent or HasProperty\n        /// reference. Used to get components of an object\n        /// or specifically properties of a variable.\n        /// </summary>\n        /// <param name=\"element\"></param>\n        /// <returns></returns>\n        public static bool IsAggregatesReference(this RelativePathElementModel element)\n        {\n            return element.ReferenceTypeId ==\n               nameof(Opc.Ua.ReferenceTypes.Aggregates) ||\n                   element.ReferenceTypeId ==\n                    Opc.Ua.ReferenceTypeIds.Aggregates.ToString();\n        }\n\n        /// <summary>\n        /// Returns true if this is a hierachical reference.\n        /// A hierarchical reference includes Aggregates but\n        /// also Organizes (folder) or HasEventSource/HasNotifier\n        /// and HasSubtype references\n        /// </summary>\n        /// <param name=\"element\"></param>\n        /// <returns></returns>\n        public static bool IsHierarchicalReference(this RelativePathElementModel element)\n        {\n            return element.ReferenceTypeId ==\n               nameof(Opc.Ua.ReferenceTypes.HierarchicalReferences) ||\n                   element.ReferenceTypeId ==\n                    Opc.Ua.ReferenceTypeIds.HierarchicalReferences.ToString();\n        }\n\n        /// <summary>\n        /// Convert to path object\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"FormatException\"></exception>\n        private static IEnumerable<RelativePathElementModel> Parse(string path)\n        {\n            var index = 0;\n            while (index < path.Length)\n            {\n                //\n                // Parse relative path reference information\n                // This should allow\n                // - \"/targeturi\"\n                // - \".targeturi\"\n                // - \"!.parenturi\"\n                // - \"!/parenturi\"\n                // - \"<!#uri>parenturi\"\n                //\n                var parseReference = false;\n                string? referenceTypeId = null;\n                var inverse = false;\n                var includeSubtypes = true;\n                var exit = false;\n                while (index < path.Length && !exit)\n                {\n                    switch (path[index])\n                    {\n                        case '<':\n                            if (referenceTypeId == null && !parseReference)\n                            {\n                                parseReference = true;\n                                break;\n                            }\n                            throw new FormatException(\"Reference type set.\");\n                        case '!':\n                            inverse = true;\n                            break;\n                        case '#':\n                            includeSubtypes = false;\n                            break;\n                        case '/':\n                            if (referenceTypeId == null && !parseReference)\n                            {\n                                referenceTypeId =\n                                    Opc.Ua.ReferenceTypeIds.HierarchicalReferences.ToString();\n                                break;\n                            }\n                            throw new FormatException(\"Reference type set.\");\n                        case '.':\n                            if (referenceTypeId == null && !parseReference)\n                            {\n                                referenceTypeId =\n                                    Opc.Ua.ReferenceTypeIds.Aggregates.ToString();\n                                break;\n                            }\n                            throw new FormatException(\"Reference type set.\");\n                        default:\n                            if (referenceTypeId == null && !parseReference)\n                            {\n                                throw new FormatException(\n                                    \"No reference type specified.\");\n                            }\n                            exit = true;\n                            break;\n                    }\n                    index++;\n                }\n                index--;\n\n                // Parse the reference type\n                if (parseReference)\n                {\n                    var builder = new StringBuilder();\n                    while (index < path.Length)\n                    {\n                        if (path[index] == '<' && path[index - 1] != '&')\n                        {\n                            throw new FormatException(\n                                \"Reference contains a < which is not allowed.\");\n                        }\n                        if (path[index] == '>' && path[index - 1] != '&')\n                        {\n                            if (index + 1 < path.Length && path[index + 1] == '>')\n                            {\n                                throw new FormatException(\n                                    \"Reference path ends in > followed by >.\");\n                            }\n                            break;\n                        }\n                        if (path[index] != '&' || path[index - 1] == '&')\n                        {\n                            builder.Append(path[index]);\n                        }\n                        index++;\n                        if (index == path.Length)\n                        {\n                            throw new FormatException(\n                                \"Reference path starts in < but does not end in >\");\n                        }\n                    }\n                    index++; // Skip >\n\n                    var reference = builder.ToString();\n                    if (string.IsNullOrEmpty(reference))\n                    {\n                        throw new FormatException(\n                            \"Missed to provide a reference name between < and >.\");\n                    }\n                    if (TypeMaps.ReferenceTypes.Value.TryGetIdentifier(reference,\n                        out var id))\n                    {\n                        referenceTypeId = new Opc.Ua.NodeId(id).ToString();\n                    }\n                    else\n                    {\n                        referenceTypeId = reference;\n                    }\n                }\n\n                // Parse target\n                var target = ExtractTargetName(path, ref index);\n\n                yield return new RelativePathElementModel\n                {\n                    IsInverse = inverse ? true : null,\n                    NoSubtypes = includeSubtypes ? null : true,\n                    ReferenceTypeId = referenceTypeId\n                        ?? throw new FormatException(\"No reference type found\"),\n                    TargetName = target\n                };\n            }\n        }\n\n        /// <summary>\n        /// Extracts a target name which can be escaped with []\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"FormatException\"></exception>\n        private static string ExtractTargetName(string path, ref int index)\n        {\n            if (index >= path.Length)\n            {\n                return string.Empty;\n            }\n            var firstChar = path[index];\n            var lastChar = firstChar;\n            var builder = new StringBuilder();\n            if (firstChar == '[')\n            {\n                index++;\n            }\n            while (index < path.Length)\n            {\n                switch (path[index])\n                {\n                    case '/':\n                    case '.':\n                    case '<':\n                    case '#':\n                    case '!':\n                        if (lastChar == '&')\n                        {\n                            builder.Append(path[index]);\n                            break;\n                        }\n                        // Check whether we are still escaping\n                        if (firstChar == '[' && lastChar != ']')\n                        {\n                            builder.Append(path[index]);\n                            break;\n                        }\n                        // No, we are done.\n                        return builder.ToString();\n                    case ']':\n                    case '&':\n                        break;\n                    default:\n                        if (lastChar == ']')\n                        {\n                            builder.Append(lastChar);\n                        }\n                        builder.Append(path[index]);\n                        break;\n                }\n                lastChar = path[index];\n                index++;\n            }\n            if (firstChar == '[' && lastChar != ']')\n            {\n                throw new FormatException(\n                    \"Sequence escaped with [ not closed with ].\");\n            }\n            // Not escaping and reaching the end\n            return builder.ToString();\n        }\n\n        private static readonly SearchValues<char> kAllowedChars\n            = SearchValues.Create(\"/#.<>!\");\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Parser/SessionParserContext.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Parser\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System.Collections.Generic;\n    using System.Data;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Parser context based on session filter\n    /// </summary>\n    public sealed class SessionParserContext : IFilterParserContext\n    {\n        /// <summary>\n        /// Error occurred during validation\n        /// </summary>\n        public ServiceResultModel? ErrorInfo { get; private set; }\n\n        /// <summary>\n        /// Create context\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"format\"></param>\n        public SessionParserContext(IOpcUaSession session, RequestHeader header,\n            NamespaceFormat format = NamespaceFormat.Index)\n        {\n            _session = session;\n            _header = header;\n            _format = format;\n        }\n\n        /// <inheritdoc/>\n        public async Task<IEnumerable<IdentifierMetaData>> GetIdentifiersAsync(\n            string typeId, CancellationToken ct)\n        {\n            var map = new Dictionary<ImmutableRelativePath, InstanceDeclarationModel>();\n            var declarations = new List<InstanceDeclarationModel>();\n            var nodeId = typeId.ToNodeId(_session.MessageContext);\n            var hierarchy = new List<(NodeId, ReferenceDescription)>();\n\n            // If we failed before, fail again\n            if (ErrorInfo != null)\n            {\n                return [];\n            }\n\n            await _session.CollectTypeHierarchyAsync(_header, nodeId, hierarchy,\n                ct).ConfigureAwait(false);\n            hierarchy.Reverse(); // Start from Root super type\n\n            foreach (var (subType, superType) in hierarchy)\n            {\n                // Only request variables to resolve\n                ErrorInfo = await _session.CollectInstanceDeclarationsAsync(\n                    _header, (NodeId)superType.NodeId, null, declarations,\n                    map, _format, Opc.Ua.NodeClass.Variable, ct).ConfigureAwait(false);\n                if (ErrorInfo != null)\n                {\n                    break;\n                }\n            }\n            if (ErrorInfo == null)\n            {\n                // Collect the variables of the selected type.\n                ErrorInfo = await _session.CollectInstanceDeclarationsAsync(\n                    _header, nodeId, null, declarations, map, _format,\n                    Opc.Ua.NodeClass.Variable, ct).ConfigureAwait(false);\n            }\n            if (ErrorInfo != null)\n            {\n                return [];\n            }\n            return declarations\n                .Where(declaration =>\n                    declaration.RootTypeId != null &&\n                    declaration.BrowsePath != null)\n                .Select(declaration => new IdentifierMetaData(\n                    declaration.RootTypeId!,\n                    declaration.BrowsePath!,\n                    declaration.DisplayPath ?? declaration.BrowseName!));\n        }\n\n        /// <inheritdoc/>\n        public bool TryGetNamespaceUri(uint index, out string? namespaceUri)\n        {\n            namespaceUri = _session.MessageContext.NamespaceUris.GetString(index);\n            return namespaceUri != null;\n        }\n\n        private readonly IOpcUaSession _session;\n        private readonly RequestHeader _header;\n        private readonly NamespaceFormat _format;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"Azure.IIoT.OpcUa.Publisher.Tests\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Runtime/PublisherConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Furly.Extensions.Configuration;\n    using Furly.Extensions.Hosting;\n    using Furly.Extensions.Messaging;\n    using Microsoft.Extensions.Configuration;\n    using Opc.Ua;\n    using System;\n    using System.Configuration;\n    using System.Linq;\n    using System.Net;\n    using System.Runtime.InteropServices;\n    using System.Text;\n\n    /// <summary>\n    /// Publisher configuration\n    /// </summary>\n    public sealed class PublisherConfig : PostConfigureOptionBase<PublisherOptions>\n    {\n        /// <summary>\n        /// Configuration\n        /// </summary>\n        public const string PublisherIdKey = \"PublisherId\";\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        public const string SiteIdKey = \"SiteId\";\n        public const string PublishedNodesFileKey = \"PublishedNodesFile\";\n        public const string UseFileChangePollingKey = \"UseFileChangePolling\";\n        public const string CreatePublishFileIfNotExistKey = \"CreatePublishFileIfNotExist\";\n        public const string MessagingModeKey = \"MessagingMode\";\n        public const string MessageEncodingKey = \"MessageEncoding\";\n        public const string FullFeaturedMessageKey = \"FullFeaturedMessage\";\n        public const string UseStandardsCompliantEncodingKey = \"UseStandardsCompliantEncoding\";\n        public const string MethodTopicTemplateKey = \"MethodTopicTemplate\";\n        public const string RootTopicTemplateKey = \"RootTopicTemplate\";\n        public const string TelemetryTopicTemplateKey = \"TelemetryTopicTemplate\";\n        public const string EventsTopicTemplateKey = \"EventsTopicTemplate\";\n        public const string DiagnosticsTopicTemplateKey = \"DiagnosticsTopicTemplate\";\n        public const string DataSetMetaDataTopicTemplateKey = \"DataSetMetaDataTopicTemplate\";\n        public const string SchemaTopicTemplateKey = \"SchemaTopicTemplate\";\n        public const string DefaultWriterGroupPartitionCountKey = \"DefaultWriterGroupPartitionCount\";\n        public const string DefaultMaxMessagesPerPublishKey = \"DefaultMaxMessagesPerPublish\";\n        public const string MaxNetworkMessageSendQueueSizeKey = \"MaxNetworkMessageSendQueueSize\";\n        public const string DiagnosticsIntervalKey = \"DiagnosticsInterval\";\n        public const string DiagnosticsTargetKey = \"DiagnosticsTarget\";\n        public const string BatchSizeKey = \"BatchSize\";\n        public const string BatchTriggerIntervalKey = \"BatchTriggerInterval\";\n        public const string RemoveDuplicatesFromBatchKey = \"RemoveDuplicatesFromBatch\";\n        public const string WriteValueWhenDataSetHasSingleEntryKey = \"WriteValueWhenDataSetHasSingleEntry\";\n        public const string IoTHubMaxMessageSizeKey = \"IoTHubMaxMessageSize\";\n        public const string DebugLogNotificationsKey = \"DebugLogNotifications\";\n        public const string DebugLogEncodedNotificationsKey = \"DebugLogEncodedNotifications\";\n        public const string DebugLogNotificationsFilterKey = \"DebugLogNotificationsFilter\";\n        public const string DebugLogNotificationsWithHeartbeatKey = \"DebugLogNotificationsWithHeartbeat\";\n        public const string MaxNodesPerDataSetKey = \"MaxNodesPerDataSet\";\n        public const string DisableDataSetMetaDataKey = \"DisableDataSetMetaData\";\n        public const string EnableDataSetKeepAlivesKey = \"EnableDataSetKeepAlives\";\n        public const string SendDataSetKeepAlivesAsKeyFrameKey = \"SendDataSetKeepAlivesAsKeyFrame\";\n        public const string DefaultKeyFrameCountKey = \"DefaultKeyFrameCount\";\n        public const string DisableComplexTypeSystemKey = \"DisableComplexTypeSystem\";\n        public const string DisableSessionPerWriterGroupKey = \"DisableSessionPerWriterGroup\";\n        public const string DefaultUseReverseConnectKey = \"DefaultUseReverseConnect\";\n        public const string DisableSubscriptionTransferKey = \"DisableSubscriptionTransfer\";\n        public const string DefaultMetaDataUpdateTimeKey = \"DefaultMetaDataUpdateTime\";\n        public const string ScaleTestCountKey = \"ScaleTestCount\";\n        public const string IgnoreConfiguredPublishingIntervalsKey = \"IgnoreConfiguredPublishingIntervals\";\n        public const string DisableOpenApiEndpointKey = \"DisableOpenApiEndpoint\";\n        public const string DefaultNamespaceFormatKey = \"DefaultNamespaceFormat\";\n        public const string MessageTimestampKey = \"MessageTimestamp\";\n        public const string EnableRuntimeStateReportingKey = \"RuntimeStateReporting\";\n        public const string RuntimeStateRoutingInfoKey = \"RuntimeStateRoutingInfo\";\n        public const string EnableDataSetRoutingInfoKey = \"EnableRoutingInfo\";\n        public const string EnableCloudEventsKey = \"EnableCloudEvents\";\n        public const string ForceCredentialEncryptionKey = \"ForceCredentialEncryption\";\n        public const string RenewTlsCertificateOnStartupKey = \"RenewTlsCertificateOnStartup\";\n        public const string DefaultTransportKey = \"DefaultTransport\";\n        public const string DefaultQualityOfServiceKey = \"DefaultQualityOfService\";\n        public const string DefaultMessageTimeToLiveKey = \"DefaultMessageTimeToLive\";\n        public const string DefaultMessageRetentionKey = \"DefaultMessageRetention\";\n        public const string DefaultDataSetRoutingKey = \"DefaultDataSetRouting\";\n        public const string ApiKeyOverrideKey = \"ApiKey\";\n        public const string PublishMessageSchemaKey = \"PublishMessageSchema\";\n        public const string AsyncMetaDataLoadTimeoutKey = \"AsyncMetaDataLoadTimeout\";\n        public const string PreferAvroOverJsonSchemaKey = \"PreferAvroOverJsonSchema\";\n        public const string SchemaNamespaceKey = \"SchemaNamespace\";\n        public const string DisableResourceMonitoringKey = \"DisableResourceMonitoring\";\n        public const string HttpServerPortKey = \"HttpServerPort\";\n        public const string UnsecureHttpServerPortKey = \"UnsecureHttpServerPort\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n\n        /// <summary>\n        /// Variables in templates\n        /// </summary>\n        public const string PublisherIdVariableName = \"PublisherId\";\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        public const string RootTopicVariableName = \"RootTopic\";\n        public const string TelemetryTopicVariableName = \"TelemetryTopic\";\n        public const string DataSetWriterGroupVariableName = \"DataSetWriterGroup\";\n        public const string WriterGroupVariableName = \"WriterGroup\";\n        public const string WriterGroupIdVariableName = \"WriterGroupId\";\n        public const string DataSetWriterNameVariableName = \"DataSetWriterName\";\n        public const string DataSetWriterVariableName = \"DataSetWriter\";\n        public const string DataSetNameVariableName = \"DataSetName\";\n        public const string DataSetTopicPathVariableName = \"DataSetTopicPath\";\n        public const string DataSetWriterIdVariableName = \"DataSetWriterId\";\n        public const string DataSetFieldIdVariableName = \"DataSetFieldId\";\n        public const string DataSetClassIdVariableName = \"DataSetClassId\";\n        public const string EventNameVariableName = \"EventName\";\n        public const string EventContextVariableName = \"EventContext\";\n        public const string EventSourceVariableName = \"EventSource\";\n        public const string EncodingVariableName = \"Encoding\";\n        public const string ClusterNamespaceVariableName = \"ClusterNamespace\";\n        public const string ClusterHostVariableName = \"ClusterHost\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n\n        /// <summary>\n        /// Default values\n        /// </summary>\n        public const string TelemetryTopicTemplateDefault =\n            $\"{{{RootTopicVariableName}}}/messages/{{{WriterGroupVariableName}}}\";\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        public const string MethodTopicTemplateDefault =\n            $\"{{{RootTopicVariableName}}}/methods\";\n        public const string EventsTopicTemplateDefault =\n            $\"{{{RootTopicVariableName}}}/{{{EventSourceVariableName}}}/{{{EventNameVariableName}}}\";\n        public const string MetadataTopicTemplateDefault =\n            $\"{{{TelemetryTopicVariableName}}}/metadata\";\n        public const string DiagnosticsTopicTemplateDefault =\n            $\"{{{RootTopicVariableName}}}/diagnostics/{{{WriterGroupVariableName}}}\";\n        public const string RootTopicTemplateDefault =\n            $\"{{{PublisherIdVariableName}}}\";\n        public const string RootTopicTemplateCluster =\n            $\"{{{ClusterNamespaceVariableName}}}/{{{PublisherIdVariableName}}}\";\n        public const string SchemaTopicTemplateDefault =\n            $\"{{{TelemetryTopicVariableName}}}/schema\";\n        public const string PublishedNodesFileDefault = \"publishednodes.json\";\n        public const string RuntimeStateRoutingInfoDefault = \"runtimeinfo\";\n        public const bool EnableRuntimeStateReportingDefault = false;\n        public const bool UseStandardsCompliantEncodingDefault = false;\n        public const bool EnableDataSetRoutingInfoDefault = false;\n        public const bool EnableCloudEventsDefault = false;\n        public const MessageEncoding MessageEncodingDefault = MessageEncoding.Json;\n        public const int MaxNodesPerDataSetDefault = 1000;\n        public const int BatchSizeLegacyDefault = 50;\n        public const int MaxNetworkMessageSendQueueSizeDefault = 4096;\n        public const int BatchTriggerIntervalLLegacyDefaultMillis = 10 * 1000;\n        public const int AsyncMetaDataLoadTimeoutDefaultMillis = 5 * 1000;\n        public const int DiagnosticsIntervalDefaultMillis = 60 * 1000;\n        public const int ScaleTestCountDefault = 1;\n        public const bool IgnoreConfiguredPublishingIntervalsDefault = false;\n        public const bool DisableSessionPerWriterGroupDefault = false;\n        public static readonly int UnsecureHttpServerPortDefault = IsContainer && IsRunningAsRoot ? 80 : 9071;\n        public static readonly int HttpServerPortDefault = IsContainer && IsRunningAsRoot ? 443 : 9072;\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n\n        /// <inheritdoc/>\n        public override void PostConfigure(string? name, PublisherOptions options)\n        {\n            options.DisableResourceMonitoring ??= GetBoolOrNull(DisableResourceMonitoringKey);\n            options.PublisherId ??= GetStringOrDefault(PublisherIdKey,\n                    _identity?.Identity ?? Dns.GetHostName());\n\n            options.SiteId ??= GetStringOrDefault(SiteIdKey);\n\n            options.PublishedNodesFile ??= GetStringOrDefault(PublishedNodesFileKey);\n            options.UseFileChangePolling ??= GetBoolOrNull(UseFileChangePollingKey);\n\n            if (options.DefaultTransport == null && Enum.TryParse<WriterGroupTransport>(\n                GetStringOrDefault(DefaultTransportKey), out var transport))\n            {\n                options.DefaultTransport = transport;\n            }\n\n            options.UseStandardsCompliantEncoding ??= GetBoolOrDefault(\n                    UseStandardsCompliantEncodingKey, UseStandardsCompliantEncodingDefault);\n\n            if (options.MessagingProfile == null)\n            {\n                if (!Enum.TryParse<MessagingMode>(GetStringOrDefault(MessagingModeKey),\n                    out var messagingMode))\n                {\n                    messagingMode = options.UseStandardsCompliantEncoding == true ?\n                        MessagingMode.PubSub : MessagingMode.Samples;\n                }\n\n                if (GetBoolOrDefault(FullFeaturedMessageKey, false))\n                {\n                    if (messagingMode == MessagingMode.PubSub)\n                    {\n                        messagingMode = MessagingMode.FullNetworkMessages;\n                    }\n                    if (messagingMode == MessagingMode.Samples)\n                    {\n                        messagingMode = MessagingMode.FullSamples;\n                    }\n                }\n\n                if (!Enum.TryParse<MessageEncoding>(GetStringOrDefault(MessageEncodingKey),\n                    out var messageEncoding))\n                {\n                    messageEncoding = MessageEncodingDefault;\n                }\n\n                if (!MessagingProfile.IsSupported(messagingMode, messageEncoding))\n                {\n                    var supported = MessagingProfile.Supported\n                        .Select(p => $\"\\n(--mm {p.MessagingMode} and --me {p.MessageEncoding})\")\n                        .Aggregate((a, b) => $\"{a}, {b}\");\n                    throw new ConfigurationErrorsException(\n                        \"The specified combination of --mm, and --me is not (yet) supported.\" +\n                        $\" Currently supported combinations are: {supported}\");\n                }\n                options.MessagingProfile = MessagingProfile.Get(messagingMode, messageEncoding);\n            }\n\n            options.CreatePublishFileIfNotExist ??= GetBoolOrNull(\n                    CreatePublishFileIfNotExistKey);\n\n            options.RenewTlsCertificateOnStartup ??= GetBoolOrNull(\n                    RenewTlsCertificateOnStartupKey);\n\n            if (options.MaxNodesPerDataSet == 0)\n            {\n                options.MaxNodesPerDataSet = GetIntOrDefault(MaxNodesPerDataSetKey,\n                    MaxNodesPerDataSetDefault);\n            }\n\n            //\n            // Default to batch size of 50 if not using strict encoding and a\n            // transport was not specified to support backcompat with 2.8\n            //\n            options.BatchSize ??= GetIntOrDefault(BatchSizeKey,\n                    options.UseStandardsCompliantEncoding == true ||\n                    options.DefaultTransport != null ? 0 : BatchSizeLegacyDefault);\n\n            if (options.BatchTriggerInterval == null)\n            {\n                //\n                // Default to batch interval of 10 seconds if not using strict encoding\n                // and a transport was not specified to support backcompat with 2.8\n                //\n                options.BatchTriggerInterval = GetDurationOrNull(BatchTriggerIntervalKey) ??\n                    TimeSpan.FromMilliseconds(GetIntOrDefault(BatchTriggerIntervalKey,\n                        options.UseStandardsCompliantEncoding == true ||\n                        options.DefaultTransport != null ? 0 : BatchTriggerIntervalLLegacyDefaultMillis));\n            }\n\n            options.WriteValueWhenDataSetHasSingleEntry\n                ??= GetBoolOrNull(WriteValueWhenDataSetHasSingleEntryKey);\n            options.RemoveDuplicatesFromBatch ??= GetBoolOrNull(RemoveDuplicatesFromBatchKey);\n\n            options.MaxNetworkMessageSendQueueSize ??= GetIntOrDefault(MaxNetworkMessageSendQueueSizeKey,\n                    MaxNetworkMessageSendQueueSizeDefault);\n\n            options.DefaultWriterGroupPartitions ??= GetIntOrNull(DefaultWriterGroupPartitionCountKey);\n            options.IgnoreConfiguredPublishingIntervals ??= GetBoolOrDefault(IgnoreConfiguredPublishingIntervalsKey,\n                    IgnoreConfiguredPublishingIntervalsDefault);\n\n            if (options.TopicTemplates.Root == null)\n            {\n                options.TopicTemplates.Root = GetStringOrDefault(\n                    RootTopicTemplateKey, options.IsAzureIoTOperationsConnector != null ?\n                        RootTopicTemplateCluster : RootTopicTemplateDefault);\n            }\n\n            if (options.TopicTemplates.Method == null)\n            {\n                options.TopicTemplates.Method = GetStringOrDefault(\n                    MethodTopicTemplateKey, MethodTopicTemplateDefault);\n            }\n\n            if (options.TopicTemplates.Events == null)\n            {\n                options.TopicTemplates.Events = GetStringOrDefault(\n                    EventsTopicTemplateKey, EventsTopicTemplateDefault);\n            }\n\n            if (options.TopicTemplates.Diagnostics == null)\n            {\n                options.TopicTemplates.Diagnostics = GetStringOrDefault(\n                    DiagnosticsTopicTemplateKey, DiagnosticsTopicTemplateDefault);\n            }\n\n            if (options.TopicTemplates.Telemetry == null)\n            {\n                options.TopicTemplates.Telemetry = GetStringOrDefault(\n                    TelemetryTopicTemplateKey,\n                        TelemetryTopicTemplateDefault);\n            }\n\n            if (options.TopicTemplates.DataSetMetaData == null)\n            {\n                options.TopicTemplates.DataSetMetaData = GetStringOrDefault(\n                    DataSetMetaDataTopicTemplateKey);\n            }\n\n            if (options.TopicTemplates.Schema == null)\n            {\n                options.TopicTemplates.Schema = GetStringOrDefault(\n                    SchemaTopicTemplateKey, SchemaTopicTemplateDefault);\n            }\n\n            options.DisableOpenApiEndpoint ??= GetBoolOrNull(DisableOpenApiEndpointKey);\n\n            options.EnableRuntimeStateReporting ??= GetBoolOrDefault(\n                    EnableRuntimeStateReportingKey, EnableRuntimeStateReportingDefault);\n\n            options.RuntimeStateRoutingInfo ??= GetStringOrDefault(\n                    RuntimeStateRoutingInfoKey, RuntimeStateRoutingInfoDefault);\n\n            options.ScaleTestCount ??= GetIntOrDefault(ScaleTestCountKey,\n                    ScaleTestCountDefault);\n\n            if (options.DebugLogNotificationsFilter == null)\n            {\n                options.DebugLogNotificationsFilter =\n                    GetStringOrDefault(DebugLogNotificationsFilterKey);\n                options.DebugLogNotifications ??=\n                    (options.DebugLogNotificationsFilter != null ? true : null);\n            }\n\n            if (options.DebugLogNotificationsWithHeartbeat == null)\n            {\n                options.DebugLogNotificationsWithHeartbeat =\n                    GetBoolOrDefault(DebugLogNotificationsWithHeartbeatKey);\n                options.DebugLogNotifications ??= options.DebugLogNotifications;\n            }\n\n            options.DebugLogNotifications ??= GetBoolOrDefault(DebugLogNotificationsKey);\n            options.DebugLogEncodedNotifications ??= GetBoolOrDefault(DebugLogEncodedNotificationsKey);\n\n            if (options.DiagnosticsInterval == null)\n            {\n                options.DiagnosticsInterval = GetDurationOrNull(DiagnosticsIntervalKey) ??\n                   TimeSpan.FromMilliseconds(GetIntOrDefault(DiagnosticsIntervalKey,\n                       DiagnosticsIntervalDefaultMillis));\n            }\n\n            if (options.DiagnosticsTarget == null)\n            {\n                if (!Enum.TryParse<PublisherDiagnosticTargetType>(\n                    GetStringOrDefault(DiagnosticsTargetKey), out var target))\n                {\n                    target = PublisherDiagnosticTargetType.Logger;\n                }\n                options.DiagnosticsTarget = target;\n            }\n\n            options.EnableCloudEvents ??= GetBoolOrDefault(\n                    EnableCloudEventsKey, EnableCloudEventsDefault);\n            options.EnableDataSetRoutingInfo ??= GetBoolOrDefault(\n                    EnableDataSetRoutingInfoKey, EnableDataSetRoutingInfoDefault);\n\n            options.ForceCredentialEncryption ??= GetBoolOrDefault(\n                    ForceCredentialEncryptionKey);\n\n            options.MaxNetworkMessageSize ??= GetIntOrNull(IoTHubMaxMessageSizeKey);\n\n            options.DefaultMaxDataSetMessagesPerPublish ??= (uint?)GetIntOrNull(\n                    DefaultMaxMessagesPerPublishKey);\n\n            if (options.DefaultQualityOfService == null)\n            {\n                if (!Enum.TryParse<QoS>(GetStringOrDefault(DefaultQualityOfServiceKey),\n                    out var qos))\n                {\n                    qos = QoS.AtLeastOnce;\n                }\n                options.DefaultQualityOfService = qos;\n            }\n\n            if (options.DefaultMessageTimeToLive == null)\n            {\n                var ttl = GetIntOrNull(DefaultMessageTimeToLiveKey);\n                options.DefaultMessageTimeToLive = ttl.HasValue ?\n                    TimeSpan.FromMilliseconds(ttl.Value) : GetDurationOrNull(\n                        DefaultMessageTimeToLiveKey);\n            }\n            options.DefaultMessageRetention = GetBoolOrNull(DefaultMessageRetentionKey);\n\n            if (options.MessageTimestamp == null)\n            {\n                if (!Enum.TryParse<MessageTimestamp>(GetStringOrDefault(MessageTimestampKey),\n                    out var messageTimestamp))\n                {\n                    messageTimestamp = MessageTimestamp.CurrentTimeUtc;\n                }\n                options.MessageTimestamp = messageTimestamp;\n            }\n\n            if (options.DefaultNamespaceFormat == null)\n            {\n                if (!Enum.TryParse<NamespaceFormat>(GetStringOrDefault(DefaultNamespaceFormatKey),\n                    out var namespaceFormat))\n                {\n                    namespaceFormat = options.UseStandardsCompliantEncoding == true ?\n                        NamespaceFormat.Expanded : NamespaceFormat.Uri;\n                }\n                options.DefaultNamespaceFormat = namespaceFormat;\n            }\n\n            options.UnsecureHttpServerPort ??= GetIntOrNull(\n                    UnsecureHttpServerPortKey, UnsecureHttpServerPortDefault);\n            options.HttpServerPort ??= GetIntOrNull(\n                    HttpServerPortKey, HttpServerPortDefault);\n\n            options.ApiKeyOverride ??= GetStringOrDefault(ApiKeyOverrideKey);\n\n            if (options.DefaultDataSetRouting == null &&\n                Enum.TryParse<DataSetRoutingMode>(GetStringOrDefault(DefaultDataSetRoutingKey),\n                    out var routingMode))\n            {\n                options.DefaultDataSetRouting = routingMode;\n            }\n\n            var schemaNamespace = GetStringOrDefault(SchemaNamespaceKey);\n            var avroPreferred = GetBoolOrNull(PreferAvroOverJsonSchemaKey);\n            if (schemaNamespace != null || avroPreferred != null ||\n                GetBoolOrDefault(PublishMessageSchemaKey))\n            {\n                options.SchemaOptions ??= new SchemaOptions();\n            }\n            if (options.SchemaOptions != null)\n            {\n                options.SchemaOptions.Namespace ??= schemaNamespace;\n                options.SchemaOptions.PreferAvroOverJsonSchema ??= avroPreferred;\n            }\n\n            options.DisableComplexTypeSystem ??= GetBoolOrNull(DisableComplexTypeSystemKey);\n            options.DisableDataSetMetaData = options.DisableComplexTypeSystem;\n            // Set a default from the strict setting\n            options.DisableDataSetMetaData ??= GetBoolOrDefault(DisableDataSetMetaDataKey,\n                !(options.UseStandardsCompliantEncoding ?? false));\n            var metaDataEnabled = options.SchemaOptions != null || options.DisableDataSetMetaData != true;\n            if (metaDataEnabled)\n            {\n                // Always turn on complex type system for schema publishing\n                options.DisableComplexTypeSystem = false;\n            }\n            if (options.DefaultMetaDataUpdateTime == null && metaDataEnabled)\n            {\n                options.DefaultMetaDataUpdateTime = GetDurationOrNull(DefaultMetaDataUpdateTimeKey);\n            }\n            if (options.AsyncMetaDataLoadTimeout == null && metaDataEnabled)\n            {\n                options.AsyncMetaDataLoadTimeout = GetDurationOrDefault(AsyncMetaDataLoadTimeoutKey,\n                    TimeSpan.FromMilliseconds(AsyncMetaDataLoadTimeoutDefaultMillis));\n            }\n            options.EnableDataSetKeepAlives ??= GetBoolOrDefault(EnableDataSetKeepAlivesKey);\n            options.SendDataSetKeepAlivesAsKeyFrame ??= GetBoolOrDefault(SendDataSetKeepAlivesAsKeyFrameKey);\n            options.DefaultKeyFrameCount ??= (uint?)GetIntOrNull(DefaultKeyFrameCountKey);\n\n            options.DisableSessionPerWriterGroup ??= GetBoolOrDefault(DisableSessionPerWriterGroupKey,\n                    DisableSessionPerWriterGroupDefault);\n\n            options.DefaultUseReverseConnect ??= GetBoolOrNull(DefaultUseReverseConnectKey);\n            options.DisableSubscriptionTransfer ??= GetBoolOrNull(DisableSubscriptionTransferKey);\n        }\n\n        /// <summary>\n        /// Running as root\n        /// </summary>\n        public static bool IsRunningAsRoot => StringComparer.OrdinalIgnoreCase.Equals(\n            Environment.UserName, \"root\");\n\n        /// <summary>\n        /// Running in container\n        /// </summary>\n        public static bool IsContainer => StringComparer.OrdinalIgnoreCase.Equals(\n            Environment.GetEnvironmentVariable(\"DOTNET_RUNNING_IN_CONTAINER\")\n                ?? string.Empty, \"true\");\n\n        /// <summary>\n        /// Create configurator\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"identity\"></param>\n        public PublisherConfig(IConfiguration configuration, IProcessIdentity? identity = null)\n                : base(configuration)\n        {\n            _identity = identity;\n        }\n\n        /// <summary>\n        /// Publisher version\n        /// </summary>\n        public static string Version { get; } =\n            new StringBuilder(ThisAssembly.AssemblyInformationalVersion)\n#if DEBUG\n                .Append(\" [DEBUG]\")\n#endif\n                .Append(\" (\")\n                .Append(RuntimeInformation.FrameworkDescription)\n                .Append('/')\n                .Append(AppContext.GetData(\"RUNTIME_IDENTIFIER\") as string\n                    ?? RuntimeInformation.ProcessArchitecture.ToString())\n                .Append(\"/OPC Stack \")\n                .Append(typeof(SessionChannel).Assembly.GetReleaseVersion().ToString())\n                .Append(')')\n                .ToString();\n\n        private readonly IProcessIdentity? _identity;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Runtime/PublisherOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Furly.Extensions.Messaging;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Publisher configuration\n    /// </summary>\n    public sealed class PublisherOptions\n    {\n        /// <summary>\n        /// Publisher id\n        /// </summary>\n        public string? PublisherId { get; set; }\n\n        /// <summary>\n        /// Site of the publisher\n        /// </summary>\n        public string? SiteId { get; set; }\n\n        /// <summary>\n        /// Configuration file\n        /// </summary>\n        public string? PublishedNodesFile { get; set; }\n\n        /// <summary>\n        /// Poll changes instead of using file watcher\n        /// </summary>\n        public bool? UseFileChangePolling { get; set; }\n\n        /// <summary>\n        /// Create the configuration file if it does not exist\n        /// </summary>\n        public bool? CreatePublishFileIfNotExist { get; set; }\n\n        /// <summary>\n        /// Create a new ssl certificate on startup\n        /// </summary>\n        public bool? RenewTlsCertificateOnStartup { get; set; }\n\n        /// <summary>\n        /// Max number of nodes per data set (publishing\n        /// endpoint inside the configuration of publisher)\n        /// </summary>\n        public int MaxNodesPerDataSet { get; set; }\n\n        /// <summary>\n        /// Messaging profile to use as default inside the\n        /// publisher.\n        /// </summary>\n        public MessagingProfile? MessagingProfile { get; set; }\n\n        /// <summary>\n        /// Default max notifications to queue up until a\n        /// network message is generated. Defaults to 1 if\n        /// no writer group publishing interval is specified.\n        /// Otherwise 4096 which is heuristically large enough\n        /// to let the publishing interval clear the queue.\n        /// </summary>\n        public int? BatchSize { get; set; }\n\n        /// <summary>\n        /// Writer group publishing interval cycle. This is\n        /// the timeout until a network message is generated\n        /// from the queue of notifications.\n        /// </summary>\n        public TimeSpan? BatchTriggerInterval { get; set; }\n\n        /// <summary>\n        /// Whether to remove duplicate values from the batch\n        /// of monitored item samples if samples mode is used.\n        /// </summary>\n        public bool? RemoveDuplicatesFromBatch { get; set; }\n\n        /// <summary>\n        /// Default maximum network message size to use.\n        /// </summary>\n        public int? MaxNetworkMessageSize { get; set; }\n\n        /// <summary>\n        /// ChannelDiagnostics interval\n        /// </summary>\n        public TimeSpan? DiagnosticsInterval { get; set; }\n\n        /// <summary>\n        /// How to emit diagnostics\n        /// </summary>\n        public PublisherDiagnosticTargetType? DiagnosticsTarget { get; set; }\n\n        /// <summary>\n        /// Log ingress notifications to informational log\n        /// </summary>\n        public bool? DebugLogNotifications { get; set; }\n\n        /// <summary>\n        /// Filter to apply to the notifications before adding to log\n        /// </summary>\n        public string? DebugLogNotificationsFilter { get; set; }\n\n        /// <summary>\n        /// Include heartbeats in ingess logs\n        /// </summary>\n        public bool? DebugLogNotificationsWithHeartbeat { get; set; }\n\n        /// <summary>\n        /// Log encoded notifications to informational log\n        /// </summary>\n        public bool? DebugLogEncodedNotifications { get; set; }\n\n        /// <summary>\n        /// Define the maximum number of network messages in the\n        /// send part of the publish queue of the writer group.\n        /// </summary>\n        public int? MaxNetworkMessageSendQueueSize { get; set; }\n\n        /// <summary>\n        /// Max number of publish queue partitions the writer group\n        /// should be split into.\n        /// </summary>\n        public int? DefaultWriterGroupPartitions { get; set; }\n\n        /// <summary>\n        /// Flag to use reversible encoding for messages\n        /// </summary>\n        public bool? UseStandardsCompliantEncoding { get; set; }\n\n        /// <summary>\n        /// Instead of a dataset with a single entry, Write only the\n        /// value without key when possible.\n        /// </summary>\n        public bool? WriteValueWhenDataSetHasSingleEntry { get; set; }\n\n        /// <summary>\n        /// The message timestamp to use\n        /// </summary>\n        public MessageTimestamp? MessageTimestamp { get; set; }\n\n        /// <summary>\n        /// Default topic templates\n        /// </summary>\n        public TopicTemplatesOptions TopicTemplates { get; } = new TopicTemplatesOptions();\n\n        /// <summary>\n        /// Allowed transports for all events and diagnostics targets. If empty all\n        /// configured event clients are used.\n        /// </summary>\n        public HashSet<WriterGroupTransport> AllowedEventAndDiagnosticsTransports { get; } = new();\n\n        /// <summary>\n        /// Default transport to use if not found\n        /// </summary>\n        public WriterGroupTransport? DefaultTransport { get; set; }\n\n        /// <summary>\n        /// Default quality of service for messages\n        /// </summary>\n        public QoS? DefaultQualityOfService { get; set; }\n\n        /// <summary>\n        /// Default message time to live\n        /// </summary>\n        public TimeSpan? DefaultMessageTimeToLive { get; set; }\n\n        /// <summary>\n        /// Default whether to set message retain flag\n        /// </summary>\n        public bool? DefaultMessageRetention { get; set; }\n\n        /// <summary>\n        /// Default Max data set messages per published network\n        /// message.\n        /// </summary>\n        public uint? DefaultMaxDataSetMessagesPerPublish { get; set; }\n\n        /// <summary>\n        /// Configuration flag for enabling/disabling\n        /// runtime state reporting.\n        /// </summary>\n        public bool? EnableRuntimeStateReporting { get; set; }\n\n        /// <summary>\n        /// The routing info to add to the runtime state\n        /// events.\n        /// </summary>\n        public string? RuntimeStateRoutingInfo { get; set; }\n\n        /// <summary>\n        /// Never load the complex type system from any session.\n        /// This disables metadata loading capability but also\n        /// the ability to encode complex types.\n        /// </summary>\n        public bool? DisableComplexTypeSystem { get; set; }\n\n        /// <summary>\n        /// Whether to enable or disable data set metadata explicitly\n        /// </summary>\n        public bool? DisableDataSetMetaData { get; set; }\n\n        /// <summary>\n        /// Default metadata send interval.\n        /// </summary>\n        public TimeSpan? DefaultMetaDataUpdateTime { get; set; }\n\n        /// <summary>\n        /// Timeout to block the first message after a metadata\n        /// change is causing the load of the new metadata.\n        /// </summary>\n        public TimeSpan? AsyncMetaDataLoadTimeout { get; set; }\n\n        /// <summary>\n        /// Flag to send messages with cloud events header\n        /// </summary>\n        public bool? EnableCloudEvents { get; set; }\n\n        /// <summary>\n        /// Enable adding data set routing info to message headers\n        /// Only applies if EnableCloudEvents is not true.\n        /// </summary>\n        public bool? EnableDataSetRoutingInfo { get; set; }\n\n        /// <summary>\n        /// Whether to enable or disable keep alive messages\n        /// </summary>\n        public bool? EnableDataSetKeepAlives { get; set; }\n\n        /// <summary>\n        /// Whether to send keep alive messages as key frames\n        /// or as regular keep alive messages.\n        /// </summary>\n        public bool? SendDataSetKeepAlivesAsKeyFrame { get; set; }\n\n        /// <summary>\n        /// Default keyframe count\n        /// </summary>\n        public uint? DefaultKeyFrameCount { get; set; }\n\n        /// <summary>\n        /// Disable creating a separate session per writer group. This\n        /// will re-use sessions across writer groups. Default is to\n        /// create a seperate session.\n        /// </summary>\n        public bool? DisableSessionPerWriterGroup { get; set; }\n\n        /// <summary>\n        /// Always default to use or not use reverse connect\n        /// unless overridden by the configuration.\n        /// </summary>\n        public bool? DefaultUseReverseConnect { get; set; }\n\n        /// <summary>\n        /// Disable subscription transfer on reconnect.\n        /// </summary>\n        public bool? DisableSubscriptionTransfer { get; set; }\n\n        /// <summary>\n        /// Force encryption of credentials in publisher configuration\n        /// or dont store credentials. Default is false.\n        /// </summary>\n        public bool? ForceCredentialEncryption { get; set; }\n\n        /// <summary>\n        /// Optional default node id and qualified name namespace\n        /// format to use when serializing nodes in messages and\n        /// responses.\n        /// </summary>\n        public NamespaceFormat? DefaultNamespaceFormat { get; set; }\n\n        /// <summary>\n        /// Disable open api endpoint\n        /// </summary>\n        public bool? DisableOpenApiEndpoint { get; set; }\n\n        /// <summary>\n        /// Scale test option\n        /// </summary>\n        public int? ScaleTestCount { get; set; }\n\n        /// <summary>\n        /// Ignore all publishing intervals set in the configuration.\n        /// </summary>\n        public bool? IgnoreConfiguredPublishingIntervals { get; set; }\n\n        /// <summary>\n        /// Allow setting or overriding the current api key\n        /// </summary>\n        public string? ApiKeyOverride { get; set; }\n\n        /// <summary>\n        /// Use auto routing based on the opc ua address space\n        /// browse paths.\n        /// </summary>\n        public DataSetRoutingMode? DefaultDataSetRouting { get; set; }\n\n        /// <summary>\n        /// Schema generation options if schema generation is\n        /// enabled.\n        /// </summary>\n        public SchemaOptions? SchemaOptions { get; set; }\n\n        /// <summary>\n        /// Disable resource monitoring\n        /// </summary>\n        public bool? DisableResourceMonitoring { get; set; }\n\n        /// <summary>\n        /// Unsecure port\n        /// </summary>\n        public int? UnsecureHttpServerPort { get; set; }\n\n        /// <summary>\n        /// Secure port\n        /// </summary>\n        public int? HttpServerPort { get; set; }\n\n        /// <summary>\n        /// Publisher runs as Azure IoT Operations connector.\n        /// If null, not running in Azure IoT Operations.\n        /// </summary>\n        public bool? IsAzureIoTOperationsConnector { get; set; }\n\n        /// <summary>\n        /// When discovering device endpoints this is the\n        /// Endpoint type string that publisher should add\n        /// to the endpoints. Default is Microsoft.OpcPublisher.\n        /// Set this to Microsoft.OpcUa to let Azure IoT\n        /// Operations handle the OPC UA discovered endpoints.\n        /// </summary>\n        public string? AioDiscoveredDeviceEndpointType { get; set; }\n\n        /// <summary>\n        /// When discovering device endpoints this is the\n        /// Endpoint type version that publisher should add\n        /// to the endpoints.\n        /// </summary>\n        public string? AioDiscoveredDeviceEndpointTypeVersion { get; set; }\n\n        /// <summary>\n        /// Enables discovery of OPC UA servers on the network\n        /// and reporting as devices to Azure IoT Operations.\n        /// If null, discovery is disabled.\n        /// </summary>\n        public DiscoveryMode? AioNetworkDiscoveryMode { get; set; }\n\n        /// <summary>\n        /// Discovery of OPC UA servers on the network and reporting\n        /// as devices to Azure IoT Operations runs at the configured\n        /// interval. If 0 or null, discovery runs once and\n        /// exits.\n        /// </summary>\n        public TimeSpan? AioNetworkDiscoveryInterval { get; set; }\n\n        /// <summary>\n        /// Configure the discovery behavior of the publisher.\n        /// </summary>\n        public DiscoveryConfigModel AioNetworkDiscovery { get; } = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Runtime/TopicBuilder.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using k8s;\n    using System;\n    using System.Collections.Generic;\n    using System.Text.RegularExpressions;\n\n    /// <summary>\n    /// Topic template support\n    /// </summary>\n    public sealed class TopicBuilder\n    {\n        /// <summary>\n        /// Root topic\n        /// </summary>\n        public string RootTopic\n            => Format(nameof(RootTopic), _templates.Root\n                ?? _options.TopicTemplates.Root);\n\n        /// <summary>\n        /// Method topic\n        /// </summary>\n        public string MethodTopic\n            => Format(nameof(MethodTopic), _templates.Method\n                ?? _options.TopicTemplates.Method);\n\n        /// <summary>\n        /// Events topic\n        /// </summary>\n        public string EventsTopic\n            => Format(nameof(EventsTopic), _templates.Events\n                ?? _options.TopicTemplates.Events);\n\n        /// <summary>\n        /// ChannelDiagnostics topic\n        /// </summary>\n        public string DiagnosticsTopic\n            => Format(nameof(DiagnosticsTopic), _templates.Diagnostics\n                ?? _options.TopicTemplates.Diagnostics);\n\n        /// <summary>\n        /// Telemetry topic\n        /// </summary>\n        public string TelemetryTopic\n            => Format(nameof(TelemetryTopic), _templates.Telemetry\n                ?? _options.TopicTemplates.Telemetry);\n\n        /// <summary>\n        /// Default metadata topic\n        /// </summary>\n        public string DataSetMetaDataTopic\n            => Format(nameof(DataSetMetaDataTopic), _templates.DataSetMetaData\n                ?? _options.TopicTemplates.DataSetMetaData);\n\n        /// <summary>\n        /// Default schema topic\n        /// </summary>\n        public string SchemaTopic\n            => Format(nameof(SchemaTopic), _templates.Schema\n                ?? _options.TopicTemplates.Schema);\n\n        /// <summary>\n        /// Create builder\n        /// </summary>\n        /// <param name=\"options\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <param name=\"templates\"></param>\n        /// <param name=\"variables\"></param>\n        public TopicBuilder(PublisherOptions options,\n            MessageEncoding? encoding = null, TopicTemplatesOptions? templates = null,\n            IEnumerable<KeyValuePair<string, string>>? variables = null)\n        {\n            _options = options;\n            _templates = templates ?? options.TopicTemplates;\n            _variables = new Dictionary<string, Func<Formatter, string>>\n            {\n                { nameof(TelemetryTopic),\n                    f => f.Format(_templates.Telemetry\n                        ?? _options.TopicTemplates.Telemetry) },\n                { nameof(RootTopic),\n                    f => f.Format(_templates.Root\n                        ?? _options.TopicTemplates.Root) },\n                { nameof(EventsTopic),\n                    f => f.Format(_templates.Events\n                        ?? _options.TopicTemplates.Events) },\n                { PublisherConfig.EncodingVariableName,\n                    _ => (encoding\n                        ?? MessageEncoding.Json).ToString() },\n                { nameof(options.SiteId),\n                    _ => options.SiteId\n                        ?? Constants.DefaultSiteId },\n                { nameof(options.PublisherId),\n                    _ => options.PublisherId\n                        ?? options.SiteId\n                        ?? Constants.DefaultPublisherId }\n            };\n            if (KubernetesClientConfiguration.IsInCluster())\n            {\n                _variables.AddOrUpdate(PublisherConfig.ClusterNamespaceVariableName,\n                    _ => KubernetesClientConfiguration.InClusterConfig().Namespace);\n                _variables.AddOrUpdate(PublisherConfig.ClusterHostVariableName,\n                    _ => KubernetesClientConfiguration.InClusterConfig().Host);\n            }\n            if (variables != null)\n            {\n                foreach (var kv in variables)\n                {\n                    _variables.AddOrUpdate(kv.Key, _ => kv.Value);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Format template\n        /// </summary>\n        /// <param name=\"topicName\"></param>\n        /// <param name=\"template\"></param>\n        /// <returns></returns>\n        internal string Format(string topicName, string? template)\n        {\n            return new Formatter(topicName, _variables).Format(template);\n        }\n\n        private sealed class Formatter\n        {\n            /// <summary>\n            /// Unused variables\n            /// </summary>\n            public Dictionary<string, Func<Formatter, string>> Variables { get; }\n\n            public Formatter(string topicName,\n                Dictionary<string, Func<Formatter, string>> variables)\n            {\n                Variables = new Dictionary<string, Func<Formatter, string>>(variables,\n                    StringComparer.OrdinalIgnoreCase);\n                // Remove topic name from formatter resolver to not recurse into itself\n                Variables.Remove(topicName);\n            }\n\n            /// <summary>\n            /// Format topic\n            /// </summary>\n            /// <param name=\"template\"></param>\n            /// <returns></returns>\n            public string Format(string? template)\n            {\n                if (template == null)\n                {\n                    return string.Empty;\n                }\n#pragma warning disable SYSLIB1045 // Convert to 'GeneratedRegexAttribute'.\n                return Regex.Replace(template, \"{([^}]+)}\", m =>\n                {\n                    if (Variables.TryGetValue(m.Groups[1].Value, out var v))\n                    {\n                        Variables.Remove(m.Groups[1].Value);\n                        return v.Invoke(this);\n                    }\n                    return m.Groups[1].Value;\n                });\n#pragma warning restore SYSLIB1045 // Convert to 'GeneratedRegexAttribute'.\n            }\n        }\n\n        private readonly PublisherOptions _options;\n        private readonly TopicTemplatesOptions _templates;\n        private readonly Dictionary<string, Func<Formatter, string>> _variables;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Runtime/TopicTemplatesOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher\n{\n    /// <summary>\n    /// Topic templates\n    /// </summary>\n    public sealed record class TopicTemplatesOptions\n    {\n        /// <summary>\n        /// Root topic template\n        /// </summary>\n        public string? Root { get; set; }\n\n        /// <summary>\n        /// Method topic template\n        /// </summary>\n        public string? Method { get; set; }\n\n        /// <summary>\n        /// Events topic template\n        /// </summary>\n        public string? Events { get; set; }\n\n        /// <summary>\n        /// Diagnostics topic template\n        /// </summary>\n        public string? Diagnostics { get; set; }\n\n        /// <summary>\n        /// Telemetry topic template\n        /// </summary>\n        public string? Telemetry { get; set; }\n\n        /// <summary>\n        /// Default metadata queue name\n        /// </summary>\n        public string? DataSetMetaData { get; set; }\n\n        /// <summary>\n        /// Default schema topic when schemas are published\n        /// </summary>\n        public string? Schema { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/AssetDeviceIntegration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Discovery;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.Iot.Operations.Connector;\n    using Azure.Iot.Operations.Connector.Files;\n    using Azure.Iot.Operations.Services.AssetAndDeviceRegistry.Models;\n    using Azure.Iot.Operations.Services.SchemaRegistry.SchemaRegistry;\n    using Furly.Azure.IoT.Operations.Services;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Nito.AsyncEx;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Globalization;\n    using System.IO;\n    using System.IO.Compression;\n    using System.Linq;\n    using System.Text;\n    using System.Text.Json;\n    using System.Text.Json.Serialization;\n    using System.Text.RegularExpressions;\n    using System.Threading;\n    using System.Threading.Channels;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Asset and device configuration integration with Azure iot operations. Converts asset\n    /// and device notifications into published nodes representation and signals configuration\n    /// status errors back.\n    /// </summary>\n    public sealed partial class AssetDeviceIntegration : IAioSrCallbacks, IAsyncDisposable, IDisposable\n    {\n        /// <summary>\n        /// Currently known assets\n        /// </summary>\n        internal IEnumerable<AssetResource> Assets => _assets.Values;\n\n        /// <summary>\n        /// Currently known devices\n        /// </summary>\n        internal IEnumerable<DeviceResource> Devices => _devices.Values;\n\n        /// <summary>\n        /// Create Akri and asset and device registry integration service\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"schemaRegistry\"></param>\n        /// <param name=\"publishedNodes\"></param>\n        /// <param name=\"configurationServices\"></param>\n        /// <param name=\"connections\"></param>\n        /// <param name=\"discovery\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"logger\"></param>\n        public AssetDeviceIntegration(IAioAdrClient client, IAioSrClient schemaRegistry,\n            IPublishedNodesServices publishedNodes, IConfigurationServices configurationServices,\n            IConnectionServices<ConnectionModel> connections, IDiscoveryServices discovery,\n            IJsonSerializer serializer, IOptions<PublisherOptions> options,\n            ILogger<AssetDeviceIntegration> logger)\n        {\n            _client = client;\n            _publishedNodes = publishedNodes;\n            _configurationServices = configurationServices;\n            _connections = connections;\n            _discovery = discovery;\n            _serializer = serializer;\n            _options = options;\n            _logger = logger;\n            _cts = new CancellationTokenSource();\n            _client.OnDeviceChanged += OnDeviceChanged;\n            _client.OnAssetChanged += OnAssetChanged;\n            _schemaRegistry = schemaRegistry;\n            _srevents = schemaRegistry.Register(this);\n            _changeFeed = Channel.CreateUnbounded<(string, Resource)>(new UnboundedChannelOptions\n            {\n                SingleReader = true,\n                SingleWriter = false\n            });\n            _processor = Task.Factory.StartNew(() => RunAsync(_cts.Token), _cts.Token,\n                TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap();\n            _trigger = new AsyncManualResetEvent();\n            _timer = new Timer(_ => _trigger.Set());\n            _assetDiscovery = Task.Factory.StartNew(() => RunAssetDiscoveryAsync(_cts.Token), _cts.Token,\n                TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap();\n            _deviceDiscovery = Task.Factory.StartNew(() => RunDeviceDiscoveryAsync(_cts.Token), _cts.Token,\n                TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask DisposeAsync()\n        {\n            if (_isDisposed)\n            {\n                return;\n            }\n            _isDisposed = true;\n            try\n            {\n                await _cts.CancelAsync().ConfigureAwait(false);\n                _changeFeed.Writer.TryComplete();\n                _timer.Dispose();\n                try\n                {\n                    await _assetDiscovery.ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.FailedToCloseDiscoveryRunner(ex);\n                }\n                try\n                {\n                    await _processor.ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.FailedToCloseConversionProcessor(ex);\n                }\n                try\n                {\n                    await _deviceDiscovery.ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.FailedToCloseDiscoveryRunner(ex);\n                }\n            }\n            finally\n            {\n                _srevents.Dispose();\n                _cts.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            DisposeAsync().AsTask().GetAwaiter().GetResult();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask OnSchemaRegisteredAsync(\n            Furly.Extensions.Messaging.IEventSchema schema, Schema registration,\n            CancellationToken ct)\n        {\n            if (registration.Name == null ||\n                registration.Namespace == null ||\n                registration.Version == null)\n            {\n                _logger.SchemaRegistrationInvalidValues();\n                return;\n            }\n\n            if (schema.Id == null)\n            {\n                _logger.CannotRegisterSchemaWithoutIdentifier();\n                return;\n            }\n\n            var pos = schema.Id.IndexOf('|', StringComparison.Ordinal);\n            if (pos < 3)\n            {\n                _logger.MalformedSchemaId(schema.Id);\n                return;\n            }\n            var assetName = schema.Id.Substring(0, pos);\n            var resourceName = schema.Id.Substring(pos + 1);\n            _logger.RegisteringSchema(registration.Name, registration.Version, resourceName,\n                assetName, registration.Namespace);\n            var reference = new MessageSchemaReference\n            {\n                SchemaName = registration.Name,\n                SchemaRegistryNamespace = registration.Namespace,\n                SchemaVersion = registration.Version\n            };\n            var assetResource = _assets.Values\n                .FirstOrDefault(a => a.Asset.DisplayName == assetName);\n            if (assetResource == null)\n            {\n                // Fall backs - see below\n                assetResource = _assets.Values.FirstOrDefault(a => a.Asset.Model == assetName)\n                    ?? _assets.Values.FirstOrDefault(a => a.AssetName == assetName);\n            }\n            if (assetResource == null)\n            {\n                _logger.NoAssetFoundForSchema(assetName, schema.Name);\n                return;\n            }\n\n            assetName = assetResource.AssetName; // Set known asset name;\n            var deviceName = assetResource.Asset.DeviceRef.DeviceName;\n            var endpoint = assetResource.Asset.DeviceRef.EndpointName;\n            Debug.Assert(deviceName != null);\n            Debug.Assert(endpoint != null);\n\n            AssetDatasetEventStreamStatus? dataSetStatus = null;\n            AssetEventGroupStatus? eventGroupStatus = null;\n            var dataSet = assetResource.Asset.Datasets?.Find(d => d.Name == resourceName);\n            if (dataSet != null)\n            {\n                dataSetStatus = new AssetDatasetEventStreamStatus\n                {\n                    Name = dataSet.Name,\n                    MessageSchemaReference = reference\n                };\n            }\n            else\n            {\n                var @event = assetResource.Asset.EventGroups?\n                    .Select(eg => (eg, eg.Events?.Find(e => e.Name == resourceName)!))\n                    .FirstOrDefault(t => t.Item2 != null);\n                if (@event != null)\n                {\n                    eventGroupStatus = new AssetEventGroupStatus\n                    {\n                        Events = [\n                            new AssetDatasetEventStreamStatus\n                            {\n                                Name = @event.Value.Item2.Name,\n                                MessageSchemaReference = reference\n                            }\n                        ]\n                    };\n                }\n            }\n            if (eventGroupStatus == null && dataSetStatus == null)\n            {\n                _logger.NoResourceFoundInAssetForSchema(resourceName, assetName, schema.Name);\n                return;\n            }\n            try\n            {\n                for (var i = 0; ; i++)\n                {\n                    try\n                    {\n                        await _client.UpdateAssetStatusAsync(deviceName, endpoint, assetName, new AssetStatus\n                        {\n                            Datasets = dataSetStatus != null ? [dataSetStatus] : null,\n                            EventGroups = eventGroupStatus != null ? [eventGroupStatus] : null\n                        }, ct: ct).ConfigureAwait(false);\n\n                        _logger.RegisteredSchema(registration.Name, registration.Version, resourceName,\n                            assetName, registration.Namespace);\n                        break;\n                    }\n                    catch (Exception e) when (i < 3 && !ct.IsCancellationRequested)\n                    {\n                        _logger.RegisteredSchemaErrorDebug(e, registration.Name, registration.Version,\n                            resourceName, assetName, registration.Namespace);\n                    }\n                }\n            }\n            catch (Exception ex) when (!ct.IsCancellationRequested)\n            {\n                _logger.RegisteredSchemaError(ex, registration.Name, registration.Version, resourceName,\n                    assetName, registration.Namespace);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Asset change handler\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        /// <exception cref=\"ArgumentOutOfRangeException\"></exception>\n        internal void OnAssetChanged(object? sender, AssetChangedEventArgs e)\n        {\n            if (string.IsNullOrEmpty(e.DeviceName) ||\n                string.IsNullOrEmpty(e.InboundEndpointName) ||\n                string.IsNullOrEmpty(e.AssetName))\n            {\n                _logger.InvalidAssetChangeEventReceived(e.ChangeType, e.DeviceName,\n                    e.InboundEndpointName, e.AssetName);\n                return;\n            }\n            switch (e.ChangeType)\n            {\n                case ChangeType.Created:\n                    OnAssetCreated(e.DeviceName, e.InboundEndpointName, e.AssetName, e.Asset!);\n                    break;\n                case ChangeType.Updated:\n                    OnAssetUpdated(e.DeviceName, e.InboundEndpointName, e.AssetName, e.Asset!);\n                    break;\n                case ChangeType.Deleted:\n                    OnAssetDeleted(e.DeviceName, e.InboundEndpointName, e.AssetName);\n                    break;\n                default:\n                    throw new ArgumentOutOfRangeException(nameof(e), e.ChangeType,\n                        \"Unknown asset change type\");\n            }\n        }\n\n        /// <summary>\n        /// Device change handler\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        /// <exception cref=\"ArgumentOutOfRangeException\"></exception>\n        internal void OnDeviceChanged(object? sender, DeviceChangedEventArgs e)\n        {\n            if (string.IsNullOrEmpty(e.DeviceName) ||\n                string.IsNullOrEmpty(e.InboundEndpointName))\n            {\n                _logger.InvalidDeviceChangeEventReceived(e.ChangeType, e.DeviceName,\n                    e.InboundEndpointName);\n                return;\n            }\n            switch (e.ChangeType)\n            {\n                case ChangeType.Created:\n                    OnDeviceCreated(e.DeviceName, e.InboundEndpointName, e.Device!);\n                    break;\n                case ChangeType.Updated:\n                    OnDeviceUpdated(e.DeviceName, e.InboundEndpointName, e.Device!);\n                    break;\n                case ChangeType.Deleted:\n                    OnDeviceDeleted(e.DeviceName, e.InboundEndpointName);\n                    break;\n                default:\n                    throw new ArgumentOutOfRangeException(nameof(e), e.ChangeType,\n                        \"Unknown device change type\");\n            }\n        }\n\n        /// <summary>\n        /// Handle device created\n        /// </summary>\n        /// <param name=\"deviceName\"></param>\n        /// <param name=\"inboundEndpointName\"></param>\n        /// <param name=\"device\"></param>\n        internal void OnDeviceCreated(string deviceName, string inboundEndpointName,\n            Device device)\n        {\n            var name = CreateDeviceKey(deviceName, inboundEndpointName);\n            var deviceResource = new DeviceResource(deviceName, device);\n            var cur = _devices.AddOrUpdate(name, deviceResource,\n                (_, cur) => device.Version == cur.Device.Version ? cur : deviceResource);\n            if (!ReferenceEquals(cur, deviceResource))\n            {\n                // Update has same version as what we already have\n                return;\n            }\n            _logger.DeviceAdded(deviceName, inboundEndpointName);\n            Interlocked.Increment(ref _lastDeviceListVersion);\n            var success = _changeFeed.Writer.TryWrite((name, deviceResource));\n            ObjectDisposedException.ThrowIf(!success,\n                $\"Failed to process creation of device {name}\");\n        }\n\n        /// <summary>\n        /// Handle device updated\n        /// </summary>\n        /// <param name=\"deviceName\"></param>\n        /// <param name=\"inboundEndpointName\"></param>\n        /// <param name=\"device\"></param>\n        internal void OnDeviceUpdated(string deviceName, string inboundEndpointName,\n            Device device)\n        {\n            var name = CreateDeviceKey(deviceName, inboundEndpointName);\n            var deviceResource = new DeviceResource(deviceName, device);\n            var cur = _devices.AddOrUpdate(name, deviceResource,\n                (_, cur) => device.Version == cur.Device.Version ? cur : deviceResource);\n            if (!ReferenceEquals(cur, deviceResource))\n            {\n                // Update has same version as what we already have\n                return;\n            }\n            _logger.DeviceUpdated(deviceName, inboundEndpointName);\n            Interlocked.Increment(ref _lastDeviceListVersion);\n            var success = _changeFeed.Writer.TryWrite((name, deviceResource));\n            ObjectDisposedException.ThrowIf(!success,\n                $\"Failed to process update of device {name}\");\n        }\n\n        /// <summary>\n        /// Handle device deletion\n        /// </summary>\n        /// <param name=\"deviceName\"></param>\n        /// <param name=\"inboundEndpointName\"></param>\n        internal void OnDeviceDeleted(String deviceName, String inboundEndpointName)\n        {\n            var name = CreateDeviceKey(deviceName, inboundEndpointName);\n            if (!_devices.TryRemove(name, out var deviceResource))\n            {\n                _logger.ResourceDeletionNotFound(name);\n                return;\n            }\n            _logger.DeviceRemoved(deviceName, inboundEndpointName);\n            Interlocked.Increment(ref _lastDeviceListVersion);\n            var success = _changeFeed.Writer.TryWrite((name, deviceResource));\n            ObjectDisposedException.ThrowIf(!success,\n                $\"Failed to publish deletion of {name}.\");\n        }\n\n        /// <summary>\n        /// Handle asset created\n        /// </summary>\n        /// <param name=\"deviceName\"></param>\n        /// <param name=\"inboundEndpointName\"></param>\n        /// <param name=\"assetName\"></param>\n        /// <param name=\"asset\"></param>\n        internal void OnAssetCreated(string deviceName, string inboundEndpointName,\n            string assetName, Asset asset)\n        {\n            var name = CreateAssetKey(deviceName, inboundEndpointName, assetName);\n            var assetResource = new AssetResource(assetName, asset);\n            var cur = _assets.AddOrUpdate(name, assetResource,\n                (_, cur) => asset.Version == cur.Asset.Version ? cur : assetResource);\n            if (!ReferenceEquals(cur, assetResource))\n            {\n                // Update has same version as what we already have\n                return;\n            }\n            _logger.AssetAdded(assetName, deviceName, inboundEndpointName);\n            var success = _changeFeed.Writer.TryWrite((name, assetResource));\n            ObjectDisposedException.ThrowIf(!success,\n                $\"Failed to publish creation of asset {name}.\");\n        }\n\n        /// <summary>\n        /// Handle asset updated\n        /// </summary>\n        /// <param name=\"deviceName\"></param>\n        /// <param name=\"inboundEndpointName\"></param>\n        /// <param name=\"assetName\"></param>\n        /// <param name=\"asset\"></param>\n        internal void OnAssetUpdated(string deviceName, string inboundEndpointName,\n            string assetName, Asset asset)\n        {\n            var name = CreateAssetKey(deviceName, inboundEndpointName, assetName);\n            var assetResource = new AssetResource(assetName, asset);\n            var cur = _assets.AddOrUpdate(name, assetResource,\n                (_, cur) => asset.Version == cur.Asset.Version ? cur : assetResource);\n            if (!ReferenceEquals(cur, assetResource))\n            {\n                // Update has same version as what we already have\n                return;\n            }\n            _logger.AssetUpdated(assetName, deviceName, inboundEndpointName);\n            var success = _changeFeed.Writer.TryWrite((name, assetResource));\n            ObjectDisposedException.ThrowIf(!success,\n                $\"Failed to publish update of asset {name}.\");\n        }\n\n        /// <summary>\n        /// Handle asset deletion\n        /// </summary>\n        /// <param name=\"deviceName\"></param>\n        /// <param name=\"inboundEndpointName\"></param>\n        /// <param name=\"assetName\"></param>\n        internal void OnAssetDeleted(string deviceName, string inboundEndpointName,\n            string assetName)\n        {\n            var name = CreateAssetKey(deviceName, inboundEndpointName, assetName);\n            if (!_assets.TryRemove(name, out var asseteResource))\n            {\n                _logger.ResourceDeletionNotFound(name);\n                return;\n            }\n            _logger.AssetRemoved(assetName, deviceName, inboundEndpointName);\n            var success = _changeFeed.Writer.TryWrite((name, asseteResource));\n            ObjectDisposedException.ThrowIf(!success,\n                $\"Failed to publish deletion of asset {name}.\");\n        }\n\n        /// <summary>\n        /// Monitors the change events produced as result of the notifications and then\n        /// processes the current state.\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async Task RunAsync(CancellationToken ct)\n        {\n            try\n            {\n                // Read changes in batches\n                while (!ct.IsCancellationRequested)\n                {\n                    var updatesReceived = false;\n                    var deviceAddedOrUpdated = false;\n                    while (_changeFeed.Reader.TryRead(out var change))\n                    {\n                        (var name, var resource) = change;\n                        switch (resource)\n                        {\n                            case AssetResource asset:\n                                if (!_assets.ContainsKey(name))\n                                {\n                                    await _client.StopMonitoringAssetsAsync(\n                                        asset.Asset.DeviceRef.DeviceName,\n                                        asset.Asset.DeviceRef.EndpointName, ct).ConfigureAwait(false);\n                                }\n                                else\n                                {\n                                    await _client.StartMonitoringAssetsAsync(\n                                        asset.Asset.DeviceRef.DeviceName,\n                                        asset.Asset.DeviceRef.EndpointName, ct).ConfigureAwait(false);\n                                }\n                                break;\n                            case DeviceResource device:\n                                if (device.Device.Endpoints?.Inbound != null)\n                                {\n                                    foreach (var endpoint in device.Device.Endpoints.Inbound.Keys)\n                                    {\n                                        if (!_devices.ContainsKey(name))\n                                        {\n                                            // Removed, stop monitoring assets and clear asset list\n                                            await _client.StopMonitoringAssetsAsync(device.DeviceName,\n                                                endpoint, ct).ConfigureAwait(false);\n                                        }\n                                        else\n                                        {\n                                            await _client.StartMonitoringAssetsAsync(device.DeviceName,\n                                                endpoint, ct).ConfigureAwait(false);\n                                            deviceAddedOrUpdated = true;\n                                        }\n                                    }\n                                }\n                                break;\n                            default:\n                                Debug.Fail(\"Should not happen\");\n                                break;\n                        }\n                        updatesReceived = true;\n                    }\n\n                    // Process changes\n                    if (updatesReceived)\n                    {\n                        // Reconcile devices with assets - remove assets without devices or endpoints\n                        foreach (var (name, asset) in _assets)\n                        {\n                            var key = CreateDeviceKey(\n                                asset.Asset.DeviceRef.DeviceName,\n                                asset.Asset.DeviceRef.EndpointName);\n                            if (!_devices.ContainsKey(key))\n                            {\n                                _logger.RemovingAssetWithoutDevice(name, key);\n                                _assets.TryRemove(name, out var _);\n                                await _client.StopMonitoringAssetsAsync(\n                                    asset.Asset.DeviceRef.DeviceName,\n                                    asset.Asset.DeviceRef.EndpointName, ct).ConfigureAwait(false);\n                            }\n                        }\n\n                        // Convert assets to published nodes entries and update configuration\n                        var assets = _assets.Values.ToList();\n                        if (assets.Count > 0)\n                        {\n                            var errors = new ValidationErrors(this);\n                            var devices = _devices.Values.ToList();\n\n                            _logger.ConvertingAssetsOnDevices(assets.Count, devices.Count);\n                            var entries = await ToPublishedNodesAsync(devices, assets, errors,\n                                ct).ConfigureAwait(false);\n\n                            // Report all errors\n                            await errors.ReportAsync(ct).ConfigureAwait(false);\n\n                            // Apply configuration\n                            await _publishedNodes.SetConfiguredEndpointsAsync(entries,\n                                ct).ConfigureAwait(false);\n                            if (_logger.IsDebugLogConfigurationEnabled())\n                            {\n                                _logger.NewConfigurationApplied(\n                                    _serializer.SerializeToString(entries, SerializeOption.Indented));\n                            }\n                            _logger.AssetsAndDevicesUpdated(assets.Count, devices.Count);\n                        }\n                    }\n                    if (deviceAddedOrUpdated)\n                    {\n                        _logger.DevicesUpdatedStartingDiscovery();\n                        // TODO Make period configurable\n                        _timer.Change(TimeSpan.Zero, kDefaultDeviceDiscoveryRefresh);\n                    }\n                    await _changeFeed.Reader.WaitToReadAsync(ct).ConfigureAwait(false);\n                }\n            }\n            catch (OperationCanceledException) { }\n            catch (ObjectDisposedException) { }\n            catch (Exception ex)\n            {\n                _logger.UnexpectedErrorProcessingChanges(ex);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Discover assets\n        /// </summary>\n        /// <param name=\"resource\"></param>\n        /// <param name=\"endpointConfiguration\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async ValueTask RunDiscoveryUsingTypesAsync(DeviceEndpointResource resource,\n            DeviceEndpointConfiguration endpointConfiguration, ValidationErrors errors,\n            CancellationToken ct)\n        {\n            if (resource.Device.Endpoints == null ||\n                !TryGetInboundEndpoint(resource.Device.Endpoints, resource.EndpointName, out var endpoint))\n            {\n                errors.OnError(resource, kDeviceNotFoundErrorCode, \"Endpoint was not found\");\n                return; // throw\n            }\n\n            Debug.Assert(endpointConfiguration.AssetTypes != null);\n            // endpoint\n            var assetEndpoint = new PublishedNodesEntryModel\n            {\n                EndpointUrl = GetEndpointUrl(endpoint.Address),\n                EndpointSecurityMode = endpointConfiguration.EndpointSecurityMode,\n                EndpointSecurityPolicy = endpointConfiguration.EndpointSecurityPolicy,\n                DumpConnectionDiagnostics = endpointConfiguration.DumpConnectionDiagnostics,\n                DisableSubscriptionTransfer = endpointConfiguration.DisableSubscriptionTransfer,\n                UseReverseConnect = endpointConfiguration.UseReverseConnect\n            };\n            var credentials = _client.GetEndpointCredentials(resource.DeviceName,\n                resource.EndpointName, endpoint);\n            assetEndpoint = AddEndpointCredentials(assetEndpoint, credentials, errors,\n                resource);\n\n            // Find all assets that comply with the provided types.\n            var assetEntries = new List<PublishedNodesEntryModel>();\n            foreach (var type in endpointConfiguration.AssetTypes.Distinct())\n            {\n                var template = assetEndpoint with\n                {\n                    // Expand the type - TODO, we could also pass all types here at once\n                    OpcNodes = [new OpcNodeModel { Id = type }]\n                };\n                await foreach (var found in _configurationServices.ExpandAsync(template,\n                    new PublishedNodeExpansionModel\n                    {\n                        CreateSingleWriter = false, // Writer per dataset\n                        ExcludeRootIfInstanceNode = false,\n                        DiscardErrors = true,\n                        IncludeMethods = true,\n                        FlattenTypeInstance = false,\n                        NoSubTypesOfTypeNodes = false,\n                        UseBrowseNameAsDisplayName = true\n                    }, ct).ConfigureAwait(false))\n                {\n                    if (found.ErrorInfo != null)\n                    {\n                        // Add to cumulative log\n                        errors.OnError(resource, kDiscoveryError, AsString(found.ErrorInfo));\n                        continue;\n                    }\n                    if (found.Result?.OpcNodes == null ||\n                        found.Result.OpcNodes.Count == 0 ||\n                        found.Result.DataSetWriterGroup == null ||\n                        found.Result.WriterGroupRootNodeId == null ||\n                        found.Result.WriterGroupType == null)\n                    {\n                        if (_logger.IsDebugLogConfigurationEnabled())\n                        {\n                            _logger.DroppingResultWithoutRequiredInformation(\n                                _serializer.SerializeToString(found.Result));\n                        }\n                        else\n                        {\n                            _logger.DroppingResultWithoutRequiredInformation(\n                                found.Result?.DataSetName);\n                        }\n                        continue;\n                    }\n                    assetEntries.Add(found.Result);\n                }\n            }\n\n            // Convert assets to dAsset and report them as found. We group the assets per name\n            // and asset type ref. We resolve the duplicate names later from the hashset\n            var uniqueAssetNames = new HashSet<string>();\n            foreach (var (assetName, assetId, assetTypeRef, opcNodes) in assetEntries\n                .GroupBy(e => (\n                    AssetName: e.DataSetWriterGroup!,\n                    AssetId: e.WriterGroupRootNodeId!,\n                    AssetTypeRef: e.WriterGroupType!\n                ))\n                .Select(group => (\n                    group.Key.AssetName,\n                    group.Key.AssetId,\n                    group.Key.AssetTypeRef,\n                    group.ToList())))\n            {\n                var uniqueId = \"-\" + (resource.DeviceName + assetId).ToSha1Hash();\n                var assetResourceName = MakeValidArmResourceName(assetName, uniqueId).TrimEnd('-')\n                    + uniqueId;\n                var uniqueAssetName = assetResourceName;\n                // Ensure unique asset names\n                for (var i = 1; !uniqueAssetNames.Add(uniqueAssetName); i++)\n                {\n                    uniqueAssetName = assetResourceName + i;\n                }\n                // ensure no duplicate datasets and datapoints (names) are added into the asset\n                var distinctEntries = opcNodes\n                    .GroupBy(entry => entry.DataSetName)\n                    .SelectMany(group => group.Select((d, i) => d with\n                    {\n                        DataSetName = i == 0 ? d.DataSetName : d.DataSetName + \".\" + i,\n                        OpcNodes = d.OpcNodes!\n                            .GroupBy(n => n.DisplayName)\n                            .SelectMany(group => group.Select((n, i) => n with\n                            {\n                                DisplayName = i == 0 ? n.DisplayName : n.DisplayName + \".\" + i\n                            }))\n                            .ToList()\n                    }))\n                    .ToList();\n\n                var distinctDatasets = distinctEntries\n                    .Select(entry => entry with\n                    {\n                        OpcNodes = entry.OpcNodes!\n                            .Where(n => n.AttributeId != NodeAttribute.EventNotifier &&\n                                n.MethodMetadata == null)\n                            .ToList(),\n                    })\n                    .Where(d => d.OpcNodes!.Count > 0)\n                    .ToList();\n                var distinctEventGroups = distinctEntries\n                    .Select(entry => entry with\n                    {\n                        OpcNodes = entry.OpcNodes!\n                            .Where(n => n.AttributeId == NodeAttribute.EventNotifier &&\n                                n.MethodMetadata == null)\n                            .ToList(),\n                    })\n                    .Where(d => d.OpcNodes!.Count > 0)\n                    .ToList();\n                var distinctManagementGroups = distinctEntries\n                    .Select(entry => entry with\n                    {\n                        OpcNodes = entry.OpcNodes!\n                            .Where(n => n.MethodMetadata != null)\n                            .ToList(),\n                    })\n                    .Where(d => d.OpcNodes!.Count > 0)\n                    .ToList();\n                var dAsset = new DiscoveredAsset\n                {\n                    DeviceRef = new AssetDeviceRef\n                    {\n                        DeviceName = resource.DeviceName,\n                        EndpointName = resource.EndpointName\n                    },\n                    Attributes = new Dictionary<string, string>\n                    {\n                        [kAssetIdAttribute] = assetId\n                    },\n                    // AssetName = uniqueAssetName,\n                    ExternalAssetId = assetId,\n                    DisplayName = assetName,\n                    Model = assetName,\n                    Description = null, // TODO\n                    AssetTypeRefs = [assetTypeRef],\n                    DefaultDatasetsDestinations =\n                    [\n                        new DatasetDestination\n                        {\n                            Target = DatasetTarget.Mqtt,\n                            Configuration = new DestinationConfiguration\n                            {\n                                Qos = _options.Value.DefaultQualityOfService\n                                    == Furly.Extensions.Messaging.QoS.AtMostOnce ? QoS.Qos0 : QoS.Qos1,\n                                Topic = CreateTopic(),\n                                Retain = _options.Value.DefaultMessageRetention\n                                    == true ? Retain.Keep : Retain.Never,\n                                Ttl = (ulong?)_options.Value.DefaultMessageTimeToLive?.TotalSeconds\n                            }\n                        }\n                    ],\n                    DefaultEventsDestinations = null,\n                    DefaultStreamsDestinations = null,\n                    DefaultDatasetsConfiguration = null,\n                    DefaultEventsConfiguration = null,\n                    DefaultStreamsConfiguration = null,\n                    DefaultManagementGroupsConfiguration = null,\n                    Datasets = distinctDatasets.ConvertAll(d => new DiscoveredAssetDataset\n                    {\n                        Name = GetAssetResourceName(d.DataSetName),\n                        TypeRef = d.DataSetType,\n                        DataSource = d.DataSetRootNodeId,\n                        DataSetConfiguration = null,\n                        DataPoints = d.OpcNodes!.Select(n => new DiscoveredAssetDatasetDataPoint\n                        {\n                            Name = n.DisplayName!, // Name of property in message/schema\n                            DataSource = n.Id!,\n                            DataPointConfiguration = null,\n                            TypeRef = n.TypeDefinitionId\n                        }).ToList()\n#if OLD\n                        ,Destinations =\n                        [\n                            new DatasetDestination\n                            {\n                                Target = DatasetTarget.Mqtt,\n                                Configuration = new DestinationConfiguration\n                                {\n                                    Qos = _options.Value.DefaultQualityOfService\n                                        == Furly.Extensions.Messaging.QoS.AtMostOnce ? QoS.Qos0 : QoS.Qos1,\n                                    Topic = CreateTopic(),\n                                    Retain = _options.Value.DefaultMessageRetention\n                                        == true ? Retain.Keep : Retain.Never,\n                                    Ttl = (ulong?)_options.Value.DefaultMessageTimeToLive?.TotalSeconds\n                                }\n                            }\n                        ]\n#endif\n                    }),\n                    EventGroups = distinctEventGroups.ConvertAll(d => new DiscoveredAssetEventGroup\n                    {\n                        Name = GetAssetResourceName(d.DataSetName),\n                        TypeRef = d.DataSetType,\n                        DataSource = d.DataSetRootNodeId,\n                        EventGroupConfiguration = null,\n                        DefaultEventsDestinations = null,\n                        Events = d.OpcNodes!.Select(n => new DiscoveredAssetEvent\n                        {\n                            Name = n.DisplayName!, // Event name\n                            DataSource = n.Id!, // EventNotifier node id\n                            TypeRef = n.TypeDefinitionId,\n                            EventConfiguration = null,\n                            Destinations =\n                            [\n                                new EventStreamDestination\n                                {\n                                    Target = EventStreamTarget.Mqtt,\n                                    Configuration = new DestinationConfiguration\n                                    {\n                                        Qos = _options.Value.DefaultQualityOfService\n                                            == Furly.Extensions.Messaging.QoS.AtMostOnce ? QoS.Qos0 : QoS.Qos1,\n                                        Topic = CreateTopic(n.DisplayName),\n                                        Retain = _options.Value.DefaultMessageRetention\n                                            == true ? Retain.Keep : Retain.Never,\n                                        Ttl = (ulong?)_options.Value.DefaultMessageTimeToLive?.TotalSeconds\n                                    }\n                                }\n                            ]\n                        }).ToList()\n                    }),\n                    ManagementGroups = distinctManagementGroups.ConvertAll(d => new DiscoveredAssetManagementGroup\n                    {\n                        Name = GetAssetResourceName(d.DataSetName),\n                        TypeRef = d.DataSetType,\n                        DefaultTimeoutInSeconds = null,\n                        DataSource = d.DataSetRootNodeId,\n                        DefaultTopic = null,\n                        ManagementGroupConfiguration = null,\n                        Actions = d.OpcNodes!.Select(n => new DiscoveredAssetManagementGroupAction\n                        {\n                            Name = n.DisplayName!, // Name of command in schema\n                            ActionType = AssetManagementGroupActionType.Call,\n                            TargetUri = n.Id!, // Method id of the instance declaration\n                            TypeRef = n.TypeDefinitionId, // Method type ref on the object type ref\n                            TimeoutInSeconds = null,\n                            Topic = CreateTopic(n.DisplayName),\n                            ActionConfiguration = ConvertActionConfiguration(n.MethodMetadata!)\n                        }).ToList()\n                    }),\n                    Streams = null\n                };\n\n                // TODO: Add attributes and other information from properties\n\n                if (_logger.IsDebugLogConfigurationEnabled())\n                {\n                    _logger.ReportingNewDiscoveredAsset(uniqueAssetName, assetId, assetTypeRef,\n                        JsonSerializer.Serialize(dAsset, kDebugSerializerOptions));\n                }\n                await _client.ReportDiscoveredAssetAsync(resource.DeviceName, resource.EndpointName,\n                    uniqueAssetName, dAsset, cancellationToken: ct).ConfigureAwait(false);\n            }\n            static string GetAssetResourceName(string? resourceName, string? innerName = null)\n            {\n                innerName = string.IsNullOrEmpty(innerName) ? null : \".\" + innerName;\n                resourceName = string.IsNullOrWhiteSpace(resourceName)\n                    ? \"Default\" : MakeValidName(resourceName, innerName);\n                return innerName != null ? resourceName + innerName : resourceName;\n            }\n        }\n\n        /// <summary>\n        /// Run endpoint discovery for the given endpoint uri.\n        /// </summary>\n        /// <param name=\"resource\"></param>\n        /// <param name=\"endpointUri\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async ValueTask RunEndpointDiscoveryAsync(DeviceEndpointResource resource,\n            Uri endpointUri, CancellationToken ct)\n        {\n            GetEndpointTypeAndVersion(out var endpointType, out var endpointTypeVersion);\n            var dCurrentDevice = new DiscoveredDevice\n            {\n                ExternalDeviceId = resource.Device.ExternalDeviceId,\n                Model = resource.Device.Model,\n                Manufacturer = resource.Device.Manufacturer,\n                OperatingSystem = resource.Device.OperatingSystem,\n                OperatingSystemVersion = resource.Device.OperatingSystemVersion,\n                Attributes = resource.Device.Attributes\n            };\n\n            // First run endpoint discovery to find endpoints on the current device\n            var endpoints = await _discovery.FindEndpointsAsync(\n                endpointUri, findServersOnNetwork: false, ct: ct).ConfigureAwait(false);\n\n            // Now report all endpoints on the network that are not part of current device\n            var alreadyFound = endpoints\n                .Select(e => e.Description?.Server?.ApplicationUri)\n                .Where(uri => uri != null)\n                .Distinct()\n                .ToHashSet();\n            var servers = await _discovery.FindEndpointsAsync(endpointUri,\n                findServersOnNetwork: true, ct: ct).ConfigureAwait(false);\n            var currentDeviceIsDiscoveryServer = false;\n            foreach (var server in servers\n                .Where(ep => ep.Description?.Server?.ApplicationUri != null &&\n                    !alreadyFound.Contains(ep.Description.Server.ApplicationUri))\n                .GroupBy(ep => ep.Description.Server.ApplicationUri))\n            {\n                var serverEndpoints = server.ToList();\n                Debug.Assert(serverEndpoints.Count > 0);\n                currentDeviceIsDiscoveryServer = true;\n                var applicationDescription = serverEndpoints[0].Description.Server;\n                var serverDeviceId = \"-\" + server.Key.ToSha1Hash();\n                var deviceName = MakeValidArmResourceName(\n                    applicationDescription.ApplicationName.ToString(), serverDeviceId)\n                    .TrimEnd('-') + serverDeviceId;\n                var dServerDevice = new DiscoveredDevice\n                {\n                    ExternalDeviceId = serverDeviceId,\n                    Model = applicationDescription.ProductUri\n                };\n                try\n                {\n                    await ReportDiscoveredDeviceAsync(deviceName, dServerDevice, serverEndpoints,\n                        endpointType, endpointTypeVersion, ct: ct).ConfigureAwait(false);\n                }\n                catch (Exception ex)\n                {\n                    _logger.FailedToReportDiscoveredServer(ex, deviceName);\n                }\n            }\n            // Now update our device\n            dCurrentDevice.Attributes ??= new Dictionary<string, string>();\n            dCurrentDevice.Attributes.AddOrUpdate(\"LDS\", currentDeviceIsDiscoveryServer.ToString());\n            await ReportDiscoveredDeviceAsync(resource.DeviceName, dCurrentDevice, endpoints,\n                endpointType, endpointTypeVersion, resource, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Get endpoint type and version for new endpoints\n        /// </summary>\n        /// <param name=\"endpointType\"></param>\n        /// <param name=\"endpointTypeVersion\"></param>\n        private void GetEndpointTypeAndVersion(out string endpointType, out string? endpointTypeVersion)\n        {\n            var type = _options.Value.AioDiscoveredDeviceEndpointType;\n            endpointTypeVersion = _options.Value.AioDiscoveredDeviceEndpointTypeVersion;\n            if (type == null)\n            {\n                var releaseVersion = GetType().Assembly.GetReleaseVersion();\n                endpointType = \"Microsoft.OpcPublisher\";\n                endpointTypeVersion = $\"{releaseVersion.Major}.{releaseVersion.Minor}\";\n            }\n            else\n            {\n                endpointType = type;\n            }\n        }\n\n        /// <summary>\n        /// Report a new discovered device with the given endpoints\n        /// </summary>\n        /// <param name=\"deviceName\"></param>\n        /// <param name=\"dDevice\"></param>\n        /// <param name=\"endpoints\"></param>\n        /// <param name=\"endpointType\"></param>\n        /// <param name=\"endpointTypeVersion\"></param>\n        /// <param name=\"resource\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async ValueTask ReportDiscoveredDeviceAsync(string deviceName, DiscoveredDevice dDevice,\n            IEnumerable<DiscoveredEndpointModel> endpoints, string endpointType, string? endpointTypeVersion,\n            DeviceEndpointResource? resource = null, CancellationToken ct = default)\n        {\n            var newEndpoints = new Dictionary<string, DiscoveredDeviceInboundEndpoint>(\n                StringComparer.OrdinalIgnoreCase);\n            dDevice.Attributes ??= new Dictionary<string, string>();\n            var newEndpointCount = 0;\n            foreach (var ep in endpoints)\n            {\n                var desc = ep.Description;\n\n                dDevice.Attributes.AddOrUpdate(nameof(desc.Server.ApplicationType),\n                    desc.Server.ApplicationType.ToString());\n                if (desc.Server.ApplicationName?.Text != null)\n                {\n                    dDevice.Attributes.AddOrUpdate(nameof(desc.Server.ApplicationName),\n                        desc.Server.ApplicationName.Text);\n                }\n                if (desc.Server.ApplicationUri != null)\n                {\n                    dDevice.Attributes.AddOrUpdate(nameof(desc.Server.ApplicationUri),\n                        desc.Server.ApplicationUri);\n                }\n                if (desc.Server.ProductUri != null)\n                {\n                    dDevice.Attributes.AddOrUpdate(nameof(desc.Server.ProductUri),\n                        desc.Server.ProductUri);\n                }\n                if (desc.Server.DiscoveryProfileUri != null)\n                {\n                    dDevice.Attributes.AddOrUpdate(nameof(desc.Server.DiscoveryProfileUri),\n                        desc.Server.DiscoveryProfileUri);\n                }\n                if (desc.Server.DiscoveryUrls?.Count > 0)\n                {\n                    dDevice.Attributes.AddOrUpdate(nameof(desc.Server.DiscoveryUrls),\n                        string.Join(',', desc.Server.DiscoveryUrls));\n                }\n                if (desc.Server.GatewayServerUri != null)\n                {\n                    dDevice.Attributes.AddOrUpdate(nameof(desc.Server.GatewayServerUri),\n                        desc.Server.GatewayServerUri);\n                }\n                if (ep.Capabilities != null)\n                {\n                    foreach (var cap in ep.Capabilities)\n                    {\n                        dDevice.Attributes.AddOrUpdate(cap.ToUpperInvariant(), \"True\");\n                    }\n                }\n                var name = desc.SecurityMode.ToString();\n                if (desc.SecurityMode != MessageSecurityMode.None)\n                {\n                    name = $\"l{desc.SecurityLevel}.{name}\";\n                    if (!Uri.TryCreate(desc.SecurityPolicyUri, UriKind.Absolute,\n                        out var securityProfileUri) ||\n                        securityProfileUri.Fragment.Length == 0 ||\n                        securityProfileUri.Fragment[0] != '#')\n                    {\n                        continue;\n                    }\n                    name += $\".{securityProfileUri.Fragment.AsSpan(1)}\";\n                }\n                if (desc.TransportProfileUri != Profiles.UaTcpTransport)\n                {\n                    if (!Uri.TryCreate(desc.TransportProfileUri, UriKind.Absolute,\n                        out var transportProfileUri))\n                    {\n                        continue;\n                    }\n                    var pathParts = transportProfileUri.PathAndQuery.Split('/');\n                    if (pathParts.Length == 0)\n                    {\n                        continue;\n                    }\n                    name += $\".{pathParts[pathParts.Length - 1]}\";\n                }\n                // Add desc.ServerCertificate somewhere\n                var epModel = new DeviceEndpointConfiguration\n                {\n                    Source = \"Discovery\",\n                    EndpointSecurityMode = desc.SecurityMode.ToServiceType(),\n                    EndpointSecurityPolicy = desc.SecurityPolicyUri\n                };\n                var supportedAuthenticationMethods = GetSupportedAuthenticationMethods(desc);\n                var uniqueName = MakeValidArmResourceName(name);\n                if (newEndpoints.ContainsKey(uniqueName))\n                {\n                    continue;\n                }\n                var existing = resource?.Device.Endpoints?.Inbound?.FirstOrDefault(e =>\n                    e.Key.Equals(uniqueName, StringComparison.OrdinalIgnoreCase));\n                if (existing.HasValue && existing.Value.Key != null)\n                {\n                    // Merge discovered into existing endpoint information\n                    if (!string.IsNullOrEmpty(existing.Value.Value.AdditionalConfiguration))\n                    {\n                        // Deserialize existing configuration\n                        var errors = new ValidationErrors(this);\n                        var epModelExisting = Deserialize(existing.Value.Value.AdditionalConfiguration,\n                            () => new DeviceEndpointConfiguration(), errors, resource!);\n                        if (epModelExisting != null)\n                        {\n                            epModelExisting.EndpointSecurityMode ??= epModel.EndpointSecurityMode;\n                            epModelExisting.EndpointSecurityPolicy ??= epModel.EndpointSecurityPolicy;\n                            epModelExisting.Source = \"Discovery\";\n                            epModel = epModelExisting;\n                        }\n                    }\n                    uniqueName = existing.Value.Key; // Keep casing\n#if SKIP_ADDRESS_MISMATCH\n                    if (existing.Value.Value.Address != ep.AccessibleEndpointUrl)\n                    {\n                        continue; // Ignore if address does not match\n                    }\n#endif\n#if SKIP_EXISTING_ENDPOINTS\n                    continue;\n#endif\n                }\n                var additionalConfiguration = _serializer.SerializeToString(epModel);\n                if (additionalConfiguration.Length > 512)\n                {\n                    _logger.EndpointConfigurationTooLong(uniqueName, deviceName,\n                        additionalConfiguration.Length);\n                }\n                newEndpoints.Add(uniqueName, new DiscoveredDeviceInboundEndpoint\n                {\n                    Address = SetEndpointUrl(ep.AccessibleEndpointUrl),\n                    EndpointType = endpointType,\n                    Version = endpointTypeVersion,\n                    SupportedAuthenticationMethods = supportedAuthenticationMethods,\n                    AdditionalConfiguration = additionalConfiguration\n                });\n                newEndpointCount++;\n            }\n\n            if (newEndpointCount == 0)\n            {\n                _logger.NoEndpointsFound(deviceName);\n                return;\n            }\n\n            dDevice.Endpoints = new DiscoveredDeviceEndpoints { Inbound = newEndpoints };\n            if (_logger.IsDebugLogConfigurationEnabled())\n            {\n                _logger.ReportingNewDiscoveredDevice(deviceName, endpointType,\n                    JsonSerializer.Serialize(dDevice, kDebugSerializerOptions));\n            }\n            await _client.ReportDiscoveredDeviceAsync(deviceName, dDevice,\n                endpointType, cancellationToken: ct).ConfigureAwait(false);\n\n            static List<string>? GetSupportedAuthenticationMethods(EndpointDescription desc)\n            {\n                if (desc.UserIdentityTokens == null || desc.UserIdentityTokens.Count == 0)\n                {\n                    return null;\n                }\n                var methods = new HashSet<string>();\n                foreach (var token in desc.UserIdentityTokens)\n                {\n                    switch (token.TokenType)\n                    {\n                        case UserTokenType.Anonymous:\n                            methods.Add(nameof(Method.Anonymous));\n                            break;\n                        case UserTokenType.UserName:\n                            methods.Add(nameof(Method.UsernamePassword));\n                            break;\n                        case UserTokenType.Certificate:\n                            methods.Add(nameof(Method.Certificate));\n                            break;\n                        case UserTokenType.IssuedToken:\n                            // Not supported\n                            break;\n                    }\n                }\n                return methods.ToList();\n            }\n        }\n\n        /// <summary>\n        /// Convert an Asset to a collection of published nodes entries\n        /// </summary>\n        /// <param name=\"devices\"></param>\n        /// <param name=\"assets\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async ValueTask<List<PublishedNodesEntryModel>> ToPublishedNodesAsync(\n            ICollection<DeviceResource> devices, ICollection<AssetResource> assets,\n            ValidationErrors errors, CancellationToken ct)\n        {\n            var entries = new List<PublishedNodesEntryModel>();\n            var deviceLookup = devices.ToLookup(k => k.DeviceName);\n            foreach (var asset in assets)\n            {\n                // Find the device and endpoint referenced by this asset\n                var deviceRef = asset.Asset.DeviceRef;\n                DeviceResource? deviceResource = null;\n                InboundEndpointSchemaMapValue? endpoint = null;\n                foreach (var device in deviceLookup[deviceRef.DeviceName])\n                {\n                    deviceResource = device;\n                    if (string.Equals(device.DeviceName, deviceRef.DeviceName, StringComparison.OrdinalIgnoreCase)\n                        && TryGetInboundEndpoint(device?.Device?.Endpoints, deviceRef.EndpointName, out endpoint))\n                    {\n                        break;\n                    }\n                }\n                if (deviceResource == null)\n                {\n                    errors.OnError(asset, kDeviceNotFoundErrorCode, \"Device referenced by asset was not found\");\n                    continue;\n                }\n                if (endpoint == null)\n                {\n                    errors.OnError(asset, kDeviceNotFoundErrorCode, \"Endpoint referenced by asset was not found\");\n                    continue;\n                }\n                var deviceEndpointResource = new DeviceEndpointResource(deviceResource.DeviceName,\n                    deviceResource.Device, deviceRef.EndpointName);\n                var endpointConfiguration = Deserialize(endpoint.AdditionalConfiguration,\n                    () => new DeviceEndpointConfiguration(), errors, deviceEndpointResource);\n                if (endpointConfiguration == null)\n                {\n                    continue;\n                }\n\n                // Asset identification\n                var assetEndpoint = new PublishedNodesEntryModel\n                {\n                    EndpointUrl = GetEndpointUrl(endpoint.Address),\n                    EndpointSecurityMode = endpointConfiguration.EndpointSecurityMode,\n                    EndpointSecurityPolicy = endpointConfiguration.EndpointSecurityPolicy,\n                    DumpConnectionDiagnostics = endpointConfiguration.DumpConnectionDiagnostics,\n                    DisableSubscriptionTransfer = endpointConfiguration.DisableSubscriptionTransfer,\n                    UseReverseConnect = endpointConfiguration.UseReverseConnect,\n\n                    // We map asset name to writer group as it contains writers for each of its\n                    // entities. This will be split per destination, but this is ok as the name\n                    // is retained and the Id property receives the unique group name.\n                    DataSetWriterGroup = asset.Asset.DisplayName ?? asset.Asset.Model ?? asset.AssetName,\n                    PublisherId = deviceResource.DeviceName,\n                    WriterGroupType = asset.Asset.AssetTypeRefs?.Count == 1 ?\n                        asset.Asset.AssetTypeRefs[0] : null,\n                    WriterGroupRootNodeId = asset.Asset.Attributes == null ?\n                        null : asset.Asset.Attributes.TryGetValue(kAssetIdAttribute, out var rootNodeId) ?\n                        rootNodeId?.ToString() : null,\n                    // And stick all unknown properties and attributes into the new extension section\n                    WriterGroupProperties = CollectAssetAndDeviceProperties(asset, deviceResource)\n\n                    // TODO In WoT side DataSetName is the Asset name. This also needs\n                    // to be fixed over there!\n                };\n                var credentials = _client.GetEndpointCredentials(asset.Asset.DeviceRef.DeviceName,\n                    asset.Asset.DeviceRef.EndpointName, endpoint);\n                assetEndpoint = AddEndpointCredentials(assetEndpoint, credentials, errors,\n                    deviceEndpointResource);\n                if (asset.Asset.Datasets != null)\n                {\n                    var dataSetAdditionalConfiguration = Deserialize(asset.Asset.DefaultDatasetsConfiguration,\n                        () => new PublishedNodesEntryModel { EndpointUrl = string.Empty },\n                        errors, asset);\n                    if (dataSetAdditionalConfiguration != null)\n                    {\n                        dataSetAdditionalConfiguration = WithEndpoint(dataSetAdditionalConfiguration, assetEndpoint);\n                        foreach (var dataset in asset.Asset.Datasets)\n                        {\n                            var datasetResource = new DataSetResource(asset.AssetName, asset.Asset, dataset);\n                            await AddEntryForDataSetAsync(dataSetAdditionalConfiguration, datasetResource,\n                                entries, errors, ct).ConfigureAwait(false);\n                        }\n                    }\n                }\n                if (asset.Asset.EventGroups != null)\n                {\n                    var eventAdditionalConfiguration = Deserialize(asset.Asset.DefaultEventsConfiguration,\n                        () => new PublishedNodesEntryModel { EndpointUrl = string.Empty },\n                        errors, asset);\n                    if (eventAdditionalConfiguration != null)\n                    {\n                        eventAdditionalConfiguration = WithEndpoint(eventAdditionalConfiguration, assetEndpoint);\n                        foreach (var eventGroup in asset.Asset.EventGroups)\n                        {\n                            var eventGroupResource = new EventGroupResource(asset.AssetName, asset.Asset, eventGroup);\n                            await AddEntryForEventGroupAsync(eventAdditionalConfiguration, eventGroupResource,\n                                entries, errors, ct).ConfigureAwait(false);\n                        }\n                    }\n                }\n\n                if (asset.Asset.ManagementGroups != null)\n                {\n                    var managementGroupConfiguration = Deserialize(asset.Asset.DefaultManagementGroupsConfiguration,\n                        () => new PublishedNodesEntryModel { EndpointUrl = string.Empty },\n                        errors, asset);\n                    if (managementGroupConfiguration != null)\n                    {\n                        managementGroupConfiguration = WithEndpoint(managementGroupConfiguration, assetEndpoint);\n                        foreach (var managementGroup in asset.Asset.ManagementGroups)\n                        {\n                            var managementGroupResource = new ManagementGroupResource(asset.AssetName, asset.Asset,\n                                managementGroup);\n                            await AddEntryForManagementGroupAsync(managementGroupConfiguration, managementGroupResource,\n                                entries, errors, ct).ConfigureAwait(false);\n                        }\n                    }\n                }\n\n                if (asset.Asset.Streams != null)\n                {\n                    foreach (var stream in asset.Asset.Streams)\n                    {\n                        var streamResource = new StreamResource(asset.AssetName,\n                            asset.Asset, stream);\n                        errors.OnError(streamResource, kNotSupportedErrorCode,\n                            \"Streams not supported yet\");\n                    }\n                }\n            }\n            return entries;\n        }\n\n        /// <summary>\n        /// Create extension fields for attributes and properties that do not exist in our models\n        /// </summary>\n        /// <param name=\"asset\"></param>\n        /// <param name=\"device\"></param>\n        /// <returns></returns>\n        internal static Dictionary<string, VariantValue>? CollectAssetAndDeviceProperties(\n            AssetResource asset, DeviceResource device)\n        {\n            var fields = new Dictionary<string, VariantValue>();\n            static void Add(Dictionary<string, VariantValue> fields, string key, VariantValue? value)\n            {\n                if (!VariantValue.IsNullOrNullValue(value))\n                {\n                    fields.AddOrUpdate(key, value);\n                }\n            }\n\n            if (device.Device.Attributes != null)\n            {\n                foreach (var attr in device.Device.Attributes)\n                {\n                    Add(fields, attr.Key, attr.Value);\n                }\n            }\n            Add(fields, nameof(Device.ExternalDeviceId), device.Device.ExternalDeviceId);\n            Add(fields, nameof(Device.Model), device.Device.Model);\n            Add(fields, nameof(Device.Manufacturer), device.Device.Manufacturer);\n            Add(fields, nameof(Device.OperatingSystem), device.Device.OperatingSystem);\n            Add(fields, nameof(Device.OperatingSystemVersion), device.Device.OperatingSystemVersion);\n            Add(fields, nameof(Device.Version), device.Device.Version);\n\n            if (asset.Asset.Attributes != null)\n            {\n                foreach (var attr in asset.Asset.Attributes)\n                {\n                    Add(fields, attr.Key, attr.Value);\n                }\n            }\n            Add(fields, nameof(Asset.ExternalAssetId), asset.Asset.ExternalAssetId);\n            Add(fields, nameof(Asset.HardwareRevision), asset.Asset.HardwareRevision);\n            Add(fields, nameof(Asset.Manufacturer), asset.Asset.Manufacturer);\n            Add(fields, nameof(Asset.ManufacturerUri), asset.Asset.ManufacturerUri);\n            Add(fields, nameof(Asset.Model), asset.Asset.Model);\n            Add(fields, nameof(Asset.DisplayName), asset.Asset.DisplayName);\n            Add(fields, nameof(Asset.ProductCode), asset.Asset.ProductCode);\n            Add(fields, nameof(Asset.SerialNumber), asset.Asset.SerialNumber);\n            Add(fields, nameof(Asset.SoftwareRevision), asset.Asset.SoftwareRevision);\n            Add(fields, nameof(Asset.Version), asset.Asset.Version);\n            Add(fields, nameof(Asset.DocumentationUri), asset.Asset.DocumentationUri);\n            Add(fields, nameof(Asset.Description), asset.Asset.Description);\n\n            if (fields.Count == 0)\n            {\n                return null;\n            }\n            return fields;\n        }\n\n        /// <summary>\n        /// Add authentication for the endpoint to the entry\n        /// </summary>\n        /// <param name=\"template\"></param>\n        /// <param name=\"authentication\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"resource\"></param>\n        private static PublishedNodesEntryModel AddEndpointCredentials(\n            PublishedNodesEntryModel template, EndpointCredentials authentication,\n            ValidationErrors errors, DeviceEndpointResource resource)\n        {\n            template.OpcAuthenticationMode = OpcAuthenticationMode.Anonymous;\n            if (authentication == null)\n            {\n                return template;\n            }\n            switch (authentication.AuthenticationMethod)\n            {\n                case Method.Certificate:\n                    if (string.IsNullOrWhiteSpace(authentication.ClientCertificate))\n                    {\n                        errors.OnError(resource, kAuthenticationValueMissing,\n                            \"Client certificate missing\");\n                        break;\n                    }\n                    return template with\n                    {\n                        OpcAuthenticationMode = OpcAuthenticationMode.Certificate,\n                        OpcAuthenticationUsername = authentication.ClientCertificate\n                    };\n                case Method.UsernamePassword:\n                    if (string.IsNullOrWhiteSpace(authentication.Username) ||\n                        string.IsNullOrWhiteSpace(authentication.Password))\n                    {\n                        errors.OnError(resource, kAuthenticationValueMissing,\n                            \"User name or password missing\");\n                        break;\n                    }\n                    return template with\n                    {\n                        OpcAuthenticationMode = OpcAuthenticationMode.UsernamePassword,\n                        OpcAuthenticationUsername = authentication.Username,\n                        OpcAuthenticationPassword = authentication.Password\n                    };\n            }\n            return template;\n        }\n\n        /// <summary>\n        /// Adds a new entry for a dataset. Will not add one if configuration parsing fails.\n        /// This does not apply to opc nodes, if any fail to validate, there will still be\n        /// an entry, but the status will reflect this error.\n        /// </summary>\n        /// <param name=\"template\"></param>\n        /// <param name=\"resource\"></param>\n        /// <param name=\"entries\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"ct\"></param>\n        private ValueTask AddEntryForDataSetAsync(PublishedNodesEntryModel template,\n            DataSetResource resource, List<PublishedNodesEntryModel> entries,\n            ValidationErrors errors, CancellationToken ct)\n        {\n            ct.ThrowIfCancellationRequested();\n\n            if (resource.DataSet.DataPoints == null ||\n                resource.DataSet.DataPoints.Count == 0)\n            {\n                // Nothing to do\n                return ValueTask.CompletedTask;\n            }\n\n            // Map dataset configuration on top of entry\n            var additionalConfiguration = Deserialize(resource.DataSet.DatasetConfiguration,\n                () => new DataSetConfiguration(), errors, resource);\n            if (additionalConfiguration == null)\n            {\n                return ValueTask.CompletedTask;\n            }\n\n            // TODO: Resolve typeref to ensure it exists\n\n            var nodes = new List<OpcNodeModel>();\n            // Map datapoints to OPC nodes\n            foreach (var datapoint in resource.DataSet.DataPoints)\n            {\n                var nodeFromAdditionalConfiguration = Deserialize(\n                    datapoint.DataPointConfiguration, () => new DataSetDataPointConfiguration(),\n                    errors, resource);\n                if (nodeFromAdditionalConfiguration == null)\n                {\n                    continue;\n                }\n                nodes.Add(nodeFromAdditionalConfiguration with\n                {\n                    Id = datapoint.DataSource,\n                    DisplayName = datapoint.Name,\n                    DataSetFieldId = datapoint.Name,\n                    FetchDisplayName = false,\n                    TypeDefinitionId = datapoint.TypeRef\n                });\n            }\n            var entry = CreateEntryForAssetResource(template, additionalConfiguration, nodes);\n            entry = AddDestination(entry, resource.Asset.DefaultDatasetsDestinations,\n                resource.DataSet.Destinations, errors, resource);\n            entries.Add(entry with\n            {\n                // Dataset writer id maps to name\n                DataSetWriterId = resource.DataSet.Name,\n                // Dataset name as well (-> source of the dataset)\n                DataSetName = resource.DataSet.Name,\n                // Root node id is the data source of the dataset\n                DataSetRootNodeId = resource.DataSet.DataSource,\n                // Type is the dataset typeref\n                DataSetType = resource.DataSet.TypeRef,\n                // Source is the data set source uri\n                DataSetSourceUri = CreateSourceUri(resource.Asset, resource.DataSet.DataSource),\n                // Subject is the asset uuid and dataset name\n                DataSetSubject = CreateSubject(resource.Asset, resource.DataSet.Name),\n\n                // Dataset configuration overrides\n                DataSetKeyFrameCount = entry.DataSetKeyFrameCount ?? 10,\n                SendKeepAliveDataSetMessages = entry.SendKeepAliveDataSetMessages ?? true,\n                SendKeepAliveAsKeyFrameMessages = entry.SendKeepAliveAsKeyFrameMessages ?? true,\n                MaxKeepAliveCount = entry.MaxKeepAliveCount ?? 30\n            });\n            return ValueTask.CompletedTask;\n        }\n\n        /// <summary>\n        /// Add an entry for the event. Will not add one if validation of content fails.\n        /// </summary>\n        /// <param name=\"template\"></param>\n        /// <param name=\"resource\"></param>\n        /// <param name=\"entries\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private ValueTask AddEntryForEventGroupAsync(PublishedNodesEntryModel template,\n            EventGroupResource resource, List<PublishedNodesEntryModel> entries,\n            ValidationErrors errors, CancellationToken ct)\n        {\n            ct.ThrowIfCancellationRequested();\n\n            if (resource.EventGroup.Events == null ||\n                resource.EventGroup.Events.Count == 0)\n            {\n                // Nothing to do\n                return ValueTask.CompletedTask;\n            }\n\n            // Map dataset configuration on top of entry\n            var additionalConfiguration = Deserialize(resource.EventGroup.EventGroupConfiguration,\n                () => new EventGroupConfiguration(), errors, resource);\n            if (additionalConfiguration == null)\n            {\n                return ValueTask.CompletedTask;\n            }\n\n            // TODO: Resolve typeref to ensure it exists\n\n            // Group events by event notifier (data source)\n            foreach (var @event in resource.EventGroup.Events)\n            {\n                var eventResource = new EventResource(resource.AssetName,\n                    resource.Asset, resource.EventGroup, @event);\n                // Map event configuration on top of entry\n                var eventConfiguration = Deserialize(@event.EventConfiguration,\n                    () => new EventConfiguration(), errors, eventResource);\n                if (eventConfiguration == null)\n                {\n                    continue;\n                }\n\n                var eventFilter = eventConfiguration.EventFilter ?? new EventFilterModel();\n                if (!string.IsNullOrEmpty(@event.TypeRef))\n                {\n                    // TODO: Resolve typeref to ensure it exists\n\n                    eventFilter.TypeDefinitionId = @event.TypeRef;\n                }\n\n                var node = new OpcNodeModel\n                {\n                    Id = @event.DataSource, // Event notifier\n                    DisplayName = @event.Name,\n                    DataSetFieldId = @event.Name,\n                    TypeDefinitionId = @event.TypeRef,\n                    FetchDisplayName = false,\n                    EventFilter = eventFilter,\n                    ConditionHandling = eventConfiguration.ConditionHandling,\n                    SkipFirst = eventConfiguration.SkipFirst,\n                    QueueSize = eventConfiguration.QueueSize,\n                    DiscardNew = eventConfiguration.DiscardNew\n                };\n\n                var entry = CreateEntryForAssetResource(template, additionalConfiguration, [node]);\n                entry = AddDestination(entry, resource.Asset.DefaultEventsDestinations,\n                    resource.EventGroup.DefaultEventsDestinations, @event.Destinations,\n                    errors, resource);\n                entries.Add(entry with\n                {\n                    // Dataset writer id maps to event group name, but will be broken down later.\n                    DataSetWriterId = resource.EventGroup.Name,\n                    // Dataset name is the name of the object that is the subject of the event\n                    DataSetName = resource.EventGroup.Name,\n                    // Root node id is the object id that is the subject of the event\n                    DataSetRootNodeId = resource.EventGroup.DataSource,\n                    // Type ref is the typeref of the object that is the subject of the event\n                    DataSetType = resource.EventGroup.TypeRef,\n                    // Source is the device uuid and event notifier (emitting the event)\n                    DataSetSourceUri = CreateSourceUri(resource.Asset, @event.DataSource),\n                    // Subject is the asset uuid and event group name (object)\n                    DataSetSubject = CreateSubject(resource.Asset, resource.EventGroup.Name, @event.Name),\n\n                    // Event configuration overrides\n                    MaxKeepAliveCount = entry.MaxKeepAliveCount ?? 30\n                });\n            }\n            return ValueTask.CompletedTask;\n        }\n\n        /// <summary>\n        /// Add an entry for the event. Will not add one if validation of content fails.\n        /// </summary>\n        /// <param name=\"template\"></param>\n        /// <param name=\"resource\"></param>\n        /// <param name=\"entries\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private ValueTask AddEntryForManagementGroupAsync(PublishedNodesEntryModel template,\n            ManagementGroupResource resource, List<PublishedNodesEntryModel> entries,\n            ValidationErrors errors, CancellationToken ct)\n        {\n            ct.ThrowIfCancellationRequested();\n\n            // Map event configuration on top of entry\n            var additionalConfiguration = Deserialize(\n                resource.ManagementGroup.ManagementGroupConfiguration,\n                () => new ManagementGroupConfiguration(), errors, resource);\n            if (additionalConfiguration == null)\n            {\n                return ValueTask.CompletedTask;\n            }\n\n            if (resource.ManagementGroup.Actions == null ||\n                resource.ManagementGroup.Actions.Count == 0)\n            {\n                return ValueTask.CompletedTask;\n            }\n\n            // map actions to nodes\n            foreach (var action in resource.ManagementGroup.Actions\n                .GroupBy(a => a.Topic ?? resource.ManagementGroup.DefaultTopic))\n            {\n                var nodes = new List<OpcNodeModel>();\n                foreach (var a in action)\n                {\n                    var actionResource = new ManagementActionResource(resource.AssetName,\n                        resource.Asset, resource.ManagementGroup, a);\n                    nodes.Add(new OpcNodeModel\n                    {\n                        Id = a.TargetUri,\n                        DisplayName = a.Name,\n                        DataSetFieldId = a.Name,\n                        TypeDefinitionId = a.TypeRef,\n                        FetchDisplayName = false,\n                        MethodMetadata = ConvertActionConfiguration(a.ActionConfiguration, errors,\n                            actionResource)\n                    });\n                }\n                var entry = CreateEntryForAssetResource(template, additionalConfiguration, nodes);\n                entries.Add(entry with\n                {\n                    // Writer id maps to the name of the management group\n                    DataSetWriterId = resource.ManagementGroup.Name,\n                    // The name as well (target of the actions)\n                    DataSetName = resource.ManagementGroup.Name,\n                    // Root node id is the data source of the management group\n                    DataSetRootNodeId = resource.ManagementGroup.DataSource,\n                    // Type ref is the type of the object that has the methods\n                    DataSetType = resource.ManagementGroup.TypeRef,\n                    // Source is the data set source uri\n                    DataSetSourceUri = CreateSourceUri(resource.Asset, resource.ManagementGroup.DataSource),\n                    // Subject is the asset uuid and management group name\n                    DataSetSubject = CreateSubject(resource.Asset, resource.ManagementGroup.Name),\n\n                    // Add topic\n                    QueueName = action.Key\n                });\n            }\n            return ValueTask.CompletedTask;\n        }\n\n        /// <summary>\n        /// Create entry for a management group in the asset\n        /// </summary>\n        /// <param name=\"endpointTemplate\"></param>\n        /// <param name=\"entityTemplate\"></param>\n        /// <param name=\"nodes\"></param>\n        /// <returns></returns>\n        private static PublishedNodesEntryModel CreateEntryForAssetResource(\n            PublishedNodesEntryModel endpointTemplate, ManagementGroupConfiguration entityTemplate,\n            List<OpcNodeModel> nodes)\n        {\n            return endpointTemplate with\n            {\n                //\n                // Set defaults for iot operations, there will never be any different configuration\n                // allowed in the resource of AIO\n                //\n                BatchSize = 0,\n                BatchTriggerInterval = 0,\n                BatchTriggerIntervalTimespan = null,\n                MessagingMode = MessagingMode.SingleDataSet,\n                DataSetFetchDisplayNames = false,\n                MessageEncoding = entityTemplate.MessageEncoding == MessageEncoding.Avro\n                    ? MessageEncoding.Avro : MessageEncoding.Json,\n\n                OpcNodes = nodes,\n\n                DataSetClassId =\n                    entityTemplate.DataSetClassId,\n                Priority =\n                    entityTemplate.Priority,\n            };\n        }\n\n        /// <summary>\n        /// Create entry for a dataset in the asset\n        /// </summary>\n        /// <param name=\"endpointTemplate\"></param>\n        /// <param name=\"additionalConfiguration\"></param>\n        /// <param name=\"nodes\"></param>\n        /// <returns></returns>\n        private static PublishedNodesEntryModel CreateEntryForAssetResource(\n            PublishedNodesEntryModel endpointTemplate, DataSetConfiguration additionalConfiguration,\n            List<OpcNodeModel> nodes)\n        {\n            return endpointTemplate with\n            {\n                //\n                // Set defaults for iot operations, there will never be any different configuration\n                // allowed in the resource of AIO\n                //\n                BatchSize = 0,\n                BatchTriggerInterval = 0,\n                BatchTriggerIntervalTimespan = null,\n                MessagingMode = MessagingMode.SingleDataSet,\n                DataSetFetchDisplayNames = false,\n                MessageEncoding = additionalConfiguration.MessageEncoding == MessageEncoding.Avro\n                    ? MessageEncoding.Avro : MessageEncoding.Json,\n\n                OpcNodes = nodes,\n\n                // Dataset configuration\n                DataSetPublishingInterval =\n                    additionalConfiguration.PublishingInterval,\n                DataSetSamplingInterval =\n                    additionalConfiguration.SamplingInterval,\n                DataSetClassId =\n                    additionalConfiguration.DataSetClassId,\n                DataSetKeyFrameCount =\n                    additionalConfiguration.KeyFrameCount,\n                DataSetWriterWatchdogBehavior =\n                    additionalConfiguration.DataSetWriterWatchdogBehavior,\n                SendKeepAliveDataSetMessages =\n                    additionalConfiguration.SendKeepAliveDataSetMessages,\n                SendKeepAliveAsKeyFrameMessages =\n                    additionalConfiguration.SendKeepAliveAsKeyFrameMessages,\n                MaxKeepAliveCount =\n                    additionalConfiguration.MaxKeepAliveCount,\n                RepublishAfterTransfer =\n                    additionalConfiguration.RepublishAfterTransfer,\n                Priority =\n                    additionalConfiguration.Priority\n            };\n        }\n\n        /// <summary>\n        /// Create entry for an event in the asset\n        /// </summary>\n        /// <param name=\"endpointTemplate\"></param>\n        /// <param name=\"additionalConfiguration\"></param>\n        /// <param name=\"nodes\"></param>\n        /// <returns></returns>\n        private static PublishedNodesEntryModel CreateEntryForAssetResource(\n            PublishedNodesEntryModel endpointTemplate, EventGroupConfiguration additionalConfiguration,\n            List<OpcNodeModel> nodes)\n        {\n            return endpointTemplate with\n            {\n                //\n                // Set defaults for iot operations, there will never be any different configuration\n                // allowed in the resource of AIO\n                //\n                BatchSize = 0,\n                BatchTriggerInterval = 0,\n                BatchTriggerIntervalTimespan = null,\n                MessagingMode = MessagingMode.SingleDataSet,\n                DataSetFetchDisplayNames = false,\n                MessageEncoding =\n                    additionalConfiguration.MessageEncoding == MessageEncoding.Avro\n                        ? MessageEncoding.Avro : MessageEncoding.Json,\n\n                OpcNodes = nodes,\n\n                // Dataset configuration\n                DataSetPublishingInterval =\n                    additionalConfiguration.PublishingInterval,\n                DataSetSamplingInterval =\n                    additionalConfiguration.SamplingInterval,\n                DataSetKeyFrameCount =\n                    additionalConfiguration.KeyFrameCount,\n                DataSetClassId =\n                    additionalConfiguration.DataSetClassId,\n                DataSetWriterWatchdogBehavior =\n                    additionalConfiguration.DataSetWriterWatchdogBehavior,\n                SendKeepAliveDataSetMessages =\n                    additionalConfiguration.SendKeepAliveDataSetMessages,\n                SendKeepAliveAsKeyFrameMessages =\n                    additionalConfiguration.SendKeepAliveAsKeyFrameMessages,\n                MaxKeepAliveCount =\n                    additionalConfiguration.MaxKeepAliveCount,\n                RepublishAfterTransfer =\n                    additionalConfiguration.RepublishAfterTransfer,\n                Priority =\n                    additionalConfiguration.Priority\n            };\n        }\n\n        /// <summary>\n        /// Copy the device endpoint resource to the template and return a new entry\n        /// </summary>\n        /// <param name=\"template\"></param>\n        /// <param name=\"deviceEndpoint\"></param>\n        /// <private>\n        /// Adds a new entry for a dataset. Will not add one if configuration parsing fails.\n        /// This does not apply to opc nodes, if any fail to validate, there will still be\n        /// an entry, but the status will reflect this error.\n        /// </private>\n        private static PublishedNodesEntryModel WithEndpoint(PublishedNodesEntryModel template,\n            PublishedNodesEntryModel deviceEndpoint)\n        {\n            return template with\n            {\n                // Map the configured endpoint configuration into the event/dataset template\n                EndpointUrl = deviceEndpoint.EndpointUrl,\n                EndpointSecurityMode = deviceEndpoint.EndpointSecurityMode,\n                EndpointSecurityPolicy = deviceEndpoint.EndpointSecurityPolicy,\n                DumpConnectionDiagnostics = deviceEndpoint.DumpConnectionDiagnostics,\n                UseReverseConnect = deviceEndpoint.UseReverseConnect,\n                OpcAuthenticationMode = deviceEndpoint.OpcAuthenticationMode,\n                OpcAuthenticationPassword = deviceEndpoint.OpcAuthenticationPassword,\n                OpcAuthenticationUsername = deviceEndpoint.OpcAuthenticationUsername,\n                UseSecurity = null,\n                EncryptedAuthPassword = null,\n                EncryptedAuthUsername = null,\n\n                // Add the fixed asset information\n                DataSetWriterGroup = deviceEndpoint.DataSetWriterGroup,\n                PublisherId = deviceEndpoint.PublisherId,\n                WriterGroupType = deviceEndpoint.WriterGroupType,\n                WriterGroupRootNodeId = deviceEndpoint.WriterGroupRootNodeId,\n                WriterGroupProperties = deviceEndpoint.WriterGroupProperties\n            };\n        }\n\n        /// <summary>\n        /// Add dataset destination configuration\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"defaultDestinations\"></param>\n        /// <param name=\"destinations\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"resource\"></param>\n        private static PublishedNodesEntryModel AddDestination(PublishedNodesEntryModel entry,\n            List<DatasetDestination>? defaultDestinations, List<DatasetDestination>? destinations,\n            ValidationErrors errors, Resource resource)\n        {\n            entry = WithoutDestinationConfiguration(entry);\n            if (destinations?.Count > 1)\n            {\n                // TODO: We could generate 2 or more entries each with different destination\n                errors.OnError(resource, kTooManyDestinationsError,\n                    \"More than 1 destination is not allowed for datasets. Using Mqtt\");\n            }\n            var destination = destinations?.FirstOrDefault();\n            if (destination == null)\n            {\n                if (defaultDestinations?.Count > 1)\n                {\n                    errors.OnError(resource, kTooManyDestinationsError,\n                        \"More than 1 default destination is not allowed for datasets. Using Mqtt\");\n                }\n                destination = defaultDestinations?\n                    .FirstOrDefault(d => d.Target == DatasetTarget.Mqtt);\n            }\n            if (destination == null)\n            {\n                return entry with { WriterGroupTransport = WriterGroupTransport.AioMqtt };\n            }\n            var configuration = destination.Configuration;\n            switch (destination.Target)\n            {\n                case DatasetTarget.BrokerStateStore:\n                    return entry with\n                    {\n                        WriterGroupTransport = WriterGroupTransport.AioDss,\n                        QueueName = configuration.Key,\n                        MessageTtlTimespan = configuration.Ttl == null ? null\n                            : TimeSpan.FromSeconds(configuration.Ttl.Value),\n                    };\n                case DatasetTarget.Mqtt:\n                    return entry with\n                    {\n                        WriterGroupTransport = WriterGroupTransport.AioMqtt,\n                        QualityOfService = configuration.Qos switch\n                        {\n                            QoS.Qos0 => Furly.Extensions.Messaging.QoS.AtMostOnce,\n                            QoS.Qos1 => Furly.Extensions.Messaging.QoS.AtLeastOnce,\n                            _ => null\n                        },\n                        MessageRetention = configuration.Retain switch\n                        {\n                            Retain.Keep => true,\n                            Retain.Never => false,\n                            _ => null\n                        },\n                        QueueName = configuration.Topic,\n                        MessageTtlTimespan = configuration.Ttl == null ? null\n                            : TimeSpan.FromSeconds(configuration.Ttl.Value),\n                        MetaDataQueueName = configuration.Topic,\n                        MetaDataRetention = configuration.Retain switch\n                        {\n                            Retain.Keep => true,\n                            Retain.Never => false,\n                            _ => null\n                        },\n                        MetaDataTtlTimespan = configuration.Ttl == null ? null\n                            : TimeSpan.FromSeconds(configuration.Ttl.Value)\n                    };\n                case DatasetTarget.Storage:\n                    return entry with\n                    {\n                        WriterGroupTransport = WriterGroupTransport.FileSystem,\n                        QueueName = configuration.Path\n                    };\n            }\n            return entry;\n        }\n\n        /// <summary>\n        /// Add event and stream destination configuration\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"defaultDestinations\"></param>\n        /// <param name=\"groupDestinations\"></param>\n        /// <param name=\"destinations\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"resource\"></param>\n        private static PublishedNodesEntryModel AddDestination(PublishedNodesEntryModel entry,\n            List<EventStreamDestination>? defaultDestinations, List<EventStreamDestination>? groupDestinations,\n            List<EventStreamDestination>? destinations, ValidationErrors errors, Resource resource)\n        {\n            entry = WithoutDestinationConfiguration(entry);\n            if (destinations?.Count > 1)\n            {\n                errors.OnError(resource, kTooManyDestinationsError,\n                    \"More than 1 destination is not allowed for events. Using Mqtt\");\n            }\n            var destination = destinations?\n                .FirstOrDefault(d => d.Target == EventStreamTarget.Mqtt);\n            if (destination == null)\n            {\n                if (groupDestinations?.Count > 1)\n                {\n                    errors.OnError(resource, kTooManyDestinationsError,\n                        \"More than 1 destination is not allowed for event groups. Using Mqtt\");\n                }\n                destination = groupDestinations?\n                    .FirstOrDefault(d => d.Target == EventStreamTarget.Mqtt);\n            }\n            if (destination == null)\n            {\n                if (defaultDestinations?.Count > 1)\n                {\n                    errors.OnError(resource, kTooManyDestinationsError,\n                        \"More than 1 default destination is not allowed for events. Using Mqtt\");\n                }\n                destination = defaultDestinations?\n                    .FirstOrDefault(d => d.Target == EventStreamTarget.Mqtt);\n            }\n            if (destination == null)\n            {\n                return entry with { WriterGroupTransport = WriterGroupTransport.AioMqtt };\n            }\n            var configuration = destination.Configuration;\n            switch (destination.Target)\n            {\n                case EventStreamTarget.Mqtt:\n                    return entry with\n                    {\n                        WriterGroupTransport = WriterGroupTransport.AioMqtt,\n                        QualityOfService = configuration.Qos switch\n                        {\n                            QoS.Qos0 => Furly.Extensions.Messaging.QoS.AtMostOnce,\n                            QoS.Qos1 => Furly.Extensions.Messaging.QoS.AtLeastOnce,\n                            _ => null\n                        },\n                        MessageRetention = configuration.Retain switch\n                        {\n                            Retain.Keep => true,\n                            Retain.Never => false,\n                            _ => null\n                        },\n                        QueueName = configuration.Topic,\n                        MessageTtlTimespan = configuration.Ttl == null ? null\n                            : TimeSpan.FromSeconds(configuration.Ttl.Value),\n                        MetaDataQueueName = configuration.Topic,\n                        MetaDataRetention = configuration.Retain switch\n                        {\n                            Retain.Keep => true,\n                            Retain.Never => false,\n                            _ => null\n                        },\n                        MetaDataTtlTimespan = configuration.Ttl == null ? null\n                            : TimeSpan.FromSeconds(configuration.Ttl.Value)\n                    };\n                case EventStreamTarget.Storage:\n                    return entry with\n                    {\n                        WriterGroupTransport = WriterGroupTransport.FileSystem,\n                        QueueName = configuration.Path\n                    };\n            }\n            return entry;\n        }\n\n        /// <summary>\n        /// Remove the destination configuration\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <returns></returns>\n        private static PublishedNodesEntryModel WithoutDestinationConfiguration(\n            PublishedNodesEntryModel entry)\n        {\n            return entry with\n            {\n                WriterGroupMessageRetention = null,\n                WriterGroupMessageTtlTimepan = null,\n                WriterGroupQualityOfService = null,\n                WriterGroupQueueName = null,\n                DataSetRouting = null,\n                QualityOfService = null,\n                MessageRetention = null,\n                MessageTtlTimespan = null,\n                QueueName = null,\n            };\n        }\n\n        /// <summary>\n        /// Run network discovery if configured\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async Task RunDeviceDiscoveryAsync(CancellationToken ct)\n        {\n            if (_options.Value.AioNetworkDiscoveryMode == null ||\n                _options.Value.AioNetworkDiscoveryMode == DiscoveryMode.Off)\n            {\n                _logger.NetworkDiscoveryDisabled();\n                return;\n            }\n            var progress = new ProgressLogger(_logger);\n            var request = new DiscoveryRequestModel\n            {\n                Discovery = _options.Value.AioNetworkDiscoveryMode.Value,\n                Configuration = _options.Value.AioNetworkDiscovery\n            };\n            GetEndpointTypeAndVersion(out var endpointType, out var endpointTypeVersion);\n            while (!ct.IsCancellationRequested)\n            {\n                try\n                {\n                    _logger.RunningNetworkDiscovery();\n                    var servers = await _discovery.FindServersAsync(request, progress, ct)\n                        .ConfigureAwait(false);\n\n                    var set = new HashSet<string>(StringComparer.OrdinalIgnoreCase);\n                    foreach (var server in servers\n                        .Where(ep => ep.Description?.Server?.ApplicationUri != null)\n                        .GroupBy(ep => ep.Description.Server.ApplicationUri))\n                    {\n                        if (!set.Add(server.Key) ||\n                            _devices.Values.Any(d => d.Device.Attributes?.TryGetValue(\n                            nameof(ApplicationDescription.ApplicationUri), out var uri) == true &&\n                            string.Equals(uri, server.Key, StringComparison.OrdinalIgnoreCase)))\n                        {\n                            _logger.DeviceAlreadyPresentSkipping(server.Key);\n                            continue;\n                        }\n                        var endpoints = server.ToList();\n                        Debug.Assert(endpoints.Count > 0);\n                        var applicationDescription = endpoints[0].Description.Server;\n                        var serverDeviceId = \"-\" + server.Key.ToSha1Hash();\n                        var deviceName = MakeValidArmResourceName(\n                            applicationDescription.ApplicationName.ToString(), serverDeviceId)\n                            .TrimEnd('-') + serverDeviceId;\n                        var dServerDevice = new DiscoveredDevice\n                        {\n                            ExternalDeviceId = serverDeviceId,\n                            Model = applicationDescription.ProductUri\n                        };\n                        try\n                        {\n                            await ReportDiscoveredDeviceAsync(deviceName, dServerDevice, endpoints,\n                                endpointType, endpointTypeVersion, ct: ct).ConfigureAwait(false);\n                        }\n                        catch (Exception ex)\n                        {\n                            _logger.FailedToReportDiscoveredServer(ex, deviceName);\n                        }\n                    }\n                    _logger.NetworkDiscoveryComplete();\n\n                    if (!(_options.Value.AioNetworkDiscoveryInterval > TimeSpan.Zero))\n                    {\n                        _logger.NetworkDiscoveryConfiguredToOnlyRunOnce();\n                        break;\n                    }\n                    await Task.Delay(_options.Value.AioNetworkDiscoveryInterval.Value, ct).ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { break; }\n                catch (Exception ex)\n                {\n                    _logger.UnexpectedErrorDuringNetworkDiscovery(ex);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Run discovery for all known devices\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async Task RunAssetDiscoveryAsync(CancellationToken ct)\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                var lastListVersion = _lastDeviceListVersion;\n                try\n                {\n                    _logger.RunningDiscoveryForAllDevices();\n                    var errors = new ValidationErrors(this);\n                    foreach (var device in _devices.Values.ToList())\n                    {\n                        if ((device.Device.Endpoints?.Inbound) == null)\n                        {\n                            continue;\n                        }\n\n                        var deviceDiscoveryComplete = false;\n                        foreach (var endpoint in device.Device.Endpoints.Inbound)\n                        {\n                            var deviceEndpointResource = new DeviceEndpointResource(device.DeviceName,\n                                device.Device, endpoint.Key);\n\n                            var url = GetEndpointUrl(endpoint.Value.Address);\n                            if (!Uri.TryCreate(url, UriKind.Absolute, out var endpointUri))\n                            {\n                                errors.OnError(deviceEndpointResource, kInvalidEndpointUrl,\n                                    \"Invalid endpoint URL: \" + url);\n                                continue;\n                            }\n                            var endpointConfiguration = Deserialize(endpoint.Value.AdditionalConfiguration,\n                                () => new DeviceEndpointConfiguration(), errors, deviceEndpointResource);\n                            if (endpointConfiguration == null)\n                            {\n                                continue;\n                            }\n\n                            // Test connection\n                            var canConnectToEndpoint = await TestConnectionAsync(deviceEndpointResource,\n                                endpoint.Value, endpointConfiguration, errors, ct).ConfigureAwait(false);\n                            if (!canConnectToEndpoint)\n                            {\n                                continue;\n                            }\n\n                            if (endpointConfiguration.RunAssetDiscovery == true &&\n                                endpointConfiguration.AssetTypes?.Count > 0)\n                            {\n                                // Run discovery\n                                try\n                                {\n                                    await RunDiscoveryUsingTypesAsync(deviceEndpointResource,\n                                        endpointConfiguration, errors, ct).ConfigureAwait(false);\n                                }\n                                catch (Exception ex)\n                                {\n                                    errors.OnError(deviceEndpointResource, kDiscoveryError, ex.Message);\n                                    _logger.FailedToRunDiscoveryForDevice(ex, device.DeviceName);\n                                }\n                            }\n\n                            if (endpointConfiguration.Source == null &&\n                                endpointConfiguration.EndpointSecurityMode == SecurityMode.None &&\n                                !deviceDiscoveryComplete)\n                            {\n                                try\n                                {\n                                    await RunEndpointDiscoveryAsync(deviceEndpointResource,\n                                        endpointUri, ct).ConfigureAwait(false);\n                                    deviceDiscoveryComplete = true;\n                                }\n                                catch (Exception ex)\n                                {\n                                    errors.OnError(deviceEndpointResource, kDiscoveryError, ex.Message);\n                                    _logger.FailedToRunEndpointDiscoveryForDevice(ex, device.DeviceName);\n                                }\n                            }\n                        }\n\n                        // Compare last device list version, if version changed, stop and continue on\n                        // next timer fired. This will settle the changes and limit resource usage.\n                        if (_lastDeviceListVersion != lastListVersion)\n                        {\n                            _logger.RunningDiscoveryInterrupted();\n                            break;\n                        }\n                    }\n                    await errors.ReportAsync(ct).ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { break; }\n                catch (Exception ex)\n                {\n                    _logger.UnexpectedErrorDuringDiscovery(ex);\n                }\n                if (_lastDeviceListVersion == lastListVersion)\n                {\n                    _logger.RunningDiscoveryCompleted();\n                    _trigger.Reset();\n                }\n                try\n                {\n                    await _trigger.WaitAsync(ct).ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { break; }\n                catch (Exception ex)\n                {\n                    _logger.UnexpectedErrorDuringDiscovery(ex);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Test connectivity\n        /// </summary>\n        /// <param name=\"deviceEndpointResource\"></param>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"endpointConfiguration\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task<bool> TestConnectionAsync(DeviceEndpointResource deviceEndpointResource,\n            InboundEndpointSchemaMapValue endpoint, DeviceEndpointConfiguration endpointConfiguration,\n            ValidationErrors errors, CancellationToken ct)\n        {\n            var assetEndpoint = new PublishedNodesEntryModel\n            {\n                EndpointUrl = GetEndpointUrl(endpoint.Address),\n                EndpointSecurityMode = endpointConfiguration.EndpointSecurityMode,\n                EndpointSecurityPolicy = endpointConfiguration.EndpointSecurityPolicy,\n                DumpConnectionDiagnostics = endpointConfiguration.DumpConnectionDiagnostics,\n                DisableSubscriptionTransfer = endpointConfiguration.DisableSubscriptionTransfer,\n                UseReverseConnect = endpointConfiguration.UseReverseConnect\n            };\n            var credentials = _client.GetEndpointCredentials(deviceEndpointResource.DeviceName,\n                deviceEndpointResource.EndpointName, endpoint);\n            assetEndpoint = AddEndpointCredentials(assetEndpoint, credentials, errors,\n                deviceEndpointResource);\n            var testConnection = await _connections.TestConnectionAsync(assetEndpoint.ToConnectionModel(),\n                new TestConnectionRequestModel(), ct).ConfigureAwait(false);\n            if (testConnection.ErrorInfo != null)\n            {\n                errors.OnError(deviceEndpointResource, kDiscoveryError,\n                    \"Failed to connect to endpoint: \" + AsString(testConnection.ErrorInfo));\n                _logger.FailedToConnectToDeviceEndpoint(deviceEndpointResource.DeviceName,\n                    deviceEndpointResource.EndpointName, testConnection.ErrorInfo);\n                return false;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Create a topic for the asset and dataset\n        /// </summary>\n        /// <param name=\"extra\"></param>\n        /// <returns></returns>\n        private static string CreateTopic(string? extra = null)\n        {\n            // /opcua/{Encoding}/{MessageType}\");\n            var builder = new StringBuilder()\n                .Append('/')\n                .Append('{').Append(PublisherConfig.RootTopicVariableName).Append('}')\n                .Append('/')\n                .Append('{').Append(PublisherConfig.WriterGroupVariableName).Append('}')\n                .Append('/')\n                .Append('{').Append(PublisherConfig.DataSetTopicPathVariableName).Append('}');\n\n            if (!string.IsNullOrEmpty(extra))\n            {\n                builder = builder.Append('/').Append(Furly.Extensions.Messaging.TopicFilter.Escape(extra));\n            }\n            if (builder.Length > 128) // Topic length limit in adr is 128\n            {\n                builder.Length = 128;\n            }\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Create cloud event source uri as per specification for azure iot operations\n        /// Identifies the context in which the event happened.\n        /// </summary>\n        /// <param name=\"asset\"></param>\n        /// <param name=\"dataSource\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        private string CreateSourceUri(Asset asset, string? dataSource = null)\n        {\n            var key = CreateDeviceKey(asset.DeviceRef.DeviceName, asset.DeviceRef.EndpointName);\n            if (!_devices.TryGetValue(key, out var device))\n            {\n                throw new ArgumentException(\"Device not found for asset\", nameof(asset));\n            }\n            var builder = new StringBuilder(\"ms-aio:\")\n                .Append(device.Device.ExternalDeviceId)\n                .Append('_')\n                .Append(asset.DeviceRef.EndpointName);\n            if (!string.IsNullOrEmpty(dataSource))\n            {\n                builder = builder.Append('/').Append(dataSource.UrlEncode());\n            }\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Create cloud event subject as per specification for azure iot operations\n        /// Identifies what the event is about.\n        /// </summary>\n        /// <param name=\"asset\"></param>\n        /// <param name=\"subjectName\"></param>\n        /// <param name=\"subSubject\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        private string CreateSubject(Asset asset, string subjectName, string? subSubject = null)\n        {\n            var builder = new StringBuilder(asset.ExternalAssetId)\n                .Append('/')\n                .Append(subjectName);\n            if (!string.IsNullOrEmpty(subSubject))\n            {\n                builder = builder.Append('/').Append(subSubject);\n            }\n            return builder.ToString();\n        }\n\n        /// <summary>\n        /// Deserialize configuration\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"createDefault\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"resource\"></param>\n        /// <returns></returns>\n        private T? Deserialize<T>(string? configuration, Func<T> createDefault,\n            ValidationErrors errors, Resource resource)\n        {\n            try\n            {\n                T? result = default;\n                if (configuration != null)\n                {\n                    result = _serializer.Deserialize<T>(configuration);\n                }\n                return result ??= createDefault();\n            }\n            catch (Exception ex)\n            {\n                errors.OnError(resource, kJsonSerializationErrorCode + \".\"\n                    + ex.HResult.ToString(CultureInfo.InvariantCulture), ex.Message);\n                return default;\n            }\n        }\n\n        private static bool TryGetInboundEndpoint(DeviceEndpoints? endpoints,\n            string endpointName, [NotNullWhen(true)] out InboundEndpointSchemaMapValue? endpoint)\n        {\n            endpoint = endpoints?.Inbound?.FirstOrDefault(\n                ep => string.Equals(ep.Key, endpointName, StringComparison.OrdinalIgnoreCase)).Value;\n            return endpoint != null;\n        }\n\n        /// <summary>\n        /// Compress method metadata\n        /// </summary>\n        /// <param name=\"methodMetadata\"></param>\n        /// <param name=\"compressionLevel\"></param>\n        /// <returns></returns>\n        internal string? ConvertActionConfiguration(MethodMetadataModel methodMetadata,\n            int compressionLevel = 0)\n        {\n            byte[] compressed;\n            using (var input = new MemoryStream(\n                _serializer.SerializeToMemory(methodMetadata).ToArray()))\n            using (var result = new MemoryStream())\n            {\n                using (var gs = new GZipStream(result, CompressionMode.Compress))\n                {\n                    input.CopyTo(gs);\n                }\n                compressed = result.ToArray();\n            }\n            var json = JsonSerializer.Serialize(new ActionConfiguration { CompiledMetadata = compressed });\n            if (Encoding.UTF8.GetByteCount(json) > 512) // 512 is max size but we are leaving some room here\n            {\n                if (compressionLevel > 2)\n                {\n                    return null;\n                }\n                // We send the object id but compress or fully remove the argument information\n                return ConvertActionConfiguration(methodMetadata with\n                {\n                    InputArguments = compressionLevel > 1 ? null : methodMetadata.InputArguments?\n                        .Select(a => new MethodMetadataArgumentModel\n                        {\n                            Name = a.Name,\n                            Type = new NodeModel { NodeId = a.Type.NodeId }\n                        })\n                        .ToList(),\n                    OutputArguments = compressionLevel > 1 ? null : methodMetadata.OutputArguments?\n                        .Select(a => new MethodMetadataArgumentModel\n                        {\n                            Name = a.Name,\n                            Type = new NodeModel { NodeId = a.Type.NodeId }\n                        })\n                        .ToList()\n                }, ++compressionLevel);\n            }\n            return json;\n        }\n\n        /// <summary>\n        /// Decompress method metadata\n        /// </summary>\n        /// <param name=\"actionConfigurationJson\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"resource\"></param>\n        /// <returns></returns>\n        internal MethodMetadataModel ConvertActionConfiguration(string? actionConfigurationJson,\n            ValidationErrors errors, Resource resource)\n        {\n            if (actionConfigurationJson == null)\n            {\n                return new MethodMetadataModel();\n            }\n            try\n            {\n                var actionConfiguration = Deserialize(actionConfigurationJson,\n                    () => new ActionConfiguration { CompiledMetadata = [] }, errors, resource);\n                if (actionConfiguration?.CompiledMetadata == null ||\n                    actionConfiguration.CompiledMetadata.Length == 0)\n                {\n                    return new MethodMetadataModel();\n                }\n                byte[] decompressed;\n                using (var input = new MemoryStream(actionConfiguration.CompiledMetadata))\n                using (var output = new MemoryStream())\n                {\n                    using (var gs = new GZipStream(input, CompressionMode.Decompress))\n                    {\n                        gs.CopyTo(output);\n                    }\n                    decompressed = output.ToArray();\n                }\n                return _serializer.Deserialize<MethodMetadataModel>(decompressed)\n                    ?? new MethodMetadataModel();\n            }\n            catch (Exception ex)\n            {\n                errors.OnError(resource, kJsonSerializationErrorCode + \".\"\n                    + ex.HResult.ToString(CultureInfo.InvariantCulture), ex.Message);\n                return new MethodMetadataModel();\n            }\n        }\n\n        private static bool TryGetInboundEndpoint(DeviceStatusEndpoint? endpoints,\n            string endpointName, [NotNullWhen(true)] out DeviceStatusInboundEndpointSchemaMapValue? endpoint)\n        {\n            endpoint = endpoints?.Inbound?.FirstOrDefault(\n                ep => string.Equals(ep.Key, endpointName, StringComparison.OrdinalIgnoreCase)).Value;\n            return endpoint != null;\n        }\n\n        private static string CreateDeviceKey(string deviceName, string inboundEndpointName)\n            => $\"{deviceName}_{inboundEndpointName}\";\n\n        private static string CreateAssetKey(string deviceName, string inboundEndpointName,\n            string assetName) => $\"{deviceName}_{inboundEndpointName}_{assetName}\";\n\n        private static string MakeValidArmResourceName(string input, string? postFix = null)\n        {\n            var leaveRoom = postFix == null ? 0 : Encoding.UTF8.GetByteCount(postFix);\n            Debug.Assert(leaveRoom < 63);\n            // Convert to lowercase\n            string sanitized = input.ToLowerInvariant();\n            // Ascii escape invalid characters with '-'\n            sanitized = EscapeInvalid().Replace(sanitized, \"-\");\n            // Ensure it starts and ends with an alphanumeric character\n            sanitized = EnsureAlphaStart().Replace(sanitized, \"\");\n            // Truncate to characters if necessary (63 max)\n            var maxChars = 63 - leaveRoom;\n            if (sanitized.Length > maxChars)\n            {\n                sanitized = sanitized.Substring(0, maxChars);\n            }\n            return sanitized;\n        }\n\n        private static string MakeValidName(string input, string? postFix = null)\n        {\n            var leaveRoom = postFix == null ? 0 : Encoding.UTF8.GetByteCount(postFix);\n            var length = Encoding.UTF8.GetByteCount(input);\n            // Truncate to characters if necessary (128 max)\n            var maxChars = leaveRoom > 128 ? 0 : 128 - leaveRoom;\n            if (length > maxChars)\n            {\n                return input.ToSha1Hash();\n            }\n            return input;\n        }\n\n        /// <summary>\n        /// Create string from error\n        /// </summary>\n        /// <param name=\"errorInfo\"></param>\n        /// <returns></returns>\n        private static string AsString(ServiceResultModel errorInfo)\n        {\n            var str = new StringBuilder();\n            Append(str, errorInfo);\n            return str.ToString();\n\n            static StringBuilder Append(StringBuilder builder, ServiceResultModel error)\n            {\n                builder = builder\n                    .Append(error.SymbolicId ??\n                        error.StatusCode.ToString(CultureInfo.InvariantCulture))\n                    .Append(':')\n                    .Append(error.ErrorMessage);\n                if (error.Inner != null)\n                {\n                    builder = builder.AppendLine(\"=>\");\n                    builder = Append(builder, error.Inner);\n                }\n                return builder;\n            }\n        }\n\n        [GeneratedRegex(\"[^a-z0-9-]\")]\n        private static partial Regex EscapeInvalid();\n\n        [GeneratedRegex(\"^-+|-+$\")]\n        private static partial Regex EnsureAlphaStart();\n\n        /// <summary>\n        /// Base resoure and corresponding resources\n        /// </summary>\n        internal abstract record class Resource();\n\n        internal record class DeviceResource(string DeviceName, Device Device) : Resource;\n        internal record class AssetResource(string AssetName, Asset Asset) : Resource;\n\n        internal record class DeviceEndpointResource(string DeviceName, Device Device,\n            string EndpointName)\n            : DeviceResource(DeviceName, Device);\n        internal record class DataSetResource(string AssetName, Asset Asset,\n            AssetDataset DataSet)\n            : AssetResource(AssetName, Asset);\n        internal record class EventGroupResource(string AssetName, Asset Asset,\n            AssetEventGroup EventGroup)\n            : AssetResource(AssetName, Asset);\n        internal record class EventResource(string AssetName, Asset Asset,\n            AssetEventGroup EventGroup, AssetEvent Event)\n            : EventGroupResource(AssetName, Asset, EventGroup);\n        internal record class StreamResource(string AssetName, Asset Asset,\n            AssetStream Stream)\n            : AssetResource(AssetName, Asset);\n        internal record class ManagementGroupResource(string AssetName, Asset Asset,\n            AssetManagementGroup ManagementGroup)\n            : AssetResource(AssetName, Asset);\n        internal record class ManagementActionResource(string AssetName, Asset Asset,\n            AssetManagementGroup ManagementGroup, AssetManagementGroupAction Action)\n            : ManagementGroupResource(AssetName, Asset, ManagementGroup);\n\n        /// <summary>\n        /// Collects validation errors\n        /// </summary>\n        internal sealed class ValidationErrors\n        {\n            /// <summary>\n            /// Create error collector\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            public ValidationErrors(AssetDeviceIntegration outer)\n            {\n                _outer = outer;\n            }\n\n            /// <summary>\n            /// Collect error for a particular resource such as asset, dataset\n            /// or device.\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            public void OnError(Resource resource, string code, string error)\n            {\n                _outer._logger.EncounteredError(code, error, resource);\n                switch (resource)\n                {\n                    case DeviceEndpointResource dr:\n                        Add(dr, code, error);\n                        return;\n                    case DeviceResource d:\n                        Add(d, code, error);\n                        return;\n                    case DataSetResource d:\n                        Add(d, code, error);\n                        return;\n                    case EventResource e:\n                        Add(e, code, error);\n                        return;\n                    case EventGroupResource eg:\n                        Add(eg, code, error);\n                        return;\n                    case StreamResource e:\n                        Add(e, code, error);\n                        return;\n                    case ManagementActionResource e:\n                        Add(e, code, error);\n                        return;\n                    case ManagementGroupResource e:\n                        Add(e, code, error);\n                        return;\n                    case AssetResource a:\n                        Add(a, code, error);\n                        return;\n                    default:\n                        return;\n                }\n            }\n\n            /// <summary>\n            /// Report what is to be reported\n            /// </summary>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            public async ValueTask ReportAsync(CancellationToken ct)\n            {\n                if (_devices.Count > 0 || _assets.Count > 0)\n                {\n                    _outer._logger.ReportingStatus(_assets.Count, _devices.Count);\n                }\n\n                var client = _outer._client;\n                foreach (var (_, status) in _devices)\n                {\n                    try\n                    {\n                        await client.UpdateDeviceStatusAsync(status.DeviceName, status.EndpointName,\n                            status.Status, ct: ct).ConfigureAwait(false);\n                    }\n                    catch (Exception ex)\n                    {\n                        _outer._logger.FailedToUpdateDeviceStatus(ex,\n                            status.DeviceName, status.EndpointName);\n                    }\n                }\n                foreach (var (_, status) in _assets)\n                {\n                    try\n                    {\n                        await client.UpdateAssetStatusAsync(status.Asset.DeviceRef.DeviceName,\n                            status.Asset.DeviceRef.EndpointName,\n                            status.AssetName, status.Status, ct: ct).ConfigureAwait(false);\n                    }\n                    catch (Exception ex)\n                    {\n                        _outer._logger.FailedToUpdateAssetStatus(ex, status.AssetName,\n                            status.Asset.DeviceRef.DeviceName, status.Asset.DeviceRef.EndpointName);\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Add the error to the device status for the device resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(DeviceResource resource, string code, string error)\n            {\n                var ep = resource.Device.Endpoints?.Inbound?.FirstOrDefault().Key;\n                if (string.IsNullOrEmpty(ep))\n                {\n                    // Cannot find an endpoint but we need it to attach status\n                    return;\n                }\n                var status = GetDeviceEndpointStatusResource(new DeviceEndpointResource(\n                    resource.DeviceName, resource.Device, ep));\n                if (status.Status.Config == null)\n                {\n                    status.Status.Config = new ConfigStatus\n                    {\n                        Error = new ConfigError\n                        {\n                            Code = code,\n                            Message = error\n                        }\n                    };\n                }\n            }\n\n            /// <summary>\n            /// Add the error to the device endpoint resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(DeviceEndpointResource resource, string code, string error)\n            {\n                var status = GetDeviceEndpointStatusResource(resource);\n                status.Status.Endpoints ??= new DeviceStatusEndpoint\n                {\n                    Inbound = new Dictionary<string, DeviceStatusInboundEndpointSchemaMapValue>()\n                };\n                Debug.Assert(status.Status.Endpoints.Inbound != null);\n                if (!TryGetInboundEndpoint(status.Status.Endpoints, resource.EndpointName, out var entry))\n                {\n                    entry = new DeviceStatusInboundEndpointSchemaMapValue();\n                    status.Status.Endpoints.Inbound.Add(resource.EndpointName, entry);\n                }\n                entry.Error = new ConfigError\n                {\n                    Code = code,\n                    Message = error\n                };\n            }\n\n            /// <summary>\n            /// Add error to asset resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(AssetResource resource, string code, string error)\n            {\n                var status = GetAssetStatusResource(resource);\n                if (status.Status.Config == null)\n                {\n                    status.Status.Config = new ConfigStatus\n                    {\n                        Error = new ConfigError\n                        {\n                            Code = code,\n                            Message = error\n                        }\n                    };\n                }\n            }\n\n            /// <summary>\n            /// Add error to the dataset resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(DataSetResource resource, string code, string error)\n            {\n                var status = GetAssetStatusResource(resource);\n                status.Status.Datasets ??= new List<AssetDatasetEventStreamStatus>();\n                Debug.Assert(status.Status.Datasets != null);\n                status.Status.Datasets.Add(new AssetDatasetEventStreamStatus\n                {\n                    Name = resource.DataSet.Name,\n                    Error = new ConfigError\n                    {\n                        Code = code,\n                        Message = error\n                    }\n                });\n            }\n\n            /// <summary>\n            /// Add error to the management group status based on management group resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(EventGroupResource resource, string code, string error)\n            {\n                if (resource.EventGroup.Events == null ||\n                    resource.EventGroup.Events.Count == 0)\n                {\n                    return;\n                }\n                var status = GetAssetStatusResource(resource);\n                status.Status.EventGroups ??= new List<AssetEventGroupStatus>();\n                Debug.Assert(status.Status.ManagementGroups != null);\n                status.Status.EventGroups.Add(new AssetEventGroupStatus\n                {\n                    Name = resource.EventGroup.Name,\n                    Events = resource.EventGroup.Events.ConvertAll(a =>\n                        new AssetDatasetEventStreamStatus\n                        {\n                            Name = a.Name,\n                            Error = new ConfigError\n                            {\n                                Code = code,\n                                Message = error\n                            }\n                        }\n                    )\n                });\n            }\n\n            /// <summary>\n            /// Add error to the event status based on event resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(EventResource resource, string code, string error)\n            {\n                var status = GetAssetStatusResource(resource);\n                status.Status.EventGroups ??= new List<AssetEventGroupStatus>();\n                Debug.Assert(status.Status.EventGroups != null);\n                status.Status.EventGroups.Add(new AssetEventGroupStatus\n                {\n                    Name = resource.EventGroup.Name,\n                    Events = new List<AssetDatasetEventStreamStatus>\n                    {\n                        new AssetDatasetEventStreamStatus\n                        {\n                            Name = resource.Event.Name,\n                            Error = new ConfigError\n                            {\n                                Code = code,\n                                Message = error\n                            }\n                        }\n                    }\n                });\n            }\n\n            /// <summary>\n            /// Add error to the stream status based on stream resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(StreamResource resource, string code, string error)\n            {\n                var status = GetAssetStatusResource(resource);\n                status.Status.Streams ??= new List<AssetDatasetEventStreamStatus>();\n                Debug.Assert(status.Status.Streams != null);\n                status.Status.Streams.Add(new AssetDatasetEventStreamStatus\n                {\n                    Name = resource.Stream.Name,\n                    Error = new ConfigError\n                    {\n                        Code = code,\n                        Message = error\n                    }\n                });\n            }\n\n            /// <summary>\n            /// Add error to the management group status based on management group resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(ManagementGroupResource resource, string code, string error)\n            {\n                if (resource.ManagementGroup.Actions == null ||\n                    resource.ManagementGroup.Actions.Count == 0)\n                {\n                    return;\n                }\n                var status = GetAssetStatusResource(resource);\n                status.Status.ManagementGroups ??= new List<AssetManagementGroupStatusSchemaElement>();\n                Debug.Assert(status.Status.ManagementGroups != null);\n                status.Status.ManagementGroups.Add(new AssetManagementGroupStatusSchemaElement\n                {\n                    Name = resource.ManagementGroup.Name,\n                    Actions = resource.ManagementGroup.Actions.ConvertAll(a =>\n                        new AssetManagementGroupActionStatusSchemaElement\n                        {\n                            Name = a.Name,\n                            Error = new ConfigError\n                            {\n                                Code = code,\n                                Message = error\n                            }\n                        }\n                    )\n                });\n            }\n\n            /// <summary>\n            /// Add error to the management action status based on management action resource\n            /// </summary>\n            /// <param name=\"resource\"></param>\n            /// <param name=\"code\"></param>\n            /// <param name=\"error\"></param>\n            private void Add(ManagementActionResource resource, string code, string error)\n            {\n                var status = GetAssetStatusResource(resource);\n                status.Status.ManagementGroups ??= new List<AssetManagementGroupStatusSchemaElement>();\n                Debug.Assert(status.Status.ManagementGroups != null);\n                status.Status.ManagementGroups.Add(new AssetManagementGroupStatusSchemaElement\n                {\n                    Name = resource.ManagementGroup.Name,\n                    Actions = new List<AssetManagementGroupActionStatusSchemaElement>\n                    {\n                        new AssetManagementGroupActionStatusSchemaElement\n                        {\n                            Name = resource.Action.Name,\n                            Error = new ConfigError\n                            {\n                                Code = code,\n                                Message = error\n                            }\n                        }\n                    }\n                });\n            }\n\n            private DeviceEndpointStatusResource GetDeviceEndpointStatusResource(DeviceEndpointResource device)\n            {\n                var key = CreateDeviceKey(device.DeviceName, device.EndpointName);\n                if (!_devices.TryGetValue(key, out var deviceStatus))\n                {\n                    deviceStatus = new DeviceEndpointStatusResource(device);\n                    _devices.Add(key, deviceStatus);\n                }\n                return deviceStatus;\n            }\n\n            private AssetStatusResource GetAssetStatusResource(AssetResource asset)\n            {\n                var key = CreateAssetKey(asset.Asset.DeviceRef.DeviceName,\n                    asset.Asset.DeviceRef.EndpointName, asset.AssetName);\n                if (!_assets.TryGetValue(key, out var assetStatus))\n                {\n                    assetStatus = new AssetStatusResource(asset);\n                    _assets.Add(key, assetStatus);\n                }\n                return assetStatus;\n            }\n            internal record class AssetStatusResource(AssetResource resource)\n                : AssetResource(resource.AssetName, resource.Asset)\n            {\n                public AssetStatus Status { get; } = new();\n            }\n            internal record class DeviceEndpointStatusResource(DeviceEndpointResource resource)\n                : DeviceEndpointResource(resource.DeviceName, resource.Device, resource.EndpointName)\n            {\n                public DeviceStatus Status { get; } = new();\n            }\n\n            private readonly Dictionary<string, AssetStatusResource> _assets = new();\n            private readonly Dictionary<string, DeviceEndpointStatusResource> _devices = new();\n            private readonly AssetDeviceIntegration _outer;\n        }\n\n        private const string kNotSupportedErrorCode = \"500.0\";\n        private const string kJsonSerializationErrorCode = \"500.1\";\n        private const string kDeviceNotFoundErrorCode = \"500.2\";\n        private const string kTooManyDestinationsError = \"500.4\";\n        private const string kAuthenticationValueMissing = \"500.5\";\n        private const string kDiscoveryError = \"500.6\";\n        private const string kInvalidEndpointUrl = \"500.7\";\n\n        private static readonly TimeSpan kDefaultDeviceDiscoveryRefresh = TimeSpan.FromHours(6);\n        private static readonly JsonSerializerOptions kDebugSerializerOptions = new()\n        {\n            WriteIndented = true,\n            Converters = { new JsonStringEnumConverter() },\n            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull\n        };\n\n        private const string kAssetIdAttribute = \"AssetId\";\n\n        private readonly ConcurrentDictionary<string, AssetResource> _assets = new();\n        private readonly ConcurrentDictionary<string, DeviceResource> _devices = new();\n        private readonly IAioSrClient _schemaRegistry;\n        private readonly IDisposable _srevents;\n        private readonly Channel<(string, Resource)> _changeFeed;\n        private readonly IConfigurationServices _configurationServices;\n        private readonly IConnectionServices<ConnectionModel> _connections;\n        private readonly IDiscoveryServices _discovery;\n        private readonly IAioAdrClient _client;\n        private readonly IPublishedNodesServices _publishedNodes;\n        private readonly IJsonSerializer _serializer;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly ILogger _logger;\n        private readonly CancellationTokenSource _cts;\n        private readonly Task _processor;\n        private readonly Task _assetDiscovery;\n        private readonly Task _deviceDiscovery;\n        private readonly AsyncManualResetEvent _trigger;\n        private readonly Timer _timer;\n        private int _lastDeviceListVersion;\n        private bool _isDisposed;\n\n        // TODO: START: Remove once adr is fixed\n        private static string SetEndpointUrl(string endpointUrl)\n            => $\"{endpointUrl}{kAddressSplit}{Interlocked.Increment(ref _epindex)}\";\n        private static int _epindex;\n        private static string GetEndpointUrl(string address)\n            => address.Contains(kAddressSplit, StringComparison.Ordinal) ?\n                address.Split(kAddressSplit)[0] : address;\n\n        private const string kAddressSplit = \"?___\";\n        // TODO: END Remove when adr is fixed\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for AssetDeviceIntegration\n    /// </summary>\n    internal static partial class AssetDeviceIntegrationLogging\n    {\n        private const int EventClass = 2000;\n\n        internal static bool IsDebugLogConfigurationEnabled(this ILogger logger)\n#if !DEBUG\n            => logger.IsEnabled(LogLevel.Debug);\n#else\n            => true;\n#endif\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Failed to close discovery runner.\")]\n        internal static partial void FailedToCloseDiscoveryRunner(this ILogger logger,\n            Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Failed to close conversion processor\")]\n        internal static partial void FailedToCloseConversionProcessor(this ILogger logger,\n            Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Device {DeviceName} with endpoint {EndpointName} added.\")]\n        internal static partial void DeviceAdded(this ILogger logger, string deviceName,\n            string endpointName);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Debug,\n            Message = \"Device {DeviceName} with endpoint {EndpointName} updated.\")]\n        internal static partial void DeviceUpdated(this ILogger logger, string deviceName,\n            string endpointName);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug,\n            Message = \"Reported deletion for resource {Resource} which was not found.\")]\n        internal static partial void ResourceDeletionNotFound(this ILogger logger, string resource);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Debug,\n            Message = \"Device {DeviceName} with endpoint {EndpointName} removed.\")]\n        internal static partial void DeviceRemoved(this ILogger logger,\n            string deviceName, string endpointName);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Asset {AssetName} on device {DeviceName} with endpoint {EndpointName} added.\")]\n        internal static partial void AssetAdded(this ILogger logger, string assetName,\n            string deviceName, string endpointName);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Debug,\n            Message = \"Asset {AssetName} on device {DeviceName} with endpoint {EndpointName} updated.\")]\n        internal static partial void AssetUpdated(this ILogger logger, string assetName,\n            string deviceName, string endpointName);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Debug,\n            Message = \"Asset {AssetName} on device {DeviceName} with endpoint {EndpointName} removed.\")]\n        internal static partial void AssetRemoved(this ILogger logger, string assetName,\n            string deviceName, string endpointName);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Debug,\n            Message = \"Removing asset {Asset} without device {Device}\")]\n        internal static partial void RemovingAssetWithoutDevice(this ILogger logger,\n            string asset, string device);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Information,\n            Message = \"Converting {Assets} Assets on {Devices} devices...\")]\n        internal static partial void ConvertingAssetsOnDevices(this ILogger logger,\n            int assets, int devices);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Debug, SkipEnabledCheck = true,\n            Message = \"New configuration applied:\\n{Configuration}\")]\n        internal static partial void NewConfigurationApplied(this ILogger logger,\n            string configuration);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"{Assets} Assets on {Devices} devices updated.\")]\n        internal static partial void AssetsAndDevicesUpdated(this ILogger logger,\n            int assets, int devices);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"Devices were updated, starting immediate discovery.\")]\n        internal static partial void DevicesUpdatedStartingDiscovery(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Warning,\n            Message = \"Dropping result {Result} without required information.\")]\n        internal static partial void DroppingResultWithoutRequiredInformation(\n            this ILogger logger, string? result);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Debug, SkipEnabledCheck = true,\n            Message = \"Reporting new discovered asset {AssetName} with id \" +\n            \"{AssetId} and type {AssetTypeRef}:\\n{Asset}\")]\n        internal static partial void ReportingNewDiscoveredAsset(this ILogger logger,\n            string assetName, string assetId, string assetTypeRef, string asset);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Error,\n            Message = \"Additional configuration for endpoint {EndpointName} on \" +\n            \"device {DeviceName} is too long ({Length} > 512). Skipping.\")]\n        internal static partial void EndpointConfigurationTooLong(this ILogger logger,\n            string endpointName, string deviceName, int length);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Debug,\n            Message = \"No endpoints found on device {DeviceName}.\")]\n        internal static partial void NoEndpointsFound(this ILogger logger, string deviceName);\n\n        [LoggerMessage(EventId = EventClass + 19, Level = LogLevel.Debug, SkipEnabledCheck = true,\n            Message = \"Reporting new discovered device {DeviceName} with type {EndpointType}:\\n{Device}\")]\n        internal static partial void ReportingNewDiscoveredDevice(this ILogger logger,\n            string deviceName, string endpointType, string device);\n\n        [LoggerMessage(EventId = EventClass + 20, Level = LogLevel.Information,\n            Message = \"Running discovery for all devices...\")]\n        internal static partial void RunningDiscoveryForAllDevices(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 21, Level = LogLevel.Error,\n            Message = \"Failed to run discovery for device {Device}\")]\n        internal static partial void FailedToRunDiscoveryForDevice(this ILogger logger,\n            Exception ex, string device);\n\n        [LoggerMessage(EventId = EventClass + 22, Level = LogLevel.Error,\n            Message = \"Failed to run endpoint discovery for device {Device}\")]\n        internal static partial void FailedToRunEndpointDiscoveryForDevice(this ILogger logger,\n            Exception ex, string device);\n\n        [LoggerMessage(EventId = EventClass + 23, Level = LogLevel.Information,\n            Message = \"Running discovery for all devices interrupted.\")]\n        internal static partial void RunningDiscoveryInterrupted(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 24, Level = LogLevel.Information,\n            Message = \"Running discovery for all devices completed.\")]\n        internal static partial void RunningDiscoveryCompleted(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 25, Level = LogLevel.Information,\n            Message = \"Reporting status for {Assets} assets and {Devices} devices.\")]\n        internal static partial void ReportingStatus(this ILogger logger, int assets, int devices);\n\n        [LoggerMessage(EventId = EventClass + 26, Level = LogLevel.Warning,\n            Message = \"Encountered Error {Code} {Error} for resource {Resource}.\")]\n        internal static partial void EncounteredError(this ILogger logger, string code, string error,\n            AssetDeviceIntegration.Resource resource);\n\n        [LoggerMessage(EventId = EventClass + 27, Level = LogLevel.Error,\n            Message = \"Failed to report new discovered server {Device}\")]\n        internal static partial void FailedToReportDiscoveredServer(this ILogger logger,\n            Exception ex, string device);\n\n        [LoggerMessage(EventId = EventClass + 28, Level = LogLevel.Error,\n            Message = \"Invalid device change event {ChangeType} received: {Device} {Endpoint}\")]\n        internal static partial void InvalidDeviceChangeEventReceived(this ILogger logger,\n            ChangeType changeType, string device, string endpoint);\n\n        [LoggerMessage(EventId = EventClass + 29, Level = LogLevel.Error,\n            Message = \"Invalid asset change event {ChangeType} received: {Device} {Endpoint} {Asset}\")]\n        internal static partial void InvalidAssetChangeEventReceived(this ILogger logger,\n            ChangeType changeType, string device, string endpoint, string asset);\n\n        [LoggerMessage(EventId = EventClass + 30, Level = LogLevel.Information,\n            Message = \"Testing connection with device {Device} on endpoint {Endpoint} resulted in {ErrorInfo}\")]\n        internal static partial void FailedToConnectToDeviceEndpoint(this ILogger logger,\n            string device, string endpoint, ServiceResultModel errorInfo);\n\n        [LoggerMessage(EventId = EventClass + 31, Level = LogLevel.Error,\n            Message = \"Unexpected error processing asset and device changes\")]\n        internal static partial void UnexpectedErrorProcessingChanges(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 32, Level = LogLevel.Error,\n            Message = \"Registration of schema has invalid values\")]\n        internal static partial void SchemaRegistrationInvalidValues(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 33, Level = LogLevel.Debug,\n            Message = \"Cannot register schema without identifier\")]\n        internal static partial void CannotRegisterSchemaWithoutIdentifier(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 34, Level = LogLevel.Debug,\n            Message = \"Malformed schema id {Id} cannot be used for lookup\")]\n        internal static partial void MalformedSchemaId(this ILogger logger, string id);\n\n        [LoggerMessage(EventId = EventClass + 35, Level = LogLevel.Information,\n            Message = \"Registering schema '{Name}' with version '{Version}' for resource '{Resource}' \" +\n            \"in asset '{Asset}' inside schema namespace '{Namespace}'\")]\n        internal static partial void RegisteringSchema(this ILogger logger, string name, string version,\n            string resource, string asset, string @namespace);\n\n        [LoggerMessage(EventId = EventClass + 36, Level = LogLevel.Information,\n            Message = \"No asset found with name {AssetName} to attach schema {Schema} to.\")]\n        internal static partial void NoAssetFoundForSchema(this ILogger logger, string assetName, string? schema);\n\n        [LoggerMessage(EventId = EventClass + 37, Level = LogLevel.Information,\n            Message = \"No resource {Resource} found in Asset {Asset} to attach the schema {Schema} to.\")]\n        internal static partial void NoResourceFoundInAssetForSchema(this ILogger logger, string resource, string asset, string? schema);\n\n        [LoggerMessage(EventId = EventClass + 39, Level = LogLevel.Error,\n            Message = \"Unexpected error during discovery.\")]\n        internal static partial void UnexpectedErrorDuringDiscovery(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 40, Level = LogLevel.Error,\n            Message = \"Failed to update asset status for asset {Asset} with device {Device} with endpoint {Endpoint}\")]\n        internal static partial void FailedToUpdateAssetStatus(this ILogger logger, Exception ex,\n            string asset, string device, string endpoint);\n\n        [LoggerMessage(EventId = EventClass + 41, Level = LogLevel.Error,\n            Message = \"Failed to update asset status for device {Device} with endpoint {Endpoint}\")]\n        internal static partial void FailedToUpdateDeviceStatus(this ILogger logger, Exception ex,\n            string device, string endpoint);\n\n        [LoggerMessage(EventId = EventClass + 42, Level = LogLevel.Information,\n            Message = \"Running network discovery ...\")]\n        internal static partial void RunningNetworkDiscovery(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 43, Level = LogLevel.Information,\n            Message = \"Network discovery completed.\")]\n        internal static partial void NetworkDiscoveryComplete(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 44, Level = LogLevel.Error,\n            Message = \"Unexpected error during network discovery.\")]\n        internal static partial void UnexpectedErrorDuringNetworkDiscovery(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 45, Level = LogLevel.Information,\n            Message = \"Device {Device} already present - skipping.\")]\n        internal static partial void DeviceAlreadyPresentSkipping(this ILogger logger, string device);\n\n        [LoggerMessage(EventId = EventClass + 46, Level = LogLevel.Information,\n            Message = \"Network discovery disabled.\")]\n        internal static partial void NetworkDiscoveryDisabled(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 47, Level = LogLevel.Information,\n            Message = \"Network discovery was configured to only run once - exiting.\")]\n        internal static partial void NetworkDiscoveryConfiguredToOnlyRunOnce(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 48, Level = LogLevel.Information,\n            Message = \"Registered schema '{Name}' with version '{Version}' for resource '{Resource}' in asset \" +\n            \"'{Asset}' inside schema namespace '{Namespace}'\")]\n        internal static partial void RegisteredSchema(this ILogger logger,\n            string name, string version, string resource, string asset, string @namespace);\n\n        [LoggerMessage(EventId = EventClass + 49, Level = LogLevel.Debug,\n            Message = \"Error registering schema '{Name}' with version '{Version}' for resource '{Resource}' in asset \" +\n            \"'{Asset}' inside schema namespace '{Namespace}' - retrying ...\")]\n        internal static partial void RegisteredSchemaErrorDebug(this ILogger logger, Exception ex,\n            string name, string version, string resource, string asset, string @namespace);\n\n        [LoggerMessage(EventId = EventClass + 50, Level = LogLevel.Error,\n            Message = \"Error registering schema '{Name}' with version '{Version}' for resource '{Resource}' in asset \" +\n            \"'{Asset}' inside schema namespace '{Namespace}'\")]\n        internal static partial void RegisteredSchemaError(this ILogger logger, Exception ex,\n            string name, string version, string resource, string asset, string @namespace);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/AsyncEnumerableBrowser.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Async enumerable browsing operation base class. Used in configuration\n    /// and file system browse operations.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    internal abstract class AsyncEnumerableBrowser<T> : AsyncEnumerableEnumerableStack<T>\n        where T : class\n    {\n        protected TimeProvider TimeProvider { get; }\n        protected RequestHeaderModel? Header { get; }\n        protected IOptions<PublisherOptions> Options { get; }\n\n        /// <summary>\n        /// Create browser\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"root\"></param>\n        /// <param name=\"typeDefinitionId\"></param>\n        /// <param name=\"includeTypeDefinitionSubtypes\"></param>\n        /// <param name=\"maxDepth\"></param>\n        /// <param name=\"nodeClass\"></param>\n        /// <param name=\"referenceTypeId\"></param>\n        /// <param name=\"includeReferenceTypeSubtypes\"></param>\n        /// <param name=\"matchClass\"></param>\n        protected AsyncEnumerableBrowser(RequestHeaderModel? header,\n            IOptions<PublisherOptions> options, TimeProvider? timeProvider = null,\n            BrowseFrame? root = null, NodeId? typeDefinitionId = null,\n            bool includeTypeDefinitionSubtypes = true,\n            uint? maxDepth = null, Opc.Ua.NodeClass nodeClass = Opc.Ua.NodeClass.Object,\n            NodeId? referenceTypeId = null, bool includeReferenceTypeSubtypes = true,\n            Opc.Ua.NodeClass? matchClass = null)\n        {\n            Header = header;\n            Options = options;\n            TimeProvider = timeProvider ?? TimeProvider.System;\n\n            _root = null!;\n            _referenceTypeId = null!;\n\n            Initialize(maxDepth, root, nodeClass, typeDefinitionId,\n                includeTypeDefinitionSubtypes, referenceTypeId,\n                includeReferenceTypeSubtypes, matchClass);\n        }\n\n        /// <inheritdoc/>\n        public override void Dispose()\n        {\n            _activitySource.Dispose();\n        }\n\n        /// <inheritdoc/>\n        public override void Reset()\n        {\n            base.Reset();\n            OnReset();\n        }\n\n        /// <summary>\n        /// Override to disable starting browsing\n        /// </summary>\n        protected virtual void OnReset()\n        {\n            Start();\n        }\n\n        /// <summary>\n        /// Restart browsing with different configuration\n        /// </summary>\n        /// <param name=\"root\"></param>\n        /// <param name=\"maxDepth\"></param>\n        /// <param name=\"typeDefinitionId\"></param>\n        /// <param name=\"includeTypeDefinitionSubtypes\"></param>\n        /// <param name=\"referenceTypeId\"></param>\n        /// <param name=\"includeReferenceTypeSubtypes\"></param>\n        /// <param name=\"nodeClass\"></param>\n        /// <param name=\"matchClass\"></param>\n        protected void Restart(BrowseFrame? root = null, uint? maxDepth = null,\n            NodeId? typeDefinitionId = null, bool includeTypeDefinitionSubtypes = true,\n            NodeId? referenceTypeId = null, bool includeReferenceTypeSubtypes = true,\n            Opc.Ua.NodeClass nodeClass = Opc.Ua.NodeClass.Object,\n            Opc.Ua.NodeClass? matchClass = null)\n        {\n            Initialize(maxDepth, root, nodeClass, typeDefinitionId,\n                includeTypeDefinitionSubtypes, referenceTypeId,\n                includeReferenceTypeSubtypes, matchClass);\n            Start();\n        }\n\n        /// <summary>\n        /// Handle error\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"errorInfo\"></param>\n        /// <returns></returns>\n        protected abstract IEnumerable<T> HandleError(\n            ServiceCallContext context, ServiceResultModel errorInfo);\n\n        /// <summary>\n        /// handle matches\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"matching\"></param>\n        /// <param name=\"references\"></param>\n        /// <returns></returns>\n        protected abstract IEnumerable<T> HandleMatching(\n            ServiceCallContext context, IReadOnlyList<BrowseFrame> matching,\n            List<ReferenceDescription> references);\n\n        /// <summary>\n        /// Handle browse completion\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        protected virtual IEnumerable<T> HandleCompletion(ServiceCallContext context)\n        {\n            return [];\n        }\n\n        /// <summary>\n        /// Browse references\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private async ValueTask<IEnumerable<T>> BrowseAsync(ServiceCallContext context)\n        {\n            using var trace = _activitySource.StartActivity(\"Browse\");\n\n            var frame = Pop();\n            if (frame == null)\n            {\n                return HandleCompletion(context);\n            }\n\n            var browseDescriptions = new BrowseDescriptionCollection\n            {\n                new BrowseDescription\n                {\n                    BrowseDirection = Opc.Ua.BrowseDirection.Forward,\n                    NodeClassMask = (uint)_nodeClass | (uint)_matchClass,\n                    NodeId = frame.NodeId,\n                    ReferenceTypeId = _referenceTypeId,\n                    IncludeSubtypes = _includeReferenceTypeSubtypes,\n                    ResultMask = (uint)BrowseResultMask.All\n                }\n            };\n\n            // Browse and read children\n            var response = await context.Session.Services.BrowseAsync(\n                Header.ToRequestHeader(TimeProvider), null, 0,\n                browseDescriptions, context.Ct).ConfigureAwait(false);\n\n            var results = response.Validate(response.Results, r => r.StatusCode,\n                response.DiagnosticInfos, browseDescriptions);\n            if (results.ErrorInfo != null)\n            {\n                return HandleError(context, results.ErrorInfo);\n            }\n            var refs = MatchReferences(frame, context, results[0].Result.References,\n                results[0].ErrorInfo);\n            var continuation = results[0].Result.ContinuationPoint ?? [];\n            if (continuation.Length > 0)\n            {\n                Push(context => BrowseNextAsync(context, continuation, frame));\n            }\n            else\n            {\n                Push(BrowseAsync);\n            }\n            return refs;\n        }\n\n        /// <summary>\n        /// Browse remainder of references\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        /// <param name=\"frame\"></param>\n        /// <returns></returns>\n        private async ValueTask<IEnumerable<T>> BrowseNextAsync(ServiceCallContext context,\n            byte[] continuationPoint, BrowseFrame frame)\n        {\n            using var trace = _activitySource.StartActivity(\"BrowseNext\");\n\n            var continuationPoints = new ByteStringCollection { continuationPoint };\n            var response = await context.Session.Services.BrowseNextAsync(\n                Header.ToRequestHeader(TimeProvider), false, continuationPoints,\n                context.Ct).ConfigureAwait(false);\n\n            var results = response.Validate(response.Results, r => r.StatusCode,\n                response.DiagnosticInfos, continuationPoints);\n            if (results.ErrorInfo != null)\n            {\n                return HandleError(context, results.ErrorInfo);\n            }\n\n            var refs = MatchReferences(frame, context, results[0].Result.References,\n                results[0].ErrorInfo);\n\n            var continuation = results[0].Result.ContinuationPoint ?? [];\n            if (continuation.Length > 0)\n            {\n                Push(session => BrowseNextAsync(session, continuation, frame));\n            }\n            else\n            {\n                Push(BrowseAsync);\n            }\n            return refs;\n        }\n\n        /// <summary>\n        /// Collect references\n        /// </summary>\n        /// <param name=\"frame\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"refs\"></param>\n        /// <param name=\"errorInfo\"></param>\n        /// <returns></returns>\n        private IEnumerable<T> MatchReferences(BrowseFrame frame, ServiceCallContext context,\n            ReferenceDescriptionCollection refs, ServiceResultModel? errorInfo)\n        {\n            if (errorInfo != null)\n            {\n                return HandleError(context, errorInfo);\n            }\n\n            var matching = refs\n                .Where(reference => ((int)reference.NodeClass & (int)_matchClass) != 0\n                    && (reference.NodeId?.ServerIndex ?? 1u) == 0\n                    && MatchTypeDefinitionId(context.Session, reference.TypeDefinition))\n                .Select(reference => new BrowseFrame((NodeId)reference.NodeId,\n                    reference.BrowseName, reference.DisplayName?.Text,\n                    reference.TypeDefinition, reference.NodeClass, frame,\n                    IsChildOf(context.Session, reference, frame)))\n                .ToList();\n\n            var results = matching.Count != 0 ? HandleMatching(context, matching, refs) : [];\n\n            // Browse deeper\n            foreach (var reference in refs)\n            {\n                Push(reference.NodeId, reference.BrowseName,\n                    reference.DisplayName?.Text, reference.TypeDefinition,\n                    reference.NodeClass, frame,\n                    IsChildOf(context.Session, reference, frame));\n            }\n            return results;\n\n            bool? IsChildOf(IOpcUaSession session, ReferenceDescription reference,\n                BrowseFrame parent)\n            {\n                var referenceTypeId = reference.ReferenceTypeId;\n                var parentTypeDefinitionId = parent.TypeDefinitionId;\n\n                if (NodeId.IsNull(parentTypeDefinitionId))\n                {\n                    return null;\n                }\n                if (session.LruNodeCache.IsTypeOf(referenceTypeId, ReferenceTypeIds.HasComponent) ||\n                    session.LruNodeCache.IsTypeOf(referenceTypeId, ReferenceTypeIds.HasProperty))\n                {\n                    var parentIsFolder = session.LruNodeCache.IsTypeOf(parentTypeDefinitionId,\n                        ObjectTypeIds.FolderType);\n#if DEBUG\n                    Debug.WriteLine(parent.BrowseName\n                        + \"(\" + (parentIsFolder ? \"Folder\" : \"Component\") + \")--\"\n                        + referenceTypeId + \"-->\" + reference.BrowseName);\n#endif\n                    return !parentIsFolder;\n                }\n                return false;\n            }\n\n            // Helper to match type definition to desired type definition id\n            bool MatchTypeDefinitionId(IOpcUaSession session, ExpandedNodeId typeDefinition)\n            {\n                if (typeDefinition == _typeDefinitionId || _typeDefinitionId == null)\n                {\n                    return true;\n                }\n                if (_includeTypeDefinitionSubtypes && !NodeId.IsNull(typeDefinition))\n                {\n                    var typeDefinitionId = ExpandedNodeId.ToNodeId(typeDefinition,\n                        session.MessageContext.NamespaceUris);\n                    return session.LruNodeCache.IsTypeOf(typeDefinitionId, _typeDefinitionId);\n                }\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Initialize\n        /// </summary>\n        private void Start()\n        {\n            // Initialize\n            _visited.Clear();\n            _browseStack.Push(_root);\n            Push(BrowseAsync);\n        }\n\n        /// <summary>\n        /// Helper to push nodes onto the browse stack\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"displayName\"></param>\n        /// <param name=\"typeDefinition\"></param>\n        /// <param name=\"nodeClass\"></param>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"isChildOfParent\"></param>\n        private void Push(ExpandedNodeId nodeId, QualifiedName? browseName, string? displayName,\n            ExpandedNodeId typeDefinition, Opc.Ua.NodeClass nodeClass, BrowseFrame? parent,\n            bool? isChildOfParent)\n        {\n            if ((nodeId?.ServerIndex ?? 1u) != 0)\n            {\n                return;\n            }\n            var local = (NodeId)nodeId;\n            if (!NodeId.IsNull(local) && !_visited.Contains(local))\n            {\n                var frame = new BrowseFrame(local, browseName, displayName,\n                    typeDefinition, nodeClass, parent, isChildOfParent);\n                if (_maxDepth.HasValue && frame.Depth >= _maxDepth.Value)\n                {\n                    return;\n                }\n                _browseStack.Push(frame);\n            }\n        }\n\n        /// <summary>\n        /// Helper to pop nodes from the browse stack\n        /// </summary>\n        /// <returns></returns>\n        private BrowseFrame? Pop()\n        {\n            while (_browseStack.TryPop(out var frame))\n            {\n                if (!NodeId.IsNull(frame.NodeId) && !_visited.Contains(frame.NodeId))\n                {\n                    return frame;\n                }\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Tracks a reference to a node\n        /// </summary>\n        /// <param name=\"NodeId\"></param>\n        /// <param name=\"BrowseName\"></param>\n        /// <param name=\"DisplayName\"></param>\n        /// <param name=\"TypeDefinitionId\"></param>\n        /// <param name=\"NodeClass\"></param>\n        /// <param name=\"Parent\"></param>\n        /// <param name=\"IsChildOfParent\"></param>\n        protected internal record class BrowseFrame(NodeId NodeId, QualifiedName? BrowseName = null,\n            string? DisplayName = null, ExpandedNodeId? TypeDefinitionId = null,\n            Opc.Ua.NodeClass? NodeClass = null, BrowseFrame? Parent = null,\n            bool? IsChildOfParent = null)\n        {\n            /// <summary>\n            /// Current depth of this frame\n            /// </summary>\n            public uint Depth\n            {\n                get\n                {\n                    var depth = 0u;\n                    for (var parent = Parent; parent != null; parent = parent.Parent)\n                    {\n                        depth++;\n                    }\n                    return depth;\n                }\n            }\n\n            /// <summary>\n            /// Get the root frame that is not a child of anything\n            /// </summary>\n            public BrowseFrame? RootFrame\n            {\n                get\n                {\n                    //\n                    // child, not child, child, child, not child (*), not child, not child.\n                    // (*) <- this is what we want to return here\n                    //\n                    BrowseFrame? found = null;\n                    for (var parent = this; parent != null; parent = parent.Parent)\n                    {\n                        if (parent.IsChildOfParent != true)\n                        {\n                            found ??= parent; // Set if not already set\n                            continue;\n                        }\n                        found = null;\n                    }\n                    return found;\n                }\n            }\n\n            /// <summary>\n            /// Browse path to the node from root\n            /// </summary>\n            public string BrowsePath\n            {\n                get\n                {\n                    var path = BrowseName?.ToString() ?? string.Empty;\n                    for (var parent = Parent; parent?.BrowseName != null; parent = parent.Parent)\n                    {\n                        path = $\"{parent.BrowseName}/{path}\";\n                    }\n                    return \"/\" + path;\n                }\n            }\n\n            /// <summary>\n            /// All browse frames to the root\n            /// </summary>\n            public IEnumerable<BrowseFrame> AllFramesToRoot\n            {\n                get\n                {\n                    for (var frame = this; frame != null; frame = frame.Parent)\n                    {\n                        yield return frame;\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Create a name for the object that is rooted in a root browse frame,\n            /// e.g. the writer group, structurally. We use . seperator to create\n            /// names that can be reused in topics and paths.\n            /// </summary>\n            /// <param name=\"root\"></param>\n            /// <returns></returns>\n            public string BrowseNameFromRootFrame(BrowseFrame? root)\n            {\n                var cur = this;\n                if (cur.BrowseName?.Name == null || cur == root)\n                {\n                    return \"Default\";\n                }\n\n                var result = cur.BrowseName.Name;\n                cur = cur.Parent;\n                while (cur != root)\n                {\n                    if (cur?.BrowseName?.Name == null)\n                    {\n                        // not rooted in root because we hit a null parent,\n                        // return cur browsename\n                        return BrowseName!.Name;\n                    }\n                    result = cur.BrowseName.Name + \".\" + result;\n                    cur = cur.Parent;\n                }\n                return result;\n            }\n        }\n\n        /// <summary>\n        /// Restart browsing with different configuration\n        /// </summary>\n        /// <param name=\"maxDepth\"></param>\n        /// <param name=\"root\"></param>\n        /// <param name=\"nodeClass\"></param>\n        /// <param name=\"typeDefinitionId\"></param>\n        /// <param name=\"includeTypeDefinitionSubtypes\"></param>\n        /// <param name=\"referenceTypeId\"></param>\n        /// <param name=\"includeReferenceTypeSubtypes\"></param>\n        /// <param name=\"matchClass\"></param>\n        private void Initialize(uint? maxDepth, BrowseFrame? root, Opc.Ua.NodeClass nodeClass,\n            NodeId? typeDefinitionId, bool includeTypeDefinitionSubtypes,\n            NodeId? referenceTypeId, bool includeReferenceTypeSubtypes,\n            Opc.Ua.NodeClass? matchClass)\n        {\n            _nodeClass = nodeClass;\n            _matchClass = matchClass ?? nodeClass;\n            _maxDepth = maxDepth;\n            _root = root ?? new BrowseFrame(ObjectIds.ObjectsFolder);\n\n            _typeDefinitionId =\n                typeDefinitionId;\n            _includeTypeDefinitionSubtypes =\n                includeTypeDefinitionSubtypes;\n            _referenceTypeId =\n                referenceTypeId ?? ReferenceTypeIds.HierarchicalReferences;\n            _includeReferenceTypeSubtypes =\n                includeReferenceTypeSubtypes;\n        }\n\n        private Opc.Ua.NodeClass _nodeClass;\n        private Opc.Ua.NodeClass _matchClass;\n        private uint? _maxDepth;\n        private BrowseFrame _root;\n        private NodeId _referenceTypeId;\n        private bool _includeReferenceTypeSubtypes;\n        private NodeId? _typeDefinitionId;\n        private bool _includeTypeDefinitionSubtypes;\n        private readonly Stack<BrowseFrame> _browseStack = new();\n        private readonly HashSet<NodeId> _visited = [];\n        private readonly ActivitySource _activitySource = Diagnostics.NewActivitySource();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/ConfigurationBrowser.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Configuration browser\n    /// </summary>\n    internal sealed class ConfigurationBrowser : AsyncEnumerableBrowser<ServiceResponse<PublishedNodesEntryModel>>\n    {\n        /// <inheritdoc/>\n        public ConfigurationBrowser(PublishedNodesEntryModel entry, PublishedNodeExpansionModel request,\n            IOptions<PublisherOptions> options, IPublishedNodesServices? configuration, ILogger logger,\n            TimeProvider? timeProvider = null, bool allowNoResolution = false)\n            : base(request.Header, options, timeProvider)\n        {\n            _entry = entry;\n            _request = request;\n            _configuration = configuration;\n            _logger = logger;\n            _allowNoResolution = allowNoResolution;\n        }\n\n        /// <inheritdoc/>\n        public override void Reset()\n        {\n            base.Reset();\n\n            _nodeIndex = -1;\n            _expanded.Clear();\n\n            Push(BeginAsync);\n        }\n\n        /// <inheritdoc/>\n        protected override void OnReset()\n        {\n            // We handle our own restarts\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<ServiceResponse<PublishedNodesEntryModel>> HandleError(\n            ServiceCallContext context, ServiceResultModel errorInfo)\n        {\n            var node = _currentObject != null ? _currentObject.OriginalNode : CurrentNode;\n            node.AddErrorInfo(errorInfo);\n            _logger.HandleError(node, errorInfo);\n            return [];\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<ServiceResponse<PublishedNodesEntryModel>> HandleMatching(\n            ServiceCallContext context, IReadOnlyList<BrowseFrame> matching,\n            List<ReferenceDescription> references)\n        {\n            uint originalNodeClass;\n            if (_currentObject == null)\n            {\n                // collect matching object instances\n                originalNodeClass = CurrentNode.NodeClass;\n                CurrentNode.AddObjectsOrVariables(matching);\n            }\n            else\n            {\n                originalNodeClass = _currentObject.OriginalNode.NodeClass;\n                // collect matching variables under the current object instance\n                var nodes = matching\n                    .Where(m => m.NodeClass is Opc.Ua.NodeClass.Variable or Opc.Ua.NodeClass.Method);\n                var objects = matching\n                    .Where(m => m.NodeClass == Opc.Ua.NodeClass.Object);\n                if (_currentObject.AddNodes(nodes))\n                {\n                    _logger.DroppedDuplicateItems();\n                }\n                // Add components of the current object - these will be expanded\n                // when we move to next object.\n                _currentObject.OriginalNode.AddObjectsOrVariables(objects);\n                if (originalNodeClass == (uint)Opc.Ua.NodeClass.ObjectType && !_request.FlattenTypeInstance)\n                {\n                    // Only expand variables of current object in match loop\n                    references.RemoveAll(m => m.NodeClass == Opc.Ua.NodeClass.Object);\n                }\n            }\n            if ((originalNodeClass == (uint)Opc.Ua.NodeClass.ObjectType && _request.FlattenTypeInstance) ||\n                originalNodeClass == (uint)Opc.Ua.NodeClass.VariableType)\n            {\n                // Browse deeper for other variables of the type\n                var stop = matching.Select(r => r.NodeId).ToHashSet();\n                references.RemoveAll(r => stop.Contains((NodeId)r.NodeId));\n            }\n            return [];\n        }\n\n        /// <inheritdoc/>\n        protected override IEnumerable<ServiceResponse<PublishedNodesEntryModel>> HandleCompletion(\n            ServiceCallContext context)\n        {\n            Push(CompleteAsync);\n            return [];\n        }\n\n        /// <summary>\n        /// Complete the browse operation and resolve objects\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private async ValueTask<IEnumerable<ServiceResponse<PublishedNodesEntryModel>>> CompleteAsync(\n            ServiceCallContext context)\n        {\n            var results = new List<ServiceResponse<PublishedNodesEntryModel>>();\n            var currentObject = _currentObject;\n            if (currentObject != null)\n            {\n                // Process current object\n                await ProcessAsync(currentObject, context, results).ConfigureAwait(false);\n\n                if (TryMoveToNextObject())\n                {\n                    // Kicked off the next expansion\n                    return results;\n                }\n                Debug.Assert(_currentObject == null);\n            }\n            else if (CurrentNode.Variables.ContainsVariables)\n            {\n                // Completing the browse operation for variables of variables\n                await ProcessAsync(CurrentNode.Variables, context, results).ConfigureAwait(false);\n            }\n            else if (!CurrentNode.ContainsObjects)\n            {\n                // Completing a browse for objects\n                if (!CurrentNode.HasErrors && !_allowNoResolution)\n                {\n                    CurrentNode.AddErrorInfo(StatusCodes.BadNotFound, \"No objects resolved.\");\n                }\n            }\n            if (!TryMoveToNextNode())\n            {\n                // Complete\n                results.AddRange(await EndAsync(context).ConfigureAwait(false));\n            }\n            return results;\n\n            async Task ProcessAsync(ObjectToExpand currentObject, ServiceCallContext context,\n                List<ServiceResponse<PublishedNodesEntryModel>> results)\n            {\n                await currentObject.CompleteAsync(_request.Header.ToRequestHeader(TimeProvider),\n                    context).ConfigureAwait(false);\n\n                if (!_request.CreateSingleWriter &&\n                    (currentObject.ContainsVariables || currentObject.ContainsMethods || currentObject.ContainsEvents) &&\n                    !currentObject.OriginalNode.HasErrors)\n                {\n                    // Create a new writer entry for the object\n                    var root = currentObject.ObjectFromBrowse.RootFrame;\n                    var result = await SaveEntryAsync(new ServiceResponse<PublishedNodesEntryModel>\n                    {\n                        Result = _entry with\n                        {\n                            DataSetWriterId = currentObject.CreateWriterId(), // Unique\n                            DataSetWriterGroup = _entry.DataSetWriterGroup ?? root?.BrowseName?.Name,\n                            // Name of the dataset with DataSetWriterGroup as root\n                            DataSetName = currentObject.ObjectFromBrowse.BrowseNameFromRootFrame(root),\n                            DataSetRootNodeId = currentObject.ObjectFromBrowse.NodeId?.AsString(\n                                context.Session.MessageContext, NamespaceFormat.Expanded),\n                            // Type of the dataset\n                            DataSetType = currentObject.ObjectFromBrowse.TypeDefinitionId?.AsString(\n                                context.Session.MessageContext, NamespaceFormat.ExpandedWithNamespace0),\n                            // Type of the writer group\n                            WriterGroupType = root?.TypeDefinitionId?.AsString(\n                                context.Session.MessageContext, NamespaceFormat.ExpandedWithNamespace0),\n                            WriterGroupRootNodeId = root?.NodeId?.AsString(\n                                context.Session.MessageContext, NamespaceFormat.Expanded),\n                            OpcNodes = currentObject\n                                .GetOpcNodeModels(\n                                    currentObject.OriginalNode.NodeFromConfiguration,\n                                    context.Session.MessageContext,\n                                    _request.UseBrowseNameAsDisplayName, createLongIds: false)\n                                .ToList()\n                        }\n                    }, context.Ct).ConfigureAwait(false);\n\n                    currentObject.EntriesAlreadyReturned = true;\n                    if (!_request.DiscardErrors || result.ErrorInfo == null)\n                    {\n                        // Add good entry to return _now_\n                        results.Add(result);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Start by resolving nodes and starting the browse operation\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private async ValueTask<IEnumerable<ServiceResponse<PublishedNodesEntryModel>>> BeginAsync(\n            ServiceCallContext context)\n        {\n            if (_entry.OpcNodes?.Count > 0)\n            {\n                // TODO: Could be done in one request for better efficiency\n                foreach (var node in _entry.OpcNodes)\n                {\n                    try\n                    {\n                        var nodeId = await context.Session.ResolveNodeIdAsync(_request.Header,\n                            node.Id, node.BrowsePath, nameof(node.BrowsePath), TimeProvider,\n                            context.Ct).ConfigureAwait(false);\n\n                        var readValueIds = new ReadValueIdCollection\n                        {\n                            new ReadValueId\n                            {\n                                NodeId = nodeId,\n                                AttributeId = Attributes.NodeClass\n                            },\n                            new ReadValueId\n                            {\n                                NodeId = nodeId,\n                                AttributeId = Attributes.BrowseName\n                            },\n                            new ReadValueId\n                            {\n                                NodeId = nodeId,\n                                AttributeId = Attributes.DisplayName\n                            }\n                        };\n                        var response = await context.Session.Services.ReadAsync(\n                            _request.Header.ToRequestHeader(TimeProvider), 0,\n                            Opc.Ua.TimestampsToReturn.Neither, readValueIds,\n                            context.Ct).ConfigureAwait(false);\n\n                        var readResults = response.Validate(response.Results,\n                            s => s.StatusCode, response.DiagnosticInfos, readValueIds);\n\n                        var errorInfo = readResults.ErrorInfo ??\n                            readResults[0].ErrorInfo;\n                        var nodeClass = errorInfo != null ? Opc.Ua.NodeClass.Unspecified :\n                            readResults[0].Result.GetValueOrDefaultEx<Opc.Ua.NodeClass>();\n                        var browseName = errorInfo != null ? null :\n                            readResults[1].Result.GetValueOrDefaultEx<QualifiedName>();\n                        var displayName = errorInfo != null ? null :\n                            readResults[2].Result.GetValueOrDefaultEx<LocalizedText>();\n\n                        ExpandedNodeId? typeDefinitionId = null;\n                        if (errorInfo == null)\n                        {\n                            switch (nodeClass)\n                            {\n                                case Opc.Ua.NodeClass.ObjectType:\n                                case Opc.Ua.NodeClass.VariableType:\n                                    typeDefinitionId = nodeId;\n                                    break;\n                                case Opc.Ua.NodeClass.Object:\n                                    var (results, errorInfo2) = await context.Session.FindAsync(\n                                        _request.Header.ToRequestHeader(TimeProvider),\n                                        nodeId.YieldReturn(), ReferenceTypeIds.HasTypeDefinition,\n                                        nodeClassMask: (uint)Opc.Ua.NodeClass.ObjectType,\n                                        ct: context.Ct).ConfigureAwait(false);\n                                    errorInfo = errorInfo2;\n                                    if (errorInfo != null)\n                                    {\n                                        break;\n                                    }\n                                    Debug.Assert(results.Count == 1);\n                                    typeDefinitionId = results[0].Node;\n                                    break;\n                            }\n                        }\n                        _expanded.Add(new NodeToExpand(node, nodeId, nodeClass,\n                            browseName, displayName, typeDefinitionId, errorInfo));\n                    }\n                    catch (Exception e)\n                    {\n                        _expanded.Add(new NodeToExpand(node, NodeId.Null, Opc.Ua.NodeClass.Unspecified,\n                            null, null, null, e.ToServiceResultModel()));\n                    }\n                }\n\n                if (!TryMoveToNextNode())\n                {\n                    // Complete\n                    return await EndAsync(context).ConfigureAwait(false);\n                }\n            }\n            return [];\n        }\n\n        /// <summary>\n        /// Return remaining entries\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        private async ValueTask<IEnumerable<ServiceResponse<PublishedNodesEntryModel>>> EndAsync(\n            ServiceCallContext context)\n        {\n            var results = new List<ServiceResponse<PublishedNodesEntryModel>>();\n            var ids = new HashSet<string?>();\n            var goodNodes = _expanded\n                .Where(e => !e.HasErrors)\n                .SelectMany(r => r.GetAllOpcNodeModels(context.Session.MessageContext,\n                    _request.UseBrowseNameAsDisplayName, ids))\n                .ToList();\n            if (goodNodes.Count > 0)\n            {\n                var result = await SaveEntryAsync(new ServiceResponse<PublishedNodesEntryModel>\n                {\n                    Result = _entry with { OpcNodes = goodNodes }\n                }, context.Ct).ConfigureAwait(false);\n                if (!_request.DiscardErrors || result.ErrorInfo == null)\n                {\n                    // Add good entry\n                    results.Add(result);\n                }\n            }\n            if (!_request.DiscardErrors)\n            {\n                var badNodes = _expanded\n                    .Where(e => e.HasErrors)\n                    .SelectMany(e => e.ErrorInfos\n                        .Select(error => (error, e\n                            .GetAllOpcNodeModels(context.Session.MessageContext,\n                                _request.UseBrowseNameAsDisplayName, ids, true)\n                            .ToList())))\n                    .GroupBy(e => e.error)\n                    .SelectMany(r => r.Select(r => r))\n                    .ToList();\n                foreach (var entry in badNodes)\n                {\n                    // Return bad entries\n                    results.Add(new ServiceResponse<PublishedNodesEntryModel>\n                    {\n                        ErrorInfo = entry.error,\n                        Result = _entry with { OpcNodes = entry.Item2 }\n                    });\n                }\n            }\n            _nodeIndex = -1;\n            _expanded.Clear();\n            return results;\n        }\n\n        /// <summary>\n        /// Try move to next node\n        /// </summary>\n        /// <returns></returns>\n        private bool TryMoveToNextNode()\n        {\n            Debug.Assert(_currentObject == null);\n            _nodeIndex++;\n            for (; _nodeIndex < _expanded.Count; _nodeIndex++)\n            {\n                switch (CurrentNode.NodeClass)\n                {\n                    case (uint)Opc.Ua.NodeClass.Object:\n                        // Resolve all objects under this object\n                        Debug.Assert(!NodeId.IsNull(CurrentNode.NodeId));\n                        if (!_request.ExcludeRootIfInstanceNode)\n                        {\n                            // Add root\n                            CurrentNode.AddObjectsOrVariables(\n                                new BrowseFrame(CurrentNode.NodeId!).YieldReturn());\n\n                            if (_request.MaxDepth == 0)\n                            {\n                                // We have the object - browse it now\n                                return TryMoveToNextObject();\n                            }\n                        }\n                        var depth = _request.MaxDepth == 0 ? 1 : _request.MaxDepth;\n                        Restart(\n                            CurrentNode.NodeId == null ? null : new BrowseFrame(CurrentNode.NodeId),\n                            maxDepth: depth, referenceTypeId: ReferenceTypeIds.HierarchicalReferences);\n                        return true;\n                    case (uint)Opc.Ua.NodeClass.VariableType:\n                    case (uint)Opc.Ua.NodeClass.ObjectType:\n                        // Resolve all objects of this type\n                        Debug.Assert(!NodeId.IsNull(CurrentNode.NodeId));\n                        var instanceClass =\n                            CurrentNode.NodeClass == (uint)Opc.Ua.NodeClass.ObjectType ?\n                                Opc.Ua.NodeClass.Object : Opc.Ua.NodeClass.Variable;\n                        Restart(null, maxDepth: _request.MaxDepth,\n                            typeDefinitionId: CurrentNode.NodeId,\n                            referenceTypeId: ReferenceTypeIds.HierarchicalReferences,\n                            matchClass: instanceClass);\n                        return true;\n                    case (uint)Opc.Ua.NodeClass.Variable:\n                        if (!_request.ExcludeRootIfInstanceNode)\n                        {\n                            // Add root\n                            CurrentNode.AddObjectsOrVariables(\n                                new BrowseFrame(CurrentNode.NodeId!).YieldReturn());\n\n                            if (_request.MaxLevelsToExpand == 0)\n                            {\n                                // Done - already a variable - stays in the original entry\n                                break;\n                            }\n                        }\n                        // Now we expand the variable here\n                        Restart(CurrentNode.NodeId == null ? null : new BrowseFrame(CurrentNode.NodeId),\n                            _request.MaxLevelsToExpand == 0 ? 1 : _request.MaxLevelsToExpand,\n                            referenceTypeId: ReferenceTypeIds.Aggregates,\n                            nodeClass: Opc.Ua.NodeClass.Variable);\n                        return true;\n                    case (uint)Opc.Ua.NodeClass.Unspecified:\n                        // There should already be an error here\n                        if (CurrentNode.HasErrors)\n                        {\n                            break;\n                        }\n                        goto default;\n                    default:\n                        CurrentNode.AddErrorInfo(StatusCodes.BadNotSupported,\n                            $\"Node class {CurrentNode.NodeClass} not supported.\");\n                        break;\n                }\n            }\n            return TryMoveToNextObject();\n        }\n\n        /// <summary>\n        /// Find next object to expand\n        /// </summary>\n        /// <returns></returns>\n        private bool TryMoveToNextObject()\n        {\n            foreach (var node in _expanded)\n            {\n                if (node.TryGetNextObject(out _currentObject))\n                {\n                    Debug.Assert(_currentObject != null);\n                    //\n                    // Now we are at the level where we expand the variables and optionally methods of\n                    // the object. This will match variables and variables in variables (properties).\n                    // as well as methods if included.\n                    //\n                    var nodeClass = Opc.Ua.NodeClass.Variable;\n                    var matchClass = Opc.Ua.NodeClass.Variable;\n                    var maxDepth = _request.MaxLevelsToExpand != 0 ? _request.MaxLevelsToExpand : (uint?)null;\n                    if (_request.IncludeMethods)\n                    {\n                        // Include methods in the match\n                        matchClass |= Opc.Ua.NodeClass.Method;\n                    }\n\n                    //\n                    // If the original node class was object type we also search for sub components\n                    // of the object found (other aggregates). We match variables if we flatten\n                    // and objects and variables when we want to create individual entries per object\n                    //\n                    if (_currentObject.OriginalNode.NodeClass == (uint)Opc.Ua.NodeClass.ObjectType)\n                    {\n                        nodeClass |= Opc.Ua.NodeClass.Object;\n                        if (!_request.FlattenTypeInstance)\n                        {\n                            // Match not just variables but also objects and expand them\n                            matchClass |= Opc.Ua.NodeClass.Object;\n                        }\n                        // maxDepth = null;\n                    }\n                    Restart(_currentObject.ObjectFromBrowse, maxDepth,\n                        referenceTypeId: ReferenceTypeIds.Aggregates, nodeClass: nodeClass,\n                        matchClass: matchClass);\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Save entry if update is enabled\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async ValueTask<ServiceResponse<PublishedNodesEntryModel>> SaveEntryAsync(\n            ServiceResponse<PublishedNodesEntryModel> entry, CancellationToken ct)\n        {\n            Debug.Assert(entry.Result != null);\n            Debug.Assert(entry.Result.OpcNodes != null);\n            Debug.Assert(entry.ErrorInfo == null);\n            try\n            {\n                ConfigurationServices.ValidateNodes(entry.Result.OpcNodes);\n                if (_configuration != null)\n                {\n                    await _configuration.CreateOrUpdateDataSetWriterEntryAsync(entry.Result,\n                        ct).ConfigureAwait(false);\n                }\n                return entry;\n            }\n            catch (Exception ex)\n            {\n                return entry with { ErrorInfo = ex.ToServiceResultModel() };\n            }\n        }\n\n        /// <summary>\n        /// Get current node to expand\n        /// </summary>\n        private NodeToExpand CurrentNode\n        {\n            get\n            {\n                Debug.Assert(_nodeIndex < _expanded.Count);\n                return _expanded[_nodeIndex];\n            }\n        }\n\n        /// <summary>\n        /// Node that should be expanded\n        /// </summary>\n        internal record class NodeToExpand\n        {\n            public IEnumerable<ServiceResultModel> ErrorInfos => _errorInfos;\n\n            public bool HasErrors => _errorInfos.Count > 0;\n\n            public bool ContainsObjects => _objects.Count > 0;\n\n            public ObjectToExpand Variables { get; }\n\n            /// <summary>\n            /// Original node from configuration\n            /// </summary>\n            public OpcNodeModel NodeFromConfiguration { get; }\n\n            /// <summary>\n            /// Node id that should be expanded\n            /// </summary>\n            public NodeId? NodeId { get; }\n\n            /// <summary>\n            /// Node class of the node\n            /// </summary>\n            public uint NodeClass { get; }\n\n            /// <summary>\n            /// Event Notifier of the node\n            /// </summary>\n            public byte EventNotifier { get; }\n\n            /// <summary>\n            /// Create node to expand\n            /// </summary>\n            /// <param name=\"nodeFromConfiguration\"></param>\n            /// <param name=\"nodeId\"></param>\n            /// <param name=\"nodeClass\"></param>\n            /// <param name=\"browseName\"></param>\n            /// <param name=\"displayName\"></param>\n            /// <param name=\"typeDefinitionId\"></param>\n            /// <param name=\"errorInfo\"></param>\n            public NodeToExpand(OpcNodeModel nodeFromConfiguration, NodeId? nodeId,\n                Opc.Ua.NodeClass nodeClass, QualifiedName? browseName, LocalizedText? displayName,\n                ExpandedNodeId? typeDefinitionId, ServiceResultModel? errorInfo)\n            {\n                NodeFromConfiguration = nodeFromConfiguration;\n                NodeId = nodeId;\n                NodeClass = (uint)nodeClass;\n\n                if (errorInfo != null)\n                {\n                    AddErrorInfo(errorInfo);\n                }\n\n                // Hold variables resolved from a variable or variable type\n                Variables = new ObjectToExpand(new BrowseFrame(\n                    nodeId ?? NodeId.Null, browseName ?? \"Variables\",\n                    displayName?.Text ?? \"Variables\", typeDefinitionId, nodeClass), this);\n            }\n\n            /// <summary>\n            /// Opc node model configurations over all objects\n            /// </summary>\n            /// <param name=\"context\"></param>\n            /// <param name=\"useBrowseNameAsDisplayName\"></param>\n            /// <param name=\"ids\"></param>\n            /// <param name=\"error\"></param>\n            /// <returns></returns>\n            public IEnumerable<OpcNodeModel> GetAllOpcNodeModels(IServiceMessageContext context,\n                bool useBrowseNameAsDisplayName, HashSet<string?>? ids = null, bool error = false)\n            {\n                switch (NodeClass)\n                {\n                    case (uint)Opc.Ua.NodeClass.VariableType:\n                    case (uint)Opc.Ua.NodeClass.Variable:\n                        if (Variables.EntriesAlreadyReturned)\n                        {\n                            break;\n                        }\n                        var variables = Variables.GetOpcNodeModels(NodeFromConfiguration,\n                                context, useBrowseNameAsDisplayName, ids, true);\n                        if ((!error && NodeClass == (uint)Opc.Ua.NodeClass.VariableType) ||\n                            ids?.Contains(NodeFromConfiguration.DataSetFieldId) == true)\n                        {\n                            // Only variables, not the root variable\n                            return variables;\n                        }\n                        return variables.Prepend(NodeFromConfiguration);\n                    case (uint)Opc.Ua.NodeClass.Object:\n                    case (uint)Opc.Ua.NodeClass.ObjectType:\n                        var objects = _objects\n                            .Where(o => !o.EntriesAlreadyReturned)\n                            .SelectMany(o => o.GetOpcNodeModels(NodeFromConfiguration,\n                                context, useBrowseNameAsDisplayName, ids, true));\n                        if (!error)\n                        {\n                            return objects;\n                        }\n                        return objects.Prepend(NodeFromConfiguration);\n                }\n                return error ? [NodeFromConfiguration] : Array.Empty<OpcNodeModel>();\n            }\n\n            /// <summary>\n            /// Add objects or variables depending on the node class that is expanded\n            /// </summary>\n            /// <param name=\"frames\"></param>\n            public void AddObjectsOrVariables(IEnumerable<BrowseFrame> frames)\n            {\n                switch (NodeClass)\n                {\n                    case (uint)Opc.Ua.NodeClass.VariableType:\n                    case (uint)Opc.Ua.NodeClass.Variable:\n                        Variables.AddNodes(frames);\n                        break;\n                    default:\n                        _objects.AddRange(frames\n                            .Where(f => !NodeId.IsNull(f.NodeId) && _knownIds.Add(f.NodeId))\n                            .Select(f => new ObjectToExpand(f, this)));\n                        break;\n                }\n            }\n\n            /// <summary>\n            /// Add error info\n            /// </summary>\n            /// <param name=\"statusCode\"></param>\n            /// <param name=\"message\"></param>\n            public void AddErrorInfo(uint statusCode, string message)\n            {\n                _errorInfos.Add(new ServiceResultModel\n                {\n                    ErrorMessage = message,\n                    StatusCode = statusCode\n                });\n            }\n\n            /// <summary>\n            /// Add error info\n            /// </summary>\n            /// <param name=\"errorInfo\"></param>\n            public void AddErrorInfo(ServiceResultModel? errorInfo)\n            {\n                if (errorInfo != null)\n                {\n                    _errorInfos.Add(errorInfo);\n                }\n            }\n\n            /// <summary>\n            /// Move to next object\n            /// </summary>\n            /// <param name=\"obj\"></param>\n            /// <returns></returns>\n            public bool TryGetNextObject(out ObjectToExpand? obj)\n            {\n                if (_objectIndex < _objects.Count)\n                {\n                    obj = _objects[_objectIndex];\n                    _objectIndex++;\n                    return true;\n                }\n                obj = null;\n                return false;\n            }\n\n            private readonly List<ServiceResultModel> _errorInfos = [];\n            private readonly List<ObjectToExpand> _objects = [];\n            private readonly HashSet<NodeId> _knownIds = [];\n            private int _objectIndex;\n        }\n\n        /// <summary>\n        /// The object to expand\n        /// </summary>\n        internal class ObjectToExpand\n        {\n            public BrowseFrame ObjectFromBrowse { get; }\n            public NodeToExpand OriginalNode { get; }\n\n            /// <summary>\n            /// Create object to expand\n            /// </summary>\n            /// <param name=\"objectFromBrowse\"></param>\n            /// <param name=\"originalNode\"></param>\n            public ObjectToExpand(BrowseFrame objectFromBrowse,\n                NodeToExpand originalNode)\n            {\n                ObjectFromBrowse = objectFromBrowse;\n                OriginalNode = originalNode;\n            }\n\n            public bool EntriesAlreadyReturned { get; internal set; }\n\n            public bool ContainsVariables => _variables.Count > 0;\n\n            public bool ContainsMethods => _methods.Count > 0;\n\n            public bool ContainsEvents => _eventTypesGenerated.Count > 0;\n\n            /// <summary>\n            /// Add variables\n            /// </summary>\n            /// <param name=\"frames\"></param>\n            /// <returns></returns>\n            public bool AddNodes(IEnumerable<BrowseFrame> frames)\n            {\n                var duplicates = false;\n                foreach (var frame in frames)\n                {\n                    if (NodeId.IsNull(frame.NodeId))\n                    {\n                        continue;\n                    }\n                    if (!_knownIds.Add(frame.NodeId))\n                    {\n                        duplicates |= true;\n                        continue;\n                    }\n                    if (frame.NodeClass == Opc.Ua.NodeClass.Method)\n                    {\n                        // Add methods\n                        duplicates |= !_methods.Add(frame);\n                    }\n                    else\n                    {\n                        if (frame.Parent?.NodeId != null)\n                        {\n                            // Collect input and output arguments for later use\n                            if (frame.BrowseName == BrowseNames.InputArguments)\n                            {\n                                _input.AddOrUpdate(frame.Parent.NodeId,\n                                    new MethodArgument(frame));\n                                break;\n                            }\n                            else if (frame.BrowseName == BrowseNames.OutputArguments)\n                            {\n                                _output.AddOrUpdate(frame.Parent.NodeId,\n                                    new MethodArgument(frame));\n                                break;\n                            }\n                        }\n                        // Add variable\n                        duplicates |= !_variables.Add(frame);\n                    }\n                }\n                return duplicates;\n            }\n\n            /// <summary>\n            /// Get node models\n            /// </summary>\n            /// <param name=\"template\"></param>\n            /// <param name=\"context\"></param>\n            /// <param name=\"useBrowseNameAsDisplayName\"></param>\n            /// <param name=\"ids\"></param>\n            /// <param name=\"createLongIds\"></param>\n            /// <returns></returns>\n            public IEnumerable<OpcNodeModel> GetOpcNodeModels(OpcNodeModel template,\n                IServiceMessageContext context, bool useBrowseNameAsDisplayName,\n                HashSet<string?>? ids = null, bool createLongIds = false)\n            {\n                ids ??= [];\n                if (EntriesAlreadyReturned)\n                {\n                    return [];\n                }\n\n                // Get variable nodes\n                var nodeModels = _variables.Select(variableFrame => template with\n                {\n                    // Use absolute nodes\n                    Id = variableFrame.NodeId.AsString(context, NamespaceFormat.Expanded),\n                    AttributeId = NodeAttribute.Value,\n\n                    DataSetFieldId = CreateUniqueIdFromFrame(variableFrame.BrowsePath),\n                    DisplayName = !useBrowseNameAsDisplayName || variableFrame.BrowseName == null ?\n                        variableFrame.DisplayName :\n                        variableFrame.BrowseNameFromRootFrame(ObjectFromBrowse),\n\n                    // TODO - use browse paths instead:\n                    // Id = ObjectFromBrowse.NodeId.AsString(context, NamespaceFormat.Expanded)\n                    // BrowsePath = frame.BrowsePath.ToRelativePath(out var prefix).AsString(prefix),\n\n                    TypeDefinitionId = variableFrame.TypeDefinitionId?.AsString(context,\n                        NamespaceFormat.ExpandedWithNamespace0)\n                });\n\n                // Add methods if any\n                if (_eventTypesGenerated.Count != 0)\n                {\n                    nodeModels = nodeModels.Concat(_eventTypesGenerated\n                        .SelectMany(eventSource => eventSource.Value.Select(eventType => template with\n                        {\n                            Id = _eventNotifier.AsString(context, NamespaceFormat.Expanded),\n                            AttributeId = NodeAttribute.EventNotifier,\n\n                            // DataSetClassFieldId = CreateUniqueIdFromFrame(_eventNotifierBrowsePath,\n                            //     evt.BrowseName),\n                            DataSetFieldId = CreateUniqueIdFromFrame(eventSource.Key.BrowsePath,\n                                eventType.BrowseName),\n                            DisplayName = eventType.BrowseName?.Name ?? eventType.DisplayName.Text,\n\n                            // TODO: Set up the event filter to filter the source node and event type\n                            // EventFilter = new EventFilterModel(),\n\n                            // TODO - use browse paths instead:\n                            // Id = ObjectFromBrowse.NodeId.AsString(context, NamespaceFormat.Expanded)\n                            // BrowsePath = frame.BrowsePath.ToRelativePath(out var prefix).AsString(prefix),\n\n                            TypeDefinitionId = eventType.NodeId.AsString(context,\n                                NamespaceFormat.ExpandedWithNamespace0)\n                        })));\n                }\n\n                // Add methods if any\n                if (_methods.Count != 0)\n                {\n                    nodeModels = nodeModels.Concat(_methods.Select(methodFrame => template with\n                    {\n                        Id = methodFrame.NodeId.AsString(context, NamespaceFormat.Expanded),\n                        DataSetFieldId = CreateUniqueIdFromFrame(methodFrame.BrowsePath),\n                        DisplayName = !useBrowseNameAsDisplayName || methodFrame.BrowseName == null ?\n                            methodFrame.DisplayName :\n                            methodFrame.BrowseNameFromRootFrame(ObjectFromBrowse),\n                        // TODO - use browse paths instead:\n                        // Id = ObjectFromBrowse.NodeId.AsString(context, NamespaceFormat.Expanded)\n                        // BrowsePath = frame.BrowsePath.ToRelativePath(out var prefix).AsString(prefix),\n\n                        MethodMetadata = new MethodMetadataModel\n                        {\n                            InputArguments = _input.TryGetValue(methodFrame.NodeId, out var input)\n                                ? input.Arguments : [],\n                            OutputArguments = _output.TryGetValue(methodFrame.NodeId, out var output)\n                                ? output.Arguments : [],\n                            ObjectId = methodFrame.Parent?.NodeId?.AsString(context, NamespaceFormat.Expanded)\n                        },\n                        TypeDefinitionId = methodFrame.TypeDefinitionId?.AsString(context,\n                            NamespaceFormat.ExpandedWithNamespace0)\n                    }));\n                }\n\n                string CreateUniqueIdFromFrame(string? browsePath, QualifiedName? extra = null)\n                {\n                    var id = template.DataSetFieldId ?? string.Empty;\n                    id = createLongIds ?\n                        $\"{id}{ObjectFromBrowse.BrowsePath}{browsePath ?? string.Empty}\" :\n                        $\"{id}{browsePath ?? string.Empty}\";\n                    if (extra != null)\n                    {\n                        id = $\"{id}/{extra.Name}\";\n                    }\n                    var uniqueId = id;\n                    for (var index = 1; !ids.Add(uniqueId); index++)\n                    {\n                        uniqueId = $\"{id}_{index}\";\n                    }\n                    return uniqueId;\n                }\n                return nodeModels;\n            }\n\n            /// <summary>\n            /// Create writer id for the object\n            /// </summary>\n            /// <returns></returns>\n            public string CreateWriterId()\n            {\n                var sb = new StringBuilder();\n                if (OriginalNode.NodeFromConfiguration.DataSetFieldId != null)\n                {\n                    sb = sb.Append(OriginalNode.NodeFromConfiguration.DataSetFieldId);\n                }\n                return sb.Append(ObjectFromBrowse.BrowsePath).ToString();\n            }\n\n            /// <summary>\n            /// Complete object\n            /// </summary>\n            /// <param name=\"requestHeader\"></param>\n            /// <param name=\"context\"></param>\n            /// <returns></returns>\n            internal async Task CompleteAsync(RequestHeader requestHeader, ServiceCallContext context)\n            {\n                //\n                // Find events anything in this set generates, then find the event notifier for them\n                // The SourceNode of GeneratesEvent and AlwaysGeneratesEvent is limited to ObjectType,\n                // VariableType AND Method InstanceDeclaration Nodes on ObjectTypes (not objects!).\n                //\n                try\n                {\n                    var browseDescriptions = _variables\n                        .Concat(_methods)\n                        .Append(ObjectFromBrowse)\n                        .Where(t => !NodeId.IsNull(t.TypeDefinitionId))\n                        .Select(t => new BrowseDescription\n                        {\n                            Handle = t,\n                            NodeId = ExpandedNodeId.ToNodeId(\n                                t.TypeDefinitionId, context.Session.MessageContext.NamespaceUris)!,\n                            ReferenceTypeId = ReferenceTypeIds.GeneratesEvent,\n                            IncludeSubtypes = true,\n                            BrowseDirection = Opc.Ua.BrowseDirection.Forward,\n                            NodeClassMask = (uint)Opc.Ua.NodeClass.ObjectType,\n                            ResultMask = (uint)BrowseResultMask.All\n                        })\n                        .ToArray();\n\n                    _eventTypesGenerated.Clear();\n                    if (browseDescriptions.Length != 0)\n                    {\n                        await foreach (var result in context.Session.BrowseAsync(requestHeader, null,\n                            browseDescriptions, context.Ct).ConfigureAwait(false))\n                        {\n                            if (result.ErrorInfo != null)\n                            {\n                                OriginalNode.AddErrorInfo(result.ErrorInfo);\n                                continue;\n                            }\n                            Debug.Assert(result.References != null);\n                            Debug.Assert(result.Description != null);\n                            if (result.References.Count == 0)\n                            {\n                                // No events generated\n                                continue;\n                            }\n                            var originalFrame = (BrowseFrame)result.Description.Handle;\n                            if (!_eventTypesGenerated.TryGetValue(originalFrame, out var eventList))\n                            {\n                                eventList = [];\n                                _eventTypesGenerated.Add(originalFrame, eventList);\n                            }\n                            eventList.AddRange(result.References);\n                        }\n                    }\n                    if (_eventTypesGenerated.Count > 0)\n                    {\n                        // Find the event notifier. This should use HasEventSource if possible, but we just\n                        // try and find it in the objects to the root here\n                        var readValueIds = ObjectFromBrowse.AllFramesToRoot\n                            .Where(f => f.NodeClass == Opc.Ua.NodeClass.Object && !NodeId.IsNull(f.NodeId))\n                            .Select(f => new ReadValueId\n                            {\n                                Handle = f,\n                                NodeId = f.NodeId,\n                                AttributeId = Attributes.EventNotifier\n                            })\n                            .ToArray();\n                        _eventNotifier = ObjectIds.Server;\n                        _eventNotifierBrowsePath = null;\n                        if (readValueIds.Length != 0)\n                        {\n                            var response = await context.Session.Services.ReadAsync(requestHeader, 0,\n                                Opc.Ua.TimestampsToReturn.Neither, readValueIds, context.Ct).ConfigureAwait(false);\n                            var readResults = response.Validate(response.Results, s => s.StatusCode,\n                                response.DiagnosticInfos, readValueIds);\n                            if (readResults.ErrorInfo != null)\n                            {\n                                OriginalNode.AddErrorInfo(readResults.ErrorInfo);\n                            }\n                            else\n                            {\n                                var result = readResults.FirstOrDefault(IsSubscribeToEvents);\n                                if (result != null)\n                                {\n                                    _eventNotifier = result.Request.NodeId;\n                                    _eventNotifierBrowsePath = ((BrowseFrame)result.Request.Handle).BrowsePath;\n                                }\n                            }\n                        }\n\n                        static bool IsSubscribeToEvents(ServiceResponse<ReadValueId, DataValue>.Operation operation)\n                        {\n                            if (operation.ErrorInfo != null)\n                            {\n                                return false;\n                            }\n                            var eventNotifier = operation.Result.GetValue<byte>(0);\n                            if ((eventNotifier & EventNotifiers.SubscribeToEvents) != 0)\n                            {\n                                return true;\n                            }\n                            return false;\n                        }\n                    }\n                }\n                catch (Exception ex)\n                {\n                    OriginalNode.AddErrorInfo(ex.ToServiceResultModel());\n                }\n\n                if (ContainsMethods)\n                {\n                    foreach (var input in _input.Values)\n                    {\n                        await input.ExpandAsync(context, requestHeader).ConfigureAwait(false);\n                        if (input.ErrorInfo != null)\n                        {\n                            // If input argument cannot be resolved, we do not\n                            // return it as part of the metadata.\n                            _input.Remove(input.BrowseFrame.NodeId);\n                            OriginalNode.AddErrorInfo(input.ErrorInfo);\n                        }\n                    }\n                    foreach (var output in _output.Values)\n                    {\n                        await output.ExpandAsync(context, requestHeader).ConfigureAwait(false);\n                        if (output.ErrorInfo != null)\n                        {\n                            // If output argument cannot be resolved, we do not\n                            // return it as part of the metadata.\n                            _output.Remove(output.BrowseFrame.NodeId);\n                            OriginalNode.AddErrorInfo(output.ErrorInfo);\n                        }\n                    }\n                }\n            }\n\n            private readonly HashSet<NodeId> _knownIds = [];\n            private readonly HashSet<BrowseFrame> _methods = [];\n            private readonly Dictionary<NodeId, MethodArgument> _input = [];\n            private readonly Dictionary<NodeId, MethodArgument> _output = [];\n            private readonly HashSet<BrowseFrame> _variables = [];\n            private readonly Dictionary<BrowseFrame, List<ReferenceDescription>> _eventTypesGenerated = [];\n            private NodeId _eventNotifier = ObjectIds.Server;\n            private string? _eventNotifierBrowsePath;\n        }\n\n        /// <summary>\n        /// Respresents a method argument.\n        /// </summary>\n        /// <param name=\"BrowseFrame\"></param>\n        internal record MethodArgument(BrowseFrame BrowseFrame)\n        {\n            /// <summary>\n            /// Error info if not resolvable\n            /// </summary>\n            public ServiceResultModel? ErrorInfo { get; private set; } = kDefaultError;\n\n            /// <summary>\n            /// The arguments in order\n            /// </summary>\n            public List<MethodMetadataArgumentModel> Arguments { get; } = [];\n\n            /// <summary>\n            /// Resolve the argument\n            /// </summary>\n            /// <param name=\"context\"></param>\n            /// <param name=\"header\"></param>\n            /// <returns></returns>\n            public async ValueTask ExpandAsync(ServiceCallContext context, RequestHeader header)\n            {\n                var (value, errorInfo) = await context.Session.ReadValueAsync(header, BrowseFrame.NodeId,\n                    context.Ct).ConfigureAwait(false);\n                if (errorInfo != null)\n                {\n                    ErrorInfo = errorInfo;\n                    return;\n                }\n                ErrorInfo = null; // Mark as processed\n                if (value?.Value is not ExtensionObject[] argumentsList)\n                {\n                    return;\n                }\n                Arguments.Clear();\n                foreach (var argument in argumentsList.Select(a => (Argument)a.Body))\n                {\n                    var (dataTypeIdNode, errorInfo2) = await context.Session.ReadNodeAsync(\n                        header, argument.DataType, null, false, false, NamespaceFormat.Expanded,\n                        false, context.Ct).ConfigureAwait(false);\n                    var arg = new MethodMetadataArgumentModel\n                    {\n                        Name = argument.Name,\n                        DefaultValue = argument.Value == null ? VariantValue.Null :\n                            context.Session.Codec.Encode(new Variant(argument.Value), out var type),\n                        ValueRank = argument.ValueRank == ValueRanks.Scalar ?\n                            null : (global::Azure.IIoT.OpcUa.Publisher.Models.NodeValueRank)argument.ValueRank,\n                        ArrayDimensions = argument.ArrayDimensions?.Count > 0 ?\n                            argument.ArrayDimensions?.ToArray() : null,\n                        Description = string.IsNullOrEmpty(argument?.Description.Text) ?\n                            null : argument.Description.Text,\n                        ErrorInfo = errorInfo2,\n                        Type = dataTypeIdNode with\n                        {\n                            // Compress by removing non relevant fields\n                            WriteMask = null,\n                            UserAccessLevel = null,\n                            UserWriteMask = null,\n                            AccessLevel = null,\n                            Children = null,\n                            SourcePicoseconds = null,\n                            ServerPicoseconds = null,\n                            ServerTimestamp = null,\n                            SourceTimestamp = null,\n                        }\n                    };\n                    Arguments.Add(arg);\n                }\n            }\n\n            private static readonly ServiceResultModel kDefaultError =\n                ((ServiceResult)StatusCodes.BadInternalError).ToServiceResultModel();\n        }\n\n        private int _nodeIndex = -1;\n        private ObjectToExpand? _currentObject;\n        private readonly List<NodeToExpand> _expanded = [];\n        private readonly PublishedNodesEntryModel _entry;\n        private readonly PublishedNodeExpansionModel _request;\n        private readonly IPublishedNodesServices? _configuration;\n        private readonly ILogger _logger;\n        private readonly bool _allowNoResolution;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for ConfigurationBrowser\n    /// </summary>\n    internal static partial class ConfigurationBrowserLogging\n    {\n        private const int EventClass = 100;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Error expanding node {Node}: {Error}\")]\n        public static partial void HandleError(this ILogger logger,\n            ConfigurationBrowser.NodeToExpand node, ServiceResultModel error);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Dropped duplicate variables or methods found.\")]\n        public static partial void DroppedDuplicateItems(this ILogger logger);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/ConfigurationServices.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Furly.Exceptions;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.IO;\n    using System.Linq;\n    using System.Runtime.CompilerServices;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Configuration services uses the address space and services of a connected server to\n    /// configure the publisher. The configuration services allow interactive expansion of\n    /// published nodes.\n    /// </summary>\n    public sealed class ConfigurationServices : IConfigurationServices,\n        IAssetConfiguration<Stream>, IAssetConfiguration<byte[]>, IDisposable\n    {\n        /// <summary>\n        /// Create configuration services\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"client\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public ConfigurationServices(IPublishedNodesServices configuration,\n            IOpcUaClientManager<ConnectionModel> client, IOptions<PublisherOptions> options,\n            ILogger<ConfigurationServices> logger, TimeProvider? timeProvider = null)\n        {\n            _configuration = configuration;\n            _client = client;\n            _options = options;\n            _logger = logger;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> ExpandAsync(\n            PublishedNodesEntryModel entry, PublishedNodeExpansionModel request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(entry);\n            ArgumentNullException.ThrowIfNull(entry.OpcNodes);\n            ValidateNodes(entry.OpcNodes);\n\n            var browser = new ConfigurationBrowser(entry, request, _options, null,\n                _logger, _timeProvider);\n            return _client.ExecuteAsync(entry.ToConnectionModel(), browser, request.Header, ct);\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAsync(\n            PublishedNodesEntryModel entry, PublishedNodeExpansionModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(entry);\n            ArgumentNullException.ThrowIfNull(entry.OpcNodes);\n            ValidateNodes(entry.OpcNodes);\n\n            var browser = new ConfigurationBrowser(entry, request, _options, _configuration,\n                _logger, _timeProvider);\n            return _client.ExecuteAsync(entry.ToConnectionModel(), browser, request.Header, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAssetAsync(\n            PublishedNodeCreateAssetRequestModel<byte[]> request, CancellationToken ct)\n        {\n            var stream = new MemoryStream(request.Configuration);\n            await using var _ = stream.ConfigureAwait(false);\n            var requestWithStream = new PublishedNodeCreateAssetRequestModel<Stream>\n            {\n                Configuration = stream,\n                Entry = request.Entry,\n                Header = request.Header,\n                WaitTime = request.WaitTime\n            };\n            return await CreateOrUpdateAssetAsync(requestWithStream,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> GetAllAssetsAsync(\n            PublishedNodesEntryModel entry, RequestHeaderModel? header, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(entry);\n            return CoreAsync(ct);\n\n            async IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> CoreAsync(\n                [EnumeratorCancellation] CancellationToken ct)\n            {\n                // Expand the wot node one level and expand each level\n                var expansion = new PublishedNodeExpansionModel\n                {\n                    ExcludeRootIfInstanceNode = true,\n                    MaxDepth = 1, // There is one asset level underneath the root connection node\n                    Header = header\n                };\n                var browser = new ConfigurationBrowser(entry with\n                {\n                    // Named object in the address space of the server.\n                    OpcNodes = [new() { Id = AssetsEx.Root }]\n                }, expansion, _options, null, _logger, _timeProvider, true);\n\n                // Browse and swap the data set writer id and data set name to make an asset entry.\n                await foreach (var result in _client.ExecuteAsync(entry.ToConnectionModel(),\n                    browser, header, ct).ConfigureAwait(false))\n                {\n                    yield return result with\n                    {\n                        Result = result.Result == null ? null : result.Result with\n                        {\n                            DataSetWriterGroup = entry.DataSetWriterGroup,\n                            DataSetWriterId = result.Result.DataSetName,\n                            DataSetName = result.Result.DataSetWriterId?.TrimStart('/') // Asset name\n                        }\n                    };\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAssetAsync(\n            PublishedNodeCreateAssetRequestModel<Stream> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Configuration);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetName); // Asset name\n\n            using var trace = _activitySource.StartActivity(\"CreateOrUpdateAsset\");\n\n            var entry = request.Entry;\n            var connection = entry.ToConnectionModel();\n            ServiceResultModel? errorInfo;\n            (entry, errorInfo) = await _client.ExecuteAsync(connection, async context =>\n            {\n                // 1) Create asset and get asset file object\n                var (nodeId, errorInfo) = await context.Session.CreateAssetAsync(\n                    request.Header.ToRequestHeader(_timeProvider),\n                    request.Entry.DataSetName, context.Ct).ConfigureAwait(false); // Asset name\n                if (errorInfo != null || nodeId is null || NodeId.IsNull(nodeId))\n                {\n                    // TOOD errorInfo?.StatusCode ==\n                    //  Opc.Ua.StatusCodes.BadBrowseNameDuplicated\n                    errorInfo ??= new ServiceResultModel\n                    {\n                        StatusCode = StatusCodes.BadNodeIdInvalid,\n                        ErrorMessage = \"Failed to create asset.\"\n                    };\n                    return (entry with { DataSetWriterId = null }, errorInfo);\n                }\n                var assetId = nodeId.AsString(context.Session.MessageContext,\n                    NamespaceFormat.Expanded);\n\n                entry = entry with\n                {\n                    DataSetWriterId = assetId,\n                    OpcNodes =\n                    [\n                        new ()\n                        {\n                            Id = assetId,\n                            DataSetFieldId = entry.DataSetName // Asset name\n                        }\n                    ]\n                };\n\n                // Find the created asset file\n                (nodeId, errorInfo) = await context.Session.GetAssetFileAsync(\n                    request.Header.ToRequestHeader(_timeProvider), nodeId!,\n                    context.Ct).ConfigureAwait(false);\n                if (errorInfo != null || nodeId is null || NodeId.IsNull(nodeId))\n                {\n                    errorInfo ??= new ServiceResultModel\n                    {\n                        StatusCode = StatusCodes.BadNotFound,\n                        ErrorMessage = \"Asset did not have a file component.\"\n                    };\n                    return (entry, errorInfo);\n                }\n\n                // 2) upload asset file\n                var bufferSize = await context.Session.GetBufferSizeAsync(\n                    request.Header.ToRequestHeader(_timeProvider), nodeId,\n                    context.Ct).ConfigureAwait(false);\n                var (fileHandle, openError) = await context.Session.OpenAsync(\n                    request.Header.ToRequestHeader(_timeProvider), nodeId, 0x2 | 0x4,\n                    context.Ct).ConfigureAwait(false);\n                if (openError != null || !fileHandle.HasValue || NodeId.IsNull(nodeId))\n                {\n                    openError ??= new ServiceResultModel\n                    {\n                        StatusCode = StatusCodes.BadUserAccessDenied,\n                        ErrorMessage = \"Asset file could not be opened for write.\"\n                    };\n                    return (entry, openError);\n                }\n                while (true)\n                {\n                    // Copy buffers to server\n                    var buffer = ArrayPool<byte>.Shared.Rent(bufferSize);\n                    try\n                    {\n                        var read = await request.Configuration.ReadAsync(\n                            buffer.AsMemory(), context.Ct).ConfigureAwait(false);\n                        if (read == 0)\n                        {\n                            break;\n                        }\n                        errorInfo = await context.Session.WriteAsync(\n                            request.Header.ToRequestHeader(_timeProvider), nodeId,\n                            fileHandle.Value, buffer.AsMemory()[..read],\n                            context.Ct).ConfigureAwait(false);\n                        if (errorInfo != null)\n                        {\n                            return (entry, errorInfo);\n                        }\n                    }\n                    catch (Exception ex)\n                    {\n                        return (entry, ex.ToServiceResultModel());\n                    }\n                    finally\n                    {\n                        ArrayPool<byte>.Shared.Return(buffer);\n                    }\n                }\n\n                errorInfo = await context.Session.CloseAndUpdateAsync(\n                    request.Header.ToRequestHeader(_timeProvider), nodeId,\n                    fileHandle.Value, context.Ct).ConfigureAwait(false);\n                return (entry, errorInfo);\n            }, request.Header, ct).ConfigureAwait(false);\n\n            // From now on we need to revert by deleting the asset\n            if (errorInfo != null && errorInfo.StatusCode != 0)\n            {\n                if (entry.DataSetWriterId != null)\n                {\n                    // Delete the asset for good house keeping sake\n                    await DeleteAssetAsync(request.Header, entry, ct).ConfigureAwait(false);\n                }\n                return new ServiceResponse<PublishedNodesEntryModel>\n                {\n                    Result = entry,\n                    ErrorInfo = errorInfo\n                };\n            }\n            try\n            {\n                if (request.WaitTime.HasValue)\n                {\n                    //\n                    // The asset is uploaded the nodes are being created, potentially\n                    // the session is disconnected now and the server is restarting.\n                    // We wait a bit here to ensure all of this has happened correctly.\n                    //\n                    await _timeProvider.Delay(request.WaitTime.Value, ct).ConfigureAwait(false);\n                }\n\n                // 3) Collect all created tags under the asset\n                var browser = new ConfigurationBrowser(entry, new PublishedNodeExpansionModel\n                {\n                    CreateSingleWriter = true,\n                    MaxDepth = 0,\n                    Header = request.Header\n                }, _options, _configuration, _logger, _timeProvider);\n\n                var results = new List<ServiceResponse<PublishedNodesEntryModel>>();\n                await foreach (var configurationResult in _client.ExecuteAsync(\n                    entry.ToConnectionModel(), browser, request.Header,\n                    ct).ConfigureAwait(false))\n                {\n                    results.Add(configurationResult);\n                }\n                // We only expect a single writer here, else it is a failure.\n                if (results.Count != 1 ||\n                    (results[0].ErrorInfo != null && results[0].ErrorInfo!.StatusCode != 0))\n                {\n                    // Could not create tags - delete the asset\n                    errorInfo = results.Select(r => r.ErrorInfo)\n                        .FirstOrDefault(r => r != null);\n                    errorInfo ??= new ServiceResultModel\n                    {\n                        StatusCode = StatusCodes.BadUnexpectedError,\n                        ErrorMessage = \"Failed to find any tags for the asset.\"\n                    };\n                    await DeleteAssetAsync(request.Header, entry, ct).ConfigureAwait(false);\n                    return new ServiceResponse<PublishedNodesEntryModel>\n                    {\n                        Result = entry,\n                        ErrorInfo = errorInfo\n                    };\n                }\n                return results[0];\n            }\n            catch (Exception ex)\n            {\n                await DeleteAssetAsync(request.Header, entry, ct).ConfigureAwait(false);\n                return new ServiceResponse<PublishedNodesEntryModel>\n                {\n                    Result = entry,\n                    ErrorInfo = ex.ToServiceResultModel()\n                };\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResultModel> DeleteAssetAsync(\n            PublishedNodeDeleteAssetRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetWriterId);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetWriterGroup);\n\n            using var trace = _activitySource.StartActivity(\"DeleteAsset\");\n\n            // First remove the entry\n            try\n            {\n                await _configuration.RemoveDataSetWriterEntryAsync(\n                    request.Entry.DataSetWriterGroup, request.Entry.DataSetWriterId,\n                    ct: ct).ConfigureAwait(false);\n            }\n            catch (Exception ex)\n            {\n                if (!request.Force)\n                {\n                    return ex.ToServiceResultModel();\n                }\n                _logger.DiscardErrorBecauseForceWasSet(ex);\n            }\n            var errorInfo = await DeleteAssetAsync(request.Header, request.Entry,\n                ct).ConfigureAwait(false);\n            return errorInfo ?? new ServiceResultModel();\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _activitySource.Dispose();\n        }\n\n        /// <summary>\n        /// Delete the asset\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task<ServiceResultModel?> DeleteAssetAsync(RequestHeaderModel? header,\n            PublishedNodesEntryModel entry, CancellationToken ct)\n        {\n            return await _client.ExecuteAsync(entry.ToConnectionModel(), async context =>\n            {\n                var assetId = entry.DataSetWriterId.ToNodeId(context.Session.MessageContext);\n                if (NodeId.IsNull(assetId))\n                {\n                    return new ServiceResultModel\n                    {\n                        StatusCode = StatusCodes.BadNodeIdInvalid,\n                        ErrorMessage = \"Invalid node id and browse path in file system object\"\n                    };\n                }\n                return await context.Session.DeleteAssetAsync(header.ToRequestHeader(_timeProvider),\n                    assetId, ct).ConfigureAwait(false);\n            }, header, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Validate nodes are valid\n        /// </summary>\n        /// <param name=\"opcNodes\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"BadRequestException\"></exception>\n        internal static IList<OpcNodeModel> ValidateNodes(IList<OpcNodeModel> opcNodes)\n        {\n            var set = new HashSet<string>();\n            foreach (var node in opcNodes)\n            {\n                if (!node.TryGetId(out var id))\n                {\n                    throw new BadRequestException(\"Node must contain a node ID\");\n                }\n                node.DataSetFieldId ??= id;\n                set.Add(node.DataSetFieldId);\n                if (node.OpcPublishingInterval != null ||\n                    node.OpcPublishingIntervalTimespan != null)\n                {\n                    throw new BadRequestException(\n                        \"Publishing interval not allowed on node level. \" +\n                        \"Must be set at writer level.\");\n                }\n            }\n            if (set.Count != opcNodes.Count)\n            {\n                throw new BadRequestException(\"Field ids must be present and unique.\");\n            }\n            return opcNodes;\n        }\n\n        private readonly IPublishedNodesServices _configuration;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly IOpcUaClientManager<ConnectionModel> _client;\n        private readonly ILogger<ConfigurationServices> _logger;\n        private readonly TimeProvider _timeProvider;\n        private readonly ActivitySource _activitySource = Diagnostics.NewActivitySource();\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for ConfigurationServices\n    /// </summary>\n    internal static partial class ConfigurationServicesLogging\n    {\n        private const int EventClass = 100;\n\n        [LoggerMessage(EventId = EventClass + 0, Level = LogLevel.Information,\n            Message = \"Discard error because force was set.\")]\n        public static partial void DiscardErrorBecauseForceWasSet(this ILogger logger, Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/DataSetWriter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Nito.AsyncEx;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    public sealed partial class WriterGroupDataSource\n    {\n        /// <summary>\n        /// Represents a data set writer which acts as a partitioning mechanism\n        /// depending on how the writers should be set up from the configuration.\n        /// The partitioning uses the publishing interval - because we always did,\n        /// as well as the routing and topic configuration. The data set writer\n        /// key has the topics already resolved, so that comparison is straight\n        /// forward. This replaces the previously used SubscriptionIdentifier\n        /// and works in a similar way to manage a table of unique writers in\n        /// the writer group.\n        /// </summary>\n        internal sealed class DataSetWriter\n        {\n            /// <summary>\n            /// Publishing interval which is used to split subscriptions for\n            /// supporting legacy behavior of writer per subscription.\n            /// </summary>\n            public TimeSpan? PublishingInterval { get; }\n\n            /// <summary>\n            /// Routed topic\n            /// </summary>\n            public string Topic => Writer.Publishing?.QueueName ?? \"/\";\n\n            /// <summary>\n            /// Quality of service to use\n            /// </summary>\n            public QoS? Qos => Writer.Publishing?.RequestedDeliveryGuarantee;\n\n            /// <summary>\n            /// Message time to live\n            /// </summary>\n            public TimeSpan? Ttl => Writer.Publishing?.Ttl;\n\n            /// <summary>\n            /// Retain support\n            /// </summary>\n            public bool? Retain => Writer.Publishing?.Retain;\n\n            /// <summary>\n            /// Topic to route metadata to\n            /// </summary>\n            public string MetadataTopic => Writer.MetaData?.QueueName ?? \"/\";\n\n            /// <summary>\n            /// Quality of service to use\n            /// </summary>\n            public QoS MetadataQos => Writer.MetaData?.RequestedDeliveryGuarantee\n                ?? QoS.AtLeastOnce;\n\n            /// <summary>\n            /// Message time to live\n            /// </summary>\n            public TimeSpan? MetadataTtl => Writer.MetaData?.Ttl\n                ?? Writer.MetaDataUpdateTime;\n\n            /// <summary>\n            /// Retain support\n            /// </summary>\n            public bool MetadataRetain => Writer.MetaData?.Retain\n                ?? true;\n\n            /// <summary>\n            /// Resolved routing\n            /// </summary>\n            public DataSetRoutingMode Routing { get; }\n\n            /// <summary>\n            /// Full cloned configuration\n            /// </summary>\n            public DataSetWriterModel Writer { get; }\n\n            /// <summary>\n            /// Data set\n            /// </summary>\n            public PublishedDataSetModel DataSet => Writer.DataSet!;\n\n            /// <summary>\n            /// Data set source\n            /// </summary>\n            public PublishedDataSetSourceModel Source => DataSet.DataSetSource!;\n\n            /// <summary>\n            /// Split the writer in the group in its writer partitions depending on the publish\n            /// settings.\n            /// </summary>\n            /// <param name=\"group\"></param>\n            /// <param name=\"dataSetWriter\"></param>\n            /// <returns></returns>\n            /// <exception cref=\"ArgumentException\"></exception>\n            public static IEnumerable<DataSetWriter> GetDataSetWriters(WriterGroupDataSource group,\n                DataSetWriterModel dataSetWriter)\n            {\n                var options = group._options.Value;\n                if (dataSetWriter?.DataSet?.DataSetSource == null)\n                {\n                    throw new ArgumentException(\"DataSet source missing\", nameof(dataSetWriter));\n                }\n\n                var dataset = dataSetWriter.DataSet;\n                var source = dataset.DataSetSource;\n                var routing = dataset.Routing ?? options.DefaultDataSetRouting\n                    ?? DataSetRoutingMode.None;\n\n                var dataSetClassId = dataset.DataSetMetaData?.DataSetClassId\n                    ?? Guid.Empty;\n                var escWriterName = TopicFilter.Escape(\n                    dataSetWriter.DataSetWriterName ?? Constants.DefaultDataSetWriterName);\n                var escWriterGroup = TopicFilter.Escape(\n                    group._writerGroup.Name ?? Constants.DefaultWriterGroupName);\n                var escPublisherId = TopicFilter.Escape(\n                    group._writerGroup.PublisherId ?? options.PublisherId\n                        ?? Constants.DefaultPublisherId);\n                var escDataSetTopicPath = escWriterName;\n                var escDataSetName = escWriterName;\n                if (dataset.Name != null)\n                {\n                    escDataSetName = TopicFilter.Escape(dataset.Name);\n                    escDataSetTopicPath = string.Empty;\n                    foreach (var element in dataset.Name.Split('.', StringSplitOptions.RemoveEmptyEntries))\n                    {\n                        if (string.IsNullOrEmpty(escDataSetTopicPath))\n                        {\n                            escDataSetTopicPath = TopicFilter.Escape(element);\n                        }\n                        else\n                        {\n                            escDataSetTopicPath += \"/\" + TopicFilter.Escape(element);\n                        }\n                    }\n                }\n\n                var variables = new Dictionary<string, string>\n                {\n                    [PublisherConfig.PublisherIdKey] = escPublisherId,\n                    [PublisherConfig.DataSetWriterIdVariableName] = dataSetWriter.Id,\n                    [PublisherConfig.DataSetWriterVariableName] = escWriterName,\n                    [PublisherConfig.DataSetNameVariableName] = escDataSetName,\n                    [PublisherConfig.DataSetTopicPathVariableName] = escDataSetTopicPath,\n                    [PublisherConfig.DataSetWriterNameVariableName] = escWriterName,\n                    [PublisherConfig.DataSetClassIdVariableName] = dataSetClassId.ToString(),\n                    [PublisherConfig.WriterGroupIdVariableName] = group.Id,\n                    [PublisherConfig.DataSetWriterGroupVariableName] = escWriterGroup,\n                    [PublisherConfig.WriterGroupVariableName] = escWriterGroup\n                    // ...\n                };\n\n                // No auto routing - group variables and events by publish settings\n                var data = source.PublishedVariables?.PublishedData?\n                    .GroupBy(d => Resolve(options, group._writerGroup, dataSetWriter,\n                            d.Publishing, d.Id, routing, variables));\n                if (data != null)\n                {\n                    if (routing == DataSetRoutingMode.None)\n                    {\n                        foreach (var items in data)\n                        {\n                            var id = dataSetWriter.Id;\n                            yield return CreateDataSetWriter(id, items.Key, items.ToList());\n                        }\n                    }\n                    else\n                    {\n                        foreach (var (p, item) in data.SelectMany(d => d.Select(i => (d.Key, i))))\n                        {\n                            var id = $\"{dataSetWriter.Id}_{item.Id\n                                ?? item.GetHashCode().ToString(CultureInfo.InvariantCulture)}\";\n                            yield return CreateDataSetWriter(id, p, new[] { item });\n                        }\n                    }\n                }\n                var evts = source.PublishedEvents?.PublishedData?\n                    .GroupBy(d => Resolve(options, group._writerGroup, dataSetWriter,\n                            d.Publishing, d.Id, routing, variables));\n                if (evts != null)\n                {\n                    if (routing == DataSetRoutingMode.None)\n                    {\n                        foreach (var items in evts)\n                        {\n                            var id = dataSetWriter.Id;\n                            yield return CreateEventWriter(id, items.Key, items.ToList());\n                        }\n                    }\n                    else\n                    {\n                        foreach (var (p, item) in evts.SelectMany(d => d.Select(i => (d.Key, i))))\n                        {\n                            var id = $\"{dataSetWriter.Id}_{item.Id ?? item.GetHashCode().ToString(CultureInfo.InvariantCulture)}\";\n                            yield return CreateEventWriter(id, p, new[] { item });\n                        }\n                    }\n                }\n\n                DataSetWriter CreateDataSetWriter(string id,\n                    (PublishingQueueSettingsModel? Metadata, PublishingQueueSettingsModel? Messages) publishSettings,\n                    IReadOnlyList<PublishedDataSetVariableModel> data)\n                {\n                    return new DataSetWriter(group, routing, dataSetWriter with\n                    {\n                        Id = id,\n                        MetaData = publishSettings.Metadata,\n                        Publishing = publishSettings.Messages,\n                        DataSet = dataset with\n                        {\n                            DataSetMetaData = dataset.DataSetMetaData.Clone(),\n                            DataSetSource = source with\n                            {\n                                Connection = source.Connection.Clone(),\n                                SubscriptionSettings = source.SubscriptionSettings.Clone(),\n\n                                PublishedEvents = null,\n                                PublishedVariables = new PublishedDataItemsModel\n                                {\n                                    PublishedData = data\n                                }\n                            }\n                        }\n                    });\n                }\n\n                DataSetWriter CreateEventWriter(string id,\n                    (PublishingQueueSettingsModel? Metadata, PublishingQueueSettingsModel? Messages) publishSettings,\n                    IReadOnlyList<PublishedDataSetEventModel> data)\n                {\n                    return new DataSetWriter(group, routing, dataSetWriter with\n                    {\n                        Id = id,\n                        MetaData = publishSettings.Metadata,\n                        Publishing = publishSettings.Messages,\n                        DataSet = dataset with\n                        {\n                            DataSetMetaData = dataset.DataSetMetaData.Clone(),\n                            DataSetSource = source with\n                            {\n                                Connection = source.Connection.Clone(),\n                                SubscriptionSettings = source.SubscriptionSettings.Clone(),\n\n                                PublishedEvents = new PublishedEventItemsModel\n                                {\n                                    PublishedData = data\n                                },\n                                PublishedVariables = null\n                            }\n                        }\n                    });\n                }\n\n                // Resolve the publish queue settings with the data set writer provided settings.\n                static (PublishingQueueSettingsModel?, PublishingQueueSettingsModel?) Resolve(\n                    PublisherOptions options, WriterGroupModel group, DataSetWriterModel dataSetWriter,\n                    PublishingQueueSettingsModel? settings, string? fieldId,\n                    DataSetRoutingMode routing, Dictionary<string, string> variables)\n                {\n                    var builder = new TopicBuilder(options, group.MessageType,\n                        new TopicTemplatesOptions\n                        {\n                            Telemetry = settings?.QueueName\n                                ?? dataSetWriter.Publishing?.QueueName\n                                ?? group.Publishing?.QueueName,\n                            DataSetMetaData = dataSetWriter.MetaData?.QueueName\n                        },\n                        variables\n                            .Append(KeyValuePair\n                                .Create(PublisherConfig.DataSetFieldIdVariableName,\n                                    TopicFilter.Escape(fieldId ?? string.Empty))));\n\n                    var telemetryTopic = builder.TelemetryTopic;\n                    var metadataTopic = builder.DataSetMetaDataTopic;\n                    if (string.IsNullOrWhiteSpace(metadataTopic) || routing != DataSetRoutingMode.None)\n                    {\n                        metadataTopic = telemetryTopic;\n                    }\n\n                    var publishing = new PublishingQueueSettingsModel\n                    {\n                        QueueName = telemetryTopic,\n                        Ttl = settings?.Ttl\n                            ?? dataSetWriter.Publishing?.Ttl\n                            ?? group.Publishing?.Ttl,\n                        RequestedDeliveryGuarantee = settings?.RequestedDeliveryGuarantee\n                            ?? dataSetWriter.Publishing?.RequestedDeliveryGuarantee\n                            ?? group.Publishing?.RequestedDeliveryGuarantee,\n                        Retain = settings?.Retain\n                            ?? dataSetWriter.Publishing?.Retain\n                            ?? group.Publishing?.Retain\n                    };\n\n                    var metadata = new PublishingQueueSettingsModel\n                    {\n                        QueueName = metadataTopic,\n                        Ttl =\n                               dataSetWriter.MetaData?.Ttl\n                            ?? publishing.Ttl,\n                        RequestedDeliveryGuarantee =\n                               dataSetWriter.MetaData?.RequestedDeliveryGuarantee\n                            ?? publishing.RequestedDeliveryGuarantee,\n                        Retain =\n                               dataSetWriter.MetaData?.Retain\n                            ?? publishing.Retain\n                    };\n                    return (metadata, publishing);\n                }\n            }\n\n            /// <summary>\n            /// Create id from a DataSetWriterModel template\n            /// </summary>\n            /// <param name=\"group\"></param>\n            /// <param name=\"routing\"></param>\n            /// <param name=\"dataSetWriter\"></param>\n            private DataSetWriter(WriterGroupDataSource group, DataSetRoutingMode routing,\n                DataSetWriterModel dataSetWriter)\n            {\n                Writer = dataSetWriter;\n                Routing = routing;\n\n                PublishingInterval =\n                    group._options.Value.IgnoreConfiguredPublishingIntervals == true\n                    ? null : Source.SubscriptionSettings?.PublishingInterval;\n            }\n\n            /// <inheritdoc/>\n            public override bool Equals(object? obj)\n            {\n                if (obj is DataSetWriter writer &&\n                    writer.Writer.Id == Writer.Id &&\n                    writer.PublishingInterval == PublishingInterval &&\n                    writer.Topic == Topic &&\n                    writer.Qos == Qos &&\n                    writer.Ttl == Ttl &&\n                    writer.Retain == Retain &&\n                    writer.MetadataTopic == MetadataTopic &&\n                    writer.MetadataQos == MetadataQos &&\n                    writer.MetadataTtl == MetadataTtl &&\n                    writer.MetadataRetain == MetadataRetain &&\n                    writer.Routing == Routing)\n                {\n                    return true;\n                }\n                return false;\n            }\n\n            /// <inheritdoc/>\n            public override int GetHashCode()\n            {\n                //\n                // By default we partition on publishing interval and the\n                // output configuration binding.\n                //\n                return HashCode.Combine(Writer.Id, PublishingInterval,\n                    Topic,\n                    HashCode.Combine(Qos, Ttl, Retain),\n                    MetadataTopic,\n                    HashCode.Combine(MetadataQos, MetadataTtl, MetadataRetain),\n                    Routing);\n            }\n\n            /// <inheritdoc/>\n            public override string? ToString()\n            {\n                return $\"Writer {Writer.Id}->{Topic}@{PublishingInterval}\";\n            }\n        }\n\n        /// <summary>\n        /// A data set writer subscription binding inside a writer group\n        /// </summary>\n        private sealed class DataSetWriterSubscription : ISubscriber, IAsyncDisposable\n        {\n            /// <summary>\n            /// Name of the data set writer in the writer group (unique)\n            /// </summary>\n            public string Name { get; private set; }\n\n            /// <summary>\n            /// Topic assigned to the writer\n            /// </summary>\n            public string Topic => _writer.Topic;\n\n            /// <summary>\n            /// Writer id\n            /// </summary>\n            public string Id => _writer.Writer.Id;\n\n            /// <summary>\n            /// Index of the data set writer in the group\n            /// </summary>\n            public int Index { get; set; }\n\n            /// <summary>\n            /// Meta data\n            /// </summary>\n            internal PublishedDataSetMessageSchemaModel? MetaData =>\n                _metaDataLoader.IsValueCreated ? _metaDataLoader.Value.MetaData : null;\n\n            /// <summary>\n            /// Metadata disabled\n            /// </summary>\n            internal bool IsMetadataDisabled => !SendMetadata\n                && _group._options.Value.SchemaOptions == null;\n\n            /// <summary>\n            /// Metadata disabled\n            /// </summary>\n            internal bool SendMetadata => _writer.DataSet?.DataSetMetaData != null\n                && _group._options.Value.DisableDataSetMetaData != true;\n\n            /// <summary>\n            /// Subscription id\n            /// </summary>\n            public IEnumerable<BaseMonitoredItemModel> MonitoredItems { get; private set; }\n\n            /// <summary>\n            /// Active subscription\n            /// </summary>\n            public ISubscription? Subscription { get; private set; }\n\n            /// <summary>\n            /// Create subscription from a DataSetWriterModel template\n            /// </summary>\n            /// <param name=\"group\"></param>\n            /// <param name=\"writer\"></param>\n            /// <param name=\"writerNames\"></param>\n            /// <param name=\"logger\"></param>\n            private DataSetWriterSubscription(WriterGroupDataSource group, DataSetWriter writer,\n                HashSet<string> writerNames, ILogger<DataSetWriterSubscription> logger)\n            {\n                _group = group;\n                _writer = writer;\n                _logger = logger;\n                _metaDataLoader = new Lazy<MetaDataLoader>(() => new MetaDataLoader(this), true);\n\n                Name = CreateUniqueWriterName(writer.Writer.DataSetWriterName, writerNames);\n\n                logger.CreatingNewWriter(Id, Name, _group.Id);\n\n                // Create monitored items\n                var namespaceFormat =\n                    _group._writerGroup.MessageSettings?.NamespaceFormat ??\n                    _group._options.Value.DefaultNamespaceFormat ??\n                    NamespaceFormat.Uri;\n                MonitoredItems = _writer.Source.ToMonitoredItems(namespaceFormat);\n                _extensionFields = new ExtensionFields(_group._serializer,\n                    _writer.DataSet.ExtensionFields, _writer.Writer.DataSetFieldContentMask);\n                _template = _writer.Source.SubscriptionSettings.ToSubscriptionModel(\n                    _writer.Routing != DataSetRoutingMode.None,\n                    _group._options.Value.IgnoreConfiguredPublishingIntervals);\n                _connection = _writer.Writer.GetConnection(_group.Id, _group._options.Value);\n            }\n\n            /// <summary>\n            /// Create subscription\n            /// </summary>\n            /// <param name=\"group\"></param>\n            /// <param name=\"dataSetWriter\"></param>\n            /// <param name=\"loggerFactory\"></param>\n            /// <param name=\"writerNames\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            public async static ValueTask<DataSetWriterSubscription> CreateAsync(WriterGroupDataSource group,\n                DataSetWriter dataSetWriter, ILoggerFactory loggerFactory, HashSet<string> writerNames,\n                CancellationToken ct)\n            {\n                var writer = new DataSetWriterSubscription(group, dataSetWriter, writerNames,\n                    loggerFactory.CreateLogger<DataSetWriterSubscription>());\n\n                writer.Subscription = await group._clients.CreateSubscriptionAsync(\n                    writer._connection.Connection, writer._template, writer, ct).ConfigureAwait(false);\n\n                writer.InitializeMetaDataTrigger();\n                writer.InitializeKeepAlive();\n\n                group._logger.CreatedWriter(writer.Id, group.Id);\n\n                return writer;\n            }\n\n            /// <summary>\n            /// Update subscription content\n            /// </summary>\n            /// <param name=\"dataSetWriter\"></param>\n            /// <param name=\"writerNames\"></param>\n            /// <param name=\"ct\"></param>\n            /// <exception cref=\"ArgumentException\"></exception>\n            public async ValueTask UpdateAsync(DataSetWriter dataSetWriter, HashSet<string> writerNames,\n                CancellationToken ct)\n            {\n                _logger.UpdatingWriter(Id, _group.Id);\n\n                var previous = _writer;\n                _writer = dataSetWriter;\n\n                if (previous.Writer.DataSetWriterName != _writer.Writer.DataSetWriterName)\n                {\n                    writerNames.Remove(Name);\n                    Name = CreateUniqueWriterName(_writer.Writer.DataSetWriterName, writerNames);\n                }\n\n                var namespaceFormat =\n                    _group._writerGroup.MessageSettings?.NamespaceFormat ??\n                    _group._options.Value.DefaultNamespaceFormat ??\n                    NamespaceFormat.Uri;\n                MonitoredItems = _writer.Source.ToMonitoredItems(namespaceFormat);\n                _extensionFields = new ExtensionFields(_group._serializer,\n                    _writer.DataSet.ExtensionFields, _writer.Writer.DataSetFieldContentMask);\n                var template = _writer.Source.SubscriptionSettings.ToSubscriptionModel(\n                    _writer.Routing != DataSetRoutingMode.None,\n                    _group._options.Value.IgnoreConfiguredPublishingIntervals);\n                var connection = _writer.Writer.GetConnection(_group.Id, _group._options.Value);\n\n                if (template != _template || connection != _connection || Subscription == null)\n                {\n                    _template = template;\n                    _connection = connection;\n\n                    //\n                    // Create or new subscription for the writer group. This will automatically\n                    // dispose our older subscription or update it to comply if possible.\n                    //\n                    Subscription = await _group._clients.CreateSubscriptionAsync(\n                        _connection.Connection, _template, this, ct).ConfigureAwait(false);\n\n                    _logger.RecreatedSubscription(Id, _group.Id);\n                }\n                else\n                {\n                    // Trigger reevaluation\n                    Subscription.NotifyMonitoredItemsChanged();\n\n                    _logger.UpdatedMonitoredItems(Id, _group.Id);\n                }\n\n                _frameCount = 0;\n                InitializeMetaDataTrigger();\n                InitializeKeepAlive();\n            }\n\n            /// <inheritdoc/>\n            public async ValueTask DisposeAsync()\n            {\n                try\n                {\n                    if (_disposed)\n                    {\n                        return;\n                    }\n\n                    if (_metaDataLoader.IsValueCreated)\n                    {\n                        await _metaDataLoader.Value.DisposeAsync().ConfigureAwait(false);\n                    }\n\n                    // We are under the writer group lock here, so we cannot grab it\n                    SendCloseNotifications();\n\n                    _disposed = true;\n                    _metadataTimer?.Stop();\n\n                    if (Subscription != null)\n                    {\n                        await Subscription.DisposeAsync().ConfigureAwait(false);\n                        Subscription = null;\n                    }\n\n                    _logger.ClosedWriter(Id, _group.Id);\n                }\n                finally\n                {\n                    _metadataTimer?.Dispose();\n                    _metadataTimer = null;\n                }\n            }\n\n            /// <inheritdoc/>\n            public async Task OnMonitoredItemSemanticsChangedAsync(CancellationToken ct)\n            {\n                if (!IsMetadataDisabled)\n                {\n                    // Reload metadata\n                    _metaDataLoader.Value.Reload();\n\n                    var timeout = _group._options.Value.AsyncMetaDataLoadTimeout ?? TimeSpan.FromMinutes(1);\n                    if (timeout != TimeSpan.Zero)\n                    {\n                        await _metaDataLoader.Value.BlockUntilLoadedAsync(timeout, ct).ConfigureAwait(false);\n                    }\n                }\n            }\n\n            /// <inheritdoc/>\n            public void OnSubscriptionKeepAlive(OpcUaSubscriptionNotification notification)\n            {\n                Interlocked.Increment(ref _group._keepAliveCount);\n                if (_sendKeepAlives)\n                {\n                    if (_sendKeepAliveAsKeyFrame)\n                    {\n                        notification.TryUpgradeToKeyFrame(this);\n                    }\n                    CallMessageReceiverDelegates(notification);\n                }\n            }\n\n            /// <inheritdoc/>\n            public void OnSubscriptionDataChangeReceived(OpcUaSubscriptionNotification notification)\n            {\n                CallMessageReceiverDelegates(ProcessKeyFrame(notification));\n\n                OpcUaSubscriptionNotification ProcessKeyFrame(OpcUaSubscriptionNotification notification)\n                {\n                    var keyFrameCount = _writer.Writer.KeyFrameCount\n                        ?? _group._options.Value.DefaultKeyFrameCount ?? 0;\n                    if (keyFrameCount > 0)\n                    {\n                        var frameCount = Interlocked.Increment(ref _frameCount);\n                        if (((frameCount - 1) % keyFrameCount) == 0)\n                        {\n                            notification.TryUpgradeToKeyFrame(this);\n                        }\n                    }\n                    return notification;\n                }\n            }\n\n            /// <inheritdoc/>\n            public void OnSubscriptionCyclicReadCompleted(OpcUaSubscriptionNotification notification)\n            {\n                CallMessageReceiverDelegates(notification);\n            }\n\n            /// <inheritdoc/>\n            public void OnSubscriptionEventReceived(OpcUaSubscriptionNotification notification)\n            {\n                CallMessageReceiverDelegates(notification);\n            }\n\n            /// <inheritdoc/>\n            public void OnSubscriptionDataDiagnosticsChange(bool liveData, int valueChanges, int overflow,\n                int heartbeats)\n            {\n                lock (_lock)\n                {\n                    _group._heartbeats.Count += heartbeats;\n                    _group._overflows.Count += overflow;\n                    if (liveData)\n                    {\n                        if (_group._dataChanges.Count >= kNumberOfInvokedMessagesResetThreshold ||\n                            _group._valueChanges.Count >= kNumberOfInvokedMessagesResetThreshold)\n                        {\n                            _logger.NotificationsCounterReset((int)_group._dataChanges.Count, (int)_group._valueChanges.Count);\n                            _group._dataChanges.Count = 0;\n                            _group._valueChanges.Count = 0;\n                            _group._heartbeats.Count = 0;\n                            _group._sink.OnCounterReset();\n                        }\n\n                        _group._valueChanges.Count += valueChanges;\n                        _group._dataChanges.Count++;\n                    }\n                }\n            }\n\n            /// <inheritdoc/>\n            public void OnSubscriptionCyclicReadDiagnosticsChange(int valuesSampled, int overflow)\n            {\n                lock (_lock)\n                {\n                    _group._overflows.Count += overflow;\n\n                    if (_group._dataChanges.Count >= kNumberOfInvokedMessagesResetThreshold ||\n                        _group._sampledValues.Count >= kNumberOfInvokedMessagesResetThreshold)\n                    {\n                        _logger.NotificationsCounterResetRead((int)_group._cyclicReads.Count, (int)_group._sampledValues.Count);\n                        _group._cyclicReads.Count = 0;\n                        _group._sampledValues.Count = 0;\n                        _group._sink.OnCounterReset();\n                    }\n\n                    _group._sampledValues.Count += valuesSampled;\n                    _group._cyclicReads.Count++;\n                }\n            }\n\n            /// <inheritdoc/>\n            public void OnSubscriptionEventDiagnosticsChange(bool liveData, int events, int overflow,\n                int modelChanges)\n            {\n                lock (_lock)\n                {\n                    _group._modelChanges.Count += modelChanges;\n                    _group._overflows.Count += overflow;\n\n                    if (liveData)\n                    {\n                        if (_group._events.Count >= kNumberOfInvokedMessagesResetThreshold ||\n                            _group._eventNotification.Count >= kNumberOfInvokedMessagesResetThreshold)\n                        {\n                            _logger.NotificationsCounterResetEvent((int)_group._events.Count, (int)_group._eventNotification.Count);\n                            _group._events.Count = 0;\n                            _group._eventNotification.Count = 0;\n                            _group._modelChanges.Count = 0;\n\n                            _group._sink.OnCounterReset();\n                        }\n\n                        _group._eventNotification.Count += events;\n                        _group._events.Count++;\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Initialize sending of keep alive messages\n            /// </summary>\n            private void InitializeKeepAlive()\n            {\n                _sendKeepAlives = _writer.DataSet?.SendKeepAlive\n                    ?? _group._options.Value.EnableDataSetKeepAlives == true;\n                _sendKeepAliveAsKeyFrame = _sendKeepAlives &&\n                    (_writer.DataSet?.KeepAliveAsKeyFrame\n                        ?? _group._options.Value.SendDataSetKeepAlivesAsKeyFrame == true);\n            }\n\n            /// <summary>\n            /// Initializes the Metadata triggering mechanism from the cconfiguration model\n            /// </summary>\n            private void InitializeMetaDataTrigger()\n            {\n                var metaDataSendInterval = _writer.Writer.MetaDataUpdateTime\n                    ?? _group._options.Value.DefaultMetaDataUpdateTime\n                    ?? TimeSpan.Zero;\n                if (metaDataSendInterval > TimeSpan.Zero && SendMetadata)\n                {\n                    if (_metadataTimer == null)\n                    {\n                        _metadataTimer = new TimerEx(metaDataSendInterval, _group._timeProvider);\n                        _metadataTimer.Elapsed += MetadataTimerElapsed;\n                        _metadataTimer.Start();\n                    }\n                    else\n                    {\n                        _metadataTimer.Interval = metaDataSendInterval;\n                    }\n                }\n                else\n                {\n                    if (_metadataTimer != null)\n                    {\n                        _metadataTimer.Stop();\n                        _metadataTimer.Dispose();\n                        _metadataTimer = null;\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Fired when metadata time elapsed\n            /// </summary>\n            /// <param name=\"sender\"></param>\n            /// <param name=\"e\"></param>\n            private void MetadataTimerElapsed(object? sender, ElapsedEventArgs e)\n            {\n                try\n                {\n                    var timer = _metadataTimer;\n                    if (timer == null)\n                    {\n                        return;\n                    }\n                    timer.Enabled = false;\n                    // Enabled again after calling message receiver delegate\n                }\n                catch (ObjectDisposedException)\n                {\n                    // Disposed while being invoked\n                    return;\n                }\n\n                var notification = Subscription?.CreateKeepAlive();\n                if (notification != null)\n                {\n                    // This call udpates the message type, so no need to do it here.\n                    CallMessageReceiverDelegates(notification, true);\n                }\n                else\n                {\n                    // Failed to send, try again later\n                    InitializeMetaDataTrigger();\n                }\n            }\n\n            /// <summary>\n            /// handle subscription change messages\n            /// </summary>\n            /// <param name=\"notification\"></param>\n            /// <param name=\"sourceIsMetaDataTimer\"></param>\n            private void CallMessageReceiverDelegates(OpcUaSubscriptionNotification notification,\n                bool sourceIsMetaDataTimer = false)\n            {\n                try\n                {\n                    var metadata = GetMetadata(_group._options.Value.AsyncMetaDataLoadTimeout ?? TimeSpan.FromSeconds(1));\n                    _group.GetSchemaAndWriterGroup(_writer.Topic, out var writerGroup, out var networkMessageSchema);\n                    lock (_lock)\n                    {\n                        var single = notification.Notifications?.Count == 1 ?\n                            notification.Notifications[0] : null;\n                        if (SendMetadata)\n                        {\n                            if (metadata != null)\n                            {\n                                var sendMetadata = sourceIsMetaDataTimer;\n                                //\n                                // Only send if called from metadata timer or if the metadata version changes.\n                                //\n                                if (_lastMajorVersion != metadata.MetaData.DataSetMetaData.MajorVersion ||\n                                    _lastMinorVersion != metadata.MetaData.MinorVersion)\n                                {\n                                    _lastMajorVersion = metadata.MetaData.DataSetMetaData.MajorVersion;\n                                    _lastMinorVersion = metadata.MetaData.MinorVersion;\n\n                                    Interlocked.Increment(ref _group._metadataChanges);\n                                    sendMetadata = true;\n                                }\n                                if (sendMetadata)\n                                {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                                    var metadataFrame = new OpcUaSubscriptionNotification(notification)\n                                    {\n                                        MessageType = MessageType.Metadata,\n                                        EventTypeName = null,\n                                        Context = CreateMessageContext(writerGroup, notification,\n                                            _writer.MetadataTopic, _writer.MetadataQos,\n                                            _writer.MetadataRetain, _writer.MetadataTtl,\n                                            () => Interlocked.Increment(ref _metadataSequenceNumber),\n                                            true, null, single, metadata)\n                                    };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                                    _group._sink.OnMessage(metadataFrame);\n                                    InitializeMetaDataTrigger();\n                                }\n                            }\n                            else\n                            {\n                                _logger.NoMetadataAvailable(_writer);\n                                Interlocked.Increment(ref _group._messagesWithoutMetadata);\n                            }\n                        }\n\n                        if (!sourceIsMetaDataTimer)\n                        {\n                            Debug.Assert(notification.Notifications != null);\n                            notification.Context = CreateMessageContext(writerGroup, notification,\n                                _writer.Topic, _writer.Qos, _writer.Retain, _writer.Ttl,\n                                () => Interlocked.Increment(ref _dataSetSequenceNumber),\n                                false, networkMessageSchema, single, metadata);\n                            _logger.EnqueuingNotification(notification.ToString());\n                            _group._sink.OnMessage(notification);\n                        }\n                    }\n                }\n                catch (Exception ex)\n                {\n                    _logger.FailedToProduceMessage(ex);\n                }\n            }\n\n            /// <summary>\n            /// Get metadata for the writer and block until it is available\n            /// </summary>\n            /// <param name=\"timeout\"></param>\n            /// <returns></returns>\n            internal PublishedDataSetMessageSchemaModel? GetMetadata(TimeSpan timeout)\n            {\n                PublishedDataSetMessageSchemaModel? metadata;\n                lock (_lock)\n                {\n                    metadata = MetaData;\n                    if (metadata == null && !IsMetadataDisabled)\n                    {\n                        if (timeout != TimeSpan.Zero)\n                        {\n                            var sw = Stopwatch.StartNew();\n                            // Block until we have metadata or just continue\n                            _metaDataLoader.Value.BlockUntilLoaded(timeout);\n                            _logger.BlockedMessageForMetadata(sw.Elapsed, _writer);\n                        }\n                        metadata = MetaData;\n                    }\n                }\n                return metadata;\n            }\n\n            /// <summary>\n            /// Create message context for notification\n            /// </summary>\n            /// <param name=\"writerGroup\"></param>\n            /// <param name=\"notification\"></param>\n            /// <param name=\"topic\"></param>\n            /// <param name=\"qos\"></param>\n            /// <param name=\"retain\"></param>\n            /// <param name=\"ttl\"></param>\n            /// <param name=\"sequenceNumber\"></param>\n            /// <param name=\"isMetadata\"></param>\n            /// <param name=\"networkMessageSchema\"></param>\n            /// <param name=\"single\"></param>\n            /// <param name=\"metadata\"></param>\n            /// <returns></returns>\n            private DataSetWriterContext CreateMessageContext(WriterGroupModel writerGroup,\n                OpcUaSubscriptionNotification notification, string topic, QoS? qos, bool? retain, TimeSpan? ttl,\n                Func<uint> sequenceNumber, bool isMetadata, IEventSchema? networkMessageSchema = null,\n                MonitoredItemNotificationModel? single = null, PublishedDataSetMessageSchemaModel? metadata = null)\n            {\n                return new DataSetWriterContext\n                {\n                    PublisherId = writerGroup.PublisherId\n                        ?? _group._options.Value.PublisherId ?? Constants.DefaultPublisherId,\n                    DataSetWriterId = (ushort)Index,\n                    MetaData = metadata,\n                    Writer = _writer.Writer,\n                    ExtensionFields = _extensionFields.GetExtensionFieldData(notification),\n                    WriterName = Name,\n                    NextWriterSequenceNumber = sequenceNumber,\n                    WriterGroup = writerGroup,\n                    Schema = networkMessageSchema,\n                    CloudEvent = GetCloudEventHeader(writerGroup, notification, isMetadata),\n                    Topic = GetTopic(_writer.Routing, topic, single?.PathFromRoot),\n                    Retain = retain,\n                    Ttl = ttl,\n                    Qos = qos\n                };\n\n                CloudEventHeader? GetCloudEventHeader(WriterGroupModel writerGroup,\n                    OpcUaSubscriptionNotification notification, bool isMetadata)\n                {\n                    if (_group._options.Value.EnableCloudEvents != true)\n                    {\n                        return null;\n                    }\n                    var type = isMetadata ? \"Metadata\" :\n                        notification.MessageType == MessageType.Event ? \"Event\" : \"Dataset\";\n                    var typeName = _writer.Writer.DataSet?.Type ?? notification.EventTypeName;\n                    if (!string.IsNullOrEmpty(typeName))\n                    {\n                        type += \"/\" + typeName;\n                    }\n                    if (!Uri.TryCreate(_writer.Writer.DataSet?.DataSetSource?.Uri ??\n                            notification.ApplicationUri ?? notification.EndpointUrl,\n                        UriKind.Absolute, out var source))\n                    {\n                        // Set a default source\n                        source = new Uri(\"urn:\" + _writer.Writer.DataSet?.DataSetSource?.Uri ??\n                                writerGroup.PublisherId\n                            ?? _group._options.Value.PublisherId ?? \"publisher\");\n                    }\n                    var messageId = Guid.CreateVersion7(_group._timeProvider.GetUtcNow());\n                    return new CloudEventHeader\n                    {\n                        Id = $\"{messageId:N}/{notification.SequenceNumber:X}\",\n                        Time = notification.PublishTimestamp,\n                        Type = type,\n                        Source = source,\n                        Subject = _writer.Writer.DataSet?.Subject\n                    };\n                }\n\n                static string GetTopic(DataSetRoutingMode routing, string topic, Opc.Ua.RelativePath? subpath)\n                {\n                    if (subpath == null || routing == DataSetRoutingMode.None)\n                    {\n                        return topic;\n                    }\n                    // Append subpath to topic (use browse names with namespace index if requested\n                    var sb = new StringBuilder().Append(topic);\n                    foreach (var path in subpath.Elements)\n                    {\n                        sb.Append('/');\n                        if (path.TargetName.NamespaceIndex != 0 &&\n                            routing == DataSetRoutingMode.UseBrowseNamesWithNamespaceIndex)\n                        {\n                            sb.Append(path.TargetName.NamespaceIndex).Append(':');\n                        }\n                        sb.Append(TopicFilter.Escape(path.TargetName.Name));\n                    }\n                    return sb.ToString();\n                }\n            }\n\n            /// <summary>\n            /// Send final close messages to sink. This happens under lock of writer group.\n            /// This will trigger an empty message and cleanup of any messages stuck in the topic\n            /// </summary>\n            private void SendCloseNotifications()\n            {\n                Debug.Assert(_group._lock.CurrentCount == 0, \"This happens under lock of writer group.\");\n                // Notify close to clean up the topic content if needed\n                if (SendMetadata)\n                {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                    var metadataFrame = new OpcUaSubscriptionNotification(_group._timeProvider.GetUtcNow())\n                    {\n                        MessageType = MessageType.Closed\n                    };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                    metadataFrame.Context = CreateMessageContext(_group._writerGroup, metadataFrame,\n                        _writer.MetadataTopic, _writer.MetadataQos, false, null,\n                        () => Interlocked.Increment(ref _metadataSequenceNumber), true);\n                    _group._sink.OnMessage(metadataFrame);\n                }\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                var notification = new OpcUaSubscriptionNotification(_group._timeProvider.GetUtcNow())\n                {\n                    MessageType = MessageType.Closed\n                };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                notification.Context = CreateMessageContext(_group._writerGroup, notification,\n                    _writer.Topic, _writer.Qos, false, null,\n                    () => Interlocked.Increment(ref _dataSetSequenceNumber), false);\n                _group._sink.OnMessage(notification);\n            }\n\n            /// <summary>\n            /// Make unique writer name\n            /// </summary>\n            /// <param name=\"str\"></param>\n            /// <param name=\"strings\"></param>\n            /// <returns></returns>\n            private static string CreateUniqueWriterName(string? str, HashSet<string> strings)\n            {\n                var originalName = str ?? Constants.DefaultDataSetWriterName;\n                var uniqueName = originalName;\n                for (var index = 1; ; index++)\n                {\n                    if (strings.Add(uniqueName))\n                    {\n                        return uniqueName;\n                    }\n                    uniqueName = $\"{originalName}{index}\";\n                }\n            }\n\n            /// <summary>\n            /// Asynchronously load metadata after the subscription is created and metadata\n            /// has changed event is received.\n            /// </summary>\n            private sealed class MetaDataLoader : IAsyncDisposable\n            {\n                /// <summary>\n                /// Current meta data\n                /// </summary>\n                public PublishedDataSetMessageSchemaModel? MetaData { get; private set; }\n\n                /// <summary>\n                /// Create loader\n                /// </summary>\n                /// <param name=\"subscription\"></param>\n                public MetaDataLoader(DataSetWriterSubscription subscription)\n                {\n                    _writer = subscription;\n                    _tcs = new TaskCompletionSource();\n                    _loader = Task.Factory.StartNew(() => StartAsync(_cts.Token),\n                        default, TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap();\n                }\n\n                /// <inheritdoc/>\n                public async ValueTask DisposeAsync()\n                {\n                    try\n                    {\n                        await _cts.CancelAsync().ConfigureAwait(false);\n                        await _loader.ConfigureAwait(false);\n                    }\n                    catch (OperationCanceledException) { }\n                    finally\n                    {\n                        _cts.Dispose();\n                    }\n                }\n\n                /// <summary>\n                /// Load meta data\n                /// </summary>\n                public void Reload()\n                {\n                    _trigger.Set();\n                }\n\n                /// <summary>\n                /// Wait for metadata to be loaded or timeout after timeout\n                /// </summary>\n                /// <param name=\"timeout\"></param>\n                /// <returns></returns>\n                public bool BlockUntilLoaded(TimeSpan timeout)\n                {\n                    try\n                    {\n                        return _tcs.Task.Wait(timeout);\n                    }\n                    catch\n                    {\n                        return false;\n                    }\n                }\n\n                /// <summary>\n                /// Wait for metadata to be loaded or timeout after timeout\n                /// </summary>\n                /// <param name=\"timeout\"></param>\n                /// <param name=\"ct\"></param>\n                /// <returns></returns>\n                public async Task<bool> BlockUntilLoadedAsync(TimeSpan timeout, CancellationToken ct)\n                {\n                    try\n                    {\n                        await _tcs.Task.WaitAsync(timeout, ct).ConfigureAwait(false);\n                        return true;\n                    }\n                    catch\n                    {\n                        return false;\n                    }\n                }\n\n                /// <summary>\n                /// Meta data loader task\n                /// </summary>\n                /// <param name=\"ct\"></param>\n                /// <returns></returns>\n                private async Task StartAsync(CancellationToken ct)\n                {\n                    while (!ct.IsCancellationRequested)\n                    {\n                        try\n                        {\n                            await UpdateMetaDataAsync(ct).ConfigureAwait(false);\n                            _tcs.TrySetResult();\n                            Interlocked.Increment(ref _writer._group._metadataLoadSuccess);\n                        }\n                        catch (OperationCanceledException)\n                        {\n                            _tcs.TrySetCanceled(ct);\n                        }\n                        catch (Exception ex)\n                        {\n                            _writer._logger.FailedToGetMetadata(_writer._writer, ex.Message);\n                            _tcs.TrySetException(ex);\n                            Interlocked.Increment(ref _writer._group._metadataLoadFailures);\n                        }\n                        Interlocked.Exchange(ref _tcs, new TaskCompletionSource());\n                        await _trigger.WaitAsync(ct).ConfigureAwait(false);\n                    }\n                }\n\n                /// <summary>\n                /// Update metadata\n                /// </summary>\n                /// <param name=\"ct\"></param>\n                /// <returns></returns>\n                internal async Task UpdateMetaDataAsync(CancellationToken ct = default)\n                {\n                    var dataSetName = _writer._writer.Writer.DataSet?.Name\n                        ?? _writer._writer.Writer.DataSetWriterName\n                        ?? _writer.Id;\n                    var writerGroup = _writer._group._writerGroup.Name\n                        ?? _writer._group.Id;\n                    var dataSetMetaData = _writer._writer.DataSet?.DataSetMetaData;\n                    var subscription = _writer.Subscription;\n                    if (dataSetMetaData == null || subscription == null || dataSetName == null)\n                    {\n                        // Metadata disabled\n                        MetaData = null;\n                        return;\n                    }\n\n                    //\n                    // Use the date time to version across reboots. This could be done\n                    // more elegantly by saving the last version to persistent storage\n                    // such as twin, but this is ok for the sake of being able to have\n                    // an incremental version number defining metadata changes.\n                    //\n                    var minor = (uint)_writer._group._timeProvider.GetUtcNow()\n                        .UtcDateTime.ToBinary();\n\n                    var sw = Stopwatch.StartNew();\n                    var id = $\"{writerGroup}|{dataSetName}\";\n                    _writer._logger.LoadingMetadata(dataSetMetaData.MajorVersion ?? 1, minor, id);\n\n                    var fieldMask = _writer._writer.Writer.DataSetFieldContentMask;\n                    var metaData = await subscription.CollectMetaDataAsync(_writer, fieldMask,\n                        dataSetMetaData, minor, ct).ConfigureAwait(false);\n\n                    _writer._logger.LoadingMetadataTook(dataSetMetaData.MajorVersion ?? 1, minor,\n                        id, sw.Elapsed);\n\n                    var msgMask = _writer._writer.Writer.MessageSettings?.DataSetMessageContentMask;\n                    MetaData = new PublishedDataSetMessageSchemaModel\n                    {\n                        Id = id,\n                        MetaData = metaData with\n                        {\n                            Fields = _writer._extensionFields.AddMetadata(metaData.Fields)\n                        },\n                        TypeName = null,\n                        DataSetFieldContentFlags = fieldMask,\n                        DataSetMessageContentFlags = msgMask\n                    };\n                }\n\n                private TaskCompletionSource _tcs;\n                private readonly Task _loader;\n                private readonly CancellationTokenSource _cts = new();\n                private readonly AsyncAutoResetEvent _trigger = new();\n                private readonly DataSetWriterSubscription _writer;\n            }\n\n            /// <summary>\n            /// Extension fields of the writer\n            /// </summary>\n            private sealed class ExtensionFields\n            {\n                /// <summary>\n                /// Get extension fields as configured\n                /// </summary>\n                /// <returns></returns>\n                public IReadOnlyList<ExtensionFieldModel>? Fields\n                {\n                    get\n                    {\n                        if ((_fieldMask & (DataSetFieldContentFlags.EndpointUrl |\n                                           DataSetFieldContentFlags.ApplicationUri)) == 0)\n                        {\n                            return _extensionFields;\n                        }\n                        var extensionFields = _extensionFields?.ToList() ?? [];\n                        if ((_fieldMask & DataSetFieldContentFlags.EndpointUrl) != 0 &&\n                            !extensionFields\n                            .Any(f => f.DataSetFieldName == nameof(DataSetFieldContentFlags.EndpointUrl)))\n                        {\n                            extensionFields.Add(new ExtensionFieldModel\n                            {\n                                DataSetFieldName = nameof(DataSetFieldContentFlags.EndpointUrl),\n                                Value = \"{{EndpointUrl}}\",\n                                DataSetFieldDescription = \"Endpoint Url of the data source.\"\n                            });\n                        }\n                        if ((_fieldMask & DataSetFieldContentFlags.ApplicationUri) != 0 &&\n                            !extensionFields\n                            .Any(f => f.DataSetFieldName == nameof(DataSetFieldContentFlags.ApplicationUri)))\n                        {\n                            extensionFields.Add(new ExtensionFieldModel\n                            {\n                                DataSetFieldName = nameof(DataSetFieldContentFlags.ApplicationUri),\n                                Value = \"{{ApplicationUri}}\",\n                                DataSetFieldDescription = \"Application Uri of the data source.\"\n                            });\n                        }\n                        return extensionFields;\n                    }\n                }\n\n                /// <summary>\n                /// Create extension fields\n                /// </summary>\n                /// <param name=\"serializer\"></param>\n                /// <param name=\"extensionFields\"></param>\n                /// <param name=\"dataSetFieldContentMask\"></param>\n                public ExtensionFields(IJsonSerializer serializer,\n                    IReadOnlyList<ExtensionFieldModel>? extensionFields,\n                    DataSetFieldContentFlags? dataSetFieldContentMask)\n                {\n                    _serializer = serializer;\n                    _fieldMask = dataSetFieldContentMask ?? 0;\n                    _extensionFields = extensionFields;\n                    _data = GenerateExtensionFieldData();\n                }\n\n                /// <summary>\n                /// Get extension field data\n                /// </summary>\n                /// <param name=\"notification\"></param>\n                /// <returns></returns>\n                public IReadOnlyList<(string, Opc.Ua.DataValue?)> GetExtensionFieldData(\n                    OpcUaSubscriptionNotification notification)\n                {\n                    if ((_fieldMask & (DataSetFieldContentFlags.EndpointUrl |\n                                       DataSetFieldContentFlags.ApplicationUri)) == 0)\n                    {\n                        return _data;\n                    }\n                    return _data\n                        .Select(f => f.Item1 switch\n                        {\n                            nameof(DataSetFieldContentFlags.EndpointUrl) =>\n                                (f.Item1, new Opc.Ua.DataValue(notification.EndpointUrl)),\n                            nameof(DataSetFieldContentFlags.ApplicationUri) =>\n                                (f.Item1, new Opc.Ua.DataValue(notification.ApplicationUri)),\n                            _ => f\n                        })\n                        .ToList();\n                }\n\n                /// <summary>\n                /// Add extension field metadata to the end of the metadata fields\n                /// </summary>\n                /// <param name=\"metadataFields\"></param>\n                /// <returns></returns>\n                public IReadOnlyList<PublishedFieldMetaDataModel> AddMetadata(\n                    IReadOnlyList<PublishedFieldMetaDataModel> metadataFields)\n                {\n                    var extensionFields = Fields;\n                    if (extensionFields == null || extensionFields.Count == 0)\n                    {\n                        return metadataFields;\n                    }\n                    var fields = new List<PublishedFieldMetaDataModel>(metadataFields);\n                    foreach (var field in extensionFields)\n                    {\n                        var builtInType = GetBuiltInType(field.Value);\n                        fields.Add(new PublishedFieldMetaDataModel\n                        {\n                            Flags = 0, // Set to 1 << 1 for PromotedField fields.\n                            Name = field.DataSetFieldName,\n                            Id = field.DataSetClassFieldId,\n                            Description = field.DataSetFieldDescription,\n                            ValueRank = (int)(field.Value.IsArray ?\n                                 NodeValueRank.OneDimension : NodeValueRank.Scalar),\n                            ArrayDimensions = null,\n                            MaxStringLength = 0,\n                            // If the Property is EngineeringUnits, the unit of the Field Value\n                            // shall match the unit of the FieldMetaData.\n                            Properties = null, // TODO: Add engineering units etc. to properties\n                            BuiltInType = (byte)builtInType\n                        });\n                    }\n                    return fields;\n                }\n\n                /// <summary>\n                /// Generate extension field data values\n                /// </summary>\n                /// <returns></returns>\n                private IReadOnlyList<(string, Opc.Ua.DataValue?)> GenerateExtensionFieldData()\n                {\n                    var extensionFields = Fields;\n                    if (extensionFields == null || extensionFields.Count == 0)\n                    {\n                        return Array.Empty<(string, Opc.Ua.DataValue?)>();\n                    }\n                    var extensions = new List<(string, Opc.Ua.DataValue?)>();\n                    var encoder = new JsonVariantEncoder(new Opc.Ua.ServiceMessageContext(),\n                        _serializer);\n                    foreach (var field in extensionFields)\n                    {\n                        extensions.Add((field.DataSetFieldName,\n                            new Opc.Ua.DataValue(encoder.Decode(field.Value,\n                                (Opc.Ua.BuiltInType)GetBuiltInType(field.Value)))));\n                    }\n                    return extensions;\n                }\n\n                private static byte GetBuiltInType(VariantValue value)\n                {\n                    return value.GetTypeCode() switch\n                    {\n                        TypeCode.Empty => 0,\n                        TypeCode.Boolean => 1,\n                        TypeCode.SByte => 2,\n                        TypeCode.Byte => 3,\n                        TypeCode.Int16 => 4,\n                        TypeCode.UInt16 => 5,\n                        TypeCode.Int32 => 6,\n                        TypeCode.UInt32 => 7,\n                        TypeCode.Int64 => 8,\n                        TypeCode.UInt64 => 9,\n                        TypeCode.Single => 10,\n                        TypeCode.Double => 11,\n                        TypeCode.String or TypeCode.Char => 12,\n                        TypeCode.DateTime => 13,\n                        _ => 24\n                    };\n                }\n\n                private readonly IJsonSerializer _serializer;\n                private readonly DataSetFieldContentFlags _fieldMask;\n                private readonly IReadOnlyList<ExtensionFieldModel>? _extensionFields;\n                private readonly IReadOnlyList<(string, Opc.Ua.DataValue?)> _data;\n            }\n\n            private readonly WriterGroupDataSource _group;\n            private readonly ILogger _logger;\n            private readonly Lock _lock = new();\n            private volatile uint _frameCount;\n            private uint? _lastMajorVersion;\n            private uint? _lastMinorVersion;\n            private TimerEx? _metadataTimer;\n            private SubscriptionModel _template;\n            private ConnectionIdentifier _connection;\n            private DataSetWriter _writer;\n            private ExtensionFields _extensionFields;\n            private readonly Lazy<MetaDataLoader> _metaDataLoader;\n            private uint _dataSetSequenceNumber;\n            private uint _metadataSequenceNumber;\n            private bool _sendKeepAlives;\n            private bool _sendKeepAliveAsKeyFrame;\n            private bool _disposed;\n        }\n    }\n\n    internal static partial class DataSetWriterSubscriptionLogging\n    {\n        private const int EventClass = 130;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Creating new writer {Id} ({Writer}) in writer group {WriterGroup}...\")]\n        internal static partial void CreatingNewWriter(this ILogger logger, string id,\n            string writer, string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Created writer {Id} in writer group {WriterGroup}.\")]\n        internal static partial void CreatedWriter(this ILogger logger, string id,\n            string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug,\n            Message = \"Updating writer {Id} in writer group {WriterGroup}...\")]\n        internal static partial void UpdatingWriter(this ILogger logger, string id,\n            string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Recreated subscription for writer {Id} in writer group {WriterGroup}...\")]\n        internal static partial void RecreatedSubscription(this ILogger logger, string id,\n            string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug,\n            Message = \"Updated monitored items for writer {Id} in writer group {WriterGroup}.\")]\n        internal static partial void UpdatedMonitoredItems(this ILogger logger, string id,\n            string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"Closed writer {Id} in writer group {WriterGroup}.\")]\n        internal static partial void ClosedWriter(this ILogger logger, string id,\n            string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Debug,\n            Message = \"Notifications counter has been reset to prevent overflow. So far, {DataChangesCount} \" +\n            \"data changes and {ValueChangesCount} value changes were invoked by message source.\")]\n        internal static partial void NotificationsCounterReset(this ILogger logger,\n            int dataChangesCount, int valueChangesCount);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Debug,\n            Message = \"Notifications counter has been reset to prevent overflow. So far, {ReadCount} \" +\n            \"data changes and {ValuesCount} value changes were invoked by message source.\")]\n        internal static partial void NotificationsCounterResetRead(this ILogger logger,\n            int readCount, int valuesCount);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Debug,\n            Message = \"Notifications counter has been reset to prevent overflow. So far, {EventChangesCount} \" +\n            \"event changes and {EventValueChangesCount} event value changes were invoked by message source.\")]\n        internal static partial void NotificationsCounterResetEvent(this ILogger logger,\n            int eventChangesCount, int eventValueChangesCount);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"Blocked message for {Duration} until metadata was loaded for {Writer}.\")]\n        internal static partial void BlockedMessageForMetadata(this ILogger logger,\n            TimeSpan duration, WriterGroupDataSource.DataSetWriter writer);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Warning,\n            Message = \"No metadata available for {Writer} - dropping notification.\")]\n        internal static partial void NoMetadataAvailable(this ILogger logger,\n            WriterGroupDataSource.DataSetWriter writer);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Trace,\n            Message = \"Enqueuing notification: {Notification}\")]\n        internal static partial void EnqueuingNotification(this ILogger logger, string notification);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Error,\n            Message = \"Failed to get metadata for {Writer} with error {Error}\")]\n        internal static partial void FailedToGetMetadata(this ILogger logger,\n            WriterGroupDataSource.DataSetWriter writer, string error);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Debug,\n            Message = \"Loading Metadata {Major}.{Minor} for {Writer}...\")]\n        internal static partial void LoadingMetadata(this ILogger logger, uint major,\n            uint minor, string writer);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Information,\n            Message = \"Loading Metadata {Major}.{Minor} for {Writer} took {Duration}.\")]\n        internal static partial void LoadingMetadataTook(this ILogger logger, uint major,\n            uint minor, string writer, TimeSpan duration);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Warning,\n            Message = \"Failed to produce message.\")]\n        internal static partial void FailedToProduceMessage(this ILogger logger, Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/Extensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Furly.Exceptions;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Service Extensions\n    /// </summary>\n    internal static class Extensions\n    {\n        /// <summary>\n        /// Resolve node id\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"rootId\"></param>\n        /// <param name=\"browsePath\"></param>\n        /// <param name=\"paramName\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<NodeId> ResolveNodeIdAsync(this IOpcUaSession session,\n            RequestHeaderModel? header, string? rootId, IReadOnlyList<string>? browsePath,\n            string paramName, TimeProvider timeProvider, CancellationToken ct = default)\n        {\n            var resolvedNodeId = rootId.ToNodeId(session.MessageContext);\n            if (browsePath?.Count > 0)\n            {\n                resolvedNodeId = await session.ResolveBrowsePathToNodeAsync(header,\n                    resolvedNodeId, [.. browsePath], paramName,\n                    timeProvider, ct).ConfigureAwait(false);\n            }\n            return resolvedNodeId;\n        }\n\n        /// <summary>\n        /// Resolve provided path to node.\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"rootId\"></param>\n        /// <param name=\"paths\"></param>\n        /// <param name=\"paramName\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ResourceNotFoundException\"></exception>\n        /// <exception cref=\"ResourceConflictException\"></exception>\n        public static async Task<NodeId> ResolveBrowsePathToNodeAsync(\n            this IOpcUaSession session, RequestHeaderModel? header, NodeId rootId,\n            string[] paths, string paramName, TimeProvider timeProvider,\n            CancellationToken ct = default)\n        {\n            if (paths == null || paths.Length == 0)\n            {\n                return rootId;\n            }\n            if (NodeId.IsNull(rootId))\n            {\n                rootId = ObjectIds.RootFolder;\n            }\n            var browsepaths = new BrowsePathCollection\n            {\n                new BrowsePath\n                {\n                    StartingNode = rootId,\n                    RelativePath = paths.ToRelativePath(session.MessageContext)\n                }\n            };\n            var response = await session.Services.TranslateBrowsePathsToNodeIdsAsync(\n                header.ToRequestHeader(timeProvider), browsepaths,\n                ct).ConfigureAwait(false);\n            Debug.Assert(response != null);\n            var results = response.Validate(response.Results, r => r.StatusCode,\n                response.DiagnosticInfos, browsepaths);\n            var count = results[0].Result.Targets?.Count ?? 0;\n            if (count == 0)\n            {\n                throw new ResourceNotFoundException(\n                    $\"{paramName} did not resolve to any node.\");\n            }\n            if (count != 1)\n            {\n                throw new ResourceConflictException(\n                    $\"{paramName} resolved to {count} nodes.\");\n            }\n            return results[0].Result.Targets[0].TargetId\n                .ToNodeId(session.MessageContext.NamespaceUris);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/FileSystemServices.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.IO;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// This class provides foundational file transfer services.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public sealed class FileSystemServices<T> : IFileSystemServices<T>, IDisposable\n    {\n        /// <summary>\n        /// Create node service\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public FileSystemServices(IOpcUaClientManager<T> client,\n            IOptions<PublisherOptions> options, TimeProvider? timeProvider = null)\n        {\n            _client = client;\n            _options = options;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _activitySource.Dispose();\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<ServiceResponse<FileSystemObjectModel>> GetFileSystemsAsync(\n            T endpoint, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"GetFileSystems\");\n            var header = new RequestHeaderModel();\n\n            var browser = new FileSystemBrowser(header, _options, _timeProvider);\n            return _client.ExecuteAsync(endpoint, browser, header, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<IEnumerable<FileSystemObjectModel>>> GetDirectoriesAsync(\n            T endpoint, FileSystemObjectModel fileSystemOrDirectory, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"GetDirectories\");\n            var header = new RequestHeaderModel();\n\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var (nodeId, argInfo) = await GetFileSystemNodeIdAsync(context.Session,\n                       header, fileSystemOrDirectory, context.Ct).ConfigureAwait(false);\n                if (argInfo != null)\n                {\n                    return new ServiceResponse<IEnumerable<FileSystemObjectModel>>\n                    {\n                        ErrorInfo = argInfo\n                    };\n                }\n                var (references, errorInfo) = await context.Session.FindAsync(\n                    header.ToRequestHeader(_timeProvider), nodeId.YieldReturn(),\n                    ReferenceTypeIds.HasComponent, ct: context.Ct).ConfigureAwait(false);\n                if (errorInfo == null && references.Count > 0 &&\n                    references.All(r => r.ErrorInfo != null))\n                {\n                    errorInfo = references[0].ErrorInfo;\n                }\n                return new ServiceResponse<IEnumerable<FileSystemObjectModel>>\n                {\n                    ErrorInfo = errorInfo,\n                    Result = references\n                        .Where(r => r.TypeDefinition == Opc.Ua.ObjectTypes.FileDirectoryType &&\n                            r.ErrorInfo == null)\n                        .Select(f => new FileSystemObjectModel\n                        {\n                            NodeId = header.AsString(f.Node, context.Session.MessageContext, _options),\n                            Name = f.DisplayName\n                        })\n                };\n            }, header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<IEnumerable<FileSystemObjectModel>>> GetFilesAsync(\n            T endpoint, FileSystemObjectModel fileSystemOrDirectory, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"GetFiles\");\n            var header = new RequestHeaderModel();\n\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var (nodeId, argInfo) = await GetFileSystemNodeIdAsync(context.Session,\n                       header, fileSystemOrDirectory, context.Ct).ConfigureAwait(false);\n                if (argInfo != null)\n                {\n                    return new ServiceResponse<IEnumerable<FileSystemObjectModel>>\n                    {\n                        ErrorInfo = argInfo\n                    };\n                }\n\n                var (references, errorInfo) = await context.Session.FindAsync(\n                    header.ToRequestHeader(_timeProvider), nodeId.YieldReturn(),\n                    ReferenceTypeIds.HasComponent, ct: context.Ct).ConfigureAwait(false);\n                if (errorInfo == null && references.Count > 0 &&\n                    references.All(r => r.ErrorInfo != null))\n                {\n                    errorInfo = references[0].ErrorInfo;\n                }\n                return new ServiceResponse<IEnumerable<FileSystemObjectModel>>\n                {\n                    ErrorInfo = errorInfo,\n                    Result = references\n                        .Where(r => r.TypeDefinition == Opc.Ua.ObjectTypes.FileType &&\n                            r.ErrorInfo == null)\n                        .Select(f => new FileSystemObjectModel\n                        {\n                            NodeId = header.AsString(f.Node, context.Session.MessageContext, _options),\n                            Name = f.DisplayName\n                        })\n                };\n            }, header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<Stream>> OpenReadAsync(T endpoint,\n            FileSystemObjectModel file, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"OpenRead\");\n            var header = new RequestHeaderModel();\n            var (stream, errorInfo) = await FileTransferStream.OpenAsync(this,\n                endpoint, header, file, null, ct).ConfigureAwait(false);\n            return new ServiceResponse<Stream>\n            {\n                ErrorInfo = errorInfo,\n                Result = stream\n            };\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<Stream>> OpenWriteAsync(T endpoint,\n            FileSystemObjectModel file, FileOpenWriteOptionsModel? options, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"OpenWrite\");\n            var header = new RequestHeaderModel();\n            var (stream, errorInfo) = await FileTransferStream.OpenAsync(this,\n                endpoint, header, file, options ?? new FileOpenWriteOptionsModel(),\n                ct).ConfigureAwait(false);\n            return new ServiceResponse<Stream>\n            {\n                ErrorInfo = errorInfo,\n                Result = stream\n            };\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<FileSystemObjectModel>> CreateDirectoryAsync(T endpoint,\n            FileSystemObjectModel fileSystemOrDirectory, string name, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"CreateDirectory\");\n            var header = new RequestHeaderModel();\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var (nodeId, argInfo) = await GetFileSystemNodeIdAsync(context.Session,\n                     header, fileSystemOrDirectory, context.Ct).ConfigureAwait(false);\n                if (argInfo != null)\n                {\n                    return new ServiceResponse<FileSystemObjectModel> { ErrorInfo = argInfo };\n                }\n                var requests = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = nodeId,\n                        MethodId = Opc.Ua.MethodIds.FileDirectoryType_CreateDirectory,\n                        InputArguments = new [] { new Variant(name) }\n                    }\n                };\n                // Call method\n                var response = await context.Session.Services.CallAsync(header\n                    .ToRequestHeader(_timeProvider), requests, context.Ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, requests);\n                if (results.ErrorInfo != null)\n                {\n                    return new ServiceResponse<FileSystemObjectModel> { ErrorInfo = results.ErrorInfo };\n                }\n                if (results[0].ErrorInfo != null ||\n                    results[0].Result?.OutputArguments == null ||\n                    results[0].Result.OutputArguments.Count == 0 ||\n                    results[0].Result.OutputArguments[0].Value is not NodeId result)\n                {\n                    return new ServiceResponse<FileSystemObjectModel>\n                    {\n                        ErrorInfo = results[0].ErrorInfo ??\n                            new ServiceResultModel { ErrorMessage = \"no node id returned\" }\n                    };\n                }\n                return new ServiceResponse<FileSystemObjectModel>\n                {\n                    Result = new FileSystemObjectModel\n                    {\n                        NodeId = header.AsString(result, context.Session.MessageContext, _options),\n                        Name = name\n                    }\n                };\n            }, header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<FileSystemObjectModel>> CreateFileAsync(T endpoint,\n            FileSystemObjectModel fileSystemOrDirectory, string name, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"CreateFile\");\n            var header = new RequestHeaderModel();\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var (nodeId, argInfo) = await GetFileSystemNodeIdAsync(context.Session,\n                     header, fileSystemOrDirectory, context.Ct).ConfigureAwait(false);\n                if (argInfo != null)\n                {\n                    return new ServiceResponse<FileSystemObjectModel> { ErrorInfo = argInfo };\n                }\n\n                var requests = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = nodeId,\n                        MethodId = Opc.Ua.MethodIds.FileDirectoryType_CreateFile,\n                        InputArguments = new [] { new Variant(name), new Variant(false) }\n                    }\n                };\n                // Call method\n                var response = await context.Session.Services.CallAsync(header\n                    .ToRequestHeader(_timeProvider), requests, context.Ct).ConfigureAwait(false);\n\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, requests);\n                if (results.ErrorInfo != null)\n                {\n                    return new ServiceResponse<FileSystemObjectModel> { ErrorInfo = results.ErrorInfo };\n                }\n                if (results[0].ErrorInfo != null ||\n                    results[0].Result?.OutputArguments == null ||\n                    results[0].Result.OutputArguments.Count == 0 ||\n                    results[0].Result.OutputArguments[0].Value is not NodeId result)\n                {\n                    return new ServiceResponse<FileSystemObjectModel>\n                    {\n                        ErrorInfo = results[0].ErrorInfo ??\n                            new ServiceResultModel { ErrorMessage = \"no node id returned\" }\n                    };\n                }\n                return new ServiceResponse<FileSystemObjectModel>\n                {\n                    Result = new FileSystemObjectModel\n                    {\n                        NodeId = header.AsString(result, context.Session.MessageContext, _options),\n                        Name = name\n                    }\n                };\n            }, header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<FileSystemObjectModel>> GetParentAsync(T endpoint,\n            FileSystemObjectModel fileOrDirectoryObject, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"GetParent\");\n            var header = new RequestHeaderModel();\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var (nodeId, argInfo) = await GetFileSystemNodeIdAsync(context.Session,\n                     header, fileOrDirectoryObject, context.Ct).ConfigureAwait(false);\n                if (argInfo != null)\n                {\n                    return new ServiceResponse<FileSystemObjectModel> { ErrorInfo = argInfo };\n                }\n\n                // Find parent\n                var (parents, argInfo2) = await context.Session.FindAsync(\n                    header.ToRequestHeader(_timeProvider), nodeId.YieldReturn(),\n                    ReferenceTypeIds.HasComponent, isInverse: true,\n                    maxResults: 1, ct: context.Ct).ConfigureAwait(false);\n                if (argInfo2 != null)\n                {\n                    return new ServiceResponse<FileSystemObjectModel> { ErrorInfo = argInfo2 };\n                }\n                var result = parents.Count > 0 ? parents[0] : default;\n                nodeId = result.Node;\n                if (NodeId.IsNull(nodeId) ||\n                    result.TypeDefinition != Opc.Ua.ObjectTypeIds.FileDirectoryType)\n                {\n                    return new ServiceResponse<FileSystemObjectModel>\n                    {\n                        ErrorInfo = new ServiceResultModel\n                        {\n                            StatusCode = StatusCodes.BadNodeIdInvalid,\n                            ErrorMessage = \"Could not find a file directory object parent.\"\n                        }\n                    };\n                }\n                return new ServiceResponse<FileSystemObjectModel>\n                {\n                    Result = new FileSystemObjectModel\n                    {\n                        NodeId = header.AsString(nodeId, context.Session.MessageContext, _options),\n                        Name = result.DisplayName\n                    }\n                };\n            }, header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResultModel> DeleteFileSystemObjectAsync(T endpoint,\n            FileSystemObjectModel fileOrDirectoryObject, FileSystemObjectModel? parentFileSystemOrDirectory,\n            CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"DeleteFileSystemObject\");\n            var header = new RequestHeaderModel();\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var (nodeId, argInfo) = await GetFileSystemNodeIdAsync(context.Session,\n                     header, fileOrDirectoryObject, context.Ct).ConfigureAwait(false);\n                if (argInfo != null)\n                {\n                    return argInfo;\n                }\n\n                var targetId = nodeId;\n                if (parentFileSystemOrDirectory != null)\n                {\n                    (nodeId, argInfo) = await GetFileSystemNodeIdAsync(context.Session,\n                         header, parentFileSystemOrDirectory, context.Ct).ConfigureAwait(false);\n                    if (argInfo != null)\n                    {\n                        return argInfo;\n                    }\n                }\n                else\n                {\n                    // Find parent\n                    var (parents, argInfo2) = await context.Session.FindAsync(\n                        header.ToRequestHeader(_timeProvider), targetId.YieldReturn(),\n                        ReferenceTypeIds.HasComponent, isInverse: true,\n                        maxResults: 1, ct: context.Ct).ConfigureAwait(false);\n                    if (argInfo2 != null)\n                    {\n                        return argInfo2;\n                    }\n                    var result = parents.Count > 0 ? parents[0] : default;\n                    nodeId = result.Node;\n                    if (NodeId.IsNull(nodeId) ||\n                        result.TypeDefinition != Opc.Ua.ObjectTypeIds.FileDirectoryType)\n                    {\n                        return new ServiceResultModel\n                        {\n                            StatusCode = StatusCodes.BadNodeIdInvalid,\n                            ErrorMessage = \"Could not find a file directory object parent.\"\n                        };\n                    }\n                }\n                var requests = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = nodeId,\n                        MethodId = Opc.Ua.MethodIds.FileDirectoryType_DeleteFileSystemObject,\n                        InputArguments = new [] { new Variant(targetId) }\n                    }\n                };\n                // Call method\n                var response = await context.Session.Services.CallAsync(header\n                    .ToRequestHeader(_timeProvider), requests, context.Ct).ConfigureAwait(false);\n\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, requests);\n                return results.ErrorInfo ?? results[0].ErrorInfo ?? new ServiceResultModel();\n            }, header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<FileInfoModel>> GetFileInfoAsync(T endpoint,\n            FileSystemObjectModel file, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"GetFileInfo\");\n            var header = new RequestHeaderModel();\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var (nodeId, argInfo) = await GetFileSystemNodeIdAsync(context.Session,\n                     header, file, context.Ct).ConfigureAwait(false);\n                if (argInfo != null)\n                {\n                    return new ServiceResponse<FileInfoModel> { ErrorInfo = argInfo };\n                }\n                var (fileInfo, errorInfo) = await context.Session.GetFileInfoAsync(\n                    header.ToRequestHeader(_timeProvider), nodeId, context.Ct).ConfigureAwait(false);\n                return new ServiceResponse<FileInfoModel>\n                {\n                    ErrorInfo = errorInfo,\n                    Result = fileInfo\n                };\n            }, header, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Get the node id for a file system object\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"fileSystemObject\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        private async Task<(NodeId, ServiceResultModel?)> GetFileSystemNodeIdAsync(IOpcUaSession session,\n            RequestHeaderModel header, FileSystemObjectModel fileSystemObject,\n            CancellationToken ct)\n        {\n            var nodeId = fileSystemObject.NodeId.ToNodeId(session.MessageContext);\n            if (fileSystemObject.BrowsePath?.Count > 0)\n            {\n                nodeId ??= ObjectIds.RootFolder;\n                try\n                {\n                    nodeId = await session.ResolveBrowsePathToNodeAsync(header,\n                        nodeId, fileSystemObject.BrowsePath.Select(b => \"<HasComponent>\" + b).ToArray(),\n                        nameof(fileSystemObject.BrowsePath), _timeProvider, ct).ConfigureAwait(false);\n                }\n                catch (Exception ex)\n                {\n                    return (NodeId.Null, ex.ToServiceResultModel());\n                }\n            }\n            if (NodeId.IsNull(nodeId))\n            {\n                return (NodeId.Null, new ServiceResultModel\n                {\n                    StatusCode = StatusCodes.BadNodeIdInvalid,\n                    ErrorMessage = \"Invalid node id and browse path in file system object\"\n                });\n            }\n            return (nodeId, null);\n        }\n\n        /// <summary>\n        /// File system object browser browses from root all objects of file directory type.\n        /// The browse operation stops at the first found and returns the result.\n        /// </summary>\n        private sealed class FileSystemBrowser : AsyncEnumerableBrowser<ServiceResponse<FileSystemObjectModel>>\n        {\n            /// <inheritdoc/>\n            public FileSystemBrowser(RequestHeaderModel? header, IOptions<PublisherOptions> options,\n                TimeProvider timeProvider) : base(header, options, timeProvider,\n                    null, ObjectTypeIds.FileDirectoryType)\n            {\n            }\n\n            /// <inheritdoc/>\n            protected override IEnumerable<ServiceResponse<FileSystemObjectModel>> HandleError(\n                ServiceCallContext context, ServiceResultModel errorInfo)\n            {\n                yield return new ServiceResponse<FileSystemObjectModel>\n                {\n                    ErrorInfo = errorInfo\n                };\n            }\n\n            /// <inheritdoc/>\n            protected override IEnumerable<ServiceResponse<FileSystemObjectModel>> HandleMatching(\n                ServiceCallContext context, IReadOnlyList<BrowseFrame> matching,\n                List<ReferenceDescription> references)\n            {\n                // Only add what we did not match to browse deeper\n                var stop = matching.Select(r => r.NodeId).ToHashSet();\n                references.RemoveAll(r => stop.Contains((NodeId)r.NodeId));\n                return matching.Select(match => new ServiceResponse<FileSystemObjectModel>\n                {\n                    Result = new FileSystemObjectModel\n                    {\n                        NodeId = Header.AsString(match.NodeId,\n                            context.Session.MessageContext, Options),\n                        Name = match.DisplayName\n                    }\n                });\n            }\n        }\n\n        /// <summary>\n        /// File transfer stream\n        /// </summary>\n        private sealed class FileTransferStream : Stream\n        {\n            /// <inheritdoc/>\n            public override bool CanRead\n                => _options == null && _fileHandle.HasValue;\n\n            /// <inheritdoc/>\n            public override bool CanWrite\n                => _options != null && _fileHandle.HasValue;\n\n            /// <inheritdoc/>\n            public override long Length\n                => _fileInfo?.Size ?? Position;\n\n            /// <inheritdoc/>\n            public override long Position { get; set; }\n\n            /// <inheritdoc/>\n            public override bool CanSeek { get; }\n\n            /// <inheritdoc/>\n            public override bool CanTimeout => true;\n\n            /// <inheritdoc/>\n            public override int ReadTimeout\n            {\n                get => _header.OperationTimeout ?? 0;\n                set => _header.OperationTimeout = value;\n            }\n\n            /// <inheritdoc/>\n            public override int WriteTimeout\n            {\n                get => _header.OperationTimeout ?? 0;\n                set => _header.OperationTimeout = value;\n            }\n\n            /// <summary>\n            /// Create stream\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"handle\"></param>\n            /// <param name=\"header\"></param>\n            /// <param name=\"nodeId\"></param>\n            /// <param name=\"fileHandle\"></param>\n            /// <param name=\"fileInfo\"></param>\n            /// <param name=\"bufferSize\"></param>\n            /// <param name=\"options\"></param>\n            public FileTransferStream(FileSystemServices<T> outer,\n                ISessionHandle handle, RequestHeaderModel header,\n                NodeId nodeId, uint fileHandle, FileInfoModel? fileInfo,\n                uint bufferSize, FileOpenWriteOptionsModel? options = null)\n            {\n                _handle = handle;\n                _nodeId = nodeId;\n                _fileHandle = fileHandle;\n                _outer = outer;\n                _header = header;\n                _fileInfo = fileInfo;\n                _bufferSize = bufferSize;\n                _options = options;\n\n                if (options?.Mode == FileWriteMode.Append)\n                {\n                    Position = Length;\n                }\n                else\n                {\n                    Position = 0;\n                }\n\n                CanSeek = false;\n            }\n\n            /// <summary>\n            /// Open stream\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"endpoint\"></param>\n            /// <param name=\"header\"></param>\n            /// <param name=\"file\"></param>\n            /// <param name=\"options\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            public static async Task<(Stream?, ServiceResultModel?)> OpenAsync(\n                FileSystemServices<T> outer, T endpoint, RequestHeaderModel header,\n                FileSystemObjectModel file, FileOpenWriteOptionsModel? options = null,\n                CancellationToken ct = default)\n            {\n                var handle = await outer._client.AcquireSessionAsync(endpoint, header,\n                    ct).ConfigureAwait(false);\n                var closeHandle = handle;\n                try\n                {\n                    var (nodeId, argInfo) = await outer.GetFileSystemNodeIdAsync(handle.Session,\n                       header, file, ct).ConfigureAwait(false);\n                    if (argInfo != null)\n                    {\n                        return (null, argInfo);\n                    }\n\n                    var (fileInfo, errorInfo) = await handle.Session.GetFileInfoAsync(\n                        header.ToRequestHeader(outer._timeProvider),\n                        nodeId, ct).ConfigureAwait(false);\n\n                    var tryCreate = errorInfo != null;\n                    if (errorInfo != null)\n                    {\n                        // There should be file info\n                        return (null, errorInfo);\n                    }\n                    if (options != null && fileInfo?.Writable == false)\n                    {\n                        return (null, new ServiceResultModel\n                        {\n                            StatusCode = StatusCodes.BadNotWritable,\n                            ErrorMessage = \"File is not writable.\"\n                        });\n                    }\n\n                    var bufferSize = fileInfo?.MaxBufferSize;\n                    if (bufferSize == null || bufferSize == 0)\n                    {\n                        var caps = await handle.Session.GetOperationLimitsAsync(\n                            ct).ConfigureAwait(false);\n                        bufferSize = caps.MaxByteStringLength;\n                        if (bufferSize == null || bufferSize == 0)\n                        {\n                            bufferSize = 4096;\n                        }\n                    }\n\n                    var (fileHandle, errorInfo2) = await handle.Session.OpenAsync(\n                        header.ToRequestHeader(outer._timeProvider), nodeId, options?.Mode switch\n                        {\n                            FileWriteMode.Create => 0x2 | 0x4, // Write bit plus erase\n                            FileWriteMode.Append => 0x2 | 0x8, // Write bit plus append\n                            FileWriteMode.Write => 0x2, // Write bit\n                            _ => 0x1 // Read bit\n                        }, ct).ConfigureAwait(false);\n\n                    if (errorInfo2 != null)\n                    {\n                        return (null, errorInfo2);\n                    }\n                    Debug.Assert(fileHandle.HasValue);\n                    closeHandle = null;\n                    return (new FileTransferStream(outer, handle, header, nodeId,\n                        fileHandle.Value, fileInfo, bufferSize.Value, options), null);\n                }\n                finally\n                {\n                    closeHandle?.Dispose();\n                }\n            }\n\n            /// <inheritdoc/>\n            public override void Flush()\n            {\n                // No op\n            }\n\n            /// <inheritdoc/>\n            public override Task FlushAsync(CancellationToken cancellationToken)\n            {\n                // No op\n                return Task.CompletedTask;\n            }\n\n            /// <inheritdoc/>\n            public override long Seek(long offset, SeekOrigin origin)\n            {\n                throw new NotSupportedException(); // TODO\n            }\n\n            /// <inheritdoc/>\n            public override void SetLength(long value)\n            {\n                throw new NotSupportedException(); // TODO\n            }\n\n            /// <inheritdoc/>\n            public override async ValueTask<int> ReadAsync(Memory<byte> buffer,\n                CancellationToken cancellationToken)\n            {\n                ObjectDisposedException.ThrowIf(!_fileHandle.HasValue, this);\n                if (!CanRead)\n                {\n                    throw new IOException(\"Cannot read from write-only stream\");\n                }\n\n                var total = 0;\n                while (!_isEoS)\n                {\n                    var readCount = (int)Math.Min(buffer.Length, _bufferSize);\n                    if (readCount == 0)\n                    {\n                        break;\n                    }\n                    var (result, errorInfo) = await _handle.Session.ReadAsync(\n                        _header.ToRequestHeader(_outer._timeProvider), _nodeId,\n                        _fileHandle.Value, readCount, cancellationToken).ConfigureAwait(false);\n                    if (errorInfo != null)\n                    {\n                        throw new IOException(errorInfo.ErrorMessage);\n                    }\n                    Debug.Assert(result != null);\n\n                    if (result.Length == 0)\n                    {\n                        // eof\n                        _isEoS = true;\n                        break;\n                    }\n\n                    result.CopyTo(buffer.Span);\n\n                    Position += result.Length;\n\n                    total += result.Length;\n                    if (buffer.Length == readCount)\n                    {\n                        break;\n                    }\n                    buffer = buffer[readCount..];\n                }\n                return total;\n            }\n\n            /// <inheritdoc/>\n            public override int Read(byte[] buffer, int offset, int count)\n            {\n                var memory = new Memory<byte>(buffer);\n                return ReadAsync(memory.Slice(offset, count), default)\n                    .AsTask().GetAwaiter().GetResult();\n            }\n\n            /// <inheritdoc/>\n            public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer,\n                CancellationToken cancellationToken)\n            {\n                ObjectDisposedException.ThrowIf(!_fileHandle.HasValue, this);\n                if (!CanWrite)\n                {\n                    throw new IOException(\"Cannot write to read-only stream\");\n                }\n                while (true)\n                {\n                    var writeCount = (int)Math.Min(buffer.Length, _bufferSize);\n                    if (writeCount == 0)\n                    {\n                        break;\n                    }\n                    var errorInfo = await _handle.Session.WriteAsync(\n                        _header.ToRequestHeader(_outer._timeProvider), _nodeId,\n                        _fileHandle.Value, buffer[..writeCount].ToArray(),\n                        cancellationToken).ConfigureAwait(false);\n                    if (errorInfo != null)\n                    {\n                        throw new IOException(errorInfo.ErrorMessage);\n                    }\n\n                    Position += writeCount;\n\n                    if (buffer.Length == writeCount)\n                    {\n                        break;\n                    }\n                    buffer = buffer[writeCount..];\n                }\n            }\n\n            /// <inheritdoc/>\n            public override void Write(byte[] buffer, int offset, int count)\n            {\n                var memory = new ReadOnlyMemory<byte>(buffer);\n                WriteAsync(memory.Slice(offset, count), default)\n                    .AsTask().GetAwaiter().GetResult();\n            }\n\n            /// <inheritdoc/>\n            public override Task CopyToAsync(Stream destination, int bufferSize,\n                CancellationToken cancellationToken)\n            {\n                ValidateCopyToArguments(destination, bufferSize);\n                ObjectDisposedException.ThrowIf(!_fileHandle.HasValue, this);\n\n                if (!CanRead)\n                {\n                    throw new IOException(\"Cannot read from write-only stream\");\n                }\n\n                bufferSize = Math.Min(bufferSize, (int)_bufferSize);\n                return Core(this, destination, bufferSize, cancellationToken);\n\n                static async Task Core(Stream source, Stream destination,\n                    int bufferSize, CancellationToken cancellationToken)\n                {\n                    var buffer = ArrayPool<byte>.Shared.Rent(bufferSize);\n                    try\n                    {\n                        int bytesRead;\n                        while ((bytesRead = await source.ReadAsync(new Memory<byte>(buffer),\n                            cancellationToken).ConfigureAwait(false)) != 0)\n                        {\n                            await destination.WriteAsync(\n                                new ReadOnlyMemory<byte>(buffer, 0, bytesRead),\n                                cancellationToken).ConfigureAwait(false);\n                        }\n                    }\n                    finally\n                    {\n                        ArrayPool<byte>.Shared.Return(buffer);\n                    }\n                }\n            }\n\n            /// <inheritdoc/>\n            public override void CopyTo(Stream destination, int bufferSize)\n            {\n                CopyToAsync(destination, bufferSize, default).GetAwaiter().GetResult();\n            }\n\n            /// <inheritdoc/>\n            public ValueTask CloseAsync(CancellationToken cancellationToken)\n            {\n                var alt = _options?.CloseAndCommitMethodId?\n                    .ToNodeId(_handle.Session.MessageContext);\n                return CloseAsync(alt, cancellationToken);\n            }\n\n            /// <summary>\n            /// Close with alternative method\n            /// </summary>\n            /// <param name=\"alt\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            /// <exception cref=\"IOException\"></exception>\n            private async ValueTask CloseAsync(NodeId? alt, CancellationToken ct)\n            {\n                ObjectDisposedException.ThrowIf(!_fileHandle.HasValue, this);\n                var errorInfo = await _handle.Session.CloseAsync(\n                    _header.ToRequestHeader(_outer._timeProvider), _nodeId, alt,\n                    _fileHandle.Value, ct).ConfigureAwait(false);\n                if (errorInfo != null)\n                {\n                    throw new IOException(errorInfo.ErrorMessage);\n                }\n                // Closed - now release handle\n                _handle.Dispose();\n                _fileHandle = null;\n            }\n\n            /// <inheritdoc/>\n            public override async ValueTask DisposeAsync()\n            {\n                if (_fileHandle.HasValue)\n                {\n                    try\n                    {\n                        await CloseAsync(null, default).ConfigureAwait(false);\n                    }\n                    catch { } // Best effort closing\n                    finally\n                    {\n                        if (_fileHandle.HasValue)\n                        {\n                            _handle.Dispose();\n                            _fileHandle = null; // Mark disposed\n                        }\n                    }\n                }\n                await base.DisposeAsync().ConfigureAwait(false);\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                if (disposing && _fileHandle.HasValue)\n                {\n                    DisposeAsync().AsTask().GetAwaiter().GetResult();\n                }\n                base.Dispose(disposing);\n            }\n\n            private readonly RequestHeaderModel _header;\n            private readonly ISessionHandle _handle;\n            private readonly NodeId _nodeId;\n            private readonly FileSystemServices<T> _outer;\n            private readonly FileInfoModel? _fileInfo;\n            private readonly uint _bufferSize;\n            private readonly FileOpenWriteOptionsModel? _options;\n            private bool _isEoS;\n            private uint? _fileHandle;\n        }\n\n        private readonly ActivitySource _activitySource = Diagnostics.NewActivitySource();\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly TimeProvider _timeProvider;\n        private readonly IOpcUaClientManager<T> _client;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/HistoryServices.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Runtime.CompilerServices;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implments history services on top of core services\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public sealed class HistoryServices<T> : IHistoryServices<T>\n    {\n        /// <summary>\n        /// Create service\n        /// </summary>\n        /// <param name=\"options\"></param>\n        /// <param name=\"services\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public HistoryServices(IOptions<PublisherOptions> options,\n            INodeServicesInternal<T> services, TimeProvider? timeProvider = null)\n        {\n            _services = services;\n            _options = options;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryDeleteEventsAsync(\n            T endpoint, HistoryUpdateRequestModel<DeleteEventsDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _services.HistoryUpdateAsync(endpoint, request,\n                (nodeId, details, _) =>\n                {\n                    if (details.EventIds == null || details.EventIds.Count == 0)\n                    {\n                        throw new ArgumentException(\"Bad events\", nameof(details));\n                    }\n                    return Task.FromResult(new ExtensionObject(new DeleteEventDetails\n                    {\n                        NodeId = nodeId,\n                        EventIds = new ByteStringCollection(details.EventIds)\n                    }));\n                }, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryDeleteValuesAtTimesAsync(\n            T endpoint, HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _services.HistoryUpdateAsync(endpoint, request,\n                (nodeId, details, _) =>\n                {\n                    if (details.ReqTimes == null || details.ReqTimes.Count == 0)\n                    {\n                        throw new ArgumentException(\"Bad requested times\", nameof(details));\n                    }\n                    return Task.FromResult(new ExtensionObject(new DeleteAtTimeDetails\n                    {\n                        NodeId = nodeId,\n                        ReqTimes = new DateTimeCollection(details.ReqTimes)\n                    }));\n                }, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryDeleteModifiedValuesAsync(\n            T endpoint, HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _services.HistoryUpdateAsync(endpoint, request,\n                (nodeId, details, _) =>\n                {\n                    if (details.EndTime == null && details.StartTime == null)\n                    {\n                        throw new ArgumentException(\"Start time and end time cannot both be null\",\n                            nameof(details));\n                    }\n                    return Task.FromResult(new ExtensionObject(new DeleteRawModifiedDetails\n                    {\n                        NodeId = nodeId,\n                        EndTime = details.EndTime ?? DateTime.MinValue,\n                        StartTime = details.StartTime ?? DateTime.MinValue,\n                        IsDeleteModified = true\n                    }));\n                }, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryDeleteValuesAsync(\n            T endpoint, HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _services.HistoryUpdateAsync(endpoint, request, (nodeId, details, _) =>\n            {\n                if (details.EndTime == null && details.StartTime == null)\n                {\n                    throw new ArgumentException(\"Start time and end time cannot both be null\",\n                        nameof(details));\n                }\n                return Task.FromResult(new ExtensionObject(new DeleteRawModifiedDetails\n                {\n                    NodeId = nodeId,\n                    EndTime = details.EndTime ?? DateTime.MinValue,\n                    StartTime = details.StartTime ?? DateTime.MinValue,\n                    IsDeleteModified = false\n                }));\n            }, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryReadResponseModel<HistoricEventModel[]>> HistoryReadEventsAsync(\n            T endpoint, HistoryReadRequestModel<ReadEventsDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _services.HistoryReadAsync(endpoint, request, (details, session) =>\n            {\n                if (details.EndTime == null && details.StartTime == null)\n                {\n                    throw new ArgumentException(\"Start time and end time cannot both be null\",\n                        nameof(details));\n                }\n                if ((details.StartTime == null || details.EndTime == null) &&\n                    ((details.NumEvents ?? 0) == 0))\n                {\n                    throw new ArgumentException(\"Value bound must be set\",\n                        nameof(details));\n                }\n                return new ExtensionObject(new ReadEventDetails\n                {\n                    EndTime = details.EndTime ?? DateTime.MinValue,\n                    StartTime = details.StartTime ?? DateTime.MinValue,\n                    Filter = session.Codec.Decode(details.Filter),\n                    NumValuesPerNode = details.NumEvents ?? 0\n                });\n            }, DecodeEvents, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryReadNextResponseModel<HistoricEventModel[]>> HistoryReadEventsNextAsync(\n            T endpoint, HistoryReadNextRequestModel request, CancellationToken ct)\n        {\n            return _services.HistoryReadNextAsync(endpoint, request, DecodeEvents, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return await _services.HistoryReadAsync(endpoint, request, (details, _) =>\n            {\n                if (details.EndTime == null && details.StartTime == null)\n                {\n                    throw new ArgumentException(\"Start time and end time cannot both be null\",\n                        nameof(details));\n                }\n                if ((details.StartTime == null || details.EndTime == null) &&\n                    ((details.NumValues ?? 0) == 0))\n                {\n                    throw new ArgumentException(\"Value bound must be set\",\n                        nameof(details));\n                }\n                return new ExtensionObject(new ReadRawModifiedDetails\n                {\n                    EndTime = details.EndTime ?? DateTime.MinValue,\n                    StartTime = details.StartTime ?? DateTime.MinValue,\n                    IsReadModified = false,\n                    ReturnBounds = details.ReturnBounds ?? false,\n                    NumValuesPerNode = details.NumValues ?? 0\n                });\n            }, DecodeValues, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAtTimesAsync(\n            T endpoint, HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _services.HistoryReadAsync(endpoint, request, (details, _) =>\n            {\n                if (details.ReqTimes == null || details.ReqTimes.Count == 0)\n                {\n                    throw new ArgumentException(nameof(details.ReqTimes));\n                }\n                return new ExtensionObject(new ReadAtTimeDetails\n                {\n                    ReqTimes = new DateTimeCollection(details.ReqTimes),\n                    UseSimpleBounds = details.UseSimpleBounds ?? false\n                });\n            }, DecodeValues, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadProcessedValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _services.HistoryReadAsync(endpoint, request, (details, session) =>\n            {\n                if (details.EndTime == null && details.StartTime == null)\n                {\n                    throw new ArgumentException(\"Start time and end time cannot both be null\",\n                        nameof(details));\n                }\n                var aggregateType = details.AggregateType;\n                if (aggregateType != null)\n                {\n                    // TODO: Should be async!\n                    var capabilities = session.GetHistoryCapabilitiesAsync(\n                        request.Header.GetNamespaceFormat(_options), ct).AsTask().Result;\n                    if (capabilities?.AggregateFunctions != null &&\n                        capabilities.AggregateFunctions.TryGetValue(aggregateType, out var id))\n                    {\n                        aggregateType = id;\n                    }\n                }\n                var aggregateId = aggregateType?.ToNodeId(session.MessageContext);\n                return new ExtensionObject(new ReadProcessedDetails\n                {\n                    EndTime = details.EndTime ?? DateTime.MinValue,\n                    StartTime = details.StartTime ?? DateTime.MinValue,\n                    AggregateType = aggregateId == null ? null :\n                        new NodeIdCollection(aggregateId.YieldReturn()),\n                    ProcessingInterval = details.ProcessingInterval == null ? 0 :\n                        details.ProcessingInterval.Value.TotalMilliseconds,\n                    AggregateConfiguration = details.AggregateConfiguration.ToStackModel()\n                });\n            }, DecodeValues, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadModifiedValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _services.HistoryReadAsync(endpoint, request, (details, _) =>\n            {\n                if (details.EndTime == null && details.StartTime == null)\n                {\n                    throw new ArgumentException(\"Start time and end time cannot both be null\",\n                        nameof(details));\n                }\n                if ((details.StartTime == null || details.EndTime == null) &&\n                    ((details.NumValues ?? 0) == 0))\n                {\n                    throw new ArgumentException(\"Value bound must be set\",\n                        nameof(details));\n                }\n                return new ExtensionObject(new ReadRawModifiedDetails\n                {\n                    EndTime = details.EndTime ?? DateTime.MinValue,\n                    StartTime = details.StartTime ?? DateTime.MinValue,\n                    IsReadModified = true,\n                    NumValuesPerNode = details.NumValues ?? 0\n                });\n            }, DecodeValues, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryReadNextResponseModel<HistoricValueModel[]>> HistoryReadValuesNextAsync(\n            T endpoint, HistoryReadNextRequestModel request, CancellationToken ct)\n        {\n            return _services.HistoryReadNextAsync(endpoint, request, DecodeValues, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryReplaceEventsAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct)\n        {\n            return HistoryUpdateEventsAsync(endpoint, request, PerformUpdateType.Replace, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryReplaceValuesAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct)\n        {\n            return HistoryUpdateValuesAsync(endpoint, request, PerformUpdateType.Replace, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryInsertEventsAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct)\n        {\n            return HistoryUpdateEventsAsync(endpoint, request, PerformUpdateType.Insert, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryInsertValuesAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct)\n        {\n            return HistoryUpdateValuesAsync(endpoint, request, PerformUpdateType.Insert, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryUpsertEventsAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct)\n        {\n            return HistoryUpdateEventsAsync(endpoint, request, PerformUpdateType.Update, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryUpsertValuesAsync(T endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct)\n        {\n            return HistoryUpdateValuesAsync(endpoint, request, PerformUpdateType.Update, ct);\n        }\n\n        /// <inheritdoc/>\n        public async IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadValuesDetailsModel> request,\n            [EnumeratorCancellation] CancellationToken ct)\n        {\n            var result = await HistoryReadValuesAsync(endpoint, request,\n                ct).ConfigureAwait(false);\n            if (result.History != null)\n            {\n                foreach (var item in result.History)\n                {\n                    yield return item;\n                }\n            }\n            await foreach (var item in HistoryStreamRemainingValuesAsync(\n                endpoint, request.Header, result.ContinuationToken, ct).ConfigureAwait(false))\n            {\n                yield return item;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async IAsyncEnumerable<HistoricValueModel> HistoryStreamModifiedValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request,\n            [EnumeratorCancellation] CancellationToken ct)\n        {\n            var result = await HistoryReadModifiedValuesAsync(endpoint, request,\n                ct).ConfigureAwait(false);\n            if (result.History != null)\n            {\n                foreach (var item in result.History)\n                {\n                    yield return item;\n                }\n            }\n\n            await foreach (var item in HistoryStreamRemainingValuesAsync(\n                endpoint, request.Header, result.ContinuationToken, ct).ConfigureAwait(false))\n            {\n                yield return item;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAtTimesAsync(\n            T endpoint, HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request,\n            [EnumeratorCancellation] CancellationToken ct)\n        {\n            var result = await HistoryReadValuesAtTimesAsync(endpoint, request,\n                ct).ConfigureAwait(false);\n            if (result.History != null)\n            {\n                foreach (var item in result.History)\n                {\n                    yield return item;\n                }\n            }\n\n            await foreach (var item in HistoryStreamRemainingValuesAsync(\n                endpoint, request.Header, result.ContinuationToken, ct).ConfigureAwait(false))\n            {\n                yield return item;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async IAsyncEnumerable<HistoricValueModel> HistoryStreamProcessedValuesAsync(\n            T endpoint, HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request,\n            [EnumeratorCancellation] CancellationToken ct)\n        {\n            var result = await HistoryReadProcessedValuesAsync(endpoint, request,\n                ct).ConfigureAwait(false);\n            if (result.History != null)\n            {\n                foreach (var item in result.History)\n                {\n                    yield return item;\n                }\n            }\n\n            await foreach (var item in HistoryStreamRemainingValuesAsync(\n                endpoint, request.Header, result.ContinuationToken, ct).ConfigureAwait(false))\n            {\n                yield return item;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async IAsyncEnumerable<HistoricEventModel> HistoryStreamEventsAsync(\n            T endpoint, HistoryReadRequestModel<ReadEventsDetailsModel> request,\n            [EnumeratorCancellation] CancellationToken ct)\n        {\n            var result = await HistoryReadEventsAsync(endpoint, request,\n                ct).ConfigureAwait(false);\n            if (result.History != null)\n            {\n                foreach (var item in result.History)\n                {\n                    yield return item;\n                }\n            }\n\n            await foreach (var item in HistoryStreamRemainingEventsAsync(\n                endpoint, request.Header, result.ContinuationToken, ct).ConfigureAwait(false))\n            {\n                yield return item;\n            }\n        }\n\n        /// <summary>\n        /// Read all remaining values\n        /// </summary>\n        /// <param name=\"connectionId\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"continuationToken\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async IAsyncEnumerable<HistoricValueModel> HistoryStreamRemainingValuesAsync(\n            T connectionId, RequestHeaderModel? header, string? continuationToken,\n            [EnumeratorCancellation] CancellationToken ct)\n        {\n            while (continuationToken != null)\n            {\n                var response = await HistoryReadValuesNextAsync(connectionId,\n                    new HistoryReadNextRequestModel\n                    {\n                        ContinuationToken = continuationToken,\n                        Header = header\n                    }, ct).ConfigureAwait(false);\n                continuationToken = response.ContinuationToken;\n                if (response.History != null)\n                {\n                    foreach (var item in response.History)\n                    {\n                        yield return item;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Read all remaining events\n        /// </summary>\n        /// <param name=\"connectionId\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"continuationToken\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async IAsyncEnumerable<HistoricEventModel> HistoryStreamRemainingEventsAsync(\n            T connectionId, RequestHeaderModel? header,\n            string? continuationToken, [EnumeratorCancellation] CancellationToken ct)\n        {\n            while (continuationToken != null)\n            {\n                var response = await HistoryReadEventsNextAsync(connectionId,\n                    new HistoryReadNextRequestModel\n                    {\n                        ContinuationToken = continuationToken,\n                        Header = header\n                    }, ct).ConfigureAwait(false);\n                continuationToken = response.ContinuationToken;\n                if (response.History != null)\n                {\n                    foreach (var item in response.History)\n                    {\n                        yield return item;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Update events\n        /// </summary>\n        /// <param name=\"connectionId\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"action\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public Task<HistoryUpdateResponseModel> HistoryUpdateEventsAsync(\n            T connectionId, HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            PerformUpdateType action, CancellationToken ct)\n        {\n            return _services.HistoryUpdateAsync(connectionId, request,\n                (nodeId, details, session) =>\n                {\n                    if (details.Events == null || details.Events.Count == 0)\n                    {\n                        throw new ArgumentException(\"Bad events\", nameof(details));\n                    }\n                    return Task.FromResult(new ExtensionObject(new UpdateEventDetails\n                    {\n                        NodeId = nodeId,\n                        PerformInsertReplace = action,\n                        Filter = session.Codec.Decode(details.Filter),\n                        EventData = new HistoryEventFieldListCollection(details.Events\n                            .Select(d => new HistoryEventFieldList\n                            {\n                                EventFields = new VariantCollection(d.EventFields\n                                    .Select(f => session.Codec.Decode(f, BuiltInType.Variant)))\n                            }))\n                    }));\n                }, ct);\n        }\n\n        /// <summary>\n        /// Update values\n        /// </summary>\n        /// <param name=\"connectionId\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"action\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public Task<HistoryUpdateResponseModel> HistoryUpdateValuesAsync(\n            T connectionId, HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            PerformUpdateType action, CancellationToken ct)\n        {\n            return _services.HistoryUpdateAsync(connectionId, request,\n                async (nodeId, details, session) =>\n                {\n                    if (details.Values == null || details.Values.Count == 0)\n                    {\n                        throw new ArgumentException(\"Bad values\", nameof(details));\n                    }\n                    var builtinType = await GetDataTypeAsync(session, request.Header,\n                        nodeId, details.Values, _timeProvider, ct).ConfigureAwait(false);\n                    return new ExtensionObject(new UpdateDataDetails\n                    {\n                        NodeId = nodeId,\n                        PerformInsertReplace = action,\n                        UpdateValues = new DataValueCollection(details.Values\n                            .Select(d => new DataValue\n                            {\n                                ServerPicoseconds = d.ServerPicoseconds ?? 0,\n                                SourcePicoseconds = d.SourcePicoseconds ?? 0,\n                                ServerTimestamp = d.ServerTimestamp ?? DateTime.MinValue,\n                                SourceTimestamp = d.SourceTimestamp ?? DateTime.MinValue,\n                                StatusCode = d.Status?.StatusCode ?? StatusCodes.Good,\n                                Value = session.Codec.Decode(\n                                    d.Value ?? VariantValue.Null, builtinType)\n                            }))\n                    });\n                }, ct);\n        }\n\n        /// <summary>\n        /// Convert to results\n        /// </summary>\n        /// <param name=\"extensionObject\"></param>\n        /// <param name=\"session\"></param>\n        /// <returns></returns>\n        private static HistoricEventModel[] DecodeEvents(ExtensionObject extensionObject,\n            IOpcUaSession session)\n        {\n            if (extensionObject.Body is HistoryEvent ev)\n            {\n                return ev.Events.Select(d => new HistoricEventModel\n                {\n                    EventFields = d.EventFields\n                        .Select(v => v == Variant.Null ?\n                            VariantValue.Null : session.Codec.Encode(v, out var builtInType))\n                        .ToList()\n                }).ToArray();\n            }\n            return [];\n        }\n\n        /// <summary>\n        /// Gets the data type of the values and falls back\n        /// to reading from node\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"values\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        private static async Task<BuiltInType> GetDataTypeAsync(\n            IOpcUaSession session, RequestHeaderModel? requestHeader,\n            NodeId nodeId, IEnumerable<HistoricValueModel> values,\n            TimeProvider timeProvider, CancellationToken ct)\n        {\n            // Get data type\n            var dataTypes = values\n                .Select(v => v.DataType)\n                .Where(v => v != null)\n                .ToList();\n            var dataType = dataTypes.FirstOrDefault();\n#if DEBUG\n            if (dataType != null &&\n                !dataTypes.All(v => string.Equals(v, dataType, StringComparison.Ordinal)))\n            {\n                throw new ArgumentException(\n                    $\"All values must have no or data type {dataType}.\");\n            }\n#endif\n            var dataTypeId = dataType.ToNodeId(session.MessageContext);\n            if (NodeId.IsNull(dataTypeId))\n            {\n                // Read data type\n                (dataTypeId, _) = await session.ReadAttributeAsync<NodeId?>(\n                    requestHeader.ToRequestHeader(timeProvider), nodeId,\n                    Attributes.DataType, ct).ConfigureAwait(false);\n                if (NodeId.IsNull(dataTypeId))\n                {\n                    throw new ArgumentException(\n                        $\"{nodeId} does not have a data type to fall back on.\");\n                }\n            }\n            return await session.LruNodeCache.GetBuiltInTypeAsync(dataTypeId,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Decode values\n        /// </summary>\n        /// <param name=\"extensionObject\"></param>\n        /// <param name=\"session\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"FormatException\"></exception>\n        private static HistoricValueModel[] DecodeValues(ExtensionObject extensionObject,\n            IOpcUaSession session)\n        {\n            if (extensionObject.Body is HistoryData data)\n            {\n                var modificationInfos = new List<ModificationInfoModel>();\n                if (extensionObject.Body is HistoryModifiedData modified)\n                {\n                    if (modified.ModificationInfos.Count != data.DataValues.Count)\n                    {\n                        throw new FormatException(\n                            \"Modification infos and data value count is not the same\");\n                    }\n                    return data.DataValues\n                        .Zip(modified.ModificationInfos)\n                        .Select(d => EncodeDataValue(session.Codec, d.First, d.Second))\n                        .ToArray();\n                }\n                return data.DataValues\n                    .Select(d => EncodeDataValue(session.Codec, d, null))\n                    .ToArray();\n            }\n            return [];\n\n            static HistoricValueModel EncodeDataValue(IVariantEncoder codec,\n                DataValue dataValue, ModificationInfo? modification)\n            {\n                var builtInType = BuiltInType.Null;\n                return new HistoricValueModel\n                {\n                    ServerPicoseconds = dataValue.ServerPicoseconds == 0 ? null :\n                        dataValue.ServerPicoseconds,\n                    SourcePicoseconds = dataValue.SourcePicoseconds == 0 ? null :\n                        dataValue.SourcePicoseconds,\n                    ServerTimestamp = dataValue.ServerTimestamp == DateTime.MinValue ? null :\n                        dataValue.ServerTimestamp,\n                    SourceTimestamp = dataValue.SourceTimestamp == DateTime.MinValue ? null :\n                        dataValue.SourceTimestamp,\n                    Status =  // Remove aggregate bits we are testing below.\n                        (dataValue.StatusCode.Code & ~0x041F) == StatusCodes.Good ? null :\n                         dataValue.StatusCode.CreateResultModel(),\n                    DataLocation = dataValue.StatusCode.AggregateBits.ToDataLocation(),\n                    AdditionalData = dataValue.StatusCode.AggregateBits.ToAdditionalData(),\n                    ModificationInfo = modification == null ? null : new ModificationInfoModel\n                    {\n                        ModificationTime = modification.ModificationTime == DateTime.MinValue ?\n                            null : modification.ModificationTime,\n                        UpdateType = (HistoryUpdateOperation)modification.UpdateType,\n                        UserName = modification.UserName\n                    },\n                    Value = dataValue.WrappedValue == Variant.Null ?\n                        null : codec.Encode(dataValue.WrappedValue, out builtInType),\n                    DataType = builtInType == BuiltInType.Null ?\n                        null : builtInType.ToString()\n                };\n            }\n        }\n\n        private readonly INodeServicesInternal<T> _services;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly TimeProvider _timeProvider;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageEncoder.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Furly.Extensions.Messaging;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.Metrics;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text;\n\n    /// <summary>\n    /// Creates PubSub encoded messages\n    /// </summary>\n    public sealed class NetworkMessageEncoder : IMessageEncoder, IDisposable\n    {\n        /// <inheritdoc/>\n        public long NotificationsDroppedCount { get; private set; }\n\n        /// <inheritdoc/>\n        public long NotificationsProcessedCount { get; private set; }\n\n        /// <inheritdoc/>\n        public long MessagesProcessedCount { get; private set; }\n\n        /// <inheritdoc/>\n        public double AvgNotificationsPerMessage { get; private set; }\n\n        /// <inheritdoc/>\n        public double AvgMessageSize { get; private set; }\n\n        /// <inheritdoc/>\n        public double MaxMessageSplitRatio { get; private set; }\n\n        /// <summary>\n        /// Create instance of NetworkMessageEncoder.\n        /// </summary>\n        /// <param name=\"options\"> injected configuration. </param>\n        /// <param name=\"metrics\"> Metrics context </param>\n        /// <param name=\"logger\"> Logger to be used for reporting. </param>\n        /// <param name=\"timeProvider\">time to use for timestamps</param>\n        public NetworkMessageEncoder(IOptions<PublisherOptions> options,\n            IMetricsContext metrics, ILogger<NetworkMessageEncoder> logger,\n            TimeProvider? timeProvider = null)\n        {\n            ArgumentNullException.ThrowIfNull(metrics);\n            _logger = logger;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _options = options;\n            InitializeMetrics(metrics);\n            _logNotifications = _options.Value.DebugLogEncodedNotifications == true;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _meter.Dispose();\n        }\n\n        /// <inheritdoc/>\n        public IEnumerable<(IEvent Event, Action OnSent)> Encode(Func<IEvent> factory,\n            IEnumerable<OpcUaSubscriptionNotification> notifications, int maxMessageSize, bool asBatch)\n        {\n            try\n            {\n                var chunkedMessages = new List<(IEvent, Action)>();\n                foreach (var m in GetNetworkMessages(notifications, asBatch))\n                {\n                    if (m.NetworkMessage == null)\n                    {\n                        // Write an empty message to the topic to delete the items on the broker\n                        var chunkedMessage = factory()\n                            .SetTimestamp(_timeProvider.GetUtcNow())\n                            .SetTopic(m.Queue.QueueName)\n                            .SetQoS(m.Queue.RequestedDeliveryGuarantee ?? QoS.AtLeastOnce)\n                            ;\n                        chunkedMessages.Add((chunkedMessage, m.OnSentCallback));\n                        continue;\n                    }\n\n                    if (m.EncodingContext == null)\n                    {\n                        _logger.MissingServiceMessageContext();\n                        NotificationsDroppedCount++;\n                        m.OnSentCallback();\n                        continue;\n                    }\n\n                    var chunks = m.NetworkMessage.Encode(m.EncodingContext, maxMessageSize);\n                    var notificationsPerChunk = m.NotificationsPerMessage / (double)chunks.Count;\n                    var validChunks = 0;\n                    foreach (var body in chunks)\n                    {\n                        if (body.Length == 0)\n                        {\n                            _logger.ChunkTooLarge();\n                            continue;\n                        }\n                        validChunks++;\n                        AvgMessageSize = ((AvgMessageSize * MessagesProcessedCount) + body.Length) /\n                            (MessagesProcessedCount + 1);\n                        AvgNotificationsPerMessage = ((AvgNotificationsPerMessage * MessagesProcessedCount) +\n                            notificationsPerChunk) / (MessagesProcessedCount + 1);\n                        MessagesProcessedCount++;\n                    }\n\n                    if (validChunks > 0)\n                    {\n                        var chunkedMessage = factory()\n                            .SetTimestamp(_timeProvider.GetUtcNow())\n                            .SetContentEncoding(m.NetworkMessage.ContentEncoding)\n                            .SetContentType(m.NetworkMessage.ContentType)\n                            .SetTopic(m.Queue.QueueName)\n                            .SetRetain(m.Queue.Retain ?? false)\n                            .SetQoS(m.Queue.RequestedDeliveryGuarantee ?? QoS.AtLeastOnce)\n                            .AddBuffers(chunks)\n                            ;\n\n                        if (m.Queue.Ttl.HasValue)\n                        {\n                            chunkedMessage = chunkedMessage\n                                .SetTtl(m.Queue.Ttl.Value);\n                        }\n                        if (m.CloudEvent != null)\n                        {\n                            // Send as cloud event\n                            chunkedMessage = chunkedMessage.AsCloudEvent(m.CloudEvent with\n                            {\n                                // TODO: To be compliant this should be the message id\n                                // of the network message (json only).  But it is already\n                                // encoded, so we do not get it here. .\n                                // Id = m.NetworkMessage.MessageId,\n                                DataContentType = m.NetworkMessage.ContentType\n                            });\n                        }\n                        else\n                        {\n                            chunkedMessage = chunkedMessage\n                                .AddProperty(OpcUa.Constants.MessagePropertySchemaKey,\n                                    m.NetworkMessage.MessageSchema);\n                            if (_options.Value.EnableDataSetRoutingInfo ?? false)\n                            {\n                                chunkedMessage.AddProperty(OpcUa.Constants.MessagePropertyRoutingKey,\n                                    m.NetworkMessage.DataSetWriterGroup);\n                            }\n\n                            if (_options.Value.UseStandardsCompliantEncoding != true)\n                            {\n                                chunkedMessage = chunkedMessage\n                                    .AddProperty(\"$$ContentType\", m.NetworkMessage.ContentType)\n                                    .AddProperty(\"$$ContentEncoding\", m.NetworkMessage.ContentEncoding);\n                            }\n                        }\n                        if (m.Schema != null)\n                        {\n                            chunkedMessage = chunkedMessage.SetSchema(m.Schema);\n                        }\n\n                        _logger.NotificationsEncoded(m.NotificationsPerMessage, validChunks);\n\n                        chunkedMessages.Add((chunkedMessage, m.OnSentCallback));\n                    }\n                    else\n                    {\n                        // Nothing to send, complete here\n                        m.OnSentCallback();\n                    }\n\n                    // We dropped a number of notifications but processed the remainder successfully\n                    var tooBig = chunks.Count - validChunks;\n                    NotificationsDroppedCount += tooBig;\n                    if (m.NotificationsPerMessage > tooBig)\n                    {\n                        NotificationsProcessedCount += m.NotificationsPerMessage - tooBig;\n                    }\n\n                    //\n                    // how many notifications per message resulted in how many buffers. We track the\n                    // split size to provide users with an indication how many times chunks had to\n                    // be created so they can configure publisher to improve performance.\n                    //\n                    if (m.NotificationsPerMessage > 0 && m.NotificationsPerMessage < validChunks)\n                    {\n                        var splitSize = validChunks / m.NotificationsPerMessage;\n                        if (splitSize > MaxMessageSplitRatio)\n                        {\n                            MaxMessageSplitRatio = splitSize;\n                        }\n                    }\n                }\n                return chunkedMessages;\n            }\n            catch (ObjectDisposedException) { return []; }\n            finally\n            {\n#if DEBUG\n                notifications.ToList().ForEach(a => a.DebugAssertProcessed());\n#endif\n            }\n        }\n\n        /// <summary>\n        /// Encoded message\n        /// </summary>\n        /// <param name=\"NotificationsPerMessage\"></param>\n        /// <param name=\"NetworkMessage\"></param>\n        /// <param name=\"Queue\"></param>\n        /// <param name=\"OnSentCallback\"></param>\n        /// <param name=\"Schema\"></param>\n        /// <param name=\"CloudEvent\"></param>\n        /// <param name=\"EncodingContext\"></param>\n        private record struct EncodedMessage(int NotificationsPerMessage,\n            PubSubMessage? NetworkMessage, PublishingQueueSettingsModel Queue,\n            Action OnSentCallback, IEventSchema? Schema, CloudEventHeader? CloudEvent,\n            IServiceMessageContext? EncodingContext = null);\n\n        /// <summary>\n        /// Produce network messages from the data set message model\n        /// </summary>\n        /// <param name=\"messages\"></param>\n        /// <param name=\"isBatched\"></param>\n        /// <returns></returns>\n        private List<EncodedMessage> GetNetworkMessages(\n            IEnumerable<OpcUaSubscriptionNotification> messages, bool isBatched)\n        {\n            var standardsCompliant = _options.Value.UseStandardsCompliantEncoding ?? false;\n            var result = new List<EncodedMessage>();\n\n            static PublishingQueueSettingsModel GetQueue(DataSetWriterContext context,\n                PublisherOptions options)\n            {\n                return new PublishingQueueSettingsModel\n                {\n                    RequestedDeliveryGuarantee = context.Qos,\n                    Retain = context.Retain,\n                    Ttl = context.Ttl,\n                    QueueName = context.Topic\n                };\n            }\n            // Group messages by topic and qos, then writer group and then by dataset class id\n            foreach (var topics in messages\n                .Select(m => (Notification: m, Context: (m.Context as DataSetWriterContext)!))\n                .Where(m => m.Context != null)\n                .GroupBy(m => GetQueue(m.Context, _options.Value)))\n            {\n                var queue = topics.Key;\n                foreach (var publishers in topics.GroupBy(m => m.Context.PublisherId))\n                {\n                    var publisherId = publishers.Key;\n                    foreach (var groups in publishers\n                        .GroupBy(m => (m.Context.WriterGroup, m.Context.Schema, m.Context.CloudEvent)))\n                    {\n                        var writerGroup = groups.Key.WriterGroup;\n                        var schema = groups.Key.Schema;\n                        var cloudEvent = groups.Key.CloudEvent;\n\n                        if (writerGroup?.MessageSettings == null)\n                        {\n                            // Must have a writer group\n                            Drop(groups.Select(m => m.Notification));\n                            continue;\n                        }\n                        var encoding = writerGroup.MessageType ?? MessageEncoding.Json;\n                        var networkMessageContentMask =\n                            writerGroup.MessageSettings.NetworkMessageContentMask;\n                        var hasSamplesPayload =\n                            (networkMessageContentMask & NetworkMessageContentFlags.MonitoredItemMessage) != 0;\n                        if (hasSamplesPayload && !isBatched)\n                        {\n                            networkMessageContentMask |= NetworkMessageContentFlags.SingleDataSetMessage;\n                        }\n                        var namespaceFormat =\n                            writerGroup.MessageSettings?.NamespaceFormat ??\n                            _options.Value.DefaultNamespaceFormat ??\n                            NamespaceFormat.Uri;\n                        foreach (var dataSetClass in groups\n                            .GroupBy(m => m.Context.Writer?.DataSet?.DataSetMetaData?.DataSetClassId ?? Guid.Empty))\n                        {\n                            var dataSetClassId = dataSetClass.Key;\n                            BaseNetworkMessage? currentMessage = null;\n                            var currentNotifications = new List<OpcUaSubscriptionNotification>();\n                            foreach (var (Notification, Context) in dataSetClass)\n                            {\n                                if (Context.Writer == null ||\n                                    (hasSamplesPayload && !encoding.HasFlag(MessageEncoding.Json)))\n                                {\n                                    // Must have a writer or if samples mode, must be json\n                                    Drop(Notification.YieldReturn());\n                                    continue;\n                                }\n\n                                var dataSetMessageContentMask =\n                                    Context.Writer.MessageSettings?.DataSetMessageContentMask;\n                                var dataSetFieldContentMask =\n                                    Context.Writer.DataSetFieldContentMask;\n\n                                if (Notification.MessageType == MessageType.Metadata)\n                                {\n                                    if (Context.MetaData?.MetaData != null && !hasSamplesPayload)\n                                    {\n                                        if (currentMessage?.Messages.Count > 0)\n                                        {\n                                            // Start a new message but first emit current\n                                            result.Add(new EncodedMessage(currentNotifications.Count, currentMessage,\n                                                queue, () => currentNotifications.ForEach(n => n.Dispose()),\n                                                schema, cloudEvent, Notification.ServiceMessageContext));\n#if DEBUG\n                                            currentNotifications.ForEach(n => n.MarkProcessed());\n#endif\n                                            currentMessage = null;\n                                            currentNotifications = new List<OpcUaSubscriptionNotification>();\n                                        }\n\n                                        if (PubSubMessage.TryCreateMetaDataMessage(encoding, publisherId,\n                                            writerGroup.Name ?? Constants.DefaultWriterGroupName,\n                                            GetDataSetWriterName(Notification, Context), Context.DataSetWriterId,\n                                            Context.MetaData.MetaData, namespaceFormat, standardsCompliant,\n                                            out var metadataMessage))\n                                        {\n                                            result.Add(new EncodedMessage(0, metadataMessage, queue, Notification.Dispose,\n                                                    schema, cloudEvent, Notification.ServiceMessageContext));\n                                        }\n#if DEBUG\n                                        Notification.MarkProcessed();\n#endif\n                                        LogNotification(Notification, false);\n                                    }\n                                }\n                                else if (Notification.MessageType == MessageType.Closed)\n                                {\n                                    if (currentMessage?.Messages.Count > 0)\n                                    {\n                                        // Start a new message but first emit current\n                                        result.Add(new EncodedMessage(currentNotifications.Count, currentMessage,\n                                            queue, () => currentNotifications.ForEach(n => n.Dispose()),\n                                            schema, cloudEvent, Notification.ServiceMessageContext));\n#if DEBUG\n                                        currentNotifications.ForEach(n => n.MarkProcessed());\n#endif\n                                        currentMessage = null;\n                                        currentNotifications = new List<OpcUaSubscriptionNotification>();\n                                    }\n\n                                    result.Add(new EncodedMessage(0, null, queue, Notification.Dispose, null, null, null));\n#if DEBUG\n                                    Notification.MarkProcessed();\n#endif\n                                    LogNotification(Notification, false);\n                                }\n                                else if (Notification.MessageType == MessageType.KeepAlive)\n                                {\n                                    Debug.Assert(Notification.Notifications.Count == 0);\n                                    if (hasSamplesPayload)\n                                    {\n                                        Drop(Notification.YieldReturn());\n                                        continue;\n                                    }\n\n                                    // Create regular data set messages\n                                    if (!PubSubMessage.TryCreateDataSetMessage(encoding,\n                                        GetDataSetWriterName(Notification, Context),\n                                        Context.DataSetWriterId, dataSetMessageContentMask,\n                                        MessageType.KeepAlive,\n#if KA_WITH_EX_FIELDS\n                                        new DataSet(Context.ExtensionFields, dataSetFieldContentMask),\n#else\n                                        new DataSet(),\n#endif\n                                        GetTimestamp(Notification), Context.NextWriterSequenceNumber(),\n                                        standardsCompliant, Notification.EndpointUrl,\n                                        Notification.ApplicationUri, Context.MetaData?.MetaData,\n                                        out var dataSetMessage))\n                                    {\n                                        Drop(Notification.YieldReturn());\n                                        continue;\n                                    }\n\n                                    AddMessage(dataSetMessage);\n                                    LogNotification(Notification, false);\n                                    currentNotifications.Add(Notification);\n                                    continue;\n                                }\n                                else\n                                {\n                                    Debug.Assert(Notification.Notifications != null);\n                                    var notificationQueues = Notification.Notifications\n                                        .GroupBy(m => m.DataSetFieldName)\n                                        .Select(c => new Queue<MonitoredItemNotificationModel>(\n                                            c\n                                            .OrderBy(m => m.Value?.SourceTimestamp)\n                                            .ToArray()))\n                                        .ToArray();\n                                    var notComplete = notificationQueues.Any(q => q.Count > 0);\n                                    if (!notComplete)\n                                    {\n                                        // Already completed so we cannot complete it as an encoded message.\n                                        Drop(Notification.YieldReturn());\n                                        continue;\n                                    }\n                                    while (notComplete)\n                                    {\n                                        var orderedNotifications = notificationQueues\n                                            .Select(q => q.Count > 0 ? q.Dequeue() : null!)\n                                            .Where(s => s?.DataSetFieldName != null)\n                                            .ToList()\n                                            ;\n                                        notComplete = notificationQueues.Any(q => q.Count > 0);\n\n                                        if (!hasSamplesPayload)\n                                        {\n                                            // Create regular data set messages\n                                            if (!PubSubMessage.TryCreateDataSetMessage(encoding,\n                                                GetDataSetWriterName(Notification, Context), Context.DataSetWriterId,\n                                                dataSetMessageContentMask, Notification.MessageType,\n                                                new DataSet(orderedNotifications\n                                                    .Select(s => (s.DataSetFieldName!, s.Value))\n                                                    .Concat(Context.ExtensionFields)\n                                                    .ToList(), dataSetFieldContentMask),\n                                                GetTimestamp(Notification), Context.NextWriterSequenceNumber(),\n                                                standardsCompliant, Notification.EndpointUrl, Notification.ApplicationUri,\n                                                Context.MetaData?.MetaData, out var dataSetMessage))\n                                            {\n                                                Drop(Notification.YieldReturn());\n                                                continue;\n                                            }\n\n                                            AddMessage(dataSetMessage);\n                                            LogNotification(Notification, false);\n                                        }\n                                        else\n                                        {\n                                            // Add monitored item message payload to network message to handle backcompat\n                                            foreach (var itemNotifications in orderedNotifications\n                                                .GroupBy(f => f.Id + f.MessageId))\n                                            {\n                                                var notificationsInGroup = itemNotifications.ToList();\n                                                Debug.Assert(notificationsInGroup.Count != 0);\n                                                //\n                                                // Special monitored item handling for events and conditions. Collate all\n                                                // values into a single key value data dictionary extension object value.\n                                                // Regular notifications we send as single messages.\n                                                //\n                                                if (notificationsInGroup.Count > 1)\n                                                {\n                                                    if (Notification.MessageType == MessageType.Event ||\n                                                        Notification.MessageType == MessageType.Condition)\n                                                    {\n                                                        Debug.Assert(notificationsInGroup\n                                                            .Select(n => n.DataSetFieldName).Distinct().Count() == notificationsInGroup.Count,\n                                                            \"There should not be duplicates in fields in a group.\");\n                                                        Debug.Assert(notificationsInGroup\n                                                            .All(n => n.SequenceNumber == notificationsInGroup[0].SequenceNumber),\n                                                            \"All notifications in the group should have the same sequence number.\");\n\n                                                        var eventNotification = notificationsInGroup[0] with\n                                                        {\n                                                            Value = new DataValue\n                                                            {\n                                                                Value = new EncodeableDictionary(notificationsInGroup\n                                                                    .Select(n => new KeyDataValuePair(n.DataSetFieldName!, n.Value)))\n                                                            },\n                                                            DataSetFieldName = notificationsInGroup[0].DataSetName\n                                                        };\n                                                        notificationsInGroup = new List<MonitoredItemNotificationModel>\n                                                        {\n                                                            eventNotification\n                                                        };\n                                                    }\n                                                    else if (_options.Value.RemoveDuplicatesFromBatch ?? false)\n                                                    {\n                                                        var pruned = notificationsInGroup\n                                                            .OrderByDescending(k => k.Value?.SourceTimestamp) // Descend from latest\n                                                            .DistinctBy(k => k.DataSetFieldName) // Only leave the latest values\n                                                            .ToList();\n                                                        if (pruned.Count != notificationsInGroup.Count)\n                                                        {\n                                                            if (_logNotifications)\n                                                            {\n                                                                _logger.RemovedDuplicates(notificationsInGroup.Count - pruned.Count);\n                                                            }\n                                                            notificationsInGroup = pruned;\n                                                        }\n                                                    }\n                                                }\n                                                foreach (var notification in notificationsInGroup)\n                                                {\n                                                    if (notification.DataSetFieldName != null)\n                                                    {\n                                                        if (!PubSubMessage.TryCreateMonitoredItemMessage(encoding,\n                                                            writerGroup.Name, dataSetMessageContentMask, Notification.MessageType,\n                                                            GetTimestamp(Notification), Context.NextWriterSequenceNumber(),\n                                                            new DataSet(notification.DataSetFieldName, notification.Value,\n                                                                dataSetFieldContentMask),\n                                                            notification.NodeId, Notification.EndpointUrl, Notification.ApplicationUri,\n                                                            standardsCompliant, Context.Writer.DataSet?.ExtensionFields,\n                                                            out var dataSetMessage))\n                                                        {\n                                                            LogNotification(notification, true);\n                                                            continue;\n                                                        }\n                                                        AddMessage(dataSetMessage);\n                                                        LogNotification(notification, false);\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                    currentNotifications.Add(Notification);\n                                }\n\n                                //\n                                // Add message and number of notifications processed count to method result.\n                                // Checks current length and splits if max items reached if configured.\n                                //\n                                void AddMessage(BaseDataSetMessage dataSetMessage)\n                                {\n                                    if (currentMessage == null)\n                                    {\n                                        if (!PubSubMessage.TryCreateNetworkMessage(encoding, publisherId,\n                                            writerGroup.Name ?? Constants.DefaultWriterGroupName, networkMessageContentMask,\n                                            dataSetClassId, () => SequenceNumber.Increment16(ref _sequenceNumber),\n                                            GetTimestamp(Notification) ?? _timeProvider.GetUtcNow(), namespaceFormat,\n                                            standardsCompliant, isBatched, schema, out var message))\n                                        {\n                                            Drop(messages);\n                                            return;\n                                        }\n                                        currentMessage = message;\n                                    }\n                                    currentMessage.Messages.Add(dataSetMessage);\n\n                                    var maxMessagesToPublish = writerGroup.MessageSettings?.MaxDataSetMessagesPerPublish ??\n                                        _options.Value.DefaultMaxDataSetMessagesPerPublish;\n                                    if (maxMessagesToPublish != null && currentMessage.Messages.Count >= maxMessagesToPublish)\n                                    {\n                                        result.Add(new EncodedMessage(currentNotifications.Count, currentMessage,\n                                            queue, () => currentNotifications.ForEach(n => n.Dispose()),\n                                            schema, cloudEvent, Notification.ServiceMessageContext));\n#if DEBUG\n                                        currentNotifications.ForEach(n => n.MarkProcessed());\n#endif\n                                        currentMessage = null;\n                                        currentNotifications = new List<OpcUaSubscriptionNotification>();\n                                    }\n                                }\n                            }\n                            if (currentMessage?.Messages.Count > 0)\n                            {\n                                result.Add(new EncodedMessage(currentNotifications.Count, currentMessage, queue,\n                                    () => currentNotifications.ForEach(n => n.Dispose()),\n                                    schema, cloudEvent, currentNotifications.LastOrDefault()?.ServiceMessageContext));\n#if DEBUG\n                                currentNotifications.ForEach(n => n.MarkProcessed());\n#endif\n                            }\n                            else\n                            {\n                                Debug.Assert(currentNotifications.Count == 0);\n                            }\n\n                            static string GetDataSetWriterName(OpcUaSubscriptionNotification Notification,\n                                DataSetWriterContext Context)\n                            {\n                                var dataSetWriterName = Context.WriterName;\n                                var eventTypeName = Notification.EventTypeName;\n                                if (!string.IsNullOrWhiteSpace(eventTypeName))\n                                {\n                                    return dataSetWriterName + \"|\" + eventTypeName;\n                                }\n                                return dataSetWriterName;\n                            }\n\n                            DateTimeOffset? GetTimestamp(OpcUaSubscriptionNotification Notification)\n                            {\n                                switch (_options.Value.MessageTimestamp)\n                                {\n                                    case MessageTimestamp.EncodingTimeUtc:\n                                        return _timeProvider.GetUtcNow();\n                                    case MessageTimestamp.PublishTime:\n                                        return Notification.PublishTimestamp;\n                                    default:\n                                        return Notification.CreatedTimestamp;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Drop and log messages\n        /// </summary>\n        /// <param name=\"messages\"></param>\n        private void Drop(IEnumerable<OpcUaSubscriptionNotification> messages)\n        {\n            var totalNotifications = 0;\n            foreach (var message in messages)\n            {\n                LogNotification(message, true);\n                totalNotifications += message.Notifications?.Count ?? 0;\n#if DEBUG\n                message.MarkProcessed();\n#endif\n                message.Dispose();\n            }\n\n            if (totalNotifications > 0)\n            {\n                _logger.DroppedValues(totalNotifications);\n                NotificationsDroppedCount += totalNotifications;\n            }\n        }\n\n        /// <summary>\n        /// Log notifications for debugging\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <param name=\"dropped\"></param>\n        private void LogNotification(OpcUaSubscriptionNotification args, bool dropped)\n        {\n            if (!_logNotifications)\n            {\n                return;\n            }\n            // Filter fields to log\n            var notifications = Stringify(args.Notifications);\n            if (!string.IsNullOrEmpty(notifications))\n            {\n                _logger.NotificationInfo(\n                    dropped ? \"!!!! Dropped !!!! \" : \"Encoded\", args.PublishTimestamp, args.SequenceNumber,\n                    args.PublishSequenceNumber?.ToString(CultureInfo.CurrentCulture) ?? \"-\", args.MessageType,\n                    args.EndpointUrl, notifications);\n            }\n        }\n\n        /// <summary>\n        /// Log notifications for debugging\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <param name=\"dropped\"></param>\n        private void LogNotification(MonitoredItemNotificationModel args, bool dropped)\n        {\n            if (!_logNotifications)\n            {\n                return;\n            }\n            // Filter fields to log\n            var notifications = Stringify(args.YieldReturn());\n            if (!string.IsNullOrEmpty(notifications))\n            {\n                _logger.NotificationSample(\n                    dropped ? \"!!!! Dropped !!!! \" : \"Encoded\", notifications);\n            }\n        }\n\n        private static string Stringify(IEnumerable<MonitoredItemNotificationModel> notifications)\n        {\n            var sb = new StringBuilder();\n            foreach (var item in notifications\n                .Where(n => (n.Flags & MonitoredItemSourceFlags.ModelChanges) == 0))\n            {\n                sb\n                    .AppendLine()\n                    .Append(\"   |\")\n                    .Append(item.Value?.ServerTimestamp\n                        .ToString(\"hh:mm:ss:ffffff\", CultureInfo.CurrentCulture))\n                    .Append('|')\n                    .Append(item.DataSetFieldName ?? item.DataSetName)\n                    .Append('|')\n                    .Append(item.Value?.SourceTimestamp\n                        .ToString(\"hh:mm:ss:ffffff\", CultureInfo.CurrentCulture))\n                    .Append('|')\n                    .Append(item.Value?.Value)\n                    .Append('|')\n                    .Append(item.Value?.StatusCode)\n                    .Append('|')\n                    ;\n            }\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Create observable metric registrations\n        /// </summary>\n        /// <param name=\"metrics\"></param>\n        private void InitializeMetrics(IMetricsContext metrics)\n        {\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_encoded_notifications\",\n                () => new Measurement<long>(NotificationsProcessedCount, metrics.TagList),\n                description: \"Number of successfully processed subscription notifications \" +\n                \"received from OPC client.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_dropped_notifications\",\n                () => new Measurement<long>(NotificationsDroppedCount, metrics.TagList),\n                description: \"Number of incoming subscription notifications that are too \" +\n                \"big to be processed based \" +\n                \"on the message size limits or other issues with the notification.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_processed_messages\",\n                () => new Measurement<long>(MessagesProcessedCount, metrics.TagList),\n                description: \"Number of successfully generated messages that are to be \" +\n                \"sent using the message sender\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_notifications_per_message_average\",\n                () => new Measurement<double>(AvgNotificationsPerMessage, metrics.TagList),\n                description: \"Average subscription notifications packed into a message\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_encoded_message_size_average\",\n                () => new Measurement<double>(AvgMessageSize, metrics.TagList),\n                description: \"Average size of a message through the lifetime of the encoder.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_chunk_size_average\",\n                () => new Measurement<double>(AvgMessageSize / (4 * 1024), metrics.TagList),\n                description: \"IoT Hub chunk size average\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_message_split_ratio_max\",\n                () => new Measurement<double>(MaxMessageSplitRatio, metrics.TagList),\n                description: \"The message split ration specifies into how many messages \" +\n                \"a subscription notification had to be split. Less is better for \" +\n                \"performance. If the number is large user should attempt to limit \" +\n                \"the number of notifications in a message using configuration.\");\n        }\n\n        private uint _sequenceNumber; // TODO: Use writer group context\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n        private readonly Meter _meter = Diagnostics.NewMeter();\n        private readonly bool _logNotifications;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for NetworkMessageEncoder\n    /// </summary>\n    internal static partial class NetworkMessageEncoderLogging\n    {\n        private const int EventClass = 170;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Missing service message context for network message - dropping notification.\")]\n        public static partial void MissingServiceMessageContext(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Resulting chunk is too large, dropped a notification.\")]\n        public static partial void ChunkTooLarge(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug,\n            Message = \"{Count} Notifications encoded into a network message (chunks:{Chunks})...\")]\n        public static partial void NotificationsEncoded(this ILogger logger, int count, int chunks);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Warning,\n            Message = \"Dropped {TotalNotifications} values\")]\n        public static partial void DroppedValues(this ILogger logger, int totalNotifications);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"{Action}|{PublishTime:hh:mm:ss:ffffff}|#{Seq}:{PublishSeq}|{MessageType}|{Endpoint}|{Items}\")]\n        public static partial void NotificationInfo(this ILogger logger, string action, DateTimeOffset? publishTime, uint seq, string publishSeq, MessageType messageType, string? endpoint, string items);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"{Action}|Sample|{Items}\")]\n        public static partial void NotificationSample(this ILogger logger, string action, string items);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Removed {Count} duplicates from batch.\")]\n        public static partial void RemovedDuplicates(this ILogger logger, int count);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/NetworkMessageSink.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Messaging.Clients;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.Metrics;\n    using System.Globalization;\n    using System.Linq;\n    using System.Runtime.ConstrainedExecution;\n    using System.Security.Authentication;\n    using System.Text;\n    using System.Text.RegularExpressions;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using System.Threading.Tasks.Dataflow;\n\n    /// <summary>\n    /// Network message sink connected to the source. The sink consists of\n    /// publish queue which is a dataflow engine to handle batching and\n    /// encoding and other egress concerns.  The queues can be partitioned\n    /// to handle multiple topics.\n    /// </summary>\n    public sealed class NetworkMessageSink : IMessageSink, IDisposable,\n        IAsyncDisposable\n    {\n        /// <summary>\n        /// Create writer group network message sink\n        /// </summary>\n        /// <param name=\"writerGroup\"></param>\n        /// <param name=\"eventClients\"></param>\n        /// <param name=\"factories\"></param>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"metrics\"></param>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public NetworkMessageSink(WriterGroupModel writerGroup,\n            IEnumerable<IEventClient> eventClients,\n            IEnumerable<IEventClientFactory> factories,\n            IMessageEncoder encoder, IOptions<PublisherOptions> options,\n            ILogger<NetworkMessageSink> logger, IMetricsContext metrics,\n            IWriterGroupDiagnostics? diagnostics = null,\n            TimeProvider? timeProvider = null)\n        {\n            _metrics = metrics ?? throw new ArgumentNullException(nameof(metrics));\n            _options = options ?? throw new ArgumentNullException(nameof(options));\n            _messageEncoder = encoder ?? throw new ArgumentNullException(nameof(encoder));\n            _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n            _diagnostics = diagnostics;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n\n            // Reverse the registration to have highest prio first.\n            _eventClients = eventClients?.Reverse().ToList()\n                ?? throw new ArgumentNullException(nameof(eventClients));\n            if (_eventClients.Count == 0)\n            {\n                throw new ArgumentException(\"No transports registered.\",\n                    nameof(eventClients));\n            }\n\n            _factories = factories?.ToDictionary(f => f.Name, StringComparer.OrdinalIgnoreCase)\n                ?? throw new ArgumentNullException(nameof(factories));\n            _logNotificationsFilter = _options.Value.DebugLogNotificationsFilter == null ?\n                null : new Regex(_options.Value.DebugLogNotificationsFilter);\n            _filterNotifications = _options.Value.DebugLogNotificationsWithHeartbeat == true\n                ? Filter : FilterHeartbeat;\n            _logNotifications = _options.Value.DebugLogNotifications\n                ?? (_logNotificationsFilter != null);\n            _transport = new TransportOptions(writerGroup, _eventClients,\n                _factories, _options, _logger);\n            _queue = _transport.MaxPublishQueuePartitions != 0\n                ? new PublishQueue(this, _transport.MaxPublishQueuePartitions)\n                : new PublishQueuePartition(this, 0, _logger);\n\n            InitializeMetrics();\n\n            _startTime = _timeProvider.GetTimestamp();\n            _transport.Log(writerGroup, _logger);\n        }\n\n        /// <inheritdoc/>\n        public void OnMessage(OpcUaSubscriptionNotification notification)\n        {\n            if (_dataFlowStartTime == 0)\n            {\n                _diagnostics?.ResetWriterGroupDiagnostics();\n                _dataFlowStartTime = _timeProvider.GetTimestamp();\n            }\n\n            if (!_queue.TryPublish(notification))\n            {\n                notification.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void OnCounterReset()\n        {\n            _dataFlowStartTime = 0;\n            _queue.Reset();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask UpdateAsync(WriterGroupModel writerGroup)\n        {\n            // TODO: Call update on sink\n            var cur = _transport;\n            var options = new TransportOptions(writerGroup,\n                _eventClients, _factories, _options, _logger);\n            if (options == _transport)\n            {\n                // Group change does not effect transport settings\n                return;\n            }\n\n            _transport = options;\n            cur.Dispose();\n\n            // Todo: only check queue update\n\n            await _queue.DisposeAsync().ConfigureAwait(false);\n            _queue = options.MaxPublishQueuePartitions != 0\n                ? new PublishQueue(this, options.MaxPublishQueuePartitions)\n                : new PublishQueuePartition(this, 0, _logger);\n\n            _transport.Log(writerGroup, _logger);\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask DisposeAsync()\n        {\n            await _cts.CancelAsync().ConfigureAwait(false);\n            await _queue.DisposeAsync().ConfigureAwait(false);\n\n            _queue = new NullPublishQueue();\n\n            var cur = _transport;\n            _transport = new TransportOptions();\n            cur.Dispose();\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            try\n            {\n                _meter.Dispose();\n            }\n            finally\n            {\n                DisposeAsync().AsTask().GetAwaiter().GetResult();\n                _cts.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Publishing queue interface\n        /// </summary>\n        private interface IPublishQueue : IAsyncDisposable\n        {\n            int BufferOutput { get; }\n            int EncodingInput { get; }\n            int EncodingOutput { get; }\n            int SendInput { get; }\n            int PartitionCount { get; }\n            int ActiveCount { get; }\n\n            /// <summary>\n            /// Reset the queue\n            /// </summary>\n            void Reset();\n\n            /// <summary>\n            /// Publish to the queue\n            /// </summary>\n            /// <param name=\"args\"></param>\n            /// <returns></returns>\n            bool TryPublish(OpcUaSubscriptionNotification args);\n        }\n\n        /// <summary>\n        /// Dummy publish queue\n        /// </summary>\n        private sealed class NullPublishQueue : IPublishQueue\n        {\n            /// <inheritdoc/>\n            public int BufferOutput { get; }\n            /// <inheritdoc/>\n            public int EncodingInput { get; }\n            /// <inheritdoc/>\n            public int EncodingOutput { get; }\n            /// <inheritdoc/>\n            public int SendInput { get; }\n            /// <inheritdoc/>\n            public int PartitionCount { get; }\n            /// <inheritdoc/>\n            public int ActiveCount { get; }\n\n            /// <inheritdoc/>\n            public ValueTask DisposeAsync()\n            {\n                return ValueTask.CompletedTask;\n            }\n\n            /// <inheritdoc/>\n            public void Reset()\n            {\n            }\n\n            /// <inheritdoc/>\n            public bool TryPublish(OpcUaSubscriptionNotification args)\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Partitioned publish queue\n        /// </summary>\n        private sealed class PublishQueue : IPublishQueue\n        {\n            /// <inheritdoc/>\n            public int EncodingInput => _partitions.Sum(p => p.EncodingInput);\n            /// <inheritdoc/>\n            public int EncodingOutput => _partitions.Sum(p => p.EncodingOutput);\n            /// <inheritdoc/>\n            public int SendInput => _partitions.Sum(p => p.SendInput);\n            /// <inheritdoc/>\n            public int BufferOutput => _partitions.Sum(p => p.BufferOutput);\n            /// <inheritdoc/>\n            public int PartitionCount => _partitions.Length;\n            /// <inheritdoc/>\n            public int ActiveCount => _partitions.Sum(p => p.ActiveCount);\n\n            /// <summary>\n            /// Create publish queue partition\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"maxPartitions\"></param>\n            public PublishQueue(NetworkMessageSink outer, int maxPartitions)\n            {\n                maxPartitions = Math.Min(32, Math.Max(1, maxPartitions));\n                _partitions = Enumerable\n                    .Range(0, maxPartitions)\n                    .Select(índex => new PublishQueuePartition(outer, índex, outer._logger))\n                    .ToArray();\n            }\n\n            /// <inheritdoc/>\n            public bool TryPublish(OpcUaSubscriptionNotification args)\n            {\n                var hash = (args.Context as DataSetWriterContext)?\n                    .Topic?.GetHashCode(StringComparison.Ordinal) ?? 0;\n                return _partitions[(uint)hash % _partitions.Length].TryPublish(args);\n            }\n\n            /// <inheritdoc/>\n            public void Reset()\n            {\n                _partitions.ForEach(p => p.Reset());\n            }\n\n            /// <inheritdoc/>\n            public async ValueTask DisposeAsync()\n            {\n                foreach (var partition in _partitions)\n                {\n                    await partition.DisposeAsync().ConfigureAwait(false);\n                }\n            }\n            private readonly PublishQueuePartition[] _partitions;\n        }\n\n        /// <summary>\n        /// Partitioned publish queue\n        /// </summary>\n        private sealed class PublishQueuePartition : IPublishQueue\n        {\n            /// <inheritdoc/>\n            public int EncodingInput => _encodingBlock.InputCount;\n            /// <inheritdoc/>\n            public int EncodingOutput => _encodingBlock.OutputCount;\n            /// <inheritdoc/>\n            public int SendInput => _sendBlock.InputCount;\n            /// <inheritdoc/>\n            public int BufferOutput => _notificationBufferBlock.OutputCount;\n            /// <inheritdoc/>\n            public int PartitionCount => 1;\n            /// <inheritdoc/>\n            public int ActiveCount => _started ? 1 : 0;\n\n            /// <summary>\n            /// Create publish queue partition\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"índex\"></param>\n            /// <param name=\"logger\"></param>\n            public PublishQueuePartition(NetworkMessageSink outer, int índex, ILogger logger)\n            {\n                _outer = outer;\n                _índex = índex;\n                _logger = logger;\n\n                var maxBufferBlockCap = (int)Math.BigMul(_outer._transport.MaxPublishQueueSize,\n                    _outer._transport.MaxNotificationsPerMessage);\n                if (maxBufferBlockCap == 0)\n                {\n                    maxBufferBlockCap = DataflowBlockOptions.Unbounded;\n                }\n                var maxEncodingBlockCap = (int)Math.BigMul(_outer._transport.MaxPublishQueueSize,\n                    _outer._options.Value.MaxNodesPerDataSet);\n                if (maxEncodingBlockCap == 0)\n                {\n                    maxEncodingBlockCap = DataflowBlockOptions.Unbounded;\n                }\n                _batchTriggerIntervalTimer = _outer._timeProvider.CreateTimer(\n                    BatchTriggerIntervalTimer_Elapsed, null,\n                    Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                _notificationBufferBlock = new BatchBlock<OpcUaSubscriptionNotification>(\n                    Math.Max(1, _outer._transport.MaxNotificationsPerMessage), new GroupingDataflowBlockOptions\n                    {\n                        // BoundedCapacity = maxBufferBlockCap\n                    });\n                _encodingBlock =\n                    new TransformManyBlock<OpcUaSubscriptionNotification[], (IEvent, Action)>(\n                        EncodeSubscriptionNotifications, new ExecutionDataflowBlockOptions\n                        {\n                            // BoundedCapacity = maxEncodingBlockCap,\n                            MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded\n                        });\n                _sendBlock = new ActionBlock<(IEvent, Action)>(\n                    SendAsync, new ExecutionDataflowBlockOptions\n                    {\n                        BoundedCapacity = _outer._transport.MaxPublishQueueSize + 1,\n                        MaxDegreeOfParallelism = 1,\n                        EnsureOrdered = true\n                    });\n\n                _notificationBufferBlock.LinkTo(_encodingBlock);\n                _encodingBlock.LinkTo(_sendBlock);\n            }\n\n            /// <inheritdoc/>\n            public void Reset()\n            {\n                _started = false;\n            }\n\n            /// <inheritdoc/>\n            public async ValueTask DisposeAsync()\n            {\n                try\n                {\n                    await _cts.CancelAsync().ConfigureAwait(false);\n                    _batchTriggerIntervalTimer.Change(\n                        Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                    _batchTriggerIntervalTimer.Dispose();\n\n                    //\n                    // Do not change this it must be in the order of the data flow,\n                    // complete and wait data to flow out to the next block which\n                    // is then completed. If blocks are completed downstream first\n                    // previous blocks will hang.\n                    //\n                    _notificationBufferBlock.Complete();\n                    await _notificationBufferBlock.Completion.ConfigureAwait(false);\n                    _encodingBlock.Complete();\n                    await _encodingBlock.Completion.ConfigureAwait(false);\n                    _sendBlock.Complete();\n                    await _sendBlock.Completion.ConfigureAwait(false);\n                }\n                finally\n                {\n                    _cts.Dispose();\n                }\n            }\n\n            /// <inheritdoc/>\n            public bool TryPublish(OpcUaSubscriptionNotification args)\n            {\n                if (!_started)\n                {\n                    _started = true;\n                    if (_outer._transport.BatchTriggerInterval > TimeSpan.Zero)\n                    {\n                        _batchTriggerIntervalTimer.Change(_outer._transport.BatchTriggerInterval,\n                            Timeout.InfiniteTimeSpan);\n                    }\n                    _logger.PartitionStarted(_índex,\n                        args.ApplicationUri ?? \"<disconnected>\",\n                        args.EndpointUrl ?? \"<disconnected>\");\n                }\n\n                if (_sendBlock.InputCount >= _outer._transport.MaxPublishQueueSize)\n                {\n                    Interlocked.Increment(ref _outer._sendBlockInputDroppedCount);\n\n                    if (_outer._logNotifications)\n                    {\n                        _outer.LogNotification(args, true);\n                    }\n                    return false;\n                }\n\n                if (_outer._logNotifications)\n                {\n                    _outer.LogNotification(args);\n                }\n\n                Interlocked.Increment(ref _outer._notificationBufferInputCount);\n                if (!_notificationBufferBlock.Post(args))\n                {\n                    Interlocked.Increment(ref _outer._dataflowInputDroppedCount);\n                    return false;\n                }\n\n                return true;\n            }\n\n            /// <summary>\n            /// Send message\n            /// </summary>\n            /// <param name=\"message\"></param>\n            /// <returns></returns>\n            private async Task SendAsync((IEvent Event, Action Complete) message)\n            {\n                if (_cts.IsCancellationRequested)\n                {\n                    message.Complete();\n                    message.Event.Dispose();\n                    _outer._logger.MessageDropped();\n                    return;\n                }\n                try\n                {\n                    // Do not give up and try to send the message until cancelled.\n                    var sw = Stopwatch.StartNew();\n                    for (var attempt = 1; !_cts.IsCancellationRequested; attempt++)\n                    {\n                        try\n                        {\n                            // Throws if cancelled\n                            await message.Event.SendAsync(_cts.Token).ConfigureAwait(false);\n                            _outer._logger.MessageSent(attempt);\n                            break;\n                        }\n                        catch (OperationCanceledException) { }\n                        catch (Exception e) when (e is not ObjectDisposedException)\n                        {\n                            _outer._errorCount++;\n\n                            // Fail fast for authentication exceptions\n                            var aux = e as AuthenticationException;\n                            if (aux == null && e is AggregateException ag)\n                            {\n                                aux = ag\n                                    .Flatten().InnerExceptions\n                                    .OfType<AuthenticationException>()\n                                    .FirstOrDefault();\n                            }\n                            if (aux?.Message.Equals(\"TLS authentication error.\",\n                                StringComparison.Ordinal) == true)\n                            {\n                                _logger.WrongCertificate(aux, attempt);\n                                Runtime.FailFast(aux.Message, aux);\n                            }\n\n                            var delay = TimeSpan.FromMilliseconds(attempt * 100);\n                            if (_logger.IsEnabled(LogLevel.Debug))\n                            {\n                                _logger.SendErrorWithStack(e, attempt, e.Message, delay);\n                            }\n                            else if (attempt % 10 == 0)\n                            {\n                                _logger.SendErrorWithStackPeriodic(e, attempt, e.Message, delay);\n                            }\n                            else\n                            {\n                                _logger.SendError(attempt, e.Message, delay);\n                            }\n\n                            // Throws if cancelled\n                            await Task.Delay(delay, _cts.Token).ConfigureAwait(false);\n                        }\n                    }\n\n                    // Message successfully published.\n                    Interlocked.Increment(ref _outer._messagesSentCount);\n                    kSendingDuration.Record(sw.ElapsedMilliseconds, _outer._metrics.TagList);\n                    message.Complete();\n                    message.Event.Dispose();\n                    return;\n                }\n                catch (ObjectDisposedException) { }\n                catch (OperationCanceledException) { }\n                catch (Exception e)\n                {\n                    _logger.UnexpectedSendError(e);\n                }\n            }\n\n            /// <summary>\n            /// Encode notifications\n            /// </summary>\n            /// <param name=\"input\"></param>\n            /// <returns></returns>\n            private IEnumerable<(IEvent, Action)> EncodeSubscriptionNotifications(\n                OpcUaSubscriptionNotification[] input)\n            {\n                try\n                {\n                    Interlocked.Add(ref _outer._notificationBufferInputCount, -input.Length);\n                    return _outer._messageEncoder.Encode(\n                        _outer._transport.EventClient.CreateEvent, input,\n                        _outer._transport.MaxNetworkMessageSize,\n                        _outer._transport.MaxNotificationsPerMessage != 1);\n                }\n                catch (Exception e)\n                {\n                    _logger.EncodingFailure(e, _índex);\n                    input.ForEach(a => a.Dispose());\n                    return [];\n                }\n            }\n\n            /// <summary>\n            /// Batch trigger interval\n            /// </summary>\n            /// <param name=\"state\"></param>\n            private void BatchTriggerIntervalTimer_Elapsed(object? state)\n            {\n                if (_outer._transport.BatchTriggerInterval > TimeSpan.Zero)\n                {\n                    _batchTriggerIntervalTimer.Change(_outer._transport.BatchTriggerInterval,\n                        Timeout.InfiniteTimeSpan);\n                }\n                _logger.BatchTrigger(_outer._transport.BatchTriggerInterval);\n                _notificationBufferBlock.TriggerBatch();\n            }\n\n            private bool _started;\n            private readonly ILogger _logger;\n            private readonly NetworkMessageSink _outer;\n            private readonly int _índex;\n            private readonly ITimer _batchTriggerIntervalTimer;\n            private readonly BatchBlock<OpcUaSubscriptionNotification> _notificationBufferBlock;\n            private readonly TransformManyBlock<OpcUaSubscriptionNotification[], (IEvent, Action)> _encodingBlock;\n            private readonly ActionBlock<(IEvent, Action)> _sendBlock;\n            private readonly CancellationTokenSource _cts = new();\n        }\n\n        private static IEnumerable<MonitoredItemNotificationModel> FilterHeartbeat(\n            IList<MonitoredItemNotificationModel> notifications)\n        {\n            // Filter heartbeats and model changes\n            return notifications\n                .Where(n => (n.Flags &\n                    (MonitoredItemSourceFlags.Heartbeat | MonitoredItemSourceFlags.ModelChanges)) == 0);\n        }\n\n        private static IEnumerable<MonitoredItemNotificationModel> Filter(\n            IList<MonitoredItemNotificationModel> notifications)\n        {\n            // Filter model changes\n            return notifications\n                .Where(n => (n.Flags & MonitoredItemSourceFlags.ModelChanges) == 0);\n        }\n\n        /// <summary>\n        /// Log notifications for debugging\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <param name=\"dropped\"></param>\n        private void LogNotification(OpcUaSubscriptionNotification args, bool dropped = false)\n        {\n            // Filter fields to log\n            if (_logNotificationsFilter != null)\n            {\n                var matched = args.EndpointUrl != null &&\n                    _logNotificationsFilter.IsMatch(args.EndpointUrl);\n\n                for (var i = 0; i < args.Notifications.Count && !matched; i++)\n                {\n                    var itemName =\n                        args.Notifications[i].DataSetFieldName ??\n                        args.Notifications[i].DataSetName;\n                    if (itemName != null)\n                    {\n                        matched = _logNotificationsFilter.IsMatch(itemName);\n                    }\n                }\n                if (!matched)\n                {\n                    // Do not log anything\n                    return;\n                }\n            }\n\n            var notifications = Stringify(_filterNotifications(args.Notifications));\n            if (!string.IsNullOrEmpty(notifications))\n            {\n                _logger.NotificationLog(\n                    dropped ? \"!!!! Dropped !!!! \" : string.Empty,\n                    args.PublishTimestamp,\n                    args.SequenceNumber,\n                    args.PublishSequenceNumber?.ToString(CultureInfo.CurrentCulture) ?? \"-\",\n                    args.MessageType,\n                    args.EndpointUrl ?? string.Empty,\n                    notifications);\n            }\n\n            static string Stringify(IEnumerable<MonitoredItemNotificationModel> notifications)\n            {\n                var sb = new StringBuilder();\n                foreach (var item in notifications)\n                {\n                    sb\n                        .AppendLine()\n                        .Append(\"   |\")\n                        .Append(item.Value?.ServerTimestamp\n                            .ToString(\"hh:mm:ss:ffffff\", CultureInfo.CurrentCulture))\n                        .Append('|')\n                        .Append(item.DataSetFieldName ?? item.DataSetName)\n                        .Append('|')\n                        .Append(item.Value?.SourceTimestamp\n                            .ToString(\"hh:mm:ss:ffffff\", CultureInfo.CurrentCulture))\n                        .Append('|')\n                        .Append(item.Value?.Value)\n                        .Append('|')\n                        .Append(item.Value?.StatusCode)\n                        .Append('|')\n                        ;\n                }\n                return sb.ToString();\n            }\n        }\n\n        /// <summary>\n        /// Transport configuration\n        /// </summary>\n        internal record class TransportOptions : IDisposable\n        {\n            /// <summary>\n            /// Event client selected\n            /// </summary>\n            public IEventClient EventClient { get; }\n\n            /// <summary>\n            /// Notifications per message\n            /// </summary>\n            public int MaxNotificationsPerMessage { get; }\n\n            /// <summary>\n            /// Max network messages\n            /// </summary>\n            public int MaxNetworkMessageSize { get; }\n\n            /// <summary>\n            /// Max publish queue size\n            /// </summary>\n            public int MaxPublishQueueSize { get; }\n\n            /// <summary>\n            /// Max batch trigger interval\n            /// </summary>\n            public TimeSpan BatchTriggerInterval { get; }\n\n            /// <summary>\n            /// Iot edge configured\n            /// </summary>\n            public bool IsIoTEdge\n                => EventClient.Name.Equals(nameof(WriterGroupTransport.IoTHub),\n                        StringComparison.OrdinalIgnoreCase);\n\n            /// <summary>\n            /// Max publish queue partitions\n            /// </summary>\n            public int MaxPublishQueuePartitions { get; }\n\n            /// <summary>\n            /// Create null options\n            /// </summary>\n            public TransportOptions()\n            {\n                EventClient = new NullEventClient();\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                _scope?.Dispose();\n            }\n\n            /// <summary>\n            /// Create options\n            /// </summary>\n            /// <param name=\"writerGroup\"></param>\n            /// <param name=\"eventClients\"></param>\n            /// <param name=\"factories\"></param>\n            /// <param name=\"options\"></param>\n            /// <param name=\"logger\"></param>\n            public TransportOptions(WriterGroupModel writerGroup,\n                List<IEventClient> eventClients,\n                Dictionary<string, IEventClientFactory> factories,\n                IOptions<PublisherOptions> options, ILogger logger)\n            {\n                EventClient = eventClients\n                        .Find(e => e.Name.Equals(writerGroup.Transport?.ToString(),\n                            StringComparison.OrdinalIgnoreCase))\n                    ?? eventClients\n                        .Find(e => e.Name.Equals(options.Value.DefaultTransport?.ToString(),\n                            StringComparison.OrdinalIgnoreCase))\n                    ?? eventClients[0];\n\n                if (!string.IsNullOrEmpty(writerGroup.TransportConfiguration))\n                {\n                    if (!factories.TryGetValue(EventClient.Name, out var factory))\n                    {\n                        logger.CustomWriterGroupConfigurationCouldNotBeApplied(\n                            EventClient.Name);\n                    }\n                    else\n                    {\n                        // Create event client with configuration from factory.\n                        try\n                        {\n                            _scope = factory.CreateEventClient(\n                                writerGroup.TransportConfiguration, out var client);\n\n                            EventClient = client;\n                            logger.UsingTransportWithCustomWriterGroupConfiguration(\n                                EventClient.Name);\n                        }\n                        catch (Exception e)\n                        {\n                            logger.CustomWriterGroupConfigurationCouldNotBeAppliedWithError(\n                                EventClient.Name, e.Message);\n                        }\n                    }\n                }\n\n                MaxNotificationsPerMessage = (int?)writerGroup.NotificationPublishThreshold\n                    ?? options.Value.BatchSize ?? 0;\n                MaxNetworkMessageSize = (int?)writerGroup.MaxNetworkMessageSize\n                    ?? options.Value.MaxNetworkMessageSize ?? 0;\n\n                if (MaxNetworkMessageSize <= 0)\n                {\n                    MaxNetworkMessageSize = int.MaxValue;\n                }\n                if (MaxNetworkMessageSize > EventClient.MaxEventPayloadSizeInBytes)\n                {\n                    MaxNetworkMessageSize = EventClient.MaxEventPayloadSizeInBytes;\n                }\n\n                BatchTriggerInterval = writerGroup.PublishingInterval\n                    ?? options.Value.BatchTriggerInterval ?? TimeSpan.Zero;\n                //\n                // If the max notification per message is 1 then there is no need to\n                // have an interval publishing as the messages are emitted as soon\n                // as they arrive anyway\n                //\n                if (MaxNotificationsPerMessage == 1)\n                {\n                    BatchTriggerInterval = TimeSpan.Zero;\n                }\n                MaxPublishQueueSize = (int?)writerGroup.PublishQueueSize\n                    ?? options.Value.MaxNetworkMessageSendQueueSize ?? kMaxQueueSize;\n\n                //\n                // If undefined, set notification buffer to 1 if no publishing interval\n                // otherwise queue as much as reasonable\n                //\n                if (MaxNotificationsPerMessage <= 0)\n                {\n                    MaxNotificationsPerMessage = BatchTriggerInterval == TimeSpan.Zero ?\n                        1 : MaxPublishQueueSize;\n                }\n\n                MaxPublishQueuePartitions = writerGroup.PublishQueuePartitions ??\n                    options.Value.DefaultWriterGroupPartitions ?? 0;\n            }\n\n            /// <summary>\n            /// Log the transportation options\n            /// </summary>\n            /// <param name=\"writerGroup\"></param>\n            /// <param name=\"logger\"></param>\n            public void Log(WriterGroupModel writerGroup, ILogger logger)\n            {\n                var interval = BatchTriggerInterval == TimeSpan.Zero ?\n                    \"as soon as they arrive\" : $\"every {BatchTriggerInterval} (hh:mm:ss)\";\n                var batching = MaxNotificationsPerMessage == 1 ?\n                    \"and individually\" :\n                    $\"or when a batch of {MaxNotificationsPerMessage} notifications is ready\";\n                var maxSize = MaxNetworkMessageSize == int.MaxValue ?\n                    \"unlimited size\" : $\"at most {MaxNetworkMessageSize / 1024} kb\";\n\n                logger.WriterGroupSetup(\n                    writerGroup.Name ?? Constants.DefaultWriterGroupName,\n                    interval,\n                    batching,\n                    maxSize,\n                    EventClient.Name,\n                    writerGroup.HeaderLayoutUri ?? \"unknown\",\n                    writerGroup.MessageType ?? MessageEncoding.Json,\n                    MaxPublishQueueSize);\n            }\n\n            /// <summary>\n            /// With 256k limit this is 1 GB.\n            /// TODO: Must be related to the actual limit size\n            /// </summary>\n            private const int kMaxQueueSize = 4096;\n            private readonly IDisposable? _scope;\n        }\n\n        /// <summary>\n        /// Create observable metrics\n        /// </summary>\n        private void InitializeMetrics()\n        {\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_partitions_count\",\n                () => new Measurement<int>(_queue.PartitionCount, _metrics.TagList),\n                description: \"Partition count of the writer queue.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_partitions_active\",\n                () => new Measurement<int>(_queue.ActiveCount, _metrics.TagList),\n                description: \"Active partitions pushing data inside the writer queue.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_send_queue_dropped_count\",\n                () => new Measurement<long>(_sendBlockInputDroppedCount, _metrics.TagList),\n                description: \"Telemetry messages dropped due to overflow.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_publish_queue_dropped_count\",\n                () => new Measurement<long>(_dataflowInputDroppedCount, _metrics.TagList),\n                description: \"Telemetry messages dropped due to overflow of the publish queue.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_send_queue_size\",\n                () => new Measurement<long>(_queue.SendInput, _metrics.TagList),\n                description: \"Telemetry messages queued for sending upstream.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_batch_input_queue_size\",\n                () => new Measurement<long>(_notificationBufferInputCount, _metrics.TagList),\n                description: \"Telemetry messages queued for sending upstream.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_encoding_input_queue_size\",\n                () => new Measurement<long>(_queue.EncodingInput, _metrics.TagList),\n                description: \"Telemetry messages queued for sending upstream.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_encoding_output_queue_size\",\n                () => new Measurement<long>(_queue.EncodingOutput, _metrics.TagList),\n                description: \"Telemetry messages queued for sending upstream.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_messages\",\n                () => new Measurement<long>(_messagesSentCount, _metrics.TagList),\n                description: \"Number of IoT messages successfully sent via transport.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_messages_per_second\",\n                () => new Measurement<double>(_messagesSentCount / UpTime, _metrics.TagList),\n                description: \"Messages/second sent via transport.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_message_send_failures\",\n                () => new Measurement<long>(_errorCount, _metrics.TagList),\n                description: \"Number of failures sending a network message.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_sent_iot_messages\",\n                () => new Measurement<long>(_transport.IsIoTEdge ? _messagesSentCount : 0, _metrics.TagList),\n                description: \"Number of IoT messages successfully sent via transport.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_sent_iot_messages_per_second\",\n                () => new Measurement<double>(_transport.IsIoTEdge ? _messagesSentCount / UpTime : 0d, _metrics.TagList),\n                description: \"Messages/second sent via transport.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_iothub_queue_dropped_count\",\n                () => new Measurement<long>(_transport.IsIoTEdge ? _sendBlockInputDroppedCount : 0, _metrics.TagList),\n                description: \"Telemetry messages dropped due to overflow of the send queue.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_iothub_queue_size\",\n                () => new Measurement<long>(_transport.IsIoTEdge ? _queue.SendInput : 0, _metrics.TagList),\n                description: \"Telemetry messages queued for sending upstream.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_failed_iot_messages\",\n                () => new Measurement<long>(_transport.IsIoTEdge ? _errorCount : 0, _metrics.TagList),\n                description: \"Number of failures sending a network message.\");\n        }\n\n        private static readonly Histogram<double> kSendingDuration = Diagnostics.Meter.CreateHistogram<double>(\n            \"iiot_edge_publisher_messages_duration\", description: \"Histogram of message sending durations.\");\n\n        private double UpTime => _timeProvider.GetElapsedTime(_startTime).TotalSeconds;\n        private long _messagesSentCount;\n        private long _errorCount;\n        private long _sendBlockInputDroppedCount;\n        private long _dataflowInputDroppedCount;\n        private long _notificationBufferInputCount;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly IMessageEncoder _messageEncoder;\n        private IPublishQueue _queue;\n        private TransportOptions _transport;\n        private readonly List<IEventClient> _eventClients;\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n        private readonly IWriterGroupDiagnostics? _diagnostics;\n        private readonly bool _logNotifications;\n        private readonly Dictionary<string, IEventClientFactory> _factories;\n        private readonly Regex? _logNotificationsFilter;\n        private readonly Func<IList<MonitoredItemNotificationModel>,\n            IEnumerable<MonitoredItemNotificationModel>> _filterNotifications;\n        private readonly long _startTime;\n        private long _dataFlowStartTime;\n        private readonly CancellationTokenSource _cts = new();\n        private readonly IMetricsContext _metrics;\n        private readonly Meter _meter = Diagnostics.NewMeter();\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for NetworkMessageSink\n    /// </summary>\n    internal static partial class NetworkMessageSinkLogging\n    {\n        private const int EventClass = 200;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Partition #{Partition}: Started data flow with notification from server {Name} and endpoint {Endpoint}.\")]\n        public static partial void PartitionStarted(this ILogger logger, int partition, string name, string endpoint);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Closed. Network message dropped.\")]\n        public static partial void MessageDropped(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug,\n            Message = \"#{Attempt}: Network message sent.\")]\n        public static partial void MessageSent(this ILogger logger, int attempt);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Critical,\n            Message = \"#{Attempt}: Wrong TLS certificate trust list provisioned - trying to reset and reload configuration...\")]\n        public static partial void WrongCertificate(this ILogger logger, Exception ex, int attempt);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug, SkipEnabledCheck = true,\n            Message = \"#{Attempt}: Error '{Error}' during sending network message. Retrying in {Delay}...\")]\n        public static partial void SendErrorWithStack(this ILogger logger, Exception ex, int attempt, string error, TimeSpan delay);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"#{Attempt}: Error '{Error}' during sending network message. Retrying in {Delay}...\")]\n        public static partial void SendErrorWithStackPeriodic(this ILogger logger, Exception ex, int attempt, string error, TimeSpan delay);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Error,\n            Message = \"#{Attempt}: Error '{Error}' during sending network message. Retrying in {Delay}...\")]\n        public static partial void SendError(this ILogger logger, int attempt, string error, TimeSpan delay);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Error,\n            Message = \"Encoding failure on partition #{Partition}.\")]\n        public static partial void EncodingFailure(this ILogger logger, Exception ex, int partition);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Error,\n            Message = \"Unexpected error sending network message.\")]\n        public static partial void UnexpectedSendError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Trace,\n            Message = \"Trigger notification batch (Interval:{Interval})...\")]\n        public static partial void BatchTrigger(this ILogger logger, TimeSpan interval);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Information,\n            Message = \"{Action}|{PublishTime:hh:mm:ss:ffffff}|#{Seq}:{PublishSeq}|{MessageType}|{Endpoint}|{Items}\")]\n        public static partial void NotificationLog(this ILogger logger, string action, DateTimeOffset? publishTime,\n            uint seq, string publishSeq, MessageType messageType, string endpoint, string items);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"Writer group {WriterGroup} set up to publish notifications {Interval} {Batching} with {MaxSize} to\" +\n            \" {Transport} with {HeaderLayout} layout and {MessageType} encoding (queuing at most {MaxQueueSize} subscription\" +\n            \" notifications)...\")]\n        public static partial void WriterGroupSetup(this ILogger logger, string writerGroup, string interval,\n            string batching, string maxSize, string transport, string headerLayout,\n            MessageEncoding messageType, int maxQueueSize);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"Using transport {Transport} with custom writer group configuration.\")]\n        public static partial void UsingTransportWithCustomWriterGroupConfiguration(this ILogger logger,\n            string transport);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Warning,\n            Message = \"Custom writer group configuration could not be applied to transport {Transport} \" +\n            \"- using default.\")]\n        public static partial void CustomWriterGroupConfigurationCouldNotBeApplied(this ILogger logger,\n            string transport);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Error,\n            Message = \"Custom writer group configuration could not be applied to transport {Transport} \" +\n            \"due to bad configuration (Error: {Error}) - using default.\")]\n        public static partial void CustomWriterGroupConfigurationCouldNotBeAppliedWithError(this ILogger logger,\n            string transport, string error);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/NodeServices.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using BrowseDirection = Models.BrowseDirection;\n    using NodeClass = Models.NodeClass;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// This class provides access to a servers address space providing node\n    /// and browse services. It uses the OPC ua client interface to access\n    /// the server.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public sealed class NodeServices<T> : INodeServices<T>, INodeServicesInternal<T>,\n        IDisposable\n    {\n        /// <summary>\n        /// Create node service\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"parser\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public NodeServices(IOpcUaClientManager<T> client, IFilterParser parser,\n            ILogger<NodeServices<T>> logger, IOptions<PublisherOptions> options,\n            TimeProvider? timeProvider = null)\n        {\n            _logger = logger;\n            _client = client;\n            _parser = parser;\n            _options = options;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _activitySource.Dispose();\n        }\n\n        /// <inheritdoc/>\n        public Task<ServerCapabilitiesModel> GetServerCapabilitiesAsync(T endpoint,\n            RequestHeaderModel? header, CancellationToken ct)\n        {\n            return _client.ExecuteAsync(endpoint, async context =>\n                await context.Session.GetServerCapabilitiesAsync(\n                    header.GetNamespaceFormat(_options), ct).ConfigureAwait(false), header, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowseFirstResponseModel> BrowseFirstAsync(T endpoint,\n            BrowseFirstRequestModel request, CancellationToken ct)\n        {\n            using var trace = _activitySource.StartActivity(\"BrowseFirst\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var rootId = request.NodeId.ToNodeId(context.Session.MessageContext);\n                if (NodeId.IsNull(rootId))\n                {\n                    rootId = ObjectIds.RootFolder;\n                }\n                var typeId = request.ReferenceTypeId.ToNodeId(context.Session.MessageContext);\n                if (NodeId.IsNull(typeId))\n                {\n                    typeId = ReferenceTypeIds.HierarchicalReferences;\n                }\n                var view = request.View.ToStackModel(context.Session.MessageContext);\n                var excludeReferences = false;\n                var rawMode = request.NodeIdsOnly ?? false;\n                if (!rawMode)\n                {\n                    excludeReferences = request.MaxReferencesToReturn == 0;\n                }\n\n                var references = new List<NodeReferenceModel>();\n                ServiceResultModel? errorInfo = null;\n                if (!excludeReferences)\n                {\n                    var direction = (request.Direction ?? BrowseDirection.Forward)\n                        .ToStackType();\n                    var browseDescriptions = new BrowseDescriptionCollection\n                    {\n                        new BrowseDescription\n                        {\n                            BrowseDirection = direction,\n                            IncludeSubtypes = !(request.NoSubtypes ?? false),\n                            NodeClassMask = (uint)request.NodeClassFilter.ToStackMask(),\n                            NodeId = rootId,\n                            ReferenceTypeId = typeId,\n                            ResultMask = (uint)BrowseResultMask.All\n                        }\n                    };\n                    // Browse and read children\n                    var response = await context.Session.Services.BrowseAsync(\n                        request.Header.ToRequestHeader(_timeProvider), ViewDescription.IsDefault(view)\n                            ? null : view, request.MaxReferencesToReturn ?? 0, browseDescriptions,\n                        ct).ConfigureAwait(false);\n\n                    var results = response.Validate(response.Results, r => r.StatusCode,\n                        response.DiagnosticInfos, browseDescriptions);\n                    errorInfo = results.ErrorInfo;\n                    if (errorInfo == null)\n                    {\n                        errorInfo = results[0].ErrorInfo;\n                        context.TrackedToken = await AddReferencesToBrowseResultAsync(context.Session,\n                            request.Header, request.TargetNodesOnly ?? false,\n                            request.ReadVariableValues ?? false, rawMode, references,\n                            results[0].Result.ContinuationPoint,\n                            results[0].Result.References, ct).ConfigureAwait(false);\n                    }\n                }\n\n                var (node, nodeError) = await context.Session.ReadNodeAsync(\n                    request.Header.ToRequestHeader(_timeProvider), rootId, null, true, rawMode,\n                    request.Header.GetNamespaceFormat(_options),\n                    !excludeReferences ? references.Count != 0 : null, ct).ConfigureAwait(false);\n\n                return new BrowseFirstResponseModel\n                {\n                    // Read root node\n                    Node = node,\n                    References = excludeReferences ? Array.Empty<NodeReferenceModel>() : references,\n                    ContinuationToken = context.TrackedToken,\n                    ErrorInfo = errorInfo ?? nodeError\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowseNextResponseModel> BrowseNextAsync(T endpoint,\n            BrowseNextRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.ContinuationToken))\n            {\n                throw new ArgumentException(\"Missing continuation token\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"BrowseNext\");\n            var continuationPoint = Convert.FromBase64String(request.ContinuationToken);\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var references = new List<NodeReferenceModel>();\n\n                var continuationPoints = new ByteStringCollection { continuationPoint };\n                var response = await context.Session.Services.BrowseNextAsync(\n                    request.Header.ToRequestHeader(_timeProvider), request.Abort ?? false,\n                    continuationPoints, ct).ConfigureAwait(false);\n\n                context.UntrackedToken = request.ContinuationToken;\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, continuationPoints);\n                if (results.ErrorInfo != null)\n                {\n                    return new BrowseNextResponseModel\n                    {\n                        References = references,\n                        ErrorInfo = results.ErrorInfo\n                    };\n                }\n\n                context.TrackedToken = await AddReferencesToBrowseResultAsync(context.Session,\n                    request.Header, request.TargetNodesOnly ?? false,\n                    request.ReadVariableValues ?? false, request.NodeIdsOnly ?? false,\n                    references, results[0].Result.ContinuationPoint,\n                    results[0].Result.References, ct).ConfigureAwait(false);\n                return new BrowseNextResponseModel\n                {\n                    References = references,\n                    ContinuationToken = context.TrackedToken,\n                    ErrorInfo = results[0].ErrorInfo\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<BrowseStreamChunkModel> BrowseAsync(T endpoint,\n            BrowseStreamRequestModel request, CancellationToken ct)\n        {\n            var stream = new BrowseStream(request, _options, _activitySource, _logger,\n                _timeProvider, ct);\n            return _client.ExecuteAsync(endpoint, stream, request.Header, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowsePathResponseModel> BrowsePathAsync(T endpoint,\n            BrowsePathRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.BrowsePaths == null ||\n                request.BrowsePaths.Count == 0 ||\n                request.BrowsePaths.Any(p => p == null || p.Count == 0))\n            {\n                throw new ArgumentException(\"Bad browse path\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"BrowsePath\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var rootId = request.NodeId.ToNodeId(context.Session.MessageContext);\n                if (NodeId.IsNull(rootId))\n                {\n                    rootId = ObjectIds.RootFolder;\n                }\n                var targets = new List<NodePathTargetModel>();\n                var requests = new BrowsePathCollection(request.BrowsePaths.Select(p =>\n                    new BrowsePath\n                    {\n                        StartingNode = rootId,\n                        RelativePath = p.ToRelativePath(context.Session.MessageContext)\n                    }));\n                var response = await context.Session.Services.TranslateBrowsePathsToNodeIdsAsync(\n                    request.Header.ToRequestHeader(_timeProvider), requests, context.Ct).ConfigureAwait(false);\n                var results = response.Validate(\n                    response.Results, r => r.StatusCode, response.DiagnosticInfos, request.BrowsePaths);\n                if (results.ErrorInfo != null)\n                {\n                    return new BrowsePathResponseModel\n                    {\n                        ErrorInfo = results.ErrorInfo\n                    };\n                }\n                foreach (var operation in results)\n                {\n                    await AddTargetsToBrowseResultAsync(context.Session,\n                        request.Header, request.ReadVariableValues ?? false, request.NodeIdsOnly ?? false,\n                        targets, operation.Result.Targets,\n                        [.. operation.Request], context.Ct).ConfigureAwait(false);\n                }\n                return new BrowsePathResponseModel\n                {\n                    Targets = targets,\n                    ErrorInfo = results[0].ErrorInfo\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<NodeMetadataResponseModel> GetMetadataAsync(\n            T endpoint, NodeMetadataRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.NodeId) &&\n                (request.BrowsePath == null || request.BrowsePath.Count == 0))\n            {\n                throw new ArgumentException(\"Node id or browse path missing\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"GetMetadata\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var nodeId = await context.Session.ResolveNodeIdAsync(request.Header, request.NodeId,\n                    request.BrowsePath, nameof(request.BrowsePath), _timeProvider,\n                    context.Ct).ConfigureAwait(false);\n                if (NodeId.IsNull(nodeId))\n                {\n                    throw new ArgumentException(\"Node id missing\", nameof(request));\n                }\n\n                var (node, errorInfo) = await context.Session.ReadNodeAsync(\n                    request.Header.ToRequestHeader(_timeProvider), nodeId,\n                    request.Header.GetNamespaceFormat(_options), ct: context.Ct).ConfigureAwait(false);\n                if (errorInfo != null || node.NodeClass == null)\n                {\n                    return new NodeMetadataResponseModel\n                    {\n                        ErrorInfo = errorInfo ?? ((StatusCode)StatusCodes.BadNodeIdUnknown)\n                            .CreateResultModel()\n                    };\n                }\n\n                VariableMetadataModel? variableMetadata = null;\n                MethodMetadataModel? methodMetadata = null;\n                DataTypeMetadataModel? dataTypeMetadata = null;\n                var typeId = nodeId;\n                if (node.NodeClass == NodeClass.Method)\n                {\n                    (methodMetadata, errorInfo) = await context.Session.GetMethodMetadataAsync(\n                        request.Header.ToRequestHeader(_timeProvider), nodeId,\n                        request.Header.GetNamespaceFormat(_options), context.Ct).ConfigureAwait(false);\n                    if (errorInfo != null)\n                    {\n                        return new NodeMetadataResponseModel { ErrorInfo = errorInfo };\n                    }\n                }\n                else if (node.NodeClass == NodeClass.DataType)\n                {\n                    // TODO\n                    dataTypeMetadata = null;\n                }\n                else if (node.NodeClass is NodeClass.Variable or NodeClass.Object)\n                {\n                    // Get type definition\n                    var (references, ei) = await context.Session.FindAsync(\n                        request.Header.ToRequestHeader(_timeProvider), nodeId.YieldReturn(),\n                        ReferenceTypeIds.HasTypeDefinition, maxResults: 1, ct: context.Ct).ConfigureAwait(false);\n                    typeId = references.FirstOrDefault(r => r.ErrorInfo == null).Node;\n                    if (NodeId.IsNull(typeId))\n                    {\n                        typeId = nodeId;\n                    }\n                    if (node.NodeClass == NodeClass.Variable)\n                    {\n                        (variableMetadata, errorInfo) = await context.Session.GetVariableMetadataAsync(\n                            request.Header.ToRequestHeader(_timeProvider), nodeId,\n                            request.Header.GetNamespaceFormat(_options), context.Ct).ConfigureAwait(false);\n                        if (errorInfo != null)\n                        {\n                            return new NodeMetadataResponseModel { ErrorInfo = errorInfo };\n                        }\n                    }\n                }\n\n                var type = node;\n                if (typeId != nodeId)\n                {\n                    (type, errorInfo) = await context.Session.ReadNodeAsync(\n                        request.Header.ToRequestHeader(_timeProvider), typeId,\n                        request.Header.GetNamespaceFormat(_options), ct: context.Ct).ConfigureAwait(false);\n                    if (errorInfo != null || type.NodeClass == null)\n                    {\n                        return new NodeMetadataResponseModel\n                        {\n                            ErrorInfo = errorInfo ?? ((StatusCode)StatusCodes.BadTypeDefinitionInvalid)\n                                .CreateResultModel()\n                        };\n                    }\n                }\n\n                // process the types starting from the top of the tree.\n                var map = new Dictionary<ImmutableRelativePath, InstanceDeclarationModel>();\n                var declarations = new List<InstanceDeclarationModel>();\n\n                var hierarchy = new List<(NodeId, ReferenceDescription)>();\n                await context.Session.CollectTypeHierarchyAsync(request.Header.ToRequestHeader(_timeProvider),\n                    typeId, hierarchy, context.Ct).ConfigureAwait(false);\n                hierarchy.Reverse(); // Start from Root super type\n                foreach (var (subType, superType) in hierarchy)\n                {\n                    errorInfo = await context.Session.CollectInstanceDeclarationsAsync(\n                        request.Header.ToRequestHeader(_timeProvider), (NodeId)superType.NodeId,\n                        null, declarations, map, request.Header.GetNamespaceFormat(_options),\n                        ct: context.Ct).ConfigureAwait(false);\n                    if (errorInfo != null)\n                    {\n                        break;\n                    }\n                }\n                if (errorInfo == null)\n                {\n                    // collect the fields for the selected type.\n                    errorInfo = await context.Session.CollectInstanceDeclarationsAsync(\n                        request.Header.ToRequestHeader(_timeProvider), typeId, null,\n                        declarations, map, request.Header.GetNamespaceFormat(_options),\n                        ct: context.Ct).ConfigureAwait(false);\n                }\n                return new NodeMetadataResponseModel\n                {\n                    ErrorInfo = errorInfo,\n                    Description = node.Description,\n                    DisplayName = node.DisplayName,\n                    NodeClass = node.NodeClass.Value,\n                    NodeId = node.NodeId,\n                    MethodMetadata = methodMetadata,\n                    VariableMetadata = variableMetadata,\n                    DataTypeMetadata = dataTypeMetadata,\n                    TypeDefinition = errorInfo != null ? null : new TypeDefinitionModel\n                    {\n                        TypeDefinitionId = type.NodeId,\n                        DisplayName = type.DisplayName,\n                        BrowseName = type.BrowseName,\n                        Description = type.Description,\n                        TypeHierarchy = hierarchy.ConvertAll(e => new NodeModel\n                        {\n                            NodeId = request.Header.AsString(e.Item2.NodeId,\n                                context.Session.MessageContext, _options),\n                            DisplayName = e.Item2.DisplayName.AsString(),\n                            BrowseName = request.Header.AsString(e.Item2.BrowseName,\n                                context.Session.MessageContext, _options),\n                            NodeClass = e.Item2.NodeClass.ToServiceType()\n                        }),\n                        NodeType = GetNodeType(hierarchy\n                            .Select(r => (NodeId)r.Item2.NodeId)\n                            .Append(typeId)\n                            .ToList()),\n                        Declarations = declarations\n                    }\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n\n            static NodeType GetNodeType(List<NodeId> hierarchy)\n            {\n                if (hierarchy.Count > 1)\n                {\n                    if (hierarchy[1] == ObjectTypeIds.BaseEventType)\n                    {\n                        return NodeType.Event;\n                    }\n                    if (hierarchy[1] == ObjectTypeIds.BaseInterfaceType)\n                    {\n                        return NodeType.Interface;\n                    }\n                    if (hierarchy[1] == VariableTypeIds.PropertyType)\n                    {\n                        return NodeType.Property;\n                    }\n                    if (hierarchy[1] == VariableTypeIds.BaseDataVariableType)\n                    {\n                        return NodeType.DataVariable;\n                    }\n                }\n                if (hierarchy.Count > 0)\n                {\n                    if (hierarchy[0] == VariableTypeIds.BaseVariableType)\n                    {\n                        return NodeType.Variable;\n                    }\n                    if (hierarchy[0] == ObjectTypeIds.BaseObjectType)\n                    {\n                        return NodeType.Object;\n                    }\n                }\n                return NodeType.Unknown;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<QueryCompilationResponseModel> CompileQueryAsync(T endpoint,\n            QueryCompilationRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.Query))\n            {\n                throw new ArgumentException(\"Query must not be empty\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"CompileQuery\");\n            try\n            {\n                return await _client.ExecuteAsync(endpoint, async context =>\n                {\n                    var parserContext = new SessionParserContext(context.Session,\n                        request.Header.ToRequestHeader(_timeProvider),\n                        request.Header.GetNamespaceFormat(_options));\n                    var eventFilter = await _parser.ParseEventFilterAsync(request.Query,\n                        parserContext, context.Ct).ConfigureAwait(false);\n                    return new QueryCompilationResponseModel\n                    {\n                        EventFilter = eventFilter,\n                        ErrorInfo = parserContext.ErrorInfo\n                    };\n                }, request.Header, ct).ConfigureAwait(false);\n            }\n            catch (Exception ex)\n            {\n                // This is where the parser exceptions will end up\n                return new QueryCompilationResponseModel\n                {\n                    ErrorInfo = ex.ToServiceResultModel()\n                };\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<MethodMetadataResponseModel> GetMethodMetadataAsync(\n            T endpoint, MethodMetadataRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.MethodId) &&\n                (request.MethodBrowsePath == null || request.MethodBrowsePath.Count == 0))\n            {\n                throw new ArgumentException(\"Node id missing\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"GetMethodMetadata\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var methodId = await context.Session.ResolveNodeIdAsync(request.Header, request.MethodId,\n                    request.MethodBrowsePath, nameof(request.MethodBrowsePath), _timeProvider,\n                    context.Ct).ConfigureAwait(false);\n\n                if (NodeId.IsNull(methodId))\n                {\n                    throw new ArgumentException(nameof(request.MethodId));\n                }\n                var browseDescriptions = new BrowseDescriptionCollection\n                {\n                    new BrowseDescription\n                    {\n                        BrowseDirection = Opc.Ua.BrowseDirection.Both,\n                        IncludeSubtypes = true,\n                        NodeClassMask = 0,\n                        NodeId = methodId,\n                        ReferenceTypeId = ReferenceTypeIds.Aggregates,\n                        ResultMask = (uint)BrowseResultMask.All\n                    }\n                };\n                // Get default input arguments and types\n                var browse = await context.Session.Services.BrowseAsync(\n                    request.Header.ToRequestHeader(_timeProvider), null, 0, browseDescriptions,\n                    context.Ct).ConfigureAwait(false);\n\n                var browseresults = browse.Validate(browse.Results, r => r.StatusCode,\n                    browse.DiagnosticInfos, browseDescriptions);\n                if (browseresults.ErrorInfo != null)\n                {\n                    return new MethodMetadataResponseModel\n                    {\n                        ErrorInfo = browseresults.ErrorInfo\n                    };\n                }\n                var result = new MethodMetadataResponseModel();\n                foreach (var nodeReference in browseresults[0].Result.References)\n                {\n                    if (result.OutputArguments != null &&\n                        result.InputArguments != null &&\n                        !string.IsNullOrEmpty(result.ObjectId))\n                    {\n                        break;\n                    }\n                    if (!nodeReference.IsForward)\n                    {\n                        if (nodeReference.ReferenceTypeId == ReferenceTypeIds.HasComponent)\n                        {\n                            result.ObjectId = request.Header.AsString(nodeReference.NodeId,\n                                context.Session.MessageContext, _options);\n                        }\n                        continue;\n                    }\n                    var isInput = nodeReference.BrowseName == BrowseNames.InputArguments;\n                    if (!isInput && nodeReference.BrowseName != BrowseNames.OutputArguments)\n                    {\n                        continue;\n                    }\n\n                    var node = nodeReference.NodeId.ToNodeId(context.Session.MessageContext.NamespaceUris);\n                    var (value, errorInfo) = await context.Session.ReadValueAsync(\n                        request.Header.ToRequestHeader(_timeProvider), node, context.Ct).ConfigureAwait(false);\n                    if (errorInfo != null)\n                    {\n                        return new MethodMetadataResponseModel\n                        {\n                            ErrorInfo = errorInfo\n                        };\n                    }\n                    if (value?.Value is not ExtensionObject[] argumentsList)\n                    {\n                        continue;\n                    }\n\n                    var argList = new List<MethodMetadataArgumentModel>();\n                    foreach (var argument in argumentsList.Select(a => (Argument)a.Body))\n                    {\n                        var (dataTypeIdNode, errorInfo2) = await context.Session.ReadNodeAsync(\n                            request.Header.ToRequestHeader(_timeProvider), argument.DataType, null,\n                            false, false, request.Header.GetNamespaceFormat(_options),\n                            false, context.Ct).ConfigureAwait(false);\n                        var arg = new MethodMetadataArgumentModel\n                        {\n                            Name = argument.Name,\n                            DefaultValue = argument.Value == null ? VariantValue.Null :\n                                context.Session.Codec.Encode(new Variant(argument.Value), out var type),\n                            ValueRank = argument.ValueRank == ValueRanks.Scalar ?\n                                null : (global::Azure.IIoT.OpcUa.Publisher.Models.NodeValueRank)argument.ValueRank,\n                            ArrayDimensions = argument.ArrayDimensions?.ToArray(),\n                            Description = argument.Description?.ToString(),\n                            ErrorInfo = errorInfo2,\n                            Type = dataTypeIdNode\n                        };\n                        argList.Add(arg);\n                    }\n                    if (isInput)\n                    {\n                        result.InputArguments = argList;\n                    }\n                    else\n                    {\n                        result.OutputArguments = argList;\n                    }\n                }\n                return result;\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<MethodCallResponseModel> MethodCallAsync(T endpoint,\n            MethodCallRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.ObjectId) &&\n                (request.ObjectBrowsePath == null || request.ObjectBrowsePath.Count == 0))\n            {\n                throw new ArgumentException(\"Object id missing or bad browse path\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"MethodCall\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                //\n                // A method call request can specify the targets in several ways:\n                //\n                // * Specify methodId and optionally objectId node ids with null browse paths.\n                // * Specify an objectBrowsePath to a real object node from the node specified\n                //   with objectId.  If objectId is null, the root node is used.\n                // * Specify a methodBrowsePath from the above object node to the actual\n                //   method node to call on the object. MethodId remains null.\n                // * Like previously, but specify methodId and method browse path from it to a\n                //   real method node.\n                //\n                var objectId = await context.Session.ResolveNodeIdAsync(request.Header, request.ObjectId,\n                    request.ObjectBrowsePath, nameof(request.ObjectBrowsePath), _timeProvider,\n                    context.Ct).ConfigureAwait(false);\n                if (NodeId.IsNull(objectId))\n                {\n                    throw new ArgumentException(\"Object id missing\", nameof(request));\n                }\n\n                var methodId = request.MethodId.ToNodeId(context.Session.MessageContext);\n                if (request.MethodBrowsePath?.Count > 0)\n                {\n                    if (NodeId.IsNull(methodId))\n                    {\n                        // Browse from object id to method if possible\n                        methodId = objectId ??\n                            throw new ArgumentException(\"Method id and object id missing\",\n                                nameof(request));\n                    }\n                    methodId = await context.Session.ResolveBrowsePathToNodeAsync(request.Header,\n                        methodId, [.. request.MethodBrowsePath], nameof(request.MethodBrowsePath),\n                        _timeProvider, context.Ct).ConfigureAwait(false);\n                }\n                else if (NodeId.IsNull(methodId))\n                {\n                    // Method is null and cannot browse to method from object\n                    throw new ArgumentException(\"Method id missing\", nameof(request));\n                }\n\n                var browseDescriptions = new BrowseDescriptionCollection {\n                    new BrowseDescription {\n                        BrowseDirection = Opc.Ua.BrowseDirection.Forward,\n                        IncludeSubtypes = true,\n                        NodeClassMask = 0,\n                        NodeId = methodId,\n                        ReferenceTypeId = ReferenceTypeIds.HasProperty,\n                        ResultMask = (uint)BrowseResultMask.All\n                    }\n                };\n                // Get default input arguments and types\n                var browse = await context.Session.Services.BrowseAsync(\n                    request.Header.ToRequestHeader(_timeProvider), null, 0, browseDescriptions,\n                    context.Ct).ConfigureAwait(false);\n\n                var browseresults = browse.Validate(browse.Results, r => r.StatusCode,\n                    browse.DiagnosticInfos, browseDescriptions);\n                List<(TypeInfo, object)>? inputs = null, outputs = null;\n                if (browseresults.ErrorInfo == null)\n                {\n                    foreach (var nodeReference in browseresults[0].Result.References)\n                    {\n                        List<(TypeInfo, object)>? temp = null;\n                        if (nodeReference.BrowseName == BrowseNames.InputArguments)\n                        {\n                            temp = inputs = [];\n                        }\n                        else if (nodeReference.BrowseName == BrowseNames.OutputArguments)\n                        {\n                            temp = outputs = [];\n                        }\n                        else\n                        {\n                            continue;\n                        }\n                        var node = nodeReference.NodeId.ToNodeId(context.Session.MessageContext.NamespaceUris);\n                        var (value, _) = await context.Session.ReadValueAsync(\n                            request.Header.ToRequestHeader(_timeProvider),\n                            node, context.Ct).ConfigureAwait(false);\n                        // value is also null if the type is not a variable node\n                        if (value?.Value is ExtensionObject[] argumentsList)\n                        {\n                            foreach (var argument in argumentsList.Select(a => (Argument)a.Body))\n                            {\n                                var builtInType = TypeInfo.GetBuiltInType(argument.DataType);\n                                temp.Add((new TypeInfo(builtInType,\n                                    argument.ValueRank), argument.Value));\n                            }\n                            if (inputs != null && outputs != null)\n                            {\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if ((request.Arguments?.Count ?? 0) > (inputs?.Count ?? 0))\n                {\n                    // Too many arguments provided\n                    if (browseresults.ErrorInfo != null)\n                    {\n                        return new MethodCallResponseModel\n                        {\n                            Results = Array.Empty<MethodCallArgumentModel>(),\n                            ErrorInfo = browseresults.ErrorInfo\n                        };\n                    }\n                    throw new ArgumentException(\"Arguments missing\", nameof(request));\n                }\n\n                // Set default input arguments from meta data\n                var requests = new CallMethodRequestCollection {\n                    new CallMethodRequest {\n                        ObjectId = objectId,\n                        MethodId = methodId,\n                        InputArguments = inputs == null ? [] :\n                            new VariantCollection(inputs\n                                .Select(arg => arg.Item1.CreateVariant(arg.Item2)))\n                    }\n                };\n\n                // Update with input arguments provided in request payload\n                if ((request.Arguments?.Count ?? 0) != 0)\n                {\n                    Debug.Assert(request.Arguments != null);\n                    Debug.Assert(inputs != null);\n                    for (var i = 0; i < request.Arguments.Count; i++)\n                    {\n                        var arg = request.Arguments[i];\n                        if (arg == null)\n                        {\n                            continue;\n                        }\n                        var builtinType = inputs[i].Item1.BuiltInType;\n                        if (!string.IsNullOrEmpty(arg.DataType))\n                        {\n                            builtinType = await context.Session.LruNodeCache.GetBuiltInTypeAsync(\n                                arg.DataType.ToNodeId(context.Session.MessageContext),\n                                context.Ct).ConfigureAwait(false);\n                        }\n                        requests[0].InputArguments[i] = context.Session.Codec.Decode(\n                            arg.Value ?? VariantValue.Null, builtinType);\n                    }\n                }\n\n                // Call method\n                var response = await context.Session.Services.CallAsync(\n                    request.Header.ToRequestHeader(_timeProvider), requests,\n                    context.Ct).ConfigureAwait(false);\n\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, requests);\n                if (results.ErrorInfo != null)\n                {\n                    return new MethodCallResponseModel\n                    {\n                        Results = Array.Empty<MethodCallArgumentModel>(),\n                        ErrorInfo = results.ErrorInfo\n                    };\n                }\n                // Create output argument list\n                var arguments = new List<MethodCallArgumentModel>();\n\n                var args = results[0].Result.OutputArguments?.Count ?? 0;\n                for (var i = 0; i < args; i++)\n                {\n                    var arg = results[0].Result.OutputArguments[i];\n                    if (arg == Variant.Null &&\n                        (outputs?.Count ?? 0) > i && outputs![i].Item2 != null)\n                    {\n                        // return default value\n                        arg = new Variant(outputs[i].Item2);\n                    }\n                    var value = context.Session.Codec.Encode(arg, out var type);\n                    if (type == BuiltInType.Null && (outputs?.Count ?? 0) > i)\n                    {\n                        // return default type from type info\n                        type = outputs![i].Item1.BuiltInType;\n                    }\n                    var dataType = type == BuiltInType.Null ?\n                        null : type.ToString();\n                    arguments.Add(new MethodCallArgumentModel\n                    {\n                        Value = value,\n                        DataType = dataType\n                    });\n                }\n                return new MethodCallResponseModel\n                {\n                    Results = arguments,\n                    ErrorInfo = results[0].ErrorInfo\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ValueReadResponseModel> ValueReadAsync(T endpoint,\n            ValueReadRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.NodeId) &&\n                (request.BrowsePath == null || request.BrowsePath.Count == 0))\n            {\n                throw new ArgumentException(\"Bad node id or browse path missing\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"ValueRead\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var readNode = await context.Session.ResolveNodeIdAsync(request.Header, request.NodeId,\n                    request.BrowsePath, nameof(request.BrowsePath), _timeProvider,\n                    context.Ct).ConfigureAwait(false);\n                if (NodeId.IsNull(readNode))\n                {\n                    throw new ArgumentException(\"Node id missing\", nameof(request));\n                }\n\n                var nodesToRead = new ReadValueIdCollection {\n                    new ReadValueId {\n                        NodeId = readNode,\n                        AttributeId = Attributes.Value,\n                        IndexRange = request.IndexRange,\n                        //\n                        // TODO:\n                        // A QualifiedName that specifies the data encoding to\n                        // be returned for the Value to be read.\n                        // Only works for \"Structure\" types, which we need to\n                        // check first.  However, then we should specify Xml\n                        // and convert to json.\n                        //\n                        DataEncoding = null\n                    }\n                };\n                var response = await context.Session.Services.ReadAsync(\n                    request.Header.ToRequestHeader(_timeProvider),\n                    request.MaxAge?.TotalMilliseconds ?? 0,\n                    request.TimestampsToReturn.ToStackType(),\n                    nodesToRead, context.Ct).ConfigureAwait(false);\n\n                var values = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, nodesToRead);\n                if (values.ErrorInfo != null)\n                {\n                    return new ValueReadResponseModel\n                    {\n                        ErrorInfo = values.ErrorInfo\n                    };\n                }\n                return new ValueReadResponseModel\n                {\n                    ServerPicoseconds = values[0].Result.ServerPicoseconds != 0 ?\n                        values[0].Result.ServerPicoseconds : null,\n                    ServerTimestamp = values[0].Result.ServerTimestamp != DateTime.MinValue ?\n                        values[0].Result.ServerTimestamp : null,\n                    SourcePicoseconds = values[0].Result.SourcePicoseconds != 0 ?\n                        values[0].Result.SourcePicoseconds : null,\n                    SourceTimestamp = values[0].Result.SourceTimestamp != DateTime.MinValue ?\n                        values[0].Result.SourceTimestamp : null,\n                    Value = context.Session.Codec.Encode(values[0].Result.WrappedValue, out var type),\n                    DataType = type == BuiltInType.Null ? null : type.ToString(),\n                    ErrorInfo = values[0].ErrorInfo\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ValueWriteResponseModel> ValueWriteAsync(T endpoint,\n            ValueWriteRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Value is null)\n            {\n                throw new ArgumentException(\"Missing value\", nameof(request));\n            }\n            if (string.IsNullOrEmpty(request.NodeId) &&\n                (request.BrowsePath == null || request.BrowsePath.Count == 0))\n            {\n                throw new ArgumentException(\"Bad node id or browse path missing\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"ValueWrite\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var writeNode = await context.Session.ResolveNodeIdAsync(request.Header, request.NodeId,\n                    request.BrowsePath, nameof(request.BrowsePath), _timeProvider,\n                    context.Ct).ConfigureAwait(false);\n                if (NodeId.IsNull(writeNode))\n                {\n                    throw new ArgumentException(\"Node id missing\", nameof(request));\n                }\n                var dataTypeId = request.DataType.ToNodeId(context.Session.MessageContext);\n                if (NodeId.IsNull(dataTypeId))\n                {\n                    // Read data type\n                    (dataTypeId, _) = await context.Session.ReadAttributeAsync<NodeId?>(\n                        request.Header.ToRequestHeader(_timeProvider), writeNode,\n                        Attributes.DataType, context.Ct).ConfigureAwait(false);\n                    if (NodeId.IsNull(dataTypeId))\n                    {\n                        throw new ArgumentException(\"Data type missing\", nameof(request));\n                    }\n                }\n\n                var builtinType = await context.Session.LruNodeCache.GetBuiltInTypeAsync(dataTypeId,\n                    context.Ct).ConfigureAwait(false);\n                var value = context.Session.Codec.Decode(request.Value, builtinType);\n                var nodesToWrite = new WriteValueCollection{\n                    new WriteValue {\n                        NodeId = writeNode,\n                        AttributeId = Attributes.Value,\n                        Value = new DataValue(value),\n                        IndexRange = request.IndexRange\n                    }\n                };\n                var result = new ValueWriteResponseModel();\n                var response = await context.Session.Services.WriteAsync(\n                    request.Header.ToRequestHeader(_timeProvider), nodesToWrite,\n                    context.Ct).ConfigureAwait(false);\n                var values = response.Validate(response.Results, s => s,\n                    response.DiagnosticInfos, nodesToWrite);\n                return new ValueWriteResponseModel\n                {\n                    ErrorInfo = values.ErrorInfo ?? values[0].ErrorInfo\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ReadResponseModel> ReadAsync(T endpoint,\n            ReadRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Attributes == null)\n            {\n                throw new ArgumentException(\"Missing attributes\", nameof(request));\n            }\n            if (request.Attributes.Any(a => string.IsNullOrEmpty(a.NodeId)))\n            {\n                throw new ArgumentException(\"Bad attributes\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"Read\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var requests = new ReadValueIdCollection(request.Attributes\n                    .Select(a => new ReadValueId\n                    {\n                        AttributeId = (uint)a.Attribute,\n                        NodeId = a.NodeId.ToNodeId(context.Session.MessageContext)\n                    }));\n                var response = await context.Session.Services.ReadAsync(\n                    request.Header.ToRequestHeader(_timeProvider), 0, Opc.Ua.TimestampsToReturn.Both,\n                    requests, context.Ct).ConfigureAwait(false);\n\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, requests);\n                if (results.ErrorInfo != null)\n                {\n                    return new ReadResponseModel\n                    {\n                        Results = Array.Empty<AttributeReadResponseModel>(),\n                        ErrorInfo = results.ErrorInfo\n                    };\n                }\n                return new ReadResponseModel\n                {\n                    Results = results\n                        .Select(result =>\n                        {\n                            return new AttributeReadResponseModel\n                            {\n                                Value = context.Session.Codec.Encode(result.Result.WrappedValue,\n                                    out var wellKnown),\n                                ErrorInfo = result.ErrorInfo\n                            };\n                        }).ToList()\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<WriteResponseModel> WriteAsync(T endpoint,\n            WriteRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Attributes == null)\n            {\n                throw new ArgumentException(\"Missing attributes\", nameof(request));\n            }\n            if (request.Attributes.Any(a => string.IsNullOrEmpty(a.NodeId)))\n            {\n                throw new ArgumentException(\"Missing node id in attributes\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"Write\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var requests = new WriteValueCollection(request.Attributes\n                    .Select(a => new WriteValue\n                    {\n                        AttributeId = (uint)a.Attribute,\n                        NodeId = a.NodeId.ToNodeId(context.Session.MessageContext),\n                        Value = new DataValue(context.Session.Codec.Decode(a.Value ?? VariantValue.Null,\n                            AttributeMap.GetBuiltInType((uint)a.Attribute)))\n                    }));\n                var response = await context.Session.Services.WriteAsync(\n                    request.Header.ToRequestHeader(_timeProvider), requests,\n                    context.Ct).ConfigureAwait(false);\n\n                var results = response.Validate(response.Results, s => s,\n                    response.DiagnosticInfos, requests);\n                if (results.ErrorInfo != null)\n                {\n                    return new WriteResponseModel\n                    {\n                        Results = Array.Empty<AttributeWriteResponseModel>(),\n                        ErrorInfo = results.ErrorInfo\n                    };\n                }\n                return new WriteResponseModel\n                {\n                    Results = results\n                        .Select(result =>\n                        {\n                            return new AttributeWriteResponseModel\n                            {\n                                ErrorInfo = result.ErrorInfo\n                            };\n                        }).ToList()\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryServerCapabilitiesModel> HistoryGetServerCapabilitiesAsync(\n            T endpoint, RequestHeaderModel? header, CancellationToken ct)\n        {\n            return _client.ExecuteAsync(endpoint, async context =>\n                await context.Session.GetHistoryCapabilitiesAsync(header.GetNamespaceFormat(_options),\n                context.Ct).ConfigureAwait(false), header, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryConfigurationResponseModel> HistoryGetConfigurationAsync(\n            T endpoint, HistoryConfigurationRequestModel request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.NodeId))\n            {\n                throw new ArgumentException(\"Bad node id missing\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"HistoryGetConfiguration\");\n            return await _client.ExecuteAsync(endpoint, async context =>\n            {\n                var nodeId = request.NodeId.ToNodeId(context.Session.MessageContext);\n                if (NodeId.IsNull(nodeId))\n                {\n                    throw new ArgumentException(\"Bad node id\", nameof(request));\n                }\n\n                // load the defaults for the historical configuration object.\n                var config =\n                    new HistoricalDataConfigurationState(null);\n                config.Definition =\n                    new PropertyState<string>(config);\n                config.MaxTimeInterval =\n                    new PropertyState<double>(config);\n                config.MinTimeInterval =\n                    new PropertyState<double>(config);\n                config.ExceptionDeviation =\n                    new PropertyState<double>(config);\n                config.ExceptionDeviationFormat =\n                    new PropertyState<ExceptionDeviationFormat>(config);\n                config.StartOfArchive =\n                    new PropertyState<DateTime>(config);\n                config.StartOfOnlineArchive =\n                    new PropertyState<DateTime>(config);\n                config.Stepped =\n                    new PropertyState<bool>(config);\n                config.ServerTimestampSupported =\n                    new PropertyState<bool>(config);\n                config.AggregateFunctions =\n                    new FolderState(config);\n\n                var aggregate = new AggregateConfigurationState(config);\n                aggregate.TreatUncertainAsBad =\n                    new PropertyState<bool>(aggregate);\n                aggregate.UseSlopedExtrapolation =\n                    new PropertyState<bool>(aggregate);\n                aggregate.PercentDataBad =\n                    new PropertyState<byte>(aggregate);\n                aggregate.PercentDataGood =\n                    new PropertyState<byte>(aggregate);\n                config.AggregateConfiguration =\n                    aggregate;\n\n                config.Create(context.Session.SystemContext, null,\n                    BrowseNames.HAConfiguration, null, false);\n\n                var relativePath = new RelativePath();\n                relativePath.Elements.Add(new RelativePathElement\n                {\n                    ReferenceTypeId = ReferenceTypeIds.HasHistoricalConfiguration,\n                    IsInverse = false,\n                    IncludeSubtypes = false,\n                    TargetName = BrowseNames.HAConfiguration\n                });\n                var errorInfo = await context.Session.ReadNodeStateAsync(\n                    request.Header.ToRequestHeader(_timeProvider), config,\n                    nodeId, relativePath, context.Ct).ConfigureAwait(false);\n                if (errorInfo != null)\n                {\n                    return new HistoryConfigurationResponseModel\n                    {\n                        ErrorInfo = errorInfo\n                    };\n                }\n                var startTime = config.StartOfOnlineArchive.GetValueOrDefaultEx()\n                    ?? config.StartOfArchive.GetValueOrDefaultEx();\n                if (startTime == null)\n                {\n                    startTime = await HistoryReadTimestampAsync(\n                        context.Session, request.Header, nodeId, true,\n                        _timeProvider, context.Ct).ConfigureAwait(false);\n                }\n                DateTime? endTime = null;\n                if (endTime == null)\n                {\n                    endTime = await HistoryReadTimestampAsync(\n                        context.Session, request.Header, nodeId, false,\n                        _timeProvider, context.Ct).ConfigureAwait(false);\n                }\n                var children = new List<BaseInstanceState>();\n                config.AggregateFunctions.GetChildren(context.Session.SystemContext, children);\n                var aggregateFunctions = children.OfType<BaseObjectState>().ToDictionary(\n                    c => request.Header.AsString(c.BrowseName, context.Session.MessageContext, _options),\n                    c => request.Header.AsString(c.NodeId, context.Session.MessageContext, _options));\n                return new HistoryConfigurationResponseModel\n                {\n                    Configuration = errorInfo != null ? null : new HistoryConfigurationModel\n                    {\n                        MinTimeInterval =\n                            config.MinTimeInterval.GetValueOrDefaultEx(\n                                v => v.HasValue && v.Value != 0 ?\n                                TimeSpan.FromMilliseconds(v.Value) : (TimeSpan?)null),\n                        MaxTimeInterval =\n                            config.MaxTimeInterval.GetValueOrDefaultEx(\n                                v => v.HasValue && v.Value != 0 ?\n                                TimeSpan.FromMilliseconds(v.Value) : (TimeSpan?)null),\n                        ExceptionDeviation =\n                            config.ExceptionDeviation.GetValueOrDefaultEx(),\n                        ExceptionDeviationType =\n                            config.ExceptionDeviationFormat.GetValueOrDefaultEx(\n                                v => v.ToExceptionDeviationType()),\n                        ServerTimestampSupported =\n                            config.ServerTimestampSupported.GetValueOrDefaultEx(),\n                        Stepped =\n                            config.Stepped.GetValueOrDefaultEx(),\n                        Definition =\n                            config.Definition.GetValueOrDefaultEx(),\n                        AggregateFunctions =\n                            aggregateFunctions.Count == 0 ? null : aggregateFunctions,\n                        AggregateConfiguration = new AggregateConfigurationModel\n                        {\n                            PercentDataBad =\n                                aggregate.PercentDataBad.GetValueOrDefaultEx(),\n                            PercentDataGood =\n                                aggregate.PercentDataGood.GetValueOrDefaultEx(),\n                            TreatUncertainAsBad =\n                                aggregate.TreatUncertainAsBad.GetValueOrDefaultEx(),\n                            UseSlopedExtrapolation =\n                                aggregate.UseSlopedExtrapolation.GetValueOrDefaultEx()\n                        },\n                        StartOfOnlineArchive = startTime ??\n                            config.StartOfOnlineArchive.GetValueOrDefaultEx(\n                                v => v == DateTime.MinValue ? startTime : v),\n                        StartOfArchive =\n                            config.StartOfArchive.GetValueOrDefaultEx(\n                                v => v == DateTime.MinValue ? startTime : v) ?? startTime,\n                        EndOfArchive = endTime\n                    }\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryReadResponseModel<VariantValue>> HistoryReadAsync(T endpoint,\n            HistoryReadRequestModel<VariantValue> request, CancellationToken ct)\n        {\n            return HistoryReadAsync(endpoint, request, (details, session) =>\n            {\n                var variant = session.Codec.Decode(details, BuiltInType.ExtensionObject);\n                if (variant.Value is not ExtensionObject extensionObject)\n                {\n                    throw new ArgumentException(\"Bad details\", nameof(request));\n                }\n                return extensionObject;\n            }, (details, session) => session.Codec.Encode(new Variant(details), out _), ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryReadNextResponseModel<VariantValue>> HistoryReadNextAsync(\n            T endpoint, HistoryReadNextRequestModel request, CancellationToken ct)\n        {\n            return HistoryReadNextAsync(endpoint, request,\n                (details, session) => session.Codec.Encode(new Variant(details), out _), ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryUpdateAsync(T endpoint,\n            HistoryUpdateRequestModel<VariantValue> request, CancellationToken ct)\n        {\n            return HistoryUpdateAsync(endpoint, request, (nodeId, details, session) =>\n            {\n                var variant = session.Codec.Decode(details, BuiltInType.ExtensionObject);\n                if (variant.Value is not ExtensionObject extensionObject)\n                {\n                    throw new ArgumentException(\"Bad details\", nameof(request));\n                }\n                if (extensionObject.Body is HistoryUpdateDetails updateDetails)\n                {\n                    updateDetails.NodeId = nodeId;\n                }\n                return Task.FromResult(extensionObject);\n            }, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<TResult>> HistoryReadAsync<TInput, TResult>(\n            T connectionId, HistoryReadRequestModel<TInput> request,\n            Func<TInput, IOpcUaSession, ExtensionObject> decode,\n            Func<ExtensionObject, IOpcUaSession, TResult> encode,\n            CancellationToken ct) where TInput : class where TResult : class\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Missing details\", nameof(request));\n            }\n            if (string.IsNullOrEmpty(request.NodeId) &&\n                (request.BrowsePath == null || request.BrowsePath.Count == 0))\n            {\n                throw new ArgumentException(\"Bad node id or browse path missing\",\n                    nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"HistoryRead\");\n            return await _client.ExecuteAsync(connectionId, async context =>\n            {\n                var nodeId = await context.Session.ResolveNodeIdAsync(request.Header, request.NodeId,\n                    request.BrowsePath, nameof(request.BrowsePath), _timeProvider,\n                    context.Ct).ConfigureAwait(false);\n                if (NodeId.IsNull(nodeId))\n                {\n                    throw new ArgumentException(\"Bad node id\", nameof(request));\n                }\n                var readDetails = decode(request.Details, context.Session);\n                var historytoread = new HistoryReadValueIdCollection\n                {\n                    new HistoryReadValueId\n                    {\n                        IndexRange = request.IndexRange,\n                        NodeId = nodeId,\n                        DataEncoding = null // TODO\n                    }\n                };\n                var response = await context.Session.Services.HistoryReadAsync(\n                    request.Header.ToRequestHeader(_timeProvider), readDetails,\n                    request.TimestampsToReturn.ToStackType(),\n                    false, historytoread, context.Ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, historytoread);\n                if (results.ErrorInfo != null)\n                {\n                    return new HistoryReadResponseModel<TResult>\n                    {\n                        History = null,\n                        ErrorInfo = results.ErrorInfo\n                    };\n                }\n\n                var history = encode(results[0].Result.HistoryData, context.Session);\n                var errorInfo = results[0].ErrorInfo;\n                if (errorInfo?.StatusCode == StatusCodes.GoodNoData &&\n                    history is Array array && array.Length > 0)\n                {\n                    errorInfo = null; // There is data, so fix up error\n                }\n                context.TrackedToken =\n                    results[0].Result.ContinuationPoint == null ||\n                    results[0].Result.ContinuationPoint.Length == 0 ? null :\n                    Convert.ToBase64String(results[0].Result.ContinuationPoint);\n                return new HistoryReadResponseModel<TResult>\n                {\n                    ContinuationToken = context.TrackedToken,\n                    History = history,\n                    ErrorInfo = errorInfo\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<TResult>> HistoryReadNextAsync<TResult>(\n            T connectionId, HistoryReadNextRequestModel request,\n            Func<ExtensionObject, IOpcUaSession, TResult> encode, CancellationToken ct)\n            where TResult : class\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.ContinuationToken))\n            {\n                throw new ArgumentException(\"Missing continuation\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"HistoryReadNext\");\n            return await _client.ExecuteAsync(connectionId, async context =>\n            {\n                var historytoread = new HistoryReadValueIdCollection\n                {\n                    new HistoryReadValueId\n                    {\n                        ContinuationPoint = Convert.FromBase64String(request.ContinuationToken),\n                        DataEncoding = null // TODO\n                    }\n                };\n                var response = await context.Session.Services.HistoryReadAsync(\n                    request.Header.ToRequestHeader(_timeProvider), null, Opc.Ua.TimestampsToReturn.Both,\n                    request.Abort ?? false, historytoread, context.Ct).ConfigureAwait(false);\n                context.UntrackedToken = request.ContinuationToken;\n\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, historytoread);\n                if (results.ErrorInfo != null)\n                {\n                    return new HistoryReadNextResponseModel<TResult>\n                    {\n                        History = null,\n                        ErrorInfo = results.ErrorInfo\n                    };\n                }\n                var history = encode(results[0].Result.HistoryData, context.Session);\n                var errorInfo = results[0].ErrorInfo;\n                if (errorInfo?.StatusCode == StatusCodes.GoodNoData &&\n                    history is Array array && array.Length > 0)\n                {\n                    errorInfo = null; // There is data, so fix up error\n                }\n                context.TrackedToken =\n                    results[0].Result.ContinuationPoint == null ||\n                    results[0].Result.ContinuationPoint.Length == 0 ? null :\n                    Convert.ToBase64String(results[0].Result.ContinuationPoint);\n                return new HistoryReadNextResponseModel<TResult>\n                {\n                    ContinuationToken = context.TrackedToken,\n                    History = history,\n                    ErrorInfo = errorInfo\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryUpdateAsync<TInput>(\n            T connectionId, HistoryUpdateRequestModel<TInput> request,\n            Func<NodeId, TInput, IOpcUaSession, Task<ExtensionObject>> decode,\n            CancellationToken ct) where TInput : class\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Missing details\", nameof(request));\n            }\n            using var trace = _activitySource.StartActivity(\"HistoryUpdate\");\n            return await _client.ExecuteAsync(connectionId, async context =>\n            {\n                var nodeId = await context.Session.ResolveNodeIdAsync(request.Header,\n                    request.NodeId, request.BrowsePath, nameof(request.BrowsePath),\n                    _timeProvider, context.Ct).ConfigureAwait(false);\n                // Update the node id to target based on the request\n                if (NodeId.IsNull(nodeId))\n                {\n                    throw new ArgumentException(\"Missing node id\", nameof(request));\n                }\n                var details = await decode(nodeId, request.Details,\n                    context.Session).ConfigureAwait(false);\n                if (details == null)\n                {\n                    throw new ArgumentException(\"Bad details\", nameof(request));\n                }\n                var updates = new ExtensionObjectCollection { details };\n                var response = await context.Session.Services.HistoryUpdateAsync(\n                    request.Header.ToRequestHeader(_timeProvider), updates,\n                    context.Ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, updates);\n                if (results.ErrorInfo != null)\n                {\n                    return new HistoryUpdateResponseModel { ErrorInfo = results.ErrorInfo };\n                }\n                var inner = response.Validate(response.Results[0].OperationResults, s => s,\n                    response.Results[0].DiagnosticInfos);\n                return new HistoryUpdateResponseModel\n                {\n                    Results = inner.Select(r => r.ResultInfo).ToList(),\n                    ErrorInfo = inner.ErrorInfo\n                };\n            }, request.Header, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Add references\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"targetNodesOnly\"></param>\n        /// <param name=\"readValues\"></param>\n        /// <param name=\"rawMode\"></param>\n        /// <param name=\"result\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        /// <param name=\"references\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task<string?> AddReferencesToBrowseResultAsync(IOpcUaSession session,\n            RequestHeaderModel? header, bool targetNodesOnly, bool readValues,\n            bool rawMode, List<NodeReferenceModel> result, byte[] continuationPoint,\n            List<ReferenceDescription> references, CancellationToken ct)\n        {\n            if (references == null)\n            {\n                return null;\n            }\n            foreach (var reference in references)\n            {\n                try\n                {\n                    var nodeId = reference.NodeId.ToNodeId(session.MessageContext.NamespaceUris);\n                    var id = header.AsString(nodeId, session.MessageContext, _options);\n                    if (targetNodesOnly && result.Any(r => r.Target.NodeId == id))\n                    {\n                        continue;\n                    }\n                    bool? children = null;\n                    if (!rawMode)\n                    {\n                        // Check for children\n                        try\n                        {\n                            var browseDescriptions = new BrowseDescriptionCollection {\n                                new BrowseDescription {\n                                    BrowseDirection = Opc.Ua.BrowseDirection.Forward,\n                                    IncludeSubtypes = true,\n                                    NodeClassMask = 0,\n                                    NodeId = nodeId,\n                                    ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,\n                                    ResultMask = (uint)BrowseResultMask.All\n                                }\n                            };\n                            var response = await session.Services.BrowseAsync(\n                                header.ToRequestHeader(_timeProvider), null, 1,\n                                browseDescriptions, ct).ConfigureAwait(false);\n                            Debug.Assert(response != null);\n                            var results = response.Validate(response.Results, r => r.StatusCode,\n                                response.DiagnosticInfos, browseDescriptions);\n                            if (results.ErrorInfo == null && results.Count > 0)\n                            {\n                                children = results[0].Result.References.Count != 0;\n                                if (results[0].Result.ContinuationPoint != null)\n                                {\n                                    await session.Services.BrowseNextAsync(header.ToRequestHeader(_timeProvider),\n                                        true,\n                                        [\n                                            response.Results[0].ContinuationPoint\n                                        ], ct: ct).ConfigureAwait(false);\n                                }\n                            }\n                        }\n                        catch (Exception ex) when (ex is not OperationCanceledException)\n                        {\n                            _logger.BrowseStreamChildInfoFailed(ex);\n                        }\n                    }\n                    var (model, _) = await session.ReadNodeAsync(header.ToRequestHeader(_timeProvider), nodeId,\n                        reference.NodeClass, !readValues, rawMode, header.GetNamespaceFormat(_options),\n                        children, ct).ConfigureAwait(false);\n                    if (rawMode)\n                    {\n                        model = model with\n                        {\n                            BrowseName = header.AsString(reference.BrowseName,\n                                session.MessageContext, _options),\n                            DisplayName = reference.DisplayName?.ToString()\n                        };\n                    }\n                    model = model with\n                    {\n                        TypeDefinitionId = header.AsString(reference.TypeDefinition,\n                            session.MessageContext, _options)\n                    };\n                    if (targetNodesOnly)\n                    {\n                        result.Add(new NodeReferenceModel { Target = model });\n                        continue;\n                    }\n                    result.Add(new NodeReferenceModel\n                    {\n                        ReferenceTypeId = header.AsString(reference.ReferenceTypeId,\n                            session.MessageContext, _options),\n                        Direction = reference.IsForward ?\n                            BrowseDirection.Forward : BrowseDirection.Backward,\n                        Target = model\n                    });\n                }\n                catch\n                {\n                    // TODO: Add trace result for trace.\n                }\n            }\n            return continuationPoint?.ToBase64String();\n        }\n\n        /// <summary>\n        /// Add targets\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"readValues\"></param>\n        /// <param name=\"rawMode\"></param>\n        /// <param name=\"result\"></param>\n        /// <param name=\"targets\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task AddTargetsToBrowseResultAsync(IOpcUaSession session,\n            RequestHeaderModel? header, bool readValues, bool rawMode,\n            List<NodePathTargetModel> result, BrowsePathTargetCollection targets,\n            string[] path, CancellationToken ct)\n        {\n            if (targets != null)\n            {\n                foreach (var target in targets)\n                {\n                    try\n                    {\n                        var nodeId = target.TargetId.ToNodeId(session.MessageContext.NamespaceUris);\n                        var (model, _) = await session.ReadNodeAsync(header.ToRequestHeader(_timeProvider),\n                            nodeId, null, !readValues, rawMode, header.GetNamespaceFormat(_options), false,\n                            ct).ConfigureAwait(false);\n                        result.Add(new NodePathTargetModel\n                        {\n                            BrowsePath = path,\n                            Target = model,\n                            RemainingPathIndex = target.RemainingPathIndex == 0 ?\n                                null : (int)target.RemainingPathIndex\n                        });\n                    }\n                    catch\n                    {\n                        // Skip node - TODO: Should we add a failure\n                        // reference into the yet unused trace instead?\n                        continue;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Reads the first or last date of the archive\n        /// (truncates milliseconds).\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"first\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private static async Task<DateTime?> HistoryReadTimestampAsync(\n            IOpcUaSession session, RequestHeaderModel? header, NodeId nodeId,\n            bool first, TimeProvider timeProvider, CancellationToken ct)\n        {\n            // do it the hard way (may take a long time with some servers).\n            var nodesToRead = new HistoryReadValueIdCollection {\n                new HistoryReadValueId {\n                    NodeId = nodeId\n                }\n            };\n            var details = new ExtensionObject(new ReadRawModifiedDetails\n            {\n                StartTime = first ? new DateTime(1970, 1, 1) : DateTime.MinValue,\n                EndTime = first ? DateTime.MinValue : timeProvider.GetUtcNow().AddDays(1).UtcDateTime,\n                NumValuesPerNode = 1,\n                IsReadModified = false,\n                ReturnBounds = false\n            });\n            var response = await session.Services.HistoryReadAsync(header.ToRequestHeader(timeProvider),\n                details, Opc.Ua.TimestampsToReturn.Source, false,\n                nodesToRead, ct).ConfigureAwait(false);\n            var results = response.Validate(response.Results, s => s.StatusCode,\n                response.DiagnosticInfos, nodesToRead);\n            try\n            {\n                if (StatusCode.IsBad(results.StatusCode) ||\n                    StatusCode.IsBad(results[0].StatusCode) ||\n                    ExtensionObject.ToEncodeable(results[0].Result.HistoryData)\n                        is not HistoryData historyData)\n                {\n                    return null;\n                }\n                var date = historyData.DataValues[0].SourceTimestamp;\n                date = new DateTime(date.Year, date.Month,\n                    date.Day, date.Hour, date.Minute,\n                    date.Second, 0, DateTimeKind.Utc);\n                return !first ? date.AddSeconds(1) : date;\n            }\n            finally\n            {\n                // Abort read if needed\n                if (results[0].Result.ContinuationPoint?.Length > 0)\n                {\n                    nodesToRead = [\n                        new HistoryReadValueId {\n                            NodeId = nodeId,\n                            ContinuationPoint = results[0].Result.ContinuationPoint\n                        }\n                    ];\n                    await session.Services.HistoryReadAsync(header.ToRequestHeader(timeProvider),\n                        details, Opc.Ua.TimestampsToReturn.Source, true,\n                        nodesToRead, ct).ConfigureAwait(false);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Browse stream helper class\n        /// </summary>\n        internal sealed class BrowseStream : AsyncEnumerableEnumerableStack<BrowseStreamChunkModel>\n        {\n            /// <summary>\n            /// Create browse stream helper\n            /// </summary>\n            /// <param name=\"request\"></param>\n            /// <param name=\"options\"></param>\n            /// <param name=\"activitySource\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"timeProvider\"></param>\n            /// <param name=\"ct\"></param>\n            public BrowseStream(BrowseStreamRequestModel request, IOptions<PublisherOptions> options,\n                ActivitySource activitySource, ILogger logger, TimeProvider timeProvider,\n                CancellationToken ct)\n            {\n                _activitySource = activitySource;\n                _sw = Stopwatch.StartNew();\n                _logger = logger;\n                _timeProvider = timeProvider;\n                _options = options;\n                _ct = ct;\n                _request = request;\n            }\n\n            /// <inheritdoc/>\n            public override void Reset()\n            {\n                base.Reset();\n                Push(ReadNodeAsync);\n            }\n\n            /// <summary>\n            /// Read node\n            /// </summary>\n            /// <param name=\"context\"></param>\n            /// <returns></returns>\n            private async ValueTask<IEnumerable<BrowseStreamChunkModel>> ReadNodeAsync(\n                ServiceCallContext context)\n            {\n                using var trace = _activitySource.StartActivity(\"ReadNode\");\n\n                // Lazy initialize to capture session context\n                if (_nodeIds == null)\n                {\n                    // Initialize\n                    _nodeIds = _request.NodeIds == null ? [] : _request.NodeIds\n                        .Select(n => n.ToNodeId(context.Session.MessageContext))\n                        .Where(n => !NodeId.IsNull(n))\n                        .ToArray();\n                    if (_nodeIds.Length == 0)\n                    {\n                        _browseStack.Push(ObjectIds.RootFolder);\n                    }\n                    else\n                    {\n                        foreach (var resolvedId in _nodeIds)\n                        {\n                            _browseStack.Push(resolvedId);\n                        }\n                    }\n                }\n\n                BrowseStreamChunkModel? chunk = null;\n                var nodeId = PopNode();\n                if (nodeId == null)\n                {\n                    // Done - no more nodes on the browse stack to browse\n                    _logger.BrowseStreamSummary(_nodes, _references, _sw.Elapsed);\n                    return [];\n                }\n\n                var (node, errorInfo) = await context.Session.ReadNodeAsync(\n                    _request.Header.ToRequestHeader(_timeProvider), nodeId,\n                    _request.Header.GetNamespaceFormat(_options), null,\n                    !(_request.ReadVariableValues ?? false), null, _ct).ConfigureAwait(false);\n\n                _visited.Add(nodeId); // Mark as visited\n\n                var id = _request.Header.AsString(nodeId, context.Session.MessageContext, _options);\n                if (id == null)\n                {\n                    return [];\n                }\n\n                chunk = new BrowseStreamChunkModel\n                {\n                    SourceId = id,\n                    Attributes = node,\n                    Reference = null,\n                    ErrorInfo = errorInfo\n                };\n                _nodes++;\n\n                // Browse the node now\n                Push(context => BrowseAsync(context, id, nodeId));\n\n                // Read another node from the browse stack\n                Push(ReadNodeAsync);\n                return chunk.YieldReturn();\n            }\n\n            /// <summary>\n            /// Browse references\n            /// </summary>\n            /// <param name=\"context\"></param>\n            /// <param name=\"sourceId\"></param>\n            /// <param name=\"nodeId\"></param>\n            /// <returns></returns>\n            private async ValueTask<IEnumerable<BrowseStreamChunkModel>> BrowseAsync(\n                ServiceCallContext context, string sourceId, NodeId nodeId)\n            {\n                using var trace = _activitySource.StartActivity(\"Browse\");\n\n                if (_typeId == null)\n                {\n                    _typeId = _request.ReferenceTypeId.ToNodeId(context.Session.MessageContext);\n                    if (NodeId.IsNull(_typeId))\n                    {\n                        _typeId = ReferenceTypeIds.HierarchicalReferences;\n                    }\n                }\n                _view ??= _request.View.ToStackModel(context.Session.MessageContext);\n                var browseDescriptions = new BrowseDescriptionCollection\n                {\n                    new BrowseDescription\n                    {\n                        BrowseDirection = (_request.Direction ?? BrowseDirection.Both)\n                            .ToStackType(),\n                        IncludeSubtypes = !(_request.NoSubtypes ?? false),\n                        NodeClassMask = (uint)_request.NodeClassFilter.ToStackMask(),\n                        NodeId = nodeId,\n                        ReferenceTypeId = _typeId,\n                        ResultMask = (uint)BrowseResultMask.All\n                    }\n                };\n                // Browse and read children\n                var response = await context.Session.Services.BrowseAsync(\n                    _request.Header.ToRequestHeader(_timeProvider),\n                    ViewDescription.IsDefault(_view) ? null : _view, 0,\n                    browseDescriptions, _ct).ConfigureAwait(false);\n\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, browseDescriptions);\n                if (results.ErrorInfo != null)\n                {\n                    var chunk = new BrowseStreamChunkModel\n                    {\n                        SourceId = sourceId,\n                        ErrorInfo = results.ErrorInfo\n                    };\n                    return chunk.YieldReturn();\n                }\n                var refs = CollectReferences(context.Session, sourceId,\n                    results[0].Result.References, results[0].ErrorInfo,\n                    _request.NoRecurse ?? false);\n                var continuation = results[0].Result.ContinuationPoint ?? [];\n                if (continuation.Length > 0)\n                {\n                    Push(context => BrowseNextAsync(context, sourceId, continuation));\n                }\n                else\n                {\n                    // Read another node from the browse stack\n                    Push(ReadNodeAsync);\n                }\n                return refs;\n            }\n\n            /// <summary>\n            /// Browse remainder of references\n            /// </summary>\n            /// <param name=\"context\"></param>\n            /// <param name=\"sourceId\"></param>\n            /// <param name=\"continuationPoint\"></param>\n            /// <returns></returns>\n            private async ValueTask<IEnumerable<BrowseStreamChunkModel>> BrowseNextAsync(\n                ServiceCallContext context, string sourceId, byte[] continuationPoint)\n            {\n                using var trace = _activitySource.StartActivity(\"BrowseNext\");\n\n                var continuationPoints = new ByteStringCollection { continuationPoint };\n                var response = await context.Session.Services.BrowseNextAsync(\n                    _request.Header.ToRequestHeader(_timeProvider), false, continuationPoints,\n                    _ct).ConfigureAwait(false);\n\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, continuationPoints);\n                if (results.ErrorInfo != null)\n                {\n                    var chunk = new BrowseStreamChunkModel\n                    {\n                        SourceId = sourceId,\n                        ErrorInfo = results.ErrorInfo\n                    };\n                    return chunk.YieldReturn();\n                }\n\n                var refs = CollectReferences(context.Session, sourceId,\n                    results[0].Result.References, results[0].ErrorInfo,\n                    _request.NoRecurse ?? false);\n\n                var continuation = results[0].Result.ContinuationPoint ?? [];\n                if (continuation.Length > 0)\n                {\n                    Push(session => BrowseNextAsync(session, sourceId, continuation));\n                }\n                else\n                {\n                    // Read another node from the browse stack\n                    Push(ReadNodeAsync);\n                }\n                return refs;\n            }\n\n            /// <summary>\n            /// Helper to push nodes onto the browse stack\n            /// </summary>\n            /// <param name=\"nodeId\"></param>\n            private void PushNode(ExpandedNodeId nodeId)\n            {\n                if ((nodeId?.ServerIndex ?? 1u) != 0)\n                {\n                    return;\n                }\n                var local = (NodeId)nodeId;\n                if (!NodeId.IsNull(local) && !_visited.Contains(local))\n                {\n                    _browseStack.Push(local);\n                }\n            }\n\n            /// <summary>\n            /// Helper to pop nodes from the browse stack\n            /// </summary>\n            /// <returns></returns>\n            private NodeId? PopNode()\n            {\n                while (_browseStack.TryPop(out var nodeId))\n                {\n                    if (!NodeId.IsNull(nodeId) && !_visited.Contains(nodeId))\n                    {\n                        return nodeId;\n                    }\n                }\n                return null;\n            }\n\n            /// <summary>\n            /// Collect references\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"sourceId\"></param>\n            /// <param name=\"refs\"></param>\n            /// <param name=\"errorInfo\"></param>\n            /// <param name=\"noRecurse\"></param>\n            /// <returns></returns>\n            private IEnumerable<BrowseStreamChunkModel> CollectReferences(\n                IOpcUaSession session, string sourceId, ReferenceDescriptionCollection refs,\n                ServiceResultModel? errorInfo, bool noRecurse)\n            {\n                foreach (var reference in refs)\n                {\n                    if (!noRecurse)\n                    {\n                        PushNode(reference.NodeId);\n                        PushNode(reference.ReferenceTypeId);\n                        PushNode(reference.TypeDefinition);\n                    }\n\n                    _references++;\n\n                    var id = _request.Header.AsString(reference.NodeId, session.MessageContext,\n                        _options);\n                    if (id == null)\n                    {\n                        continue;\n                    }\n                    yield return new BrowseStreamChunkModel\n                    {\n                        SourceId = sourceId,\n                        ErrorInfo = errorInfo,\n                        Reference = new NodeReferenceModel\n                        {\n                            ReferenceTypeId = _request.Header.AsString(reference.ReferenceTypeId,\n                                session.MessageContext, _options),\n                            Direction = reference.IsForward ?\n                                BrowseDirection.Forward : BrowseDirection.Backward,\n                            Target = new NodeModel\n                            {\n                                NodeId = id,\n                                DisplayName = reference.DisplayName?.ToString(),\n                                TypeDefinitionId = _request.Header.AsString(reference.TypeDefinition,\n                                    session.MessageContext, _options),\n                                BrowseName = _request.Header.AsString(reference.BrowseName,\n                                    session.MessageContext, _options)\n                            }\n                        }\n                    };\n                }\n            }\n\n            private readonly Stack<NodeId> _browseStack = new();\n            private readonly HashSet<NodeId> _visited = [];\n            private int _nodes;\n            private int _references;\n            private NodeId? _typeId;\n            private NodeId[]? _nodeIds;\n            private ViewDescription? _view;\n            private readonly Stopwatch _sw;\n            private readonly BrowseStreamRequestModel _request;\n            private readonly ILogger _logger;\n            private readonly TimeProvider _timeProvider;\n            private readonly IOptions<PublisherOptions> _options;\n            private readonly CancellationToken _ct;\n            private readonly ActivitySource _activitySource;\n        }\n\n        private readonly ActivitySource _activitySource = Diagnostics.NewActivitySource();\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly TimeProvider _timeProvider;\n        private readonly IFilterParser _parser;\n        private readonly IOpcUaClientManager<T> _client;\n        private readonly ILogger _logger;\n    }\n\n    internal static partial class NodeServicesLogging\n    {\n        private const int EventClass = 220;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Browsed {Nodes} nodes and {References} references in address space in {Elapsed}...\")]\n        public static partial void BrowseStreamSummary(this ILogger logger, int Nodes, int References, TimeSpan Elapsed);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Failed to obtain child information\")]\n        public static partial void BrowseStreamChildInfoFailed(this ILogger logger, Exception exception);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/PublishedNodesJsonServices.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Storage;\n    using Autofac;\n    using Furly;\n    using Furly.Exceptions;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.IO;\n    using System.Linq;\n    using System.Security.Cryptography;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Channels;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Provides configuration services for publisher using either published nodes\n    /// configuration update or api services.\n    /// </summary>\n    public sealed class PublishedNodesJsonServices : IPublishedNodesServices,\n        IAwaitable<PublishedNodesJsonServices>, IAsyncDisposable, IDisposable\n    {\n        /// <summary>\n        /// Create publisher configuration services\n        /// </summary>\n        /// <param name=\"publishedNodesJobConverter\"></param>\n        /// <param name=\"publisherHost\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"publishedNodesProvider\"></param>\n        /// <param name=\"jsonSerializer\"></param>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public PublishedNodesJsonServices(PublishedNodesConverter publishedNodesJobConverter,\n            IPublisher publisherHost, ILogger<PublishedNodesJsonServices> logger,\n            IStorageProvider publishedNodesProvider, IJsonSerializer jsonSerializer,\n            IDiagnosticCollector? diagnostics = null, TimeProvider? timeProvider = null)\n        {\n            _publishedNodesJobConverter = publishedNodesJobConverter;\n            _logger = logger;\n            _publishedNodesProvider = publishedNodesProvider;\n            _jsonSerializer = jsonSerializer;\n            _publisherHost = publisherHost;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _diagnostics = diagnostics; // Optional\n            _started = new TaskCompletionSource();\n            _fileChanges = Channel.CreateUnbounded<bool>(new UnboundedChannelOptions\n            {\n                SingleReader = true,\n                SingleWriter = false\n            });\n            _fileChangeProcessor = Task.Factory.StartNew(ProcessFileChangesAsync,\n                default, TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap();\n            _fileChanges.Writer.TryWrite(false); // Read from file\n        }\n\n        /// <inheritdoc/>\n        public async Task CreateOrUpdateDataSetWriterEntryAsync(\n            PublishedNodesEntryModel entry, CancellationToken ct = default)\n        {\n            if (string.IsNullOrWhiteSpace(entry.EndpointUrl))\n            {\n                throw new BadRequestException(kNullOrEmptyEndpointUrl);\n            }\n            entry.DataSetWriterGroup ??= string.Empty;\n            entry.DataSetWriterId ??= string.Empty;\n            if (entry.OpcNodes != null)\n            {\n                entry.OpcNodes = ValidateNodes(entry.OpcNodes, true);\n            }\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                var newNodes = currentNodes\n                    .Where(e =>\n                        !((e.DataSetWriterGroup ?? string.Empty) == entry.DataSetWriterGroup &&\n                          (e.DataSetWriterId ?? string.Empty) == entry.DataSetWriterId))\n                    .ToList();\n                if (newNodes.Count >= currentNodes.Count - 1)\n                {\n                    newNodes.Add(entry);\n                }\n                else\n                {\n                    throw new ResourceInvalidStateException(\n                        kAmbiguousResultsMessage);\n                }\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(newNodes);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishedNodesEntryModel> GetDataSetWriterEntryAsync(\n            string writerGroupId, string dataSetWriterId, CancellationToken ct = default)\n        {\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                return Find(writerGroupId, dataSetWriterId, GetCurrentPublishedNodes()) with\n                {\n                    OpcNodes = null\n                };\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task AddOrUpdateNodesAsync(string writerGroupId,\n            string dataSetWriterId, IReadOnlyList<OpcNodeModel> nodes,\n            string? insertAfterFieldId = null, CancellationToken ct = default)\n        {\n            var opcNodes = ValidateNodes([.. nodes], true);\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                var entry = Find(writerGroupId, dataSetWriterId, currentNodes);\n                entry.OpcNodes ??= [];\n\n                var insertAt = -1;\n                if (insertAfterFieldId != null)\n                {\n                    var offset = entry.OpcNodes\n                        .FirstOrDefault(n => n.DataSetFieldId == insertAfterFieldId);\n                    if (offset == null)\n                    {\n                        throw new ResourceNotFoundException(\n                            \"Field to insert after not found.\");\n                    }\n                    insertAt = entry.OpcNodes.IndexOf(offset);\n                    if (++insertAt == entry.OpcNodes.Count)\n                    {\n                        insertAt = -1;\n                    }\n                }\n\n                foreach (var node in opcNodes)\n                {\n                    var existing = entry.OpcNodes\n                        .FirstOrDefault(n => n.DataSetFieldId == node.DataSetFieldId);\n                    if (existing != null)\n                    {\n                        // Replace existing\n                        var index = entry.OpcNodes.IndexOf(existing);\n                        entry.OpcNodes[index] = node;\n                    }\n                    else if (insertAt != -1)\n                    {\n                        // Insert after\n                        entry.OpcNodes.Insert(insertAt++, node);\n                    }\n                    else\n                    {\n                        // at end\n                        entry.OpcNodes.Add(node);\n                    }\n                }\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(currentNodes);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task RemoveNodesAsync(string writerGroupId, string dataSetWriterId,\n            IReadOnlyList<string> dataSetFieldIds, CancellationToken ct = default)\n        {\n            if (dataSetFieldIds.Count == 0)\n            {\n                throw new BadRequestException(\"Field ids must be specified.\");\n            }\n            var set = dataSetFieldIds.ToHashSet();\n            if (set.Count != dataSetFieldIds.Count)\n            {\n                throw new BadRequestException(\"Field ids must be unique.\");\n            }\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                var entry = Find(writerGroupId, dataSetWriterId, currentNodes);\n                if (entry.OpcNodes == null || entry.OpcNodes.Count == 0)\n                {\n                    throw new ResourceNotFoundException(\"No nodes in dataset.\");\n                }\n                var newNodes = entry.OpcNodes\n                    .Where(n => !set.Contains(n.DataSetFieldId ?? string.Empty))\n                    .ToList();\n                if (newNodes.Count == entry.OpcNodes.Count)\n                {\n                    throw new ResourceNotFoundException(\n                        $\"Specified {(dataSetFieldIds.Count == 1 ? \"node\" : \"nodes\")} \" +\n                        \"not found in dataset\");\n                }\n                entry.OpcNodes = newNodes;\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(currentNodes);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<OpcNodeModel> GetNodeAsync(string writerGroupId,\n            string dataSetWriterId, string dataSetFieldId, CancellationToken ct = default)\n        {\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                var entry = Find(writerGroupId, dataSetWriterId, currentNodes);\n                var node = entry.OpcNodes?.FirstOrDefault(n => n.DataSetFieldId == dataSetFieldId);\n                if (node == null)\n                {\n                    throw new ResourceNotFoundException(\n                        $\"Node with id {dataSetFieldId.ReplaceLineEndings()} not found.\");\n                }\n                return node;\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<IReadOnlyList<OpcNodeModel>> GetNodesAsync(string writerGroupId,\n            string dataSetWriterId, string? dataSetFieldId = null, int? count = null,\n            CancellationToken ct = default)\n        {\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                var entry = Find(writerGroupId, dataSetWriterId, currentNodes);\n                if (entry.OpcNodes == null)\n                {\n                    return Array.Empty<OpcNodeModel>();\n                }\n\n                IEnumerable<OpcNodeModel> result = entry.OpcNodes;\n                if (dataSetFieldId != null)\n                {\n                    result = result\n                        .SkipWhile(n => dataSetFieldId != n.DataSetFieldId)\n                        .Skip(1); // Skip the found one and get the one after\n                }\n                if (count != null)\n                {\n                    result = result.Take(count.Value);\n                }\n                return result.ToList();\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task RemoveDataSetWriterEntryAsync(string writerGroupId,\n            string dataSetWriterId, bool force = false, CancellationToken ct = default)\n        {\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                if (!force)\n                {\n                    var remove = Find(writerGroupId, dataSetWriterId, currentNodes);\n                    currentNodes.Remove(remove);\n                }\n                else\n                {\n                    currentNodes.RemoveAll(e =>\n                        (e.DataSetWriterGroup ?? string.Empty) == writerGroupId &&\n                        (e.DataSetWriterId ?? string.Empty) == dataSetWriterId);\n                }\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(currentNodes);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishStartResponseModel> PublishStartAsync(ConnectionModel endpoint,\n            PublishStartRequestModel request, CancellationToken ct = default)\n        {\n            if (request.Item?.NodeId is null)\n            {\n                throw new BadRequestException(kNullOrEmptyOpcNodesMessage);\n            }\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var entry = endpoint.ToPublishedNodesEntry();\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                AddItem(currentNodes, entry, request.Item);\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(currentNodes);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n                return new PublishStartResponseModel();\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishStopResponseModel> PublishStopAsync(ConnectionModel endpoint,\n            PublishStopRequestModel request, CancellationToken ct = default)\n        {\n            if (request.NodeId is null)\n            {\n                throw new BadRequestException(kNullOrEmptyOpcNodesMessage);\n            }\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                var entry = endpoint.ToPublishedNodesEntry();\n                foreach (var nodeset in currentNodes.Where(n => n.HasSameDataSet(entry)))\n                {\n                    nodeset.OpcNodes = nodeset.OpcNodes?.Where(n => n.Id != request.NodeId).ToList();\n                }\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(currentNodes);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n                return new PublishStopResponseModel();\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishBulkResponseModel> PublishBulkAsync(ConnectionModel endpoint,\n            PublishBulkRequestModel request, CancellationToken ct = default)\n        {\n            if (request.NodesToAdd is null && request.NodesToRemove is null)\n            {\n                throw new BadRequestException(kNullOrEmptyOpcNodesMessage);\n            }\n            if ((request.NodesToRemove?.Any(n => n == null) ?? false) ||\n                (request.NodesToAdd?.Any(n => n.NodeId == null) ?? false))\n            {\n                throw new BadRequestException(kNullOrEmptyOpcNodesMessage);\n            }\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                var entry = endpoint.ToPublishedNodesEntry();\n                // Remove all nodes\n                if (request.NodesToRemove != null)\n                {\n                    foreach (var nodeset in currentNodes.Where(n => n.HasSameDataSet(entry)))\n                    {\n                        nodeset.OpcNodes = nodeset.OpcNodes?\n                            .Where(n => !request.NodesToRemove.Contains(n.Id!))\n                            .ToList();\n                    }\n                }\n                if (request.NodesToAdd != null)\n                {\n                    foreach (var item in request.NodesToAdd)\n                    {\n                        AddItem(currentNodes, entry, item);\n                    }\n                }\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(currentNodes);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n                return new PublishBulkResponseModel();\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishedItemListResponseModel> PublishListAsync(ConnectionModel endpoint,\n            PublishedItemListRequestModel request, CancellationToken ct = default)\n        {\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var entry = endpoint.ToPublishedNodesEntry();\n                var entries = GetCurrentPublishedNodes().ToList();\n                return new PublishedItemListResponseModel\n                {\n                    Items = entries\n                        .Where(n => n.HasSameDataSet(entry))\n                        .SelectMany(n => n.OpcNodes ?? [])\n                        .Where(n => n.EventFilter == null) // Exclude event filtering\n                        .Select(n => new PublishedItemModel\n                        {\n                            NodeId = n.Id ?? string.Empty,\n                            DisplayName = n.DisplayName,\n                            HeartbeatInterval = n.HeartbeatIntervalTimespan,\n                            PublishingInterval = n.OpcPublishingIntervalTimespan,\n                            SamplingInterval = n.OpcSamplingIntervalTimespan\n                        })\n                        .ToList()\n                };\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task PublishNodesAsync(PublishedNodesEntryModel request,\n            CancellationToken ct = default)\n        {\n            if (request.OpcNodes is null || request.OpcNodes.Count == 0)\n            {\n                throw new BadRequestException(kNullOrEmptyOpcNodesMessage);\n            }\n            if (string.IsNullOrWhiteSpace(request.EndpointUrl))\n            {\n                throw new BadRequestException(kNullOrEmptyEndpointUrl);\n            }\n            request.OpcNodes = ValidateNodes(request.OpcNodes, false);\n            request.PropagatePublishingIntervalToNodes();\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var dataSetFound = false;\n                var existingGroups = new List<PublishedNodesEntryModel>();\n                foreach (var entry in GetCurrentPublishedNodes())\n                {\n                    if (entry.HasSameWriterGroup(request))\n                    {\n                        // We may have several entries with the same DataSetGroup definition,\n                        // so we will add nodes only if the whole DataSet definition matches.\n                        if (entry.HasSameDataSet(request))\n                        {\n                            // Create HashSet of nodes for this entry.\n                            var existingNodesSet = new HashSet<OpcNodeModel>(OpcNodeModelEx.Comparer);\n                            entry.OpcNodes ??= [];\n                            existingNodesSet.UnionWith(entry.OpcNodes);\n\n                            foreach (var nodeToAdd in request.OpcNodes)\n                            {\n                                if (!existingNodesSet.Contains(nodeToAdd))\n                                {\n                                    entry.OpcNodes.Add(nodeToAdd);\n                                    existingNodesSet.Add(nodeToAdd);\n                                }\n                                else\n                                {\n                                    _logger.NodeAlreadyPresent(nodeToAdd.Id, entry.EndpointUrl);\n                                }\n                            }\n                            dataSetFound = true;\n                        }\n                        existingGroups.Add(entry);\n                    }\n                }\n                if (!dataSetFound)\n                {\n                    existingGroups.Add(request);\n                }\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(existingGroups);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task UnpublishNodesAsync(PublishedNodesEntryModel request,\n            CancellationToken ct = default)\n        {\n            //\n            // When no node is specified then remove the whole data set.\n            // This behavior ensures backwards compatibility with UnpublishNodes\n            // direct method of OPC Publisher 2.5.x.\n            //\n            request.PropagatePublishingIntervalToNodes();\n            var purgeDataSet = request.OpcNodes is null || request.OpcNodes.Count == 0;\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                // Create HashSet of nodes to remove.\n                var nodesToRemoveSet = new HashSet<OpcNodeModel>(OpcNodeModelEx.Comparer);\n                if (!purgeDataSet && request.OpcNodes != null)\n                {\n                    nodesToRemoveSet.UnionWith(request.OpcNodes);\n                }\n                var currentNodes = GetCurrentPublishedNodes().ToList();\n                // Perform first pass to determine if we can find all nodes to remove.\n                var matchingGroups = new List<PublishedNodesEntryModel>();\n                foreach (var entry in currentNodes)\n                {\n                    // We may have several entries with the same DataSetGroup definition,\n                    // so we will remove nodes only if the whole DataSet definition matches.\n                    if (entry.HasSameDataSet(request))\n                    {\n                        if (entry.OpcNodes != null)\n                        {\n                            foreach (var node in entry.OpcNodes)\n                            {\n                                nodesToRemoveSet.Remove(node);\n                            }\n                        }\n                        matchingGroups.Add(entry);\n                    }\n                }\n\n                // Report error if no matching endpoint was found.\n                if (matchingGroups.Count == 0)\n                {\n                    throw new ResourceNotFoundException($\"Endpoint not found: {request.EndpointUrl}\");\n                }\n\n                // Report error if there were entries that we were not able to find.\n                if (nodesToRemoveSet.Count != 0)\n                {\n                    request.OpcNodes = [.. nodesToRemoveSet];\n                    var entriesNotFoundJson = _jsonSerializer.SerializeToString(request);\n                    throw new ResourceNotFoundException($\"Nodes not found: \\n{entriesNotFoundJson}\");\n                }\n\n                // Create HashSet of nodes to remove again for the second pass.\n                nodesToRemoveSet.Clear();\n                if (!purgeDataSet && request.OpcNodes != null)\n                {\n                    nodesToRemoveSet.UnionWith(request.OpcNodes);\n                }\n\n                // Perform second pass and remove entries this time.\n                var remainingEntries = new List<PublishedNodesEntryModel>();\n                foreach (var entry in currentNodes)\n                {\n                    // We may have several entries with the same DataSetGroup definition,\n                    // so we will remove nodes only if the whole DataSet definition matches.\n                    if (entry.HasSameDataSet(request))\n                    {\n                        if (purgeDataSet)\n                        {\n                            continue;\n                        }\n                        var updatedNodes = new List<OpcNodeModel>();\n\n                        if (entry.OpcNodes != null)\n                        {\n                            foreach (var node in entry.OpcNodes)\n                            {\n                                if (!nodesToRemoveSet.Remove(node))\n                                {\n                                    updatedNodes.Add(node);\n                                }\n                            }\n                        }\n\n                        if (updatedNodes.Count == 0)\n                        {\n                            continue;\n                        }\n\n                        // Fall through to add to remaining entries\n                        entry.OpcNodes = updatedNodes;\n                    }\n\n                    // Even if DataSets did not match, we need to add this entry to existingGroups\n                    // so that generated job definition is complete.\n                    remainingEntries.Add(entry);\n                }\n\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(remainingEntries);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task UnpublishAllNodesAsync(PublishedNodesEntryModel? request,\n            CancellationToken ct = default)\n        {\n            //\n            // when no endpoint is specified remove all the configuration\n            // purge content feature is implemented to ensure the backwards compatibility\n            // with V2.5.x of the publisher\n            //\n            var purge = request?.EndpointUrl == null;\n            request?.PropagatePublishingIntervalToNodes();\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                if (!purge)\n                {\n                    Debug.Assert(request != null);\n                    var found = false;\n                    // Perform pass to determine existing groups\n                    var remainingEntries = new List<PublishedNodesEntryModel>();\n                    foreach (var entry in GetCurrentPublishedNodes())\n                    {\n                        if (entry.HasSameWriterGroup(request))\n                        {\n                            // We may have several entries with the same DataSetGroup definition,\n                            // so we will remove nodes only if the whole DataSet definition matches.\n                            if (entry.HasSameDataSet(request))\n                            {\n                                found = true;\n                                continue;\n                            }\n                            remainingEntries.Add(entry);\n                        }\n                    }\n\n                    // Report error if there were entries that did not have any nodes\n                    if (!found)\n                    {\n                        throw new ResourceNotFoundException($\"Endpoint or node not found: {request.EndpointUrl}\");\n                    }\n\n                    var jobs = _publishedNodesJobConverter.ToWriterGroups(remainingEntries);\n                    await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                }\n                else\n                {\n                    await _publisherHost.UpdateAsync([]).ConfigureAwait(false);\n                }\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task SetConfiguredEndpointsAsync(IReadOnlyList<PublishedNodesEntryModel> request,\n            CancellationToken ct = default)\n        {\n            foreach (var entry in request)\n            {\n                if (entry.OpcNodes != null)\n                {\n                    entry.OpcNodes = ValidateNodes(entry.OpcNodes, false);\n                }\n            }\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(request);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task AddOrUpdateEndpointsAsync(IReadOnlyList<PublishedNodesEntryModel> request,\n            CancellationToken ct = default)\n        {\n            // First, let's check that there are no 2 entries for the same endpoint in the request.\n            if (request.Count > 0)\n            {\n                request[0].PropagatePublishingIntervalToNodes();\n                for (var itemIndex = 1; itemIndex < request.Count; itemIndex++)\n                {\n                    for (var prevItemIndex = 0; prevItemIndex < itemIndex; prevItemIndex++)\n                    {\n                        request[itemIndex].PropagatePublishingIntervalToNodes();\n                        if (request[itemIndex].HasSameDataSet(request[prevItemIndex]))\n                        {\n                            throw new BadRequestException(\n                                \"Request contains two entries for the same endpoint \" +\n                                $\"at index {prevItemIndex} and {itemIndex}\");\n                        }\n                    }\n                }\n            }\n\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes().ToHashSet();\n                // Check that endpoints that we are asked to remove exist.\n                foreach (var removeRequest in request.Where(e => (e.OpcNodes?.Count ?? 0) == 0))\n                {\n                    var removed = currentNodes.RemoveWhere(entry => entry.HasSameDataSet(removeRequest));\n                    if (removed == 0)\n                    {\n                        throw new ResourceNotFoundException($\"Endpoint not found: {removeRequest.EndpointUrl}\");\n                    }\n                }\n                foreach (var updateRequest in request.Where(e => e.OpcNodes?.Count > 0))\n                {\n                    ValidateNodes(updateRequest.OpcNodes!, false);\n                    // We will add the update request entry and clean up anything else matching.\n                    var found = currentNodes.FirstOrDefault(entry => entry.HasSameDataSet(updateRequest));\n                    if (found != null)\n                    {\n                        currentNodes.RemoveWhere(entry => entry.HasSameDataSet(updateRequest));\n                        found.OpcNodes = updateRequest.OpcNodes;\n                        currentNodes.Add(found);\n                    }\n                    else\n                    {\n                        // Nothing matching add here\n                        currentNodes.Add(updateRequest);\n                    }\n                }\n                var jobs = _publishedNodesJobConverter.ToWriterGroups(currentNodes);\n                await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                await PersistPublishedNodesAsync().ConfigureAwait(false);\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<List<PublishedNodesEntryModel>> GetConfiguredEndpointsAsync(\n            bool includeNodes = false, CancellationToken ct = default)\n        {\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var endpoints = GetCurrentPublishedNodes();\n                if (!includeNodes)\n                {\n                    endpoints = endpoints.Select(e => e.ToDataSetEntry());\n                }\n                return endpoints.ToList();\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<List<OpcNodeModel>> GetConfiguredNodesOnEndpointAsync(\n            PublishedNodesEntryModel request, CancellationToken ct = default)\n        {\n            if (string.IsNullOrWhiteSpace(request.EndpointUrl))\n            {\n                throw new BadRequestException(kNullOrEmptyEndpointUrl);\n            }\n            request.PropagatePublishingIntervalToNodes();\n            var response = new List<OpcNodeModel>();\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var endpointFound = false;\n                foreach (var entry in GetCurrentPublishedNodes())\n                {\n                    if (entry.HasSameDataSet(request))\n                    {\n                        endpointFound = true;\n                        if (entry.OpcNodes != null)\n                        {\n                            response.AddRange(entry.OpcNodes);\n                        }\n                    }\n                }\n\n                if (!endpointFound)\n                {\n                    throw new ResourceNotFoundException(\n                        $\"Endpoint not found: {request.EndpointUrl}\");\n                }\n            }\n            finally\n            {\n                _api.Release();\n            }\n            return response;\n        }\n\n        /// <inheritdoc/>\n        public async Task<List<PublishDiagnosticInfoModel>> GetDiagnosticInfoAsync(\n            CancellationToken ct = default)\n        {\n            await _api.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                var result = new List<PublishDiagnosticInfoModel>();\n                if (_diagnostics == null)\n                {\n                    // ChannelDiagnostics disabled\n                    throw new ResourceInvalidStateException(\"Diagnostics service is disabled.\");\n                }\n                foreach (var nodes in GetCurrentPublishedNodes().GroupBy(k => k.GetUniqueWriterGroupId()))\n                {\n                    if (!_diagnostics.TryGetDiagnosticsForWriterGroup(nodes.Key, out var model))\n                    {\n                        continue;\n                    }\n                    result.Add(new PublishDiagnosticInfoModel\n                    {\n                        Endpoints = nodes.ToList(),\n                        SentMessagesPerSec = model.SentMessagesPerSec,\n                        IngestionDuration = _timeProvider.GetUtcNow() - model.IngestionStart,\n                        IngressDataChanges = model.IngressDataChanges,\n                        IngressValueChanges = model.IngressValueChanges,\n                        IngressBatchBlockBufferSize = model.IngressBatchBlockBufferSize,\n                        EncodingBlockInputSize = model.EncodingBlockInputSize,\n                        EncodingBlockOutputSize = model.EncodingBlockOutputSize,\n                        EncoderNotificationsProcessed = model.EncoderNotificationsProcessed,\n                        EncoderNotificationsDropped = model.EncoderNotificationsDropped,\n                        EncoderMaxMessageSplitRatio = model.EncoderMaxMessageSplitRatio,\n                        EncoderIoTMessagesProcessed = model.EncoderIoTMessagesProcessed,\n                        EncoderAvgNotificationsMessage = model.EncoderAvgNotificationsMessage,\n                        EncoderAvgIoTMessageBodySize = model.EncoderAvgIoTMessageBodySize,\n                        EncoderAvgIoTChunkUsage = model.EncoderAvgIoTChunkUsage,\n                        EstimatedIoTChunksPerDay = model.EstimatedIoTChunksPerDay,\n                        OutgressInputBufferCount = model.OutgressInputBufferCount,\n                        OutgressInputBufferDropped = model.OutgressInputBufferDropped,\n                        OutgressIoTMessageCount = model.OutgressIoTMessageCount,\n                        ConnectionRetries = model.ConnectionRetries,\n                        OpcEndpointConnected = model.OpcEndpointConnected,\n                        MonitoredOpcNodesSucceededCount = model.MonitoredOpcNodesSucceededCount,\n                        MonitoredOpcNodesFailedCount = model.MonitoredOpcNodesFailedCount,\n                        IngressEventNotifications = model.IngressEventNotifications,\n                        IngressCyclicReads = model.IngressCyclicReads,\n                        IngressHeartbeats = model.IngressHeartbeats,\n                        IngressDataChangesInLastMinute = model.IngressDataChangesInLastMinute,\n                        IngressValueChangesInLastMinute = model.IngressValueChangesInLastMinute,\n                        IngressEvents = model.IngressEvents\n                    });\n                }\n                return result;\n            }\n            finally\n            {\n                _api.Release();\n            }\n        }\n\n        /// <summary>\n        /// Persist Published nodes to published nodes file.\n        /// </summary>\n        private async Task PersistPublishedNodesAsync()\n        {\n            await _file.WaitAsync().ConfigureAwait(false);\n            try\n            {\n                var currentNodes = GetCurrentPublishedNodes(preferTimespan: false);\n                var updatedContent = _jsonSerializer.SerializeToString(\n                    currentNodes, SerializeOption.Indented) ?? string.Empty;\n\n                _publishedNodesProvider.WriteContent(updatedContent, true);\n                // Update _lastKnownFileHash\n                _lastKnownFileHash = GetChecksum(updatedContent);\n            }\n            finally\n            {\n                _file.Release();\n            }\n        }\n\n        /// <summary>\n        /// Get current published nodes from publisher\n        /// </summary>\n        /// <param name=\"preferTimespan\"></param>\n        /// <returns></returns>\n        private IEnumerable<PublishedNodesEntryModel> GetCurrentPublishedNodes(\n            bool preferTimespan = true)\n        {\n            return _publishedNodesJobConverter\n                .ToPublishedNodes(_publisherHost.Version, _publisherHost.LastChange,\n                    _publisherHost.WriterGroups, preferTimespan)\n                .Select(p => p.PropagatePublishingIntervalToNodes());\n        }\n\n        /// <inheritdoc/>\n        public IAwaiter<PublishedNodesJsonServices> GetAwaiter()\n        {\n            return (_started?.Task ?? Task.CompletedTask).AsAwaiter(this);\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask DisposeAsync()\n        {\n            try\n            {\n                _fileChanges.Writer.TryComplete();\n                if (_started != null)\n                {\n                    await _fileChangeProcessor.ConfigureAwait(false);\n                }\n            }\n            catch (ObjectDisposedException) { }\n            catch (OperationCanceledException) { }\n            finally\n            {\n                _started = null;\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            try\n            {\n                _fileChanges.Writer.TryComplete();\n                DisposeAsync().AsTask().GetAwaiter().GetResult();\n            }\n            finally\n            {\n                _api.Dispose();\n                _file.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Handle file changes\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void OnChanged(object? sender, FileSystemEventArgs e)\n        {\n            _logger.FileChanged(e.ChangeType, e.Name);\n            _fileChanges.Writer.TryWrite(e.ChangeType == WatcherChangeTypes.Deleted);\n        }\n\n        /// <summary>\n        /// Refresh processor\n        /// </summary>\n        /// <returns></returns>\n        private async Task ProcessFileChangesAsync()\n        {\n            try\n            {\n                _publishedNodesProvider.Changed += OnChanged;\n\n                var retryCount = 0;\n                await foreach (var clear in _fileChanges.Reader.ReadAllAsync().ConfigureAwait(false))\n                {\n                    await _file.WaitAsync().ConfigureAwait(false);\n                    try\n                    {\n                        var lastWriteTime = _publishedNodesProvider.GetLastWriteTime();\n                        try\n                        {\n                            // Force empty content when clearing but dont touch the deleted file\n                            var content = clear ? string.Empty : _publishedNodesProvider.ReadContent();\n                            var lastValidFileHash = _lastKnownFileHash;\n                            var currentFileHash = GetChecksum(content);\n\n                            if (currentFileHash != _lastKnownFileHash)\n                            {\n                                var jobs = Enumerable.Empty<WriterGroupModel>();\n                                if (!string.IsNullOrEmpty(content))\n                                {\n                                    if (string.IsNullOrEmpty(_lastKnownFileHash))\n                                    {\n                                        _logger.FoundPublishedNodesFile(currentFileHash);\n                                    }\n                                    else\n                                    {\n                                        _logger.PublishedNodesFileChanged(_lastKnownFileHash, currentFileHash);\n                                    }\n\n                                    var entries = _publishedNodesJobConverter.Read(content).ToList();\n                                    TransformFromLegacyNodeId(entries);\n                                    jobs = _publishedNodesJobConverter.ToWriterGroups(entries);\n                                }\n                                _logger.PublisherConfigurationCompleted(clear ? \"Resetting\" : \"Refreshing\");\n                                try\n                                {\n                                    await _publisherHost.UpdateAsync(jobs).ConfigureAwait(false);\n                                    _lastKnownFileHash = currentFileHash;\n                                    // Mark as started\n                                    _started?.TrySetResult();\n                                }\n                                catch (Exception ex) when (_started?.Task.IsCompletedSuccessfully ?? false)\n                                {\n                                    if (_publisherHost.TryUpdate(jobs))\n                                    {\n                                        _logger.NotInitializingUpdateWithoutWaiting(ex);\n                                        _lastKnownFileHash = currentFileHash;\n                                    }\n                                }\n                                // Otherwise throw and retry\n                            }\n                            else\n                            {\n                                // avoid double events from FileSystemWatcher\n                                if (lastWriteTime - _lastRead > TimeSpan.FromMilliseconds(10))\n                                {\n                                    _logger.PublishedNodesFileChangedContentHashEqual();\n                                }\n                            }\n                            _lastRead = lastWriteTime;\n                            retryCount = 0;\n                            // Success\n                        }\n                        catch (IOException ex)\n                        {\n                            if (++retryCount <= 3)\n                            {\n                                Debug.Assert(!clear);\n                                _logger.ErrorLoadingJobFromFileAttempt(ex, retryCount);\n\n                                // Queue another one and wait a bit\n                                _fileChanges.Writer.TryWrite(false);\n                                await Task.Delay(500).ConfigureAwait(false);\n                                continue;\n                            }\n                            _logger.ErrorLoadingJobFromFileRetryExpired(ex);\n                        }\n                        catch (SerializerException sx)\n                        {\n                            Debug.Assert(!clear);\n                            const string error = \"SerializerException while loading job from file.\";\n                            if (_logger.IsEnabled(LogLevel.Debug))\n                            {\n                                _logger.ErrorLoadingJobFromFileSerializer(sx, error);\n                            }\n                            else\n                            {\n                                _logger.ErrorLoadingJobFromFileSerializer(error);\n                            }\n                            retryCount = 0;\n                            _started?.TrySetResult();\n                        }\n                        catch (Exception ex) when (ex is not ObjectDisposedException)\n                        {\n                            _logger.ErrorDuringPublisherAction(ex, clear ? \"Reset\" : \"Update\");\n                            _fileChanges.Writer.TryWrite(clear);\n                            retryCount = 0;\n                            _started?.TrySetResult();\n                        }\n                    }\n                    finally\n                    {\n                        _file.Release();\n                    }\n                }\n            }\n            finally\n            {\n                _publishedNodesProvider.Changed -= OnChanged;\n                _started = null;\n            }\n        }\n\n        /// <summary>\n        /// Find writer entry\n        /// </summary>\n        /// <param name=\"writerGroupId\"></param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"entries\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ResourceNotFoundException\"></exception>\n        /// <exception cref=\"ResourceInvalidStateException\"></exception>\n        /// <exception cref=\"BadRequestException\"></exception>\n        private static PublishedNodesEntryModel Find(string writerGroupId,\n            string dataSetWriterId, IEnumerable<PublishedNodesEntryModel> entries)\n        {\n            var found = entries\n                .Where(e =>\n                     (e.DataSetWriterGroup ?? string.Empty) == writerGroupId &&\n                     (e.DataSetWriterId ?? string.Empty) == dataSetWriterId)\n                .ToList();\n            if (found.Count == 1)\n            {\n                return EnsureUniqueDataSetFieldIds(found[0]);\n            }\n            else if (found.Count == 0)\n            {\n                throw new ResourceNotFoundException(\"Could not find entry \" +\n                    \"with provided writer id and writer group.\");\n            }\n            else\n            {\n                throw new ResourceInvalidStateException(kAmbiguousResultsMessage);\n            }\n            static PublishedNodesEntryModel EnsureUniqueDataSetFieldIds(\n                PublishedNodesEntryModel entry)\n            {\n                if (entry.OpcNodes != null)\n                {\n                    var unique = entry.OpcNodes\n                        .Select(n => n.DataSetFieldId)\n                        .Distinct()\n                        .Count();\n                    if (unique != entry.OpcNodes.Count)\n                    {\n                        throw new BadRequestException(\n                            \"Field ids in writer entry must be present and unique.\");\n                    }\n                }\n                return entry;\n            }\n        }\n\n        /// <summary>\n        /// Validate nodes are valid\n        /// </summary>\n        /// <param name=\"opcNodes\"></param>\n        /// <param name=\"dataSetWriterApiRequirements\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"BadRequestException\"></exception>\n        private static IList<OpcNodeModel> ValidateNodes(IList<OpcNodeModel> opcNodes,\n            bool dataSetWriterApiRequirements = false)\n        {\n            var set = new HashSet<string>();\n            foreach (var node in opcNodes)\n            {\n                if (!node.TryGetId(out var id))\n                {\n                    throw new BadRequestException(\"Node must contain a node ID\");\n                }\n                if (dataSetWriterApiRequirements)\n                {\n                    node.DataSetFieldId ??= id;\n                    set.Add(node.DataSetFieldId);\n                    if (node.OpcPublishingInterval != null ||\n                        node.OpcPublishingIntervalTimespan != null)\n                    {\n                        throw new BadRequestException(\n                            \"Publishing interval not allowed on node level. \" +\n                            \"Must be set at writer level.\");\n                    }\n                }\n            }\n            if (dataSetWriterApiRequirements && set.Count != opcNodes.Count)\n            {\n                throw new BadRequestException(\"Field ids must be present and unique.\");\n            }\n            return opcNodes;\n        }\n\n        /// <summary>\n        /// Add item to nodes\n        /// </summary>\n        /// <param name=\"currentNodes\"></param>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"item\"></param>\n        private static void AddItem(List<PublishedNodesEntryModel> currentNodes,\n            PublishedNodesEntryModel entry, PublishedItemModel item)\n        {\n            var found = currentNodes.Find(n => n.HasSameDataSet(entry));\n            if (found == null)\n            {\n                currentNodes.Add(entry);\n                found = entry;\n            }\n            found.MessageEncoding = MessageEncoding.Json;\n            found.MessagingMode = MessagingMode.FullSamples;\n            found.OpcNodes ??= [];\n            var node = found.OpcNodes.FirstOrDefault(n => n.Id == item.NodeId);\n            if (node == null)\n            {\n                found.OpcNodes.Add(new OpcNodeModel\n                {\n                    DisplayName = item.DisplayName,\n                    Id = item.NodeId,\n                    OpcSamplingIntervalTimespan = item.SamplingInterval,\n                    HeartbeatIntervalTimespan = item.HeartbeatInterval,\n                    OpcPublishingIntervalTimespan = item.PublishingInterval\n                });\n            }\n            else\n            {\n                node.DisplayName = item.DisplayName;\n                node.OpcSamplingIntervalTimespan = item.SamplingInterval;\n                node.HeartbeatIntervalTimespan = item.HeartbeatInterval;\n                node.OpcPublishingIntervalTimespan = item.PublishingInterval;\n            }\n        }\n\n        /// <summary>\n        /// Transforms legacy entries that use NodeId into ones using OpcNodes.\n        /// The transformation will happen in-place.\n        /// </summary>\n        /// <param name=\"entries\"></param>\n        /// <exception cref=\"SerializerException\"></exception>\n        private static void TransformFromLegacyNodeId(List<PublishedNodesEntryModel> entries)\n        {\n            if (entries == null)\n            {\n                return;\n            }\n            foreach (var entry in entries)\n            {\n                if (!string.IsNullOrEmpty(entry.NodeId?.Identifier))\n                {\n                    entry.OpcNodes ??= [];\n\n                    if (entry.OpcNodes.Count != 0)\n                    {\n                        throw new SerializerException(\n                            \"Published nodes file contains DataSetWriter entry which \" +\n                            $\"defines both {nameof(entry.OpcNodes)} and {nameof(entry.NodeId)}.\" +\n                            \"This is not supported. Please fix published nodes file.\");\n                    }\n\n                    entry.OpcNodes.Add(new OpcNodeModel\n                    {\n                        Id = entry.NodeId.Identifier\n                    });\n                    entry.NodeId = null;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create a checksum of the content\n        /// </summary>\n        /// <param name=\"content\"></param>\n        /// <returns></returns>\n        private static string GetChecksum(string content)\n        {\n            var checksum = SHA256.HashData(Encoding.UTF8.GetBytes(content));\n            return Convert.ToHexString(checksum);\n        }\n\n        private const string kNullOrEmptyEndpointUrl\n            = \"Missing endpoint url in entry\";\n        private const string kNullOrEmptyOpcNodesMessage\n            = \"null or empty OpcNodes is provided in request\";\n        private const string kAmbiguousResultsMessage\n            = \"Trying to find entry with provided writer id produced ambigious results.\";\n\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n        private readonly PublishedNodesConverter _publishedNodesJobConverter;\n        private readonly IStorageProvider _publishedNodesProvider;\n        private readonly IJsonSerializer _jsonSerializer;\n        private readonly IDiagnosticCollector? _diagnostics;\n        private readonly IPublisher _publisherHost;\n        private string _lastKnownFileHash = string.Empty;\n        private DateTime _lastRead = DateTime.MinValue;\n        private TaskCompletionSource? _started;\n        private readonly Task _fileChangeProcessor;\n        private readonly Channel<bool> _fileChanges;\n        private readonly SemaphoreSlim _api = new(1, 1);\n        private readonly SemaphoreSlim _file = new(1, 1);\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for PublishedNodesJsonServices\n    /// </summary>\n    internal static partial class PublishedNodesJsonServicesLogging\n    {\n        private const int EventClass = 230;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"File {File} {Action}. Triggering file refresh ...\")]\n        public static partial void FileChanged(this ILogger logger, WatcherChangeTypes action, string? file);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Error while loading job from file. Attempt #{Count}...\")]\n        public static partial void ErrorLoadingJobFromFileAttempt(this ILogger logger, Exception ex, int count);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"Error while loading job from file. Retry expired, giving up.\")]\n        public static partial void ErrorLoadingJobFromFileRetryExpired(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error, SkipEnabledCheck = true,\n            Message = \"{Error}\")]\n        public static partial void ErrorLoadingJobFromFileSerializer(this ILogger logger, Exception ex, string error);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"{Error}\")]\n        public static partial void ErrorLoadingJobFromFileSerializer(this ILogger logger, string error);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"Error during publisher {Action}. Retrying...\")]\n        public static partial void ErrorDuringPublisherAction(this ILogger logger, Exception ex, string action);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Debug,\n            Message = \"Node \\\"{Node}\\\" is already present for entry with \\\"{Endpoint}\\\" endpoint.\")]\n        public static partial void NodeAlreadyPresent(this ILogger logger, string? node, string? endpoint);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"Found published Nodes File with hash {NewHash}, loading...\")]\n        public static partial void FoundPublishedNodesFile(this ILogger logger, string? newHash);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"Published Nodes File changed, last known hash {LastHash}, new hash {NewHash}, reloading...\")]\n        public static partial void PublishedNodesFileChanged(this ILogger logger, string? lastHash, string? newHash);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"{Action} publisher configuration completed.\")]\n        public static partial void PublisherConfigurationCompleted(this ILogger logger, string action);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Debug,\n            Message = \"Not initializing, update without waiting.\")]\n        public static partial void NotInitializingUpdateWithoutWaiting(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Debug,\n            Message = \"Published Nodes File changed but content-hash is equal to last one, nothing to do...\")]\n        public static partial void PublishedNodesFileChangedContentHashEqual(this ILogger logger);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/PublisherDiagnosticCollector.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Autofac;\n    using Microsoft.Extensions.Logging;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Diagnostics.Metrics;\n\n    /// <summary>\n    /// Collects metrics from the writer groups inside the publisher using the .net Meter listener\n    /// API. This must be kept in sync with the values we aim to track. This class should be seen\n    /// as optional, i.e., it is possible to disable any of the legacy diagnostics api and rely\n    /// solely on modern OTEL based telemetry collection.\n    /// </summary>\n    public sealed class PublisherDiagnosticCollector : IDiagnosticCollector,\n        IStartable, IDisposable\n    {\n        /// <summary>\n        /// Create collector\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public PublisherDiagnosticCollector(ILogger<PublisherDiagnosticCollector> logger,\n            TimeProvider? timeProvider = null)\n        {\n            _logger = logger;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _meterListener = new MeterListener\n            {\n                InstrumentPublished = OnInstrumentPublished\n            };\n            _meterListener.SetMeasurementEventCallback<long>(OnMeasurementRecorded);\n            _meterListener.SetMeasurementEventCallback<int>(OnMeasurementRecorded);\n            _meterListener.SetMeasurementEventCallback<double>(OnMeasurementRecorded);\n            _meterListener.SetMeasurementEventCallback<byte>(OnMeasurementRecorded);\n            _meterListener.SetMeasurementEventCallback<float>(OnMeasurementRecorded);\n            _meterListener.SetMeasurementEventCallback<decimal>(OnMeasurementRecorded);\n            _meterListener.SetMeasurementEventCallback<short>(OnMeasurementRecorded);\n        }\n\n        /// <inheritdoc/>\n        public void ResetWriterGroup(string writerGroupId)\n        {\n            var diag = new WriterGroupDiagnosticModel\n            {\n                PublisherVersion = PublisherConfig.Version,\n                IngestionStart = _timeProvider.GetUtcNow()\n            };\n            _diagnostics.AddOrUpdate(writerGroupId, _ => diag, (_, _) => diag);\n            _logger.TrackingDiagnosticsRestarted(writerGroupId);\n        }\n\n        /// <inheritdoc/>\n        public bool TryGetDiagnosticsForWriterGroup(string writerGroupId,\n            [NotNullWhen(true)] out WriterGroupDiagnosticModel? diagnostic)\n        {\n            if (_diagnostics.TryGetValue(writerGroupId, out var value))\n            {\n                //\n                // Ensure we collect all observable instruments then\n                // return the aggregate model\n                //\n                _meterListener.RecordObservableInstruments();\n                var duration = _timeProvider.GetUtcNow() - value.IngestionStart;\n\n                diagnostic = value with\n                {\n                    IngestionDuration = duration,\n                    OpcEndpointConnected = value.NumberOfConnectedEndpoints != 0,\n                    MemoryLimitUtilization = _process.MemoryLimitUtilization,\n                    CpuLimitUtilization = _process.CpuLimitUtilization,\n                    CpuRequestUtilization = _process.CpuRequestUtilization,\n                    CpuUsedPercentage = _process.CpuUsedPercentage,\n                    MemoryUsedPercentage = _process.MemoryUsedPercentage,\n                    MemoryUsedInBytes = _process.MemoryUsedInBytes\n                };\n                return true;\n            }\n            diagnostic = default;\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public IEnumerable<(string, WriterGroupDiagnosticModel)> EnumerateDiagnostics()\n        {\n            var now = _timeProvider.GetUtcNow();\n            _meterListener.RecordObservableInstruments();\n\n            foreach (var (writerGroupId, info) in _diagnostics)\n            {\n                var duration = now - info.IngestionStart;\n                yield return (writerGroupId, info with\n                {\n                    Timestamp = now,\n                    IngestionDuration = duration,\n                    OpcEndpointConnected = info.NumberOfConnectedEndpoints != 0,\n\n                    MemoryLimitUtilization = _process.MemoryLimitUtilization,\n                    CpuLimitUtilization = _process.CpuLimitUtilization,\n                    CpuRequestUtilization = _process.CpuRequestUtilization,\n                    CpuUsedPercentage = _process.CpuUsedPercentage,\n                    MemoryUsedPercentage = _process.MemoryUsedPercentage,\n                    MemoryUsedInBytes = _process.MemoryUsedInBytes\n                });\n            }\n        }\n\n        /// <inheritdoc/>\n        public bool RemoveWriterGroup(string writerGroupId)\n        {\n            if (_diagnostics.TryRemove(writerGroupId, out _))\n            {\n                _logger.TrackingDiagnosticsStopped(writerGroupId);\n                return true;\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public void Start()\n        {\n            _meterListener.Start();\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _meterListener.Dispose();\n        }\n\n        /// <summary>\n        /// Enable instrument if we need to hook\n        /// </summary>\n        /// <param name=\"instrument\"></param>\n        /// <param name=\"listener\"></param>\n        private void OnInstrumentPublished(Instrument instrument, MeterListener listener)\n        {\n            if (_bindings.ContainsKey(instrument.Name))\n            {\n                listener.EnableMeasurementEvents(instrument, this);\n            }\n        }\n\n        /// <summary>\n        /// Collect measurement\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"instrument\"></param>\n        /// <param name=\"measurement\"></param>\n        /// <param name=\"tags\"></param>\n        /// <param name=\"state\"></param>\n        private void OnMeasurementRecorded<T>(Instrument instrument, T measurement,\n            ReadOnlySpan<KeyValuePair<string, object?>> tags, object? state)\n        {\n            if (_bindings.TryGetValue(instrument.Name, out var binding))\n            {\n                if (TryGetIds(tags, out var writerGroupId, out var writerGroupName) &&\n                    _diagnostics.TryGetValue(writerGroupId, out var diag))\n                {\n                    if (writerGroupName != null)\n                    {\n                        diag.WriterGroupName = writerGroupName;\n                    }\n                    binding(diag, measurement!);\n                }\n                else\n                {\n                    binding(_process, measurement!);\n                }\n            }\n\n            static bool TryGetIds(ReadOnlySpan<KeyValuePair<string, object?>> tags,\n                [NotNullWhen(true)] out string? writerGroupId, out string? writerGroupName)\n            {\n                writerGroupId = null;\n                writerGroupName = null;\n                for (var index = tags.Length; index > 0; index--) // Identifiers are at the end\n                {\n                    var entry = tags[index - 1];\n                    if (entry.Value is string id)\n                    {\n                        switch (entry.Key)\n                        {\n                            case Constants.WriterGroupIdTag:\n                                writerGroupId = id;\n                                break;\n                            case Constants.WriterGroupNameTag:\n                                writerGroupName = id;\n                                break;\n                        }\n                    }\n                    if (writerGroupId != null &&\n                        writerGroupName != null)\n                    {\n                        return true;\n                    }\n                }\n                return writerGroupId != null;\n            }\n        }\n\n        private readonly MeterListener _meterListener;\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n        private readonly WriterGroupDiagnosticModel _process = new();\n        private readonly ConcurrentDictionary<string, WriterGroupDiagnosticModel> _diagnostics = new();\n\n        // TODO: Split this per measurement type to avoid boxing\n        private readonly ConcurrentDictionary<string,\n            Action<WriterGroupDiagnosticModel, object>> _bindings = new()\n            {\n                [\"iiot_edge_publisher_writer_count\"] =\n                    (d, i) => d.NumberOfWriters = (int)i,\n                [\"iiot_edge_publisher_writer_nodes\"] =\n                    (d, i) => d.MonitoredOpcNodesCount = (int)i,\n                [\"iiot_edge_publisher_writer_good_nodes\"] =\n                    (d, i) => d.MonitoredOpcNodesSucceededCount = (int)i,\n                [\"iiot_edge_publisher_writer_bad_nodes\"] =\n                    (d, i) => d.MonitoredOpcNodesFailedCount = (int)i,\n                [\"iiot_edge_publisher_writer_late_nodes\"] =\n                    (d, i) => d.MonitoredOpcNodesLateCount = (int)i,\n                [\"iiot_edge_publisher_writer_heartbeat_enabled_nodes\"] =\n                    (d, i) => d.ActiveHeartbeatCount = (int)i,\n                [\"iiot_edge_publisher_writer_condition_enabled_nodes\"] =\n                    (d, i) => d.ActiveConditionCount = (int)i,\n\n                [\"iiot_edge_publisher_publish_requests_client_totals\"] =\n                    (d, i) => d.TotalPublishRequests = (int)i,\n                [\"iiot_edge_publisher_good_publish_requests_client_totals\"] =\n                    (d, i) => d.TotalGoodPublishRequests = (int)i,\n                [\"iiot_edge_publisher_bad_publish_requests_client_totals\"] =\n                    (d, i) => d.TotalBadPublishRequests = (int)i,\n                [\"iiot_edge_publisher_min_publish_requests_client_totals\"] =\n                    (d, i) => d.TotalMinPublishRequests = (int)i,\n\n                [\"iiot_edge_publisher_is_connection_ok\"] =\n                    (d, i) => d.NumberOfConnectedEndpoints = (int)i,\n                [\"iiot_edge_publisher_is_disconnected\"] =\n                    (d, i) => d.NumberOfDisconnectedEndpoints = (int)i,\n                [\"iiot_edge_publisher_connection_retries\"] =\n                    (d, i) => d.ConnectionRetries = (long)i,\n                [\"iiot_edge_publisher_connection_reconnecting\"] =\n                    (d, i) => d.ConnectionsReconnecting = (int)i,\n                [\"iiot_edge_publisher_connection_successful_keepalives\"] =\n                    (d, i) => d.ConnectionKeepAlives = (long)i,\n                [\"iiot_edge_publisher_connection_total_keepalives\"] =\n                    (d, i) => d.ConnectionKeepAlivesTotal = (long)i,\n                [\"iiot_edge_publisher_connections\"] =\n                    (d, i) => d.ConnectionCount = (long)i,\n\n                [\"iiot_edge_publisher_keep_alive_notifications\"] =\n                    (d, i) => d.IngressKeepAliveNotifications = (long)i,\n                [\"iiot_edge_publisher_queue_overflows\"] =\n                    (d, i) => d.ServerQueueOverflows = (long)i,\n                [\"iiot_edge_publisher_queue_overflows_per_second_last_min\"] =\n                    (d, i) => d.ServerQueueOverflowsInLastMinute = (long)i,\n                [\"iiot_edge_publisher_data_changes\"] =\n                    (d, i) => d.IngressDataChanges = (long)i,\n                [\"iiot_edge_publisher_data_changes_per_second_last_min\"] =\n                    (d, i) => d.IngressDataChangesInLastMinute = (long)i,\n                [\"iiot_edge_publisher_value_changes\"] =\n                    (d, i) => d.IngressValueChanges = (long)i,\n                [\"iiot_edge_publisher_value_changes_per_second_last_min\"] =\n                    (d, i) => d.IngressValueChangesInLastMinute = (long)i,\n                [\"iiot_edge_publisher_sampledvalues\"] =\n                    (d, i) => d.IngressSampledValues = (long)i,\n                [\"iiot_edge_publisher_sampledvalues_per_second_last_min\"] =\n                    (d, i) => d.IngressSampledValuesInLastMinute = (long)i,\n                [\"iiot_edge_publisher_events\"] =\n                    (d, i) => d.IngressEvents = (long)i,\n                [\"iiot_edge_publisher_events_per_second_last_min\"] =\n                    (d, i) => d.IngressEventsInLastMinute = (long)i,\n                [\"iiot_edge_publisher_heartbeats\"] =\n                    (d, i) => d.IngressHeartbeats = (long)i,\n                [\"iiot_edge_publisher_heartbeats_per_second_last_min\"] =\n                    (d, i) => d.IngressHeartbeatsInLastMinute = (long)i,\n                [\"iiot_edge_publisher_cyclicreads\"] =\n                    (d, i) => d.IngressCyclicReads = (long)i,\n                [\"iiot_edge_publisher_cyclicreads_per_second_last_min\"] =\n                    (d, i) => d.IngressCyclicReadsInLastMinute = (long)i,\n                [\"iiot_edge_publisher_modelchanges\"] =\n                    (d, i) => d.IngressModelChanges = (long)i,\n                [\"iiot_edge_publisher_modelchanges_per_second_last_min\"] =\n                    (d, i) => d.IngressModelChangesInLastMinute = (long)i,\n                [\"iiot_edge_publisher_event_notifications\"] =\n                    (d, i) => d.IngressEventNotifications = (long)i,\n                [\"iiot_edge_publisher_event_notifications_per_second_last_min\"] =\n                    (d, i) => d.IngressEventNotificationsInLastMinute = (long)i,\n\n                [\"iiot_edge_publisher_publish_queue_dropped_count\"] =\n                    (d, i) => d.IngressNotificationsDropped = (long)i,\n                [\"iiot_edge_publisher_batch_input_queue_size\"] =\n                    (d, i) => d.IngressBatchBlockBufferSize = (long)i,\n                [\"iiot_edge_publisher_send_queue_size\"] =\n                    (d, i) => d.OutgressInputBufferCount = (long)i,\n                [\"iiot_edge_publisher_send_queue_dropped_count\"] =\n                    (d, i) => d.OutgressInputBufferDropped = (long)i,\n\n                [\"iiot_edge_publisher_encoding_input_queue_size\"] =\n                    (d, i) => d.EncodingBlockInputSize = (long)i,\n                [\"iiot_edge_publisher_encoding_output_queue_size\"] =\n                    (d, i) => d.EncodingBlockOutputSize = (long)i,\n\n                [\"iiot_edge_publisher_encoded_notifications\"] =\n                    (d, i) => d.EncoderNotificationsProcessed = (long)i,\n                [\"iiot_edge_publisher_message_split_ratio_max\"] =\n                    (d, i) => d.EncoderMaxMessageSplitRatio = (double)i,\n                [\"iiot_edge_publisher_dropped_notifications\"] =\n                    (d, i) => d.EncoderNotificationsDropped = (long)i,\n                [\"iiot_edge_publisher_processed_messages\"] =\n                    (d, i) => d.EncoderIoTMessagesProcessed = (long)i,\n                [\"iiot_edge_publisher_notifications_per_message_average\"] =\n                    (d, i) => d.EncoderAvgNotificationsMessage = (double)i,\n                [\"iiot_edge_publisher_encoded_message_size_average\"] =\n                    (d, i) => d.EncoderAvgIoTMessageBodySize = (double)i,\n                [\"iiot_edge_publisher_chunk_size_average\"] =\n                    (d, i) => d.EncoderAvgIoTChunkUsage = (double)i,\n\n                [\"iiot_edge_publisher_partitions_count\"] =\n                    (d, i) => d.TotalPublishQueuePartitions = (int)i,\n                [\"iiot_edge_publisher_partitions_active\"] =\n                    (d, i) => d.ActivePublishQueuePartitions = (int)i,\n                [\"iiot_edge_publisher_estimated_message_chunks_per_day\"] =\n                    (d, i) => d.EstimatedIoTChunksPerDay = (double)i,\n                [\"iiot_edge_publisher_messages_per_second\"] =\n                    (d, i) => d.SentMessagesPerSec = (double)i,\n                [\"iiot_edge_publisher_messages\"] =\n                    (d, i) => d.OutgressIoTMessageCount = (long)i,\n                [\"iiot_edge_publisher_message_send_failures\"] =\n                    (d, i) => d.OutgressIoTMessageFailedCount = (long)i,\n\n                [\"container.cpu.limit.utilization\"] =\n                    (d, i) => d.CpuLimitUtilization = (double)i,\n                [\"container.cpu.request.utilization\"] =\n                    (d, i) => d.CpuRequestUtilization = (double)i,\n                [\"process.cpu.utilization\"] =\n                    (d, i) => d.CpuUsedPercentage = (double)i,\n                [\"container.memory.limit.utilization\"] =\n                    (d, i) => d.MemoryLimitUtilization = (double)i,\n                [\"dotnet.process.memory.virtual.utilization\"] =\n                    (d, i) => d.MemoryUsedPercentage = (double)i,\n                [\"dotnet.process.memory.working_set\"] =\n                    (d, i) => d.MemoryUsedInBytes = (ulong)(long)i\n\n                    // ... Add here more items if needed\n            };\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for PublisherDiagnosticCollector\n    /// </summary>\n    internal static partial class PublisherDiagnosticCollectorLogging\n    {\n        private const int EventClass = 260;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Tracking diagnostics for {WriterGroup} was (re-)started.\")]\n        public static partial void TrackingDiagnosticsRestarted(this ILogger logger, string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Stop tracking diagnostics for {WriterGroup}.\")]\n        public static partial void TrackingDiagnosticsStopped(this ILogger logger, string writerGroup);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/PublisherModule.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Autofac;\n    using Furly;\n    using Furly.Azure.IoT.Edge;\n    using Furly.Extensions.Rpc;\n    using Microsoft.Extensions.Hosting;\n    using Microsoft.Extensions.Logging;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Runtime.Loader;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Publisher module hosted service\n    /// </summary>\n    public class PublisherModule : IHostedService, IIoTEdgeClientState, IProcessControl\n    {\n        /// <summary>\n        /// Running in container\n        /// </summary>\n        public static bool IsContainer => StringComparer.OrdinalIgnoreCase.Equals(\n            Environment.GetEnvironmentVariable(\"DOTNET_RUNNING_IN_CONTAINER\")\n                ?? string.Empty, \"true\");\n\n        /// <summary>\n        /// Create hosted service for module operation\n        /// </summary>\n        /// <param name=\"scope\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        public PublisherModule(ILifetimeScope scope, ILogger<PublisherModule> logger,\n            TimeProvider? timeProvider = null)\n        {\n            _scope = scope ?? throw new ArgumentNullException(nameof(scope));\n            _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _exit = new TaskCompletionSource<bool>();\n            AssemblyLoadContext.Default.Unloading += _ => _exit.TrySetResult(true);\n        }\n\n        /// <inheritdoc/>\n        public async Task StartAsync(CancellationToken cancellationToken)\n        {\n            // Try a crash restart loop here if we are not in a container context.\n            while (true)\n            {\n                try\n                {\n                    await _scope.Resolve<IEnumerable<IAwaitable>>().WhenAll().ConfigureAwait(false);\n                    var runtimeStateReporter = _scope.Resolve<IRuntimeStateReporter>();\n\n                    var version = GetType().Assembly.GetReleaseVersion().ToString();\n                    _logger.Starting(version);\n\n                    // Start rpc servers\n                    foreach (var server in _scope.Resolve<IEnumerable<IRpcServer>>())\n                    {\n                        _logger.StartingServer(server.Name);\n                        server.Start();\n                    }\n\n                    var aioIntegration = _scope.ResolveOptional<AssetDeviceIntegration>();\n                    if (aioIntegration != null)\n                    {\n                        _logger.EnabledAioIntegration();\n                    }\n\n                    // Now report runtime state as restarted. This can crash and we will retry.\n                    await runtimeStateReporter.SendRestartAnnouncementAsync(\n                        cancellationToken).ConfigureAwait(false);\n\n                    _logger.Started(version);\n                    return;\n                }\n                catch (Exception ex)\n                {\n                    _logger.StartError(ex);\n                    if (IsContainer)\n                    {\n                        _logger.ContainerRestart(ex);\n                        Process.GetCurrentProcess().Kill();\n                        return;\n                    }\n                    _logger.RetryIn30Seconds();\n                    await Task.Delay(TimeSpan.FromSeconds(30), cancellationToken).ConfigureAwait(false);\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public void OnClosed(int counter, string deviceId, string? moduleId, string reason)\n        {\n            _logger.ModuleClosed(counter, moduleId ?? deviceId, reason);\n        }\n\n        /// <inheritdoc/>\n        public void OnConnected(int counter, string deviceId, string? moduleId, string reason)\n        {\n            _logger.ModuleReconnected(counter, moduleId ?? deviceId, reason);\n        }\n\n        /// <inheritdoc/>\n        public void OnDisconnected(int counter, string deviceId, string? moduleId, string reason)\n        {\n            _logger.ModuleDisconnected(counter, moduleId ?? deviceId, reason);\n        }\n\n        /// <inheritdoc/>\n        public void OnOpened(int counter, string deviceId, string? moduleId)\n        {\n            _logger.ModuleOpened(counter, moduleId ?? deviceId);\n        }\n\n        /// <inheritdoc/>\n        public void OnError(int counter, string deviceId, string? moduleId, string reason)\n        {\n            _logger.ModuleError(counter, moduleId ?? deviceId, reason);\n        }\n\n        /// <inheritdoc/>\n        public Task StopAsync(CancellationToken cancellationToken)\n        {\n            // Shut down gracefully.\n            _exit.TrySetResult(true);\n\n            if (IsContainer)\n            {\n                // Set timer to kill the entire process after 5 minutes.\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                _ = _timeProvider.CreateTimer(o => Process.GetCurrentProcess().Kill(),\n                    null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            }\n\n            _logger.Stopped();\n            return Task.CompletedTask;\n        }\n\n        /// <inheritdoc/>\n        public bool Shutdown(bool failFast)\n        {\n            _logger.ShutdownRequested();\n            if (failFast)\n            {\n                Environment.FailFast(\"User shutdown of OPC Publisher due to error.\");\n            }\n            else\n            {\n                Environment.Exit(0);\n            }\n            return false;\n        }\n\n        private readonly TaskCompletionSource<bool> _exit;\n        private readonly ILifetimeScope _scope;\n        private readonly ILogger<PublisherModule> _logger;\n        private readonly TimeProvider _timeProvider;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for PublisherModule\n    /// </summary>\n    internal static partial class PublisherModuleLogging\n    {\n        private const int EventClass = 270;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Starting OpcPublisher module version {Version}...\")]\n        public static partial void Starting(this ILogger logger, string version);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"... Starting Rpc {Server} server ...\")]\n        public static partial void StartingServer(this ILogger logger, string server);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"OpcPublisher module version {Version} started.\")]\n        public static partial void Started(this ILogger logger, string version);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"Error trying to start OpcPublisher module!\")]\n        public static partial void StartError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Critical,\n            Message = \"Waiting for container restart - exiting...\")]\n        public static partial void ContainerRestart(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"Retrying in 30 seconds...\")]\n        public static partial void RetryIn30Seconds(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"{Counter}: Module {ModuleId} closed due to {Reason}.\")]\n        public static partial void ModuleClosed(this ILogger logger, int counter, string moduleId, string reason);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"{Counter}: Module {ModuleId} reconnected due to {Reason}.\")]\n        public static partial void ModuleReconnected(this ILogger logger, int counter, string moduleId, string reason);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"{Counter}: Module {ModuleId} disconnected due to {Reason}...\")]\n        public static partial void ModuleDisconnected(this ILogger logger, int counter, string moduleId, string reason);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"{Counter}: Module {ModuleId} opened.\")]\n        public static partial void ModuleOpened(this ILogger logger, int counter, string moduleId);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Error,\n            Message = \"{Counter}: Module {ModuleId} error {Reason}...\")]\n        public static partial void ModuleError(this ILogger logger, int counter, string moduleId, string reason);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"Stopped module OpcPublisher.\")]\n        public static partial void Stopped(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"Received request to shutdown publisher process.\")]\n        public static partial void ShutdownRequested(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"Integration with Azure IoT Operations enabled...\")]\n        public static partial void EnabledAioIntegration(this ILogger logger);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/PublisherService.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Autofac;\n    using Furly.Exceptions;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Generic;\n    using System.Collections.Immutable;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Channels;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Publisher host. Manages updates to the state of the publisher through\n    /// a queue model where a processor effects changes from the configuration in\n    /// state changes of publishers subscription and session model. In return it\n    /// supports aggregation of diagnostics and single sink console output of\n    /// the diagnostics data.\n    /// </summary>\n    public sealed class PublisherService : IPublisher, IAsyncDisposable, IDisposable,\n        IMetricsContext\n    {\n        /// <inheritdoc/>\n        public string PublisherId { get; }\n\n        /// <inheritdoc/>\n        public ImmutableList<WriterGroupModel> WriterGroups { get; private set; }\n            = [];\n\n        /// <inheritdoc/>\n        public DateTimeOffset LastChange { get; private set; }\n\n        /// <inheritdoc/>\n        public uint Version { get; private set; }\n\n        /// <inheritdoc/>\n        public TagList TagList { get; }\n\n        /// <summary>\n        /// Create Job host\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        public PublisherService(IWriterGroupScopeFactory factory,\n            IOptions<PublisherOptions> options, ILogger<PublisherService> logger,\n            TimeProvider? timeProvider = null)\n        {\n            PublisherId = options?.Value.PublisherId ??\n                throw new ArgumentNullException(nameof(options));\n            _factory = factory;\n            _logger = logger;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            LastChange = _timeProvider.GetUtcNow();\n\n            _currentJobs = [];\n\n            TagList = new TagList(\n            [\n                new KeyValuePair<string, object?>(Constants.PublisherIdTag, PublisherId)\n            ]);\n            _completedTask = new TaskCompletionSource();\n            _cts = new CancellationTokenSource();\n            _changeFeed\n                = Channel.CreateUnbounded<(TaskCompletionSource, List<WriterGroupModel>)>(\n                    new UnboundedChannelOptions\n                    {\n                        SingleReader = true,\n                        SingleWriter = false\n                    });\n            _processor = Task.Factory.StartNew(() => RunAsync(_cts.Token), _cts.Token,\n                TaskCreationOptions.LongRunning, TaskScheduler.Default).Unwrap();\n        }\n\n        /// <inheritdoc/>\n        public bool TryUpdate(IEnumerable<WriterGroupModel> writerGroups)\n        {\n            ObjectDisposedException.ThrowIf(_isDisposed, this);\n            return _changeFeed.Writer.TryWrite((_completedTask, writerGroups.ToList()));\n        }\n\n        /// <inheritdoc/>\n        public Task UpdateAsync(IEnumerable<WriterGroupModel> writerGroups)\n        {\n            ObjectDisposedException.ThrowIf(_isDisposed, this);\n            var tcs = new TaskCompletionSource(\n                TaskCreationOptions.RunContinuationsAsynchronously);\n            if (_changeFeed.Writer.TryWrite((tcs, writerGroups.ToList())))\n            {\n                return tcs.Task;\n            }\n            return Task.FromException(new ResourceExhaustionException(\"Change feed full\"));\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask DisposeAsync()\n        {\n            if (_isDisposed)\n            {\n                return;\n            }\n            _isDisposed = true;\n            try\n            {\n                _logger.ClosingPublisherService();\n                await _cts.CancelAsync().ConfigureAwait(false);\n                _changeFeed.Writer.TryComplete();\n                try\n                {\n                    await _processor.ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.FailedToClosePublisherServiceProcessor(ex);\n                }\n                _logger.PublisherServiceClosedSuccessfully();\n            }\n            finally\n            {\n                _cts.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            DisposeAsync().AsTask().GetAwaiter().GetResult();\n        }\n\n        /// <summary>\n        /// Process writer group changes\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task RunAsync(CancellationToken ct)\n        {\n            try\n            {\n                await foreach (var (task, changes) in\n                    _changeFeed.Reader.ReadAllAsync(default).ConfigureAwait(false))\n                {\n                    if (ct.IsCancellationRequested)\n                    {\n                        task.SetCanceled(ct);\n                        continue;\n                    }\n                    try\n                    {\n                        await ProcessChangesAsync(task, changes, ct).ConfigureAwait(false);\n                    }\n                    catch (OperationCanceledException)\n                    {\n                        task.TrySetCanceled(ct);\n                    }\n                    catch (Exception ex)\n                    {\n                        Debug.Fail(\"We have not processed all exceptions.\");\n                        task.TrySetException(ex);\n                    }\n                }\n            }\n            catch (OperationCanceledException) { }\n            finally\n            {\n                // Disposing - stop all groups before exiting\n                foreach (var group in _currentJobs)\n                {\n                    try\n                    {\n                        group.Value.Dispose();\n                        _logger.WriterGroupJobStopped(group.Key);\n                    }\n                    catch (Exception ex) when (ex is not OperationCanceledException)\n                    {\n                        _logger.FailedToStopWriterGroupJob(ex, group.Key);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Process the received changes\n        /// </summary>\n        /// <param name=\"task\"></param>\n        /// <param name=\"changes\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async ValueTask ProcessChangesAsync(TaskCompletionSource task,\n            List<WriterGroupModel> changes, CancellationToken ct)\n        {\n            // Increment change number\n            unchecked\n            {\n                Version++;\n            }\n            var exceptions = new List<Exception>();\n            foreach (var writerGroup in changes)\n            {\n                ct.ThrowIfCancellationRequested();\n                var jobId = writerGroup.Id;\n                if (writerGroup.DataSetWriters?.Any(/*w => w.HasDataToPublish()*/) ?? false)\n                {\n                    try\n                    {\n                        if (_currentJobs.TryGetValue(jobId, out var currentJob))\n                        {\n                            await currentJob.UpdateAsync(Version, writerGroup, ct).ConfigureAwait(false);\n                        }\n                        else\n                        {\n                            // Create new writer group job\n                            currentJob = await WriterGroupJob.CreateAsync(this, jobId, Version,\n                                writerGroup, ct).ConfigureAwait(false);\n                            _currentJobs.Add(currentJob.Id, currentJob);\n                        }\n                    }\n                    catch (Exception ex) when (ex is not OperationCanceledException)\n                    {\n                        exceptions.Add(ex);\n                        _logger.FailedToProcessChange(ex);\n                    }\n                }\n            }\n\n            // Anything not having an updated version will be deleted\n            foreach (var delete in _currentJobs.Values.Where(j => j.Version < Version).ToList())\n            {\n                try\n                {\n                    delete.Dispose();\n                }\n                catch (Exception ex) when (ex is not OperationCanceledException)\n                {\n                    exceptions.Add(ex);\n                    _logger.FailedToDisposeWriterGroupJobBeforeRemoval(ex);\n                }\n                _currentJobs.Remove(delete.Id);\n            }\n\n            if (exceptions.Count == 0)\n            {\n                // Update writer groups\n                LastChange = _timeProvider.GetUtcNow();\n                WriterGroups = _currentJobs.Values\n                    .Select(j => j.WriterGroup)\n                    .ToImmutableList();\n                // Complete\n                task.TrySetResult();\n            }\n            else if (exceptions.Count == 1)\n            {\n                // Fail\n                task.TrySetException(exceptions[0]);\n            }\n            else\n            {\n                // Fail\n                task.TrySetException(new AggregateException(\n                    \"Failed to process changes.\", exceptions));\n            }\n        }\n\n        /// <summary>\n        /// Job context\n        /// </summary>\n        private sealed class WriterGroupJob : IDisposable\n        {\n            /// <summary>\n            /// Immutable writer group identifier\n            /// </summary>\n            public string Id { get; }\n\n            /// <summary>\n            /// Current writer group configuration\n            /// </summary>\n            public WriterGroupModel WriterGroup { get; private set; }\n\n            /// <summary>\n            /// Message source\n            /// </summary>\n            public IWriterGroupControl Controller { get; }\n\n            /// <summary>\n            /// Current writer group job version\n            /// </summary>\n            public uint Version { get; internal set; }\n\n            /// <summary>\n            /// Create context\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"version\"></param>\n            /// <param name=\"id\"></param>\n            /// <param name=\"writerGroup\"></param>\n            private WriterGroupJob(PublisherService outer, uint version, string id,\n                WriterGroupModel writerGroup)\n            {\n                _outer = outer;\n                Version = version;\n                WriterGroup = writerGroup with { Id = id };\n                Id = id;\n                _scope = _outer._factory.Create(WriterGroup);\n                Controller = _scope.WriterGroup;\n            }\n\n            /// <summary>\n            /// Create context\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"id\"></param>\n            /// <param name=\"version\"></param>\n            /// <param name=\"writerGroup\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            public static async ValueTask<WriterGroupJob> CreateAsync(PublisherService outer,\n                string id, uint version, WriterGroupModel writerGroup, CancellationToken ct)\n            {\n                var context = new WriterGroupJob(outer, version, id, writerGroup);\n                try\n                {\n                    await context.Controller.StartAsync(ct).ConfigureAwait(false);\n                    return context;\n                }\n                catch (Exception ex)\n                {\n                    outer._logger.FailedToCreateWriterGroupJob(ex, context.Id);\n                    context.Dispose();\n                    throw;\n                }\n            }\n\n            /// <summary>\n            /// Update writer group job\n            /// </summary>\n            /// <param name=\"version\"></param>\n            /// <param name=\"writerGroup\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            public async ValueTask UpdateAsync(uint version, WriterGroupModel writerGroup,\n                CancellationToken ct)\n            {\n                try\n                {\n                    var newWriterGroup = writerGroup with { Id = Id };\n\n                    await Controller.UpdateAsync(newWriterGroup, ct).ConfigureAwait(false);\n\n                    // Update inner state if successful\n                    WriterGroup = newWriterGroup;\n                }\n                catch (Exception ex)\n                {\n                    _outer._logger.FailedToUpdateWriterGroupJob(ex, Id);\n                    throw;\n                }\n                finally\n                {\n                    Version = version; // Even if we fail, we want to rev the version\n                }\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                _scope.Dispose();\n            }\n\n            private readonly IWriterGroupScope _scope;\n            private readonly PublisherService _outer;\n        }\n\n        private bool _isDisposed;\n        private readonly IWriterGroupScopeFactory _factory;\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n        private readonly Task _processor;\n        private readonly Dictionary<string, WriterGroupJob> _currentJobs;\n        private readonly TaskCompletionSource _completedTask;\n        private readonly CancellationTokenSource _cts;\n        private readonly Channel<(TaskCompletionSource, List<WriterGroupModel>)> _changeFeed;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for PublisherService\n    /// </summary>\n    internal static partial class PublisherServiceLogging\n    {\n        private const int EventClass = 300;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Closing publisher service...\")]\n        public static partial void ClosingPublisherService(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Failed to close publisher service processor.\")]\n        public static partial void FailedToClosePublisherServiceProcessor(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Publisher service closed succesfully.\")]\n        public static partial void PublisherServiceClosedSuccessfully(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Writer group job {Job} stopped.\")]\n        public static partial void WriterGroupJobStopped(this ILogger logger, string job);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"Failed to stop writer group job {Job}.\")]\n        public static partial void FailedToStopWriterGroupJob(this ILogger logger, Exception ex, string job);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"Failed to process change.\")]\n        public static partial void FailedToProcessChange(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Error,\n            Message = \"Failed to dispose writer group job before removal.\")]\n        public static partial void FailedToDisposeWriterGroupJobBeforeRemoval(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Error,\n            Message = \"Failed to create writer group job {Name}\")]\n        public static partial void FailedToCreateWriterGroupJob(this ILogger logger, Exception ex, string name);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Error,\n            Message = \"Failed to update writer group job {Name}\")]\n        public static partial void FailedToUpdateWriterGroupJob(this ILogger logger, Exception ex, string name);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/RollingAverage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using System;\n\n    /// <summary>\n    /// Rolling average calculator\n    /// </summary>\n    internal sealed class RollingAverage\n    {\n        /// <summary>\n        /// Changes last minute\n        /// </summary>\n        public long LastMinute\n        {\n            get => CalculateSumForRingBuffer(_buffer,\n                ref _lastPointer, kBucketWidth, _lastWriteTime);\n            set => IncreaseRingBuffer(_buffer,\n                ref _lastPointer, kBucketWidth, value, ref _lastWriteTime);\n        }\n\n        /// <summary>\n        /// Changes total\n        /// </summary>\n        public long Count\n        {\n            get => _count;\n            set\n            {\n                var difference = value - _count;\n                _count = value;\n                LastMinute = difference;\n            }\n        }\n\n        public RollingAverage(TimeProvider timeProvider)\n        {\n            _timeProvider = timeProvider;\n        }\n\n        /// <summary>\n        /// Iterates the array and add up all values\n        /// </summary>\n        /// <param name=\"array\"></param>\n        /// <param name=\"lastPointer\"></param>\n        /// <param name=\"bucketWidth\"></param>\n        /// <param name=\"lastWriteTime\"></param>\n        private long CalculateSumForRingBuffer(long[] array, ref int lastPointer,\n            int bucketWidth, DateTimeOffset lastWriteTime)\n        {\n            // if IncreaseRingBuffer wasn't called for some time, maybe some stale values are included\n            UpdateRingBufferBuckets(array, ref lastPointer, bucketWidth, ref lastWriteTime);\n            // with cleaned buffer, we can just accumulate all buckets\n            long sum = 0;\n            for (var index = 0; index < array.Length; index++)\n            {\n                sum += array[index];\n            }\n            return sum;\n        }\n\n        /// <summary>\n        /// Helper function to distribute values over array based on time\n        /// </summary>\n        /// <param name=\"array\"></param>\n        /// <param name=\"lastPointer\"></param>\n        /// <param name=\"bucketWidth\"></param>\n        /// <param name=\"difference\"></param>\n        /// <param name=\"lastWriteTime\"></param>\n        private void IncreaseRingBuffer(long[] array, ref int lastPointer,\n            int bucketWidth, long difference, ref DateTimeOffset lastWriteTime)\n        {\n            var indexPointer = UpdateRingBufferBuckets(array, ref lastPointer,\n                bucketWidth, ref lastWriteTime);\n            array[indexPointer] += difference;\n        }\n\n        /// <summary>\n        /// Empty the ring buffer buckets if necessary\n        /// </summary>\n        /// <param name=\"array\"></param>\n        /// <param name=\"lastPointer\"></param>\n        /// <param name=\"bucketWidth\"></param>\n        /// <param name=\"lastWriteTime\"></param>\n        private int UpdateRingBufferBuckets(long[] array, ref int lastPointer,\n            int bucketWidth, ref DateTimeOffset lastWriteTime)\n        {\n            var now = _timeProvider.GetUtcNow();\n            var indexPointer = now.Second % bucketWidth;\n\n            // if last update was > bucketsize seconds in the past delete whole array\n            if (lastWriteTime != DateTimeOffset.MinValue)\n            {\n                var deleteWholeArray = (now - lastWriteTime).TotalSeconds >= bucketWidth;\n                if (deleteWholeArray)\n                {\n                    Array.Clear(array, 0, array.Length);\n                    lastPointer = indexPointer;\n                }\n            }\n\n            // reset all buckets, between last write and now\n            while (lastPointer != indexPointer)\n            {\n                lastPointer = (lastPointer + 1) % bucketWidth;\n                array[lastPointer] = 0;\n            }\n\n            lastWriteTime = now;\n            return indexPointer;\n        }\n\n        private int _lastPointer;\n        private long _count;\n        private DateTimeOffset _lastWriteTime = DateTimeOffset.MinValue;\n        private readonly TimeProvider _timeProvider;\n        private readonly long[] _buffer = new long[kBucketWidth];\n        private const int kBucketWidth = 60;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/RuntimeStateReporter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Furly.Azure.IoT.Edge;\n    using Furly.Azure.IoT.Edge.Services;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Storage;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.Metrics;\n    using System.Globalization;\n    using System.Linq;\n    using System.Net;\n    using System.Runtime.InteropServices;\n    using System.Security.Cryptography;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n\n    /// <summary>\n    /// This class manages reporting of runtime state.\n    /// </summary>\n    public sealed class RuntimeStateReporter : IRuntimeStateReporter,\n        IApiKeyProvider, ISslCertProvider, IDisposable\n    {\n        /// <inheritdoc/>\n        public string? ApiKey { get; private set; }\n\n        /// <inheritdoc/>\n        public X509Certificate2? Certificate { get; private set; }\n\n        /// <summary>\n        /// Constructor for runtime state reporter.\n        /// </summary>\n        /// <param name=\"events\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"stores\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"collector\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"metrics\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"identity\"></param>\n        /// <param name=\"workload\"></param>\n        public RuntimeStateReporter(IEnumerable<IEventClient> events,\n            IJsonSerializer serializer, IEnumerable<IKeyValueStore> stores,\n            IOptions<PublisherOptions> options, IDiagnosticCollector collector,\n            ILogger<RuntimeStateReporter> logger, IMetricsContext? metrics = null,\n            TimeProvider? timeProvider = null, IIoTEdgeDeviceIdentity? identity = null,\n            IIoTEdgeWorkloadApi? workload = null)\n        {\n            _serializer = serializer ??\n                throw new ArgumentNullException(nameof(serializer));\n            _options = options ??\n                throw new ArgumentNullException(nameof(options));\n            _logger = logger ??\n                throw new ArgumentNullException(nameof(logger));\n            _collector = collector ??\n                throw new ArgumentNullException(nameof(collector));\n            _metrics = metrics ?? IMetricsContext.Empty;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _workload = workload;\n            _identity = identity;\n            _renewalTimer = _timeProvider.CreateTimer(OnRenewExpiredCertificateAsync,\n                null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n\n            ArgumentNullException.ThrowIfNull(stores);\n            ArgumentNullException.ThrowIfNull(events);\n\n            if (_options.Value.AllowedEventAndDiagnosticsTransports.Count > 0)\n            {\n                var allowed = _options.Value.AllowedEventAndDiagnosticsTransports\n                    .Select(t => t.ToString())\n                    .ToHashSet(StringComparer.OrdinalIgnoreCase);\n                events = events\n                    .Where(e => allowed.Contains(e.Name))\n                    .ToList();\n            }\n\n            _events = events.Reverse().ToList();\n            _stores = stores.Reverse().ToList();\n            if (_stores.Count == 0)\n            {\n                throw new ArgumentException(\"No key value stores configured.\",\n                    nameof(stores));\n            }\n            _runtimeState = RuntimeStateEventType.RestartAnnouncement;\n\n            _diagnosticInterval = options.Value.DiagnosticsInterval ?? TimeSpan.Zero;\n            _diagnostics = options.Value.DiagnosticsTarget\n                ?? PublisherDiagnosticTargetType.Logger;\n            if (_diagnosticInterval == TimeSpan.Zero)\n            {\n                _diagnosticInterval = Timeout.InfiniteTimeSpan;\n            }\n\n            _cts = new CancellationTokenSource();\n            _diagnosticsOutputTimer = new PeriodicTimer(_diagnosticInterval);\n            _publisher = DiagnosticsOutputTimerAsync(_cts.Token);\n\n            InitializeMetrics();\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            try\n            {\n                _runtimeState = RuntimeStateEventType.Stopped;\n                _cts.Cancel();\n                _publisher.GetAwaiter().GetResult();\n                Certificate?.Dispose();\n            }\n            finally\n            {\n                _renewalTimer.Dispose();\n                _meter.Dispose();\n                _diagnosticsOutputTimer.Dispose();\n                _publisher = Task.CompletedTask;\n                _cts.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask SendRestartAnnouncementAsync(CancellationToken ct)\n        {\n            var hostAddresses = await GetHostAddressesAsync(ct).ConfigureAwait(false);\n\n            // Set runtime state in state stores\n            foreach (var store in _stores)\n            {\n                store.State[OpcUa.Constants.TwinPropertySiteKey] =\n                    _options.Value.SiteId;\n                store.State[OpcUa.Constants.TwinPropertyTypeKey] =\n                    OpcUa.Constants.EntityTypePublisher;\n                store.State[OpcUa.Constants.TwinPropertyVersionKey] =\n                    GetType().Assembly.GetReleaseVersion().ToString();\n                store.State[OpcUa.Constants.TwinPropertyFullVersionKey] =\n                    PublisherConfig.Version;\n                store.State[OpcUa.Constants.TwinPropertyIpAddressesKey] =\n                    hostAddresses;\n\n                if (_options.Value.HttpServerPort.HasValue)\n                {\n                    store.State[OpcUa.Constants.TwinPropertySchemeKey] =\n                        \"https\";\n                    store.State[OpcUa.Constants.TwinPropertyHostnameKey] =\n                        Dns.GetHostName();\n                    store.State[OpcUa.Constants.TwinPropertyPortKey] =\n                        _options.Value.HttpServerPort;\n                }\n                else\n                {\n                    store.State[OpcUa.Constants.TwinPropertySchemeKey] =\n                        VariantValue.Null;\n                    store.State[OpcUa.Constants.TwinPropertyHostnameKey] =\n                        VariantValue.Null;\n                    store.State[OpcUa.Constants.TwinPropertyPortKey] =\n                        VariantValue.Null;\n                }\n            }\n\n            await UpdateApiKeyAndCertificateAsync().ConfigureAwait(false);\n\n            if (_options.Value.EnableRuntimeStateReporting ?? false)\n            {\n                var body = new RuntimeStateEventModel\n                {\n                    TimestampUtc = _timeProvider.GetUtcNow(),\n                    MessageVersion = 1,\n                    MessageType = RuntimeStateEventType.RestartAnnouncement,\n                    PublisherId = _options.Value.PublisherId,\n                    SemVer = GetType().Assembly.GetReleaseVersion().ToString(),\n                    Version = PublisherConfig.Version,\n                    Site = _options.Value.SiteId,\n                    DeviceId = _identity?.DeviceId,\n                    ModuleId = _identity?.ModuleId\n                };\n\n                await SendRuntimeStateEventAsync(body, ct).ConfigureAwait(false);\n                _logger.RestartAnnouncementSent();\n            }\n\n            _runtimeState = RuntimeStateEventType.Running;\n        }\n\n        /// <summary>\n        /// Get comma seperated host addresses\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task<VariantValue> GetHostAddressesAsync(CancellationToken ct)\n        {\n            try\n            {\n                var host = await Dns.GetHostEntryAsync(Dns.GetHostName(),\n                    ct).ConfigureAwait(false);\n                return host.AddressList.Select(ip => ip.ToString())\n                    .Aggregate((a, b) => a + \", \" + b);\n            }\n            catch (Exception ex)\n            {\n                _logger.HostnameResolveFailed(ex);\n                return VariantValue.Null;\n            }\n        }\n\n        /// <summary>\n        /// Update cached api key\n        /// </summary>\n        private async Task UpdateApiKeyAndCertificateAsync()\n        {\n            var apiKeyStore = _stores.Find(s => s.State.TryGetValue(\n                OpcUa.Constants.TwinPropertyApiKeyKey, out var key) && key.IsString);\n            if (apiKeyStore != null)\n            {\n                ApiKey = (string?)apiKeyStore.State[OpcUa.Constants.TwinPropertyApiKeyKey];\n                _logger.ApiKeyExists(apiKeyStore.Name);\n            }\n\n            if (!string.IsNullOrWhiteSpace(_options.Value.ApiKeyOverride) &&\n                ApiKey != _options.Value.ApiKeyOverride)\n            {\n                Debug.Assert(_stores.Count > 0);\n                _logger.UsingConfigApiKey();\n                ApiKey = _options.Value.ApiKeyOverride;\n\n                _stores[0].State.Add(OpcUa.Constants.TwinPropertyApiKeyKey, ApiKey);\n            }\n\n            if (string.IsNullOrWhiteSpace(ApiKey))\n            {\n                Debug.Assert(_stores.Count > 0);\n\n                _logger.GeneratingApiKey(_stores[0].Name);\n                ApiKey = RandomNumberGenerator.GetBytes(20).ToBase64String();\n                _stores[0].State.Add(OpcUa.Constants.TwinPropertyApiKeyKey, ApiKey);\n            }\n\n            var dnsName = Dns.GetHostName();\n\n            // The certificate must be in the same store as the api key or else we generate a new one.\n            if (!(_options.Value.RenewTlsCertificateOnStartup ?? false) &&\n                apiKeyStore != null &&\n                apiKeyStore.State.TryGetValue(OpcUa.Constants.TwinPropertyCertificateKey,\n                    out var cert) && cert.IsBytes)\n            {\n                try\n                {\n                    // Load certificate\n                    Certificate?.Dispose();\n                    Certificate = X509CertificateLoader.LoadPkcs12((byte[])cert!, ApiKey);\n                    var now = _timeProvider.GetUtcNow().AddDays(1);\n                    if (now < Certificate.NotAfter && Certificate.HasPrivateKey &&\n                        Certificate.SubjectName.EnumerateRelativeDistinguishedNames()\n                            .Any(a => a.GetSingleElementValue() == dnsName))\n                    {\n                        var renewalAfter = Certificate.NotAfter - now;\n                        _logger.UsingValidCertificate(apiKeyStore.Name, renewalAfter);\n                        _renewalTimer.Change(renewalAfter, Timeout.InfiniteTimeSpan);\n                        // Done\n                        return;\n                    }\n                    _logger.CertificateExpired(apiKeyStore.Name);\n                }\n                catch (Exception ex)\n                {\n                    _logger.CertificateInvalid(ex);\n                }\n            }\n\n            // Create new certificate\n            var nowOffset = _timeProvider.GetUtcNow();\n            var expiration = nowOffset.AddDays(kCertificateLifetimeDays);\n\n            Certificate?.Dispose();\n            Certificate = null;\n            if (_workload != null)\n            {\n                try\n                {\n                    var certificates = await _workload.CreateServerCertificateAsync(\n                        dnsName, expiration.Date).ConfigureAwait(false);\n\n                    Debug.Assert(certificates.Count > 0);\n                    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))\n                    {\n                        using var certificate = certificates[0];\n                        //\n                        // https://github.com/dotnet/runtime/issues/45680)\n                        // On Windows the certificate in 'result' gives an error\n                        // when used with kestrel: \"No credentials are available\"\n                        //\n                        Certificate = X509CertificateLoader.LoadCertificate(\n                            certificate.Export(X509ContentType.Pkcs12));\n                    }\n                    else\n                    {\n                        Certificate = certificates[0];\n                    }\n\n                    if (!Certificate.HasPrivateKey)\n                    {\n                        Certificate.Dispose();\n                        Certificate = null;\n                        _logger.FailedToGetCertificateWithPrivateKey();\n                    }\n                    else\n                    {\n                        _logger.UsingWorkloadApiCertificate();\n                    }\n                }\n                catch (NotSupportedException nse)\n                {\n                    _logger.WorkloadApiNotSupported(nse.Message);\n                }\n                catch (Exception ex)\n                {\n                    _logger.WorkloadApiCertificateFailed(ex);\n                }\n            }\n            if (Certificate == null)\n            {\n                using var ecdsa = ECDsa.Create();\n                var req = new CertificateRequest(\"DC=\" + dnsName, ecdsa, HashAlgorithmName.SHA256);\n                var san = new SubjectAlternativeNameBuilder();\n                san.AddDnsName(dnsName);\n                var altDns = _identity?.ModuleId ?? _identity?.DeviceId;\n                if (!string.IsNullOrEmpty(altDns) &&\n                    !string.Equals(altDns, dnsName, StringComparison.OrdinalIgnoreCase))\n                {\n                    san.AddDnsName(altDns);\n                }\n                req.CertificateExtensions.Add(san.Build());\n                Certificate = req.CreateSelfSigned(DateTimeOffset.Now, expiration);\n                Debug.Assert(Certificate.HasPrivateKey);\n                _logger.CreatedSelfSignedCertificate();\n            }\n\n            Debug.Assert(_stores.Count > 0);\n            Debug.Assert(ApiKey != null);\n            apiKeyStore ??= _stores[0];\n\n            var pfxCertificate = Certificate.Export(X509ContentType.Pfx, ApiKey);\n            apiKeyStore.State.AddOrUpdate(OpcUa.Constants.TwinPropertyCertificateKey, pfxCertificate);\n\n            var renewalDuration = Certificate.NotAfter - nowOffset.Date - TimeSpan.FromDays(1);\n            _renewalTimer.Change(renewalDuration, Timeout.InfiniteTimeSpan);\n\n            _logger.StoredNewCertificate(apiKeyStore.Name, renewalDuration);\n            _certificateRenewals++;\n        }\n\n        /// <summary>\n        /// Renew certificate\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private async void OnRenewExpiredCertificateAsync(object? state)\n        {\n            try\n            {\n                await UpdateApiKeyAndCertificateAsync().ConfigureAwait(false);\n            }\n            catch (Exception ex)\n            {\n                // Retry\n                _logger.CertificateRenewalFailed(ex);\n                _renewalTimer.Change(TimeSpan.FromHours(1), Timeout.InfiniteTimeSpan);\n            }\n        }\n\n        /// <summary>\n        /// Send runtime state events\n        /// </summary>\n        /// <param name=\"runtimeStateEvent\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task SendRuntimeStateEventAsync(RuntimeStateEventModel runtimeStateEvent,\n            CancellationToken ct)\n        {\n            var eventsTopic = _topicCache.GetOrAdd(\n                (runtimeStateEvent.MessageType.ToString(), runtimeStateEvent.DeviceId),\n                id => new TopicBuilder(_options.Value, variables: new Dictionary<string, string>\n                {\n                    [PublisherConfig.EventNameVariableName] =\n                        id.Item1 ?? Constants.DefaultEventName,\n                    [PublisherConfig.EventContextVariableName] =\n                        id.Item2 ?? Constants.DefaultContextName,\n                    [PublisherConfig.EventSourceVariableName] =\n                        _options.Value.RuntimeStateRoutingInfo ?? \"status\",\n                    [PublisherConfig.EncodingVariableName] =\n                        MessageEncoding.Json.ToString()\n                    // ...\n                }).EventsTopic);\n            await Task.WhenAll(_events.Select(SendOneEventAsync)).ConfigureAwait(false);\n\n            async Task SendOneEventAsync(IEventClient events)\n            {\n                try\n                {\n                    await events.SendEventAsync(eventsTopic,\n                        _serializer.SerializeToMemory(runtimeStateEvent), _serializer.MimeType,\n                        Encoding.UTF8.WebName, configure: eventMessage =>\n                        {\n                            eventMessage.SetRetain(true);\n                            if (_options.Value.EnableCloudEvents == true)\n                            {\n                                eventMessage = eventMessage.AsCloudEvent(new CloudEventHeader\n                                {\n                                    Id = Guid.NewGuid().ToString(\"N\"),\n                                    Source = new Uri(\"urn:\" + _options.Value.PublisherId),\n                                    Subject = runtimeStateEvent.MessageType.ToString(),\n                                    Type = MessageSchemaTypes.RuntimeStateMessage\n                                });\n                            }\n                            else\n                            {\n                                eventMessage = eventMessage\n                                    .AddProperty(OpcUa.Constants.MessagePropertySchemaKey,\n                                        MessageSchemaTypes.RuntimeStateMessage);\n                                if (_options.Value.RuntimeStateRoutingInfo != null)\n                                {\n                                    eventMessage = eventMessage\n                                        .AddProperty(OpcUa.Constants.MessagePropertyRoutingKey,\n                                            _options.Value.RuntimeStateRoutingInfo);\n                                }\n                            }\n                        }, ct).ConfigureAwait(false);\n\n                    _logger.EventSent(runtimeStateEvent.ToString(), events.Name);\n                }\n                catch (Exception ex)\n                {\n                    _logger.SendEventFailed(ex, runtimeStateEvent.MessageType.ToString(), events.Name);\n                }\n            }\n        }\n\n        /// <summary>\n        /// ChannelDiagnostics timer to dump out all diagnostics\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        private async Task DiagnosticsOutputTimerAsync(CancellationToken ct)\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                try\n                {\n                    await _diagnosticsOutputTimer.WaitForNextTickAsync(ct).ConfigureAwait(false);\n                    var diagnostics = _collector.EnumerateDiagnostics();\n\n                    switch (_diagnostics)\n                    {\n                        case PublisherDiagnosticTargetType.Events:\n                            await SendDiagnosticsAsync(diagnostics, ct).ConfigureAwait(false);\n                            break;\n                        // TODO: case PublisherDiagnosticTargetType.PubSub:\n                        // TODO:     break;\n                        default:\n                            WriteDiagnosticsToConsole(diagnostics, _options.Value.DisableResourceMonitoring != true);\n                            break;\n                    }\n                }\n                catch (OperationCanceledException)\n                {\n                    return;\n                }\n                catch (Exception ex)\n                {\n                    _logger.DiagnosticsError(ex);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Send diagnostics\n        /// </summary>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async ValueTask SendDiagnosticsAsync(\n            IEnumerable<(string, WriterGroupDiagnosticModel)> diagnostics, CancellationToken ct)\n        {\n            foreach (var (writerGroupId, info) in diagnostics)\n            {\n                var diagnosticsTopic = _topicCache.GetOrAdd((writerGroupId, info.WriterGroupName),\n                    id => new TopicBuilder(_options.Value, variables: new Dictionary<string, string>\n                    {\n                        [PublisherConfig.WriterGroupIdVariableName] =\n                            id.Item1 ?? Constants.DefaultWriterGroupName,\n                        [PublisherConfig.DataSetWriterGroupVariableName] =\n                            id.Item2 ?? Constants.DefaultWriterGroupName,\n                        [PublisherConfig.WriterGroupVariableName] =\n                            id.Item2 ?? Constants.DefaultWriterGroupName,\n                        [PublisherConfig.EncodingVariableName] =\n                            MessageEncoding.Json.ToString()\n                        // ...\n                    }).DiagnosticsTopic);\n\n                await Task.WhenAll(_events.Select(SendOneEventAsync)).ConfigureAwait(false);\n\n                async Task SendOneEventAsync(IEventClient events)\n                {\n                    try\n                    {\n                        await events.SendEventAsync(diagnosticsTopic,\n                            _serializer.SerializeToMemory(info), _serializer.MimeType,\n                            Encoding.UTF8.WebName, configure: eventMessage =>\n                            {\n                                eventMessage\n                                    .SetRetain(true)\n                                    .SetTtl(_diagnosticInterval + TimeSpan.FromSeconds(10));\n                                if (_options.Value.EnableCloudEvents == true)\n                                {\n                                    eventMessage = eventMessage.AsCloudEvent(new CloudEventHeader\n                                    {\n                                        Id = Guid.NewGuid().ToString(\"N\"),\n                                        Source = new Uri(\"urn:\" + _options.Value.PublisherId),\n                                        Subject = info.WriterGroupName,\n                                        Type = MessageSchemaTypes.WriterGroupDiagnosticsMessage\n                                    });\n                                }\n                                else\n                                {\n                                    eventMessage = eventMessage\n                                        .AddProperty(OpcUa.Constants.MessagePropertySchemaKey,\n                                            MessageSchemaTypes.WriterGroupDiagnosticsMessage);\n                                    if (_options.Value.RuntimeStateRoutingInfo != null)\n                                    {\n                                        eventMessage = eventMessage\n                                            .AddProperty(OpcUa.Constants.MessagePropertyRoutingKey,\n                                                _options.Value.RuntimeStateRoutingInfo);\n                                    }\n                                }\n                            }, ct).ConfigureAwait(false);\n                    }\n                    catch (Exception ex)\n                    {\n                        _logger.DiagnosticsSendFailed(ex, events.Name);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Format diagnostics to console\n        /// </summary>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"includeResourceInfo\"></param>\n        private static void WriteDiagnosticsToConsole(\n            IEnumerable<(string, WriterGroupDiagnosticModel)> diagnostics, bool includeResourceInfo)\n        {\n            var builder = new StringBuilder();\n            foreach (var (writerGroupId, info) in diagnostics)\n            {\n                builder = Append(builder, writerGroupId, info, includeResourceInfo);\n            }\n\n            if (builder.Length > 0)\n            {\n                Console.Out.WriteLine(builder.ToString());\n            }\n\n            static StringBuilder Append(StringBuilder builder, string writerGroupId,\n                WriterGroupDiagnosticModel info, bool includeResourceInfo)\n            {\n                var s = info.IngestionDuration.TotalSeconds == 0 ? 1 : info.IngestionDuration.TotalSeconds;\n                var min = info.IngestionDuration.TotalMinutes == 0 ? 1 : info.IngestionDuration.TotalMinutes;\n\n                var eventsPerSec = info.IngressEvents / s;\n                var eventNotificationsPerSec = info.IngressEventNotifications / s;\n\n                var sentMessagesPerSecFormatted = info.OutgressIoTMessageCount > 0 ? $\"({info.SentMessagesPerSec:n2}/s)\"\n                    : string.Empty;\n                var keepAliveChangesPerSecFormatted = info.IngressKeepAliveNotifications > 0 ?\n                        $\"(All time ~{info.IngressKeepAliveNotifications / min:n2}/min)\"\n                    : string.Empty;\n\n                var dataChangesPerSecFormatted =\n                    Format(info.IngressDataChanges, info.IngressDataChangesInLastMinute, s);\n                var valueChangesPerSecFormatted =\n                    Format(info.IngressValueChanges, info.IngressValueChangesInLastMinute, s);\n                var eventsPerSecFormatted =\n                    Format(info.IngressEvents, info.IngressEventsInLastMinute, s);\n                var eventNotificationsPerSecFormatted =\n                    Format(info.IngressEventNotifications, info.IngressEventNotificationsInLastMinute, s);\n                var heartbeatsPerSecFormatted =\n                    Format(info.IngressHeartbeats, info.IngressHeartbeatsInLastMinute, s);\n                var cyclicReadsPerSecFormatted =\n                    Format(info.IngressCyclicReads, info.IngressCyclicReadsInLastMinute, s);\n                var sampledValuesPerSecFormatted =\n                    Format(info.IngressSampledValues, info.IngressSampledValuesInLastMinute, s);\n                var modelChangesPerSecFormatted =\n                    Format(info.IngressModelChanges, info.IngressModelChangesInLastMinute, s);\n                var serverQueueOverflowsPerSecFormatted =\n                    Format(info.ServerQueueOverflows, info.ServerQueueOverflowsInLastMinute, s);\n\n                static string Format(long changes, long lastMinute, double s)\n                {\n                    var dataChangesPerSecLastMin = lastMinute / Math.Min(s, 60d);\n                    return changes > 0 ?\n                        $\"(All time ~{changes / s:n2}/s; {lastMinute:n0} in last 60s ~{dataChangesPerSecLastMin:n2}/s)\"\n                            : string.Empty;\n                }\n\n                var chunkUsageFormatted = Math.Round(info.EncoderAvgIoTChunkUsage, 2) > 0 ?\n                    $\"(Avg Chunk (4 KB) usage {info.EncoderAvgIoTChunkUsage:n2}; {info.EstimatedIoTChunksPerDay:n1}/day estimated)\"\n                        : string.Empty;\n                var connectivityState = info.NumberOfConnectedEndpoints > 0 ? (info.NumberOfDisconnectedEndpoints > 0 ?\n                    \"(Partially Connected)\" : \"(Connected)\") : \"(Disconnected)\";\n                var reconnectivityState = info.ConnectionsReconnecting > 0 ?\n                    $\"({info.ConnectionsReconnecting} reconnecting)\" : string.Empty;\n\n                var sb = builder.AppendLine()\n                    .Append(\"  DIAGNOSTICS INFORMATION for          : \")\n                        .Append(info.WriterGroupName ?? Constants.DefaultWriterGroupName)\n                        .Append(\" (\")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:0}\", writerGroupId)\n                        .AppendLine(\")\")\n                    .Append(\"  # OPC Publisher Version (Runtime)    : \")\n                        .AppendLine(info.PublisherVersion)\n                        ;\n                if (includeResourceInfo)\n                {\n                    sb = sb\n                    .Append(\"  # Cpu (%limit/%req/%used)            : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:p2}\", info.CpuLimitUtilization)\n                        .Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:p2}\", info.CpuRequestUtilization)\n                        .Append(\" (\")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:p2}\", info.CpuUsedPercentage)\n                        .AppendLine(\")\")\n                    .Append(\"  # Memory (%limit/%used/total used)   : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:p2}\", info.MemoryLimitUtilization)\n                        .Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:p2}\", info.MemoryUsedPercentage)\n                        .Append(\" (\")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:n0}\", info.MemoryUsedInBytes / 1000d)\n                        .AppendLine(\" KB)\")\n                        ;\n                }\n                return sb\n                    .Append(\"  # Ingest duration (dd:hh:mm:ss)/Time : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:dd\\\\:hh\\\\:mm\\\\:ss}\", info.IngestionDuration)\n                        .Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:O}\", info.Timestamp)\n                        .AppendLine()\n                    .Append(\"  # Number of writers in group         : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:0}\", info.NumberOfWriters)\n                        .AppendLine()\n                    .Append(\"  # Good/Total number of items         : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.MonitoredOpcNodesSucceededCount).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:n0}\", info.MonitoredOpcNodesCount)\n                        .AppendLine()\n                    .Append(\"  # Bad/Late number of items           : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.MonitoredOpcNodesFailedCount).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:n0}\", info.MonitoredOpcNodesLateCount)\n                        .AppendLine()\n                    .Append(\"  # Heartbeats/Condition items active  : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.ActiveHeartbeatCount).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:n0}\", info.ActiveConditionCount)\n                        .AppendLine()\n                    .Append(\"  # Endpoints connected/disconnected   : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:0}\", info.NumberOfConnectedEndpoints).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:0}\", info.NumberOfDisconnectedEndpoints).Append(' ')\n                        .AppendLine(connectivityState)\n                    .Append(\"  # Connections created/retries        : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:0}\", info.ConnectionCount).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:0}\", info.ConnectionRetries).Append(' ')\n                        .AppendLine(reconnectivityState)\n                    .Append(\"  # Connection keep alives / total     : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:0.##}\", info.ConnectionKeepAlives).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:0.##}\", info.ConnectionKeepAlivesTotal)\n                        .AppendLine()\n                    .Append(\"  # Queued/Minimum request totals      : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:0.##}\", info.TotalPublishRequests).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:0.##}\", info.TotalMinPublishRequests)\n                        .AppendLine()\n                    .Append(\"  # Good/Bad Publish request totals    : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:0.##}\", info.TotalGoodPublishRequests).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:0.##}\", info.TotalBadPublishRequests)\n                        .AppendLine()\n                    .Append(\"  # Ingress value changes              : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressValueChanges).Append(' ')\n                        .AppendLine(valueChangesPerSecFormatted)\n                    .Append(\"  # Ingress sampled values             : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressSampledValues).Append(' ')\n                        .AppendLine(sampledValuesPerSecFormatted)\n                    .Append(\"  # Ingress events                     : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressEvents).Append(' ')\n                        .AppendLine(eventsPerSecFormatted)\n                    .Append(\"  # Server queue overflows             : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.ServerQueueOverflows).Append(' ')\n                        .AppendLine(serverQueueOverflowsPerSecFormatted)\n                    .Append(\"  # Received Data Change Notifications : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressDataChanges).Append(' ')\n                        .AppendLine(dataChangesPerSecFormatted)\n                    .Append(\"  # Received Event Notifications       : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressEventNotifications).Append(' ')\n                        .AppendLine(eventNotificationsPerSecFormatted)\n                    .Append(\"  # Received Keep Alive Notifications  : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressKeepAliveNotifications).Append(' ')\n                        .AppendLine(keepAliveChangesPerSecFormatted)\n                    .Append(\"  # Received Cyclic read Notifications : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressCyclicReads).Append(' ')\n                        .AppendLine(cyclicReadsPerSecFormatted)\n                    .Append(\"  # Generated Heartbeat Notifications  : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressHeartbeats).Append(' ')\n                        .AppendLine(heartbeatsPerSecFormatted)\n                    .Append(\"  # Generated Model Changes            : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressModelChanges).Append(' ')\n                        .AppendLine(modelChangesPerSecFormatted)\n                    .Append(\"  # Publish queue partitions/active    : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.TotalPublishQueuePartitions).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:n0}\", info.ActivePublishQueuePartitions)\n                        .AppendLine()\n                    .Append(\"  # Notifications buffered/dropped     : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.IngressBatchBlockBufferSize).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:n0}\", info.IngressNotificationsDropped)\n                        .AppendLine()\n                    .Append(\"  # Encoder input buffer size          : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.EncodingBlockInputSize)\n                        .AppendLine()\n                    .Append(\"  # Encoder Notif. processed/dropped   : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.EncoderNotificationsProcessed).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:n0}\", info.EncoderNotificationsDropped)\n                        .AppendLine()\n                    .Append(\"  # Encoder Network Messages produced  : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.EncoderIoTMessagesProcessed)\n                        .AppendLine()\n                    .Append(\"  # Encoder avg Notifications/Message  : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.EncoderAvgNotificationsMessage)\n                        .AppendLine()\n                    .Append(\"  # Encoder worst Message split ratio  : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:0.##}\", info.EncoderMaxMessageSplitRatio)\n                        .AppendLine()\n                    .Append(\"  # Encoder avg Message body size      : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:0.##}\", info.EncoderAvgIoTMessageBodySize).Append(' ')\n                        .AppendLine(chunkUsageFormatted)\n                    .Append(\"  # Encoder output buffer size         : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.EncodingBlockOutputSize)\n                        .AppendLine()\n                    .Append(\"  # Egress Messages queued/dropped     : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.OutgressInputBufferCount).Append(\" | \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0:n0}\", info.OutgressInputBufferDropped)\n                        .AppendLine()\n                    .Append(\"  # Egress Message send failures       : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.OutgressIoTMessageFailedCount)\n                        .AppendLine()\n                    .Append(\"  # Egress Messages successfully sent  : \")\n                        .AppendFormat(CultureInfo.CurrentCulture, \"{0,14:n0}\", info.OutgressIoTMessageCount)\n                        .Append(' ')\n                        .AppendLine(sentMessagesPerSecFormatted)\n                    ;\n            }\n        }\n\n        /// <summary>\n        /// Create observable metrics\n        /// </summary>\n        private void InitializeMetrics()\n        {\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_module_start\",\n                () => new Measurement<int>(_runtimeState == RuntimeStateEventType.RestartAnnouncement ? 0 : 1,\n                _metrics.TagList), description: \"Publisher module started.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_module_state\",\n                () => new Measurement<int>((int)_runtimeState,\n                _metrics.TagList), description: \"Publisher module runtime state.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_certificate_renewal_count\",\n                () => new Measurement<int>(_certificateRenewals,\n                _metrics.TagList), description: \"Publisher certificate renewals.\");\n        }\n\n        private const int kCertificateLifetimeDays = 30;\n        private readonly ConcurrentDictionary<(string, string?), string> _topicCache = new();\n        private readonly ILogger _logger;\n        private readonly IIoTEdgeDeviceIdentity? _identity;\n        private readonly IDiagnosticCollector _collector;\n        private readonly IIoTEdgeWorkloadApi? _workload;\n        private readonly ITimer _renewalTimer;\n        private readonly TimeProvider _timeProvider;\n        private readonly IJsonSerializer _serializer;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly List<IEventClient> _events;\n        private readonly List<IKeyValueStore> _stores;\n        private readonly Meter _meter = Diagnostics.NewMeter();\n        private readonly IMetricsContext _metrics;\n        private readonly CancellationTokenSource _cts;\n        private readonly PeriodicTimer _diagnosticsOutputTimer;\n        private readonly TimeSpan _diagnosticInterval;\n        private readonly PublisherDiagnosticTargetType _diagnostics;\n        private RuntimeStateEventType _runtimeState;\n        private Task _publisher;\n        private int _certificateRenewals;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for RuntimeStateReporter\n    /// </summary>\n    internal static partial class RuntimeStateReporterLogging\n    {\n        private const int EventClass = 330;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Restart announcement sent successfully.\")]\n        public static partial void RestartAnnouncementSent(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Failed to resolve hostname.\")]\n        public static partial void HostnameResolveFailed(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Api Key exists in {Store} store...\")]\n        public static partial void ApiKeyExists(this ILogger logger, string store);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Using Api Key provided in configuration...\")]\n        public static partial void UsingConfigApiKey(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"Generating new Api Key in {Store} store...\")]\n        public static partial void GeneratingApiKey(this ILogger logger, string store);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"Using valid Certificate found in {Store} store (renewal in {Duration})...\")]\n        public static partial void UsingValidCertificate(this ILogger logger, string store, TimeSpan duration);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Certificate found in {Store} store has expired. Generate new...\")]\n        public static partial void CertificateExpired(this ILogger logger, string store);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Error,\n            Message = \"Provided Certificate invalid.\")]\n        public static partial void CertificateInvalid(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"Using server certificate with private key from workload API...\")]\n        public static partial void UsingWorkloadApiCertificate(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Error,\n            Message = \"Failed to create certificate using workload API.\")]\n        public static partial void WorkloadApiCertificateFailed(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Information,\n            Message = \"Created self-signed ECC server certificate...\")]\n        public static partial void CreatedSelfSignedCertificate(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"Stored new Certificate in {Store} store (and scheduled renewal after {Duration}).\")]\n        public static partial void StoredNewCertificate(this ILogger logger, string store, TimeSpan duration);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Critical,\n            Message = \"Failed to renew certificate - retrying in 1 hour...\")]\n        public static partial void CertificateRenewalFailed(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"{Event} sent via {Transport}.\")]\n        public static partial void EventSent(this ILogger logger, string? @event, string transport);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Error,\n            Message = \"Failed sending {MessageType} runtime state event through {Transport}.\")]\n        public static partial void SendEventFailed(this ILogger logger, Exception ex, string messageType, string transport);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Error,\n            Message = \"Error during diagnostics processing.\")]\n        public static partial void DiagnosticsError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Error,\n            Message = \"Failed sending Diagnostics event through {Transport}.\")]\n        public static partial void DiagnosticsSendFailed(this ILogger logger, Exception ex, string transport);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Warning,\n            Message = \"Failed to get certificate with private key using workload API.\")]\n        public static partial void FailedToGetCertificateWithPrivateKey(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 19, Level = LogLevel.Warning,\n            Message = \"Not supported: {Message}. Unable to use workload API to obtain the certificate!\")]\n        public static partial void WorkloadApiNotSupported(this ILogger logger, string message);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/WriterGroupDataSource.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.Metrics;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Triggers dataset writer messages on subscription changes\n    /// </summary>\n    public sealed partial class WriterGroupDataSource : IWriterGroupControl, IDisposable,\n        IAsyncDisposable\n    {\n        /// <summary>\n        /// Id of the group\n        /// </summary>\n        public string Id => _writerGroup.Id;\n\n        /// <summary>\n        /// Create trigger from writer group\n        /// </summary>\n        /// <param name=\"clients\"></param>\n        /// <param name=\"writerGroup\"></param>\n        /// <param name=\"sink\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"metrics\"></param>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"timeProvider\"></param>\n        public WriterGroupDataSource(IOpcUaClientManager<ConnectionModel> clients,\n            WriterGroupModel writerGroup, IMessageSink sink, IJsonSerializer serializer,\n            IOptions<PublisherOptions> options, IMetricsContext? metrics,\n            ILoggerFactory loggerFactory, TimeProvider? timeProvider = null)\n        {\n            ArgumentNullException.ThrowIfNull(writerGroup, nameof(writerGroup));\n\n            _loggerFactory = loggerFactory;\n            _serializer = serializer;\n            _sink = sink;\n            _options = options;\n            _logger = loggerFactory.CreateLogger<WriterGroupDataSource>();\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _metrics = metrics ?? IMetricsContext.Empty;\n            _clients = clients;\n            _startTime = _timeProvider.GetTimestamp();\n\n            _valueChanges = new RollingAverage(_timeProvider);\n            _dataChanges = new RollingAverage(_timeProvider);\n            _sampledValues = new RollingAverage(_timeProvider);\n            _cyclicReads = new RollingAverage(_timeProvider);\n            _eventNotification = new RollingAverage(_timeProvider);\n            _events = new RollingAverage(_timeProvider);\n            _modelChanges = new RollingAverage(_timeProvider);\n            _heartbeats = new RollingAverage(_timeProvider);\n            _overflows = new RollingAverage(_timeProvider);\n\n            _writerGroup = Copy(writerGroup);\n\n            InitializeMetrics();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask StartAsync(CancellationToken ct)\n        {\n            await _lock.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                Debug.Assert(_writers.IsEmpty);\n                if (_writerGroup.DataSetWriters == null)\n                {\n                    return;\n                }\n                //\n                // We manage writers in the writer group using id, there should not\n                // be duplicate writer ids here, if there are we throw an exception.\n                //\n                var index = 0;\n                var writerNames = new HashSet<string>();\n                foreach (var writer in _writerGroup.DataSetWriters)\n                {\n                    // Create writer partitions\n                    foreach (var key in DataSetWriter.GetDataSetWriters(this, writer))\n                    {\n                        var writerSubscription = await DataSetWriterSubscription.CreateAsync(this,\n                            key, _loggerFactory, writerNames, ct).ConfigureAwait(false);\n                        writerSubscription.Index = index++;\n                        if (!_writers.TryAdd(key, writerSubscription))\n                        {\n                            throw new ArgumentException(\n                                $\"Group {Id} contains duplicate writer {writer.Id}.\");\n                        }\n                    }\n                }\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask UpdateAsync(WriterGroupModel writerGroup, CancellationToken ct)\n        {\n            await _lock.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                Interlocked.Increment(ref _metadataChanges);\n                writerGroup = Copy(writerGroup);\n\n                if (writerGroup.DataSetWriters == null ||\n                    writerGroup.DataSetWriters.Count == 0)\n                {\n                    // Fast path - just disopse it all.\n\n                    foreach (var subscription in _writers.Values)\n                    {\n                        await subscription.DisposeAsync().ConfigureAwait(false);\n                    }\n                    _logger.RemovedAllSubscriptions(writerGroup.Id);\n                    _writers.Clear();\n                    _writerGroup = writerGroup;\n                    return;\n                }\n\n                //\n                // We manage writers in the writer group using id, there should not\n                // be duplicate writer ids here, if there are we throw an exception.\n                //\n                var writerKeySet = new HashSet<DataSetWriter>();\n                foreach (var writer in writerGroup.DataSetWriters)\n                {\n                    foreach (var key in DataSetWriter.GetDataSetWriters(this, writer))\n                    {\n                        if (!writerKeySet.Add(key))\n                        {\n                            throw new ArgumentException(\n                                $\"Group {writerGroup.Id} contains duplicate writer {key}.\");\n                        }\n                    }\n                }\n\n                // Update or removed ones that were updated or removed.\n                var writerNames = _writers.Values.Select(w => w.Name).ToHashSet();\n                foreach (var key in _writers.Keys.ToList())\n                {\n                    if (!writerKeySet.TryGetValue(key, out var actualKey))\n                    {\n                        if (_writers.Remove(key, out var s))\n                        {\n                            await s.DisposeAsync().ConfigureAwait(false);\n                        }\n                    }\n                    else\n                    {\n                        // Update\n                        if (_writers.TryGetValue(key, out var s))\n                        {\n                            await s.UpdateAsync(actualKey, writerNames, ct).ConfigureAwait(false);\n                        }\n                    }\n                }\n\n                // Create any newly added ones\n                foreach (var key in writerKeySet)\n                {\n                    if (_writers.ContainsKey(key))\n                    {\n                        // Already processed\n                        continue;\n                    }\n\n                    // Add\n                    var writerSubscription = await DataSetWriterSubscription.CreateAsync(this,\n                        key, _loggerFactory, writerNames, ct).ConfigureAwait(false);\n                    if (!_writers.TryAdd(key, writerSubscription))\n                    {\n                        throw new ArgumentException(\n                            $\"Group {Id} contains duplicate writer {key}.\");\n                    }\n                }\n\n                // Update indexes (even if they are moving around)\n                var index = 0;\n                foreach (var writer in _writers.Values)\n                {\n                    writer.Index = index++;\n                }\n\n                _logger.UpdatedAllWriters(writerGroup.Id);\n\n                _writerGroup = writerGroup;\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            DisposeAsync().AsTask().GetAwaiter().GetResult();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask DisposeAsync()\n        {\n            try\n            {\n                await _lock.WaitAsync().ConfigureAwait(false);\n                try\n                {\n                    foreach (var s in _writers.Values)\n                    {\n                        await s.DisposeAsync().ConfigureAwait(false);\n                    }\n                }\n                finally\n                {\n                    _writers.Clear();\n                    _lock.Release();\n                }\n            }\n            finally\n            {\n                _lock.Dispose();\n                _meter.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Safe clone the writer group model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        private WriterGroupModel Copy(WriterGroupModel model)\n        {\n            var writerGroup = model with\n            {\n                DataSetWriters = model.DataSetWriters == null ?\n                    Array.Empty<DataSetWriterModel>() :\n                    model.DataSetWriters\n                        .Where(w => w.HasDataToPublish())\n                        .Select(f => f.Clone())\n                        .ToList(),\n                LocaleIds = model.LocaleIds?.ToList(),\n                MessageSettings = model.MessageSettings == null ? null :\n                    model.MessageSettings with { },\n                SecurityKeyServices = model.SecurityKeyServices?\n                    .Select(c => c.Clone())\n                    .ToList()\n            };\n\n            // Set the messaging profile settings\n            var defaultMessagingProfile = _options.Value.MessagingProfile ??\n                MessagingProfile.Get(MessagingMode.PubSub, MessageEncoding.Json);\n            if (writerGroup.HeaderLayoutUri != null)\n            {\n                defaultMessagingProfile = MessagingProfile.Get(\n                    Enum.Parse<MessagingMode>(writerGroup.HeaderLayoutUri),\n                    writerGroup.MessageType ?? defaultMessagingProfile.MessageEncoding);\n            }\n\n            writerGroup.MessageType ??= defaultMessagingProfile.MessageEncoding;\n\n            // Set the messaging settings for the encoder\n            if (writerGroup.MessageSettings?.NetworkMessageContentMask == null)\n            {\n                writerGroup.MessageSettings ??= new WriterGroupMessageSettingsModel();\n                writerGroup.MessageSettings.NetworkMessageContentMask =\n                    defaultMessagingProfile.NetworkMessageContentMask;\n            }\n\n            foreach (var dataSetWriter in writerGroup.DataSetWriters)\n            {\n                if (dataSetWriter.MessageSettings?.DataSetMessageContentMask == null)\n                {\n                    dataSetWriter.MessageSettings ??= new DataSetWriterMessageSettingsModel();\n                    dataSetWriter.MessageSettings.DataSetMessageContentMask =\n                        defaultMessagingProfile.DataSetMessageContentMask;\n                }\n                dataSetWriter.DataSetFieldContentMask ??=\n                        defaultMessagingProfile.DataSetFieldContentMask;\n\n                if (_options.Value.WriteValueWhenDataSetHasSingleEntry == true)\n                {\n                    dataSetWriter.DataSetFieldContentMask\n                        |= Models.DataSetFieldContentFlags.SingleFieldDegradeToValue;\n                }\n            }\n\n            return writerGroup;\n        }\n\n        /// <summary>\n        /// Safely get the writer group\n        /// </summary>\n        /// <param name=\"topic\"></param>\n        /// <param name=\"writerGroup\"></param>\n        /// <param name=\"schema\"></param>\n        private void GetSchemaAndWriterGroup(string topic, out WriterGroupModel writerGroup, out IEventSchema? schema)\n        {\n            if (_options.Value.SchemaOptions == null)\n            {\n                // No schema options, so no schema support\n                writerGroup = _writerGroup;\n                schema = null;\n                return;\n            }\n            if (_schemaGroups.TryGetValue(topic, out var schemaGroup) &&\n                schemaGroup.Version == (ulong)_metadataChanges)\n            {\n                writerGroup = _writerGroup;\n                schema = schemaGroup.Schema;\n                return;\n            }\n            _lock.Wait();\n            try\n            {\n                writerGroup = _writerGroup;\n                if (_schemaGroups.TryGetValue(topic, out schemaGroup) &&\n                    schemaGroup.Version == (ulong)_metadataChanges)\n                {\n                    schema = schemaGroup.Schema;\n                    return;\n                }\n                var id = writerGroup.Name ?? writerGroup.Id;\n                var encoding = writerGroup.MessageType ?? MessageEncoding.Json;\n                var datasetSchemaMetadata = _writers.Values\n                    .Where(s => s.Topic == topic)\n                    .Select(s => s.MetaData)\n                    .ToList();\n                if (datasetSchemaMetadata.Any(m => m == null))\n                {\n                    // If any of the dataset metadata is null, we cannot create a schema\n                    _logger.FailedToCreateSchemaMissingMetadata(encoding, writerGroup.Id);\n                    schema = null;\n                    return;\n                }\n\n                if (datasetSchemaMetadata.Count == 1)\n                {\n                    id = datasetSchemaMetadata[0]!.Id ?? id;\n                }\n                else\n                {\n                    _logger.MultiDataSetSchema(topic, writerGroup.Id);\n                    id = $\"{id}|{topic.ToSha1Hash()}\";\n                }\n                var input = new PublishedNetworkMessageSchemaModel\n                {\n                    Id = id,\n                    Version = (ulong)_metadataChanges,\n                    DataSetMessages = datasetSchemaMetadata,\n                    NetworkMessageContentFlags =\n                        writerGroup.MessageSettings?.NetworkMessageContentMask\n                };\n#if DUMP_METADATA\n#pragma warning disable CA1869 // Cache and reuse 'JsonSerializerOptions' instances\n                System.IO.File.WriteAllText(\n$\"md_{DateTimeOffset.UtcNow.ToBinary()}_{writerGroup.Id}_{_metadataChanges}.json\",\n                    System.Text.Json.JsonSerializer.Serialize(input,\n                        new System.Text.Json.JsonSerializerOptions\n                        {\n                            WriteIndented = true\n                        }));\n#pragma warning restore CA1869 // Cache and reuse 'JsonSerializerOptions' instances\n#endif\n                try\n                {\n                    if (PubSubMessage.TryCreateNetworkMessageSchema(encoding, input,\n                        out schema, _options.Value.SchemaOptions))\n                    {\n                        schemaGroup = new SchemaGroup(topic, (ulong)_metadataChanges, schema);\n                        _schemaGroups.AddOrUpdate(topic, schemaGroup, (_, _) => schemaGroup);\n                        return;\n                    }\n                    _logger.FailedToCreateSchema(encoding, writerGroup.Id);\n                }\n                catch (Exception ex)\n                {\n                    _logger.FailedToCreateSchemaWithException(ex, encoding, writerGroup.Id);\n                }\n                schema = null;\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <summary>\n        /// Manages a schema and metadata for a group of writers\n        /// </summary>\n        /// <param name=\"Topic\"></param>\n        /// <param name=\"Version\"></param>\n        /// <param name=\"Schema\"></param>\n        private sealed record class SchemaGroup(string Topic, ulong Version, IEventSchema Schema);\n\n        /// <summary>\n        /// Runtime duration\n        /// </summary>\n        private double UpTime => _timeProvider.GetElapsedTime(_startTime).TotalSeconds;\n\n        private IEnumerable<IOpcUaClientDiagnostics> UsedClients\n            => _writers.Values\n                .Select(s => s.Subscription?.ClientDiagnostics!)\n                .Where(s => s != null)\n                .Distinct();\n\n        private IEnumerable<ISubscriptionDiagnostics> UsedSubscriptions\n            => _writers.Values\n                .Select(s => s.Subscription?.Diagnostics!)\n                .Where(s => s != null)\n                .Distinct();\n\n        private int TotalItems => _writers.Values\n            .SelectMany(s => s.MonitoredItems).Count();\n        private int ReconnectCount => UsedClients\n            .Sum(s => s.ReconnectCount);\n        private int ReconnectTriggered => UsedClients\n            .Count(s => s.ReconnectTriggered);\n        private int KeepAliveTotal => UsedClients\n            .Sum(s => s.KeepAliveTotal);\n        private int KeepAliveCounter => UsedClients\n            .Sum(s => s.KeepAliveCounter);\n        private int ConnectCount => UsedClients\n            .Sum(s => s.ConnectCount);\n        private int OutstandingRequestCount => UsedClients\n            .Sum(s => s.OutstandingRequestCount);\n        private int GoodPublishRequestCount => UsedClients\n            .Sum(s => s.GoodPublishRequestCount);\n        private int BadPublishRequestCount => UsedClients\n            .Sum(s => s.BadPublishRequestCount);\n        private int MinPublishRequestCount => UsedClients\n            .Sum(s => s.MinPublishRequestCount);\n        private int ConnectedClients => UsedClients\n            .Count(s => s.State == EndpointConnectivityState.Ready);\n        private int DisconnectedClients => UsedClients\n            .Count(s => s.State != EndpointConnectivityState.Ready);\n        private int GoodMonitoredItems => UsedSubscriptions\n            .Sum(s => s.GoodMonitoredItems);\n        private int BadMonitoredItems => UsedSubscriptions\n            .Sum(s => s.BadMonitoredItems);\n        private int LateMonitoredItems => UsedSubscriptions\n            .Sum(s => s.LateMonitoredItems);\n        private int HeartbeatsEnabled => UsedSubscriptions\n            .Sum(s => s.HeartbeatsEnabled);\n        private int ConditionsEnabled => UsedSubscriptions\n            .Sum(s => s.ConditionsEnabled);\n\n        /// <summary>\n        /// Create observable metrics\n        /// </summary>\n        private void InitializeMetrics()\n        {\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_metadata_changes\",\n                () => new Measurement<int>(_metadataChanges, _metrics.TagList),\n                description: \"Number of metadata changes.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_good_metadata\",\n                () => new Measurement<int>(_metadataLoadSuccess, _metrics.TagList),\n                description: \"Number of successful metadata load operations.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_bad_metadata\",\n                () => new Measurement<int>(_metadataLoadFailures, _metrics.TagList),\n                description: \"Number of failed metadata load operations.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_messages_without_metadata\",\n                () => new Measurement<int>(_messagesWithoutMetadata, _metrics.TagList),\n                description: \"Number of messages dropped because metadata was missing in time.\");\n\n            // --- collected by publisher collector:\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_heartbeats\",\n                () => new Measurement<long>(_heartbeats.Count, _metrics.TagList),\n                description: \"Total Heartbeats delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_heartbeats_per_second\",\n                () => new Measurement<double>(_heartbeats.Count / UpTime, _metrics.TagList),\n                description: \"Opc Cyclic reads/second delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_heartbeats_per_second_last_min\",\n                () => new Measurement<long>(_heartbeats.LastMinute, _metrics.TagList),\n                description: \"Opc Cyclic reads/second delivered for processing in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_sampledvalues\",\n                () => new Measurement<long>(_sampledValues.Count, _metrics.TagList),\n                description: \"Total sampled values delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_sampledvalues_per_second\",\n                () => new Measurement<double>(_sampledValues.Count / UpTime, _metrics.TagList),\n                description: \"Opc sampled values/second delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_sampledvalues_per_second_last_min\",\n                () => new Measurement<long>(_sampledValues.LastMinute, _metrics.TagList),\n                description: \"Opc sampled values/second delivered for processing in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_modelchanges\",\n                () => new Measurement<long>(_modelChanges.Count, _metrics.TagList),\n                description: \"Total Number of changes found in the address spaces of the connected servers.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_modelchanges_per_second\",\n                () => new Measurement<double>(_modelChanges.Count / UpTime, _metrics.TagList),\n                description: \"Address space Model changes/second delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_modelchanges_per_second_last_min\",\n                () => new Measurement<long>(_modelChanges.LastMinute, _metrics.TagList),\n                description: \"Address space Model changes/second delivered for processing in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_value_changes\",\n                () => new Measurement<long>(_valueChanges.Count, _metrics.TagList),\n                description: \"Total Opc Value changes delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_value_changes_per_second\",\n                () => new Measurement<double>(_valueChanges.Count / UpTime, _metrics.TagList),\n                description: \"Opc Value changes/second delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_value_changes_per_second_last_min\",\n                () => new Measurement<long>(_valueChanges.LastMinute, _metrics.TagList),\n                description: \"Opc Value changes/second delivered for processing in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_events\",\n                () => new Measurement<long>(_events.Count, _metrics.TagList),\n                description: \"Total Opc Events delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_events_per_second\",\n                () => new Measurement<double>(_events.Count / UpTime, _metrics.TagList),\n                description: \"Opc Events/second delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_events_per_second_last_min\",\n                () => new Measurement<long>(_events.LastMinute, _metrics.TagList),\n                description: \"Opc Events/second delivered for processing in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_event_notifications\",\n                () => new Measurement<long>(_eventNotification.Count, _metrics.TagList),\n                description: \"Total Opc Event notifications delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_event_notifications_per_second\",\n                () => new Measurement<double>(_eventNotification.Count / UpTime, _metrics.TagList),\n                description: \"Opc Event notifications/second delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_event_notifications_per_second_last_min\",\n                () => new Measurement<long>(_eventNotification.LastMinute, _metrics.TagList),\n                description: \"Opc Event notifications/second delivered for processing in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_data_changes\",\n                () => new Measurement<long>(_dataChanges.Count, _metrics.TagList),\n                description: \"Total Opc Data change notifications delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_data_changes_per_second\",\n                () => new Measurement<double>(_dataChanges.Count / UpTime, _metrics.TagList),\n                description: \"Opc Data change notifications/second delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_data_changes_per_second_last_min\",\n                () => new Measurement<long>(_dataChanges.LastMinute, _metrics.TagList),\n                description: \"Opc Data change notifications/second delivered for processing in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_cyclicreads\",\n                () => new Measurement<long>(_cyclicReads.Count, _metrics.TagList),\n                description: \"Total Cyclic reads delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_cyclicreads_per_second\",\n                () => new Measurement<double>(_cyclicReads.Count / UpTime, _metrics.TagList),\n                description: \"Opc Cyclic reads/second delivered for processing.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_cyclicreads_per_second_last_min\",\n                () => new Measurement<long>(_cyclicReads.LastMinute, _metrics.TagList),\n                description: \"Opc Cyclic reads/second delivered for processing in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_queue_overflows\",\n                () => new Measurement<long>(_overflows.Count, _metrics.TagList),\n                description: \"Total values received with a queue overflow indicator.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_queue_overflows_per_second\",\n                () => new Measurement<double>(_overflows.Count / UpTime, _metrics.TagList),\n                description: \"Values with overflow indicator/second received.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_queue_overflows_per_second_last_min\",\n                () => new Measurement<long>(_overflows.LastMinute, _metrics.TagList),\n                description: \"Values with overflow indicator/second received in last 60s.\");\n\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_keep_alive_notifications\",\n                () => new Measurement<long>(_keepAliveCount, _metrics.TagList),\n                description: \"Total Opc keep alive notifications delivered for processing.\");\n\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_connection_retries\",\n                () => new Measurement<long>(ReconnectCount, _metrics.TagList),\n                description: \"OPC UA total connect retries.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_connection_reconnecting\",\n                () => new Measurement<int>(ReconnectTriggered, _metrics.TagList),\n                description: \"OPC UA total connections reconnecting right now.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_connection_successful_keepalives\",\n                () => new Measurement<long>(KeepAliveCounter, _metrics.TagList),\n                description: \"OPC UA keepalives on all connections since last reconnect.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_connection_total_keepalives\",\n                () => new Measurement<long>(KeepAliveTotal, _metrics.TagList),\n                description: \"OPC UA total successful keep alives on all connections.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_connections\",\n                () => new Measurement<long>(ConnectCount, _metrics.TagList),\n                description: \"OPC UA total connection success count.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_is_connection_ok\",\n                () => new Measurement<int>(ConnectedClients, _metrics.TagList),\n                description: \"OPC UA endpoints that are successfully connected.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_is_disconnected\",\n                () => new Measurement<int>(DisconnectedClients, _metrics.TagList),\n                description: \"OPC UA endpoints that are disconnected.\");\n\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_writer_count\",\n                () => new Measurement<int>(_writers.Count, _metrics.TagList),\n                description: \"Number of writers in the writer group.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_writer_nodes\",\n                () => new Measurement<int>(TotalItems, _metrics.TagList),\n                description: \"Total monitored item count.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_writer_good_nodes\",\n                () => new Measurement<int>(GoodMonitoredItems, _metrics.TagList),\n                description: \"Monitored items successfully created.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_writer_bad_nodes\",\n                () => new Measurement<int>(BadMonitoredItems, _metrics.TagList),\n                description: \"Monitored items that were not successfully created.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_writer_late_nodes\",\n                () => new Measurement<int>(LateMonitoredItems, _metrics.TagList),\n                description: \"Monitored items that are late reporting.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_writer_heartbeat_enabled_nodes\",\n                () => new Measurement<int>(HeartbeatsEnabled, _metrics.TagList),\n                description: \"Monitored items with heartbeats enabled.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_writer_condition_enabled_nodes\",\n                () => new Measurement<int>(ConditionsEnabled, _metrics.TagList),\n                description: \"Monitored items with condition monitoring enabled.\");\n\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_publish_requests_client_totals\",\n                () => new Measurement<int>(OutstandingRequestCount, _metrics.TagList),\n                description: \"Total good publish requests used by all clients used by the writer group.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_good_publish_requests_client_totals\",\n                () => new Measurement<int>(GoodPublishRequestCount, _metrics.TagList),\n                description: \"Total good publish requests used by all clients used by the writer group.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_bad_publish_requests_client_totals\",\n                () => new Measurement<int>(BadPublishRequestCount, _metrics.TagList),\n                description: \"Total bad publish requests used by all clients used by the writer group.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_min_publish_requests_client_totals\",\n                () => new Measurement<int>(MinPublishRequestCount, _metrics.TagList),\n                description: \"Total min publish requests queued by all clients used by the writer group.\");\n        }\n\n        private const long kNumberOfInvokedMessagesResetThreshold = long.MaxValue - 10000;\n        private readonly ConcurrentDictionary<DataSetWriter, DataSetWriterSubscription> _writers = new();\n        private readonly ConcurrentDictionary<string, SchemaGroup> _schemaGroups = new();\n        private readonly Meter _meter = Diagnostics.NewMeter();\n        private readonly ILoggerFactory _loggerFactory;\n        private readonly IJsonSerializer _serializer;\n        private readonly IMessageSink _sink;\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n        private readonly long _startTime;\n        private readonly IOpcUaClientManager<ConnectionModel> _clients;\n        private readonly IMetricsContext _metrics;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly SemaphoreSlim _lock = new(1, 1);\n        private readonly RollingAverage _valueChanges;\n        private readonly RollingAverage _dataChanges;\n        private readonly RollingAverage _sampledValues;\n        private readonly RollingAverage _cyclicReads;\n        private readonly RollingAverage _eventNotification;\n        private readonly RollingAverage _events;\n        private readonly RollingAverage _modelChanges;\n        private readonly RollingAverage _heartbeats;\n        private readonly RollingAverage _overflows;\n        private WriterGroupModel _writerGroup;\n        private long _keepAliveCount;\n        private int _messagesWithoutMetadata;\n        private int _metadataLoadSuccess;\n        private int _metadataLoadFailures;\n        private int _metadataChanges;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for WriterGroupDataSource\n    /// </summary>\n    internal static partial class WriterGroupDataSourceLogging\n    {\n        private const int EventClass = 360;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Removed all subscriptions from writer group {WriterGroup}.\")]\n        public static partial void RemovedAllSubscriptions(this ILogger logger, string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Successfully updated all writers inside the writer group {WriterGroup}.\")]\n        public static partial void UpdatedAllWriters(this ILogger logger, string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Warning,\n            Message = \"Failed to create schema for {Encoding} encoded messages for writer group {WriterGroup} because dataset metadata was null.\")]\n        public static partial void FailedToCreateSchemaMissingMetadata(this ILogger logger, MessageEncoding encoding, string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Warning,\n            Message = \"Failed to create schema for {Encoding} encoded messages for writer group {WriterGroup}.\")]\n        public static partial void FailedToCreateSchema(this ILogger logger, MessageEncoding encoding, string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"Failed to create schema for {Encoding} encoded messages for writer group {WriterGroup}.\")]\n        public static partial void FailedToCreateSchemaWithException(this ILogger logger, Exception ex, MessageEncoding encoding, string writerGroup);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Debug,\n            Message = \"Multiple dataset metadata found for topic {Topic} in writer group {WriterGroup}. Using hash to create unique id.\")]\n        public static partial void MultiDataSetSchema(this ILogger logger, string topic, string writerGroup);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Services/WriterGroupScopeFactory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Autofac;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Options;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n\n    /// <summary>\n    /// Container builder for data set writer jobs\n    /// </summary>\n    public class WriterGroupScopeFactory : IWriterGroupScopeFactory\n    {\n        /// <summary>\n        /// Create job scope factory\n        /// </summary>\n        /// <param name=\"lifetimeScope\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"collector\"></param>\n        public WriterGroupScopeFactory(ILifetimeScope lifetimeScope, IJsonSerializer serializer,\n            IOptions<PublisherOptions>? options = null, IDiagnosticCollector? collector = null)\n        {\n            _lifetimeScope = lifetimeScope;\n            _serializer = serializer;\n            _collector = collector;\n            _options = options;\n        }\n\n        /// <inheritdoc/>\n        public IWriterGroupScope Create(WriterGroupModel writerGroup)\n        {\n            return new WriterGroupScope(this, writerGroup, _serializer);\n        }\n\n        /// <summary>\n        /// Scope wrapper\n        /// </summary>\n        private sealed class WriterGroupScope : IWriterGroupScope, IMetricsContext,\n            IWriterGroupDiagnostics\n        {\n            /// <inheritdoc/>\n            public IWriterGroupControl WriterGroup => _scope.Resolve<IWriterGroupControl>();\n\n            /// <inheritdoc/>\n            public TagList TagList { get; }\n\n            /// <summary>\n            /// Create scope\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"writerGroup\"></param>\n            /// <param name=\"serializer\"></param>\n            public WriterGroupScope(WriterGroupScopeFactory outer,\n                WriterGroupModel writerGroup, IJsonSerializer serializer)\n            {\n                _outer = outer;\n                _writerGroupId = writerGroup.Id;\n\n                TagList = new TagList(\n                [\n                    new KeyValuePair<string, object?>(Constants.SiteIdTag,\n                        _outer._options?.Value.SiteId),\n                    new KeyValuePair<string, object?>(Constants.PublisherIdTag,\n                        writerGroup.PublisherId ?? _outer._options?.Value.PublisherId),\n                    new KeyValuePair<string, object?>(Constants.WriterGroupIdTag,\n                        _writerGroupId),\n                    new KeyValuePair<string, object?>(Constants.WriterGroupNameTag,\n                        writerGroup.Name)\n                ]);\n\n                _scope = _outer._lifetimeScope.BeginLifetimeScope(builder =>\n                {\n                    // Register writer group for the scope\n                    builder.RegisterInstance(writerGroup).As<WriterGroupModel>();\n\n                    builder.RegisterInstance(this)\n                        .As<IWriterGroupDiagnostics>()\n                        .As<IMetricsContext>().SingleInstance();\n                    builder.RegisterInstance(serializer)\n                        .As<IJsonSerializer>()\n                        .ExternallyOwned();\n\n                    // Register data flow, source, encode\n                    builder.RegisterType<NetworkMessageSink>()\n                        .AsImplementedInterfaces();\n                    builder.RegisterType<WriterGroupDataSource>()\n                        .AsImplementedInterfaces();\n                    builder.RegisterType<NetworkMessageEncoder>()\n                        .AsImplementedInterfaces();\n                });\n\n                ResetWriterGroupDiagnostics();\n            }\n\n            /// <inheritdoc/>\n            public void ResetWriterGroupDiagnostics()\n            {\n                _outer._collector?.ResetWriterGroup(_writerGroupId);\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                _outer._collector?.RemoveWriterGroup(_writerGroupId);\n                _scope.Dispose();\n            }\n\n            private readonly string _writerGroupId;\n            private readonly WriterGroupScopeFactory _outer;\n            private readonly ILifetimeScope _scope;\n        }\n\n        private readonly ILifetimeScope _lifetimeScope;\n        private readonly IJsonSerializer _serializer;\n        private readonly IDiagnosticCollector? _collector;\n        private readonly IOptions<PublisherOptions>? _options;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/AsyncEnumerableBase.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Async enumerable operation\n    /// </summary>\n    /// <typeparam name=\"TResult\"></typeparam>\n    public abstract class AsyncEnumerableBase<TResult>\n    {\n        /// <summary>\n        /// Returns whether the operation is completed\n        /// </summary>\n        public abstract bool HasMore { get; }\n\n        /// <summary>\n        /// Reset the enumeration\n        /// </summary>\n        public abstract void Reset();\n\n        /// <summary>\n        /// Execute\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public virtual async ValueTask<IEnumerable<TResult>> ExecuteAsync(\n            ServiceCallContext context)\n        {\n            var result = await RunAsync(context).ConfigureAwait(false);\n            return result.YieldReturn();\n        }\n\n        /// <summary>\n        /// Execute\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        protected abstract ValueTask<TResult> RunAsync(ServiceCallContext context);\n\n        /// <summary>\n        /// Dispose\n        /// </summary>\n        public virtual void Dispose()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/AsyncEnumerableStack.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Wraps a stack\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public abstract class AsyncEnumerableEnumerableStack<T> : AsyncEnumerableBase<T>\n    {\n        /// <inheritdoc/>\n        public override bool HasMore => _ops.Count > 0;\n\n        /// <inheritdoc/>\n        public override void Reset()\n        {\n            _ops.Clear();\n        }\n\n        /// <inheritdoc/>\n        public override async ValueTask<IEnumerable<T>> ExecuteAsync(ServiceCallContext context)\n        {\n            var func = _ops.Pop();\n            var cur = _ops.Count;\n            try\n            {\n                return await func.Invoke(context).ConfigureAwait(false);\n            }\n            catch\n            {\n                if (_ops.Count == cur)\n                {\n                    _ops.Push(func);\n                }\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        protected void Push(Func<ServiceCallContext, ValueTask<IEnumerable<T>>> value)\n        {\n            _ops.Push(value);\n        }\n\n        /// <inheritdoc/>\n        protected override ValueTask<T> RunAsync(ServiceCallContext context)\n        {\n            throw new NotSupportedException();\n        }\n\n        private readonly Stack<Func<ServiceCallContext, ValueTask<IEnumerable<T>>>> _ops = new();\n    }\n\n    /// <summary>\n    /// Wraps a stack\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public abstract class AsyncEnumerableStack<T> : AsyncEnumerableBase<T>\n    {\n        /// <inheritdoc/>\n        public override bool HasMore => _ops.Count > 0;\n\n        /// <inheritdoc/>\n        public override void Reset()\n        {\n            _ops.Clear();\n        }\n\n        /// <inheritdoc/>\n        protected void Push(Func<ServiceCallContext, ValueTask<T>> value)\n        {\n            _ops.Push(value);\n        }\n\n        /// <inheritdoc/>\n        protected override async ValueTask<T> RunAsync(ServiceCallContext context)\n        {\n            var func = _ops.Pop();\n            var cur = _ops.Count;\n            try\n            {\n                return await func.Invoke(context).ConfigureAwait(false);\n            }\n            catch\n            {\n                if (_ops.Count == cur)\n                {\n                    _ops.Push(func);\n                }\n                throw;\n            }\n        }\n\n        private readonly Stack<Func<ServiceCallContext, ValueTask<T>>> _ops = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/AssetsEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Asset and Web of things connectivity\n    /// </summary>\n    public static class AssetsEx\n    {\n        /// <summary>\n        /// Create asset\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"assetName\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<(NodeId?, ServiceResultModel?)> CreateAssetAsync(\n            this IOpcUaSession session, RequestHeader header, string assetName, CancellationToken ct)\n        {\n            var nsIndex = session.MessageContext.NamespaceUris.GetIndex(kNamespace);\n            if (nsIndex < 0)\n            {\n                return (null, new ServiceResultModel\n                {\n                    StatusCode = StatusCodes.BadNotSupported,\n                    ErrorMessage = \"Namespace not found - asset connectivity not supported.\"\n                });\n            }\n            try\n            {\n                // Call create method\n                var request = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = new NodeId(kAsset_Root, (ushort)nsIndex),\n                        MethodId = new NodeId(kAsset_CreateAsset, (ushort)nsIndex),\n                        InputArguments = new [] { new Variant(assetName) }\n                    }\n                };\n                var response = await session.Services.CallAsync(header, request,\n                    ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, request);\n                if (results.ErrorInfo != null)\n                {\n                    return (null, results.ErrorInfo);\n                }\n                if (results[0].ErrorInfo != null ||\n                    results[0].Result?.OutputArguments == null ||\n                    results[0].Result.OutputArguments.Count == 0 ||\n                    results[0].Result.OutputArguments[0].Value is not NodeId assetNodeId)\n                {\n                    return (null, results[0].ErrorInfo ?? new ServiceResultModel\n                    {\n                        ErrorMessage = \"no asset node id returned.\"\n                    });\n                }\n                return (assetNodeId, null);\n            }\n            catch (Exception ex)\n            {\n                return (null, ex.ToServiceResultModel());\n            }\n        }\n\n        /// <summary>\n        /// Get the node id of the asset file under the asset\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"assetId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<(NodeId?, ServiceResultModel?)> GetAssetFileAsync(\n            this IOpcUaSession session, RequestHeader header, NodeId assetId, CancellationToken ct)\n        {\n            var nsIndex = session.MessageContext.NamespaceUris.GetIndex(kNamespace);\n            if (nsIndex < 0)\n            {\n                return (null, new ServiceResultModel\n                {\n                    StatusCode = StatusCodes.BadNotSupported,\n                    ErrorMessage = \"Namespace not found - asset connectivity not supported.\"\n                });\n            }\n\n            var (results, errorInfo) = await session.FindAsync(header,\n                assetId.YieldReturn(), ReferenceTypeIds.HasComponent, true,\n                nodeClassMask: (uint)Opc.Ua.NodeClass.Object, ct: ct).ConfigureAwait(false);\n\n            if (errorInfo != null)\n            {\n                return (null, errorInfo);\n            }\n            var fileNodeId = results\n                .FirstOrDefault(f =>\n                    f.ErrorInfo == null &&\n                    f.TypeDefinition.NamespaceIndex == nsIndex &&\n                    f.TypeDefinition.Identifier.Equals(kAssetFileType));\n            if (!NodeId.IsNull(fileNodeId.Node))\n            {\n                return (fileNodeId.Node, null);\n            }\n            errorInfo = results.FirstOrDefault(d => d.ErrorInfo != null).ErrorInfo;\n            errorInfo ??= new ServiceResultModel\n            {\n                StatusCode = StatusCodes.BadNotFound,\n                ErrorMessage = \"No file found for asset.\"\n            };\n            return (null, errorInfo);\n        }\n\n        /// <summary>\n        /// Delete asset\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"assetId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<ServiceResultModel?> DeleteAssetAsync(this IOpcUaSession session,\n            RequestHeader header, NodeId assetId, CancellationToken ct)\n        {\n            var nsIndex = session.MessageContext.NamespaceUris.GetIndex(kNamespace);\n            if (nsIndex < 0)\n            {\n                return new ServiceResultModel\n                {\n                    StatusCode = StatusCodes.BadNotSupported,\n                    ErrorMessage = \"Namespace not found - asset connectivity not supported.\"\n                };\n            }\n            try\n            {\n                // Call create method\n                var request = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = new NodeId(kAsset_Root, (ushort)nsIndex),\n                        MethodId = new NodeId(kAsset_DeleteAsset, (ushort)nsIndex),\n                        InputArguments = new [] { new Variant(assetId) }\n                    }\n                };\n                var response = await session.Services.CallAsync(header, request,\n                    ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, request);\n                return results.ErrorInfo;\n            }\n            catch (Exception ex)\n            {\n                return ex.ToServiceResultModel();\n            }\n        }\n\n        /// <summary>\n        /// Close file handle of file and kick off the update\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"fileNodeId\"></param>\n        /// <param name=\"fileHandle\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<ServiceResultModel?> CloseAndUpdateAsync(this IOpcUaSession session,\n            RequestHeader header, NodeId fileNodeId, uint fileHandle, CancellationToken ct)\n        {\n            var nsIndex = session.MessageContext.NamespaceUris.GetIndex(kNamespace);\n            if (nsIndex < 0)\n            {\n                return new ServiceResultModel\n                {\n                    StatusCode = StatusCodes.BadNotSupported,\n                    ErrorMessage = \"Namespace not found - asset connectivity not supported.\"\n                };\n            }\n            return await session.CloseAsync(header, fileNodeId, new NodeId(\n                kAssetFileType_CloseAndUpdate, (ushort)nsIndex), fileHandle, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Get root asset node id\n        /// </summary>\n        public static string Root => $\"nsu={kNamespace};i={kAsset_Root}\";\n        private const string kNamespace = \"http://opcfoundation.org/UA/WoT-Con/\";\n        private const uint kAsset_Root = 31;\n        private const uint kAsset_CreateAsset = 32;\n        private const uint kAsset_DeleteAsset = 35;\n        private const uint kAssetFileType = 110;\n        private const uint kAssetFileType_CloseAndUpdate = 111;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/CertificateStoreEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Furly.Extensions.Utils;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Certificate store extensions\n    /// </summary>\n    public static class CertificateStoreEx\n    {\n        /// <summary>\n        /// Add to certificate store\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"certificates\"></param>\n        /// <param name=\"noCopy\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificates\"/>\n        /// is <c>null</c>.</exception>\n        public static async Task AddAsync(this ICertificateStore store,\n            IEnumerable<X509Certificate2> certificates,\n            bool noCopy = false, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(certificates);\n            foreach (var cert in certificates)\n            {\n                await Try.Async(() => store.DeleteAsync(cert.Thumbprint, ct)).ConfigureAwait(false);\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                await store.AddAsync(noCopy ? cert : new X509Certificate2(cert), ct: ct).ConfigureAwait(false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            }\n        }\n\n        /// <summary>\n        /// Remove from certificate store\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"certificates\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificates\"/>\n        /// is <c>null</c>.</exception>\n        public static async Task RemoveAsync(this ICertificateStore store,\n            IEnumerable<X509Certificate2> certificates, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(certificates);\n            foreach (var cert in certificates)\n            {\n                await store.DeleteAsync(cert.Thumbprint, ct).ConfigureAwait(false);\n            }\n        }\n\n        /// <summary>\n        /// Apply the configured settings provided via a CertificateStore to a\n        /// CertificateTrustList.\n        /// </summary>\n        /// <param name=\"certificateTrustList\"></param>\n        /// <param name=\"certificateStore\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificateTrustList\"/>\n        /// is <c>null</c>.</exception>\n        public static void ApplyLocalConfig(\n            this CertificateTrustList certificateTrustList,\n            CertificateStore? certificateStore)\n        {\n            ArgumentNullException.ThrowIfNull(certificateTrustList);\n\n            if (certificateStore == null)\n            {\n                return;\n            }\n\n            if (certificateTrustList.StorePath != certificateStore.StorePath)\n            {\n                certificateTrustList.StoreType = certificateStore.StoreType;\n                certificateTrustList.StorePath = certificateStore.StorePath;\n            }\n        }\n\n        /// <summary>\n        /// Applies the configuration settings to the own app certificate.\n        /// </summary>\n        /// <param name=\"certificateIdentifiers\"></param>\n        /// <param name=\"certificateStore\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificateIdentifiers\"/>\n        /// is <c>null</c>.</exception>\n        public static void ApplyLocalConfig(\n            this CertificateIdentifierCollection certificateIdentifiers,\n            CertificateInfo? certificateStore)\n        {\n            ArgumentNullException.ThrowIfNull(certificateIdentifiers);\n\n            if (certificateStore == null)\n            {\n                return;\n            }\n\n            foreach (var certificateIdentifier in certificateIdentifiers)\n            {\n                if (certificateIdentifier.StorePath != certificateStore.StorePath)\n                {\n                    certificateIdentifier.StoreType = certificateStore.StoreType;\n                    certificateIdentifier.StorePath = certificateStore.StorePath;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Applies the configuration settings to the own app certificate.\n        /// </summary>\n        /// <param name=\"certificateIdentifiers\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"noPrivateKey\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificateIdentifiers\"/>\n        /// is <c>null</c>.</exception>\n        public static ICertificateStore OpenStore(\n            this CertificateIdentifierCollection certificateIdentifiers,\n            SecurityOptions options, bool noPrivateKey = false)\n        {\n            ArgumentNullException.ThrowIfNull(certificateIdentifiers);\n            if (certificateIdentifiers.Count > 0)\n            {\n                Debug.Assert(certificateIdentifiers\n                    .All(x => x.StorePath == certificateIdentifiers[0].StorePath));\n                Debug.Assert(certificateIdentifiers\n                    .All(x => x.StoreType == certificateIdentifiers[0].StoreType));\n                return certificateIdentifiers[0].OpenStore();\n            }\n\n            ArgumentNullException.ThrowIfNull(options.ApplicationCertificates);\n            return new CertificateStoreIdentifier(options.ApplicationCertificates.StorePath,\n                options.ApplicationCertificates.StoreType, noPrivateKey).OpenStore();\n        }\n\n        /// <summary>\n        /// Apply the configured settings provided via a CertificateStore to a\n        /// CertificateStoreIdentifier. Particularily used for rejected\n        /// certificates store.\n        /// </summary>\n        /// <param name=\"certificateStoreIdentifier\"></param>\n        /// <param name=\"certificateStore\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificateStore\"/>\n        /// is <c>null</c>.</exception>\n        public static void ApplyLocalConfig(\n            this CertificateStoreIdentifier certificateStoreIdentifier,\n            CertificateStore? certificateStore)\n        {\n            ArgumentNullException.ThrowIfNull(certificateStoreIdentifier);\n\n            if (certificateStore == null)\n            {\n                return;\n            }\n\n            if (certificateStoreIdentifier.StorePath != certificateStore.StorePath)\n            {\n                certificateStoreIdentifier.StoreType = certificateStore.StoreType;\n                certificateStoreIdentifier.StorePath = certificateStore.StorePath;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/CertificateTrustListEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Certificate trust list extensions\n    /// </summary>\n    public static class CertificateTrustListEx\n    {\n        /// <summary>\n        /// Remove certficates\n        /// </summary>\n        /// <param name=\"trustList\"></param>\n        /// <param name=\"certificates\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificates\"/> is <c>null</c>.</exception>\n        public static async Task RemoveAsync(this CertificateTrustList trustList,\n            IEnumerable<X509Certificate2> certificates, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(certificates);\n            using var trustedStore = trustList.OpenStore();\n            await trustedStore.RemoveAsync(certificates, ct).ConfigureAwait(false);\n            foreach (var cert in certificates)\n            {\n                trustList.TrustedCertificates.Remove(new CertificateIdentifier(cert));\n            }\n        }\n\n        /// <summary>\n        /// Add to trust list\n        /// </summary>\n        /// <param name=\"trustList\"></param>\n        /// <param name=\"certificates\"></param>\n        /// <param name=\"noCopy\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificates\"/> is <c>null</c>.</exception>\n        public static async Task AddAsync(this CertificateTrustList trustList,\n            IEnumerable<X509Certificate2> certificates, bool noCopy = false,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(certificates);\n            using var trustedStore = trustList.OpenStore();\n            await trustedStore.AddAsync(certificates, noCopy, ct: ct).ConfigureAwait(false);\n            foreach (var cert in certificates)\n            {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                trustList.TrustedCertificates.Add(new CertificateIdentifier(\n                    noCopy ? cert : new X509Certificate2(cert)));\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/ContainerBuilderEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Runtime;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Autofac;\n\n    /// <summary>\n    /// Container builder extensions\n    /// </summary>\n    public static class ContainerBuilderEx\n    {\n        /// <summary>\n        /// Configure services\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public static void AddOpcUaStack(this ContainerBuilder builder)\n        {\n            builder.RegisterInstance(IMetricsContext.Empty)\n                .AsImplementedInterfaces().IfNotRegistered(typeof(IMetricsContext));\n\n            builder.RegisterType<OpcUaStack>()\n                .AsImplementedInterfaces().SingleInstance().AutoActivate();\n            builder.RegisterType<OpcUaStackKeySetLogger>()\n                .AsImplementedInterfaces().SingleInstance().AutoActivate();\n            builder.RegisterType<OpcUaApplication>()\n                .AsImplementedInterfaces().SingleInstance();\n            builder.RegisterType<OpcUaClientManager>()\n                .AsImplementedInterfaces().SingleInstance();\n\n            builder.RegisterType<OpcUaClientConfig>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<OpcUaSubscriptionConfig>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<ConsoleWriter>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<AvroFileWriter>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<ZipFileWriter>()\n                .AsImplementedInterfaces();\n\n            builder.RegisterType<FilterQueryParser>()\n                .AsImplementedInterfaces();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/DataValueEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Opc.Ua;\n    using System;\n    using System.Diagnostics.CodeAnalysis;\n\n    /// <summary>\n    /// Datavalue extensions\n    /// </summary>\n    public static class DataValueEx\n    {\n        /// <summary>\n        /// Unpack with a default value\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dataValue\"></param>\n        /// <param name=\"convert\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(defaultValue))]\n        public static T? GetValueOrDefaultEx<T>(this DataValue dataValue,\n            Func<T?, T?> convert, T? defaultValue = default)\n        {\n            var result = GetValueOrDefaultEx(dataValue, defaultValue);\n            return convert(result);\n        }\n\n        /// <summary>\n        /// Unpack with a default value\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dataValue\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(defaultValue))]\n        public static T? GetValueOrDefaultEx<T>(this DataValue dataValue,\n            T? defaultValue = default)\n        {\n            if (dataValue == null)\n            {\n                return defaultValue;\n            }\n            var value = dataValue.Value;\n            if (value == null)\n            {\n                return defaultValue;\n            }\n            while (typeof(T).IsEnum)\n            {\n                try\n                {\n                    return (T)Enum.ToObject(typeof(T), value);\n                }\n                catch\n                {\n                    break;\n                }\n            }\n            while (!typeof(T).IsInstanceOfType(value))\n            {\n                try\n                {\n                    return value.As<T>();\n                }\n                catch\n                {\n                    break;\n                }\n            }\n            try\n            {\n                return (T)value;\n            }\n            catch\n            {\n                return defaultValue;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/DiscoveredEndpointModelEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Discovered Endpoint Model extensions\n    /// </summary>\n    public static class DiscoveredEndpointModelEx\n    {\n        /// <summary>\n        /// Create server model\n        /// </summary>\n        /// <param name=\"result\"></param>\n        /// <param name=\"hostAddress\"></param>\n        /// <param name=\"siteId\"></param>\n        /// <param name=\"discovererId\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <returns></returns>\n        public static ApplicationRegistrationModel ToServiceModel(this DiscoveredEndpointModel result,\n            string hostAddress, string? siteId, string discovererId, IJsonSerializer serializer)\n        {\n            var type = result.Description.Server.ApplicationType.ToServiceType() ??\n                ApplicationType.Server;\n            return new ApplicationRegistrationModel\n            {\n                Application = new ApplicationInfoModel\n                {\n                    SiteId = siteId ?? discovererId,\n                    DiscovererId = discovererId,\n                    ApplicationType = type,\n                    ApplicationId = ApplicationInfoModelEx.CreateApplicationId(siteId ?? discovererId,\n                        result.Description.Server.ApplicationUri, type),\n                    ProductUri = result.Description.Server.ProductUri,\n                    ApplicationUri = result.Description.Server.ApplicationUri,\n                    DiscoveryUrls = new HashSet<string>(result.Description.Server.DiscoveryUrls),\n                    DiscoveryProfileUri = result.Description.Server.DiscoveryProfileUri,\n                    HostAddresses = new HashSet<string> { hostAddress },\n                    ApplicationName = result.Description.Server.ApplicationName.Text,\n                    LocalizedNames = string.IsNullOrEmpty(result.Description.Server.ApplicationName.Locale) ?\n                        null : new Dictionary<string, string>\n                        {\n                            [result.Description.Server.ApplicationName.Locale] =\n                                result.Description.Server.ApplicationName.Text\n                        },\n                    NotSeenSince = null,\n                    Capabilities = new HashSet<string>(result.Capabilities)\n                },\n                Endpoints = new List<EndpointRegistrationModel> {\n                    new() {\n                        SiteId = siteId,\n                        DiscovererId = discovererId,\n                        Id = string.Empty,\n                        SecurityLevel = result.Description.SecurityLevel,\n                        AuthenticationMethods = result.Description.UserIdentityTokens\n                            .ToServiceModel(serializer),\n                        EndpointUrl = result.Description.EndpointUrl, // Reported\n                        Endpoint = new EndpointModel {\n                            Url = result.AccessibleEndpointUrl, // Accessible\n                            AlternativeUrls = new HashSet<string> {\n                                result.AccessibleEndpointUrl,\n                                result.Description.EndpointUrl\n                            },\n                            Certificate = result.Description.ServerCertificate?.ToThumbprint(),\n                            SecurityMode = result.Description.SecurityMode.ToServiceType() ??\n                                SecurityMode.None,\n                            SecurityPolicy = result.Description.SecurityPolicyUri\n                        }\n                    }\n                }\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/DiscoveryClientEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n// #define USE_TASK_RUN\n\nnamespace Opc.Ua.Client\n{\n    using System;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Discovery Client async extensions\n    /// </summary>\n    public static class DiscoveryClientEx\n    {\n        /// <summary>\n        /// Async find servers service\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"endpointUrl\"></param>\n        /// <param name=\"localeIds\"></param>\n        /// <param name=\"serverUris\"></param>\n        /// <returns></returns>\n        public static Task<FindServersResponse> FindServersAsync(this DiscoveryClient client,\n            RequestHeader requestHeader, string endpointUrl, StringCollection? localeIds,\n            StringCollection? serverUris)\n        {\n#if !USE_TASK_RUN\n            return Task.Factory.FromAsync(\n                (callback, state) => client.BeginFindServers(requestHeader, endpointUrl,\n                    localeIds, serverUris, callback, state),\n                result =>\n                {\n                    var response = client.EndFindServers(result, out var results);\n                    return NewFindServersResponse(response, results);\n                }, TaskCreationOptions.DenyChildAttach);\n#else\n            return Task.Run(() => {\n                var response = client.FindServers(requestHeader, endpointUrl,\n                    localeIds, serverUris, out var results);\n                return NewFindServersResponse(response, results);\n            });\n#endif\n        }\n\n        /// <summary>\n        /// Async find servers on network service\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"startingRecordId\"></param>\n        /// <param name=\"maxRecordsToReturn\"></param>\n        /// <param name=\"serverCapabilityFilter\"></param>\n        /// <returns></returns>\n        public static Task<FindServersOnNetworkResponse> FindServersOnNetworkAsync(\n            this DiscoveryClient client, RequestHeader requestHeader,\n            uint startingRecordId, uint maxRecordsToReturn,\n            StringCollection serverCapabilityFilter)\n        {\n#if !USE_TASK_RUN\n            return Task.Factory.FromAsync(\n                (callback, state) => client.BeginFindServersOnNetwork(requestHeader,\n                    startingRecordId, maxRecordsToReturn, serverCapabilityFilter,\n                    callback, state),\n                result =>\n                {\n                    var response = client.EndFindServersOnNetwork(result,\n                        out var lastCounterResetTime, out var servers);\n                    return NewFindServersOnNetworkResponse(response,\n                        lastCounterResetTime, servers);\n                }, TaskCreationOptions.DenyChildAttach);\n#else\n            return Task.Run(() => {\n                var response = client.FindServersOnNetwork(requestHeader, startingRecordId,\n                    maxRecordsToReturn, serverCapabilityFilter,\n                    out var lastCounterResetTime, out var servers);\n                return NewFindServersOnNetworkResponse(response,\n                    lastCounterResetTime, servers);\n            });\n#endif\n        }\n\n        /// <summary>\n        /// Async get endpoints service\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"endpointUrl\"></param>\n        /// <param name=\"localeIds\"></param>\n        /// <param name=\"profileUris\"></param>\n        /// <returns></returns>\n        public static Task<GetEndpointsResponse> GetEndpointsAsync(\n            this DiscoveryClient client, RequestHeader requestHeader,\n            string endpointUrl, StringCollection? localeIds, StringCollection? profileUris)\n        {\n#if !USE_TASK_RUN\n            return Task.Factory.FromAsync(\n                (callback, state) => client.BeginGetEndpoints(requestHeader,\n                    endpointUrl, localeIds, profileUris, callback, state),\n                result =>\n                {\n                    var response = client.EndGetEndpoints(result, out var endpoints);\n                    return NewGetEndpointsResponse(response, endpoints);\n                }, TaskCreationOptions.DenyChildAttach);\n#else\n            return Task.Run(() => {\n                var response = client.GetEndpoints(requestHeader, endpointUrl, localeIds,\n                    profileUris, out var endpoints);\n                return NewGetEndpointsResponse(response, endpoints);\n            });\n#endif\n        }\n\n        /// <summary>\n        /// Get endpoints response constructor\n        /// </summary>\n        /// <param name=\"response\"></param>\n        /// <param name=\"endpoints\"></param>\n        /// <returns></returns>\n        private static GetEndpointsResponse NewGetEndpointsResponse(ResponseHeader response,\n            EndpointDescriptionCollection endpoints)\n        {\n            return new GetEndpointsResponse\n            {\n                Endpoints = endpoints,\n                ResponseHeader = response\n            };\n        }\n\n        /// <summary>\n        /// Find servers on network response constructor\n        /// </summary>\n        /// <param name=\"response\"></param>\n        /// <param name=\"lastCounterResetTime\"></param>\n        /// <param name=\"servers\"></param>\n        /// <returns></returns>\n        private static FindServersOnNetworkResponse NewFindServersOnNetworkResponse(\n            ResponseHeader response, DateTime lastCounterResetTime,\n            ServerOnNetworkCollection servers)\n        {\n            return new FindServersOnNetworkResponse\n            {\n                ResponseHeader = response,\n                Servers = servers,\n                LastCounterResetTime = lastCounterResetTime\n            };\n        }\n\n        /// <summary>\n        /// Find servers response constructor\n        /// </summary>\n        /// <param name=\"response\"></param>\n        /// <param name=\"results\"></param>\n        /// <returns></returns>\n        private static FindServersResponse NewFindServersResponse(ResponseHeader response,\n            ApplicationDescriptionCollection results)\n        {\n            return new FindServersResponse\n            {\n                ResponseHeader = response,\n                Servers = results\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/EndpointDescriptionEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n\n    /// <summary>\n    /// Endpoint description extensions\n    /// </summary>\n    public static class EndpointDescriptionEx\n    {\n        /// <summary>\n        /// Matches model\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static bool IsSameAs(this EndpointDescription endpoint,\n            EndpointModel model)\n        {\n            if (endpoint.SecurityMode.IsSame(model.SecurityMode ?? SecurityMode.SignAndEncrypt))\n            {\n                return false;\n            }\n            if (string.IsNullOrEmpty(model.SecurityPolicy))\n            {\n                return true;\n            }\n            return endpoint.SecurityPolicyUri == model.SecurityPolicy;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/FileSystemEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Buffers;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// File system methods\n    /// </summary>\n    public static class FileSystemEx\n    {\n        /// <summary>\n        /// Get file info\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<(FileInfoModel?, ServiceResultModel?)> GetFileInfoAsync(\n            this IOpcUaSession session, RequestHeader header, NodeId nodeId,\n            CancellationToken ct = default)\n        {\n            try\n            {\n                var browsePaths = new string[]\n                {\n                    BrowseNames.Size,\n                    BrowseNames.Writable,\n                    BrowseNames.UserWritable,\n                    BrowseNames.OpenCount,\n                    BrowseNames.MimeType,\n                    BrowseNames.MaxByteStringLength,\n                    BrowseNames.LastModifiedTime\n                };\n                var response = await session.Services.TranslateBrowsePathsToNodeIdsAsync(\n                    header, browsePaths.Select(b => new BrowsePath\n                    {\n                        StartingNode = nodeId,\n                        RelativePath = new RelativePath(b)\n                    }).ToArray(), ct).ConfigureAwait(false);\n                Debug.Assert(response != null);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, browsePaths);\n                if (results.ErrorInfo != null)\n                {\n                    return (null, results.ErrorInfo);\n                }\n                if (results.All(r => r.ErrorInfo != null))\n                {\n                    return (null, new ServiceResultModel\n                    {\n                        StatusCode = StatusCodes.BadNotFound,\n                        ErrorMessage = \"File info not found.\"\n                    });\n                }\n                var read = await session.Services.ReadAsync(header, 0.0,\n                    Opc.Ua.TimestampsToReturn.Neither, results\n                        .Select(r => r.Result.Targets.Count > 0 ?\n                            r.Result.Targets[0].TargetId : ExpandedNodeId.Null)\n                        .Select(n => new ReadValueId\n                        {\n                            AttributeId = Attributes.Value,\n                            NodeId = n.ToNodeId(session.MessageContext.NamespaceUris)\n                        })\n                        .ToArray(), ct).ConfigureAwait(false);\n                var values = read.Validate(read.Results, r => r.StatusCode, read.DiagnosticInfos,\n                    browsePaths);\n                if (values.ErrorInfo != null)\n                {\n                    return (null, results.ErrorInfo);\n                }\n                return (new FileInfoModel\n                {\n                    Size = values[0].Result?.Value as long? ?? 0,\n                    //\n                    Writable = values[2].Result?.Value as bool? ?? false,\n                    OpenCount = values[3].Result?.Value as ushort? ?? 0,\n                    MimeType = values[4].Result?.Value as string,\n                    MaxBufferSize = values[5].Result?.Value as uint?,\n                    LastModified = values[6].Result?.Value as DateTime?\n                }, null);\n            }\n            catch (Exception ex)\n            {\n                return (null, ex.ToServiceResultModel());\n            }\n        }\n\n        /// <summary>\n        /// Get buffer size\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<int> GetBufferSizeAsync(this IOpcUaSession session,\n            RequestHeader header, NodeId nodeId, CancellationToken ct = default)\n        {\n            try\n            {\n                var (fileInfo, errorInfo) = await session.GetFileInfoAsync(\n                    header, nodeId, ct).ConfigureAwait(false);\n                var bufferSize = fileInfo?.MaxBufferSize;\n                if (errorInfo == null &&\n                    bufferSize > 0 && bufferSize < int.MaxValue)\n                {\n                    return (int)bufferSize.Value;\n                }\n                var caps = await session.GetOperationLimitsAsync(\n                    ct).ConfigureAwait(false);\n                bufferSize = caps.MaxByteStringLength;\n                if (bufferSize > 0 && bufferSize < int.MaxValue)\n                {\n                    return (int)bufferSize.Value;\n                }\n                return 4096;\n            }\n            catch\n            {\n                return 4096;\n            }\n        }\n\n        /// <summary>\n        /// Open file\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"mode\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<(uint?, ServiceResultModel?)> OpenAsync(this IOpcUaSession session,\n            RequestHeader header, NodeId nodeId, byte mode, CancellationToken ct)\n        {\n            try\n            {\n                // Call open method\n                var request = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = nodeId,\n                        MethodId = MethodIds.FileType_Open,\n                        InputArguments = new [] { new Variant(mode) }\n                    }\n                };\n                var response = await session.Services.CallAsync(header, request, ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, request);\n                if (results.ErrorInfo != null)\n                {\n                    return (null, results.ErrorInfo);\n                }\n                if (results[0].ErrorInfo != null ||\n                    results[0].Result?.OutputArguments == null ||\n                    results[0].Result.OutputArguments.Count == 0 ||\n                    results[0].Result.OutputArguments[0].Value is not uint fileHandle)\n                {\n                    return (null, results[0].ErrorInfo ?? new ServiceResultModel\n                    {\n                        ErrorMessage = \"no file handle returned\"\n                    });\n                }\n                return (fileHandle, null);\n            }\n            catch (Exception ex)\n            {\n                return (null, ex.ToServiceResultModel());\n            }\n        }\n\n        /// <summary>\n        /// Write buffer at current position in file\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"fileHandle\"></param>\n        /// <param name=\"buffer\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<ServiceResultModel?> WriteAsync(this IOpcUaSession session,\n            RequestHeader header, NodeId nodeId, uint fileHandle, ReadOnlyMemory<byte> buffer,\n            CancellationToken ct)\n        {\n            try\n            {\n                // Call write method\n                var request = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = nodeId,\n                        MethodId = MethodIds.FileType_Write,\n                        InputArguments = new []\n                        {\n                            new Variant(fileHandle),\n                            new Variant(buffer.ToArray())\n                        }\n                    }\n                };\n                var response = await session.Services.CallAsync(header, request, ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, request);\n                return results.ErrorInfo;\n            }\n            catch (Exception ex)\n            {\n                return ex.ToServiceResultModel();\n            }\n        }\n\n        /// <summary>\n        /// Read from current position in file\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"fileHandle\"></param>\n        /// <param name=\"length\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<(byte[]?, ServiceResultModel?)> ReadAsync(this IOpcUaSession session,\n            RequestHeader header, NodeId nodeId, uint fileHandle, int length,\n            CancellationToken ct)\n        {\n            try\n            {\n                // Call read method\n                var request = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = nodeId,\n                        MethodId = MethodIds.FileType_Read,\n                        InputArguments = new [] { new Variant(fileHandle), new Variant(length) }\n                    }\n                };\n                var response = await session.Services.CallAsync(header, request, ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, request);\n                if (results.ErrorInfo != null)\n                {\n                    return (null, results.ErrorInfo);\n                }\n                if (results[0].Result?.OutputArguments == null ||\n                    results[0].Result.OutputArguments.Count == 0 ||\n                    results[0].Result.OutputArguments[0].Value is not byte[] byteString)\n                {\n                    byteString = [];\n                }\n                return (byteString, null);\n            }\n            catch (Exception ex)\n            {\n                return (null, ex.ToServiceResultModel());\n            }\n        }\n\n        /// <summary>\n        /// Close file handle of file\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"alternativeCloseMethod\"></param>\n        /// <param name=\"fileHandle\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task<ServiceResultModel?> CloseAsync(this IOpcUaSession session,\n            RequestHeader header, NodeId nodeId, NodeId? alternativeCloseMethod,\n            uint fileHandle, CancellationToken ct)\n        {\n            // Call close method\n            try\n            {\n                var request = new CallMethodRequestCollection\n                {\n                    new CallMethodRequest\n                    {\n                        ObjectId = nodeId,\n                        MethodId = alternativeCloseMethod ?? MethodIds.FileType_Close,\n                        InputArguments = new [] { new Variant(fileHandle) }\n                    }\n                };\n                var response = await session.Services.CallAsync(header, request, ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, r => r.StatusCode,\n                    response.DiagnosticInfos, request);\n                return results.ErrorInfo;\n            }\n            catch (Exception ex)\n            {\n                return ex.ToServiceResultModel();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/FilterEncoderEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n\n    /// <summary>\n    /// Filter conversion\n    /// </summary>\n    public static class FilterEncoderEx\n    {\n        /// <summary>\n        /// Gets a default event filter.\n        /// </summary>\n        /// <returns></returns>\n        public static EventFilter GetDefaultEventFilter()\n        {\n            var filter = new EventFilter();\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.EventId);\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.EventType);\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.SourceNode);\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.SourceName);\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.Time);\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.ReceiveTime);\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.LocalTime);\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.Message);\n            filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.Severity);\n            return filter;\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"model\"></param>\n        /// <param name=\"noDefaultFilter\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static EventFilter? Decode(this IVariantEncoder encoder, EventFilterModel? model,\n            bool noDefaultFilter = false)\n        {\n            if (model is null)\n            {\n                return noDefaultFilter ? null : GetDefaultEventFilter();\n            }\n            if (!(model.SelectClauses?.Any() ?? false))\n            {\n                return noDefaultFilter ? throw new ArgumentException(\"Missing select clause\")\n                    : GetDefaultEventFilter();\n            }\n            return new EventFilter\n            {\n                SelectClauses = new SimpleAttributeOperandCollection(\n                    model.SelectClauses == null ? [] :\n                    model.SelectClauses.Select(c => c.ToStackModel(encoder.Context))),\n                //\n                // Per Part 4 only allow simple attribute operands in where clause\n                // elements of event filters.\n                //\n                WhereClause = encoder.Decode(model.WhereClause, true)\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"model\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static EventFilterModel? Encode(this IVariantEncoder encoder,\n            EventFilter? model, NamespaceFormat namespaceFormat)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new EventFilterModel\n            {\n                SelectClauses = model.SelectClauses?\n                    .Select(c => c.ToServiceModel(encoder.Context, namespaceFormat))\n                    .ToList(),\n                WhereClause = encoder.Encode(model.WhereClause, namespaceFormat)\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"model\"></param>\n        /// <param name=\"onlySimpleAttributeOperands\"></param>\n        /// <returns></returns>\n        public static ContentFilter Decode(this IVariantEncoder encoder, ContentFilterModel? model,\n            bool onlySimpleAttributeOperands = false)\n        {\n            if (model is null)\n            {\n                return new ContentFilter();\n            }\n            return new ContentFilter\n            {\n                Elements = new ContentFilterElementCollection(model.Elements == null ?\n                    [] : model.Elements\n                        .Select(e => encoder.Decode(e, onlySimpleAttributeOperands)))\n            };\n        }\n\n        /// <summary>\n        /// Convert to service model\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"model\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ContentFilterModel? Encode(this IVariantEncoder encoder,\n            ContentFilter? model, NamespaceFormat namespaceFormat)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new ContentFilterModel\n            {\n                Elements = model.Elements?\n                    .Select(e => encoder.Encode(e, namespaceFormat))\n                    .ToList()\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"model\"></param>\n        /// <param name=\"onlySimpleAttributeOperands\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ContentFilterElement? Decode(this IVariantEncoder encoder,\n            ContentFilterElementModel? model, bool onlySimpleAttributeOperands = false)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new ContentFilterElement\n            {\n                FilterOperands = new ExtensionObjectCollection(model.FilterOperands == null ?\n                    [] : model.FilterOperands\n                        .Select(e => new ExtensionObject(\n                            encoder.Decode(e, onlySimpleAttributeOperands)))),\n                FilterOperator = model.FilterOperator.ToStackType()\n            };\n        }\n\n        /// <summary>\n        /// Convert to service model\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"model\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ContentFilterElementModel? Encode(this IVariantEncoder encoder,\n            ContentFilterElement? model, NamespaceFormat namespaceFormat)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new ContentFilterElementModel\n            {\n                FilterOperands = model.FilterOperands\n                    .Select(e => e.Body)\n                    .Cast<FilterOperand>()\n                    .Select(o => encoder.Encode(o, namespaceFormat))\n                    .ToList(),\n                FilterOperator = model.FilterOperator.ToServiceType()\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"model\"></param>\n        /// <param name=\"onlySimpleAttributeOperands\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static FilterOperand? Decode(this IVariantEncoder encoder,\n            FilterOperandModel? model, bool onlySimpleAttributeOperands = false)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            if (model.Index != null)\n            {\n                return new ElementOperand\n                {\n                    Index = model.Index.Value\n                };\n            }\n            if (model.Value != null)\n            {\n                var typeInfo = new TypeInfo(BuiltInType.NodeId, ValueRanks.Scalar);\n                try\n                {\n                    // assume it's a node and try to parse it into correct namespace index\n                    // if it fails, it's ok it will go to the default route\n                    var nodeId = encoder.Decode(model.Value, null);\n                    var typeDefinitionId = nodeId.ToString().ToNodeId(encoder.Context);\n                    if (typeDefinitionId != null)\n                    {\n                        return new LiteralOperand(TypeInfo.Cast(typeDefinitionId, typeInfo.BuiltInType));\n                    }\n                }\n                catch { }\n                return new LiteralOperand(TypeInfo.Cast(encoder.Decode(model.Value, null), typeInfo.BuiltInType));\n            }\n            if (model.Alias != null && !onlySimpleAttributeOperands)\n            {\n                return new AttributeOperand\n                {\n                    Alias = model.Alias,\n                    NodeId = model.NodeId.ToNodeId(encoder.Context),\n                    AttributeId = (uint)(model.AttributeId ?? NodeAttribute.Value),\n                    BrowsePath = model.BrowsePath.ToRelativePath(encoder.Context),\n                    IndexRange = model.IndexRange\n                };\n            }\n            return new SimpleAttributeOperand\n            {\n                TypeDefinitionId = model.NodeId.ToNodeId(encoder.Context),\n                AttributeId = (uint)(model.AttributeId ?? NodeAttribute.Value),\n                BrowsePath = new QualifiedNameCollection(model.BrowsePath == null ?\n                    [] :\n                    model.BrowsePath.Select(n => n.ToQualifiedName(encoder.Context))),\n                IndexRange = model.IndexRange\n            };\n        }\n\n        /// <summary>\n        /// Convert to service model\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"model\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static FilterOperandModel? Encode(this IVariantEncoder encoder,\n            FilterOperand? model, NamespaceFormat namespaceFormat)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            switch (model)\n            {\n                case ElementOperand elem:\n                    return new FilterOperandModel\n                    {\n                        Index = elem.Index\n                    };\n                case LiteralOperand lit:\n                    return new FilterOperandModel\n                    {\n                        Value = encoder.Encode(lit.Value, out _)\n                    };\n                case AttributeOperand attr:\n                    return new FilterOperandModel\n                    {\n                        NodeId = attr.NodeId.AsString(encoder.Context, namespaceFormat),\n                        AttributeId = (NodeAttribute)attr.AttributeId,\n                        BrowsePath = attr.BrowsePath.AsString(encoder.Context, namespaceFormat),\n                        IndexRange = attr.IndexRange,\n                        Alias = attr.Alias\n                    };\n                case SimpleAttributeOperand sattr:\n                    return new FilterOperandModel\n                    {\n                        NodeId = sattr.TypeDefinitionId.AsString(encoder.Context, namespaceFormat),\n                        AttributeId = (NodeAttribute)sattr.AttributeId,\n                        BrowsePath = sattr.BrowsePath?\n                            .Select(p => p.AsString(encoder.Context, namespaceFormat))\n                            .ToArray(),\n                        IndexRange = sattr.IndexRange\n                    };\n                default:\n                    throw new NotSupportedException(\"Operand not supported\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/MonitoredItemEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Linq;\n\n    /// <summary>\n    /// Base monitored item extensions\n    /// </summary>\n    internal static class MonitoredItemEx\n    {\n        /// <summary>\n        /// Set defaults from configuration\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        public static BaseMonitoredItemModel SetDefaults(this BaseMonitoredItemModel item,\n            OpcUaSubscriptionOptions options)\n        {\n            switch (item)\n            {\n                case MonitoredAddressSpaceModel mas:\n                    return mas with\n                    {\n                        RebrowsePeriod = mas.RebrowsePeriod\n                            ?? options.DefaultRebrowsePeriod\n                            ?? TimeSpan.FromHours(12),\n                        //\n                        // see https://reference.opcfoundation.org/v104/Core/docs/Part4/7.16/\n                        // 0 the Server returns the default queue size for Event Notifications\n                        // as revisedQueueSize for event monitored items.\n                        //\n                        QueueSize = item.QueueSize\n                            ?? options.DefaultQueueSize\n                            ?? 0,\n                        DiscardNew = item.DiscardNew\n                            ?? options.DefaultDiscardNew,\n                        MonitoringMode = item.MonitoringMode\n                            ?? MonitoringMode.Reporting,\n                        FetchDataSetFieldName = item.FetchDataSetFieldName\n                            ?? options.ResolveDisplayName,\n                        AutoSetQueueSize = item.AutoSetQueueSize\n                            ?? options.AutoSetQueueSizes,\n                        TriggeredItems = item.TriggeredItems?\n                            .Select(ti => ti.SetDefaults(options))\n                            .ToList(),\n                    };\n                case DataMonitoredItemModel dmi:\n                    return dmi with\n                    {\n                        SamplingInterval = dmi.SamplingInterval\n                            ?? options.DefaultSamplingInterval,\n                        HeartbeatBehavior = dmi.HeartbeatBehavior\n                            ?? options.DefaultHeartbeatBehavior,\n                        HeartbeatInterval = dmi.HeartbeatInterval\n                            ?? options.DefaultHeartbeatInterval,\n                        SkipFirst = dmi.SkipFirst\n                            ?? options.DefaultSkipFirst,\n\n                        //\n                        // see https://reference.opcfoundation.org/v104/Core/docs/Part4/7.16/\n                        // 0 or 1 the Server returns the default queue size which shall be 1\n                        // as revisedQueueSize for data monitored items. The queue has a single\n                        // entry, effectively disabling queuing. This is the default behavior\n                        // since beginning of publisher time.\n                        //\n                        QueueSize = item.QueueSize\n                            ?? options.DefaultQueueSize\n                            ?? 1,\n                        DiscardNew = item.DiscardNew\n                            ?? options.DefaultDiscardNew,\n                        FetchDataSetFieldName = item.FetchDataSetFieldName\n                            ?? options.ResolveDisplayName,\n                        AutoSetQueueSize = item.AutoSetQueueSize\n                            ?? options.AutoSetQueueSizes,\n                        TriggeredItems = item.TriggeredItems?\n                            .Select(ti => ti.SetDefaults(options))\n                            .ToList(),\n\n                        SamplingUsingCyclicRead = dmi.SamplingUsingCyclicRead\n                            ?? options.DefaultSamplingUsingCyclicRead,\n                        CyclicReadMaxAge = dmi.CyclicReadMaxAge\n                            ?? options.DefaultCyclicReadMaxAge,\n\n                        DataChangeFilter = dmi.DataChangeFilter.SetDefaults(options)\n                    };\n                case EventMonitoredItemModel emi:\n                    return emi with\n                    {\n                        //\n                        // see https://reference.opcfoundation.org/v104/Core/docs/Part4/7.16/\n                        // 0 the Server returns the default queue size for Event Notifications\n                        // as revisedQueueSize for event monitored items.\n                        //\n                        QueueSize = item.QueueSize\n                            ?? options.DefaultQueueSize\n                            ?? 0,\n                        DiscardNew = item.DiscardNew\n                            ?? options.DefaultDiscardNew,\n                        FetchDataSetFieldName = item.FetchDataSetFieldName\n                            ?? options.ResolveDisplayName,\n                        AutoSetQueueSize = item.AutoSetQueueSize\n                            ?? options.AutoSetQueueSizes,\n                        TriggeredItems = item.TriggeredItems?\n                            .Select(ti => ti.SetDefaults(options))\n                            .ToList(),\n                    };\n                default:\n                    return item;\n            }\n        }\n\n        /// <summary>\n        /// Set default data change filter\n        /// </summary>\n        /// <param name=\"filter\"></param>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        private static DataChangeFilterModel? SetDefaults(\n            this DataChangeFilterModel? filter, OpcUaSubscriptionOptions options)\n        {\n            if (filter == null &&\n                options.DefaultDataChangeTrigger == null)\n            {\n                return null;\n            }\n            filter ??= new DataChangeFilterModel();\n            return filter with\n            {\n                DataChangeTrigger = filter.DataChangeTrigger\n                    ?? options.DefaultDataChangeTrigger\n                    ?? DataChangeTriggerType.StatusValue,\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/NodeStateEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Opc.Ua;\n    using System;\n\n    /// <summary>\n    /// Node state extensions\n    /// </summary>\n    public static class NodeStateEx\n    {\n        /// <summary>\n        /// Return value or update\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"state\"></param>\n        /// <param name=\"convert\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        public static TResult? GetValueOrDefaultEx<T, TResult>(this PropertyState<T> state,\n            Func<T?, TResult?> convert, T? defaultValue = default) where T : struct\n        {\n            var result = GetValueOrDefaultEx(state, defaultValue);\n            return convert(result);\n        }\n\n        /// <summary>\n        /// Return value or update\n        /// </summary>\n        /// <typeparam name=\"TValue\"></typeparam>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"state\"></param>\n        /// <param name=\"convert\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        public static TResult? GetValueOrDefaultEx<TValue, TResult>(this PropertyState<TValue> state,\n            Func<TValue?, TResult?> convert, TValue? defaultValue = null) where TValue : class\n        {\n            var result = GetValueOrDefaultEx(state, defaultValue);\n            return convert(result);\n        }\n\n        /// <summary>\n        /// Return value or default\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"state\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        public static T? GetValueOrDefaultEx<T>(this PropertyState<T> state,\n            T? defaultValue = default) where T : struct\n        {\n            if (!StatusCode.IsGood(state.StatusCode))\n            {\n                return defaultValue;\n            }\n            return state.Value;\n        }\n\n        /// <summary>\n        /// Return value or default\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"state\"></param>\n        /// <param name=\"defaultValue\"></param>\n        /// <returns></returns>\n        public static T? GetValueOrDefaultEx<T>(this PropertyState<T> state,\n            T? defaultValue = null) where T : class\n        {\n            if (!StatusCode.IsGood(state.StatusCode))\n            {\n                return defaultValue;\n            }\n            return state.Value;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/OperationLimitsEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Opc.Ua;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n\n    /// <summary>\n    /// Operation limits extensions\n    /// </summary>\n    public static class OperationLimitsEx\n    {\n        /// <summary>\n        /// Update limits\n        /// </summary>\n        /// <param name=\"limits\"></param>\n        /// <param name=\"update\"></param>\n        /// <returns></returns>\n        public static OperationLimits Override(this OperationLimits limits, OperationLimits? update)\n        {\n            if (update == null)\n            {\n                return limits;\n            }\n            return new OperationLimits\n            {\n                MaxMonitoredItemsPerCall\n                    = Override(limits.MaxMonitoredItemsPerCall, update.MaxMonitoredItemsPerCall),\n                MaxNodesPerBrowse\n                    = Override(limits.MaxNodesPerBrowse, update.MaxNodesPerBrowse),\n                MaxNodesPerHistoryReadData\n                    = Override(limits.MaxNodesPerHistoryReadData, update.MaxNodesPerHistoryReadData),\n                MaxNodesPerHistoryReadEvents\n                    = Override(limits.MaxNodesPerHistoryReadEvents, update.MaxNodesPerHistoryReadEvents),\n                MaxNodesPerHistoryUpdateData\n                    = Override(limits.MaxNodesPerHistoryUpdateData, update.MaxNodesPerHistoryUpdateData),\n                MaxNodesPerHistoryUpdateEvents\n                    = Override(limits.MaxNodesPerHistoryUpdateEvents, update.MaxNodesPerHistoryUpdateEvents),\n                MaxNodesPerMethodCall\n                    = Override(limits.MaxNodesPerMethodCall, update.MaxNodesPerMethodCall),\n                MaxNodesPerNodeManagement\n                    = Override(limits.MaxNodesPerNodeManagement, update.MaxNodesPerNodeManagement),\n                MaxNodesPerRead\n                    = Override(limits.MaxNodesPerRead, update.MaxNodesPerRead),\n                MaxNodesPerRegisterNodes\n                    = Override(limits.MaxNodesPerRegisterNodes, update.MaxNodesPerRegisterNodes),\n                MaxNodesPerTranslateBrowsePathsToNodeIds\n                    = Override(limits.MaxNodesPerTranslateBrowsePathsToNodeIds, update.MaxNodesPerTranslateBrowsePathsToNodeIds),\n                MaxNodesPerWrite\n                    = Override(limits.MaxNodesPerWrite, update.MaxNodesPerWrite)\n            };\n\n            static uint Override(uint a, uint b) => b == 0u ? a : b < a ? b : a;\n        }\n\n        /// <summary>\n        /// Max nodes per browse\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static int GetMaxNodesPerBrowse(this OperationLimitsModel model)\n        {\n            var cur = model.MaxNodesPerBrowse ?? 0;\n            return Math.Min(Math.Max((int)cur, 1), kMaxBrowseNodes);\n        }\n\n        /// <summary>\n        /// Max continuation points per browse\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static int GetMaxBrowseContinuationPoints(this OperationLimitsModel model)\n        {\n            var cur = model.MaxBrowseContinuationPoints ?? 0;\n            return Math.Min(Math.Max((int)cur, 1), kMaxBrowseContinuationPoints);\n        }\n\n        /// <summary>\n        /// Max nodes per read\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static int GetMaxNodesPerRead(this OperationLimitsModel model)\n        {\n            var cur = model.MaxNodesPerRead ?? 0;\n            return Math.Min(Math.Max((int)cur, 1), kMaxReadNodes);\n        }\n\n        /// <summary>\n        /// Max nodes per translate\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static int GetMaxNodesPerTranslatePathsToNodeIds(this OperationLimitsModel model)\n        {\n            var cur = model.MaxNodesPerTranslatePathsToNodeIds ?? 0;\n            return Math.Min(Math.Max((int)cur, 1), kMaxNodesPerTranslate);\n        }\n\n        /// <summary>\n        /// Max nodes per register\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static int GetMaxNodesPerRegisterNodes(this OperationLimitsModel model)\n        {\n            var cur = model.MaxNodesPerRegisterNodes ?? 0;\n            return Math.Min(Math.Max((int)cur, 1), kMaxNodesPerRegister);\n        }\n\n        /// <summary>\n        /// Max monitored items\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static int GetMaxMonitoredItemsPerCall(this OperationLimitsModel model)\n        {\n            var cur = model.MaxMonitoredItemsPerCall ?? 0;\n            return Math.Min(Math.Max((int)cur, 1), kMaxMonitoredItemsPerCall);\n        }\n\n        private const int kMaxReadNodes = 10000;\n        private const int kMaxNodesPerTranslate = 1000;\n        private const int kMaxBrowseNodes = 10000;\n        private const int kMaxNodesPerRegister = 10000;\n        private const int kMaxMonitoredItemsPerCall = 10000;\n        private const int kMaxBrowseContinuationPoints = 100;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/RelativePathEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Opc.Ua;\n    using Azure.IIoT.OpcUa.Encoders.Utils;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Relative path extensions\n    /// </summary>\n    public static class RelativePathEx\n    {\n        /// <summary>\n        /// Convert to path object\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        public static RelativePath ToRelativePath(this IReadOnlyList<string>? path,\n            IServiceMessageContext context)\n        {\n            if (path == null)\n            {\n                return new RelativePath();\n            }\n            return new RelativePath\n            {\n                Elements = new RelativePathElementCollection(path\n                    .Where(p => !string.IsNullOrEmpty(p))\n                    .Select(p => ParsePathElement(p, context)))\n            };\n        }\n\n        /// <summary>\n        /// Convert a relative path to path strings\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        public static IReadOnlyList<string>? AsString(this RelativePath path,\n            IServiceMessageContext context, NamespaceFormat namespaceFormat)\n        {\n            if (path == null)\n            {\n                return null;\n            }\n            return path.Elements\n                .Select(p => FormatRelativePathElement(p, context, namespaceFormat))\n                .ToList();\n        }\n\n        /// <summary>\n        /// Convert to path element object\n        /// </summary>\n        /// <param name=\"element\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        /// <exception cref=\"FormatException\"></exception>\n        private static RelativePathElement ParsePathElement(string element,\n            IServiceMessageContext context)\n        {\n            if (string.IsNullOrEmpty(element))\n            {\n                throw new ArgumentNullException(nameof(element));\n            }\n\n            var pathElement = new RelativePathElement\n            {\n                IncludeSubtypes = true,\n                IsInverse = false\n            };\n            //\n            // Parse relative path reference information\n            // This should allow\n            // - \"targeturi\" == \"/targeturi\"\n            // - \".targeturi\"\n            // - \"!.parenturi\"\n            // - \"!/parenturi\"\n            // - \"<!#uri>parenturi\"\n            //\n            var index = 0;\n            var exit = false;\n            var parseReference = false;\n            while (index < element.Length && !exit)\n            {\n                switch (element[index])\n                {\n                    case '<':\n                        if (pathElement.ReferenceTypeId == null)\n                        {\n                            parseReference = true;\n                            break;\n                        }\n                        throw new FormatException(\"Reference type set.\");\n                    case '!':\n                        pathElement.IsInverse = true;\n                        break;\n                    case '#':\n                        pathElement.IncludeSubtypes = false;\n                        break;\n                    case '/':\n                        if (pathElement.ReferenceTypeId == null &&\n                            !parseReference)\n                        {\n                            pathElement.ReferenceTypeId =\n                                ReferenceTypeIds.HierarchicalReferences;\n                            break;\n                        }\n                        throw new FormatException(\"Reference type set.\");\n                    case '.':\n                        if (pathElement.ReferenceTypeId == null &&\n                            !parseReference)\n                        {\n                            pathElement.ReferenceTypeId =\n                                ReferenceTypeIds.Aggregates;\n                            break;\n                        }\n                        throw new FormatException(\"Reference type set.\");\n                    default:\n                        if (element[index] == '&')\n                        {\n                            index++;\n                        }\n                        if (pathElement.ReferenceTypeId == null &&\n                            !parseReference)\n                        {\n                            // Set to all references\n                            pathElement.ReferenceTypeId =\n                                ReferenceTypeIds.References;\n                        }\n                        exit = true;\n                        break;\n                }\n                index++;\n            }\n            index--;\n            if (parseReference)\n            {\n                var to = index;\n                while (to < element.Length)\n                {\n                    if (element[to] == '>' && element[to - 1] != '&')\n                    {\n                        break;\n                    }\n                    to++;\n                    if (to == element.Length)\n                    {\n                        throw new FormatException(\n                            \"Reference path starts in < but does not end in >\");\n                    }\n                }\n                var reference = element[index..to];\n                // TODO: Deescape &<, &>, &/, &., &:, &&\n                index = to + 1;\n                pathElement.ReferenceTypeId = reference.ToNodeId(context);\n                if (NodeId.IsNull(pathElement.ReferenceTypeId) &&\n                    TypeMaps.ReferenceTypes.Value.TryGetIdentifier(reference,\n                        out var id))\n                {\n                    pathElement.ReferenceTypeId = id;\n                }\n            }\n            var target = element[index..];\n            // TODO: Deescape &<, &>, &/, &., &:, &&\n            if (string.IsNullOrEmpty(target))\n            {\n                throw new FormatException(\"Bad target name is empty\");\n            }\n            pathElement.TargetName = target.ToQualifiedName(context);\n            return pathElement;\n        }\n\n        /// <summary>\n        /// Format relative path element information\n        /// </summary>\n        /// <param name=\"element\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        private static string FormatRelativePathElement(RelativePathElement element,\n            IServiceMessageContext context, NamespaceFormat namespaceFormat)\n        {\n            var value = string.Empty;\n            var writeReference = false;\n            if (element.ReferenceTypeId == ReferenceTypeIds.HierarchicalReferences)\n            {\n                value += \"/\";\n            }\n            else if (element.ReferenceTypeId == ReferenceTypeIds.Aggregates)\n            {\n                value += \".\";\n            }\n            else if (element.ReferenceTypeId != ReferenceTypeIds.References)\n            {\n                value += \"<\";\n                writeReference = true;\n            }\n            if (element.IsInverse)\n            {\n                value += \"!\";\n            }\n            if (!element.IncludeSubtypes)\n            {\n                value += \"#\";\n            }\n            if (writeReference)\n            {\n                string? reference = null;\n                if (element.ReferenceTypeId.NamespaceIndex == 0 &&\n                    element.ReferenceTypeId.Identifier is uint id)\n                {\n                    TypeMaps.ReferenceTypes.Value.TryGetBrowseName(id, out reference);\n                }\n                if (string.IsNullOrEmpty(reference))\n                {\n                    reference = element.ReferenceTypeId.AsString(context, namespaceFormat);\n                }\n                // TODO: Escape <,>,/,:,&,.\n                value += reference + \">\";\n            }\n            var target = element.TargetName.AsString(context, namespaceFormat);\n            // TODO: Escape <,>,/,:,&,.\n            value += target;\n            return value;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/SequenceNumber.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Linq;\n    using System.Threading;\n\n    /// <summary>\n    /// A sequence number\n    /// </summary>\n    public static class SequenceNumber\n    {\n        /// <summary>\n        /// Increment sequence number\n        /// </summary>\n        /// <param name=\"seq\"></param>\n        /// <returns></returns>\n        public static uint Increment32(ref uint seq)\n        {\n            while (true)\n            {\n                var result = Interlocked.Increment(ref seq);\n                if (result != 0)\n                {\n                    return result;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Increment sequence number\n        /// </summary>\n        /// <param name=\"seq\"></param>\n        /// <returns></returns>\n        public static ushort Increment16(ref uint seq)\n        {\n            while (true)\n            {\n                var result = (ushort)Interlocked.Increment(ref seq);\n                if (result != 0)\n                {\n                    return result;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create a range of values missing between 2 sequence numbers\n        /// Considers wrap around\n        /// </summary>\n        /// <param name=\"from\"></param>\n        /// <param name=\"to\"></param>\n        /// <param name=\"dropped\"></param>\n        /// <returns></returns>\n        public static uint[] Missing(uint from, uint to, out bool dropped)\n        {\n            unchecked\n            {\n                var diff = Math.Abs((int)from - (int)to);\n                if (diff > 1)\n                {\n                    var (startAt, endAt) = (((int)from + diff) == (int)to) ? (from, to) : (to, from);\n                    dropped = from == startAt;\n                    var missing = new List<uint>(diff - 1);\n                    while (++startAt != endAt)\n                    {\n                        if (startAt != 0)\n                        {\n                            missing.Add(startAt);\n                        }\n                    }\n                    if (missing.Count > 0)\n                    {\n                        return [.. missing];\n                    }\n                }\n            }\n            dropped = false;\n            return [];\n        }\n\n        /// <summary>\n        /// Convert missing sequence numbers to string\n        /// </summary>\n        /// <param name=\"missingSequenceNumbers\"></param>\n        /// <returns></returns>\n        public static string ToString(uint[] missingSequenceNumbers)\n        {\n            switch (missingSequenceNumbers.Length)\n            {\n                case 0:\n                    return \"none\";\n                case 1:\n                    return missingSequenceNumbers[0].ToString(CultureInfo.InvariantCulture);\n                default:\n                    var length = missingSequenceNumbers.Length;\n                    if (length > 6)\n                    {\n                        var last = missingSequenceNumbers[length - 1];\n                        return $\"{missingSequenceNumbers[0]}...{last}\";\n                    }\n                    return missingSequenceNumbers\n                        .Select(a => a.ToString(CultureInfo.InvariantCulture))\n                        .Aggregate((a, b) => $\"{a}, {b}\");\n            }\n        }\n\n        /// <summary>\n        /// Validate the sequence number and update the last to current\n        /// </summary>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"lastSequenceNumber\"></param>\n        /// <param name=\"missing\"></param>\n        /// <param name=\"dropped\"></param>\n        /// <returns></returns>\n        public static bool Validate(uint sequenceNumber, ref uint lastSequenceNumber,\n            out uint[] missing, out bool dropped)\n        {\n            try\n            {\n                // Allow duplicates as events and data changes can be in the same notification\n                if (lastSequenceNumber != sequenceNumber)\n                {\n                    var expected = lastSequenceNumber + 1 == 0 ? 1 : lastSequenceNumber + 1;\n                    var ok = sequenceNumber == expected;\n                    if (!ok)\n                    {\n                        missing = [.. Missing(lastSequenceNumber, sequenceNumber, out dropped)];\n                        return false;\n                    }\n                }\n                missing = [];\n                dropped = false;\n                return true;\n            }\n            finally\n            {\n                lastSequenceNumber = sequenceNumber;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/ServiceResponseEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n\n    internal static class ServiceResponseEx\n    {\n        /// <summary>\n        /// Validate response\n        /// </summary>\n        /// <typeparam name=\"TRequest\"></typeparam>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"response\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"requested\"></param>\n        public static ServiceResponse<TRequest, TResult> Validate<TRequest, TResult>(\n            this IServiceResponse response, IEnumerable<TResult>? results,\n            Func<TResult, StatusCode> statusCode, DiagnosticInfoCollection? diagnostics,\n            IEnumerable<TRequest>? requested)\n        {\n            return new ServiceResponse<TRequest, TResult>(response, results,\n                statusCode, diagnostics, requested);\n        }\n\n        /// <summary>\n        /// Validate response\n        /// </summary>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"response\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"diagnostics\"></param>\n        public static ServiceResponse<object?, TResult> Validate<TResult>(\n            this IServiceResponse response, IEnumerable<TResult>? results,\n            Func<TResult, StatusCode> statusCode, DiagnosticInfoCollection? diagnostics)\n        {\n            return new ServiceResponse<object?, TResult>(response, results,\n                statusCode, diagnostics, null);\n        }\n\n        /// <summary>\n        /// Create a lookup table\n        /// </summary>\n        /// <typeparam name=\"TRequest\"></typeparam>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"response\"></param>\n        /// <returns></returns>\n        public static IDictionary<TRequest, (TResult, ServiceResultModel?)> AsLookupTable<TRequest, TResult>(\n            this ServiceResponse<TRequest, TResult> response) where TRequest : struct\n        {\n            var lookup = new Dictionary<TRequest, (TResult, ServiceResultModel?)>();\n            foreach (var operation in response)\n            {\n                lookup.AddOrUpdate(operation.Request, (operation.Result, operation.ErrorInfo));\n            }\n            return lookup;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/ServiceResultEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Exceptions;\n    using Opc.Ua;\n    using System;\n\n    /// <summary>\n    /// Service result model extensions\n    /// </summary>\n    internal static class ServiceResultEx\n    {\n        /// <summary>\n        /// Convert exception to service result model\n        /// </summary>\n        /// <param name=\"sr\"></param>\n        /// <returns></returns>\n        public static ServiceResultModel ToServiceResultModel(this ServiceResult sr)\n        {\n            return new ServiceResultModel\n            {\n                StatusCode = sr.Code,\n                ErrorMessage = sr.LocalizedText?.Text,\n                Locale = sr.LocalizedText?.Locale,\n                AdditionalInfo = sr.AdditionalInfo,\n                NamespaceUri = sr.NamespaceUri,\n                SymbolicId = sr.SymbolicId ?? sr.StatusCode.AsString(),\n                Inner = sr.InnerResult == null ||\n                    sr.InnerResult.StatusCode == StatusCodes.Good ?\n                        null : sr.InnerResult.ToServiceResultModel()\n            };\n        }\n        /// <summary>\n        /// Convert exception to service result model\n        /// </summary>\n        /// <param name=\"e\"></param>\n        /// <returns></returns>\n        public static ServiceResultModel ToServiceResultModel(this Exception e)\n        {\n            switch (e)\n            {\n                case ServiceResultException sre:\n                    return sre.Result.ToServiceResultModel();\n                case TimeoutException:\n                    return Create(StatusCodes.BadTimeout, e.Message);\n                case OperationCanceledException:\n                    return Create(StatusCodes.BadRequestCancelledByClient, e.Message);\n                case ResourceInvalidStateException:\n                    return Create(StatusCodes.BadInvalidState, e.Message);\n                case ResourceNotFoundException:\n                    return Create(StatusCodes.BadNotFound, e.Message);\n                case ResourceConflictException:\n                    return Create(StatusCodes.BadEntryExists, e.Message);\n                case ArgumentNullException:\n                    return Create(StatusCodes.BadArgumentsMissing, e.Message);\n                case ArgumentException:\n                    return Create(StatusCodes.BadInvalidArgument, e.Message);\n                default:\n                    return Create(StatusCodes.Bad, e.Message);\n            }\n            static ServiceResultModel Create(StatusCode code, string message) => new()\n            {\n                ErrorMessage = message,\n                SymbolicId = code.AsString(),\n                StatusCode = code.Code\n            };\n        }\n\n        /// <summary>\n        /// Create result recursively from diagnostics\n        /// </summary>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"stringTable\"></param>\n        /// <returns></returns>\n        public static ServiceResultModel CreateResultModel(this StatusCode statusCode,\n            DiagnosticInfo? diagnostics = null, StringCollection? stringTable = null)\n        {\n            return new ServiceResultModel\n            {\n                // The last operation result is the one that caused the service to fail.\n                StatusCode = statusCode.Code,\n                SymbolicId = stringTable?.GetStringFromTable(diagnostics?.SymbolicId) ??\n                    statusCode.AsString(),\n                ErrorMessage = stringTable?.GetStringFromTable(diagnostics?.LocalizedText),\n                NamespaceUri = stringTable?.GetStringFromTable(diagnostics?.NamespaceUri),\n                Locale = stringTable?.GetStringFromTable(diagnostics?.Locale),\n                AdditionalInfo = diagnostics?.AdditionalInfo,\n                Inner = diagnostics?.InnerStatusCode == null ||\n                    diagnostics.InnerStatusCode == StatusCodes.Good ? null :\n                    diagnostics.InnerStatusCode.CreateResultModel(\n                        diagnostics?.InnerDiagnosticInfo, stringTable)\n            };\n        }\n\n        /// <summary>\n        /// Get string from string table\n        /// </summary>\n        /// <param name=\"stringTable\"></param>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        private static string? GetStringFromTable(\n            this StringCollection stringTable, int? index)\n        {\n            if (index == null || stringTable == null ||\n                index.Value >= stringTable.Count ||\n                index.Value < 0)\n            {\n                return null;\n            }\n            var str = stringTable[index.Value];\n            if (string.IsNullOrWhiteSpace(str))\n            {\n                return null;\n            }\n            return str;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/SessionEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.Utils;\n    using Furly.Extensions.Serializers;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using NodeClass = Publisher.Models.NodeClass;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Runtime.CompilerServices;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Session Handle extensions\n    /// </summary>\n    public static class SessionEx\n    {\n        /// <summary>\n        /// Read attribute\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"attributeId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<(T?, ServiceResultModel?)> ReadAttributeAsync<T>(\n            this IOpcUaSession session, RequestHeader header, NodeId nodeId,\n            uint attributeId, CancellationToken ct = default)\n        {\n            var attributes = await session.ReadAttributeAsync<T>(header,\n                nodeId.YieldReturn(), attributeId, ct).ConfigureAwait(false);\n            return attributes.SingleOrDefault();\n        }\n\n        /// <summary>\n        /// Read attribute\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeIds\"></param>\n        /// <param name=\"attributeId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<IEnumerable<(T?, ServiceResultModel?)>> ReadAttributeAsync<T>(\n            this IOpcUaSession session, RequestHeader header, IEnumerable<NodeId> nodeIds,\n            uint attributeId, CancellationToken ct = default)\n        {\n            var itemsToRead = new ReadValueIdCollection(nodeIds.Select(nodeId => new ReadValueId\n            {\n                NodeId = nodeId,\n                AttributeId = attributeId\n            }));\n            if (itemsToRead.Count == 0)\n            {\n                return [];\n            }\n            var response = await session.Services.ReadAsync(header,\n                0, Opc.Ua.TimestampsToReturn.Neither, itemsToRead, ct).ConfigureAwait(false);\n            var results = response.Validate(response.Results,\n                s => s.StatusCode, response.DiagnosticInfos, itemsToRead);\n\n            if (results.ErrorInfo != null)\n            {\n                return (default(T), (ServiceResultModel?)results.ErrorInfo).YieldReturn();\n            }\n            return results.Select(result =>\n            {\n                var errorInfo = result.ErrorInfo;\n                var value = result.ErrorInfo != null ? default :\n                    result.Result.GetValue<T?>(default);\n                return (value, errorInfo);\n            });\n        }\n\n        /// <summary>\n        /// Read attributes grouped by node id\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeIds\"></param>\n        /// <param name=\"attributeIds\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<ServiceResultModel?> ReadAttributesAsync(\n            this IOpcUaSession session, RequestHeader header,\n            IEnumerable<NodeId> nodeIds, IEnumerable<uint> attributeIds,\n            Dictionary<NodeId, Dictionary<uint, DataValue>> results,\n            CancellationToken ct = default)\n        {\n            var itemsToRead = new ReadValueIdCollection(nodeIds\n                .SelectMany(nodeId => attributeIds\n                    .Select(attributeId =>\n                        new ReadValueId\n                        {\n                            NodeId = nodeId,\n                            AttributeId = attributeId\n                        })));\n            if (itemsToRead.Count == 0)\n            {\n                return null;\n            }\n            var response = await session.Services.ReadAsync(header,\n                0, Opc.Ua.TimestampsToReturn.Neither, itemsToRead,\n                ct).ConfigureAwait(false);\n            var readresults = response.Validate(response.Results,\n                s => s.StatusCode, response.DiagnosticInfos, itemsToRead);\n            if (readresults.ErrorInfo != null)\n            {\n                return readresults.ErrorInfo;\n            }\n            foreach (var group in readresults.GroupBy(g => g.Request.NodeId))\n            {\n                results.AddOrUpdate(group.Key,\n                    group.ToDictionary(r => r.Request.AttributeId, r => r.Result));\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Read value\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        public static async Task<(DataValue?, ServiceResultModel?)> ReadValueAsync(\n            this IOpcUaSession session, RequestHeader header,\n            NodeId nodeId, CancellationToken ct = default)\n        {\n            var itemsToRead = new ReadValueIdCollection {\n                new ReadValueId {\n                    NodeId = nodeId,\n                    AttributeId = Attributes.Value\n                }\n            };\n            var response = await session.Services.ReadAsync(header,\n                0, Opc.Ua.TimestampsToReturn.Both, itemsToRead,\n                ct).ConfigureAwait(false);\n            var results = response.Validate(response.Results,\n                s => s.StatusCode, response.DiagnosticInfos, itemsToRead);\n\n            var errorInfo = results.ErrorInfo ?? results[0].ErrorInfo;\n            var value = results.ErrorInfo != null ? null : results[0].Result;\n            return (value, errorInfo);\n        }\n\n        /// <summary>\n        /// Path result returned by browse path resolver.\n        /// </summary>\n        /// <param name=\"Path\"></param>\n        /// <param name=\"ErrorInfo\"></param>\n        internal record class PathResult(RelativePath Path, ServiceResultModel? ErrorInfo);\n\n        /// <summary>\n        /// Get all browse paths for the nodes provided from the root folder object that\n        /// organizes the address space.\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodes\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<IReadOnlyList<PathResult>> GetBrowsePathsFromRootAsync(\n            this IOpcUaSession session, RequestHeader requestHeader, IEnumerable<NodeId> nodes,\n            CancellationToken ct = default)\n        {\n            //\n            // The semantic of HierarchicalReferences is to denote that References of\n            // HierarchicalReferences span a hierarchy. It means that it may be useful\n            // to present Nodes related with References of this type in a hierarchical-like\n            // way. HierarchicalReferences does not forbid loops. For example, starting\n            // from Node A and following HierarchicalReferences it may be possible to\n            // browse to Node A, again. Technically we only care about HasChild references\n            // as well as Organizes, but we try and follow all paths to the root path\n            // and backtrack if we do not get to it.\n            //\n            var browse = nodes.Select(nodeId => new BrowseDescription\n            {\n                BrowseDirection = Opc.Ua.BrowseDirection.Inverse,\n                ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,\n                IncludeSubtypes = true,\n                NodeId = nodeId,\n                Handle = new PathResult(new RelativePath(), null),\n                NodeClassMask = 0u,\n                ResultMask =\n                      (uint)BrowseResultMask.BrowseName\n                    | (uint)BrowseResultMask.ReferenceTypeId\n            }).ToList();\n\n            if (browse.Count == 0)\n            {\n                return Array.Empty<PathResult>();\n            }\n\n            // Here we keep track of the paths we are exploring to allow us to backtrack\n            var searchContext = browse.ToDictionary(b => b,\n                _ => new Stack<(Queue<ReferenceDescription> Next, HashSet<ExpandedNodeId> Seen)>());\n\n            var limits = await session.GetOperationLimitsAsync(ct).ConfigureAwait(false);\n            foreach (var batch in searchContext.Keys.Batch(limits.GetMaxNodesPerRead()))\n            {\n                var response = await session.Services.ReadAsync(requestHeader,\n                    0, Opc.Ua.TimestampsToReturn.Neither, new ReadValueIdCollection(\n                        batch.Select(b => new ReadValueId\n                        {\n                            NodeId = b.NodeId,\n                            AttributeId = (uint)NodeAttribute.BrowseName\n                        })), ct).ConfigureAwait(false);\n                var readResults = response.Validate(response.Results,\n                    s => s.StatusCode, response.DiagnosticInfos, batch);\n\n                // Fail all\n                if (readResults.ErrorInfo != null)\n                {\n                    return searchContext.Keys.Select(b => ((PathResult)b.Handle) with\n                    {\n                        ErrorInfo = readResults.ErrorInfo\n                    }).ToList();\n                }\n                foreach (var result in readResults)\n                {\n                    var path = (PathResult)result.Request.Handle;\n                    path.Path.Elements.Add(new RelativePathElement\n                    {\n                        IsInverse = false,\n                        IncludeSubtypes = false,\n                        TargetName = result.Result.Value as QualifiedName\n                    });\n                }\n            }\n\n            while (searchContext.Count != 0)\n            {\n                await foreach (var result in session.BrowseAsync(requestHeader, null,\n                    new BrowseDescriptionCollection(searchContext.Keys), ct).ConfigureAwait(false))\n                {\n                    if (result.Description == null)\n                    {\n                        // Fail all\n                        return browse.ConvertAll(b => ((PathResult)b.Handle) with\n                        {\n                            ErrorInfo = result.ErrorInfo ?? new ServiceResultModel\n                            {\n                                StatusCode = StatusCodes.BadNotFound\n                            }\n                        });\n                    }\n\n                    var pathsFromNode = searchContext[result.Description];\n                    var path = (PathResult)result.Description.Handle;\n\n                    ReferenceDescription? reference = null;\n                    if (result.References != null)\n                    {\n                        if (result.References.Any(r => r.NodeId == ObjectIds.RootFolder))\n                        {\n                            //\n                            // we reached the root folder and are now done. There could be\n                            // alternative paths to the root but we do not care about those.\n                            //\n                            searchContext.Remove(result.Description);\n                            continue;\n                        }\n\n                        //\n                        // Filter any nodes we have already seen on our journey and then\n                        // filter any nodes that are external. Then we do some weighing,\n                        // e.g., prefer Organizes to HasChild (HasProperty, HasComponent)\n                        // to HasEventSource (HasNotifier)\n                        //\n                        var references = result.References\n                            .Where(r => r.NodeId.ServerIndex == 0 &&\n                                !pathsFromNode.Any(p => p.Seen.Contains(r.NodeId)))\n                            .OrderBy(r => r.ReferenceTypeId)\n                            ;\n\n                        var queue = new Queue<ReferenceDescription>(references);\n                        if (queue.Count > 0)\n                        {\n                            pathsFromNode.Push((queue, new HashSet<ExpandedNodeId>()));\n\n                            reference = pathsFromNode.Peek().Next.Dequeue();\n                            pathsFromNode.Peek().Seen.Add(reference.NodeId);\n                        }\n                    }\n\n                    if (reference == null)\n                    {\n                        //\n                        // Wrong path taken see if there are alternatives to get to root\n                        // Backtrack the path elements and try to find a new route\n                        //\n                        path.Path.Elements.RemoveAt(0);\n                        while (pathsFromNode.Count > 0)\n                        {\n                            var alternativeReferences = pathsFromNode.Peek().Next;\n                            if (alternativeReferences.Count != 0)\n                            {\n                                reference = alternativeReferences.Dequeue();\n                                pathsFromNode.Peek().Seen.Add(reference.NodeId);\n                                break;\n                            }\n\n                            // All paths at this level exhausted - backtrack a level.\n                            path.Path.Elements.RemoveAt(0);\n                            path.Path.Elements[0].ReferenceTypeId = null;\n                            pathsFromNode.Pop();\n                        }\n\n                        if (reference == null)\n                        {\n                            // No way to get to root.  This should not happen.\n                            searchContext.Remove(result.Description);\n                            result.Description.Handle = path with\n                            {\n                                ErrorInfo = result.ErrorInfo ?? new ServiceResultModel\n                                {\n                                    StatusCode = StatusCodes.BadNotFound\n                                }\n                            };\n                            continue;\n                        }\n                    }\n\n                    path.Path.Elements[0].ReferenceTypeId = reference.ReferenceTypeId;\n                    path.Path.Elements.Insert(0, new RelativePathElement\n                    {\n                        IsInverse = false,\n                        IncludeSubtypes = false,\n                        TargetName = reference.BrowseName\n                    });\n                    result.Description.NodeId = reference.NodeId.ToNodeId(\n                        session.MessageContext.NamespaceUris);\n                }\n            }\n            return browse.ConvertAll(b => (PathResult)b.Handle);\n        }\n\n        /// <summary>\n        /// Read all attributes from node\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"skipValueRead\"></param>\n        /// <param name=\"nodeClass\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<ServiceResponse<uint, DataValue>> ReadNodeAttributesAsync(\n            this IOpcUaSession session, RequestHeader requestHeader, NodeId nodeId,\n            bool skipValueRead = false, Opc.Ua.NodeClass? nodeClass = null,\n            CancellationToken ct = default)\n        {\n            if (nodeClass == null || nodeClass.Value == Opc.Ua.NodeClass.Unspecified)\n            {\n                // First read node class\n                var nodeClassRead = new ReadValueIdCollection {\n                    new ReadValueId {\n                        NodeId = nodeId,\n                        AttributeId = Attributes.NodeClass\n                    }\n                };\n                var response = await session.Services.ReadAsync(requestHeader, 0,\n                    Opc.Ua.TimestampsToReturn.Both, nodeClassRead,\n                    ct).ConfigureAwait(false);\n\n                var readResults = response.Validate(response.Results,\n                    s => s.StatusCode, response.DiagnosticInfos, nodeClassRead);\n                nodeClass = readResults.ErrorInfo != null ? Opc.Ua.NodeClass.Unspecified :\n                    readResults[0].Result.GetValueOrDefaultEx<Opc.Ua.NodeClass>();\n            }\n            if (nodeClass == Opc.Ua.NodeClass.VariableType)\n            {\n                skipValueRead = false; // read default values\n            }\n            var attributes = TypeMaps.Attributes.Value.Identifiers\n                .Where(a => !skipValueRead || a != Attributes.Value);\n            var readValueCollection = new ReadValueIdCollection(attributes\n                .Select(a => new ReadValueId\n                {\n                    NodeId = nodeId,\n                    AttributeId = a\n                }));\n            var readResponse = await session.Services.ReadAsync(requestHeader, 0,\n                Opc.Ua.TimestampsToReturn.Both, readValueCollection,\n                ct).ConfigureAwait(false);\n\n            var results = readResponse.Validate(readResponse.Results, s => s.StatusCode,\n                readResponse.DiagnosticInfos, attributes);\n            var errorInfo = results.ErrorInfo ?? results[0].ErrorInfo;\n            if (errorInfo != null)\n            {\n                return results;\n            }\n            // Fix up responses based on node class\n            for (var i = 0; i < results.Count; i++)\n            {\n                if (results[i].ErrorInfo?.StatusCode ==\n                        StatusCodes.BadAttributeIdInvalid)\n                {\n                    // Update result with default and set status to good.\n                    readResponse.Results[i].Value = AttributeMap.GetDefaultValue(\n                        nodeClass.Value, results[i].Request, true);\n                    readResponse.Results[i].StatusCode = StatusCodes.Good;\n                }\n            }\n            return readResponse.Validate(readResponse.Results, s => s.StatusCode,\n                readResponse.DiagnosticInfos, attributes);\n        }\n\n        /// <summary>\n        /// Read node state\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodeState\"></param>\n        /// <param name=\"rootId\"></param>\n        /// <param name=\"relativePath\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<ServiceResultModel?> ReadNodeStateAsync(\n            this IOpcUaSession session, RequestHeader requestHeader, NodeState nodeState,\n            NodeId rootId, RelativePath? relativePath = null, CancellationToken ct = default)\n        {\n            var valuesToRead = new List<ReadValueId>();\n            var objectsToBrowse = new List<BrowseDescription>();\n            var resolveBrowsePaths = session.GetBrowsePathFromNodeState(rootId,\n                nodeState, relativePath);\n            if (resolveBrowsePaths.Count == 0)\n            {\n                // Nothing to do\n                return ((StatusCode)StatusCodes.GoodNoData).CreateResultModel();\n            }\n            var limits = await session.GetOperationLimitsAsync(ct).ConfigureAwait(false);\n            var resolveBrowsePathsBatches = resolveBrowsePaths\n                .Batch(limits.GetMaxNodesPerTranslatePathsToNodeIds());\n            foreach (var batch in resolveBrowsePathsBatches)\n            {\n                // translate browse paths.\n                var response = await session.Services.TranslateBrowsePathsToNodeIdsAsync(\n                    requestHeader, new BrowsePathCollection(batch), ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, s => s.StatusCode,\n                    response.DiagnosticInfos, batch);\n                if (results.ErrorInfo != null)\n                {\n                    return results.ErrorInfo;\n                }\n                foreach (var result in results)\n                {\n                    if (result.Request.Handle is not NodeState node)\n                    {\n                        continue;\n                    }\n                    if (StatusCode.IsBad(result.StatusCode))\n                    {\n                        if (result.StatusCode.Code is StatusCodes.BadNodeIdUnknown or\n                            StatusCodes.BadUnexpectedError)\n                        {\n                            return result.ErrorInfo;\n                        }\n                        if (node is BaseVariableState v)\n                        {\n                            // Initialize the variable\n                            v.Value = null;\n                            v.StatusCode = result.StatusCode;\n                        }\n                        continue;\n                    }\n                    if (result.Result.Targets.Count == 1 &&\n                        result.Result.Targets[0].RemainingPathIndex == uint.MaxValue &&\n                        !result.Result.Targets[0].TargetId.IsAbsolute)\n                    {\n                        node.NodeId = (NodeId)result.Result.Targets[0].TargetId;\n                    }\n                    else\n                    {\n                        if (node is BaseVariableState v)\n                        {\n                            // Initialize the variable\n                            v.Value = null;\n                            v.StatusCode = StatusCodes.BadNotSupported;\n                        }\n                        continue;\n                    }\n                    switch (node)\n                    {\n                        case BaseVariableState variable:\n                            // Initialize the variable\n                            variable.Value = null;\n                            variable.StatusCode = StatusCodes.BadNotSupported;\n                            valuesToRead.Add(new ReadValueId\n                            {\n                                NodeId = node.NodeId,\n                                AttributeId = Attributes.Value,\n                                Handle = node\n                            });\n                            break;\n                        case FolderState folder:\n                            // Save for browsing\n                            objectsToBrowse.Add(new BrowseDescription\n                            {\n                                BrowseDirection = Opc.Ua.BrowseDirection.Forward,\n                                Handle = folder,\n                                IncludeSubtypes = true,\n                                ReferenceTypeId = ReferenceTypeIds.Organizes,\n                                NodeClassMask =\n                                    (uint)Opc.Ua.NodeClass.Variable |\n                                    (uint)Opc.Ua.NodeClass.Object,\n                                NodeId = node.NodeId,\n                                ResultMask = (uint)BrowseResultMask.All\n                            });\n                            break;\n                    }\n                }\n            }\n\n            if (objectsToBrowse.Count > 0)\n            {\n                foreach (var batch in objectsToBrowse.Batch(limits.GetMaxNodesPerBrowse()))\n                {\n                    // Browse folders with objects and variables in it\n                    await foreach (var (description, references, errorInfo) in session.BrowseAsync(\n                        requestHeader, null, new BrowseDescriptionCollection(batch),\n                        ct).ConfigureAwait(false))\n                    {\n                        var obj = (BaseObjectState?)description?.Handle;\n                        if (obj == null || references == null)\n                        {\n                            continue;\n                        }\n                        foreach (var reference in references)\n                        {\n                            switch (reference.NodeClass)\n                            {\n                                case Opc.Ua.NodeClass.Variable:\n                                    // Add variable to the folder and set it to be read.\n                                    var variable = new BaseDataVariableState(obj)\n                                    {\n                                        NodeId = (NodeId)reference.NodeId,\n                                        BrowseName = reference.BrowseName,\n                                        DisplayName = reference.DisplayName,\n                                        StatusCode = StatusCodes.BadNotSupported,\n                                        ReferenceTypeId = reference.ReferenceTypeId,\n                                        Value = null\n                                    };\n                                    obj.AddChild(variable);\n                                    valuesToRead.Add(new ReadValueId\n                                    {\n                                        NodeId = variable.NodeId,\n                                        AttributeId = Attributes.Value,\n                                        Handle = variable\n                                    });\n                                    break;\n                                case Opc.Ua.NodeClass.Object:\n                                    // Add object\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                                    var child = new BaseObjectState(obj)\n                                    {\n                                        NodeId = (NodeId)reference.NodeId,\n                                        BrowseName = reference.BrowseName,\n                                        DisplayName = reference.DisplayName,\n                                        ReferenceTypeId = reference.ReferenceTypeId\n                                    };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                                    obj.AddChild(child);\n                                    break;\n                            }\n                        }\n                    }\n                }\n            }\n\n            if (valuesToRead.Count > 0)\n            {\n                foreach (var batch in valuesToRead.Batch(limits.GetMaxNodesPerRead()))\n                {\n                    // read the values.\n                    var readResponse = await session.Services.ReadAsync(\n                        requestHeader, 0, Opc.Ua.TimestampsToReturn.Neither,\n                        new ReadValueIdCollection(batch), ct).ConfigureAwait(false);\n                    var readResults = readResponse.Validate(readResponse.Results,\n                        s => s.StatusCode, readResponse.DiagnosticInfos,\n                        batch);\n                    if (readResults.ErrorInfo != null)\n                    {\n                        return readResults.ErrorInfo;\n                    }\n                    foreach (var readResult in readResults)\n                    {\n                        var variable = (BaseVariableState)readResult.Request.Handle;\n                        variable.WrappedValue = readResult.Result.WrappedValue;\n                        variable.DataType = TypeInfo.GetDataTypeId(readResult.Result.Value);\n                        variable.StatusCode = readResult.Result.StatusCode;\n                    }\n                }\n                return null;\n            }\n            return ((StatusCode)StatusCodes.BadUnexpectedError).CreateResultModel();\n        }\n\n        /// <summary>\n        /// Browses the address space and returns all of the\n        /// supertypes of the specified type node.\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"typeId\"></param>\n        /// <param name=\"hierarchy\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task CollectTypeHierarchyAsync(this IOpcUaSession session,\n            RequestHeader header, NodeId typeId, IList<(NodeId, ReferenceDescription)> hierarchy,\n            CancellationToken ct = default)\n        {\n            // find all of the children of the field.\n            var nodeToBrowse = new BrowseDescriptionCollection {\n                new BrowseDescription {\n                    NodeId = typeId,\n                    BrowseDirection = Opc.Ua.BrowseDirection.Inverse,\n                    ReferenceTypeId = ReferenceTypeIds.HasSubtype,\n                    IncludeSubtypes = false,\n                    NodeClassMask = 0,\n                    ResultMask = (uint)BrowseResultMask.All\n                }\n            };\n            while (true)\n            {\n                var response = await session.Services.BrowseAsync(header, null, 0,\n                    nodeToBrowse, ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, s => s.StatusCode,\n                    response.DiagnosticInfos, nodeToBrowse);\n                if (results.ErrorInfo != null)\n                {\n                    break;\n                }\n                if (results[0].Result.References == null ||\n                    results[0].Result.References.Count == 0)\n                {\n                    // should never be more than one supertype.\n                    break;\n                }\n                var reference = results[0].Result.References[0];\n                if (reference.NodeId.IsAbsolute)\n                {\n                    break;\n                }\n                hierarchy.Add((nodeToBrowse[0].NodeId, reference));\n                nodeToBrowse[0].NodeId = (NodeId)reference.NodeId;\n            }\n        }\n\n        /// <summary>\n        /// Collects the fields for the instance node.\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"typeId\"></param>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"instances\"></param>\n        /// <param name=\"map\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"nodeClassMask\"></param>\n        /// <param name=\"ct\"></param>\n        internal static async Task<ServiceResultModel?> CollectInstanceDeclarationsAsync(\n            this IOpcUaSession session, RequestHeader requestHeader, NodeId typeId,\n            InstanceDeclarationModel? parent, List<InstanceDeclarationModel> instances,\n            IDictionary<ImmutableRelativePath, InstanceDeclarationModel> map,\n            NamespaceFormat namespaceFormat, Opc.Ua.NodeClass? nodeClassMask = null,\n            CancellationToken ct = default)\n        {\n            // find the children of the type.\n            var nodeToBrowse = new BrowseDescriptionCollection\n            {\n                new BrowseDescription\n                {\n                    NodeId = parent == null ? typeId : parent.NodeId.ToNodeId(session.MessageContext),\n                    BrowseDirection = Opc.Ua.BrowseDirection.Forward,\n                    ReferenceTypeId = ReferenceTypeIds.HasChild,\n                    IncludeSubtypes = true,\n                    NodeClassMask = (uint)Opc.Ua.NodeClass.Object |\n                        (((uint?)nodeClassMask)\n                            ?? (uint)Opc.Ua.NodeClass.Variable | (uint)Opc.Ua.NodeClass.Method),\n                    ResultMask = (uint)BrowseResultMask.All\n                }\n            };\n            await foreach (var result in session.BrowseAsync(requestHeader, null,\n                nodeToBrowse, ct).ConfigureAwait(false))\n            {\n                if (result.ErrorInfo != null)\n                {\n                    return result.ErrorInfo;\n                }\n                if (result.References == null)\n                {\n                    continue;\n                }\n                var references = result.References\n                    .Where(r => !r.NodeId.IsAbsolute)\n                    .ToList();\n                if (references.Count == 0)\n                {\n                    continue;\n                }\n\n                // find the modelling rules.\n                var (targets, errorInfo2) = await session.FindAsync(requestHeader,\n                    references.Select(r => (NodeId)r.NodeId),\n                    ReferenceTypeIds.HasModellingRule, maxResults: 1, ct: ct).ConfigureAwait(false);\n                if (errorInfo2 != null)\n                {\n                    return errorInfo2;\n                }\n                var referencesWithRules = targets\n                    .Zip(references)\n                    .ToList();\n\n                // Get the children.\n                var children = new Dictionary<NodeId, InstanceDeclarationModel>();\n                foreach (var (modellingRule, reference) in referencesWithRules)\n                {\n                    var browseName = reference.BrowseName.AsString(session.MessageContext,\n                        namespaceFormat);\n                    var relativePath = ImmutableRelativePath.Create(parent?.BrowsePath,\n                        \"/\" + browseName);\n                    var nodeClass = reference.NodeClass.ToServiceType();\n                    if (NodeId.IsNull(modellingRule.Node) || nodeClass == null)\n                    {\n                        // if the modelling rule is null then the instance is not part\n                        // of the type declaration.\n                        map.Remove(relativePath);\n                        continue;\n                    }\n                    // create a new declaration.\n                    map.TryGetValue(relativePath, out var overriden);\n\n                    var displayName =\n                        LocalizedText.IsNullOrEmpty(reference.DisplayName?.Text) ?\n                            reference.BrowseName.Name : reference.DisplayName.AsString();\n                    var child = new InstanceDeclarationModel\n                    {\n                        RootTypeId = typeId.AsString(session.MessageContext,\n                            namespaceFormat),\n                        NodeId = reference.NodeId.AsString(session.MessageContext,\n                            namespaceFormat),\n                        BrowseName = reference.BrowseName.AsString(session.MessageContext,\n                            namespaceFormat),\n                        NodeClass = nodeClass.Value,\n                        DisplayPath = parent == null ?\n                            displayName : $\"{parent.DisplayPath}/{displayName}\",\n                        DisplayName = displayName,\n                        BrowsePath = relativePath.Path,\n                        ModellingRule = modellingRule.Name.AsString(session.MessageContext,\n                            namespaceFormat),\n                        ModellingRuleId = modellingRule.Node.AsString(session.MessageContext,\n                            namespaceFormat),\n                        OverriddenDeclaration = overriden\n                    };\n\n                    map[relativePath] = child;\n\n                    // add to list.\n                    children.Add((NodeId)reference.NodeId, child);\n                }\n                // check if nothing more to do.\n                if (children.Count == 0)\n                {\n                    return null;\n                }\n\n                // Add variable metadata\n                var variables = children\n                    .Where(v => v.Value.NodeClass == NodeClass.Variable)\n                    .Select(v => v.Key);\n                var variableMetadata = new List<VariableMetadataModel>();\n                var errorInfo = await session.CollectVariableMetadataAsync(requestHeader,\n                    variables, variableMetadata, namespaceFormat, ct).ConfigureAwait(false);\n                if (errorInfo != null)\n                {\n                    return errorInfo;\n                }\n                foreach (var (nodeId, variable) in variables.Zip(variableMetadata))\n                {\n                    children[nodeId] = children[nodeId] with { VariableMetadata = variable };\n                }\n\n                // Add method metadata\n                var methods = children\n                    .Where(v => v.Value.NodeClass == NodeClass.Method)\n                    .Select(v => v.Key);\n                var methodMetadata = new List<MethodMetadataModel>();\n                errorInfo = await session.CollectMethodMetadataAsync(requestHeader,\n                    variables, methodMetadata, namespaceFormat, ct).ConfigureAwait(false);\n                if (errorInfo != null)\n                {\n                    return errorInfo;\n                }\n                foreach (var (nodeId, method) in methods.Zip(methodMetadata))\n                {\n                    children[nodeId] = children[nodeId] with { MethodMetadata = method };\n                }\n\n                // Add descriptions\n                var attributes = await session.ReadAttributeAsync<LocalizedText>(requestHeader,\n                    children.Keys, Attributes.Description, ct).ConfigureAwait(false);\n                // TODO: Check attribute error info\n                foreach (var (nodeId, description) in children.Keys.Zip(attributes))\n                {\n                    children[nodeId] = children[nodeId] with\n                    {\n                        Description = description.Item1.AsString()\n                    };\n                }\n\n                // recusively collect instance declarations for the tree below.\n                foreach (var child in children.Values)\n                {\n                    instances.Add(child);\n                    await session.CollectInstanceDeclarationsAsync(requestHeader,\n                        typeId, child, instances, map, namespaceFormat, ct: ct).ConfigureAwait(false);\n                }\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Get method metadata\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<(VariableMetadataModel?, ServiceResultModel?)> GetVariableMetadataAsync(\n            this IOpcUaSession session, RequestHeader requestHeader, NodeId nodeId,\n            NamespaceFormat namespaceFormat, CancellationToken ct)\n        {\n            var results = new List<VariableMetadataModel>();\n            var errorInfo = await session.CollectVariableMetadataAsync(requestHeader,\n                nodeId.YieldReturn(), results, namespaceFormat, ct).ConfigureAwait(false);\n            if (errorInfo != null)\n            {\n                return (null, errorInfo);\n            }\n            return (results.Single(), null);\n        }\n\n        /// <summary>\n        /// Get method metadata\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodeIds\"></param>\n        /// <param name=\"metadata\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<ServiceResultModel?> CollectVariableMetadataAsync(\n            this IOpcUaSession session, RequestHeader requestHeader, IEnumerable<NodeId> nodeIds,\n            List<VariableMetadataModel> metadata, NamespaceFormat namespaceFormat, CancellationToken ct)\n        {\n            if (!nodeIds.Any())\n            {\n                return null;\n            }\n            var attributeIds = new uint[] {\n                Attributes.DataType,\n                Attributes.ArrayDimensions,\n                Attributes.ValueRank\n            };\n            var attributes = new Dictionary<NodeId, Dictionary<uint, DataValue>>();\n            var errorInfo = await session.ReadAttributesAsync(requestHeader,\n                nodeIds, attributeIds, attributes, ct).ConfigureAwait(false);\n            if (errorInfo != null)\n            {\n                return errorInfo;\n            }\n            metadata.AddRange(attributes.Select(node => new VariableMetadataModel\n            {\n                ArrayDimensions = node.Value[Attributes.ArrayDimensions]\n                    .GetValueOrDefaultEx<uint[]>()?.ToList(),\n                DataType = new DataTypeMetadataModel\n                {\n                    DataType = node.Value[Attributes.DataType].GetValueOrDefaultEx<NodeId>()?\n                        .AsString(session.MessageContext, namespaceFormat)\n                },\n                ValueRank = (NodeValueRank?)node.Value[Attributes.ValueRank]\n                    .GetValueOrDefaultEx<int?>(v => v == ValueRanks.Any ? null : v)\n            }));\n            return null;\n        }\n\n        /// <summary>\n        /// Get method metadata\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<(MethodMetadataModel?, ServiceResultModel?)> GetMethodMetadataAsync(\n            this IOpcUaSession session, RequestHeader requestHeader, NodeId nodeId,\n            NamespaceFormat namespaceFormat, CancellationToken ct)\n        {\n            var results = new List<MethodMetadataModel>();\n            var errorInfo = await session.CollectMethodMetadataAsync(requestHeader,\n                nodeId.YieldReturn(), results, namespaceFormat, ct).ConfigureAwait(false);\n            if (errorInfo != null)\n            {\n                return (null, errorInfo);\n            }\n            return (results.Single(), null);\n        }\n\n        /// <summary>\n        /// Get method metadata\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodeIds\"></param>\n        /// <param name=\"metadata\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<ServiceResultModel?> CollectMethodMetadataAsync(\n            this IOpcUaSession session, RequestHeader requestHeader, IEnumerable<NodeId> nodeIds,\n            List<MethodMetadataModel> metadata, NamespaceFormat namespaceFormat, CancellationToken ct)\n        {\n            if (!nodeIds.Any())\n            {\n                return null;\n            }\n            var browseDescriptions = new BrowseDescriptionCollection(nodeIds.Select(nodeId =>\n                new BrowseDescription\n                {\n                    BrowseDirection = Opc.Ua.BrowseDirection.Both,\n                    IncludeSubtypes = true,\n                    NodeClassMask = 0,\n                    NodeId = nodeId,\n                    ReferenceTypeId = ReferenceTypeIds.Aggregates,\n                    ResultMask = (uint)BrowseResultMask.All\n                }\n            ));\n            var response = await session.Services.BrowseAsync(requestHeader,\n                null, 0, browseDescriptions, ct).ConfigureAwait(false);\n\n            var results = response.Validate(response.Results, r => r.StatusCode,\n                response.DiagnosticInfos, browseDescriptions);\n            if (results.ErrorInfo != null)\n            {\n                return results.ErrorInfo;\n            }\n            foreach (var result in results)\n            {\n                if (result.ErrorInfo != null)\n                {\n                    return result.ErrorInfo;\n                }\n                var continuationPoint = result.Result.ContinuationPoint;\n                var references = result.Result.References;\n                IReadOnlyList<MethodMetadataArgumentModel>? outputArguments = null;\n                IReadOnlyList<MethodMetadataArgumentModel>? inputArguments = null;\n                string? objectId = null;\n                foreach (var nodeReference in references)\n                {\n                    if (outputArguments != null &&\n                        inputArguments != null &&\n                        !string.IsNullOrEmpty(objectId))\n                    {\n                        break;\n                    }\n                    if (!nodeReference.IsForward)\n                    {\n                        if (nodeReference.ReferenceTypeId == ReferenceTypeIds.HasComponent)\n                        {\n                            objectId = nodeReference.NodeId.AsString(session.MessageContext, namespaceFormat);\n                        }\n                        continue;\n                    }\n                    var isInput = nodeReference.BrowseName == BrowseNames.InputArguments;\n                    if (!isInput && nodeReference.BrowseName != BrowseNames.OutputArguments)\n                    {\n                        continue;\n                    }\n\n                    var node = nodeReference.NodeId.ToNodeId(session.MessageContext.NamespaceUris);\n                    var (value, _) = await session.ReadValueAsync(requestHeader, node,\n                        ct).ConfigureAwait(false);\n                    if (value?.Value is not ExtensionObject[] argumentsList)\n                    {\n                        continue;\n                    }\n\n                    var argList = new List<MethodMetadataArgumentModel>();\n                    foreach (var argument in argumentsList.Select(a => (Argument)a.Body))\n                    {\n                        var (dataTypeIdNode, _) = await session.ReadNodeAsync(requestHeader,\n                            argument.DataType, null, false, false, namespaceFormat, false, ct).ConfigureAwait(false);\n                        var arg = new MethodMetadataArgumentModel\n                        {\n                            Name = argument.Name,\n                            DefaultValue = argument.Value == null ? VariantValue.Null :\n                                session.Codec.Encode(new Variant(argument.Value), out var tmp),\n                            ValueRank = argument.ValueRank == ValueRanks.Scalar ?\n                                null : (NodeValueRank)argument.ValueRank,\n                            ArrayDimensions = argument.ArrayDimensions?.ToList(),\n                            Description = argument.Description?.ToString(),\n                            Type = dataTypeIdNode\n                        };\n                        argList.Add(arg);\n                    }\n                    if (isInput)\n                    {\n                        inputArguments = argList;\n                    }\n                    else\n                    {\n                        outputArguments = argList;\n                    }\n                }\n                metadata.Add(new MethodMetadataModel\n                {\n                    InputArguments = inputArguments,\n                    OutputArguments = outputArguments,\n                    ObjectId = objectId\n                });\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Read node properties as node model\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"nodeClass\"></param>\n        /// <param name=\"skipValue\"></param>\n        /// <param name=\"rawMode\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"children\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<(NodeModel, ServiceResultModel?)> ReadNodeAsync(\n            this IOpcUaSession session, RequestHeader header, NodeId nodeId,\n            Opc.Ua.NodeClass? nodeClass, bool skipValue, bool rawMode, NamespaceFormat namespaceFormat,\n            bool? children = null, CancellationToken ct = default)\n        {\n            if (rawMode)\n            {\n                var id = nodeId.AsString(session.MessageContext, namespaceFormat);\n                System.Diagnostics.Debug.Assert(id != null);\n                System.Diagnostics.Debug.Assert(!string.IsNullOrEmpty(id));\n                return (new NodeModel\n                {\n                    NodeId = id,\n                    NodeClass = nodeClass?.ToServiceType()\n                }, null);\n            }\n            return await session.ReadNodeAsync(header, nodeId, namespaceFormat,\n                nodeClass, skipValue, children, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Read node model\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"nodeClass\"></param>\n        /// <param name=\"skipValue\"></param>\n        /// <param name=\"children\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<(NodeModel, ServiceResultModel?)> ReadNodeAsync(\n            this IOpcUaSession session, RequestHeader header, NodeId nodeId, NamespaceFormat namespaceFormat,\n            Opc.Ua.NodeClass? nodeClass = null, bool skipValue = true, bool? children = null,\n            CancellationToken ct = default)\n        {\n            var results = await session.ReadNodeAttributesAsync(header, nodeId, skipValue,\n                nodeClass, ct).ConfigureAwait(false);\n            var lookup = results.AsLookupTable();\n\n            var id = nodeId.AsString(session.MessageContext, namespaceFormat);\n            System.Diagnostics.Debug.Assert(id != null);\n            System.Diagnostics.Debug.Assert(!string.IsNullOrEmpty(id));\n            lookup.TryGetValue(Attributes.Value, out var value);\n            var nodeModel = new NodeModel\n            {\n                Children = children,\n                NodeId = id,\n                Value = value.Item1 == null ? null :\n                    session.Codec.Encode(\n                        value.Item1.WrappedValue, out var type),\n                SourceTimestamp =\n                    value.Item1?.SourceTimestamp,\n                SourcePicoseconds =\n                    value.Item1?.SourcePicoseconds,\n                ServerTimestamp =\n                    value.Item1?.ServerTimestamp,\n                ServerPicoseconds =\n                    value.Item1?.ServerPicoseconds,\n                ErrorInfo =\n                    value.Item2,\n                BrowseName =\n                    lookup[Attributes.BrowseName].Item1?\n                        .GetValueOrDefaultEx<QualifiedName>()?\n                        .AsString(session.MessageContext, namespaceFormat),\n                DisplayName =\n                    lookup[Attributes.DisplayName].Item1?\n                        .GetValueOrDefaultEx<LocalizedText>()?\n                        .ToString(),\n                Description =\n                    lookup[Attributes.Description].Item1?\n                        .GetValueOrDefaultEx<LocalizedText>()?\n                        .ToString(),\n                NodeClass =\n                    lookup[Attributes.NodeClass].Item1?\n                        .GetValueOrDefaultEx<Opc.Ua.NodeClass>()\n                        .ToServiceType(),\n                AccessRestrictions = (NodeAccessRestrictions?)\n                    lookup[Attributes.AccessRestrictions].Item1?\n                        .GetValueOrDefaultEx<ushort?>(v => v == 0 ? null : v),\n                UserWriteMask =\n                    lookup[Attributes.UserWriteMask].Item1?\n                        .GetValueOrDefaultEx<uint?>(),\n                WriteMask =\n                    lookup[Attributes.WriteMask].Item1?\n                        .GetValueOrDefaultEx<uint?>(),\n                DataType =\n                    lookup[Attributes.DataType].Item1?\n                        .GetValueOrDefaultEx<NodeId>()?\n                        .AsString(session.MessageContext, namespaceFormat),\n                ArrayDimensions =\n                    lookup[Attributes.ArrayDimensions].Item1?\n                        .GetValueOrDefaultEx<uint[]?>(),\n                ValueRank = (NodeValueRank?)\n                    lookup[Attributes.ValueRank].Item1?\n                        .GetValueOrDefaultEx<int?>(),\n                AccessLevel = (NodeAccessLevel?)\n                    lookup[Attributes.AccessLevelEx].Item1?\n                        .GetValueOrDefaultEx<uint?>(l =>\n                        {\n                            // Or both if available\n                            var v = (l ?? 0) |\n                            lookup[Attributes.AccessLevel].Item1?\n                                .GetValueOrDefaultEx<byte?>(b => b ?? 0);\n                            return v == 0 ? null : v;\n                        }),\n                UserAccessLevel = (NodeAccessLevel?)\n                    lookup[Attributes.UserAccessLevel].Item1?\n                        .GetValueOrDefaultEx<byte?>(),\n                Historizing =\n                    lookup[Attributes.Historizing].Item1?\n                        .GetValueOrDefaultEx<bool?>(),\n                MinimumSamplingInterval =\n                    lookup[Attributes.MinimumSamplingInterval].Item1?\n                        .GetValueOrDefaultEx<double?>(),\n                IsAbstract =\n                    lookup[Attributes.IsAbstract].Item1?\n                        .GetValueOrDefaultEx<bool?>(),\n                EventNotifier = (NodeEventNotifier?)\n                    lookup[Attributes.EventNotifier].Item1?\n                        .GetValueOrDefaultEx<byte?>(v => v == 0 ? null : v),\n                DataTypeDefinition = session.Codec.Encode(\n                    lookup[Attributes.DataTypeDefinition].Item1?\n                        .GetValueOrDefaultEx<ExtensionObject>(), out _),\n                InverseName =\n                    lookup[Attributes.InverseName].Item1?\n                        .GetValueOrDefaultEx<LocalizedText>()?\n                        .ToString(),\n                Symmetric =\n                    lookup[Attributes.Symmetric].Item1?\n                        .GetValueOrDefaultEx<bool?>(),\n                ContainsNoLoops =\n                    lookup[Attributes.ContainsNoLoops].Item1?\n                        .GetValueOrDefaultEx<bool?>(),\n                Executable =\n                    lookup[Attributes.Executable].Item1?\n                        .GetValueOrDefaultEx<bool?>(),\n                UserExecutable =\n                    lookup[Attributes.UserExecutable].Item1?\n                        .GetValueOrDefaultEx<bool?>(),\n                UserRolePermissions =\n                    lookup[Attributes.UserRolePermissions].Item1?\n                        .GetValueOrDefaultEx<ExtensionObject[]>()?\n                        .Select(ex => ex.Body)\n                        .OfType<RolePermissionType>()\n                        .Select(p => p.ToServiceModel(session.MessageContext, namespaceFormat)).ToList(),\n                RolePermissions =\n                    lookup[Attributes.RolePermissions].Item1?\n                        .GetValueOrDefaultEx<ExtensionObject[]>()?\n                        .Select(ex => ex.Body)\n                        .OfType<RolePermissionType>()\n                        .Select(p => p.ToServiceModel(session.MessageContext, namespaceFormat)).ToList()\n            };\n            return (nodeModel, results.ErrorInfo ?? lookup[Attributes.NodeClass].Item2);\n        }\n\n        /// <summary>\n        /// Find results\n        /// </summary>\n        /// <param name=\"Name\"></param>\n        /// <param name=\"DisplayName\"></param>\n        /// <param name=\"Node\"></param>\n        /// <param name=\"TypeDefinition\"></param>\n        /// <param name=\"NodeClass\"></param>\n        /// <param name=\"ErrorInfo\"></param>\n        internal record struct FindResult(QualifiedName Name, string? DisplayName,\n            NodeId Node, ExpandedNodeId TypeDefinition, Opc.Ua.NodeClass NodeClass,\n            ServiceResultModel? ErrorInfo = null);\n\n        /// <summary>\n        /// Finds the targets for the specified reference.\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodeIds\"></param>\n        /// <param name=\"referenceTypeId\"></param>\n        /// <param name=\"includeSubTypes\"></param>\n        /// <param name=\"isInverse\"></param>\n        /// <param name=\"nodeClassMask\"></param>\n        /// <param name=\"maxResults\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<(IReadOnlyList<FindResult>, ServiceResultModel?)> FindAsync(\n            this IOpcUaSession session, RequestHeader requestHeader,\n            IEnumerable<NodeId> nodeIds, NodeId referenceTypeId, bool includeSubTypes = false,\n            bool isInverse = false, uint nodeClassMask = 0, uint? maxResults = null,\n            CancellationToken ct = default)\n        {\n            // construct browse request.\n            var nodesToBrowse = new BrowseDescriptionCollection(nodeIds\n                .Select(nodeId => new BrowseDescription\n                {\n                    NodeId = nodeId,\n                    BrowseDirection = isInverse ?\n                        Opc.Ua.BrowseDirection.Inverse : Opc.Ua.BrowseDirection.Forward,\n                    ReferenceTypeId = referenceTypeId,\n                    IncludeSubtypes = includeSubTypes,\n                    NodeClassMask = nodeClassMask,\n                    ResultMask =\n                        (uint)BrowseResultMask.BrowseName |\n                        (uint)BrowseResultMask.DisplayName |\n                        (uint)BrowseResultMask.NodeClass |\n                        (uint)BrowseResultMask.TypeDefinition\n                }));\n\n            var continuationPoints = new ByteStringCollection();\n            try\n            {\n                var response = await session.Services.BrowseAsync(requestHeader, null,\n                    maxResults ?? 0u, nodesToBrowse, ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, s => s.StatusCode,\n                    response.DiagnosticInfos, nodesToBrowse);\n                var targetIds = new List<FindResult>();\n                if (results.ErrorInfo != null)\n                {\n                    return (targetIds, results.ErrorInfo);\n                }\n\n                foreach (var result in results)\n                {\n                    // check for error.\n                    if (result.ErrorInfo != null)\n                    {\n                        targetIds.Add(new FindResult(QualifiedName.Null, null, NodeId.Null,\n                            ExpandedNodeId.Null, Opc.Ua.NodeClass.Unspecified, result.ErrorInfo));\n                        continue;\n                    }\n                    // check for continuation point.\n                    if (result.Result.ContinuationPoint?.Length > 0)\n                    {\n                        continuationPoints.Add(result.Result.ContinuationPoint);\n                    }\n                    if (!Extract(targetIds, result.Result.References))\n                    {\n                        break;\n                    }\n                }\n\n                while (continuationPoints.Count > 0 && !maxResults.HasValue)\n                {\n                    var next = await session.Services.BrowseNextAsync(requestHeader, false,\n                        continuationPoints, ct).ConfigureAwait(false);\n                    var nextResults = next.Validate(next.Results, s => s.StatusCode,\n                                        next.DiagnosticInfos, continuationPoints);\n                    if (nextResults.ErrorInfo != null)\n                    {\n                        return (targetIds, nextResults.ErrorInfo);\n                    }\n\n                    continuationPoints = [];\n                    foreach (var result in nextResults)\n                    {\n                        // check for error.\n                        if (result.ErrorInfo != null)\n                        {\n                            targetIds.Add(new FindResult(QualifiedName.Null, null, NodeId.Null,\n                                ExpandedNodeId.Null, Opc.Ua.NodeClass.Unspecified, result.ErrorInfo));\n                            continue;\n                        }\n                        // check for continuation point.\n                        if (result.Result.ContinuationPoint?.Length > 0)\n                        {\n                            continuationPoints.Add(result.Result.ContinuationPoint);\n                        }\n                        if (!Extract(targetIds, result.Result.References))\n                        {\n                            break;\n                        }\n                    }\n                }\n                return (targetIds, null);\n            }\n            finally\n            {\n                // release continuation points.\n                if (continuationPoints.Count > 0)\n                {\n                    try\n                    {\n                        await session.Services.BrowseNextAsync(requestHeader, true,\n                            continuationPoints, ct).ConfigureAwait(false);\n                    }\n                    catch { }\n                }\n            }\n\n            static bool Extract(List<FindResult> targetIds, ReferenceDescriptionCollection references)\n            {\n                // get the node ids.\n                foreach (var reference in references)\n                {\n                    if (NodeId.IsNull(reference.NodeId) ||\n                        reference.NodeId.IsAbsolute)\n                    {\n                        targetIds.Add(new FindResult(QualifiedName.Null, null, NodeId.Null,\n                            ExpandedNodeId.Null, Opc.Ua.NodeClass.Unspecified,\n                            new ServiceResultModel { ErrorMessage = \"Target node is null or absolute\" }));\n                        continue;\n                    }\n                    targetIds.Add(new FindResult(reference.BrowseName, reference.DisplayName?.Text,\n                        (NodeId)reference.NodeId, reference.TypeDefinition, reference.NodeClass));\n                }\n                return true;\n            }\n        }\n\n        /// <summary>\n        /// Helper struct return\n        /// </summary>\n        /// <param name=\"Description\"></param>\n        /// <param name=\"References\"></param>\n        /// <param name=\"ErrorInfo\"></param>\n        internal record struct BrowseResult(BrowseDescription? Description,\n            ReferenceDescriptionCollection? References, ServiceResultModel? ErrorInfo);\n\n        /// <summary>\n        /// Enumerates browse results inline\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"nodesToBrowse\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async IAsyncEnumerable<BrowseResult> BrowseAsync(\n            this IOpcUaSession session, RequestHeader requestHeader,\n            ViewDescription? view, BrowseDescriptionCollection nodesToBrowse,\n            [EnumeratorCancellation] CancellationToken ct = default)\n        {\n            var limits = await session.GetOperationLimitsAsync(ct).ConfigureAwait(false);\n            var maxContinuationPoints = limits.GetMaxBrowseContinuationPoints();\n            foreach (var nodesToBrowseBatch in nodesToBrowse.Batch(limits.GetMaxNodesPerBrowse()))\n            {\n                var browseDescriptions = new BrowseDescriptionCollection(nodesToBrowseBatch);\n                var firstResponse = await session.Services.BrowseAsync(requestHeader, view,\n                    0, browseDescriptions, ct).ConfigureAwait(false);\n                var firstResults = firstResponse.Validate(firstResponse.Results,\n                    s => s.StatusCode, firstResponse.DiagnosticInfos, browseDescriptions);\n                if (firstResults.ErrorInfo != null)\n                {\n                    yield return new BrowseResult(null, null, firstResults.ErrorInfo);\n                }\n                var continuationPoints = firstResults\n                    .Where(r => r.Result.ContinuationPoint?.Length > 0)\n                    .Select(r => (r.Request, r.Result.ContinuationPoint));\n                try\n                {\n                    foreach (var result in firstResults)\n                    {\n                        yield return new BrowseResult(result.Request,\n                            result.Result.References, result.ErrorInfo);\n                    }\n                    while (true)\n                    {\n                        var next = continuationPoints.Take(maxContinuationPoints).ToList();\n                        if (next.Count == 0)\n                        {\n                            break;\n                        }\n\n                        var nextResponse = await session.Services.BrowseNextAsync(requestHeader,\n                            false, new ByteStringCollection(next.Select(r => r.ContinuationPoint)),\n                            ct).ConfigureAwait(false);\n                        var nextResults = firstResponse.Validate(nextResponse.Results,\n                            s => s.StatusCode, nextResponse.DiagnosticInfos, next);\n\n                        if (nextResults.ErrorInfo != null)\n                        {\n                            yield return new BrowseResult(null, null, nextResults.ErrorInfo);\n                        }\n                        foreach (var result in nextResults)\n                        {\n                            yield return new BrowseResult(\n                                result.Request.Request, result.Result.References, result.ErrorInfo);\n                        }\n\n                        continuationPoints = continuationPoints.Concat(nextResults\n                            .Where(r => r.Result.ContinuationPoint?.Length > 0)\n                            .Select(r => (r.Request.Request, r.Result.ContinuationPoint)));\n                    }\n                }\n                finally\n                {\n                    // Release any dangling continuation points\n                    foreach (var batch in continuationPoints\n                        .Select(r => r.ContinuationPoint)\n                        .Batch(maxContinuationPoints))\n                    {\n                        await session.Services.BrowseNextAsync(requestHeader,\n                            true, new ByteStringCollection(batch), ct).ConfigureAwait(false);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Recursively collects the variables in a NodeState and\n        /// returns a collection of BrowsePaths.\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"rootId\"></param>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"parentPath\"></param>\n        /// <param name=\"browsePaths\"></param>\n        private static List<BrowsePath> GetBrowsePathFromNodeState(\n            this IOpcUaSession session, NodeId rootId, NodeState parent,\n            RelativePath? parentPath, List<BrowsePath>? browsePaths = null)\n        {\n            browsePaths ??= [];\n            var children = new List<BaseInstanceState>();\n            parent.GetChildren(session.SystemContext, children);\n            foreach (var child in children)\n            {\n                var browsePath = new BrowsePath\n                {\n                    StartingNode = rootId,\n                    Handle = child\n                };\n                if (parentPath != null)\n                {\n                    browsePath.RelativePath.Elements.AddRange(parentPath.Elements);\n                }\n                var element = new RelativePathElement\n                {\n                    ReferenceTypeId = child.ReferenceTypeId,\n                    IsInverse = false,\n                    IncludeSubtypes = false,\n                    TargetName = child.BrowseName\n                };\n                browsePath.RelativePath.Elements.Add(element);\n                browsePaths.Add(browsePath);\n                browsePaths = session.GetBrowsePathFromNodeState(rootId, child,\n                    browsePath.RelativePath, browsePaths);\n            }\n            return browsePaths;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/StackModelsEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using DiagnosticsLevel = Publisher.Models.DiagnosticsLevel;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using System.Threading;\n\n    /// <summary>\n    /// Stack models extensions\n    /// </summary>\n    public static class StackModelsEx\n    {\n        /// <summary>\n        /// Convert diagnostics to request header\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <returns></returns>\n        public static RequestHeader ToRequestHeader(this RequestHeaderModel? header,\n            TimeProvider? timeProvider = null)\n        {\n            var timestamp = header?.Diagnostics?.TimeStamp\n                ?? (timeProvider ?? TimeProvider.System).GetUtcNow().UtcDateTime;\n            return new RequestHeader\n            {\n                AuditEntryId = header?.Diagnostics?.AuditId ?? Guid.NewGuid().ToString(),\n                ReturnDiagnostics =\n                    (uint)(header?.Diagnostics?.Level ?? DiagnosticsLevel.Status)\n                    .ToStackType(),\n                Timestamp = timestamp,\n                TimeoutHint = (uint)(header?.OperationTimeout ?? 0),\n                AdditionalHeader = null // TODO\n            };\n        }\n\n        /// <summary>\n        /// Convert diagnostics to request header\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static ViewDescription? ToStackModel(this BrowseViewModel? model,\n            IServiceMessageContext context)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new ViewDescription\n            {\n                Timestamp = model.Timestamp ?? DateTime.MinValue,\n                ViewVersion = model.Version ?? 0,\n                ViewId = model.ViewId.ToNodeId(context)\n            };\n        }\n\n        /// <summary>\n        /// Convert role permission type to service model\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public static RolePermissionModel ToServiceModel(this RolePermissionType type,\n            IServiceMessageContext context, NamespaceFormat namespaceFormat)\n        {\n            var roleId = type.RoleId.AsString(context, namespaceFormat);\n            if (roleId == null)\n            {\n                throw new ArgumentException(\"Permission type not a valid node id\");\n            }\n            return new RolePermissionModel\n            {\n                RoleId = roleId,\n                Permissions = ((PermissionType)type.Permissions).ToServiceType()\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static DataChangeFilter? ToStackModel(this DataChangeFilterModel? model)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new DataChangeFilter\n            {\n                DeadbandValue = model.DeadbandValue ?? 0.0,\n                DeadbandType = (uint)model.DeadbandType.ToStackType(),\n                Trigger = model.DataChangeTrigger.ToStackType()\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static AggregateFilter? ToStackModel(this AggregateFilterModel? model,\n            IServiceMessageContext context)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new AggregateFilter\n            {\n                AggregateConfiguration = model.AggregateConfiguration.ToStackModel(),\n                AggregateType = model.AggregateTypeId.ToNodeId(context),\n                StartTime = model.StartTime ?? DateTime.MinValue,\n                ProcessingInterval = (model.ProcessingInterval?.TotalMilliseconds) ?? 0.0\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        public static AggregateConfiguration ToStackModel(\n            this AggregateConfigurationModel? model)\n        {\n            if (model is null)\n            {\n                return new AggregateConfiguration\n                {\n                    UseServerCapabilitiesDefaults = true\n                };\n            }\n            return new AggregateConfiguration\n            {\n                PercentDataBad = model.PercentDataBad ?? 0,\n                PercentDataGood = model.PercentDataGood ?? 0,\n                TreatUncertainAsBad = model.TreatUncertainAsBad ?? true,\n                UseSlopedExtrapolation = model.UseSlopedExtrapolation ?? true\n            };\n        }\n\n        /// <summary>\n        /// Convert to stack model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static SimpleAttributeOperand? ToStackModel(this SimpleAttributeOperandModel? model,\n            IServiceMessageContext context)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new SimpleAttributeOperand\n            {\n                TypeDefinitionId = model.TypeDefinitionId.ToNodeId(context),\n                AttributeId = (uint)(model.AttributeId ?? NodeAttribute.Value),\n                BrowsePath = new QualifiedNameCollection(model.BrowsePath == null ?\n                    [] :\n                    model.BrowsePath.Select(n => n.ToQualifiedName(context))),\n                IndexRange = model.IndexRange\n            };\n        }\n\n        /// <summary>\n        /// Convert to service model\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <returns></returns>\n        [return: NotNullIfNotNull(nameof(model))]\n        public static SimpleAttributeOperandModel? ToServiceModel(this SimpleAttributeOperand? model,\n            IServiceMessageContext context, NamespaceFormat namespaceFormat)\n        {\n            if (model is null)\n            {\n                return null;\n            }\n            return new SimpleAttributeOperandModel\n            {\n                TypeDefinitionId = model.TypeDefinitionId\n                    .AsString(context, namespaceFormat),\n                AttributeId = (NodeAttribute)model.AttributeId,\n                BrowsePath = model.BrowsePath?\n                    .Select(p => p.AsString(context, namespaceFormat))\n                    .ToArray(),\n                IndexRange = model.IndexRange\n            };\n        }\n\n        /// <summary>\n        /// Convert user token policies to service model\n        /// </summary>\n        /// <param name=\"policies\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <returns></returns>\n        public static IReadOnlyList<AuthenticationMethodModel> ToServiceModel(\n            this UserTokenPolicyCollection policies, IJsonSerializer serializer)\n        {\n            if (policies == null || policies.Count == 0)\n            {\n                return new List<AuthenticationMethodModel>\n                {\n                     new() {\n                         Id = \"Anonymous\",\n                         CredentialType = CredentialType.None\n                     }\n                };\n            }\n            return policies\n                .Select(p => p.ToServiceModel(serializer)!)\n                .Where(p => p != null)\n                .Distinct()\n                .ToList();\n        }\n\n        /// <summary>\n        /// Convert user token policy to service model\n        /// </summary>\n        /// <param name=\"policy\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <returns></returns>\n        public static AuthenticationMethodModel? ToServiceModel(\n            this UserTokenPolicy? policy, IJsonSerializer serializer)\n        {\n            if (policy == null)\n            {\n                return null;\n            }\n            var configuration = VariantValue.Null;\n            var credentialType = CredentialType.None;\n            switch (policy.TokenType)\n            {\n                case UserTokenType.Anonymous:\n                    break;\n                case UserTokenType.UserName:\n                    credentialType = CredentialType.UserName;\n                    break;\n                case UserTokenType.Certificate:\n                    credentialType = CredentialType.X509Certificate;\n                    configuration = policy.IssuerEndpointUrl;\n                    break;\n                case UserTokenType.IssuedToken:\n                    switch (policy.IssuedTokenType)\n                    {\n                        case \"http://opcfoundation.org/UA/UserToken#JWT\":\n                            credentialType = CredentialType.JwtToken;\n                            try\n                            {\n                                // See part 6\n                                configuration = serializer.Parse(policy.IssuerEndpointUrl);\n                            }\n                            catch\n                            {\n                                // Store as string\n                                configuration = policy.IssuerEndpointUrl;\n                            }\n                            break;\n                        default:\n                            // TODO\n                            return null;\n                    }\n                    break;\n                default:\n                    return null;\n            }\n            return new AuthenticationMethodModel\n            {\n                Id = policy.PolicyId,\n                SecurityPolicy = policy.SecurityPolicyUri,\n                Configuration = configuration,\n                CredentialType = credentialType\n            };\n        }\n\n        /// <summary>\n        /// Makes a user identity\n        /// </summary>\n        /// <param name=\"credential\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        public static async ValueTask<IUserIdentity> ToUserIdentityAsync(this CredentialModel? credential,\n            ApplicationConfiguration configuration, CancellationToken ct = default)\n        {\n            if (credential == null || credential.Type == CredentialType.None)\n            {\n                return new UserIdentity(new AnonymousIdentityToken());\n            }\n            var identity = credential.Value;\n            if (identity == null)\n            {\n                throw new ServiceResultException(StatusCodes.BadInvalidArgument,\n                    $\"Credential type {credential.Type} requires providing a credential value.\");\n            }\n            switch (credential.Type)\n            {\n                case CredentialType.UserName:\n                    return new UserIdentity(identity.User, identity.Password);\n                case CredentialType.X509Certificate:\n                    var subjectName = identity.User;\n                    var thumbprint = identity.Thumbprint;\n                    var passCode = identity.Password;\n                    if (thumbprint != null || subjectName != null)\n                    {\n                        using var users = configuration.SecurityConfiguration\n                            .TrustedUserCertificates.OpenStore();\n                        var userCertWithPrivateKey = await users.LoadPrivateKeyAsync(thumbprint, subjectName,\n                            null, null /* TODO add rsa/ecc*/, passCode, ct).ConfigureAwait(false);\n                        if (userCertWithPrivateKey == null)\n                        {\n                            throw new ServiceResultException(StatusCodes.BadCertificateInvalid,\n                                $\"User certificate for {subjectName ?? thumbprint} missing \" +\n                                \"or provided password invalid. Please configure the User \" +\n                                \"Certificate correctly in the User certificate store.\");\n                        }\n                        return new UserIdentity(userCertWithPrivateKey);\n                    }\n                    throw new ServiceResultException(StatusCodes.BadNotSupported,\n                       \"X509Certificate credential requires to set either a thumbprint or subject name (user).\");\n                case CredentialType.None:\n                    return new UserIdentity(new AnonymousIdentityToken());\n                default:\n                    throw new ServiceResultException(StatusCodes.BadNotSupported,\n                        $\"Credential type {credential!.Type} is not supported\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/StackTypesEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using UaAggregateBits = Opc.Ua.AggregateBits;\n    using UaApplicationType = Opc.Ua.ApplicationType;\n    using UaBrowseDirection = Opc.Ua.BrowseDirection;\n    using UaDataChangeTrigger = Opc.Ua.DataChangeTrigger;\n    using UaDataSetFieldContentMask = Opc.Ua.DataSetFieldContentMask;\n    using UaDeadbandType = Opc.Ua.DeadbandType;\n    using UaDiagnosticsLevel = Opc.Ua.DiagnosticsMasks;\n    using UaExceptionDeviationFormat = Opc.Ua.ExceptionDeviationFormat;\n    using UaFilterOperator = Opc.Ua.FilterOperator;\n    using JsonDataSetMessageContentMask = Opc.Ua.JsonDataSetMessageContentMask;\n    using JsonNetworkMessageContentMask = Opc.Ua.JsonNetworkMessageContentMask;\n    using UaSecurityMode = Opc.Ua.MessageSecurityMode;\n    using UaMonitoringMode = Opc.Ua.MonitoringMode;\n    using UaNodeClass = Opc.Ua.NodeClass;\n    using UaPermissionType = Opc.Ua.PermissionType;\n    using UaTimestampsToReturn = Opc.Ua.TimestampsToReturn;\n    using UadpDataSetMessageContentMask = Opc.Ua.UadpDataSetMessageContentMask;\n    using UadpNetworkMessageContentMask = Opc.Ua.UadpNetworkMessageContentMask;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Stack types conversions\n    /// </summary>\n    internal static class StackTypesEx\n    {\n        /// <summary>\n        /// Convert node class\n        /// </summary>\n        /// <param name=\"nodeClass\"></param>\n        /// <returns></returns>\n        public static NodeClass? ToServiceType(this UaNodeClass nodeClass)\n        {\n            switch (nodeClass)\n            {\n                case UaNodeClass.Object:\n                    return NodeClass.Object;\n                case UaNodeClass.ObjectType:\n                    return NodeClass.ObjectType;\n                case UaNodeClass.Variable:\n                    return NodeClass.Variable;\n                case UaNodeClass.VariableType:\n                    return NodeClass.VariableType;\n                case UaNodeClass.Method:\n                    return NodeClass.Method;\n                case UaNodeClass.DataType:\n                    return NodeClass.DataType;\n                case UaNodeClass.ReferenceType:\n                    return NodeClass.ReferenceType;\n                case UaNodeClass.View:\n                    return NodeClass.View;\n                default:\n                    return null;\n            }\n        }\n\n        /// <summary>\n        /// Convert node class\n        /// </summary>\n        /// <param name=\"nodeClass\"></param>\n        /// <returns></returns>\n        public static UaNodeClass ToStackType(this NodeClass nodeClass)\n        {\n            switch (nodeClass)\n            {\n                case NodeClass.Object:\n                    return UaNodeClass.Object;\n                case NodeClass.ObjectType:\n                    return UaNodeClass.ObjectType;\n                case NodeClass.Variable:\n                    return UaNodeClass.Variable;\n                case NodeClass.VariableType:\n                    return UaNodeClass.VariableType;\n                case NodeClass.Method:\n                    return UaNodeClass.Method;\n                case NodeClass.DataType:\n                    return UaNodeClass.DataType;\n                case NodeClass.ReferenceType:\n                    return UaNodeClass.ReferenceType;\n                case NodeClass.View:\n                    return UaNodeClass.View;\n                default:\n                    return UaNodeClass.Unspecified;\n            }\n        }\n\n        /// <summary>\n        /// Convert mask to a list of node classes\n        /// </summary>\n        /// <param name=\"nodeClasses\"></param>\n        /// <returns></returns>\n        public static UaNodeClass ToStackMask(this IReadOnlyList<NodeClass>? nodeClasses)\n        {\n            var mask = 0u;\n            if (nodeClasses != null)\n            {\n                foreach (var nodeClass in nodeClasses)\n                {\n                    mask |= (uint)nodeClass.ToStackType();\n                }\n            }\n            return (UaNodeClass)mask;\n        }\n\n        /// <summary>\n        /// Convert browse direction\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <returns></returns>\n        public static UaBrowseDirection ToStackType(this BrowseDirection mode)\n        {\n            switch (mode)\n            {\n                case BrowseDirection.Forward:\n                    return UaBrowseDirection.Forward;\n                case BrowseDirection.Backward:\n                    return UaBrowseDirection.Inverse;\n                case BrowseDirection.Both:\n                    return UaBrowseDirection.Both;\n                default:\n                    return UaBrowseDirection.Forward;\n            }\n        }\n\n        /// <summary>\n        /// Convert permissions\n        /// </summary>\n        /// <param name=\"permissions\"></param>\n        /// <returns></returns>\n        public static RolePermissions? ToServiceType(this UaPermissionType permissions)\n        {\n            if (permissions == UaPermissionType.None)\n            {\n                return null;\n            }\n            return (RolePermissions)permissions;\n        }\n\n        /// <summary>\n        /// Convert security mode\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <returns></returns>\n        public static SecurityMode? ToServiceType(this UaSecurityMode mode)\n        {\n            switch (mode)\n            {\n                case UaSecurityMode.None:\n                    return SecurityMode.None;\n                case UaSecurityMode.Sign:\n                    return SecurityMode.Sign;\n                case UaSecurityMode.SignAndEncrypt:\n                    return SecurityMode.SignAndEncrypt;\n                default:\n                    return null;\n            }\n        }\n\n        /// <summary>\n        /// Match security model\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <param name=\"securityMode\"></param>\n        /// <returns></returns>\n        public static bool IsSame(this UaSecurityMode mode, SecurityMode securityMode)\n        {\n            switch (securityMode)\n            {\n                case SecurityMode.Best:\n                    return true; // Any security mode\n                case SecurityMode.Sign:\n                    return mode == UaSecurityMode.Sign;\n                case SecurityMode.SignAndEncrypt:\n                    return mode == UaSecurityMode.SignAndEncrypt;\n                case SecurityMode.None:\n                    return mode == UaSecurityMode.None;\n                case SecurityMode.NotNone:\n                    return mode != UaSecurityMode.None;\n                default:\n                    return false;\n            }\n        }\n\n        /// <summary>\n        /// Convert application type\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        public static ApplicationType? ToServiceType(this UaApplicationType type)\n        {\n            switch (type)\n            {\n                case UaApplicationType.Client:\n                    return ApplicationType.Client;\n                case UaApplicationType.DiscoveryServer:\n                    return ApplicationType.DiscoveryServer;\n                case UaApplicationType.Server:\n                    return ApplicationType.Server;\n                case UaApplicationType.ClientAndServer:\n                    return ApplicationType.ClientAndServer;\n                default:\n                    return null;\n            }\n        }\n\n        /// <summary>\n        /// Convert to diagnostics mask\n        /// </summary>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        public static UaDiagnosticsLevel ToStackType(this DiagnosticsLevel level)\n        {\n            var result = UaDiagnosticsLevel.None;\n            if (level == DiagnosticsLevel.None)\n            {\n                return result;\n            }\n            result |= UaDiagnosticsLevel.SymbolicIdAndText;\n            if (level == DiagnosticsLevel.Status)\n            {\n                return result;\n            }\n            result |= UaDiagnosticsLevel.AdditionalInfo;\n            if (level == DiagnosticsLevel.Information)\n            {\n                return result;\n            }\n            result |= UaDiagnosticsLevel.InnerStatusCode;\n            result |= UaDiagnosticsLevel.InnerDiagnostics;\n            if (level == DiagnosticsLevel.Debug)\n            {\n                return result;\n            }\n            result |= UaDiagnosticsLevel.All;\n            return result;\n        }\n\n        /// <summary>\n        /// Convert monitoring mode\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <returns></returns>\n        public static UaMonitoringMode? ToStackType(this MonitoringMode? mode)\n        {\n            if (mode == null)\n            {\n                return null;\n            }\n            switch (mode)\n            {\n                case MonitoringMode.Disabled:\n                    return UaMonitoringMode.Disabled;\n                case MonitoringMode.Sampling:\n                    return UaMonitoringMode.Sampling;\n                default:\n                    return UaMonitoringMode.Reporting;\n            }\n        }\n\n        /// <summary>\n        /// Convert timestamp to return\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <returns></returns>\n        public static UaTimestampsToReturn ToStackType(this TimestampsToReturn? mode)\n        {\n            switch (mode)\n            {\n                case TimestampsToReturn.None:\n                    return UaTimestampsToReturn.Neither;\n                case TimestampsToReturn.Server:\n                    return UaTimestampsToReturn.Server;\n                case TimestampsToReturn.Source:\n                    return UaTimestampsToReturn.Source;\n                default:\n                    return UaTimestampsToReturn.Both;\n            }\n        }\n\n        /// <summary>\n        /// Convert deadband type\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <returns></returns>\n        public static UaDeadbandType ToStackType(this DeadbandType? mode)\n        {\n            if (mode == null)\n            {\n                return UaDeadbandType.None;\n            }\n            switch (mode.Value)\n            {\n                case DeadbandType.Absolute:\n                    return UaDeadbandType.Absolute;\n                case DeadbandType.Percent:\n                    return UaDeadbandType.Percent;\n                default:\n                    return UaDeadbandType.None;\n            }\n        }\n\n        /// <summary>\n        /// Convert deadband type\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <returns></returns>\n        public static UaDataChangeTrigger ToStackType(this DataChangeTriggerType? mode)\n        {\n            if (mode == null)\n            {\n                // Default is status and value change triggering\n                return UaDataChangeTrigger.StatusValue;\n            }\n            switch (mode.Value)\n            {\n                case DataChangeTriggerType.Status:\n                    return UaDataChangeTrigger.Status;\n                case DataChangeTriggerType.StatusValue:\n                    return UaDataChangeTrigger.StatusValue;\n                case DataChangeTriggerType.StatusValueTimestamp:\n                    return UaDataChangeTrigger.StatusValueTimestamp;\n                default:\n                    return UaDataChangeTrigger.StatusValue;\n            }\n        }\n\n        /// <summary>\n        /// Convert to stack type\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        public static UaFilterOperator ToStackType(this FilterOperatorType type)\n        {\n            switch (type)\n            {\n                case FilterOperatorType.Equals:\n                    return UaFilterOperator.Equals;\n                case FilterOperatorType.IsNull:\n                    return UaFilterOperator.IsNull;\n                case FilterOperatorType.GreaterThan:\n                    return UaFilterOperator.GreaterThan;\n                case FilterOperatorType.LessThan:\n                    return UaFilterOperator.LessThan;\n                case FilterOperatorType.GreaterThanOrEqual:\n                    return UaFilterOperator.GreaterThanOrEqual;\n                case FilterOperatorType.LessThanOrEqual:\n                    return UaFilterOperator.LessThanOrEqual;\n                case FilterOperatorType.Like:\n                    return UaFilterOperator.Like;\n                case FilterOperatorType.Not:\n                    return UaFilterOperator.Not;\n                case FilterOperatorType.Between:\n                    return UaFilterOperator.Between;\n                case FilterOperatorType.InList:\n                    return UaFilterOperator.InList;\n                case FilterOperatorType.And:\n                    return UaFilterOperator.And;\n                case FilterOperatorType.Or:\n                    return UaFilterOperator.Or;\n                case FilterOperatorType.Cast:\n                    return UaFilterOperator.Cast;\n                case FilterOperatorType.InView:\n                    return UaFilterOperator.InView;\n                case FilterOperatorType.OfType:\n                    return UaFilterOperator.OfType;\n                case FilterOperatorType.RelatedTo:\n                    return UaFilterOperator.RelatedTo;\n                case FilterOperatorType.BitwiseAnd:\n                    return UaFilterOperator.BitwiseAnd;\n                case FilterOperatorType.BitwiseOr:\n                    return UaFilterOperator.BitwiseOr;\n                default:\n                    throw new NotSupportedException($\"{type} not supported\");\n            }\n        }\n\n        /// <summary>\n        /// Convert to stack type\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        public static FilterOperatorType ToServiceType(this UaFilterOperator type)\n        {\n            switch (type)\n            {\n                case UaFilterOperator.Equals:\n                    return FilterOperatorType.Equals;\n                case UaFilterOperator.IsNull:\n                    return FilterOperatorType.IsNull;\n                case UaFilterOperator.GreaterThan:\n                    return FilterOperatorType.GreaterThan;\n                case UaFilterOperator.LessThan:\n                    return FilterOperatorType.LessThan;\n                case UaFilterOperator.GreaterThanOrEqual:\n                    return FilterOperatorType.GreaterThanOrEqual;\n                case UaFilterOperator.LessThanOrEqual:\n                    return FilterOperatorType.LessThanOrEqual;\n                case UaFilterOperator.Like:\n                    return FilterOperatorType.Like;\n                case UaFilterOperator.Not:\n                    return FilterOperatorType.Not;\n                case UaFilterOperator.Between:\n                    return FilterOperatorType.Between;\n                case UaFilterOperator.InList:\n                    return FilterOperatorType.InList;\n                case UaFilterOperator.And:\n                    return FilterOperatorType.And;\n                case UaFilterOperator.Or:\n                    return FilterOperatorType.Or;\n                case UaFilterOperator.Cast:\n                    return FilterOperatorType.Cast;\n                case UaFilterOperator.InView:\n                    return FilterOperatorType.InView;\n                case UaFilterOperator.OfType:\n                    return FilterOperatorType.OfType;\n                case UaFilterOperator.RelatedTo:\n                    return FilterOperatorType.RelatedTo;\n                case UaFilterOperator.BitwiseAnd:\n                    return FilterOperatorType.BitwiseAnd;\n                case UaFilterOperator.BitwiseOr:\n                    return FilterOperatorType.BitwiseOr;\n                default:\n                    throw new NotSupportedException($\"{type} not supported\");\n            }\n        }\n\n        /// <summary>\n        /// To service type\n        /// </summary>\n        /// <param name=\"format\"></param>\n        /// <returns></returns>\n        public static ExceptionDeviationType? ToExceptionDeviationType(\n            this UaExceptionDeviationFormat? format)\n        {\n            switch (format)\n            {\n                case UaExceptionDeviationFormat.AbsoluteValue:\n                    return ExceptionDeviationType.AbsoluteValue;\n                case UaExceptionDeviationFormat.PercentOfValue:\n                    return ExceptionDeviationType.PercentOfValue;\n                case UaExceptionDeviationFormat.PercentOfRange:\n                    return ExceptionDeviationType.PercentOfRange;\n                case UaExceptionDeviationFormat.PercentOfEURange:\n                    return ExceptionDeviationType.PercentOfEURange;\n                default:\n                    return null;\n            }\n        }\n\n        /// <summary>\n        /// Convert data location\n        /// </summary>\n        /// <param name=\"aggregateBits\"></param>\n        /// <returns></returns>\n        public static DataLocation? ToDataLocation(this UaAggregateBits aggregateBits)\n        {\n            if ((aggregateBits & UaAggregateBits.Calculated) != 0)\n            {\n                return DataLocation.Calculated;\n            }\n            else if ((aggregateBits & UaAggregateBits.Interpolated) != 0)\n            {\n                return DataLocation.Interpolated;\n            }\n            else\n            {\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Convert additional data\n        /// </summary>\n        /// <param name=\"aggregateBits\"></param>\n        /// <returns></returns>\n        public static AdditionalData? ToAdditionalData(this UaAggregateBits aggregateBits)\n        {\n            AdditionalData result = 0;\n            if ((aggregateBits & UaAggregateBits.ExtraData) != 0)\n            {\n                result |= AdditionalData.ExtraData;\n            }\n            if ((aggregateBits & UaAggregateBits.MultipleValues) != 0)\n            {\n                result |= AdditionalData.MultipleValues;\n            }\n            if ((aggregateBits & UaAggregateBits.Partial) != 0)\n            {\n                result |= AdditionalData.Partial;\n            }\n            if (result == 0)\n            {\n                return null;\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Get network message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <returns></returns>\n        public static uint ToStackType(this NetworkMessageContentFlags? mask, MessageEncoding? encoding)\n        {\n            mask ??=\n                    NetworkMessageContentFlags.NetworkMessageHeader |\n                    NetworkMessageContentFlags.NetworkMessageNumber |\n                    NetworkMessageContentFlags.DataSetMessageHeader |\n                    NetworkMessageContentFlags.PublisherId |\n                    NetworkMessageContentFlags.DataSetClassId;\n            switch (encoding)\n            {\n                case MessageEncoding.Uadp:\n                    return (uint)ToUadpStackType(mask.Value);\n                case MessageEncoding.Json:\n                    return (uint)ToJsonStackType(mask.Value);\n            }\n            return (uint)ToJsonStackType(mask.Value);\n        }\n\n        /// <summary>\n        /// Get network message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <param name=\"fieldMask\"></param>\n        /// <param name=\"encoding\"></param>\n        /// <returns></returns>\n        public static uint ToStackType(this DataSetMessageContentFlags? mask,\n            DataSetFieldContentFlags? fieldMask, MessageEncoding? encoding)\n        {\n            mask ??=\n                    DataSetMessageContentFlags.DataSetWriterId |\n                    DataSetMessageContentFlags.DataSetWriterName |\n                    DataSetMessageContentFlags.MetaDataVersion |\n                    DataSetMessageContentFlags.MajorVersion |\n                    DataSetMessageContentFlags.MinorVersion |\n                    DataSetMessageContentFlags.SequenceNumber |\n                    DataSetMessageContentFlags.Timestamp |\n                    DataSetMessageContentFlags.MessageType |\n                    DataSetMessageContentFlags.Status;\n            switch (encoding)\n            {\n                case MessageEncoding.Uadp:\n                    return (uint)ToUadpStackType(mask.Value);\n                case MessageEncoding.Json:\n                    return (uint)ToJsonStackType(mask.Value, fieldMask);\n            }\n            return (uint)ToJsonStackType(mask.Value, fieldMask);\n        }\n\n        /// <summary>\n        /// Get network message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <returns></returns>\n        private static JsonNetworkMessageContentMask ToJsonStackType(this NetworkMessageContentFlags mask)\n        {\n            var result = JsonNetworkMessageContentMask.None;\n            if ((mask & NetworkMessageContentFlags.PublisherId) != 0)\n            {\n                result |= JsonNetworkMessageContentMask.PublisherId;\n            }\n            if ((mask & NetworkMessageContentFlags.DataSetClassId) != 0)\n            {\n                result |= JsonNetworkMessageContentMask.DataSetClassId;\n            }\n            if ((mask & NetworkMessageContentFlags.ReplyTo) != 0)\n            {\n                result |= JsonNetworkMessageContentMask.ReplyTo;\n            }\n            if ((mask & NetworkMessageContentFlags.NetworkMessageHeader) != 0)\n            {\n                result |= JsonNetworkMessageContentMask.NetworkMessageHeader;\n            }\n            else\n            {\n                // If not set, bits 3, 4 and 5 can also not be set\n                result = JsonNetworkMessageContentMask.None;\n            }\n            if ((mask & NetworkMessageContentFlags.MonitoredItemMessage) != 0)\n            {\n                // If monitored item message, then no network message header\n                result = JsonNetworkMessageContentMask.None;\n            }\n            if ((mask & NetworkMessageContentFlags.DataSetMessageHeader) != 0)\n            {\n                result |= JsonNetworkMessageContentMask.DataSetMessageHeader;\n            }\n            if ((mask & NetworkMessageContentFlags.SingleDataSetMessage) != 0)\n            {\n                result |= JsonNetworkMessageContentMask.SingleDataSetMessage;\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Get dataset message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <param name=\"fieldMask\"></param>\n        /// <returns></returns>\n        private static JsonDataSetMessageContentMask ToJsonStackType(this DataSetMessageContentFlags mask,\n            DataSetFieldContentFlags? fieldMask)\n        {\n            var result = JsonDataSetMessageContentMask.None;\n            if ((mask & DataSetMessageContentFlags.Timestamp) != 0)\n            {\n                result |= JsonDataSetMessageContentMask.Timestamp;\n            }\n            if ((mask & DataSetMessageContentFlags.Status) != 0)\n            {\n                result |= JsonDataSetMessageContentMask.Status;\n            }\n            if ((mask & DataSetMessageContentFlags.MetaDataVersion) != 0)\n            {\n                result |= JsonDataSetMessageContentMask.MetaDataVersion;\n            }\n            if ((mask & DataSetMessageContentFlags.SequenceNumber) != 0)\n            {\n                result |= JsonDataSetMessageContentMask.SequenceNumber;\n            }\n            if ((mask & DataSetMessageContentFlags.DataSetWriterId) != 0)\n            {\n                result |= JsonDataSetMessageContentMask.DataSetWriterId;\n            }\n            if ((mask & DataSetMessageContentFlags.MessageType) != 0)\n            {\n                result |= JsonDataSetMessageContentMask.MessageType;\n            }\n            if ((mask & DataSetMessageContentFlags.DataSetWriterName) != 0)\n            {\n                result |= JsonDataSetMessageContentMask.DataSetWriterName;\n            }\n            if ((mask & DataSetMessageContentFlags.ReversibleFieldEncoding) != 0)\n            {\n                result |= JsonDataSetMessageContentMask.FieldEncoding1;\n            }\n\n            if (fieldMask != null)\n            {\n                if ((fieldMask & DataSetFieldContentFlags.NodeId) != 0)\n                {\n                    result |= JsonDataSetMessageContentMaskEx.NodeId;\n                }\n                if ((fieldMask & DataSetFieldContentFlags.DisplayName) != 0)\n                {\n                    result |= JsonDataSetMessageContentMaskEx.DisplayName;\n                }\n                if ((fieldMask & DataSetFieldContentFlags.ExtensionFields) != 0)\n                {\n                    result |= JsonDataSetMessageContentMaskEx.ExtensionFields;\n                }\n                if ((fieldMask & DataSetFieldContentFlags.EndpointUrl) != 0)\n                {\n                    result |= JsonDataSetMessageContentMaskEx.EndpointUrl;\n                }\n                if ((fieldMask & DataSetFieldContentFlags.ApplicationUri) != 0)\n                {\n                    result |= JsonDataSetMessageContentMaskEx.ApplicationUri;\n                }\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Get network message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <returns></returns>\n        private static UadpNetworkMessageContentMask ToUadpStackType(this NetworkMessageContentFlags mask)\n        {\n            var result = UadpNetworkMessageContentMask.None;\n            if ((mask & NetworkMessageContentFlags.PublisherId) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.PublisherId;\n            }\n            if ((mask & NetworkMessageContentFlags.GroupHeader) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.GroupHeader;\n            }\n            if ((mask & NetworkMessageContentFlags.WriterGroupId) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.WriterGroupId;\n            }\n            if ((mask & NetworkMessageContentFlags.GroupVersion) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.GroupVersion;\n            }\n            if ((mask & NetworkMessageContentFlags.NetworkMessageNumber) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.NetworkMessageNumber;\n            }\n            if ((mask & NetworkMessageContentFlags.SequenceNumber) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.SequenceNumber;\n            }\n            if ((mask & NetworkMessageContentFlags.PayloadHeader) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.PayloadHeader;\n            }\n            if ((mask & NetworkMessageContentFlags.Timestamp) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.Timestamp;\n            }\n            if ((mask & NetworkMessageContentFlags.Picoseconds) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.PicoSeconds;\n            }\n            if ((mask & NetworkMessageContentFlags.DataSetClassId) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.DataSetClassId;\n            }\n            if ((mask & NetworkMessageContentFlags.PromotedFields) != 0)\n            {\n                result |= UadpNetworkMessageContentMask.PromotedFields;\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Get dataset message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <returns></returns>\n        private static UadpDataSetMessageContentMask ToUadpStackType(this DataSetMessageContentFlags mask)\n        {\n            var result = UadpDataSetMessageContentMask.None;\n            if ((mask & DataSetMessageContentFlags.Timestamp) != 0)\n            {\n                result |= UadpDataSetMessageContentMask.Timestamp;\n            }\n            if ((mask & DataSetMessageContentFlags.PicoSeconds) != 0)\n            {\n                result |= UadpDataSetMessageContentMask.PicoSeconds;\n            }\n            if ((mask & DataSetMessageContentFlags.Status) != 0)\n            {\n                result |= UadpDataSetMessageContentMask.Status;\n            }\n            if ((mask & DataSetMessageContentFlags.SequenceNumber) != 0)\n            {\n                result |= UadpDataSetMessageContentMask.SequenceNumber;\n            }\n            if ((mask & DataSetMessageContentFlags.MinorVersion) != 0)\n            {\n                result |= UadpDataSetMessageContentMask.MinorVersion;\n            }\n            if ((mask & DataSetMessageContentFlags.MajorVersion) != 0)\n            {\n                result |= UadpDataSetMessageContentMask.MajorVersion;\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Get dataset message content mask\n        /// </summary>\n        /// <param name=\"mask\"></param>\n        /// <returns></returns>\n        public static UaDataSetFieldContentMask ToStackType(this DataSetFieldContentFlags? mask)\n        {\n            mask ??=\n                DataSetFieldContentFlags.StatusCode |\n                DataSetFieldContentFlags.SourceTimestamp |\n                DataSetFieldContentFlags.SourcePicoSeconds |\n                DataSetFieldContentFlags.ServerPicoSeconds |\n                DataSetFieldContentFlags.ServerTimestamp\n                ;\n            var result = UaDataSetFieldContentMask.None;\n            if ((mask & DataSetFieldContentFlags.StatusCode) != 0)\n            {\n                result |= UaDataSetFieldContentMask.StatusCode;\n            }\n            if ((mask & DataSetFieldContentFlags.SourceTimestamp) != 0)\n            {\n                result |= UaDataSetFieldContentMask.SourceTimestamp;\n            }\n            if ((mask & DataSetFieldContentFlags.ServerTimestamp) != 0)\n            {\n                result |= UaDataSetFieldContentMask.ServerTimestamp;\n            }\n            if ((mask & DataSetFieldContentFlags.SourcePicoSeconds) != 0)\n            {\n                result |= UaDataSetFieldContentMask.SourcePicoSeconds;\n            }\n            if ((mask & DataSetFieldContentFlags.ServerPicoSeconds) != 0)\n            {\n                result |= UaDataSetFieldContentMask.ServerPicoSeconds;\n            }\n            if ((mask & DataSetFieldContentFlags.RawData) != 0)\n            {\n                result |= UaDataSetFieldContentMask.RawData;\n            }\n            if ((mask & DataSetFieldContentFlags.SingleFieldDegradeToValue) != 0)\n            {\n                result |= DataSetFieldContentMaskEx.SingleFieldDegradeToValue;\n            }\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/SubscriptionModelEx.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using System;\n\n    /// <summary>\n    /// Subscription model extensions\n    /// </summary>\n    internal static class SubscriptionModelEx\n    {\n        /// <summary>\n        /// Returns a string that uniquely identifies the subscription based on\n        /// the configuration\n        /// </summary>\n        /// <param name=\"model\"></param>\n        public static string CreateSubscriptionId(this SubscriptionModel model)\n        {\n            return $\"{model.ToString().ToSha1Hash()}[P{model.Priority ?? 0}\" +\n               $\"@{(int)(model.PublishingInterval?.TotalMilliseconds ?? 0)}]\";\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Extensions/VariantEncoderEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Furly.Extensions.Serializers;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n\n    /// <summary>\n    /// Variant encoder extensions\n    /// </summary>\n    public static class VariantEncoderEx\n    {\n        /// <summary>\n        /// Decode with data type as string\n        /// </summary>\n        /// <param name=\"encoder\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        public static Variant Decode(this IVariantEncoder encoder, VariantValue value,\n            string? type)\n        {\n            return encoder.Decode(value, string.IsNullOrEmpty(type) ? BuiltInType.Null :\n                TypeInfo.GetBuiltInType(type.ToNodeId(encoder.Context)));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/IEndpointDiscovery.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Endpoint discovery services extensions\n    /// </summary>\n    public interface IEndpointDiscovery\n    {\n        /// <summary>\n        /// Try get unique set of endpoints from all servers found on discovery\n        /// server endpoint url, filtered by optional prioritized locale list.\n        /// </summary>\n        /// <param name=\"discoveryUrl\"></param>\n        /// <param name=\"locales\"></param>\n        /// <param name=\"findServersOnNetwork\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<IEnumerable<DiscoveredEndpointModel>> FindEndpointsAsync(\n            Uri discoveryUrl, IReadOnlyList<string>? locales = null,\n            bool findServersOnNetwork = true, CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/IOpcUaBrowser.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Opc.Ua;\n    using System;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Represents changes in the address space\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    /// <param name=\"Source\"></param>\n    /// <param name=\"PathFromRoot\"></param>\n    /// <param name=\"PreviousItem\"></param>\n    /// <param name=\"ChangedItem\"></param>\n    /// <param name=\"SequenceNumber\"></param>\n    /// <param name=\"Timestamp\"></param>\n    public record struct Change<T>(NodeId Source, RelativePath PathFromRoot,\n        T? PreviousItem, T? ChangedItem, uint SequenceNumber,\n        DateTimeOffset Timestamp) where T : class;\n\n    /// <summary>\n    /// This is an abstraction over a continous monitored address space\n    /// inside a server.\n    /// </summary>\n    public interface IOpcUaBrowser\n    {\n        /// <summary>\n        /// Called when a node changes\n        /// </summary>\n        event EventHandler<Change<Node>>? OnNodeChange;\n\n        /// <summary>\n        /// Called when a reference changes\n        /// </summary>\n        event EventHandler<Change<ReferenceDescription>>? OnReferenceChange;\n\n        /// <summary>\n        /// Trigger a rebrowsing of the address space\n        /// </summary>\n        void Rebrowse();\n\n        /// <summary>\n        /// Close the browser\n        /// </summary>\n        /// <returns></returns>\n        ValueTask CloseAsync();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/IOpcUaCertificates.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Certificate api\n    /// </summary>\n    public interface IOpcUaCertificates\n    {\n        /// <summary>\n        /// Enumerate certificates\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"includePrivateKey\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<IReadOnlyList<X509CertificateModel>> ListCertificatesAsync(\n            CertificateStoreName store, bool includePrivateKey = false,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Add certificate pfx to store\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"pfxBlob\"></param>\n        /// <param name=\"password\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask AddCertificateAsync(CertificateStoreName store, byte[] pfxBlob,\n            string? password = null, CancellationToken ct = default);\n\n        /// <summary>\n        /// Add certificate to trusted and issuer stores\n        /// </summary>\n        /// <param name=\"certificateChain\"></param>\n        /// <param name=\"isSslCertificate\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask AddCertificateChainAsync(byte[] certificateChain,\n            bool isSslCertificate = false, CancellationToken ct = default);\n\n        /// <summary>\n        /// Remove certificate from store\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"thumbprint\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask RemoveCertificateAsync(CertificateStoreName store,\n            string thumbprint, CancellationToken ct = default);\n\n        /// <summary>\n        /// Approve a rejected certificate\n        /// </summary>\n        /// <param name=\"thumbprint\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask ApproveRejectedCertificateAsync(string thumbprint,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// List certificate revocation lists\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<IReadOnlyList<byte[]>> ListCertificateRevocationListsAsync(\n            CertificateStoreName store, CancellationToken ct = default);\n\n        /// <summary>\n        /// Add certificate revocation list to store\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"crl\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask AddCertificateRevocationListAsync(CertificateStoreName store,\n            byte[] crl, CancellationToken ct = default);\n\n        /// <summary>\n        /// Remove certificate revocation list from store\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"crl\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask RemoveCertificateRevocationListAsync(CertificateStoreName store,\n            byte[] crl, CancellationToken ct = default);\n\n        /// <summary>\n        /// Clean the certificate store\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask CleanAsync(CertificateStoreName store,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/IOpcUaClientDiagnostics.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n\n    /// <summary>\n    /// Safely access client state for diagnostics\n    /// </summary>\n    public interface IOpcUaClientDiagnostics\n    {\n        /// <summary>\n        /// Bad publish requests tracked by this client\n        /// </summary>\n        int BadPublishRequestCount { get; }\n\n        /// <summary>\n        /// Good publish requests tracked by this client\n        /// </summary>\n        int GoodPublishRequestCount { get; }\n\n        /// <summary>\n        /// Outstanding requests\n        /// </summary>\n        int OutstandingRequestCount { get; }\n\n        /// <summary>\n        /// Number of subscriptions tracked by client\n        /// </summary>\n        int SubscriptionCount { get; }\n\n        /// <summary>\n        /// Connectivity state\n        /// </summary>\n        EndpointConnectivityState State { get; }\n\n        /// <summary>\n        /// Total connection attempts\n        /// </summary>\n        int ReconnectCount { get; }\n\n        /// <summary>\n        /// Reconnect triggered\n        /// </summary>\n        bool ReconnectTriggered { get; }\n\n        /// <summary>\n        /// Total successful connections\n        /// </summary>\n        int ConnectCount { get; }\n\n        /// <summary>\n        /// Current min publish request count\n        /// </summary>\n        int MinPublishRequestCount { get; }\n\n        /// <summary>\n        /// Successful keep alives since last reconnect\n        /// </summary>\n        int KeepAliveCounter { get; }\n\n        /// <summary>\n        /// Total keep alive requests since last reconnect\n        /// </summary>\n        int KeepAliveTotal { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/IOpcUaClientManager.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Connectivity state event\n    /// </summary>\n    public sealed class EndpointConnectivityStateEventArgs : EventArgs\n    {\n        /// <summary>\n        /// State\n        /// </summary>\n        public EndpointConnectivityState State { get; }\n\n        internal EndpointConnectivityStateEventArgs(EndpointConnectivityState state)\n        {\n            State = state;\n        }\n    }\n\n    /// <summary>\n    /// Client managers manages clients connected to servers and provides\n    /// access to session services.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IOpcUaClientManager<T>\n    {\n        /// <summary>\n        /// Connectivity state change events\n        /// </summary>\n        event EventHandler<EndpointConnectivityStateEventArgs> OnConnectionStateChange;\n\n        /// <summary>\n        /// Acquire a session which will be usable until disposed.\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ISessionHandle> AcquireSessionAsync(T connection,\n            RequestHeaderModel? header = null, CancellationToken ct = default);\n\n        /// <summary>\n        /// Execute the service on the provided session and\n        /// return the result.\n        /// </summary>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"func\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<TResult> ExecuteAsync<TResult>(T connection,\n            Func<ServiceCallContext, Task<TResult>> func,\n            RequestHeaderModel? header = null, CancellationToken ct = default);\n\n        /// <summary>\n        /// Execute the functions from stack on the provided\n        /// session and stream the results.\n        /// </summary>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"operation\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<TResult> ExecuteAsync<TResult>(T connection,\n            AsyncEnumerableBase<TResult> operation, RequestHeaderModel? header = null,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Create new subscription with the subscription configuration.\n        /// The callback will have been called with the new subscription\n        /// which then can be used to manage the subscription.\n        /// </summary>\n        /// <param name=\"connection\">The connection to use</param>\n        /// <param name=\"subscription\">The subscription template</param>\n        /// <param name=\"callback\">Callbacks from the subscription</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<ISubscription> CreateSubscriptionAsync(T connection,\n            SubscriptionModel subscription, ISubscriber callback,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/IOpcUaConfiguration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Opc.Ua;\n\n    /// <summary>\n    /// Provides application configuration\n    /// </summary>\n    public interface IOpcUaConfiguration\n    {\n        /// <summary>\n        /// Validation events\n        /// </summary>\n        event CertificateValidationEventHandler Validate;\n\n        /// <summary>\n        /// Gets the configuration for the clients\n        /// </summary>\n        ApplicationConfiguration Value { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/IOpcUaSession.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using Opc.Ua.Client.ComplexTypes;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Represents a session handle. You acquire a handle from the session\n    /// manager which will have the reference count incremented. Once the\n    /// handle is disposed the reference count is decremented. The connection\n    /// or disconnection states are handled through reference counting. The\n    /// session is disconnected if the reference count is 0, and connected\n    /// if it is higher than 0. The access to the underlying session is\n    /// guarded through a readerwriter lock, the writer lock guards the\n    /// session state in the handle and is aquired if the session is not\n    /// connected. That means all callers are parked on the reader lock while\n    /// the session is not connected and appropriate timeout cancellation must\n    /// be used.\n    /// </summary>\n    public interface IOpcUaSession\n    {\n        /// <summary>\n        /// Get services of the session\n        /// </summary>\n        ISessionServices Services { get; }\n\n        /// <summary>\n        /// Get the system context\n        /// </summary>\n        ISystemContext SystemContext { get; }\n\n        /// <summary>\n        /// Get the lru node cache\n        /// </summary>\n        ILruNodeCache LruNodeCache { get; }\n\n        /// <summary>\n        /// Get the message context\n        /// </summary>\n        IServiceMessageContext MessageContext { get; }\n\n        /// <summary>\n        /// Get the codec\n        /// </summary>\n        IVariantEncoder Codec { get; }\n\n        /// <summary>\n        /// Get complex type system for the session\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<ComplexTypeSystem?> GetComplexTypeSystemAsync(\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get operation limits\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<OperationLimitsModel> GetOperationLimitsAsync(\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get server diagnostics\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<SessionDiagnosticsModel> GetServerDiagnosticAsync(\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get history capabilities of the server\n        /// </summary>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<HistoryServerCapabilitiesModel> GetHistoryCapabilitiesAsync(\n            NamespaceFormat namespaceFormat, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get server capabilities\n        /// </summary>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<ServerCapabilitiesModel> GetServerCapabilitiesAsync(\n            NamespaceFormat namespaceFormat, CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/ISessionHandle.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using System;\n\n    /// <summary>\n    /// The session handle\n    /// </summary>\n    public interface ISessionHandle : IDisposable\n    {\n        /// <summary>\n        /// Session\n        /// </summary>\n        public IOpcUaSession Session { get; }\n\n        /// <summary>\n        /// Service call timeout\n        /// </summary>\n        TimeSpan ServiceCallTimeout { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/ISessionServices.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Opc.Ua;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Session services provided by the client and referenced from the\n    /// session handle.\n    /// </summary>\n    public interface ISessionServices\n    {\n        /// <summary>\n        /// Add nodes\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodesToAdd\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<AddNodesResponse> AddNodesAsync(RequestHeader requestHeader,\n            AddNodesItemCollection nodesToAdd, CancellationToken ct);\n\n        /// <summary>\n        /// Add references\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"referencesToAdd\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<AddReferencesResponse> AddReferencesAsync(RequestHeader requestHeader,\n            AddReferencesItemCollection referencesToAdd, CancellationToken ct);\n\n        /// <summary>\n        /// Browse first\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"requestedMaxReferencesPerNode\"></param>\n        /// <param name=\"nodesToBrowse\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<BrowseResponse> BrowseAsync(RequestHeader requestHeader,\n            ViewDescription? view, uint requestedMaxReferencesPerNode,\n            BrowseDescriptionCollection nodesToBrowse, CancellationToken ct);\n\n        /// <summary>\n        /// Browse next\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"releaseContinuationPoints\"></param>\n        /// <param name=\"continuationPoints\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<BrowseNextResponse> BrowseNextAsync(RequestHeader requestHeader,\n            bool releaseContinuationPoints, ByteStringCollection continuationPoints,\n            CancellationToken ct);\n\n        /// <summary>\n        /// Call\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"methodsToCall\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<CallResponse> CallAsync(RequestHeader requestHeader,\n            CallMethodRequestCollection methodsToCall, CancellationToken ct);\n\n        /// <summary>\n        /// Delete\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodesToDelete\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<DeleteNodesResponse> DeleteNodesAsync(RequestHeader requestHeader,\n            DeleteNodesItemCollection nodesToDelete, CancellationToken ct);\n\n        /// <summary>\n        /// Delete references\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"referencesToDelete\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<DeleteReferencesResponse> DeleteReferencesAsync(RequestHeader requestHeader,\n            DeleteReferencesItemCollection referencesToDelete, CancellationToken ct);\n\n        /// <summary>\n        /// Read history\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"historyReadDetails\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"releaseContinuationPoints\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<HistoryReadResponse> HistoryReadAsync(RequestHeader requestHeader,\n            ExtensionObject? historyReadDetails, TimestampsToReturn timestampsToReturn,\n            bool releaseContinuationPoints, HistoryReadValueIdCollection nodesToRead,\n            CancellationToken ct);\n\n        /// <summary>\n        /// History update\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"historyUpdateDetails\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<HistoryUpdateResponse> HistoryUpdateAsync(RequestHeader requestHeader,\n            ExtensionObjectCollection historyUpdateDetails, CancellationToken ct);\n\n        /// <summary>\n        /// Query first\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"nodeTypes\"></param>\n        /// <param name=\"filter\"></param>\n        /// <param name=\"maxDataSetsToReturn\"></param>\n        /// <param name=\"maxReferencesToReturn\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<QueryFirstResponse> QueryFirstAsync(RequestHeader requestHeader,\n            ViewDescription view, NodeTypeDescriptionCollection nodeTypes, ContentFilter filter,\n            uint maxDataSetsToReturn, uint maxReferencesToReturn, CancellationToken ct);\n\n        /// <summary>\n        /// Query next\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"releaseContinuationPoint\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<QueryNextResponse> QueryNextAsync(RequestHeader requestHeader,\n            bool releaseContinuationPoint, byte[] continuationPoint, CancellationToken ct);\n\n        /// <summary>\n        /// Read node\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"maxAge\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<ReadResponse> ReadAsync(RequestHeader requestHeader, double maxAge,\n            TimestampsToReturn timestampsToReturn, ReadValueIdCollection nodesToRead,\n            CancellationToken ct);\n\n        /// <summary>\n        /// Register nodes\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodesToRegister\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<RegisterNodesResponse> RegisterNodesAsync(RequestHeader requestHeader,\n            NodeIdCollection nodesToRegister, CancellationToken ct);\n\n        /// <summary>\n        /// Unregister nodes\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodesToUnregister\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<UnregisterNodesResponse> UnregisterNodesAsync(RequestHeader requestHeader,\n            NodeIdCollection nodesToUnregister, CancellationToken ct);\n\n        /// <summary>\n        /// Translate browse paths\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"browsePaths\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<TranslateBrowsePathsToNodeIdsResponse> TranslateBrowsePathsToNodeIdsAsync(\n            RequestHeader requestHeader, BrowsePathCollection browsePaths,\n            CancellationToken ct);\n\n        /// <summary>\n        /// Write to node\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"nodesToWrite\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<WriteResponse> WriteAsync(RequestHeader requestHeader,\n            WriteValueCollection nodesToWrite, CancellationToken ct);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/ISubscriber.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Lightweight subscription a client can create on\n    /// a connection providing monitored items.\n    /// </summary>\n    public interface ISubscriber\n    {\n        /// <summary>\n        /// The monitored items that shall be monitored in this\n        /// subscription. If the list is updated the registration\n        /// object must be updated and the list is read again.\n        /// </summary>\n        IEnumerable<BaseMonitoredItemModel> MonitoredItems { get; }\n\n        /// <summary>\n        /// The semantics of the desired monitored items\n        /// changed, therefore the subscriber should update\n        /// its information\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        Task OnMonitoredItemSemanticsChangedAsync(\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Called when a keep alive notification is received\n        /// in the subscription.\n        /// </summary>\n        /// <param name=\"notification\"></param>\n        void OnSubscriptionKeepAlive(\n            OpcUaSubscriptionNotification notification);\n\n        /// <summary>\n        /// Called when subscription data changes\n        /// </summary>\n        /// <param name=\"notification\"></param>\n        void OnSubscriptionDataChangeReceived(\n            OpcUaSubscriptionNotification notification);\n\n        /// <summary>\n        /// Called when sampled values were received\n        /// </summary>\n        /// <param name=\"notification\"></param>\n        void OnSubscriptionCyclicReadCompleted(\n            OpcUaSubscriptionNotification notification);\n\n        /// <summary>\n        /// Called when event changes\n        /// </summary>\n        /// <param name=\"notification\"></param>\n        void OnSubscriptionEventReceived(\n            OpcUaSubscriptionNotification notification);\n\n        /// <summary>\n        /// ChannelDiagnostics for data change notifications\n        /// </summary>\n        /// <param name=\"liveData\"></param>\n        /// <param name=\"valueChanges\"></param>\n        /// <param name=\"overflow\"></param>\n        /// <param name=\"heartbeats\"></param>\n        void OnSubscriptionDataDiagnosticsChange(bool liveData,\n            int valueChanges, int overflow, int heartbeats);\n\n        /// <summary>\n        /// ChannelDiagnostics for data change notifications\n        /// </summary>\n        /// <param name=\"valuesSampled\"></param>\n        /// <param name=\"overflow\"></param>\n        void OnSubscriptionCyclicReadDiagnosticsChange(\n            int valuesSampled, int overflow);\n\n        /// <summary>\n        /// Event diagnostics\n        /// </summary>\n        /// <param name=\"liveData\"></param>\n        /// <param name=\"events\"></param>\n        /// <param name=\"overflow\"></param>\n        /// <param name=\"modelChanges\"></param>\n        void OnSubscriptionEventDiagnosticsChange(bool liveData,\n            int events, int overflow, int modelChanges);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/ISubscription.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// This interface represents a registration of a\n    /// subscription on a connection to a server. The\n    /// registration must be disposed when done which will\n    /// release the reference on the client.\n    /// </summary>\n    public interface ISubscription : IAsyncDisposable\n    {\n        /// <summary>\n        /// State of the underlying client\n        /// </summary>\n        IOpcUaClientDiagnostics ClientDiagnostics { get; }\n\n        /// <summary>\n        /// State of the underlying client\n        /// </summary>\n        ISubscriptionDiagnostics Diagnostics { get; }\n\n        /// <summary>\n        /// Collect metadata\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <param name=\"fieldMask\"></param>\n        /// <param name=\"dataSetMetaData\"></param>\n        /// <param name=\"minorVersion\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        ValueTask<PublishedDataSetMetaDataModel> CollectMetaDataAsync(\n            ISubscriber owner, DataSetFieldContentFlags? fieldMask,\n            DataSetMetaDataModel dataSetMetaData, uint minorVersion,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Create a keep alive notification\n        /// </summary>\n        /// <returns></returns>\n        OpcUaSubscriptionNotification? CreateKeepAlive();\n\n        /// <summary>\n        /// Apply desired state of the subscription and its monitored items.\n        /// This will attempt a differential update of the subscription\n        /// and monitored items state. It is called periodically, when the\n        /// configuration is updated or when a session is reconnected and\n        /// the subscription needs to be recreated.\n        /// </summary>\n        void NotifyMonitoredItemsChanged();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/ISubscriptionDiagnostics.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    /// <summary>\n    /// Safely access subscription diagnostics\n    /// </summary>\n    public interface ISubscriptionDiagnostics\n    {\n        /// <summary>\n        /// Get good monitored items\n        /// </summary>\n        int GoodMonitoredItems { get; }\n\n        /// <summary>\n        /// Get bad monitored items\n        /// </summary>\n        int BadMonitoredItems { get; }\n\n        /// <summary>\n        /// Late monitored items\n        /// </summary>\n        int LateMonitoredItems { get; }\n\n        /// <summary>\n        /// Heartbeats enabled\n        /// </summary>\n        int HeartbeatsEnabled { get; }\n\n        /// <summary>\n        /// Conditions enabled\n        /// </summary>\n        int ConditionsEnabled { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/AttributeMap.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Encoders.Utils;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n\n    /// <summary>\n    /// Represents validity and default value map for attributes\n    /// </summary>\n    public static class AttributeMap\n    {\n        internal const int Object = 0;\n        internal const int Variable = 1;\n        internal const int Method = 2;\n        internal const int ObjectType = 3;\n        internal const int VariableType = 4;\n        internal const int ReferenceType = 5;\n        internal const int DataType = 6;\n        internal const int View = 7;\n\n        /// <summary>\n        /// Get built in type of attribute\n        /// </summary>\n        /// <param name=\"attributeId\"></param>\n        /// <returns></returns>\n        public static BuiltInType GetBuiltInType(uint attributeId)\n        {\n            switch (attributeId)\n            {\n                case Attributes.Value:\n                    return BuiltInType.Variant;\n                case Attributes.DisplayName:\n                case Attributes.Description:\n                    return BuiltInType.LocalizedText;\n                case Attributes.WriteMask:\n                case Attributes.UserWriteMask:\n                    return BuiltInType.UInt32;\n                case Attributes.NodeId:\n                    return BuiltInType.NodeId;\n                case Attributes.NodeClass:\n                    return BuiltInType.Int32;\n                case Attributes.BrowseName:\n                    return BuiltInType.QualifiedName;\n                case Attributes.IsAbstract:\n                case Attributes.Symmetric:\n                    return BuiltInType.Boolean;\n                case Attributes.InverseName:\n                    return BuiltInType.LocalizedText;\n                case Attributes.ContainsNoLoops:\n                    return BuiltInType.Boolean;\n                case Attributes.EventNotifier:\n                    return BuiltInType.Byte;\n                case Attributes.DataType:\n                    return BuiltInType.NodeId;\n                case Attributes.ValueRank:\n                    return BuiltInType.Int32;\n                case Attributes.AccessLevel:\n                case Attributes.UserAccessLevel:\n                    return BuiltInType.Byte;\n                case Attributes.MinimumSamplingInterval:\n                    return BuiltInType.Double;\n                case Attributes.Historizing:\n                case Attributes.Executable:\n                case Attributes.UserExecutable:\n                    return BuiltInType.Boolean;\n                case Attributes.ArrayDimensions:\n                    return BuiltInType.UInt32;\n                case Attributes.DataTypeDefinition:\n                    return BuiltInType.ExtensionObject;\n                case Attributes.AccessLevelEx:\n                    return BuiltInType.UInt32;\n                case Attributes.AccessRestrictions:\n                    return BuiltInType.UInt16;\n                case Attributes.RolePermissions:\n                case Attributes.UserRolePermissions:\n                    return BuiltInType.ExtensionObject;\n                default:\n                    System.Diagnostics.Debug.Fail(\"Unknown attribute\");\n                    return BuiltInType.Null;\n            }\n        }\n\n        /// <summary>\n        /// Get browse name of attribute - speedier than in stack which uses\n        /// reflection.\n        /// </summary>\n        /// <param name=\"attributeId\"></param>\n        /// <returns></returns>\n        public static string GetBrowseName(uint attributeId)\n        {\n            if (TypeMaps.Attributes.Value.TryGetBrowseName(attributeId,\n                out var value))\n            {\n                return value;\n            }\n            System.Diagnostics.Debug.Fail(\"Unknown attribute\");\n            return attributeId.ToString(CultureInfo.InvariantCulture);\n        }\n\n        /// <summary>\n        /// Get all valid attributes for the node class\n        /// </summary>\n        /// <param name=\"nodeClass\"></param>\n        /// <returns></returns>\n        public static IEnumerable<uint> GetNodeClassAttributes(NodeClass nodeClass)\n        {\n            for (uint i = 0; i < 32; i++)\n            {\n                if (kMap[NodeClassId(nodeClass), i] != null)\n                {\n                    yield return i;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Returns default value\n        /// </summary>\n        /// <param name=\"nodeClass\"></param>\n        /// <param name=\"attributeId\"></param>\n        /// <param name=\"returnNullIfOptional\"></param>\n        /// <returns></returns>\n        public static object? GetDefaultValue(NodeClass nodeClass,\n            uint attributeId, bool returnNullIfOptional)\n        {\n            if (attributeId > 32)\n            {\n                return null;\n            }\n            var entry = kMap[NodeClassId(nodeClass), attributeId];\n            if (entry != null)\n            {\n                if (!entry.Optional || !returnNullIfOptional)\n                {\n                    return entry.Value;\n                }\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Initialize attribute map\n        /// See Part 3 Table 20 – Overview of Attributes\n        /// </summary>\n        static AttributeMap()\n        {\n            kMap[Variable, Attributes.AccessLevel] =\n                new MapEntry((byte)1);\n            kMap[Variable, Attributes.ArrayDimensions] =\n                new MapEntry(Array.Empty<uint>(), true);\n            kMap[Variable, Attributes.BrowseName] = new\n                MapEntry(QualifiedName.Null);\n            kMap[Variable, Attributes.DataType] = new\n                MapEntry(NodeId.Null);\n            kMap[Variable, Attributes.Description] = new\n                MapEntry(LocalizedText.Null, true);\n            kMap[Variable, Attributes.DisplayName] = new\n                MapEntry(LocalizedText.Null);\n            kMap[Variable, Attributes.Historizing] = new\n                MapEntry(false);\n            kMap[Variable, Attributes.MinimumSamplingInterval] =\n                new MapEntry((double)-1, true);\n            kMap[Variable, Attributes.NodeClass] =\n                new MapEntry(NodeClass.Variable);\n            kMap[Variable, Attributes.NodeId] =\n                new MapEntry(NodeId.Null);\n            kMap[Variable, Attributes.UserAccessLevel] =\n                new MapEntry((byte)1, true);\n            kMap[Variable, Attributes.AccessLevelEx] =\n                new MapEntry((uint)0, true);\n            kMap[Variable, Attributes.AccessRestrictions] =\n                new MapEntry((ushort)0, true);\n            kMap[Variable, Attributes.RolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[Variable, Attributes.UserRolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[Variable, Attributes.UserWriteMask] =\n                new MapEntry((uint)0, true);\n            kMap[Variable, Attributes.Value] = new\n                MapEntry(Variant.Null);\n            kMap[Variable, Attributes.ValueRank] =\n                new MapEntry(ValueRanks.Scalar);\n            kMap[Variable, Attributes.WriteMask] =\n                new MapEntry((uint)0, true);\n\n            kMap[VariableType, Attributes.ArrayDimensions] =\n                new MapEntry(Array.Empty<uint>(), true);\n            kMap[VariableType, Attributes.BrowseName] =\n                new MapEntry(QualifiedName.Null);\n            kMap[VariableType, Attributes.DataType] =\n                new MapEntry(NodeId.Null);\n            kMap[VariableType, Attributes.Description] =\n                new MapEntry(LocalizedText.Null, true);\n            kMap[VariableType, Attributes.DisplayName] =\n                new MapEntry(LocalizedText.Null);\n            kMap[VariableType, Attributes.IsAbstract] =\n                new MapEntry(true);\n            kMap[VariableType, Attributes.NodeClass] =\n                new MapEntry(NodeClass.VariableType);\n            kMap[VariableType, Attributes.NodeId] =\n                new MapEntry(NodeId.Null);\n            kMap[VariableType, Attributes.AccessRestrictions] =\n                new MapEntry((ushort)0, true);\n            kMap[VariableType, Attributes.RolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[VariableType, Attributes.UserRolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[VariableType, Attributes.UserWriteMask] =\n                new MapEntry((uint)0, true);\n            kMap[VariableType, Attributes.Value] =\n                new MapEntry(Variant.Null, true);\n            kMap[VariableType, Attributes.ValueRank] =\n                new MapEntry(ValueRanks.Scalar);\n            kMap[VariableType, Attributes.WriteMask] =\n                new MapEntry((uint)0, true);\n\n            kMap[Object, Attributes.BrowseName] =\n                new MapEntry(QualifiedName.Null);\n            kMap[Object, Attributes.Description] =\n                new MapEntry(LocalizedText.Null, true);\n            kMap[Object, Attributes.DisplayName] =\n                new MapEntry(LocalizedText.Null);\n            kMap[Object, Attributes.EventNotifier] =\n                new MapEntry((byte)0);\n            kMap[Object, Attributes.NodeClass] =\n                new MapEntry(NodeClass.Object);\n            kMap[Object, Attributes.NodeId] =\n                new MapEntry(NodeId.Null);\n            kMap[Object, Attributes.AccessRestrictions] =\n                new MapEntry((ushort)0, true);\n            kMap[Object, Attributes.RolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[Object, Attributes.UserRolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[Object, Attributes.UserWriteMask] =\n                new MapEntry((uint)0, true);\n            kMap[Object, Attributes.WriteMask] =\n                new MapEntry((uint)0, true);\n\n            kMap[ObjectType, Attributes.BrowseName] =\n                new MapEntry(QualifiedName.Null);\n            kMap[ObjectType, Attributes.Description] =\n                new MapEntry(LocalizedText.Null, true);\n            kMap[ObjectType, Attributes.DisplayName] =\n                new MapEntry(LocalizedText.Null);\n            kMap[ObjectType, Attributes.IsAbstract] =\n                new MapEntry(true);\n            kMap[ObjectType, Attributes.NodeClass] =\n                new MapEntry(NodeClass.ObjectType);\n            kMap[ObjectType, Attributes.NodeId] =\n                new MapEntry(NodeId.Null);\n            kMap[ObjectType, Attributes.AccessRestrictions] =\n                new MapEntry((ushort)0, true);\n            kMap[ObjectType, Attributes.RolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[ObjectType, Attributes.UserRolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[ObjectType, Attributes.UserWriteMask] =\n                new MapEntry((uint)0, true);\n            kMap[ObjectType, Attributes.WriteMask] =\n                new MapEntry((uint)0, true);\n\n            kMap[ReferenceType, Attributes.BrowseName] =\n                new MapEntry(QualifiedName.Null);\n            kMap[ReferenceType, Attributes.Description] =\n                new MapEntry(LocalizedText.Null, true);\n            kMap[ReferenceType, Attributes.DisplayName] =\n                new MapEntry(LocalizedText.Null);\n            kMap[ReferenceType, Attributes.InverseName] =\n                new MapEntry(LocalizedText.Null, true);\n            kMap[ReferenceType, Attributes.IsAbstract] =\n                new MapEntry(true);\n            kMap[ReferenceType, Attributes.NodeClass] =\n                new MapEntry(NodeClass.ReferenceType);\n            kMap[ReferenceType, Attributes.NodeId] =\n                new MapEntry(NodeId.Null);\n            kMap[ReferenceType, Attributes.Symmetric] =\n                new MapEntry(true);\n            kMap[ReferenceType, Attributes.AccessRestrictions] =\n                new MapEntry((ushort)0, true);\n            kMap[ReferenceType, Attributes.RolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[ReferenceType, Attributes.UserRolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[ReferenceType, Attributes.UserWriteMask] =\n                new MapEntry((uint)0, true);\n            kMap[ReferenceType, Attributes.WriteMask] =\n                new MapEntry((uint)0, true);\n\n            kMap[DataType, Attributes.BrowseName] =\n                new MapEntry(QualifiedName.Null);\n            kMap[DataType, Attributes.DataTypeDefinition] =\n                new MapEntry(new ExtensionObject(), true);\n            kMap[DataType, Attributes.Description] =\n                new MapEntry(LocalizedText.Null, true);\n            kMap[DataType, Attributes.DisplayName] =\n                new MapEntry(LocalizedText.Null);\n            kMap[DataType, Attributes.IsAbstract] =\n                new MapEntry(true);\n            kMap[DataType, Attributes.NodeClass] =\n                new MapEntry(NodeClass.DataType);\n            kMap[DataType, Attributes.NodeId] =\n                new MapEntry(NodeId.Null);\n            kMap[DataType, Attributes.AccessRestrictions] =\n                new MapEntry((ushort)0, true);\n            kMap[DataType, Attributes.RolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[DataType, Attributes.UserRolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[DataType, Attributes.UserWriteMask] =\n                new MapEntry((uint)0, true);\n            kMap[DataType, Attributes.WriteMask] =\n                new MapEntry((uint)0, true);\n\n            kMap[Method, Attributes.BrowseName] =\n                new MapEntry(QualifiedName.Null);\n            kMap[Method, Attributes.Description] =\n                new MapEntry(LocalizedText.Null, true);\n            kMap[Method, Attributes.DisplayName] =\n                new MapEntry(LocalizedText.Null);\n            kMap[Method, Attributes.Executable] =\n                new MapEntry(false);\n            kMap[Method, Attributes.NodeClass] =\n                new MapEntry(NodeClass.Method);\n            kMap[Method, Attributes.NodeId] =\n                new MapEntry(NodeId.Null);\n            kMap[Method, Attributes.UserExecutable] =\n                new MapEntry(false);\n            kMap[Method, Attributes.AccessRestrictions] =\n                new MapEntry((ushort)0, true);\n            kMap[Method, Attributes.RolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[Method, Attributes.UserRolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[Method, Attributes.UserWriteMask] =\n                new MapEntry((uint)0, true);\n            kMap[Method, Attributes.WriteMask] =\n                new MapEntry((uint)0, true);\n\n            kMap[View, Attributes.BrowseName] =\n                new MapEntry(QualifiedName.Null);\n            kMap[View, Attributes.ContainsNoLoops] =\n                new MapEntry(true);\n            kMap[View, Attributes.Description] =\n                new MapEntry(LocalizedText.Null, true);\n            kMap[View, Attributes.DisplayName] =\n                new MapEntry(LocalizedText.Null);\n            kMap[View, Attributes.EventNotifier] =\n                new MapEntry((byte)0);\n            kMap[View, Attributes.NodeClass] =\n                new MapEntry(NodeClass.View);\n            kMap[View, Attributes.NodeId] =\n                new MapEntry(NodeId.Null);\n            kMap[View, Attributes.AccessRestrictions] =\n                new MapEntry((ushort)0, true);\n            kMap[View, Attributes.RolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[View, Attributes.UserRolePermissions] =\n                new MapEntry(Array.Empty<ExtensionObject>(), true);\n            kMap[View, Attributes.UserWriteMask] =\n                new MapEntry((uint)0, true);\n            kMap[View, Attributes.WriteMask] =\n                new MapEntry((uint)0, true);\n        }\n\n        /// <summary>\n        /// Convert nodeclass to index\n        /// </summary>\n        /// <param name=\"nodeClass\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private static int NodeClassId(NodeClass nodeClass)\n        {\n            switch (nodeClass)\n            {\n                case NodeClass.Object:\n                    return Object;\n                case NodeClass.Variable:\n                    return Variable;\n                case NodeClass.Method:\n                    return Method;\n                case NodeClass.ObjectType:\n                    return ObjectType;\n                case NodeClass.VariableType:\n                    return VariableType;\n                case NodeClass.ReferenceType:\n                    return ReferenceType;\n                case NodeClass.DataType:\n                    return DataType;\n                case NodeClass.View:\n                    return View;\n            }\n            throw new ServiceResultException(StatusCodes.BadNodeClassInvalid);\n        }\n\n        private class MapEntry\n        {\n            /// <summary>\n            /// Attribute map entry\n            /// </summary>\n            /// <param name=\"value\"></param>\n            /// <param name=\"optional\"></param>\n            public MapEntry(object value, bool optional = false)\n            {\n                Value = value;\n                Optional = optional;\n            }\n\n            /// <summary>\n            /// Default value\n            /// </summary>\n            public object Value { get; }\n\n            /// <summary>\n            /// Whether the attribute is optional\n            /// </summary>\n            public bool Optional { get; }\n        }\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n        private static readonly MapEntry[,] kMap = new MapEntry[8, 32];\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/BaseMonitoredItemModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Base monitored item\n    /// </summary>\n    public abstract record class BaseMonitoredItemModel\n    {\n        /// <summary>\n        /// Identifier for this monitored item\n        /// Prio 1: Id = DataSetFieldId - if already configured\n        /// Prio 2: Id = DataSetFieldName - if already configured\n        /// Prio 3: NodeId as configured\n        /// </summary>\n        public string Id\n        {\n            get =>\n                !string.IsNullOrEmpty(DataSetFieldId) ? DataSetFieldId :\n                !string.IsNullOrEmpty(DataSetFieldName) ? DataSetFieldName :\n                StartNodeId;\n        }\n\n        /// <summary>\n        /// Data set field id\n        /// </summary>\n        public string? DataSetFieldId { get; init; }\n\n        /// <summary>\n        /// Display name\n        /// Prio 1: DisplayName = DataSetFieldName - if already configured\n        /// Prio 2: DisplayName = DataSetFieldId  - if already configured\n        /// Prio 3: NodeId as configured\n        /// </summary>\n        public string DisplayName\n        {\n            get =>\n                !string.IsNullOrEmpty(DataSetFieldName) ? DataSetFieldName :\n                !string.IsNullOrEmpty(DataSetFieldId) ? DataSetFieldId :\n                StartNodeId;\n        }\n\n        /// <summary>\n        /// Data set field name\n        /// </summary>\n        public string? DataSetFieldName { get; set; }\n\n        /// <summary>\n        /// Fetch dataset name\n        /// </summary>\n        public bool? FetchDataSetFieldName { get; init; }\n\n        /// <summary>\n        /// Node id\n        /// </summary>\n        public required string StartNodeId { get; init; }\n\n        /// <summary>\n        /// Path from node\n        /// </summary>\n        public IReadOnlyList<string>? RelativePath { get; init; }\n\n        /// <summary>\n        /// Attribute\n        /// </summary>\n        public NodeAttribute? AttributeId { get; init; }\n\n        /// <summary>\n        /// Queue size\n        /// </summary>\n        public uint? QueueSize { get; init; }\n\n        /// <summary>\n        /// Auto calculate queue size using publishing interval\n        /// </summary>\n        public bool? AutoSetQueueSize { get; init; }\n\n        /// <summary>\n        /// Discard new values if queue is full\n        /// </summary>\n        public bool? DiscardNew { get; init; }\n\n        /// <summary>\n        /// Monitoring mode\n        /// </summary>\n        public MonitoringMode? MonitoringMode { get; init; }\n\n        /// <summary>\n        /// Namespace format to use\n        /// </summary>\n        public NamespaceFormat NamespaceFormat { get; init; }\n\n        /// <summary>\n        /// Triggered items\n        /// </summary>\n        public IList<BaseMonitoredItemModel>? TriggeredItems { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/ConnectionIdentifier.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Lookup key for connections\n    /// </summary>\n    internal sealed class ConnectionIdentifier\n    {\n        /// <summary>\n        /// Create new key\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        public ConnectionIdentifier(ConnectionModel connection)\n        {\n            Connection = connection?.Clone() ??\n                throw new ArgumentNullException(nameof(connection));\n            _hash = Connection.CreateConsistentHash();\n        }\n\n        /// <summary>\n        /// Create new key\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        public ConnectionIdentifier(EndpointModel endpoint)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            Connection = new ConnectionModel\n            {\n                Endpoint = endpoint.Clone()\n            };\n            _hash = Connection.CreateConsistentHash();\n        }\n\n        /// <summary>\n        /// The endpoint wrapped as key\n        /// </summary>\n        public ConnectionModel Connection { get; }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (obj is string s)\n            {\n                return s == ToString();\n            }\n            if (obj is not ConnectionIdentifier key)\n            {\n                return false;\n            }\n            if (!Connection.IsSameAs(key.Connection))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public static bool operator ==(ConnectionIdentifier r1,\n            ConnectionIdentifier r2) =>\n            EqualityComparer<ConnectionIdentifier>.Default.Equals(r1, r2);\n        /// <inheritdoc/>\n        public static bool operator !=(ConnectionIdentifier r1,\n            ConnectionIdentifier r2) =>\n            !(r1 == r2);\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return _hash;\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            return Connection.CreateConnectionId() ?? \"Bad connection\";\n        }\n\n        private readonly int _hash;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/DataMonitoredItemModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n\n    /// <summary>\n    /// Data monitored item\n    /// </summary>\n    public sealed record class DataMonitoredItemModel : BaseMonitoredItemModel\n    {\n        /// <summary>\n        /// Sampling interval\n        /// </summary>\n        public TimeSpan? SamplingInterval { get; init; }\n\n        /// <summary>\n        /// Range of value to report\n        /// </summary>\n        public string? IndexRange { get; init; }\n\n        /// <summary>\n        /// Register read for this item. Registerd read is\n        /// a hint, it can fail.\n        /// </summary>\n        public bool? RegisterRead { get; init; }\n\n        /// <summary>\n        /// Field id in class\n        /// </summary>\n        public Guid DataSetClassFieldId { get; init; }\n\n        /// <summary>\n        /// Data change filter\n        /// </summary>\n        public DataChangeFilterModel? DataChangeFilter { get; init; }\n\n        /// <summary>\n        /// Aggregate filter\n        /// </summary>\n        public AggregateFilterModel? AggregateFilter { get; init; }\n\n        /// <summary>\n        /// heartbeat interval not present if zero\n        /// </summary>\n        public TimeSpan? HeartbeatInterval { get; init; }\n\n        /// <summary>\n        /// heartbeat behavior\n        /// </summary>\n        public HeartbeatBehavior? HeartbeatBehavior { get; init; }\n\n        /// <summary>\n        /// Sample using cyclic reads\n        /// </summary>\n        public bool? SamplingUsingCyclicRead { get; set; }\n\n        /// <summary>\n        /// Max cache age to use for cyclic reads.\n        /// Default is 0.\n        /// </summary>\n        public TimeSpan? CyclicReadMaxAge { get; init; }\n\n        /// <summary>\n        /// Skip first value\n        /// </summary>\n        public bool? SkipFirst { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/DiscoveredEndpointModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Endpoint information returned from discover\n    /// </summary>\n    public sealed record class DiscoveredEndpointModel\n    {\n        /// <summary>\n        /// Endpoint\n        /// </summary>\n        public required EndpointDescription Description { get; init; }\n\n        /// <summary>\n        /// Endpoint url that can be accessed\n        /// </summary>\n        public required string AccessibleEndpointUrl { get; init; }\n\n        /// <summary>\n        /// Capabilities of endpoint (server)\n        /// </summary>\n        public required HashSet<string> Capabilities { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/EndpointIdentifier.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n\n    /// <summary>\n    /// Lookup key for endpoint clients\n    /// </summary>\n    public sealed class EndpointIdentifier\n    {\n        /// <summary>\n        /// Create new key\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        public EndpointIdentifier(EndpointModel endpoint)\n        {\n            Endpoint = endpoint?.Clone() ??\n                throw new ArgumentNullException(nameof(endpoint));\n            _hash = Endpoint.CreateConsistentHash();\n        }\n\n        /// <summary>\n        /// The endpoint wrapped as key\n        /// </summary>\n        public EndpointModel Endpoint { get; }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (obj is string s)\n            {\n                return s == ToString();\n            }\n            if (obj is not EndpointIdentifier key)\n            {\n                return false;\n            }\n            if (!Endpoint.IsSameAs(key.Endpoint))\n            {\n                return false;\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return _hash;\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            return (Endpoint?.Url ?? \"\" + _hash).ToSha1Hash();\n        }\n\n        private readonly int _hash;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/EventMonitoredItemModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n\n    /// <summary>\n    /// Event monitored item\n    /// </summary>\n    public sealed record class EventMonitoredItemModel : BaseMonitoredItemModel\n    {\n        /// <summary>\n        /// Event filter\n        /// </summary>\n        public required EventFilterModel EventFilter { get; init; }\n\n        /// <summary>\n        /// Condition handling settings\n        /// </summary>\n        public ConditionHandlingOptionsModel? ConditionHandling { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/ImmutableRelativePath.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// Immutable relative path for lookups\n    /// </summary>\n    internal readonly struct ImmutableRelativePath : IEquatable<ImmutableRelativePath>\n    {\n        /// <summary>\n        /// Path\n        /// </summary>\n        public IReadOnlyList<string> Path { get; }\n\n        /// <summary>\n        /// Create browse path\n        /// </summary>\n        /// <param name=\"path\"></param>\n        public ImmutableRelativePath(IReadOnlyList<string> path)\n        {\n            var result = new HashCode();\n            foreach (var element in path)\n            {\n                result.Add(element);\n            }\n            _hashCode = result.ToHashCode();\n            Path = path;\n        }\n\n        /// <summary>\n        /// Create path from parent path and path entry\n        /// </summary>\n        /// <param name=\"parentPath\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <returns></returns>\n        public static ImmutableRelativePath Create(IReadOnlyList<string>? parentPath,\n            string browseName)\n        {\n            var browsePath = parentPath != null ?\n                new List<string>(parentPath) : [];\n            browsePath.Add(browseName);\n            return new ImmutableRelativePath(browsePath);\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (obj is ImmutableRelativePath path)\n            {\n                return Equals(path);\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public bool Equals(ImmutableRelativePath other)\n        {\n            if (other.Path.Count != Path.Count)\n            {\n                return false;\n            }\n            for (var i = 0; i < Path.Count; i++)\n            {\n                if (Path[i] != other.Path[i])\n                {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return _hashCode;\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return Path.Aggregate((a, b) => a + b);\n        }\n\n        private readonly int _hashCode;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/MonitoredAddressSpaceModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using System;\n\n    /// <summary>\n    /// Monitor the address space\n    /// </summary>\n    public sealed record class MonitoredAddressSpaceModel : BaseMonitoredItemModel\n    {\n        /// <summary>\n        /// Rebrowse period to use when monitoring\n        /// </summary>\n        public TimeSpan? RebrowsePeriod { get; set; }\n\n        /// <summary>\n        /// Root node to start browsing (optional)\n        /// </summary>\n        public string? RootNodeId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/MonitoredItemNotificationModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Opc.Ua;\n\n    /// <summary>\n    /// Monitored item notification\n    /// </summary>\n    public sealed record class MonitoredItemNotificationModel\n    {\n        /// <summary>\n        /// Identifier of the monitored item that originated the message\n        /// </summary>\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Identifier to relate notifications to a value\n        /// </summary>\n        public uint MessageId => SequenceNumber ?? (uint)GetHashCode();\n\n        /// <summary>\n        /// Data set field identifier as configured\n        /// </summary>\n        public string? DataSetFieldName { get; set; }\n\n        /// <summary>\n        /// Display name of the data set this item is part of.\n        /// </summary>\n        public string? DataSetName { get; internal set; }\n\n        /// <summary>\n        /// Node Id in string format as configured\n        /// </summary>\n        public string? NodeId { get; internal set; }\n\n        /// <summary>\n        /// Browse path from root folder\n        /// </summary>\n        public RelativePath? PathFromRoot { get; internal set; }\n\n        /// <summary>\n        /// Sequence number\n        /// </summary>\n        public uint? SequenceNumber { get; set; }\n\n        /// <summary>\n        /// Overflow indicator counts the number of messages likely missed\n        /// </summary>\n        public int Overflow { get; set; }\n\n        /// <summary>\n        /// Value of variable change notification\n        /// </summary>\n        public DataValue? Value { get; set; }\n\n        /// <summary>\n        /// Source flags\n        /// </summary>\n        public MonitoredItemSourceFlags Flags { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/MonitoredItemSourceFlags.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using System;\n\n    /// <summary>\n    /// Source flags\n    /// </summary>\n    [Flags]\n    public enum MonitoredItemSourceFlags\n    {\n        /// <summary>\n        /// Heartbeat is the source of the notification\n        /// </summary>\n        Heartbeat = 0x1,\n\n        /// <summary>\n        /// Condition is the source of the notification.\n        /// </summary>\n        Condition = 0x4,\n\n        /// <summary>\n        /// ModelChanges are the source of the notification.\n        /// </summary>\n        ModelChanges = 0x8,\n\n        /// <summary>\n        /// An error is the source of the notification\n        /// </summary>\n        Error = 0x10\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/SampledDataValueModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Opc.Ua;\n\n    /// <summary>\n    /// Represents a sampled data value\n    /// </summary>\n    public class SampledDataValueModel : IEncodeable\n    {\n        /// <summary>\n        /// Value\n        /// </summary>\n        public DataValue Value { get; }\n\n        /// <summary>\n        /// Client handle\n        /// </summary>\n        public uint ClientHandle { get; }\n\n        /// <summary>\n        /// Overflow\n        /// </summary>\n        public int Overflow { get; }\n\n        /// <summary>\n        /// Create change notification\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"overflow\"></param>\n        public SampledDataValueModel(DataValue value,\n            uint clientHandle, int overflow)\n        {\n            Value = value;\n            ClientHandle = clientHandle;\n            Overflow = overflow;\n        }\n\n        /// <inheritdoc/>\n        public ExpandedNodeId TypeId => ExpandedNodeId.Null;\n        /// <inheritdoc/>\n        public ExpandedNodeId BinaryEncodingId => ExpandedNodeId.Null;\n        /// <inheritdoc/>\n        public ExpandedNodeId XmlEncodingId => ExpandedNodeId.Null;\n\n        /// <inheritdoc/>\n        public object Clone()\n        {\n            return new SampledDataValueModel(Value, ClientHandle, Overflow);\n        }\n\n        /// <inheritdoc/>\n        public void Decode(IDecoder decoder)\n        {\n            throw new System.NotSupportedException();\n        }\n\n        /// <inheritdoc/>\n        public void Encode(IEncoder encoder)\n        {\n            throw new System.NotSupportedException();\n        }\n\n        /// <inheritdoc/>\n        public bool IsEqual(IEncodeable encodeable)\n        {\n            if (encodeable is not SampledDataValueModel notification)\n            {\n                return false;\n            }\n            return\n                Utils.IsEqual(Value, notification.Value) &&\n                ClientHandle == notification.ClientHandle &&\n                Overflow == notification.Overflow;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/ServiceCallContext.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using System;\n    using System.Diagnostics;\n    using System.Threading;\n\n    /// <summary>\n    /// Context for service call invocations\n    /// </summary>\n    public sealed record class ServiceCallContext : ISessionHandle\n    {\n        /// <inheritdoc/>\n        public IOpcUaSession Session { get; }\n\n        /// <inheritdoc/>\n        public TimeSpan ServiceCallTimeout { get; }\n\n        /// <summary>\n        /// A continuation token to track after\n        /// returning from the call.\n        /// </summary>\n        public string? TrackedToken { get; set; }\n\n        /// <summary>\n        /// A token to release from tracking after\n        /// returning from the call.\n        /// </summary>\n        public string? UntrackedToken { get; set; }\n\n        /// <summary>\n        /// Cancel any calls on this token\n        /// </summary>\n        public CancellationToken Ct { get; }\n\n        /// <summary>\n        /// Create context\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"serviceCallTimeout\"></param>\n        /// <param name=\"ct\"></param>\n        internal ServiceCallContext(IOpcUaSession session,\n            TimeSpan serviceCallTimeout, CancellationToken ct = default)\n        {\n            Session = session;\n            ServiceCallTimeout = serviceCallTimeout;\n            Ct = ct;\n        }\n\n        /// <summary>\n        /// Create context\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"serviceCallTimeout\"></param>\n        /// <param name=\"client\"></param>\n        /// <param name=\"sessionLock\"></param>\n        /// <param name=\"ct\"></param>\n        internal ServiceCallContext(IOpcUaSession session,\n            TimeSpan serviceCallTimeout, OpcUaClient client,\n            IDisposable sessionLock, CancellationToken ct = default)\n            : this(session, serviceCallTimeout, ct)\n        {\n            client.AddRef();\n\n            _client = client;\n            _sessionLock = sessionLock;\n            // TODO: we could timeout and dispose to catch leaks\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            if (_client != null)\n            {\n                Debug.Assert(_sessionLock != null);\n                _sessionLock.Dispose();\n                _client.Release();\n                _client = null;\n            }\n        }\n\n        private OpcUaClient? _client;\n        private readonly IDisposable? _sessionLock;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/ServiceResponse.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n\n    /// <summary>\n    /// Helper to manage request and responses\n    /// </summary>\n    /// <typeparam name=\"TRequest\"></typeparam>\n    /// <typeparam name=\"TResult\"></typeparam>\n    internal class ServiceResponse<TRequest, TResult> :\n        IReadOnlyList<ServiceResponse<TRequest, TResult>.Operation>\n    {\n        /// <summary>\n        /// Error info\n        /// </summary>\n        public ServiceResultModel? ErrorInfo\n        {\n            get\n            {\n                if (StatusCode == StatusCodes.Good)\n                {\n                    return null;\n                }\n                return ResultInfo;\n            }\n        }\n\n        /// <summary>\n        /// Result info\n        /// </summary>\n        public ServiceResultModel ResultInfo\n        {\n            get\n            {\n                var diagnostics = _response.ResponseHeader.ServiceDiagnostics;\n                var stringTable = _response.ResponseHeader.StringTable;\n                return StatusCode.CreateResultModel(diagnostics, stringTable);\n            }\n        }\n\n        /// <summary>\n        /// Result info\n        /// </summary>\n        public StatusCode StatusCode => _response.ResponseHeader.ServiceResult;\n\n        /// <inheritdoc/>\n        public int Count => _operations.Length;\n\n        /// <inheritdoc/>\n        public Operation this[int index] => _operations[index];\n\n        /// <summary>\n        /// Validates responses against requests\n        /// </summary>\n        /// <param name=\"response\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"requested\"></param>\n        internal ServiceResponse(IServiceResponse response,\n            IEnumerable<TResult>? results, Func<TResult, StatusCode> statusCode,\n            DiagnosticInfoCollection? diagnostics = null,\n            IEnumerable<TRequest>? requested = null)\n        {\n            _response = response;\n            Debug.Assert(_response.ResponseHeader != null,\n                \"Response header should have been checked by ValidateResponse.\");\n            _statusCode = statusCode;\n            if (results == null)\n            {\n                if (!StatusCode.IsBad(response.ResponseHeader.ServiceResult))\n                {\n                    response.ResponseHeader.ServiceResult = StatusCodes.BadUnexpectedError;\n                    response.ResponseHeader.ServiceDiagnostics = new DiagnosticInfo\n                    {\n                        AdditionalInfo = \"Response was good, but results were missing.\"\n                    };\n                }\n                _results = [];\n            }\n            else\n            {\n                _results = results.ToArray();\n            }\n            if (requested == null)\n            {\n                _requests = _results.Length == 0 ?\n                    [] :\n                    new TRequest[_results.Length];\n            }\n            else\n            {\n                _requests = requested.ToArray();\n            }\n            if (_results.Length != _requests.Length)\n            {\n                if (!StatusCode.IsBad(response.ResponseHeader.ServiceResult))\n                {\n                    response.ResponseHeader.ServiceResult = StatusCodes.BadUnexpectedError;\n                    response.ResponseHeader.ServiceDiagnostics = new DiagnosticInfo\n                    {\n                        AdditionalInfo = $\"The server returned {_results.Length} results\" +\n                            $\" but {_requests.Length} elements were expected.\"\n                    };\n                }\n                if (_results.Length > _requests.Length)\n                {\n                    // Limit the results\n                    _results = _results[0.._requests.Length];\n                }\n                else\n                {\n                    _results = [];\n                }\n            }\n            if (diagnostics == null || diagnostics.Count == 0)\n            {\n                _diagnostics = _results.Length == 0 ?\n                    [] :\n                    new DiagnosticInfo[_results.Length];\n            }\n            else\n            {\n                _diagnostics = [.. diagnostics];\n            }\n            if (_diagnostics.Length != _results.Length)\n            {\n                if (!StatusCode.IsBad(response.ResponseHeader.ServiceResult))\n                {\n                    response.ResponseHeader.ServiceResult = StatusCodes.BadUnexpectedError;\n                    response.ResponseHeader.ServiceDiagnostics = new DiagnosticInfo\n                    {\n                        AdditionalInfo = $\"The server returned {_results.Length} diagnostic\" +\n                            $\" infos but {_requests.Length} were expected.\"\n                    };\n                }\n                _diagnostics = new DiagnosticInfo[_results.Length];\n            }\n            Activity.Current?.AddTag(\"Response\", ErrorInfo);\n            if (_results.Length > 0)\n            {\n                _operations = Enumerable.Range(0, _results.Length)\n                    .Select(i => new Operation(this, i))\n                    .ToArray();\n            }\n            else\n            {\n                _operations = [];\n            }\n        }\n\n        /// <summary>\n        /// Throw if error response\n        /// </summary>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        public void ThrowIfError()\n        {\n            if (StatusCode.IsBad(StatusCode))\n            {\n                throw new ServiceResultException(new ServiceResult(\n                    StatusCode,\n                    _response.ResponseHeader.ServiceDiagnostics,\n                    _response.ResponseHeader.StringTable));\n            }\n        }\n\n        /// <inheritdoc/>\n        public IEnumerator<Operation> GetEnumerator()\n        {\n            return ((IEnumerable<Operation>)_operations).GetEnumerator();\n        }\n\n        /// <inheritdoc/>\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return _operations.GetEnumerator();\n        }\n\n        /// <summary>\n        /// Service operation\n        /// </summary>\n        internal class Operation\n        {\n            /// <summary>\n            /// Index\n            /// </summary>\n            public int Index { get; }\n\n            /// <summary>\n            /// Get result\n            /// </summary>\n            public DiagnosticInfo DiagnosticInfo => _outer._diagnostics[Index];\n\n            /// <summary>\n            /// Get result\n            /// </summary>\n            public TRequest Request => _outer._requests[Index];\n\n            /// <summary>\n            /// Get result\n            /// </summary>\n            public TResult Result => _outer._results[Index];\n\n            /// <summary>\n            /// Get status code\n            /// </summary>\n            public StatusCode StatusCode\n            {\n                get\n                {\n                    try\n                    {\n                        return _outer._statusCode(Result);\n                    }\n                    catch\n                    {\n                        return StatusCodes.BadUnknownResponse;\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Error info\n            /// </summary>\n            public ServiceResultModel? ErrorInfo\n            {\n                get\n                {\n                    if (StatusCode == StatusCodes.Good)\n                    {\n                        return null;\n                    }\n                    return ResultInfo;\n                }\n            }\n\n            /// <summary>\n            /// Result info\n            /// </summary>\n            public ServiceResultModel ResultInfo\n            {\n                get\n                {\n                    var stringTable = _outer._response.ResponseHeader.StringTable;\n                    return StatusCode.CreateResultModel(DiagnosticInfo, stringTable);\n                }\n            }\n\n            internal Operation(ServiceResponse<TRequest, TResult> outer, int i)\n            {\n                _outer = outer;\n                Index = i;\n\n                Activity.Current?.AddTag(\"Result_\" + i, ErrorInfo);\n            }\n\n            private readonly ServiceResponse<TRequest, TResult> _outer;\n        }\n\n        private readonly TRequest[] _requests;\n        private readonly TResult[] _results;\n        private readonly DiagnosticInfo[] _diagnostics;\n        private readonly Operation[] _operations;\n        private readonly IServiceResponse _response;\n        private readonly Func<TResult, StatusCode> _statusCode;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Models/SubscriptionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n\n    /// <summary>\n    /// Configuration of a subscription\n    /// </summary>\n    public sealed record class SubscriptionModel\n    {\n        /// <summary>\n        /// Publishing interval\n        /// </summary>\n        public TimeSpan? PublishingInterval { get; init; }\n\n        /// <summary>\n        /// Life time\n        /// </summary>\n        public uint? LifetimeCount { get; init; }\n\n        /// <summary>\n        /// Max keep alive count\n        /// </summary>\n        public uint? KeepAliveCount { get; init; }\n\n        /// <summary>\n        /// Priority\n        /// </summary>\n        public byte? Priority { get; init; }\n\n        /// <summary>\n        /// Max notification per publish\n        /// </summary>\n        public uint? MaxNotificationsPerPublish { get; init; }\n\n        /// <summary>\n        /// Use deferred acknoledgements\n        /// </summary>\n        public bool? UseDeferredAcknoledgements { get; init; }\n\n        /// <summary>\n        /// Use the sequential publishing feature in the stack.\n        /// </summary>\n        public bool? EnableSequentialPublishing { get; init; }\n\n        /// <summary>\n        /// Will set the subscription to have publishing\n        /// enabled and every monitored item created to be\n        /// in desired monitoring mode.\n        /// </summary>\n        public bool? EnableImmediatePublishing { get; init; }\n\n        /// <summary>\n        /// Republish after transfer\n        /// </summary>\n        public bool? RepublishAfterTransfer { get; init; }\n\n        /// <summary>\n        /// Subscription watchdog behavior\n        /// </summary>\n        public SubscriptionWatchdogBehavior? WatchdogBehavior { get; init; }\n\n        /// <summary>\n        /// Monitored item watchdog timeout\n        /// </summary>\n        public TimeSpan? MonitoredItemWatchdogTimeout { get; init; }\n\n        /// <summary>\n        /// Whether to run the watchdog action when any item\n        /// is late or all items are late.\n        /// </summary>\n        public MonitoredItemWatchdogCondition? WatchdogCondition { get; init; }\n\n        /// <summary>\n        /// Retrieve paths from root for all monitored items\n        /// in the subscription.\n        /// </summary>\n        public bool? ResolveBrowsePathFromRoot { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/CertificateInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    /// <summary>\n    /// Certificate information\n    /// </summary>\n    public class CertificateInfo : CertificateStore\n    {\n        /// <summary>\n        /// Subject name\n        /// </summary>\n        public string? SubjectName { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/CertificateStore.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    /// <summary>\n    /// Certificate store\n    /// </summary>\n    public class CertificateStore\n    {\n        /// <summary>\n        /// Store type\n        /// </summary>\n        public string? StoreType { get; set; }\n\n        /// <summary>\n        /// Store path\n        /// </summary>\n        public string? StorePath { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/FlatCertificateStore.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack;\n\nusing Opc.Ua;\nusing Opc.Ua.Security.Certificates;\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Security.Cryptography.X509Certificates;\nusing System.Threading;\nusing System.Threading.Tasks;\n\n/// <summary>\n/// A flat certificate store option to use with a secret/volume mount\n/// </summary>\npublic sealed class FlatCertificateStore : ICertificateStoreType\n{\n    /// <summary>\n    /// Identifier for flat directory certificate store.\n    /// </summary>\n    public const string StoreTypeName = \"FlatDirectory\";\n\n    /// <summary>\n    /// Prefix for flat directory certificate store paths.\n    /// </summary>\n    public const string StoreTypePrefix = $\"{StoreTypeName}:\";\n\n    /// <inheritdoc/>\n    public ICertificateStore CreateStore() => new FlatDirectoryCertificateStore();\n\n    /// <inheritdoc/>\n    public bool SupportsStorePath(string storePath) => !string.IsNullOrEmpty(storePath) &&\n            storePath.StartsWith(StoreTypePrefix,\n                StringComparison.InvariantCultureIgnoreCase);\n\n    /// <summary>\n    /// Flat directory certificate store that does not have internal\n    /// hierarchy with certs/crl/private subdirectories.\n    /// </summary>\n    internal sealed class FlatDirectoryCertificateStore : ICertificateStore\n    {\n        private const string CrtExtension = \".crt\";\n        private const string KeyExtension = \".key\";\n\n        private readonly DirectoryCertificateStore _innerStore;\n\n        /// <summary>\n        /// Create certificate store\n        /// </summary>\n        public FlatDirectoryCertificateStore()\n        {\n            _innerStore = new DirectoryCertificateStore(noSubDirs: true);\n        }\n\n        /// <inheritdoc/>\n        public string StoreType => StoreTypeName;\n\n        /// <inheritdoc/>\n        public string StorePath => _innerStore.StorePath;\n\n        /// <inheritdoc/>\n        public bool SupportsLoadPrivateKey => _innerStore.SupportsLoadPrivateKey;\n\n        /// <inheritdoc/>\n        public bool SupportsCRLs => _innerStore.SupportsCRLs;\n\n        public bool NoPrivateKeys => _innerStore.NoPrivateKeys;\n\n        /// <inheritdoc/>\n        public void Dispose() => _innerStore.Dispose();\n\n        /// <inheritdoc/>\n        public void Open(string location, bool noPrivateKeys = true)\n        {\n            ArgumentNullException.ThrowIfNullOrEmpty(location);\n            if (!location.StartsWith(StoreTypePrefix, StringComparison.Ordinal))\n            {\n                throw new ArgumentException(\n                    $\"Expected argument {nameof(location)} starting with {StoreTypePrefix}\",\n                    nameof(location));\n            }\n            _innerStore.Open(location.Substring(StoreTypePrefix.Length), noPrivateKeys);\n        }\n\n        /// <inheritdoc/>\n        public void Close() => _innerStore.Close();\n\n        /// <inheritdoc/>\n        public Task AddAsync(X509Certificate2 certificate, string? password = null, CancellationToken ct = default)\n            => _innerStore.AddAsync(certificate, password, ct);\n\n        /// <inheritdoc/>\n        public Task AddRejectedAsync(X509Certificate2Collection certificates, int maxCertificates, CancellationToken ct = default)\n            => _innerStore.AddRejectedAsync(certificates, maxCertificates, ct);\n\n        /// <inheritdoc/>\n        public Task<bool> DeleteAsync(string thumbprint, CancellationToken ct = default)\n            => _innerStore.DeleteAsync(thumbprint, ct);\n\n        /// <inheritdoc/>\n        public async Task<X509Certificate2Collection> EnumerateAsync(CancellationToken ct = default)\n        {\n            var certificatesCollection =\n                await _innerStore.EnumerateAsync(ct).ConfigureAwait(false);\n            if (!_innerStore.Directory.Exists)\n            {\n                return certificatesCollection;\n            }\n\n            foreach (var file in _innerStore.Directory.GetFiles('*' + CrtExtension))\n            {\n                try\n                {\n                    var certificates = new X509Certificate2Collection();\n                    certificates.ImportFromPemFile(file.FullName);\n                    certificatesCollection.AddRange(certificates);\n                    foreach (var certificate in certificates)\n                    {\n                        Utils.LogInfo(\"Enumerate certificates - certificate added {thumbprint}\",\n                            certificate.Thumbprint);\n                    }\n                }\n                catch (Exception e)\n                {\n                    Utils.LogError(e, \"Could not load certificate from file: {fileName}\",\n                        file.FullName);\n                }\n            }\n\n            return certificatesCollection;\n        }\n\n        /// <inheritdoc/>\n        public Task AddCRLAsync(X509CRL crl, CancellationToken ct = default)\n            => _innerStore.AddCRLAsync(crl, ct);\n\n        /// <inheritdoc/>\n        public Task<bool> DeleteCRLAsync(X509CRL crl, CancellationToken ct = default)\n            => _innerStore.DeleteCRLAsync(crl, ct);\n\n        /// <inheritdoc/>\n        public Task<X509CRLCollection> EnumerateCRLsAsync(CancellationToken ct = default)\n            => _innerStore.EnumerateCRLsAsync(ct);\n\n        /// <inheritdoc/>\n        public Task<X509CRLCollection> EnumerateCRLsAsync(X509Certificate2 issuer,\n            bool validateUpdateTime = true, CancellationToken ct = default)\n            => _innerStore.EnumerateCRLsAsync(issuer, validateUpdateTime, ct);\n\n        /// <inheritdoc/>\n        public async Task<X509Certificate2Collection> FindByThumbprintAsync(\n            string thumbprint, CancellationToken ct = default)\n        {\n            var certificatesCollection =\n                await _innerStore.FindByThumbprintAsync(thumbprint, ct).ConfigureAwait(false);\n\n            if (!_innerStore.Directory.Exists)\n            {\n                return certificatesCollection;\n            }\n\n            foreach (var file in _innerStore.Directory.GetFiles('*' + CrtExtension))\n            {\n                try\n                {\n                    var certificates = new X509Certificate2Collection();\n                    certificates.ImportFromPemFile(file.FullName);\n                    foreach (var certificate in certificates)\n                    {\n                        if (string.Equals(certificate.Thumbprint, thumbprint,\n                            StringComparison.OrdinalIgnoreCase))\n                        {\n                            Utils.LogInfo(\"Find by thumbprint: {thumbprint} - found\", thumbprint);\n                            certificatesCollection.Add(certificate);\n                        }\n                    }\n                }\n                catch (Exception e)\n                {\n                    Utils.LogError(e, \"Could not load certificate from file: {fileName}\",\n                        file.FullName);\n                }\n            }\n\n            return certificatesCollection;\n        }\n\n        /// <inheritdoc/>\n        public Task<StatusCode> IsRevokedAsync(X509Certificate2 issuer, X509Certificate2 certificate,\n            CancellationToken ct = default)\n            => _innerStore.IsRevokedAsync(issuer, certificate, ct);\n\n        /// <inheritdoc/>\n        public Task<X509Certificate2> LoadPrivateKeyAsync(string thumbprint, string subjectName,\n            string password, CancellationToken ct = default)\n            => LoadPrivateKeyAsync(thumbprint, subjectName, applicationUri: null, certificateType: null, password, ct);\n\n        /// <inheritdoc/>\n        public async Task<X509Certificate2> LoadPrivateKeyAsync(string thumbprint, string subjectName,\n            string? applicationUri, NodeId? certificateType, string password, CancellationToken ct = default)\n        {\n            if (!_innerStore.Directory.Exists)\n            {\n                return await _innerStore.LoadPrivateKeyAsync(thumbprint, subjectName, applicationUri,\n                    certificateType, password, ct).ConfigureAwait(false);\n            }\n\n            foreach (var file in _innerStore.Directory.GetFiles('*' + CrtExtension))\n            {\n                try\n                {\n                    var keyFile = new FileInfo(file.FullName.Replace(CrtExtension, KeyExtension,\n                        StringComparison.OrdinalIgnoreCase));\n                    if (keyFile.Exists)\n                    {\n                        using var certificate = X509CertificateLoader.LoadCertificateFromFile(\n                            file.FullName);\n                        if (!MatchCertificate(certificate, thumbprint, subjectName,\n                            applicationUri, certificateType))\n                        {\n                            continue;\n                        }\n\n                        var privateKeyCertificate = X509Certificate2.CreateFromPemFile(\n                            file.FullName, keyFile.FullName);\n\n                        Utils.LogInfo(\"Loading private key succeeded for {thumbprint} - {subjectName}\",\n                            thumbprint, subjectName);\n                        return privateKeyCertificate;\n                    }\n                }\n                catch (Exception e)\n                {\n                    Utils.LogError(e,\n                        \"Could not load private key for certificate file: {fileName}\", file.FullName);\n                }\n            }\n\n            return await _innerStore.LoadPrivateKeyAsync(thumbprint, subjectName, applicationUri,\n                certificateType, password, ct).ConfigureAwait(false);\n        }\n\n        private static bool MatchCertificate(X509Certificate2 certificate, string thumbprint,\n            string subjectName, string? applicationUri, NodeId? certificateType)\n        {\n            if (certificateType == null ||\n                certificateType == ObjectTypeIds.RsaSha256ApplicationCertificateType ||\n                certificateType == ObjectTypeIds.RsaMinApplicationCertificateType ||\n                certificateType == ObjectTypeIds.ApplicationCertificateType)\n            {\n                if (!string.IsNullOrEmpty(thumbprint) &&\n                    !string.Equals(certificate.Thumbprint, thumbprint, StringComparison.OrdinalIgnoreCase))\n                {\n                    return false;\n                }\n\n                if (!string.IsNullOrEmpty(subjectName) &&\n                    !X509Utils.CompareDistinguishedName(subjectName, certificate.Subject) &&\n                    (\n                        subjectName.Contains('=', StringComparison.OrdinalIgnoreCase) ||\n                        !X509Utils.ParseDistinguishedName(certificate.Subject)\n                            .Any(s => s.Equals(\"CN=\" + subjectName, StringComparison.Ordinal))))\n                {\n                    return false;\n                }\n\n                // skip if not RSA certificate\n                return X509Utils.GetRSAPublicKeySize(certificate) >= 0;\n            }\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/OpcUaClientConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Runtime\n{\n    using Furly.Extensions.Configuration;\n    using Microsoft.Extensions.Configuration;\n    using Opc.Ua;\n    using System;\n    using System.Globalization;\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// Default client configuration\n    /// </summary>\n    public sealed class OpcUaClientConfig : PostConfigureOptionBase<OpcUaClientOptions>\n    {\n        /// <summary>\n        /// Configuration\n        /// </summary>\n        public const string PkiRootPathKey = \"PkiRootPath\";\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        public const string ApplicationNameKey = \"ApplicationName\";\n        public const string ApplicationUriKey = \"ApplicationUri\";\n        public const string ProductUriKey = \"ProductUri\";\n        public const string DefaultSessionTimeoutKey = \"DefaultSessionTimeout\";\n        public const string DefaultServiceCallTimeoutKey = \"DefaultServiceCallTimeout\";\n        public const string DefaultConnectTimeoutKey = \"DefaultConnectTimeout\";\n        public const string KeepAliveIntervalKey = \"KeepAliveInterval\";\n        public const string ApplicationCertificateStorePathKey = \"ApplicationCertificateStorePath\";\n        public const string ApplicationCertificateStoreTypeKey = \"ApplicationCertificateStoreType\";\n        public const string ApplicationCertificateSubjectNameKey = \"ApplicationCertificateSubjectName\";\n        public const string TrustedIssuerCertificatesPathKey = \"TrustedIssuerCertificatesPath\";\n        public const string TrustedIssuerCertificatesTypeKey = \"TrustedIssuerCertificatesType\";\n        public const string TrustedPeerCertificatesPathKey = \"TrustedPeerCertificatesPath\";\n        public const string TrustedPeerCertificatesTypeKey = \"TrustedPeerCertificatesType\";\n        public const string RejectedCertificateStorePathKey = \"RejectedCertificateStorePath\";\n        public const string RejectedCertificateStoreTypeKey = \"RejectedCertificateStoreType\";\n        public const string TrustedUserCertificatesTypeKey = \"TrustedUserCertificatesType\";\n        public const string TrustedUserCertificatesPathKey = \"TrustedUserCertificatesPath\";\n        public const string UserIssuerCertificatesTypeKey = \"UserIssuerCertificatesType\";\n        public const string UserIssuerCertificatesPathKey = \"UserIssuerCertificatesPath\";\n        public const string HttpsIssuerCertificatesTypeKey = \"HttpsIssuerCertificatesType\";\n        public const string HttpsIssuerCertificatesPathKey = \"HttpsIssuerCertificatesPath\";\n        public const string TrustedHttpsCertificatesTypeKey = \"TrustedHttpsCertificatesType\";\n        public const string TrustedHttpsCertificatesPathKey = \"TrustedHttpsCertificatesPath\";\n        public const string AutoAcceptUntrustedCertificatesKey = \"AutoAcceptUntrustedCertificates\";\n        public const string RejectSha1SignedCertificatesKey = \"RejectSha1SignedCertificates\";\n        public const string MinimumCertificateKeySizeKey = \"MinimumCertificateKeySize\";\n        public const string AddAppCertToTrustedStoreKey = \"AddAppCertToTrustedStore\";\n        public const string RejectUnknownRevocationStatusKey = \"RejectUnknownRevocationStatus\";\n        public const string SecurityTokenLifetimeKey = \"SecurityTokenLifetime\";\n        public const string EnableOpcUaStackLoggingKey = \"EnableOpcUaStackLogging\";\n        public const string OpcUaKeySetLogFolderNameKey = \"OpcUaKeySetLogFolderName\";\n        public const string ChannelLifetimeKey = \"ChannelLifetime\";\n        public const string MaxBufferSizeKey = \"MaxBufferSize\";\n        public const string MaxMessageSizeKey = \"MaxMessageSize\";\n        public const string MaxArrayLengthKey = \"MaxArrayLength\";\n        public const string MaxByteStringLengthKey = \"MaxByteStringLength\";\n        public const string MaxStringLengthKey = \"MaxStringLength\";\n        public const string OperationTimeoutKey = \"OperationTimeout\";\n        public const string CreateSessionTimeoutKey = \"CreateSessionTimeout\";\n        public const string MaxReconnectDelayKey = \"MaxReconnectDelay\";\n        public const string MinReconnectDelayKey = \"MinReconnectDelay\";\n        public const string LingerTimeoutSecondsKey = \"LingerTimeoutSeconds\";\n        public const string ApplicationCertificatePasswordKey = \"ApplicationCertificatePassword\";\n        public const string TryConfigureFromExistingAppCertKey = \"TryConfigureFromExistingAppCert\";\n        public const string ReverseConnectPortKey = \"ReverseConnectPort\";\n        public const string DisableComplexTypePreloadingKey = \"DisableComplexTypePreloading\";\n        public const string PublishRequestsPerSubscriptionPercentKey = \"PublishRequestsPerSubscriptionPercent\";\n        public const string MinPublishRequestsKey = \"MinPublishRequests\";\n        public const string MaxPublishRequestsKey = \"MaxPublishRequests\";\n        public const string MaxNodesPerBrowseOverrideKey = \"MaxNodesPerBrowseOverride\";\n        public const string MaxNodesPerReadOverrideKey = \"MaxNodesPerReadOverride\";\n        public const string NodeCacheCapacityKey = \"NodeCacheCapacity\";\n        public const string NodeCacheTimeoutKey = \"NodeCacheTimeout\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n\n        /// <summary>\n        /// Default values for transport quotas.\n        /// </summary>\n        public const string ApplicationNameDefault = \"Microsoft.Azure.IIoT\";\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        public static readonly CompositeFormat ApplicationUriDefault =\n            CompositeFormat.Parse(\"urn:localhost:{0}:microsoft:\");\n        public const string ProductUriDefault = \"https://www.github.com/Azure/Industrial-IoT\";\n        public const string PkiRootPathDefault = \"pki\";\n        public const int SecurityTokenLifetimeDefault = 60 * 60 * 1000;\n        public const int ChannelLifetimeDefault = 300 * 1000;\n        public const int MaxBufferSizeDefault = (64 * 1024) - 1;\n        public const int MaxMessageSizeDefault = 8 * 1024 * 1024;\n        public const int MaxArrayLengthDefault = (64 * 1024) - 1;\n        public const int MaxByteStringLengthDefault = 1024 * 1024;\n        public const int MaxStringLengthDefault = (128 * 1024) - 256;\n        public const int OperationTimeoutDefault = 120 * 1000;\n        public const int DefaultSessionTimeoutDefaultSec = 60;\n        public const int DefaultServiceCallTimeoutDefaultSec = 3 * 60;\n        public const int KeepAliveIntervalDefaultSec = 10;\n        public const int CreateSessionTimeoutDefaultSec = 5;\n        public const int MaxReconnectDelayDefault = 60 * 1000;\n        public const int MinReconnectDelayDefault = 1000;\n        public const int ReverseConnectPortDefault = 4840;\n        public const int MinimumCertificateKeySizeDefault = 1024;\n        public const bool AutoAcceptUntrustedCertificatesDefault = false;\n        public const bool RejectSha1SignedCertificatesDefault = false;\n        public const bool AddAppCertToTrustedStoreDefault = true;\n        public const bool RejectUnknownRevocationStatusDefault = true;\n        public const int MinPublishRequestsDefault = 2;\n        public const int MaxPublishRequestsDefault = 10;\n        public const int PublishRequestsPerSubscriptionPercentDefault = 100;\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n\n        /// <inheritdoc/>\n        public override void PostConfigure(string? name, OpcUaClientOptions options)\n        {\n            if (string.IsNullOrEmpty(options.ApplicationName))\n            {\n                options.ApplicationName = GetStringOrDefault(ApplicationNameKey);\n                if (string.IsNullOrEmpty(options.ApplicationName) ||\n                    options.ApplicationName == \"Azure.IIoT.OpcUa.Publisher.Module\")\n                {\n                    options.ApplicationName = ApplicationNameDefault;\n                }\n            }\n\n            if (string.IsNullOrEmpty(options.ApplicationUri))\n            {\n                options.ApplicationUri = GetStringOrDefault(ApplicationUriKey,\n                    string.Format(CultureInfo.InvariantCulture,\n                        ApplicationUriDefault, options.ApplicationName));\n            }\n\n            if (string.IsNullOrEmpty(options.ProductUri))\n            {\n                options.ProductUri = GetStringOrDefault(ProductUriKey,\n                    ProductUriDefault);\n            }\n\n            if (options.DefaultSessionTimeoutDuration == null)\n            {\n                var sessionTimeout = GetIntOrDefault(DefaultSessionTimeoutKey,\n                    DefaultSessionTimeoutDefaultSec);\n                if (sessionTimeout > 0)\n                {\n                    options.DefaultSessionTimeoutDuration = TimeSpan.FromSeconds(sessionTimeout);\n                }\n            }\n\n            if (options.DefaultServiceCallTimeoutDuration == null)\n            {\n                var serviceCallTimeout = GetIntOrDefault(DefaultServiceCallTimeoutKey,\n                    DefaultServiceCallTimeoutDefaultSec);\n                if (serviceCallTimeout > 0)\n                {\n                    options.DefaultServiceCallTimeoutDuration = TimeSpan.FromSeconds(serviceCallTimeout);\n                }\n            }\n\n            if (options.DefaultConnectTimeoutDuration == null)\n            {\n                var connectTimeout = GetIntOrNull(DefaultConnectTimeoutKey);\n                if (connectTimeout > 0)\n                {\n                    options.DefaultConnectTimeoutDuration = TimeSpan.FromSeconds(connectTimeout.Value);\n                }\n            }\n\n            if (options.KeepAliveIntervalDuration == null)\n            {\n                var keepAliveInterval = GetIntOrDefault(KeepAliveIntervalKey,\n                    KeepAliveIntervalDefaultSec);\n                if (keepAliveInterval > 0)\n                {\n                    options.KeepAliveIntervalDuration = TimeSpan.FromSeconds(keepAliveInterval);\n                }\n            }\n\n            if (options.CreateSessionTimeoutDuration == null)\n            {\n                var createSessionTimeout = GetIntOrDefault(CreateSessionTimeoutKey,\n                    CreateSessionTimeoutDefaultSec);\n                if (createSessionTimeout > 0)\n                {\n                    options.CreateSessionTimeoutDuration = TimeSpan.FromSeconds(createSessionTimeout);\n                }\n            }\n\n            options.ReverseConnectPort ??= GetIntOrDefault(ReverseConnectPortKey,\n                    ReverseConnectPortDefault);\n\n            if (options.MinReconnectDelayDuration == null)\n            {\n                var reconnectDelay = GetIntOrDefault(MinReconnectDelayKey,\n                    MinReconnectDelayDefault);\n                if (reconnectDelay > 0)\n                {\n                    options.MinReconnectDelayDuration = TimeSpan.FromMilliseconds(reconnectDelay);\n                }\n            }\n\n            if (options.MaxReconnectDelayDuration == null)\n            {\n                var reconnectDelay = GetIntOrDefault(MaxReconnectDelayKey,\n                    MaxReconnectDelayDefault);\n                if (reconnectDelay > 0)\n                {\n                    options.MaxReconnectDelayDuration = TimeSpan.FromMilliseconds(reconnectDelay);\n                }\n            }\n\n            if (options.LingerTimeoutDuration == null)\n            {\n                var lingerTimeout = GetIntOrDefault(LingerTimeoutSecondsKey);\n                if (lingerTimeout > 0)\n                {\n                    options.LingerTimeoutDuration = TimeSpan.FromSeconds(lingerTimeout);\n                }\n            }\n\n            options.DisableComplexTypePreloading ??= GetBoolOrDefault(DisableComplexTypePreloadingKey);\n\n            options.MinPublishRequests ??= GetIntOrNull(MinPublishRequestsKey);\n            options.MaxPublishRequests ??= GetIntOrNull(MaxPublishRequestsKey);\n\n            options.PublishRequestsPerSubscriptionPercent ??= GetIntOrNull(\n                    PublishRequestsPerSubscriptionPercentKey);\n\n            options.MaxNodesPerReadOverride ??= GetIntOrNull(MaxNodesPerReadOverrideKey);\n            options.MaxNodesPerBrowseOverride ??= GetIntOrNull(MaxNodesPerBrowseOverrideKey);\n\n            options.NodeCacheCapacity ??= GetIntOrNull(NodeCacheCapacityKey);\n            options.NodeCacheTimeout ??= GetDurationOrNull(NodeCacheTimeoutKey);\n\n            if (options.Security.MinimumCertificateKeySize == 0)\n            {\n                options.Security.MinimumCertificateKeySize = (ushort)GetIntOrDefault(\n                    MinimumCertificateKeySizeKey, MinimumCertificateKeySizeDefault);\n            }\n\n            if (options.Security.AutoAcceptUntrustedCertificates == null)\n            {\n                options.Security.AutoAcceptUntrustedCertificates = GetBoolOrDefault(\n                    AutoAcceptUntrustedCertificatesKey, AutoAcceptUntrustedCertificatesDefault);\n            }\n\n            if (options.Security.RejectSha1SignedCertificates == null)\n            {\n                options.Security.RejectSha1SignedCertificates = GetBoolOrDefault(\n                    RejectSha1SignedCertificatesKey, RejectSha1SignedCertificatesDefault);\n            }\n\n            if (options.Security.AddAppCertToTrustedStore == null)\n            {\n                options.Security.AddAppCertToTrustedStore = GetBoolOrDefault(\n                    AddAppCertToTrustedStoreKey, AddAppCertToTrustedStoreDefault);\n            }\n\n            if (options.Security.RejectUnknownRevocationStatus == null)\n            {\n                options.Security.RejectUnknownRevocationStatus = GetBoolOrDefault(\n                    RejectUnknownRevocationStatusKey, RejectUnknownRevocationStatusDefault);\n            }\n\n            // https://github.com/OPCFoundation/UA-.NETStandard/blob/master/Docs/Certificates.md\n\n            if (options.Security.PkiRootPath == null)\n            {\n                options.Security.PkiRootPath = GetStringOrDefault(PkiRootPathKey,\n                    PkiRootPathDefault);\n            }\n\n            if (options.Security.ApplicationCertificates == null)\n            {\n                var storeType = GetStringOrDefault(ApplicationCertificateStoreTypeKey,\n                    CertificateStoreType.Directory);\n                options.Security.ApplicationCertificates = new()\n                {\n                    StorePath = GetStringOrDefault(ApplicationCertificateStorePathKey,\n                        $\"{GetStoreMoniker(storeType)}{options.Security.PkiRootPath}/own\"),\n                    StoreType = storeType,\n                    SubjectName = GetStringOrDefault(ApplicationCertificateSubjectNameKey,\n                        $\"CN={options.ApplicationName}, C=DE, S=Bav, O=Microsoft, DC=localhost\")\n                };\n            }\n\n            if (options.Security.RejectedCertificateStore == null)\n            {\n                var storeType = GetStringOrDefault(RejectedCertificateStoreTypeKey,\n                    CertificateStoreType.Directory);\n                options.Security.RejectedCertificateStore = new()\n                {\n                    StorePath = GetStringOrDefault(RejectedCertificateStorePathKey,\n                        $\"{GetStoreMoniker(storeType)}{options.Security.PkiRootPath}/rejected\"),\n                    StoreType = storeType\n                };\n            }\n\n            if (options.Security.TrustedIssuerCertificates == null)\n            {\n                var storeType = GetStringOrDefault(TrustedIssuerCertificatesTypeKey,\n                    CertificateStoreType.Directory);\n\n                //\n                // Returns the legacy 'issuers' if folder already exists or per\n                // specification.\n                //\n                var moniker = GetStoreMoniker(storeType);\n                var legacyPath = $\"{moniker}{options.Security.PkiRootPath}/issuers\";\n                var path = moniker.Length == 0 && Directory.Exists(legacyPath) ?\n                    legacyPath : $\"{moniker}{options.Security.PkiRootPath}/issuer\";\n\n                options.Security.TrustedIssuerCertificates = new()\n                {\n                    StorePath = GetStringOrDefault(TrustedIssuerCertificatesPathKey, path),\n                    StoreType = storeType\n                };\n            }\n\n            if (options.Security.TrustedPeerCertificates == null)\n            {\n                var storeType = GetStringOrDefault(TrustedPeerCertificatesTypeKey,\n                    CertificateStoreType.Directory);\n                options.Security.TrustedPeerCertificates = new()\n                {\n                    StorePath = GetStringOrDefault(TrustedPeerCertificatesPathKey,\n                        $\"{GetStoreMoniker(storeType)}{options.Security.PkiRootPath}/trusted\"),\n                    StoreType = storeType\n                };\n            }\n\n            if (options.Security.TrustedUserCertificates == null)\n            {\n                var storeType = GetStringOrDefault(TrustedUserCertificatesTypeKey,\n                    CertificateStoreType.Directory);\n                options.Security.TrustedUserCertificates = new()\n                {\n                    StorePath = GetStringOrDefault(TrustedUserCertificatesPathKey,\n                        $\"{GetStoreMoniker(storeType)}{options.Security.PkiRootPath}/user\"),\n                    StoreType = storeType\n                };\n            }\n\n            if (options.Security.TrustedHttpsCertificates == null)\n            {\n                var storeType = GetStringOrDefault(TrustedHttpsCertificatesTypeKey,\n                    CertificateStoreType.Directory);\n                options.Security.TrustedHttpsCertificates = new()\n                {\n                    StorePath = GetStringOrDefault(TrustedHttpsCertificatesPathKey,\n                        $\"{GetStoreMoniker(storeType)}{options.Security.PkiRootPath}/https\"),\n                    StoreType = storeType\n                };\n            }\n\n            if (options.Security.HttpsIssuerCertificates == null)\n            {\n                var storeType = GetStringOrDefault(HttpsIssuerCertificatesTypeKey,\n                    CertificateStoreType.Directory);\n                options.Security.HttpsIssuerCertificates = new()\n                {\n                    StorePath = GetStringOrDefault(HttpsIssuerCertificatesPathKey,\n                        $\"{GetStoreMoniker(storeType)}{options.Security.PkiRootPath}/https/issuer\"),\n                    StoreType = storeType\n                };\n            }\n\n            if (options.Security.UserIssuerCertificates == null)\n            {\n                var storeType = GetStringOrDefault(UserIssuerCertificatesTypeKey,\n                    CertificateStoreType.Directory);\n                options.Security.UserIssuerCertificates = new()\n                {\n                    StorePath = GetStringOrDefault(UserIssuerCertificatesPathKey,\n                        $\"{GetStoreMoniker(storeType)}{options.Security.PkiRootPath}/user/issuer\"),\n                    StoreType = storeType\n                };\n            }\n\n            if (options.Quotas.ChannelLifetime == 0)\n            {\n                options.Quotas.ChannelLifetime = GetIntOrDefault(ChannelLifetimeKey,\n                    ChannelLifetimeDefault);\n            }\n\n            if (options.Quotas.MaxArrayLength == 0)\n            {\n                options.Quotas.MaxArrayLength = GetIntOrDefault(MaxArrayLengthKey,\n                    MaxArrayLengthDefault);\n            }\n\n            if (options.Quotas.MaxBufferSize == 0)\n            {\n                options.Quotas.MaxBufferSize = GetIntOrDefault(MaxBufferSizeKey,\n                    MaxBufferSizeDefault);\n            }\n\n            if (options.Quotas.MaxByteStringLength == 0)\n            {\n                options.Quotas.MaxByteStringLength = GetIntOrDefault(MaxByteStringLengthKey,\n                    MaxByteStringLengthDefault);\n            }\n\n            if (options.Quotas.MaxMessageSize == 0)\n            {\n                options.Quotas.MaxMessageSize = GetIntOrDefault(MaxMessageSizeKey,\n                    MaxMessageSizeDefault);\n            }\n\n            if (options.Quotas.MaxStringLength == 0)\n            {\n                options.Quotas.MaxStringLength = GetIntOrDefault(MaxStringLengthKey,\n                    MaxStringLengthDefault);\n            }\n\n            if (options.Quotas.OperationTimeout == 0)\n            {\n                options.Quotas.OperationTimeout = GetIntOrDefault(OperationTimeoutKey,\n                    OperationTimeoutDefault);\n            }\n\n            if (options.Quotas.SecurityTokenLifetime == 0)\n            {\n                options.Quotas.SecurityTokenLifetime = GetIntOrDefault(SecurityTokenLifetimeKey,\n                    SecurityTokenLifetimeDefault);\n            }\n\n            options.OpcUaKeySetLogFolderName ??= GetStringOrDefault(OpcUaKeySetLogFolderNameKey);\n            options.EnableOpcUaStackLogging ??= GetBoolOrNull(EnableOpcUaStackLoggingKey);\n\n            if (options.Security.ApplicationCertificatePassword == null)\n            {\n                options.Security.ApplicationCertificatePassword =\n                    GetStringOrDefault(ApplicationCertificatePasswordKey);\n            }\n            if (options.Security.TryUseConfigurationFromExistingAppCert == null)\n            {\n                options.Security.TryUseConfigurationFromExistingAppCert =\n                    GetBoolOrNull(TryConfigureFromExistingAppCertKey);\n            }\n\n            static string GetStoreMoniker(string storeType) => storeType switch\n            {\n                CertificateStoreType.Directory or CertificateStoreType.X509Store => string.Empty,\n                FlatCertificateStore.StoreTypePrefix => FlatCertificateStore.StoreTypePrefix,\n                _ => throw new ArgumentOutOfRangeException(nameof(storeType),\n                    $\"Unknown certificate store type '{storeType}'\")\n            };\n        }\n\n        /// <inheritdoc/>\n        public OpcUaClientConfig(IConfiguration configuration) : base(configuration)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/OpcUaClientOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using System;\n\n    /// <summary>\n    /// Opc ua client options\n    /// </summary>\n    public sealed class OpcUaClientOptions\n    {\n        /// <summary>\n        /// Application name\n        /// </summary>\n        public string? ApplicationName { get; set; }\n\n        /// <summary>\n        /// Application uri\n        /// </summary>\n        public string? ApplicationUri { get; set; }\n\n        /// <summary>\n        /// Product uri\n        /// </summary>\n        public string? ProductUri { get; set; }\n\n        /// <summary>\n        /// Default session timeout. This is the timoout used to\n        /// establish a session with the server.\n        /// </summary>\n        public TimeSpan? DefaultSessionTimeoutDuration { get; set; }\n\n        /// <summary>\n        /// Default service call timeout duration. If the service\n        /// call timeout is not specified in the request header and\n        /// the this value is used.\n        /// </summary>\n        public TimeSpan? DefaultServiceCallTimeoutDuration { get; set; }\n\n        /// <summary>\n        /// Default connect timeout duration. If the connect timeout\n        /// is not specified in the request header this value is used.\n        /// If not specified the default service call timeout is used.\n        /// </summary>\n        public TimeSpan? DefaultConnectTimeoutDuration { get; set; }\n\n        /// <summary>\n        /// Keep alive interval. The client will send keep alives\n        /// to the server at this interval and expect a response\n        /// or initiate a session recovery / reconnect sequence.\n        /// </summary>\n        public TimeSpan? KeepAliveIntervalDuration { get; set; }\n\n        /// <summary>\n        /// How long to wait until connected or until\n        /// reconnecting is attempted.\n        /// </summary>\n        public TimeSpan? CreateSessionTimeoutDuration { get; set; }\n\n        /// <summary>\n        /// Reverse connect port to use other than the\n        /// default port 4840.\n        /// </summary>\n        public int? ReverseConnectPort { get; set; }\n\n        /// <summary>\n        /// Disable complex type preloading. The type system\n        /// will still be lazily loaded when requested e.g.,\n        /// during subscription creation.\n        /// </summary>\n        public bool? DisableComplexTypePreloading { get; set; }\n\n        /// <summary>\n        /// How long to at least wait until reconnecting.\n        /// </summary>\n        public TimeSpan? MinReconnectDelayDuration { get; set; }\n\n        /// <summary>\n        /// How long to at most wait until reconnecting.\n        /// </summary>\n        public TimeSpan? MaxReconnectDelayDuration { get; set; }\n\n        /// <summary>\n        /// How long to keep clients around after a service call.\n        /// </summary>\n        public TimeSpan? LingerTimeoutDuration { get; set; }\n\n        /// <summary>\n        /// Transport quota\n        /// </summary>\n        public TransportOptions Quotas { get; } = new TransportOptions();\n\n        /// <summary>\n        /// Security configuration\n        /// </summary>\n        public SecurityOptions Security { get; } = new SecurityOptions();\n\n        /// <summary>\n        /// Enable traces in the stack beyond errors\n        /// </summary>\n        public bool? EnableOpcUaStackLogging { get; set; }\n\n        /// <summary>\n        /// Folder to write keysets to for later decryption\n        /// of wireshark traces.\n        /// </summary>\n        public string? OpcUaKeySetLogFolderName { get; set; }\n\n        /// <summary>\n        /// Minimum number of publish requests to queue\n        /// at all times. Default is 2.\n        /// </summary>\n        public int? MinPublishRequests { get; set; }\n\n        /// <summary>\n        /// The publish requests per subscription factor in\n        /// percent, e.g., 120% means 1.2 requests per\n        /// subscription. Use this to control network latency\n        /// </summary>\n        public int? PublishRequestsPerSubscriptionPercent { get; set; }\n\n        /// <summary>\n        /// Max number of publish requests to queue\n        /// at all times. Default is 15.\n        /// </summary>\n        public int? MaxPublishRequests { get; set; }\n\n        /// <summary>\n        /// Limit max nodes to read in a batch operation\n        /// </summary>\n        public int? MaxNodesPerReadOverride { get; set; }\n\n        /// <summary>\n        /// Limit max nodes to browse in a batch operation\n        /// </summary>\n        public int? MaxNodesPerBrowseOverride { get; set; }\n\n        /// <summary>\n        /// Node cache timeout\n        /// </summary>\n        public TimeSpan? NodeCacheTimeout { get; set; }\n\n        /// <summary>\n        /// Node cache capacity\n        /// </summary>\n        public int? NodeCacheCapacity { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/OpcUaSubscriptionConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Runtime\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Configuration;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Options;\n    using System;\n\n    /// <summary>\n    /// Subscription options configuration\n    /// </summary>\n    public sealed class OpcUaSubscriptionConfig : PostConfigureOptionBase<OpcUaSubscriptionOptions>\n    {\n        /// <summary>\n        /// Configuration\n        /// </summary>\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        public const string DefaultHeartbeatIntervalKey = \"DefaultHeartbeatInterval\";\n        public const string DefaultHeartbeatBehaviorKey = \"DefaultHeartbeatBehavior\";\n        public const string DefaultSkipFirstKey = \"DefaultSkipFirst\";\n        public const string DefaultRepublishAfterTransferKey = \"RepublishAfterTransfer\";\n        public const string DefaultDiscardNewKey = \"DiscardNew\";\n        public const string DefaultSamplingIntervalKey = \"DefaultSamplingInterval\";\n        public const string DefaultPublishingIntervalKey = \"DefaultPublishingInterval\";\n        public const string DefaultDataChangeTriggerKey = \"DefaultDataChangeTrigger\";\n        public const string FetchOpcNodeDisplayNameKey = \"FetchOpcNodeDisplayName\";\n        public const string FetchOpcBrowsePathFromRootKey = \"FetchOpcBrowsePathFromRoot\";\n        public const string DefaultQueueSizeKey = \"DefaultQueueSize\";\n        public const string AutoSetQueueSizesKey = \"AutoSetQueueSizes\";\n        public const string DefaultLifetimeCountKey = \"DefaultLifetimeCount\";\n        public const string DefaultKeepAliveCountKey = \"DefaultKeepAliveCount\";\n        public const string MaxMonitoredItemPerSubscriptionKey = \"MaxMonitoredItemPerSubscription\";\n        public const string UseDeferredAcknoledgementsKey = \"UseDeferredAcknoledgements\";\n        public const string DefaultSamplingUsingCyclicReadKey = \"DefaultSamplingUsingCyclicRead\";\n        public const string EnableImmediatePublishingKey = \"EnableImmediatePublishing\";\n        public const string EnableSequentialPublishingKey = \"EnableSequentialPublishing\";\n        public const string DefaultRebrowsePeriodKey = \"DefaultRebrowsePeriod\";\n        public const string DefaultWatchdogBehaviorKey = \"DefaultWatchdogBehavior\";\n        public const string DefaultMonitoredItemWatchdogConditionKey = \"DefaultMonitoredItemWatchdogCondition\";\n        public const string DefaultMonitoredItemWatchdogSecondsKey = \"DefaultMonitoredItemWatchdogSeconds\";\n        public const string SubscriptionErrorRetryDelaySecondsKey = \"SubscriptionErrorRetryDelaySeconds\";\n        public const string InvalidMonitoredItemRetryDelaySecondsKey = \"InvalidMonitoredItemRetryDelaySeconds\";\n        public const string BadMonitoredItemRetryDelaySecondsKey = \"BadMonitoredItemRetryDelaySeconds\";\n        public const string InvalidMonitoredItemRetryDelayMaxSecondsKey = \"InvalidMonitoredItemRetryDelayMaxSeconds\";\n        public const string BadMonitoredItemRetryDelayMaxSecondsKey = \"BadMonitoredItemRetryDelayMaxSeconds\";\n        public const string SubscriptionManagementIntervalSecondsKey = \"SubscriptionManagementIntervalSeconds\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n\n        /// <summary>\n        /// Default values\n        /// </summary>\n        public const bool ResolveDisplayNameDefault = false;\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        public const int DefaultSamplingIntervalDefaultMillis = 1000;\n        public const int DefaultPublishingIntervalDefaultMillis = 1000;\n        public const bool DefaultSkipFirstDefault = false;\n        public const bool DefaultRepublishAfterTransferDefault = false;\n        public const bool EnableSequentialPublishingDefault = true;\n        public const bool UseDeferredAcknoledgementsDefault = false;\n        public const int SubscriptionErrorRetryDelayDefaultSec = 2;\n        public const int InvalidMonitoredItemRetryDelayDefaultSec = 5 * 60;\n        public const int BadMonitoredItemRetryDelayDefaultSec = 30 * 60;\n        public const bool DefaultDiscardNewDefault = false;\n        public static readonly TimeSpan DefaultRebrowsePeriodDefault = TimeSpan.FromHours(12);\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n\n        /// <inheritdoc/>\n        public override void PostConfigure(string? name, OpcUaSubscriptionOptions options)\n        {\n            options.UseDeferredAcknoledgements ??= GetBoolOrDefault(\n                    UseDeferredAcknoledgementsKey, UseDeferredAcknoledgementsDefault);\n            if (options.DefaultHeartbeatInterval == null)\n            {\n                options.DefaultHeartbeatInterval = GetDurationOrNull(\n                    DefaultHeartbeatIntervalKey);\n            }\n            if (options.DefaultHeartbeatBehavior == null &&\n                Enum.TryParse<HeartbeatBehavior>(GetStringOrDefault(DefaultHeartbeatBehaviorKey),\n                    out var behavior))\n            {\n                options.DefaultHeartbeatBehavior = behavior;\n            }\n            options.DefaultSamplingUsingCyclicRead ??= GetBoolOrNull(DefaultSamplingUsingCyclicReadKey);\n            if (options.DefaultRebrowsePeriod == null)\n            {\n                options.DefaultRebrowsePeriod = GetDurationOrNull(DefaultRebrowsePeriodKey);\n            }\n            options.DefaultSkipFirst ??= GetBoolOrDefault(DefaultSkipFirstKey,\n                    DefaultSkipFirstDefault);\n            options.DefaultRepublishAfterTransfer ??= GetBoolOrDefault(DefaultRepublishAfterTransferKey,\n                    DefaultRepublishAfterTransferDefault);\n            options.DefaultDiscardNew ??= GetBoolOrDefault(DefaultDiscardNewKey,\n                    DefaultDiscardNewDefault);\n            if (options.DefaultSamplingInterval == null)\n            {\n                options.DefaultSamplingInterval = GetDurationOrNull(DefaultSamplingIntervalKey) ??\n                    TimeSpan.FromMilliseconds(GetIntOrDefault(DefaultSamplingIntervalKey,\n                    DefaultSamplingIntervalDefaultMillis));\n            }\n            if (options.DefaultPublishingInterval == null)\n            {\n                options.DefaultPublishingInterval = GetDurationOrNull(DefaultPublishingIntervalKey) ??\n                    TimeSpan.FromMilliseconds(GetIntOrDefault(DefaultPublishingIntervalKey,\n                        DefaultPublishingIntervalDefaultMillis));\n            }\n            if (options.DefaultMonitoredItemWatchdogTimeout == null)\n            {\n                var watchdogInterval = GetIntOrNull(DefaultMonitoredItemWatchdogSecondsKey);\n                if (watchdogInterval.HasValue)\n                {\n                    options.DefaultMonitoredItemWatchdogTimeout =\n                        TimeSpan.FromSeconds(watchdogInterval.Value);\n                }\n            }\n            if (options.DefaultMonitoredItemWatchdogCondition == null &&\n                Enum.TryParse<MonitoredItemWatchdogCondition>(\n                    GetStringOrDefault(DefaultMonitoredItemWatchdogConditionKey),\n                    out var watchdogCondition))\n            {\n                options.DefaultMonitoredItemWatchdogCondition = watchdogCondition;\n            }\n            if (options.DefaultWatchdogBehavior == null &&\n                Enum.TryParse<SubscriptionWatchdogBehavior>(\n                    GetStringOrDefault(DefaultWatchdogBehaviorKey),\n                    out var watchdogBehavior))\n            {\n                options.DefaultWatchdogBehavior = watchdogBehavior;\n            }\n\n            if (options.SubscriptionErrorRetryDelay == null)\n            {\n                var retryTimeout = GetIntOrNull(SubscriptionErrorRetryDelaySecondsKey);\n                if (retryTimeout.HasValue)\n                {\n                    options.SubscriptionErrorRetryDelay =\n                        TimeSpan.FromSeconds(retryTimeout.Value);\n                }\n            }\n\n            if (options.BadMonitoredItemRetryDelayDuration == null)\n            {\n                var retryTimeout = GetIntOrNull(BadMonitoredItemRetryDelaySecondsKey);\n                if (retryTimeout.HasValue)\n                {\n                    options.BadMonitoredItemRetryDelayDuration =\n                        TimeSpan.FromSeconds(retryTimeout.Value);\n                }\n            }\n\n            if (options.InvalidMonitoredItemRetryDelayDuration == null)\n            {\n                var retryTimeout = GetIntOrNull(InvalidMonitoredItemRetryDelaySecondsKey);\n                if (retryTimeout.HasValue)\n                {\n                    options.InvalidMonitoredItemRetryDelayDuration =\n                        TimeSpan.FromSeconds(retryTimeout.Value);\n                }\n            }\n\n            if (options.BadMonitoredItemRetryDelayDurationMax == null)\n            {\n                var retryTimeout = GetIntOrNull(BadMonitoredItemRetryDelayMaxSecondsKey);\n                if (retryTimeout.HasValue)\n                {\n                    options.BadMonitoredItemRetryDelayDurationMax =\n                        TimeSpan.FromSeconds(retryTimeout.Value);\n                    if (options.BadMonitoredItemRetryDelayDuration == null)\n                    {\n                        options.BadMonitoredItemRetryDelayDuration =\n                            TimeSpan.FromSeconds(2);\n                    }\n                }\n            }\n\n            if (options.InvalidMonitoredItemRetryDelayDurationMax == null)\n            {\n                var retryTimeout = GetIntOrNull(InvalidMonitoredItemRetryDelayMaxSecondsKey);\n                if (retryTimeout.HasValue)\n                {\n                    options.InvalidMonitoredItemRetryDelayDurationMax =\n                        TimeSpan.FromSeconds(retryTimeout.Value);\n                    if (options.InvalidMonitoredItemRetryDelayDuration == null)\n                    {\n                        options.InvalidMonitoredItemRetryDelayDuration =\n                            TimeSpan.FromSeconds(2);\n                    }\n                }\n            }\n\n            if (options.SubscriptionManagementIntervalDuration == null)\n            {\n                var managementInterval = GetIntOrNull(SubscriptionManagementIntervalSecondsKey);\n                if (managementInterval.HasValue)\n                {\n                    options.SubscriptionManagementIntervalDuration =\n                        TimeSpan.FromSeconds(managementInterval.Value);\n                }\n            }\n\n            options.DefaultKeepAliveCount ??= (uint?)GetIntOrNull(DefaultKeepAliveCountKey);\n            options.DefaultLifeTimeCount ??= (uint?)GetIntOrNull(DefaultLifetimeCountKey);\n\n            options.EnableImmediatePublishing ??= GetBoolOrNull(EnableImmediatePublishingKey);\n            options.EnableSequentialPublishing ??= GetBoolOrDefault(EnableSequentialPublishingKey,\n                    EnableSequentialPublishingDefault);\n            options.ResolveDisplayName ??= GetBoolOrDefault(FetchOpcNodeDisplayNameKey,\n                    ResolveDisplayNameDefault);\n            options.DefaultQueueSize ??= (uint?)GetIntOrNull(DefaultQueueSizeKey);\n            options.AutoSetQueueSizes ??= GetBoolOrNull(AutoSetQueueSizesKey);\n\n            options.MaxMonitoredItemPerSubscription ??= (uint?)GetIntOrNull(MaxMonitoredItemPerSubscriptionKey);\n\n            var unsMode = _options.Value.DefaultDataSetRouting ?? DataSetRoutingMode.None;\n            options.FetchOpcBrowsePathFromRoot ??= unsMode != DataSetRoutingMode.None\n                ? true : GetBoolOrNull(FetchOpcBrowsePathFromRootKey);\n\n            if (options.DefaultDataChangeTrigger == null &&\n                Enum.TryParse<DataChangeTriggerType>(GetStringOrDefault(DefaultDataChangeTriggerKey),\n                    out var trigger))\n            {\n                options.DefaultDataChangeTrigger = trigger;\n            }\n        }\n\n        /// <summary>\n        /// Create configurator\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"options\"></param>\n        public OpcUaSubscriptionConfig(IConfiguration configuration,\n            IOptions<PublisherOptions> options) : base(configuration)\n        {\n            _options = options;\n        }\n        private readonly IOptions<PublisherOptions> _options;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/OpcUaSubscriptionOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n\n    /// <summary>\n    /// Subscription configuration\n    /// </summary>\n    public sealed class OpcUaSubscriptionOptions\n    {\n        /// <summary>\n        /// The default behavior of heartbeat if not configured.\n        /// </summary>\n        public HeartbeatBehavior? DefaultHeartbeatBehavior { get; set; }\n\n        /// <summary>\n        /// The default interval for heartbeats if not configured.\n        /// </summary>\n        public TimeSpan? DefaultHeartbeatInterval { get; set; }\n\n        /// <summary>\n        /// The default flag whether to skip the first value if\n        /// not set on node level.\n        /// </summary>\n        public bool? DefaultSkipFirst { get; set; }\n\n        /// <summary>\n        /// Republish messages after transfer\n        /// </summary>\n        public bool? DefaultRepublishAfterTransfer { get; set; }\n\n        /// <summary>\n        /// The default flag whether to descard new items in queue\n        /// </summary>\n        public bool? DefaultDiscardNew { get; set; }\n\n        /// <summary>\n        /// The default sampling interval.\n        /// </summary>\n        public TimeSpan? DefaultSamplingInterval { get; set; }\n\n        /// <summary>\n        /// The default publishing interval.\n        /// </summary>\n        public TimeSpan? DefaultPublishingInterval { get; set; }\n\n        /// <summary>\n        /// Allow max monitored item per subscription. If the server\n        /// supports less, this value takes no effect.\n        /// </summary>\n        public uint? MaxMonitoredItemPerSubscription { get; set; }\n\n        /// <summary>\n        /// Default subscription keep alive counter\n        /// </summary>\n        public uint? DefaultKeepAliveCount { get; set; }\n\n        /// <summary>\n        /// Default subscription lifetime counter\n        /// </summary>\n        public uint? DefaultLifeTimeCount { get; set; }\n\n        /// <summary>\n        /// Enable publishing and monitored items when created\n        /// rather than when publishing should start.\n        /// </summary>\n        public bool? EnableImmediatePublishing { get; set; }\n\n        /// <summary>\n        /// Enable sequential publishing feature in the stack.\n        /// </summary>\n        public bool? EnableSequentialPublishing { get; set; }\n\n        /// <summary>\n        /// Flag wether to grab the display name of nodes form\n        /// the OPC UA Server.\n        /// </summary>\n        public bool? ResolveDisplayName { get; set; }\n\n        /// <summary>\n        /// set the default queue size for monitored items. If not\n        /// set the default queue size will be configured (1 for\n        /// data monitored items, and 0 for event monitoring).\n        /// </summary>\n        public uint? DefaultQueueSize { get; set; }\n\n        /// <summary>\n        /// Automatically calculate queue sizes based on the\n        /// publishing interval and sampling interval as\n        /// max(1, roundup(subscription pi / si)).\n        /// </summary>\n        public bool? AutoSetQueueSizes { get; set; }\n\n        /// <summary>\n        /// Use deferred acnkoledgement (experimental)\n        /// </summary>\n        public bool? UseDeferredAcknoledgements { get; set; }\n\n        /// <summary>\n        /// Always use cyclic reads for sampling\n        /// </summary>\n        public bool? DefaultSamplingUsingCyclicRead { get; set; }\n\n        /// <summary>\n        /// Default cache age to use for cyclic reads.\n        /// Default is 0 (uncached)\n        /// </summary>\n        public TimeSpan DefaultCyclicReadMaxAge { get; set; }\n\n        /// <summary>\n        /// The default rebrowse period for model change event generation.\n        /// </summary>\n        public TimeSpan? DefaultRebrowsePeriod { get; set; }\n\n        /// <summary>\n        /// set the default data change filter for monitored items. Default is\n        /// status and value change triggering.\n        /// </summary>\n        public DataChangeTriggerType? DefaultDataChangeTrigger { get; set; }\n\n        /// <summary>\n        /// Retrieve paths from root folder to enable automatic\n        /// unified namespace publishing\n        /// </summary>\n        public bool? FetchOpcBrowsePathFromRoot { get; set; }\n\n        /// <summary>\n        /// The default watchdog behaviour of the subscription.\n        /// </summary>\n        public SubscriptionWatchdogBehavior? DefaultWatchdogBehavior { get; set; }\n\n        /// <summary>\n        /// Default monitored item watchdog timeout duration.\n        /// </summary>\n        public TimeSpan? DefaultMonitoredItemWatchdogTimeout { get; set; }\n\n        /// <summary>\n        /// The condition when to run the watchdog action in case\n        /// of late monitored items.\n        /// </summary>\n        public MonitoredItemWatchdogCondition? DefaultMonitoredItemWatchdogCondition { get; set; }\n\n        /// <summary>\n        /// How long to wait until retrying on errors related\n        /// to creating and modifying the subscription.\n        /// </summary>\n        public TimeSpan? SubscriptionErrorRetryDelay { get; set; }\n\n        /// <summary>\n        /// The watchdog period to kick off regular management\n        /// of the subscription and reapply any state on failed\n        /// nodes.\n        /// </summary>\n        public TimeSpan? SubscriptionManagementIntervalDuration { get; set; }\n\n        /// <summary>\n        /// At what interval should bad monitored items be retried.\n        /// These are items that have been rejected by the server\n        /// during subscription update or never successfully\n        /// published.\n        /// </summary>\n        public TimeSpan? BadMonitoredItemRetryDelayDuration { get; set; }\n\n        /// <summary>\n        /// At what interval should invalid monitored items be\n        /// retried. These are items that are potentially\n        /// misconfigured.\n        /// </summary>\n        public TimeSpan? InvalidMonitoredItemRetryDelayDuration { get; set; }\n\n        /// <summary>\n        /// The max interval to use for bad monitored items.\n        /// In this case exponential backoff is used.\n        /// </summary>\n        public TimeSpan? BadMonitoredItemRetryDelayDurationMax { get; set; }\n\n        /// <summary>\n        /// The max interval to use for invalid monitored items.\n        /// In this case exponential backoff is used.\n        /// </summary>\n        public TimeSpan? InvalidMonitoredItemRetryDelayDurationMax { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/SecurityOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    /// <summary>\n    /// Security configuration\n    /// </summary>\n    public sealed class SecurityOptions\n    {\n        /// <summary>\n        /// PkiRootPath\n        /// </summary>\n        public string? PkiRootPath { get; set; }\n\n        /// <summary>\n        /// Application certificate store and subject\n        /// </summary>\n        public CertificateInfo? ApplicationCertificates { get; set; }\n\n        /// <summary>\n        /// Whether to auto accept untrusted certificates\n        /// </summary>\n        public bool? AutoAcceptUntrustedCertificates { get; set; }\n\n        /// <summary>\n        /// Minimum key size\n        /// </summary>\n        public ushort MinimumCertificateKeySize { get; set; }\n\n        /// <summary>\n        /// Rejected store\n        /// </summary>\n        public CertificateStore? RejectedCertificateStore { get; set; }\n\n        /// <summary>\n        /// Whether to reject unsecure signatures\n        /// </summary>\n        public bool? RejectSha1SignedCertificates { get; set; }\n\n        /// <summary>\n        /// Trusted certificates\n        /// </summary>\n        public CertificateStore? TrustedIssuerCertificates { get; set; }\n\n        /// <summary>\n        /// Trusted peer certificates\n        /// </summary>\n        public CertificateStore? TrustedPeerCertificates { get; set; }\n\n        /// <summary>\n        /// Automatically add application certificate to the trusted store\n        /// </summary>\n        public bool? AddAppCertToTrustedStore { get; set; }\n\n        /// <summary>\n        /// Reject chain validation with CA certs with unknown revocation status,\n        /// e.g.when the CRL is not available or the OCSP provider is offline.\n        /// </summary>\n        public bool? RejectUnknownRevocationStatus { get; set; }\n\n        /// <summary>\n        /// Trusted user certificates\n        /// </summary>\n        public CertificateStore? TrustedUserCertificates { get; set; }\n\n        /// <summary>\n        /// Trusted https certificates\n        /// </summary>\n        public CertificateStore? TrustedHttpsCertificates { get; set; }\n\n        /// <summary>\n        /// Http issuer certificates (certificate authority)\n        /// </summary>\n        public CertificateStore? HttpsIssuerCertificates { get; set; }\n\n        /// <summary>\n        /// User issuer certificates\n        /// </summary>\n        public CertificateStore? UserIssuerCertificates { get; set; }\n\n        /// <summary>\n        /// Password to secure the key of the application certificate\n        /// in the private key infrastructure.\n        /// </summary>\n        public string? ApplicationCertificatePassword { get; set; }\n\n        /// <summary>\n        /// Try to use the configuration from the first application\n        /// certificate found in the application certificate store\n        /// configured above.\n        /// </summary>\n        public bool? TryUseConfigurationFromExistingAppCert { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Runtime/TransportOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    /// <summary>\n    /// Transport quota configuration\n    /// </summary>\n    public sealed class TransportOptions\n    {\n        /// <summary>\n        /// Channel lifetime in milliseconds.\n        /// </summary>\n        public int ChannelLifetime { get; set; }\n\n        /// <summary>\n        /// Max array length\n        /// </summary>\n        public int MaxArrayLength { get; set; }\n\n        /// <summary>\n        /// Max buffer size\n        /// </summary>\n        public int MaxBufferSize { get; set; }\n\n        /// <summary>\n        /// Max string length\n        /// </summary>\n        public int MaxByteStringLength { get; set; }\n\n        /// <summary>\n        /// Max message size\n        /// </summary>\n        public int MaxMessageSize { get; set; }\n\n        /// <summary>\n        /// Max string length\n        /// </summary>\n        public int MaxStringLength { get; set; }\n\n        /// <summary>\n        /// Operation timeout in milliseconds.\n        /// </summary>\n        public int OperationTimeout { get; set; }\n\n        /// <summary>\n        /// Security token lifetime in milliseconds.\n        /// </summary>\n        public int SecurityTokenLifetime { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaApplication.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Exceptions;\n    using Furly.Extensions.Hosting;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using Opc.Ua.Configuration;\n    using Opc.Ua.Security.Certificates;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Net;\n    using System.Net.NetworkInformation;\n    using System.Security.Cryptography;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Client configuration\n    /// </summary>\n    public sealed class OpcUaApplication : IAwaitable<OpcUaApplication>,\n        IOpcUaConfiguration, IOpcUaCertificates, ICertificatePasswordProvider,\n        IDisposable\n    {\n        /// <inheritdoc/>\n        public ApplicationConfiguration Value => _configuration.Result;\n\n        /// <inheritdoc/>\n        public event CertificateValidationEventHandler Validate\n        {\n            add => Value.CertificateValidator.CertificateValidation += value;\n            remove => Value.CertificateValidator.CertificateValidation -= value;\n        }\n\n        private string Password =>\n            _options.Value.Security.ApplicationCertificatePassword ?? string.Empty;\n\n        /// <summary>\n        /// Create client manager\n        /// </summary>\n        /// <param name=\"options\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"identity\"></param>\n        public OpcUaApplication(IOptions<OpcUaClientOptions> options,\n            ILogger<OpcUaApplication> logger, TimeProvider? timeProvider = null,\n            IProcessIdentity? identity = null)\n        {\n            if (options.Value.Security == null)\n            {\n                throw new ArgumentException(\"Security options not provided\",\n                    nameof(options));\n            }\n\n            if (options.Value.Security.ApplicationCertificates?.SubjectName == null)\n            {\n                throw new ArgumentException(\"Application certificate missing\",\n                    nameof(options));\n            }\n\n            if (options.Value.Security.TrustedIssuerCertificates == null)\n            {\n                throw new ArgumentException(\"Trusted issuer certificates missing\",\n                    nameof(options));\n            }\n\n            if (options.Value.Security.TrustedPeerCertificates == null)\n            {\n                throw new ArgumentException(\"Trusted peer certificates missing\",\n                    nameof(options));\n            }\n\n            if (options.Value.Security.RejectedCertificateStore == null)\n            {\n                throw new ArgumentException(\"Rejected certificate store missing\",\n                    nameof(options));\n            }\n\n            if (options.Value.Security.TrustedUserCertificates == null)\n            {\n                throw new ArgumentException(\"Trusted user certificates store missing\",\n                    nameof(options));\n            }\n\n            if (options.Value.Security.HttpsIssuerCertificates == null)\n            {\n                throw new ArgumentException(\"Https issuer certificate store missing\",\n                    nameof(options));\n            }\n\n            if (options.Value.Security.TrustedHttpsCertificates == null)\n            {\n                throw new ArgumentException(\"Trusted https certificates store missing\",\n                    nameof(options));\n            }\n\n            if (options.Value.Security.UserIssuerCertificates == null)\n            {\n                throw new ArgumentException(\"User issuer certificates store missing\",\n                    nameof(options));\n            }\n\n            if (new[]\n            {\n                options.Value.Security.ApplicationCertificates.StoreType,\n                options.Value.Security.TrustedIssuerCertificates.StoreType,\n                options.Value.Security.TrustedPeerCertificates.StoreType,\n                options.Value.Security.RejectedCertificateStore.StoreType,\n                options.Value.Security.TrustedUserCertificates.StoreType,\n                options.Value.Security.HttpsIssuerCertificates.StoreType,\n                options.Value.Security.TrustedHttpsCertificates.StoreType,\n                options.Value.Security.UserIssuerCertificates.StoreType\n            }.Any(t => t?.Equals(FlatCertificateStore.StoreTypeName,\n                StringComparison.OrdinalIgnoreCase) == true))\n            {\n                // Register FlatCertificateStore as known certificate store type.\n                var certStoreTypeName = CertificateStoreType.GetCertificateStoreTypeByName(\n                    FlatCertificateStore.StoreTypeName);\n                if (certStoreTypeName is null)\n                {\n                    CertificateStoreType.RegisterCertificateStoreType(\n                        FlatCertificateStore.StoreTypeName, new FlatCertificateStore());\n                }\n            }\n\n            _logger = logger;\n            _options = options;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _identity = identity?.Identity;\n            _configuration = BuildAsync();\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _configuration.GetAwaiter().GetResult();\n            _disposed = true;\n        }\n\n        /// <inheritdoc/>\n        public IAwaiter<OpcUaApplication> GetAwaiter()\n        {\n            return _configuration.AsAwaiter(this);\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask<IReadOnlyList<X509CertificateModel>> ListCertificatesAsync(\n            CertificateStoreName store, bool includePrivateKey, CancellationToken ct)\n        {\n            // show application certs\n            using var certStore = await OpenAsync(store).ConfigureAwait(false);\n            var certificates = new List<X509CertificateModel>();\n            foreach (var cert in await certStore.EnumerateAsync(ct).ConfigureAwait(false))\n            {\n                switch (store)\n                {\n                    case CertificateStoreName.Application:\n                        if (!includePrivateKey || !certStore.SupportsLoadPrivateKey)\n                        {\n                            goto default;\n                        }\n                        var certificateType = DetermineCertificateType(cert);\n                        var withPrivateKey = await certStore.LoadPrivateKeyAsync(cert.Thumbprint, cert.Subject, null, certificateType, Password, ct).ConfigureAwait(false);\n                        if (withPrivateKey == null)\n                        {\n                            goto default;\n                        }\n                        certificates.Add(withPrivateKey.ToServiceModel());\n                        break;\n                    default:\n                        certificates.Add(cert.ToServiceModel());\n                        break;\n                }\n            }\n            return certificates;\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask<IReadOnlyList<byte[]>> ListCertificateRevocationListsAsync(\n            CertificateStoreName store, CancellationToken ct)\n        {\n            using var certStore = await OpenAsync(store).ConfigureAwait(false);\n            if (!certStore.SupportsCRLs)\n            {\n                return Array.Empty<byte[]>();\n            }\n            var crls = await certStore.EnumerateCRLsAsync(ct).ConfigureAwait(false);\n            return crls.Select(c => c.RawData).ToList();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask AddCertificateAsync(CertificateStoreName store, byte[] pfxBlob,\n            string? password, CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            using var cert = X509CertificateLoader.LoadPkcs12(pfxBlob, password, X509KeyStorageFlags.Exportable);\n            using var certStore = await OpenAsync(store).ConfigureAwait(false);\n            try\n            {\n                _logger.AddCertificate(cert.Thumbprint, store.ToString());\n                var certCollection = await certStore.FindByThumbprintAsync(cert.Thumbprint, ct).ConfigureAwait(false);\n                if (certCollection.Count != 0)\n                {\n                    await certStore.DeleteAsync(cert.Thumbprint, ct).ConfigureAwait(false);\n                }\n\n                await certStore.AddAsync(cert, store == CertificateStoreName.Application ?\n                    Password : password, ct).ConfigureAwait(false);\n\n                if (store == CertificateStoreName.Application)\n                {\n                    //\n                    // Work around the bad API in the opc ua stack as certs should be a store\n                    // not list of identifiers. Update the list of identifiers here.\n                    //\n                    var existing = Value.SecurityConfiguration.ApplicationCertificates;\n                    var certId = new CertificateIdentifier(cert);\n                    certId.CertificateType = DetermineCertificateType(cert);\n                    certId.StorePath = certStore.StorePath;\n                    certId.StoreType = certStore.StoreType;\n                    existing.Insert(0, certId);\n                    Value.SecurityConfiguration.ApplicationCertificates = existing;\n\n                    if (_options.Value.Security.AddAppCertToTrustedStore == true)\n                    {\n                        using var trustedCert = new X509Certificate2(cert);\n                        using var trustedStore = await OpenAsync(CertificateStoreName.Trusted).ConfigureAwait(false);\n                        await trustedStore.AddAsync(trustedCert, ct: ct).ConfigureAwait(false);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.AddCertificateFailed(ex, cert.Thumbprint, store.ToString());\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask AddCertificateRevocationListAsync(CertificateStoreName store, byte[] crl,\n            CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            using var certStore = await OpenAsync(store).ConfigureAwait(false);\n            if (!certStore.SupportsCRLs)\n            {\n                throw new NotSupportedException(\"Store does not support revocation lists\");\n            }\n            try\n            {\n                _logger.AddCrl(store.ToString());\n                await certStore.AddCRLAsync(new X509CRL(crl), ct).ConfigureAwait(false);\n            }\n            catch (Exception ex)\n            {\n                _logger.AddCrlFailed(ex, store.ToString());\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask ApproveRejectedCertificateAsync(string thumbprint, CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            thumbprint = SanitizeThumbprint(thumbprint);\n            using var rejected = await OpenAsync(CertificateStoreName.Rejected).ConfigureAwait(false);\n            var certCollection = await rejected.FindByThumbprintAsync(thumbprint, ct).ConfigureAwait(false);\n            if (certCollection.Count == 0)\n            {\n                throw new ResourceNotFoundException(\"Certificate not found\");\n            }\n            var trustedCert = certCollection[0];\n            thumbprint = trustedCert.Thumbprint;\n            try\n            {\n                using var trusted = await OpenAsync(CertificateStoreName.Trusted).ConfigureAwait(false);\n                certCollection = await trusted.FindByThumbprintAsync(thumbprint, ct).ConfigureAwait(false);\n                if (certCollection.Count != 0)\n                {\n                    // This should not happen but maybe a previous approval aborted half-way.\n                    _logger.RejectedCertInTrustedStore();\n                    await trusted.DeleteAsync(thumbprint, ct).ConfigureAwait(false);\n                }\n\n                // Add the trusted cert and remove from rejected\n                await trusted.AddAsync(trustedCert, ct: ct).ConfigureAwait(false);\n                if (!await rejected.DeleteAsync(thumbprint, ct).ConfigureAwait(false))\n                {\n                    // Try revert back...\n                    await trusted.DeleteAsync(thumbprint, ct).ConfigureAwait(false);\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.ApproveCertificateFailed(ex, thumbprint);\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask AddCertificateChainAsync(byte[] certificateChain,\n            bool isSslCertificate, CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            var chain = Utils.ParseCertificateChainBlob(certificateChain)?\n                .Cast<X509Certificate2>()\n                .Reverse()\n                .ToList();\n            if (chain == null || chain.Count == 0)\n            {\n                throw new ArgumentNullException(nameof(certificateChain));\n            }\n            var configuration = await _configuration.ConfigureAwait(false);\n            var x509Certificate = chain[0];\n            try\n            {\n                _logger.AddToTrustedStore(x509Certificate.Thumbprint, x509Certificate.Subject);\n\n                if (isSslCertificate)\n                {\n                    await configuration.SecurityConfiguration.TrustedHttpsCertificates\n                        .AddAsync(x509Certificate.YieldReturn(), ct: ct).ConfigureAwait(false);\n                    chain.RemoveAt(0);\n                    if (chain.Count > 0)\n                    {\n                        await configuration.SecurityConfiguration.HttpsIssuerCertificates\n                            .AddAsync(chain, ct: ct).ConfigureAwait(false);\n                    }\n                }\n                else\n                {\n                    await configuration.SecurityConfiguration.TrustedPeerCertificates\n                        .AddAsync(x509Certificate.YieldReturn(), ct: ct).ConfigureAwait(false);\n                    chain.RemoveAt(0);\n                    if (chain.Count > 0)\n                    {\n                        await configuration.SecurityConfiguration.TrustedIssuerCertificates\n                            .AddAsync(chain, ct: ct).ConfigureAwait(false);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.AddToTrustedStoreFailed(ex, x509Certificate.Thumbprint, x509Certificate.Subject);\n                throw;\n            }\n            finally\n            {\n                chain?.ForEach(c => c?.Dispose());\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask RemoveCertificateAsync(CertificateStoreName store, string thumbprint,\n            CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            thumbprint = SanitizeThumbprint(thumbprint);\n            using var certStore = await OpenAsync(store).ConfigureAwait(false);\n            try\n            {\n                _logger.RemoveCertificate(thumbprint, store.ToString());\n                var certCollection = await certStore.FindByThumbprintAsync(thumbprint, ct).ConfigureAwait(false);\n                if (certCollection.Count == 0)\n                {\n                    throw new ResourceNotFoundException(\"Certificate not found.\");\n                }\n\n                // delete all CRLs signed by cert\n                var crlsToDelete = new X509CRLCollection();\n                foreach (var crl in await certStore.EnumerateCRLsAsync(ct).ConfigureAwait(false)\n                )\n                {\n                    foreach (var cert in certCollection)\n                    {\n                        if (X509Utils.CompareDistinguishedName(cert.SubjectName, crl.IssuerName) &&\n                            crl.VerifySignature(cert, false))\n                        {\n                            crlsToDelete.Add(crl);\n                            break;\n                        }\n                    }\n                }\n\n                if (store == CertificateStoreName.Application)\n                {\n                    var existing = Value.SecurityConfiguration.ApplicationCertificates;\n                    existing.RemoveAll(c => c.Thumbprint == thumbprint);\n                    Value.SecurityConfiguration.ApplicationCertificates = existing;\n                }\n\n                if (!await certStore.DeleteAsync(thumbprint, ct).ConfigureAwait(false))\n                {\n                    throw new ResourceNotFoundException(\"Certificate not found.\");\n                }\n                foreach (var crl in crlsToDelete)\n                {\n                    if (!await certStore.DeleteCRLAsync(crl, ct).ConfigureAwait(false))\n                    {\n                        // intentionally ignore errors, try best effort\n                        _logger.DeleteCrlFailed(crl.ToString());\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.RemoveCertificateFailed(ex, thumbprint, store.ToString());\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask CleanAsync(CertificateStoreName store, CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            using var certStore = await OpenAsync(store).ConfigureAwait(false);\n            try\n            {\n                _logger.RemoveAllCertificates(store.ToString());\n                foreach (var certs in await certStore.EnumerateAsync(ct).ConfigureAwait(false))\n                {\n                    if (!await certStore.DeleteAsync(certs.Thumbprint, ct).ConfigureAwait(false))\n                    {\n                        // intentionally ignore errors, try best effort\n                        _logger.DeleteCertificateFailed(certs.Thumbprint);\n                    }\n                }\n                foreach (var crl in await certStore.EnumerateCRLsAsync(ct).ConfigureAwait(false))\n                {\n                    if (!await certStore.DeleteCRLAsync(crl, ct).ConfigureAwait(false))\n                    {\n                        // intentionally ignore errors, try best effort\n                        _logger.DeleteCrlFailed(crl.ToString());\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.ClearStoreFailed(ex, store.ToString());\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask RemoveCertificateRevocationListAsync(CertificateStoreName store, byte[] crl,\n            CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            using var certStore = await OpenAsync(store).ConfigureAwait(false);\n            if (!certStore.SupportsCRLs)\n            {\n                throw new NotSupportedException(\"Store does not support revocation lists\");\n            }\n            try\n            {\n                _logger.AddCrl(store.ToString());\n                await certStore.DeleteCRLAsync(new X509CRL(crl), ct).ConfigureAwait(false);\n            }\n            catch (Exception ex)\n            {\n                _logger.DeleteCrlStoreFailed(ex, store.ToString());\n                throw;\n            }\n        }\n\n        /// <inheritdoc/>\n        public string GetPassword(CertificateIdentifier certificateIdentifier)\n        {\n            return Password;\n        }\n\n        /// <summary>\n        /// Build application configuration\n        /// </summary>\n        /// <exception cref=\"InvalidProgramException\"></exception>\n        /// <exception cref=\"InvalidConfigurationException\"></exception>\n        /// <returns></returns>\n        private async Task<ApplicationConfiguration> BuildAsync()\n        {\n            Debug.Assert(!string.IsNullOrWhiteSpace(_options.Value.ApplicationName));\n\n            var appInstance = new ApplicationInstance\n            {\n                ApplicationName = _options.Value.ApplicationName,\n                ApplicationType = Opc.Ua.ApplicationType.Client\n            };\n\n            Exception innerException = new InvalidConfigurationException(\"Missing network.\");\n            for (var attempt = 0; attempt < 60; attempt++)\n            {\n                // wait with the configuration until network is up\n                if (!NetworkInterface.GetIsNetworkAvailable())\n                {\n                    _logger.NetworkNotAvailable();\n                    await Task.Delay(3000).ConfigureAwait(false);\n                    continue;\n                }\n\n                var hostname = !string.IsNullOrWhiteSpace(_identity) ?\n                    Uri.CheckHostName(_identity) != UriHostNameType.Unknown ? _identity :\n#pragma warning disable CA5350 // Do Not Use Weak Cryptographic Algorithms\n                    new IPAddress(SHA1.HashData(Encoding.UTF8.GetBytes(_identity))\n                        .AsSpan()[..16], 0).ToString() :\n#pragma warning restore CA5350 // Do Not Use Weak Cryptographic Algorithms\n                    Utils.GetHostName();\n\n                var applicationUri = _options.Value.ApplicationUri;\n                if (_options.Value.Security.TryUseConfigurationFromExistingAppCert == true)\n                {\n                    (applicationUri, appInstance.ApplicationName, hostname) =\n                        await UpdateFromExistingCertificateAsync(\n                            applicationUri, appInstance.ApplicationName, hostname,\n                            _options.Value.Security).ConfigureAwait(false);\n                }\n                if (applicationUri == null)\n                {\n                    applicationUri = $\"urn:{hostname}:opc-publisher\";\n                }\n                else\n                {\n                    applicationUri = applicationUri.Replace(\"urn:localhost\", $\"urn:{hostname}\",\n                        StringComparison.Ordinal);\n                }\n                var appBuilder = appInstance.Build(applicationUri, _options.Value.ProductUri)\n                    .SetTransportQuotas(ToTransportQuotas(_options.Value.Quotas))\n                    .AsClient();\n                try\n                {\n                    var appConfig = await BuildSecurityConfigurationAsync(appBuilder,\n                        _options.Value.Security, appInstance.ApplicationConfiguration, hostname)\n                        .ConfigureAwait(false);\n\n                    var ownCertificate =\n                        appConfig.SecurityConfiguration.ApplicationCertificate.Certificate;\n\n                    if (ownCertificate == null)\n                    {\n                        _logger.CreateSelfSignedCert();\n                    }\n                    else\n                    {\n                        _logger.OwnCertificateLoaded(ownCertificate.Subject, ownCertificate.Thumbprint);\n                    }\n\n                    var hasAppCertificate =\n                        await appInstance.CheckApplicationInstanceCertificatesAsync(true).ConfigureAwait(false);\n                    if (!hasAppCertificate ||\n                        appConfig.SecurityConfiguration.ApplicationCertificate.Certificate == null)\n                    {\n                        _logger.LoadCertificateFailed();\n                        throw new InvalidConfigurationException(\n                            \"OPC UA application own certificate invalid\");\n                    }\n\n                    if (ownCertificate == null)\n                    {\n                        ownCertificate =\n                            appConfig.SecurityConfiguration.ApplicationCertificate.Certificate;\n                        _logger.OwnCertificateCreated(ownCertificate.Subject, ownCertificate.Thumbprint);\n                    }\n                    await ShowCertificateStoreInformationAsync(appConfig).ConfigureAwait(false);\n                    return appInstance.ApplicationConfiguration;\n                }\n                catch (Exception e)\n                {\n                    _logger.ConfigureStackRetry(e.Message);\n                    _logger.ConfigureStackDebug(e);\n                    innerException = e;\n\n                    await Task.Delay(3000).ConfigureAwait(false);\n                }\n            }\n\n            _logger.ConfigureStackFailed();\n            throw new InvalidProgramException(\"OPC UA stack configuration not possible.\",\n                innerException);\n\n            async ValueTask<(string?, string, string)> UpdateFromExistingCertificateAsync(\n                string? applicationUri, string appName, string hostName, SecurityOptions options)\n            {\n                try\n                {\n                    var now = _timeProvider.GetUtcNow();\n                    if (options.ApplicationCertificates?.StorePath != null &&\n                        options.ApplicationCertificates.StoreType != null)\n                    {\n                        using var certStore = CertificateStoreIdentifier.CreateStore(\n                            options.ApplicationCertificates.StoreType);\n                        certStore.Open(options.ApplicationCertificates.StorePath, false);\n                        var certs = await certStore.EnumerateAsync().ConfigureAwait(false);\n                        var subjects = new List<string>();\n                        foreach (var cert in certs.Where(c => c != null).OrderBy(c => c.NotAfter))\n                        {\n                            // Select first certificate that has valid information\n                            options.ApplicationCertificates.SubjectName = cert.Subject;\n                            var name = cert.SubjectName.EnumerateRelativeDistinguishedNames()\n                                .Where(dn => dn.GetSingleElementType().FriendlyName == \"CN\")\n                                .Select(dn => dn.GetSingleElementValue())\n                                .FirstOrDefault(dn => dn != null);\n                            if (name != null)\n                            {\n                                appName = name;\n                            }\n                            var san = cert.FindExtension<X509SubjectAltNameExtension>();\n                            var uris = san?.Uris;\n                            var hostNames = san?.DomainNames;\n                            if (uris != null && hostNames != null &&\n                                uris.Count > 0 && hostNames.Count > 0)\n                            {\n                                return (uris[0], appName, hostNames[0]);\n                            }\n                            _logger.InvalidCertFound(cert.Subject, cert.Thumbprint);\n                        }\n                    }\n                    _logger.NoCertFound();\n                }\n                catch (Exception ex)\n                {\n                    _logger.FindCertFailed(ex);\n                }\n                return (applicationUri, appName, hostName);\n            }\n        }\n\n        /// <summary>\n        /// Show all certificates in the certificate stores.\n        /// </summary>\n        /// <param name=\"appConfig\"></param>\n        private async ValueTask ShowCertificateStoreInformationAsync(\n            ApplicationConfiguration appConfig)\n        {\n            // show application certs\n            try\n            {\n                using var certStore =\n                    appConfig.SecurityConfiguration.ApplicationCertificate.OpenStore();\n                var certs = await certStore.EnumerateAsync().ConfigureAwait(false);\n                var certNum = 1;\n                _logger.OwnStoreCount(certs.Count);\n                foreach (var cert in certs)\n                {\n                    _logger.CertificateInfo(certNum++, cert.Subject, cert.Thumbprint);\n                }\n            }\n            catch (Exception e)\n            {\n                _logger.ReadStoreFailed(e);\n            }\n\n            // show trusted issuer certs\n            try\n            {\n                using var certStore = appConfig.SecurityConfiguration\n                    .TrustedIssuerCertificates.OpenStore();\n                var certs = await certStore.EnumerateAsync().ConfigureAwait(false);\n                var certNum = 1;\n                _logger.TrustedIssuerCount(certs.Count);\n                foreach (var cert in certs)\n                {\n                    _logger.CertificateInfo(certNum++, cert.Subject, cert.Thumbprint);\n                }\n                if (certStore.SupportsCRLs)\n                {\n                    var crls = await certStore.EnumerateCRLsAsync().ConfigureAwait(false);\n                    var crlNum = 1;\n                    _logger.TrustedIssuerCrlCount(crls.Count);\n                    foreach (var crl in crls)\n                    {\n                        _logger.TrustedIssuerCrlInfo(crlNum++, crl.Issuer, crl.NextUpdate);\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                _logger.TrustedIssuerStoreFailed(e);\n            }\n\n            // show trusted peer certs\n            try\n            {\n                using var certStore = appConfig.SecurityConfiguration\n                    .TrustedPeerCertificates.OpenStore();\n                var certs = await certStore.EnumerateAsync().ConfigureAwait(false);\n                var certNum = 1;\n                _logger.TrustedPeerCount(certs.Count);\n                foreach (var cert in certs)\n                {\n                    _logger.CertificateInfo(certNum++, cert.Subject, cert.Thumbprint);\n                }\n                if (certStore.SupportsCRLs)\n                {\n                    var crls = await certStore.EnumerateCRLsAsync().ConfigureAwait(false);\n                    var crlNum = 1;\n                    _logger.TrustedPeerCrlCount(crls.Count);\n                    foreach (var crl in crls)\n                    {\n                        _logger.TrustedPeerCrlInfo(crlNum++, crl.Issuer, crl.NextUpdate);\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                _logger.TrustedPeerStoreFailed(e);\n            }\n\n            // show rejected peer certs\n            try\n            {\n                using var certStore = appConfig.SecurityConfiguration\n                    .RejectedCertificateStore.OpenStore();\n                var certs = await certStore.EnumerateAsync().ConfigureAwait(false);\n                var certNum = 1;\n                _logger.RejectedStoreCount(certs.Count);\n                foreach (var cert in certs)\n                {\n                    _logger.CertificateInfo(certNum++, cert.Subject, cert.Thumbprint);\n                }\n            }\n            catch (Exception e)\n            {\n                _logger.RejectedStoreFailed(e);\n            }\n        }\n\n        /// <summary>\n        /// Convert to transport quota\n        /// </summary>\n        /// <param name=\"options\"></param>\n        /// <returns></returns>\n        private static TransportQuotas ToTransportQuotas(TransportOptions options)\n        {\n            return new TransportQuotas\n            {\n                OperationTimeout = options.OperationTimeout,\n                MaxStringLength = options.MaxStringLength,\n                MaxByteStringLength = options.MaxByteStringLength,\n                MaxArrayLength = options.MaxArrayLength,\n                MaxMessageSize = options.MaxMessageSize,\n                MaxBufferSize = options.MaxBufferSize,\n                ChannelLifetime = options.ChannelLifetime,\n                SecurityTokenLifetime = options.SecurityTokenLifetime\n            };\n        }\n\n        /// <summary>\n        /// Builds and applies the security configuration according to the local settings.\n        /// Returns a the configuration application ready to use for initialization of\n        /// the OPC UA SDK client object.\n        /// </summary>\n        /// <remarks>\n        /// Please note the input argument <cref>applicationConfiguration</cref> will\n        /// be altered during execution with the locally provided security configuration\n        /// and shall not be used after calling this method.\n        /// </remarks>\n        /// <param name=\"applicationConfigurationBuilder\"></param>\n        /// <param name=\"securityOptions\"></param>\n        /// <param name=\"applicationConfiguration\"></param>\n        /// <param name=\"hostname\"></param>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        /// <exception cref=\"ArgumentException\"></exception>\n        private async ValueTask<ApplicationConfiguration> BuildSecurityConfigurationAsync(\n            IApplicationConfigurationBuilderClientSelected applicationConfigurationBuilder,\n            SecurityOptions securityOptions, ApplicationConfiguration applicationConfiguration,\n            string? hostname = null)\n        {\n            var subjectName = securityOptions.ApplicationCertificates?.SubjectName;\n            if (hostname != null && subjectName != null)\n            {\n                subjectName = subjectName.Replace(\"localhost\", hostname,\n                    StringComparison.InvariantCulture);\n            }\n            var storeType = securityOptions.ApplicationCertificates?.StoreType;\n            var storePath = securityOptions.ApplicationCertificates?.StorePath;\n            var applicationCerts = new CertificateIdentifierCollection\n            {\n                new CertificateIdentifier\n                {\n                    StoreType = storeType,\n                    StorePath = storePath,\n                    SubjectName = subjectName,\n                    CertificateType = ObjectTypeIds.RsaSha256ApplicationCertificateType\n                },\n                new CertificateIdentifier\n                {\n                    StoreType = storeType,\n                    StorePath = storePath,\n                    SubjectName = subjectName,\n                    CertificateType = ObjectTypeIds.EccNistP256ApplicationCertificateType\n                },\n                new CertificateIdentifier\n                {\n                    StoreType = storeType,\n                    StorePath = storePath,\n                    SubjectName = subjectName,\n                    CertificateType = ObjectTypeIds.EccNistP384ApplicationCertificateType\n#if NOT_LINUX // Not supported\n                },\n                new CertificateIdentifier\n                {\n                    StoreType = storeType,\n                    StorePath = storePath,\n                    SubjectName = subjectName,\n                    CertificateType = ObjectTypeIds.EccBrainpoolP256r1ApplicationCertificateType\n                },\n                new CertificateIdentifier\n                {\n                    StoreType = storeType,\n                    StorePath = storePath,\n                    SubjectName = subjectName,\n                    CertificateType = ObjectTypeIds.EccBrainpoolP384r1ApplicationCertificateType\n#endif\n                }\n            };\n            var options = applicationConfigurationBuilder\n                .AddSecurityConfiguration(applicationCerts,\n                    securityOptions.PkiRootPath)\n                .SetAutoAcceptUntrustedCertificates(\n                    securityOptions.AutoAcceptUntrustedCertificates ?? false)\n                .SetRejectSHA1SignedCertificates(\n                    securityOptions.RejectSha1SignedCertificates ?? true)\n                .SetMinimumCertificateKeySize(\n                    securityOptions.MinimumCertificateKeySize)\n                .AddCertificatePasswordProvider(this)\n                .SetAddAppCertToTrustedStore(\n                    securityOptions.AddAppCertToTrustedStore ?? true)\n                .SetRejectUnknownRevocationStatus(\n                    securityOptions.RejectUnknownRevocationStatus ?? true);\n\n            // Allow private keys in this store so user identities can be side loaded\n            applicationConfiguration.SecurityConfiguration.TrustedUserCertificates =\n                new TrustedUserCertificateStore();\n\n            applicationConfiguration.SecurityConfiguration.ApplicationCertificates\n                .ApplyLocalConfig(securityOptions.ApplicationCertificates);\n            applicationConfiguration.SecurityConfiguration.TrustedPeerCertificates\n                .ApplyLocalConfig(securityOptions.TrustedPeerCertificates);\n            applicationConfiguration.SecurityConfiguration.TrustedIssuerCertificates\n                .ApplyLocalConfig(securityOptions.TrustedIssuerCertificates);\n            applicationConfiguration.SecurityConfiguration.RejectedCertificateStore\n                .ApplyLocalConfig(securityOptions.RejectedCertificateStore);\n            applicationConfiguration.SecurityConfiguration.TrustedUserCertificates\n                .ApplyLocalConfig(securityOptions.TrustedUserCertificates);\n            applicationConfiguration.SecurityConfiguration.TrustedHttpsCertificates\n                .ApplyLocalConfig(securityOptions.TrustedHttpsCertificates);\n            applicationConfiguration.SecurityConfiguration.HttpsIssuerCertificates\n                .ApplyLocalConfig(securityOptions.HttpsIssuerCertificates);\n            applicationConfiguration.SecurityConfiguration.UserIssuerCertificates\n                .ApplyLocalConfig(securityOptions.UserIssuerCertificates);\n\n            return await options.CreateAsync().ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Open store\n        /// </summary>\n        /// <param name=\"store\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        private async ValueTask<ICertificateStore> OpenAsync(CertificateStoreName store)\n        {\n            var configuration = await _configuration.ConfigureAwait(false);\n            var security = configuration.SecurityConfiguration;\n            switch (store)\n            {\n                case CertificateStoreName.Application:\n                    return security.ApplicationCertificates.OpenStore(_options.Value.Security);\n                case CertificateStoreName.Trusted:\n                    Debug.Assert(security.TrustedPeerCertificates != null);\n                    return security.TrustedPeerCertificates.OpenStore();\n                case CertificateStoreName.Rejected:\n                    Debug.Assert(security.RejectedCertificateStore != null);\n                    return security.RejectedCertificateStore.OpenStore();\n                case CertificateStoreName.Issuer:\n                    Debug.Assert(security.TrustedIssuerCertificates != null);\n                    return security.TrustedIssuerCertificates.OpenStore();\n                case CertificateStoreName.User:\n                    Debug.Assert(security.TrustedUserCertificates != null);\n                    return security.TrustedUserCertificates.OpenStore();\n                case CertificateStoreName.UserIssuer:\n                    Debug.Assert(security.UserIssuerCertificates != null);\n                    return security.UserIssuerCertificates.OpenStore();\n                case CertificateStoreName.Https:\n                    Debug.Assert(security.TrustedHttpsCertificates != null);\n                    return security.TrustedHttpsCertificates.OpenStore();\n                case CertificateStoreName.HttpsIssuer:\n                    Debug.Assert(security.HttpsIssuerCertificates != null);\n                    return security.HttpsIssuerCertificates.OpenStore();\n                default:\n                    throw new ArgumentException(\n                        $\"Bad unknown certificate store {store} specified.\");\n            }\n        }\n\n        /// <summary>\n        /// Try determining type of certificate\n        /// </summary>\n        /// <param name=\"cert\"></param>\n        /// <returns></returns>\n        private static NodeId? DetermineCertificateType(X509Certificate2 cert)\n        {\n            if (cert.GetRSAPublicKey() != null)\n            {\n                return ObjectTypeIds.RsaSha256ApplicationCertificateType;\n            }\n            var ecdsa = cert.GetECDsaPublicKey();\n            if (ecdsa != null)\n            {\n                var parameters = ecdsa.ExportParameters(false);\n                if (parameters.Curve.Oid.Value == ECCurve.NamedCurves.nistP256.Oid.Value)\n                {\n                    return ObjectTypeIds.EccNistP256ApplicationCertificateType;\n                }\n                else if (parameters.Curve.Oid.Value == ECCurve.NamedCurves.nistP384.Oid.Value)\n                {\n                    return ObjectTypeIds.EccNistP384ApplicationCertificateType;\n                }\n                else if (parameters.Curve.Oid.Value == ECCurve.NamedCurves.brainpoolP256r1.Oid.Value)\n                {\n                    return ObjectTypeIds.EccBrainpoolP256r1ApplicationCertificateType;\n                }\n                else if (parameters.Curve.Oid.Value == ECCurve.NamedCurves.brainpoolP384r1.Oid.Value)\n                {\n                    return ObjectTypeIds.EccBrainpoolP384r1ApplicationCertificateType;\n                }\n                else\n                {\n                    return ObjectTypeIds.EccApplicationCertificateType;\n                }\n            }\n            return null;\n        }\n\n        private static string SanitizeThumbprint(string thumbprint)\n        {\n            if (thumbprint.Length > kMaxThumbprintLength)\n            {\n                throw new ArgumentException(\"Bad thumbprint\", nameof(thumbprint));\n            }\n            return thumbprint.ReplaceLineEndings(string.Empty);\n        }\n\n        /// <summary>\n        /// Override to support private keys\n        /// </summary>\n        private class TrustedUserCertificateStore : CertificateTrustList\n        {\n            /// <inheritdoc/>\n            public override ICertificateStore OpenStore()\n            {\n                var store = CreateStore(StoreType);\n                store.Open(StorePath, false); // Allow private keys\n                return store;\n            }\n        }\n\n        private const int kMaxThumbprintLength = 64;\n        private readonly Task<ApplicationConfiguration> _configuration;\n        private readonly ILogger<OpcUaApplication> _logger;\n        private readonly IOptions<OpcUaClientOptions> _options;\n        private readonly TimeProvider _timeProvider;\n        private readonly string? _identity;\n        private bool _disposed;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaApplication\n    /// </summary>\n    internal static partial class OpcUaApplicationLogging\n    {\n        private const int EventClass = 400;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Add Certificate {Thumbprint} to {Store}...\")]\n        public static partial void AddCertificate(this ILogger logger, string thumbprint, string store);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Failed to add Certificate {Thumbprint} to {Store}...\")]\n        public static partial void AddCertificateFailed(this ILogger logger, Exception ex, string thumbprint, string store);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Add Certificate revocation list to {Store}...\")]\n        public static partial void AddCrl(this ILogger logger, string store);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"Failed to add Certificate revocation to {Store}...\")]\n        public static partial void AddCrlFailed(this ILogger logger, Exception ex, string store);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"Found rejected cert already in trusted store. Deleting...\")]\n        public static partial void RejectedCertInTrustedStore(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"Failed to approve Certificate {Thumbprint}...\")]\n        public static partial void ApproveCertificateFailed(this ILogger logger, Exception ex, string thumbprint);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Adding Certificate {Thumbprint}, {Subject} to trusted store...\")]\n        public static partial void AddToTrustedStore(this ILogger logger, string thumbprint, string subject);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Error,\n            Message = \"Failed to add Certificate chain {Thumbprint}, {Subject} to trusted store.\")]\n        public static partial void AddToTrustedStoreFailed(this ILogger logger, Exception ex, string thumbprint, string subject);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"Removing Certificate {Thumbprint} from {Store}...\")]\n        public static partial void RemoveCertificate(this ILogger logger, string thumbprint, string store);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Error,\n            Message = \"Failed to delete {Crl}.\")]\n        public static partial void DeleteCrlFailed(this ILogger logger, string? crl);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Error,\n            Message = \"Failed to remove Certificate {Thumbprint} from {Store}...\")]\n        public static partial void RemoveCertificateFailed(this ILogger logger, Exception ex, string thumbprint, string store);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"Removing all Certificate from {Store}...\")]\n        public static partial void RemoveAllCertificates(this ILogger logger, string store);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Error,\n            Message = \"Failed to clear {Store} store.\")]\n        public static partial void ClearStoreFailed(this ILogger logger, Exception ex, string store);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Error,\n            Message = \"Failed to delete Certificate revocation in {Store}...\")]\n        public static partial void DeleteCrlStoreFailed(this ILogger logger, Exception ex, string store);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Information,\n            Message = \"No application own certificate found. Creating a self-signed certificate.\")]\n        public static partial void CreateSelfSignedCert(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Information,\n            Message = \"Own certificate Subject '{Subject}' (Thumbprint: {Thumbprint}) loaded.\")]\n        public static partial void OwnCertificateLoaded(this ILogger logger, string subject, string thumbprint);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Error,\n            Message = \"Failed to load or create application own certificate.\")]\n        public static partial void LoadCertificateFailed(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Information,\n            Message = \"Own certificate Subject '{Subject}' (Thumbprint: {Thumbprint}) created.\")]\n        public static partial void OwnCertificateCreated(this ILogger logger, string subject, string thumbprint);\n\n        [LoggerMessage(EventId = EventClass + 19, Level = LogLevel.Information,\n            Message = \"Error {Message} while configuring OPC UA stack - retry...\")]\n        public static partial void ConfigureStackRetry(this ILogger logger, string message);\n\n        [LoggerMessage(EventId = EventClass + 20, Level = LogLevel.Debug,\n            Message = \"Detailed error while configuring OPC UA stack.\")]\n        public static partial void ConfigureStackDebug(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 21, Level = LogLevel.Critical,\n            Message = \"Failed to configure OPC UA stack - exit.\")]\n        public static partial void ConfigureStackFailed(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 22, Level = LogLevel.Debug,\n            Message = \"Found invalid certificate for {Subject} [{Thumbprint}].\")]\n        public static partial void InvalidCertFound(this ILogger logger, string subject, string thumbprint);\n\n        [LoggerMessage(EventId = EventClass + 23, Level = LogLevel.Debug,\n            Message = \"Could not find a certificate to take information from.\")]\n        public static partial void NoCertFound(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 24, Level = LogLevel.Debug,\n            Message = \"Failed to find a certificate to take information from.\")]\n        public static partial void FindCertFailed(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 25, Level = LogLevel.Information,\n            Message = \"Application own certificate store contains {Count} certs.\")]\n        public static partial void OwnStoreCount(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 26, Level = LogLevel.Information,\n            Message = \"{CertNum:D2}: Subject '{Subject}' (Thumbprint: {Thumbprint})\")]\n        public static partial void CertificateInfo(this ILogger logger, int certNum, string subject, string thumbprint);\n\n        [LoggerMessage(EventId = EventClass + 27, Level = LogLevel.Error,\n            Message = \"Error while trying to read information from application store.\")]\n        public static partial void ReadStoreFailed(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 28, Level = LogLevel.Information,\n            Message = \"Trusted issuer store contains {Count} certs.\")]\n        public static partial void TrustedIssuerCount(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 29, Level = LogLevel.Information,\n            Message = \"Trusted issuer store has {Count} CRLs.\")]\n        public static partial void TrustedIssuerCrlCount(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 30, Level = LogLevel.Information,\n            Message = \"{CrlNum:D2}: Issuer '{Issuer}', Next update time '{NextUpdate}'\")]\n        public static partial void TrustedIssuerCrlInfo(this ILogger logger, int crlNum, string issuer, DateTime nextUpdate);\n\n        [LoggerMessage(EventId = EventClass + 31, Level = LogLevel.Error,\n            Message = \"Error while trying to read information from trusted issuer store.\")]\n        public static partial void TrustedIssuerStoreFailed(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 32, Level = LogLevel.Information,\n            Message = \"Trusted peer store contains {Count} certs.\")]\n        public static partial void TrustedPeerCount(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 33, Level = LogLevel.Information,\n            Message = \"Trusted peer store has {Count} CRLs.\")]\n        public static partial void TrustedPeerCrlCount(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 34, Level = LogLevel.Information,\n            Message = \"{CrlNum:D2}: Issuer '{Issuer}', Next update time '{NextUpdate}'\")]\n        public static partial void TrustedPeerCrlInfo(this ILogger logger, int crlNum, string issuer, DateTime nextUpdate);\n\n        [LoggerMessage(EventId = EventClass + 35, Level = LogLevel.Error,\n            Message = \"Error while trying to read information from trusted peer store.\")]\n        public static partial void TrustedPeerStoreFailed(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 36, Level = LogLevel.Information,\n            Message = \"Rejected certificate store contains {Count} certs.\")]\n        public static partial void RejectedStoreCount(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 37, Level = LogLevel.Error,\n            Message = \"Error while trying to read information from rejected certificate store.\")]\n        public static partial void RejectedStoreFailed(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 38, Level = LogLevel.Warning,\n            Message = \"Network not available...\")]\n        public static partial void NetworkNotAvailable(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 39, Level = LogLevel.Error,\n            Message = \"Failed to delete {Certificate}.\")]\n        public static partial void DeleteCertificateFailed(this ILogger logger, string? certificate);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClient.Browser.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Channels;\n    using System.Threading.Tasks;\n\n    internal sealed partial class OpcUaClient\n    {\n        /// <summary>\n        /// Create a browser to browse the address space and provide\n        /// the differences from last browsing operation.\n        /// </summary>\n        /// <param name=\"rebrowsePeriod\"></param>\n        /// <param name=\"subscriptionName\"></param>\n        /// <returns></returns>\n        internal IOpcUaBrowser Browse(TimeSpan rebrowsePeriod, string subscriptionName)\n        {\n            return Browser.Register(this, rebrowsePeriod, subscriptionName);\n        }\n\n        /// <summary>\n        /// Browser utility class\n        /// </summary>\n        private sealed class Browser : IAsyncDisposable, IOpcUaBrowser\n        {\n            /// <summary>\n            /// Reference changes\n            /// </summary>\n            public event EventHandler<Change<ReferenceDescription>>? OnReferenceChange;\n\n            /// <summary>\n            /// Node changes\n            /// </summary>\n            public event EventHandler<Change<Node>>? OnNodeChange;\n\n            /// <summary>\n            /// Create browser\n            /// </summary>\n            /// <param name=\"client\"></param>\n            /// <param name=\"subscriptionId\"></param>\n            /// <param name=\"browseDelay\"></param>\n            private Browser(OpcUaClient client, string subscriptionId, TimeSpan browseDelay)\n            {\n                _client = client;\n                _logger = client._logger;\n                _subscriptionId = subscriptionId;\n                _browseDelay = browseDelay == TimeSpan.Zero ? Timeout.InfiniteTimeSpan : browseDelay;\n                _channel = Channel.CreateUnbounded<bool>();\n\n                // Order is important\n                _rebrowseTimer = _client._timeProvider.CreateTimer(_ => _channel.Writer.TryWrite(true),\n                    null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                _browser = RunAsync(_cts.Token);\n                _channel.Writer.TryWrite(true);\n            }\n\n            /// <inheritdoc/>\n            public async ValueTask CloseAsync()\n            {\n                if (Release())\n                {\n                    await DisposeAsync().ConfigureAwait(false);\n                }\n            }\n\n            /// <inheritdoc/>\n            public async ValueTask DisposeAsync()\n            {\n                if (!_disposed)\n                {\n                    _disposed = true;\n                    try\n                    {\n                        _rebrowseTimer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                        _channel.Writer.TryComplete();\n\n                        await _cts.CancelAsync().ConfigureAwait(false);\n\n                        await _browser.ConfigureAwait(false);\n                    }\n                    finally\n                    {\n                        _cts.Dispose();\n                        _rebrowseTimer.Dispose();\n                    }\n                }\n            }\n\n            /// <inheritdoc/>\n            public void Rebrowse()\n            {\n                _channel.Writer.TryWrite(true);\n            }\n\n            /// <summary>\n            /// Signal session connected\n            /// </summary>\n            public void OnConnected()\n            {\n                _channel.Writer.TryWrite(false);\n            }\n\n            /// <summary>\n            /// Continously browse\n            /// </summary>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            private async Task RunAsync(CancellationToken ct)\n            {\n                _logger.BrowserStartingContinuousBrowsing();\n                var sw = Stopwatch.StartNew();\n                try\n                {\n                    await foreach (var result in _channel.Reader.ReadAllAsync(ct).ConfigureAwait(false))\n                    {\n                        if (!result)\n                        {\n                            // Start browsing in 10 seconds\n                            _rebrowseTimer.Change(TimeSpan.FromSeconds(10), Timeout.InfiniteTimeSpan);\n                            continue;\n                        }\n\n                        _rebrowseTimer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                        try\n                        {\n                            var session = _client._session;\n                            if (session?.Connected != true)\n                            {\n                                continue;\n                            }\n\n                            _logger.BrowserBrowsingStarted(sw.Elapsed);\n                            sw.Restart();\n\n                            await BrowseAddressSpaceAsync(session, ct).ConfigureAwait(false);\n\n                            _logger.BrowserBrowsingCompleted(sw.Elapsed, _referencesAdded, _referencesRemoved, _nodesAdded, _nodesChanged, _nodesRemoved, _errors);\n                        }\n                        catch (ServiceResultException sre)\n                        {\n                            _logger.BrowserBrowsingCompletedWithError(sre.Message, sw.Elapsed, _referencesAdded, _referencesRemoved, _nodesAdded, _nodesChanged, _nodesRemoved, _errors);\n                            if (!_client.IsConnected)\n                            {\n                                _logger.BrowserNotConnectedWaiting();\n                                continue;\n                            }\n                            _logger.BrowserErrorOccurred(sre);\n                        }\n                        catch (OperationCanceledException)\n                        {\n                            break;\n                        }\n                        catch (Exception ex)\n                        {\n                            // Continue\n                            _logger.BrowserBrowsingException(ex, sw.Elapsed);\n                        }\n                        finally\n                        {\n                            sw.Restart();\n                            _referencesAdded = _referencesRemoved = 0;\n                            _nodesAdded = _nodesChanged = _nodesRemoved = 0;\n                            _errors = 0;\n                            _rebrowseTimer.Change(_browseDelay, Timeout.InfiniteTimeSpan);\n                        }\n                    }\n                    _logger.BrowserProcessExited();\n                }\n                catch (Exception e)\n                {\n                    _logger.BrowserProcessExitedUnexpected(e);\n                }\n            }\n\n            /// <summary>\n            /// Browse address space\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            private async Task BrowseAddressSpaceAsync(OpcUaSession session, CancellationToken ct)\n            {\n                var browseDescriptionCollection = CreateBrowseDescriptionCollection(\n                    (ObjectIds.RootFolder, new RelativePath()).YieldReturn());\n\n                // Browse\n                var foundReferences = new Dictionary<ReferenceDescription, (NodeId, RelativePath)>(\n                    Compare.Using<ReferenceDescription>(Utils.IsEqual));\n                var foundNodes = new Dictionary<NodeId, (RelativePath, Node)>();\n                try\n                {\n                    var searchDepth = 0;\n                    var maxNodesPerBrowse = session.OperationLimits.MaxNodesPerBrowse;\n                    while (browseDescriptionCollection.Count != 0 && searchDepth < kMaxSearchDepth)\n                    {\n                        searchDepth++;\n\n                        bool repeatBrowse;\n                        var allBrowseResults = new List<(NodeId, RelativePath, BrowseResult)>();\n                        var unprocessedOperations = new BrowseDescriptionCollection();\n                        BrowseResultCollection? browseResultCollection = null;\n                        do\n                        {\n                            var browseCollection = maxNodesPerBrowse == 0\n                                ? browseDescriptionCollection\n                                : browseDescriptionCollection.Take((int)maxNodesPerBrowse).ToArray();\n                            repeatBrowse = false;\n                            try\n                            {\n                                var browseResponse = await session.BrowseAsync(null, null,\n                                    kMaxReferencesPerNode, browseCollection, ct).ConfigureAwait(false);\n                                browseResultCollection = browseResponse.Results;\n                                ClientBase.ValidateResponse(browseResultCollection, browseCollection);\n                                ClientBase.ValidateDiagnosticInfos(\n                                    browseResponse.DiagnosticInfos, browseCollection);\n\n                                // seperate unprocessed nodes for later\n                                for (var index = 0; index < browseResultCollection.Count; index++)\n                                {\n                                    var browseResult = browseResultCollection[index];\n\n                                    // check for error.\n                                    var statusCode = browseResult.StatusCode;\n                                    if (StatusCode.IsBad(statusCode))\n                                    {\n                                        //\n                                        // this error indicates that the server does not have enough\n                                        // simultaneously active continuation points. This request will\n                                        // need to be re-sent after the other operations have been\n                                        // completed and their continuation points released.\n                                        //\n                                        if (statusCode == StatusCodes.BadNoContinuationPoints)\n                                        {\n                                            unprocessedOperations.Add(browseCollection[index]);\n                                            continue;\n                                        }\n                                    }\n                                    // save results.\n                                    allBrowseResults.Add((browseCollection[index].NodeId,\n                                        (RelativePath)browseCollection[index].Handle, browseResult));\n                                }\n                            }\n                            catch (ServiceResultException sre) when\n                                (sre.StatusCode == StatusCodes.BadEncodingLimitsExceeded ||\n                                 sre.StatusCode == StatusCodes.BadResponseTooLarge)\n                            {\n                                // try to address by overriding operation limit\n                                maxNodesPerBrowse = maxNodesPerBrowse == 0 ?\n                                    (uint)browseCollection.Count / 2 : maxNodesPerBrowse / 2;\n                                repeatBrowse = true;\n                            }\n                        }\n                        while (repeatBrowse);\n\n                        // Browse next\n                        Debug.Assert(browseResultCollection != null);\n                        var (nodeIds, continuationPoints) = PrepareBrowseNext(\n                            new NodeIdCollection(browseDescriptionCollection\n                                .Take(browseResultCollection.Count).Select(r => r.NodeId)),\n                            browseResultCollection);\n                        while (continuationPoints.Count != 0)\n                        {\n                            var browseNextResult = await session.BrowseNextAsync(null, false,\n                                continuationPoints, ct).ConfigureAwait(false);\n                            var browseNextResultCollection = browseNextResult.Results;\n                            ClientBase.ValidateResponse(browseNextResultCollection, continuationPoints);\n                            ClientBase.ValidateDiagnosticInfos(\n                                browseNextResult.DiagnosticInfos, continuationPoints);\n\n                            allBrowseResults.AddRange(browseNextResultCollection\n                                .Select((r, i) => (browseDescriptionCollection[i].NodeId,\n                                    (RelativePath)browseDescriptionCollection[i].Handle, r)));\n                            (nodeIds, continuationPoints) = PrepareBrowseNext(nodeIds, browseNextResultCollection);\n                        }\n\n                        if (maxNodesPerBrowse == 0)\n                        {\n                            browseDescriptionCollection.Clear();\n                        }\n                        else\n                        {\n                            browseDescriptionCollection = browseDescriptionCollection\n                                .Skip(browseResultCollection.Count)\n                                .ToArray();\n                        }\n\n                        static (NodeIdCollection, ByteStringCollection) PrepareBrowseNext(\n                            NodeIdCollection browseSourceCollection, BrowseResultCollection results)\n                        {\n                            var continuationPoints = new ByteStringCollection();\n                            var nodeIdCollection = new NodeIdCollection();\n                            for (var i = 0; i < results.Count; i++)\n                            {\n                                var browseResult = results[i];\n                                if (browseResult.ContinuationPoint != null)\n                                {\n                                    nodeIdCollection.Add(browseSourceCollection[i]);\n                                    continuationPoints.Add(browseResult.ContinuationPoint);\n                                }\n                            }\n                            return (nodeIdCollection, continuationPoints);\n                        }\n\n                        // Build browse request for next level\n                        var browseTable = new List<(NodeId, RelativePath)>();\n                        foreach (var (source, path, browseResult) in allBrowseResults)\n                        {\n                            var nodesToRead = new List<NodeId>();\n                            foreach (var reference in browseResult.References)\n                            {\n                                if (foundReferences.TryAdd(reference, (source, path)))\n                                {\n                                    if (!_knownReferences.Remove(reference))\n                                    {\n                                        // Send new reference\n                                        _referencesAdded++;\n                                        OnReferenceChange?.Invoke(session, CreateChange(source, path, null,\n                                            reference));\n                                    }\n                                    var targetNodeId = ExpandedNodeId.ToNodeId(reference.NodeId, session.NamespaceUris);\n                                    var targetPath = new RelativePath\n                                    {\n                                        Elements = new RelativePathElementCollection(path.Elements\n                                            .Append(new RelativePathElement\n                                            {\n                                                TargetName = reference.BrowseName,\n                                                IsInverse = false,\n                                                IncludeSubtypes = false,\n                                                ReferenceTypeId = reference.ReferenceTypeId\n                                            }))\n                                    };\n                                    browseTable.Add((targetNodeId, targetPath));\n                                    await ReadNodeAsync(session, targetNodeId, targetPath,\n                                        foundNodes, ct).ConfigureAwait(false);\n                                }\n                            }\n                        }\n                        browseDescriptionCollection.AddRange(CreateBrowseDescriptionCollection(browseTable));\n                        // add unprocessed nodes if any\n                        browseDescriptionCollection.AddRange(unprocessedOperations);\n                    }\n\n                    _referencesRemoved += _knownReferences.Count;\n                    foreach (var (removedReference, (nodeId, path)) in _knownReferences)\n                    {\n                        OnReferenceChange?.Invoke(session, CreateChange(nodeId, path, removedReference,\n                            null));\n                    }\n                    _knownReferences.Clear();\n\n                    _nodesRemoved += _knownNodes.Count;\n                    foreach (var (removedNodeId, (path, removedNode)) in _knownNodes)\n                    {\n                        OnNodeChange?.Invoke(session, CreateChange(removedNodeId, path, removedNode,\n                            null));\n                    }\n                    _knownNodes.Clear();\n                }\n                catch (OperationCanceledException) { return; }\n                catch (Exception ex)\n                {\n                    HandleException(foundReferences, foundNodes, ex);\n                    throw;\n                }\n                finally\n                {\n                    _knownReferences = foundReferences;\n                    _knownNodes = foundNodes;\n                }\n\n                static BrowseDescriptionCollection CreateBrowseDescriptionCollection(\n                    IEnumerable<(NodeId NodeId, RelativePath Position)> items)\n                {\n                    return new BrowseDescriptionCollection(items.Select(\n                        item => new BrowseDescription\n                        {\n                            Handle = item.Position,\n                            BrowseDirection = Opc.Ua.BrowseDirection.Forward,\n                            ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,\n                            IncludeSubtypes = true,\n                            NodeId = item.NodeId,\n                            NodeClassMask = 0,\n                            ResultMask = (uint)BrowseResultMask.All\n                        }));\n                }\n\n                void HandleException(Dictionary<ReferenceDescription, (NodeId, RelativePath)> foundReferences,\n                    Dictionary<NodeId, (RelativePath, Node)> foundNodes, Exception ex)\n                {\n                    _logger.BrowserStoppingDueToError(ex);\n\n                    // Reset stream by resetting the sequence number to 0\n                    _sequenceNumber = 0u;\n\n                    //\n                    // In case of exception we could not process the entire address space\n                    // We add the remainder of the remaining existing references and nodes\n                    // back to the currently known nodes and references and sort those out\n                    // next time around.\n                    //\n                    foreach (var removedReference in _knownReferences)\n                    {\n                        // Re-add\n                        foundReferences.AddOrUpdate(removedReference.Key, removedReference.Value);\n                    }\n                    _knownReferences.Clear();\n\n                    foreach (var removedNode in _knownNodes)\n                    {\n                        // Re-add\n                        foundNodes.AddOrUpdate(removedNode.Key, removedNode.Value);\n                    }\n                    _knownNodes.Clear();\n                }\n            }\n\n            /// <summary>\n            /// Read node and send add or change notification\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"targetNodeId\"></param>\n            /// <param name=\"targetPath\"></param>\n            /// <param name=\"foundNodes\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            private async ValueTask ReadNodeAsync(OpcUaSession session, NodeId targetNodeId,\n                RelativePath targetPath, Dictionary<NodeId, (RelativePath Path, Node Node)> foundNodes,\n                CancellationToken ct)\n            {\n                try\n                {\n                    var node = await session.ReadNodeAsync(targetNodeId, ct).ConfigureAwait(false);\n                    if (NodeId.IsNull(node.NodeId))\n                    {\n                        return;\n                    }\n                    if (_knownNodes.Remove(node.NodeId, out var existing) &&\n                        !Utils.IsEqual(existing.Item2, node))\n                    {\n                        // send updated node\n                        _nodesChanged++;\n                        OnNodeChange?.Invoke(session, CreateChange(targetNodeId, existing.Item1,\n                            existing.Item2, node));\n                    }\n\n                    if (foundNodes.TryAdd(node.NodeId, (targetPath, node)) && existing.Item1 == null)\n                    {\n                        // Send added node\n                        _nodesAdded++;\n                        OnNodeChange?.Invoke(session, CreateChange(targetNodeId, targetPath,\n                            null, node));\n                    }\n                }\n                catch (Exception) when (session.Connected)\n                {\n                    // TODO: Notify error here, but we are anyway sending a removal...\n                    _errors++;\n                }\n            }\n\n            /// <summary>\n            /// Helper to create a change structure\n            /// </summary>\n            /// <typeparam name=\"T\"></typeparam>\n            /// <param name=\"source\"></param>\n            /// <param name=\"path\"></param>\n            /// <param name=\"existing\"></param>\n            /// <param name=\"New\"></param>\n            /// <returns></returns>\n            private Change<T> CreateChange<T>(NodeId source, RelativePath path, T? existing, T? New) where T : class\n            {\n                return new(source, path, existing, New, Interlocked.Increment(ref _sequenceNumber),\n                    _client._timeProvider.GetUtcNow());\n            }\n\n            /// <summary>\n            /// Register\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"rebrowsePeriod\"></param>\n            /// <param name=\"subscriptionId\"></param>\n            /// <returns></returns>\n            public static Browser Register(OpcUaClient outer, TimeSpan rebrowsePeriod, string subscriptionId)\n            {\n                lock (outer._browsers)\n                {\n                    if (!outer._browsers.TryGetValue((subscriptionId, rebrowsePeriod), out var browser))\n                    {\n                        browser = new Browser(outer, subscriptionId, rebrowsePeriod);\n                        outer._browsers.Add((subscriptionId, rebrowsePeriod), browser);\n                    }\n                    browser.AddRef();\n                    return browser;\n                }\n            }\n\n            /// <summary>\n            /// Take a reference on this browser\n            /// </summary>\n            private void AddRef()\n            {\n                _refCount++;\n                _channel.Writer.TryWrite(false); // Ensure we start a rebrowse in 10\n            }\n\n            /// <summary>\n            /// Release browser and remove from browser list\n            /// </summary>\n            /// <returns></returns>\n            private bool Release()\n            {\n                var cleanup = false;\n                lock (_client._browsers)\n                {\n                    if (--_refCount == 0 && _client._browsers.Remove((_subscriptionId, _browseDelay)))\n                    {\n                        cleanup = true;\n                    }\n                }\n                return cleanup;\n            }\n\n            private const int kMaxSearchDepth = 128;\n            private const int kMaxReferencesPerNode = 1000;\n\n            private bool _disposed;\n            private uint _sequenceNumber;\n            private int _refCount;\n            private int _referencesAdded;\n            private int _referencesRemoved;\n            private int _nodesAdded;\n            private int _nodesChanged;\n            private int _nodesRemoved;\n            private int _errors;\n            private Dictionary<NodeId, (RelativePath, Node)> _knownNodes = [];\n            private Dictionary<ReferenceDescription, (NodeId, RelativePath)> _knownReferences =\n                new(Compare.Using<ReferenceDescription>(Utils.IsEqual));\n            private readonly string _subscriptionId;\n            private readonly Task _browser;\n            private readonly OpcUaClient _client;\n            private readonly ILogger _logger;\n            private readonly Channel<bool> _channel;\n            private readonly ITimer _rebrowseTimer;\n            private readonly CancellationTokenSource _cts = new();\n            private readonly TimeSpan _browseDelay;\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaClient.Browser\n    /// </summary>\n    internal static partial class OpcUaClientBrowserLogging\n    {\n        private const int EventClass = 500;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Starting continous browsing process...\")]\n        public static partial void BrowserStartingContinuousBrowsing(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Browsing started after {Elapsed}...\")]\n        public static partial void BrowserBrowsingStarted(this ILogger logger, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Browsing completed and took {Elapsed}. Added {AddedR}, \" +\n            \"removed {RemovedR} References and added {AddedN}, changed {ChangedN}, \" +\n            \"removed {RemovedN} Nodes with {Errors} errors.\")]\n        public static partial void BrowserBrowsingCompleted(this ILogger logger,\n            TimeSpan elapsed, int addedR, int removedR, int addedN, int changedN,\n            int removedN, int errors);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Browsing completed due to error {Error} took {Elapsed}. Added {AddedR}, \" +\n            \"removed {RemovedR} References and added {AddedN}, changed {ChangedN}, \" +\n            \"removed {RemovedN} Nodes with {Errors} errors.\")]\n        public static partial void BrowserBrowsingCompletedWithError(this ILogger logger,\n            string error, TimeSpan elapsed, int addedR, int removedR, int addedN,\n            int changedN, int removedN, int errors);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug,\n            Message = \"Not connected - waiting to reconnect.\")]\n        public static partial void BrowserNotConnectedWaiting(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"Error occurred during browsing\")]\n        public static partial void BrowserErrorOccurred(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Error,\n            Message = \"Browsing completed due to an exception and took {Elapsed}.\")]\n        public static partial void BrowserBrowsingException(this ILogger logger, Exception ex, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"Browser process exited.\")]\n        public static partial void BrowserProcessExited(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Critical,\n            Message = \"Browser process exited due to unexpected exception.\")]\n        public static partial void BrowserProcessExitedUnexpected(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Debug,\n            Message = \"Stopping browse due to error.\")]\n        public static partial void BrowserStoppingDueToError(this ILogger logger, Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClient.Sampler.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Immutable;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    internal sealed partial class OpcUaClient\n    {\n        /// <summary>\n        /// Registers a value to read with results pushed to the provided\n        /// subscription callback\n        /// </summary>\n        /// <param name=\"samplingRate\"></param>\n        /// <param name=\"maxAge\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        /// <param name=\"subscriptionName\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <returns></returns>\n        internal IAsyncDisposable Sample(TimeSpan samplingRate, TimeSpan maxAge,\n            ReadValueId nodeToRead, string subscriptionName, uint clientHandle)\n        {\n            return Sampler.Register(this, samplingRate, maxAge,\n                nodeToRead, subscriptionName, clientHandle);\n        }\n\n        /// <summary>\n        /// A set of client sampled values\n        /// </summary>\n        private sealed class Sampler : IAsyncDisposable\n        {\n            /// <summary>\n            /// Creates the sampler\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"samplingRate\"></param>\n            /// <param name=\"maxAge\"></param>\n            /// <param name=\"subscription\"></param>\n            /// <param name=\"value\"></param>\n            private Sampler(OpcUaClient outer, TimeSpan samplingRate,\n                TimeSpan maxAge, string subscription, SampledNodeId value)\n            {\n                _sampledNodes = ImmutableHashSet<SampledNodeId>.Empty.Add(value);\n\n                _client = outer;\n                _cts = new CancellationTokenSource();\n                _samplingRate = samplingRate;\n                _maxAge = maxAge;\n                _subscription = subscription;\n                _timer = new PeriodicTimer(_samplingRate);\n                _sampler = RunAsync(_cts.Token);\n            }\n\n            /// <inheritdoc/>\n            public async ValueTask DisposeAsync()\n            {\n                try\n                {\n                    await _cts.CancelAsync().ConfigureAwait(false);\n                    _timer.Dispose();\n                    await _sampler.ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { }\n                finally\n                {\n                    _cts.Dispose();\n                }\n            }\n\n            /// <summary>\n            /// Add sampler\n            /// </summary>\n            /// <param name=\"node\"></param>\n            /// <returns></returns>\n            private Sampler Add(SampledNodeId node)\n            {\n                _sampledNodes = _sampledNodes.Add(node);\n                return this;\n            }\n\n            /// <summary>\n            /// Remove sampler\n            /// </summary>\n            /// <param name=\"value\"></param>\n            /// <returns></returns>\n            private bool Remove(SampledNodeId value)\n            {\n                _sampledNodes = _sampledNodes.Remove(value);\n                return _sampledNodes.Count == 0;\n            }\n\n            /// <summary>\n            /// Run sampling of values on the periodic timer\n            /// </summary>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            private async Task RunAsync(CancellationToken ct)\n            {\n                var sw = Stopwatch.StartNew();\n                for (var sequenceNumber = 1u; !ct.IsCancellationRequested; sequenceNumber++)\n                {\n                    if (sequenceNumber == 0u)\n                    {\n                        continue;\n                    }\n\n                    var nodesToRead = new ReadValueIdCollection(_sampledNodes.Select(n => n.InitialValue));\n                    try\n                    {\n                        // Wait until period completed\n                        if (!await _timer.WaitForNextTickAsync(ct).ConfigureAwait(false))\n                        {\n                            continue;\n                        }\n\n                        sw.Restart();\n                        // Grab the current session\n                        var session = _client._session;\n                        if (session == null)\n                        {\n                            NotifyAll(sequenceNumber, nodesToRead, StatusCodes.BadNotConnected,\n                                TimeSpan.Zero);\n                            continue;\n                        }\n\n                        // Ensure type system is loaded\n                        await session.GetComplexTypeSystemAsync(ct).ConfigureAwait(false);\n\n                        // Perform the read.\n                        var timeout = _samplingRate.TotalMilliseconds / 2;\n                        var response = await session.ReadAsync(new RequestHeader\n                        {\n                            Timestamp = _client._timeProvider.GetUtcNow().UtcDateTime,\n                            TimeoutHint = (uint)timeout,\n                            ReturnDiagnostics = 0\n                        }, _maxAge.TotalMilliseconds, Opc.Ua.TimestampsToReturn.Both,\n                            nodesToRead, ct).ConfigureAwait(false);\n\n                        var values = response.Validate(response.Results,\n                            r => r.StatusCode, response.DiagnosticInfos, nodesToRead);\n\n                        if (values.ErrorInfo != null)\n                        {\n                            NotifyAll(sequenceNumber, nodesToRead, values.ErrorInfo.StatusCode, sw.Elapsed);\n                            continue;\n                        }\n\n                        // Notify clients of the values\n                        NotifyAll(sequenceNumber, values, sw.Elapsed);\n                    }\n                    catch (OperationCanceledException) { }\n                    catch (ServiceResultException sre)\n                    {\n                        NotifyAll(sequenceNumber, nodesToRead, sre.StatusCode, sw.Elapsed);\n                    }\n                    catch (Exception ex)\n                    {\n                        var error = new ServiceResult(ex).StatusCode;\n                        NotifyAll(sequenceNumber, nodesToRead, error.Code, sw.Elapsed);\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Notify results\n            /// </summary>\n            /// <param name=\"seq\"></param>\n            /// <param name=\"values\"></param>\n            /// <param name=\"elapsed\"></param>\n            private void NotifyAll(uint seq, ServiceResponse<ReadValueId, DataValue> values,\n                TimeSpan elapsed)\n            {\n                if (_client._session?.Subscriptions.FirstOrDefault(n => n.DisplayName == _subscription)\n                    is not OpcUaSubscription target)\n                {\n                    return;\n                }\n\n                var missed = GetMissed(elapsed);\n                target.OnSubscriptionCylicReadNotification(target, values\n                    .Select(i => new SampledDataValueModel(\n                        SetOverflow(i.Result, missed > 0), ((SampledNodeId)i.Request.Handle).ClientHandle, missed))\n                    .ToList(), seq, _client._timeProvider.GetUtcNow().UtcDateTime);\n\n                static DataValue SetOverflow(DataValue result, bool overflowBit)\n                {\n                    result.StatusCode.SetOverflow(overflowBit);\n                    return result;\n                }\n            }\n\n            /// <summary>\n            /// Notify error status code\n            /// </summary>\n            /// <param name=\"seq\"></param>\n            /// <param name=\"nodesToRead\"></param>\n            /// <param name=\"statusCode\"></param>\n            /// <param name=\"elapsed\"></param>\n            private void NotifyAll(uint seq, ReadValueIdCollection nodesToRead, uint statusCode,\n                TimeSpan elapsed)\n            {\n                if (_client._session?.Subscriptions.FirstOrDefault(n => n.DisplayName == _subscription)\n                    is not OpcUaSubscription target)\n                {\n                    return;\n                }\n\n                var missed = GetMissed(elapsed);\n                target.OnSubscriptionCylicReadNotification(target, nodesToRead\n                    .Select(i => new SampledDataValueModel(\n                        SetOverflow(statusCode, missed > 0), ((SampledNodeId)i.Handle).ClientHandle, missed))\n                    .ToList(), seq, _client._timeProvider.GetUtcNow().UtcDateTime);\n\n                static DataValue SetOverflow(uint statusCode, bool overflowBit)\n                {\n                    var dataValue = new DataValue(statusCode);\n                    dataValue.StatusCode.SetOverflow(overflowBit);\n                    return dataValue;\n                }\n            }\n\n            private int GetMissed(TimeSpan elapsed)\n            {\n                return (int)Math.Round(elapsed.TotalMilliseconds / _samplingRate.TotalMilliseconds);\n            }\n\n            /// <summary>\n            /// A sampled node registered with a sampler\n            /// </summary>\n            private sealed class SampledNodeId : IAsyncDisposable\n            {\n                /// <summary>\n                /// Sampler key\n                /// </summary>\n                public (string, TimeSpan, TimeSpan) Key { get; }\n\n                /// <summary>\n                /// Item to monito\n                /// </summary>\n                public ReadValueId InitialValue { get; }\n\n                /// <summary>\n                /// Client handle\n                /// </summary>\n                public uint ClientHandle { get; }\n\n                /// <summary>\n                /// Create node\n                /// </summary>\n                /// <param name=\"outer\"></param>\n                /// <param name=\"key\"></param>\n                /// <param name=\"item\"></param>\n                /// <param name=\"clientHandle\"></param>\n                public SampledNodeId(OpcUaClient outer, (string, TimeSpan, TimeSpan) key,\n                    ReadValueId item, uint clientHandle)\n                {\n                    _outer = outer;\n                    Key = key;\n                    InitialValue = item;\n                    ClientHandle = clientHandle;\n                    item.Handle = this;\n                }\n\n                /// <inheritdoc/>\n                public async ValueTask DisposeAsync()\n                {\n                    Sampler? sampler;\n                    lock (_outer._samplers)\n                    {\n                        if (!_outer._samplers.TryGetValue(Key, out sampler)\n                            || !sampler.Remove(this))\n                        {\n                            return;\n                        }\n                        _outer._samplers.Remove(Key);\n                    }\n                    await sampler.DisposeAsync().ConfigureAwait(false);\n                }\n\n                private readonly OpcUaClient _outer;\n            }\n\n            /// <summary>\n            /// Register for sampling\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"samplingRate\"></param>\n            /// <param name=\"maxAge\"></param>\n            /// <param name=\"item\"></param>\n            /// <param name=\"subscriptionName\"></param>\n            /// <param name=\"clientHandle\"></param>\n            /// <returns></returns>\n            public static IAsyncDisposable Register(OpcUaClient outer, TimeSpan samplingRate,\n                TimeSpan maxAge, ReadValueId item, string subscriptionName, uint clientHandle)\n            {\n                if (samplingRate <= TimeSpan.Zero)\n                {\n                    samplingRate = TimeSpan.FromSeconds(1);\n                }\n                if (maxAge < TimeSpan.Zero)\n                {\n                    maxAge = TimeSpan.Zero;\n                }\n                lock (outer._samplers)\n                {\n                    var key = (subscriptionName, samplingRate, maxAge);\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                    var sampledNode = new SampledNodeId(outer, key, item, clientHandle);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                    if (!outer._samplers.TryGetValue(key, out var sampler))\n                    {\n                        sampler = new Sampler(outer, samplingRate, maxAge,\n                            subscriptionName, sampledNode);\n                        outer._samplers.Add(key, sampler);\n                    }\n                    else\n                    {\n                        sampler.Add(sampledNode);\n                    }\n                    return sampledNode;\n                }\n            }\n\n            private ImmutableHashSet<SampledNodeId> _sampledNodes;\n            private readonly CancellationTokenSource _cts;\n            private readonly Task _sampler;\n            private readonly OpcUaClient _client;\n            private readonly TimeSpan _samplingRate;\n            private readonly TimeSpan _maxAge;\n            private readonly string _subscription;\n            private readonly PeriodicTimer _timer;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClient.Subscription.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    internal sealed partial class OpcUaClient\n    {\n        /// <summary>\n        /// Register a new subscriber for a subscription defined by the\n        /// subscription template.\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"subscriber\"></param>\n        /// <param name=\"ct\"></param>\n        internal async ValueTask<ISubscription> RegisterAsync(\n            SubscriptionModel subscription, ISubscriber subscriber,\n            CancellationToken ct = default)\n        {\n            // Take a reference to the client for the lifetime of the subscription\n            AddRef();\n            try\n            {\n                await _subscriptionLock.WaitAsync(ct).ConfigureAwait(false);\n                AddRef();\n                try\n                {\n                    OpcUaSubscription? existingSub = null;\n\n                    //\n                    // If subscriber is registered with a different subscription we either\n                    // update the subscription or dispose the old one and create a new one.\n                    //\n                    if (_registrations.TryGetValue(subscriber, out var existing) &&\n                        existing.Subscription != subscription)\n                    {\n                        existing.RemoveAndReleaseNoLockInternal();\n                        Debug.Assert(!_registrations.ContainsKey(subscriber));\n\n                        //\n                        // We check if there are any other subscribers registered with the\n                        // same subscription configuration that we want to apply. If there\n                        // are not - we update the subscription (safely) with the new\n                        // desired template configuration. Essentially original behavior\n                        // before 2.9.12.\n                        //\n                        if ((!_s2r.TryGetValue(subscription, out var c) || c.Count == 0) &&\n                            TryGetSubscription(existing.Subscription, out existingSub))\n                        {\n                            existingSub.Update(subscription);\n                        }\n                    }\n\n                    var registration = new Registration(this, subscription, subscriber);\n                    TriggerSubscriptionSynchronization(existingSub);\n                    return registration;\n                }\n                finally\n                {\n                    Release();\n                    _subscriptionLock.Release();\n                }\n            }\n            finally\n            {\n                Release();\n            }\n        }\n\n        /// <summary>\n        /// Get subscribers for a subscription template to get at the monitored\n        /// items that should be created in the subscription or subscriptions.\n        /// Called under the subscription lock as a result of synchronization.\n        /// </summary>\n        /// <param name=\"template\"></param>\n        /// <returns></returns>\n        internal IEnumerable<ISubscriber> GetSubscribers(SubscriptionModel template)\n        {\n            Debug.Assert(_subscriptionLock.CurrentCount == 0, \"Must be locked\");\n\n            if (_s2r.TryGetValue(template, out var registrations))\n            {\n                return registrations.Select(r => r.Owner);\n            }\n\n            return [];\n        }\n\n        /// <summary>\n        /// Trigger the client to manage the subscription. This is a\n        /// no op if the subscription is not registered or the client\n        /// is not connected.\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        internal void TriggerSubscriptionSynchronization(\n            OpcUaSubscription? subscription = null)\n        {\n            if (subscription?.IsClosed == false)\n            {\n                TriggerConnectionEvent(ConnectionEvent.SubscriptionSyncOne,\n                    subscription);\n            }\n            else\n            {\n                TriggerConnectionEvent(ConnectionEvent.SubscriptionSyncAll);\n            }\n        }\n\n        /// <summary>\n        /// Called by subscription when newly created. This needs to be done\n        /// here this way because the stack uses clone to clone the subscriptions\n        /// just like it does with sessions and monitored items. This way we can\n        /// hock the create and clone operations.\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        internal void OnSubscriptionCreated(OpcUaSubscription subscription)\n        {\n            lock (_cache)\n            {\n                if (subscription.IsRoot)\n                {\n                    _cache.AddOrUpdate(subscription.Template, subscription);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Called by subscription when closed or deleted.\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        internal void OnSubscriptionClosed(OpcUaSubscription subscription)\n        {\n            // Remove all subscriptions from cache\n            lock (_cache)\n            {\n                if (subscription.IsRoot)\n                {\n                    _cache.Remove(subscription.Template);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Called when session is closed to remove all subscriptions\n        /// </summary>\n        /// <param name=\"session\"></param>\n        internal void OnSessionClosing(OpcUaSession session)\n        {\n            // Remove all subscriptions from cache\n            lock (_cache)\n            {\n                foreach (var subscription in session.SubscriptionHandles.Values\n                    .Where(s => s.IsRoot && !s.IsClosed))\n                {\n                    _cache.Remove(subscription.Template);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Try get subscription with subscription model\n        /// </summary>\n        /// <param name=\"template\"></param>\n        /// <param name=\"subscription\"></param>\n        /// <returns></returns>\n        private bool TryGetSubscription(SubscriptionModel template,\n            [NotNullWhen(true)] out OpcUaSubscription? subscription)\n        {\n            // Fast lookup\n            lock (_cache)\n            {\n                if (_cache.TryGetValue(template, out subscription))\n                {\n                    if (!subscription.IsClosed && subscription.IsRoot)\n                    {\n                        return true;\n                    }\n                    _cache.Remove(template);\n                }\n                subscription = _session?.SubscriptionHandles.Values\n                    .FirstOrDefault(s => s.IsRoot && s.Template == template);\n                if (subscription != null)\n                {\n                    _cache.AddOrUpdate(template, subscription);\n                    return true;\n                }\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Access to the subscription to sync state must go through the\n        /// subscription lock. This just wraps the sync call on the\n        /// subscription.\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async Task SyncAsync(OpcUaSubscription subscription,\n            CancellationToken ct = default)\n        {\n            var session = _session;\n            if (session == null)\n            {\n                return;\n            }\n\n            await _subscriptionLock.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                // Get the max item per subscription as well as max\n                var caps = await session.GetServerCapabilitiesAsync(\n                    NamespaceFormat.Uri, ct).ConfigureAwait(false);\n                await subscription.SyncAsync(caps.MaxMonitoredItemsPerSubscription,\n                    caps.OperationLimits, ct).ConfigureAwait(false);\n            }\n            catch (Exception ex)\n            {\n                _logger.SyncSubscriptionError(ex, this, subscription);\n                RescheduleSynchronization(TimeSpan.FromMinutes(1));\n            }\n            finally\n            {\n                _subscriptionLock.Release();\n            }\n        }\n\n        /// <summary>\n        /// Called by the management thread to synchronize the subscriptions\n        /// within a session as a result of the trigger call or when a session\n        /// is reconnected/recreated.\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async Task<bool> TrySyncAsync(CancellationToken ct = default)\n        {\n            var session = _session;\n            if (session == null)\n            {\n                return false;\n            }\n            var sw = Stopwatch.StartNew();\n            var removals = 0;\n            var additions = 0;\n            var updates = 0;\n\n            var existing = session.SubscriptionHandles\n                .Where(s => s.Value.IsRoot)\n                .ToDictionary(k => k.Value.Template, k => k.Value);\n\n            _logger.PerformSync(this, session.SubscriptionHandles.Count);\n            if (!await EnsureSessionIsReadyForSubscriptionsAsync(session, ct).ConfigureAwait(false))\n            {\n                return false;\n            }\n            try\n            {\n                // Get the max item per subscription as well as max\n                var caps = await session.GetServerCapabilitiesAsync(\n                    NamespaceFormat.Uri, ct).ConfigureAwait(false);\n                var maxMonitoredItems = caps.MaxMonitoredItemsPerSubscription;\n                var limits = caps.OperationLimits;\n                var delay = TimeSpan.MaxValue;\n\n                //\n                // Take the subscription lock here! - we hold it all the way until we\n                // have updated all subscription states. The subscriptions will access\n                // the client again to obtain the monitored items from the subscribers\n                // and we do not want any subscribers to be touched or removed while\n                // we process the current registrations. Since the call to get the items\n                // is frequent, we do not want to generate a copy every time but let\n                // the subscriptions access the items directly.\n                //\n                await _subscriptionLock.WaitAsync(ct).ConfigureAwait(false);\n                try\n                {\n                    var s2r = _s2r.ToDictionary(kv => kv.Key, kv => kv.Value.ToList());\n\n                    // Close and remove items that have no subscribers\n                    await Task.WhenAll(existing.Keys\n                        .Except(s2r.Keys)\n                        .Select(k => existing[k])\n                        .Select(async close =>\n                        {\n                            try\n                            {\n                                lock (_cache)\n                                {\n                                    _cache.Remove(close.Template);\n                                }\n                                if (_s2r.TryRemove(close.Template, out var r))\n                                {\n                                    Debug.Assert(r.Count == 0,\n                                        $\"count of registrations {r.Count} > 0\");\n                                }\n\n                                // Removes the item from the session and dispose\n                                await close.DisposeAsync().ConfigureAwait(false);\n\n                                Interlocked.Increment(ref removals);\n                                Debug.Assert(close.IsClosed);\n                                Debug.Assert(close.Session == null);\n                            }\n                            catch (OperationCanceledException) { }\n                            catch (Exception ex)\n                            {\n                                _logger.CloseSubscriptionFailed(ex, this, close);\n                            }\n                        })).ConfigureAwait(false);\n\n                    // Add new subscription for items with subscribers\n                    var delays = await Task.WhenAll(s2r.Keys\n                        .Except(existing.Keys)\n                        .Select(async add =>\n                        {\n                            try\n                            {\n                                //\n                                // Create a new subscription with the subscription\n                                // configuration template that as of yet has no\n                                // representation and add it to the session.\n                                //\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                                var subscription = new OpcUaSubscription(this,\n                                    add, _subscriptionOptions, _loggerFactory,\n                                    new OpcUaClientTagList(_connection, _metrics),\n                                    null, _timeProvider);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n\n                                // Add the subscription to the session\n                                session.AddSubscription(subscription);\n\n                                // Sync the subscription which will get it to go live.\n                                await subscription.SyncAsync(maxMonitoredItems,\n                                    caps.OperationLimits, ct).ConfigureAwait(false);\n                                Interlocked.Increment(ref additions);\n                                Debug.Assert(session == subscription.Session);\n\n                                s2r[add].ForEach(r => r.Dirty = false);\n                                return TimeSpan.MaxValue;\n                            }\n                            catch (OperationCanceledException)\n                            {\n                                return TimeSpan.MaxValue;\n                            }\n                            catch (Exception ex)\n                            {\n                                _logger.AddSubscriptionFailed(ex, this, add);\n                                return TimeSpan.FromMinutes(1);\n                            }\n                        })).ConfigureAwait(false);\n\n                    delay = delays.DefaultIfEmpty(TimeSpan.MaxValue).Min();\n                    // Update any items where subscriber signalled the item was updated\n                    delays = await Task.WhenAll(s2r.Keys.Intersect(existing.Keys)\n                        .Where(u => s2r[u].Any(b => b.Dirty))\n                        .Select(async update =>\n                        {\n                            try\n                            {\n                                var subscription = existing[update];\n                                await subscription.SyncAsync(maxMonitoredItems,\n                                    caps.OperationLimits, ct).ConfigureAwait(false);\n                                Interlocked.Increment(ref updates);\n                                Debug.Assert(session == subscription.Session);\n                                s2r[update].ForEach(r => r.Dirty = false);\n                                return TimeSpan.MaxValue;\n                            }\n                            catch (OperationCanceledException)\n                            {\n                                return TimeSpan.MaxValue;\n                            }\n                            catch (Exception ex)\n                            {\n                                _logger.UpdateSubscriptionFailed(ex, this, update);\n                                return TimeSpan.FromMinutes(1);\n                            }\n                        })).ConfigureAwait(false);\n\n                    var delay2 = delays.DefaultIfEmpty(TimeSpan.MaxValue).Min();\n                    RescheduleSynchronization(delay < delay2 ? delay : delay2);\n                }\n                catch (Exception ex)\n                {\n                    _logger.SyncSubscriptionsError(ex, this);\n                    var delay2 = TimeSpan.FromMinutes(1);\n                    RescheduleSynchronization(delay < delay2 ? delay : delay2);\n                }\n                finally\n                {\n                    _subscriptionLock.Release();\n                }\n\n                // Finish\n                session.UpdateOperationTimeout(false);\n                UpdatePublishRequestCounts();\n\n                if (updates + removals + additions != 0)\n                {\n                    _logger.SyncSummary(this, removals, additions, updates,\n                        session.SubscriptionHandles.Count, sw.ElapsedMilliseconds);\n                }\n                return true;\n            }\n            catch (Exception ex)\n            {\n                _logger.SyncSubscriptionsErrorMessage(this, ex.Message);\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Check session is ready for subscriptions, which means we fetch the\n        /// namespace table and type system needed for the encoders and metadata.\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task<bool> EnsureSessionIsReadyForSubscriptionsAsync(OpcUaSession session,\n            CancellationToken ct)\n        {\n            try\n            {\n                // Reload namespace tables should they have changed...\n                var oldTable = session.NamespaceUris.ToArray();\n                await session.FetchNamespaceTablesAsync(ct).ConfigureAwait(false);\n                var newTable = session.NamespaceUris.ToArray();\n                LogNamespaceTableChanges(oldTable, newTable);\n            }\n            catch (ServiceResultException sre) // anything else is not expected\n            {\n                _logger.FetchNamespaceTableFailed(sre, this);\n                return false;\n            }\n\n            if (!DisableComplexTypeLoading && !session.IsTypeSystemLoaded)\n            {\n                // Ensure type system is loaded\n                await session.GetComplexTypeSystemAsync(ct).ConfigureAwait(false);\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Called under lock, schedule resynchronization of all subscriptions\n        /// after the specified delay\n        /// </summary>\n        /// <param name=\"delay\"></param>\n        private void RescheduleSynchronization(TimeSpan delay)\n        {\n            Debug.Assert(_subscriptionLock.CurrentCount == 0, \"Must be locked\");\n\n            if (delay == TimeSpan.MaxValue || delay < TimeSpan.Zero)\n            {\n                // covers Timeout.Infinite too which is negative\n                return;\n            }\n\n            var nextSync = _timeProvider.GetUtcNow() + delay;\n            if (_nextSync == null || nextSync <= _nextSync)\n            {\n                _logger.RescheduleSync(nextSync, delay.TotalMilliseconds);\n                _nextSync = nextSync;\n                _resyncTimer.Change(delay, Timeout.InfiniteTimeSpan);\n            }\n        }\n\n        /// <summary>\n        /// Subscription registration\n        /// </summary>\n        private sealed record Registration : ISubscription, ISubscriptionDiagnostics\n        {\n            /// <summary>\n            /// The subscription configuration\n            /// </summary>\n            public SubscriptionModel Subscription { get; }\n\n            /// <summary>\n            /// Monitored items on the subscriber\n            /// </summary>\n            internal ISubscriber Owner { get; }\n\n            /// <summary>\n            /// Mark the registration as dirty\n            /// </summary>\n            internal bool Dirty { get; set; }\n\n            /// <inheritdoc/>\n            public IOpcUaClientDiagnostics ClientDiagnostics => _outer;\n\n            /// <inheritdoc/>\n            public ISubscriptionDiagnostics Diagnostics => this;\n\n            /// <inheritdoc/>\n            public int GoodMonitoredItems\n                => _outer.TryGetSubscription(Subscription, out var subscription)\n                    ? subscription.GetGoodMonitoredItems(Owner) : 0;\n            /// <inheritdoc/>\n            public int BadMonitoredItems\n                => _outer.TryGetSubscription(Subscription, out var subscription)\n                    ? subscription.GetBadMonitoredItems(Owner) : 0;\n            /// <inheritdoc/>\n            public int LateMonitoredItems\n                => _outer.TryGetSubscription(Subscription, out var subscription)\n                    ? subscription.GetLateMonitoredItems(Owner) : 0;\n            /// <inheritdoc/>\n            public int HeartbeatsEnabled\n                => _outer.TryGetSubscription(Subscription, out var subscription)\n                    ? subscription.GetHeartbeatsEnabled(Owner) : 0;\n            /// <inheritdoc/>\n            public int ConditionsEnabled\n                => _outer.TryGetSubscription(Subscription, out var subscription)\n                    ? subscription.GetConditionsEnabled(Owner) : 0;\n\n            /// <summary>\n            /// Create subscription\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            /// <param name=\"subscription\"></param>\n            /// <param name=\"owner\"></param>\n            public Registration(OpcUaClient outer,\n                SubscriptionModel subscription, ISubscriber owner)\n            {\n                Subscription = subscription;\n                Owner = owner;\n                _outer = outer;\n\n                _outer.AddRef();\n                AddNoLockInternal();\n            }\n\n            /// <inheritdoc/>\n            public async ValueTask DisposeAsync()\n            {\n                if (_outer._disposed)\n                {\n                    //\n                    // Possibly the client has shut down before the owners of\n                    // the registration have disposed it. This is not an error.\n                    // It might however be better to order the clients to get\n                    // disposed before clients.\n                    //\n                    return;\n                }\n\n                // Remove registration\n                await _outer._subscriptionLock.WaitAsync().ConfigureAwait(false);\n                try\n                {\n                    RemoveNoLockInternal();\n                    _outer.TriggerSubscriptionSynchronization(null);\n                }\n                finally\n                {\n                    _outer._subscriptionLock.Release();\n                    _outer.Release();\n                }\n            }\n\n            /// <inheritdoc/>\n            public OpcUaSubscriptionNotification? CreateKeepAlive()\n            {\n                if (!_outer.TryGetSubscription(Subscription, out var subscription))\n                {\n                    return null;\n                }\n                return subscription.CreateKeepAlive();\n            }\n\n            /// <inheritdoc/>\n            public void NotifyMonitoredItemsChanged()\n            {\n                Dirty = true;\n                _outer.TryGetSubscription(Subscription, out var subscription);\n                _outer.TriggerSubscriptionSynchronization(subscription);\n            }\n\n            /// <inheritdoc/>\n            public async ValueTask<PublishedDataSetMetaDataModel> CollectMetaDataAsync(\n                ISubscriber owner, DataSetFieldContentFlags? fieldMask,\n                DataSetMetaDataModel dataSetMetaData, uint minorVersion,\n                CancellationToken ct = default)\n            {\n                if (!_outer.TryGetSubscription(Subscription, out var subscription))\n                {\n                    throw new ServiceResultException(StatusCodes.BadNoSubscription,\n                        \"Subscription not found\");\n                }\n                return await subscription.CollectMetaDataAsync(owner, fieldMask,\n                    dataSetMetaData, minorVersion, ct).ConfigureAwait(false);\n            }\n\n            /// <summary>\n            /// Remove registration and release reference but not under\n            /// lock (like user of the registration handle) and without\n            /// triggering an update.\n            /// </summary>\n            internal void RemoveAndReleaseNoLockInternal()\n            {\n                RemoveNoLockInternal();\n                _outer.Release();\n            }\n\n            private void AddNoLockInternal()\n            {\n                _outer._registrations.Add(Owner, this);\n                _outer._s2r.AddOrUpdate(Subscription, _\n                    => [this],\n                (_, c) =>\n                {\n                    c.Add(this);\n                    return c;\n                });\n            }\n\n            private void RemoveNoLockInternal()\n            {\n                _outer._s2r.AddOrUpdate(Subscription, _ =>\n                {\n                    Debug.Fail(\"Unexpected\");\n                    return [];\n                }, (_, c) =>\n                {\n                    c.Remove(this);\n                    return c;\n                });\n                _outer._registrations.Remove(Owner);\n            }\n\n            private readonly OpcUaClient _outer;\n        }\n\n        private DateTimeOffset? _nextSync;\n#pragma warning disable CA2213 // Disposable fields should be disposed\n        private readonly SemaphoreSlim _subscriptionLock = new(1, 1);\n        private readonly ITimer _resyncTimer;\n#pragma warning restore CA2213 // Disposable fields should be disposed\n        private readonly Dictionary<ISubscriber, Registration> _registrations = [];\n        private readonly ConcurrentDictionary<SubscriptionModel, List<Registration>> _s2r = new();\n        private readonly Dictionary<SubscriptionModel, OpcUaSubscription> _cache = [];\n        private readonly IOptions<OpcUaSubscriptionOptions> _subscriptionOptions;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaClient.Subscription\n    /// </summary>\n    internal static partial class OpcUaClientSubscriptionLogging\n    {\n        private const int EventClass = 580;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"{Client}: Error trying to sync subscription {Subscription}\")]\n        public static partial void SyncSubscriptionError(this ILogger logger, Exception ex,\n            OpcUaClient client, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"{Client}: Perform synchronization of subscriptions (total: {Total})\")]\n        public static partial void PerformSync(this ILogger logger, OpcUaClient client, int total);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"{Client}: Failed to close subscription {Subscription} in session.\")]\n        public static partial void CloseSubscriptionFailed(this ILogger logger, Exception ex,\n            OpcUaClient client, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"{Client}: Failed to add subscription {Subscription} in session.\")]\n        public static partial void AddSubscriptionFailed(this ILogger logger, Exception ex,\n            OpcUaClient client, SubscriptionModel subscription);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"{Client}: Failed to update subscription {Subscription} in session.\")]\n        public static partial void UpdateSubscriptionFailed(this ILogger logger, Exception ex,\n            OpcUaClient client, SubscriptionModel subscription);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"{Client}: Error trying to sync subscriptions.\")]\n        public static partial void SyncSubscriptionsError(this ILogger logger, Exception ex,\n            OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"{Client}: Removed {Removals}, added {Additions}, and updated {Updates} \" +\n            \"subscriptions (total: {Total}) took {Duration} ms.\")]\n        public static partial void SyncSummary(this ILogger logger, OpcUaClient client,\n            int removals, int additions, int updates, int total, long duration);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Error,\n            Message = \"{Client}: Error trying to sync subscriptions: {Error}\")]\n        public static partial void SyncSubscriptionsErrorMessage(this ILogger logger,\n            OpcUaClient client, string error);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Warning,\n            Message = \"{Client}: Failed to fetch namespace table...\")]\n        public static partial void FetchNamespaceTableFailed(this ILogger logger, Exception ex,\n            OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"Reschedule synchronization to {Time} in {Delay} ms\")]\n        public static partial void RescheduleSync(this ILogger logger, DateTimeOffset time, double delay);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClient.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Exceptions;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Nito.AsyncEx;\n    using Opc.Ua;\n    using Opc.Ua.Bindings;\n    using Opc.Ua.Client;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.Metrics;\n    using System.Globalization;\n    using System.Linq;\n    using System.Net;\n    using System.Runtime.CompilerServices;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Text.Json;\n    using System.Threading;\n    using System.Threading.Channels;\n    using System.Threading.Tasks;\n    using System.Xml;\n\n    /// <summary>\n    /// OPC UA Client based on official ua client reference sample.\n    /// </summary>\n    internal sealed partial class OpcUaClient : DefaultSessionFactory,\n        IOpcUaClientDiagnostics, IDisposable\n    {\n        /// <summary>\n        /// Client namespace\n        /// </summary>\n        internal const string Namespace = \"http://opcfoundation.org/UA/Client/Types.xsd\";\n\n        /// <summary>\n        /// Application uri or the client\n        /// </summary>\n        public string ApplicationUri => _configuration.ApplicationUri;\n\n        /// <summary>\n        /// The session keepalive interval to be used in ms.\n        /// </summary>\n        public TimeSpan? KeepAliveInterval { get; set; }\n\n        /// <summary>\n        /// Min time to wait until reconnect.\n        /// </summary>\n        public TimeSpan? MinReconnectDelay { get; set; }\n\n        /// <summary>\n        /// Timeout for session creation\n        /// </summary>\n        public TimeSpan? CreateSessionTimeout { get; set; }\n\n        /// <summary>\n        /// The session lifetime.\n        /// </summary>\n        public TimeSpan? SessionTimeout { get; set; }\n\n        /// <summary>\n        /// Session operation timeout\n        /// </summary>\n        public TimeSpan? OperationTimeout { get; set; }\n\n        /// <summary>\n        /// Service call timeout\n        /// </summary>\n        public TimeSpan? ServiceCallTimeout { get; set; }\n\n        /// <summary>\n        /// Connect timeout for service calls\n        /// </summary>\n        public TimeSpan? ConnectTimeout { get; set; }\n\n        /// <summary>\n        /// Minimum number of publish requests to queue\n        /// </summary>\n        public int? MinPublishRequests { get; set; }\n\n        /// <summary>\n        /// Max number of publish requests to ever queue\n        /// </summary>\n        public int? MaxPublishRequests { get; set; }\n\n        /// <summary>\n        /// Percentage ratio of publish requests per subscription\n        /// </summary>\n        public int? PublishRequestsPerSubscriptionPercent { get; set; }\n\n        /// <summary>\n        /// The linger timeout.\n        /// </summary>\n        public TimeSpan? LingerTimeout { get; set; }\n\n        /// <summary>\n        /// Disable complex type preloading.\n        /// </summary>\n        public bool DisableComplexTypePreloading { get; set; }\n\n        /// <summary>\n        /// Node cache timeout\n        /// </summary>\n        public TimeSpan NodeCacheTimeout { get; set; } = TimeSpan.FromMinutes(1);\n\n        /// <summary>\n        /// Node cache capacity\n        /// </summary>\n        public int NodeCacheCapacity { get; set; } = 4096;\n\n        /// <summary>\n        /// Operation limits to use in the sessions\n        /// </summary>\n        internal OperationLimits? LimitOverrides { get; set; }\n\n        /// <summary>\n        /// Last diagnostic information on this client\n        /// </summary>\n        internal ChannelDiagnosticModel LastDiagnostics => _lastDiagnostics;\n\n        /// <summary>\n        /// No complex type loading ever\n        /// </summary>\n        public bool DisableComplexTypeLoading\n            => _connection.Options.HasFlag(ConnectionOptions.NoComplexTypeSystem);\n\n        /// <summary>\n        /// Transfer subscription on reconnect\n        /// </summary>\n        public bool DisableTransferSubscriptionOnReconnect\n            => _connection.Options.HasFlag(ConnectionOptions.NoSubscriptionTransfer);\n\n        /// <summary>\n        /// Dump diagnostics for this client\n        /// </summary>\n        public bool DumpDiagnostics\n            => _connection.Options.HasFlag(ConnectionOptions.DumpDiagnostics);\n\n        /// <summary>\n        /// Client is connected\n        /// </summary>\n        public bool IsConnected\n            => _session?.Connected ?? false;\n\n        /// <inheritdoc/>\n        public EndpointConnectivityState State\n            => _lastState;\n\n        /// <inheritdoc/>\n        public int BadPublishRequestCount\n            => _session?.DefunctRequestCount ?? 0;\n\n        /// <inheritdoc/>\n        public int GoodPublishRequestCount\n            => _session?.GoodPublishRequestCount ?? 0;\n\n        /// <inheritdoc/>\n        public int OutstandingRequestCount\n            => _session?.OutstandingRequestCount ?? 0;\n\n        /// <inheritdoc/>\n        public int SubscriptionCount\n            => _session?.Subscriptions.Count(s => s.Created) ?? 0;\n\n        /// <inheritdoc/>\n        public int MinPublishRequestCount\n            => _session?.MinPublishRequestCount ?? 0;\n\n        /// <inheritdoc/>\n        public int ReconnectCount => _numberOfConnectionRetries;\n\n        /// <inheritdoc/>\n        public int ConnectCount => _numberofSuccessfulConnections;\n\n        /// <inheritdoc/>\n        public int KeepAliveCounter => _keepAliveCounter;\n\n        /// <inheritdoc/>\n        public int KeepAliveTotal => _keepAliveTotal;\n\n        /// <inheritdoc/>\n        public bool ReconnectTriggered => _reconnectRequired != 0;\n\n        /// <summary>\n        /// Disconnected state\n        /// </summary>\n        internal static IOpcUaClientDiagnostics Disconnected { get; }\n            = new DisconnectState();\n\n        /// <summary>\n        /// Create client\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"metrics\"></param>\n        /// <param name=\"onClose\"></param>\n        /// <param name=\"notifier\"></param>\n        /// <param name=\"reverseConnectManager\"></param>\n        /// <param name=\"diagnosticsCallback\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"subscriptionOptions\"></param>\n        /// <param name=\"sessionName\"></param>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        public OpcUaClient(ApplicationConfiguration configuration,\n            ConnectionIdentifier connection, IJsonSerializer serializer,\n            ILoggerFactory loggerFactory, TimeProvider timeProvider,\n            IMetricsContext metrics, Func<Task> onClose,\n            EventHandler<EndpointConnectivityStateEventArgs>? notifier,\n            ReverseConnectManager? reverseConnectManager,\n            Action<ChannelDiagnosticModel> diagnosticsCallback,\n            IOptions<OpcUaClientOptions> options,\n            IOptions<OpcUaSubscriptionOptions> subscriptionOptions,\n            string? sessionName = null)\n        {\n            _timeProvider = timeProvider;\n            if (connection?.Connection?.Endpoint?.Url == null)\n            {\n                throw new ArgumentNullException(nameof(connection));\n            }\n\n            _options = options;\n            _onClose = onClose;\n            _subscriptionOptions = subscriptionOptions;\n            _connection = connection.Connection;\n            _diagnosticsCb = diagnosticsCallback;\n            _lastDiagnostics = new ChannelDiagnosticModel\n            {\n                Connection = _connection,\n                TimeStamp = _timeProvider.GetUtcNow()\n            };\n            Debug.Assert(_connection.GetEndpointUrls().Any());\n            _reverseConnectManager = reverseConnectManager;\n\n            _metrics = metrics ??\n                throw new ArgumentNullException(nameof(metrics));\n            _configuration = configuration ??\n                throw new ArgumentNullException(nameof(configuration));\n            _serializer = serializer ??\n                throw new ArgumentNullException(nameof(serializer));\n            _loggerFactory = loggerFactory ??\n                throw new ArgumentNullException(nameof(loggerFactory));\n            _notifier = notifier;\n\n            InitializeMetrics();\n\n            _logger = _loggerFactory.CreateLogger<OpcUaClient>();\n            _tokens = [];\n            _lastState = EndpointConnectivityState.Disconnected;\n            _sessionName = sessionName ?? connection.ToString();\n\n            OperationTimeout = _options.Value.Quotas.OperationTimeout == 0 ? null :\n                TimeSpan.FromMilliseconds(_options.Value.Quotas.OperationTimeout);\n            NodeCacheTimeout =\n                _options.Value.NodeCacheTimeout ?? TimeSpan.FromMinutes(1);\n            NodeCacheCapacity =\n                _options.Value.NodeCacheCapacity ?? 4096;\n            DisableComplexTypePreloading =\n                _options.Value.DisableComplexTypePreloading ?? false;\n            MinReconnectDelay =\n                _options.Value.MinReconnectDelayDuration;\n            CreateSessionTimeout =\n                _options.Value.CreateSessionTimeoutDuration;\n            KeepAliveInterval =\n                _options.Value.KeepAliveIntervalDuration;\n            ServiceCallTimeout =\n                _options.Value.DefaultServiceCallTimeoutDuration;\n            ConnectTimeout =\n                _options.Value.DefaultConnectTimeoutDuration;\n            SessionTimeout =\n                _options.Value.DefaultSessionTimeoutDuration;\n            LingerTimeout =\n                _options.Value.LingerTimeoutDuration;\n            LimitOverrides\n                = new OperationLimits\n                {\n                    MaxNodesPerRead =\n                        (uint)(_options.Value.MaxNodesPerReadOverride ?? 0),\n                    MaxNodesPerBrowse =\n                        (uint)(_options.Value.MaxNodesPerBrowseOverride ?? 0)\n                    // ...\n                };\n            MinPublishRequests =\n                _options.Value.MinPublishRequests;\n            MaxPublishRequests =\n                _options.Value.MaxPublishRequests;\n            PublishRequestsPerSubscriptionPercent =\n                _options.Value.PublishRequestsPerSubscriptionPercent;\n            _maxReconnectPeriod =\n                options.Value.MaxReconnectDelayDuration ?? TimeSpan.Zero;\n            if (_maxReconnectPeriod == TimeSpan.Zero)\n            {\n                _maxReconnectPeriod = TimeSpan.FromSeconds(30);\n            }\n            _reconnectHandler = new SessionReconnectHandler(true,\n                (int)_maxReconnectPeriod.TotalMilliseconds);\n            _cts = new CancellationTokenSource();\n            _channel = Channel.CreateUnbounded<(ConnectionEvent, object?)>();\n            _disconnectLock = _lock.WriterLock(_cts.Token);\n            _channelMonitor = _timeProvider.CreateTimer(_ => OnUpdateConnectionDiagnostics(),\n                null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            _resyncTimer = _timeProvider.CreateTimer(_ => TriggerSubscriptionSynchronization(),\n                null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            _diagnosticsDumper = !DumpDiagnostics ? null :\n                DumpDiagnosticsPeriodicallyAsync(_cts.Token);\n            _sessionManager = ManageSessionStateMachineAsync(_cts.Token);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Release();\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return $\"{_sessionName} [state:{_lastState}|refs:{_refCount}]\";\n        }\n\n        /// <inheritdoc/>\n        public override async Task<ISession> RecreateAsync(ISession sessionTemplate,\n            ITransportWaitingConnection connection, CancellationToken ct)\n        {\n            //\n            // We do not support recreation of sessions create a new session from scratch.\n            // Then we add the desired subscriptions to the new session.\n            //\n            if (connection != null)\n            {\n                _logger.CreatingNewSessionWithConnection(this);\n                return await CreateAsync(_configuration, connection, sessionTemplate.ConfiguredEndpoint,\n                    true, false, _sessionName, (uint)sessionTemplate.SessionTimeout, sessionTemplate.Identity,\n                    sessionTemplate.PreferredLocales, ct).ConfigureAwait(false);\n            }\n            _logger.CreatingNewSessionWithoutConnection(this);\n            return await CreateAsync(_configuration, _reverseConnectManager,\n                sessionTemplate.ConfiguredEndpoint, true, false, _sessionName,\n                (uint)sessionTemplate.SessionTimeout, sessionTemplate.Identity,\n                sessionTemplate.PreferredLocales, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public override async Task<ISession> RecreateAsync(ISession sessionTemplate,\n            ITransportChannel? transportChannel, CancellationToken ct)\n        {\n            //\n            // We do not support recreation of sessions therefore we close\n            // and reopen the transport channel as a regular creation operation.\n            // Then we add the desired subscriptions to the new session\n            //\n            if (transportChannel != null)\n            {\n                _logger.CreatingNewSessionClosingChannel(this);\n                transportChannel.Dispose();\n            }\n            else\n            {\n                _logger.CreatingNewSession(this);\n            }\n            return await CreateAsync(_configuration, sessionTemplate.ConfiguredEndpoint,\n                true, false, _sessionName, (uint)sessionTemplate.SessionTimeout, sessionTemplate.Identity,\n                sessionTemplate.PreferredLocales, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public override Session Create(ISessionChannel channel, ApplicationConfiguration configuration,\n            ConfiguredEndpoint endpoint)\n        {\n            return new OpcUaSession(this, _serializer, _loggerFactory.CreateLogger<OpcUaSession>(),\n                _timeProvider, (ITransportChannel)channel, configuration, endpoint);\n        }\n\n        /// <inheritdoc/>\n        public override Session Create(ITransportChannel channel, ApplicationConfiguration configuration,\n            ConfiguredEndpoint endpoint, X509Certificate2? clientCertificate,\n            EndpointDescriptionCollection? availableEndpoints,\n            StringCollection? discoveryProfileUris)\n        {\n            return new OpcUaSession(this, _serializer, _loggerFactory.CreateLogger<OpcUaSession>(),\n                _timeProvider, channel, configuration, endpoint,\n                clientCertificate, availableEndpoints, discoveryProfileUris);\n        }\n\n        /// <inheritdoc/>\n        public override Task<ISession> CreateAsync(ApplicationConfiguration configuration,\n            ConfiguredEndpoint endpoint, bool updateBeforeConnect, string sessionName,\n            uint sessionTimeout, IUserIdentity identity, IList<string> preferredLocales,\n            CancellationToken ct)\n        {\n            return CreateAsync(configuration, endpoint, updateBeforeConnect, false,\n                sessionName, sessionTimeout, identity, preferredLocales, ct);\n        }\n\n        /// <inheritdoc/>\n        public async override Task<ISession> CreateAsync(ApplicationConfiguration configuration,\n            ConfiguredEndpoint endpoint, bool updateBeforeConnect, bool checkDomain,\n            string sessionName, uint sessionTimeout, IUserIdentity identity, IList<string> preferredLocales,\n            CancellationToken ct)\n        {\n            return await Session.CreateAsync(this, configuration, (ITransportWaitingConnection?)null, endpoint,\n                updateBeforeConnect, checkDomain, sessionName, sessionTimeout,\n                identity, preferredLocales, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async override Task<ISession> CreateAsync(ApplicationConfiguration configuration,\n            ITransportWaitingConnection connection, ConfiguredEndpoint endpoint, bool updateBeforeConnect,\n            bool checkDomain, string sessionName, uint sessionTimeout, IUserIdentity identity,\n            IList<string> preferredLocales, CancellationToken ct)\n        {\n            return await Session.CreateAsync(this, configuration, connection, endpoint, updateBeforeConnect,\n                checkDomain, sessionName, sessionTimeout, identity, preferredLocales, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async override Task<ISession> CreateAsync(ApplicationConfiguration configuration,\n            ReverseConnectManager? reverseConnectManager, ConfiguredEndpoint endpoint, bool updateBeforeConnect,\n            bool checkDomain, string sessionName, uint sessionTimeout, IUserIdentity userIdentity,\n            IList<string> preferredLocales, CancellationToken ct)\n        {\n            if (reverseConnectManager == null)\n            {\n                return await CreateAsync(configuration, endpoint, updateBeforeConnect,\n                    checkDomain, sessionName, sessionTimeout, userIdentity, preferredLocales,\n                    ct).ConfigureAwait(false);\n            }\n            ITransportWaitingConnection? connection;\n            do\n            {\n                connection = await reverseConnectManager.WaitForConnectionAsync(endpoint.EndpointUrl,\n                    endpoint.ReverseConnect?.ServerUri, ct).ConfigureAwait(false);\n                if (updateBeforeConnect)\n                {\n                    await endpoint.UpdateFromServerAsync(endpoint.EndpointUrl, connection,\n                        endpoint.Description.SecurityMode, endpoint.Description.SecurityPolicyUri,\n                        ct).ConfigureAwait(false);\n                    updateBeforeConnect = false;\n                    connection = null;\n                }\n            } while (connection == null);\n            return await CreateAsync(configuration, connection, endpoint, false, checkDomain,\n                sessionName, sessionTimeout, userIdentity, preferredLocales, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Reset the client\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async Task ResetAsync(CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);\n            try\n            {\n                await using var registration = ct.Register(() => tcs.TrySetCanceled()).ConfigureAwait(false);\n                _logger.Resetting(this);\n                TriggerConnectionEvent(ConnectionEvent.Reset, tcs);\n            }\n            catch (Exception ex)\n            {\n                _logger.ResetFailed(ex, this);\n                tcs.TrySetException(ex);\n            }\n            await tcs.Task.ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Get session diagnostics\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal async Task<SessionDiagnosticsModel?> GetSessionDiagnosticsAsync(\n            CancellationToken ct = default)\n        {\n            if (_session?.Connected == true)\n            {\n                return await _session.GetServerDiagnosticAsync(ct).ConfigureAwait(false);\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Close client\n        /// </summary>\n        /// <param name=\"shutdown\"></param>\n        /// <returns></returns>\n        internal async ValueTask CloseAsync(bool shutdown = false)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            try\n            {\n                _disposed = true;\n\n                _logger.Closing(this);\n                await _cts.CancelAsync().ConfigureAwait(false);\n\n                await _sessionManager.ConfigureAwait(false);\n                _reconnectHandler.Dispose();\n\n                foreach (var sampler in _samplers.Values)\n                {\n                    await sampler.DisposeAsync().ConfigureAwait(false);\n                }\n\n                _samplers.Clear();\n\n                foreach (var browser in _browsers.Values)\n                {\n                    await browser.DisposeAsync().ConfigureAwait(false);\n                }\n\n                _browsers.Clear();\n\n                await CloseSessionAsync(shutdown).ConfigureAwait(false);\n\n                _lastState = EndpointConnectivityState.Disconnected;\n\n                if (_diagnosticsDumper != null)\n                {\n                    await _diagnosticsDumper.ConfigureAwait(false);\n                }\n\n                _logger.ClosedSuccessfully(this);\n            }\n            catch (Exception ex)\n            {\n                _logger.CloseFailed(ex, this);\n            }\n            finally\n            {\n                _channelMonitor.Dispose();\n                _resyncTimer.Dispose();\n                _cts.Dispose();\n                _subscriptionLock.Dispose();\n                _meter.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Acquire a session\n        /// </summary>\n        /// <param name=\"connectTimeout\"></param>\n        /// <param name=\"serviceCallTimeout\"></param>\n        /// <param name=\"cancellationToken\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ConnectionException\"></exception>\n        /// <exception cref=\"TimeoutException\"></exception>\n        internal async Task<ISessionHandle> AcquireAsync(int? connectTimeout,\n            int? serviceCallTimeout, CancellationToken cancellationToken)\n        {\n            var timeout = GetConnectCallTimeout(connectTimeout, serviceCallTimeout);\n            using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);\n            var ct = cts.Token;\n            cts.CancelAfter(timeout); // wait max timeout on the reader lock/session\n            while (true)\n            {\n                if (_disposed)\n                {\n                    throw new ConnectionException($\"Session {_sessionName} was closed.\");\n                }\n                cancellationToken.ThrowIfCancellationRequested();\n                try\n                {\n                    var readerlock = await _lock.ReaderLockAsync(ct).ConfigureAwait(false);\n                    try\n                    {\n                        if (_session != null)\n                        {\n                            if (!DisableComplexTypeLoading && !_session.IsTypeSystemLoaded)\n                            {\n                                // Ensure type system is loaded\n                                cts.CancelAfter(timeout);\n                                await _session.GetComplexTypeSystemAsync(ct).ConfigureAwait(false);\n                            }\n\n                            //\n                            // Now clients can continue the operation with the session handle\n                            // which encapsulates the release of the reader lock as well as\n                            // the ref count to the client.\n                            //\n                            var sessionLock = readerlock;\n                            readerlock = null; // Do not dispose below but when handle is disposed\n                            return new ServiceCallContext(_session, GetServiceCallTimeout(\n                                serviceCallTimeout), this, sessionLock, cancellationToken);\n                        }\n                    }\n                    finally\n                    {\n                        readerlock?.Dispose();\n                    }\n                }\n                catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested)\n                {\n                    throw new TimeoutException(\"Connecting to the endpoint timed out.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Safely invoke the service call and retry if the session\n        /// disconnected during call.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"service\"></param>\n        /// <param name=\"connectTimeout\"></param>\n        /// <param name=\"serviceCallTimeout\"></param>\n        /// <param name=\"cancellationToken\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ConnectionException\"></exception>\n        /// <exception cref=\"TimeoutException\"></exception>\n        internal async Task<T> RunAsync<T>(Func<ServiceCallContext, Task<T>> service,\n            int? connectTimeout, int? serviceCallTimeout, CancellationToken cancellationToken)\n        {\n            var timeout = GetConnectCallTimeout(connectTimeout, serviceCallTimeout);\n            using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);\n            var ct = cts.Token;\n            cts.CancelAfter(timeout); // wait max timeout on the reader lock/session\n            while (true)\n            {\n                if (_disposed)\n                {\n                    throw new ConnectionException($\"Session {_sessionName} was closed.\");\n                }\n                cancellationToken.ThrowIfCancellationRequested();\n                try\n                {\n                    using var readerlock = await _lock.ReaderLockAsync(ct).ConfigureAwait(false);\n                    if (_session != null)\n                    {\n                        if (!DisableComplexTypeLoading && !_session.IsTypeSystemLoaded)\n                        {\n                            // Ensure type system is loaded\n                            cts.CancelAfter(timeout);\n                            await _session.GetComplexTypeSystemAsync(ct).ConfigureAwait(false);\n                        }\n\n                        var serviceTimeout = GetServiceCallTimeout(serviceCallTimeout);\n                        using var context = new ServiceCallContext(_session, serviceTimeout, ct: ct);\n                        cts.CancelAfter(serviceTimeout);\n                        var result = await service(context).ConfigureAwait(false);\n\n                        //\n                        // Check wether tracked and untracked token are the same. This is the case\n                        // with kepserver, which uses the same token for all continuations. If it\n                        // is the same, it is already tracked. If it is different, we need to untrack\n                        // and track the new one\n                        //\n                        if (context.TrackedToken != null && context.TrackedToken != context.UntrackedToken)\n                        {\n                            AddRef(context.TrackedToken);\n                        }\n                        else if (LingerTimeout != null)\n                        {\n                            AddRef(_sessionName, LingerTimeout);\n                        }\n                        if (context.UntrackedToken != null && context.TrackedToken != context.UntrackedToken)\n                        {\n                            Release(context.UntrackedToken);\n                        }\n                        return result;\n                    }\n                    // We are not resetting the timeout here since we have not yet been\n                    // able to obtain a session in the current timeout.\n                }\n                catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested)\n                {\n                    throw new TimeoutException(\n                        \"Connecting to the endpoint or the request itself timed out.\");\n                }\n                catch (Exception ex) when (!IsConnected && !cancellationToken.IsCancellationRequested)\n                {\n                    _logger.SessionDisconnected(this, ex.Message);\n\n                    cts.CancelAfter(timeout); // Reset timeout again to wait again for session\n                }\n            }\n        }\n\n        /// <summary>\n        /// Safely invoke a streaming service and retry if the session\n        /// disconnected during an operation.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"operation\"></param>\n        /// <param name=\"connectTimeout\"></param>\n        /// <param name=\"serviceCallTimeout\"></param>\n        /// <param name=\"cancellationToken\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ConnectionException\"></exception>\n        /// <exception cref=\"TimeoutException\"></exception>\n        internal async IAsyncEnumerable<T> RunAsync<T>(AsyncEnumerableBase<T> operation,\n            int? connectTimeout, int? serviceCallTimeout,\n            [EnumeratorCancellation] CancellationToken cancellationToken)\n        {\n            var timeout = GetConnectCallTimeout(connectTimeout, serviceCallTimeout);\n            using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);\n            var ct = cts.Token;\n            cts.CancelAfter(timeout); // wait max timeout on the reader lock/session\n            operation.Reset();\n            while (operation.HasMore)\n            {\n                if (_disposed)\n                {\n                    throw new ConnectionException($\"Session {_sessionName} was closed.\");\n                }\n                cancellationToken.ThrowIfCancellationRequested();\n                if (_disposed)\n                {\n                    throw new ConnectionException($\"Session {_sessionName} was closed.\");\n                }\n                IEnumerable<T> results;\n                try\n                {\n                    using var readerlock = await _lock.ReaderLockAsync(ct).ConfigureAwait(false);\n                    if (_session != null)\n                    {\n                        // Ensure type system is loaded\n                        if (!DisableComplexTypeLoading && !_session.IsTypeSystemLoaded)\n                        {\n                            cts.CancelAfter(timeout);\n                            await _session.GetComplexTypeSystemAsync(ct).ConfigureAwait(false);\n                        }\n\n                        var serviceTimeout = GetServiceCallTimeout(serviceCallTimeout);\n                        using var context = new ServiceCallContext(_session, serviceTimeout, ct: ct);\n                        cts.CancelAfter(serviceTimeout);\n                        results = await operation.ExecuteAsync(context).ConfigureAwait(false);\n                    }\n                    else\n                    {\n                        // We are not resetting the timeout here since we have not yet been\n                        // able to obtain a session in the current timeout.\n                        continue;\n                    }\n                }\n                catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested)\n                {\n                    throw new TimeoutException(\n                        \"Connecting to the endpoint or a request operation timed out.\");\n                }\n                catch (Exception ex) when (!IsConnected && !cancellationToken.IsCancellationRequested)\n                {\n                    _logger.SessionDisconnected(this, ex.Message);\n\n                    cts.CancelAfter(timeout); // Reset timeout again to wait again for session\n                    continue;\n                }\n\n                foreach (var result in results)\n                {\n                    yield return result;\n                }\n                cts.CancelAfter(timeout); // Reset timeout now to wait max timeout for session\n            }\n        }\n\n        /// <summary>\n        /// Connect\n        /// </summary>\n        /// <param name=\"token\"></param>\n        /// <param name=\"expiresAfter\"></param>\n        /// <returns></returns>\n        internal void AddRef(string? token = null, TimeSpan? expiresAfter = null)\n        {\n            // If token provided create a registered release\n            CancellationTokenSource? cts = null;\n            if (token != null)\n            {\n                lock (_tokens)\n                {\n                    //\n                    // Get any registered token and see if we can just re-arm\n                    // the timer (when the cancellation has not been requested\n                    // yet. If so we do not need to add ref at all and just\n                    // re-use the existing registered token. If there is a\n                    // token id collision then there is the potential that\n                    // tokens get removed too early using the release(token)\n                    // api. Since that is only used in the case of continuation\n                    // tokens we expect that not to happen on the same session.\n                    //\n                    if (_tokens.TryGetValue(token, out cts))\n                    {\n                        cts.CancelAfter(expiresAfter ?? TimeSpan.FromSeconds(10));\n\n                        if (!cts.IsCancellationRequested)\n                        {\n                            // Re-armed the current timer no need to add ref\n                            return;\n                        }\n\n                        _tokens.Remove(token);\n                    }\n\n                    cts = new CancellationTokenSource();\n                    _tokens.Add(token, cts);\n                }\n            }\n\n            if (Interlocked.Increment(ref _refCount) == 1)\n            {\n                // Post connection request\n                TriggerConnectionEvent(ConnectionEvent.Connect);\n            }\n\n            if (cts != null)\n            {\n                //\n                // Now that we took a reference register callback that removes\n                // registered token source under lock if it is the current one\n                // and then cancel and call release. After release dispose the\n                // token source to free the timer.\n                //\n                cts.Token.Register(() =>\n                {\n                    Debug.Assert(token != null, \"Captured token should not be null\");\n                    lock (_tokens)\n                    {\n                        if (_tokens.TryGetValue(token, out var registered) &&\n                            registered == cts)\n                        {\n                            _tokens.Remove(token);\n                        }\n                    }\n\n                    Release();\n                    cts.Dispose();\n                });\n                //\n                // Start the cancellation token source timer now and\n                // take a new reference.\n                //\n                cts.CancelAfter(expiresAfter ?? TimeSpan.FromSeconds(10));\n            }\n        }\n\n        /// <summary>\n        /// Disconnect\n        /// </summary>\n        /// <param name=\"token\"></param>\n        internal void Release(string? token = null)\n        {\n            if (token == null)\n            {\n                // Decrement reference count\n                if (Interlocked.Decrement(ref _refCount) == 0)\n                {\n                    // Post disconnect request\n                    TriggerConnectionEvent(ConnectionEvent.Disconnect);\n                }\n            }\n            else if (_tokens.TryGetValue(token, out var cts))\n            {\n                //\n                // Cancel will callback back into here, unregister from\n                // tokens cache, release the reference (above) and then\n                // dispose the tracked cancellation token source.\n                //\n                cts.Cancel();\n            }\n\n            // No token so we either expired or never registered\n            // the first is expected, the second is a bug, we cannot\n            // tell the difference though.\n        }\n\n        /// <summary>\n        /// Manages the underlying session state machine.\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task ManageSessionStateMachineAsync(CancellationToken ct)\n        {\n            var currentSessionState = SessionState.Disconnected;\n\n            var reconnectPeriod = 0;\n            var cleanup = false;\n            var reconnectTimer = _timeProvider.CreateTimer(\n                _ => TriggerConnectionEvent(ConnectionEvent.ConnectRetry), null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            try\n            {\n                await using (reconnectTimer.ConfigureAwait(false))\n                {\n                    try\n                    {\n                        await foreach (var (trigger, context) in\n                            _channel.Reader.ReadAllAsync(ct).ConfigureAwait(false))\n                        {\n                            _logger.ProcessingEvent(this, trigger.ToString(), currentSessionState.ToString());\n\n                            switch (trigger)\n                            {\n                                case ConnectionEvent.Reset:\n                                    if (currentSessionState != SessionState.Connected)\n                                    {\n                                        (context as TaskCompletionSource)?.TrySetResult();\n                                        break;\n                                    }\n                                    // If currently reconnecting, dispose the reconnect handler\n                                    _reconnectHandler.CancelReconnect();\n                                    //\n                                    // Close bypassing everything but keep channel open then trigger a\n                                    // reconnect. The reconnect will recreate the session and subscriptions\n                                    //\n                                    Debug.Assert(_session != null);\n                                    await _session.CloseAsync(false, default).ConfigureAwait(false);\n                                    goto case ConnectionEvent.StartReconnect;\n                                case ConnectionEvent.Connect:\n                                    if (currentSessionState == SessionState.Disconnected)\n                                    {\n                                        // Start connecting\n                                        cleanup = false;\n                                        reconnectTimer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                                        currentSessionState = SessionState.Connecting;\n                                        reconnectPeriod = GetMinReconnectPeriod();\n                                    }\n                                    goto case ConnectionEvent.ConnectRetry;\n                                case ConnectionEvent.ConnectRetry:\n                                    switch (currentSessionState)\n                                    {\n                                        case SessionState.Connecting:\n                                            Debug.Assert(_reconnectHandler.State == SessionReconnectHandler.ReconnectState.Ready);\n                                            Debug.Assert(_disconnectLock != null);\n                                            Debug.Assert(_session == null);\n\n                                            if (!await TryConnectAsync(ct).ConfigureAwait(false) ||\n                                                !await TrySyncAsync(ct).ConfigureAwait(false))\n                                            {\n                                                // Reschedule connecting\n                                                await CloseSessionAsync(false).ConfigureAwait(false);\n                                                Debug.Assert(reconnectPeriod != 0, \"Reconnect period should not be 0.\");\n                                                var retryDelay = TimeSpan.FromMilliseconds(\n                                                    _reconnectHandler.CheckedReconnectPeriod(reconnectPeriod));\n                                                _logger.RetryingConnection(this, retryDelay);\n                                                reconnectTimer.Change(retryDelay, Timeout.InfiniteTimeSpan);\n                                                reconnectPeriod = _reconnectHandler.JitteredReconnectPeriod(reconnectPeriod);\n                                                break;\n                                            }\n\n                                            Debug.Assert(_session != null);\n\n                                            // Allow access to session now\n                                            Debug.Assert(_disconnectLock != null);\n                                            _disconnectLock.Dispose();\n                                            _disconnectLock = null;\n\n                                            _reconnectRequired = 0;\n                                            currentSessionState = SessionState.Connected;\n                                            NotifySubscriptions(_session, false);\n                                            break;\n                                        case SessionState.Disconnected:\n                                            // the client is disconnected and we scheduled it for cleanup\n                                            if (cleanup)\n                                            {\n                                                return;\n                                            }\n                                            // Nothing to do, wait for connect\n                                            break;\n                                        case SessionState.Connected:\n                                            // Nothing to do, already connected\n                                            break;\n                                        case SessionState.Reconnecting:\n                                            Debug.Fail(\"Should not be connecting during reconnecting.\");\n                                            break;\n                                    }\n                                    break;\n                                case ConnectionEvent.SubscriptionSyncOne:\n                                    var subscriptionToSync = context as OpcUaSubscription;\n                                    Debug.Assert(subscriptionToSync != null);\n                                    await SyncAsync(subscriptionToSync, ct).ConfigureAwait(false);\n                                    break;\n                                case ConnectionEvent.SubscriptionSyncAll:\n                                    await TrySyncAsync(ct).ConfigureAwait(false);\n                                    break;\n                                case ConnectionEvent.StartReconnect: // sent by the keep alive timeout path\n                                    switch (currentSessionState)\n                                    {\n                                        case SessionState.Connected: // only valid when connected.\n                                            Debug.Assert(_reconnectHandler.State == SessionReconnectHandler.ReconnectState.Ready);\n                                            _logger.ReconnectingSession(this, _sessionName,\n                                                (context is ServiceResult sr) ? \"error \" + sr : \"RESET\");\n\n                                            // Ensure no more access to the session through reader locks\n                                            Debug.Assert(_disconnectLock == null);\n                                            _disconnectLock = await _lock.WriterLockAsync(ct);\n                                            _logger.BeginReconnectingSession(this, _sessionName);\n                                            Debug.Assert(_session != null);\n                                            var state = _reconnectHandler.BeginReconnect(_session,\n                                                _reverseConnectManager, GetMinReconnectPeriod(), (sender, evt) =>\n                                                {\n                                                    if (!ReferenceEquals(sender, _reconnectHandler))\n                                                    {\n                                                        _logger.ReconnectHandlerMismatch(this);\n                                                        return;\n                                                    }\n                                                    TriggerConnectionEvent(ConnectionEvent.ReconnectComplete,\n                                                        _reconnectHandler.Session);\n                                                });\n\n                                            // Save session while reconnecting.\n                                            Debug.Assert(_reconnectingSession == null);\n                                            _reconnectingSession = _session;\n                                            _session = null;\n                                            NotifyConnectivityStateChange(EndpointConnectivityState.Connecting);\n                                            currentSessionState = SessionState.Reconnecting;\n                                            NotifySubscriptions(_reconnectingSession, true);\n                                            (context as TaskCompletionSource)?.TrySetResult();\n                                            break;\n                                        case SessionState.Disconnected:\n                                        case SessionState.Connecting:\n                                        case SessionState.Reconnecting:\n                                            // Nothing to do in this state\n                                            break;\n                                    }\n                                    break;\n\n                                case ConnectionEvent.ReconnectComplete:\n                                    // if session recovered, Session property is not null\n                                    var reconnected = _reconnectHandler.Session as OpcUaSession;\n                                    switch (currentSessionState)\n                                    {\n                                        case SessionState.Reconnecting:\n                                            _logger.CompletedReconnectingSession(this, _sessionName);\n                                            //\n                                            // Behavior of the reconnect handler is as follows:\n                                            // 1) newSession == null\n                                            //  => then the old session is still good, we missed keep alive.\n                                            // 2) newSession != null but equal to previous session\n                                            //  => new channel was opened but the existing session was reactivated\n                                            // 3) newSession != previous Session\n                                            //  => everything reconnected and new session was activated.\n                                            //\n                                            reconnected ??= _reconnectingSession;\n\n                                            Debug.Assert(reconnected != null, \"reconnected should never be null\");\n                                            Debug.Assert(reconnected.Connected, \"reconnected should always be connected\");\n\n                                            // Handles all 3 cases above.\n                                            var isNew = await UpdateSessionAsync(reconnected).ConfigureAwait(false);\n\n                                            Debug.Assert(_session != null);\n                                            Debug.Assert(_reconnectingSession == null);\n                                            if (!isNew)\n                                            {\n                                                // Case 1) and 2)\n                                                _logger.ClientRecovered(this);\n                                            }\n                                            else\n                                            {\n                                                // Case 3)\n                                                _logger.ClientReconnected(this);\n                                                _numberOfConnectionRetries++;\n                                            }\n\n                                            // If not already ready, signal we are ready again and ...\n                                            NotifyConnectivityStateChange(EndpointConnectivityState.Ready);\n                                            // ... allow access to the client again\n                                            Debug.Assert(_disconnectLock != null);\n                                            _disconnectLock.Dispose();\n                                            _disconnectLock = null;\n                                            _reconnectRequired = 0;\n                                            reconnectPeriod = GetMinReconnectPeriod();\n                                            currentSessionState = SessionState.Connected;\n\n                                            if (!await TrySyncAsync(ct).ConfigureAwait(false))\n                                            {\n                                                TriggerReconnect(StatusCodes.BadNotConnected,\n                                                    \"Failed to synchronize subscriptions after reconnect.\");\n                                                break;\n                                            }\n                                            NotifySubscriptions(_session, false);\n                                            break;\n\n                                        case SessionState.Connected:\n                                            Debug.Fail(\"Should not signal reconnected when already connected.\");\n                                            break;\n                                        case SessionState.Connecting:\n                                        case SessionState.Disconnected:\n                                            Debug.Assert(_reconnectingSession == null);\n                                            reconnected?.Dispose();\n                                            break;\n                                    }\n                                    break;\n                                case ConnectionEvent.Disconnect:\n                                    if (currentSessionState != SessionState.Disconnected)\n                                    {\n                                        await HandleDisconnectEvent(ct).ConfigureAwait(false);\n                                        currentSessionState = SessionState.Disconnected;\n\n                                        // Set trigger to close in 1 minute if not reconnected\n                                        cleanup = true;\n                                        reconnectTimer.Change(TimeSpan.FromMinutes(1), Timeout.InfiniteTimeSpan);\n                                    }\n                                    break;\n                            }\n\n                            _logger.EventProcessed(this, trigger.ToString(), currentSessionState.ToString());\n                        }\n                    }\n                    catch (OperationCanceledException) { }\n                    catch (Exception ex)\n                    {\n                        _logger.ConnectionManagerExited(ex, this);\n                    }\n                    finally\n                    {\n                        _reconnectHandler.CancelReconnect();\n                    }\n                }\n            }\n            catch (OperationCanceledException) { }\n            catch (Exception ex)\n            {\n                _logger.ManagementLoopException(ex, this);\n                throw;\n            }\n            finally\n            {\n                if (currentSessionState != SessionState.Disconnected)\n                {\n                    _logger.DisconnectingDisposed(this);\n                    await HandleDisconnectEvent(default).ConfigureAwait(false);\n                    currentSessionState = SessionState.Disconnected;\n                }\n                _logger.ExitingManagementLoop(this);\n\n                await _onClose().ConfigureAwait(false);\n            }\n\n            async ValueTask HandleDisconnectEvent(CancellationToken cancellationToken)\n            {\n                // If currently reconnecting, dispose the reconnect handler and stop timer\n                _reconnectHandler.CancelReconnect();\n                reconnectTimer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n\n                // if not already disconnected, aquire writer lock\n                _disconnectLock ??= await _lock.WriterLockAsync(cancellationToken);\n                reconnectPeriod = 0;\n\n                NotifyConnectivityStateChange(EndpointConnectivityState.Disconnected);\n                NotifySubscriptions(_session, true);\n\n                await CloseSessionAsync().ConfigureAwait(false);\n                Debug.Assert(_session == null);\n            }\n\n            static void NotifySubscriptions(OpcUaSession? session, bool disconnected)\n            {\n                if (session == null)\n                {\n                    return;\n                }\n                foreach (var h in session.SubscriptionHandles.Values)\n                {\n                    h.NotifySessionConnectionState(disconnected);\n                }\n            }\n\n            int GetMinReconnectPeriod()\n            {\n                var reconnectPeriod = MinReconnectDelay ?? TimeSpan.Zero;\n                if (reconnectPeriod == TimeSpan.Zero)\n                {\n                    reconnectPeriod = TimeSpan.FromSeconds(1);\n                }\n                if (reconnectPeriod > _maxReconnectPeriod)\n                {\n                    reconnectPeriod = _maxReconnectPeriod;\n                }\n                return (int)reconnectPeriod.TotalMilliseconds;\n            }\n        }\n\n        /// <summary>\n        /// Log namespace table changes\n        /// </summary>\n        /// <param name=\"oldTable\"></param>\n        /// <param name=\"newTable\"></param>\n        private void LogNamespaceTableChanges(string[] oldTable, string[] newTable)\n        {\n            var tableChanged = false;\n            for (var i = 0; i < Math.Max(oldTable.Length, newTable.Length); i++)\n            {\n                if (i < oldTable.Length && i < newTable.Length)\n                {\n                    if (oldTable[i] == newTable[i])\n                    {\n                        continue;\n                    }\n                    tableChanged = true;\n                    _logger.NamespaceIndexChanged(this, i, oldTable[i], newTable[i]);\n                }\n                else if (i < oldTable.Length)\n                {\n                    tableChanged = true;\n                    _logger.NamespaceIndexRemoved(this, i, oldTable[i]);\n                }\n                else\n                {\n                    tableChanged = true;\n                    _logger.NamespaceIndexAdded(this, i, newTable[i]);\n                }\n            }\n            if (tableChanged)\n            {\n                Interlocked.Increment(ref _namespaceTableChanges);\n            }\n        }\n\n        private const int kMinPublishRequestCount = 2;\n        private const int kMaxPublishRequestCount = 10;\n\n        /// <summary>\n        /// Ensure min publish requests are configured correctly\n        /// </summary>\n        private void UpdatePublishRequestCounts()\n        {\n            var session = _session;\n            if (session == null)\n            {\n                return;\n            }\n\n            var minPublishRequests = MinPublishRequests ?? 0;\n            if (minPublishRequests <= 0)\n            {\n                minPublishRequests = kMinPublishRequestCount;\n            }\n\n            var maxPublishRequests = MaxPublishRequests ?? kMaxPublishRequestCount;\n            if (maxPublishRequests <= 0 || maxPublishRequests > ushort.MaxValue)\n            {\n                maxPublishRequests = ushort.MaxValue;\n            }\n\n            var createdSubscriptions = SubscriptionCount;\n            if (PublishRequestsPerSubscriptionPercent.HasValue)\n            {\n                var percentage = PublishRequestsPerSubscriptionPercent ?? 100;\n                var minPublishOverride = percentage == 100 || percentage <= 0 ?\n                    createdSubscriptions :\n                    (int)Math.Ceiling(createdSubscriptions * (percentage / 100.0));\n                if (minPublishRequests < minPublishOverride)\n                {\n                    minPublishRequests = minPublishOverride;\n                }\n            }\n\n            Debug.Assert(minPublishRequests > 0);\n            Debug.Assert(maxPublishRequests > 0);\n\n            if (minPublishRequests > maxPublishRequests)\n            {\n                // Dont allow min to be higher than max\n                minPublishRequests = maxPublishRequests;\n            }\n\n            //\n            // The stack will choose a value based on the subscription\n            // count that is between min and max.\n            //\n            session.MinPublishRequestCount = minPublishRequests;\n            session.MaxPublishRequestCount = maxPublishRequests;\n\n            if (createdSubscriptions > 0 && minPublishRequests > OutstandingRequestCount)\n            {\n                session.StartPublishing(session.OperationTimeout, false);\n            }\n        }\n\n        /// <summary>\n        /// Connect client\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async ValueTask<bool> TryConnectAsync(CancellationToken ct)\n        {\n            var timeout = CreateSessionTimeout ?? TimeSpan.FromSeconds(10);\n\n            NotifyConnectivityStateChange(EndpointConnectivityState.Connecting);\n            Debug.Assert(_connection.Endpoint != null);\n\n            _logger.ConnectingToEndpoint(this, _connection.Endpoint.Url);\n            var attempt = 0;\n            foreach (var nextUrl in _connection.GetEndpointUrls())\n            {\n                var endpointUrl = nextUrl;\n\n                // Ensure any previous session is disposed here.\n                await CloseSessionAsync().ConfigureAwait(false);\n                ct.ThrowIfCancellationRequested();\n                try\n                {\n                    ITransportWaitingConnection? connection = null;\n                    if (_reverseConnectManager != null)\n                    {\n                        connection = await _reverseConnectManager.WaitForConnectionAsync(\n                            endpointUrl, null, ct).ConfigureAwait(false);\n                    }\n\n                    //\n                    // Get the endpoint by connecting to server's discovery endpoint.\n                    // Try to find the first endpoint with security.\n                    //\n                    var securityMode = _connection.Endpoint.SecurityMode ?? SecurityMode.NotNone;\n                    var securityProfile = _connection.Endpoint.SecurityPolicy;\n                    var endpointDescription = await SelectEndpointAsync(_configuration,\n                        endpointUrl, connection, securityMode, securityProfile, _logger,\n                        this, ct: ct).ConfigureAwait(false);\n                    if (endpointDescription == null)\n                    {\n                        _logger.NoMatchingEndpoint(this, _sessionName);\n                        continue;\n                    }\n\n                    endpointUrl = Utils.ParseUri(endpointDescription.EndpointUrl);\n                    var endpointConfiguration = EndpointConfiguration.Create(_configuration);\n                    endpointConfiguration.OperationTimeout =\n                        (int)timeout.TotalMilliseconds;\n                    var endpoint = new ConfiguredEndpoint(null, endpointDescription,\n                        endpointConfiguration);\n\n                    var credential = _connection.User;\n                    if (securityMode == SecurityMode.Best &&\n                        endpointDescription.SecurityMode == MessageSecurityMode.None)\n                    {\n                        _logger.NoSecurityEnabled(this, endpointUrl, _sessionName);\n\n                        credential = null;\n                    }\n\n                    var userIdentity = await credential.ToUserIdentityAsync(\n                        _configuration).ConfigureAwait(false);\n\n                    var identityPolicy = endpoint.Description.FindUserTokenPolicy(\n                        userIdentity.TokenType, userIdentity.IssuedTokenType, endpointDescription.SecurityPolicyUri);\n                    if (identityPolicy == null)\n                    {\n                        _logger.NoUserTokenPolicy(this, userIdentity.TokenType,\n                            userIdentity.IssuedTokenType, endpointUrl, _sessionName);\n                        continue;\n                    }\n                    _logger.CreatingSession(++attempt, this, _sessionName, endpointUrl);\n\n                    var preferredLocales = _connection.Locales?.ToList() ?? [];\n                    if (preferredLocales.Count == 0)\n                    {\n                        // Create the session with english as default\n                        preferredLocales.Add(\"en-US\");\n                        if (CultureInfo.CurrentCulture.Name != preferredLocales[0])\n                        {\n                            // and current language locale as backup\n                            preferredLocales.Add(CultureInfo.CurrentCulture.Name);\n                        }\n                    }\n                    var sessionTimeout = SessionTimeout ?? TimeSpan.FromSeconds(30);\n                    var session = await CreateAsync(_configuration,\n                        _reverseConnectManager, endpoint,\n                        // Update endpoint through discovery\n                        updateBeforeConnect: _reverseConnectManager != null,\n                        checkDomain: false, // Domain must match on connect\n                        _sessionName, (uint)sessionTimeout.TotalMilliseconds,\n                        userIdentity, preferredLocales, ct).ConfigureAwait(false) as OpcUaSession;\n\n                    Debug.Assert(session != null);\n                    session.RenewUserIdentity += (_, _) => userIdentity;\n\n                    // Assign the session\n                    var isNew = await UpdateSessionAsync(session).ConfigureAwait(false);\n                    Debug.Assert(isNew);\n                    _logger.NewSessionCreated(this, _sessionName, endpointUrl, _connection.Endpoint.Url);\n\n                    _logger.ClientConnected(this, endpointUrl);\n                    return true;\n                }\n                catch (Exception ex)\n                {\n                    NotifyConnectivityStateChange(ToConnectivityState(ex));\n                    _numberOfConnectionRetries++;\n                    _logger.ConnectionFailed(++attempt, this, endpointUrl, ex.Message);\n                }\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Handle publish errors\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"e\"></param>\n        internal void Session_HandlePublishError(ISession session, PublishErrorEventArgs e)\n        {\n            if (!ReferenceEquals(session, _session))\n            {\n                if (_session != null)\n                {\n                    _logger.PublishErrorDifferentSession(this, session.ToString());\n                }\n                return;\n            }\n            switch (e.Status.Code)\n            {\n                case StatusCodes.BadSessionIdInvalid:\n                case StatusCodes.BadSecureChannelClosed:\n                case StatusCodes.BadSessionClosed:\n                case StatusCodes.BadConnectionClosed:\n                case StatusCodes.BadServerHalted:\n                case StatusCodes.BadNotConnected:\n                case StatusCodes.BadNoCommunication:\n                case StatusCodes.BadNoSubscription: // Never sent in current stack version\n                    TriggerReconnect(e.Status, \"Publish\");\n                    return;\n                default:\n                    _logger.PublishError(this, e.Status.ToString());\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Feed back acknoledgements\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"e\"></param>\n        internal void Session_PublishSequenceNumbersToAcknowledge(ISession context,\n            PublishSequenceNumbersToAcknowledgeEventArgs e)\n        {\n            if (context is not OpcUaSession session)\n            {\n                return;\n            }\n\n            // Reset timeout counter\n            _publishTimeoutCounter = 0;\n\n            var acks = e.AcknowledgementsToSend\n                .Concat(e.DeferredAcknowledgementsToSend)\n                .ToHashSet();\n            if (acks.Count == 0)\n            {\n                return;\n            }\n            e.AcknowledgementsToSend.Clear();\n            e.DeferredAcknowledgementsToSend.Clear();\n\n            foreach (var subscription in session.SubscriptionHandles.Values)\n            {\n                if (!subscription.TryGetCurrentPosition(out var sid, out var seq))\n                {\n                    // No deferrals\n                    e.AcknowledgementsToSend.AddRange(acks.Where(a => a.SubscriptionId == sid));\n                }\n                else\n                {\n                    // Ack all messages before this one for the subscriptoin\n                    e.AcknowledgementsToSend.AddRange(acks.Where(a => a.SubscriptionId == sid\n                        && (int)a.SequenceNumber <= (int)seq));\n                }\n            }\n            e.DeferredAcknowledgementsToSend.AddRange(acks.Except(e.AcknowledgementsToSend));\n\n            if (_logger.IsEnabled(LogLevel.Trace))\n            {\n                _logger.SendingAcks(this, Environment.CurrentManagedThreadId,\n                    ToString(e.AcknowledgementsToSend),\n                    ToString(e.DeferredAcknowledgementsToSend),\n                    session.GoodPublishRequestCount);\n                static string ToString(SubscriptionAcknowledgementCollection acks)\n                {\n                    return acks.Count == 0 ? \"no\" : acks\n                        .OrderBy(a => a.SubscriptionId)\n                        .Select(a => $\"{a.SubscriptionId}:{a.SequenceNumber}\")\n                        .Aggregate((a, b) => $\"{a}, {b}\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handles a keep alive event from a session and triggers a reconnect\n        /// if necessary.\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"e\"></param>\n        internal void Session_KeepAlive(ISession session, KeepAliveEventArgs e)\n        {\n            if (_disposed)\n            {\n                return;\n            }\n            try\n            {\n                // check for events from discarded sessions.\n                if (!ReferenceEquals(session, _session))\n                {\n                    if (_session != null)\n                    {\n                        _logger.KeepAliveErrorDifferentSession(this, session.ToString());\n                    }\n                    return;\n                }\n                // start reconnect sequence on communication error.\n                Interlocked.Increment(ref _keepAliveCounter);\n                if (ServiceResult.IsBad(e.Status))\n                {\n                    _keepAliveCounter = 0;\n                    TriggerReconnect(e.Status, \"Keep alive\");\n                }\n                else if (SubscriptionCount > 0 && GoodPublishRequestCount == 0)\n                {\n                    UpdatePublishRequestCounts();\n                }\n                Interlocked.Increment(ref _keepAliveTotal);\n            }\n            catch (Exception ex)\n            {\n                _logger.KeepAliveError(ex, this);\n            }\n        }\n\n        /// <summary>\n        /// Trigger reconnect\n        /// </summary>\n        /// <param name=\"sr\"></param>\n        /// <param name=\"action\"></param>\n        void TriggerReconnect(ServiceResult sr, string action)\n        {\n            if (Interlocked.Increment(ref _reconnectRequired) == 1)\n            {\n                _logger.TriggerReconnect(this, sr.ToString(), action);\n\n                // Ensure we reconnect\n                TriggerConnectionEvent(ConnectionEvent.StartReconnect, sr);\n            }\n        }\n\n        /// <summary>\n        /// Trigger connection event\n        /// </summary>\n        /// <param name=\"evt\"></param>\n        /// <param name=\"context\"></param>\n        private void TriggerConnectionEvent(ConnectionEvent evt, object? context = null)\n        {\n            _channel.Writer.TryWrite((evt, context));\n        }\n\n        /// <summary>\n        /// Update session state\n        /// </summary>\n        /// <param name=\"session\"></param>\n        private async ValueTask<bool> UpdateSessionAsync(ISession session)\n        {\n            _publishTimeoutCounter = 0;\n            Debug.Assert(session is OpcUaSession);\n\n            if (_session == null)\n            {\n                _session = _reconnectingSession;\n                _reconnectingSession = null;\n            }\n\n            var oldTable = _session?.NamespaceUris.ToArray();\n            Debug.Assert(_reconnectingSession == null);\n            var isNewSession = false;\n            if (!ReferenceEquals(_session, session))\n            {\n                await CloseSessionAsync().ConfigureAwait(false);\n                _session = (OpcUaSession)session;\n                isNewSession = true;\n\n                kSessions.Add(1, _metrics.TagList);\n                _numberofSuccessfulConnections++;\n            }\n\n            UpdatePublishRequestCounts();\n            NotifyConnectivityStateChange(EndpointConnectivityState.Ready);\n            UpdateNamespaceTableAndSessionDiagnostics(_session, oldTable);\n            return isNewSession;\n\n            void UpdateNamespaceTableAndSessionDiagnostics(OpcUaSession session,\n                string[]? oldTable)\n            {\n                if (oldTable != null)\n                {\n                    var newTable = session.NamespaceUris.ToArray();\n                    LogNamespaceTableChanges(oldTable, newTable);\n                }\n\n                lock (_channelLock)\n                {\n                    UpdateConnectionDiagnosticFromSession(session);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Update diagnostic if the channel has changed\n        /// </summary>\n        private void OnUpdateConnectionDiagnostics()\n        {\n            if (_session != null)\n            {\n                lock (_channelLock)\n                {\n                    UpdateConnectionDiagnosticFromSession(_session);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Update session diagnostics\n        /// </summary>\n        /// <param name=\"session\"></param>\n        private void UpdateConnectionDiagnosticFromSession(OpcUaSession session)\n        {\n            // Called under lock\n\n            var channel = session.TransportChannel;\n            var token = channel?.CurrentToken;\n\n            var now = _timeProvider.GetUtcNow();\n\n            var lastDiagnostics = _lastDiagnostics;\n            var elapsed = now - lastDiagnostics.TimeStamp;\n\n            var channelChanged = false;\n            if (token != null)\n            {\n                //\n                // Monitor channel's token lifetime and update diagnostics\n                // Check wether the token or channel changed. If so set a\n                // timer to monitor the new token lifetime, if not then\n                // try again after the remaining lifetime or every second\n                // until it changed unless the token is then later gone.\n                //\n                channelChanged = !(lastDiagnostics != null &&\n                    lastDiagnostics.ChannelId == token.ChannelId &&\n                    lastDiagnostics.TokenId == token.TokenId &&\n                    lastDiagnostics.CreatedAt == token.CreatedAt);\n\n                var lifetime = TimeSpan.FromMilliseconds(Math.Min(token.Lifetime,\n                    _configuration.TransportQuotas.SecurityTokenLifetime));\n                if (channelChanged)\n                {\n                    _channelMonitor.Change(lifetime, Timeout.InfiniteTimeSpan);\n                    _logger.ChannelGotNewToken(\n                        token.ChannelId.ToString(CultureInfo.InvariantCulture),\n                        token.TokenId.ToString(CultureInfo.InvariantCulture),\n                        token.CreatedAt);\n                }\n                else\n                {\n                    //\n                    // Token has not yet been updated, let's retry later\n                    // It is also assumed that the port/ip are still the same\n                    //\n                    if (lifetime > elapsed)\n                    {\n                        _channelMonitor.Change(lifetime - elapsed,\n                            Timeout.InfiniteTimeSpan);\n                    }\n                    else\n                    {\n                        _channelMonitor.Change(TimeSpan.FromSeconds(1),\n                            Timeout.InfiniteTimeSpan);\n                    }\n                }\n            }\n\n            var sessionId = session.SessionId?.AsString(session.MessageContext,\n                NamespaceFormat.Index);\n\n            // Get effective ip address and port\n            var socket = (channel as UaSCUaBinaryTransportChannel)?.Socket;\n            var remoteIpAddress = socket?.RemoteEndpoint?.GetIPAddress()?.ToString();\n            var remotePort = socket?.RemoteEndpoint?.GetPort();\n            var localIpAddress = socket?.LocalEndpoint?.GetIPAddress()?.ToString();\n            var localPort = socket?.LocalEndpoint?.GetPort();\n\n            if (_lastDiagnostics.SessionCreated == session.CreatedAt &&\n                _lastDiagnostics.SessionId == sessionId &&\n                _lastDiagnostics.RemoteIpAddress == remoteIpAddress &&\n                _lastDiagnostics.RemotePort == remotePort &&\n                _lastDiagnostics.LocalIpAddress == localIpAddress &&\n                _lastDiagnostics.LocalPort == localPort &&\n                !channelChanged)\n            {\n                return;\n            }\n\n            _lastDiagnostics = new ChannelDiagnosticModel\n            {\n                Connection = _connection,\n                TimeStamp = now,\n                SessionCreated = session.CreatedAt,\n                SessionId = sessionId,\n                RemoteIpAddress = remoteIpAddress,\n                RemotePort = remotePort == -1 ? null : remotePort,\n                LocalIpAddress = localIpAddress,\n                LocalPort = localPort == -1 ? null : localPort,\n                ChannelId = token?.ChannelId,\n                TokenId = token?.TokenId,\n                CreatedAt = token?.CreatedAt,\n                Lifetime = token == null ? null :\n                    TimeSpan.FromMilliseconds(token.Lifetime),\n                Client = ToChannelKey(token?.ClientInitializationVector,\n                    token?.ClientEncryptingKey, token?.ClientSigningKey),\n                Server = ToChannelKey(token?.ServerInitializationVector,\n                    token?.ServerEncryptingKey, token?.ServerSigningKey)\n            };\n            _diagnosticsCb(_lastDiagnostics);\n\n            _logger.ChannelDiagnosticsUpdated(sessionId);\n\n            static ChannelKeyModel? ToChannelKey(byte[]? iv, byte[]? key, byte[]? sk)\n            {\n                if (iv == null || key == null || sk == null ||\n                    iv.Length == 0 || key.Length == 0 || sk.Length == 0)\n                {\n                    return null;\n                }\n                return new ChannelKeyModel\n                {\n                    Iv = iv,\n                    Key = key,\n                    SigLen = sk.Length\n                };\n            }\n        }\n\n        /// <summary>\n        /// Unset and dispose existing session\n        /// </summary>\n        /// <param name=\"shutdown\"></param>\n        /// <returns></returns>\n        private async ValueTask CloseSessionAsync(bool shutdown = false)\n        {\n            if (_reconnectingSession != null)\n            {\n                await DisposeAsync(_reconnectingSession).ConfigureAwait(false);\n                _reconnectingSession = null;\n            }\n\n            if (_session != null)\n            {\n                await DisposeAsync(_session).ConfigureAwait(false);\n                _session = null;\n            }\n\n            _publishTimeoutCounter = 0;\n\n            async ValueTask DisposeAsync(OpcUaSession session)\n            {\n                try\n                {\n                    if (shutdown)\n                    {\n                        // When shutting down, delete all subscriptions\n                        session.DeleteSubscriptionsOnClose = true;\n                    }\n                    session.UpdateOperationTimeout(true);\n                    await session.CloseAsync(CancellationToken.None).ConfigureAwait(false);\n\n                    _logger.SessionClosed(this, session);\n                }\n                catch (Exception ex)\n                {\n                    _logger.SessionCloseFailed(ex, this, session);\n                }\n                finally\n                {\n                    session.Dispose();\n                    kSessions.Add(-1, _metrics.TagList);\n                }\n                Debug.Assert(session.SubscriptionCount == 0);\n            }\n        }\n\n        /// <summary>\n        /// Notify about new connectivity state using any status callback registered.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        /// <returns></returns>\n        private void NotifyConnectivityStateChange(EndpointConnectivityState state)\n        {\n            var previous = _lastState;\n            if (previous == state)\n            {\n                return;\n            }\n            if (previous != EndpointConnectivityState.Connecting &&\n                previous != EndpointConnectivityState.Ready &&\n                state == EndpointConnectivityState.Error)\n            {\n                // Do not change state to generic error once we have\n                // a specific error state already set...\n                _logger.ErrorLeavingState(this, _connection.Endpoint!.Url, previous);\n                return;\n            }\n            _lastState = state;\n\n            if (state == EndpointConnectivityState.Ready)\n            {\n                lock (_browsers)\n                {\n                    foreach (var browser in _browsers.Values)\n                    {\n                        browser.OnConnected();\n                    }\n                }\n            }\n\n            _logger.SessionStateChanged(this, _sessionName, _connection.Endpoint!.Url, previous, state);\n            try\n            {\n                _notifier?.Invoke(this, new EndpointConnectivityStateEventArgs(state));\n            }\n            catch (Exception ex)\n            {\n                _logger.ExceptionDuringStateCallback(ex, this);\n            }\n        }\n\n        /// <summary>\n        /// Select the endpoint to use\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"discoveryUrl\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"securityMode\"></param>\n        /// <param name=\"securityPolicy\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"endpointUrl\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        internal static async Task<EndpointDescription?> SelectEndpointAsync(\n            ApplicationConfiguration configuration, Uri? discoveryUrl,\n            ITransportWaitingConnection? connection, SecurityMode securityMode,\n            string? securityPolicy, ILogger logger, object? context,\n            string? endpointUrl = null, CancellationToken ct = default)\n        {\n            var ctx = context?.ToString() ?? \"null\";\n            var endpointConfiguration = EndpointConfiguration.Create();\n            endpointConfiguration.OperationTimeout =\n                (int)TimeSpan.FromSeconds(15).TotalMilliseconds;\n\n            // needs to add the /discovery onto http urls\n            if (connection == null)\n            {\n                if (discoveryUrl == null)\n                {\n                    return null;\n                }\n                if (discoveryUrl.Scheme == Utils.UriSchemeHttp &&\n                    !discoveryUrl.AbsolutePath.EndsWith(\"/discovery\",\n                        StringComparison.OrdinalIgnoreCase))\n                {\n                    discoveryUrl = new UriBuilder(discoveryUrl)\n                    {\n                        Path = discoveryUrl.AbsolutePath.TrimEnd('/') + \"/discovery\"\n                    }.Uri;\n                }\n            }\n\n            using var client = connection != null ?\n                DiscoveryClient.Create(configuration, connection, endpointConfiguration) :\n                DiscoveryClient.Create(configuration, discoveryUrl, endpointConfiguration);\n            var uri = new Uri(endpointUrl ?? client.Endpoint.EndpointUrl);\n            var endpoints = await client.GetEndpointsAsync(null, ct).ConfigureAwait(false);\n            discoveryUrl ??= uri;\n\n            logger.DiscoveryEndpointReturnedEndpoints(ctx,\n                discoveryUrl, uri, securityMode, securityPolicy ?? \"any\", endpoints.Select(\n                    ep => \"      \" + ToString(ep)).Aggregate((a, b) => $\"{a}\\n{b}\"));\n\n            var filtered = endpoints\n                .Where(ep =>\n                    SecurityPolicies.GetDisplayName(ep.SecurityPolicyUri) != null &&\n                    ep.SecurityMode.IsSame(securityMode) &&\n                    (securityPolicy == null ||\n                     string.Equals(ep.SecurityPolicyUri,\n                        securityPolicy,\n                        StringComparison.OrdinalIgnoreCase) ||\n                     string.Equals(ep.SecurityPolicyUri,\n                        \"http://opcfoundation.org/UA/SecurityPolicy#\" + securityPolicy,\n                        StringComparison.OrdinalIgnoreCase)))\n                //\n                // The security level is a relative measure assigned by the server\n                // to the endpoints that it returns. Clients should always pick the\n                // highest level unless they have a reason not too. Some servers\n                // however, mess this up a bit. So group SecurityLevel also by\n                // security mode and then pick the highest in that group.\n                //\n                .OrderByDescending(ep => ((int)ep.SecurityMode << 8) | ep.SecurityLevel)\n                .ToList();\n\n            //\n            // Try to find endpoint that matches scheme and endpoint url path\n            // but fall back to match just the scheme. We need to match only\n            // scheme to support the reverse connect (indicated by connection\n            // being not null here).\n            //\n            var selected = filtered.Find(ep => Match(ep, uri, true, true))\n                        ?? filtered.Find(ep => Match(ep, uri, true, false));\n            if (connection != null)\n            {\n                //\n                // Only allow same uri scheme (which must also be opc.tcp)\n                // for when reverse connection is used.\n                //\n                if (selected != null)\n                {\n                    logger.EndpointSelectedViaReverseConnect(ctx, ToString(selected));\n                }\n                return selected;\n            }\n\n            if (selected == null)\n            {\n                //\n                // Fall back to first supported endpoint matching absolute path\n                // then fall back to first endpoint (backwards compatibilty)\n                //\n                selected = filtered.Find(ep => Match(ep, uri, false, true))\n                        ?? filtered.Find(ep => Match(ep, uri, false, false));\n\n                if (selected == null)\n                {\n                    return null;\n                }\n            }\n\n            //\n            // Adjust the host name and port to the host name and port\n            // that was use to successfully connect the discovery client\n            //\n            var selectedUrl = Utils.ParseUri(selected.EndpointUrl);\n            if (selectedUrl != null && discoveryUrl != null &&\n                selectedUrl.Scheme == discoveryUrl.Scheme)\n            {\n                selected.EndpointUrl = new UriBuilder(selectedUrl)\n                {\n                    Host = discoveryUrl.DnsSafeHost,\n                    Port = discoveryUrl.Port\n                }.ToString();\n            }\n\n            logger.EndpointSelected(ctx, ToString(selected));\n            return selected;\n\n            static string ToString(EndpointDescription ep) =>\n$\"#{ep.SecurityLevel:000}: {ep.EndpointUrl}|{ep.SecurityMode} [{ep.SecurityPolicyUri}]\";\n            // Match endpoint returned against desired endpoint url\n            static bool Match(EndpointDescription endpointDescription,\n                Uri endpointUrl, bool includeScheme, bool includePath)\n            {\n                var url = Utils.ParseUri(endpointDescription.EndpointUrl);\n                return url != null &&\n                    (!includeScheme || string.Equals(url.Scheme,\n                        endpointUrl.Scheme, StringComparison.OrdinalIgnoreCase)) &&\n                    (!includePath || string.Equals(url.AbsolutePath,\n                        endpointUrl.AbsolutePath, StringComparison.OrdinalIgnoreCase));\n            }\n        }\n\n        /// <summary>\n        /// Convert exception to connectivity state\n        /// </summary>\n        /// <param name=\"ex\"></param>\n        /// <param name=\"reconnecting\"></param>\n        /// <returns></returns>\n        public EndpointConnectivityState ToConnectivityState(Exception ex, bool reconnecting = true)\n        {\n            EndpointConnectivityState state;\n            switch (ex)\n            {\n                case ServiceResultException sre:\n                    switch (sre.StatusCode)\n                    {\n                        case StatusCodes.BadNoContinuationPoints:\n                        case StatusCodes.BadLicenseLimitsExceeded:\n                        case StatusCodes.BadTcpServerTooBusy:\n                        case StatusCodes.BadTooManySessions:\n                        case StatusCodes.BadTooManyOperations:\n                            state = EndpointConnectivityState.Busy;\n                            break;\n                        case StatusCodes.BadCertificateRevocationUnknown:\n                        case StatusCodes.BadCertificateIssuerRevocationUnknown:\n                        case StatusCodes.BadCertificateRevoked:\n                        case StatusCodes.BadCertificateIssuerRevoked:\n                        case StatusCodes.BadCertificateChainIncomplete:\n                        case StatusCodes.BadCertificateIssuerUseNotAllowed:\n                        case StatusCodes.BadCertificateUseNotAllowed:\n                        case StatusCodes.BadCertificateUriInvalid:\n                        case StatusCodes.BadCertificateTimeInvalid:\n                        case StatusCodes.BadCertificateIssuerTimeInvalid:\n                        case StatusCodes.BadCertificateInvalid:\n                        case StatusCodes.BadCertificateHostNameInvalid:\n                        case StatusCodes.BadNoValidCertificates:\n                            state = EndpointConnectivityState.CertificateInvalid;\n                            break;\n                        case StatusCodes.BadCertificateUntrusted:\n                        case StatusCodes.BadSecurityChecksFailed:\n                            state = EndpointConnectivityState.NoTrust;\n                            break;\n                        case StatusCodes.BadSecureChannelClosed:\n                            state = reconnecting ? EndpointConnectivityState.NoTrust :\n                                EndpointConnectivityState.Error;\n                            break;\n                        case StatusCodes.BadRequestTimeout:\n                        case StatusCodes.BadNotConnected:\n                            state = EndpointConnectivityState.NotReachable;\n                            break;\n                        case StatusCodes.BadUserAccessDenied:\n                        case StatusCodes.BadUserSignatureInvalid:\n                            state = EndpointConnectivityState.Unauthorized;\n                            break;\n                        default:\n                            state = EndpointConnectivityState.Error;\n                            break;\n                    }\n                    _logger.ServiceResultToState(sre.Result, state);\n                    break;\n                default:\n                    state = EndpointConnectivityState.Error;\n                    _logger.ExceptionToState(ex.Message, state);\n                    break;\n            }\n            return state;\n        }\n\n        /// <summary>\n        /// Get the real timeout for the service call\n        /// </summary>\n        /// <param name=\"serviceCallTimeout\"></param>\n        /// <returns></returns>\n        private TimeSpan GetServiceCallTimeout(int? serviceCallTimeout)\n        {\n            if (serviceCallTimeout > 0)\n            {\n                return TimeSpan.FromMilliseconds(serviceCallTimeout.Value);\n            }\n            if (ServiceCallTimeout.HasValue)\n            {\n                return ServiceCallTimeout.Value;\n            }\n            if (OperationTimeout.HasValue && OperationTimeout > kDefaultServiceCallTimeout)\n            {\n                return OperationTimeout.Value;\n            }\n            return kDefaultServiceCallTimeout;\n        }\n\n        /// <summary>\n        /// Get the real timeout for the connectivity of session\n        /// </summary>\n        /// <param name=\"connectTimeout\"></param>\n        /// <param name=\"serviceCallTimeout\"></param>\n        /// <returns></returns>\n        private TimeSpan GetConnectCallTimeout(int? connectTimeout, int? serviceCallTimeout)\n        {\n            if (connectTimeout > 0)\n            {\n                return TimeSpan.FromMilliseconds(connectTimeout.Value);\n            }\n            if (ConnectTimeout.HasValue)\n            {\n                return ConnectTimeout.Value;\n            }\n            if (serviceCallTimeout > 0)\n            {\n                return TimeSpan.FromMilliseconds(serviceCallTimeout.Value);\n            }\n            return ServiceCallTimeout ?? kDefaultConnectTimeout;\n        }\n\n        /// <summary>\n        /// Dump diagnostics\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task DumpDiagnosticsPeriodicallyAsync(CancellationToken ct)\n        {\n            using var timer = new PeriodicTimer(TimeSpan.FromSeconds(10));\n            try\n            {\n                while (!ct.IsCancellationRequested)\n                {\n                    await timer.WaitForNextTickAsync(ct).ConfigureAwait(false);\n                    if (_session != null)\n                    {\n                        var diagnostics = await _session.GetServerDiagnosticAsync(\n                            ct).ConfigureAwait(false);\n                        var str = JsonSerializer.Serialize(diagnostics, kIndented);\n                        Console.WriteLine(str);\n                    }\n                }\n            }\n            catch (OperationCanceledException) { }\n        }\n        private static readonly JsonSerializerOptions kIndented = new()\n        {\n            WriteIndented = true\n        };\n\n        private enum ConnectionEvent\n        {\n            Connect,\n            ConnectRetry,\n            Disconnect,\n            StartReconnect,\n            ReconnectComplete,\n            Reset,\n            SubscriptionSyncOne,\n            SubscriptionSyncAll\n        }\n\n        private enum SessionState\n        {\n            Disconnected,\n            Connecting,\n            Connected,\n            Reconnecting\n        }\n\n        /// <summary>\n        /// Disconnected state\n        /// </summary>\n        private sealed class DisconnectState : IOpcUaClientDiagnostics\n        {\n            /// <inheritdoc/>\n            public int BadPublishRequestCount\n                => 0;\n            /// <inheritdoc/>\n            public int GoodPublishRequestCount\n                => 0;\n            /// <inheritdoc/>\n            public int OutstandingRequestCount\n                => 0;\n            /// <inheritdoc/>\n            public int SubscriptionCount\n                => 0;\n            /// <inheritdoc/>\n            public EndpointConnectivityState State\n                => EndpointConnectivityState.Disconnected;\n            /// <inheritdoc/>\n            public int ReconnectCount\n                => 0;\n            /// <inheritdoc/>\n            public int ConnectCount\n                => 0;\n            /// <inheritdoc/>\n            public int MinPublishRequestCount\n                => 0;\n            /// <inheritdoc/>\n            public bool ReconnectTriggered\n                => false;\n            /// <inheritdoc/>\n            public int KeepAliveCounter\n                => 0;\n            /// <inheritdoc/>\n            public int KeepAliveTotal\n                => 0;\n        }\n\n        /// <summary>\n        /// Create observable metrics\n        /// </summary>\n        private void InitializeMetrics()\n        {\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_client_connectivity_state\",\n                () => new Measurement<int>((int)_lastState, _metrics.TagList),\n                description: \"Client connectivity state.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_client_keep_alive_counter\",\n                () => new Measurement<int>(_keepAliveCounter, _metrics.TagList),\n                description: \"Number of successful keep alives since last keep alive error.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_keep_alive_counter_count\",\n                () => new Measurement<int>(_keepAliveTotal, _metrics.TagList),\n                description: \"Number of total successful keep alives of the client.\");\n            _meter.CreateObservableGauge(\"iiot_edge_publisher_client_reconnect_trigger\",\n                () => new Measurement<int>(_reconnectRequired, _metrics.TagList),\n                description: \"Number of reconnect trigger actions.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_namespace_change_count\",\n                () => new Measurement<int>(_namespaceTableChanges, _metrics.TagList),\n                description: \"Number of namespace table changes detected by the client.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_subscriptions\",\n                () => new Measurement<int>(SubscriptionCount, _metrics.TagList),\n                description: \"Number of client managed subscriptions.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_sampler_count\",\n                () => new Measurement<int>(_samplers.Count, _metrics.TagList),\n                description: \"Number of active client samplers.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_browser_count\",\n                () => new Measurement<int>(_browsers.Count, _metrics.TagList),\n                description: \"Number of active browsers.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_connectivity_retry_count\",\n                () => new Measurement<int>(_numberOfConnectionRetries, _metrics.TagList),\n                description: \"Number of connectivity retries on this connection.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_connectivity_count\",\n                () => new Measurement<int>(_numberofSuccessfulConnections, _metrics.TagList),\n                description: \"Number of sessions established as a total for the client.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_ref_count\",\n                () => new Measurement<int>(_refCount, _metrics.TagList),\n                description: \"Number of references to this client.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_good_publish_requests_count\",\n                () => new Measurement<int>(GoodPublishRequestCount, _metrics.TagList),\n                description: \"Number of good publish requests.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_bad_publish_requests_count\",\n                () => new Measurement<int>(BadPublishRequestCount, _metrics.TagList),\n                description: \"Number of bad publish requests.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_min_publish_requests_count\",\n                () => new Measurement<int>(MinPublishRequestCount, _metrics.TagList),\n                description: \"Number of min publish requests that should be queued.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_outstanding_requests_count\",\n                () => new Measurement<int>(OutstandingRequestCount, _metrics.TagList),\n                description: \"Number of outstanding requests.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_publish_timeout_count\",\n                () => new Measurement<int>(_publishTimeoutCounter, _metrics.TagList),\n                description: \"Number of timed out requests.\");\n        }\n\n        private static readonly UpDownCounter<int> kSessions = Diagnostics.Meter.CreateUpDownCounter<int>(\n            \"iiot_edge_publisher_session_count\", description: \"Number of active sessions.\");\n\n        private OpcUaSession? _reconnectingSession;\n        private int _reconnectRequired;\n#pragma warning disable CA2213 // Disposable fields should be disposed\n        private OpcUaSession? _session;\n        private IDisposable? _disconnectLock;\n#pragma warning restore CA2213 // Disposable fields should be disposed\n        private EndpointConnectivityState _lastState;\n        private int _numberOfConnectionRetries;\n        private int _numberofSuccessfulConnections;\n        private bool _disposed;\n        private int _refCount;\n        private int _publishTimeoutCounter;\n        private int _keepAliveCounter;\n        private int _keepAliveTotal;\n        private int _namespaceTableChanges;\n        private ChannelDiagnosticModel _lastDiagnostics;\n        private readonly ReverseConnectManager? _reverseConnectManager;\n        private readonly AsyncReaderWriterLock _lock = new();\n        private readonly ApplicationConfiguration _configuration;\n        private readonly IJsonSerializer _serializer;\n        private readonly ILoggerFactory _loggerFactory;\n        private readonly string _sessionName;\n        private readonly IOptions<OpcUaClientOptions> _options;\n        private readonly Func<Task> _onClose;\n        private readonly ConnectionModel _connection;\n        private readonly IMetricsContext _metrics;\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n        private readonly Lock _channelLock = new();\n#pragma warning disable CA2213 // Disposable fields should be disposed\n        private readonly ITimer _channelMonitor;\n        private readonly Task? _diagnosticsDumper;\n        private readonly SessionReconnectHandler _reconnectHandler;\n        private readonly CancellationTokenSource _cts;\n#pragma warning restore CA2213 // Disposable fields should be disposed\n        private readonly Task _sessionManager;\n        private readonly TimeSpan _maxReconnectPeriod;\n        private readonly Channel<(ConnectionEvent, object?)> _channel;\n        private readonly Action<ChannelDiagnosticModel> _diagnosticsCb;\n        private readonly EventHandler<EndpointConnectivityStateEventArgs>? _notifier;\n        private readonly Dictionary<(string, TimeSpan, TimeSpan), Sampler> _samplers = [];\n        private readonly Dictionary<(string, TimeSpan), Browser> _browsers = [];\n        private readonly Dictionary<string, CancellationTokenSource> _tokens;\n        private readonly Meter _meter = Diagnostics.NewMeter();\n        private static readonly TimeSpan kDefaultServiceCallTimeout = TimeSpan.FromMinutes(5);\n        private static readonly TimeSpan kDefaultConnectTimeout = TimeSpan.FromMinutes(1);\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaClient\n    /// </summary>\n    internal static partial class OpcUaClientLogging\n    {\n        private const int EventClass = 520;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"{Client}: RECREATE: Creating new session with new waiting connection.\")]\n        public static partial void CreatingNewSessionWithConnection(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"{Client}: RECREATE: Creating new session without connection.\")]\n        public static partial void CreatingNewSessionWithoutConnection(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"{Client}: RECREATE: Closing channel and creating new session.\")]\n        public static partial void CreatingNewSessionClosingChannel(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"{Client}: RECREATE: Creating new session.\")]\n        public static partial void CreatingNewSession(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug,\n            Message = \"{Client}: Resetting...\")]\n        public static partial void Resetting(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"{Client}: Failed to reset.\")]\n        public static partial void ResetFailed(this ILogger logger, Exception ex, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Debug,\n            Message = \"{Client}: Closing...\")]\n        public static partial void Closing(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"{Client}: Successfully closed.\")]\n        public static partial void ClosedSuccessfully(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Error,\n            Message = \"{Client}: Failed to close.\")]\n        public static partial void CloseFailed(this ILogger logger, Exception ex, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"{Client}: Session disconnected during service call with message \" +\n            \"{Message}, retrying.\")]\n        public static partial void SessionDisconnected(this ILogger logger, OpcUaClient client,\n            string message);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Debug,\n            Message = \"{Client}: Processing event {Event} in State {State}...\")]\n        public static partial void ProcessingEvent(this ILogger logger, OpcUaClient client,\n            string @event, string state);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"{Client}: Retrying connecting session in {RetryDelay}...\")]\n        public static partial void RetryingConnection(this ILogger logger, OpcUaClient client,\n            TimeSpan retryDelay);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"{Client}: Reconnecting session {Session} due to {Reason}...\")]\n        public static partial void ReconnectingSession(this ILogger logger, OpcUaClient client,\n            string session, string reason);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"{Client}: Begin reconnecting session {Session}...\")]\n        public static partial void BeginReconnectingSession(this ILogger logger, OpcUaClient client,\n            string session);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Error,\n            Message = \"{Client}: Reconnect handler mismatch.\")]\n        public static partial void ReconnectHandlerMismatch(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Information,\n            Message = \"{Client}: Completed reconnecting session {Session}...\")]\n        public static partial void CompletedReconnectingSession(this ILogger logger,\n            OpcUaClient client, string session);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Information,\n            Message = \"{Client}: Client RECOVERED!\")]\n        public static partial void ClientRecovered(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Information,\n            Message = \"{Client}: Client RECONNECTED!\")]\n        public static partial void ClientReconnected(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 19, Level = LogLevel.Debug,\n            Message = \"{Client}: Event {Event} in State {State} processed.\")]\n        public static partial void EventProcessed(this ILogger logger, OpcUaClient client,\n            string @event, string state);\n\n        [LoggerMessage(EventId = EventClass + 20, Level = LogLevel.Error,\n            Message = \"{Client}: Connection manager exited unexpectedly...\")]\n        public static partial void ConnectionManagerExited(this ILogger logger, Exception ex,\n            OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 21, Level = LogLevel.Error,\n            Message = \"{Client}: Exception in management loop.\")]\n        public static partial void ManagementLoopException(this ILogger logger, Exception ex,\n            OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 22, Level = LogLevel.Information,\n            Message = \"{Client}: Disconnect because client is disposed.\")]\n        public static partial void DisconnectingDisposed(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 23, Level = LogLevel.Information,\n            Message = \"{Client}: Exiting client management loop.\")]\n        public static partial void ExitingManagementLoop(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 24, Level = LogLevel.Information,\n            Message = \"{Client}: Connecting to {EndpointUrl}...\")]\n        public static partial void ConnectingToEndpoint(this ILogger logger, OpcUaClient client,\n            string endpointUrl);\n\n        [LoggerMessage(EventId = EventClass + 25, Level = LogLevel.Warning,\n            Message = \"{Client}: No endpoint found that matches connection of session {Name}.\")]\n        public static partial void NoMatchingEndpoint(this ILogger logger, OpcUaClient client, string name);\n\n        [LoggerMessage(EventId = EventClass + 26, Level = LogLevel.Warning,\n            Message = \"{Client}: Although the use of best security was configured, there was no security-enabled \" +\n            \"endpoint available at url {EndpointUrl}. An endpoint with no security will be used for session {Name} \" +\n            \"but no credentials will be sent over it.\")]\n        public static partial void NoSecurityEnabled(this ILogger logger, OpcUaClient client,\n            Uri endpointUrl, string name);\n\n        [LoggerMessage(EventId = EventClass + 27, Level = LogLevel.Warning,\n            Message = \"{Client}: No UserTokenPolicy for {TokenType}/{IssuedTokenType} found on endpoint \" +\n            \"{EndpointUrl} (session: {Name}).\")]\n        public static partial void NoUserTokenPolicy(this ILogger logger, OpcUaClient client,\n            UserTokenType tokenType, XmlQualifiedName issuedTokenType, Uri endpointUrl, string name);\n\n        [LoggerMessage(EventId = EventClass + 28, Level = LogLevel.Information,\n            Message = \"{Client}: #{Attempt} - Creating session {Name} with endpoint {EndpointUrl}...\")]\n        public static partial void CreatingSession(this ILogger logger, int attempt, OpcUaClient client,\n            string name, Uri endpointUrl);\n\n        [LoggerMessage(EventId = EventClass + 29, Level = LogLevel.Information,\n            Message = \"{Client}: New Session {Name} created with endpoint {EndpointUrl} ({Original}).\")]\n        public static partial void NewSessionCreated(this ILogger logger, OpcUaClient client, string name,\n            Uri endpointUrl, string original);\n\n        [LoggerMessage(EventId = EventClass + 30, Level = LogLevel.Information,\n            Message = \"{Client} Client CONNECTED to {EndpointUrl}!\")]\n        public static partial void ClientConnected(this ILogger logger, OpcUaClient client, Uri endpointUrl);\n\n        [LoggerMessage(EventId = EventClass + 31, Level = LogLevel.Information,\n            Message = \"#{Attempt} - {Client}: Failed to connect to {EndpointUrl}: {Message}...\")]\n        public static partial void ConnectionFailed(this ILogger logger, int attempt, OpcUaClient client,\n            Uri endpointUrl, string message);\n\n        [LoggerMessage(EventId = EventClass + 32, Level = LogLevel.Error,\n            Message = \"{Client}: Received publish error for different session {Session}!\")]\n        public static partial void PublishErrorDifferentSession(this ILogger logger, OpcUaClient client,\n            string? session);\n\n        [LoggerMessage(EventId = EventClass + 33, Level = LogLevel.Information,\n            Message = \"{Client}: Publish error: {Error}...\")]\n        public static partial void PublishError(this ILogger logger, OpcUaClient client, string error);\n\n        [LoggerMessage(EventId = EventClass + 34, Level = LogLevel.Trace, SkipEnabledCheck = true,\n            Message = \"{Client}: #{ThreadId} - Sending {Acks} acks and deferring {Deferrals} acks. ({Requests})\")]\n        public static partial void SendingAcks(this ILogger logger, OpcUaClient client, int threadId, string acks,\n            string deferrals, int requests);\n\n        [LoggerMessage(EventId = EventClass + 35, Level = LogLevel.Error,\n            Message = \"{Client}: Received keep alive for different session {Session}!\")]\n        public static partial void KeepAliveErrorDifferentSession(this ILogger logger, OpcUaClient client,\n            string? session);\n\n        [LoggerMessage(EventId = EventClass + 36, Level = LogLevel.Error,\n            Message = \"{Client}: Error in OnKeepAlive.\")]\n        public static partial void KeepAliveError(this ILogger logger, Exception ex, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 37, Level = LogLevel.Error,\n            Message = \"{Client}: Error {Error} during {Action} - triggering reconnect...\")]\n        public static partial void TriggerReconnect(this ILogger logger, OpcUaClient client,\n            string error, string action);\n\n        [LoggerMessage(EventId = EventClass + 38, Level = LogLevel.Warning,\n            Message = \"{Client}: Namespace index #{Index} changed from {OldValue} to {NewValue}\")]\n        public static partial void NamespaceIndexChanged(this ILogger logger, OpcUaClient client,\n            int index, string oldValue, string newValue);\n\n        [LoggerMessage(EventId = EventClass + 39, Level = LogLevel.Warning,\n            Message = \"{Client}: Namespace index #{Index} removed {OldValue}\")]\n        public static partial void NamespaceIndexRemoved(this ILogger logger, OpcUaClient client,\n            int index, string oldValue);\n\n        [LoggerMessage(EventId = EventClass + 40, Level = LogLevel.Warning,\n            Message = \"{Client}: Namespace index #{Index} added {NewValue}\")]\n        public static partial void NamespaceIndexAdded(this ILogger logger, OpcUaClient client,\n            int index, string newValue);\n\n        [LoggerMessage(EventId = EventClass + 41, Level = LogLevel.Information,\n            Message = \"Channel {Channel} got new token {TokenId} ({Created}).\")]\n        public static partial void ChannelGotNewToken(this ILogger logger, string channel,\n            string tokenId, DateTime created);\n\n        [LoggerMessage(EventId = EventClass + 42, Level = LogLevel.Information,\n            Message = \"Channel diagnostics for session {SessionId} updated.\")]\n        public static partial void ChannelDiagnosticsUpdated(this ILogger logger, string? sessionId);\n\n        [LoggerMessage(EventId = EventClass + 43, Level = LogLevel.Information,\n            Message = \"{Client}: Session {Name} with {Endpoint} changed from {Previous} to {State}\")]\n        public static partial void SessionStateChanged(this ILogger logger, OpcUaClient client,\n            string name, string endpoint,\n            EndpointConnectivityState previous, EndpointConnectivityState state);\n\n        [LoggerMessage(EventId = EventClass + 44, Level = LogLevel.Error,\n            Message = \"{Client}: Exception during state callback\")]\n        public static partial void ExceptionDuringStateCallback(this ILogger logger, Exception ex,\n            OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 1782, Level = LogLevel.Debug,\n            Message = \"{Client}: Error, connection to {Endpoint} - leaving state at {Previous}.\")]\n        public static partial void ErrorLeavingState(this ILogger logger, OpcUaClient client, string endpoint,\n            EndpointConnectivityState previous);\n\n        [LoggerMessage(EventId = EventClass + 48, Level = LogLevel.Debug,\n            Message = \"{Result} => {State}\")]\n        public static partial void ServiceResultToState(this ILogger logger, ServiceResult result,\n            EndpointConnectivityState state);\n\n        [LoggerMessage(EventId = EventClass + 49, Level = LogLevel.Debug,\n            Message = \"{Message} => {State}\")]\n        public static partial void ExceptionToState(this ILogger logger, string message,\n            EndpointConnectivityState state);\n\n        [LoggerMessage(EventId = EventClass + 50, Level = LogLevel.Debug,\n            Message = \"{Client}: Successfully closed session {Session}.\")]\n        public static partial void SessionClosed(this ILogger logger, OpcUaClient client, OpcUaSession session);\n\n        [LoggerMessage(EventId = EventClass + 51, Level = LogLevel.Error,\n            Message = \"{Client}: Failed to close session {Session}.\")]\n        public static partial void SessionCloseFailed(this ILogger logger, Exception ex,\n            OpcUaClient client, OpcUaSession session);\n\n        [LoggerMessage(EventId = EventClass + 60, Level = LogLevel.Information,\n            Message = \"{Context}: Discovery endpoint {DiscoveryUrl} returned endpoints. Selecting endpoint {EndpointUri} \" +\n            \"with SecurityMode {SecurityMode} and {SecurityPolicy} SecurityPolicyUri from:\\n{Endpoints}\")]\n        public static partial void DiscoveryEndpointReturnedEndpoints(this ILogger logger, string? context,\n            Uri discoveryUrl, Uri endpointUri, SecurityMode securityMode, string securityPolicy, string endpoints);\n\n        [LoggerMessage(EventId = EventClass + 61, Level = LogLevel.Information,\n            Message = \"{Context}: Endpoint {Endpoint} selected via reverse connect!\")]\n        public static partial void EndpointSelectedViaReverseConnect(this ILogger logger, string? context,\n            string endpoint);\n\n        [LoggerMessage(EventId = EventClass + 62, Level = LogLevel.Information,\n            Message = \"{Context}: Endpoint {Endpoint} selected!\")]\n        public static partial void EndpointSelected(this ILogger logger, string? context, string endpoint);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClientManager.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using BitFaster.Caching.Lru;\n    using Furly.Exceptions;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Utils;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Nito.AsyncEx;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.Metrics;\n    using System.Linq;\n    using System.Runtime.CompilerServices;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Client manager\n    /// </summary>\n    internal sealed class OpcUaClientManager : IOpcUaClientManager<ConnectionModel>,\n        IEndpointDiscovery, ICertificateServices<EndpointModel>, IClientDiagnostics,\n        IConnectionServices<ConnectionModel>, IDisposable\n    {\n        /// <inheritdoc/>\n        public event EventHandler<EndpointConnectivityStateEventArgs>? OnConnectionStateChange;\n\n        /// <inheritdoc/>\n        IReadOnlyList<ChannelDiagnosticModel> IClientDiagnostics.ChannelDiagnostics\n            => _clients.Values.Select(c => c.LastDiagnostics).ToList();\n\n        /// <inheritdoc/>\n        public IReadOnlyList<ConnectionModel> ActiveConnections\n            => _clients.Keys.Select(c => c.Connection).ToList();\n\n        /// <summary>\n        /// Create kv manager\n        /// </summary>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"clientOptions\"></param>\n        /// <param name=\"subscriptionOptions\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"metrics\"></param>\n        public OpcUaClientManager(ILoggerFactory loggerFactory, IJsonSerializer serializer,\n            IOpcUaConfiguration configuration, IOptions<OpcUaClientOptions> clientOptions,\n            IOptions<OpcUaSubscriptionOptions> subscriptionOptions,\n            TimeProvider? timeProvider = null, IMetricsContext? metrics = null)\n        {\n            _metrics = metrics ??\n                IMetricsContext.Empty;\n            _timeProvider = timeProvider ??\n                TimeProvider.System;\n            _clientOptions = clientOptions ??\n                throw new ArgumentNullException(nameof(clientOptions));\n            _subscriptionOptions = subscriptionOptions ??\n                throw new ArgumentNullException(nameof(subscriptionOptions));\n            _serializer = serializer ??\n                throw new ArgumentNullException(nameof(serializer));\n            _loggerFactory = loggerFactory ??\n                throw new ArgumentNullException(nameof(loggerFactory));\n            _configuration = configuration ??\n                throw new ArgumentNullException(nameof(configuration));\n\n            _logger = _loggerFactory.CreateLogger<OpcUaClientManager>();\n\n            _reverseConnectManager = new ReverseConnectManager();\n            _reverseConnectStartException = new Lazy<Exception?>(\n                StartReverseConnectManager, isThreadSafe: true);\n            _configuration.Validate += OnValidate;\n            InitializeMetrics();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask<ISubscription> CreateSubscriptionAsync(\n            ConnectionModel connection, SubscriptionModel subscription,\n            ISubscriber callback, CancellationToken ct)\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n\n            using var client = GetOrAddClient(connection);\n            return await client.RegisterAsync(\n                subscription, callback, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<TestConnectionResponseModel> TestConnectionAsync(\n            ConnectionModel endpoint, TestConnectionRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(endpoint.Endpoint?.Url);\n\n            var endpointUrl = new Uri(endpoint.Endpoint.Url);\n            try\n            {\n                var endpointDescription = await OpcUaClient.SelectEndpointAsync(\n                    _configuration.Value, endpointUrl, null,\n                    endpoint.Endpoint.SecurityMode ?? SecurityMode.NotNone,\n                    endpoint.Endpoint.SecurityPolicy, _logger, endpoint.Endpoint,\n                    ct: ct).ConfigureAwait(false);\n\n                var endpointConfiguration = EndpointConfiguration.Create(\n                    _configuration.Value);\n                var configuredEndpoint = new ConfiguredEndpoint(null,\n                    endpointDescription, endpointConfiguration);\n                var userIdentity = await endpoint.User.ToUserIdentityAsync(\n                    _configuration.Value).ConfigureAwait(false);\n                using var session = await DefaultSessionFactory.Instance.CreateAsync(\n                    _configuration.Value, reverseConnectManager: null, configuredEndpoint,\n                    updateBeforeConnect: true, // Update endpoint through discovery\n                    checkDomain: false, // Domain must match on connect\n                    \"Test\" + Guid.NewGuid().ToString(\"N\"),\n                    10000, userIdentity, null, ct).ConfigureAwait(false);\n                try\n                {\n                    Debug.Assert(session != null);\n                    await session.CloseAsync(ct).ConfigureAwait(false);\n                }\n                catch\n                {\n                    // We close as a courtesy to the server\n                }\n                return new TestConnectionResponseModel();\n            }\n            catch (Exception ex)\n            {\n                return new TestConnectionResponseModel\n                {\n                    ErrorInfo = ex.ToServiceResultModel()\n                };\n            }\n        }\n\n        /// <inheritdoc/>\n        public Task ResetAllConnectionsAsync(CancellationToken ct)\n        {\n            return Task.WhenAll(_clients.Values.Select(c => c.ResetAsync(ct)).ToArray());\n        }\n\n        /// <inheritdoc/>\n        public async IAsyncEnumerable<ConnectionDiagnosticsModel> GetConnectionDiagnosticsAsync(\n            [EnumeratorCancellation] CancellationToken ct)\n        {\n            foreach (var kv in _clients.ToList())\n            {\n                SessionDiagnosticsModel? server = null;\n                try\n                {\n                    server = await kv.Value.GetSessionDiagnosticsAsync(ct).ConfigureAwait(false);\n                }\n                catch (Exception ex)\n                {\n                    _logger.GetDiagnosticsFailed(ex, kv.Value);\n                }\n                yield return new ConnectionDiagnosticsModel\n                {\n                    Connection = kv.Key.Connection,\n                    // Client = kv.Value.Diagnostics,\n                    Server = server\n                };\n            }\n        }\n\n        /// <inheritdoc/>\n        public async IAsyncEnumerable<ChannelDiagnosticModel> WatchChannelDiagnosticsAsync(\n            [EnumeratorCancellation] CancellationToken ct)\n        {\n            var queue = new AsyncProducerConsumerQueue<ChannelDiagnosticModel>();\n            _listeners.TryAdd(queue, true);\n            try\n            {\n                // Get all items from buffer\n                var set = new HashSet<ChannelDiagnosticModel>(\n                    _clients.Values.Select(c => c.LastDiagnostics));\n                foreach (var item in set)\n                {\n                    yield return item;\n                }\n\n                // Dequeue items we have not yet sent from current state from queue\n                // until cancelled\n                while (!ct.IsCancellationRequested)\n                {\n                    // Get updates - handle fact that we have already sent the reference\n                    var item = await queue.DequeueAsync(ct).ConfigureAwait(false);\n                    if (!set.Contains(item))\n                    {\n                        yield return item;\n                    }\n                }\n            }\n            finally\n            {\n                _listeners.TryRemove(queue, out _);\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<IEnumerable<DiscoveredEndpointModel>> FindEndpointsAsync(\n            Uri discoveryUrl, IReadOnlyList<string>? locales, bool findServersOnNetwork,\n            CancellationToken ct)\n        {\n            var results = new HashSet<DiscoveredEndpointModel>();\n            var visitedUris = new HashSet<string> {\n                CreateDiscoveryUri(discoveryUrl.ToString(), 4840)\n            };\n            var queue = new Queue<Tuple<Uri, List<string>>>();\n            var localeIds = locales != null ? new StringCollection(locales) : null;\n            queue.Enqueue(Tuple.Create(discoveryUrl, new List<string>()));\n            ct.ThrowIfCancellationRequested();\n            while (queue.Count > 0)\n            {\n                var nextServer = queue.Dequeue();\n                discoveryUrl = nextServer.Item1;\n                var sw = Stopwatch.StartNew();\n                _logger.FindingEndpoints(discoveryUrl);\n                try\n                {\n                    await Retry.Do(_logger, ct, () => DiscoverAsync(discoveryUrl,\n                            localeIds, nextServer.Item2, 20000, visitedUris,\n                            queue, results, findServersOnNetwork),\n                        _ => !ct.IsCancellationRequested, Retry.NoBackoff,\n                        kMaxDiscoveryAttempts - 1).ConfigureAwait(false);\n                }\n                catch (Exception ex)\n                {\n                    _logger.FindEndpointsException(ex, discoveryUrl);\n                    _logger.FindEndpointsFailed(discoveryUrl, ex.Message, sw.Elapsed);\n                    return new HashSet<DiscoveredEndpointModel>();\n                }\n                ct.ThrowIfCancellationRequested();\n                _logger.FindingEndpointsCompleted(discoveryUrl, sw.Elapsed);\n            }\n            return results;\n        }\n\n        /// <inheritdoc/>\n        public async Task<X509CertificateChainModel> GetEndpointCertificateAsync(\n            EndpointModel endpoint, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            if (string.IsNullOrEmpty(endpoint.Url))\n            {\n                throw new ArgumentException(\"Endpoint url is missing.\", nameof(endpoint));\n            }\n            var endpointConfiguration = EndpointConfiguration.Create(_configuration.Value);\n            endpointConfiguration.OperationTimeout = 20000;\n            var discoveryUrl = new Uri(endpoint.Url);\n            using var client = DiscoveryClient.Create(discoveryUrl, endpointConfiguration);\n            // Get endpoint descriptions from endpoint url\n            var endpoints = await client.GetEndpointsAsync(new RequestHeader(),\n                client.Endpoint.EndpointUrl, null, null).ConfigureAwait(false);\n\n            // Match to provided endpoint info\n            var ep = endpoints.Endpoints?.FirstOrDefault(e => e.IsSameAs(endpoint));\n            if (ep == null)\n            {\n                _logger.NoEndpoints(discoveryUrl);\n                throw new ResourceNotFoundException(\"Endpoint not found\");\n            }\n            _logger.FoundEndpoint(discoveryUrl);\n            return ep.ServerCertificate.ToCertificateChain();\n        }\n\n        /// <inheritdoc/>\n        public async Task<T> ExecuteAsync<T>(ConnectionModel connection,\n            Func<ServiceCallContext, Task<T>> func, RequestHeaderModel? header,\n            CancellationToken ct)\n        {\n            connection = UpdateConnectionFromHeader(connection, header);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Missing endpoint url\", nameof(connection));\n            }\n            using var client = GetOrAddClient(connection);\n            return await client.RunAsync(func, header?.ConnectTimeout,\n                header?.ServiceCallTimeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<T> ExecuteAsync<T>(ConnectionModel connection,\n            AsyncEnumerableBase<T> operation, RequestHeaderModel? header,\n            CancellationToken ct)\n        {\n            connection = UpdateConnectionFromHeader(connection, header);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                operation.Dispose();\n                throw new ArgumentException(\"Missing endpoint url\", nameof(connection));\n            }\n            return ExecuteAsyncCore(ct);\n\n            async IAsyncEnumerable<T> ExecuteAsyncCore(\n                [EnumeratorCancellation] CancellationToken ct)\n            {\n                try\n                {\n                    using var client = GetOrAddClient(connection);\n                    await foreach (var result in client.RunAsync(operation,\n                        header?.ConnectTimeout, header?.ServiceCallTimeout,\n                        ct).ConfigureAwait(false))\n                    {\n                        yield return result;\n                    }\n                }\n                finally\n                {\n                    operation.Dispose();\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task<ISessionHandle> AcquireSessionAsync(ConnectionModel connection,\n            RequestHeaderModel? header, CancellationToken ct)\n        {\n            connection = UpdateConnectionFromHeader(connection, header);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Missing endpoint url\", nameof(connection));\n            }\n            using var client = GetOrAddClient(connection);\n            return await client.AcquireAsync(header?.ConnectTimeout,\n                header?.ServiceCallTimeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            if (!_disposed)\n            {\n                _meter.Dispose();\n\n                DisposeAsync().AsTask().GetAwaiter().GetResult();\n\n                _reverseConnectManager.Dispose();\n\n                _configuration.Validate -= OnValidate;\n            }\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask DisposeAsync()\n        {\n            if (_disposed)\n            {\n                return;\n            }\n            _disposed = true;\n\n            _logger.StoppingAllClients(_clients.Count);\n            foreach (var client in _clients)\n            {\n                try\n                {\n                    await client.Value.CloseAsync(true).ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.DisposeClientFailed(ex, client.Key);\n                }\n            }\n            _clients.Clear();\n            _logger.StoppedAllClients();\n        }\n\n        /// <summary>\n        /// Perform a single discovery using a discovery url\n        /// </summary>\n        /// <param name=\"discoveryUrl\"></param>\n        /// <param name=\"localeIds\"></param>\n        /// <param name=\"caps\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <param name=\"visitedUris\"></param>\n        /// <param name=\"queue\"></param>\n        /// <param name=\"result\"></param>\n        /// <param name=\"findServersOnNetwork\"></param>\n        private async Task DiscoverAsync(Uri discoveryUrl, StringCollection? localeIds,\n            IEnumerable<string> caps, int timeout, HashSet<string> visitedUris,\n            Queue<Tuple<Uri, List<string>>> queue, HashSet<DiscoveredEndpointModel> result,\n            bool findServersOnNetwork)\n        {\n            var endpointConfiguration = EndpointConfiguration.Create(_configuration.Value);\n            endpointConfiguration.OperationTimeout = timeout;\n            using var client = DiscoveryClient.Create(discoveryUrl, endpointConfiguration);\n            //\n            // Get endpoints from current discovery server\n            //\n            var endpoints = await client.GetEndpointsAsync(new RequestHeader(),\n                client.Endpoint.EndpointUrl, localeIds, null).ConfigureAwait(false);\n            if (!(endpoints?.Endpoints?.Any() ?? false))\n            {\n                _logger.NoEndpoints(discoveryUrl);\n                return;\n            }\n            _logger.FoundEndpoints(discoveryUrl);\n\n            foreach (var ep in endpoints.Endpoints.Where(ep =>\n                ep.Server.ApplicationType != Opc.Ua.ApplicationType.DiscoveryServer))\n            {\n                result.Add(new DiscoveredEndpointModel\n                {\n                    Description = ep, // Reported\n                    AccessibleEndpointUrl = new UriBuilder(ep.EndpointUrl)\n                    {\n                        Host = discoveryUrl.DnsSafeHost\n                    }.ToString(),\n                    Capabilities = new HashSet<string>(caps)\n                });\n            }\n\n            if (!findServersOnNetwork)\n            {\n                return;\n            }\n\n            //\n            // Now Find servers on network.  This might fail for old lds\n            // as well as reference servers, then we call FindServers...\n            //\n            try\n            {\n                var response = await client.FindServersOnNetworkAsync(new RequestHeader(),\n                    0, 1000, []).ConfigureAwait(false);\n                foreach (var server in response?.Servers ?? [])\n                {\n                    var url = CreateDiscoveryUri(server.DiscoveryUrl, discoveryUrl.Port);\n                    if (!visitedUris.Contains(url))\n                    {\n                        queue.Enqueue(Tuple.Create(discoveryUrl,\n                            server.ServerCapabilities.ToList()));\n                        visitedUris.Add(url);\n                    }\n                }\n            }\n            catch\n            {\n                // Old lds, just continue...\n                _logger.ExtensionNotSupported(discoveryUrl);\n            }\n\n            //\n            // Call FindServers first to push more unique discovery urls\n            // into the discovery queue\n            //\n            var found = await client.FindServersAsync(new RequestHeader(),\n                client.Endpoint.EndpointUrl, localeIds, null).ConfigureAwait(false);\n            if (found?.Servers != null)\n            {\n                foreach (var server in found.Servers.SelectMany(s => s.DiscoveryUrls))\n                {\n                    var url = CreateDiscoveryUri(server, discoveryUrl.Port);\n                    if (!visitedUris.Contains(url))\n                    {\n                        queue.Enqueue(Tuple.Create(discoveryUrl, new List<string>()));\n                        visitedUris.Add(url);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Update connection from header\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"header\"></param>\n        /// <returns></returns>\n        private static ConnectionModel UpdateConnectionFromHeader(ConnectionModel connection,\n            RequestHeaderModel? header)\n        {\n            if (header == null)\n            {\n                return connection;\n            }\n            if (header.Elevation != null)\n            {\n                connection = connection with\n                {\n                    User = header.Elevation,\n                };\n            }\n            if (header.Locales != null)\n            {\n                connection = connection with\n                {\n                    Locales = header.Locales\n                };\n            }\n            return connection;\n        }\n\n        /// <summary>\n        /// Create discovery url from string\n        /// </summary>\n        /// <param name=\"uri\"></param>\n        /// <param name=\"defaultPort\"></param>\n        private static string CreateDiscoveryUri(string uri, int defaultPort)\n        {\n            var url = new UriBuilder(uri);\n            if (url.Port is 0 or (-1))\n            {\n                url.Port = defaultPort;\n            }\n            url.Host = url.Host.Trim('.');\n            url.Path = url.Path.Trim('/');\n            return url.Uri.ToString();\n        }\n\n        /// <summary>\n        /// Load kv configuration\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        /// <returns></returns>\n        private void OnValidate(CertificateValidator sender, CertificateValidationEventArgs e)\n        {\n            if (e.Accept || e.AcceptAll)\n            {\n                return;\n            }\n            if (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted)\n            {\n                if (_configuration.Value.SecurityConfiguration.AutoAcceptUntrustedCertificates)\n                {\n                    _logger.AcceptingUntrustedCert(e.Certificate.Thumbprint, e.Certificate.Subject);\n                    e.AcceptAll = true;\n                    e.Accept = true;\n                }\n\n                // Validate thumbprint\n                else if (e.Certificate.RawData != null &&\n                    !string.IsNullOrWhiteSpace(e.Certificate.Thumbprint) &&\n                    _clients.Keys.Any(id => id?.Connection?.Endpoint?.Certificate != null &&\n                    e.Certificate.Thumbprint == id.Connection.Endpoint.Certificate))\n                {\n                    e.Accept = true;\n\n                    _logger.AcceptingUntrustedCertByThumbprint(e.Certificate.Thumbprint, e.Certificate.Subject);\n\n                    // add the certificate to trusted store\n                    _configuration.Value.SecurityConfiguration\n                        .AddTrustedPeer(e.Certificate.RawData);\n                    try\n                    {\n                        var store = _configuration.Value.\n                            SecurityConfiguration.TrustedPeerCertificates.OpenStore();\n\n                        try\n                        {\n                            store.DeleteAsync(e.Certificate.Thumbprint);\n                            store.AddAsync(e.Certificate);\n                        }\n                        finally\n                        {\n                            store.Close();\n                        }\n                    }\n                    catch (Exception ex)\n                    {\n                        _logger.AddPeerCertToTrustedStoreFailed(ex, e.Certificate.Thumbprint, e.Certificate.Subject);\n                    }\n                }\n            }\n            if (!e.Accept)\n            {\n                _logger.RejectingPeerCert(e.Certificate.Thumbprint, e.Certificate.Subject, e.Error.StatusCode);\n            }\n        }\n\n        /// <summary>\n        /// Get or add new kv\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <returns></returns>\n        private OpcUaClient GetOrAddClient(ConnectionModel connection)\n        {\n            // Lazy start connect manager\n            var reverseConnect = connection.IsReverseConnect();\n            if (reverseConnect && _reverseConnectStartException.Value != null)\n            {\n                throw _reverseConnectStartException.Value;\n            }\n\n            // Find client and if not exists create\n            var id = new ConnectionIdentifier(connection);\n            // try to get an existing client\n            var client = _clients.GetOrAdd(id, id =>\n            {\n                var client = new OpcUaClient(_configuration.Value, id, _serializer,\n                    _loggerFactory, _timeProvider, _metrics, () => OnClientClosedAsync(id),\n                    OnConnectionStateChange, reverseConnect ? _reverseConnectManager : null,\n                    OnClientConnectionDiagnosticChange, _clientOptions, _subscriptionOptions);\n                _logger.CreatedNewClient(client);\n                return client;\n            });\n\n            client.AddRef();\n            return client;\n        }\n\n        /// <summary>\n        /// Called when the client closes\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        private async Task OnClientClosedAsync(ConnectionIdentifier id)\n        {\n            if (_clients.TryRemove(id, out var client))\n            {\n                try\n                {\n                    await client.CloseAsync(false).ConfigureAwait(false);\n                    _logger.ClosedClient(client);\n                }\n                catch (OperationCanceledException) { }\n                catch (Exception ex)\n                {\n                    _logger.DisposeClientFailed(ex, id);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Start reverse connect manager service\n        /// </summary>\n        /// <returns></returns>\n        private Exception? StartReverseConnectManager()\n        {\n            var port = _clientOptions.Value.ReverseConnectPort ?? 4840;\n            try\n            {\n                _reverseConnectManager.StartService(new ReverseConnectClientConfiguration\n                {\n                    HoldTime = 120000,\n                    WaitTimeout = 120000,\n                    ClientEndpoints =\n                    [\n                        new ReverseConnectClientEndpoint\n                        {\n                            EndpointUrl = $\"opc.tcp://localhost:{port}\"\n                        }\n                    ]\n                });\n                return null;\n            }\n            catch (Exception ex)\n            {\n                return ex;\n            }\n        }\n\n        /// <summary>\n        /// Called by clients when their connection information changed\n        /// </summary>\n        /// <param name=\"model\"></param>\n        private void OnClientConnectionDiagnosticChange(ChannelDiagnosticModel model)\n        {\n            foreach (var listener in _listeners.Keys)\n            {\n                listener.Enqueue(model);\n            }\n        }\n\n        /// <summary>\n        /// Create metrics\n        /// </summary>\n        private void InitializeMetrics()\n        {\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_client_count\",\n                () => new Measurement<int>(_clients.Count, _metrics.TagList),\n                description: \"Number of clients.\");\n        }\n\n        private const int kMaxDiscoveryAttempts = 3;\n        private bool _disposed;\n        private readonly ILogger _logger;\n        private readonly ILoggerFactory _loggerFactory;\n        private readonly TimeProvider _timeProvider;\n        private readonly IOpcUaConfiguration _configuration;\n        private readonly IOptions<OpcUaClientOptions> _clientOptions;\n        private readonly IOptions<OpcUaSubscriptionOptions> _subscriptionOptions;\n        private readonly IJsonSerializer _serializer;\n        private readonly ReverseConnectManager _reverseConnectManager;\n        private readonly Lazy<Exception?> _reverseConnectStartException;\n        private readonly ConcurrentDictionary<\n            AsyncProducerConsumerQueue<ChannelDiagnosticModel>, bool> _listeners = new();\n        private readonly ConcurrentDictionary<ConnectionIdentifier, OpcUaClient> _clients = new();\n        private readonly IMetricsContext _metrics;\n        private readonly Meter _meter = Diagnostics.NewMeter();\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaClientManager\n    /// </summary>\n    internal static partial class OpcUaClientManagerLogging\n    {\n        private const int EventClass = 600;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Failed to get diagnostics for client {Client}.\")]\n        public static partial void GetDiagnosticsFailed(this ILogger logger, Exception ex,\n            OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Try finding endpoints at {DiscoveryUrl}...\")]\n        public static partial void FindingEndpoints(this ILogger logger, Uri discoveryUrl);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug,\n            Message = \"Exception occurred during FindEndpoints at {DiscoveryUrl}.\")]\n        public static partial void FindEndpointsException(this ILogger logger, Exception ex,\n            Uri discoveryUrl);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"Could not find endpoints at {DiscoveryUrl} due to {Error} (after {Elapsed}).\")]\n        public static partial void FindEndpointsFailed(this ILogger logger, Uri discoveryUrl,\n            string error, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug,\n            Message = \"Finding endpoints at {DiscoveryUrl} completed in {Elapsed}.\")]\n        public static partial void FindingEndpointsCompleted(this ILogger logger,\n            Uri discoveryUrl, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Debug,\n            Message = \"No endpoints at {DiscoveryUrl}...\")]\n        public static partial void NoEndpoints(this ILogger logger, Uri discoveryUrl);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Debug,\n            Message = \"Found endpoint at {DiscoveryUrl}...\")]\n        public static partial void FoundEndpoint(this ILogger logger, Uri discoveryUrl);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Debug,\n            Message = \"Found endpoints at {DiscoveryUrl}...\")]\n        public static partial void FoundEndpoints(this ILogger logger, Uri discoveryUrl);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Debug,\n            Message = \"{DiscoveryUrl} does not support ME extension...\")]\n        public static partial void ExtensionNotSupported(this ILogger logger, Uri discoveryUrl);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"Stopping all {Count} clients...\")]\n        public static partial void StoppingAllClients(this ILogger logger, int count);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Error,\n            Message = \"Unexpected exception disposing client {Client}\")]\n        public static partial void DisposeClientFailed(this ILogger logger, Exception ex,\n            ConnectionIdentifier client);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"Stopped all clients, current number of clients is 0\")]\n        public static partial void StoppedAllClients(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Warning,\n            Message = \"Accepting untrusted peer certificate {Thumbprint}, '{Subject}' \" +\n            \"due to AutoAccept(UntrustedCertificates) set!\")]\n        public static partial void AcceptingUntrustedCert(this ILogger logger,\n            string thumbprint, string subject);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"Accepting untrusted peer certificate {Thumbprint}, '{Subject}' \" +\n            \"since the same thumbprint was specified in the connection!\")]\n        public static partial void AcceptingUntrustedCertByThumbprint(this ILogger logger,\n            string thumbprint, string subject);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Error,\n            Message = \"Failed to add peer certificate {Thumbprint}, '{Subject}' to trusted store\")]\n        public static partial void AddPeerCertToTrustedStoreFailed(this ILogger logger,\n            Exception ex, string thumbprint, string subject);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Information,\n            Message = \"Rejecting peer certificate {Thumbprint}, '{Subject}' because of {Status}.\")]\n        public static partial void RejectingPeerCert(this ILogger logger, string thumbprint,\n            string subject, StatusCode status);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Information,\n            Message = \"{Client}: Created new client.\")]\n        public static partial void CreatedNewClient(this ILogger logger, OpcUaClient client);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Information,\n            Message = \"{Client}: Closed client.\")]\n        public static partial void ClosedClient(this ILogger logger, OpcUaClient client);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaClientTagList.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n\n    /// <summary>\n    /// Connection metric tags\n    /// </summary>\n    internal sealed class OpcUaClientTagList : IMetricsContext\n    {\n        /// <inheritdoc/>\n        public TagList TagList { get; }\n\n        /// <summary>\n        /// Parent context\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"parent\"></param>\n        public OpcUaClientTagList(ConnectionModel connection, IMetricsContext? parent = null)\n        {\n            if (connection.Endpoint == null)\n            {\n                throw new ArgumentException(\"Missing endpoint\", nameof(connection));\n            }\n            var existing = parent?.TagList ?? default;\n            var tags = existing.ToDictionary(kv => kv.Key, kv => kv.Value);\n\n            TagList = new TagList([.. tags])\n            {\n                 new KeyValuePair<string, object?>(\"endpointUrl\",\n                    connection.Endpoint.Url),\n                 new KeyValuePair<string, object?>(\"securityMode\",\n                    connection.Endpoint.SecurityMode)\n            };\n\n            if (connection.Group != null &&\n                !tags.ContainsKey(Constants.ConnectionGroupTag))\n            {\n                TagList.Add(Constants.ConnectionGroupTag, connection.Group);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaMonitoredItem.Condition.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using System;\n    using System.Collections.Generic;\n    using System.Data;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Runtime.Serialization;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    internal abstract partial class OpcUaMonitoredItem\n    {\n        /// <summary>\n        /// Condition item\n        /// </summary>\n        [DataContract(Namespace = Namespaces.OpcUaXsd)]\n        [KnownType(typeof(DataChangeFilter))]\n        [KnownType(typeof(EventFilter))]\n        [KnownType(typeof(AggregateFilter))]\n        internal class Condition : Event\n        {\n            /// <summary>\n            /// Whether timer is enabled\n            /// </summary>\n            public bool TimerEnabled { get; set; }\n\n            /// <summary>\n            /// Create condition item\n            /// </summary>\n            /// <param name=\"owner\"></param>\n            /// <param name=\"template\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"timeProvider\"></param>\n            public Condition(ISubscriber owner, EventMonitoredItemModel template,\n                ILogger<Event> logger, TimeProvider timeProvider) :\n                base(owner, template, logger, timeProvider)\n            {\n                _snapshotInterval = template.ConditionHandling?.SnapshotInterval\n                    ?? throw new ArgumentException(\"Invalid snapshot interval\");\n                _updateInterval = template.ConditionHandling?.UpdateInterval\n                    ?? _snapshotInterval;\n                _lastSentPendingConditions = timeProvider.GetUtcNow();\n                _conditionHandlingState = new ConditionHandlingState();\n            }\n\n            /// <summary>\n            /// Copy constructor\n            /// </summary>\n            /// <param name=\"item\"></param>\n            /// <param name=\"copyEventHandlers\"></param>\n            /// <param name=\"copyClientHandle\"></param>\n            private Condition(Condition item, bool copyEventHandlers,\n                bool copyClientHandle)\n                : base(item, copyEventHandlers, copyClientHandle)\n            {\n                _snapshotInterval = item._snapshotInterval;\n                _updateInterval = item._updateInterval;\n                _conditionHandlingState = item._conditionHandlingState;\n                _lastSentPendingConditions = item._lastSentPendingConditions;\n                if (item.TimerEnabled)\n                {\n                    EnableConditionTimer();\n                }\n            }\n\n            /// <inheritdoc/>\n            public override MonitoredItem CloneMonitoredItem(\n                bool copyEventHandlers, bool copyClientHandle)\n            {\n                return new Condition(this, copyEventHandlers, copyClientHandle);\n            }\n\n            /// <inheritdoc/>\n            public override bool Equals(object? obj)\n            {\n                if (obj is not Condition item)\n                {\n                    return false;\n                }\n                return base.Equals(item);\n            }\n\n            /// <inheritdoc/>\n            public override int GetHashCode()\n            {\n                return 38138123 + base.GetHashCode();\n            }\n\n            /// <inheritdoc/>\n            public override string ToString()\n            {\n                var str = $\"Condition Item '{Template.StartNodeId}'\";\n                if (RemoteId.HasValue)\n                {\n                    str += $\" with server id {RemoteId} ({(Status?.Created == true ? \"\" : \"not \")}created)\";\n                }\n                return str;\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                if (disposing)\n                {\n                    lock (_timerLock)\n                    {\n                        _disposed = true;\n                        if (_conditionTimer != null)\n                        {\n                            _conditionTimer.Elapsed -= OnConditionTimerElapsed;\n                            _conditionTimer.Dispose();\n                            _conditionTimer = null;\n                        }\n                    }\n                }\n                base.Dispose(disposing);\n            }\n\n            /// <inheritdoc/>\n            protected override bool ProcessEventNotification(DateTimeOffset publishTime,\n                EventFieldList eventFields, MonitoredItemNotifications notifications)\n            {\n                Debug.Assert(Valid);\n                Debug.Assert(Template != null);\n\n                if (_disposed)\n                {\n                    return false;\n                }\n\n                var evFilter = Filter as EventFilter;\n                var eventTypeIndex = evFilter?.SelectClauses.IndexOf(\n                    evFilter.SelectClauses\n                        .Find(x => x.TypeDefinitionId == ObjectTypeIds.BaseEventType\n                            && x.BrowsePath?.FirstOrDefault() == BrowseNames.EventType));\n\n                var state = _conditionHandlingState;\n\n                // now, is this a regular event or RefreshStartEventType/RefreshEndEventType?\n                if (eventTypeIndex.HasValue && eventTypeIndex.Value != -1)\n                {\n                    var eventType = eventFields.EventFields[eventTypeIndex.Value].Value as NodeId;\n                    if (eventType == ObjectTypeIds.RefreshStartEventType)\n                    {\n                        // stop the timers during condition refresh\n                        DisableConditionTimer();\n                        state.Active.Clear();\n                        _logger.StoppedPendingAlarms(this);\n                        return true;\n                    }\n                    else if (eventType == ObjectTypeIds.RefreshEndEventType)\n                    {\n                        // restart the timers once condition refresh is done.\n                        EnableConditionTimer();\n                        _logger.RestartedPendingAlarms(this);\n                        return true;\n                    }\n                    else if (eventType == ObjectTypeIds.RefreshRequiredEventType)\n                    {\n                        var noErrorFound = true;\n                        Debug.Assert(Subscription != null);\n\n                        // issue a condition refresh to make sure we are in a correct state\n                        _logger.IssuingConditionRefresh(this, Template.DisplayName,\n                            Subscription.DisplayName);\n                        try\n                        {\n                            Subscription.ConditionRefreshAsync(default).GetAwaiter().GetResult(); // TODO\n                        }\n                        catch (Exception e)\n                        {\n                            _logger.ConditionRefreshFailed(this,\n                                Template.DisplayName, Subscription.DisplayName, e.Message);\n                            noErrorFound = false;\n                        }\n                        if (noErrorFound)\n                        {\n                            _logger.ConditionRefreshCompleted(this,\n                                Template.DisplayName, Subscription.DisplayName);\n                        }\n                        return true;\n                    }\n                }\n\n                var monitoredItemNotifications = ToMonitoredItemNotifications(\n                    eventFields).ToList();\n                var conditionIdIndex = state.ConditionIdIndex;\n                var retainIndex = state.RetainIndex;\n                if (conditionIdIndex < monitoredItemNotifications.Count &&\n                    retainIndex < monitoredItemNotifications.Count)\n                {\n                    // Cache conditions\n                    var conditionId = monitoredItemNotifications[conditionIdIndex].Value?\n                        .Value?.ToString();\n                    if (conditionId != null)\n                    {\n                        var retain = monitoredItemNotifications[retainIndex].Value?\n                            .GetValue(false) ?? false;\n\n                        if (state.Active.ContainsKey(conditionId) && !retain)\n                        {\n                            state.Active.Remove(conditionId, out _);\n                            state.Dirty = true;\n                        }\n                        else if (retain && !monitoredItemNotifications\n                            .All(m => m.Value?.Value == null))\n                        {\n                            state.Dirty = true;\n                            monitoredItemNotifications.ForEach(n =>\n                            {\n                                n.Value ??= new DataValue(StatusCodes.GoodNoData);\n                                // Set SourceTimestamp to publish time\n                                n.Value.SourceTimestamp = publishTime.UtcDateTime;\n                            });\n                            state.Active.AddOrUpdate(conditionId, monitoredItemNotifications);\n                        }\n                    }\n                }\n                return true;\n            }\n\n            /// <inheritdoc/>\n            public override bool MergeWith(OpcUaMonitoredItem item, IOpcUaSession session,\n                 out bool metadataChanged)\n            {\n                metadataChanged = false;\n                if (item is not Condition model || !Valid)\n                {\n                    return false;\n                }\n\n                var itemChange = false;\n                if (_snapshotInterval != model._snapshotInterval)\n                {\n                    _logger.SnapshotIntervalChanged(this,\n                        TimeSpan.FromSeconds(_snapshotInterval).TotalMilliseconds,\n                        TimeSpan.FromSeconds(model._snapshotInterval).TotalMilliseconds);\n\n                    _snapshotInterval = model._snapshotInterval;\n                    itemChange = true;\n                }\n\n                if (_updateInterval != model._updateInterval)\n                {\n                    _logger.UpdateIntervalChanged(this,\n                        TimeSpan.FromSeconds(_updateInterval).TotalMilliseconds,\n                        TimeSpan.FromSeconds(model._updateInterval).TotalMilliseconds);\n\n                    _updateInterval = model._updateInterval;\n                    itemChange = true;\n                }\n\n                itemChange |= base.MergeWith(model, session, out metadataChanged);\n                return itemChange;\n            }\n\n            /// <inheritdoc/>\n            public override bool TryCompleteChanges(Subscription subscription,\n                ref bool applyChanges)\n            {\n                var result = base.TryCompleteChanges(subscription, ref applyChanges);\n                if (!AttachedToSubscription || !result)\n                {\n                    DisableConditionTimer();\n                }\n                else\n                {\n                    EnableConditionTimer();\n                }\n                return result;\n            }\n\n            /// <summary>\n            /// Get event filter\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            protected override async ValueTask<EventFilter> GetEventFilterAsync(IOpcUaSession session,\n                CancellationToken ct)\n            {\n                var (eventFilter, internalSelectClauses) =\n                    await BuildEventFilterAsync(session, ct).ConfigureAwait(false);\n\n                var conditionHandlingState = InitializeConditionHandlingState(\n                    eventFilter, internalSelectClauses);\n\n                UpdateFieldNames(session, eventFilter, internalSelectClauses);\n\n                _conditionHandlingState = conditionHandlingState;\n                EnableConditionTimer();\n\n                return eventFilter;\n            }\n\n            /// <summary>\n            /// Initialize periodic pending condition handling state\n            /// </summary>\n            /// <param name=\"eventFilter\"></param>\n            /// <param name=\"internalSelectClauses\"></param>\n            /// <returns></returns>\n            private static ConditionHandlingState InitializeConditionHandlingState(\n                EventFilter eventFilter, List<SimpleAttributeOperand> internalSelectClauses)\n            {\n                var conditionHandlingState = new ConditionHandlingState();\n\n                var conditionIdClause = eventFilter.SelectClauses\n                    .Find(x => x.TypeDefinitionId == ObjectTypeIds.ConditionType\n                        && x.AttributeId == Attributes.NodeId);\n                if (conditionIdClause != null)\n                {\n                    conditionHandlingState.ConditionIdIndex =\n                        eventFilter.SelectClauses.IndexOf(conditionIdClause);\n                }\n                else\n                {\n                    conditionHandlingState.ConditionIdIndex = eventFilter.SelectClauses.Count;\n                    var selectClause = new SimpleAttributeOperand()\n                    {\n                        BrowsePath = [],\n                        TypeDefinitionId = ObjectTypeIds.ConditionType,\n                        AttributeId = Attributes.NodeId\n                    };\n                    eventFilter.SelectClauses.Add(selectClause);\n                    internalSelectClauses.Add(selectClause);\n                }\n\n                var retainClause = eventFilter.SelectClauses\n                    .Find(x => x.TypeDefinitionId == ObjectTypeIds.ConditionType &&\n                        x.BrowsePath?.FirstOrDefault() == BrowseNames.Retain);\n                if (retainClause != null)\n                {\n                    conditionHandlingState.RetainIndex =\n                        eventFilter.SelectClauses.IndexOf(retainClause);\n                }\n                else\n                {\n                    conditionHandlingState.RetainIndex = eventFilter.SelectClauses.Count;\n                    var selectClause = new SimpleAttributeOperand(\n                        ObjectTypeIds.ConditionType, BrowseNames.Retain);\n                    eventFilter.SelectClauses.Add(selectClause);\n                    internalSelectClauses.Add(selectClause);\n                }\n                return conditionHandlingState;\n            }\n\n            /// <summary>\n            /// Called when the condition timer fires\n            /// </summary>\n            /// <param name=\"sender\"></param>\n            /// <param name=\"e\"></param>\n            private void OnConditionTimerElapsed(object? sender, ElapsedEventArgs e)\n            {\n                Debug.Assert(Template != null);\n                var now = TimeProvider.GetUtcNow();\n                var state = _conditionHandlingState;\n                try\n                {\n                    if (!Created)\n                    {\n                        return;\n                    }\n\n                    // is it time to send anything?\n                    var sendPendingConditions = now >\n                        _lastSentPendingConditions + TimeSpan.FromSeconds(_snapshotInterval);\n                    if (!sendPendingConditions && state.Dirty)\n                    {\n                        sendPendingConditions = now >\n                            _lastSentPendingConditions + TimeSpan.FromSeconds(_updateInterval);\n                    }\n                    if (sendPendingConditions)\n                    {\n                        SendPendingConditions();\n                        _lastSentPendingConditions = now;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    _logger.SendPendingConditionsFailed(ex, this);\n                }\n                finally\n                {\n                    EnableConditionTimer();\n                }\n            }\n\n            /// <summary>\n            /// Send pending conditions\n            /// </summary>\n            private void SendPendingConditions()\n            {\n                var state = _conditionHandlingState;\n\n                var notifications = state.Active\n                    .Select(entry => entry.Value\n                        .Where(n => n.DataSetFieldName != null)\n                        .Select(n => n with { })\n                        .ToList())\n                    .ToList();\n                state.Dirty = false;\n\n                foreach (var conditionNotification in notifications)\n                {\n                    Publish(Owner, MessageType.Condition, conditionNotification,\n                        eventTypeName: EventTypeName);\n                }\n            }\n\n            /// <summary>\n            /// Enable timer\n            /// </summary>\n            private void EnableConditionTimer()\n            {\n                lock (_timerLock)\n                {\n                    if (_disposed)\n                    {\n                        return;\n                    }\n                    if (_conditionTimer == null)\n                    {\n                        _conditionTimer = new(TimeProvider)\n                        {\n                            AutoReset = false\n                        };\n                        _conditionTimer.Elapsed += OnConditionTimerElapsed;\n                        _logger.ConditionTimerReEnabled();\n                    }\n                    _conditionTimer.Interval = TimeSpan.FromSeconds(1);\n                    _conditionTimer.Enabled = true;\n                    TimerEnabled = true;\n                }\n            }\n\n            /// <summary>\n            /// Disable timer\n            /// </summary>\n            private void DisableConditionTimer()\n            {\n                lock (_timerLock)\n                {\n                    if (_conditionTimer != null)\n                    {\n                        _conditionTimer.Elapsed -= OnConditionTimerElapsed;\n                        _conditionTimer.Dispose();\n                        _conditionTimer = null;\n                        _logger.ConditionTimerDisabled();\n                    }\n                    TimerEnabled = false;\n                }\n            }\n\n            private sealed class ConditionHandlingState\n            {\n                /// <summary>\n                /// Index in the SelectClause array for Condition id field\n                /// </summary>\n                public int ConditionIdIndex { get; set; }\n\n                /// <summary>\n                /// Index in the SelectClause array for Retain field\n                /// </summary>\n                public int RetainIndex { get; set; }\n\n                /// <summary>\n                /// Has the pending alarms events been updated since las update message?\n                /// </summary>\n                public bool Dirty { get; set; }\n\n                /// <summary>\n                /// Cache of the latest events for the pending alarms optionally monitored\n                /// </summary>\n                public Dictionary<string, List<MonitoredItemNotificationModel>> Active { get; }\n                    = [];\n            }\n\n            private ConditionHandlingState _conditionHandlingState;\n            private DateTimeOffset _lastSentPendingConditions;\n            private int _snapshotInterval;\n            private int _updateInterval;\n            private TimerEx? _conditionTimer;\n            private readonly object _timerLock = new();\n            private bool _disposed;\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaMonitoredItem Condition handling\n    /// </summary>\n    internal static partial class OpcUaMonitoredItemConditionLogging\n    {\n        private const int EventClass = 1000;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"{Item}: Stopped pending alarm handling during condition refresh.\")]\n        public static partial void StoppedPendingAlarms(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"{Item}: Restarted pending alarm handling after condition refresh.\")]\n        public static partial void RestartedPendingAlarms(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"{Item}: Issuing ConditionRefresh for item {Name} on subscription {Subscription} \" +\n            \"due to receiving first notification.\")]\n        public static partial void IssuingConditionRefresh(this ILogger logger, OpcUaMonitoredItem item, string name, string subscription);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"{Item}: ConditionRefresh for item {Name} on subscription {Subscription} \" +\n            \"failed with error '{Message}'\")]\n        public static partial void ConditionRefreshFailed(this ILogger logger, OpcUaMonitoredItem item, string name,\n            string subscription, string message);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"{Item}: ConditionRefresh for item {Name} on subscription {Subscription} has completed\")]\n        public static partial void ConditionRefreshCompleted(this ILogger logger, OpcUaMonitoredItem item, string name, string subscription);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing shptshot interval from {Old} to {New}\")]\n        public static partial void SnapshotIntervalChanged(this ILogger logger, OpcUaMonitoredItem item, double old, double @new);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing update interval from {Old} to {New}\")]\n        public static partial void UpdateIntervalChanged(this ILogger logger, OpcUaMonitoredItem item, double old, double @new);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Error,\n            Message = \"{Item}: SendPendingConditions failed.\")]\n        public static partial void SendPendingConditionsFailed(this ILogger logger, Exception ex, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Debug,\n            Message = \"Re-enabled condition timer.\")]\n        public static partial void ConditionTimerReEnabled(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Debug,\n            Message = \"Disabled condition timer.\")]\n        public static partial void ConditionTimerDisabled(this ILogger logger);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaMonitoredItem.CyclicRead.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Runtime.Serialization;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    internal abstract partial class OpcUaMonitoredItem\n    {\n        /// <summary>\n        /// Cyclic read items are part of a subscription but disabled. They\n        /// execute through the client sampler periodically (at the configured\n        /// sampling rate).\n        /// </summary>\n        [DataContract(Namespace = Namespaces.OpcUaXsd)]\n        [KnownType(typeof(DataChangeFilter))]\n        [KnownType(typeof(EventFilter))]\n        [KnownType(typeof(AggregateFilter))]\n        internal sealed class CyclicRead : DataChange\n        {\n            /// <summary>\n            /// Create cyclic read item\n            /// </summary>\n            /// <param name=\"owner\"></param>\n            /// <param name=\"client\"></param>\n            /// <param name=\"template\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"timeProvider\"></param>\n            public CyclicRead(ISubscriber owner, OpcUaClient client,\n                DataMonitoredItemModel template, ILogger<CyclicRead> logger,\n                TimeProvider timeProvider) :\n                base(owner, template with\n                {\n                    // Always ensure item is disabled\n                    MonitoringMode = Publisher.Models.MonitoringMode.Disabled\n                }, logger, timeProvider)\n            {\n                _client = client;\n\n                LastReceivedValue = new MonitoredItemNotification\n                {\n                    Value = new DataValue(StatusCodes.GoodNoData)\n                };\n            }\n\n            /// <summary>\n            /// Copy constructor\n            /// </summary>\n            /// <param name=\"item\"></param>\n            /// <param name=\"copyEventHandlers\"></param>\n            /// <param name=\"copyClientHandle\"></param>\n            private CyclicRead(CyclicRead item, bool copyEventHandlers,\n                bool copyClientHandle)\n                : base(item, copyEventHandlers, copyClientHandle)\n            {\n                _client = item._client;\n                _subscriptionName = item._subscriptionName;\n                if (_subscriptionName != null)\n                {\n                    EnsureSamplerRunning();\n                }\n            }\n\n            /// <inheritdoc/>\n            public override MonitoredItem CloneMonitoredItem(\n                bool copyEventHandlers, bool copyClientHandle)\n            {\n                return new CyclicRead(this, copyEventHandlers, copyClientHandle);\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                // Cleanup\n                var sampler = _sampler;\n                lock (_lock)\n                {\n                    _disposed = true;\n                    _sampler = null;\n                }\n                sampler?.DisposeAsync().AsTask().GetAwaiter().GetResult();\n                base.Dispose(disposing);\n            }\n\n            /// <inheritdoc/>\n            public override bool Equals(object? obj)\n            {\n                if (obj is not CyclicRead cyclicRead)\n                {\n                    return false;\n                }\n                if (_client != cyclicRead._client)\n                {\n                    return false;\n                }\n                if ((Template.SamplingInterval ?? TimeSpan.FromSeconds(1)) !=\n                    (cyclicRead.Template.SamplingInterval ?? TimeSpan.FromSeconds(1)))\n                {\n                    return false;\n                }\n                if ((Template.CyclicReadMaxAge ?? TimeSpan.Zero) !=\n                    (cyclicRead.Template.CyclicReadMaxAge ?? TimeSpan.Zero))\n                {\n                    return false;\n                }\n                return base.Equals(obj);\n            }\n\n            /// <inheritdoc/>\n            public override int GetHashCode()\n            {\n                var hashCode = base.GetHashCode();\n                hashCode = (hashCode * -1521134295) +\n                    _client.GetHashCode();\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<TimeSpan>.Default.GetHashCode(\n                        Template.SamplingInterval ?? TimeSpan.FromSeconds(1));\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<TimeSpan>.Default.GetHashCode(\n                        Template.CyclicReadMaxAge ?? TimeSpan.Zero);\n                return hashCode;\n            }\n\n            /// <inheritdoc/>\n            public override string ToString()\n            {\n                return $\"Cyclic read '{Template.StartNodeId}' every {Template.SamplingInterval\n                    ?? TimeSpan.FromSeconds(1)}\";\n            }\n\n            /// <inheritdoc/>\n            public override bool MergeWith(OpcUaMonitoredItem item, IOpcUaSession session,\n                out bool metadataChanged)\n            {\n                if (item is not CyclicRead)\n                {\n                    metadataChanged = false;\n                    return false;\n                }\n                return base.MergeWith(item, session, out metadataChanged);\n            }\n\n            /// <inheritdoc/>\n            public override Func<CancellationToken, Task>? FinalizeMonitoringModeChange => async _ =>\n            {\n                if (!AttachedToSubscription)\n                {\n                    // Disabling sampling\n                    await StopSamplerAsync().ConfigureAwait(false);\n                }\n                else\n                {\n                    Debug.Assert(Subscription != null);\n                    _subscriptionName = Subscription.DisplayName;\n                    Debug.Assert(MonitoringMode == MonitoringMode.Disabled);\n                    EnsureSamplerRunning();\n                }\n            };\n\n            /// <summary>\n            /// Ensure sampler is started\n            /// </summary>\n            private void EnsureSamplerRunning()\n            {\n                lock (_lock)\n                {\n                    if (_disposed)\n                    {\n                        return;\n                    }\n                    if (_sampler == null)\n                    {\n                        Debug.Assert(_subscriptionName != null);\n                        _sampler = _client.Sample(\n                            TimeSpan.FromMilliseconds(SamplingInterval),\n                            Template.CyclicReadMaxAge ?? TimeSpan.Zero,\n                            new ReadValueId\n                            {\n                                AttributeId = AttributeId,\n                                IndexRange = IndexRange,\n                                NodeId = ResolvedNodeId\n                            },\n                            _subscriptionName, ClientHandle);\n                        _logger.ItemRegistered(this);\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Stop sampling\n            /// </summary>\n            /// <returns></returns>\n            private async Task StopSamplerAsync()\n            {\n                var sampler = _sampler;\n                lock (_lock)\n                {\n                    _sampler = null;\n                    _subscriptionName = null;\n                }\n                if (sampler != null)\n                {\n                    await sampler.DisposeAsync().ConfigureAwait(false);\n                    _logger.ItemUnregistered(this);\n                }\n            }\n\n            /// <inheritdoc/>\n            public override bool TryGetMonitoredItemNotifications(DateTimeOffset timestamp,\n                IEncodeable encodeablePayload, MonitoredItemNotifications notifications)\n            {\n                if (!Valid || encodeablePayload is not SampledDataValueModel cyclicReadNotification)\n                {\n                    return false;\n                }\n\n                LastReceivedValue = cyclicReadNotification;\n                LastReceivedTime = LastActivityTime = TimeProvider.GetUtcNow();\n                notifications.Add(Owner, ToMonitoredItemNotification(\n                    cyclicReadNotification.Value, cyclicReadNotification.Overflow));\n                return true;\n            }\n\n            private readonly OpcUaClient _client;\n            private IAsyncDisposable? _sampler;\n            private string? _subscriptionName;\n            private readonly object _lock = new();\n            private bool _disposed;\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaMonitoredItem CyclicRead handling\n    /// </summary>\n    internal static partial class OpcUaMonitoredItemCyclicReadLogging\n    {\n        private const int EventClass = 1050;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Item {Item} successfully registered with sampler.\")]\n        public static partial void ItemRegistered(this ILogger logger, OpcUaMonitoredItem.CyclicRead item);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Item {Item} unregistered from sampler.\")]\n        public static partial void ItemUnregistered(this ILogger logger, OpcUaMonitoredItem.CyclicRead item);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaMonitoredItem.DataChange.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using Opc.Ua.Client.ComplexTypes;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Runtime.Serialization;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    internal abstract partial class OpcUaMonitoredItem\n    {\n        /// <summary>\n        /// Data item\n        /// </summary>\n        [DataContract(Namespace = Namespaces.OpcUaXsd)]\n        [KnownType(typeof(DataChangeFilter))]\n        [KnownType(typeof(EventFilter))]\n        [KnownType(typeof(AggregateFilter))]\n        internal class DataChange : OpcUaMonitoredItem\n        {\n            /// <inheritdoc/>\n            public override (string NodeId, string[] Path, UpdateNodeId Update)? Resolve\n                => Template.RelativePath != null &&\n                    (TheResolvedNodeId == Template.StartNodeId || string.IsNullOrEmpty(TheResolvedNodeId)) ?\n                    (Template.StartNodeId, Template.RelativePath.ToArray(),\n                        (v, context) => TheResolvedNodeId = NodeId\n                            = v.AsString(context, Template.NamespaceFormat) ?? string.Empty) : null;\n\n            /// <inheritdoc/>\n            public override (string NodeId, UpdateNodeId Update)? Register\n                => Template.RegisterRead == true && !_registeredForReading &&\n                    !string.IsNullOrEmpty(TheResolvedNodeId) ? (TheResolvedNodeId, (v, context) =>\n                    {\n                        NodeId = v.AsString(context, Template.NamespaceFormat) ?? string.Empty;\n                        // We only want to register the node once for reading inside a session\n                        _registeredForReading = true;\n                    }\n            ) : null;\n\n            /// <inheritdoc/>\n            public override (string NodeId, UpdateString Update)? GetDisplayName\n                => Template.FetchDataSetFieldName == true && Template.DataSetFieldName != null &&\n                    !string.IsNullOrEmpty(NodeId) ?\n                    (NodeId, v => Template = Template with { DataSetFieldName = v }) : null;\n\n            /// <inheritdoc/>\n            public override (string NodeId, UpdateRelativePath Update)? GetPath\n                => TheResolvedRelativePath == null &&\n                !string.IsNullOrEmpty(TheResolvedNodeId) ? (TheResolvedNodeId, (path, context) =>\n                {\n                    if (path == null)\n                    {\n                        NodeId = string.Empty;\n                    }\n                    TheResolvedRelativePath = path;\n                }\n            ) : null;\n\n            /// <summary>\n            /// Monitored item as data\n            /// </summary>\n            public DataMonitoredItemModel Template { get; protected internal set; }\n\n            /// <summary>\n            /// Resolved node id\n            /// </summary>\n            protected string TheResolvedNodeId { get; private set; }\n\n            /// <summary>\n            /// Relative path\n            /// </summary>\n            protected RelativePath? TheResolvedRelativePath { get; private set; }\n\n            /// <summary>\n            /// Field identifier either configured or randomly assigned\n            /// for data change items.\n            /// </summary>\n            public Guid DataSetClassFieldId\n                => Template?.DataSetClassFieldId == Guid.Empty ?\n                    _fieldId : Template?.DataSetClassFieldId ?? Guid.Empty;\n\n            /// <summary>\n            /// Create wrapper\n            /// </summary>\n            /// <param name=\"owner\"></param>\n            /// <param name=\"template\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"timeProvider\"></param>\n            public DataChange(ISubscriber owner, DataMonitoredItemModel template,\n                ILogger<DataChange> logger, TimeProvider timeProvider) :\n                base(owner, logger, template.StartNodeId, timeProvider)\n            {\n                Template = template;\n\n                //\n                // We also track the resolved node id so we distinguish it\n                // from the registered and thus effective node id\n                //\n                TheResolvedNodeId = template.StartNodeId;\n            }\n\n            /// <summary>\n            /// Copy constructor\n            /// </summary>\n            /// <param name=\"item\"></param>\n            /// <param name=\"copyEventHandlers\"></param>\n            /// <param name=\"copyClientHandle\"></param>\n            protected DataChange(DataChange item, bool copyEventHandlers,\n                bool copyClientHandle)\n                : base(item, copyEventHandlers, copyClientHandle)\n            {\n                TheResolvedNodeId = item.TheResolvedNodeId;\n                TheResolvedRelativePath = item.TheResolvedRelativePath;\n                Template = item.Template;\n                _fieldId = item._fieldId;\n                _skipDataChangeNotification = item._skipDataChangeNotification;\n                _registeredForReading = false;\n            }\n\n            /// <inheritdoc/>\n            public override MonitoredItem CloneMonitoredItem(\n                bool copyEventHandlers, bool copyClientHandle)\n            {\n                return new DataChange(this, copyEventHandlers, copyClientHandle);\n            }\n\n            /// <inheritdoc/>\n            public override bool Equals(object? obj)\n            {\n                if (obj is not DataChange dataItem)\n                {\n                    return false;\n                }\n                if ((Template.DataSetFieldId ?? string.Empty) !=\n                    (dataItem.Template.DataSetFieldId ?? string.Empty))\n                {\n                    return false;\n                }\n                if (!Template.RelativePath.SequenceEqualsSafe(\n                    dataItem.Template.RelativePath))\n                {\n                    return false;\n                }\n                if (Template.StartNodeId != dataItem.Template.StartNodeId)\n                {\n                    return false;\n                }\n                if (Template.RegisterRead != dataItem.Template.RegisterRead)\n                {\n                    return false;\n                }\n                if (Template.IndexRange != dataItem.Template.IndexRange)\n                {\n                    return false;\n                }\n                if (Template.AttributeId != dataItem.Template.AttributeId)\n                {\n                    return false;\n                }\n                return true;\n            }\n\n            /// <inheritdoc/>\n            public override int GetHashCode()\n            {\n                var hashCode = 81523234 + base.GetHashCode();\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<string>.Default.GetHashCode(\n                        Template.DataSetFieldId ?? string.Empty);\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<IReadOnlyList<string>>.Default.GetHashCode(\n                        Template.RelativePath ?? Array.Empty<string>());\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<string>.Default.GetHashCode(Template.StartNodeId);\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<string>.Default.GetHashCode(Template.IndexRange ?? string.Empty);\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<bool>.Default.GetHashCode(Template.RegisterRead ?? false);\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<NodeAttribute>.Default.GetHashCode(\n                        Template.AttributeId ?? NodeAttribute.NodeId);\n                return hashCode;\n            }\n\n            /// <inheritdoc/>\n            public override string ToString()\n            {\n                var str = $\"Data Item '{Template.StartNodeId}'\";\n                if (RemoteId.HasValue)\n                {\n                    str += $\" with server id {RemoteId} ({(Status?.Created == true ? \"\" : \"not \")}created)\";\n                }\n                return str;\n            }\n\n            /// <inheritdoc/>\n            public override async ValueTask GetMetaDataAsync(IOpcUaSession session,\n                ComplexTypeSystem? typeSystem, List<PublishedFieldMetaDataModel> fields,\n                NodeIdDictionary<object> dataTypes, CancellationToken ct)\n            {\n                var nodeId = NodeId.ToExpandedNodeId(session.MessageContext);\n                if (Opc.Ua.NodeId.IsNull(nodeId))\n                {\n                    // Failed.\n                    return;\n                }\n                try\n                {\n                    var node = await session.LruNodeCache.GetNodeAsync(nodeId, ct).ConfigureAwait(false);\n                    if (node is VariableNode variable)\n                    {\n                        await AddVariableFieldAsync(fields, dataTypes, session, typeSystem, variable,\n                            Template.DisplayName, (Uuid)DataSetClassFieldId, ct).ConfigureAwait(false);\n                    }\n                }\n                catch (Exception ex) when (ex is not OperationCanceledException)\n                {\n                    _logger.GetMetadataFailed(this, Template.DisplayName, nodeId, ex.Message);\n                }\n            }\n\n            /// <inheritdoc/>\n            public override bool AddTo(Subscription subscription, IOpcUaSession session,\n                out bool metadataChanged)\n            {\n                var nodeId = NodeId.ToNodeId(session.MessageContext);\n                if (Opc.Ua.NodeId.IsNull(nodeId))\n                {\n                    metadataChanged = false;\n                    return false;\n                }\n\n                DisplayName = Template.DisplayName;\n                AttributeId = (uint)(Template.AttributeId ??\n                    (NodeAttribute)Attributes.Value);\n                IndexRange = Template.IndexRange;\n                StartNodeId = nodeId;\n                MonitoringMode = Template.MonitoringMode.ToStackType()\n                    ?? Opc.Ua.MonitoringMode.Reporting;\n                SamplingInterval = (int)Template.SamplingInterval.\n                    GetValueOrDefault(TimeSpan.FromSeconds(1)).TotalMilliseconds;\n                UpdateQueueSize(subscription, Template);\n                Filter = Template.DataChangeFilter.ToStackModel() ??\n                    (MonitoringFilter?)Template.AggregateFilter.ToStackModel(\n                        session.MessageContext);\n                DiscardOldest = !(Template.DiscardNew ?? false);\n                Valid = true;\n\n                if (!TrySetSkipFirst(Template.SkipFirst ?? false))\n                {\n                    Debug.Fail(\"Unexpected: Failed to set skip first setting.\");\n                }\n                return base.AddTo(subscription, session, out metadataChanged);\n            }\n\n            /// <inheritdoc/>\n            public override bool TryCompleteChanges(Subscription subscription, ref bool applyChanges)\n            {\n                var msgContext = subscription.Session?.MessageContext;\n                if (Filter is AggregateFilter &&\n                    Status?.FilterResult is AggregateFilterResult afr && msgContext != null)\n                {\n                    if (Status.Error != null && ServiceResult.IsNotGood(Status.Error))\n                    {\n                        _logger.AggregateFilterError(afr.AsJson(msgContext), this);\n                    }\n                    else if (_logger.IsEnabled(LogLevel.Debug))\n                    {\n                        _logger.AggregateFilterApplied(afr.AsJson(msgContext), this);\n                    }\n                }\n                return base.TryCompleteChanges(subscription, ref applyChanges);\n            }\n\n            /// <inheritdoc/>\n            public override bool TryGetMonitoredItemNotifications(\n                DateTimeOffset publishTime, IEncodeable evt, MonitoredItemNotifications notifications)\n            {\n                if (evt is not MonitoredItemNotification min)\n                {\n                    _logger.UnexpectedEventType(this, evt?.GetType().Name ?? \"null\");\n                    return false;\n                }\n                if (!base.TryGetMonitoredItemNotifications(publishTime, evt, notifications))\n                {\n                    return false;\n                }\n                return ProcessMonitoredItemNotification(publishTime, min, notifications);\n            }\n\n            /// <inheritdoc/>\n            public override bool MergeWith(OpcUaMonitoredItem item, IOpcUaSession session,\n                 out bool metadataChanged)\n            {\n                metadataChanged = false;\n                if (item is not DataChange model || !Valid)\n                {\n                    return false;\n                }\n\n                var itemChange = MergeWith(Template, model.Template, out var updated,\n                    out metadataChanged);\n                if (itemChange)\n                {\n                    Template = updated;\n                }\n\n                if ((Template.SamplingInterval ?? TimeSpan.FromSeconds(1)) !=\n                    (Template.SamplingInterval ?? TimeSpan.FromSeconds(1)))\n                {\n                    _logger.SamplingIntervalChanged(this,\n                        Template.SamplingInterval.GetValueOrDefault(\n                            TimeSpan.FromSeconds(1)).TotalMilliseconds,\n                        model.Template.SamplingInterval.GetValueOrDefault(\n                            TimeSpan.FromSeconds(1)).TotalMilliseconds);\n                    Template = Template with { SamplingInterval = model.Template.SamplingInterval };\n                    SamplingInterval =\n                        (int)Template.SamplingInterval.GetValueOrDefault(\n                            TimeSpan.FromSeconds(1)).TotalMilliseconds;\n                    itemChange = true;\n                }\n\n                if (Template.DataSetClassFieldId != model.Template.DataSetClassFieldId)\n                {\n                    var previous = DataSetClassFieldId;\n                    Template = Template with { DataSetClassFieldId = model.Template.DataSetClassFieldId };\n                    _logger.DatasetClassFieldIdChanged(this, previous, DataSetClassFieldId);\n                    metadataChanged = true;\n                }\n\n                // Update change filter\n                if (!model.Template.DataChangeFilter.IsSameAs(Template.DataChangeFilter))\n                {\n                    Template = Template with { DataChangeFilter = model.Template.DataChangeFilter };\n                    _logger.DataChangeFilterChanged(this);\n                    Filter = Template.DataChangeFilter.ToStackModel();\n                    itemChange = true;\n                }\n\n                // Update AggregateFilter\n                else if (!model.Template.AggregateFilter.IsSameAs(Template.AggregateFilter))\n                {\n                    Template = Template with { AggregateFilter = model.Template.AggregateFilter };\n                    _logger.AggregateChangeFilterChanged(this);\n                    Filter = Template.AggregateFilter.ToStackModel(session.MessageContext);\n                    itemChange = true;\n                }\n                if ((model.Template.SkipFirst ?? false) != (Template.SkipFirst ?? false))\n                {\n                    Template = Template with { SkipFirst = model.Template.SkipFirst };\n\n                    if (model.TrySetSkipFirst(model.Template.SkipFirst ?? false))\n                    {\n                        _logger.SkipFirstChanged(this, model.Template.SkipFirst);\n                    }\n                    else\n                    {\n                        _logger.SkipFirstAlreadySet(this);\n                    }\n                    // No change, just updated internal state\n                }\n                return itemChange;\n            }\n\n            /// <inheritdoc/>\n            protected override bool OnSamplingIntervalOrQueueSizeRevised(\n                bool samplingIntervalChanged, bool queueSizeChanged)\n            {\n                Debug.Assert(Subscription != null);\n                var applyChanges = base.OnSamplingIntervalOrQueueSizeRevised(\n                    samplingIntervalChanged, queueSizeChanged);\n                if (samplingIntervalChanged)\n                {\n                    applyChanges |= UpdateQueueSize(Subscription, Template);\n                }\n                return applyChanges;\n            }\n\n            /// <inheritdoc/>\n            public override bool TryGetLastMonitoredItemNotifications(\n                MonitoredItemNotifications notifications)\n            {\n                SkipMonitoredItemNotification(); // Key frames should always be sent\n                return base.TryGetLastMonitoredItemNotifications(notifications);\n            }\n\n            /// <inheritdoc/>\n            protected override IEnumerable<OpcUaMonitoredItem> CreateTriggeredItems(\n                ILoggerFactory factory, OpcUaClient client)\n            {\n                if (Template.TriggeredItems != null)\n                {\n                    return Create(client, Template.TriggeredItems.Select(i => (Owner, i)),\n                        factory, TimeProvider);\n                }\n                return [];\n            }\n\n            /// <inheritdoc/>\n            protected override bool TryGetErrorMonitoredItemNotifications(\n                StatusCode statusCode, MonitoredItemNotifications notifications)\n            {\n                notifications.Add(Owner, ToMonitoredItemNotification(new DataValue(statusCode)));\n                return true;\n            }\n\n            /// <summary>\n            /// Process monitored item notification\n            /// </summary>\n            /// <param name=\"publishTime\"></param>\n            /// <param name=\"monitoredItemNotification\"></param>\n            /// <param name=\"notifications\"></param>\n            /// <returns></returns>\n            protected virtual bool ProcessMonitoredItemNotification(DateTimeOffset publishTime,\n                MonitoredItemNotification monitoredItemNotification,\n                MonitoredItemNotifications notifications)\n            {\n                if (!SkipMonitoredItemNotification())\n                {\n                    notifications.Add(Owner, ToMonitoredItemNotification(\n                        monitoredItemNotification.Value));\n                    return true;\n                }\n                return false;\n            }\n\n            /// <summary>\n            /// Convert to monitored item notifications\n            /// </summary>\n            /// <param name=\"dataValue\"></param>\n            /// <param name=\"overflow\"></param>\n            /// <returns></returns>\n            protected MonitoredItemNotificationModel ToMonitoredItemNotification(\n                DataValue dataValue, int? overflow = null)\n            {\n                Debug.Assert(Valid);\n                Debug.Assert(Template != null);\n\n                return new MonitoredItemNotificationModel\n                {\n                    Id = Template.DataSetFieldId ?? string.Empty,\n                    DataSetFieldName = Template.DisplayName,\n                    DataSetName = Template.DisplayName,\n                    NodeId = NodeId,\n                    PathFromRoot = TheResolvedRelativePath,\n                    Value = dataValue,\n                    Flags = 0,\n                    Overflow = overflow ?? (dataValue.StatusCode.Overflow ? 1 : 0),\n                    SequenceNumber = GetNextSequenceNumber()\n                };\n            }\n\n            /// <summary>\n            /// Whether to skip monitored item notification\n            /// </summary>\n            /// <returns></returns>\n            public virtual bool SkipMonitoredItemNotification()\n            {\n                // This will update that first value has been processed.\n                var last = Interlocked.Exchange(ref _skipDataChangeNotification,\n                    (int)SkipSetting.DontSkip);\n                return last == (int)SkipSetting.Skip;\n            }\n\n            /// <summary>\n            /// Try set skip first setting. We allow updating while first value\n            /// is not yet processed, which is the case if skip setting is unconfigured.\n            /// </summary>\n            /// <param name=\"skipFirst\"></param>\n            /// <returns></returns>\n            public bool TrySetSkipFirst(bool skipFirst)\n            {\n                if (skipFirst)\n                {\n                    // We only allow updating first skip setting while unconfigured\n                    return Interlocked.CompareExchange(ref _skipDataChangeNotification,\n                        (int)SkipSetting.Skip,\n                        (int)SkipSetting.Unconfigured) == (int)SkipSetting.Unconfigured;\n                }\n                // Unset skip setting if it was configured but first message was not yet processed\n                Interlocked.CompareExchange(ref _skipDataChangeNotification,\n                    (int)SkipSetting.Unconfigured, (int)SkipSetting.Skip);\n\n                return true;\n            }\n\n            enum SkipSetting\n            {\n                /// <summary> Default </summary>\n                DontSkip,\n                /// <summary> Skip first value </summary>\n                Skip,\n                /// <summary> Configuration not applied yet </summary>\n                Unconfigured,\n            }\n\n            private volatile int _skipDataChangeNotification = (int)SkipSetting.Unconfigured;\n            private readonly Guid _fieldId = Guid.NewGuid();\n            private bool _registeredForReading;\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaMonitoredItem DataChange handling\n    /// </summary>\n    internal static partial class OpcUaMonitoredItemDataChangeLogging\n    {\n        private const int EventClass = 1060;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"{Item}: Failed to get meta data for field {Field} with node {NodeId} with message {Message}.\")]\n        public static partial void GetMetadataFailed(this ILogger logger, OpcUaMonitoredItem.DataChange item, string field, ExpandedNodeId nodeId, string message);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Aggregate filter applied with result {Result} for {Item}\")]\n        public static partial void AggregateFilterError(this ILogger logger, string result, OpcUaMonitoredItem.DataChange item);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug, SkipEnabledCheck = true,\n            Message = \"Aggregate filter applied with result {Result} for {Item}\")]\n        public static partial void AggregateFilterApplied(this ILogger logger, string result, OpcUaMonitoredItem.DataChange item);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Debug,\n            Message = \"{Item}: Unexpected event type {Type} received.\")]\n        public static partial void UnexpectedEventType(this ILogger logger, OpcUaMonitoredItem.DataChange item, string type);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing sampling interval from {Old} to {New}\")]\n        public static partial void SamplingIntervalChanged(this ILogger logger, OpcUaMonitoredItem.DataChange item, double old, double @new);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing dataset class field id from {Old} to {New}\")]\n        public static partial void DatasetClassFieldIdChanged(this ILogger logger, OpcUaMonitoredItem.DataChange item, Guid old, Guid @new);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing data change filter.\")]\n        public static partial void DataChangeFilterChanged(this ILogger logger, OpcUaMonitoredItem.DataChange item);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing aggregate change filter.\")]\n        public static partial void AggregateChangeFilterChanged(this ILogger logger, OpcUaMonitoredItem.DataChange item);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Debug,\n            Message = \"{Item}: Setting skip first setting to {New}\")]\n        public static partial void SkipFirstChanged(this ILogger logger, OpcUaMonitoredItem.DataChange item, bool? @new);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"{Item}: Tried to set SkipFirst but it was set previously or first value was already processed.\")]\n        public static partial void SkipFirstAlreadySet(this ILogger logger, OpcUaMonitoredItem.DataChange item);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaMonitoredItem.Event.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using Opc.Ua.Client.ComplexTypes;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Data;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Runtime.Serialization;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    internal abstract partial class OpcUaMonitoredItem\n    {\n        /// <summary>\n        /// Event monitored item\n        /// </summary>\n        [DataContract(Namespace = Namespaces.OpcUaXsd)]\n        [KnownType(typeof(DataChangeFilter))]\n        [KnownType(typeof(EventFilter))]\n        [KnownType(typeof(AggregateFilter))]\n        internal class Event : OpcUaMonitoredItem\n        {\n            /// <inheritdoc/>\n            public override (string NodeId, UpdateString Update)? GetDisplayName\n                => Template.FetchDataSetFieldName == true &&\n                    !string.IsNullOrEmpty(Template.EventFilter.TypeDefinitionId) &&\n                    Template.DataSetFieldName == null ?\n                    (Template.EventFilter.TypeDefinitionId!, v => Template = Template with\n                    {\n                        DataSetFieldName = v\n                    }) : null;\n\n            /// <inheritdoc/>\n            public override (string NodeId, string[] Path, UpdateNodeId Update)? Resolve\n                => Template.RelativePath != null &&\n                    (NodeId == Template.StartNodeId || string.IsNullOrEmpty(NodeId)) ?\n                    (Template.StartNodeId, Template.RelativePath.ToArray(),\n                        (v, context) => NodeId\n                            = v.AsString(context, Template.NamespaceFormat) ?? string.Empty) : null;\n\n            /// <inheritdoc/>\n            public override (string NodeId, UpdateRelativePath Update)? GetPath\n                => TheResolvedRelativePath == null &&\n                !string.IsNullOrEmpty(NodeId) ? (NodeId, (path, context) =>\n                {\n                    if (path == null)\n                    {\n                        NodeId = string.Empty;\n                    }\n                    TheResolvedRelativePath = path;\n                }\n            ) : null;\n\n            /// <inheritdoc/>\n            public override string? EventTypeName => Template.DisplayName;\n\n            /// <summary>\n            /// Relative path\n            /// </summary>\n            protected RelativePath? TheResolvedRelativePath { get; private set; }\n\n            /// <summary>\n            /// Monitored item as event\n            /// </summary>\n            public EventMonitoredItemModel Template { get; protected internal set; }\n\n            /// <summary>\n            /// List of field names.\n            /// </summary>\n            public List<(string? Name, Guid DataSetFieldId)> Fields { get; } = [];\n\n            /// <summary>\n            /// Create wrapper\n            /// </summary>\n            /// <param name=\"owner\"></param>\n            /// <param name=\"template\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"timeProvider\"></param>\n            public Event(ISubscriber owner, EventMonitoredItemModel template,\n                ILogger<Event> logger, TimeProvider timeProvider) :\n                base(owner, logger, template.StartNodeId, timeProvider)\n            {\n                Template = template;\n            }\n\n            /// <summary>\n            /// Copy constructor\n            /// </summary>\n            /// <param name=\"item\"></param>\n            /// <param name=\"copyEventHandlers\"></param>\n            /// <param name=\"copyClientHandle\"></param>\n            protected Event(Event item, bool copyEventHandlers,\n                bool copyClientHandle)\n                : base(item, copyEventHandlers, copyClientHandle)\n            {\n                Fields = item.Fields;\n                TheResolvedRelativePath = item.TheResolvedRelativePath;\n                Template = item.Template;\n            }\n\n            /// <inheritdoc/>\n            public override MonitoredItem CloneMonitoredItem(\n                bool copyEventHandlers, bool copyClientHandle)\n            {\n                return new Event(this, copyEventHandlers, copyClientHandle);\n            }\n\n            /// <inheritdoc/>\n            public override bool Equals(object? obj)\n            {\n                if (obj is not Event eventItem)\n                {\n                    return false;\n                }\n                if ((Template.DataSetFieldId ?? string.Empty) !=\n                    (eventItem.Template.DataSetFieldId ?? string.Empty))\n                {\n                    return false;\n                }\n                if ((Template.DataSetFieldName ?? string.Empty) !=\n                    (eventItem.Template.DataSetFieldName ?? string.Empty))\n                {\n                    return false;\n                }\n                if (!Template.RelativePath.SequenceEqualsSafe(eventItem.Template.RelativePath))\n                {\n                    return false;\n                }\n                if (Template.StartNodeId != eventItem.Template.StartNodeId)\n                {\n                    return false;\n                }\n                if (Template.AttributeId != eventItem.Template.AttributeId)\n                {\n                    return false;\n                }\n                return true;\n            }\n\n            /// <inheritdoc/>\n            public override int GetHashCode()\n            {\n                var hashCode = 423444443 + base.GetHashCode();\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<string>.Default.GetHashCode(\n                        Template.DataSetFieldName ?? string.Empty);\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<string>.Default.GetHashCode(\n                        Template.DataSetFieldId ?? string.Empty);\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<IReadOnlyList<string>>.Default.GetHashCode(\n                        Template.RelativePath ?? Array.Empty<string>());\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<string>.Default.GetHashCode(\n                        Template.StartNodeId);\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<NodeAttribute>.Default.GetHashCode(\n                        Template.AttributeId ?? NodeAttribute.NodeId);\n                return hashCode;\n            }\n\n            /// <inheritdoc/>\n            public override string ToString()\n            {\n                var str = $\"Event Item '{Template.StartNodeId}'\";\n                if (RemoteId.HasValue)\n                {\n                    str += $\" with server id {RemoteId} ({(Status?.Created == true ? \"\" : \"not \")}created)\";\n                }\n                return str;\n            }\n\n            /// <inheritdoc/>\n            public override async ValueTask GetMetaDataAsync(IOpcUaSession session,\n                ComplexTypeSystem? typeSystem, List<PublishedFieldMetaDataModel> fields,\n                NodeIdDictionary<object> dataTypes, CancellationToken ct)\n            {\n                if (Filter is not EventFilter eventFilter)\n                {\n                    return;\n                }\n                try\n                {\n                    Debug.Assert(Fields.Count == eventFilter.SelectClauses.Count);\n                    for (var i = 0; i < eventFilter.SelectClauses.Count; i++)\n                    {\n                        var selectClause = eventFilter.SelectClauses[i];\n                        var fieldName = Fields[i].Name;\n                        if (fieldName == null)\n                        {\n                            continue;\n                        }\n                        var dataSetClassFieldId = (Uuid)Fields[i].DataSetFieldId;\n                        var targetNode = await FindNodeWithBrowsePathAsync(session,\n                            selectClause.BrowsePath, selectClause.TypeDefinitionId,\n                            ct).ConfigureAwait(false);\n                        if (targetNode is VariableNode variable)\n                        {\n                            await AddVariableFieldAsync(fields, dataTypes, session,\n                                typeSystem, variable, fieldName, dataSetClassFieldId,\n                                ct).ConfigureAwait(false);\n                        }\n                        else\n                        {\n                            // Should this happen?\n                            await AddVariableFieldAsync(fields, dataTypes, session,\n                                typeSystem, new VariableNode\n                                {\n                                    DataType = (int)BuiltInType.Variant\n                                }, fieldName, dataSetClassFieldId,\n                                ct).ConfigureAwait(false);\n                        }\n                    }\n                }\n                catch (Exception e)\n                {\n                    _logger.GetMetadataFailed(e, this);\n                    throw;\n                }\n            }\n\n            public override Func<IOpcUaSession, CancellationToken, Task>? FinalizeAddTo\n                => async (session, ct)\n                => Filter = await GetEventFilterAsync(session, ct).ConfigureAwait(false);\n\n            /// <inheritdoc/>\n            public override bool AddTo(Subscription subscription,\n                IOpcUaSession session, out bool metadataChanged)\n            {\n                var nodeId = NodeId.ToNodeId(session.MessageContext);\n                if (Opc.Ua.NodeId.IsNull(nodeId))\n                {\n                    metadataChanged = false;\n                    return false;\n                }\n                DisplayName = Template.DisplayName;\n                AttributeId = (uint)(Template.AttributeId\n                    ?? (NodeAttribute)Attributes.EventNotifier);\n                MonitoringMode = Template.MonitoringMode.ToStackType()\n                    ?? Opc.Ua.MonitoringMode.Reporting;\n                StartNodeId = nodeId;\n                SamplingInterval = 0;\n                UpdateQueueSize(subscription, Template);\n                DiscardOldest = !(Template.DiscardNew ?? false);\n                Valid = true;\n\n                return base.AddTo(subscription, session, out metadataChanged);\n            }\n\n            /// <inheritdoc/>\n            public override bool MergeWith(OpcUaMonitoredItem item, IOpcUaSession session,\n                 out bool metadataChanged)\n            {\n                metadataChanged = false;\n                if (item is not Event model || !Valid)\n                {\n                    return false;\n                }\n\n                var itemChange = MergeWith(Template, model.Template, out var updated,\n                    out metadataChanged);\n                if (itemChange)\n                {\n                    Template = updated;\n                }\n\n                // Update event filter\n                if (!model.Template.EventFilter.IsSameAs(Template.EventFilter))\n                {\n                    Template = Template with\n                    {\n                        EventFilter = model.Template.EventFilter\n                    };\n                    _logger.ChangingEventFilter(this);\n                    metadataChanged = true;\n                    itemChange = true;\n                }\n                return itemChange;\n            }\n\n            /// <inheritdoc/>\n            public override bool TryCompleteChanges(Subscription subscription, ref bool applyChanges)\n            {\n                var msgContext = subscription.Session?.MessageContext;\n                if (Status?.FilterResult is EventFilterResult evr && msgContext != null)\n                {\n                    if (Status.Error != null && ServiceResult.IsNotGood(Status.Error))\n                    {\n                        _logger.EventFilterAppliedWithError(evr.AsJson(msgContext), this);\n                    }\n                    else if (_logger.IsEnabled(LogLevel.Debug))\n                    {\n                        _logger.EventFilterApplied(evr.AsJson(msgContext), this);\n                    }\n                }\n                return base.TryCompleteChanges(subscription, ref applyChanges);\n            }\n\n            /// <inheritdoc/>\n            protected override bool OnSamplingIntervalOrQueueSizeRevised(\n                bool samplingIntervalChanged, bool queueSizeChanged)\n            {\n                Debug.Assert(Subscription != null);\n                var applyChanges = base.OnSamplingIntervalOrQueueSizeRevised(\n                    samplingIntervalChanged, queueSizeChanged);\n                if (samplingIntervalChanged && Status.SamplingInterval != 0)\n                {\n                    // Not necessary as sampling interval will likely always stay 0\n                    applyChanges |= UpdateQueueSize(Subscription, Template);\n                }\n                return applyChanges;\n            }\n\n            public override Func<IOpcUaSession, CancellationToken, Task>? FinalizeMergeWith\n                => async (session, ct)\n                => Filter = await GetEventFilterAsync(session, ct).ConfigureAwait(false);\n\n            /// <inheritdoc/>\n            public override bool TryGetMonitoredItemNotifications(DateTimeOffset publishTime,\n                IEncodeable evt, MonitoredItemNotifications notifications)\n            {\n                if (evt is EventFieldList eventFields &&\n                    base.TryGetMonitoredItemNotifications(publishTime, evt, notifications))\n                {\n                    return ProcessEventNotification(publishTime, eventFields, notifications);\n                }\n                return false;\n            }\n\n            /// <inheritdoc/>\n            protected override IEnumerable<OpcUaMonitoredItem> CreateTriggeredItems(\n                ILoggerFactory factory, OpcUaClient client)\n            {\n                if (Template.TriggeredItems != null)\n                {\n                    return Create(client, Template.TriggeredItems.Select(i => (Owner, i)),\n                        factory, TimeProvider);\n                }\n                return [];\n            }\n\n            /// <inheritdoc/>\n            protected override bool TryGetErrorMonitoredItemNotifications(\n                StatusCode statusCode, MonitoredItemNotifications notifications)\n            {\n                foreach (var (Name, _) in Fields)\n                {\n                    if (Name == null)\n                    {\n                        continue;\n                    }\n                    notifications.Add(Owner, new MonitoredItemNotificationModel\n                    {\n                        Id = Template.Id ?? string.Empty,\n                        DataSetName = Template.DisplayName,\n                        DataSetFieldName = Name,\n                        NodeId = Template.StartNodeId,\n                        PathFromRoot = TheResolvedRelativePath,\n                        Value = new DataValue(statusCode),\n                        Flags = MonitoredItemSourceFlags.Error,\n                        SequenceNumber = GetNextSequenceNumber()\n                    });\n                }\n                return true;\n            }\n\n            /// <summary>\n            /// Process event notifications\n            /// </summary>\n            /// <param name=\"timestamp\"></param>\n            /// <param name=\"eventFields\"></param>\n            /// <param name=\"notifications\"></param>\n            /// <returns></returns>\n            protected virtual bool ProcessEventNotification(DateTimeOffset timestamp,\n                EventFieldList eventFields, MonitoredItemNotifications notifications)\n            {\n                // Send notifications as event\n                foreach (var n in ToMonitoredItemNotifications(eventFields)\n                    .Where(n => n.DataSetFieldName != null))\n                {\n                    notifications.Add(Owner, n);\n                }\n                return true;\n            }\n\n            /// <summary>\n            /// Convert to monitored item notifications\n            /// </summary>\n            /// <param name=\"eventFields\"></param>\n            /// <returns></returns>\n            protected IEnumerable<MonitoredItemNotificationModel> ToMonitoredItemNotifications(\n                EventFieldList eventFields)\n            {\n                Debug.Assert(Valid);\n                Debug.Assert(Template != null);\n\n                //\n                // Important - so the event is properly batched during encoding the same\n                // sequence number must be used for all monitored item notifications !\n                //\n                var sequenceNumber = GetNextSequenceNumber();\n                if (Fields.Count >= eventFields.EventFields.Count)\n                {\n                    for (var i = 0; i < eventFields.EventFields.Count; i++)\n                    {\n                        yield return new MonitoredItemNotificationModel\n                        {\n                            Id = Template.Id ?? string.Empty,\n                            DataSetName = Template.DisplayName,\n                            DataSetFieldName = Fields[i].Name,\n                            NodeId = Template.StartNodeId,\n                            PathFromRoot = TheResolvedRelativePath,\n                            Flags = 0,\n                            Value = new DataValue(eventFields.EventFields[i]),\n                            SequenceNumber = sequenceNumber\n                        };\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Get event filter\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            protected virtual async ValueTask<EventFilter> GetEventFilterAsync(IOpcUaSession session,\n                CancellationToken ct)\n            {\n                var (eventFilter, internalSelectClauses) =\n                    await BuildEventFilterAsync(session, ct).ConfigureAwait(false);\n                UpdateFieldNames(session, eventFilter, internalSelectClauses);\n                return eventFilter;\n            }\n\n            /// <summary>\n            /// Update field names\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"eventFilter\"></param>\n            /// <param name=\"internalSelectClauses\"></param>\n            protected void UpdateFieldNames(IOpcUaSession session, EventFilter eventFilter,\n                List<SimpleAttributeOperand> internalSelectClauses)\n            {\n                // let's loop thru the final set of select clauses and setup the field names used\n                Fields.Clear();\n                foreach (var selectClause in eventFilter.SelectClauses)\n                {\n                    if (!internalSelectClauses.Any(x => x == selectClause))\n                    {\n                        var fieldName = string.Empty;\n                        var definedSelectClause = Template.EventFilter.SelectClauses?\n                            .ElementAtOrDefault(eventFilter.SelectClauses.IndexOf(selectClause));\n                        if (!string.IsNullOrEmpty(definedSelectClause?.DisplayName))\n                        {\n                            fieldName = definedSelectClause.DisplayName;\n                        }\n                        else if (selectClause.BrowsePath != null && selectClause.BrowsePath.Count != 0)\n                        {\n                            // Format as relative path string\n                            fieldName = selectClause.BrowsePath\n                                .Select(q => q.AsString(session.MessageContext, Template.NamespaceFormat))\n                                .Aggregate((a, b) => $\"{a}/{b}\");\n                        }\n\n                        if (fieldName.Length == 0 &&\n                            selectClause.TypeDefinitionId == ObjectTypeIds.ConditionType &&\n                            selectClause.AttributeId == Attributes.NodeId)\n                        {\n                            fieldName = \"ConditionId\";\n                        }\n                        Fields.Add((fieldName, Guid.NewGuid()));\n                    }\n                    else\n                    {\n                        // if a field's nameis empty, it's not written to the output\n                        Fields.Add((null, Guid.Empty));\n                    }\n                }\n                Debug.Assert(Fields.Count == eventFilter.SelectClauses.Count);\n            }\n\n            /// <summary>\n            /// Build event filter\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            protected async ValueTask<(EventFilter, List<SimpleAttributeOperand>)> BuildEventFilterAsync(\n                IOpcUaSession session, CancellationToken ct)\n            {\n                EventFilter? eventFilter;\n                if (!string.IsNullOrEmpty(Template.EventFilter.TypeDefinitionId))\n                {\n                    eventFilter = await GetSimpleEventFilterAsync(session, ct).ConfigureAwait(false);\n                }\n                else\n                {\n                    eventFilter = session.Codec.Decode(Template.EventFilter);\n                }\n\n                // let's keep track of the internal fields we add so that they don't show up in the output\n                var selectClauses = new List<SimpleAttributeOperand>();\n                if (!eventFilter.SelectClauses.Any(x => x.TypeDefinitionId == ObjectTypeIds.BaseEventType\n                    && x.BrowsePath?.FirstOrDefault() == BrowseNames.EventType))\n                {\n                    var selectClause = new SimpleAttributeOperand(ObjectTypeIds.BaseEventType,\n                        BrowseNames.EventType);\n                    eventFilter.SelectClauses.Add(selectClause);\n                    selectClauses.Add(selectClause);\n                }\n                if (_logger.IsEnabled(LogLevel.Debug))\n                {\n                    _logger.GeneratedEventFilter(this, eventFilter.AsJson(session.MessageContext));\n                }\n                return (eventFilter, selectClauses);\n            }\n\n            /// <summary>\n            /// Builds select clause and where clause by using OPC UA reflection\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            private async ValueTask<EventFilter> GetSimpleEventFilterAsync(IOpcUaSession session,\n                CancellationToken ct)\n            {\n                Debug.Assert(Template != null);\n                var typeDefinitionId = Template.EventFilter.TypeDefinitionId.ToNodeId(\n                    session.MessageContext);\n                var nodes = new List<INode>();\n                NodeId? superType = null;\n                var typeDefinitionNode = await session.LruNodeCache.GetNodeAsync(typeDefinitionId,\n                    ct).ConfigureAwait(false);\n                nodes.Insert(0, typeDefinitionNode);\n                while (true)\n                {\n                    superType = await session.LruNodeCache.GetSuperTypeAsync(nodes[0].NodeId, ct)\n                        .ConfigureAwait(false);\n                    if (Opc.Ua.NodeId.IsNull(superType))\n                    {\n                        break;\n                    }\n                    typeDefinitionNode = await session.LruNodeCache.GetNodeAsync(superType,\n                        ct).ConfigureAwait(false);\n                    nodes.Insert(0, typeDefinitionNode);\n                }\n                var fieldNames = new List<QualifiedName>();\n\n                foreach (var node in nodes)\n                {\n                    await ParseFieldsAsync(session, fieldNames, node, string.Empty,\n                        ct).ConfigureAwait(false);\n                }\n                fieldNames = [.. fieldNames\n                    .Distinct()\n                    .OrderBy(x => x.Name)];\n\n                var eventFilter = new EventFilter();\n                // Let's add ConditionId manually first if event is derived from ConditionType\n                if (nodes.Any(x => x.NodeId == ObjectTypeIds.ConditionType))\n                {\n                    eventFilter.SelectClauses.Add(new SimpleAttributeOperand()\n                    {\n                        BrowsePath = [],\n                        TypeDefinitionId = ObjectTypeIds.ConditionType,\n                        AttributeId = Attributes.NodeId\n                    });\n                }\n\n                foreach (var fieldName in fieldNames)\n                {\n                    var selectClause = new SimpleAttributeOperand()\n                    {\n                        TypeDefinitionId = ObjectTypeIds.BaseEventType,\n                        AttributeId = Attributes.Value,\n                        BrowsePath = fieldName.Name\n                            .Split('|')\n                            .Select(x => new QualifiedName(x, fieldName.NamespaceIndex))\n                            .ToArray()\n                    };\n                    eventFilter.SelectClauses.Add(selectClause);\n                }\n                eventFilter.WhereClause = new ContentFilter();\n                eventFilter.WhereClause.Push(FilterOperator.OfType, typeDefinitionId);\n\n                return eventFilter;\n            }\n\n            /// <summary>\n            /// Find node by browse path\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"browsePath\"></param>\n            /// <param name=\"nodeId\"></param>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            private static async ValueTask<INode?> FindNodeWithBrowsePathAsync(IOpcUaSession session,\n                QualifiedNameCollection browsePath, NodeId nodeId, CancellationToken ct)\n            {\n                INode? found = null;\n                foreach (var browseName in browsePath)\n                {\n                    found = null;\n                    while (found == null)\n                    {\n                        found = await session.LruNodeCache.GetNodeAsync(nodeId, ct).ConfigureAwait(false);\n\n                        //\n                        // Get all hierarchical references of the node and match browse name\n                        //\n                        var references = await session.LruNodeCache.GetReferencesAsync(nodeId,\n                            ReferenceTypeIds.HierarchicalReferences, false, true, ct).ConfigureAwait(false);\n                        foreach (var reference in references)\n                        {\n                            var target = await session.LruNodeCache.GetNodeAsync(reference.NodeId, ct).ConfigureAwait(false);\n                            if (target?.BrowseName == browseName)\n                            {\n                                found = target;\n                                break;\n                            }\n                        }\n\n                        if (found == null)\n                        {\n                            // Try super type\n                            nodeId = await session.LruNodeCache.GetSuperTypeAsync(nodeId, ct).ConfigureAwait(false);\n                            if (Opc.Ua.NodeId.IsNull(nodeId))\n                            {\n                                // Nothing can be found since there is no more super type\n                                return null;\n                            }\n                        }\n                    }\n                    nodeId = ExpandedNodeId.ToNodeId(found.NodeId, session.MessageContext.NamespaceUris);\n                }\n                return found;\n            }\n\n            /// <summary>\n            /// Get all the fields of a type definition node to build the\n            /// select clause.\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"fieldNames\"></param>\n            /// <param name=\"node\"></param>\n            /// <param name=\"browsePathPrefix\"></param>\n            /// <param name=\"ct\"></param>\n            protected static async ValueTask ParseFieldsAsync(IOpcUaSession session, List<QualifiedName> fieldNames,\n                INode node, string browsePathPrefix, CancellationToken ct)\n            {\n                var references = await session.LruNodeCache.GetReferencesAsync(node.NodeId, ReferenceTypeIds.HasComponent,\n                    false, true, ct).ConfigureAwait(false);\n                foreach (var reference in references)\n                {\n                    var componentNode = await session.LruNodeCache.GetNodeAsync(reference.NodeId, ct).ConfigureAwait(false);\n                    if (componentNode.NodeClass == Opc.Ua.NodeClass.Variable)\n                    {\n                        var fieldName = browsePathPrefix + componentNode.BrowseName.Name;\n                        fieldNames.Add(new QualifiedName(\n                            fieldName, componentNode.BrowseName.NamespaceIndex));\n                        await ParseFieldsAsync(session, fieldNames, componentNode,\n                            $\"{fieldName}|\", ct).ConfigureAwait(false);\n                    }\n                }\n                references = await session.LruNodeCache.GetReferencesAsync(node.NodeId, ReferenceTypeIds.HasProperty,\n                    false, false, ct).ConfigureAwait(false);\n                foreach (var reference in references)\n                {\n                    var propertyNode = await session.LruNodeCache.GetNodeAsync(reference.NodeId, ct).ConfigureAwait(false);\n                    var fieldName = browsePathPrefix + propertyNode.BrowseName.Name;\n                    fieldNames.Add(new QualifiedName(\n                        fieldName, propertyNode.BrowseName.NamespaceIndex));\n                }\n            }\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaMonitoredItem Event handling\n    /// </summary>\n    internal static partial class OpcUaMonitoredItemEventLogging\n    {\n        private const int EventClass = 1080;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"{Item}: Failed to get metadata for event.\")]\n        public static partial void GetMetadataFailed(this ILogger logger, Exception ex, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing event filter.\")]\n        public static partial void ChangingEventFilter(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"Event filter applied with result {Result} for {Item}\")]\n        public static partial void EventFilterAppliedWithError(this ILogger logger, string result, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Debug, SkipEnabledCheck = true,\n            Message = \"Event filter applied with result {Result} for {Item}\")]\n        public static partial void EventFilterApplied(this ILogger logger, string result, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug, SkipEnabledCheck = true,\n            Message = \"Generated event filter for {Item}: '{Filter}'\")]\n        public static partial void GeneratedEventFilter(this ILogger logger, OpcUaMonitoredItem item, string filter);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaMonitoredItem.Heartbeat.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using System;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Runtime.Serialization;\n    using System.Threading;\n\n    internal abstract partial class OpcUaMonitoredItem\n    {\n        /// <summary>\n        /// <para>\n        /// Data monitored item with heartbeat handling. If no data is sent\n        /// within the heartbeat interval the previously received data is\n        /// sent instead. Heartbeat is not a cyclic read.\n        /// </para>\n        /// <para>\n        /// Heartbeat is now implemented as a watchdog of the notification\n        /// which is reset every time a new value arrives. This is different\n        /// from past implementation where the keep alive was driving heartbeats.\n        /// This caused issues and was ineffective due to the use of the value\n        /// cache on the subscription object caching _all_ values received.\n        /// </para>\n        /// </summary>\n        [DataContract(Namespace = Namespaces.OpcUaXsd)]\n        [KnownType(typeof(DataChangeFilter))]\n        [KnownType(typeof(EventFilter))]\n        [KnownType(typeof(AggregateFilter))]\n        internal sealed class Heartbeat : DataChange\n        {\n            /// <summary>\n            /// Whether timer is enabled\n            /// </summary>\n            public bool TimerEnabled { get; set; }\n\n            /// <summary>\n            /// Create data item with heartbeat\n            /// </summary>\n            /// <param name=\"owner\"></param>\n            /// <param name=\"dataTemplate\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"timeProvider\"></param>\n            public Heartbeat(ISubscriber owner, DataMonitoredItemModel dataTemplate,\n                ILogger<DataChange> logger, TimeProvider timeProvider) :\n                base(owner, dataTemplate, logger, timeProvider)\n            {\n                _heartbeatInterval = dataTemplate.HeartbeatInterval\n                    ?? dataTemplate.SamplingInterval ?? TimeSpan.FromSeconds(1);\n                _heartbeatBehavior = dataTemplate.HeartbeatBehavior\n                    ?? HeartbeatBehavior.WatchdogLKV;\n            }\n\n            /// <summary>\n            /// Copy constructor\n            /// </summary>\n            /// <param name=\"item\"></param>\n            /// <param name=\"copyEventHandlers\"></param>\n            /// <param name=\"copyClientHandle\"></param>\n            private Heartbeat(Heartbeat item, bool copyEventHandlers,\n                bool copyClientHandle)\n                : base(item, copyEventHandlers, copyClientHandle)\n            {\n                _heartbeatInterval = item._heartbeatInterval;\n                _heartbeatBehavior = item._heartbeatBehavior;\n                if (item.TimerEnabled)\n                {\n                    EnableHeartbeatTimer();\n                }\n            }\n\n            /// <inheritdoc/>\n            public override MonitoredItem CloneMonitoredItem(\n                bool copyEventHandlers, bool copyClientHandle)\n            {\n                return new Heartbeat(this, copyEventHandlers, copyClientHandle);\n            }\n\n            /// <inheritdoc/>\n            public override bool Equals(object? obj)\n            {\n                if (obj is not Heartbeat)\n                {\n                    return false;\n                }\n                return base.Equals(obj);\n            }\n\n            /// <inheritdoc/>\n            public override int GetHashCode()\n            {\n                return HashCode.Combine(base.GetHashCode(), nameof(Heartbeat));\n            }\n\n            /// <inheritdoc/>\n            public override string ToString()\n            {\n                var str = $\"Data Item '{Template.StartNodeId}' \" +\n                    $\"(with {Template.HeartbeatBehavior ?? HeartbeatBehavior.WatchdogLKV} Heartbeat) \";\n                if (RemoteId.HasValue)\n                {\n                    str += $\" with server id {RemoteId} ({(Status?.Created == true ? \"\" : \"not \")}created)\";\n                }\n                return str;\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                if (disposing)\n                {\n                    lock (_timerLock)\n                    {\n                        _disposed = true;\n                        if (_heartbeatTimer != null)\n                        {\n                            _heartbeatTimer.Elapsed -= SendHeartbeatNotifications;\n                            _heartbeatTimer.Dispose();\n                            _heartbeatTimer = null;\n                        }\n                    }\n                }\n                base.Dispose(disposing);\n            }\n\n            /// <inheritdoc/>\n            protected override bool ProcessMonitoredItemNotification(DateTimeOffset publishTime,\n                MonitoredItemNotification monitoredItemNotification,\n                MonitoredItemNotifications notifications)\n            {\n                Debug.Assert(Valid);\n                var result = base.ProcessMonitoredItemNotification(publishTime,\n                    monitoredItemNotification, notifications);\n\n                if (!_disposed && (_heartbeatBehavior & HeartbeatBehavior.PeriodicLKV) == 0)\n                {\n                    EnableHeartbeatTimer();\n                }\n                return result;\n            }\n\n            /// <inheritdoc/>\n            public override bool MergeWith(OpcUaMonitoredItem item, IOpcUaSession session,\n                 out bool metadataChanged)\n            {\n                metadataChanged = false;\n                if (item is not Heartbeat model || !Valid)\n                {\n                    return false;\n                }\n\n                var itemChange = false;\n\n                if (_heartbeatInterval != model._heartbeatInterval)\n                {\n                    _logger.HeartbeatIntervalChanged(this, _heartbeatInterval, model._heartbeatInterval);\n                    _heartbeatInterval = model._heartbeatInterval;\n                    itemChange = true;\n                }\n\n                if (_heartbeatBehavior != model._heartbeatBehavior)\n                {\n                    _logger.HeartbeatBehaviorChanged(this, _heartbeatBehavior, model._heartbeatBehavior);\n                    _heartbeatBehavior = model._heartbeatBehavior;\n                    itemChange = true;\n                }\n\n                itemChange |= base.MergeWith(model, session, out metadataChanged);\n                return itemChange;\n            }\n\n            /// <inheritdoc/>\n            public override bool TryCompleteChanges(Subscription subscription,\n                ref bool applyChanges)\n            {\n                if (_disposed)\n                {\n                    _logger.ItemMovedToAnotherSubscription(this);\n                    return false;\n                }\n                var result = base.TryCompleteChanges(subscription, ref applyChanges);\n                {\n                    var lkg = (_heartbeatBehavior & HeartbeatBehavior.WatchdogLKG)\n                            == HeartbeatBehavior.WatchdogLKG;\n                    if (!AttachedToSubscription || (!result && lkg))\n                    {\n                        // Stop heartbeat\n                        DisableHeartbeatTimer();\n                    }\n                    else\n                    {\n                        Debug.Assert(AttachedToSubscription);\n                        EnableHeartbeatTimer();\n                    }\n                }\n                return result;\n            }\n\n            /// <inheritdoc/>\n            public override bool TryGetMonitoredItemNotifications(DateTimeOffset publishTime,\n                IEncodeable evt, MonitoredItemNotifications notifications)\n            {\n                _lastSequenceNumber = GetNextSequenceNumber();\n                if (!_disposed && (_heartbeatBehavior & HeartbeatBehavior.PeriodicLKV) == 0)\n                {\n                    EnableHeartbeatTimer();\n                }\n                return base.TryGetMonitoredItemNotifications(publishTime, evt, notifications);\n            }\n\n            /// <inheritdoc/>\n            public override bool SkipMonitoredItemNotification()\n            {\n                var dropValue = (_heartbeatBehavior & HeartbeatBehavior.Reserved) != 0;\n                return dropValue || base.SkipMonitoredItemNotification();\n            }\n\n            /// <inheritdoc/>\n            public override void NotifySessionConnectionState(bool disconnected)\n            {\n                //\n                // We change the reference here - we cloned the value and if it has been\n                // updated while we are doing this, a new value will be in in place and we\n                // should be connected again or we would not have received it.\n                //\n                var lastValue = LastReceivedValue as MonitoredItemNotification;\n                if (lastValue?.Value != null)\n                {\n                    if (disconnected)\n                    {\n                        _lastStatusCode = lastValue.Value.StatusCode;\n                        if (IsGoodDataValue(lastValue.Value))\n                        {\n                            lastValue.Value.StatusCode =\n                                StatusCodes.UncertainNoCommunicationLastUsableValue;\n                        }\n                        else\n                        {\n                            lastValue.Value.StatusCode =\n                                StatusCodes.BadNoCommunication;\n                        }\n                    }\n                    else if (_lastStatusCode.HasValue)\n                    {\n                        lastValue.Value.StatusCode = _lastStatusCode.Value;\n                        _lastStatusCode = null; // This is safe as we are called from the client thread\n                    }\n                }\n            }\n\n            /// <summary>\n            /// TODO: What is a Good value? Right now we say that it must either be full good or\n            /// have a value and not a bad status code (to cover Good_, and Uncertain_ as well)\n            /// </summary>\n            /// <param name=\"value\"></param>\n            /// <returns></returns>\n            private static bool IsGoodDataValue(DataValue? value)\n            {\n                if (value == null)\n                {\n                    return false;\n                }\n                return value.StatusCode == StatusCodes.Good ||\n                    (value.WrappedValue != Variant.Null && !StatusCode.IsBad(value.StatusCode));\n            }\n\n            /// <summary>\n            /// Send heartbeat\n            /// </summary>\n            /// <param name=\"sender\"></param>\n            /// <param name=\"e\"></param>\n            private void SendHeartbeatNotifications(object? sender, ElapsedEventArgs e)\n            {\n                if (!Valid)\n                {\n                    return;\n                }\n\n                if (!AttachedToSubscription)\n                {\n                    _logger.MissingSubscription(this);\n                    return;\n                }\n\n                var lastSequenceNumber = _lastSequenceNumber;\n                var lastNotification = LastReceivedValue as MonitoredItemNotification;\n                if ((_heartbeatBehavior & HeartbeatBehavior.WatchdogLKG)\n                        == HeartbeatBehavior.WatchdogLKG &&\n                        !IsGoodDataValue(lastNotification?.Value))\n                {\n                    // Currently no last known good value (LKG) to send\n                    _logger.NoLastKnownGoodValue(this);\n                    return;\n                }\n\n                var lastValue = lastNotification?.Value;\n                if (lastValue == null && ServiceResult.IsNotGood(Status.Error))\n                {\n                    lastValue = new DataValue(Status.Error?.StatusCode ?? StatusCodes.BadNotConnected);\n                }\n\n                if (lastValue == null)\n                {\n                    // Currently no last known value (LKV) to send\n                    _logger.NoLastKnownValue(this);\n                    return;\n                }\n                if ((_heartbeatBehavior & HeartbeatBehavior.WatchdogLKVWithUpdatedTimestamps)\n                        == HeartbeatBehavior.WatchdogLKVWithUpdatedTimestamps)\n                {\n                    // Adjust to the diff between now and received if desired\n                    // Should not be possible that last value received is null, nevertheless.\n                    var diffTime = LastReceivedTime.HasValue ?\n                        e.SignalTime - LastReceivedTime.Value : TimeSpan.Zero;\n\n                    lastValue = new DataValue(lastValue)\n                    {\n                        SourceTimestamp = lastValue.SourceTimestamp == DateTime.MinValue ?\n                            DateTime.MinValue : lastValue.SourceTimestamp.Add(diffTime),\n                        ServerTimestamp = lastValue.ServerTimestamp == DateTime.MinValue ?\n                            DateTime.MinValue : lastValue.ServerTimestamp.Add(diffTime)\n                    };\n                }\n\n                // If last value is null create a error value.\n                var heartbeat = new MonitoredItemNotificationModel\n                {\n                    Id = Template.Id,\n                    DataSetFieldName = Template.DisplayName,\n                    DataSetName = Template.DisplayName,\n                    NodeId = TheResolvedNodeId,\n                    PathFromRoot = TheResolvedRelativePath,\n                    Value = lastValue,\n                    Flags = MonitoredItemSourceFlags.Heartbeat,\n                    SequenceNumber = lastSequenceNumber\n                };\n                if (lastSequenceNumber != _lastSequenceNumber)\n                {\n                    // New value came in while running the timer callback - no need to send heartbeat\n                    return;\n                }\n                Publish(Owner, MessageType.DeltaFrame, heartbeat.YieldReturn().ToList(),\n                    diagnosticsOnly: (_heartbeatBehavior & HeartbeatBehavior.WatchdogLKVDiagnosticsOnly)\n                        == HeartbeatBehavior.WatchdogLKVDiagnosticsOnly, timestamp: e.SignalTime);\n            }\n\n            /// <summary>\n            /// Enable timer\n            /// </summary>\n            private void EnableHeartbeatTimer()\n            {\n                lock (_timerLock)\n                {\n                    if (_disposed)\n                    {\n                        return;\n                    }\n                    if (_heartbeatTimer == null)\n                    {\n                        _heartbeatTimer = new(TimeProvider)\n                        {\n                            AutoReset = true\n                        };\n                        _heartbeatTimer.Elapsed += SendHeartbeatNotifications;\n                        _logger.HeartbeatTimerEnabled();\n                    }\n                    _heartbeatTimer.Interval = _heartbeatInterval;\n                    _heartbeatTimer.Enabled = true;\n                    TimerEnabled = true;\n                }\n            }\n\n            /// <summary>\n            /// Disable timer\n            /// </summary>\n            private void DisableHeartbeatTimer()\n            {\n                lock (_timerLock)\n                {\n                    if (_heartbeatTimer != null)\n                    {\n                        _heartbeatTimer.Elapsed -= SendHeartbeatNotifications;\n                        _heartbeatTimer.Dispose();\n                        _heartbeatTimer = null;\n                        _logger.HeartbeatTimerDisabled();\n                    }\n                    TimerEnabled = false;\n                }\n            }\n\n            private TimerEx? _heartbeatTimer;\n            private HeartbeatBehavior _heartbeatBehavior;\n            private TimeSpan _heartbeatInterval;\n            private StatusCode? _lastStatusCode;\n            private uint _lastSequenceNumber;\n            private readonly Lock _timerLock = new();\n            private bool _disposed;\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaMonitoredItem Heartbeat handling\n    /// </summary>\n    internal static partial class OpcUaMonitoredItemHeartbeatLogging\n    {\n        private const int EventClass = 1180;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing heartbeat from {Old} to {New}\")]\n        public static partial void HeartbeatIntervalChanged(this ILogger logger, OpcUaMonitoredItem item, TimeSpan old, TimeSpan @new);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing heartbeat behavior from {Old} to {New}\")]\n        public static partial void HeartbeatBehaviorChanged(this ILogger logger, OpcUaMonitoredItem item, HeartbeatBehavior old, HeartbeatBehavior @new);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"{Item}: Item was moved to another subscription and the timer is handled by the new subscription now.\")]\n        public static partial void ItemMovedToAnotherSubscription(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Debug,\n            Message = \"Disabled heartbeat timer\")]\n        public static partial void HeartbeatTimerDisabled(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"{Item}: No last known good value to send.\")]\n        public static partial void NoLastKnownGoodValue(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"{Item}: No last known value to send.\")]\n        public static partial void NoLastKnownValue(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Debug,\n            Message = \"Enabled heartbeat timer\")]\n        public static partial void HeartbeatTimerEnabled(this ILogger logger);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaMonitoredItem.ModelChange.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using Opc.Ua.Client.ComplexTypes;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Runtime.Serialization;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    internal abstract partial class OpcUaMonitoredItem\n    {\n        /// <summary>\n        /// Model Change item\n        /// </summary>\n        [DataContract(Namespace = Namespaces.OpcUaXsd)]\n        internal class ModelChangeEventItem : OpcUaMonitoredItem\n        {\n            /// <summary>\n            /// Monitored item as event\n            /// </summary>\n            public MonitoredAddressSpaceModel Template { get; protected internal set; }\n\n            /// <summary>\n            /// Create model change item\n            /// </summary>\n            /// <param name=\"owner\"></param>\n            /// <param name=\"template\"></param>\n            /// <param name=\"client\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"timeProvider\"></param>\n            public ModelChangeEventItem(ISubscriber owner,\n                MonitoredAddressSpaceModel template, OpcUaClient client,\n                ILogger<ModelChangeEventItem> logger, TimeProvider timeProvider) :\n                base(owner, logger, template.StartNodeId, timeProvider)\n            {\n                Template = template;\n                _client = client;\n                _fields = GetEventFields().ToArray();\n            }\n\n            /// <summary>\n            /// Copy constructor\n            /// </summary>\n            /// <param name=\"item\"></param>\n            /// <param name=\"copyEventHandlers\"></param>\n            /// <param name=\"copyClientHandle\"></param>\n            private ModelChangeEventItem(ModelChangeEventItem item, bool copyEventHandlers,\n                bool copyClientHandle)\n                : base(item, copyEventHandlers, copyClientHandle)\n            {\n                Template = item.Template;\n                _client = item._client;\n                _fields = item._fields;\n            }\n\n            /// <inheritdoc/>\n            public override MonitoredItem CloneMonitoredItem(\n                bool copyEventHandlers, bool copyClientHandle)\n            {\n                return new ModelChangeEventItem(this, copyEventHandlers, copyClientHandle);\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                // Cleanup\n                var browser = _browser;\n                lock (_lock)\n                {\n                    _disposed = true;\n                    _browser = null;\n                    if (browser != null)\n                    {\n                        browser.OnReferenceChange -= OnReferenceChange;\n                        browser.OnNodeChange -= OnNodeChange;\n                        browser.CloseAsync().AsTask().GetAwaiter().GetResult();\n                    }\n                }\n                base.Dispose(disposing);\n            }\n\n            /// <inheritdoc/>\n            public override bool Equals(object? obj)\n            {\n                if (obj is not ModelChangeEventItem modelChange)\n                {\n                    return false;\n                }\n                if ((Template.DataSetFieldId ?? string.Empty) !=\n                    (modelChange.Template.DataSetFieldId ?? string.Empty))\n                {\n                    return false;\n                }\n                if ((Template.DataSetFieldName ?? string.Empty) !=\n                    (modelChange.Template.DataSetFieldName ?? string.Empty))\n                {\n                    return false;\n                }\n                if (_client != modelChange._client)\n                {\n                    return false;\n                }\n                return true;\n            }\n\n            /// <inheritdoc/>\n            public override int GetHashCode()\n            {\n                var hashCode = 435243663 + base.GetHashCode();\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<string>.Default.GetHashCode(\n                        Template.DataSetFieldName ?? string.Empty);\n                hashCode = (hashCode * -1521134295) +\n                    EqualityComparer<string>.Default.GetHashCode(\n                        Template.DataSetFieldId ?? string.Empty);\n                hashCode = (hashCode * -1521134295) +\n                    _client.GetHashCode();\n                return hashCode;\n            }\n\n            /// <inheritdoc/>\n            public override string ToString()\n            {\n                var str = \"Model Change Item\";\n                if (RemoteId.HasValue)\n                {\n                    str += $\" with server id {RemoteId} ({(Status?.Created == true ? \"\" : \"not \")}created)\";\n                }\n                return str;\n            }\n\n            /// <inheritdoc/>\n            public override bool MergeWith(OpcUaMonitoredItem item, IOpcUaSession session,\n                 out bool metadataChanged)\n            {\n                metadataChanged = false;\n                if (item is not ModelChangeEventItem || !Valid)\n                {\n                    return false;\n                }\n                return true;\n            }\n\n            /// <inheritdoc/>\n            public override ValueTask GetMetaDataAsync(IOpcUaSession session,\n                ComplexTypeSystem? typeSystem, List<PublishedFieldMetaDataModel> fields,\n                NodeIdDictionary<object> dataTypes, CancellationToken ct)\n            {\n                fields.AddRange(_fields);\n                return ValueTask.CompletedTask;\n            }\n\n            /// <inheritdoc/>\n            public override Func<CancellationToken, Task>? FinalizeCompleteChanges => async _ =>\n            {\n                if (!AttachedToSubscription)\n                {\n                    await StopBrowserAsync().ConfigureAwait(false);\n                }\n                else\n                {\n                    EnsureBrowserStarted();\n                }\n            };\n\n            /// <inheritdoc/>\n            public override bool AddTo(Subscription subscription,\n                IOpcUaSession session, out bool metadataChanged)\n            {\n                var nodeId = NodeId.ToNodeId(session.MessageContext);\n                if (Opc.Ua.NodeId.IsNull(nodeId))\n                {\n                    metadataChanged = false;\n                    return false;\n                }\n\n                DisplayName = Template.DisplayName;\n                AttributeId = Attributes.EventNotifier;\n                MonitoringMode = Opc.Ua.MonitoringMode.Reporting;\n                StartNodeId = nodeId;\n                SamplingInterval = 0;\n                UpdateQueueSize(subscription, Template);\n                Filter = GetEventFilter();\n                DiscardOldest = !(Template.DiscardNew ?? false);\n                Valid = true;\n\n                return base.AddTo(subscription, session, out metadataChanged);\n\n                static MonitoringFilter GetEventFilter()\n                {\n                    var eventFilter = new EventFilter();\n                    eventFilter.SelectClauses.Add(new SimpleAttributeOperand()\n                    {\n                        BrowsePath = [BrowseNames.EventType],\n                        TypeDefinitionId = ObjectTypeIds.BaseModelChangeEventType,\n                        AttributeId = Attributes.NodeId\n                    });\n                    eventFilter.SelectClauses.Add(new SimpleAttributeOperand()\n                    {\n                        BrowsePath = [BrowseNames.Changes],\n                        TypeDefinitionId = ObjectTypeIds.GeneralModelChangeEventType,\n                        AttributeId = Attributes.Value\n                    });\n                    eventFilter.WhereClause = new ContentFilter();\n                    eventFilter.WhereClause.Push(FilterOperator.OfType,\n                        ObjectTypeIds.BaseModelChangeEventType);\n                    return eventFilter;\n                }\n            }\n\n            /// <inheritdoc/>\n            public override bool TryGetMonitoredItemNotifications(DateTimeOffset publishTime,\n                IEncodeable evt, MonitoredItemNotifications notifications)\n            {\n                if (evt is not EventFieldList eventFields ||\n                    !base.TryGetMonitoredItemNotifications(publishTime, evt, notifications))\n                {\n                    return false;\n                }\n\n                // Rebrowse and find changes or just process and send the changes\n                Debug.Assert(Valid);\n                Debug.Assert(Template != null);\n\n                var evFilter = Filter as EventFilter;\n                var eventTypeIndex = evFilter?.SelectClauses.IndexOf(\n                    evFilter.SelectClauses\n                        .Find(x => x.TypeDefinitionId == ObjectTypeIds.BaseEventType\n                            && x.BrowsePath?.FirstOrDefault() == BrowseNames.EventType));\n\n                if (eventTypeIndex.HasValue && eventTypeIndex.Value != -1)\n                {\n                    var eventType = eventFields.EventFields[eventTypeIndex.Value].Value as NodeId;\n                    if (eventType == ObjectTypeIds.GeneralModelChangeEventType)\n                    {\n                        // Find what changed and refresh only that\n                        // return true;\n                    }\n                    else\n                    {\n                        Debug.Assert(eventType == ObjectTypeIds.BaseModelChangeEventType);\n                    }\n                }\n\n                // The model changed, trigger Rebrowse\n                EnsureBrowserStarted();\n                _browser?.Rebrowse();\n                return true;\n            }\n\n            /// <inheritdoc/>\n            protected override bool TryGetErrorMonitoredItemNotifications(\n                StatusCode statusCode, MonitoredItemNotifications notifications)\n            {\n                return true;\n            }\n\n            /// <inheritdoc/>\n            protected override IEnumerable<OpcUaMonitoredItem> CreateTriggeredItems(\n                ILoggerFactory factory, OpcUaClient client)\n            {\n                if (Template.TriggeredItems != null)\n                {\n                    return Create(client, Template.TriggeredItems.Select(i => (Owner, i)),\n                        factory, TimeProvider);\n                }\n                return [];\n            }\n\n            /// <inheritdoc/>\n            protected override bool OnSamplingIntervalOrQueueSizeRevised(\n                bool samplingIntervalChanged, bool queueSizeChanged)\n            {\n                Debug.Assert(Subscription != null);\n                var applyChanges = base.OnSamplingIntervalOrQueueSizeRevised(\n                    samplingIntervalChanged, queueSizeChanged);\n                if (samplingIntervalChanged && Status.SamplingInterval != 0)\n                {\n                    // Not necessary as sampling interval will likely always stay 0\n                    applyChanges |= UpdateQueueSize(Subscription, Template);\n                }\n                return applyChanges;\n            }\n\n            /// <summary>\n            /// Called when node changed\n            /// </summary>\n            /// <param name=\"sender\"></param>\n            /// <param name=\"e\"></param>\n            private void OnNodeChange(object? sender, Change<Node> e)\n            {\n                Publish(Owner, MessageType.Event,\n                    CreateEvent(_nodeChangeType, e).ToList(),\n                    eventTypeName: EventTypeName);\n            }\n\n            /// <summary>\n            /// Called when reference changes\n            /// </summary>\n            /// <param name=\"sender\"></param>\n            /// <param name=\"e\"></param>\n            private void OnReferenceChange(object? sender, Change<ReferenceDescription> e)\n            {\n                Publish(Owner, MessageType.Event,\n                    CreateEvent(_refChangeType, e).ToList(),\n                    eventTypeName: EventTypeName);\n            }\n\n            /// <summary>\n            /// Create the event\n            /// </summary>\n            /// <typeparam name=\"T\"></typeparam>\n            /// <param name=\"eventType\"></param>\n            /// <param name=\"changeFeedNotification\"></param>\n            /// <returns></returns>\n            private IEnumerable<MonitoredItemNotificationModel> CreateEvent<T>(ExpandedNodeId eventType,\n                Change<T> changeFeedNotification) where T : class\n            {\n                for (var i = 0; i < _fields.Length; i++)\n                {\n                    Variant? value = null;\n                    var field = _fields[i];\n                    switch (i)\n                    {\n                        case 0:\n                            value = new Variant((Uuid)Guid.NewGuid());\n                            break;\n                        case 1:\n                            value = eventType;\n                            break;\n                        case 2:\n                            value = new Variant(changeFeedNotification.Source);\n                            break;\n                        case 3:\n                            value = new Variant(changeFeedNotification.Timestamp.UtcDateTime);\n                            break;\n                        case 4:\n                            value = changeFeedNotification.ChangedItem == null ?\n                                Variant.Null : new Variant(changeFeedNotification.ChangedItem);\n                            break;\n                    }\n                    if (value == null)\n                    {\n                        continue;\n                    }\n                    yield return new MonitoredItemNotificationModel\n                    {\n                        Id = Template.Id ?? string.Empty,\n                        DataSetName = Template.DisplayName,\n                        DataSetFieldName = field.Name,\n                        PathFromRoot = changeFeedNotification.PathFromRoot,\n                        NodeId = Template.StartNodeId,\n                        Value = new DataValue(value.Value),\n                        Flags = MonitoredItemSourceFlags.ModelChanges,\n                        SequenceNumber = changeFeedNotification.SequenceNumber\n                    };\n                }\n            }\n\n            private static IEnumerable<PublishedFieldMetaDataModel> GetEventFields()\n            {\n                yield return Create(BrowseNames.EventId, builtInType: BuiltInType.ByteString);\n                yield return Create(BrowseNames.EventType, builtInType: BuiltInType.NodeId);\n                yield return Create(BrowseNames.SourceNode, builtInType: BuiltInType.NodeId);\n                yield return Create(BrowseNames.Time, builtInType: BuiltInType.NodeId);\n                yield return Create(\"Change\", builtInType: BuiltInType.ExtensionObject);\n\n                static PublishedFieldMetaDataModel Create(string fieldName, NodeId? dataType = null,\n                    BuiltInType builtInType = BuiltInType.ExtensionObject)\n                {\n                    return new PublishedFieldMetaDataModel\n                    {\n                        Id = (Uuid)Guid.NewGuid(),\n                        DataType = \"i=\" + (uint)builtInType,\n                        Name = fieldName,\n                        ValueRank = ValueRanks.Scalar,\n                        // ArrayDimensions =\n                        BuiltInType = (byte)builtInType\n                    };\n                }\n            }\n\n            /// <summary>\n            /// Start browser\n            /// </summary>\n            private void EnsureBrowserStarted()\n            {\n                lock (_lock)\n                {\n                    if (_disposed)\n                    {\n                        return;\n                    }\n                    // Start the browser\n                    if (_browser == null && Subscription != null)\n                    {\n                        _browser = _client.Browse(Template.RebrowsePeriod ??\n                            TimeSpan.FromHours(12), Subscription.DisplayName);\n\n                        _browser.OnReferenceChange += OnReferenceChange;\n                        _browser.OnNodeChange += OnNodeChange;\n                        _logger.ItemRegistered(this);\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Stop browser\n            /// </summary>\n            /// <returns></returns>\n            private async Task StopBrowserAsync()\n            {\n                // Stop the browser\n                IOpcUaBrowser? browser;\n                lock (_lock)\n                {\n                    browser = _browser;\n                    if (browser != null)\n                    {\n                        browser.OnReferenceChange -= OnReferenceChange;\n                        browser.OnNodeChange -= OnNodeChange;\n                    }\n                    _browser = null;\n                }\n                if (browser != null)\n                {\n                    await browser.CloseAsync().ConfigureAwait(false);\n                    _logger.ItemUnregistered(this);\n                }\n            }\n\n            private static readonly ExpandedNodeId _refChangeType\n                = new(\"ReferenceChange\", \"http://www.microsoft.com/opc-publisher\");\n            private static readonly ExpandedNodeId _nodeChangeType\n                = new(\"NodeChange\", \"http://www.microsoft.com/opc-publisher\");\n            private readonly PublishedFieldMetaDataModel[] _fields;\n            private readonly OpcUaClient _client;\n            private readonly Lock _lock = new();\n            private IOpcUaBrowser? _browser;\n            private bool _disposed;\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaMonitoredItem ModelChange handling\n    /// </summary>\n    internal static partial class OpcUaMonitoredItemModelChangeLogging\n    {\n        private const int EventClass = 1130;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Item {Item} registered with browser.\")]\n        public static partial void ItemRegistered(this ILogger logger, OpcUaMonitoredItem.ModelChangeEventItem item);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Item {Item} unregistered from browser.\")]\n        public static partial void ItemUnregistered(this ILogger logger, OpcUaMonitoredItem.ModelChangeEventItem item);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaMonitoredItem.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using Opc.Ua.Client.ComplexTypes;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Update display name\n    /// </summary>\n    /// <param name=\"displayName\"></param>\n    public delegate void UpdateString(string displayName);\n\n    /// <summary>\n    /// Update node id\n    /// </summary>\n    /// <param name=\"nodeId\"></param>\n    /// <param name=\"messageContext\"></param>\n    public delegate void UpdateNodeId(NodeId nodeId,\n        IServiceMessageContext messageContext);\n\n    /// <summary>\n    /// Update relative path\n    /// </summary>\n    /// <param name=\"path\"></param>\n    /// <param name=\"messageContext\"></param>\n    public delegate void UpdateRelativePath(RelativePath path,\n        IServiceMessageContext messageContext);\n\n    /// <summary>\n    /// Monitored item\n    /// </summary>\n    internal abstract partial class OpcUaMonitoredItem : MonitoredItem, IDisposable\n    {\n        /// <summary>\n        /// Assigned monitored item id on server\n        /// </summary>\n        public uint? RemoteId => Created ? Status.Id : null;\n\n        /// <summary>\n        /// The item is valid once added to the subscription. Contract:\n        /// The item will be invalid until the subscription calls\n        /// <see cref=\"AddTo(Subscription, IOpcUaSession, out bool)\"/>\n        /// to add it to the subscription. After removal the item\n        /// is still Valid, but not Created. The item is\n        /// again invalid after <see cref=\"IDisposable.Dispose\"/> is\n        /// called.\n        /// </summary>\n        public bool Valid { get; protected internal set; }\n\n        /// <summary>\n        /// Item is good\n        /// </summary>\n        public bool IsGood => Created && StatusCode.IsGood(StatusCode);\n\n        /// <summary>\n        /// Item is bad\n        /// </summary>\n        public bool IsBad => !Created || StatusCode.IsBad(StatusCode);\n\n        /// <summary>\n        /// Item is late\n        /// </summary>\n        public bool IsLate { get; private set; }\n\n        /// <summary>\n        /// Status code\n        /// </summary>\n        public StatusCode StatusCode => Status == null ?\n            StatusCodes.BadNotConnected :\n                (Status.Error?.StatusCode ?? StatusCodes.Good);\n\n        /// <summary>\n        /// Event name\n        /// </summary>\n        public virtual string? EventTypeName { get; }\n\n        /// <summary>\n        /// The owner of the item that is to be notified of changes\n        /// </summary>\n        public ISubscriber Owner { get; }\n\n        /// <summary>\n        /// Whether the item is part of a subscription or not\n        /// </summary>\n        public bool AttachedToSubscription => Subscription != null;\n\n        /// <summary>\n        /// Registered read node updater. If this property is null then\n        /// the node does not need to be registered.\n        /// </summary>\n        public virtual (string NodeId, UpdateNodeId Update)? Register\n            => null;\n\n        /// <summary>\n        /// Get the relative path from root for the node. This is called\n        /// after the node is resolved but not yet registered\n        /// </summary>\n        public virtual (string NodeId, UpdateRelativePath Update)? GetPath\n            => null;\n\n        /// <summary>\n        /// Get the display name for the node. This is called after\n        /// the node is resolved and registered as applicable.\n        /// </summary>\n        public virtual (string NodeId, UpdateString Update)? GetDisplayName\n            => null;\n\n        /// <summary>\n        /// Resolve relative path first. If this returns null\n        /// the relative path either does not exist or we let\n        /// subscription take care of resolving the path.\n        /// </summary>\n        public virtual (string NodeId, string[] Path, UpdateNodeId Update)? Resolve\n            => null;\n\n        /// <summary>\n        /// Effective node id\n        /// </summary>\n        protected string NodeId { get; set; }\n\n        /// <summary>\n        /// Time provider to use\n        /// </summary>\n        protected TimeProvider TimeProvider { get; }\n\n        /// <summary>\n        /// Last saved value\n        /// </summary>\n        public IEncodeable? LastReceivedValue { get; private set; }\n\n        /// <summary>\n        /// Last value received\n        /// </summary>\n        public DateTimeOffset? LastReceivedTime { get; private set; }\n\n        /// <summary>\n        /// Last keep alive sent or value received\n        /// </summary>\n        public DateTimeOffset LastActivityTime { get; set; }\n\n        /// <summary>\n        /// Error already reported\n        /// </summary>\n        public bool ErrorReported { get; set; }\n\n        /// <summary>\n        /// Create item\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"timeProvider\"></param>\n        protected OpcUaMonitoredItem(ISubscriber owner,\n            ILogger logger, string nodeId, TimeProvider timeProvider)\n        {\n            Owner = owner;\n            NodeId = nodeId;\n            TimeProvider = timeProvider;\n            LastActivityTime = timeProvider.GetUtcNow();\n            _logger = logger;\n        }\n\n        /// <summary>\n        /// Copy constructor\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <param name=\"copyEventHandlers\"></param>\n        /// <param name=\"copyClientHandle\"></param>\n        protected OpcUaMonitoredItem(OpcUaMonitoredItem item,\n            bool copyEventHandlers, bool copyClientHandle)\n            : base(item, copyEventHandlers, copyClientHandle)\n        {\n            Owner = item.Owner;\n            NodeId = item.NodeId;\n            TimeProvider = item.TimeProvider;\n            _logger = item._logger;\n\n            LastReceivedTime = item.LastReceivedTime;\n            LastActivityTime = item.LastActivityTime;\n            LastReceivedValue = item.LastReceivedValue;\n            Valid = item.Valid;\n        }\n\n        /// <inheritdoc/>\n        public override abstract MonitoredItem CloneMonitoredItem(\n            bool copyEventHandlers, bool copyClientHandle);\n\n        /// <inheritdoc/>\n        public override object Clone()\n        {\n            return CloneMonitoredItem(true, true);\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return Owner.GetHashCode();\n        }\n\n        /// <summary>\n        /// Create items\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"items\"></param>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <returns></returns>\n        public static IEnumerable<OpcUaMonitoredItem> Create(OpcUaClient client,\n            IEnumerable<(ISubscriber, BaseMonitoredItemModel)> items,\n            ILoggerFactory factory, TimeProvider timeProvider)\n        {\n            foreach (var (owner, item) in items)\n            {\n                switch (item)\n                {\n                    case DataMonitoredItemModel dmi:\n                        if (dmi.SamplingUsingCyclicRead == true &&\n                            client != null)\n                        {\n                            yield return new CyclicRead(owner, client, dmi,\n                                factory.CreateLogger<CyclicRead>(), timeProvider);\n                        }\n                        else if (dmi.HeartbeatInterval != null)\n                        {\n                            yield return new Heartbeat(owner, dmi,\n                                factory.CreateLogger<Heartbeat>(), timeProvider);\n                        }\n                        else\n                        {\n                            yield return new DataChange(owner, dmi,\n                                factory.CreateLogger<DataChange>(), timeProvider);\n                        }\n                        break;\n                    case EventMonitoredItemModel emi:\n                        if (emi.ConditionHandling?.SnapshotInterval != null)\n                        {\n                            yield return new Condition(owner, emi,\n                                factory.CreateLogger<Condition>(), timeProvider);\n                        }\n                        else\n                        {\n                            yield return new Event(owner, emi,\n                                factory.CreateLogger<Event>(), timeProvider);\n                        }\n                        break;\n                    case MonitoredAddressSpaceModel mam:\n                        if (client != null)\n                        {\n                            yield return new ModelChangeEventItem(owner, mam, client,\n                                factory.CreateLogger<ModelChangeEventItem>(), timeProvider);\n                        }\n                        break;\n                    default:\n                        Debug.Fail($\"Unexpected type of item {item}\");\n                        break;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Dispose(disposing: true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            return base.ToString()!;\n        }\n\n        /// <summary>\n        /// Try and get metadata for the item\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"typeSystem\"></param>\n        /// <param name=\"fields\"></param>\n        /// <param name=\"dataTypes\"></param>\n        /// <param name=\"ct\"></param>\n        public abstract ValueTask GetMetaDataAsync(IOpcUaSession session,\n            ComplexTypeSystem? typeSystem, List<PublishedFieldMetaDataModel> fields,\n            NodeIdDictionary<object> dataTypes, CancellationToken ct);\n\n        /// <summary>\n        /// Called when the underlying session is disconnected\n        /// </summary>\n        /// <param name=\"disconnected\"></param>\n        public virtual void NotifySessionConnectionState(bool disconnected)\n        {\n        }\n\n        /// <summary>\n        /// Check whether the monitored item is late\n        /// </summary>\n        /// <param name=\"dateTime\"></param>\n        /// <returns></returns>\n        public virtual bool WasLastValueReceivedBefore(DateTimeOffset dateTime)\n        {\n            if (!Valid || !AttachedToSubscription)\n            {\n                return IsLate = false;\n            }\n            return IsLate = !LastReceivedTime.HasValue || LastReceivedTime.Value < dateTime;\n        }\n\n        /// <summary>\n        /// Dispose\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing && Valid)\n            {\n                Valid = false;\n            }\n        }\n\n        /// <summary>\n        /// Add the item to the subscription\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"session\"></param>\n        /// <param name=\"metadataChanged\"></param>\n        /// <returns></returns>\n        public virtual bool AddTo(Subscription subscription, IOpcUaSession session,\n            out bool metadataChanged)\n        {\n            if (Valid)\n            {\n                subscription.AddItem(this);\n                _logger.ItemAdded(this, subscription.Id);\n                metadataChanged = true;\n                return true;\n            }\n            metadataChanged = false;\n            return false;\n        }\n\n        /// <summary>\n        /// Finalize add\n        /// </summary>\n        public virtual Func<IOpcUaSession, CancellationToken, Task>? FinalizeAddTo { get; }\n\n        /// <summary>\n        /// Merge item in the subscription with this item\n        /// </summary>\n        /// <param name=\"item\"></param>\n        /// <param name=\"session\"></param>\n        /// <param name=\"metadataChanged\"></param>\n        /// <returns></returns>\n        public abstract bool MergeWith(OpcUaMonitoredItem item,\n            IOpcUaSession session, out bool metadataChanged);\n\n        /// <summary>\n        /// Finalize merge\n        /// </summary>\n        public virtual Func<IOpcUaSession, CancellationToken, Task>? FinalizeMergeWith { get; }\n\n        /// <summary>\n        /// Remove from subscription\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"metadataChanged\"></param>\n        /// <returns></returns>\n        public virtual bool RemoveFrom(Subscription subscription,\n            out bool metadataChanged)\n        {\n            if (AttachedToSubscription)\n            {\n                subscription.RemoveItem(this);\n                _logger.ItemRemoved(this, subscription.Id);\n                metadataChanged = true;\n                return true;\n            }\n            metadataChanged = false;\n            return false;\n        }\n\n        /// <summary>\n        /// Complete changes previously made and provide callback\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"applyChanges\"></param>\n        /// <returns></returns>\n        public virtual bool TryCompleteChanges(Subscription subscription,\n            ref bool applyChanges)\n        {\n            if (!Valid)\n            {\n                _logger.ItemDisposed(this);\n                return false;\n            }\n\n            if (!AttachedToSubscription)\n            {\n                _logger.ItemRemovedWithStatus(this, subscription.Id, Status.Error);\n                // Complete removal\n                ErrorReported = false;\n                return true;\n            }\n\n            Debug.Assert(subscription == Subscription);\n\n            if (Status.MonitoringMode == Opc.Ua.MonitoringMode.Disabled)\n            {\n                _logger.ItemDisabled(this);\n                ErrorReported = false;\n                return true;\n            }\n\n            if (Status.Error != null && StatusCode.IsNotGood(Status.Error.StatusCode))\n            {\n                _logger.AddMonitoredItemError(this, subscription.Id, Status.Error);\n                // Not needed, mode changes applied after\n                // applyChanges = true;\n                return false;\n            }\n\n            if (OnSamplingIntervalOrQueueSizeRevised(\n                SamplingInterval != Status.SamplingInterval, QueueSize != Status.QueueSize))\n            {\n                applyChanges = true;\n            }\n            ErrorReported = false;\n            return true;\n        }\n\n        /// <summary>\n        /// Log revised sampling rate and queue size\n        /// </summary>\n        public void LogRevisedSamplingRateAndQueueSize()\n        {\n            if (!AttachedToSubscription || SamplingInterval < 0)\n            {\n                return;\n            }\n            Debug.Assert(Subscription != null);\n            if (SamplingInterval != Status.SamplingInterval &&\n                QueueSize != Status.QueueSize && Status.QueueSize != 0)\n            {\n                if (Status.SamplingInterval > SamplingInterval ||\n                    Status.QueueSize < QueueSize)\n                {\n                    _logger.StatusRevisedInfo(\n                        SamplingInterval, Status.SamplingInterval, QueueSize, Status.QueueSize,\n                        Subscription.Id, StartNodeId, DisplayName);\n                }\n                else\n                {\n                    _logger.StatusRevisedDebug(\n                        SamplingInterval, Status.SamplingInterval, QueueSize, Status.QueueSize,\n                        Subscription.Id, StartNodeId, DisplayName);\n                }\n            }\n            else if (SamplingInterval != Status.SamplingInterval)\n            {\n                if (Status.SamplingInterval < SamplingInterval)\n                {\n                    _logger.SamplingIntervalRevisedDown(SamplingInterval, Status.SamplingInterval,\n                        Subscription.Id, StartNodeId, DisplayName);\n                }\n                else\n                {\n                    _logger.SamplingIntervalRevisedUp(SamplingInterval, Status.SamplingInterval,\n                        Subscription.Id, StartNodeId, DisplayName);\n                }\n            }\n            else if (QueueSize != Status.QueueSize && Status.QueueSize != 0)\n            {\n                if (Status.QueueSize < QueueSize)\n                {\n                    _logger.QueueSizeRevisedDown(QueueSize, Status.QueueSize,\n                        Subscription.Id, StartNodeId, DisplayName);\n                }\n                else\n                {\n                    _logger.QueueSizeRevisedUp(QueueSize, Status.QueueSize,\n                        Subscription.Id, StartNodeId, DisplayName);\n                }\n            }\n            else\n            {\n                _logger.ConfigurationAccepted(Subscription.Id, StartNodeId, DisplayName);\n            }\n\n            _logger.ConfigurationSet(Status.SamplingInterval, Status.QueueSize,\n                Subscription.Id, StartNodeId, DisplayName);\n        }\n\n        /// <summary>\n        /// Called on all items after monitoring mode was changed\n        /// successfully.\n        /// </summary>\n        /// <returns></returns>\n        public virtual Func<CancellationToken, Task>? FinalizeCompleteChanges { get; }\n\n        /// <summary>\n        /// Get any changes in the monitoring mode to apply if any.\n        /// Otherwise the returned value is null.\n        /// </summary>\n        public virtual Opc.Ua.MonitoringMode? GetMonitoringModeChange()\n        {\n            if (!AttachedToSubscription || !Valid)\n            {\n                return null;\n            }\n            var currentMode = Status?.MonitoringMode\n                ?? Opc.Ua.MonitoringMode.Disabled;\n            var desiredMode = MonitoringMode;\n            return currentMode != desiredMode ? desiredMode : null;\n        }\n\n        /// <summary>\n        /// Called on all items after monitoring mode was changed\n        /// successfully.\n        /// </summary>\n        /// <returns></returns>\n        public virtual Func<CancellationToken, Task>? FinalizeMonitoringModeChange { get; }\n\n        /// <summary>\n        /// Try get monitored item notifications from\n        /// the subscription's monitored item event payload.\n        /// </summary>\n        /// <param name=\"publishTime\"></param>\n        /// <param name=\"encodeablePayload\"></param>\n        /// <param name=\"notifications\"></param>\n        /// <returns></returns>\n        public virtual bool TryGetMonitoredItemNotifications(\n            DateTimeOffset publishTime, IEncodeable encodeablePayload,\n            MonitoredItemNotifications notifications)\n        {\n            if (!Valid)\n            {\n                return false;\n            }\n            try\n            {\n                LastReceivedValue = (IEncodeable)encodeablePayload.Clone();\n            }\n            catch (Exception ex)\n            {\n                _logger.CloneValueFailed(ex, this);\n                LastReceivedValue = encodeablePayload;\n            }\n            LastReceivedTime = LastActivityTime = TimeProvider.GetUtcNow();\n            return true;\n        }\n\n        /// <summary>\n        /// Get last monitored item notification saved\n        /// </summary>\n        /// <param name=\"notifications\"></param>\n        /// <returns></returns>\n        public virtual bool TryGetLastMonitoredItemNotifications(\n            MonitoredItemNotifications notifications)\n        {\n            var lastValue = LastReceivedValue;\n            if (lastValue == null)\n            {\n                return TryGetErrorMonitoredItemNotifications(\n                    StatusCodes.BadNoData, notifications);\n            }\n            if (Status.Error != null && ServiceResult.IsNotGood(Status.Error))\n            {\n                return TryGetErrorMonitoredItemNotifications(\n                    Status.Error.StatusCode, notifications);\n            }\n            return TryGetMonitoredItemNotifications(TimeProvider.GetUtcNow(),\n                lastValue, notifications);\n        }\n\n        /// <summary>\n        /// Create triggered items\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"client\"></param>\n        /// <returns></returns>\n        protected abstract IEnumerable<OpcUaMonitoredItem> CreateTriggeredItems(\n            ILoggerFactory factory, OpcUaClient client);\n\n        /// <summary>\n        /// Add error to notification list\n        /// </summary>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"notifications\"></param>\n        /// <returns></returns>\n        protected abstract bool TryGetErrorMonitoredItemNotifications(\n            StatusCode statusCode, MonitoredItemNotifications notifications);\n\n        /// <summary>\n        /// Notify queue size or sampling interval changed\n        /// </summary>\n        /// <param name=\"samplingIntervalChanged\"></param>\n        /// <param name=\"queueSizeChanged\"></param>\n        /// <returns></returns>\n        protected virtual bool OnSamplingIntervalOrQueueSizeRevised(\n            bool samplingIntervalChanged, bool queueSizeChanged)\n        {\n            return false;\n        }\n\n        /// <summary>\n        /// Get next sequence number\n        /// </summary>\n        /// <returns></returns>\n        protected uint GetNextSequenceNumber()\n        {\n            return SequenceNumber.Increment32(ref _sequenceNumber);\n        }\n\n        /// <summary>\n        /// Merge item\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"template\"></param>\n        /// <param name=\"desired\"></param>\n        /// <param name=\"updated\"></param>\n        /// <param name=\"metadataChanged\"></param>\n        /// <returns></returns>\n        protected bool MergeWith<T>(T template, T desired, out T updated,\n            out bool metadataChanged) where T : BaseMonitoredItemModel\n        {\n            metadataChanged = false;\n            updated = template;\n\n            if (!Valid)\n            {\n                return false;\n            }\n\n            var itemChange = false;\n            if ((updated.DiscardNew ?? false) != (desired.DiscardNew ?? false))\n            {\n                _logger.DiscardNewModeChanged(this, updated.DiscardNew ?? false, desired.DiscardNew ?? false);\n                updated = updated with { DiscardNew = desired.DiscardNew };\n                DiscardOldest = !(updated.DiscardNew ?? false);\n                itemChange = true;\n            }\n            if (updated.QueueSize != desired.QueueSize ||\n                updated.AutoSetQueueSize != desired.AutoSetQueueSize)\n            {\n                _logger.QueueSizeChanged(this, updated.QueueSize, updated.AutoSetQueueSize,\n                    desired.QueueSize, desired.AutoSetQueueSize);\n                updated = updated with\n                {\n                    QueueSize = desired.QueueSize,\n                    AutoSetQueueSize = desired.AutoSetQueueSize\n                };\n                if (Subscription != null)\n                {\n                    itemChange = UpdateQueueSize(Subscription, updated);\n                }\n            }\n            if ((updated.MonitoringMode ?? Publisher.Models.MonitoringMode.Reporting) !=\n                (desired.MonitoringMode ?? Publisher.Models.MonitoringMode.Reporting))\n            {\n                _logger.MonitoringModeChanged(\n                    this, updated.MonitoringMode ?? Publisher.Models.MonitoringMode.Reporting,\n                    desired.MonitoringMode ?? Publisher.Models.MonitoringMode.Reporting);\n                updated = updated with { MonitoringMode = desired.MonitoringMode };\n                MonitoringMode = updated.MonitoringMode.ToStackType()\n                    ?? Opc.Ua.MonitoringMode.Reporting;\n\n                // Not a change yet, will be done as bulk update\n                // itemChange = true;\n            }\n\n            if (updated.FetchDataSetFieldName != desired.FetchDataSetFieldName)\n            {\n                updated = updated with\n                {\n                    FetchDataSetFieldName = desired.FetchDataSetFieldName,\n                    DataSetFieldName = desired.FetchDataSetFieldName == true ?\n                        null : updated.DataSetFieldName\n                };\n                // Not a change yet, will be done as display name fetching or below\n                // itemChange = true;\n            }\n\n            if (updated.FetchDataSetFieldName != true &&\n                updated.DisplayName != desired.DisplayName)\n            {\n                updated = updated with { DataSetFieldName = desired.DataSetFieldName };\n                DisplayName = updated.DisplayName;\n                metadataChanged = true;\n                itemChange = true;\n            }\n            return itemChange;\n        }\n\n        /// <summary>\n        /// Add veriable field metadata\n        /// </summary>\n        /// <param name=\"fields\"></param>\n        /// <param name=\"dataTypes\"></param>\n        /// <param name=\"session\"></param>\n        /// <param name=\"typeSystem\"></param>\n        /// <param name=\"variable\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"dataSetClassFieldId\"></param>\n        /// <param name=\"ct\"></param>\n        protected async ValueTask AddVariableFieldAsync(List<PublishedFieldMetaDataModel> fields,\n            NodeIdDictionary<object> dataTypes, IOpcUaSession session,\n            ComplexTypeSystem? typeSystem, VariableNode variable,\n            string fieldName, Uuid dataSetClassFieldId, CancellationToken ct)\n        {\n            byte builtInType = 0;\n            try\n            {\n                builtInType = (byte)await session.LruNodeCache.GetBuiltInTypeAsync(variable.DataType,\n                    ct).ConfigureAwait(false);\n            }\n            catch (Exception ex)\n            {\n                _logger.BuiltInTypeFailed(this, variable.DataType.ToString(), ex.Message);\n            }\n            fields.Add(new PublishedFieldMetaDataModel\n            {\n                Flags = 0, // Set to 1 << 1 for PromotedField fields.\n                Name = fieldName,\n                Id = dataSetClassFieldId,\n                DataType = variable.DataType.AsString(session.MessageContext,\n                    NamespaceFormat.Expanded),\n                ArrayDimensions = variable.ArrayDimensions?.Count > 0\n                    ? variable.ArrayDimensions : null,\n                Description = variable.Description.AsString(),\n                ValueRank = variable.ValueRank,\n                MaxStringLength = 0,\n                // If the Property is EngineeringUnits, the unit of the Field Value\n                // shall match the unit of the FieldMetaData.\n                Properties = null, // TODO: Add engineering units etc. to properties\n                BuiltInType = builtInType\n            });\n            await AddDataTypesAsync(dataTypes, variable.DataType, session, typeSystem,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Add data types to the metadata\n        /// </summary>\n        /// <param name=\"dataTypes\"></param>\n        /// <param name=\"dataTypeId\"></param>\n        /// <param name=\"session\"></param>\n        /// <param name=\"typeSystem\"></param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private async ValueTask AddDataTypesAsync(NodeIdDictionary<object> dataTypes,\n            NodeId dataTypeId, IOpcUaSession session, ComplexTypeSystem? typeSystem,\n            CancellationToken ct)\n        {\n            if (IsBuiltInType(dataTypeId))\n            {\n                return;\n            }\n\n            var typesToResolve = new Queue<NodeId>();\n            typesToResolve.Enqueue(dataTypeId);\n            while (typesToResolve.Count > 0)\n            {\n                var baseType = typesToResolve.Dequeue();\n                while (!Opc.Ua.NodeId.IsNull(baseType))\n                {\n                    try\n                    {\n                        var dataType = await session.LruNodeCache.GetNodeAsync(baseType,\n                            ct).ConfigureAwait(false);\n                        if (dataType == null)\n                        {\n                            _logger.DataTypeNodeNotFound(this, baseType.ToString());\n                            break;\n                        }\n\n                        dataTypeId = ExpandedNodeId.ToNodeId(dataType.NodeId, session.MessageContext.NamespaceUris);\n                        Debug.Assert(!Opc.Ua.NodeId.IsNull(dataTypeId));\n                        if (IsBuiltInType(dataTypeId))\n                        {\n                            // Do not add builtin types - we are done here now\n                            break;\n                        }\n\n                        var builtInType = await session.LruNodeCache.GetBuiltInTypeAsync(\n                            dataTypeId, ct).ConfigureAwait(false);\n                        baseType = await session.LruNodeCache.GetSuperTypeAsync(dataTypeId,\n                            ct).ConfigureAwait(false);\n\n                        var browseName = dataType.BrowseName\n                            .AsString(session.MessageContext, NamespaceFormat.Expanded);\n                        var typeName = dataType.NodeId\n                            .AsString(session.MessageContext, NamespaceFormat.Expanded);\n                        if (typeName == null)\n                        {\n                            // No type name - that should not happen\n                            throw new ServiceResultException(StatusCodes.BadDataTypeIdUnknown,\n                                $\"Failed to get metadata type name for {dataType.NodeId}.\");\n                        }\n                        switch (builtInType)\n                        {\n                            case BuiltInType.Enumeration:\n                            case BuiltInType.ExtensionObject:\n                                var types = typeSystem?.GetDataTypeDefinitionsForDataType(\n                                    dataType.NodeId);\n                                if (types == null || types.Count == 0)\n                                {\n                                    var dtNode = await session.LruNodeCache.GetNodeAsync(dataTypeId,\n                                            ct).ConfigureAwait(false);\n                                    if (dtNode is DataTypeNode v &&\n                                        v.DataTypeDefinition?.Body is DataTypeDefinition t)\n                                    {\n                                        types ??= [];\n                                        types.Add(dataTypeId, t);\n                                    }\n                                    else\n                                    {\n                                        dataTypes.AddOrUpdate(\n                                            ExpandedNodeId.ToNodeId(dataType.NodeId, session.MessageContext.NamespaceUris),\n                                            GetDefault(dataType, builtInType, session.MessageContext));\n                                        break;\n                                    }\n                                }\n                                foreach (var type in types)\n                                {\n                                    if (!dataTypes.ContainsKey(type.Key))\n                                    {\n                                        var description = type.Value switch\n                                        {\n                                            StructureDefinition s =>\n                                                new StructureDescriptionModel\n                                                {\n                                                    DataTypeId = typeName,\n                                                    Name = browseName,\n                                                    BaseDataType = s.BaseDataType.AsString(\n                                                        session.MessageContext, NamespaceFormat.Expanded),\n                                                    DefaultEncodingId = s.DefaultEncodingId.AsString(\n                                                        session.MessageContext, NamespaceFormat.Expanded),\n                                                    StructureType = s.StructureType.ToServiceType(),\n                                                    Fields = GetFields(s.Fields, typesToResolve,\n                                                        session.MessageContext, NamespaceFormat.Expanded)\n                                                        .ToList()\n                                                },\n                                            EnumDefinition e =>\n                                                new EnumDescriptionModel\n                                                {\n                                                    DataTypeId = typeName,\n                                                    Name = browseName,\n                                                    BuiltInType = null,\n                                                    IsOptionSet = e.IsOptionSet,\n                                                    Fields = e.Fields\n                                                        .Select(f => new EnumFieldDescriptionModel\n                                                        {\n                                                            Value = f.Value,\n                                                            DisplayName = f.DisplayName.AsString(),\n                                                            Name = f.Name,\n                                                            Description = f.Description.AsString()\n                                                        })\n                                                        .ToList()\n                                                },\n                                            _ => GetDefault(dataType, builtInType, session.MessageContext),\n                                        };\n                                        dataTypes.AddOrUpdate(type.Key, description);\n                                    }\n                                }\n                                break;\n                            default:\n                                var baseName = baseType\n                                    .AsString(session.MessageContext, NamespaceFormat.Expanded);\n                                dataTypes.AddOrUpdate(dataTypeId, new SimpleTypeDescriptionModel\n                                {\n                                    DataTypeId = typeName,\n                                    Name = browseName,\n                                    BaseDataType = baseName,\n                                    BuiltInType = (byte)builtInType\n                                });\n                                break;\n                        }\n                    }\n                    catch (Exception ex) when (ex is not OperationCanceledException)\n                    {\n                        _logger.MetaDataFailed(this, dataTypeId, baseType, ex.Message);\n                        break;\n                    }\n                }\n\n                object GetDefault(INode dataType, BuiltInType builtInType, IServiceMessageContext context)\n                {\n                    _logger.TypeDefinitionNotFound(this, dataType.NodeId, builtInType);\n                    var name = dataType.BrowseName.AsString(context, NamespaceFormat.Expanded);\n                    var dataTypeId = dataType.NodeId.AsString(context, NamespaceFormat.Expanded);\n                    return dataTypeId == null\n                        ? throw new ServiceResultException(StatusCodes.BadConfigurationError)\n                        : builtInType == BuiltInType.Enumeration\n                        ? new EnumDescriptionModel\n                        {\n                            Fields = new List<EnumFieldDescriptionModel>(),\n                            DataTypeId = dataTypeId,\n                            Name = name\n                        }\n                        : new StructureDescriptionModel\n                        {\n                            Fields = new List<StructureFieldDescriptionModel>(),\n                            DataTypeId = dataTypeId,\n                            Name = name\n                        };\n                }\n\n                static IEnumerable<StructureFieldDescriptionModel> GetFields(\n                    StructureFieldCollection? fields, Queue<NodeId> typesToResolve,\n                    IServiceMessageContext context, NamespaceFormat namespaceFormat)\n                {\n                    if (fields == null)\n                    {\n                        yield break;\n                    }\n                    foreach (var f in fields)\n                    {\n                        if (!IsBuiltInType(f.DataType))\n                        {\n                            typesToResolve.Enqueue(f.DataType);\n                        }\n                        yield return new StructureFieldDescriptionModel\n                        {\n                            IsOptional = f.IsOptional,\n                            MaxStringLength = f.MaxStringLength,\n                            ValueRank = f.ValueRank,\n                            ArrayDimensions = f.ArrayDimensions,\n                            DataType = f.DataType.AsString(context, namespaceFormat)\n                                ?? string.Empty,\n                            Name = f.Name,\n                            Description = f.Description.AsString()\n                        };\n                    }\n                }\n            }\n\n            static bool IsBuiltInType(NodeId dataTypeId)\n            {\n                if (dataTypeId.NamespaceIndex == 0 && dataTypeId.IdType == IdType.Numeric)\n                {\n                    var id = (BuiltInType)(int)(uint)dataTypeId.Identifier;\n                    if (id >= BuiltInType.Null && id <= BuiltInType.Enumeration)\n                    {\n                        return true;\n                    }\n                }\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Update queue size using sampling rate and publishing interval\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"item\"></param>\n        protected bool UpdateQueueSize(Subscription subscription, BaseMonitoredItemModel item)\n        {\n            var queueSize = item.QueueSize ?? 1;\n            if (item.AutoSetQueueSize == true)\n            {\n                var publishingInterval = subscription.CurrentPublishingInterval;\n                if (publishingInterval == 0)\n                {\n                    publishingInterval = subscription.PublishingInterval;\n                }\n                var samplingInterval = Status.SamplingInterval;\n                if (samplingInterval == 0)\n                {\n                    samplingInterval = SamplingInterval;\n                }\n                if (samplingInterval > 0)\n                {\n                    queueSize = Math.Max(queueSize, (uint)Math.Ceiling(\n                        (double)publishingInterval / SamplingInterval)) + 1;\n                    if (queueSize != QueueSize && item.QueueSize != queueSize)\n                    {\n                        _logger.QueueSizeAutoSet(this, queueSize);\n                    }\n                }\n                else\n                {\n                    _logger.NoSamplingInterval(this);\n                }\n            }\n            var itemChanged = QueueSize != queueSize;\n            QueueSize = queueSize;\n            return itemChanged;\n        }\n\n        internal sealed class MonitoredItemNotifications\n        {\n            /// <summary>\n            /// Notifications collected\n            /// </summary>\n            public Dictionary<ISubscriber,\n                List<MonitoredItemNotificationModel>> Notifications\n            { get; } = [];\n\n            /// <summary>\n            /// Add notification\n            /// </summary>\n            /// <param name=\"callback\"></param>\n            /// <param name=\"notification\"></param>\n            public void Add(ISubscriber callback,\n                MonitoredItemNotificationModel notification)\n            {\n                if (!Notifications.TryGetValue(callback, out var list))\n                {\n                    list = [];\n                    Notifications.Add(callback, list);\n                }\n                list.Add(notification);\n            }\n        }\n\n        /// <summary>\n        /// Callback\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"notifications\"></param>\n        /// <param name=\"eventTypeName\"></param>\n        /// <param name=\"diagnosticsOnly\"></param>\n        /// <param name=\"timestamp\"></param>\n        protected void Publish(ISubscriber owner, MessageType messageType,\n            IList<MonitoredItemNotificationModel> notifications,\n            string? eventTypeName = null, bool diagnosticsOnly = false,\n            DateTimeOffset? timestamp = null)\n        {\n            if (Subscription is not OpcUaSubscription subscription)\n            {\n                _logger.MissingSubscription(this);\n                return;\n            }\n            subscription.SendNotification(owner, messageType, notifications,\n                eventTypeName, diagnosticsOnly, timestamp);\n        }\n\n        /// <summary>\n        /// Logger\n        /// </summary>\n        protected readonly ILogger _logger;\n        private uint _sequenceNumber;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaMonitoredItem\n    /// </summary>\n    internal static partial class OpcUaMonitoredItemLogging\n    {\n        private const int EventClass = 1030;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Added monitored item {Item} to subscription #{SubscriptionId}.\")]\n        public static partial void ItemAdded(this ILogger logger, OpcUaMonitoredItem item, uint subscriptionId);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Removed monitored item {Item} from subscription #{SubscriptionId}.\")]\n        public static partial void ItemRemoved(this ILogger logger, OpcUaMonitoredItem item, uint subscriptionId);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"{Item}: Item was disposed or moved to another subscription\")]\n        public static partial void ItemDisposed(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Debug,\n            Message = \"Item {Item} removed from subscription #{SubscriptionId} with {Status}.\")]\n        public static partial void ItemRemovedWithStatus(this ILogger logger, OpcUaMonitoredItem item, uint subscriptionId, ServiceResult status);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug,\n            Message = \"{Item}: Item is disabled while trying to complete.\")]\n        public static partial void ItemDisabled(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Debug,\n            Message = \"Server accepted configuration unchanged for #{SubscriptionId}|{Item}('{Name}').\")]\n        public static partial void ConfigurationAccepted(this ILogger logger, uint subscriptionId, NodeId item, string name);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Debug,\n            Message = \"SamplingInterval set to {SamplingInterval} and QueueSize to {QueueSize} \" +\n            \"for #{SubscriptionId}|{Item}('{Name}').\")]\n        public static partial void ConfigurationSet(this ILogger logger, double samplingInterval, uint queueSize,\n            uint subscriptionId, NodeId item, string name);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Debug,\n            Message = \"{Item}: Could not clone last value.\")]\n        public static partial void CloneValueFailed(this ILogger logger, Exception ex, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing discard new mode from {Old} to {New}\")]\n        public static partial void DiscardNewModeChanged(this ILogger logger, OpcUaMonitoredItem item, bool old, bool @new);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing queue size from {Old} ({OldAuto}) to {New} ({NewAuto})\")]\n        public static partial void QueueSizeChanged(this ILogger logger, OpcUaMonitoredItem item, uint? old, bool? oldAuto, uint? @new, bool? newAuto);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Debug,\n            Message = \"{Item}: Changing monitoring mode from {Old} to {New}\")]\n        public static partial void MonitoringModeChanged(this ILogger logger, OpcUaMonitoredItem item, Publisher.Models.MonitoringMode old, Publisher.Models.MonitoringMode @new);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Information,\n            Message = \"{Item}: Failed to get built in type for type {DataType} with message: {Message}\")]\n        public static partial void BuiltInTypeFailed(this ILogger logger, OpcUaMonitoredItem item, string dataType, string message);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Error,\n            Message = \"{Item}: Failed to find node for data type {BaseType}!\")]\n        public static partial void DataTypeNodeNotFound(this ILogger logger, OpcUaMonitoredItem item, string baseType);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Information,\n            Message = \"{Item}: Failed to get meta data for type {DataType} (base: {BaseType}) with message: {Message}\")]\n        public static partial void MetaDataFailed(this ILogger logger, OpcUaMonitoredItem item, NodeId dataType,\n            NodeId? baseType, string message);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Error,\n            Message = \"{Item}: Could not find a valid type definition for {Type} ({BuiltInType}). \" +\n            \"Adding a default placeholder with no fields instead.\")]\n        public static partial void TypeDefinitionNotFound(this ILogger logger, OpcUaMonitoredItem item, ExpandedNodeId type, BuiltInType builtInType);\n\n        [LoggerMessage(EventId = EventClass + 19, Level = LogLevel.Debug,\n            Message = \"Auto-set queue size for {Item} to '{QueueSize}'.\")]\n        public static partial void QueueSizeAutoSet(this ILogger logger, OpcUaMonitoredItem item, uint queueSize);\n\n        [LoggerMessage(EventId = EventClass + 20, Level = LogLevel.Debug,\n            Message = \"No sampling interval set - cannot calculate queue size for {Item}.\")]\n        public static partial void NoSamplingInterval(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 21, Level = LogLevel.Debug,\n            Message = \"Cannot publish notification. Missing subscription for {Item}.\")]\n        public static partial void MissingSubscription(this ILogger logger, OpcUaMonitoredItem item);\n\n        [LoggerMessage(EventId = EventClass + 22, Level = LogLevel.Debug,\n            Message = \"Error adding monitored item {Item} to subscription #{SubscriptionId} due to {Status}.\")]\n        internal static partial void AddMonitoredItemError(this ILogger logger, OpcUaMonitoredItem item, uint subscriptionId, ServiceResult status);\n\n        [LoggerMessage(EventId = EventClass + 23, Level = LogLevel.Debug,\n            Message = \"Server revised SamplingInterval from {SamplingInterval} to {CurrentSamplingInterval} and \" +\n            \"QueueSize from {QueueSize} to {CurrentQueueSize} for #{SubscriptionId}|{Item}('{Name}').\")]\n        public static partial void StatusRevisedDebug(this ILogger logger, double samplingInterval, double currentSamplingInterval,\n            uint queueSize, uint currentQueueSize, uint subscriptionId, NodeId item, string name);\n\n        [LoggerMessage(EventId = EventClass + 24, Level = LogLevel.Debug,\n            Message = \"Server revised SamplingInterval from {SamplingInterval} to {CurrentSamplingInterval} \" +\n            \"for #{SubscriptionId}|{Item}('{Name}').\")]\n        public static partial void SamplingIntervalRevisedDown(this ILogger logger, double samplingInterval,\n            double currentSamplingInterval, uint subscriptionId, NodeId item, string name);\n\n        [LoggerMessage(EventId = EventClass + 25, Level = LogLevel.Information,\n            Message = \"Server revised QueueSize from {QueueSize} to {CurrentQueueSize} \" +\n            \"for #{SubscriptionId}|{Item}('{Name}').\")]\n        public static partial void QueueSizeRevisedDown(this ILogger logger, uint queueSize, uint currentQueueSize,\n            uint subscriptionId, NodeId item, string name);\n\n        [LoggerMessage(EventId = EventClass + 26, Level = LogLevel.Information,\n            Message = \"Server revised SamplingInterval from {SamplingInterval} to {CurrentSamplingInterval} and \" +\n            \"QueueSize from {QueueSize} to {CurrentQueueSize} for #{SubscriptionId}|{Item}('{Name}').\")]\n        public static partial void StatusRevisedInfo(this ILogger logger, double samplingInterval, double currentSamplingInterval,\n            uint queueSize, uint currentQueueSize, uint subscriptionId, NodeId item, string name);\n\n        [LoggerMessage(EventId = EventClass + 27, Level = LogLevel.Information,\n            Message = \"Server revised SamplingInterval from {SamplingInterval} to {CurrentSamplingInterval} \" +\n            \"for #{SubscriptionId}|{Item}('{Name}').\")]\n        public static partial void SamplingIntervalRevisedUp(this ILogger logger, double samplingInterval,\n            double currentSamplingInterval, uint subscriptionId, NodeId item, string name);\n\n        [LoggerMessage(EventId = EventClass + 28, Level = LogLevel.Debug,\n            Message = \"Server revised QueueSize from {QueueSize} to {CurrentQueueSize} \" +\n            \"for #{SubscriptionId}|{Item}('{Name}').\")]\n        public static partial void QueueSizeRevisedUp(this ILogger logger, uint queueSize, uint currentQueueSize,\n            uint subscriptionId, NodeId item, string name);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaSession.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Furly.Extensions.Utils;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using Opc.Ua.Client.ComplexTypes;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Runtime.Serialization;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// OPC UA session extends the SDK session\n    /// </summary>\n    [DataContract(Namespace = OpcUaClient.Namespace)]\n    [KnownType(typeof(OpcUaSubscription))]\n    [KnownType(typeof(OpcUaMonitoredItem))]\n    internal sealed class OpcUaSession : Session, IOpcUaSession, ISessionServices\n    {\n        /// <inheritdoc/>\n        public IVariantEncoder Codec { get; }\n\n        /// <inheritdoc/>\n        public ISessionServices Services => this;\n\n        /// <inheritdoc/>\n        public ILruNodeCache LruNodeCache { get; }\n\n        /// <summary>\n        /// Time the session was created\n        /// </summary>\n        internal DateTimeOffset CreatedAt { get; }\n\n        /// <summary>\n        /// Type system has loaded\n        /// </summary>\n        internal bool IsTypeSystemLoaded\n            => _complexTypeSystem?.IsCompletedSuccessfully ?? false;\n\n        /// <summary>\n        /// Get list of subscription handles registered in the session\n        /// </summary>\n        internal Dictionary<uint, OpcUaSubscription> SubscriptionHandles\n        {\n            get\n            {\n                lock (SyncRoot)\n                {\n                    return Subscriptions\n                        .OfType<OpcUaSubscription>()\n                        .ToDictionary(k => k.SubscriptionId);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Enable or disable ChannelDiagnostics\n        /// </summary>\n        public bool DiagnosticsEnabled\n        {\n            get => _diagnosticsEnabled != false;\n            set => _diagnosticsEnabled = value ? null : false;\n        }\n\n        /// <summary>\n        /// Create session\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"channel\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"clientCertificate\"></param>\n        /// <param name=\"availableEndpoints\"></param>\n        /// <param name=\"discoveryProfileUris\"></param>\n        public OpcUaSession(OpcUaClient client, IJsonSerializer serializer,\n            ILogger<OpcUaSession> logger, TimeProvider timeProvider,\n            ITransportChannel channel, ApplicationConfiguration configuration,\n            ConfiguredEndpoint endpoint, X509Certificate2? clientCertificate = null,\n            EndpointDescriptionCollection? availableEndpoints = null,\n            StringCollection? discoveryProfileUris = null)\n            : base(channel, configuration, endpoint, clientCertificate,\n                  availableEndpoints, discoveryProfileUris)\n        {\n            _logger = logger;\n            _client = client;\n            _serializer = serializer;\n            _timeProvider = timeProvider;\n            LruNodeCache = new LruNodeCache(this,\n                client.NodeCacheTimeout, client.NodeCacheCapacity, true);\n            CreatedAt = _timeProvider.GetUtcNow();\n\n            Initialize();\n            Codec = new JsonVariantEncoder(MessageContext, serializer);\n        }\n\n        /// <summary>\n        /// Copy constructor\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <param name=\"channel\"></param>\n        /// <param name=\"template\"></param>\n        /// <param name=\"copyEventHandlers\"></param>\n        private OpcUaSession(OpcUaSession session,\n            ITransportChannel channel, Session template, bool copyEventHandlers)\n            : base(channel, template, copyEventHandlers)\n        {\n            _logger = session._logger;\n            _client = session._client;\n            _serializer = session._serializer;\n            _timeProvider = session._timeProvider;\n            LruNodeCache = session.LruNodeCache;\n            CreatedAt = _timeProvider.GetUtcNow();\n\n            _complexTypeSystem = session._complexTypeSystem;\n            _history = session._history;\n            _limits = session._limits;\n            _server = session._server;\n\n            Initialize();\n            Codec = new JsonVariantEncoder(MessageContext, _serializer);\n        }\n\n        /// <inheritdoc/>\n        protected override void Dispose(bool disposing)\n        {\n            if (_disposed)\n            {\n                return;\n            }\n            _disposed = true;\n\n            if (disposing)\n            {\n                NodeCache?.Clear();\n                LruNodeCache.Clear();\n\n                _client.OnSessionClosing(this);\n            }\n\n            // Disposes all contained subscriptions\n            base.Dispose(disposing);\n\n            if (disposing)\n            {\n                var sessionName = SessionName;\n\n                PublishError -=\n                    _client.Session_HandlePublishError;\n                PublishSequenceNumbersToAcknowledge -=\n                    _client.Session_PublishSequenceNumbersToAcknowledge;\n                KeepAlive -=\n                    _client.Session_KeepAlive;\n                SessionConfigurationChanged -=\n                    Session_SessionConfigurationChanged;\n\n                CloseChannel(); // Ensure channel is closed\n\n                try\n                {\n                    _cts.Cancel();\n                    if (_complexTypeSystem != null)\n                    {\n                        Try.Op(() => _complexTypeSystem.Wait(TimeSpan.FromSeconds(5)));\n                    }\n                    _logger.SessionDisposed(sessionName);\n                }\n                finally\n                {\n                    _activitySource.Dispose();\n                    _cts.Dispose();\n                }\n            }\n            Debug.Assert(SubscriptionHandles.Count == 0);\n        }\n\n        /// <inheritdoc/>\n        public override Session CloneSession(ITransportChannel channel,\n            bool copyEventHandlers)\n        {\n            return new OpcUaSession(this, channel, this, copyEventHandlers);\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            return SessionName;\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask<SessionDiagnosticsModel> GetServerDiagnosticAsync(\n            CancellationToken ct = default)\n        {\n            try\n            {\n                _lastDiagnostics = await FetchServerDiagnosticAsync(new RequestHeader(),\n                    ct).ConfigureAwait(false);\n            }\n            catch (ServiceResultException sre)\n            {\n                _logger.ServerDiagnosticsFetchFailed(sre);\n            }\n            return _lastDiagnostics ?? new SessionDiagnosticsModel();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask<OperationLimitsModel> GetOperationLimitsAsync(\n            CancellationToken ct = default)\n        {\n            if (_limits != null)\n            {\n                return _limits;\n            }\n            _limits = await FetchOperationLimitsAsync(new RequestHeader(),\n                ct).ConfigureAwait(false);\n            return _limits ?? new OperationLimitsModel();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask<ServerCapabilitiesModel> GetServerCapabilitiesAsync(\n            NamespaceFormat namespaceFormat, CancellationToken ct = default)\n        {\n            if (_server != null && namespaceFormat == NamespaceFormat.Uri)\n            {\n                return _server;\n            }\n            if (_limits == null)\n            {\n                _limits = await FetchOperationLimitsAsync(new RequestHeader(),\n                    ct).ConfigureAwait(false);\n            }\n            var server = await FetchServerCapabilitiesAsync(new RequestHeader(),\n                namespaceFormat, ct).ConfigureAwait(false);\n            if (namespaceFormat == NamespaceFormat.Uri)\n            {\n                _server = server;\n            }\n            return server ?? new ServerCapabilitiesModel\n            {\n                OperationLimits = _limits ?? new OperationLimitsModel()\n            };\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask<HistoryServerCapabilitiesModel> GetHistoryCapabilitiesAsync(\n            NamespaceFormat namespaceFormat, CancellationToken ct = default)\n        {\n            if (_history != null && namespaceFormat == NamespaceFormat.Uri)\n            {\n                return _history;\n            }\n            var history = await FetchHistoryCapabilitiesAsync(new RequestHeader(),\n                namespaceFormat, ct).ConfigureAwait(false);\n            if (namespaceFormat == NamespaceFormat.Uri)\n            {\n                _history = history;\n            }\n            return history ?? new HistoryServerCapabilitiesModel();\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask<ComplexTypeSystem?> GetComplexTypeSystemAsync(CancellationToken ct)\n        {\n            if (_client.DisableComplexTypeLoading)\n            {\n                return null;\n            }\n            for (var attempt = 0; attempt < 2; attempt++)\n            {\n                try\n                {\n                    Debug.Assert(_complexTypeSystem != null);\n                    return await _complexTypeSystem.WaitAsync(ct).ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) when (ct.IsCancellationRequested)\n                {\n                    // Throw any cancellation token exception\n                    throw;\n                }\n                catch (Exception ex)\n                {\n                    _logger.ComplexTypeSystemFailed(this, attempt, ex);\n\n                    // Try again. TODO: Throttle using a timer or so...\n                    _complexTypeSystem = LoadComplexTypeSystemAsync();\n                }\n            }\n            return null;\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<AddNodesResponse> ISessionServices.AddNodesAsync(RequestHeader requestHeader,\n            AddNodesItemCollection nodesToAdd, CancellationToken ct)\n        {\n            using var activity = Begin<AddNodesResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new AddNodesRequest\n            {\n                RequestHeader = requestHeader,\n                NodesToAdd = nodesToAdd\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<AddReferencesResponse> ISessionServices.AddReferencesAsync(\n            RequestHeader requestHeader, AddReferencesItemCollection referencesToAdd,\n            CancellationToken ct)\n        {\n            using var activity = Begin<AddReferencesResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new AddReferencesRequest\n            {\n                RequestHeader = requestHeader,\n                ReferencesToAdd = referencesToAdd\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<DeleteNodesResponse> ISessionServices.DeleteNodesAsync(\n            RequestHeader requestHeader, DeleteNodesItemCollection nodesToDelete,\n            CancellationToken ct)\n        {\n            using var activity = Begin<DeleteNodesResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new DeleteNodesRequest\n            {\n                RequestHeader = requestHeader,\n                NodesToDelete = nodesToDelete\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<DeleteReferencesResponse> ISessionServices.DeleteReferencesAsync(\n            RequestHeader requestHeader, DeleteReferencesItemCollection referencesToDelete,\n            CancellationToken ct)\n        {\n            using var activity = Begin<DeleteReferencesResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new DeleteReferencesRequest\n            {\n                RequestHeader = requestHeader,\n                ReferencesToDelete = referencesToDelete\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<BrowseResponse> ISessionServices.BrowseAsync(\n            RequestHeader requestHeader, ViewDescription? view,\n            uint requestedMaxReferencesPerNode,\n            BrowseDescriptionCollection nodesToBrowse, CancellationToken ct)\n        {\n            using var activity = Begin<BrowseResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new BrowseRequest\n            {\n                RequestHeader = requestHeader,\n                View = view,\n                RequestedMaxReferencesPerNode = requestedMaxReferencesPerNode,\n                NodesToBrowse = nodesToBrowse\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<BrowseNextResponse> ISessionServices.BrowseNextAsync(\n            RequestHeader requestHeader, bool releaseContinuationPoints,\n            ByteStringCollection continuationPoints, CancellationToken ct)\n        {\n            using var activity = Begin<BrowseNextResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new BrowseNextRequest\n            {\n                RequestHeader = requestHeader,\n                ReleaseContinuationPoints = releaseContinuationPoints,\n                ContinuationPoints = continuationPoints\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<TranslateBrowsePathsToNodeIdsResponse> ISessionServices.TranslateBrowsePathsToNodeIdsAsync(\n            RequestHeader requestHeader, BrowsePathCollection browsePaths,\n            CancellationToken ct)\n        {\n            using var activity = Begin<TranslateBrowsePathsToNodeIdsResponse>(\n                requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new TranslateBrowsePathsToNodeIdsRequest\n            {\n                RequestHeader = requestHeader,\n                BrowsePaths = browsePaths\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<RegisterNodesResponse> ISessionServices.RegisterNodesAsync(\n            RequestHeader requestHeader, NodeIdCollection nodesToRegister,\n            CancellationToken ct)\n        {\n            using var activity = Begin<RegisterNodesResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new RegisterNodesRequest\n            {\n                RequestHeader = requestHeader,\n                NodesToRegister = nodesToRegister\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<UnregisterNodesResponse> ISessionServices.UnregisterNodesAsync(\n            RequestHeader requestHeader, NodeIdCollection nodesToUnregister,\n            CancellationToken ct)\n        {\n            using var activity = Begin<UnregisterNodesResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new UnregisterNodesRequest\n            {\n                RequestHeader = requestHeader,\n                NodesToUnregister = nodesToUnregister\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<QueryFirstResponse> ISessionServices.QueryFirstAsync(\n            RequestHeader requestHeader, ViewDescription view,\n            NodeTypeDescriptionCollection nodeTypes, ContentFilter filter,\n            uint maxDataSetsToReturn, uint maxReferencesToReturn,\n            CancellationToken ct)\n        {\n            using var activity = Begin<QueryFirstResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new QueryFirstRequest\n            {\n                RequestHeader = requestHeader,\n                View = view,\n                NodeTypes = nodeTypes,\n                Filter = filter,\n                MaxDataSetsToReturn = maxDataSetsToReturn,\n                MaxReferencesToReturn = maxReferencesToReturn\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<QueryNextResponse> ISessionServices.QueryNextAsync(\n            RequestHeader requestHeader, bool releaseContinuationPoint,\n            byte[] continuationPoint, CancellationToken ct)\n        {\n            using var activity = Begin<QueryNextResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new QueryNextRequest\n            {\n                RequestHeader = requestHeader,\n                ReleaseContinuationPoint = releaseContinuationPoint,\n                ContinuationPoint = continuationPoint\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<ReadResponse> ISessionServices.ReadAsync(RequestHeader requestHeader,\n            double maxAge, Opc.Ua.TimestampsToReturn timestampsToReturn,\n            ReadValueIdCollection nodesToRead, CancellationToken ct)\n        {\n            using var activity = Begin<ReadResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new ReadRequest\n            {\n                RequestHeader = requestHeader,\n                MaxAge = maxAge,\n                TimestampsToReturn = timestampsToReturn,\n                NodesToRead = nodesToRead\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<HistoryReadResponse> ISessionServices.HistoryReadAsync(\n            RequestHeader requestHeader, ExtensionObject? historyReadDetails,\n            Opc.Ua.TimestampsToReturn timestampsToReturn, bool releaseContinuationPoints,\n            HistoryReadValueIdCollection nodesToRead, CancellationToken ct)\n        {\n            using var activity = Begin<HistoryReadResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new HistoryReadRequest\n            {\n                RequestHeader = requestHeader,\n                HistoryReadDetails = historyReadDetails,\n                TimestampsToReturn = timestampsToReturn,\n                ReleaseContinuationPoints = releaseContinuationPoints,\n                NodesToRead = nodesToRead\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<WriteResponse> ISessionServices.WriteAsync(RequestHeader requestHeader,\n            WriteValueCollection nodesToWrite, CancellationToken ct)\n        {\n            using var activity = Begin<WriteResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new WriteRequest\n            {\n                RequestHeader = requestHeader,\n                NodesToWrite = nodesToWrite\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<HistoryUpdateResponse> ISessionServices.HistoryUpdateAsync(\n            RequestHeader requestHeader, ExtensionObjectCollection historyUpdateDetails,\n            CancellationToken ct)\n        {\n            using var activity = Begin<HistoryUpdateResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new HistoryUpdateRequest\n            {\n                RequestHeader = requestHeader,\n                HistoryUpdateDetails = historyUpdateDetails\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <inheritdoc/>\n        async ValueTask<CallResponse> ISessionServices.CallAsync(RequestHeader requestHeader,\n            CallMethodRequestCollection methodsToCall, CancellationToken ct)\n        {\n            using var activity = Begin<CallResponse>(requestHeader);\n            if (activity.Error != null)\n            {\n                return activity.Error;\n            }\n            var request = new CallRequest\n            {\n                RequestHeader = requestHeader,\n                MethodsToCall = methodsToCall\n            };\n            var response = await TransportChannel.SendRequestAsync(\n                request, ct).ConfigureAwait(false);\n            return activity.ValidateResponse(response);\n        }\n\n        /// <summary>\n        /// Called when session is created\n        /// </summary>\n        /// <param name=\"sessionId\"></param>\n        /// <param name=\"sessionCookie\"></param>\n        public override void SessionCreated(NodeId sessionId, NodeId sessionCookie)\n        {\n            base.SessionCreated(sessionId, sessionCookie);\n            if (NodeId.IsNull(sessionId))\n            {\n                // Also called when session closes\n                return;\n            }\n\n            Debug.Assert(!NodeId.IsNull(sessionCookie));\n\n            // Update operation limits with configuration provided overrides\n            OperationLimits.Override(_client.LimitOverrides);\n\n            PreloadComplexTypeSystem();\n        }\n\n        /// <summary>\n        /// Called when session configuration changed\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"e\"></param>\n        private void Session_SessionConfigurationChanged(object? sender, EventArgs e)\n        {\n            PreloadComplexTypeSystem();\n        }\n\n        /// <summary>\n        /// Preload type system\n        /// </summary>\n        private void PreloadComplexTypeSystem()\n        {\n            if (_complexTypeSystem == null &&\n                Connected &&\n                !_client.DisableComplexTypeLoading &&\n                !_client.DisableComplexTypePreloading)\n            {\n                _complexTypeSystem = LoadComplexTypeSystemAsync();\n            }\n        }\n\n        /// <summary>\n        /// Initialize session settings from client configuration\n        /// </summary>\n        private void Initialize()\n        {\n            SessionFactory = _client;\n            TransferSubscriptionsOnReconnect = !_client.DisableTransferSubscriptionOnReconnect;\n            DeleteSubscriptionsOnClose = !TransferSubscriptionsOnReconnect;\n\n            PublishError +=\n                _client.Session_HandlePublishError;\n            PublishSequenceNumbersToAcknowledge +=\n                _client.Session_PublishSequenceNumbersToAcknowledge;\n            KeepAlive +=\n                _client.Session_KeepAlive;\n            SessionConfigurationChanged +=\n                Session_SessionConfigurationChanged;\n\n            var keepAliveInterval =\n                (int)(_client.KeepAliveInterval ?? kDefaultKeepAliveInterval).TotalMilliseconds;\n            if (keepAliveInterval <= 0)\n            {\n                keepAliveInterval = kDefaultKeepAliveInterval.Milliseconds;\n            }\n            var operationTimeout =\n                (int)(_client.OperationTimeout ?? kDefaultOperationTimeout).TotalMilliseconds;\n            if (operationTimeout <= 0)\n            {\n                operationTimeout = kDefaultOperationTimeout.Milliseconds;\n            }\n\n            KeepAliveInterval = keepAliveInterval;\n            OperationTimeout = operationTimeout;\n            _defaultOperationTimeout = operationTimeout;\n        }\n\n        /// <summary>\n        /// Fetch server diagnostics\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task<SessionDiagnosticsModel?> FetchServerDiagnosticAsync(RequestHeader header,\n            CancellationToken ct)\n        {\n            if (_diagnosticsEnabled == false)\n            {\n                return null;\n            }\n            if (!_diagnosticsEnabled.HasValue)\n            {\n                // Check whether enabled and if not enabled enable it\n                var diagnosticsEnabled = await ReadValueAsync(\n                    VariableIds.Server_ServerDiagnostics_EnabledFlag, ct).ConfigureAwait(false);\n                _diagnosticsEnabled = diagnosticsEnabled.Value as bool?;\n                if (_diagnosticsEnabled == false)\n                {\n                    var enableResponse = await WriteAsync(header, new[]\n                    {\n                        new WriteValue\n                        {\n                            AttributeId = Attributes.Value,\n                            NodeId = VariableIds.Server_ServerDiagnostics_EnabledFlag,\n                            Value = new DataValue(true)\n                        }\n                    }, ct).ConfigureAwait(false);\n                    if (ServiceResult.IsBad(enableResponse.Results[0]))\n                    {\n                        _logger.DiagnosticsEnableFailed(enableResponse.Results[0].ToString());\n                        return null;\n                    }\n                    _diagnosticsEnabled = true;\n                }\n            }\n            var response = await ReadAsync(header, 0.0, Opc.Ua.TimestampsToReturn.Neither, new[]\n            {\n                new ReadValueId\n                {\n                    AttributeId = Attributes.Value,\n                    NodeId =\n        VariableIds.Server_ServerDiagnostics_SessionsDiagnosticsSummary_SessionDiagnosticsArray\n                },\n                new ReadValueId\n                {\n                    AttributeId = Attributes.Value,\n                    NodeId = VariableIds.Server_ServerDiagnostics_SubscriptionDiagnosticsArray\n                }\n            }, ct).ConfigureAwait(false);\n            if (ServiceResult.IsBad(response.Results[0].StatusCode))\n            {\n                _logger.DiagnosticsNotRetrievable(response.Results[0].StatusCode.ToString(),\n                    response.Results[1].StatusCode.ToString());\n                return null;\n            }\n            var sessionDiagnosticsArray = response.Results[0].Value as ExtensionObject[];\n            var sessionDiagnostics = sessionDiagnosticsArray?\n                .Select(o => o.Body)\n                .OfType<SessionDiagnosticsDataType>()\n                .FirstOrDefault(d => d.SessionId == SessionId);\n            if (sessionDiagnostics == null)\n            {\n                _logger.DiagnosticsNotFound(response.Results[0].StatusCode.ToString());\n                return null;\n            }\n\n            List<SubscriptionDiagnosticsModel>? subscriptions = null;\n            if (!ServiceResult.IsBad(response.Results[1].StatusCode) &&\n                response.Results[1].Value is ExtensionObject[] subscriptionDiagnosticsArray)\n            {\n                subscriptions = subscriptionDiagnosticsArray\n                    .Select(o => o.Body)\n                    .OfType<SubscriptionDiagnosticsDataType>()\n                    .Where(d => d.SessionId == SessionId)\n                    .Select(diag => new SubscriptionDiagnosticsModel\n                    {\n                        SubscriptionId = diag.SubscriptionId,\n                        Priority = diag.Priority,\n                        PublishingInterval = diag.PublishingInterval,\n                        MaxKeepAliveCount = diag.MaxKeepAliveCount,\n                        MaxLifetimeCount = diag.MaxLifetimeCount,\n                        MaxNotificationsPerPublish = diag.MaxNotificationsPerPublish,\n                        PublishingEnabled = diag.PublishingEnabled,\n                        ModifyCount = diag.ModifyCount,\n                        EnableCount = diag.EnableCount,\n                        DisableCount = diag.DisableCount,\n                        RepublishRequestCount = diag.RepublishRequestCount,\n                        RepublishMessageRequestCount = diag.RepublishMessageRequestCount,\n                        RepublishMessageCount = diag.RepublishMessageCount,\n                        TransferRequestCount = diag.TransferRequestCount,\n                        TransferredToAltClientCount = diag.TransferredToAltClientCount,\n                        TransferredToSameClientCount = diag.TransferredToSameClientCount,\n                        PublishRequestCount = diag.PublishRequestCount,\n                        DataChangeNotificationsCount = diag.DataChangeNotificationsCount,\n                        EventNotificationsCount = diag.EventNotificationsCount,\n                        NotificationsCount = diag.NotificationsCount,\n                        LatePublishRequestCount = diag.LatePublishRequestCount,\n                        CurrentKeepAliveCount = diag.CurrentKeepAliveCount,\n                        CurrentLifetimeCount = diag.CurrentLifetimeCount,\n                        UnacknowledgedMessageCount = diag.UnacknowledgedMessageCount,\n                        DiscardedMessageCount = diag.DiscardedMessageCount,\n                        MonitoredItemCount = diag.MonitoredItemCount,\n                        DisabledMonitoredItemCount = diag.DisabledMonitoredItemCount,\n                        MonitoringQueueOverflowCount = diag.MonitoringQueueOverflowCount,\n                        NextSequenceNumber = diag.NextSequenceNumber,\n                        EventQueueOverFlowCount = diag.EventQueueOverflowCount\n                    })\n                    .ToList();\n            }\n            else\n            {\n                _logger.SubscriptionDiagnosticsNotRetrievable(response.Results[1].StatusCode.ToString());\n            }\n\n            return new SessionDiagnosticsModel\n            {\n                SessionId =\n                    sessionDiagnostics.SessionId.AsString(MessageContext, NamespaceFormat.Expanded),\n                TranslateBrowsePathsToNodeIdsCount =\n                    ToCounter(sessionDiagnostics.TranslateBrowsePathsToNodeIdsCount),\n                AddNodesCount =\n                    ToCounter(sessionDiagnostics.AddNodesCount),\n                AddReferencesCount =\n                    ToCounter(sessionDiagnostics.AddReferencesCount),\n                BrowseCount =\n                    ToCounter(sessionDiagnostics.BrowseCount),\n                BrowseNextCount =\n                    ToCounter(sessionDiagnostics.BrowseNextCount),\n                CreateMonitoredItemsCount =\n                    ToCounter(sessionDiagnostics.CreateMonitoredItemsCount),\n                CreateSubscriptionCount =\n                    ToCounter(sessionDiagnostics.CreateSubscriptionCount),\n                DeleteMonitoredItemsCount =\n                    ToCounter(sessionDiagnostics.DeleteMonitoredItemsCount),\n                DeleteNodesCount =\n                    ToCounter(sessionDiagnostics.DeleteNodesCount),\n                DeleteReferencesCount =\n                    ToCounter(sessionDiagnostics.DeleteReferencesCount),\n                DeleteSubscriptionsCount =\n                    ToCounter(sessionDiagnostics.DeleteSubscriptionsCount),\n                CallCount =\n                    ToCounter(sessionDiagnostics.CallCount),\n                HistoryReadCount =\n                    ToCounter(sessionDiagnostics.HistoryReadCount),\n                HistoryUpdateCount =\n                    ToCounter(sessionDiagnostics.HistoryUpdateCount),\n                ModifyMonitoredItemsCount =\n                    ToCounter(sessionDiagnostics.ModifyMonitoredItemsCount),\n                ModifySubscriptionCount =\n                    ToCounter(sessionDiagnostics.ModifySubscriptionCount),\n                PublishCount =\n                    ToCounter(sessionDiagnostics.PublishCount),\n                RegisterNodesCount =\n                    ToCounter(sessionDiagnostics.RegisterNodesCount),\n                RepublishCount =\n                    ToCounter(sessionDiagnostics.RepublishCount),\n                SetMonitoringModeCount =\n                    ToCounter(sessionDiagnostics.SetMonitoringModeCount),\n                SetPublishingModeCount =\n                    ToCounter(sessionDiagnostics.SetPublishingModeCount),\n                UnregisterNodesCount =\n                    ToCounter(sessionDiagnostics.UnregisterNodesCount),\n                QueryFirstCount =\n                    ToCounter(sessionDiagnostics.QueryFirstCount),\n                QueryNextCount =\n                    ToCounter(sessionDiagnostics.QueryNextCount),\n                ReadCount =\n                    ToCounter(sessionDiagnostics.ReadCount),\n                WriteCount =\n                    ToCounter(sessionDiagnostics.WriteCount),\n                SetTriggeringCount =\n                    ToCounter(sessionDiagnostics.SetTriggeringCount),\n                TotalRequestCount =\n                    ToCounter(sessionDiagnostics.TotalRequestCount),\n                TransferSubscriptionsCount =\n                    ToCounter(sessionDiagnostics.TransferSubscriptionsCount),\n                ServerUri =\n                    sessionDiagnostics.ServerUri,\n                SessionName =\n                    sessionDiagnostics.SessionName,\n                ActualSessionTimeout =\n                    sessionDiagnostics.ActualSessionTimeout,\n                MaxResponseMessageSize =\n                    sessionDiagnostics.MaxResponseMessageSize,\n                UnauthorizedRequestCount =\n                    sessionDiagnostics.UnauthorizedRequestCount,\n                ConnectTime =\n                    sessionDiagnostics.ClientConnectionTime,\n                LastContactTime =\n                    sessionDiagnostics.ClientLastContactTime,\n                CurrentSubscriptionsCount =\n                    sessionDiagnostics.CurrentSubscriptionsCount,\n                CurrentMonitoredItemsCount =\n                    sessionDiagnostics.CurrentMonitoredItemsCount,\n                CurrentPublishRequestsInQueue =\n                    sessionDiagnostics.CurrentPublishRequestsInQueue,\n                Subscriptions =\n                    subscriptions\n            };\n\n            static ServiceCounterModel? ToCounter(ServiceCounterDataType counter)\n            {\n                if (counter.TotalCount == 0 && counter.ErrorCount == 0)\n                {\n                    return null;\n                }\n                return new ServiceCounterModel\n                {\n                    TotalCount = counter.TotalCount,\n                    ErrorCount = counter.ErrorCount\n                };\n            }\n        }\n\n        /// <summary>\n        /// Read operation limits\n        /// </summary>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task<OperationLimitsModel?> FetchOperationLimitsAsync(RequestHeader header,\n            CancellationToken ct)\n        {\n            // Fetch limits into the session using the new api\n            var maxNodesPerRead = OperationLimits.MaxNodesPerRead;\n\n            // Read once more to ensure we have all we need and also correctly show what is not provided.\n            var nodes = new[] {\n                Variables.Server_ServerCapabilities_MaxArrayLength,\n                Variables.Server_ServerCapabilities_MaxBrowseContinuationPoints,\n                Variables.Server_ServerCapabilities_MaxByteStringLength,\n                Variables.Server_ServerCapabilities_MaxHistoryContinuationPoints,\n                Variables.Server_ServerCapabilities_MaxQueryContinuationPoints,\n                Variables.Server_ServerCapabilities_MaxStringLength,\n                Variables.Server_ServerCapabilities_MinSupportedSampleRate,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerHistoryReadData,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerHistoryReadEvents,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerWrite,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerRead,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerHistoryUpdateData,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerHistoryUpdateEvents,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerMethodCall,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerBrowse,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerRegisterNodes,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerTranslateBrowsePathsToNodeIds,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxNodesPerNodeManagement,\n                Variables.Server_ServerCapabilities_OperationLimits_MaxMonitoredItemsPerCall\n            };\n\n            var values = Enumerable.Empty<DataValue>();\n            foreach (var chunk in nodes.Batch(Math.Max(1, (int)maxNodesPerRead)))\n            {\n                // Group the reads\n                var requests = new ReadValueIdCollection(chunk\n                    .Select(n => new ReadValueId\n                    {\n                        NodeId = n,\n                        AttributeId = Attributes.Value\n                    }));\n                var response = await ReadAsync(header, 0,\n                    Opc.Ua.TimestampsToReturn.Both, requests, ct).ConfigureAwait(false);\n                var results = response.Validate(response.Results, d => d.StatusCode,\n                    response.DiagnosticInfos, requests);\n                results.ThrowIfError();\n                values = values.Concat(results.Select(r => r.Result));\n            }\n\n            var value = values.ToList();\n            return new OperationLimitsModel\n            {\n                MaxArrayLength =\n                    Validate32(value[0].GetValueOrDefaultEx<uint?>()),\n                MaxBrowseContinuationPoints =\n                    Validate16(value[1].GetValueOrDefaultEx<ushort?>()),\n                MaxByteStringLength =\n                    Validate32(value[2].GetValueOrDefaultEx<uint?>()),\n                MaxHistoryContinuationPoints =\n                    Validate16(value[3].GetValueOrDefaultEx<ushort?>()),\n                MaxQueryContinuationPoints =\n                    Validate16(value[4].GetValueOrDefaultEx<ushort?>()),\n                MaxStringLength =\n                    Validate32(value[5].GetValueOrDefaultEx<uint?>()),\n                MinSupportedSampleRate =\n                    Validate64(value[6].GetValueOrDefaultEx<double?>()),\n                MaxNodesPerHistoryReadData =\n                    Validate32(value[7].GetValueOrDefaultEx<uint?>()),\n                MaxNodesPerHistoryReadEvents =\n                    Validate32(value[8].GetValueOrDefaultEx<uint?>()),\n                MaxNodesPerWrite =\n                    Validate32(value[9].GetValueOrDefaultEx<uint?>()),\n                MaxNodesPerRead =\n                    Validate32(value[9].GetValueOrDefaultEx<uint?>(), OperationLimits.MaxNodesPerRead),\n                MaxNodesPerHistoryUpdateData =\n                    Validate32(value[10].GetValueOrDefaultEx<uint?>()),\n                MaxNodesPerHistoryUpdateEvents =\n                    Validate32(value[11].GetValueOrDefaultEx<uint?>()),\n                MaxNodesPerMethodCall =\n                    Validate32(value[12].GetValueOrDefaultEx<uint?>()),\n                MaxNodesPerBrowse =\n                    Validate32(value[13].GetValueOrDefaultEx<uint?>(), OperationLimits.MaxNodesPerBrowse),\n                MaxNodesPerRegisterNodes =\n                    Validate32(value[14].GetValueOrDefaultEx<uint?>()),\n                MaxNodesPerTranslatePathsToNodeIds =\n                    Validate32(value[15].GetValueOrDefaultEx<uint?>()),\n                MaxNodesPerNodeManagement =\n                    Validate32(value[16].GetValueOrDefaultEx<uint?>()),\n                MaxMonitoredItemsPerCall =\n                    Validate32(value[17].GetValueOrDefaultEx<uint?>())\n            };\n\n            static uint? Validate32(uint? v, uint max = 0) => v == null || v == 0 ? null :\n                Math.Min(max == 0 ? int.MaxValue : max, v is > 0 and < int.MaxValue ? v.Value : int.MaxValue);\n            static ushort? Validate16(ushort? v, ushort max = 0) => v == null || v == 0 ? null :\n                Math.Min(max == 0 ? ushort.MaxValue : max, v > 0 ? v.Value : ushort.MaxValue);\n            static double? Validate64(double? v, double max = 0) => v == null || v == 0 ? null :\n                Math.Min(max == 0 ? double.MaxValue : max, v > 0 ? v.Value : double.MaxValue);\n        }\n\n        /// <summary>\n        /// Read the server capabilities if available\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"Exception\"></exception>\n        private async Task<ServerCapabilitiesModel?> FetchServerCapabilitiesAsync(\n            RequestHeader requestHeader, NamespaceFormat namespaceFormat, CancellationToken ct)\n        {\n            // load the defaults for the historical capabilities object.\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var config =\n                new ServerCapabilitiesState(null);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            config.ServerProfileArray =\n                new PropertyState<string[]>(config);\n            config.LocaleIdArray =\n                new PropertyState<string[]>(config);\n            config.SoftwareCertificates =\n                new PropertyState<SignedSoftwareCertificate[]>(config);\n            config.ModellingRules =\n                new FolderState(config);\n            config.AggregateFunctions =\n                new FolderState(config);\n            config.Create(SystemContext, null,\n                BrowseNames.ServerCapabilities, null, false);\n\n            var relativePath = new RelativePath();\n            relativePath.Elements.Add(new RelativePathElement\n            {\n                ReferenceTypeId = ReferenceTypeIds.HasComponent,\n                IsInverse = false,\n                IncludeSubtypes = false,\n                TargetName = BrowseNames.ServerCapabilities\n            });\n            var errorInfo = await this.ReadNodeStateAsync(requestHeader, config,\n                Objects.Server, relativePath, ct).ConfigureAwait(false);\n            if (errorInfo != null)\n            {\n                return null;\n            }\n\n            var functions = new List<BaseInstanceState>();\n            config.AggregateFunctions.GetChildren(SystemContext, functions);\n            var aggregateFunctions = functions.OfType<BaseObjectState>().ToDictionary(\n                c => c.BrowseName.AsString(MessageContext, namespaceFormat),\n                c => c.NodeId.AsString(MessageContext, namespaceFormat) ?? string.Empty);\n            var rules = new List<BaseInstanceState>();\n            config.ModellingRules.GetChildren(SystemContext, rules);\n            var modellingRules = rules.OfType<BaseObjectState>().ToDictionary(\n                c => c.BrowseName.AsString(MessageContext, namespaceFormat),\n                c => c.NodeId.AsString(MessageContext, namespaceFormat) ?? string.Empty);\n            var conformanceUnits = config.ConformanceUnits.GetValueOrDefaultEx(\n                v => v == null || v.Length == 0 ? null :\n                v.Select(q => q.AsString(MessageContext, namespaceFormat)).ToList());\n            return new ServerCapabilitiesModel\n            {\n                OperationLimits = _limits ?? new OperationLimitsModel(),\n                ModellingRules =\n                    modellingRules.Count == 0 ? null : modellingRules,\n                SupportedLocales =\n                    config.LocaleIdArray.GetValueOrDefaultEx(\n                        v => v == null || v.Length == 0 ? null : v),\n                ServerProfiles =\n                    config.ServerProfileArray.GetValueOrDefaultEx(\n                        v => v == null || v.Length == 0 ? null : v),\n                AggregateFunctions =\n                    aggregateFunctions.Count == 0 ? null : aggregateFunctions,\n                MaxSessions =\n                    config.MaxSessions.GetValueOrDefaultEx(),\n                MaxSubscriptions =\n                    config.MaxSubscriptions.GetValueOrDefaultEx(),\n                MaxMonitoredItems =\n                    config.MaxMonitoredItems.GetValueOrDefaultEx(),\n                MaxMonitoredItemsPerSubscription =\n                    config.MaxMonitoredItemsPerSubscription.GetValueOrDefaultEx(),\n                MaxMonitoredItemsQueueSize =\n                    config.MaxMonitoredItemsQueueSize.GetValueOrDefaultEx(),\n                MaxSubscriptionsPerSession =\n                    config.MaxSubscriptionsPerSession.GetValueOrDefaultEx(),\n                MaxWhereClauseParameters =\n                    config.MaxWhereClauseParameters.GetValueOrDefaultEx(),\n                MaxSelectClauseParameters =\n                    config.MaxSelectClauseParameters.GetValueOrDefaultEx(),\n                ConformanceUnits = conformanceUnits\n            };\n        }\n\n        /// <summary>\n        /// Read the history server capabilities if available\n        /// </summary>\n        /// <param name=\"requestHeader\"></param>\n        /// <param name=\"namespaceFormat\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"Exception\"></exception>\n        private async Task<HistoryServerCapabilitiesModel?> FetchHistoryCapabilitiesAsync(\n            RequestHeader requestHeader, NamespaceFormat namespaceFormat, CancellationToken ct)\n        {\n            // load the defaults for the historical capabilities object.\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var config =\n                new HistoryServerCapabilitiesState(null);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            config.AccessHistoryDataCapability =\n                new PropertyState<bool>(config);\n            config.AccessHistoryEventsCapability =\n                new PropertyState<bool>(config);\n            config.MaxReturnDataValues =\n                new PropertyState<uint>(config);\n            config.MaxReturnEventValues =\n                new PropertyState<uint>(config);\n            config.InsertDataCapability =\n                new PropertyState<bool>(config);\n            config.ReplaceDataCapability =\n                new PropertyState<bool>(config);\n            config.UpdateDataCapability =\n                new PropertyState<bool>(config);\n            config.DeleteRawCapability =\n                new PropertyState<bool>(config);\n            config.DeleteAtTimeCapability =\n                new PropertyState<bool>(config);\n            config.InsertEventCapability =\n                new PropertyState<bool>(config);\n            config.ReplaceEventCapability =\n                new PropertyState<bool>(config);\n            config.UpdateEventCapability =\n                new PropertyState<bool>(config);\n            config.DeleteEventCapability =\n                new PropertyState<bool>(config);\n            config.InsertAnnotationCapability =\n                new PropertyState<bool>(config);\n            config.ServerTimestampSupported =\n                new PropertyState<bool>(config);\n            config.AggregateFunctions =\n                new FolderState(config);\n            config.Create(SystemContext, null,\n                BrowseNames.HistoryServerCapabilities, null, false);\n\n            var relativePath = new RelativePath();\n            relativePath.Elements.Add(new RelativePathElement\n            {\n                ReferenceTypeId = ReferenceTypeIds.HasComponent,\n                IsInverse = false,\n                IncludeSubtypes = false,\n                TargetName = BrowseNames.HistoryServerCapabilities\n            });\n            var errorInfo = await this.ReadNodeStateAsync(requestHeader, config,\n                Objects.Server_ServerCapabilities, relativePath, ct).ConfigureAwait(false);\n            if (errorInfo != null)\n            {\n                return null;\n            }\n            var supportsValues =\n              config.AccessHistoryDataCapability.GetValueOrDefaultEx() ?? false;\n            var supportsEvents =\n                config.AccessHistoryEventsCapability.GetValueOrDefaultEx() ?? false;\n            Dictionary<string, string>? aggregateFunctions = null;\n            if (supportsEvents || supportsValues)\n            {\n                var children = new List<BaseInstanceState>();\n                config.AggregateFunctions.GetChildren(SystemContext, children);\n                aggregateFunctions = children.OfType<BaseObjectState>().ToDictionary(\n                    c => c.BrowseName.AsString(MessageContext, namespaceFormat),\n                    c => c.NodeId.AsString(MessageContext, namespaceFormat) ?? string.Empty);\n            }\n            return new HistoryServerCapabilitiesModel\n            {\n                AccessHistoryDataCapability =\n                    supportsValues,\n                AccessHistoryEventsCapability =\n                    supportsEvents,\n                MaxReturnDataValues =\n                    config.MaxReturnDataValues.GetValueOrDefaultEx(\n                        v => !supportsValues ? null : v == 0 ? uint.MaxValue : v),\n                MaxReturnEventValues =\n                    config.MaxReturnEventValues.GetValueOrDefaultEx(\n                        v => !supportsEvents ? null : v == 0 ? uint.MaxValue : v),\n                InsertDataCapability =\n                    config.InsertDataCapability.GetValueOrDefaultEx(),\n                ReplaceDataCapability =\n                    config.ReplaceDataCapability.GetValueOrDefaultEx(),\n                UpdateDataCapability =\n                    config.UpdateDataCapability.GetValueOrDefaultEx(),\n                DeleteRawCapability =\n                    config.DeleteRawCapability.GetValueOrDefaultEx(),\n                DeleteAtTimeCapability =\n                    config.DeleteAtTimeCapability.GetValueOrDefaultEx(),\n                InsertEventCapability =\n                    config.InsertEventCapability.GetValueOrDefaultEx(),\n                ReplaceEventCapability =\n                    config.ReplaceEventCapability.GetValueOrDefaultEx(),\n                UpdateEventCapability =\n                    config.UpdateEventCapability.GetValueOrDefaultEx(),\n                DeleteEventCapability =\n                    config.DeleteEventCapability.GetValueOrDefaultEx(),\n                InsertAnnotationCapability =\n                    config.InsertAnnotationCapability.GetValueOrDefaultEx(),\n                ServerTimestampSupported =\n                    config.ServerTimestampSupported.GetValueOrDefaultEx(),\n                AggregateFunctions = aggregateFunctions == null ||\n                    aggregateFunctions.Count == 0 ? null : aggregateFunctions\n            };\n        }\n\n        /// <summary>\n        /// Set appropriate operation timeouts\n        /// </summary>\n        /// <param name=\"closing\"></param>\n        internal void UpdateOperationTimeout(bool closing)\n        {\n            //\n            // The OperationTimeout while publishing should be twice the\n            // value for PublishingInterval * KeepAliveCount\n            //\n            if (closing)\n            {\n                OperationTimeout = 2000; // Update to 2 seconds for closing\n                return;\n            }\n            var timeout = Subscriptions\n                .Select(s => s.CurrentPublishingInterval * s.CurrentKeepAliveCount)\n                .DefaultIfEmpty(0)\n                .Max() * 2;\n            if (timeout < _defaultOperationTimeout)\n            {\n                timeout = _defaultOperationTimeout;\n            }\n            if (timeout > kMaxOperationTimeout.TotalMilliseconds)\n            {\n                timeout = kMaxOperationTimeout.TotalMilliseconds;\n            }\n            if (OperationTimeout != timeout)\n            {\n                OperationTimeout = (int)timeout;\n                _logger.OperationTimeoutUpdated(TimeSpan.FromMilliseconds(timeout));\n            }\n        }\n\n        /// <summary>\n        /// Load complex type system\n        /// </summary>\n        /// <returns></returns>\n        private Task<ComplexTypeSystem> LoadComplexTypeSystemAsync()\n        {\n            Debug.Assert(!_client.DisableComplexTypeLoading);\n            return Task.Run(async () =>\n            {\n                if (Connected)\n                {\n                    var complexTypeSystem = new ComplexTypeSystem(new NodeCacheResolver(LruNodeCache));\n                    await complexTypeSystem.LoadAsync(ct: _cts.Token).ConfigureAwait(false);\n\n                    if (Connected)\n                    {\n                        _logger.ComplexTypeSystemLoaded(this);\n\n                        // Clear cache to release memory.\n                        // TODO: we should have a real node cache here\n                        return complexTypeSystem;\n                    }\n                }\n                throw new ServiceResultException(StatusCodes.BadNotConnected);\n            }, _cts.Token);\n        }\n\n        /// <summary>\n        /// Begin request\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"header\"></param>\n        /// <returns></returns>\n        private SessionActivity<T> Begin<T>(RequestHeader header)\n            where T : IServiceResponse, new()\n        {\n            var activity = new SessionActivity<T>(this, typeof(T).Name[0..^8]);\n            if (!Connected)\n            {\n                var error = new T();\n                error.ResponseHeader.ServiceResult = StatusCodes.BadNotConnected;\n                error.ResponseHeader.Timestamp = _timeProvider.GetUtcNow().UtcDateTime;\n                var text = error.ResponseHeader.StringTable.Count;\n                error.ResponseHeader.StringTable.Add(\"Session not connected.\");\n                var locale = error.ResponseHeader.StringTable.Count;\n                error.ResponseHeader.StringTable.Add(\"en-US\");\n                var symbol = error.ResponseHeader.StringTable.Count;\n                error.ResponseHeader.StringTable.Add(\"BadNotConnected\");\n                error.ResponseHeader.ServiceDiagnostics = new DiagnosticInfo\n                {\n                    SymbolicId = symbol,\n                    Locale = locale,\n                    LocalizedText = text\n                };\n                activity.Error = error;\n            }\n            else\n            {\n                header.RequestHandle = NewRequestHandle();\n                header.AuthenticationToken = AuthenticationToken;\n                header.Timestamp = _timeProvider.GetUtcNow().UtcDateTime;\n            }\n            return activity;\n        }\n\n        /// <summary>\n        /// Session activity\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        private sealed class SessionActivity<T> : IDisposable\n            where T : IServiceResponse, new()\n        {\n            /// <summary>\n            /// Any error to convey\n            /// </summary>\n            public T? Error { get; set; }\n\n            /// <inheritdoc/>\n            public SessionActivity(OpcUaSession outer, string activity)\n            {\n                _activity = outer._activitySource.StartActivity(activity);\n\n                if (outer._logger.IsEnabled(LogLevel.Debug))\n                {\n                    _logScope = new LogScope(activity, Stopwatch.StartNew(),\n                        outer._logger);\n                    _logScope.logger.LogDebug(\"Session activity {Activity} started...\",\n                        _logScope.name);\n                }\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                _activity?.Dispose();\n\n                _logScope?.logger.LogDebug(\n                    \"Session activity {Activity} completed in {Elapsed} with {Status}.\",\n                    _logScope.name, _logScope.sw.Elapsed,\n                        Error?.ResponseHeader?.ServiceResult == null ? \"Good\" :\n                    StatusCodes.GetBrowseName(Error.ResponseHeader.ServiceResult.CodeBits));\n            }\n\n            /// <summary>\n            /// Gets the response\n            /// </summary>\n            /// <param name=\"response\"></param>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            /// <returns></returns>\n            public T ValidateResponse(IServiceResponse response)\n            {\n                if (response?.ResponseHeader == null)\n                {\n                    // Throw - this is likely an issue in the transport.\n                    throw new ServiceResultException(StatusCodes.BadUnknownResponse);\n                }\n                if (response is not T result)\n                {\n                    // Received a response, but not the type we expected.\n                    // Promote to expected Type.\n                    result = new T();\n\n                    result.ResponseHeader.ServiceResult =\n                        response.ResponseHeader.ServiceResult;\n                    result.ResponseHeader.StringTable =\n                        response.ResponseHeader.StringTable;\n                    result.ResponseHeader.AdditionalHeader =\n                        response.ResponseHeader.AdditionalHeader;\n                    result.ResponseHeader.RequestHandle =\n                        response.ResponseHeader.RequestHandle;\n                    result.ResponseHeader.ServiceDiagnostics =\n                        response.ResponseHeader.ServiceDiagnostics;\n                    result.ResponseHeader.Timestamp =\n                        response.ResponseHeader.Timestamp;\n                }\n\n                if (StatusCode.IsBad(result.ResponseHeader.ServiceResult))\n                {\n                    Error = result;\n                }\n                return result;\n            }\n\n            private sealed record class LogScope(string name, Stopwatch sw, ILogger logger);\n            private readonly Activity? _activity;\n            private readonly LogScope? _logScope;\n        }\n\n        private ServerCapabilitiesModel? _server;\n        private OperationLimitsModel? _limits;\n        private SessionDiagnosticsModel? _lastDiagnostics;\n        private HistoryServerCapabilitiesModel? _history;\n        private Task<ComplexTypeSystem>? _complexTypeSystem;\n        private bool _disposed;\n        private bool? _diagnosticsEnabled;\n        private int _defaultOperationTimeout;\n        private readonly CancellationTokenSource _cts = new();\n        private readonly ILogger _logger;\n        private readonly OpcUaClient _client;\n        private readonly IJsonSerializer _serializer;\n        private readonly TimeProvider _timeProvider;\n        private readonly ActivitySource _activitySource = Diagnostics.NewActivitySource();\n        private static readonly TimeSpan kDefaultOperationTimeout = TimeSpan.FromMinutes(1);\n        private static readonly TimeSpan kDefaultKeepAliveInterval = TimeSpan.FromSeconds(30);\n        private static readonly TimeSpan kMaxOperationTimeout = TimeSpan.FromMinutes(30);\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaSession\n    /// </summary>\n    internal static partial class OpcUaSessionLogging\n    {\n        private const int EventClass = 1200;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"{Session}: Session disposed.\")]\n        public static partial void SessionDisposed(this ILogger logger, string session);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"Failed to fetch server diagnostics.\")]\n        public static partial void ServerDiagnosticsFetchFailed(this ILogger logger, ServiceResultException sre);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"{Session}: Attempt #{Attempt}. Failed to get complex type system.\")]\n        public static partial void ComplexTypeSystemFailed(this ILogger logger, OpcUaSession session, int attempt, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"Session diagnostics disabled and failed to enable ({Error}).\")]\n        public static partial void DiagnosticsEnableFailed(this ILogger logger, string error);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"Session diagnostics not retrievable ({Error1}/{Error2}).\")]\n        public static partial void DiagnosticsNotRetrievable(this ILogger logger, string error1, string error2);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"Failed to find diagnostics for this session ({Error}).\")]\n        public static partial void DiagnosticsNotFound(this ILogger logger, string error);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Subscription diagnostics not retrievable ({Error}).\")]\n        public static partial void SubscriptionDiagnosticsNotRetrievable(this ILogger logger, string error);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"Operation timeout updated to {Timeout}.\")]\n        public static partial void OperationTimeoutUpdated(this ILogger logger, TimeSpan timeout);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"{Session}: Complex type system loaded into client.\")]\n        public static partial void ComplexTypeSystemLoaded(this ILogger logger, OpcUaSession session);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaStack.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Autofac;\n    using Furly.Extensions.Logging;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using System;\n\n    /// <summary>\n    /// Injectable service that registers a logger with stack\n    /// </summary>\n    public sealed class OpcUaStack : IStartable, IDisposable\n    {\n        /// <summary>\n        /// Create stack logger\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"options\"></param>\n        public OpcUaStack(ILogger<OpcUaStack> logger,\n            IOptions<OpcUaClientOptions> options)\n        {\n            var enabled = options.Value.EnableOpcUaStackLogging ?? false;\n            Utils.SetLogger(enabled ? logger : new ErrorLogger(logger));\n        }\n\n        /// <inheritdoc/>\n        public void Start()\n        {\n            // No op\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Utils.SetLogger(Log.Console<OpcUaStack>());\n        }\n\n        /// <summary>\n        /// Just log at error level (disabled)\n        /// </summary>\n        private sealed class ErrorLogger : ILogger\n        {\n            /// <inheritdoc/>\n            public ErrorLogger(ILogger<OpcUaStack> logger)\n            {\n                _logger = logger;\n            }\n\n            /// <inheritdoc/>\n            public void Log<TState>(LogLevel logLevel, EventId eventId, TState state,\n                Exception? exception, Func<TState, Exception?, string> formatter)\n            {\n                if (logLevel >= LogLevel.Error)\n                {\n                    _logger.StackMessage(exception, formatter(state, exception));\n                }\n            }\n\n            /// <inheritdoc/>\n            public bool IsEnabled(LogLevel logLevel)\n            {\n                return logLevel >= LogLevel.Error;\n            }\n\n            /// <inheritdoc/>\n            public IDisposable? BeginScope<TState>(TState state)\n                where TState : notnull\n            {\n                return _logger.BeginScope(state);\n            }\n\n            private readonly ILogger _logger;\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for OpcUaStack\n    /// </summary>\n    internal static partial class OpcUaStackLogging\n    {\n        private const int EventClass = 1200;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error, Message = \"{message}\")]\n        public static partial void StackMessage(this ILogger logger, Exception? exception, string message);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaStackKeySetLogger.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Globalization;\n    using System.IO;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// Wireshark 4.3 now allows decryption of the UA binary protocol using a keyset log\n    /// (opc ua debug file). The file contains records in the following format:\n    /// </para>\n    /// <para>\n    /// client_iv_%channel_id%_%token_id%: %hex-string%\n    /// client_key_%channel_id%_%token_id%: %hex-string%\n    /// client_siglen_%channel_id%_%token_id%: 32\n    /// server_iv_%channel_id%_%token_id%: %hex-string%\n    /// server_key_%channel_id%_%token_id%: %hex-string%\n    /// server_siglen_%channel_id%_%token_id%: 16|24|32\n    /// ...\n    /// </para>\n    /// <para>\n    /// This class writes the file to disk if a file was configured\n    /// See: https://gitlab.com/wireshark/wireshark/-/blob/master/plugins/epan/opcua/opcua.c#L232\n    /// </para>\n    /// </summary>\n    public sealed class OpcUaStackKeySetLogger : IDisposable\n    {\n        /// <summary>\n        /// Create logger\n        /// </summary>\n        /// <param name=\"options\"></param>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"logger\"></param>\n        public OpcUaStackKeySetLogger(IOptions<OpcUaClientOptions> options,\n            IClientDiagnostics diagnostics, ILogger<OpcUaStackKeySetLogger> logger)\n        {\n            _diagnostics = diagnostics;\n            _logger = logger;\n            _cts = new CancellationTokenSource();\n            if (options.Value.OpcUaKeySetLogFolderName == null)\n            {\n                _task = Task.CompletedTask;\n                return;\n            }\n            _task = WriteDebugFileAsync(options.Value.OpcUaKeySetLogFolderName, _cts.Token);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            try\n            {\n                _cts.Cancel();\n                _task.GetAwaiter().GetResult();\n            }\n            catch\n            {\n                _cts.Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Log debug file to disk\n        /// </summary>\n        /// <param name=\"folderName\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public async Task WriteDebugFileAsync(string folderName, CancellationToken ct)\n        {\n            var rootFolder = Path.Combine(folderName, \"opcua_debug\");\n            if (Directory.Exists(rootFolder))\n            {\n                Directory.Delete(rootFolder, true);\n            }\n            await foreach (var change in _diagnostics.WatchChannelDiagnosticsAsync(\n                ct).ConfigureAwait(false))\n            {\n                try\n                {\n                    await WriteDebugLogFileAsync(rootFolder, change, ct).ConfigureAwait(false);\n                }\n                catch (Exception ex)\n                {\n                    _logger.FailedToWriteDebugLogFile(ex);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Write diagnostic change to log file\n        /// </summary>\n        /// <param name=\"rootFolder\"></param>\n        /// <param name=\"change\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private static async Task WriteDebugLogFileAsync(string rootFolder,\n            ChannelDiagnosticModel change, CancellationToken ct)\n        {\n            if (change?.Client == null || change?.Server == null ||\n                change.SessionCreated == null || change.RemotePort == null)\n            {\n                // Not a valid change, channel without keys\n                return;\n            }\n\n            var keySetLogPath = Path.Combine(rootFolder, \"ports\",\n                change.RemotePort.Value.ToString(CultureInfo.InvariantCulture),\n                    \"connection\", change.Connection.CreateConsistentHash()\n                        .ToString(\"X\", CultureInfo.InvariantCulture),\n                    change.SessionCreated.Value.UtcDateTime.ToBinary()\n                        .ToString(CultureInfo.InvariantCulture));\n            if (!Directory.Exists(keySetLogPath))\n            {\n                Directory.CreateDirectory(keySetLogPath);\n            }\n            var keysetsFileName = Path.Combine(keySetLogPath, \"opcua_debug.txt\");\n            var keysetFileRoot = keysetsFileName.Replace(rootFolder, \".\",\n                StringComparison.OrdinalIgnoreCase);\n            var log = File.AppendText(Path.Combine(rootFolder, \"log.md\"));\n            await using (var _ = log.ConfigureAwait(false))\n            {\n                await log.WriteLineAsync($\"# {change.TimeStamp}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"[KeySetFile]({keysetFileRoot})\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"EndpointUrl: {change.Connection.Endpoint?.Url}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"RemoteEP: {change.RemoteIpAddress}:{change.RemotePort}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"LocalEP: {change.LocalIpAddress}:{change.LocalPort}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"ChannelId: {change.ChannelId}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"TokenId: {change.TokenId}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"Session: {change.SessionId}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"Created: {change.SessionCreated}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"SecurityMode: {change.Connection.Endpoint?.SecurityMode}\")\n                    .ConfigureAwait(false);\n                await log.WriteLineAsync($\"SecurityProfile: {change.Connection.Endpoint?.SecurityPolicy}\")\n                    .ConfigureAwait(false);\n\n                await log.FlushAsync(ct).ConfigureAwait(false);\n            }\n\n            var keysets = File.AppendText(keysetsFileName);\n            await using (var _ = keysets.ConfigureAwait(false))\n            {\n                await keysets.WriteAsync($\"client_iv_{change.ChannelId}_{change.TokenId}: \")\n                    .ConfigureAwait(false);\n                await keysets.WriteLineAsync(Convert.ToHexString([.. change.Client.Iv]))\n                    .ConfigureAwait(false);\n                await keysets.WriteAsync($\"client_key_{change.ChannelId}_{change.TokenId}: \")\n                    .ConfigureAwait(false);\n                await keysets.WriteLineAsync(Convert.ToHexString([.. change.Client.Key]))\n                    .ConfigureAwait(false);\n                await keysets.WriteAsync($\"client_siglen_{change.ChannelId}_{change.TokenId}: \")\n                    .ConfigureAwait(false);\n                await keysets.WriteLineAsync(change.Client.SigLen.ToString(CultureInfo.InvariantCulture))\n                    .ConfigureAwait(false);\n\n                await keysets.WriteAsync($\"server_iv_{change.ChannelId}_{change.TokenId}: \")\n                    .ConfigureAwait(false);\n                await keysets.WriteLineAsync(Convert.ToHexString([.. change.Server.Iv]))\n                    .ConfigureAwait(false);\n                await keysets.WriteAsync($\"server_key_{change.ChannelId}_{change.TokenId}: \")\n                    .ConfigureAwait(false);\n                await keysets.WriteLineAsync(Convert.ToHexString([.. change.Server.Key]))\n                    .ConfigureAwait(false);\n                await keysets.WriteAsync($\"server_siglen_{change.ChannelId}_{change.TokenId}: \")\n                    .ConfigureAwait(false);\n                await keysets.WriteLineAsync(change.Server.SigLen.ToString(CultureInfo.InvariantCulture))\n                    .ConfigureAwait(false);\n\n                await keysets.FlushAsync(ct).ConfigureAwait(false);\n            }\n        }\n\n        private readonly Task _task;\n        private readonly CancellationTokenSource _cts;\n        private readonly IClientDiagnostics _diagnostics;\n        private readonly ILogger<OpcUaStackKeySetLogger> _logger;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for OpcUaStackKeySetLogger\n    /// </summary>\n    internal static partial class OpcUaStackKeySetLoggerLogging\n    {\n        private const int EventClass = 1300;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Failed to write changes to debug log file.\")]\n        public static partial void FailedToWriteDebugLogFile(this ILogger logger, Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaSubscription.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Furly.Extensions.Utils;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using Opc.Ua.Client.ComplexTypes;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Diagnostics.Metrics;\n    using System.Linq;\n    using System.Runtime.Serialization;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Subscription implementation\n    /// </summary>\n    [DataContract(Namespace = OpcUaClient.Namespace)]\n    [KnownType(typeof(OpcUaMonitoredItem))]\n    [KnownType(typeof(OpcUaMonitoredItem.DataChange))]\n    [KnownType(typeof(OpcUaMonitoredItem.CyclicRead))]\n    [KnownType(typeof(OpcUaMonitoredItem.Heartbeat))]\n    [KnownType(typeof(OpcUaMonitoredItem.ModelChangeEventItem))]\n    [KnownType(typeof(OpcUaMonitoredItem.Event))]\n    [KnownType(typeof(OpcUaMonitoredItem.Condition))]\n    internal sealed class OpcUaSubscription : Subscription, IAsyncDisposable,\n        IEquatable<OpcUaSubscription>\n    {\n        /// <summary>\n        /// Template for subscription\n        /// </summary>\n        public SubscriptionModel Template { get; private set; }\n\n        /// <summary>\n        /// Is root subscription\n        /// </summary>\n        public bool IsRoot => _parentId == null;\n\n        /// <summary>\n        /// Unique subscription identifier in the process\n        /// </summary>\n        public uint SubscriptionId { get; }\n\n        /// <summary>\n        /// The name of the subscription\n        /// </summary>\n        public string Name { get; private set; }\n\n        /// <summary>\n        /// Whether the subscription is online\n        /// </summary>\n        internal bool IsOnline\n            => Session?.Connected == true && !IsClosed;\n\n        /// <summary>\n        /// Whether subscription is closed\n        /// </summary>\n        internal bool IsClosed\n            => _disposed || Session == null;\n\n        /// <summary>\n        /// Currently monitored but unordered\n        /// </summary>\n        private IEnumerable<OpcUaMonitoredItem> CurrentlyMonitored\n            => MonitoredItems.OfType<OpcUaMonitoredItem>();\n\n        public byte DesiredPriority\n            => Template.Priority\n            ?? Session?.DefaultSubscription?.Priority\n            ?? 0;\n\n        public uint DesiredMaxNotificationsPerPublish\n            => Template.MaxNotificationsPerPublish\n            ?? Session?.DefaultSubscription?.MaxNotificationsPerPublish\n            ?? 0;\n\n        public uint DesiredLifetimeCount\n            => Template.LifetimeCount\n            ?? _options.Value.DefaultLifeTimeCount\n            ?? DefaultLifetimeCount;\n\n        public uint DefaultLifetimeCount\n        {\n            get\n            {\n                var desiredPublishingInterval = DesiredPublishingInterval;\n                if (desiredPublishingInterval >= TimeSpan.FromSeconds(60))\n                {\n                    // If greater than a minute we request a lifetime count\n                    // of 2 (min 2 mins). That means we allow the subscription\n                    // to recover in another cycle. This could be faster than\n                    // when the publishing interval was set to 55 seconds.\n                    return 2;\n                }\n                else if (desiredPublishingInterval >= TimeSpan.FromSeconds(30))\n                {\n                    // If between 30 and 60 seconds, allow 3 times keep alive\n                    // interval (min 90 seconds, up to 3 minutes) until\n                    // we declare the subscription dead. This means the\n                    // subscription will take min 7.5 minutes, max 15 minutes\n                    // to get reset if it is defunct.\n                    return 3;\n                }\n                else if (desiredPublishingInterval >= TimeSpan.FromSeconds(5))\n                {\n                    // If between 5 and 60 seconds, allow 5 times keep alive\n                    // interval (min 10 seconds, up to 2 minutes) until\n                    // we declare the subscription dead. This means the\n                    // subscription will take min 50 seconds, max 10 minutes\n                    // to get reset if it is defunct.\n                    return 5;\n                }\n                else\n                {\n                    // Otherwise let the server decide the lifetime count\n                    return 0;\n                }\n            }\n        }\n\n        public uint DesiredKeepAliveCount\n            => Template.KeepAliveCount\n            ?? _options.Value.DefaultKeepAliveCount\n            ?? DefaultKeepAliveCount;\n\n        public uint DefaultKeepAliveCount\n        {\n            get\n            {\n                var desiredPublishingInterval = DesiredPublishingInterval;\n                if (desiredPublishingInterval >= TimeSpan.FromSeconds(60))\n                {\n                    // If greater than a minute we force a keep alive count of 1\n                    // We see this setting is used by users to get messages every\n                    // publishing interval duration, but then nothing recovers.\n                    return 1;\n                }\n                else if (desiredPublishingInterval >= TimeSpan.FromSeconds(5))\n                {\n                    // Limit the keep alive timeout to twice the publishing\n                    // interval (min 10 seconds, up to 2 minutes).\n                    return 2;\n                }\n                else\n                {\n                    // Otherwise let the server decide the keep alive count\n                    return 0;\n                }\n            }\n        }\n\n        public TimeSpan DesiredPublishingInterval\n            => Template.PublishingInterval\n            ?? _options.Value.DefaultPublishingInterval\n            ?? TimeSpan.FromSeconds(1);\n\n        public bool UseDeferredAcknoledgements\n            => Template.UseDeferredAcknoledgements\n            ?? _options.Value.UseDeferredAcknoledgements\n            ?? false;\n\n        public bool EnableImmediatePublishing\n            => Template.EnableImmediatePublishing\n            ?? _options.Value.EnableImmediatePublishing\n            ?? false;\n\n        public bool EnableSequentialPublishing\n            => Template.EnableSequentialPublishing\n            ?? _options.Value.EnableSequentialPublishing\n            ?? true;\n\n        public bool DesiredRepublishAfterTransfer\n            => Template.RepublishAfterTransfer\n            ?? _options.Value.DefaultRepublishAfterTransfer\n            ?? false;\n\n        public TimeSpan MonitoredItemWatchdogTimeout\n            => Template.MonitoredItemWatchdogTimeout\n            ?? _options.Value.DefaultMonitoredItemWatchdogTimeout\n            ?? TimeSpan.Zero;\n\n        public MonitoredItemWatchdogCondition WatchdogCondition\n            => Template.WatchdogCondition\n            ?? _options.Value.DefaultMonitoredItemWatchdogCondition\n            ?? MonitoredItemWatchdogCondition.WhenAnyIsLate;\n\n        public SubscriptionWatchdogBehavior? WatchdogBehavior\n            => Template.WatchdogBehavior\n            ?? _options.Value.DefaultWatchdogBehavior;\n\n        public bool ResolveBrowsePathFromRoot\n            => Template.ResolveBrowsePathFromRoot\n            ?? _options.Value.FetchOpcBrowsePathFromRoot\n            ?? false;\n\n        /// <summary>\n        /// Keep alive timeout\n        /// </summary>\n        internal TimeSpan KeepAliveTimeout => TimeSpan.FromMilliseconds(\n            (CurrentPublishingInterval * CurrentKeepAliveCount) + 1000);\n\n        /// <summary>\n        /// Subscription\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"template\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"metrics\"></param>\n        /// <param name=\"parentId\"></param>\n        /// <param name=\"timeProvider\"></param>\n        internal OpcUaSubscription(OpcUaClient client, SubscriptionModel template,\n            IOptions<OpcUaSubscriptionOptions> options, ILoggerFactory loggerFactory,\n            IMetricsContext metrics, uint? parentId = null, TimeProvider? timeProvider = null)\n        {\n            _client = client;\n            _options = options;\n            _loggerFactory = loggerFactory;\n            _metrics = metrics;\n            _parentId = parentId;\n            _timeProvider = timeProvider ?? TimeProvider.System;\n\n            Template = template;\n            Name = Template.CreateSubscriptionId();\n            SubscriptionId = Opc.Ua.SequenceNumber.Increment32(ref _lastIndex);\n\n            _logger = _loggerFactory.CreateLogger<OpcUaSubscription>();\n\n            Initialize();\n            _keepAliveWatcher = _timeProvider.CreateTimer(OnKeepAliveMissing, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            _monitoredItemWatcher = _timeProvider.CreateTimer(OnMonitoredItemWatchdog, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            _resyncTimer = _timeProvider.CreateTimer(OnResync, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n\n            InitializeMetrics();\n            _client.OnSubscriptionCreated(this);\n\n            ResetMonitoredItemWatchdogTimer(PublishingEnabled);\n        }\n\n        /// <summary>\n        /// Copy constructor\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"copyEventHandlers\"></param>\n        private OpcUaSubscription(OpcUaSubscription subscription, bool copyEventHandlers)\n            : base(subscription, copyEventHandlers)\n        {\n            _options = subscription._options;\n            _loggerFactory = subscription._loggerFactory;\n            _timeProvider = subscription._timeProvider;\n            _metrics = subscription._metrics;\n            _firstDataChangeReceived = subscription._firstDataChangeReceived;\n\n            Template = subscription.Template;\n            Name = subscription.Name;\n\n            SubscriptionId = subscription.SubscriptionId;\n            _parentId = subscription._parentId;\n\n            _client = subscription._client;\n            _logger = subscription._logger;\n            _sequenceNumber = subscription._sequenceNumber;\n\n            _goodMonitoredItems = subscription._goodMonitoredItems;\n            _badMonitoredItems = subscription._badMonitoredItems;\n            _lateMonitoredItems = subscription._lateMonitoredItems;\n            _reportingItems = subscription._reportingItems;\n            _disabledItems = subscription._disabledItems;\n            _samplingItems = subscription._samplingItems;\n            _notAppliedItems = subscription._notAppliedItems;\n\n            _missingKeepAlives = subscription._missingKeepAlives;\n            _unassignedNotifications = subscription._unassignedNotifications;\n            _continuouslyMissingKeepAlives = subscription._continuouslyMissingKeepAlives;\n\n            Initialize();\n            _keepAliveWatcher = _timeProvider.CreateTimer(OnKeepAliveMissing, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            _monitoredItemWatcher = _timeProvider.CreateTimer(OnMonitoredItemWatchdog, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            _resyncTimer = _timeProvider.CreateTimer(OnResync, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n\n            InitializeMetrics();\n            _client.OnSubscriptionCreated(this);\n        }\n\n        /// <summary>\n        /// Copy constructor\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"parentId\"></param>\n        private OpcUaSubscription(OpcUaSubscription subscription, uint parentId)\n        {\n            _options = subscription._options;\n            _loggerFactory = subscription._loggerFactory;\n            _timeProvider = subscription._timeProvider;\n            _client = subscription._client;\n            _metrics = subscription._metrics;\n            _parentId = parentId;\n\n            Template = subscription.Template;\n            Name = subscription.Name;\n\n            SubscriptionId = Opc.Ua.SequenceNumber.Increment32(ref _lastIndex);\n            _logger = _loggerFactory.CreateLogger<OpcUaSubscription>();\n\n            Initialize();\n\n            _keepAliveWatcher = _timeProvider.CreateTimer(OnKeepAliveMissing, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            _monitoredItemWatcher = _timeProvider.CreateTimer(OnMonitoredItemWatchdog, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            _resyncTimer = _timeProvider.CreateTimer(OnResync, null,\n                Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n\n            InitializeMetrics();\n            ResetMonitoredItemWatchdogTimer(PublishingEnabled);\n        }\n\n        /// <inheritdoc/>\n        public override object Clone()\n        {\n            return new OpcUaSubscription(this, true);\n        }\n\n        /// <inheritdoc/>\n        public override Subscription CloneSubscription(bool copyEventHandlers)\n        {\n            return new OpcUaSubscription(this, copyEventHandlers);\n        }\n\n        /// <inheritdoc/>\n        public override string? ToString()\n        {\n            var sb = new StringBuilder()\n                .Append(Id)\n                .Append(':')\n                .Append(SubscriptionId)\n                .Append(':');\n            if (_parentId != null)\n            {\n                sb = sb\n                    .Append(_parentId.Value)\n                    .Append(\"->\");\n            }\n            sb = sb.Append(Name);\n            if (_childId != null)\n            {\n                sb = sb\n                    .Append(\"->\")\n                    .Append(_childId.Value);\n            }\n            return sb.ToString();\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (obj is OpcUaSubscription subscription)\n            {\n                return subscription.Template.Equals(Template) &&\n                    subscription.SubscriptionId == SubscriptionId;\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public bool Equals(OpcUaSubscription? other)\n        {\n            if (other is null)\n            {\n                return false;\n            }\n            return\n                other.Template.Equals(Template) &&\n                other.SubscriptionId == SubscriptionId;\n        }\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return Template.GetHashCode();\n        }\n\n        /// <inheritdoc/>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && !_disposed)\n            {\n                try\n                {\n                    _resyncTimer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                    ResetMonitoredItemWatchdogTimer(false);\n                    _keepAliveWatcher.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n\n                    FastDataChangeCallback = null;\n                    FastEventCallback = null;\n                    FastKeepAliveCallback = null;\n\n                    PublishStatusChanged -= OnPublishStatusChange;\n                    StateChanged -= OnStateChange;\n\n                    var items = CurrentlyMonitored.ToList();\n                    if (items.Count != 0)\n                    {\n                        //\n                        // When the entire session is disposed and recreated we must\n                        // still dispose all monitored items that are remaining\n                        //\n                        items.ForEach(item => item.Dispose());\n                        RemoveItems(MonitoredItems);\n                        Debug.Assert(!CurrentlyMonitored.Any());\n\n                        _logger.SubscriptionDisposedWithItems(this, items.Count);\n                    }\n                    else\n                    {\n                        _logger.SubscriptionDisposed(this);\n                    }\n                }\n                catch (Exception ex)\n                {\n                    _logger.DisposalError(ex, this);\n\n                    // Eat the error\n                }\n                finally\n                {\n                    _disposed = true;\n                    _keepAliveWatcher.Dispose();\n                    _monitoredItemWatcher.Dispose();\n                    _resyncTimer.Dispose();\n                    _meter.Dispose();\n\n                    Handle = null;\n                }\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <inheritdoc/>\n        public async ValueTask DisposeAsync()\n        {\n            //\n            // Called by the management thread to \"close\" the subscription and dispose it.\n            // Note that the session calls dispose again or when it is closed or\n            // reconnected. This here is called when the management thread determines\n            // to gracefully close the subscription.\n            //\n            try\n            {\n                // first close the children\n                var child = GetChildSubscription();\n                if (child != null)\n                {\n                    await child.DisposeAsync().ConfigureAwait(false);\n                }\n\n                if (IsClosed)\n                {\n                    return;\n                }\n\n                Debug.Assert(Session != null);\n\n                ResetKeepAliveTimer();\n                ResetMonitoredItemWatchdogTimer(false);\n\n                // Does not throw\n                await CloseCurrentSubscriptionAsync().ConfigureAwait(false);\n\n                _logger.SubscriptionClosed(this);\n                Debug.Assert(Session == null);\n            }\n            finally\n            {\n                Dispose();\n            }\n        }\n\n        /// <summary>\n        /// Try get the current position in the out stream. This is called\n        /// on all subscriptions in the session and takes child subscriptions\n        /// into account\n        /// </summary>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <returns></returns>\n        internal bool TryGetCurrentPosition(out uint subscriptionId, out uint sequenceNumber)\n        {\n            subscriptionId = Id;\n            sequenceNumber = _currentSequenceNumber;\n            return UseDeferredAcknoledgements;\n        }\n\n        /// <summary>\n        /// Notify session disconnected/reconnecting. This is called\n        /// on all subscriptions in the session and takes child subscriptions\n        /// into account\n        /// </summary>\n        /// <param name=\"disconnected\"></param>\n        /// <returns></returns>\n        internal void NotifySessionConnectionState(bool disconnected)\n        {\n            foreach (var item in CurrentlyMonitored)\n            {\n                item.NotifySessionConnectionState(disconnected);\n            }\n        }\n\n        /// <summary>\n        /// Create a keep alive message\n        /// </summary>\n        /// <returns></returns>\n        internal OpcUaSubscriptionNotification? CreateKeepAlive()\n        {\n            Debug.Assert(IsRoot);\n            if (IsClosed)\n            {\n                _logger.SubscriptionClosedError(this);\n                return null;\n            }\n            try\n            {\n                var session = Session;\n                if (session == null)\n                {\n                    return null;\n                }\n                return new OpcUaSubscriptionNotification(this, session.MessageContext,\n                    Array.Empty<MonitoredItemNotificationModel>(), _timeProvider)\n                {\n                    ApplicationUri = session.Endpoint.Server.ApplicationUri\n                        ?? _client.ApplicationUri,\n                    EndpointUrl = session.Endpoint.EndpointUrl,\n                    SequenceNumber = Opc.Ua.SequenceNumber.Increment32(ref _sequenceNumber),\n                    MessageType = MessageType.KeepAlive\n                };\n            }\n            catch (Exception ex)\n            {\n                _logger.KeepAliveCreateFailed(ex, this);\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Get number of good monitored item for the subscriber across\n        /// this and all child subscriptions\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <returns></returns>\n        internal int GetGoodMonitoredItems(ISubscriber owner)\n        {\n            Debug.Assert(IsRoot);\n            return GetAllMonitoredItems().Count(r => r is OpcUaMonitoredItem h\n                && h.Owner == owner && h.IsGood);\n        }\n\n        /// <summary>\n        /// Get number of bad monitored item for the subscriber across\n        /// this and all child subscriptions\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <returns></returns>\n        internal int GetBadMonitoredItems(ISubscriber owner)\n        {\n            Debug.Assert(IsRoot);\n            return GetAllMonitoredItems().Count(r => r is OpcUaMonitoredItem h\n                && h.Owner == owner && h.IsBad);\n        }\n\n        /// <summary>\n        /// Get number of late monitored item for the subscriber across\n        /// this and all child subscriptions\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <returns></returns>\n        internal int GetLateMonitoredItems(ISubscriber owner)\n        {\n            Debug.Assert(IsRoot);\n            return GetAllMonitoredItems().Count(r => r is OpcUaMonitoredItem h\n                && h.Owner == owner && h.IsLate);\n        }\n\n        /// <summary>\n        /// Get number of enabled heartbeats for the subscriber across\n        /// this and all child subscriptions\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <returns></returns>\n        internal int GetHeartbeatsEnabled(ISubscriber owner)\n        {\n            Debug.Assert(IsRoot);\n            return GetAllMonitoredItems().Count(r => r is OpcUaMonitoredItem.Heartbeat h\n                && h.Owner == owner && h.TimerEnabled);\n        }\n\n        /// <summary>\n        /// Get number of conditions enabled for the subscriber across\n        /// this and all child subscriptions\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <returns></returns>\n        internal int GetConditionsEnabled(ISubscriber owner)\n        {\n            Debug.Assert(IsRoot);\n            return GetAllMonitoredItems().Count(r => r is OpcUaMonitoredItem.Condition h\n                && h.Owner == owner && h.TimerEnabled);\n        }\n\n        /// <summary>\n        /// Collect metadata for the subscriber across this and all child\n        /// subscriptions\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <param name=\"dataSetFieldContentMask\"></param>\n        /// <param name=\"dataSetMetaData\"></param>\n        /// <param name=\"minorVersion\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        internal async ValueTask<PublishedDataSetMetaDataModel> CollectMetaDataAsync(\n            ISubscriber owner, DataSetFieldContentFlags? dataSetFieldContentMask,\n            DataSetMetaDataModel dataSetMetaData, uint minorVersion, CancellationToken ct)\n        {\n            Debug.Assert(IsRoot);\n            if (Session is not OpcUaSession session)\n            {\n                throw ServiceResultException.Create(StatusCodes.BadSessionIdInvalid,\n                    \"Session not connected.\");\n            }\n\n            var typeSystem = await session.GetComplexTypeSystemAsync(ct).ConfigureAwait(false);\n            var dataTypes = new NodeIdDictionary<object>();\n            var fields = new List<PublishedFieldMetaDataModel>();\n\n            await CollectMetaDataAsync(owner, session, typeSystem, dataTypes, fields,\n                ct).ConfigureAwait(false);\n\n            return new PublishedDataSetMetaDataModel\n            {\n                DataSetMetaData =\n                    dataSetMetaData,\n                EnumDataTypes =\n                    dataTypes.Values.OfType<EnumDescriptionModel>().ToList(),\n                StructureDataTypes =\n                    dataTypes.Values.OfType<StructureDescriptionModel>().ToList(),\n                SimpleDataTypes =\n                    dataTypes.Values.OfType<SimpleTypeDescriptionModel>().ToList(),\n                Fields =\n                    fields,\n                MinorVersion =\n                    minorVersion\n            };\n        }\n\n        /// <summary>\n        /// Update subscription configuration and apply changes later during\n        /// synchronization. This is used when the subscription is owned by a\n        /// single subscriber and the configuration is updated.\n        /// </summary>\n        /// <param name=\"template\"></param>\n        internal void Update(SubscriptionModel template)\n        {\n            // Debug.Assert(IsRoot); -- called recursively down to all children.\n\n            Template = template;\n            Name = Template.CreateSubscriptionId();\n\n            GetChildSubscription()?.Update(template);\n        }\n\n        /// <summary>\n        /// Create or update the subscription now using the currently configured\n        /// subscription configuration template.\n        /// </summary>\n        /// <param name=\"maxMonitoredItemsPerSubscription\"></param>\n        /// <param name=\"limits\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        internal async ValueTask SyncAsync(uint? maxMonitoredItemsPerSubscription,\n            OperationLimitsModel limits, CancellationToken ct)\n        {\n            Debug.Assert(IsRoot);\n            if (_disposed)\n            {\n                throw ServiceResultException.Create(StatusCodes.BadUnexpectedError,\n                    \"Subscription was disposed.\");\n            }\n\n            var maxMonitoredItems = maxMonitoredItemsPerSubscription ?? 0u;\n            if (maxMonitoredItems <= 0)\n            {\n                maxMonitoredItems = _options.Value.MaxMonitoredItemPerSubscription\n                    ?? kMaxMonitoredItemPerSubscriptionDefault;\n            }\n\n            Debug.Assert(Session != null);\n            if (Session is not OpcUaSession session)\n            {\n                throw ServiceResultException.Create(StatusCodes.BadUnexpectedError,\n                    \"Session not of expected type.\");\n            }\n\n            var retryDelay = TimeSpan.MaxValue;\n\n            // Force recreate all subscriptions in the chain if needed\n            await ForceRecreateIfNeededAsync(session).ConfigureAwait(false);\n\n            // Parition the monitored items across subscriptions\n            var partitions = Partition.Create(_client.GetSubscribers(Template),\n                maxMonitoredItems, _options.Value);\n\n            var subscriptionPartition = this; // The root is the default\n            for (var partitionIdx = 0; partitionIdx < partitions.Count; partitionIdx++)\n            {\n                // Synchronize the subscription of this partition\n                await subscriptionPartition.SynchronizeSubscriptionAsync(\n                    ct).ConfigureAwait(false);\n\n                // Add partitioned items\n                var partition = partitions[partitionIdx];\n                var delay = await subscriptionPartition.SynchronizeMonitoredItemsAsync(\n                    partition, limits, ct).ConfigureAwait(false);\n                if (retryDelay > delay)\n                {\n                    retryDelay = delay;\n                }\n\n                if (partitionIdx == partitions.Count - 1)\n                {\n                    break;\n                }\n\n                // Get or create a child subscription\n                subscriptionPartition = subscriptionPartition.GetChildSubscription(true);\n                if (subscriptionPartition == null)\n                {\n                    throw ServiceResultException.Create(StatusCodes.BadUnexpectedError,\n                        \"Failed to create child subscription.\");\n                }\n            }\n\n            //\n            // subscription now is the tail or head subscription. We remove\n            // all child subscriptions below it as they are not needed anymore.\n            //\n            var tail = subscriptionPartition;\n            while (tail != null)\n            {\n                tail = tail.GetChildSubscription();\n                if (tail != null)\n                {\n                    await tail.DisposeAsync().ConfigureAwait(false);\n                }\n            }\n            // Snip off here\n            subscriptionPartition._childId = null;\n\n            // Force finalize all subscriptions in the (new) chain if needed\n            await FinalizeSyncAsync(ct).ConfigureAwait(false);\n\n            if (IsRoot && retryDelay > TimeSpan.Zero && retryDelay != TimeSpan.MaxValue)\n            {\n                _resyncTimer.Change(retryDelay, Timeout.InfiniteTimeSpan);\n                _logger.ResyncTimerArmed(retryDelay, this);\n            }\n        }\n\n        /// <summary>\n        /// Force recreate all subscriptions in the chain if needed\n        /// </summary>\n        /// <param name=\"session\"></param>\n        /// <returns></returns>\n        private async Task ForceRecreateIfNeededAsync(OpcUaSession session)\n        {\n            var child = GetChildSubscription();\n            if (child != null)\n            {\n                await child.ForceRecreateIfNeededAsync(session).ConfigureAwait(false);\n            }\n\n            if (!_forceRecreate)\n            {\n                return;\n            }\n\n            _forceRecreate = false;\n            _logger.ClosingAndRecreatingSubscription(this);\n\n            // Does not throw\n            await CloseCurrentSubscriptionAsync().ConfigureAwait(false);\n\n            Debug.Assert(Session == null);\n            session.AddSubscription(this); // Re-add the subscription now\n            Debug.Assert(Session == session);\n        }\n\n        /// <summary>\n        /// Finalize sync of all subscriptions in the chain if needed\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task FinalizeSyncAsync(CancellationToken ct)\n        {\n            var child = GetChildSubscription();\n            if (child != null)\n            {\n                await child.FinalizeSyncAsync(ct).ConfigureAwait(false);\n            }\n\n            if (ChangesPending)\n            {\n                await ApplyChangesAsync(ct).ConfigureAwait(false);\n            }\n\n            var shouldEnable = MonitoredItems\n                .OfType<OpcUaMonitoredItem>()\n                .Any(m => m.AttachedToSubscription\n                    && m.MonitoringMode != Opc.Ua.MonitoringMode.Disabled);\n            if (PublishingEnabled ^ shouldEnable)\n            {\n                await SetPublishingModeAsync(shouldEnable, ct).ConfigureAwait(false);\n\n                _logger.StateSubscriptionSession(\n                    shouldEnable ? \"Enabled\" : \"Disabled\", this, (OpcUaSession)Session);\n\n                ResetMonitoredItemWatchdogTimer(shouldEnable);\n            }\n        }\n\n        /// <summary>\n        /// Get a subscription with the supplied configuration (no lock)\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private async ValueTask SynchronizeSubscriptionAsync(CancellationToken ct)\n        {\n            if (Handle == null)\n            {\n                Handle = SubscriptionId; // Initialized for the first time\n                DisplayName = Name + SubscriptionId;\n                PublishingEnabled = EnableImmediatePublishing;\n                KeepAliveCount = DesiredKeepAliveCount;\n                PublishingInterval = (int)DesiredPublishingInterval.TotalMilliseconds;\n                MaxNotificationsPerPublish = DesiredMaxNotificationsPerPublish;\n                LifetimeCount = DesiredLifetimeCount;\n                Priority = DesiredPriority;\n\n                // TODO: use a channel and reorder task before calling OnMessage\n                // to order or else republish is called too often\n                RepublishAfterTransfer = DesiredRepublishAfterTransfer;\n                SequentialPublishing = EnableSequentialPublishing;\n\n                _logger.CreatingSubscription(\n                     PublishingEnabled ? \"enabled\" : \"disabled\", this, (OpcUaSession)Session);\n\n                Debug.Assert(Session != null);\n                await CreateAsync(ct).ConfigureAwait(false);\n                if (!Created)\n                {\n                    Handle = null;\n                    var session = Session;\n                    await session.RemoveSubscriptionAsync(this, ct).ConfigureAwait(false);\n                    Debug.Assert(Session == null);\n                    throw new ServiceResultException(StatusCodes.BadSubscriptionIdInvalid,\n                        $\"Failed to create subscription {this} in session {session}\");\n                }\n\n                ResetMonitoredItemWatchdogTimer(PublishingEnabled);\n                _logger.RevisedValuesDuringCreate(this,\n                    CurrentPublishingEnabled, PublishingEnabled,\n                    (int)CurrentPublishingInterval, (int)PublishingInterval,\n                    CurrentKeepAliveCount, KeepAliveCount,\n                    CurrentLifetimeCount, LifetimeCount);\n                Debug.Assert(Id != 0);\n                Debug.Assert(Created);\n\n                _firstDataChangeReceived = false;\n            }\n            else\n            {\n                //\n                // Only needed when we reconfiguring a subscription with a single subscriber\n                // This is not yet implemented.\n                // TODO: Consider removing...\n                //\n\n                // Apply new configuration on configuration on original subscription\n                var modifySubscription = false;\n\n                if (DesiredKeepAliveCount != KeepAliveCount)\n                {\n                    _logger.KeepAliveCountChanged(DesiredKeepAliveCount, this);\n\n                    KeepAliveCount = DesiredKeepAliveCount;\n                    modifySubscription = true;\n                }\n\n                if (PublishingInterval != (int)DesiredPublishingInterval.TotalMilliseconds)\n                {\n                    _logger.PublishingIntervalChanged(DesiredPublishingInterval, this);\n                    PublishingInterval = (int)DesiredPublishingInterval.TotalMilliseconds;\n                    modifySubscription = true;\n                }\n\n                if (MaxNotificationsPerPublish != DesiredMaxNotificationsPerPublish)\n                {\n                    _logger.MaxNotificationsPerPublishChanged(DesiredMaxNotificationsPerPublish, this);\n                    MaxNotificationsPerPublish = DesiredMaxNotificationsPerPublish;\n                    modifySubscription = true;\n                }\n\n                if (LifetimeCount != DesiredLifetimeCount)\n                {\n                    _logger.LifetimeCountChanged(\n                        DesiredLifetimeCount, this);\n                    LifetimeCount = DesiredLifetimeCount;\n                    modifySubscription = true;\n                }\n                if (Priority != DesiredPriority)\n                {\n                    _logger.PriorityChanged(\n                        DesiredPriority, this);\n                    Priority = DesiredPriority;\n                    modifySubscription = true;\n                }\n                if (modifySubscription)\n                {\n                    await ModifyAsync(ct).ConfigureAwait(false);\n                    _logger.SubscriptionModified(this, (OpcUaSession)Session);\n                    _logger.RevisedValuesDuringModify(this,\n                        CurrentPublishingEnabled, PublishingEnabled,\n                        (int)CurrentPublishingInterval, (int)PublishingInterval,\n                        CurrentKeepAliveCount, KeepAliveCount,\n                        CurrentLifetimeCount, LifetimeCount);\n                    ResetMonitoredItemWatchdogTimer(PublishingEnabled);\n                }\n            }\n            ResetKeepAliveTimer();\n        }\n\n        /// <summary>\n        /// Synchronize partition of monitored items into this subscription\n        /// </summary>\n        /// <param name=\"partition\"></param>\n        /// <param name=\"operationLimits\"></param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private async ValueTask<TimeSpan> SynchronizeMonitoredItemsAsync(\n            Partition partition, OperationLimitsModel operationLimits, CancellationToken ct)\n        {\n            if (Session is not OpcUaSession session)\n            {\n                throw ServiceResultException.Create(StatusCodes.BadSessionIdInvalid,\n                    \"Session not connected.\");\n            }\n\n            // Get the items assigned to this subscription.\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var desired = OpcUaMonitoredItem\n                .Create(_client, partition.Items, _loggerFactory, _timeProvider)\n                .ToHashSet();\n#pragma warning restore CA2000 // Dispose objects before losing scope\n\n            var previouslyMonitored = CurrentlyMonitored.ToHashSet();\n            var remove = previouslyMonitored.Except(desired).ToHashSet();\n            var add = desired.Except(previouslyMonitored).ToHashSet();\n            var same = previouslyMonitored.ToHashSet();\n            var errorsDuringSync = 0;\n            same.IntersectWith(desired);\n\n            //\n            // Resolve the browse paths for all nodes first.\n            //\n            // We shortcut this only through the added items since the identity (hash)\n            // of the monitored item is dependent on the node and browse path, so any\n            // update of either results in a newly added monitored item and the old\n            // one removed.\n            //\n            var allResolvers = add\n                .Select(a => a.Resolve)\n                .Where(a => a != null);\n            foreach (var resolvers in allResolvers.Batch(\n                operationLimits.GetMaxNodesPerTranslatePathsToNodeIds()))\n            {\n                var response = await session.Services.TranslateBrowsePathsToNodeIdsAsync(\n                    new RequestHeader(), new BrowsePathCollection(resolvers\n                        .Select(a => new BrowsePath\n                        {\n                            StartingNode = a!.Value.NodeId.ToNodeId(\n                                session.MessageContext),\n                            RelativePath = a.Value.Path.ToRelativePath(\n                                session.MessageContext)\n                        })), ct).ConfigureAwait(false);\n\n                var results = response.Validate(response.Results, s => s.StatusCode,\n                    response.DiagnosticInfos, resolvers);\n                if (results.ErrorInfo != null)\n                {\n                    // Could not do anything...\n                    _logger.BrowsePathResolveFailed(this, results.ErrorInfo);\n                    throw ServiceResultException.Create(results.ErrorInfo.StatusCode,\n                        results.ErrorInfo.ErrorMessage ?? \"Failed to resolve browse paths\");\n                }\n\n                foreach (var result in results)\n                {\n                    var resolvedId = NodeId.Null;\n                    if (result.ErrorInfo == null && result.Result.Targets.Count == 1)\n                    {\n                        resolvedId = result.Result.Targets[0].TargetId.ToNodeId(\n                            session.MessageContext.NamespaceUris);\n                        result.Request!.Value.Update(resolvedId, session.MessageContext);\n                    }\n                    else\n                    {\n                        _logger.BrowsePathForNodeResolveFailed(result.Request!.Value.NodeId, this, result.ErrorInfo);\n                        errorsDuringSync++;\n                    }\n                }\n            }\n\n            //\n            // If retrieving paths for all the items from the root folder was configured do so\n            // now. All items that fail here should be retried later.\n            //\n            if (ResolveBrowsePathFromRoot)\n            {\n                var allGetPaths = add\n                    .Select(a => a.GetPath)\n                    .Where(a => a != null);\n                var pathsRetrieved = 0;\n                foreach (var getPathsBatch in allGetPaths.Batch(10000))\n                {\n                    var getPath = getPathsBatch.ToList();\n                    var paths = await session.GetBrowsePathsFromRootAsync(new RequestHeader(),\n                        getPath.Select(n => n!.Value.NodeId.ToNodeId(session.MessageContext)),\n                        ct).ConfigureAwait(false);\n                    for (var index = 0; index < paths.Count; index++)\n                    {\n                        getPath[index]!.Value.Update(paths[index].Path, session.MessageContext);\n                        if (paths[index].ErrorInfo != null)\n                        {\n                            _logger.RootPathResolveFailed(getPath[index]!.Value.NodeId, this, paths[index].ErrorInfo);\n                        }\n                        else\n                        {\n                            pathsRetrieved++;\n                        }\n                    }\n                }\n                if (pathsRetrieved > 0)\n                {\n                    _logger.PathsRetrieved(pathsRetrieved, this);\n                }\n            }\n\n            //\n            // Register nodes for reading if needed. This is needed anytime the session\n            // changes as the registration is only valid in the context of the session\n            //\n            var allRegistrations = add.Concat(same)\n                .Select(a => a.Register)\n                .Where(a => a != null);\n            foreach (var registrations in allRegistrations.Batch(\n                operationLimits.GetMaxNodesPerRegisterNodes()))\n            {\n                var response = await session.Services.RegisterNodesAsync(\n                    new RequestHeader(), new NodeIdCollection(registrations\n                        .Select(a => a!.Value.NodeId.ToNodeId(session.MessageContext))),\n                    ct).ConfigureAwait(false);\n                foreach (var (First, Second) in response.RegisteredNodeIds.Zip(registrations))\n                {\n                    Debug.Assert(Second != null);\n                    if (!NodeId.IsNull(First))\n                    {\n                        Second.Value.Update(First, session.MessageContext);\n                    }\n                }\n            }\n\n            var metadataChanged = new HashSet<ISubscriber>();\n            var applyChanges = false;\n            var updated = 0;\n\n            foreach (var toUpdate in same)\n            {\n                if (!desired.TryGetValue(toUpdate, out var theDesiredUpdate))\n                {\n                    errorsDuringSync++;\n                    continue;\n                }\n                desired.Remove(theDesiredUpdate);\n                Debug.Assert(toUpdate.GetType() == theDesiredUpdate.GetType());\n                Debug.Assert(toUpdate.Subscription == this);\n                try\n                {\n                    if (toUpdate.MergeWith(theDesiredUpdate, session, out var metadata))\n                    {\n                        _logger.UpdatingMonitoredItem(toUpdate, this);\n                        if (toUpdate.FinalizeMergeWith != null && metadata)\n                        {\n                            await toUpdate.FinalizeMergeWith(session, ct).ConfigureAwait(false);\n                        }\n                        updated++;\n                        applyChanges = true;\n                    }\n                    if (metadata)\n                    {\n                        metadataChanged.Add(toUpdate.Owner);\n                    }\n                }\n                catch (Exception ex)\n                {\n                    _logger.MonitoredItemUpdateFailed(ex, toUpdate, this);\n                    errorsDuringSync++;\n                }\n                finally\n                {\n                    theDesiredUpdate.Dispose();\n                }\n            }\n\n            var removed = 0;\n            foreach (var toRemove in remove)\n            {\n                Debug.Assert(toRemove.Subscription == this);\n                try\n                {\n                    if (toRemove.RemoveFrom(this, out var metadata))\n                    {\n                        _logger.RemovingMonitoredItem(toRemove, this);\n                        removed++;\n                        applyChanges = true;\n                    }\n                    if (metadata)\n                    {\n                        metadataChanged.Add(toRemove.Owner);\n                    }\n                }\n                catch (Exception ex)\n                {\n                    _logger.MonitoredItemRemoveFailed(ex, toRemove, this);\n                    errorsDuringSync++;\n                }\n            }\n\n            var added = 0;\n            foreach (var toAdd in add)\n            {\n                desired.Remove(toAdd);\n                Debug.Assert(toAdd.Subscription == null);\n                try\n                {\n                    if (toAdd.AddTo(this, session, out var metadata))\n                    {\n                        _logger.AddingMonitoredItem(toAdd, this);\n\n                        if (toAdd.FinalizeAddTo != null && metadata)\n                        {\n                            await toAdd.FinalizeAddTo(session, ct).ConfigureAwait(false);\n                        }\n                        added++;\n                        applyChanges = true;\n                    }\n                    if (metadata)\n                    {\n                        metadataChanged.Add(toAdd.Owner);\n                    }\n                }\n                catch (Exception ex)\n                {\n                    _logger.MonitoredItemAddFailed(ex, toAdd, this);\n                    errorsDuringSync++;\n                }\n            }\n\n            Debug.Assert(desired.Count == 0, \"We should have processed all desired updates.\");\n\n            if (applyChanges)\n            {\n                await ApplyChangesAsync(ct).ConfigureAwait(false);\n                if (MonitoredItemCount == 0 && !EnableImmediatePublishing)\n                {\n                    await SetPublishingModeAsync(false, ct).ConfigureAwait(false);\n\n                    _logger.DisabledEmptySubscription(this, session);\n\n                    ResetMonitoredItemWatchdogTimer(false);\n                }\n            }\n\n            // Perform second pass over all monitored items and complete.\n            applyChanges = false;\n            var badMonitoredItems = 0;\n\n            var desiredMonitoredItems = same;\n            desiredMonitoredItems.UnionWith(add);\n\n            //\n            // Resolve display names for all nodes that still require a name\n            // other than the node id string.\n            //\n            // Note that we use the desired set here and update the display\n            // name after AddTo/MergeWith as it only effects the messages\n            // and metadata emitted and not the item as it is set up in the\n            // subscription (like what we do when resolving nodes). This\n            // supports the scenario where the user sets a desired display\n            // name of null to force reading the display name from the node\n            // and updating the existing display name (previously set) and\n            // at the same time is quite effective to only update what is\n            // necessary.\n            //\n            var allDisplayNameUpdates = desiredMonitoredItems\n                .Select(a => (a.Owner, a.GetDisplayName))\n                .Where(a => a.GetDisplayName.HasValue)\n                .ToList();\n            if (allDisplayNameUpdates.Count > 0)\n            {\n                foreach (var displayNameUpdates in allDisplayNameUpdates.Batch(\n                    operationLimits.GetMaxNodesPerRead()))\n                {\n                    var response = await session.Services.ReadAsync(new RequestHeader(),\n                        0, Opc.Ua.TimestampsToReturn.Neither, new ReadValueIdCollection(\n                        displayNameUpdates.Select(a => new ReadValueId\n                        {\n                            NodeId = a.GetDisplayName!.Value.NodeId.ToNodeId(session.MessageContext),\n                            AttributeId = (uint)NodeAttribute.DisplayName\n                        })), ct).ConfigureAwait(false);\n                    var results = response.Validate(response.Results,\n                        s => s.StatusCode, response.DiagnosticInfos, displayNameUpdates);\n\n                    if (results.ErrorInfo != null)\n                    {\n                        _logger.DisplayNameResolveFailed(this, results.ErrorInfo);\n\n                        // We will retry later.\n                        errorsDuringSync++;\n                    }\n                    else\n                    {\n                        foreach (var result in results)\n                        {\n                            string? displayName = null;\n                            if (result.Result.Value is not null)\n                            {\n                                displayName =\n                                    (result.Result.Value as LocalizedText)?.ToString();\n                                metadataChanged.Add(result.Request.Owner);\n                            }\n                            else\n                            {\n                                _logger.DisplayNameReadFailed(\n                                    result.Request.GetDisplayName!.Value.NodeId,\n                                    this, result.ErrorInfo);\n                            }\n                            result.Request.GetDisplayName!.Value.Update(\n                                displayName ?? string.Empty);\n                        }\n                    }\n                }\n            }\n\n            _logger.CompletingItems(desiredMonitoredItems.Count, remove.Count, this);\n            var errors = new List<(string Item, StatusCode Error, bool Report)>();\n            foreach (var monitoredItem in desiredMonitoredItems.Concat(remove))\n            {\n                if (!monitoredItem.TryCompleteChanges(this, ref applyChanges))\n                {\n                    if (add.Contains(monitoredItem) || same.Contains(monitoredItem))\n                    {\n                        errors.Add((monitoredItem.ToString(),\n                            monitoredItem.Status?.Error?.StatusCode ?? StatusCodes.BadMonitoredItemIdInvalid,\n                            !monitoredItem.ErrorReported));\n                        monitoredItem.ErrorReported = true;\n                    }\n                    // Apply more changes in future passes\n                    badMonitoredItems++;\n                }\n            }\n\n            // Dump errors in a concise way all at once\n            foreach (var errorGroup in errors.GroupBy(e => e.Error))\n            {\n                var errorItems = errorGroup\n                    .Where(e => e.Report)\n                    .Select(e => e.Item)\n                    .ToArray();\n                if (errorItems.Length > 0)\n                {\n                    _logger.ErrorAddingMonitoredItemsWithErrors(errorGroup.Key.ToString(), errorGroup.Count(),\n                        SubscriptionId, string.Join(\"\\n    \", errorItems));\n                }\n                else\n                {\n                    _logger.ErrorAddingMonitoredItems(errorGroup.Key.ToString(), errorGroup.Count(),\n                        SubscriptionId);\n                }\n            }\n\n            Debug.Assert(remove.All(m => !m.AttachedToSubscription),\n                \"All removed items should be detached now\");\n            var set = desiredMonitoredItems.Where(m => m.Valid).ToList();\n            _logger.ItemCompletionStats(set.Count, desiredMonitoredItems.Count - set.Count, this);\n\n            var finalize = set\n                .Where(i => i.FinalizeCompleteChanges != null)\n                .Select(i => i.FinalizeCompleteChanges!(ct))\n                .ToArray();\n            if (finalize.Length > 0)\n            {\n                await Task.WhenAll(finalize).ConfigureAwait(false);\n            }\n\n            _sendFakeKeepAlives = partition.Items.Select(m => m.Item1).Distinct().Count() > 1;\n            if (applyChanges)\n            {\n                // Apply any additional changes\n                await ApplyChangesAsync(ct).ConfigureAwait(false);\n            }\n\n            Debug.Assert(set.Select(m => m.ClientHandle).Distinct().Count() == set.Count,\n                \"Client handles are not distinct or one of the items is null\");\n\n            _logger.SettingMonitoringMode(set.Count, this);\n\n            //\n            // Finally change the monitoring mode as required. Batch the requests\n            // on the update of monitored item state from monitored items. On AddTo\n            // the monitoring mode was already configured. This is for updates as\n            // they are not applied through ApplyChanges\n            //\n            foreach (var change in set.GroupBy(i => i.GetMonitoringModeChange()))\n            {\n                if (change.Key == null)\n                {\n                    // Not a valid item\n                    continue;\n                }\n\n                foreach (var itemsBatch in change.Batch(\n                    operationLimits.GetMaxMonitoredItemsPerCall()))\n                {\n                    var itemsToChange = itemsBatch.Cast<MonitoredItem>().ToList();\n                    _logger.MonitoringModeSet(change.Key.Value, itemsToChange.Count, this);\n\n                    var results = await SetMonitoringModeAsync(change.Key.Value,\n                        itemsToChange, ct).ConfigureAwait(false);\n                    if (results != null)\n                    {\n                        var erroneousResultsCount = results\n                            .Count(r => r != null && StatusCode.IsNotGood(r.StatusCode));\n\n                        // Check the number of erroneous results and log.\n                        if (erroneousResultsCount > 0)\n                        {\n                            _logger.MonitoringSetFailed(erroneousResultsCount, this);\n                            for (var i = 0; i < results.Count && i < itemsToChange.Count; ++i)\n                            {\n                                if (StatusCode.IsNotGood(results[i].StatusCode))\n                                {\n                                    _logger.MonitoringSetFailedForItem(itemsToChange[i].StartNodeId,\n                                        this, results[i].StatusCode);\n                                }\n                            }\n                            // Retry later\n                            errorsDuringSync++;\n                        }\n                    }\n                }\n            }\n\n            finalize = set\n                .Where(i => i.FinalizeMonitoringModeChange != null)\n                .Select(i => i.FinalizeMonitoringModeChange!(ct))\n                .ToArray();\n            if (finalize.Length > 0)\n            {\n                await Task.WhenAll(finalize).ConfigureAwait(false);\n            }\n\n            // Cleanup all items that are not in the currently monitoring list\n            var dispose = previouslyMonitored\n                .Except(set)\n                .ToList();\n            dispose.ForEach(m => m.Dispose());\n\n            // Notify semantic change now that we have update the monitored items\n            var notifySemanticChange = metadataChanged\n                .Select(o => o.OnMonitoredItemSemanticsChangedAsync(ct))\n                .ToArray();\n            if (notifySemanticChange.Length > 0)\n            {\n                await Task.WhenAll(notifySemanticChange).ConfigureAwait(false);\n            }\n\n            // Refresh condition\n            if (set.OfType<OpcUaMonitoredItem.Condition>().Any())\n            {\n                _logger.IssuingConditionRefresh(this);\n                try\n                {\n                    await ConditionRefreshAsync(ct).ConfigureAwait(false);\n                    _logger.ConditionRefreshCompleted(this);\n                }\n                catch (Exception e)\n                {\n                    _logger.ConditionRefreshFailed(this, e.Message);\n                    errorsDuringSync++;\n                }\n            }\n\n            set.ForEach(item => item.LogRevisedSamplingRateAndQueueSize());\n\n            var goodMonitoredItems =\n                Math.Max(set.Count - badMonitoredItems, 0);\n            var reportingItems = set\n                .Count(r => r.Status?.MonitoringMode == Opc.Ua.MonitoringMode.Reporting);\n            var disabledItems = set\n                .Count(r => r.Status?.MonitoringMode == Opc.Ua.MonitoringMode.Disabled);\n            var samplingItems = set\n                .Count(r => r.Status?.MonitoringMode == Opc.Ua.MonitoringMode.Sampling);\n            var notAppliedItems = set\n                .Count(r => r.Status?.MonitoringMode != r.MonitoringMode);\n            var heartbeatItems = set\n                .Count(r => r is OpcUaMonitoredItem.Heartbeat);\n            var conditionItems = set\n                .Count(r => r is OpcUaMonitoredItem.Condition);\n            var heartbeatsEnabled = set\n                .Count(r => r is OpcUaMonitoredItem.Heartbeat h && h.TimerEnabled);\n            var conditionsEnabled = set\n                .Count(r => r is OpcUaMonitoredItem.Condition h && h.TimerEnabled);\n\n            var resyncCounter = Interlocked.Increment(ref _resyncCounter);\n            var resyncTotal = Interlocked.Increment(ref _resyncTotal);\n\n            ReportMonitoredItemChanges(set.Count, goodMonitoredItems, badMonitoredItems,\n                errorsDuringSync, notAppliedItems, reportingItems, disabledItems, heartbeatItems,\n                heartbeatsEnabled, conditionItems, conditionsEnabled, samplingItems,\n                dispose.Count, resyncCounter, resyncTotal);\n\n            // Set up subscription management trigger\n            if (badMonitoredItems != 0 || errorsDuringSync != 0)\n            {\n                // There were items that could not be added to subscription\n                return Delay(_options.Value.InvalidMonitoredItemRetryDelayDuration,\n                    TimeSpan.FromMinutes(5),\n                    _options.Value.InvalidMonitoredItemRetryDelayDurationMax,\n                    resyncCounter);\n            }\n            else if (desiredMonitoredItems.Count != set.Count)\n            {\n                // There were items !Valid but desired.\n                return Delay(_options.Value.BadMonitoredItemRetryDelayDuration,\n                    TimeSpan.FromMinutes(30),\n                    _options.Value.InvalidMonitoredItemRetryDelayDurationMax,\n                    resyncCounter);\n            }\n            else\n            {\n                // Nothing to do\n                resyncCounter = 0;\n                return Delay(_options.Value.SubscriptionManagementIntervalDuration,\n                    TimeSpan.MaxValue);\n            }\n        }\n\n        /// <summary>\n        /// Initialize state\n        /// </summary>\n        private void Initialize()\n        {\n            FastKeepAliveCallback = OnSubscriptionKeepAliveNotification;\n            FastDataChangeCallback = OnSubscriptionDataChangeNotification;\n            FastEventCallback = OnSubscriptionEventNotificationList;\n            PublishStatusChanged += OnPublishStatusChange;\n            StateChanged += OnStateChange;\n\n            TimestampsToReturn = Opc.Ua.TimestampsToReturn.Both;\n            DisableMonitoredItemCache = true;\n        }\n\n        /// <summary>\n        /// Get child subscription\n        /// </summary>\n        /// <param name=\"createIfNotExist\"></param>\n        /// <returns></returns>\n        private OpcUaSubscription? GetChildSubscription(bool createIfNotExist = false)\n        {\n            if (Session is OpcUaSession session)\n            {\n                if (_childId.HasValue &&\n                    session.SubscriptionHandles.TryGetValue(_childId.Value,\n                    out var subscription))\n                {\n                    // Found entry\n                    return subscription;\n                }\n\n                if (createIfNotExist)\n                {\n                    subscription = new OpcUaSubscription(this, parentId: SubscriptionId);\n                    _childId = subscription.SubscriptionId;\n                    session.AddSubscription(subscription);\n                    return subscription;\n                }\n\n                if (_childId != null)\n                {\n                    _logger.ChildSubscriptionNotFound(_childId, session);\n                }\n                _childId = null;\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Get all monitored items încluding all child subscriptions.\n        /// This call is used to collect all items recursively.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <returns></returns>\n        private IEnumerable<OpcUaMonitoredItem> GetAllMonitoredItems(\n            IEnumerable<OpcUaMonitoredItem>? parent = null)\n        {\n            parent ??= [];\n\n            parent = parent.Concat(CurrentlyMonitored);\n\n            var child = GetChildSubscription();\n            if (child != null)\n            {\n                // Recursively concat the items of all children\n                parent = child.GetAllMonitoredItems(parent);\n            }\n            return parent;\n        }\n\n        /// <summary>\n        /// Collect metadata across this and all child subscriptions\n        /// recursively from parent to child to child and so on.\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <param name=\"session\"></param>\n        /// <param name=\"typeSystem\"></param>\n        /// <param name=\"dataTypes\"></param>\n        /// <param name=\"fields\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private async Task CollectMetaDataAsync(ISubscriber owner, OpcUaSession session,\n            ComplexTypeSystem? typeSystem, NodeIdDictionary<object> dataTypes,\n            List<PublishedFieldMetaDataModel> fields, CancellationToken ct)\n        {\n            foreach (var monitoredItem in CurrentlyMonitored.Where(m => m.Owner == owner))\n            {\n                await monitoredItem.GetMetaDataAsync(session, typeSystem,\n                    fields, dataTypes, ct).ConfigureAwait(false);\n            }\n\n            var child = GetChildSubscription();\n            if (child != null)\n            {\n                await child.CollectMetaDataAsync(owner,\n                    session, typeSystem, dataTypes, fields, ct).ConfigureAwait(false);\n            }\n        }\n\n        /// <summary>\n        /// Close subscription\n        /// </summary>\n        /// <returns></returns>\n        private async Task CloseCurrentSubscriptionAsync()\n        {\n            ResetKeepAliveTimer();\n            try\n            {\n                Handle = null; // Mark as closed\n\n                _logger.ClosingSubscription(this);\n\n                // Dispose all monitored items\n                var items = CurrentlyMonitored.ToList();\n\n                RemoveItems(MonitoredItems);\n                _currentSequenceNumber = 0;\n                _goodMonitoredItems = 0;\n                _badMonitoredItems = 0;\n                _resyncCounter = 0;\n                _reportingItems = 0;\n                _disabledItems = 0;\n                _samplingItems = 0;\n                _notAppliedItems = 0;\n\n                ResetMonitoredItemWatchdogTimer(false);\n\n                await Try.Async(() => SetPublishingModeAsync(false, default)).ConfigureAwait(false);\n                await Try.Async(() => DeleteItemsAsync(default)).ConfigureAwait(false);\n                await Try.Async(() => ApplyChangesAsync(default)).ConfigureAwait(false);\n\n                items.ForEach(item => item.Dispose());\n                _logger.DeletedMonitoredItems(items.Count, this);\n\n                await Try.Async(() => DeleteAsync(true, default)).ConfigureAwait(false);\n\n                if (Session != null)\n                {\n                    await Session.RemoveSubscriptionAsync(this).ConfigureAwait(false);\n                }\n                Debug.Assert(Session == null, \"Subscription should not be part of session\");\n                Debug.Assert(!CurrentlyMonitored.Any(), \"Not all items removed.\");\n\n                _client.OnSubscriptionClosed(this);\n                _logger.SubscriptionClosed2(this);\n            }\n            catch (Exception e)\n            {\n                _logger.FailedToClose(e, this);\n            }\n        }\n\n        /// <summary>\n        /// Report monitored item changes\n        /// </summary>\n        /// <param name=\"count\"></param>\n        /// <param name=\"goodMonitoredItems\"></param>\n        /// <param name=\"badMonitoredItems\"></param>\n        /// <param name=\"errorsDuringSync\"></param>\n        /// <param name=\"notAppliedItems\"></param>\n        /// <param name=\"reportingItems\"></param>\n        /// <param name=\"disabledItems\"></param>\n        /// <param name=\"heartbeatItems\"></param>\n        /// <param name=\"heartbeatsEnabled\"></param>\n        /// <param name=\"conditionItems\"></param>\n        /// <param name=\"conditionsEnabled\"></param>\n        /// <param name=\"samplingItems\"></param>\n        /// <param name=\"disposed\"></param>\n        /// <param name=\"resyncCounter\"></param>\n        /// <param name=\"resyncTotal\"></param>\n        private void ReportMonitoredItemChanges(int count,\n            int goodMonitoredItems, int badMonitoredItems,\n            int errorsDuringSync, int notAppliedItems,\n            int reportingItems, int disabledItems,\n            int heartbeatItems, int heartbeatsEnabled,\n            int conditionItems, int conditionsEnabled,\n            int samplingItems, int disposed,\n            int resyncCounter, int resyncTotal)\n        {\n            if (_badMonitoredItems != badMonitoredItems ||\n                _errorsDuringSync != errorsDuringSync ||\n                _goodMonitoredItems != goodMonitoredItems ||\n                _reportingItems != reportingItems ||\n                _disabledItems != disabledItems ||\n                _samplingItems != samplingItems ||\n                _notAppliedItems != notAppliedItems ||\n                _heartbeatItems != heartbeatItems ||\n                _conditionItems != conditionItems)\n            {\n                if (samplingItems == 0 && heartbeatItems == 0 && conditionItems == 0 &&\n                    notAppliedItems == 0)\n                {\n                    if (errorsDuringSync == 0 && disabledItems == 0)\n                    {\n                        _logger.SubscriptionReportState(this, resyncCounter,\n                            resyncTotal, disposed, count,\n                            goodMonitoredItems, badMonitoredItems, reportingItems);\n                    }\n                    else\n                    {\n                        _logger.SubscriptionReportStateWithErrors(this, resyncCounter,\n                            resyncTotal, disposed, count,\n                            goodMonitoredItems, badMonitoredItems, reportingItems,\n                            disabledItems, errorsDuringSync);\n                    }\n                }\n                else\n                {\n                    _logger.SubscriptionReportStateFull(this, resyncCounter, resyncTotal,\n                        disposed, count,\n                        goodMonitoredItems, badMonitoredItems, reportingItems,\n                        disabledItems, errorsDuringSync, notAppliedItems,\n                        samplingItems, heartbeatItems, heartbeatsEnabled,\n                        conditionItems, conditionsEnabled);\n                }\n            }\n            else\n            {\n                _logger.SubscriptionNoMonitoredItemChange(this, resyncCounter, resyncTotal);\n            }\n\n            _badMonitoredItems = badMonitoredItems;\n            _errorsDuringSync = errorsDuringSync;\n            _goodMonitoredItems = goodMonitoredItems;\n            _reportingItems = reportingItems;\n            _disabledItems = disabledItems;\n            _samplingItems = samplingItems;\n            _notAppliedItems = notAppliedItems;\n            _heartbeatItems = heartbeatItems;\n            _conditionItems = conditionItems;\n        }\n\n        /// <summary>\n        /// Calculate delay\n        /// </summary>\n        /// <param name=\"delay\"></param>\n        /// <param name=\"defaultDelay\"></param>\n        /// <param name=\"maxDelay\"></param>\n        /// <param name=\"counter\"></param>\n        /// <returns></returns>\n        private static TimeSpan Delay(TimeSpan? delay, TimeSpan defaultDelay,\n            TimeSpan? maxDelay = null, int counter = 1)\n        {\n            if (delay == null)\n            {\n                return defaultDelay;\n            }\n            if (delay == TimeSpan.Zero)\n            {\n                return TimeSpan.MaxValue;\n            }\n\n            var minDelay = delay.Value;\n            // If the delay is negative we consider it to mean exponential backoff\n            if (minDelay < TimeSpan.Zero)\n            {\n                minDelay = TimeSpan.FromMilliseconds(-minDelay.TotalMilliseconds);\n            }\n\n            //\n            // Otherwise if the max delay is not set, and min delay larger than 10\n            // seconds we consider it to mean constant retry (old behavior)\n            //\n            else if (maxDelay == null && minDelay > kMaxExponentialRetryDelayDefault)\n            {\n                return minDelay;\n            }\n\n            var max = maxDelay ?? defaultDelay;\n\n            //\n            // If the max configured is below the delay configured then we also\n            // consider this to mean retry every x seconds (we do not need to calc\n            // an exponential retry\n            //\n            if (max <= minDelay)\n            {\n                return minDelay;\n            }\n\n            //\n            // If the max delay is smaller than 10 seconds, we set it to 10 seconds\n            // to avoid constant thrashing\n            //\n            if (max < kMaxExponentialRetryDelayDefault)\n            {\n                // Do not allow a max below 10 seconds\n                max = kMaxExponentialRetryDelayDefault;\n            }\n\n            // Calculate the exponential backoff - no need to add jitter.\n            var backoff = (int)Math.Pow(2, Math.Min(counter, 10));\n            var calculated = TimeSpan.FromTicks(minDelay.Ticks * backoff);\n            return calculated > max ? max : calculated;\n        }\n\n        /// <summary>\n        /// Send notification\n        /// </summary>\n        /// <param name=\"callback\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"notifications\"></param>\n        /// <param name=\"eventTypeName\"></param>\n        /// <param name=\"diagnosticsOnly\"></param>\n        /// <param name=\"timestamp\"></param>\n        internal void SendNotification(ISubscriber callback, MessageType messageType,\n            IList<MonitoredItemNotificationModel> notifications,\n            string? eventTypeName, bool diagnosticsOnly, DateTimeOffset? timestamp)\n        {\n            var curSession = Session;\n            var messageContext = curSession?.MessageContext;\n\n            if (messageContext == null)\n            {\n                _logger.UsingThreadContext();\n                messageContext = ServiceMessageContext.ThreadContext;\n            }\n\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var message = new OpcUaSubscriptionNotification(this, messageContext, notifications,\n                _timeProvider, createdTimestamp: timestamp)\n            {\n                ApplicationUri = curSession?.Endpoint?.Server?.ApplicationUri\n                    ?? _client.ApplicationUri,\n                EndpointUrl = curSession?.Endpoint?.EndpointUrl,\n                EventTypeName = eventTypeName,\n                SequenceNumber = Opc.Ua.SequenceNumber.Increment32(ref _sequenceNumber),\n                MessageType = messageType\n            };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n\n            var count = message.GetDiagnosticCounters(out var modelChanges,\n                out var heartbeats, out var overflows);\n            if (messageType == MessageType.Event || messageType == MessageType.Condition)\n            {\n                if (!diagnosticsOnly)\n                {\n                    callback.OnSubscriptionEventReceived(message);\n                }\n                if (count > 0)\n                {\n                    callback.OnSubscriptionEventDiagnosticsChange(false,\n                        count, overflows, modelChanges == 0 ? 0 : 1);\n                }\n            }\n            else\n            {\n                if (!diagnosticsOnly)\n                {\n                    callback.OnSubscriptionDataChangeReceived(message);\n                }\n                if (count > 0)\n                {\n                    callback.OnSubscriptionDataDiagnosticsChange(false,\n                        count, overflows, heartbeats);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handle event notification. Depending on the sequential publishing setting\n        /// this will be called in order and thread safe or from different threads.\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"notification\"></param>\n        /// <param name=\"stringTable\"></param>\n        private void OnSubscriptionEventNotificationList(Subscription subscription,\n            EventNotificationList notification, IList<string>? stringTable)\n        {\n            Debug.Assert(ReferenceEquals(subscription, this));\n            ObjectDisposedException.ThrowIf(_disposed, this);\n\n            if (notification?.Events == null)\n            {\n                _logger.EmptyEventNotification(this);\n                return;\n            }\n\n            if (notification.Events.Count == 0)\n            {\n                _logger.NoEventsInNotification(this);\n                return;\n            }\n\n            var session = Session;\n            if (session is not IOpcUaSession sessionContext)\n            {\n                _logger.EventChangeWithoutSession(this, session?.ToString());\n                return;\n            }\n\n            ResetKeepAliveTimer();\n\n            var sw = Stopwatch.StartNew();\n            try\n            {\n                var sequenceNumber = notification.SequenceNumber;\n                var publishTime = DateTime.SpecifyKind(notification.PublishTime, DateTimeKind.Utc);\n\n                Debug.Assert(notification.Events != null);\n\n                if (sequenceNumber == 1)\n                {\n                    // Do not log when the sequence number is 1 after reconnect\n                    _previousSequenceNumber = 1;\n                }\n                else if (!Opc.Ua.SequenceNumber.Validate(sequenceNumber, ref _previousSequenceNumber,\n                    out var missingSequenceNumbers, out var dropped))\n                {\n                    _logger.UnexpectedEventSequenceNumber(this, sequenceNumber,\n                        Opc.Ua.SequenceNumber.ToString(missingSequenceNumbers),\n                        dropped ? \"dropped\" : \"already received\", publishTime);\n                }\n\n                var overflows = 0;\n                var events = new List<(string?, OpcUaMonitoredItem.MonitoredItemNotifications)>();\n                foreach (var eventFieldList in notification.Events)\n                {\n                    Debug.Assert(eventFieldList != null);\n                    if (TryGetMonitoredItemForNotification(eventFieldList.ClientHandle, out var monitoredItem))\n                    {\n                        var collector = new OpcUaMonitoredItem.MonitoredItemNotifications();\n                        if (!monitoredItem.TryGetMonitoredItemNotifications(publishTime, eventFieldList, collector))\n                        {\n                            _logger.SkippingEventNotification(this);\n                        }\n                        events.Add((monitoredItem.EventTypeName, collector));\n                    }\n                }\n\n                if (_sendFakeKeepAlives)\n                {\n                    // Send fake keep alives to all the other subscribers\n                    SendFakeKeepAlives(session);\n                }\n\n                var total = events.Sum(e => e.Item2.Notifications.Count);\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                var advance = new Advance(this, sequenceNumber, total);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                foreach (var (name, evt) in events)\n                {\n                    foreach (var (callback, notifications) in evt.Notifications)\n                    {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                        var message = new OpcUaSubscriptionNotification(this, session.MessageContext,\n                            notifications, _timeProvider, advance, sequenceNumber)\n                        {\n                            ApplicationUri = session.Endpoint?.Server?.ApplicationUri\n                                ?? _client.ApplicationUri,\n                            EndpointUrl = session.Endpoint?.EndpointUrl,\n                            EventTypeName = name,\n                            SequenceNumber = Opc.Ua.SequenceNumber.Increment32(ref _sequenceNumber),\n                            MessageType = MessageType.Event,\n                            PublishTimestamp = publishTime\n                        };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n\n                        if (message.Notifications.Count > 0)\n                        {\n                            callback.OnSubscriptionEventReceived(message);\n                            overflows += message.Notifications.Sum(n => n.Overflow);\n                            callback.OnSubscriptionEventDiagnosticsChange(true, overflows, 1, 0);\n                        }\n                        else\n                        {\n                            _logger.NoNotificationsAdded();\n                        }\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                _logger.EventProcessingError(e);\n            }\n            finally\n            {\n                _logger.EventCallbackDuration(sw.Elapsed);\n                if (sw.ElapsedMilliseconds > 1000)\n                {\n                    _logger.SlowEventCallback();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handle keep alive messages\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"notification\"></param>\n        /// <exception cref=\"NotImplementedException\"></exception>\n        private void OnSubscriptionKeepAliveNotification(Subscription subscription,\n            NotificationData notification)\n        {\n            Debug.Assert(ReferenceEquals(subscription, this));\n            ObjectDisposedException.ThrowIf(_disposed, this);\n\n            ResetKeepAliveTimer();\n\n            if (!PublishingEnabled)\n            {\n                _logger.KeepAliveWhileNotPublishing();\n                return;\n            }\n\n            var session = Session;\n            if (session is not IOpcUaSession)\n            {\n                _logger.KeepAliveWithoutSession(this, session?.ToString());\n                return;\n            }\n\n            var sw = Stopwatch.StartNew();\n            try\n            {\n                var sequenceNumber = notification.SequenceNumber;\n                var publishTime = DateTime.SpecifyKind(notification.PublishTime, DateTimeKind.Utc);\n\n                // in case of a keepalive,the sequence number is not incremented by the servers\n                _logger.KeepAliveReceived(this, sequenceNumber, publishTime);\n\n                if (_sendFakeKeepAlives)\n                {\n                    SendFakeKeepAlives(session);\n                }\n                else\n                {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                    var message = new OpcUaSubscriptionNotification(this, session.MessageContext,\n                        Array.Empty<MonitoredItemNotificationModel>(), _timeProvider)\n                    {\n                        ApplicationUri = session.Endpoint?.Server?.ApplicationUri\n                            ?? _client.ApplicationUri,\n                        EndpointUrl = session.Endpoint?.EndpointUrl,\n                        PublishTimestamp = publishTime,\n                        SequenceNumber = Opc.Ua.SequenceNumber.Increment32(ref _sequenceNumber),\n                        MessageType = MessageType.KeepAlive\n                    };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                    foreach (var callback in CurrentlyMonitored\n                        .Select(c => c.Owner)\n                        .Distinct())\n                    {\n                        callback.OnSubscriptionKeepAlive(message);\n                    }\n                    Debug.Assert(message.Notifications != null);\n                }\n            }\n            catch (Exception e)\n            {\n                _logger.KeepAliveProcessingError(e);\n            }\n            finally\n            {\n                _logger.KeepAliveDuration(sw.Elapsed);\n                if (sw.ElapsedMilliseconds > 1000)\n                {\n                    _logger.SlowKeepAliveCallback();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handle cyclic read notifications created by the client\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"values\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"publishTime\"></param>\n        public void OnSubscriptionCylicReadNotification(Subscription subscription,\n            List<SampledDataValueModel> values, uint sequenceNumber, DateTime publishTime)\n        {\n            Debug.Assert(ReferenceEquals(subscription, this));\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            var session = Session;\n            if (session is not IOpcUaSession sessionContext)\n            {\n                _logger.DataChangeWithoutSession(this, session?.ToString());\n                return;\n            }\n\n            var sw = Stopwatch.StartNew();\n            try\n            {\n                var collector = new OpcUaMonitoredItem.MonitoredItemNotifications();\n                foreach (var cyclicDataChange in values.OrderBy(m => m.Value?.SourceTimestamp))\n                {\n                    if (TryGetMonitoredItemForNotification(cyclicDataChange.ClientHandle, out var monitoredItem) &&\n                        !monitoredItem.TryGetMonitoredItemNotifications(publishTime, cyclicDataChange, collector))\n                    {\n                        _logger.SkippingCyclicRead(this);\n                    }\n                }\n\n                foreach (var (callback, notifications) in collector.Notifications)\n                {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                    var message = new OpcUaSubscriptionNotification(this, session.MessageContext, notifications,\n                        _timeProvider, null, sequenceNumber)\n                    {\n                        ApplicationUri = session.Endpoint?.Server?.ApplicationUri\n                            ?? _client.ApplicationUri,\n                        EndpointUrl = session.Endpoint?.EndpointUrl,\n                        PublishTimestamp = publishTime,\n                        SequenceNumber = Opc.Ua.SequenceNumber.Increment32(ref _sequenceNumber),\n                        MessageType = MessageType.DeltaFrame\n                    };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n\n                    callback.OnSubscriptionCyclicReadCompleted(message);\n                    Debug.Assert(message.Notifications != null);\n                    var count = message.GetDiagnosticCounters(out var _, out _, out var overflows);\n                    if (count > 0)\n                    {\n                        callback.OnSubscriptionCyclicReadDiagnosticsChange(count, overflows);\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                _logger.CyclicReadProcessingError(e);\n            }\n            finally\n            {\n                _logger.CyclicReadDuration(sw.Elapsed);\n                if (sw.ElapsedMilliseconds > 1000)\n                {\n                    _logger.SlowCyclicReadCallback();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handle data change notification. Depending on the sequential publishing setting\n        /// this will be called in order and thread safe or from different threads.\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"notification\"></param>\n        /// <param name=\"stringTable\"></param>\n        private void OnSubscriptionDataChangeNotification(Subscription subscription,\n            DataChangeNotification notification, IList<string>? stringTable)\n        {\n            Debug.Assert(ReferenceEquals(subscription, this));\n            ObjectDisposedException.ThrowIf(_disposed, this);\n\n            var session = Session;\n            if (session is not IOpcUaSession sessionContext)\n            {\n                _logger.DataChangeWithoutSession(this, session.ToString());\n                return;\n            }\n\n            ResetKeepAliveTimer();\n\n            var firstDataChangeReceived = _firstDataChangeReceived;\n            _firstDataChangeReceived = true;\n\n            var sw = Stopwatch.StartNew();\n            try\n            {\n                var sequenceNumber = notification.SequenceNumber;\n                var publishTime = DateTime.SpecifyKind(notification.PublishTime, DateTimeKind.Utc);\n\n                // All notifications have the same message and thus sequence number\n                if (sequenceNumber == 1)\n                {\n                    // Do not log when the sequence number is 1 after reconnect\n                    _previousSequenceNumber = 1;\n                }\n                else if (!Opc.Ua.SequenceNumber.Validate(sequenceNumber, ref _previousSequenceNumber,\n                    out var missingSequenceNumbers, out var dropped))\n                {\n                    _logger.UnexpectedDataChangeSequenceNumber(this, sequenceNumber,\n                        Opc.Ua.SequenceNumber.ToString(missingSequenceNumbers),\n                        dropped ? \"dropped\" : \"already received\", publishTime);\n                }\n\n                // Collect notifications\n                var collector = new OpcUaMonitoredItem.MonitoredItemNotifications();\n                foreach (var item in notification.MonitoredItems)\n                {\n                    Debug.Assert(item != null);\n                    if (TryGetMonitoredItemForNotification(item.ClientHandle, out var monitoredItem) &&\n                        !monitoredItem.TryGetMonitoredItemNotifications(publishTime, item, collector))\n                    {\n                        _logger.SkippingDataChangeNotification(this);\n                    }\n                }\n\n                if (_sendFakeKeepAlives)\n                {\n                    // Send fake keep alives to all the other subscribers\n                    SendFakeKeepAlives(session);\n                }\n\n                // Send to listeners\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                var advance = new Advance(this, sequenceNumber, collector.Notifications.Count);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                foreach (var (callback, notifications) in collector.Notifications)\n                {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                    var message = new OpcUaSubscriptionNotification(this, session.MessageContext,\n                        notifications, _timeProvider, advance, sequenceNumber)\n                    {\n                        ApplicationUri = session.Endpoint?.Server?.ApplicationUri\n                            ?? _client.ApplicationUri,\n                        EndpointUrl = session.Endpoint?.EndpointUrl,\n                        PublishTimestamp = publishTime,\n                        SequenceNumber = Opc.Ua.SequenceNumber.Increment32(ref _sequenceNumber),\n                        MessageType =\n                            firstDataChangeReceived ? MessageType.DeltaFrame : MessageType.KeyFrame\n                    };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                    Debug.Assert(notification.MonitoredItems != null);\n\n                    callback.OnSubscriptionDataChangeReceived(message);\n                    Debug.Assert(message.Notifications != null);\n                    var count = message.GetDiagnosticCounters(out var _, out var heartbeats, out var overflows);\n                    if (count > 0)\n                    {\n                        callback.OnSubscriptionDataDiagnosticsChange(true, count, overflows, heartbeats);\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                _logger.DataChangeNotificationError(e);\n            }\n            finally\n            {\n                _logger.DataChangeDuration(sw.Elapsed);\n                if (sw.ElapsedMilliseconds > 1000)\n                {\n                    _logger.SlowDataChangeCallback();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Send fake keep alives to all subscribers\n        /// </summary>\n        /// <param name=\"session\"></param>\n        private void SendFakeKeepAlives(ISession session)\n        {\n            // Send fake keep alives to all subscribers that need one\n            var now = _timeProvider.GetUtcNow();\n            var keepAliveTimer = now - KeepAliveTimeout;\n            foreach (var monitoredItems in CurrentlyMonitored.GroupBy(c => c.Owner))\n            {\n                // Ka when the item never received a value or the last value is older than the keep alive timeout.\n                if (monitoredItems.All(m => m.LastActivityTime < keepAliveTimer))\n                {\n                    foreach (var monitoredItem in monitoredItems)\n                    {\n                        monitoredItem.LastActivityTime = now;\n                    }\n                    monitoredItems.Key.OnSubscriptionKeepAlive(new OpcUaSubscriptionNotification(this,\n                        session.MessageContext, Array.Empty<MonitoredItemNotificationModel>(),\n                        _timeProvider)\n                    {\n                        ApplicationUri = session.Endpoint?.Server?.ApplicationUri\n                            ?? _client.ApplicationUri,\n                        EndpointUrl = session.Endpoint?.EndpointUrl,\n                        PublishTimestamp = _timeProvider.GetUtcNow(),\n                        SequenceNumber = Opc.Ua.SequenceNumber.Increment32(ref _sequenceNumber),\n                        MessageType = MessageType.KeepAlive\n                    });\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get monitored item using client handle\n        /// </summary>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <returns></returns>\n        private bool TryGetMonitoredItemForNotification(uint clientHandle,\n            [NotNullWhen(true)] out OpcUaMonitoredItem? monitoredItem)\n        {\n            monitoredItem = FindItemByClientHandle(clientHandle) as OpcUaMonitoredItem;\n            if (monitoredItem != null)\n            {\n                return true;\n            }\n\n            _unassignedNotifications++;\n            _logger.MonitoredItemNotFound(clientHandle, this);\n            return false;\n        }\n\n        /// <summary>\n        /// Get notifications\n        /// </summary>\n        /// <param name=\"owner\"></param>\n        /// <param name=\"notifications\"></param>\n        /// <returns></returns>\n        internal bool TryGetNotifications(ISubscriber owner,\n            [NotNullWhen(true)] out IList<MonitoredItemNotificationModel>? notifications)\n        {\n            try\n            {\n                if (IsClosed)\n                {\n                    notifications = null;\n                    return false;\n                }\n\n                var collector = new OpcUaMonitoredItem.MonitoredItemNotifications();\n                // Ensure we order by client handle exactly like the meta data is ordered\n                foreach (var item in CurrentlyMonitored\n                    .Where(m => m.Owner == owner).OrderBy(m => m.ClientHandle))\n                {\n                    item.TryGetLastMonitoredItemNotifications(collector);\n                }\n\n                if (!collector.Notifications.TryGetValue(owner, out var actualNotifications))\n                {\n                    notifications = null;\n                    return false;\n                }\n                notifications = actualNotifications;\n                return true;\n            }\n            catch (Exception ex)\n            {\n                notifications = null;\n                _logger.GetNotificationsFailed(ex, this);\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Reset keep alive timer\n        /// </summary>\n        private void ResetKeepAliveTimer()\n        {\n            ObjectDisposedException.ThrowIf(_disposed, this);\n            _continuouslyMissingKeepAlives = 0;\n\n            if (!IsOnline)\n            {\n                _keepAliveWatcher.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                return;\n            }\n            try\n            {\n                var keepAliveTimeout = KeepAliveTimeout;\n                _keepAliveWatcher.Change(keepAliveTimeout, keepAliveTimeout);\n            }\n            catch (ArgumentOutOfRangeException)\n            {\n                _keepAliveWatcher.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            }\n        }\n\n        /// <summary>\n        /// Reset the monitored item watchdog\n        /// </summary>\n        /// <param name=\"publishingEnabled\"></param>\n        private void ResetMonitoredItemWatchdogTimer(bool publishingEnabled)\n        {\n            var timeout = MonitoredItemWatchdogTimeout;\n            if (timeout == TimeSpan.Zero)\n            {\n                if (_lastMonitoredItemCheck == null)\n                {\n                    return;\n                }\n                publishingEnabled = false;\n            }\n            if (!publishingEnabled)\n            {\n                if (_lastMonitoredItemCheck != null)\n                {\n                    _logger.StoppingWatchdog(this, timeout);\n                }\n                _lastMonitoredItemCheck = null;\n                _monitoredItemWatcher.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n            }\n            else\n            {\n                if (_lastMonitoredItemCheck == null)\n                {\n                    _logger.RestartingWatchdog(this, timeout);\n                }\n\n                _lastMonitoredItemCheck = _timeProvider.GetUtcNow();\n                Debug.Assert(timeout != TimeSpan.Zero);\n                _monitoredItemWatcher.Change(timeout, timeout);\n            }\n        }\n\n        /// <summary>\n        /// Hand resynchronization\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void OnResync(object? state)\n        {\n            lock (_timers)\n            {\n                if (_disposed || _resyncTimer == null)\n                {\n                    Debug.Fail(\"Should not be called after dispose\");\n                    return;\n                }\n\n                if (IsRoot)\n                {\n                    _client.TriggerSubscriptionSynchronization(this);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Checks status of monitored items\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void OnMonitoredItemWatchdog(object? state)\n        {\n            var action = WatchdogBehavior ?? SubscriptionWatchdogBehavior.Diagnostic;\n            lock (_timers)\n            {\n                if (_disposed || _monitoredItemWatcher == null)\n                {\n                    Debug.Fail(\"Should not be called after dispose\");\n                    return;\n                }\n\n                var lastCheck = _lastMonitoredItemCheck;\n\n                if (!IsOnline || lastCheck == null)\n                {\n                    // Stop watchdog\n                    _monitoredItemWatcher.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                    return;\n                }\n\n                if (MonitoredItemCount == 0)\n                {\n                    _lastMonitoredItemCheck = _timeProvider.GetUtcNow();\n                    return;\n                }\n\n                var lastCount = _lateMonitoredItems;\n                var itemsChecked = 0;\n                foreach (var item in CurrentlyMonitored)\n                {\n                    itemsChecked++;\n                    if (item.WasLastValueReceivedBefore(lastCheck.Value))\n                    {\n                        _logger.MonitoredItemLate(item, this);\n                        _lateMonitoredItems++;\n                    }\n                }\n                _lastMonitoredItemCheck = _timeProvider.GetUtcNow();\n                var missing = _lateMonitoredItems - lastCount;\n                if (missing == 0)\n                {\n                    _logger.AllItemsReporting(this);\n                    return;\n                }\n                if (action == SubscriptionWatchdogBehavior.Diagnostic)\n                {\n                    return;\n                }\n                if (itemsChecked != missing)\n                {\n                    if (WatchdogCondition == MonitoredItemWatchdogCondition.WhenAllAreLate)\n                    {\n                        _logger.SomeItemsLateDebug(missing, itemsChecked, this);\n                        return;\n                    }\n                    _logger.SomeItemsLate(this);\n                }\n                else\n                {\n                    _logger.AllItemsLate(this);\n                }\n                _logger.LateItemsSummary(missing, itemsChecked, this, action);\n            }\n\n            var msg = $\"Performed watchdog action {action} for subscription {this} \" +\n                $\"because it has {_lateMonitoredItems} late monitored items.\";\n            RunWatchdogAction(action, msg);\n        }\n\n        /// <summary>\n        /// Run watchdog action\n        /// </summary>\n        /// <param name=\"action\"></param>\n        /// <param name=\"msg\"></param>\n        private void RunWatchdogAction(SubscriptionWatchdogBehavior action, string msg)\n        {\n            switch (action)\n            {\n                case SubscriptionWatchdogBehavior.Diagnostic:\n                    _logger.DiagnosticMessage(msg);\n                    break;\n                case SubscriptionWatchdogBehavior.Reset:\n                    ResetMonitoredItemWatchdogTimer(false);\n                    _forceRecreate = true;\n                    _client.TriggerSubscriptionSynchronization(this);\n                    break;\n                case SubscriptionWatchdogBehavior.FailFast:\n                    Publisher.Runtime.FailFast(msg, null);\n                    break;\n                case SubscriptionWatchdogBehavior.ExitProcess:\n                    Console.WriteLine(msg);\n                    Publisher.Runtime.Exit(-10);\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Called when keep alive callback was missing\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void OnKeepAliveMissing(object? state)\n        {\n            lock (_timers)\n            {\n                if (_disposed)\n                {\n                    Debug.Fail(\"Should not be called after dispose\");\n                    return;\n                }\n\n                if (!IsOnline)\n                {\n                    // Stop watchdog\n                    _keepAliveWatcher.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                    return;\n                }\n\n                _missingKeepAlives++;\n                _continuouslyMissingKeepAlives++;\n\n                if (_continuouslyMissingKeepAlives == CurrentLifetimeCount + 1)\n                {\n                    var action = WatchdogBehavior ?? SubscriptionWatchdogBehavior.Reset;\n                    _logger.KeepAliveExceeded(\n                        _continuouslyMissingKeepAlives, CurrentLifetimeCount, action, this);\n\n                    RunWatchdogAction(action, $\"Subscription {this}: Keep alives exceeded \" +\n                        $\"({_continuouslyMissingKeepAlives}/{CurrentLifetimeCount}).\");\n                }\n                else\n                {\n                    _logger.MissingKeepAlive(\n                        _continuouslyMissingKeepAlives, CurrentLifetimeCount, this);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Publish status changed\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"e\"></param>\n        private void OnPublishStatusChange(Subscription subscription, PublishStateChangedEventArgs e)\n        {\n            if (_disposed)\n            {\n                return;\n            }\n            if (e.Status.HasFlag(PublishStateChangedMask.Stopped) && !_publishingStopped)\n            {\n                _logger.SubscriptionStopped(this);\n                // ResetKeepAliveTimer(); // This will just prolong our suffering\n                ResetMonitoredItemWatchdogTimer(false);\n                _publishingStopped = true;\n            }\n            if (e.Status.HasFlag(PublishStateChangedMask.Recovered) && _publishingStopped)\n            {\n                _logger.SubscriptionRecovered(this);\n                ResetKeepAliveTimer();\n                ResetMonitoredItemWatchdogTimer(true);\n                _publishingStopped = false;\n            }\n            if (e.Status.HasFlag(PublishStateChangedMask.Transferred))\n            {\n                _logger.SubscriptionTransferred(this);\n            }\n            if (e.Status.HasFlag(PublishStateChangedMask.Republish))\n            {\n                _logger.SubscriptionRepublishing(this);\n            }\n            if (e.Status.HasFlag(PublishStateChangedMask.KeepAlive))\n            {\n                _logger.SubscriptionKeepAlive(this);\n                ResetKeepAliveTimer();\n            }\n            if (e.Status.HasFlag(PublishStateChangedMask.Timeout))\n            {\n                var action = WatchdogBehavior ?? SubscriptionWatchdogBehavior.Reset;\n                _logger.SubscriptionTimeout(this, action.ToString());\n\n                //\n                // Timed out on server - this means that the subscription is gone and\n                // needs to be recreated. This is the default watchdog behavior.\n                //\n                RunWatchdogAction(action, $\"Subscription {this} timed out!\");\n            }\n        }\n\n        /// <summary>\n        /// Subscription status changed\n        /// </summary>\n        /// <param name=\"subscription\"></param>\n        /// <param name=\"e\"></param>\n        private void OnStateChange(Subscription subscription, SubscriptionStateChangedEventArgs e)\n        {\n            if (e.Status.HasFlag(SubscriptionChangeMask.Created))\n            {\n                _logger.SubscriptionCreated(this);\n                _publishingStopped = false;\n            }\n            if (e.Status.HasFlag(SubscriptionChangeMask.Deleted))\n            {\n                _logger.SubscriptionDeleted(this);\n            }\n            if (e.Status.HasFlag(SubscriptionChangeMask.Modified))\n            {\n                _logger.SubscriptionModified2(this);\n            }\n            if (e.Status.HasFlag(SubscriptionChangeMask.ItemsAdded))\n            {\n                _logger.SubscriptionItemsAdded(this);\n            }\n            if (e.Status.HasFlag(SubscriptionChangeMask.ItemsRemoved))\n            {\n                _logger.SubscriptionItemsRemoved(this);\n            }\n            if (e.Status.HasFlag(SubscriptionChangeMask.ItemsCreated))\n            {\n                _logger.SubscriptionItemsCreated(this);\n            }\n            if (e.Status.HasFlag(SubscriptionChangeMask.ItemsDeleted))\n            {\n                _logger.SubscriptionItemsDeleted(this);\n            }\n            if (e.Status.HasFlag(SubscriptionChangeMask.ItemsModified))\n            {\n                _logger.SubscriptionItemsModified(this);\n            }\n            if (e.Status.HasFlag(SubscriptionChangeMask.Transferred))\n            {\n                _logger.SubscriptionTransferred(this);\n            }\n        }\n\n        /// <summary>\n        /// Helper to partition subscribers across subscriptions. Uses a bag packing\n        /// algorithm.\n        /// </summary>\n        private sealed class Partition\n        {\n            /// <summary>\n            /// Monitored items that should be in the subscription partition\n            /// </summary>\n            public List<(ISubscriber, BaseMonitoredItemModel)> Items { get; } = [];\n\n            /// <summary>\n            /// Create\n            /// </summary>\n            /// <param name=\"subscribers\"></param>\n            /// <param name=\"maxMonitoredItemsInPartition\"></param>\n            /// <param name=\"options\"></param>\n            /// <returns></returns>\n            public static List<Partition> Create(IEnumerable<ISubscriber> subscribers,\n                uint maxMonitoredItemsInPartition, OpcUaSubscriptionOptions options)\n            {\n                var partitions = new List<Partition>();\n                foreach (var subscriberItems in subscribers\n                    .Select(s => s.MonitoredItems\n                        .Select(m => (s, m.SetDefaults(options)))\n                        .ToList())\n                    .OrderByDescending(tl => tl.Count))\n                {\n                    var placed = false;\n                    foreach (var partition in partitions)\n                    {\n                        if (partition.Items.Count +\n                            subscriberItems.Count <= maxMonitoredItemsInPartition)\n                        {\n                            partition.Items.AddRange(subscriberItems);\n                            placed = true;\n                            break;\n                        }\n                    }\n                    if (!placed)\n                    {\n                        // Break items into batches of max here and add partition each\n                        foreach (var batch in subscriberItems.Batch(\n                            (int)maxMonitoredItemsInPartition))\n                        {\n                            var newPartition = new Partition();\n                            newPartition.Items.AddRange(batch);\n                            partitions.Add(newPartition);\n                        }\n                    }\n                }\n                return partitions;\n            }\n        }\n\n        /// <summary>\n        /// Helper to advance the sequence number when all notifications are\n        /// completed.\n        /// </summary>\n        private sealed class Advance : IDisposable\n        {\n            /// <summary>\n            /// Create helper\n            /// </summary>\n            /// <param name=\"opcUaSubscription\"></param>\n            /// <param name=\"sequenceNumber\"></param>\n            /// <param name=\"count\"></param>\n            public Advance(OpcUaSubscription opcUaSubscription,\n                uint sequenceNumber, int count)\n            {\n                _count = count;\n                _opcUaSubscription = opcUaSubscription;\n                _subscriptionId = opcUaSubscription.Id;\n                _sequenceNumber = sequenceNumber;\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                var done = Interlocked.Decrement(ref _count);\n                Debug.Assert(done >= 0);\n                if (done == 0 && _opcUaSubscription.Id == _subscriptionId)\n                {\n                    _opcUaSubscription._logger.AdvancingStream(_subscriptionId, _sequenceNumber);\n                    _opcUaSubscription._currentSequenceNumber = _sequenceNumber;\n                }\n            }\n\n            private readonly OpcUaSubscription _opcUaSubscription;\n            private readonly uint _subscriptionId;\n            private readonly uint _sequenceNumber;\n            private int _count;\n        }\n\n        private int HeartbeatsEnabled\n            => MonitoredItems.Count(r => r is OpcUaMonitoredItem.Heartbeat h && h.TimerEnabled);\n        private int ConditionsEnabled\n            => MonitoredItems.Count(r => r is OpcUaMonitoredItem.Condition h && h.TimerEnabled);\n        private IOpcUaClientDiagnostics State\n            => (_client as IOpcUaClientDiagnostics) ?? OpcUaClient.Disconnected;\n\n        /// <summary>\n        /// Create observable metrics\n        /// </summary>\n        public void InitializeMetrics()\n        {\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_missing_keep_alives\",\n                () => new Measurement<long>(_missingKeepAlives, _metrics.TagList),\n                description: \"Number of missing keep alives in subscription.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_monitored_items\",\n                () => new Measurement<long>(MonitoredItemCount, _metrics.TagList),\n                description: \"Total monitored item count.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_disabled_nodes\",\n                () => new Measurement<long>(_disabledItems, _metrics.TagList),\n                description: \"Monitored items with monitoring mode disabled.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_nodes_monitoring_mode_inconsistent\",\n                () => new Measurement<long>(_notAppliedItems, _metrics.TagList),\n                description: \"Monitored items with monitoring mode not applied.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_reporting_nodes\",\n                () => new Measurement<long>(_reportingItems, _metrics.TagList),\n                description: \"Monitored items reporting.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_sampling_nodes\",\n                () => new Measurement<long>(_samplingItems, _metrics.TagList),\n                description: \"Monitored items with sampling enabled.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_heartbeat_nodes\",\n                () => new Measurement<long>(_heartbeatItems, _metrics.TagList),\n                description: \"Monitored items with heartbeats configured.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_heartbeat_enabled_nodes\",\n                () => new Measurement<long>(HeartbeatsEnabled, _metrics.TagList),\n                description: \"Monitored items with heartbeats enabled.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_condition_nodes\",\n                () => new Measurement<long>(_conditionItems, _metrics.TagList),\n                description: \"Monitored items with condition monitoring configured.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_condition_enabled_nodes\",\n                () => new Measurement<long>(ConditionsEnabled, _metrics.TagList),\n                description: \"Monitored items with condition monitoring enabled.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_unassigned_notification_count\",\n                () => new Measurement<long>(_unassignedNotifications, _metrics.TagList),\n                description: \"Number of notifications that could not be assigned.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_good_nodes\",\n                () => new Measurement<long>(_goodMonitoredItems, _metrics.TagList),\n                description: \"Monitored items successfully created.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_bad_nodes\",\n                () => new Measurement<long>(_badMonitoredItems, _metrics.TagList),\n                description: \"Monitored items that were not successfully created.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_late_nodes\",\n                () => new Measurement<long>(_lateMonitoredItems, _metrics.TagList),\n                description: \"Monitored items that are late reporting.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_subscription_resync_count\",\n                () => new Measurement<long>(_resyncCounter, _metrics.TagList),\n                description: \"How many times the subscriptions was resynced due to error.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_subscription_resync_total\",\n                () => new Measurement<long>(_resyncTotal, _metrics.TagList),\n                description: \"Total number of resynchronization attempts on the subscription.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_subscription_stopped_count\",\n                () => new Measurement<int>(_publishingStopped ? 1 : 0, _metrics.TagList),\n                description: \"Number of subscriptions that stopped publishing.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_deferred_acks_enabled_count\",\n                () => new Measurement<int>(UseDeferredAcknoledgements ? 1 : 0, _metrics.TagList),\n                description: \"Number of subscriptions with deferred acknoledgements enabled.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_deferred_acks_last_sequencenumber\",\n                () => new Measurement<long>(_sequenceNumber, _metrics.TagList),\n                description: \"Sequence number of the last notification received in subscription.\");\n            _meter.CreateObservableCounter(\"iiot_edge_publisher_deferred_acks_completed_sequencenumber\",\n                () => new Measurement<long>(_currentSequenceNumber, _metrics.TagList),\n                description: \"Sequence number of the next notification to acknoledge in subscription.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_publish_requests_per_subscription\",\n                () => new Measurement<double>(Ratio(State.OutstandingRequestCount, State.SubscriptionCount),\n                _metrics.TagList), description: \"Good publish requests per subsciption.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_good_publish_requests_per_subscription\",\n                () => new Measurement<double>(Ratio(State.GoodPublishRequestCount, State.SubscriptionCount),\n                _metrics.TagList), description: \"Good publish requests per subsciption.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_bad_publish_requests_per_subscription\",\n                () => new Measurement<double>(Ratio(State.BadPublishRequestCount, State.SubscriptionCount),\n                _metrics.TagList), description: \"Bad publish requests per subsciption.\");\n            _meter.CreateObservableUpDownCounter(\"iiot_edge_publisher_min_publish_requests_per_subscription\",\n                () => new Measurement<double>(Ratio(State.MinPublishRequestCount, State.SubscriptionCount),\n                _metrics.TagList), description: \"Min publish requests queued per subsciption.\");\n\n            static double Ratio(int value, int count) => count == 0 ? 0.0 : (double)value / count;\n        }\n\n        private static readonly TimeSpan kMaxExponentialRetryDelayDefault = TimeSpan.FromSeconds(10);\n        private const int kMaxMonitoredItemPerSubscriptionDefault = 64 * 1024;\n        private uint _previousSequenceNumber;\n        private uint _sequenceNumber;\n        private uint _currentSequenceNumber;\n        private bool _firstDataChangeReceived;\n        private bool _forceRecreate;\n        private uint? _childId;\n        private readonly uint? _parentId;\n        private readonly OpcUaClient _client;\n        private readonly IOptions<OpcUaSubscriptionOptions> _options;\n        private readonly ILoggerFactory _loggerFactory;\n        private readonly ILogger _logger;\n        private readonly IMetricsContext _metrics;\n        private readonly ITimer _keepAliveWatcher;\n        private readonly ITimer _monitoredItemWatcher;\n        private readonly ITimer _resyncTimer;\n        private readonly TimeProvider _timeProvider;\n        private readonly Meter _meter = Diagnostics.NewMeter();\n        private static uint _lastIndex;\n        private DateTimeOffset? _lastMonitoredItemCheck;\n        private int _goodMonitoredItems;\n        private int _reportingItems;\n        private int _disabledItems;\n        private int _samplingItems;\n        private int _notAppliedItems;\n        private int _heartbeatItems;\n        private int _conditionItems;\n        private int _lateMonitoredItems;\n        private int _badMonitoredItems;\n        private int _errorsDuringSync;\n        private int _missingKeepAlives;\n        private int _continuouslyMissingKeepAlives;\n        private int _resyncCounter;\n        private int _resyncTotal;\n        private long _unassignedNotifications;\n        private bool _publishingStopped;\n        private bool _disposed;\n        private bool _sendFakeKeepAlives;\n        private readonly Lock _timers = new();\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for OpcUaSubscription\n    /// </summary>\n    internal static partial class OpcUaSubscriptionLogging\n    {\n        private const int EventClass = 1400;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Disposed Subscription {Subscription} with {Count} items.\")]\n        public static partial void SubscriptionDisposedWithItems(this ILogger logger,\n            OpcUaSubscription subscription, int count);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Disposed Subscription {Subscription}.\")]\n        public static partial void SubscriptionDisposed(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"Disposing Subscription {Subscription} encountered error.\")]\n        public static partial void DisposalError(this ILogger logger, Exception ex, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Closed Subscription {Subscription}.\")]\n        public static partial void SubscriptionClosed(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"Subscription {Subscription} closed!\")]\n        public static partial void SubscriptionClosedError(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"Failed to create keep alive for subscription {Subscription}.\")]\n        public static partial void KeepAliveCreateFailed(this ILogger logger, Exception ex,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"========  Closing subscription {Subscription} and re-creating =========\")]\n        public static partial void ClosingAndRecreatingSubscription(this ILogger logger,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"{State} Subscription {Subscription} in session {Session}.\")]\n        public static partial void StateSubscriptionSession(this ILogger logger, string state,\n            OpcUaSubscription subscription, OpcUaSession session);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"Creating new {State} subscription {Subscription} in session {Session}.\")]\n        public static partial void CreatingSubscription(this ILogger logger, string state,\n            OpcUaSubscription subscription, OpcUaSession session);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"Change KeepAliveCount to {New} in Subscription {Subscription}...\")]\n        public static partial void KeepAliveCountChanged(this ILogger logger, uint @new,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Information,\n            Message = \"Change publishing interval to {New} in Subscription {Subscription}...\")]\n        public static partial void PublishingIntervalChanged(this ILogger logger, TimeSpan @new,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"Change MaxNotificationsPerPublish to {New} in Subscription {Subscription}\")]\n        public static partial void MaxNotificationsPerPublishChanged(this ILogger logger, uint @new,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"Change LifetimeCount to {New} in Subscription {Subscription}...\")]\n        public static partial void LifetimeCountChanged(this ILogger logger, uint @new, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"Change Priority to {New} in Subscription {Subscription}...\")]\n        public static partial void PriorityChanged(this ILogger logger, byte @new, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Information,\n            Message = \"Subscription {Subscription} in session {Session} successfully modified.\")]\n        public static partial void SubscriptionModified(this ILogger logger,\n            OpcUaSubscription subscription, OpcUaSession session);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Information,\n            Message = \"Retrieved {Count} paths for items in subscription {Subscription}.\")]\n        public static partial void PathsRetrieved(this ILogger logger, int count, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Debug,\n            Message = \"Trying to update monitored item '{Item}' in {Subscription}...\")]\n        public static partial void UpdatingMonitoredItem(this ILogger logger, OpcUaMonitoredItem item,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Debug,\n            Message = \"Trying to remove monitored item '{Item}' from {Subscription}...\")]\n        public static partial void RemovingMonitoredItem(this ILogger logger, OpcUaMonitoredItem item,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 19, Level = LogLevel.Debug,\n            Message = \"Adding monitored item '{Item}' to {Subscription}...\")]\n        public static partial void AddingMonitoredItem(this ILogger logger, OpcUaMonitoredItem item,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 20, Level = LogLevel.Information,\n            Message = \"Disabled empty Subscription {Subscription} in session {Session}.\")]\n        public static partial void DisabledEmptySubscription(this ILogger logger, OpcUaSubscription subscription,\n            OpcUaSession session);\n\n        [LoggerMessage(EventId = EventClass + 21, Level = LogLevel.Debug,\n            Message = \"Completing {Count} same/added and {Removed} removed items in subscription {Subscription}...\")]\n        public static partial void CompletingItems(this ILogger logger, int count, int removed,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 22, Level = LogLevel.Debug,\n            Message = \"Completed {Count} valid and {Invalid} invalid items in subscription {Subscription}...\")]\n        public static partial void ItemCompletionStats(this ILogger logger, int count, int invalid,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 23, Level = LogLevel.Debug,\n            Message = \"Setting monitoring mode on {Count} items in subscription {Subscription}...\")]\n        public static partial void SettingMonitoringMode(this ILogger logger, int count,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 24, Level = LogLevel.Information,\n            Message = \"Set monitoring to {Value} for {Count} items in subscription {Subscription}.\")]\n        public static partial void MonitoringModeSet(this ILogger logger, Opc.Ua.MonitoringMode value,\n            int count, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 25, Level = LogLevel.Information,\n            Message = \"Issuing ConditionRefresh on subscription {Subscription}\")]\n        public static partial void IssuingConditionRefresh(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 26, Level = LogLevel.Information,\n            Message = \"ConditionRefresh on subscription {Subscription} has completed.\")]\n        public static partial void ConditionRefreshCompleted(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 27, Level = LogLevel.Information,\n            Message = \"ConditionRefresh on subscription {Subscription} failed with an exception '{Message}'\")]\n        public static partial void ConditionRefreshFailed(this ILogger logger, OpcUaSubscription subscription,\n            string message);\n\n        [LoggerMessage(EventId = EventClass + 28, Level = LogLevel.Error,\n            Message = \"Child subscription {ChildId} not found in session {Session}.\")]\n        public static partial void ChildSubscriptionNotFound(this ILogger logger, uint? childId, OpcUaSession session);\n\n        [LoggerMessage(EventId = EventClass + 29, Level = LogLevel.Debug,\n            Message = \"Closing subscription '{Subscription}'...\")]\n        public static partial void ClosingSubscription(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 30, Level = LogLevel.Debug,\n            Message = \"Deleted {Count} monitored items for '{Subscription}'.\")]\n        public static partial void DeletedMonitoredItems(this ILogger logger, int count,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 31, Level = LogLevel.Information,\n            Message = \"Subscription '{Subscription}' closed.\")]\n        public static partial void SubscriptionClosed2(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 32, Level = LogLevel.Error,\n            Message = \"Failed to close subscription {Subscription}\")]\n        public static partial void FailedToClose(this ILogger logger, Exception e, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 33, Level = LogLevel.Trace,\n            Message = \"Advancing stream #{SubscriptionId} to #{Position}\")]\n        public static partial void AdvancingStream(this ILogger logger, uint subscriptionId, uint position);\n\n        [LoggerMessage(EventId = EventClass + 34, Level = LogLevel.Debug,\n            Message = \"A session was passed to send notification with but without message context. \" +\n            \"Using thread context.\")]\n        public static partial void UsingThreadContext(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 35, Level = LogLevel.Debug,\n            Message = \"Skipping the monitored item notification for Event received for subscription {Subscription}\")]\n        public static partial void SkippingEventNotification(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 36, Level = LogLevel.Debug,\n            Message = \"No notifications added to the message.\")]\n        public static partial void NoNotificationsAdded(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 37, Level = LogLevel.Debug,\n            Message = \"Event callback took {Elapsed}\")]\n        public static partial void EventCallbackDuration(this ILogger logger, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 38, Level = LogLevel.Debug,\n            Message = \"Keep alive event received while publishing is not enabled - skip.\")]\n        public static partial void KeepAliveWhileNotPublishing(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 39, Level = LogLevel.Debug,\n            Message = \"Keep alive for subscription {Subscription} with sequenceNumber {SequenceNumber}, \" +\n            \"publishTime {PublishTime}.\")]\n        public static partial void KeepAliveReceived(this ILogger logger, OpcUaSubscription subscription,\n            uint sequenceNumber, DateTime publishTime);\n\n        [LoggerMessage(EventId = EventClass + 40, Level = LogLevel.Debug,\n            Message = \"Keep alive callback took {Elapsed}\")]\n        public static partial void KeepAliveDuration(this ILogger logger, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 41, Level = LogLevel.Debug,\n            Message = \"Skipping the cyclic read data change received for subscription {Subscription}\")]\n        public static partial void SkippingCyclicRead(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 42, Level = LogLevel.Debug,\n            Message = \"Cyclic read callback took {Elapsed}\")]\n        public static partial void CyclicReadDuration(this ILogger logger, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 43, Level = LogLevel.Debug,\n            Message = \"Skipping the monitored item notification for DataChange received for \" +\n            \"subscription {Subscription}\")]\n        public static partial void SkippingDataChangeNotification(this ILogger logger,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 44, Level = LogLevel.Debug,\n            Message = \"Data change callback took {Elapsed}\")]\n        public static partial void DataChangeDuration(this ILogger logger, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 45, Level = LogLevel.Debug,\n            Message = \"Monitored item not found with client handle {ClientHandle} in subscription {Subscription}.\")]\n        public static partial void MonitoredItemNotFound(this ILogger logger, uint clientHandle,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 46, Level = LogLevel.Error,\n            Message = \"Failed to get a notifications from monitored items in subscription {Subscription}.\")]\n        public static partial void GetNotificationsFailed(this ILogger logger, Exception ex,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 47, Level = LogLevel.Information,\n            Message = \"{Subscription}: Stopping monitored item watchdog ({Timeout}).\")]\n        public static partial void StoppingWatchdog(this ILogger logger, OpcUaSubscription subscription,\n            TimeSpan timeout);\n\n        [LoggerMessage(EventId = EventClass + 48, Level = LogLevel.Information,\n            Message = \"{Subscription}: Restarting monitored item watchdog ({Timeout}).\")]\n        public static partial void RestartingWatchdog(this ILogger logger, OpcUaSubscription subscription,\n            TimeSpan timeout);\n\n        [LoggerMessage(EventId = EventClass + 49, Level = LogLevel.Debug,\n            Message = \"Monitored item {Item} in subscription {Subscription} is late.\")]\n        public static partial void MonitoredItemLate(this ILogger logger, OpcUaMonitoredItem item,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 50, Level = LogLevel.Debug,\n            Message = \"All monitored items in {Subscription} are reporting.\")]\n        public static partial void AllItemsReporting(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 51, Level = LogLevel.Debug,\n            Message = \"{Count} of the {Total} monitored items in {Subscription} are late \" +\n            \"- no action.\")]\n        public static partial void SomeItemsLateDebug(this ILogger logger, int count, int total,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 52, Level = LogLevel.Information,\n            Message = \"{Count} of the {Total} monitored items in {Subscription} are now late \" +\n            \"- running {Action} behavior action.\")]\n        public static partial void LateItemsSummary(this ILogger logger, int count, int total,\n            OpcUaSubscription subscription, SubscriptionWatchdogBehavior action);\n\n        [LoggerMessage(EventId = EventClass + 53, Level = LogLevel.Critical,\n            Message = \"{Message}\")]\n        public static partial void DiagnosticMessage(this ILogger logger, string message);\n\n        [LoggerMessage(EventId = EventClass + 54, Level = LogLevel.Critical,\n            Message = \"#{Count}/{Lifetimecount}: Keep alive count exceeded. Perform {Action} for {Subscription}...\")]\n        public static partial void KeepAliveExceeded(this ILogger logger, int count, uint lifetimeCount,\n            SubscriptionWatchdogBehavior action, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 55, Level = LogLevel.Information,\n            Message = \"#{Count}/{Lifetimecount}: Subscription {Subscription} is missing keep alive.\")]\n        public static partial void MissingKeepAlive(this ILogger logger, int count, uint lifetimeCount,\n            OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 56, Level = LogLevel.Information,\n            Message = \"Subscription {Subscription} STOPPED!\")]\n        public static partial void SubscriptionStopped(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 57, Level = LogLevel.Information,\n            Message = \"Subscription {Subscription} RECOVERED!\")]\n        public static partial void SubscriptionRecovered(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 58, Level = LogLevel.Information,\n            Message = \"Subscription {Subscription} transferred.\")]\n        public static partial void SubscriptionTransferred(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 59, Level = LogLevel.Information,\n            Message = \"Subscription {Subscription} republishing...\")]\n        public static partial void SubscriptionRepublishing(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 60, Level = LogLevel.Trace,\n            Message = \"Subscription {Subscription} keep alive.\")]\n        public static partial void SubscriptionKeepAlive(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 61, Level = LogLevel.Information,\n            Message = \"Subscription {Subscription} TIMEOUT! \" +\n            \"---- Server closed subscription - performing recovery action {Action}...\")]\n        public static partial void SubscriptionTimeout(this ILogger logger, OpcUaSubscription subscription,\n            string action);\n\n        [LoggerMessage(EventId = EventClass + 62, Level = LogLevel.Debug,\n            Message = \"Subscription {Subscription} created.\")]\n        public static partial void SubscriptionCreated(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 63, Level = LogLevel.Debug,\n            Message = \"Subscription {Subscription} deleted.\")]\n        public static partial void SubscriptionDeleted(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 64, Level = LogLevel.Debug,\n            Message = \"Subscription {Subscription} modified\")]\n        public static partial void SubscriptionModified2(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 65, Level = LogLevel.Debug,\n            Message = \"Subscription {Subscription} items added.\")]\n        public static partial void SubscriptionItemsAdded(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 66, Level = LogLevel.Debug,\n            Message = \"Subscription {Subscription} items removed.\")]\n        public static partial void SubscriptionItemsRemoved(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 67, Level = LogLevel.Debug,\n            Message = \"Subscription {Subscription} items created.\")]\n        public static partial void SubscriptionItemsCreated(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 68, Level = LogLevel.Debug,\n            Message = \"Subscription {Subscription} items deleted.\")]\n        public static partial void SubscriptionItemsDeleted(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 69, Level = LogLevel.Debug,\n            Message = \"Subscription {Subscription} items modified.\")]\n        public static partial void SubscriptionItemsModified(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 70, Level = LogLevel.Information,\n            Message = \"{Subscription} - [{ResyncCount}/{ResyncTotal}] Removed {Removed} - now monitoring {Count} nodes:\" +\n            \"\\n# Good/Bad/Reporting:   {Good}/{Bad}/{Reporting}\")]\n        public static partial void SubscriptionReportState(this ILogger logger, OpcUaSubscription subscription,\n            int resyncCount, int resyncTotal, int removed, int count, int good, int bad, int reporting);\n\n        [LoggerMessage(EventId = EventClass + 71, Level = LogLevel.Warning,\n            Message = \"{Subscription} - [{ResyncCount}/{ResyncTotal}] Removed {Removed} - now monitoring {Count} nodes:\" +\n            \"\\n# Good/Bad/Reporting:   {Good}/{Bad}/{Reporting}\" +\n            \"\\n# Disabled/Errors:      {Disabled}/{Errors}\")]\n        public static partial void SubscriptionReportStateWithErrors(this ILogger logger, OpcUaSubscription subscription,\n            int resyncCount, int resyncTotal, int removed, int count, int good, int bad,\n            int reporting, int disabled, int errors);\n\n        [LoggerMessage(EventId = EventClass + 72, Level = LogLevel.Information,\n            Message = \"{Subscription} - [{ResyncCount}/{ResyncTotal}] Removed {Removed} - now monitoring {Count} nodes:\" +\n            \"\\n# Good/Bad/Reporting:   {Good}/{Bad}/{Reporting}\" +\n            \"\\n# Disabled/Errors:      {Disabled}/{Errors} (Not applied: {NotApplied})\" +\n            \"\\n# Sampling:             {Sampling}\" +\n            \"\\n# Heartbeat/ing:        {Heartbeat}/{EnabledHeartbeats}\" +\n            \"\\n# Condition/ing:        {Conditions}/{EnabledConditions}\")]\n        public static partial void SubscriptionReportStateFull(this ILogger logger, OpcUaSubscription subscription,\n            int resyncCount, int resyncTotal, int removed, int count, int good, int bad,\n            int reporting, int disabled, int errors, int notApplied, int sampling,\n            int heartbeat, int enabledHeartbeats, int conditions, int enabledConditions);\n\n        [LoggerMessage(EventId = EventClass + 73, Level = LogLevel.Debug,\n            Message = \"{Subscription} - [{ResyncCount}/{ResyncTotal}] Applied changes to monitored items, but nothing changed.\")]\n        public static partial void SubscriptionNoMonitoredItemChange(this ILogger logger, OpcUaSubscription subscription,\n            int resyncCount, int resyncTotal);\n\n        [LoggerMessage(EventId = EventClass + 74, Level = LogLevel.Information,\n            Message = \"Successfully created subscription {Subscription}'.\\nActual (revised) state/desired state:\" +\n            \"\\n# PublishingEnabled {CurrentPublishingEnabled}/{PublishingEnabled}\" +\n            \"\\n# PublishingInterval {CurrentPublishingInterval}/{PublishingInterval}\" +\n            \"\\n# KeepAliveCount {CurrentKeepAliveCount}/{KeepAliveCount}\" +\n            \"\\n# LifetimeCount {CurrentLifetimeCount}/{LifetimeCount}\")]\n        public static partial void RevisedValuesDuringCreate(this ILogger logger, OpcUaSubscription subscription,\n            bool currentPublishingEnabled, bool publishingEnabled, int currentPublishingInterval, int publishingInterval,\n            uint currentKeepAliveCount, uint keepAliveCount, uint currentLifetimeCount, uint lifetimeCount);\n\n        [LoggerMessage(EventId = EventClass + 75, Level = LogLevel.Information,\n            Message = \"Successfully modified subscription {Subscription}'.\\nActual (revised) state/desired state:\" +\n            \"\\n# PublishingEnabled {CurrentPublishingEnabled}/{PublishingEnabled}\" +\n            \"\\n# PublishingInterval {CurrentPublishingInterval}/{PublishingInterval}\" +\n            \"\\n# KeepAliveCount {CurrentKeepAliveCount}/{KeepAliveCount}\" +\n            \"\\n# LifetimeCount {CurrentLifetimeCount}/{LifetimeCount}\")]\n        public static partial void RevisedValuesDuringModify(this ILogger logger, OpcUaSubscription subscription,\n            bool currentPublishingEnabled, bool publishingEnabled, int currentPublishingInterval, int publishingInterval,\n            uint currentKeepAliveCount, uint keepAliveCount, uint currentLifetimeCount, uint lifetimeCount);\n\n        [LoggerMessage(EventId = EventClass + 76, Level = LogLevel.Warning,\n            Message = \"Failed to resolve browse path in {Subscription} due to {ErrorInfo}...\")]\n        public static partial void BrowsePathResolveFailed(this ILogger logger,\n            OpcUaSubscription subscription, ServiceResultModel errorInfo);\n\n        [LoggerMessage(EventId = EventClass + 77, Level = LogLevel.Warning,\n            Message = \"Failed to resolve browse path for {NodeId} in {Subscription} due to '{ServiceResult}'\")]\n        public static partial void BrowsePathForNodeResolveFailed(this ILogger logger,\n            string nodeId, OpcUaSubscription subscription, ServiceResultModel? serviceResult);\n\n        [LoggerMessage(EventId = EventClass + 78, Level = LogLevel.Warning,\n            Message = \"Failed to get root path for {NodeId} in {Subscription} due to '{ServiceResult}'\")]\n        public static partial void RootPathResolveFailed(this ILogger logger,\n            string nodeId, OpcUaSubscription subscription, ServiceResultModel? serviceResult);\n\n        [LoggerMessage(EventId = EventClass + 79, Level = LogLevel.Warning,\n            Message = \"Failed to update monitored item '{Item}' in {Subscription}...\")]\n        public static partial void MonitoredItemUpdateFailed(this ILogger logger,\n            Exception ex, OpcUaMonitoredItem item, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 80, Level = LogLevel.Warning,\n            Message = \"Failed to remove monitored item '{Item}' from {Subscription}...\")]\n        public static partial void MonitoredItemRemoveFailed(this ILogger logger,\n            Exception ex, OpcUaMonitoredItem item, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 81, Level = LogLevel.Warning,\n            Message = \"Failed to add monitored item '{Item}' to {Subscription}...\")]\n        public static partial void MonitoredItemAddFailed(this ILogger logger,\n            Exception ex, OpcUaMonitoredItem item, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 82, Level = LogLevel.Warning,\n            Message = \"Failed to resolve display name in {Subscription} due to {ErrorInfo}...\")]\n        public static partial void DisplayNameResolveFailed(this ILogger logger,\n            OpcUaSubscription subscription, ServiceResultModel errorInfo);\n\n        [LoggerMessage(EventId = EventClass + 83, Level = LogLevel.Warning,\n            Message = \"Failed to read display name for {NodeId} in {Subscription} due to '{ServiceResult}'\")]\n        public static partial void DisplayNameReadFailed(this ILogger logger,\n            string nodeId, OpcUaSubscription subscription, ServiceResultModel? serviceResult);\n\n        [LoggerMessage(EventId = EventClass + 84, Level = LogLevel.Warning,\n            Message = \"Failed to set monitoring for {Count} items in subscription {Subscription}.\")]\n        public static partial void MonitoringSetFailed(this ILogger logger,\n            int count, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 85, Level = LogLevel.Warning,\n            Message = \"Set monitoring for item '{Item}' in subscription {Subscription} failed with '{Status}'.\")]\n        public static partial void MonitoringSetFailedForItem(this ILogger logger, NodeId item,\n            OpcUaSubscription subscription, StatusCode status);\n\n        [LoggerMessage(EventId = EventClass + 86, Level = LogLevel.Warning,\n            Message = \"EventChange for subscription {Subscription} has empty notification.\")]\n        public static partial void EmptyEventNotification(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 87, Level = LogLevel.Warning,\n            Message = \"EventChange for subscription {Subscription} has no events.\")]\n        public static partial void NoEventsInNotification(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 88, Level = LogLevel.Warning,\n            Message = \"EventChange for subscription {Subscription} received without a session {Session}.\")]\n        public static partial void EventChangeWithoutSession(this ILogger logger, OpcUaSubscription subscription, string? session);\n\n        [LoggerMessage(EventId = EventClass + 89, Level = LogLevel.Warning,\n            Message = \"Event subscription notification for subscription {Subscription} has unexpected \" +\n            \"sequenceNumber {SequenceNumber} missing {ExpectedSequenceNumber} which were {State}, publishTime {PublishTime}\")]\n        public static partial void UnexpectedEventSequenceNumber(this ILogger logger, OpcUaSubscription subscription,\n            uint sequenceNumber, string expectedSequenceNumber, string state, DateTime publishTime);\n\n        [LoggerMessage(EventId = EventClass + 90, Level = LogLevel.Warning,\n            Message = \"Exception processing subscription notification\")]\n        public static partial void EventProcessingError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 91, Level = LogLevel.Warning,\n            Message = \"Spent more than 1 second in fast event callback.\")]\n        public static partial void SlowEventCallback(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 92, Level = LogLevel.Warning,\n            Message = \"Keep alive event for subscription {Subscription} received without session {Session}.\")]\n        public static partial void KeepAliveWithoutSession(this ILogger logger, OpcUaSubscription subscription,\n            string? session);\n\n        [LoggerMessage(EventId = EventClass + 93, Level = LogLevel.Warning,\n            Message = \"Exception processing keep alive notification\")]\n        public static partial void KeepAliveProcessingError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 94, Level = LogLevel.Warning,\n            Message = \"Spent more than 1 second in fast keep alive callback.\")]\n        public static partial void SlowKeepAliveCallback(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 95, Level = LogLevel.Warning,\n            Message = \"DataChange for subscription {Subscription} received without session {Session}.\")]\n        public static partial void DataChangeWithoutSession(this ILogger logger, OpcUaSubscription subscription,\n            string? session);\n\n        [LoggerMessage(EventId = EventClass + 96, Level = LogLevel.Warning,\n            Message = \"Exception processing cyclic read notification\")]\n        public static partial void CyclicReadProcessingError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 97, Level = LogLevel.Warning,\n            Message = \"Exception processing subscription notification\")]\n        public static partial void DataChangeNotificationError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 98, Level = LogLevel.Warning,\n            Message = \"Spent more than 1 second in fast data change callback.\")]\n        public static partial void SlowDataChangeCallback(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 99, Level = LogLevel.Warning,\n            Message = \"Spent more than 1 second in fast cyclic read callback.\")]\n        public static partial void SlowCyclicReadCallback(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 100, Level = LogLevel.Warning,\n            Message = \"DataChange notification for subscription {Subscription} has unexpected sequenceNumber \" +\n            \"{SequenceNumber} missing {ExpectedSequenceNumber} which were {Dropped}, publishTime {PublishTime}\")]\n        public static partial void UnexpectedDataChangeSequenceNumber(this ILogger logger, OpcUaSubscription subscription,\n            uint sequenceNumber, string expectedSequenceNumber, string dropped, DateTime publishTime);\n\n        [LoggerMessage(EventId = EventClass + 101, Level = LogLevel.Debug,\n           Message = \"Error {Error} occurred {Count} times for subscription {SubscriptionId}.\")]\n        public static partial void ErrorAddingMonitoredItems(this ILogger logger, string error,\n            int count, uint subscriptionId);\n\n        [LoggerMessage(EventId = EventClass + 102, Level = LogLevel.Error,\n           Message = \"Error {Error} occurred {Count} times for subscription {SubscriptionId}. NEW:\\n    {Items}.\")]\n        public static partial void ErrorAddingMonitoredItemsWithErrors(this ILogger logger, string error,\n            int count, uint subscriptionId, string items);\n\n        [LoggerMessage(EventId = EventClass + 103, Level = LogLevel.Information,\n            Message = \"All monitored items in {Subscription} are late.\")]\n        public static partial void AllItemsLate(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 104, Level = LogLevel.Information,\n            Message = \"Some monitored items in {Subscription} are late.\")]\n        public static partial void SomeItemsLate(this ILogger logger, OpcUaSubscription subscription);\n\n        [LoggerMessage(EventId = EventClass + 105, Level = LogLevel.Information,\n            Message = \"Resync timer set to {RetryDelay} for {Subscription}.\")]\n        public static partial void ResyncTimerArmed(this ILogger logger, TimeSpan retryDelay,\n            OpcUaSubscription subscription);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Services/OpcUaSubscriptionNotification.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using Azure.IIoT.OpcUa.Encoders.PubSub;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n\n    /// <summary>\n    /// Opc Ua subscription notification\n    /// </summary>\n    public sealed record class OpcUaSubscriptionNotification : IDisposable\n    {\n        /// <inheritdoc/>\n        public object? Context { get; set; }\n\n        /// <inheritdoc/>\n        public uint SequenceNumber { get; internal set; }\n\n        /// <inheritdoc/>\n        public MessageType MessageType { get; internal set; }\n\n        /// <inheritdoc/>\n        public string? EventTypeName { get; internal set; }\n\n        /// <inheritdoc/>\n        public string? EndpointUrl { get; internal set; }\n\n        /// <inheritdoc/>\n        public string? ApplicationUri { get; internal set; }\n\n        /// <inheritdoc/>\n        public DateTimeOffset? PublishTimestamp { get; internal set; }\n\n        /// <inheritdoc/>\n        public uint? PublishSequenceNumber { get; private set; }\n\n        /// <inheritdoc/>\n        public IServiceMessageContext ServiceMessageContext { get; private set; }\n\n        /// <inheritdoc/>\n        public IList<MonitoredItemNotificationModel> Notifications { get; private set; }\n\n        /// <inheritdoc/>\n        public DateTimeOffset CreatedTimestamp { get; }\n\n        /// <summary>\n        /// Create acknoledgeable notification\n        /// </summary>\n        /// <param name=\"outer\"></param>\n        /// <param name=\"messageContext\"></param>\n        /// <param name=\"notifications\"></param>\n        /// <param name=\"timeProvider\"></param>\n        /// <param name=\"advance\"></param>\n        /// <param name=\"sequenceNumber\"></param>\n        /// <param name=\"createdTimestamp\"></param>\n        internal OpcUaSubscriptionNotification(OpcUaSubscription outer,\n            IServiceMessageContext messageContext,\n            IList<MonitoredItemNotificationModel> notifications,\n            TimeProvider timeProvider, IDisposable? advance = null,\n            uint? sequenceNumber = null, DateTimeOffset? createdTimestamp = null)\n        {\n            _outer = outer;\n            _advance = advance;\n\n            PublishSequenceNumber = sequenceNumber;\n            CreatedTimestamp = createdTimestamp ?? timeProvider.GetUtcNow();\n            ServiceMessageContext = messageContext;\n\n            Notifications = notifications;\n        }\n\n        internal OpcUaSubscriptionNotification(DateTimeOffset createdTimestamp,\n            ServiceMessageContext? serviceMessageContext = null,\n            IList<MonitoredItemNotificationModel>? notifications = null)\n        {\n            _outer = null;\n            _advance = null;\n\n            CreatedTimestamp = createdTimestamp;\n            ServiceMessageContext = serviceMessageContext ?? new();\n            Notifications = notifications ?? Array.Empty<MonitoredItemNotificationModel>();\n        }\n\n        /// <summary>\n        /// Create an empty notification\n        /// </summary>\n        /// <param name=\"template\"></param>\n        /// <param name=\"notifications\"></param>\n        internal OpcUaSubscriptionNotification(OpcUaSubscriptionNotification template,\n            IList<MonitoredItemNotificationModel>? notifications = null)\n        {\n            _outer = null;\n            _advance = null;\n\n            Notifications = notifications ?? Array.Empty<MonitoredItemNotificationModel>();\n            CreatedTimestamp = template.CreatedTimestamp;\n            Context = template.Context;\n            ServiceMessageContext = template.ServiceMessageContext;\n            ApplicationUri = template.ApplicationUri;\n            EndpointUrl = template.EndpointUrl;\n            EventTypeName = template.EventTypeName;\n            PublishTimestamp = template.PublishTimestamp;\n            PublishSequenceNumber = template.PublishSequenceNumber;\n            MessageType = template.MessageType;\n            SequenceNumber = template.SequenceNumber;\n        }\n\n        /// <inheritdoc/>\n        public bool TryUpgradeToKeyFrame(ISubscriber owner)\n        {\n            if (MessageType == MessageType.KeyFrame)\n            {\n                // Already a key frame\n                return true;\n            }\n            if (_outer != null && _outer.TryGetNotifications(owner, out var allNotifications))\n            {\n                MessageType = MessageType.KeyFrame;\n\n                if (Notifications.IsReadOnly)\n                {\n                    Notifications = [.. allNotifications];\n                }\n                else\n                {\n                    Notifications.Clear();\n                    Notifications.AddRange(allNotifications);\n                }\n                return true;\n            }\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _advance?.Dispose();\n        }\n\n#if DEBUG\n        /// <inheritdoc/>\n        public void MarkProcessed()\n        {\n            _processed = true;\n        }\n\n        /// <inheritdoc/>\n        public void DebugAssertProcessed()\n        {\n            if (Context == null || _processed)\n            {\n                return;\n            }\n            Debug.Fail(\"Item not processed\");\n        }\n        private bool _processed;\n#endif\n\n        /// <summary>\n        /// Get diagnostics info from message\n        /// </summary>\n        /// <param name=\"modelChanges\"></param>\n        /// <param name=\"heartbeats\"></param>\n        /// <param name=\"overflow\"></param>\n        /// <returns></returns>\n        internal int GetDiagnosticCounters(out int modelChanges, out int heartbeats,\n            out int overflow)\n        {\n            modelChanges = 0;\n            heartbeats = 0;\n            overflow = 0;\n            foreach (var n in Notifications)\n            {\n                if (n.Flags.HasFlag(MonitoredItemSourceFlags.ModelChanges))\n                {\n                    modelChanges++;\n                }\n                else if (n.Flags.HasFlag(MonitoredItemSourceFlags.Heartbeat))\n                {\n                    heartbeats++;\n                }\n                overflow += n.Overflow;\n            }\n            return Notifications.Count;\n        }\n\n        private readonly OpcUaSubscription? _outer;\n        private readonly IDisposable? _advance;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/StackExtensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Opc.Ua;\n\n    /// <summary>\n    /// Samples message extension flags\n    /// </summary>\n    internal static class JsonDataSetMessageContentMaskEx\n    {\n        /// <summary>\n        /// Extra fields included\n        /// </summary>\n        public const JsonDataSetMessageContentMask ExtensionFields = (JsonDataSetMessageContentMask)0x02000000;\n\n        /// <summary>\n        /// Node id included\n        /// </summary>\n        public const JsonDataSetMessageContentMask NodeId = (JsonDataSetMessageContentMask)0x10000000;\n\n        /// <summary>\n        /// Endpoint url included\n        /// </summary>\n        public const JsonDataSetMessageContentMask EndpointUrl = (JsonDataSetMessageContentMask)0x20000000;\n\n        /// <summary>\n        /// Application uri\n        /// </summary>\n        public const JsonDataSetMessageContentMask ApplicationUri = (JsonDataSetMessageContentMask)0x40000000;\n\n        /// <summary>\n        /// Display name included\n        /// </summary>\n        public const JsonDataSetMessageContentMask DisplayName = (JsonDataSetMessageContentMask)0x80000000;\n    }\n\n    /// <summary>\n    /// Extensions for fields\n    /// </summary>\n    internal static class DataSetFieldContentMaskEx\n    {\n        /// <summary>\n        /// Degrade a single data set field to just value instead of writing key value dictionary object\n        /// </summary>\n        public const DataSetFieldContentMask SingleFieldDegradeToValue = (DataSetFieldContentMask)64;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Extensions/EndPointEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace System.Net\n{\n    using System.Net.Sockets;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Endpoint extensions\n    /// </summary>\n    public static class EndPointEx\n    {\n        /// <summary>\n        /// Get ip address from endpoint if the endpoint is an\n        /// IPEndPoint.  Otherwise return null.\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"preferv4\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public static IPAddress GetIPAddress(this EndPoint endpoint,\n            bool preferv4 = false)\n        {\n            if (endpoint is not IPEndPoint ipe)\n            {\n                throw new ArgumentException(\n                    \"Failed to convert endpoint to ip endpoint.\");\n            }\n            var address = ipe.Address;\n            if (preferv4 &&\n                address.AddressFamily == AddressFamily.InterNetworkV6 &&\n                address.IsIPv4MappedToIPv6)\n            {\n                return address.MapToIPv4();\n            }\n            return address;\n        }\n\n        /// <summary>\n        /// Get port from endpoint if the endpoint is an\n        /// IPEndPoint.  Otherwise return -1.\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <returns></returns>\n        public static int GetPort(this EndPoint endpoint)\n        {\n            if (endpoint is IPEndPoint ipe)\n            {\n                return ipe.Port;\n            }\n            return -1;\n        }\n\n        /// <summary>\n        /// Resolve endpoint to host:port or throw.\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <returns></returns>\n        public static string Resolve(this EndPoint endpoint)\n        {\n            var entry = endpoint.GetIPAddress().GetHostEntry();\n            return $\"{entry.HostName}:{endpoint.GetPort()}\";\n        }\n\n        /// <summary>\n        /// Resolve endpoint to host:port or throw.\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <returns></returns>\n        public static async Task<string> ResolveAsync(this EndPoint endpoint)\n        {\n            var entry = await endpoint.GetIPAddress().GetHostEntryAsync().ConfigureAwait(false);\n            return $\"{entry.HostName}:{endpoint.GetPort()}\";\n        }\n\n        /// <summary>\n        /// Resolve endpoint to host:port or return address:port as\n        /// string if resolve fails\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <returns></returns>\n        public static string TryResolve(this EndPoint endpoint)\n        {\n            try\n            {\n                return endpoint.Resolve();\n            }\n            catch\n            {\n                return $\"{endpoint.GetIPAddress(true)}:{endpoint.GetPort()}\";\n            }\n        }\n\n        /// <summary>\n        /// Resolve endpoint to host:port or return address:port as\n        /// string if resolve fails\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <returns></returns>\n        public static async Task<string> TryResolveAsync(this EndPoint endpoint)\n        {\n            try\n            {\n                return await endpoint.ResolveAsync().ConfigureAwait(false);\n            }\n            catch\n            {\n                return $\"{endpoint.GetIPAddress(true)}:{endpoint.GetPort()}\";\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Extensions/IPAddressEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace System.Net\n{\n    using System.Threading.Tasks;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models;\n\n    /// <summary>\n    /// Ip address extensions\n    /// </summary>\n    public static class IPAddressEx\n    {\n        /// <summary>\n        /// Clone address as v4 address\n        /// </summary>\n        /// <param name=\"address\"></param>\n        /// <returns></returns>\n        public static IPv4Address AsV4(this IPAddress address)\n        {\n            return new IPv4Address(address.GetAddressBytes());\n        }\n\n        /// <summary>\n        /// Resolve address to host entry\n        /// </summary>\n        /// <param name=\"address\"></param>\n        /// <returns></returns>\n        public static IPHostEntry GetHostEntry(this IPAddress address)\n        {\n            return Dns.GetHostEntry(address);\n        }\n\n        /// <summary>\n        /// Resolve address to host\n        /// </summary>\n        /// <param name=\"address\"></param>\n        /// <returns></returns>\n        public static Task<IPHostEntry> GetHostEntryAsync(this IPAddress address)\n        {\n            return Dns.GetHostEntryAsync(address);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Extensions/NetworkInformationEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Net;\n    using System.Net.NetworkInformation;\n    using System.Net.Sockets;\n\n    /// <summary>\n    /// Network information extensions\n    /// </summary>\n    public static class NetworkInformationEx\n    {\n        /// <summary>\n        /// Get all interface addresses\n        /// </summary>\n        /// <param name=\"netclass\"></param>\n        /// <returns></returns>\n        public static IEnumerable<NetInterface> GetAllNetInterfaces(\n            NetworkClass netclass)\n        {\n            return NetworkInterface.GetAllNetworkInterfaces()\n                .Where(n =>\n                    n.NetworkInterfaceType.IsInClass(netclass) &&\n                    n.OperationalStatus == OperationalStatus.Up &&\n                    n.GetIPProperties()?.GatewayAddresses.Count > 0)\n                .SelectMany(n => n.GetIPProperties().UnicastAddresses\n                    .Select(x => new NetInterface(n.Name,\n                        n.GetPhysicalAddress(),\n                        x.Address,\n                        x.IPv4Mask,\n                        n.GetIPProperties().GatewayAddresses\n                            .First(a => a != null).Address,\n                        n.GetIPProperties().DnsSuffix,\n                        n.GetIPProperties().DnsAddresses)))\n                .Where(t =>\n                    t.UnicastAddress.AddressFamily == AddressFamily.InterNetwork &&\n                    !IPAddress.IsLoopback(t.UnicastAddress))\n                .Distinct();\n        }\n\n        /// <summary>\n        /// Check whether the interface type fits the class\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"netclass\"></param>\n        /// <returns></returns>\n        public static bool IsInClass(this NetworkInterfaceType type,\n            NetworkClass netclass)\n        {\n            switch (type)\n            {\n                case NetworkInterfaceType.Ethernet:\n                case NetworkInterfaceType.Ethernet3Megabit:\n                case NetworkInterfaceType.GigabitEthernet:\n                case NetworkInterfaceType.FastEthernetT:\n                case NetworkInterfaceType.FastEthernetFx:\n                case NetworkInterfaceType.Slip:\n                case NetworkInterfaceType.IPOverAtm:\n                    return (netclass & NetworkClass.Wired) != 0;\n\n                case NetworkInterfaceType.BasicIsdn:\n                case NetworkInterfaceType.PrimaryIsdn:\n                case NetworkInterfaceType.Isdn:\n                case NetworkInterfaceType.GenericModem:\n                case NetworkInterfaceType.AsymmetricDsl:\n                case NetworkInterfaceType.SymmetricDsl:\n                case NetworkInterfaceType.RateAdaptDsl:\n                case NetworkInterfaceType.VeryHighSpeedDsl:\n                case NetworkInterfaceType.MultiRateSymmetricDsl:\n                case NetworkInterfaceType.Ppp:\n                    return (netclass & NetworkClass.Modem) != 0;\n\n                case NetworkInterfaceType.Wireless80211:\n                case NetworkInterfaceType.Wman:\n                case NetworkInterfaceType.Wwanpp:\n                case NetworkInterfaceType.Wwanpp2:\n                    return (netclass & NetworkClass.Wireless) != 0;\n                case NetworkInterfaceType.Tunnel:\n                    return (netclass & NetworkClass.Tunnel) != 0;\n\n                case NetworkInterfaceType.TokenRing:\n                case NetworkInterfaceType.HighPerformanceSerialBus:\n                case NetworkInterfaceType.Fddi:\n                case NetworkInterfaceType.Atm:\n                case NetworkInterfaceType.Loopback:\n                    return false;\n            }\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Extensions/PhysicalAddressEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport\n{\n    using System.Net.NetworkInformation;\n\n    /// <summary>\n    /// Physical address extensions\n    /// </summary>\n    public static class PhysicalAddressEx\n    {\n        /// <summary>\n        /// Clone address\n        /// </summary>\n        /// <param name=\"address\"></param>\n        /// <returns></returns>\n        public static PhysicalAddress Copy(this PhysicalAddress address)\n        {\n            return new PhysicalAddress(address.GetAddressBytes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/IAsyncProbe.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport\n{\n    using System;\n    using System.Net.Sockets;\n\n    /// <summary>\n    /// Async port probe\n    /// </summary>\n    public interface IAsyncProbe : IDisposable\n    {\n        /// <summary>\n        /// Complete probe using the passed in socket\n        /// event arg.\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"arg\"></param>\n        /// <param name=\"ok\">\n        /// If the probe returns true, this value\n        /// indicates whether the port is a valid port.\n        /// </param>\n        /// <param name=\"timeout\">Async timeout</param>\n        /// <returns>\n        /// false if expected to be called again.\n        /// true if probe is complete.\n        /// </returns>\n        bool OnComplete(int index, SocketAsyncEventArgs arg,\n            out bool ok, out int timeout);\n\n        /// <summary>\n        /// Reset probe to beginning cancelling any\n        /// outstanding socket operations.\n        /// </summary>\n        /// <returns>false if not cancelled</returns>\n        bool Reset();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/IPortProbe.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport\n{\n    /// <summary>\n    /// Port probe factory\n    /// </summary>\n    public interface IPortProbe\n    {\n        /// <summary>\n        /// Create async probe handler\n        /// </summary>\n        /// <returns></returns>\n        IAsyncProbe Create();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/IScanner.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport\n{\n    using System;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Scanner interface\n    /// </summary>\n    public interface IScanner : IDisposable\n    {\n        /// <summary>\n        /// Number of currently active probes\n        /// </summary>\n        int ActiveProbes { get; }\n\n        /// <summary>\n        /// Items scanned so far\n        /// </summary>\n        int ScanCount { get; }\n\n        /// <summary>\n        /// Task that completes when scan is done.\n        /// </summary>\n        Task WaitToCompleteAsync();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Models/AddressRange.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Globalization;\n    using System.Linq;\n    using System.Net;\n    using System.Text;\n\n    /// <summary>\n    /// Represents a range of ipv4 addresses\n    /// </summary>\n    public sealed class AddressRange\n    {\n        /// <summary>\n        /// Name of the Network interface.\n        /// </summary>\n        public string Nic { get; }\n\n        /// <summary>\n        /// Lowest address in range in host order\n        /// </summary>\n        public uint Low { get; }\n\n        /// <summary>\n        /// Highest address in range in host order\n        /// </summary>\n        public uint High { get; }\n\n        /// <summary>\n        /// Number of addresses in range\n        /// </summary>\n        public int Count => (int)(High - Low) + 1;\n\n        /// <summary>\n        /// Create address range\n        /// </summary>\n        /// <param name=\"low\"></param>\n        /// <param name=\"high\"></param>\n        /// <param name=\"nic\"></param>\n        public AddressRange(uint low, uint high,\n            string? nic = null)\n        {\n            Nic = string.IsNullOrEmpty(nic) ? kNullNicName : nic;\n            Low = _cur = low > high ? high : low;\n            High = high < low ? low : high;\n        }\n\n        /// <summary>\n        /// Create address range\n        /// </summary>\n        /// <param name=\"address\"></param>\n        /// <param name=\"suffix\"></param>\n        /// <param name=\"nic\"></param>\n        public AddressRange(IPAddress address, int suffix,\n            string? nic = null)\n        {\n            ArgumentNullException.ThrowIfNull(address);\n            if (suffix > 32)\n            {\n                throw new ArgumentException(\"Suffix too large\", nameof(suffix));\n            }\n            var curAddr = (uint)IPAddress.NetworkToHostOrder(\n                (int)BitConverter.ToUInt32(\n                    address.GetAddressBytes(), 0));\n            var mask = 0xffffffff << (32 - suffix);\n            High = curAddr | ~mask;\n            Low = _cur = curAddr & mask;\n            Nic = string.IsNullOrEmpty(nic) ? kNullNicName : nic;\n\n            System.Diagnostics.Debug.Assert(Low <= High);\n            System.Diagnostics.Debug.Assert(High != 0);\n        }\n\n        /// <summary>\n        /// Create address range from unicast address uinfo\n        /// </summary>\n        /// <param name=\"itf\"></param>\n        /// <param name=\"localOnly\"></param>\n        /// <param name=\"suffix\"></param>\n        public AddressRange(NetInterface itf,\n            bool localOnly = false, int? suffix = null)\n        {\n            ArgumentNullException.ThrowIfNull(itf);\n            var curAddr = (uint)new IPv4Address(itf.UnicastAddress);\n            Nic = string.IsNullOrEmpty(itf.Name) ? kNullNicName : itf.Name;\n            if (localOnly)\n            {\n                // Add local address only\n                High = curAddr;\n                Low = _cur = curAddr;\n            }\n            else\n            {\n                var mask = suffix == null ?\n                    (uint)new IPv4Address(itf.SubnetMask) :\n                        0xffffffff << (32 - suffix.Value);\n\n                High = curAddr | ~mask;\n                Low = _cur = curAddr & mask;\n            }\n            System.Diagnostics.Debug.Assert(Low <= High);\n            System.Diagnostics.Debug.Assert(High != 0);\n        }\n\n        /// <summary>\n        /// Create address range from address and subnet mask\n        /// </summary>\n        /// <param name=\"address\"></param>\n        /// <param name=\"subnet\"></param>\n        /// <param name=\"suffix\"></param>\n        /// <param name=\"nic\"></param>\n        public AddressRange(IPAddress address, IPAddress subnet,\n            int? suffix = null, string? nic = null)\n        {\n            ArgumentNullException.ThrowIfNull(address);\n            ArgumentNullException.ThrowIfNull(subnet);\n\n            var mask = suffix == null ?\n                (uint)new IPv4Address(subnet) :\n                    0xffffffff << (32 - suffix.Value);\n\n            var curAddr = new IPv4Address(address);\n            Nic = string.IsNullOrEmpty(nic) ? kNullNicName : nic;\n            High = curAddr | ~mask;\n            Low = _cur = curAddr & mask;\n\n            System.Diagnostics.Debug.Assert(Low <= High);\n            System.Diagnostics.Debug.Assert(High != 0);\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (obj is not AddressRange range)\n            {\n                return false;\n            }\n            return Low == range.Low && High == range.High;\n        }\n\n        /// <inheritdoc/>\n        public static bool operator ==(AddressRange range1, AddressRange range2) =>\n            EqualityComparer<AddressRange>.Default.Equals(range1, range2);\n        /// <inheritdoc/>\n        public static bool operator !=(AddressRange range1, AddressRange range2) =>\n            !(range1 == range2);\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return HashCode.Combine(Low, High);\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            var sb = new StringBuilder();\n            AppendTo(sb);\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Clone\n        /// </summary>\n        /// <returns></returns>\n        public AddressRange Copy()\n        {\n            return new AddressRange(Low, High, Nic);\n        }\n\n        /// <summary>\n        /// Parses a series of address ranges\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"ranges\"></param>\n        /// <returns></returns>\n        public static bool TryParse(string value,\n            [NotNullWhen(true)] out IEnumerable<AddressRange>? ranges)\n        {\n            try\n            {\n                ranges = Parse(value);\n                return true;\n            }\n            catch\n            {\n                ranges = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Format a series of address ranges\n        /// </summary>\n        /// <param name=\"ranges\"></param>\n        /// <returns></returns>\n        public static string Format(IEnumerable<AddressRange> ranges)\n        {\n            var sb = new StringBuilder();\n            var first = true;\n            foreach (var range in Merge(ranges))\n            {\n                if (!first)\n                {\n                    sb.Append(';');\n                }\n                first = false;\n                range.AppendTo(sb);\n            }\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Parse\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"></exception>\n        public static IEnumerable<AddressRange> Parse(string value)\n        {\n            if (string.IsNullOrEmpty(value))\n            {\n                throw new ArgumentNullException(nameof(value));\n            }\n            var split = value.Split([';', ','],\n                StringSplitOptions.RemoveEmptyEntries);\n            var unmerged = split\n                .SelectMany(s =>\n                {\n                    var nic = string.Empty;\n                    var x = s.Split('[', StringSplitOptions.RemoveEmptyEntries);\n                    if (x.Length > 1)\n                    {\n                        var postFix = x[1].Split(']');\n                        if (postFix.Length > 1)\n                        {\n                            nic = postFix[0];\n                        }\n                        s = x[0].Trim();\n                    }\n                    x = s.Split('/', StringSplitOptions.RemoveEmptyEntries);\n                    if (x.Length != 2)\n                    {\n                        x = s.Split('-', StringSplitOptions.RemoveEmptyEntries);\n                        if (x.Length != 2)\n                        {\n                            throw new FormatException(\"Bad suffix format\");\n                        }\n                        // Combine into cidr ranges and parse so we get distinct ranges\n                        return Parse(new AddressRange(\n                            new IPv4Address(IPAddress.Parse(x[0])),\n                            new IPv4Address(IPAddress.Parse(x[1])), nic).ToString());\n                    }\n                    var suffix = int.Parse(x[1], CultureInfo.InvariantCulture);\n                    if (suffix == 0 || suffix > 32)\n                    {\n                        throw new FormatException(\"Bad suffix value\");\n                    }\n                    if (x[0] == \"*\")\n                    {\n                        return NetworkInformationEx.GetAllNetInterfaces(\n                            NetworkClass.Wired)\n                        .Select(t => new AddressRange(t, false, suffix));\n                    }\n                    return new AddressRange(IPAddress.Parse(x[0]), suffix, nic)\n                        .YieldReturn();\n                })\n                .Distinct()\n                .ToList();\n            return Merge(unmerged);\n        }\n\n        /// <summary>\n        /// Fills next batch of addresses\n        /// </summary>\n        /// <param name=\"batch\"></param>\n        /// <param name=\"count\"></param>\n        public void FillNextBatch(IList<uint> batch, int count)\n        {\n            for (var i = 0; _cur <= High && i < count; i++)\n            {\n                batch.Add(_cur++);\n            }\n        }\n\n        /// <summary>\n        /// Reset range\n        /// </summary>\n        public void Reset()\n        {\n            _cur = Low;\n        }\n\n        /// <summary>\n        /// Tests contains address\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public bool Contains(IPv4Address value)\n        {\n            return value >= Low && value <= High;\n        }\n\n        /// <summary>\n        /// Whether it overlaps with another address range\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public bool Overlaps(AddressRange other)\n        {\n            return\n                Contains(other.Low) ||\n                Contains(other.High) ||\n                other.Contains(Low) ||\n                other.Contains(High);\n        }\n\n        /// <summary>\n        /// Merge overlapping ranges\n        /// </summary>\n        /// <param name=\"ranges\"></param>\n        /// <returns></returns>\n        private static IEnumerable<AddressRange> Merge(IEnumerable<AddressRange> ranges)\n        {\n            var results = new Stack<AddressRange>();\n            if (ranges != null)\n            {\n                foreach (var range in ranges.OrderBy(k => k.Low))\n                {\n                    if (results.Count == 0)\n                    {\n                        results.Push(range);\n                    }\n                    else\n                    {\n                        var top = results.Peek();\n                        if (top.Overlaps(range))\n                        {\n                            var nic = (top.Nic + range.Nic)\n                                .Replace(\"localhost\", \"\", StringComparison.InvariantCulture)\n                                .Replace(kNullNicName, \"\", StringComparison.InvariantCulture);\n                            var union = new AddressRange(\n                                top.Low < range.Low ? top.Low : range.Low,\n                                top.High > range.High ? top.High : range.High, nic);\n                            results.Pop();\n                            results.Push(union);\n                        }\n                        else\n                        {\n                            results.Push(range);\n                        }\n                    }\n                }\n            }\n            return results.Reverse();\n        }\n\n        /// <summary>\n        /// Convert address range to cidr formatted ip strings\n        /// </summary>\n        /// <param name=\"sb\"></param>\n        /// <returns></returns>\n        private void AppendTo(StringBuilder sb)\n        {\n            long start = Low;\n            long end = High;\n            var first = true;\n            while (end >= start)\n            {\n                byte subnetSize = 32;\n                while (subnetSize > 0)\n                {\n                    var mask = (1L << 32) - (1L << (32 - (subnetSize - 1)));\n                    if ((start & mask) != start)\n                    {\n                        break;\n                    }\n                    subnetSize--;\n                }\n                var x = Math.Floor(Math.Log(end - start + 1) / Math.Log(2));\n                var maxDiff = (byte)(32 - x);\n                if (subnetSize < maxDiff)\n                {\n                    subnetSize = maxDiff;\n                }\n                var ip = ((IPv4Address)start).ToString();\n                if (!first)\n                {\n                    sb.Append(';');\n                }\n                first = false;\n                sb.Append(ip).Append('/').Append(subnetSize);\n                if (Nic != kNullNicName)\n                {\n                    sb.Append(\" [\").Append(Nic).Append(']');\n                }\n                start += 1L << (32 - subnetSize);\n            }\n        }\n\n        private const string kNullNicName = \"custom\";\n        private uint _cur;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Models/IPv4Address.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Net;\n\n    /// <summary>\n    /// IPV4 address\n    /// </summary>\n    public sealed class IPv4Address : IPAddress, IComparable<IPv4Address>,\n        IComparable<IPAddress>\n    {\n        /// <summary>\n        /// Create address\n        /// </summary>\n        /// <param name=\"address\"></param>\n        private IPv4Address(uint address) :\n            base(address)\n        {\n        }\n\n        /// <summary>\n        /// Create address\n        /// </summary>\n        /// <param name=\"address\"></param>\n        public IPv4Address(IPAddress address) :\n            this(address.GetAddressBytes())\n        {\n        }\n\n        /// <summary>\n        /// Create address\n        /// </summary>\n        /// <param name=\"address\"></param>\n        public IPv4Address(byte[] address) : base(address)\n        {\n            if (address.Length != 4)\n            {\n                throw new ArgumentException(nameof(address.Length));\n            }\n        }\n\n        /// <summary>\n        /// Convert to and from uint\n        /// </summary>\n        /// <param name=\"value\"></param>\n        public static implicit operator uint(IPv4Address value) => (uint)\n            NetworkToHostOrder((int)BitConverter.ToUInt32(value.GetAddressBytes(), 0));\n\n        /// <summary>\n        /// Convert back to address from uint\n        /// </summary>\n        /// <param name=\"value\"></param>\n        public static implicit operator IPv4Address(uint value) =>\n            new((uint)HostToNetworkOrder((int)value));\n\n        /// <summary>\n        /// Convert from long\n        /// </summary>\n        /// <param name=\"value\"></param>\n        public static explicit operator long(IPv4Address value) =>\n            NetworkToHostOrder((int)BitConverter.ToUInt32(value.GetAddressBytes(), 0));\n\n        /// <summary>\n        /// Convert back to address from long\n        /// </summary>\n        /// <param name=\"value\"></param>\n        public static explicit operator IPv4Address(long value) =>\n            new((uint)HostToNetworkOrder((int)value));\n\n        /// <summary>\n        /// Add\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"x\"></param>\n        /// <returns></returns>\n        public static IPv4Address operator +(IPv4Address value, int x) =>\n            new((uint)((uint)value + x));\n\n        /// <summary>\n        /// Subtract\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"x\"></param>\n        /// <returns></returns>\n        public static IPv4Address operator -(IPv4Address value, int x) =>\n            new((uint)((uint)value - x));\n\n        /// <summary>\n        /// Increment by 1\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static IPv4Address operator ++(IPv4Address value) => value + 1;\n\n        /// <summary>\n        /// Decrement by 1\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static IPv4Address operator --(IPv4Address value) => value - 1;\n\n        /// <inheritdoc/>\n        public static bool operator ==(IPv4Address left, IPv4Address right) =>\n            EqualityComparer<IPv4Address>.Default.Equals(left, right);\n\n        /// <inheritdoc/>\n        public static bool operator !=(IPv4Address left, IPv4Address right) =>\n            !(left == right);\n\n        /// <inheritdoc/>\n        public static bool operator <(IPv4Address left, IPAddress right) =>\n            left.CompareTo(right) < 0;\n        /// <inheritdoc/>\n        public static bool operator <=(IPv4Address left, IPAddress right) =>\n            left.CompareTo(right) <= 0;\n        /// <inheritdoc/>\n        public static bool operator >(IPv4Address left, IPAddress right) =>\n            left.CompareTo(right) > 0;\n        /// <inheritdoc/>\n        public static bool operator >=(IPv4Address left, IPAddress right) =>\n            left.CompareTo(right) >= 0;\n        /// <inheritdoc/>\n        public static bool operator <(IPv4Address left, IPv4Address right) =>\n            left.CompareTo(right) < 0;\n        /// <inheritdoc/>\n        public static bool operator <=(IPv4Address left, IPv4Address right) =>\n            left.CompareTo(right) <= 0;\n        /// <inheritdoc/>\n        public static bool operator >(IPv4Address left, IPv4Address right) =>\n            left.CompareTo(right) > 0;\n        /// <inheritdoc/>\n        public static bool operator >=(IPv4Address left, IPv4Address right) =>\n            left.CompareTo(right) >= 0;\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return base.GetHashCode();\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? comparand)\n        {\n            return base.Equals(comparand);\n        }\n\n        /// <inheritdoc/>\n        public int CompareTo(IPv4Address? other)\n        {\n            if (other is null)\n            {\n                return int.MinValue;\n            }\n            return (int)(this - other);\n        }\n\n        /// <inheritdoc/>\n        public int CompareTo(IPAddress? other)\n        {\n            return CompareTo(other?.AsV4());\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Models/NetInterface.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models\n{\n    using System.Collections.Generic;\n    using System.Net;\n    using System.Net.NetworkInformation;\n\n    /// <summary>\n    /// Network interface model\n    /// </summary>\n    public sealed class NetInterface\n    {\n        /// <summary>\n        /// Network interface name\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// Address info\n        /// </summary>\n        public IPAddress UnicastAddress { get; }\n\n        /// <summary>\n        /// Subnet mask\n        /// </summary>\n        public IPAddress SubnetMask { get; }\n\n        /// <summary>\n        /// Mac address of interface\n        /// </summary>\n        public PhysicalAddress? MacAddress { get; }\n\n        /// <summary>\n        /// Gateway address\n        /// </summary>\n        public IPAddress? Gateway { get; }\n\n        /// <summary>\n        /// Domain name\n        /// </summary>\n        public string? DnsSuffix { get; }\n\n        /// <summary>\n        /// Name servers\n        /// </summary>\n        public IEnumerable<IPAddress> DnsServers { get; }\n\n        /// <summary>\n        /// Create interface address\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"unicastAddress\"></param>\n        /// <param name=\"subnetMask\"></param>\n        public NetInterface(string name,\n            IPAddress unicastAddress, IPAddress subnetMask)\n        {\n            Name = name;\n            UnicastAddress = unicastAddress;\n            SubnetMask = subnetMask;\n            DnsServers = [];\n        }\n\n        /// <summary>\n        /// Create context\n        /// </summary>\n        /// <param name=\"name\"></param>\n        /// <param name=\"macAddress\"></param>\n        /// <param name=\"unicastAddress\"></param>\n        /// <param name=\"subnetMask\"></param>\n        /// <param name=\"gateway\"></param>\n        /// <param name=\"dnsSuffix\"></param>\n        /// <param name=\"dnsServers\"></param>\n        public NetInterface(string name, PhysicalAddress macAddress,\n            IPAddress unicastAddress, IPAddress subnetMask, IPAddress gateway,\n            string dnsSuffix, IEnumerable<IPAddress> dnsServers) :\n                this(name, unicastAddress, subnetMask)\n        {\n            Gateway = gateway;\n            MacAddress = macAddress;\n            DnsServers = dnsServers;\n            DnsSuffix = dnsSuffix;\n        }\n\n        /// <summary>\n        /// Equality\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public override bool Equals(object? obj)\n        {\n            return obj is NetInterface context &&\n                EqualityComparer<PhysicalAddress>.Default.Equals(\n                    MacAddress, context.MacAddress) &&\n                EqualityComparer<IPAddress>.Default.Equals(\n                    UnicastAddress, context.UnicastAddress) &&\n                EqualityComparer<IPAddress>.Default.Equals(\n                    SubnetMask, context.SubnetMask) &&\n                EqualityComparer<IPAddress>.Default.Equals(\n                    Gateway, context.Gateway) &&\n                // EqualityComparer<IPAddress>.Default.Equals(\n                //     DnsServers, context.DnsServers) &&\n                EqualityComparer<string>.Default.Equals(\n                    DnsSuffix, context.DnsSuffix);\n        }\n\n        /// <summary>\n        /// Get unique hash code\n        /// </summary>\n        /// <returns></returns>\n        public override int GetHashCode()\n        {\n            return System.HashCode.Combine(MacAddress, UnicastAddress, SubnetMask, Gateway, DnsSuffix);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Models/NetworkClass.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models\n{\n    using System;\n\n    /// <summary>\n    /// Network class flags for network selection\n    /// </summary>\n    [Flags]\n    public enum NetworkClass\n    {\n        /// <summary>\n        /// None class\n        /// </summary>\n        None = 0x0,\n\n        /// <summary>\n        /// Ethernet\n        /// </summary>\n        Wired = 0x1,\n\n        /// <summary>\n        /// Modem like, e.g. dsl, ppp\n        /// </summary>\n        Modem = 0x2,\n\n        /// <summary>\n        /// Mobile or 802.11\n        /// </summary>\n        Wireless = 0x4,\n\n        /// <summary>\n        /// Tunnels\n        /// </summary>\n        Tunnel = 0x8,\n\n        /// <summary>\n        /// Any reasonable network\n        /// </summary>\n        All = Wired | Modem | Wireless | Tunnel\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Models/PortRange.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Globalization;\n    using System.Linq;\n    using System.Net;\n    using System.Text;\n\n    /// <summary>\n    /// A port range\n    /// </summary>\n    public sealed class PortRange\n    {\n        /// <summary>\n        /// Number of ports in range\n        /// </summary>\n        public int Count => _upper - _lower + 1;\n\n        /// <summary>\n        /// Create port range\n        /// </summary>\n        /// <param name=\"lower\"></param>\n        /// <param name=\"upper\"></param>\n        public PortRange(int lower, int upper)\n        {\n            _lower = Math.Max(IPEndPoint.MinPort, Math.Min(lower, upper));\n            _upper = Math.Min(IPEndPoint.MaxPort, Math.Max(lower, upper));\n        }\n\n        /// <summary>\n        /// Create port range\n        /// </summary>\n        /// <param name=\"value\"></param>\n        public PortRange(int value) :\n            this(value, value)\n        {\n        }\n\n        /// <summary>\n        /// Yield endpoints\n        /// </summary>\n        /// <param name=\"address\"></param>\n        /// <returns></returns>\n        public IEnumerable<IPEndPoint> GetEndpoints(IPAddress address)\n        {\n            for (var port = _lower; port <= _upper; port++)\n            {\n                yield return new IPEndPoint(address, port);\n            }\n        }\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj)\n        {\n            if (obj is not PortRange range)\n            {\n                return false;\n            }\n            return _lower == range._lower && _upper == range._upper;\n        }\n\n        /// <inheritdoc/>\n        public static bool operator ==(PortRange range1, PortRange range2) =>\n            EqualityComparer<PortRange>.Default.Equals(range1, range2);\n        /// <inheritdoc/>\n        public static bool operator !=(PortRange range1, PortRange range2) =>\n            !(range1 == range2);\n\n        /// <inheritdoc/>\n        public override int GetHashCode()\n        {\n            return HashCode.Combine(_lower, _upper);\n        }\n\n        /// <summary>\n        /// Tests contains value\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public bool Contains(int value)\n        {\n            return value >= _lower && value <= _upper;\n        }\n\n        /// <summary>\n        /// Whether it overlaps with another port range\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public bool Overlaps(PortRange other)\n        {\n            return\n                Contains(other._lower) ||\n                Contains(other._upper) ||\n                other.Contains(_lower) ||\n                other.Contains(_upper);\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            var sb = new StringBuilder();\n            AppendTo(sb);\n            return sb.ToString();\n        }\n\n        private readonly int _lower;\n        private readonly int _upper;\n\n        /// <summary>\n        /// Parses a series of port ranges\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"ranges\"></param>\n        /// <returns></returns>\n        public static bool TryParse(string value,\n            [NotNullWhen(true)] out IEnumerable<PortRange>? ranges)\n        {\n            try\n            {\n                ranges = Parse(value);\n                return true;\n            }\n            catch\n            {\n                ranges = null;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Format a series of address ranges\n        /// </summary>\n        /// <param name=\"ranges\"></param>\n        /// <returns></returns>\n        public static string Format(IEnumerable<PortRange> ranges)\n        {\n            var sb = new StringBuilder();\n            var first = true;\n            foreach (var range in ranges)\n            {\n                if (!first)\n                {\n                    sb.Append(';');\n                }\n                first = false;\n                range.AppendTo(sb);\n            }\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// Parse range\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static IEnumerable<PortRange> Parse(string value)\n        {\n            var parsed = value.Split([';', ','],\n                StringSplitOptions.RemoveEmptyEntries).Select(s =>\n                {\n                    var x = s.Split('-');\n                    if (x.Length > 2)\n                    {\n                        throw new FormatException(\"Bad range format\");\n                    }\n                    var lows = x[0].Trim();\n                    var highs = (x.Length == 2) ? x[1].Trim() : lows;\n\n                    var lowsInt = IPEndPoint.MinPort;\n                    var highsInt = IPEndPoint.MaxPort;\n\n                    if (lows != \"*\")\n                    {\n                        lowsInt = int.Parse(lows, CultureInfo.InvariantCulture);\n                    }\n                    if (highs != \"*\")\n                    {\n                        highsInt = int.Parse(highs, CultureInfo.InvariantCulture);\n                    }\n\n                    if (lowsInt < IPEndPoint.MinPort ||\n                        highsInt > IPEndPoint.MaxPort ||\n                        lowsInt > highsInt)\n                    {\n                        throw new ArgumentException(\"Port numbers are out of the range\", nameof(value));\n                    }\n\n                    return new PortRange(lowsInt, highsInt);\n                });\n            return Merge(parsed);\n        }\n\n        /// <summary>\n        /// Opc ua ports\n        /// </summary>\n        /// <returns></returns>\n        public static IEnumerable<PortRange> OpcUa\n        {\n            get\n            {\n                yield return new PortRange(4840, 4841);\n            }\n        }\n\n        /// <summary>\n        /// Well known opc ua ports\n        /// </summary>\n        /// <returns></returns>\n        public static IEnumerable<PortRange> WellKnown\n        {\n            get\n            {\n                yield return new PortRange(4840, 4841);\n                yield return new PortRange(48000, 48100);\n                yield return new PortRange(49320);\n                yield return new PortRange(50000);\n                yield return new PortRange(51200, 51300);\n                yield return new PortRange(62222);\n\n                // ... add more ports to well known range here\n            }\n        }\n\n        /// <summary>\n        /// All possible ports\n        /// </summary>\n        /// <returns></returns>\n        public static IEnumerable<PortRange> All\n        {\n            get\n            {\n                yield return new PortRange(IPEndPoint.MinPort, IPEndPoint.MaxPort);\n            }\n        }\n\n        /// <summary>\n        /// All IANA unassigned ports\n        /// </summary>\n        /// <returns></returns>\n        public static IEnumerable<PortRange> Unassigned\n        {\n            get\n            {\n                yield return new PortRange(4);\n                yield return new PortRange(6);\n                yield return new PortRange(8);\n                yield return new PortRange(10);\n                yield return new PortRange(12);\n                yield return new PortRange(14);\n                yield return new PortRange(15);\n                yield return new PortRange(16);\n                yield return new PortRange(26);\n                yield return new PortRange(28);\n                yield return new PortRange(30);\n                yield return new PortRange(32);\n                yield return new PortRange(34);\n                yield return new PortRange(36);\n                yield return new PortRange(40);\n                yield return new PortRange(60);\n                yield return new PortRange(81);\n                yield return new PortRange(100);\n                yield return new PortRange(114);\n                yield return new PortRange(258);\n                yield return new PortRange(272, 279);\n                yield return new PortRange(285);\n                yield return new PortRange(288, 307);\n                yield return new PortRange(325, 332);\n                yield return new PortRange(334, 343);\n                yield return new PortRange(703);\n                yield return new PortRange(708);\n                yield return new PortRange(717, 728);\n                yield return new PortRange(732, 740);\n                yield return new PortRange(743);\n                yield return new PortRange(745, 746);\n                yield return new PortRange(755, 757);\n                yield return new PortRange(766);\n                yield return new PortRange(768);\n                yield return new PortRange(778, 779);\n                yield return new PortRange(781, 785);\n                yield return new PortRange(786);\n                yield return new PortRange(787);\n                yield return new PortRange(788, 799);\n                yield return new PortRange(803, 809);\n                yield return new PortRange(811, 827);\n                yield return new PortRange(834, 846);\n                yield return new PortRange(849, 852);\n                yield return new PortRange(855, 859);\n                yield return new PortRange(863, 872);\n                yield return new PortRange(874, 885);\n                yield return new PortRange(889, 899);\n                yield return new PortRange(904, 909);\n                yield return new PortRange(914, 952);\n                yield return new PortRange(954, 988);\n                yield return new PortRange(1002, 1007);\n                yield return new PortRange(1009);\n                yield return new PortRange(1491);\n                yield return new PortRange(1895);\n                yield return new PortRange(1895);\n                yield return new PortRange(2194, 2196);\n                yield return new PortRange(2259);\n                yield return new PortRange(2369);\n                yield return new PortRange(2378);\n                yield return new PortRange(2693);\n                yield return new PortRange(2693);\n                yield return new PortRange(2794);\n                yield return new PortRange(2825);\n                yield return new PortRange(2873);\n                yield return new PortRange(2925);\n                yield return new PortRange(2999);\n                yield return new PortRange(2999);\n                yield return new PortRange(3092);\n                yield return new PortRange(3126);\n                yield return new PortRange(3301);\n                yield return new PortRange(3546);\n                yield return new PortRange(3694);\n                yield return new PortRange(3994);\n                yield return new PortRange(4048);\n                yield return new PortRange(4144);\n                yield return new PortRange(4194, 4196);\n                yield return new PortRange(4198);\n                yield return new PortRange(4315);\n                yield return new PortRange(4317, 4319);\n                yield return new PortRange(4332);\n                yield return new PortRange(4337, 4339);\n                yield return new PortRange(4363, 4365);\n                yield return new PortRange(4367);\n                yield return new PortRange(4380, 4388);\n                yield return new PortRange(4397, 4399);\n                yield return new PortRange(4424);\n                yield return new PortRange(4434, 4440);\n                yield return new PortRange(4459, 4483);\n                yield return new PortRange(4489, 4499);\n                yield return new PortRange(4501);\n                yield return new PortRange(4503, 4533);\n                yield return new PortRange(4539, 4544);\n                yield return new PortRange(4560, 4562);\n                yield return new PortRange(4564, 4565);\n                yield return new PortRange(4571, 4572);\n                yield return new PortRange(4574, 4589);\n                yield return new PortRange(4606, 4620);\n                yield return new PortRange(4622, 4657);\n                yield return new PortRange(4693, 4699);\n                yield return new PortRange(4705, 4710);\n                yield return new PortRange(4712, 4724);\n                yield return new PortRange(4734, 4736);\n                yield return new PortRange(4748, 4748);\n                yield return new PortRange(4757, 4773);\n                yield return new PortRange(4775, 4783);\n                yield return new PortRange(4792, 4799);\n                yield return new PortRange(4805, 4826);\n                yield return new PortRange(4828, 4836);\n                yield return new PortRange(4852, 4866);\n                yield return new PortRange(4872, 4875);\n                yield return new PortRange(4886, 4893);\n                yield return new PortRange(4895, 4898);\n                yield return new PortRange(4903, 4911);\n                yield return new PortRange(4916, 4935);\n                yield return new PortRange(4938, 4939);\n                yield return new PortRange(4943, 4948);\n                yield return new PortRange(4954, 4968);\n                yield return new PortRange(4972, 4979);\n                yield return new PortRange(4981, 4982);\n                yield return new PortRange(4983);\n                yield return new PortRange(4992, 4998);\n                yield return new PortRange(5016, 5019);\n                yield return new PortRange(5035, 5041);\n                yield return new PortRange(5076, 5077);\n                yield return new PortRange(5088, 5089);\n                yield return new PortRange(5095, 5098);\n                yield return new PortRange(5108, 5110);\n                yield return new PortRange(5113);\n                yield return new PortRange(5118, 5119);\n                yield return new PortRange(5121, 5132);\n                yield return new PortRange(5138, 5144);\n                yield return new PortRange(5147, 5149);\n                yield return new PortRange(5158, 5160);\n                yield return new PortRange(5169, 5171);\n                yield return new PortRange(5173, 5189);\n                yield return new PortRange(5198, 5199);\n                yield return new PortRange(5204, 5208);\n                yield return new PortRange(5210, 5214);\n                yield return new PortRange(5216, 5220);\n                yield return new PortRange(5238, 5244);\n                yield return new PortRange(5255, 5263);\n                yield return new PortRange(5266, 5268);\n                yield return new PortRange(5273, 5279);\n                yield return new PortRange(5283, 5297);\n                yield return new PortRange(5311);\n                yield return new PortRange(5316);\n                yield return new PortRange(5319);\n                yield return new PortRange(5322, 5342);\n                yield return new PortRange(5345, 5348);\n                yield return new PortRange(5365, 5396);\n                yield return new PortRange(5438, 5442);\n                yield return new PortRange(5444);\n                yield return new PortRange(5446, 5449);\n                yield return new PortRange(5451, 5452);\n                yield return new PortRange(5457, 5460);\n                yield return new PortRange(5466, 5469);\n                yield return new PortRange(5476, 5499);\n                yield return new PortRange(5508, 5549);\n                yield return new PortRange(5551, 5552);\n                yield return new PortRange(5558, 5564);\n                yield return new PortRange(5570, 5572);\n                yield return new PortRange(5576, 5578);\n                yield return new PortRange(5587, 5596);\n                yield return new PortRange(5606, 5617);\n                yield return new PortRange(5619, 5626);\n                yield return new PortRange(5640, 5645);\n                yield return new PortRange(5647, 5665);\n                yield return new PortRange(5667, 5669);\n                yield return new PortRange(5685, 5686);\n                yield return new PortRange(5690, 5692);\n                yield return new PortRange(5694, 5695);\n                yield return new PortRange(5697, 5699);\n                yield return new PortRange(5701, 5704);\n                yield return new PortRange(5706, 5712);\n                yield return new PortRange(5731, 5740);\n                yield return new PortRange(5749);\n                yield return new PortRange(5751, 5754);\n                yield return new PortRange(5756);\n                yield return new PortRange(5758, 5765);\n                yield return new PortRange(5772, 5776);\n                yield return new PortRange(5778, 5779);\n                yield return new PortRange(5788, 5792);\n                yield return new PortRange(5795, 5812);\n                yield return new PortRange(5815, 5840);\n                yield return new PortRange(5843, 5858);\n                yield return new PortRange(5860, 5862);\n                yield return new PortRange(5864, 5867);\n                yield return new PortRange(5869, 5882);\n                yield return new PortRange(5884, 5899);\n                yield return new PortRange(5901, 5909);\n                yield return new PortRange(5914, 5962);\n                yield return new PortRange(5964, 5967);\n                yield return new PortRange(5970, 5983);\n                yield return new PortRange(5994, 5998);\n                yield return new PortRange(6067);\n                yield return new PortRange(6078, 6079);\n                yield return new PortRange(6089, 6098);\n                yield return new PortRange(6119, 6120);\n                yield return new PortRange(6125, 6129);\n                yield return new PortRange(6131, 6132);\n                yield return new PortRange(6134, 6139);\n                yield return new PortRange(6150, 6158);\n                yield return new PortRange(6164, 6199);\n                yield return new PortRange(6202, 6208);\n                yield return new PortRange(6210, 6221);\n                yield return new PortRange(6223, 6240);\n                yield return new PortRange(6245, 6250);\n                yield return new PortRange(6254, 6266);\n                yield return new PortRange(6270, 6299);\n                yield return new PortRange(6302, 6305);\n                yield return new PortRange(6307, 6314);\n                yield return new PortRange(6318, 6319);\n                yield return new PortRange(6323);\n                yield return new PortRange(6327, 6342);\n                yield return new PortRange(6345, 6345);\n                yield return new PortRange(6348, 6349);\n                yield return new PortRange(6351, 6354);\n                yield return new PortRange(6356, 6359);\n                yield return new PortRange(6361, 6362);\n                yield return new PortRange(6364, 6369);\n                yield return new PortRange(6371, 6378);\n                yield return new PortRange(6380, 6381);\n                yield return new PortRange(6383, 6388);\n                yield return new PortRange(6391, 6399);\n                yield return new PortRange(6411, 6416);\n                yield return new PortRange(6422, 6431);\n                yield return new PortRange(6433, 6441);\n                yield return new PortRange(6447, 6454);\n                yield return new PortRange(6457, 6463);\n                yield return new PortRange(6465, 6470);\n                yield return new PortRange(6472, 6479);\n                yield return new PortRange(6490, 6499);\n                yield return new PortRange(6504);\n                yield return new PortRange(6512, 6512);\n                yield return new PortRange(6516, 6542);\n                yield return new PortRange(6545, 6546);\n                yield return new PortRange(6552, 6557);\n                yield return new PortRange(6559, 6565);\n                yield return new PortRange(6569, 6578);\n                yield return new PortRange(6584, 6587);\n                yield return new PortRange(6588);\n                yield return new PortRange(6589, 6599);\n                yield return new PortRange(6603, 6618);\n                yield return new PortRange(6630);\n                yield return new PortRange(6631);\n                yield return new PortRange(6637, 6639);\n                yield return new PortRange(6641, 6652);\n                yield return new PortRange(6654);\n                yield return new PortRange(6658, 6664);\n                yield return new PortRange(6674, 6677);\n                yield return new PortRange(6680, 6686);\n                yield return new PortRange(6691, 6695);\n                yield return new PortRange(6698, 6699);\n                yield return new PortRange(6700);\n                yield return new PortRange(6701);\n                yield return new PortRange(6702);\n                yield return new PortRange(6707, 6713);\n                yield return new PortRange(6717, 6766);\n                yield return new PortRange(6772, 6776);\n                yield return new PortRange(6779, 6783);\n                yield return new PortRange(6792, 6800);\n                yield return new PortRange(6802, 6816);\n                yield return new PortRange(6818, 6830);\n                yield return new PortRange(6832, 6840);\n                yield return new PortRange(6843, 6849);\n                yield return new PortRange(6851, 6867);\n                yield return new PortRange(6869, 6887);\n                yield return new PortRange(6889);\n                yield return new PortRange(6902, 6934);\n                yield return new PortRange(6937, 6945);\n                yield return new PortRange(6947, 6950);\n                yield return new PortRange(6952, 6960);\n                yield return new PortRange(6967, 6968);\n                yield return new PortRange(6971, 6996);\n                yield return new PortRange(7027, 7029);\n                yield return new PortRange(7032, 7039);\n                yield return new PortRange(7041, 7069);\n                yield return new PortRange(7074, 7079);\n                yield return new PortRange(7081, 7087);\n                yield return new PortRange(7089, 7094);\n                yield return new PortRange(7096, 7098);\n                yield return new PortRange(7102, 7106);\n                yield return new PortRange(7108, 7116);\n                yield return new PortRange(7118, 7120);\n                yield return new PortRange(7122, 7127);\n                yield return new PortRange(7130, 7160);\n                yield return new PortRange(7175, 7180);\n                yield return new PortRange(7182, 7199);\n                yield return new PortRange(7203, 7214);\n                yield return new PortRange(7217, 7226);\n                yield return new PortRange(7230, 7234);\n                yield return new PortRange(7238, 7243);\n                yield return new PortRange(7245, 7261);\n                yield return new PortRange(7263, 7271);\n                yield return new PortRange(7284, 7299);\n                yield return new PortRange(7360, 7364);\n                yield return new PortRange(7366, 7390);\n                yield return new PortRange(7396);\n                yield return new PortRange(7398, 7399);\n                yield return new PortRange(7403, 7409);\n                yield return new PortRange(7412, 7419);\n                yield return new PortRange(7422, 7425);\n                yield return new PortRange(7432, 7436);\n                yield return new PortRange(7438, 7442);\n                yield return new PortRange(7444, 7470);\n                yield return new PortRange(7472);\n                yield return new PortRange(7475, 7477);\n                yield return new PortRange(7479, 7490);\n                yield return new PortRange(7492, 7499);\n                yield return new PortRange(7502, 7507);\n                yield return new PortRange(7512, 7541);\n                yield return new PortRange(7552, 7559);\n                yield return new PortRange(7561, 7562);\n                yield return new PortRange(7564, 7565);\n                yield return new PortRange(7567, 7568);\n                yield return new PortRange(7571, 7573);\n                yield return new PortRange(7575, 7587);\n                yield return new PortRange(7589, 7605);\n                yield return new PortRange(7607, 7623);\n                yield return new PortRange(7625);\n                yield return new PortRange(7632);\n                yield return new PortRange(7634, 7647);\n                yield return new PortRange(7649, 7662);\n                yield return new PortRange(7664, 7671);\n                yield return new PortRange(7678, 7679);\n                yield return new PortRange(7681, 7682);\n                yield return new PortRange(7684, 7686);\n                yield return new PortRange(7688);\n                yield return new PortRange(7690, 7696);\n                yield return new PortRange(7698, 7699);\n                yield return new PortRange(7702, 7706);\n                yield return new PortRange(7709, 7719);\n                yield return new PortRange(7721, 7723);\n                yield return new PortRange(7729, 7733);\n                yield return new PortRange(7735, 7737);\n                yield return new PortRange(7739, 7740);\n                yield return new PortRange(7745, 7746);\n                yield return new PortRange(7748, 7776);\n                yield return new PortRange(7776);\n                yield return new PortRange(7780);\n                yield return new PortRange(7782, 7783);\n                yield return new PortRange(7785);\n                yield return new PortRange(7788);\n                yield return new PortRange(7790, 7793);\n                yield return new PortRange(7795, 7796);\n                yield return new PortRange(7803, 7809);\n                yield return new PortRange(7811, 7844);\n                yield return new PortRange(7848, 7868);\n                yield return new PortRange(7873, 7877);\n                yield return new PortRange(7879);\n                yield return new PortRange(7881, 7886);\n                yield return new PortRange(7888, 7899);\n                yield return new PortRange(7904, 7912);\n                yield return new PortRange(7914, 7931);\n                yield return new PortRange(7934, 7961);\n                yield return new PortRange(7963, 7966);\n                yield return new PortRange(7968, 7978);\n                yield return new PortRange(7983, 7997);\n                yield return new PortRange(8009, 8018);\n                yield return new PortRange(8023, 8024);\n                yield return new PortRange(8027, 8031);\n                yield return new PortRange(8035, 8039);\n                yield return new PortRange(8045, 8050);\n                yield return new PortRange(8061, 8065);\n                yield return new PortRange(8068, 8069);\n                yield return new PortRange(8071, 8073);\n                yield return new PortRange(8075, 8076);\n                yield return new PortRange(8078, 8079);\n                yield return new PortRange(8084, 8085);\n                yield return new PortRange(8089);\n                yield return new PortRange(8092, 8096);\n                yield return new PortRange(8098, 8099);\n                yield return new PortRange(8103, 8114);\n                yield return new PortRange(8119, 8120);\n                yield return new PortRange(8123, 8127);\n                yield return new PortRange(8133, 8139);\n                yield return new PortRange(8141, 8147);\n                yield return new PortRange(8150, 8152);\n                yield return new PortRange(8154, 8159);\n                yield return new PortRange(8163, 8180);\n                yield return new PortRange(8185, 8189);\n                yield return new PortRange(8193);\n                yield return new PortRange(8196, 8198);\n                yield return new PortRange(8203, 8203);\n                yield return new PortRange(8209, 8229);\n                yield return new PortRange(8233, 8242);\n                yield return new PortRange(8244, 8269);\n                yield return new PortRange(8271, 8275);\n                yield return new PortRange(8277, 8279);\n                yield return new PortRange(8281);\n                yield return new PortRange(8283, 8291);\n                yield return new PortRange(8295, 8299);\n                yield return new PortRange(8302, 8312);\n                yield return new PortRange(8314, 8319);\n                yield return new PortRange(8323, 8350);\n                yield return new PortRange(8352, 8375);\n                yield return new PortRange(8381, 8382);\n                yield return new PortRange(8385, 8399);\n                yield return new PortRange(8406, 8414);\n                yield return new PortRange(8418, 8422);\n                yield return new PortRange(8424, 8441);\n                yield return new PortRange(8446, 8449);\n                yield return new PortRange(8451, 8456);\n                yield return new PortRange(8458, 8469);\n                yield return new PortRange(8475, 8499);\n                yield return new PortRange(8504, 8553);\n                yield return new PortRange(8556, 8566);\n                yield return new PortRange(8568, 8599);\n                yield return new PortRange(8601, 8608);\n                yield return new PortRange(8616, 8664);\n                yield return new PortRange(8667, 8674);\n                yield return new PortRange(8676, 8685);\n                yield return new PortRange(8687);\n                yield return new PortRange(8689, 8698);\n                yield return new PortRange(8700, 8710);\n                yield return new PortRange(8712, 8731);\n                yield return new PortRange(8734, 8749);\n                yield return new PortRange(8751, 8762);\n                yield return new PortRange(8767, 8769);\n                yield return new PortRange(8771, 8777);\n                yield return new PortRange(8779, 8785);\n                yield return new PortRange(8788, 8792);\n                yield return new PortRange(8794, 8799);\n                yield return new PortRange(8801, 8803);\n                yield return new PortRange(8806, 8807);\n                yield return new PortRange(8809, 8872);\n                yield return new PortRange(8874, 8879);\n                yield return new PortRange(8882);\n                yield return new PortRange(8884, 8887);\n                yield return new PortRange(8895, 8898);\n                yield return new PortRange(8902, 8909);\n                yield return new PortRange(8914, 8936);\n                yield return new PortRange(8938, 8952);\n                yield return new PortRange(8955, 8979);\n                yield return new PortRange(8982, 8988);\n                yield return new PortRange(8992, 8996);\n                yield return new PortRange(9003, 9004);\n                yield return new PortRange(9011, 9019);\n                yield return new PortRange(9027, 9049);\n                yield return new PortRange(9052, 9059);\n                yield return new PortRange(9061, 9079);\n                yield return new PortRange(9094, 9099);\n                yield return new PortRange(9108, 9118);\n                yield return new PortRange(9120, 9121);\n                yield return new PortRange(9124, 9130);\n                yield return new PortRange(9132, 9159);\n                yield return new PortRange(9165, 9190);\n                yield return new PortRange(9192, 9199);\n                yield return new PortRange(9218, 9221);\n                yield return new PortRange(9223, 9254);\n                yield return new PortRange(9256, 9276);\n                yield return new PortRange(9288, 9291);\n                yield return new PortRange(9296, 9299);\n                yield return new PortRange(9301, 9305);\n                yield return new PortRange(9307, 9311);\n                yield return new PortRange(9313, 9317);\n                yield return new PortRange(9319, 9320);\n                yield return new PortRange(9322, 9342);\n                yield return new PortRange(9347, 9373);\n                yield return new PortRange(9375, 9379);\n                yield return new PortRange(9381, 9386);\n                yield return new PortRange(9391, 9395);\n                yield return new PortRange(9398, 9399);\n                yield return new PortRange(9403, 9417);\n                yield return new PortRange(9419, 9442);\n                yield return new PortRange(9446, 9449);\n                yield return new PortRange(9451, 9499);\n                yield return new PortRange(9501, 9521);\n                yield return new PortRange(9523, 9534);\n                yield return new PortRange(9537, 9554);\n                yield return new PortRange(9556, 9591);\n                yield return new PortRange(9601, 9611);\n                yield return new PortRange(9613);\n                yield return new PortRange(9615);\n                yield return new PortRange(9619, 9627);\n                yield return new PortRange(9633, 9639);\n                yield return new PortRange(9641, 9665);\n                yield return new PortRange(9669, 9693);\n                yield return new PortRange(9696, 9699);\n                yield return new PortRange(9701, 9746);\n                yield return new PortRange(9748, 9749);\n                yield return new PortRange(9751, 9752);\n                yield return new PortRange(9754, 9761);\n                yield return new PortRange(9763, 9799);\n                yield return new PortRange(9803, 9874);\n                yield return new PortRange(9877);\n                yield return new PortRange(9879, 9887);\n                yield return new PortRange(9890, 9897);\n                yield return new PortRange(9904, 9908);\n                yield return new PortRange(9910);\n                yield return new PortRange(9912, 9924);\n                yield return new PortRange(9926, 9949);\n                yield return new PortRange(9957, 9965);\n                yield return new PortRange(9967, 9977);\n                yield return new PortRange(9980);\n                yield return new PortRange(9982, 9986);\n                yield return new PortRange(9989, 9989);\n                yield return new PortRange(10011, 10019);\n                yield return new PortRange(10021, 10049);\n                yield return new PortRange(10052, 10054);\n                yield return new PortRange(10056, 10079);\n                yield return new PortRange(10082, 10099);\n                yield return new PortRange(10105, 10106);\n                yield return new PortRange(10108, 10109);\n                yield return new PortRange(10112);\n                yield return new PortRange(10118, 10124);\n                yield return new PortRange(10126, 10127);\n                yield return new PortRange(10130, 10159);\n                yield return new PortRange(10163, 10199);\n                yield return new PortRange(10202, 10251);\n                yield return new PortRange(10254, 10259);\n                yield return new PortRange(10262, 10287);\n                yield return new PortRange(10289, 10320);\n                yield return new PortRange(10322, 10438);\n                yield return new PortRange(10440, 10499);\n                yield return new PortRange(10501, 10539);\n                yield return new PortRange(10545, 10547);\n                yield return new PortRange(10549, 10630);\n                yield return new PortRange(10632, 10799);\n                yield return new PortRange(10801, 10804);\n                yield return new PortRange(10806, 10808);\n                yield return new PortRange(10811, 10859);\n                yield return new PortRange(10861, 10879);\n                yield return new PortRange(10881, 10932);\n                yield return new PortRange(10934, 10989);\n                yield return new PortRange(10991, 10999);\n                yield return new PortRange(11002, 11022);\n                yield return new PortRange(11024, 11094);\n                yield return new PortRange(11096, 11102);\n                yield return new PortRange(11107);\n                yield return new PortRange(11113, 11160);\n                yield return new PortRange(11166, 11170);\n                yield return new PortRange(11176, 11200);\n                yield return new PortRange(11203, 11207);\n                yield return new PortRange(11209, 11210);\n                yield return new PortRange(11212, 11318);\n                yield return new PortRange(11322, 11366);\n                yield return new PortRange(11368, 11370);\n                yield return new PortRange(11372, 11429);\n                yield return new PortRange(11431, 11488);\n                yield return new PortRange(11490, 11599);\n                yield return new PortRange(11601, 11622);\n                yield return new PortRange(11624, 11719);\n                yield return new PortRange(11721, 11722);\n                yield return new PortRange(11724, 11750);\n                yield return new PortRange(11752, 11795);\n                yield return new PortRange(11797, 11875);\n                yield return new PortRange(11878, 11966);\n                yield return new PortRange(11968, 11996);\n                yield return new PortRange(12011);\n                yield return new PortRange(12014, 12108);\n                yield return new PortRange(12110, 12120);\n                yield return new PortRange(12122, 12167);\n                yield return new PortRange(12169, 12171);\n                yield return new PortRange(12173, 12299);\n                yield return new PortRange(12301);\n                yield return new PortRange(12303, 12320);\n                yield return new PortRange(12323, 12344);\n                yield return new PortRange(12346, 12752);\n                yield return new PortRange(12754, 12864);\n                yield return new PortRange(12866, 13159);\n                yield return new PortRange(13161, 13215);\n                yield return new PortRange(13219, 13222);\n                yield return new PortRange(13225, 13399);\n                yield return new PortRange(13401, 13719);\n                yield return new PortRange(13723);\n                yield return new PortRange(13725, 13781);\n                yield return new PortRange(13784);\n                yield return new PortRange(13787, 13817);\n                yield return new PortRange(13824, 13893);\n                yield return new PortRange(13895, 13928);\n                yield return new PortRange(13931, 13999);\n                yield return new PortRange(14003, 14032);\n                yield return new PortRange(14035, 14140);\n                yield return new PortRange(14144);\n                yield return new PortRange(14146, 14148);\n                yield return new PortRange(14151, 14153);\n                yield return new PortRange(14155, 14249);\n                yield return new PortRange(14251, 14413);\n                yield return new PortRange(14415, 14499);\n                yield return new PortRange(14501, 14935);\n                yield return new PortRange(14938, 14999);\n                yield return new PortRange(15001);\n                yield return new PortRange(15003, 15117);\n                yield return new PortRange(15119, 15344);\n                yield return new PortRange(15346, 15362);\n                yield return new PortRange(15364, 15554);\n                yield return new PortRange(15556, 15659);\n                yield return new PortRange(15661, 15739);\n                yield return new PortRange(15741, 15997);\n                yield return new PortRange(16004, 16019);\n                yield return new PortRange(16022, 16160);\n                yield return new PortRange(16163, 16308);\n                yield return new PortRange(16312, 16359);\n                yield return new PortRange(16362, 16366);\n                yield return new PortRange(16369, 16383);\n                yield return new PortRange(16386, 16618);\n                yield return new PortRange(16620, 16664);\n                yield return new PortRange(16667, 16788);\n                yield return new PortRange(16790, 16899);\n                yield return new PortRange(16901, 16949);\n                yield return new PortRange(16951, 16990);\n                yield return new PortRange(16996, 17006);\n                yield return new PortRange(17008, 17183);\n                yield return new PortRange(17186, 17218);\n                yield return new PortRange(17226, 17233);\n                yield return new PortRange(17236, 17499);\n                yield return new PortRange(17501, 17554);\n                yield return new PortRange(17556, 17728);\n                yield return new PortRange(17730, 17753);\n                yield return new PortRange(17757, 17776);\n                yield return new PortRange(17778, 17999);\n                yield return new PortRange(18001, 18103);\n                yield return new PortRange(18105, 18135);\n                yield return new PortRange(18137, 18180);\n                yield return new PortRange(18188, 18240);\n                yield return new PortRange(18244, 18261);\n                yield return new PortRange(18263, 18462);\n                yield return new PortRange(18464, 18633);\n                yield return new PortRange(18636, 18667);\n                yield return new PortRange(18669, 18768);\n                yield return new PortRange(18770, 18880);\n                yield return new PortRange(18882, 18887);\n                yield return new PortRange(18889, 18999);\n                yield return new PortRange(19001, 19006);\n                yield return new PortRange(19008, 19019);\n                yield return new PortRange(19021, 19190);\n                yield return new PortRange(19192, 19193);\n                yield return new PortRange(19195, 19219);\n                yield return new PortRange(19221, 19282);\n                yield return new PortRange(19284, 19314);\n                yield return new PortRange(19316, 19397);\n                yield return new PortRange(19399, 19409);\n                yield return new PortRange(19413, 19538);\n                yield return new PortRange(19542, 19787);\n                yield return new PortRange(19789, 19997);\n                yield return new PortRange(20004);\n                yield return new PortRange(20006, 20011);\n                yield return new PortRange(20015, 20033);\n                yield return new PortRange(20035, 20045);\n                yield return new PortRange(20047, 20047);\n                yield return new PortRange(20050, 20056);\n                yield return new PortRange(20058, 20166);\n                yield return new PortRange(20168, 20201);\n                yield return new PortRange(20203, 20221);\n                yield return new PortRange(20223, 20479);\n                yield return new PortRange(20481, 20669);\n                yield return new PortRange(20671, 20998);\n                yield return new PortRange(21001, 21009);\n                yield return new PortRange(21011, 21211);\n                yield return new PortRange(21213, 21220);\n                yield return new PortRange(21222, 21552);\n                yield return new PortRange(21555, 21589);\n                yield return new PortRange(21591, 21799);\n                yield return new PortRange(21801, 21844);\n                yield return new PortRange(21850, 21999);\n                yield return new PortRange(22006, 22124);\n                yield return new PortRange(22126, 22127);\n                yield return new PortRange(22129, 22221);\n                yield return new PortRange(22223, 22272);\n                yield return new PortRange(22274, 22304);\n                yield return new PortRange(22306, 22334);\n                yield return new PortRange(22336, 22342);\n                yield return new PortRange(22344, 22346);\n                yield return new PortRange(22348, 22349);\n                yield return new PortRange(22352, 22536);\n                yield return new PortRange(22538, 22554);\n                yield return new PortRange(22556, 22762);\n                yield return new PortRange(22764, 22799);\n                yield return new PortRange(22801, 22950);\n                yield return new PortRange(22952, 22999);\n                yield return new PortRange(23006, 23052);\n                yield return new PortRange(23054, 23271);\n                yield return new PortRange(23273, 23293);\n                yield return new PortRange(23295, 23332);\n                yield return new PortRange(23334, 23399);\n                yield return new PortRange(23403, 23455);\n                yield return new PortRange(23458, 23545);\n                yield return new PortRange(23547, 23999);\n                yield return new PortRange(24007, 24241);\n                yield return new PortRange(24243, 24248);\n                yield return new PortRange(24250, 24320);\n                yield return new PortRange(24323, 24385);\n                yield return new PortRange(24387, 24464);\n                yield return new PortRange(24466, 24553);\n                yield return new PortRange(24555, 24576);\n                yield return new PortRange(24578, 24665);\n                yield return new PortRange(24667, 24675);\n                yield return new PortRange(24679);\n                yield return new PortRange(24681, 24753);\n                yield return new PortRange(24755, 24849);\n                yield return new PortRange(24851, 24921);\n                yield return new PortRange(24923, 24999);\n                yield return new PortRange(25010, 25470);\n                yield return new PortRange(25472, 25575);\n                yield return new PortRange(25577, 25603);\n                yield return new PortRange(25605, 25792);\n                yield return new PortRange(25794, 25899);\n                yield return new PortRange(25904, 25953);\n                yield return new PortRange(25956, 25999);\n                yield return new PortRange(26001, 26132);\n                yield return new PortRange(26134, 26207);\n                yield return new PortRange(26209, 26256);\n                yield return new PortRange(26258, 26259);\n                yield return new PortRange(26265, 26485);\n                yield return new PortRange(26488);\n                yield return new PortRange(26490, 26999);\n                yield return new PortRange(27010, 27344);\n                yield return new PortRange(27346, 27441);\n                yield return new PortRange(27443, 27503);\n                yield return new PortRange(27505, 27781);\n                yield return new PortRange(27783, 27875);\n                yield return new PortRange(27877, 27998);\n                yield return new PortRange(28002, 28118);\n                yield return new PortRange(28120, 28199);\n                yield return new PortRange(28201, 28239);\n                yield return new PortRange(28241, 28588);\n                yield return new PortRange(28590, 29117);\n                yield return new PortRange(29119, 29166);\n                yield return new PortRange(29170, 29998);\n                yield return new PortRange(30005, 30099);\n                yield return new PortRange(30101, 30259);\n                yield return new PortRange(30261, 30399);\n                yield return new PortRange(30401, 30831);\n                yield return new PortRange(30833, 30998);\n                yield return new PortRange(31000, 31015);\n                yield return new PortRange(31017, 31019);\n                yield return new PortRange(31021, 31028);\n                yield return new PortRange(31030, 31399);\n                yield return new PortRange(31401, 31415);\n                yield return new PortRange(31417, 31456);\n                yield return new PortRange(31458, 31619);\n                yield return new PortRange(31621, 31684);\n                yield return new PortRange(31686, 31764);\n                yield return new PortRange(31766, 31947);\n                yield return new PortRange(31950, 32033);\n                yield return new PortRange(32035, 32248);\n                yield return new PortRange(32250, 32399);\n                yield return new PortRange(32401, 32482);\n                yield return new PortRange(32484, 32634);\n                yield return new PortRange(32637, 32766);\n                yield return new PortRange(32778, 32800);\n                yield return new PortRange(32802, 32810);\n                yield return new PortRange(32812, 32895);\n                yield return new PortRange(32897, 33059);\n                yield return new PortRange(33061, 33122);\n                yield return new PortRange(33124, 33330);\n                yield return new PortRange(33332);\n                yield return new PortRange(33335, 33433);\n                yield return new PortRange(33436, 33655);\n                yield return new PortRange(33657, 34248);\n                yield return new PortRange(34250, 34377);\n                yield return new PortRange(34380, 34566);\n                yield return new PortRange(34568, 34961);\n                yield return new PortRange(34965, 34979);\n                yield return new PortRange(34981, 34999);\n                yield return new PortRange(35007, 35099);\n                yield return new PortRange(35101, 35353);\n                yield return new PortRange(35358, 36000);\n                yield return new PortRange(36002, 36410);\n                yield return new PortRange(36413, 36421);\n                yield return new PortRange(36425, 36442);\n                yield return new PortRange(36445, 36461);\n                yield return new PortRange(36463, 36523);\n                yield return new PortRange(36525, 36601);\n                yield return new PortRange(36603, 36699);\n                yield return new PortRange(36701, 36864);\n                yield return new PortRange(36866, 37474);\n                yield return new PortRange(37476, 37482);\n                yield return new PortRange(37484, 37600);\n                yield return new PortRange(37602, 37653);\n                yield return new PortRange(37655, 37999);\n                yield return new PortRange(38003, 38200);\n                yield return new PortRange(38204, 38411);\n                yield return new PortRange(38413, 38421);\n                yield return new PortRange(38423, 38471);\n                yield return new PortRange(38473, 38799);\n                yield return new PortRange(38801, 38864);\n                yield return new PortRange(38866, 39680);\n                yield return new PortRange(39682, 39999);\n                yield return new PortRange(40001, 40022);\n                yield return new PortRange(40024, 40403);\n                yield return new PortRange(40405, 40840);\n                yield return new PortRange(40844, 40852);\n                yield return new PortRange(40854, 41110);\n                yield return new PortRange(41112, 41120);\n                yield return new PortRange(41122, 41229);\n                yield return new PortRange(41231, 41793);\n                yield return new PortRange(41798, 42507);\n                yield return new PortRange(42511, 42999);\n                yield return new PortRange(43001, 43187);\n                yield return new PortRange(43192, 43209);\n                yield return new PortRange(43211, 43437);\n                yield return new PortRange(43442, 44122);\n                yield return new PortRange(43124, 44320);\n                yield return new PortRange(44323);\n                yield return new PortRange(44324, 44443);\n                yield return new PortRange(44445, 44543);\n                yield return new PortRange(44545, 44552);\n                yield return new PortRange(44554, 44599);\n                yield return new PortRange(44601, 44817);\n                yield return new PortRange(44819, 44899);\n                yield return new PortRange(44901, 44999);\n                yield return new PortRange(45003, 45044);\n                yield return new PortRange(45046, 45053);\n                yield return new PortRange(45055, 45513);\n                yield return new PortRange(45515, 45677);\n                yield return new PortRange(45679, 45823);\n                yield return new PortRange(45826, 45965);\n                yield return new PortRange(45967, 46335);\n                yield return new PortRange(46337, 46997);\n                yield return new PortRange(47002, 47099);\n                yield return new PortRange(47101, 47556);\n                yield return new PortRange(47558, 47623);\n                yield return new PortRange(47625, 47805);\n                yield return new PortRange(47807);\n                yield return new PortRange(47810, 47999);\n                yield return new PortRange(48006, 48047);\n                yield return new PortRange(48051, 48127);\n                yield return new PortRange(48130, 48555);\n                yield return new PortRange(48557, 48618);\n                yield return new PortRange(48620, 48652);\n                yield return new PortRange(48654, 48999);\n                yield return new PortRange(49002, IPEndPoint.MaxPort);\n            }\n        }\n\n        /// <summary>\n        /// Append to builder\n        /// </summary>\n        /// <param name=\"sb\"></param>\n        private void AppendTo(StringBuilder sb)\n        {\n            if (IPEndPoint.MinPort == _lower)\n            {\n                if (_upper == IPEndPoint.MaxPort)\n                {\n                    sb.Append('*');\n                    return;\n                }\n                sb.Append('0');\n            }\n            else\n            {\n                sb.Append(_lower);\n            }\n            if (_lower == _upper)\n            {\n                return;\n            }\n            sb.Append('-');\n            if (IPEndPoint.MaxPort == _upper)\n            {\n                sb.Append('*');\n            }\n            else\n            {\n                sb.Append(_upper);\n            }\n        }\n\n        /// <summary>\n        /// Merge overlapping ranges\n        /// </summary>\n        /// <param name=\"ranges\"></param>\n        /// <returns></returns>\n        private static IEnumerable<PortRange> Merge(IEnumerable<PortRange> ranges)\n        {\n            var results = new Stack<PortRange>();\n            if (ranges != null)\n            {\n                foreach (var range in ranges.OrderBy(k => k._lower))\n                {\n                    if (results.Count == 0)\n                    {\n                        results.Push(range);\n                    }\n                    else\n                    {\n                        var top = results.Peek();\n                        if (top.Overlaps(range))\n                        {\n                            var union = new PortRange(\n                                top._lower < range._lower ? top._lower : range._lower,\n                                top._upper > range._upper ? top._upper : range._upper);\n                            results.Pop();\n                            results.Push(union);\n                        }\n                        else\n                        {\n                            results.Push(range);\n                        }\n                    }\n                }\n            }\n            return results.Reverse();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Probe/ServerProbe.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Probe\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Bindings;\n    using System;\n    using System.IO;\n    using System.Net;\n    using System.Net.Sockets;\n    using System.Text;\n\n    /// <summary>\n    /// Opc ua secure channel probe factory\n    /// </summary>\n    internal sealed class ServerProbe : IPortProbe\n    {\n        /// <summary>\n        /// Operation timeout\n        /// </summary>\n        public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(5);\n\n        /// <summary>\n        /// Create server probe\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        public ServerProbe(ILogger logger)\n        {\n            _logger = logger;\n        }\n\n        /// <summary>\n        /// Create probe\n        /// </summary>\n        /// <returns></returns>\n        public IAsyncProbe Create()\n        {\n            return new ServerHelloAsyncProbe(_logger, (int)Timeout.TotalMilliseconds);\n        }\n\n        /// <summary>\n        /// Async probe that sends a hello and validates the returned ack.\n        /// </summary>\n        private sealed class ServerHelloAsyncProbe : IAsyncProbe\n        {\n            /// <summary>\n            /// Create opc ua server probe\n            /// </summary>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"timeout\"></param>\n            public ServerHelloAsyncProbe(ILogger logger, int timeout)\n            {\n                _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n                _timeout = timeout;\n                _buffer = new byte[256];\n            }\n\n            /// <summary>\n            /// Reset probe\n            /// </summary>\n            public bool Reset()\n            {\n                var closed = false;\n                if (_socket != null)\n                {\n                    // If connected, close will cause a call to the completion port\n                    closed = _socket.Connected;\n                    _socket.SafeDispose();\n                    _socket = null;\n                }\n                _state = State.BeginProbe;\n                return closed;\n            }\n\n            /// <summary>\n            /// Called whenever socket operation completes\n            /// </summary>\n            /// <param name=\"index\"></param>\n            /// <param name=\"arg\"></param>\n            /// <param name=\"ok\"></param>\n            /// <param name=\"timeout\"></param>\n            /// <returns>true if completed, false to be called again</returns>\n            /// <exception cref=\"InvalidProgramException\"></exception>\n            public bool OnComplete(int index, SocketAsyncEventArgs arg,\n                out bool ok, out int timeout)\n            {\n                ok = false;\n                timeout = _timeout;\n                if (arg.SocketError != SocketError.Success)\n                {\n                    _logger.ProbeNoOpcServer(index, _socket?.RemoteEndPoint?.ToString(), arg.SocketError);\n                    _state = State.BeginProbe;\n                    return true;\n                }\n                while (true)\n                {\n                    switch (_state)\n                    {\n                        case State.BeginProbe:\n                            if (arg.ConnectSocket == null)\n                            {\n                                _logger.ProbeNoConnectedSocket(index);\n                                return true;\n                            }\n                            _socket = arg.ConnectSocket;\n                            var ep = _socket.RemoteEndPoint?.TryResolve();\n                            using (var ostrm = new MemoryStream(_buffer, 0, _buffer.Length))\n                            using (var encoder = new BinaryEncoder(ostrm,\n                                    ServiceMessageContext.GlobalContext, true))\n                            {\n                                encoder.WriteUInt32(null, TcpMessageType.Hello);\n                                encoder.WriteUInt32(null, 0);\n                                encoder.WriteUInt32(null, 0); // ProtocolVersion\n                                encoder.WriteUInt32(null, TcpMessageLimits.DefaultMaxMessageSize);\n                                encoder.WriteUInt32(null, TcpMessageLimits.DefaultMaxMessageSize);\n                                encoder.WriteUInt32(null, TcpMessageLimits.DefaultMaxMessageSize);\n                                encoder.WriteUInt32(null, TcpMessageLimits.DefaultMaxMessageSize);\n                                encoder.WriteByteString(null, Encoding.UTF8.GetBytes(\"opc.tcp://\" + ep));\n                                _size = encoder.Close();\n                            }\n                            _buffer[4] = (byte)(_size & 0x000000FF);\n                            _buffer[5] = (byte)((_size & 0x0000FF00) >> 8);\n                            _buffer[6] = (byte)((_size & 0x00FF0000) >> 16);\n                            _buffer[7] = (byte)((_size & 0xFF000000) >> 24);\n                            arg.SetBuffer(_buffer, 0, _size);\n                            _len = 0;\n                            _logger.ProbeStart(index, \"opc.tcp://\" + ep, _socket.RemoteEndPoint?.ToString());\n                            _state = State.SendHello;\n                            if (!_socket.SendAsync(arg))\n                            {\n                                break;\n                            }\n                            return false;\n                        case State.SendHello:\n                            _len += arg.Count;\n                            System.Diagnostics.Debug.Assert(_socket != null);\n                            if (_len >= _size)\n                            {\n                                _len = 0;\n                                _size = TcpMessageLimits.MessageTypeAndSize;\n                                _state = State.ReceiveSize;\n                                arg.SetBuffer(0, _size);\n                                // Start read size\n                                if (!_socket.ReceiveAsync(arg))\n                                {\n                                    break;\n                                }\n                                return false;\n                            }\n                            // Continue to send reset\n                            arg.SetBuffer(_len, _size - _len);\n                            if (!_socket.SendAsync(arg))\n                            {\n                                break;\n                            }\n                            return false;\n                        case State.ReceiveSize:\n                            _len += arg.Count;\n                            System.Diagnostics.Debug.Assert(_socket != null);\n                            if (_len >= _size)\n                            {\n                                var type = BitConverter.ToUInt32(_buffer, 0);\n                                if (type != TcpMessageType.Acknowledge)\n                                {\n                                    if (TcpMessageType.IsValid(type))\n                                    {\n                                        _logger.ProbeReturnedWrongType(index,\n                                            _socket.RemoteEndPoint?.ToString(), type);\n                                    }\n                                    else\n                                    {\n                                        _logger.ProbeReturnedInvalidType(index,\n                                            _socket.RemoteEndPoint?.ToString(), type);\n                                    }\n                                    _state = State.BeginProbe;\n                                    return true;\n                                }\n                                _size = (int)BitConverter.ToUInt32(_buffer, 4);\n                                if (_size > _buffer.Length)\n                                {\n                                    _logger.ProbeReturnedInvalidLength(index,\n                                        _socket.RemoteEndPoint?.ToString(), _size);\n                                    _state = State.BeginProbe;\n                                    return true;\n                                }\n                                _len = 0;\n                                // Start receive message\n                                _state = State.ReceiveAck;\n                            }\n                            // Continue to read rest of type and size\n                            arg.SetBuffer(_len, _size - _len);\n                            if (!_socket.ReceiveAsync(arg))\n                            {\n                                break;\n                            }\n                            return false;\n                        case State.ReceiveAck:\n                            _len += arg.Count;\n                            System.Diagnostics.Debug.Assert(_socket != null);\n                            if (_len >= _size)\n                            {\n                                _state = State.BeginProbe;\n                                // Validate message\n                                using (var istrm = new MemoryStream(_buffer, 0, _size))\n                                using (var decoder = new BinaryDecoder(istrm,\n                                    ServiceMessageContext.GlobalContext))\n                                {\n                                    var protocolVersion = decoder.ReadUInt32(null);\n                                    var sendBufferSize = (int)decoder.ReadUInt32(null);\n                                    var receiveBufferSize = (int)decoder.ReadUInt32(null);\n                                    var maxMessageSize = (int)decoder.ReadUInt32(null);\n                                    var maxChunkCount = (int)decoder.ReadUInt32(null);\n\n                                    _logger.ProbeFoundOpcUaServer(index,\n                                        _socket.RemoteEndPoint?.ToString(), protocolVersion);\n\n                                    if (sendBufferSize < TcpMessageLimits.MinBufferSize ||\n                                        receiveBufferSize < TcpMessageLimits.MinBufferSize)\n                                    {\n                                        _logger.ProbeBadSizeValue(index, sendBufferSize, receiveBufferSize,\n                                            _socket.RemoteEndPoint?.ToString());\n                                    }\n                                }\n                                ok = true;\n                                return true;\n                            }\n                            // Continue to read rest\n                            arg.SetBuffer(_len, _size - _len);\n                            if (!_socket.ReceiveAsync(arg))\n                            {\n                                break;\n                            }\n                            return false;\n                        default:\n                            throw new InvalidProgramException(\"Bad state\");\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Dispose handler\n            /// </summary>\n            public void Dispose()\n            {\n                Reset();\n            }\n\n            private enum State\n            {\n                BeginProbe,\n                SendHello,\n                ReceiveSize,\n                ReceiveAck\n            }\n\n            private State _state;\n            private Socket? _socket;\n            private int _len;\n            private int _size;\n            private readonly byte[] _buffer;\n            private readonly ILogger _logger;\n            private readonly int _timeout;\n        }\n\n        private readonly ILogger _logger;\n    }\n\n    /// <summary>\n    /// Source-generated logging for ServerProbe\n    /// </summary>\n    internal static partial class ServerProbeLogging\n    {\n        private const int EventClass = 1600;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Probe {Index} : {RemoteEp} found no opc server. {Error}\")]\n        internal static partial void ProbeNoOpcServer(this ILogger logger, int index,\n            string? remoteEp, SocketError error);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Probe {Index} : Called without connected socket!\")]\n        internal static partial void ProbeNoConnectedSocket(this ILogger logger, int index);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug,\n            Message = \"Probe {Index} : {Endpoint} ({RemoteEp})...\")]\n        internal static partial void ProbeStart(this ILogger logger, int index,\n            string endpoint, string? remoteEp);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Debug,\n            Message = \"Probe {Index} : {RemoteEp} returned message type {Type} != Ack.\")]\n        internal static partial void ProbeReturnedWrongType(this ILogger logger, int index,\n            string? remoteEp, uint type);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Trace,\n            Message = \"Probe {Index} : {RemoteEp} returned invalid message type {Type}.\")]\n        internal static partial void ProbeReturnedInvalidType(this ILogger logger, int index,\n            string? remoteEp, uint type);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Debug,\n            Message = \"Probe {Index} : {RemoteEp} returned invalid message length {Size}.\")]\n        internal static partial void ProbeReturnedInvalidLength(this ILogger logger, int index,\n            string? remoteEp, int size);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Probe {Index} : found OPC UA server at {RemoteEp} (protocol:{ProtocolVersion}) ...\")]\n        internal static partial void ProbeFoundOpcUaServer(this ILogger logger, int index,\n            string? remoteEp, uint protocolVersion);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Warning,\n            Message = \"Probe {Index} : Bad size value read {SendBufferSize} or {ReceiveBufferSize} from opc server at {RemoteEp}.\")]\n        internal static partial void ProbeBadSizeValue(this ILogger logger, int index,\n            int sendBufferSize, int receiveBufferSize, string? remoteEp);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Scanner/BaseConnectProbe.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Scanner\n{\n    using Microsoft.Extensions.Logging;\n    using System;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Net;\n    using System.Net.Sockets;\n    using System.Threading;\n\n    /// <summary>\n    /// A connect probe is a ip endpoint consumer that tries to connect\n    /// to the consumed ip endpoint.  if successful it uses the probe\n    /// implementation to interrogate the server.\n    /// </summary>\n    /// <returns></returns>\n    internal abstract class BaseConnectProbe : IDisposable\n    {\n        /// <summary>\n        /// Create connect probe\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"probe\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"timeProvider\"></param>\n        protected BaseConnectProbe(int index, IAsyncProbe probe, ILogger logger,\n            TimeProvider? timeProvider = null)\n        {\n            _probe = probe ?? throw new ArgumentNullException(nameof(probe));\n            _timeProvider = timeProvider ?? TimeProvider.System;\n            _index = index;\n            _logger = logger;\n            _lock = new SemaphoreSlim(1, 1);\n            _arg = new AsyncConnect(this);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Dispose probe\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (!_disposedValue)\n            {\n                if (disposing)\n                {\n                    _lock.Wait();\n                    try\n                    {\n                        _cts.Cancel();\n                        _probe?.Dispose();\n                        DisposeArgsNoLock();\n                    }\n                    finally\n                    {\n                        _cts.Dispose();\n                        _lock.Release();\n                        _lock.Dispose();\n                    }\n                }\n                _disposedValue = true;\n            }\n        }\n\n        /// <summary>\n        /// Start probe\n        /// </summary>\n        public void Start()\n        {\n            OnBegin();\n        }\n\n        /// <summary>\n        /// Retrieve next endpoint\n        /// </summary>\n        /// <param name=\"ep\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <returns></returns>\n        protected abstract bool GetNext(\n            [NotNullWhen(true)] out IPEndPoint? ep, out int timeout);\n\n        /// <summary>\n        /// Whether the probe should give up or retry after\n        /// a failure. Default is false.\n        /// </summary>\n        /// <returns></returns>\n        protected virtual bool ShouldGiveUp()\n        {\n            return false;\n        }\n\n        /// <summary>\n        /// Called on individual failure\n        /// </summary>\n        /// <param name=\"ep\"></param>\n        protected abstract void OnFail(IPEndPoint ep);\n\n        /// <summary>\n        /// Called on success\n        /// </summary>\n        /// <param name=\"ep\"></param>\n        protected abstract void OnSuccess(IPEndPoint ep);\n\n        /// <summary>\n        /// Called on timeout\n        /// </summary>\n        /// <param name=\"ep\"></param>\n        protected virtual void OnComplete(IPEndPoint ep) { }\n\n        /// <summary>\n        /// Called on exit\n        /// </summary>\n        protected virtual void OnExit() { }\n\n        /// <summary>\n        /// Begin connecting to next endpoint\n        /// </summary>\n        private void OnBegin()\n        {\n            var exit = false;\n            _lock.Wait();\n            try\n            {\n                while (!_cts.IsCancellationRequested && !exit)\n                {\n                    IPEndPoint? ep = null;\n                    var timeout = 3000;\n                    try\n                    {\n                        if (!GetNext(out ep, out timeout))\n                        {\n                            exit = true;\n                            break;\n                        }\n                    }\n                    catch (OperationCanceledException)\n                    {\n                        exit = true;\n                        break;\n                    }\n                    catch (InvalidOperationException)\n                    {\n                        continue;\n                    }\n                    catch (Exception ex)\n                    {\n                        _logger.EndpointError(ex, _index);\n                        exit = true;\n                        break;\n                    }\n\n                    if (_arg?.IsRunning == true)\n                    {\n                        // Reset args since it is in running state and cannot be used...\n                        _logger.DisposingArgs();\n                        DisposeArgsNoLock();\n                    }\n\n                    while (!_cts.IsCancellationRequested)\n                    {\n                        _arg ??= new AsyncConnect(this);\n                        try\n                        {\n                            if (_arg.BeginConnect(ep, timeout))\n                            {\n                                // Completed synchronously - go to next candidate\n                                break;\n                            }\n                            return;\n                        }\n                        catch (ObjectDisposedException)\n                        {\n                            // Try again\n                        }\n                        catch (InvalidOperationException)\n                        {\n                            // Operation in progress - try again\n                        }\n                        catch (SocketException sex)\n                        {\n                            if (sex.SocketErrorCode == SocketError.NoBufferSpaceAvailable ||\n                                sex.SocketErrorCode == SocketError.TooManyOpenSockets)\n                            {\n                                if (ShouldGiveUp())\n                                {\n                                    // Exit only until we hit (approx.) min probe count.\n                                    exit = true;\n                                    break;\n                                }\n                                // Otherwise retry...\n                            }\n                            else\n                            {\n                                _logger.ConnectError(sex, sex.SocketErrorCode, _index);\n                            }\n                        }\n                        catch (Exception ex)\n                        {\n                            // Unexpected - shut probe down\n                            _logger.UnexpectedError(ex, _index);\n                            exit = true;\n                            break;\n                        }\n\n                        // Retry same endpoint address with new args\n                        DisposeArgsNoLock();\n                    }\n\n                    if (exit)\n                    {\n                        // We failed, requeue the endpoint and kill this probe\n                        OnFail(ep);\n                        break;\n                    }\n                }\n\n                if (_cts.IsCancellationRequested)\n                {\n                    return;\n                }\n            }\n            finally\n            {\n                _lock.Release();\n            }\n\n            if (exit)\n            {\n                //\n                // We are here because we either...\n                //\n                // a) failed to dequeue\n                // b) The producer has completed\n                // c) Connect failed due to lack of ephimeral ports.\n                // d) A non socket exception occurred.\n                //\n                // Notify of exit.\n                //\n                OnExit();\n            }\n        }\n\n        /// <summary>\n        /// Dispose of args and resources\n        /// </summary>\n        private void DisposeArgsNoLock()\n        {\n            _arg?.Dispose();\n            _arg = null;\n        }\n\n        /// <summary>\n        /// Internal arg state\n        /// </summary>\n        private enum State\n        {\n            Begin,\n            Connect,\n            Probe,\n            Timeout,\n            Error,\n            Disposed\n        }\n\n        /// <summary>\n        /// Wraps socket event arg and connection state\n        /// </summary>\n        private class AsyncConnect : IDisposable\n        {\n            /// <summary>\n            /// Whether the connect is running\n            /// </summary>\n            internal bool IsRunning => _state != State.Begin;\n\n            /// <summary>\n            /// Create event arg wrapper\n            /// </summary>\n            /// <param name=\"outer\"></param>\n            public AsyncConnect(BaseConnectProbe outer)\n            {\n                _outer = outer;\n                _timer = outer._timeProvider.CreateTimer(OnTimerTimeout,\n                    null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                _lock = new SemaphoreSlim(1, 1);\n                _arg = new SocketAsyncEventArgs();\n                _arg.Completed += OnComplete;\n                _arg.UserToken = this;\n            }\n\n            /// <summary>\n            /// Dispose probe\n            /// </summary>\n            public void Dispose()\n            {\n                _lock.Wait();\n                try\n                {\n                    if (_state != State.Disposed)\n                    {\n                        Socket.CancelConnectAsync(_arg);\n                        _arg.ConnectSocket?.Dispose();\n                        _socket?.Dispose();\n                        _arg.Dispose();\n                        _timer.Dispose();\n                        _state = State.Disposed;\n                    }\n                }\n                finally\n                {\n                    _lock.Release();\n                    _lock.Dispose();\n                }\n            }\n\n            /// <summary>\n            /// Begins a connect and returns whether it completed\n            /// synchronously so outer can loop.\n            /// </summary>\n            /// <param name=\"ep\"></param>\n            /// <param name=\"timeout\"></param>\n            /// <returns></returns>\n            internal bool BeginConnect(IPEndPoint ep, int timeout)\n            {\n                _lock.Wait();\n                try\n                {\n                    _arg.RemoteEndPoint = ep;\n\n                    // Reset arg, probe, and start connecting\n                    _outer._probe.Reset();\n                    _arg.ConnectSocket.SafeDispose();\n                    _state = State.Connect;\n\n                    // Open new socket\n                    _socket?.Dispose();\n                    _socket = new Socket(SocketType.Stream, ProtocolType.IP);\n                    if (!_socket.ConnectAsync(_arg))\n                    {\n                        // Complete inline and pull next...\n                        if (OnCompleteNoLock())\n                        {\n                            // Go to next candidate\n                            return true;\n                        }\n                    }\n\n                    // Wait for completion or timeout after x seconds\n                    _timer.Change(TimeSpan.FromMilliseconds(timeout),\n                        Timeout.InfiniteTimeSpan);\n                    return false;\n                }\n                finally\n                {\n                    _lock.Release();\n                }\n            }\n\n            /// <summary>\n            /// Complete is called from completion queue on cancel or connect/error\n            /// </summary>\n            /// <param name=\"sender\"></param>\n            /// <param name=\"arg\"></param>\n            private void OnComplete(object? sender, SocketAsyncEventArgs arg)\n            {\n                _lock.Wait();\n                try\n                {\n                    if (!OnCompleteNoLock())\n                    {\n                        return; // assume next OnComplete will occur or timeout...\n                    }\n                    // Cancel timer and start next\n                    _timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);\n                }\n                catch (Exception ex)\n                {\n                    _outer._logger.CompletionError(ex, _outer._index);\n                }\n                finally\n                {\n                    _lock.Release();\n                }\n                // We are now disposed, or at begin, go to next to cleanup or continue\n                _outer.OnBegin();\n            }\n\n            /// <summary>\n            /// No lock complete\n            /// </summary>\n            /// <exception cref=\"InvalidProgramException\"></exception>\n            private bool OnCompleteNoLock()\n            {\n                try\n                {\n                    switch (_state)\n                    {\n                        case State.Connect:\n                            if (_arg.SocketError != SocketError.Success)\n                            {\n                                // Reset back to begin\n                                _state = State.Begin;\n                                return true;\n                            }\n                            // Start probe\n                            _state = State.Probe;\n                            return OnProbeNoLock();\n                        case State.Probe:\n                            // Continue probing until completed\n                            return OnProbeNoLock();\n                        case State.Timeout:\n                            // Timeout caused cancel already - stay in timeout condition.\n                            return true;\n                        case State.Error:\n                        case State.Disposed:\n                            // Stay in error state or disposed - this should not happen.\n                            return true;\n                        // Unexpected.\n                        // case State.Begin:\n                        default:\n                            throw new InvalidProgramException($\"Unexpected state {_state}.\");\n                    }\n                }\n                catch\n                {\n                    // Go to error state\n                    _state = State.Error;\n                    return true;\n                }\n                finally\n                {\n                    if (_state != State.Connect && _state != State.Probe)\n                    {\n                        // Terminal - complete address now\n                        if (_arg.RemoteEndPoint is IPEndPoint ep)\n                        {\n                            _outer.OnComplete(ep);\n                        }\n                        _arg.SocketError = SocketError.NotSocket;\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Perform probe\n            /// </summary>\n            /// <returns></returns>\n            private bool OnProbeNoLock()\n            {\n                var completed = _outer._probe.OnComplete(_outer._index, _arg,\n                    out var ok, out var timeout);\n                if (completed)\n                {\n                    if (_arg.RemoteEndPoint is IPEndPoint ep)\n                    {\n                        if (ok)\n                        {\n                            _outer.OnSuccess(ep);\n                        }\n                        else\n                        {\n                            _outer.OnComplete(ep);\n                        }\n                    }\n                    _state = State.Begin;\n                }\n                else\n                {\n                    // Wait for completion or timeout after x seconds\n                    _timer.Change(TimeSpan.FromMilliseconds(timeout),\n                        Timeout.InfiniteTimeSpan);\n                }\n                return completed;\n            }\n\n            /// <summary>\n            /// Timeout current probe\n            /// </summary>\n            /// <param name=\"state\"></param>\n            private void OnTimerTimeout(object? state)\n            {\n                if (!_lock.Wait(0))\n                {\n                    // lock is taken either by having completed or having re-begun.\n                    return;\n                }\n                try\n                {\n                    switch (_state)\n                    {\n                        case State.Timeout:\n                            return;\n                        case State.Connect:\n                            //\n                            // Cancel current arg and mark as timedout which will\n                            // dispose the arg and open a new one.  Should the arg\n                            // still complete later it will be in terminal state.\n                            //\n                            Socket.CancelConnectAsync(_arg);\n                            _state = State.Timeout;\n                            _arg.SocketError = SocketError.TimedOut;\n                            return;\n                        case State.Probe:\n                            _outer._logger.ProbeTimeout(_outer._index, _arg.RemoteEndPoint?.ToString());\n                            _arg.SocketError = SocketError.TimedOut;\n                            _state = State.Timeout;\n                            if (_outer._probe.Reset())\n                            {\n                                // We will get a disconnect complete callback now.\n                                return;\n                            }\n                            //\n                            // There was nothing to cancel so start from beginning.\n                            // Since connect socket is connected, go to begin state\n                            // This will close the socket and reconnect a new one.\n                            //\n                            _outer._logger.ProbeRestart(_outer._index);\n                            _state = State.Begin;\n                            _outer.OnBegin();\n                            return;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    _outer._logger.TimeoutError(ex, _outer._index);\n                }\n                finally\n                {\n                    _lock.Release();\n                }\n            }\n\n            private readonly ITimer _timer;\n            private readonly SocketAsyncEventArgs _arg;\n            private readonly SemaphoreSlim _lock;\n            private readonly BaseConnectProbe _outer;\n            private State _state;\n            private Socket? _socket;\n        }\n\n        private readonly CancellationTokenSource _cts = new();\n        private readonly SemaphoreSlim _lock;\n        private readonly int _index;\n        private readonly IAsyncProbe _probe;\n        private readonly ILogger _logger;\n        private readonly TimeProvider _timeProvider;\n        private AsyncConnect? _arg;\n        private bool _disposedValue;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for BaseConnectProbe\n    /// </summary>\n    internal static partial class BaseConnectProbeLogging\n    {\n        private const int EventClass = 1630;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Error getting endpoint for probe {Index}\")]\n        public static partial void EndpointError(this ILogger logger, Exception ex, int index);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Trace,\n            Message = \"Disposing args in running state.\")]\n        public static partial void DisposingArgs(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"{Code} in connect of probe {Index}...\")]\n        public static partial void ConnectError(this ILogger logger, Exception ex, SocketError code, int index);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"Probe {Index} has unexpected exception during connect.\")]\n        public static partial void UnexpectedError(this ILogger logger, Exception ex, int index);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Debug,\n            Message = \"Error during completion of probe {Index}\")]\n        public static partial void CompletionError(this ILogger logger, Exception ex, int index);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Debug,\n            Message = \"Probe {Index} {RemoteEp} timed out...\")]\n        public static partial void ProbeTimeout(this ILogger logger, int index, string? remoteEp);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Probe {Index} not cancelled - try restart...\")]\n        public static partial void ProbeRestart(this ILogger logger, int index);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Debug,\n            Message = \"Error during timeout of probe {Index}\")]\n        public static partial void TimeoutError(this ILogger logger, Exception ex, int index);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Scanner/NetworkScanner.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Scanner\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models;\n    using Microsoft.Extensions.Logging;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Net.NetworkInformation;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Scans network using icmp and finds all machines in it.\n    /// </summary>\n    public sealed class NetworkScanner : IScanner\n    {\n        /// <summary>\n        /// Number of items scanned\n        /// </summary>\n        public int ScanCount => _scanCount;\n\n        /// <summary>\n        /// Number of active probes\n        /// </summary>\n        public int ActiveProbes => _pings.Count;\n\n        /// <summary>\n        /// Create scanner\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"replies\"></param>\n        /// <param name=\"ct\"></param>\n        public NetworkScanner(ILogger<NetworkScanner> logger,\n            Action<NetworkScanner, PingReply> replies,\n            CancellationToken ct) :\n            this(logger, replies, false, null, NetworkClass.Wired, null, null, ct)\n        {\n        }\n\n        /// <summary>\n        /// Create scanner\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"replies\"></param>\n        /// <param name=\"netclass\"></param>\n        /// <param name=\"ct\"></param>\n        public NetworkScanner(ILogger<NetworkScanner> logger,\n            Action<NetworkScanner, PingReply> replies,\n            NetworkClass netclass, CancellationToken ct) :\n            this(logger, replies, false, null, netclass, null, null, ct)\n        {\n        }\n\n        /// <summary>\n        /// Create scanner\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"replies\"></param>\n        /// <param name=\"local\"></param>\n        /// <param name=\"addresses\"></param>\n        /// <param name=\"netclass\"></param>\n        /// <param name=\"maxProbeCount\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <param name=\"ct\"></param>\n        public NetworkScanner(ILogger<NetworkScanner> logger,\n            Action<NetworkScanner, PingReply> replies,\n            bool local, IEnumerable<AddressRange>? addresses, NetworkClass netclass,\n            int? maxProbeCount, TimeSpan? timeout, CancellationToken ct)\n        {\n            _logger = logger;\n            _replies = replies;\n            _ct = ct;\n            _timeout = timeout ?? kDefaultProbeTimeout;\n            _completion = new TaskCompletionSource<bool>(\n                TaskCreationOptions.RunContinuationsAsynchronously);\n            _candidates = [];\n            if (addresses?.Any() != true)\n            {\n                _addresses = NetworkInformationEx.GetAllNetInterfaces(netclass)\n                    .Select(t => new AddressRange(t, local)).Distinct().ToList();\n            }\n            else\n            {\n                _addresses = addresses.Select(a => a.Copy()).Distinct().ToList();\n            }\n            _pings = CreatePings(local ? _addresses.Count + 1 :\n                maxProbeCount ?? kDefaultMaxProbeCount);\n            // Start initial pings\n            _logger.StartScanning(_addresses.Select(a => a.ToString()));\n            foreach (var ping in _pings.ToList())\n            {\n                OnNextPing(ping);\n            }\n        }\n\n        /// <summary>\n        /// Scan completed\n        /// </summary>\n        public Task WaitToCompleteAsync()\n        {\n            return _completion.Task;\n        }\n\n        /// <summary>\n        /// Dispose scanner\n        /// </summary>\n        public void Dispose()\n        {\n            lock (_candidates)\n            {\n                foreach (var ping in _pings)\n                {\n                    ping.SendAsyncCancel();\n                    ping.Dispose();\n                }\n                _pings.Clear();\n                _completion.TrySetCanceled();\n            }\n        }\n\n        /// <summary>\n        /// Schedule next\n        /// </summary>\n        /// <param name=\"ping\"></param>\n        private void OnNextPing(Ping ping)\n        {\n            lock (_candidates)\n            {\n                while (!_ct.IsCancellationRequested)\n                {\n                    if (_candidates.Count > 0)\n                    {\n                        var address = (IPv4Address)_candidates[0];\n                        _candidates.RemoveAt(0);\n                        ping.SendAsync(address, (int)_timeout.TotalMilliseconds,\n                            ping);\n                        return;\n                    }\n\n                    if (_addresses.Count == 0)\n                    {\n                        break;\n                    }\n                    _addresses[0].FillNextBatch(_candidates, kDefaultBatchSize);\n                    if (_candidates.Count == 0)\n                    {\n                        _addresses.RemoveAt(0);\n                        continue;\n                    }\n                    _candidates.Shuffle();\n                }\n\n                if (_pings.Remove(ping))\n                {\n                    ping.Dispose();\n                    if (_pings.Count == 0)\n                    {\n                        // All pings drained...\n                        _completion.TrySetResult(true);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Helper to create ping\n        /// </summary>\n        /// <param name=\"count\"></param>\n        /// <returns></returns>\n        private List<Ping> CreatePings(int count)\n        {\n            var pings = new List<Ping>(count);\n            for (var i = 0; i < count; i++)\n            {\n                var ping = new Ping();\n                ping.PingCompleted += (sender, e) =>\n                {\n                    var reply = e.Reply;\n                    if (reply?.Status == IPStatus.Success)\n                    {\n                        _replies(this, reply);\n                    }\n                    // When completed, grab next\n                    Interlocked.Increment(ref _scanCount);\n                    OnNextPing((Ping)e.UserState!);\n                };\n                pings.Add(ping);\n            }\n            return pings;\n        }\n\n        private const int kDefaultMaxProbeCount = 100;\n        private const int kDefaultBatchSize = 1000;\n        private static readonly TimeSpan kDefaultProbeTimeout =\n            TimeSpan.FromSeconds(3);\n\n        private readonly TimeSpan _timeout;\n        private readonly List<uint> _candidates;\n        private readonly List<AddressRange> _addresses;\n        private readonly ILogger _logger;\n        private readonly List<Ping> _pings;\n        private readonly Action<NetworkScanner, PingReply> _replies;\n        private readonly TaskCompletionSource<bool> _completion;\n        private readonly CancellationToken _ct;\n        private volatile int _scanCount;\n    }\n\n    /// <summary>\n    /// Source-generated logging for NetworkScanner\n    /// </summary>\n    internal static partial class NetworkScannerLogging\n    {\n        private const int EventClass = 1660;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Start scanning {Addresses}...\")]\n        internal static partial void StartScanning(this ILogger logger, IEnumerable<string> addresses);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Stack/Transport/Scanner/PortScanner.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Transport.Scanner\n{\n    using Microsoft.Extensions.Logging;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Linq;\n    using System.Net;\n    using System.Net.Sockets;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Scans port ranges\n    /// </summary>\n    public sealed class PortScanner : IScanner\n    {\n        /// <summary>\n        /// Number of items scanned\n        /// </summary>\n        public int ScanCount => _scanCount;\n\n        /// <summary>\n        /// Number of active probes\n        /// </summary>\n        public int ActiveProbes => _active;\n\n        /// <summary>\n        /// Create scanner with default port probe\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"ct\"></param>\n        public PortScanner(ILogger<PortScanner> logger, IEnumerable<IPEndPoint> source,\n            Action<PortScanner, IPEndPoint> target, CancellationToken ct) :\n            this(logger, source, target, null, ct)\n        {\n        }\n\n        /// <summary>\n        /// Create scanner\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"portProbe\"></param>\n        /// <param name=\"ct\"></param>\n        public PortScanner(ILogger<PortScanner> logger, IEnumerable<IPEndPoint> source,\n            Action<PortScanner, IPEndPoint> target, IPortProbe? portProbe, CancellationToken ct) :\n            this(logger, source, target, portProbe, null, null, null, ct)\n        {\n        }\n\n        /// <summary>\n        /// Create scanner\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"portProbe\"></param>\n        /// <param name=\"maxProbeCount\"></param>\n        /// <param name=\"minProbePercent\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <param name=\"ct\"></param>\n        public PortScanner(ILogger<PortScanner> logger, IEnumerable<IPEndPoint> source,\n            Action<PortScanner, IPEndPoint> target, IPortProbe? portProbe, int? maxProbeCount,\n            int? minProbePercent, TimeSpan? timeout, CancellationToken ct)\n        {\n            _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n            _source = source?.GetEnumerator() ??\n                throw new ArgumentNullException(nameof(source));\n            _target = target ?? throw new ArgumentNullException(nameof(target));\n\n            _maxProbeCount = maxProbeCount ?? kDefaultMaxProbeCount;\n            _minProbeCount = (int)(_maxProbeCount *\n                ((minProbePercent ?? kDefaultMinProbePercent) / 100.0));\n            _timeout = timeout ?? kDefaultProbeTimeout;\n            _portProbe = portProbe ?? new NullPortProbe();\n            _requeued = new ConcurrentQueue<IPEndPoint>();\n\n            _probePool = Repeat(i => new ConnectProbe(this, i), _maxProbeCount)\n                .ToList();\n\n            _cts = CancellationTokenSource.CreateLinkedTokenSource(ct);\n            _completion = new TaskCompletionSource<bool>(\n                TaskCreationOptions.RunContinuationsAsynchronously);\n            _active = _maxProbeCount;\n            foreach (var probe in _probePool)\n            {\n                probe.Start();\n            }\n\n            static IEnumerable<T> Repeat<T>(Func<int, T> factory, int count)\n            {\n                for (var i = 0; i < count; i++)\n                {\n                    yield return factory(i);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Scan completed\n        /// </summary>\n        public Task WaitToCompleteAsync()\n        {\n            return _completion.Task;\n        }\n\n        /// <summary>\n        /// Dispose scanner\n        /// </summary>\n        public void Dispose()\n        {\n            // Kill producer\n            _cts.Cancel();\n            // Clean up all probes\n            _active = 0;\n            foreach (var probe in _probePool)\n            {\n                probe.Dispose();\n            }\n            _probePool.Clear();\n            _completion.TrySetCanceled();\n            _cts.Dispose();\n        }\n\n        /// <summary>\n        /// Return next from source.\n        /// </summary>\n        /// <param name=\"ep\"></param>\n        private bool Next([NotNullWhen(true)] out IPEndPoint? ep)\n        {\n            if (_cts.IsCancellationRequested)\n            {\n                ep = null;\n                return false;\n            }\n            lock (_source)\n            {\n                if (!_source.MoveNext())\n                {\n                    ep = null;\n                    return false;\n                }\n                ep = _source.Current;\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Exit probe and if last propagate target complete\n        /// </summary>\n        private void OnProbeExit()\n        {\n            if (Interlocked.Decrement(ref _active) == 0)\n            {\n                // All probes drained - propagate target complete...\n                if (_cts.IsCancellationRequested)\n                {\n                    _completion.TrySetCanceled();\n                }\n                else\n                {\n                    _completion.TrySetResult(true);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Returns probe timeout in milliseconds but with entropy\n        /// </summary>\n#pragma warning disable CA5394 // Do not use insecure randomness\n        private int ProbeTimeoutInMilliseconds => Random.Shared.Next(\n            (int)(_timeout.TotalMilliseconds * 0.7),\n            (int)(_timeout.TotalMilliseconds * 1.5));\n#pragma warning restore CA5394 // Do not use insecure randomness\n\n        /// <summary>\n        /// Port connect probe\n        /// </summary>\n        private sealed class ConnectProbe : BaseConnectProbe\n        {\n            /// <summary>\n            /// Create probe\n            /// </summary>\n            /// <param name=\"scanner\"></param>\n            /// <param name=\"index\"></param>\n            public ConnectProbe(PortScanner scanner, int index) :\n                base(index, scanner._portProbe.Create(), scanner._logger)\n            {\n                _scanner = scanner;\n            }\n\n            /// <summary>\n            /// Get next endpoint\n            /// </summary>\n            /// <param name=\"ep\"></param>\n            /// <param name=\"timeout\"></param>\n            /// <returns></returns>\n            protected override bool GetNext(\n                [NotNullWhen(true)] out IPEndPoint? ep, out int timeout)\n            {\n                if (!_scanner.Next(out ep))\n                {\n                    timeout = 0;\n                    return false;\n                }\n                timeout = _scanner.ProbeTimeoutInMilliseconds;\n                Interlocked.Increment(ref _scanner._scanCount);\n                return true;\n            }\n\n            /// <summary>\n            /// Called on error\n            /// </summary>\n            /// <returns></returns>\n            protected override bool ShouldGiveUp()\n            {\n                return _scanner._active > _scanner._minProbeCount;\n            }\n\n            /// <summary>\n            /// Called when endpoint probe failed for some reason\n            /// </summary>\n            /// <param name=\"ep\"></param>\n            protected override void OnFail(IPEndPoint ep)\n            {\n                _scanner._requeued.Enqueue(ep);\n                Interlocked.Decrement(ref _scanner._scanCount);\n            }\n\n            /// <summary>\n            /// Called on success\n            /// </summary>\n            /// <param name=\"ep\"></param>\n            protected override void OnSuccess(IPEndPoint ep)\n            {\n                _scanner._target(_scanner, ep);\n            }\n\n            /// <summary>\n            /// Called when probe terminates\n            /// </summary>\n            protected override void OnExit()\n            {\n                _scanner.OnProbeExit();\n            }\n\n            private readonly PortScanner _scanner;\n        }\n\n        /// <summary>\n        /// Null port probe\n        /// </summary>\n        private class NullPortProbe : IAsyncProbe, IPortProbe\n        {\n            /// <inheritdoc />\n            public bool OnComplete(int index, SocketAsyncEventArgs arg,\n                out bool ok, out int timeout)\n            {\n                ok = true;\n                timeout = 0;\n                return true;\n            }\n\n            /// <inheritdoc />\n            public void Dispose() { }\n\n            /// <inheritdoc />\n            public bool Reset()\n            {\n                return false;\n            }\n\n            /// <inheritdoc />\n            public IAsyncProbe Create()\n            {\n                return this;\n            }\n        }\n\n        /// <summary>\n        /// Max number of connect probes. On Windows, up to 5000 the performance\n        /// improvement is linear, e.g. all ports on a Windows PC are scanned in\n        /// around 16 seconds.\n        /// </summary>\n        private const int kDefaultMaxProbeCount = 1000;\n\n        /// <summary>\n        /// By default ensure at least 80% probes are going.\n        /// </summary>\n        private const int kDefaultMinProbePercent = 80;\n        private static readonly TimeSpan kDefaultProbeTimeout =\n            TimeSpan.FromSeconds(5);\n\n        private readonly ConcurrentQueue<IPEndPoint> _requeued;\n        private readonly IEnumerator<IPEndPoint> _source;\n        private readonly TaskCompletionSource<bool> _completion;\n        private readonly List<ConnectProbe> _probePool;\n        private readonly Action<PortScanner, IPEndPoint> _target;\n        private readonly int _maxProbeCount;\n        private readonly int _minProbeCount;\n        private readonly TimeSpan _timeout;\n        private readonly CancellationTokenSource _cts;\n        private readonly IPortProbe _portProbe;\n        private readonly ILogger _logger;\n        private int _active;\n#pragma warning disable IDE0032 // Use auto property\n        private int _scanCount;\n#pragma warning restore IDE0032 // Use auto property\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Storage/PhysicalFileProviderFactory.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Storage\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Furly.Extensions.Storage;\n    using Microsoft.Extensions.FileProviders;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Concurrent;\n    using System.IO;\n    using System.Linq;\n\n    /// <summary>\n    /// Physical file provider factory\n    /// </summary>\n    public sealed class PhysicalFileProviderFactory : IFileProviderFactory, IDisposable\n    {\n        /// <inheritdoc/>\n        public PhysicalFileProviderFactory(IOptions<PublisherOptions> options,\n            ILogger<PhysicalFileProviderFactory> logger)\n        {\n            _options = options;\n            _logger = logger;\n            _providers = new ConcurrentDictionary<string, PhysicalFileProvider>();\n        }\n\n        /// <inheritdoc/>\n        public IFileProvider Create(string root)\n        {\n            root = Path.GetFullPath(string.IsNullOrWhiteSpace(root) ?\n                Environment.CurrentDirectory : root);\n            return _providers.GetOrAdd(root, directory =>\n            {\n                if (!Directory.Exists(directory))\n                {\n                    Directory.CreateDirectory(directory);\n                }\n\n                var provider = new PhysicalFileProvider(directory);\n\n                if (_options.Value.UseFileChangePolling == true)\n                {\n                    provider.UseActivePolling = true;\n                    provider.UsePollingFileWatcher = true;\n                }\n\n                _logger.MappingDirectory(directory);\n                return provider;\n            });\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _providers.Values.ToList().ForEach(p => p.Dispose());\n        }\n\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly ILogger<PhysicalFileProviderFactory> _logger;\n        private readonly ConcurrentDictionary<string, PhysicalFileProvider> _providers;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for PhysicalFileProviderFactory\n    /// </summary>\n    internal static partial class PhysicalFileProviderFactoryLogging\n    {\n        private const int EventClass = 1700;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Mapping directory {Directory} via physical file provider.\")]\n        public static partial void MappingDirectory(this ILogger logger, string directory);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Storage/PublishedNodesConverter.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Storage\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Azure.IoT.Edge.Services;\n    using Furly.Exceptions;\n    using Furly.Extensions.Serializers;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Published nodes\n    /// </summary>\n    public sealed class PublishedNodesConverter\n    {\n        /// <summary>\n        /// Create converter\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"cryptoProvider\"></param>\n        public PublishedNodesConverter(ILogger<PublishedNodesConverter> logger,\n            IJsonSerializer serializer, IOptions<PublisherOptions> options,\n            IIoTEdgeWorkloadApi? cryptoProvider = null)\n        {\n            _serializer = serializer ??\n                throw new ArgumentNullException(nameof(serializer));\n            _logger = logger ??\n                throw new ArgumentNullException(nameof(logger));\n\n            _cryptoProvider = cryptoProvider;\n            _forceCredentialEncryption =\n                options.Value.ForceCredentialEncryption ?? false;\n            _scaleTestCount =\n                Math.Max(1, options.Value.ScaleTestCount ?? 0);\n            _maxNodesPerDataSet = options.Value.MaxNodesPerDataSet <= 0\n                ? int.MaxValue : options.Value.MaxNodesPerDataSet;\n            _noPublishingIntervalGrouping =\n                options.Value.IgnoreConfiguredPublishingIntervals ?? false;\n        }\n\n        /// <summary>\n        /// Read monitored item job from reader\n        /// </summary>\n        /// <param name=\"publishedNodesContent\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"SerializerException\"></exception>\n        public IEnumerable<PublishedNodesEntryModel> Read(string publishedNodesContent)\n        {\n            var sw = Stopwatch.StartNew();\n            _logger.ReadingPublishedNodesFile();\n            try\n            {\n                var items = _serializer.Deserialize<List<PublishedNodesEntryModel>>(publishedNodesContent)\n                    ?? throw new SerializerException(\"Published nodes files, malformed.\");\n\n                _logger.ReadPublishedNodesFile(items.Count, sw.Elapsed);\n                return items;\n            }\n            finally\n            {\n                sw.Stop();\n            }\n        }\n\n        /// <summary>\n        /// Convert from writer group job model to published nodes entries\n        /// </summary>\n        /// <param name=\"version\"></param>\n        /// <param name=\"lastChanged\"></param>\n        /// <param name=\"items\"></param>\n        /// <param name=\"preferTimeSpan\"></param>\n        /// <returns></returns>\n        public IEnumerable<PublishedNodesEntryModel> ToPublishedNodes(uint version, DateTimeOffset lastChanged,\n            IEnumerable<WriterGroupModel> items, bool preferTimeSpan = true)\n        {\n            if (items == null)\n            {\n                return [];\n            }\n            var sw = Stopwatch.StartNew();\n            try\n            {\n                var publishedNodesEntries = items\n                    .Where(group => group?.DataSetWriters?.Count > 0)\n                    .SelectMany(group => group.DataSetWriters!\n                        .Where(writer =>\n                               writer.DataSet?.DataSetSource?.PublishedVariables?.PublishedData != null\n                            || writer.DataSet?.DataSetSource?.PublishedEvents?.PublishedData != null)\n                        .Select(writer => (WriterGroup: group, Writer: writer)))\n                    .Select(item => AddConnectionModel(item.Writer.DataSet?.DataSetSource?.Connection,\n                        new PublishedNodesEntryModel\n                        {\n                            NodeId = null,\n                            Version = version,\n                            LastChangeDateTime = lastChanged,\n                            DataSetClassId = item.Writer.DataSet?.DataSetMetaData?.DataSetClassId ?? Guid.Empty,\n                            DataSetDescription = item.Writer.DataSet?.DataSetMetaData?.Description,\n                            DataSetKeyFrameCount = item.Writer.KeyFrameCount,\n                            MessagingMode = item.WriterGroup.HeaderLayoutUri == null ? null :\n                                Enum.Parse<MessagingMode>(item.WriterGroup.HeaderLayoutUri), // TODO: Make safe\n                            MessageEncoding = item.WriterGroup.MessageType,\n                            WriterGroupTransport = item.WriterGroup.Transport,\n                            WriterGroupTransportConfiguration = item.WriterGroup.TransportConfiguration,\n                            WriterGroupQualityOfService = item.WriterGroup.Publishing?.RequestedDeliveryGuarantee,\n                            WriterGroupMessageTtlTimepan = item.WriterGroup.Publishing?.Ttl,\n                            WriterGroupMessageRetention = item.WriterGroup.Publishing?.Retain,\n                            WriterGroupPartitions = item.WriterGroup.PublishQueuePartitions,\n                            WriterGroupQueueName = item.WriterGroup.Publishing?.QueueName,\n                            SendKeepAliveDataSetMessages = item.Writer.DataSet?.SendKeepAlive,\n                            SendKeepAliveAsKeyFrameMessages = item.Writer.DataSet?.KeepAliveAsKeyFrame,\n                            DataSetExtensionFields = item.Writer.DataSet?.ExtensionFields?.ToDictionary(\n                                e => e.DataSetFieldName, e => e.Value),\n                            MetaDataUpdateTimeTimespan = item.Writer.MetaDataUpdateTime,\n                            QueueName = item.Writer.Publishing?.QueueName,\n                            QualityOfService = item.Writer.Publishing?.RequestedDeliveryGuarantee,\n                            MessageTtlTimespan = item.Writer.Publishing?.Ttl,\n                            MessageRetention = item.Writer.Publishing?.Retain,\n                            MetaDataQueueName = item.Writer.MetaData?.QueueName,\n                            MetaDataRetention = item.Writer.MetaData?.Retain,\n                            MetaDataTtlTimespan = item.Writer.MetaData?.Ttl,\n                            MetaDataUpdateTime = null,\n                            BatchTriggerIntervalTimespan = item.WriterGroup.PublishingInterval,\n                            BatchTriggerInterval = null,\n                            DataSetSamplingInterval = null,\n                            DataSetSamplingIntervalTimespan =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.DefaultSamplingInterval,\n                            DefaultHeartbeatInterval = null,\n                            DefaultHeartbeatIntervalTimespan =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.DefaultHeartbeatInterval,\n                            DefaultHeartbeatBehavior =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.DefaultHeartbeatBehavior,\n                            Priority =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.Priority,\n                            MaxKeepAliveCount =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.MaxKeepAliveCount,\n                            DataSetFetchDisplayNames =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.ResolveDisplayName,\n                            RepublishAfterTransfer =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.RepublishAfterTransfer,\n                            OpcNodeWatchdogTimespan =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.MonitoredItemWatchdogTimeout,\n                            OpcNodeWatchdogCondition =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.MonitoredItemWatchdogCondition,\n                            DataSetWriterWatchdogBehavior =\n                                item.Writer.DataSet?.DataSetSource?.SubscriptionSettings?.WatchdogBehavior,\n                            BatchSize = item.WriterGroup.NotificationPublishThreshold,\n                            DataSetName = item.Writer.DataSet?.Name,\n                            DataSetType = item.Writer.DataSet?.Type,\n                            DataSetRootNodeId = item.Writer.DataSet?.RootNode,\n                            DataSetSourceUri = item.Writer.DataSet?.DataSetSource?.Uri,\n                            DataSetSubject = item.Writer.DataSet?.Subject,\n                            DataSetWriterGroup =\n                                item.WriterGroup.Name == Constants.DefaultWriterGroupName ? null : item.WriterGroup.Name,\n                            DataSetWriterId = item.Writer.DataSetWriterName,\n                            DataSetRouting = item.Writer.DataSet?.Routing,\n                            DataSetPublishingInterval = null,\n                            DataSetPublishingIntervalTimespan = null,\n                            WriterGroupRootNodeId = item.WriterGroup.RootNode,\n                            WriterGroupType = item.WriterGroup.Type,\n                            WriterGroupProperties = item.WriterGroup.Properties?.ToDictionary(),\n                            PublisherId = item.WriterGroup.PublisherId,\n                            OpcNodes = ToOpcNodes(item.Writer.DataSet?.DataSetSource?.SubscriptionSettings,\n                                    item.Writer.DataSet?.DataSetSource?.PublishedVariables,\n                                    item.Writer.DataSet?.DataSetSource?.PublishedEvents,\n                                    item.Writer.DataSet?.DataSetSource?.PublishedMethods, preferTimeSpan, false)?\n                                .ToList() ?? [],\n                            // ...\n\n                            // Added by Add connection information\n                            OpcAuthenticationMode = OpcAuthenticationMode.Anonymous,\n                            OpcAuthenticationUsername = null,\n                            OpcAuthenticationPassword = null,\n                            EndpointUrl = string.Empty,\n                            UseSecurity = false,\n                            UseReverseConnect = null,\n                            DisableSubscriptionTransfer = null,\n                            DumpConnectionDiagnostics = null,\n                            EndpointSecurityPolicy = null,\n                            EndpointSecurityMode = null,\n                            EncryptedAuthPassword = null,\n                            EncryptedAuthUsername = null\n                        }));\n\n                // Coalesce into unique nodes entry data set groups\n                // TODO: We should start with the grouping earlier\n                return publishedNodesEntries\n                    .GroupBy(item => item,\n                        new FuncCompare<PublishedNodesEntryModel>((x, y) => x!.HasSameDataSet(y!)))\n                    .Select(group =>\n                    {\n                        group.Key.OpcNodes = group\n                            .Where(g => g.OpcNodes != null)\n                            .SelectMany(g => g.OpcNodes!)\n                            .ToList();\n                        return group.Key;\n                    });\n            }\n            catch (Exception ex)\n            {\n                _logger.FailedToConvertPublishedNodes(ex);\n                return [];\n            }\n            finally\n            {\n                _logger.ConvertedPublishedNodes(sw.Elapsed);\n                sw.Stop();\n            }\n\n            static IEnumerable<OpcNodeModel>? ToOpcNodes(PublishedDataSetSettingsModel? subscriptionSettings,\n                PublishedDataItemsModel? publishedVariables, PublishedEventItemsModel? publishedEvents,\n                PublishedMethodItemsModel? publishedMethods, bool preferTimeSpan, bool skipTriggeringNodes)\n            {\n                if (publishedVariables == null && publishedEvents == null)\n                {\n                    return null;\n                }\n                return (publishedVariables?.PublishedData ?? Enumerable.Empty<PublishedDataSetVariableModel>())\n                    .Select(variable => new OpcNodeModel\n                    {\n                        DeadbandType = variable.DeadbandType,\n                        DeadbandValue = variable.DeadbandValue,\n                        DataSetClassFieldId = variable.DataSetClassFieldId,\n                        Id = variable.PublishedVariableNodeId,\n                        DisplayName = variable.PublishedVariableDisplayName,\n                        DataSetFieldId = variable.Id,\n                        AttributeId = variable.Attribute,\n                        IndexRange = variable.IndexRange,\n                        RegisterNode = variable.RegisterNodeForSampling,\n                        FetchDisplayName = variable.ReadDisplayNameFromNode,\n                        BrowsePath = variable.BrowsePath,\n                        UseCyclicRead = variable.SamplingUsingCyclicRead,\n                        CyclicReadMaxAge = preferTimeSpan ? null : (int?)variable.CyclicReadMaxAge?.TotalMilliseconds,\n                        CyclicReadMaxAgeTimespan = !preferTimeSpan ? null : variable.CyclicReadMaxAge,\n                        DiscardNew = variable.DiscardNew,\n                        QueueSize = variable.ServerQueueSize,\n                        DataChangeTrigger = variable.DataChangeTrigger,\n                        HeartbeatBehavior = variable.HeartbeatBehavior,\n                        HeartbeatInterval = preferTimeSpan ? null : (int?)variable.HeartbeatInterval?.TotalSeconds,\n                        HeartbeatIntervalTimespan = !preferTimeSpan ? null : variable.HeartbeatInterval,\n                        OpcSamplingInterval = preferTimeSpan ? null : (int?)variable.SamplingIntervalHint?.TotalMilliseconds,\n                        OpcSamplingIntervalTimespan = !preferTimeSpan ? null : variable.SamplingIntervalHint,\n                        OpcPublishingInterval = preferTimeSpan ? null : (int?)\n                            subscriptionSettings?.PublishingInterval?.TotalMilliseconds,\n                        OpcPublishingIntervalTimespan = !preferTimeSpan ? null :\n                            subscriptionSettings?.PublishingInterval,\n                        SkipFirst = variable.SkipFirst,\n                        TypeDefinitionId = variable.TypeDefinitionId,\n                        TriggeredNodes = skipTriggeringNodes ? null : ToOpcNodes(subscriptionSettings,\n                            variable.Triggering?.PublishedVariables,\n                            variable.Triggering?.PublishedEvents,\n                            variable.Triggering?.PublishedMethods, preferTimeSpan, true)?.ToList(),\n                        Topic = variable.Publishing?.QueueName,\n                        QualityOfService = variable.Publishing?.RequestedDeliveryGuarantee,\n\n                        // MonitoringMode = variable.MonitoringMode,\n                        // ...\n\n                        ExpandedNodeId = null,\n                        ConditionHandling = null,\n                        ModelChangeHandling = null,\n                        EventFilter = null\n                    })\n                    .Concat((publishedEvents?.PublishedData ?? Enumerable.Empty<PublishedDataSetEventModel>())\n                    .Select(evt => new OpcNodeModel\n                    {\n                        Id = evt.EventNotifier,\n                        EventFilter = new EventFilterModel\n                        {\n                            TypeDefinitionId = evt.TypeDefinitionId,\n                            SelectClauses = evt.SelectedFields?.Select(s => s.Clone()).ToList(),\n                            WhereClause = evt.Filter.Clone()\n                        },\n                        ConditionHandling = evt.ConditionHandling.Clone(),\n                        ModelChangeHandling = evt.ModelChangeHandling.Clone(),\n                        DataSetFieldId = evt.Id,\n                        DisplayName = evt.PublishedEventName,\n                        FetchDisplayName = evt.ReadEventNameFromNode,\n                        BrowsePath = evt.BrowsePath,\n                        DiscardNew = evt.DiscardNew,\n                        QueueSize = evt.QueueSize,\n                        TriggeredNodes = skipTriggeringNodes ? null : ToOpcNodes(subscriptionSettings,\n                            evt.Triggering?.PublishedVariables,\n                            evt.Triggering?.PublishedEvents,\n                            evt.Triggering?.PublishedMethods, preferTimeSpan, true)?.ToList(),\n                        Topic = evt.Publishing?.QueueName,\n                        QualityOfService = evt.Publishing?.RequestedDeliveryGuarantee,\n\n                        // MonitoringMode = evt.MonitoringMode,\n                        // ...\n                        DeadbandType = null,\n                        TypeDefinitionId = null,\n                        DataChangeTrigger = null,\n                        DataSetClassFieldId = Guid.Empty,\n                        DeadbandValue = null,\n                        ExpandedNodeId = null,\n                        HeartbeatInterval = null,\n                        HeartbeatBehavior = null,\n                        HeartbeatIntervalTimespan = null,\n                        OpcSamplingInterval = null,\n                        OpcSamplingIntervalTimespan = null,\n                        CyclicReadMaxAgeTimespan = null,\n                        CyclicReadMaxAge = null,\n                        AttributeId = null,\n                        RegisterNode = null,\n                        UseCyclicRead = null,\n                        IndexRange = null,\n                        OpcPublishingInterval = preferTimeSpan ? null : (int?)\n                            subscriptionSettings?.PublishingInterval?.TotalMilliseconds,\n                        OpcPublishingIntervalTimespan = !preferTimeSpan ? null :\n                            subscriptionSettings?.PublishingInterval,\n                        SkipFirst = null\n                    })).Concat((publishedMethods?.PublishedData ?? Enumerable.Empty<PublishedDataSetMethodModel>())\n                    .Select(method => new OpcNodeModel\n                    {\n                        Id = method.MethodId,\n                        MethodMetadata = method.Metadata, // TODO: Clone\n                        DataSetFieldId = method.Id,\n                        BrowsePath = method.BrowsePath,\n                        TriggeredNodes = skipTriggeringNodes ? null : ToOpcNodes(subscriptionSettings,\n                            method.Triggering?.PublishedVariables,\n                            method.Triggering?.PublishedEvents,\n                            method.Triggering?.PublishedMethods, preferTimeSpan, true)?.ToList(),\n                        Topic = method.Publishing?.QueueName,\n                        QualityOfService = method.Publishing?.RequestedDeliveryGuarantee,\n\n                        // MonitoringMode = method.MonitoringMode,\n                        // ...\n                        DeadbandType = null,\n                        TypeDefinitionId = null,\n                        DataChangeTrigger = null,\n                        DataSetClassFieldId = Guid.Empty,\n                        DeadbandValue = null,\n                        ExpandedNodeId = null,\n                        HeartbeatInterval = null,\n                        HeartbeatBehavior = null,\n                        HeartbeatIntervalTimespan = null,\n                        OpcSamplingInterval = null,\n                        OpcSamplingIntervalTimespan = null,\n                        CyclicReadMaxAgeTimespan = null,\n                        CyclicReadMaxAge = null,\n                        AttributeId = null,\n                        RegisterNode = null,\n                        UseCyclicRead = null,\n                        IndexRange = null,\n                        ConditionHandling = null,\n                        DiscardNew = null,\n                        QueueSize = null,\n                        ModelChangeHandling = null,\n                        FetchDisplayName = null,\n                        DisplayName = null,\n                        EventFilter = null,\n                        OpcPublishingInterval = preferTimeSpan ? null : (int?)\n                            subscriptionSettings?.PublishingInterval?.TotalMilliseconds,\n                        OpcPublishingIntervalTimespan = !preferTimeSpan ? null :\n                            subscriptionSettings?.PublishingInterval,\n                        SkipFirst = null\n                    }));\n            }\n        }\n\n        /// <summary>\n        /// Convert published nodes configuration to Writer group jobs\n        /// </summary>\n        /// <param name=\"entries\"></param>\n        /// <returns></returns>\n        public IEnumerable<WriterGroupModel> ToWriterGroups(IEnumerable<PublishedNodesEntryModel> entries)\n        {\n            if (entries == null)\n            {\n                return [];\n            }\n            var sw = Stopwatch.StartNew();\n            try\n            {\n                if (!_noPublishingIntervalGrouping)\n                {\n                    //\n                    // Split all entries by the publishing interval in the nodes using the entry publishing\n                    // interval as default. To prevent entries with no nodes to be removed here a dummy\n                    // entry is added to the list of nodes and removed again from the group entries selected.\n                    //\n                    entries = entries\n                        .SelectMany(entry => GetNodeModels(entry, _scaleTestCount)\n                            .DefaultIfEmpty(kDummyEntry)\n                            .GroupBy(n => n.GetNormalizedPublishingInterval(\n                                          entry.GetNormalizedDataSetPublishingInterval()))\n                            .Select(g => entry with\n                            {\n                                // Set the publishing interval for this entry at the top\n                                DataSetPublishingIntervalTimespan = g.Key,\n                                DataSetPublishingInterval = null,\n                                OpcNodes = g\n                                    .Where(n => n != kDummyEntry)\n                                    .Select(n => n with\n                                    {\n                                        // Unset all node specific settings.\n                                        OpcPublishingIntervalTimespan = null,\n                                        OpcPublishingInterval = null\n                                    })\n                                    .ToList()\n                            }));\n                }\n                return entries\n                    //\n                    // Now we have entries with nodes that have no publishing interval, group all entries\n                    // by group identifier\n                    //\n                    .Select(entry => (\n                        Entry: entry,\n                        UniqueGroupId: entry.GetUniqueWriterGroupId()\n                     ))\n                    .GroupBy(entry => entry.UniqueGroupId)\n                    .Select(g => (g.Key, Entries: g.ToList()))\n                    //\n                    // In each group select the writers using the unique data set writer id which uses the\n                    // publishing interval.\n                    //\n                    .Select(group => (\n                        Id: group.Key,\n                        Header: group.Entries[0].Entry,\n                        Writers: group.Entries\n                            .Select(entry => (\n                                entry.Entry,\n                                UniqueWriterId: entry.Entry.GetUniqueDataSetWriterId()\n                             ))\n                            .GroupBy(e => e.UniqueWriterId)\n                            .Select(w => (w.Key, Writers: w.Select(e => e.Entry).ToList()))\n                            .ToList()\n                    ))\n                    // Now bring it all together into a group with writers and settings\n                    .Select(group => new WriterGroupModel\n                    {\n                        Id = group.Id,\n                        MessageType = group.Header.MessageEncoding,\n                        Transport = group.Header.WriterGroupTransport,\n                        TransportConfiguration = group.Header.WriterGroupTransportConfiguration,\n                        Publishing = new PublishingQueueSettingsModel\n                        {\n                            RequestedDeliveryGuarantee = group.Header.WriterGroupQualityOfService,\n                            QueueName = group.Header.WriterGroupQueueName,\n                            Retain = group.Header.WriterGroupMessageRetention,\n                            Ttl = group.Header.WriterGroupMessageTtlTimepan\n                        },\n                        HeaderLayoutUri = group.Header.MessagingMode?.ToString(),\n                        Name = group.Header.DataSetWriterGroup,\n                        Properties = group.Header.WriterGroupProperties,\n                        PublisherId = group.Header.PublisherId,\n                        Type = group.Header.WriterGroupType,\n                        RootNode = group.Header.WriterGroupRootNodeId,\n                        NotificationPublishThreshold = group.Header.BatchSize,\n                        PublishQueuePartitions = group.Header.WriterGroupPartitions,\n                        PublishingInterval = group.Header.GetNormalizedBatchTriggerInterval(),\n                        DataSetWriters = group.Writers\n                            .Select(w => (\n                                WriterId: w.Key,\n                                Header: w.Writers[0],\n                                WriterBatches: w.Writers\n                                    .SelectMany(w => w.OpcNodes!)\n                                    .Distinct(OpcNodeModelEx.Comparer)\n                                    .Batch(_maxNodesPerDataSet)\n                            // Future: batch in service so it is centralized\n                            ))\n                            .SelectMany(b => b.WriterBatches // Do we need to materialize here?\n                                .DefaultIfEmpty(kDummyEntry.YieldReturn())\n                                .Select(n => n.ToList())\n                                .Select((nodes, index) => new DataSetWriterModel\n                                {\n                                    Id = b.WriterId + \"_\" + index,\n                                    DataSetWriterName = b.Header.DataSetWriterId,\n                                    MetaDataUpdateTime = b.Header.GetNormalizedMetaDataUpdateTime(),\n                                    KeyFrameCount = b.Header.DataSetKeyFrameCount,\n                                    Publishing = new PublishingQueueSettingsModel\n                                    {\n                                        QueueName = b.Header.QueueName,\n                                        RequestedDeliveryGuarantee = b.Header.QualityOfService,\n                                        Retain = b.Header.MessageRetention,\n                                        Ttl = b.Header.MessageTtlTimespan\n                                    },\n                                    MetaData = new PublishingQueueSettingsModel\n                                    {\n                                        QueueName = b.Header.MetaDataQueueName,\n                                        RequestedDeliveryGuarantee = null,\n                                        Retain = b.Header.MetaDataRetention,\n                                        Ttl = b.Header.MetaDataTtlTimespan\n                                    },\n                                    DataSet = new PublishedDataSetModel\n                                    {\n                                        Name = b.Header.DataSetName,\n                                        Type = b.Header.DataSetType,\n                                        Subject = b.Header.DataSetSubject,\n                                        RootNode = b.Header.DataSetRootNodeId,\n                                        DataSetMetaData = new DataSetMetaDataModel\n                                        {\n                                            DataSetClassId = b.Header.DataSetClassId,\n                                            Description = b.Header.DataSetDescription,\n                                            MajorVersion = null,\n                                            Name = b.Header.DataSetName\n                                        },\n                                        ExtensionFields = b.Header.DataSetExtensionFields?\n                                            .Select(ef => new ExtensionFieldModel\n                                            {\n                                                DataSetFieldName = ef.Key,\n                                                Value = ef.Value\n                                            })\n                                            .ToList(),\n                                        SendKeepAlive = b.Header.SendKeepAliveDataSetMessages,\n                                        KeepAliveAsKeyFrame = b.Header.SendKeepAliveAsKeyFrameMessages,\n                                        Routing = b.Header.DataSetRouting,\n                                        DataSetSource = new PublishedDataSetSourceModel\n                                        {\n                                            Uri = b.Header.DataSetSourceUri,\n                                            Connection = b.Header.ToConnectionModel(ToCredential),\n                                            SubscriptionSettings = new PublishedDataSetSettingsModel\n                                            {\n                                                MaxKeepAliveCount = b.Header.MaxKeepAliveCount,\n                                                RepublishAfterTransfer = b.Header.RepublishAfterTransfer,\n                                                MonitoredItemWatchdogTimeout = b.Header.OpcNodeWatchdogTimespan,\n                                                MonitoredItemWatchdogCondition = b.Header.OpcNodeWatchdogCondition,\n                                                WatchdogBehavior = b.Header.DataSetWriterWatchdogBehavior,\n                                                Priority = b.Header.Priority,\n                                                ResolveDisplayName = b.Header.DataSetFetchDisplayNames,\n                                                DefaultHeartbeatBehavior = b.Header.DefaultHeartbeatBehavior,\n                                                DefaultHeartbeatInterval = b.Header.GetNormalizedDefaultHeartbeatInterval(),\n                                                DefaultSamplingInterval = b.Header.GetNormalizedDataSetSamplingInterval(),\n                                                PublishingInterval = b.Header.GetNormalizedDataSetPublishingInterval(),\n                                                MaxNotificationsPerPublish = null,\n                                                EnableImmediatePublishing = null,\n                                                EnableSequentialPublishing = null,\n                                                LifeTimeCount = null,\n                                                UseDeferredAcknoledgements = null\n                                                // ...\n                                            },\n                                            PublishedVariables = ToPublishedDataItems(nodes.Where(n => n != kDummyEntry), false),\n                                            PublishedEvents = ToPublishedEventItems(nodes.Where(n => n != kDummyEntry), false),\n                                            PublishedMethods = ToPublishedMethodItems(nodes.Where(n => n != kDummyEntry), false)\n                                        }\n                                    },\n                                    MessageSettings = null,\n                                    DataSetFieldContentMask = null\n                                }))\n                                .ToList(),\n                        KeepAliveTime = null,\n                        MaxNetworkMessageSize = null,\n                        MessageSettings = null,\n                        Priority = null,\n                        PublishQueueSize = null,\n                        SecurityGroupId = null,\n                        SecurityKeyServices = null,\n                        SecurityMode = null,\n                        LocaleIds = null\n                    })\n                    .ToList(); // Convert here or else we dont print conversion correctly\n            }\n            catch (Exception ex)\n            {\n                _logger.FailedToConvertPublishedNodes(ex);\n                return [];\n            }\n            finally\n            {\n                _logger.ConvertedPublishedNodes(sw.Elapsed);\n                sw.Stop();\n            }\n\n            IEnumerable<OpcNodeModel> GetNodeModels(PublishedNodesEntryModel item, int scaleTestCount)\n            {\n                if (item.OpcNodes != null)\n                {\n                    foreach (var node in item.OpcNodes)\n                    {\n                        if (!node.TryGetId(out var id))\n                        {\n                            _logger.MissingNodeId();\n                            continue;\n                        }\n                        if (scaleTestCount <= 1)\n                        {\n                            yield return new OpcNodeModel\n                            {\n                                Id = id,\n                                DisplayName = node.DisplayName,\n                                DataSetClassFieldId = node.DataSetClassFieldId,\n                                DataSetFieldId = node.DataSetFieldId,\n                                ExpandedNodeId = node.ExpandedNodeId,\n                                // The publishing interval item wins over dataset over global default\n                                OpcPublishingIntervalTimespan = node.GetNormalizedPublishingInterval()\n                                    ?? item.GetNormalizedDataSetPublishingInterval(),\n                                OpcSamplingIntervalTimespan = node.GetNormalizedSamplingInterval(),\n                                HeartbeatIntervalTimespan = node.GetNormalizedHeartbeatInterval(),\n                                QueueSize = node.QueueSize,\n                                DiscardNew = node.DiscardNew,\n                                BrowsePath = node.BrowsePath,\n                                AttributeId = node.AttributeId,\n                                FetchDisplayName = node.FetchDisplayName,\n                                IndexRange = node.IndexRange,\n                                RegisterNode = node.RegisterNode,\n                                UseCyclicRead = node.UseCyclicRead,\n                                TypeDefinitionId = node.TypeDefinitionId,\n                                CyclicReadMaxAgeTimespan = node.GetNormalizedCyclicReadMaxAge(),\n                                SkipFirst = node.SkipFirst,\n                                DataChangeTrigger = node.DataChangeTrigger,\n                                DeadbandType = node.DeadbandType,\n                                DeadbandValue = node.DeadbandValue,\n                                EventFilter = node.EventFilter,\n                                HeartbeatBehavior = node.HeartbeatBehavior,\n                                ConditionHandling = node.ConditionHandling,\n                                TriggeredNodes = node.TriggeredNodes,\n                                QualityOfService = node.QualityOfService,\n                                Topic = node.Topic,\n                                ModelChangeHandling = node.ModelChangeHandling\n                            };\n                        }\n                        else\n                        {\n                            for (var i = 0; i < scaleTestCount; i++)\n                            {\n                                yield return new OpcNodeModel\n                                {\n                                    Id = id,\n                                    DisplayName = !string.IsNullOrEmpty(node.DisplayName) ?\n                                        $\"{node.DisplayName}_{i}\" : null,\n                                    DataSetFieldId = node.DataSetFieldId,\n                                    DataSetClassFieldId = node.DataSetClassFieldId,\n                                    ExpandedNodeId = node.ExpandedNodeId,\n                                    HeartbeatIntervalTimespan = node.GetNormalizedHeartbeatInterval(),\n                                    // The publishing interval item wins over dataset over global default\n                                    OpcPublishingIntervalTimespan = node.GetNormalizedPublishingInterval()\n                                        ?? item.GetNormalizedDataSetPublishingInterval(),\n                                    OpcSamplingIntervalTimespan = node.GetNormalizedSamplingInterval(),\n                                    QueueSize = node.QueueSize,\n                                    SkipFirst = node.SkipFirst,\n                                    DataChangeTrigger = node.DataChangeTrigger,\n                                    BrowsePath = node.BrowsePath,\n                                    AttributeId = node.AttributeId,\n                                    FetchDisplayName = node.FetchDisplayName,\n                                    IndexRange = node.IndexRange,\n                                    RegisterNode = node.RegisterNode,\n                                    UseCyclicRead = node.UseCyclicRead,\n                                    TypeDefinitionId = node.TypeDefinitionId,\n                                    CyclicReadMaxAgeTimespan = node.GetNormalizedCyclicReadMaxAge(),\n                                    DeadbandType = node.DeadbandType,\n                                    DeadbandValue = node.DeadbandValue,\n                                    DiscardNew = node.DiscardNew,\n                                    HeartbeatBehavior = node.HeartbeatBehavior,\n                                    EventFilter = node.EventFilter,\n                                    TriggeredNodes = null,\n                                    ConditionHandling = node.ConditionHandling,\n                                    QualityOfService = node.QualityOfService,\n                                    Topic = node.Topic,\n                                    ModelChangeHandling = node.ModelChangeHandling\n                                };\n                            }\n                        }\n                    }\n                }\n\n                if (!string.IsNullOrWhiteSpace(item.NodeId?.Identifier))\n                {\n                    yield return new OpcNodeModel\n                    {\n                        Id = item.NodeId.Identifier,\n                        OpcPublishingIntervalTimespan = item.GetNormalizedDataSetPublishingInterval()\n                    };\n                }\n            }\n\n            static PublishedDataItemsModel ToPublishedDataItems(IEnumerable<OpcNodeModel> opcNodes, bool skipTriggering)\n            {\n                return new PublishedDataItemsModel\n                {\n                    PublishedData = opcNodes\n                    .Where(node => node.MethodMetadata == null && node.EventFilter == null && node.ModelChangeHandling == null)\n                    .Select(node => new PublishedDataSetVariableModel\n                    {\n                        Id = node.DataSetFieldId,\n                        PublishedVariableNodeId = node.Id,\n                        DataSetClassFieldId = node.DataSetClassFieldId,\n\n                        // At this point in time the next values are ensured to be filled in with\n                        // the appropriate value: configured or default\n                        PublishedVariableDisplayName = node.DisplayName,\n                        SamplingIntervalHint = node.OpcSamplingIntervalTimespan,\n                        HeartbeatInterval = node.HeartbeatIntervalTimespan,\n                        HeartbeatBehavior = node.HeartbeatBehavior,\n                        ServerQueueSize = node.QueueSize,\n                        DiscardNew = node.DiscardNew,\n                        SamplingUsingCyclicRead = node.UseCyclicRead,\n                        CyclicReadMaxAge = node.CyclicReadMaxAgeTimespan,\n                        Attribute = node.AttributeId,\n                        IndexRange = node.IndexRange,\n                        RegisterNodeForSampling = node.RegisterNode,\n                        BrowsePath = node.BrowsePath,\n                        ReadDisplayNameFromNode = node.FetchDisplayName,\n                        MonitoringMode = null,\n                        SubstituteValue = null,\n                        SkipFirst = node.SkipFirst,\n                        DataChangeTrigger = node.DataChangeTrigger,\n                        TypeDefinitionId = node.TypeDefinitionId,\n                        DeadbandValue = node.DeadbandValue,\n                        DeadbandType = node.DeadbandType,\n                        Publishing = node.Topic == null && node.QualityOfService == null\n                            ? null : new PublishingQueueSettingsModel\n                            {\n                                QueueName = node.Topic,\n                                RequestedDeliveryGuarantee = node.QualityOfService,\n                                Retain = null,\n                                Ttl = null\n                            },\n                        Triggering = skipTriggering || node.TriggeredNodes == null\n                            ? null : new PublishedDataSetTriggerModel\n                            {\n                                PublishedVariables = ToPublishedDataItems(node.TriggeredNodes, true),\n                                PublishedEvents = ToPublishedEventItems(node.TriggeredNodes, true),\n                                PublishedMethods = ToPublishedMethodItems(node.TriggeredNodes, true)\n                            }\n                    })\n                    .ToList()\n                };\n            }\n\n            static PublishedEventItemsModel ToPublishedEventItems(IEnumerable<OpcNodeModel> opcNodes, bool skipTriggering)\n            {\n                return new PublishedEventItemsModel\n                {\n                    PublishedData = opcNodes\n                    .Where(node => node.MethodMetadata == null && (node.EventFilter != null || node.ModelChangeHandling != null))\n                    .Select(node => new PublishedDataSetEventModel\n                    {\n                        Id = node.DataSetFieldId,\n                        EventNotifier = node.Id,\n                        QueueSize = node.QueueSize,\n                        DiscardNew = node.DiscardNew,\n                        PublishedEventName = node.DisplayName,\n                        ReadEventNameFromNode = node.FetchDisplayName,\n                        BrowsePath = node.BrowsePath,\n                        MonitoringMode = null,\n                        TypeDefinitionId = node.EventFilter?.TypeDefinitionId,\n                        SelectedFields = node.EventFilter?.SelectClauses?.Select(s => s.Clone()).ToList(),\n                        Filter = node.EventFilter?.WhereClause.Clone(),\n                        ConditionHandling = node.ConditionHandling.Clone(),\n                        ModelChangeHandling = node.ModelChangeHandling.Clone(),\n                        Publishing = node.Topic == null && node.QualityOfService == null\n                            ? null : new PublishingQueueSettingsModel\n                            {\n                                QueueName = node.Topic,\n                                RequestedDeliveryGuarantee = node.QualityOfService,\n                                Retain = null,\n                                Ttl = null\n                            },\n                        Triggering = skipTriggering || node.TriggeredNodes == null\n                            ? null : new PublishedDataSetTriggerModel\n                            {\n                                PublishedVariables = ToPublishedDataItems(node.TriggeredNodes, true),\n                                PublishedEvents = ToPublishedEventItems(node.TriggeredNodes, true),\n                                PublishedMethods = ToPublishedMethodItems(node.TriggeredNodes, true)\n                            }\n                    }).ToList()\n                };\n            }\n\n            static PublishedMethodItemsModel ToPublishedMethodItems(IEnumerable<OpcNodeModel> opcNodes, bool skipTriggering)\n            {\n                return new PublishedMethodItemsModel\n                {\n                    PublishedData = opcNodes.Where(node => node.MethodMetadata != null)\n                    .Select(node => new PublishedDataSetMethodModel\n                    {\n                        Id = node.DataSetFieldId,\n                        MethodId = node.Id,\n                        Metadata = node.MethodMetadata, // TODO: .Clone()\n                        BrowsePath = node.BrowsePath,\n                        TypeDefinitionId = node.EventFilter?.TypeDefinitionId,\n                        Publishing = node.Topic == null && node.QualityOfService == null\n                            ? null : new PublishingQueueSettingsModel\n                            {\n                                QueueName = node.Topic,\n                                RequestedDeliveryGuarantee = node.QualityOfService,\n                                Retain = null,\n                                Ttl = null\n                            },\n                        Triggering = skipTriggering || node.TriggeredNodes == null\n                            ? null : new PublishedDataSetTriggerModel\n                            {\n                                PublishedVariables = ToPublishedDataItems(node.TriggeredNodes, true),\n                                PublishedEvents = ToPublishedEventItems(node.TriggeredNodes, true),\n                                PublishedMethods = ToPublishedMethodItems(node.TriggeredNodes, true)\n                            }\n                    }).ToList()\n                };\n            }\n        }\n\n        /// <summary>\n        /// Adds the credentials from the connection to the published nodes model\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"publishedNodesEntryModel\"></param>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        private PublishedNodesEntryModel AddConnectionModel(ConnectionModel? connection,\n            PublishedNodesEntryModel publishedNodesEntryModel)\n        {\n            publishedNodesEntryModel.OpcAuthenticationPassword = null;\n            publishedNodesEntryModel.OpcAuthenticationUsername = null;\n            publishedNodesEntryModel.EncryptedAuthPassword = null;\n            publishedNodesEntryModel.EncryptedAuthUsername = null;\n\n            var credential = connection?.User;\n            switch (credential?.Type ?? CredentialType.None)\n            {\n                case CredentialType.X509Certificate:\n                case CredentialType.UserName:\n                    publishedNodesEntryModel.OpcAuthenticationMode =\n                        credential?.Type == CredentialType.X509Certificate ?\n                            OpcAuthenticationMode.Certificate :\n                            OpcAuthenticationMode.UsernamePassword;\n                    Debug.Assert(credential != null);\n                    var (user, pw, encrypted) =\n                        ToUserNamePasswordCredentialAsync(credential.Value).GetAwaiter().GetResult();\n                    if (encrypted)\n                    {\n                        publishedNodesEntryModel.EncryptedAuthPassword = pw;\n                        publishedNodesEntryModel.EncryptedAuthUsername = user;\n                    }\n                    else\n                    {\n                        publishedNodesEntryModel.OpcAuthenticationPassword = pw;\n                        publishedNodesEntryModel.OpcAuthenticationUsername = user;\n                    }\n                    break;\n                case CredentialType.None:\n                    publishedNodesEntryModel.OpcAuthenticationMode = OpcAuthenticationMode.Anonymous;\n                    break;\n                default:\n                    throw new NotSupportedException(\n                        $\"Credentials of type {credential?.Type} are not supported.\");\n            }\n            if (connection != null)\n            {\n                if (connection.Endpoint != null)\n                {\n                    publishedNodesEntryModel.EndpointUrl = connection.Endpoint.Url;\n                    publishedNodesEntryModel.EndpointSecurityPolicy = connection.Endpoint.SecurityPolicy;\n                    if (connection.Endpoint.SecurityMode == SecurityMode.None)\n                    {\n                        // Fall back to let UseSecurity decide on security (legacy)\n                        publishedNodesEntryModel.UseSecurity = false;\n                        publishedNodesEntryModel.EndpointSecurityMode = null;\n                    }\n                    else if (connection.Endpoint.SecurityMode == SecurityMode.NotNone)\n                    {\n                        // Fall back to let UseSecurity decide on security (legacy)\n                        publishedNodesEntryModel.UseSecurity = true;\n                        publishedNodesEntryModel.EndpointSecurityMode = null;\n                    }\n                    else\n                    {\n                        publishedNodesEntryModel.UseSecurity = null;\n                        publishedNodesEntryModel.EndpointSecurityMode = connection.Endpoint.SecurityMode;\n                    }\n                }\n                publishedNodesEntryModel.UseReverseConnect =\n                    connection.Options.HasFlag(ConnectionOptions.UseReverseConnect) ? true : null;\n                publishedNodesEntryModel.DisableSubscriptionTransfer =\n                    connection.Options.HasFlag(ConnectionOptions.NoSubscriptionTransfer) ? true : null;\n                publishedNodesEntryModel.DumpConnectionDiagnostics =\n                    connection.Options.HasFlag(ConnectionOptions.DumpDiagnostics) ? true : null;\n            }\n            return publishedNodesEntryModel;\n\n            async Task<(string? user, string? password, bool encrypted)> ToUserNamePasswordCredentialAsync(\n                UserIdentityModel? credential)\n            {\n                var userString = credential?.User ?? string.Empty;\n                var passwordString = credential?.Password ?? string.Empty;\n\n                if (_forceCredentialEncryption)\n                {\n                    if (_cryptoProvider != null)\n                    {\n                        try\n                        {\n                            const string kInitializationVector = \"alKGJdfsgidfasdO\"; // See previous publisher\n                            var userBytes = await _cryptoProvider.EncryptAsync(kInitializationVector,\n                                Encoding.UTF8.GetBytes(userString)).ConfigureAwait(false);\n                            var passwordBytes = await _cryptoProvider.EncryptAsync(kInitializationVector,\n                                Encoding.UTF8.GetBytes(passwordString)).ConfigureAwait(false);\n                            return (Convert.ToBase64String(userBytes.Span),\n                                Convert.ToBase64String(passwordBytes.Span), true);\n                        }\n                        catch (Exception ex)\n                        {\n                            Runtime.FailFast(\"Attempting to store a credential. \" +\n                                \"Credential encryption is enforced but crypto provider failed to encrypt!\", ex);\n                        }\n                    }\n                    Runtime.FailFast(\"Attempting to store a credential. \" +\n                        \"Credential encryption is enforced but no crypto provider present!\", null);\n                }\n                return (userString, passwordString, false);\n            }\n        }\n\n        /// <summary>\n        /// Convert to credential model and take into account backwards compatibility\n        /// by using the crypto provider to decrypt encrypted credentials.\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        private CredentialModel ToCredential(PublishedNodesEntryModel entry)\n        {\n            switch (entry.OpcAuthenticationMode)\n            {\n                case OpcAuthenticationMode.UsernamePassword:\n                case OpcAuthenticationMode.Certificate:\n                    var user = entry.OpcAuthenticationUsername ?? string.Empty;\n                    var password = entry.OpcAuthenticationPassword ?? string.Empty;\n                    try\n                    {\n                        const string kInitializationVector = \"alKGJdfsgidfasdO\"; // See previous publisher\n                        if (!string.IsNullOrEmpty(entry.EncryptedAuthUsername) && string.IsNullOrEmpty(user))\n                        {\n                            if (_cryptoProvider != null)\n                            {\n                                var userBytes = _cryptoProvider.DecryptAsync(kInitializationVector,\n                                    Convert.FromBase64String(entry.EncryptedAuthUsername))\n                                        .AsTask().GetAwaiter().GetResult();\n                                user = Encoding.UTF8.GetString(userBytes.Span);\n                            }\n                            else\n                            {\n                                const string error =\n                                    \"No crypto provider to decrypt encrypted username in config.\";\n                                if (_forceCredentialEncryption)\n                                {\n                                    Runtime.FailFast(\"Credential encryption is enforced! \" + error, null);\n                                }\n                                _logger.CredentialDecryptionError(error);\n                                break;\n                            }\n                        }\n                        if (!string.IsNullOrEmpty(entry.EncryptedAuthPassword) && string.IsNullOrEmpty(password))\n                        {\n                            if (_cryptoProvider != null)\n                            {\n                                var passwordBytes = _cryptoProvider.DecryptAsync(kInitializationVector,\n                                    Convert.FromBase64String(entry.EncryptedAuthPassword))\n                                        .AsTask().GetAwaiter().GetResult();\n                                password = Encoding.UTF8.GetString(passwordBytes.Span);\n                            }\n                            else\n                            {\n                                const string error =\n                                    \"No crypto provider to decrypt encrypted password in config.\";\n                                if (_forceCredentialEncryption)\n                                {\n                                    Runtime.FailFast(\"Credential encryption is enforced! \" + error, null);\n                                }\n                                _logger.CredentialDecryptionError(error);\n                                break;\n                            }\n                        }\n                    }\n                    catch (Exception ex)\n                    {\n                        const string error =\n                            \"Failed to decrypt encrypted username and password in config.\";\n                        if (_forceCredentialEncryption)\n                        {\n                            Runtime.FailFast(\"Credential encryption is enforced! \" + error, ex);\n                        }\n                        // There is no reason we should use the encrypted credential here as plain\n                        // text so just use none and move on.\n                        _logger.CredentialDecryptionException(ex, error);\n                        break;\n                    }\n                    return new CredentialModel\n                    {\n                        Type = entry.OpcAuthenticationMode == OpcAuthenticationMode.Certificate ?\n                            CredentialType.X509Certificate :\n                            CredentialType.UserName,\n                        Value = new UserIdentityModel { User = user, Password = password }\n                    };\n            }\n            return new CredentialModel\n            {\n                Type = CredentialType.None\n            };\n        }\n\n        private static readonly OpcNodeModel kDummyEntry = new();\n        private readonly bool _forceCredentialEncryption;\n        private readonly int _scaleTestCount;\n        private readonly int _maxNodesPerDataSet;\n        private readonly bool _noPublishingIntervalGrouping;\n        private readonly IIoTEdgeWorkloadApi? _cryptoProvider;\n        private readonly IJsonSerializer _serializer;\n        private readonly ILogger _logger;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for PublishedNodesConverter\n    /// </summary>\n    internal static partial class PublishedNodesConverterLogging\n    {\n        private const int EventClass = 1720;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Reading and validating published nodes file...\")]\n        internal static partial void ReadingPublishedNodesFile(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Read {Count} entry models from published nodes file in {Elapsed}\")]\n        internal static partial void ReadPublishedNodesFile(this ILogger logger, int count, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"failed to convert the published nodes.\")]\n        internal static partial void FailedToConvertPublishedNodes(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Converted published nodes entry models to jobs in {Elapsed}\")]\n        internal static partial void ConvertedPublishedNodes(this ILogger logger, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"No node id was configured in the opc node entry - skipping...\")]\n        internal static partial void MissingNodeId(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"{Error} - not using credential!\")]\n        internal static partial void CredentialDecryptionError(this ILogger logger, string error);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Error,\n            Message = \"{Error} - not using credential!\")]\n        internal static partial void CredentialDecryptionException(this ILogger logger, Exception ex, string error);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/src/Storage/PublishedNodesProvider.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Storage\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Furly.Extensions.Storage;\n    using Microsoft.Extensions.FileProviders;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Microsoft.Extensions.Primitives;\n    using System;\n    using System.IO;\n    using System.Text;\n    using System.Threading;\n\n    /// <summary>\n    /// Provider for published nodes file.\n    /// </summary>\n    public sealed class PublishedNodesProvider : IStorageProvider, IDisposable\n    {\n        /// <inheritdoc/>\n        public event EventHandler<FileSystemEventArgs>? Changed;\n\n        /// <summary>\n        /// Provider of storage for published nodes file.\n        /// </summary>\n        /// <param name=\"factory\">File provider factory</param>\n        /// <param name=\"options\">Publisher configuration with location\n        /// of published nodes file. </param>\n        /// <param name=\"logger\">Logger</param>\n        public PublishedNodesProvider(IFileProviderFactory factory,\n            IOptions<PublisherOptions> options,\n            ILogger<PublishedNodesProvider> logger)\n        {\n            // TODO: Use IFileProvider and IStorageProvider going forward\n\n            _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n\n            _fileMode = options.Value.PublishedNodesFile == null ||\n                options.Value.CreatePublishFileIfNotExist == true ?\n                    FileMode.OpenOrCreate : FileMode.Open;\n            _fileName = options.Value.PublishedNodesFile ??\n                    PublisherConfig.PublishedNodesFileDefault;\n\n            var root = Path.GetDirectoryName(_fileName);\n            if (string.IsNullOrWhiteSpace(root))\n            {\n                root = Environment.CurrentDirectory;\n            }\n            _root = root;\n            _provider = factory.Create(_root);\n\n            _watch = _provider.Watch(Path.GetFileName(_fileName));\n            _watch.RegisterChangeCallback(ChangeCallback, this);\n\n            _lock = new SemaphoreSlim(1, 1);\n        }\n\n        /// <inheritdoc/>\n        public DateTime GetLastWriteTime()\n        {\n            _lock.Wait();\n            try\n            {\n                var fileName = Path.GetFileName(_fileName);\n                return _provider.GetFileInfo(fileName).LastModified.UtcDateTime;\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public string ReadContent()\n        {\n            _lock.Wait();\n            try\n            {\n                if (!File.Exists(_fileName))\n                {\n                    return string.Empty;\n                }\n                // Create file only if it is the default file.\n                using var fileStream = new FileStream(_fileName,\n                    _fileMode, FileAccess.Read, FileShare.Read);\n                return fileStream.ReadAsString(Encoding.UTF8);\n            }\n            catch (Exception e)\n            {\n                _logger.ReadContentFailed(e, _fileName);\n                throw;\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void WriteContent(string content, bool disableRaisingEvents = false)\n        {\n            _lock.Wait();\n            try\n            {\n                if (disableRaisingEvents)\n                {\n                    _disableRaisingEvents = true;\n                }\n\n                try\n                {\n                    using var fileStream = new FileStream(_fileName,\n                        _fileMode,\n                        FileAccess.Write,\n                        // We will require that there is no other process using the file.\n                        FileShare.None);\n                    fileStream.SetLength(0);\n                    fileStream.Write(Encoding.UTF8.GetBytes(content));\n                }\n                catch (IOException e)\n                {\n                    _logger.UpdateFileRestrictedShare(_fileName);\n\n                    // We will fall back to writing with ReadWrite access.\n                    try\n                    {\n                        using var fileStream = new FileStream(_fileName,\n                            _fileMode,\n                            FileAccess.Write,\n                            // Relaxing requirements.\n                            FileShare.ReadWrite);\n                        fileStream.SetLength(0);\n                        fileStream.Write(Encoding.UTF8.GetBytes(content));\n                        return;\n                    }\n                    catch (Exception)\n                    {\n                        _logger.UpdateFileFailed(e, _fileName);\n                    }\n                    throw;\n                }\n            }\n            finally\n            {\n                // Retore state.\n                if (disableRaisingEvents)\n                {\n                    _disableRaisingEvents = false;\n                }\n\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _lock.Dispose();\n        }\n\n        /// <summary>\n        /// Register callback\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        private void ChangeCallback(object? obj)\n        {\n            var currentChangeToken = _watch;\n            _watch = _provider.Watch(Path.GetFileName(_fileName));\n            _watch.RegisterChangeCallback(ChangeCallback, this);\n            if (!currentChangeToken.HasChanged || _disableRaisingEvents)\n            {\n                _logger.NoRaisingEvent(currentChangeToken.HasChanged);\n                return;\n            }\n            var exists = File.Exists(_fileName);\n            Changed?.Invoke(this, new FileSystemEventArgs(exists ?\n                WatcherChangeTypes.Changed : WatcherChangeTypes.Deleted,\n                _root, Path.GetFileName(_fileName)));\n        }\n\n        private readonly string _root;\n        private readonly ILogger _logger;\n        private readonly FileMode _fileMode;\n        private readonly string _fileName;\n        private readonly SemaphoreSlim _lock;\n        private readonly IFileProvider _provider;\n        private bool _disableRaisingEvents;\n        private IChangeToken _watch;\n    }\n\n    /// <summary>\n    /// Source-generated logging extensions for PublishedNodesProvider\n    /// </summary>\n    internal static partial class PublishedNodesProviderLogging\n    {\n        private const int EventClass = 1740;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Debug,\n            Message = \"Failed to read content of published nodes file from \\\"{Path}\\\"\")]\n        public static partial void ReadContentFailed(this ILogger logger, Exception exception, string path);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Warning,\n            Message = \"Failed to update published nodes file at \\\"{Path}\\\" with restricted share policies. \" +\n            \"Please close any other application that uses this file. Falling back to opening it with more relaxed share policies.\")]\n        public static partial void UpdateFileRestrictedShare(this ILogger logger, string path);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Error,\n            Message = \"Failed to update published nodes file at \\\"{Path}\\\"\")]\n        public static partial void UpdateFileFailed(this ILogger logger, Exception exception, string path);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Trace,\n            Message = \"No raising event while writing ({Changed}).\")]\n        public static partial void NoRaisingEvent(this ILogger logger, bool changed);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Azure.IIoT.OpcUa.Publisher.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ParallelAlgorithm>aggressive</ParallelAlgorithm>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Autofac.Extras.Moq\" Version=\"7.0.0\" />\n    <PackageReference Include=\"Moq\" Version=\"[4.20.2]\" />\n    <PackageReference Include=\"FluentAssertions\" Version=\"[7.2.0]\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.0\" />\n    <PackageReference Include=\"Neovolve.Logging.Xunit\" Version=\"6.3.0\" />\n    <PackageReference Include=\"coverlet.msbuild\" Version=\"6.0.4\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"xunit\" Version=\"2.9.3\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"3.1.5\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa.Publisher.Testing\\tests\\Azure.IIoT.OpcUa.Publisher.Testing.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\Azure.IIoT.OpcUa.Publisher.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Publisher\\*.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage\n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given\n// a specific target and scoped to a namespace, type, member, etc.\n\nusing System.Diagnostics.CodeAnalysis;\n\n[assembly: SuppressMessage(\"Reliability\", \"CA2007:Consider calling ConfigureAwait on the awaited task\", Justification = \"xunit\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Logging.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests\n{\n    using Microsoft.Extensions.Logging;\n    using Neovolve.Logging.Xunit;\n\n    internal static class Logging\n    {\n        /// <summary>\n        /// Default level\n        /// </summary>\n        public static LogLevel Level => LogLevel.Warning;\n\n        /// <summary>\n        /// Configuration\n        /// </summary>\n        public static LoggingConfig Config => new() { LogLevel = Level };\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Model/MonitoredItemModelTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using System;\n    using System.Collections.Generic;\n    using Xunit;\n\n    public class MonitoredItemModelTests\n    {\n        private readonly BaseMonitoredItemModel _dataModel = new DataMonitoredItemModel\n        {\n            StartNodeId = \"DataStartNodeId\",\n            AggregateFilter = new AggregateFilterModel\n            {\n                AggregateConfiguration = new AggregateConfigurationModel\n                {\n                    PercentDataBad = 10,\n                    PercentDataGood = 20,\n                    TreatUncertainAsBad = false,\n                    UseSlopedExtrapolation = false\n                },\n                AggregateTypeId = \"DataAggregateTypeId\",\n                ProcessingInterval = TimeSpan.FromMilliseconds(25),\n                StartTime = DateTime.Now\n            },\n            DataSetClassFieldId = Guid.NewGuid(),\n            SamplingInterval = TimeSpan.FromMilliseconds(5000),\n            QueueSize = 10,\n            AttributeId = NodeAttribute.DataType,\n            DataChangeFilter = new DataChangeFilterModel\n            {\n                DataChangeTrigger = DataChangeTriggerType.StatusValue,\n                DeadbandType = DeadbandType.Absolute,\n                DeadbandValue = 45\n            },\n            DiscardNew = true,\n            SkipFirst = true,\n            DataSetFieldName = \"DataSetFieldName\",\n            HeartbeatInterval = TimeSpan.FromMilliseconds(30000),\n            DataSetFieldId = \"DataSetFieldId\",\n            IndexRange = \"DataIndexRange\",\n            MonitoringMode = MonitoringMode.Sampling,\n            RelativePath = new string[] { \"DataRelativePath\" }\n        };\n        private readonly BaseMonitoredItemModel _eventModel = new EventMonitoredItemModel\n        {\n            StartNodeId = \"EventStartNodeId\",\n            QueueSize = 10,\n            AttributeId = NodeAttribute.DataType,\n            DiscardNew = true,\n            DataSetFieldName = \"EventDataSetFieldName\",\n            DataSetFieldId = \"DataSetFieldId\",\n            MonitoringMode = MonitoringMode.Sampling,\n            RelativePath = new string[] { \"EventRelativePath\" },\n            EventFilter = new EventFilterModel\n            {\n                SelectClauses = new List<SimpleAttributeOperandModel>\n                {\n                    new()\n                    {\n                        AttributeId = NodeAttribute.DataType,\n                        BrowsePath = new string[] { \"EventBrowsePath \"},\n                        IndexRange = \"SelectClauseIndexRange\",\n                        TypeDefinitionId = \"SelectClauseTypeDefinitionId\",\n                        DisplayName = \"SelectClauseDisplayName\",\n                        DataSetClassFieldId = Guid.NewGuid()\n                    }\n                }\n            }\n        };\n\n        [Fact]\n        public void CloneDataModelTest()\n        {\n            var clone = _dataModel with { };\n\n            // Should be equal\n            Assert.IsType<DataMonitoredItemModel>(clone);\n            Assert.True(clone.Equals(_dataModel));\n        }\n\n        [Fact]\n        public void CompareDataModelTestShouldSucceed()\n        {\n            var clone = _dataModel with { };\n\n            // Should be equal\n            Assert.IsType<DataMonitoredItemModel>(clone);\n            Assert.True(clone.Equals(_dataModel));\n        }\n\n        [Fact]\n        public void CompareDataModelTestShouldFail()\n        {\n            var clone = _dataModel with { QueueSize = 47000 };\n\n            // Should not be equal\n            Assert.IsType<DataMonitoredItemModel>(clone);\n            Assert.False(clone.Equals(_dataModel));\n        }\n\n        [Fact]\n        public void CloneEventModelTest()\n        {\n            var clone = _eventModel with { };\n\n            // Should be equal\n            Assert.IsType<EventMonitoredItemModel>(clone);\n            Assert.True(clone.Equals(_eventModel));\n        }\n\n        [Fact]\n        public void CompareEventModelTestShouldSucceed()\n        {\n            var clone = _eventModel with { };\n\n            // Should be equal\n            Assert.IsType<EventMonitoredItemModel>(clone);\n            Assert.True(clone.Equals(_eventModel));\n        }\n\n        [Fact]\n        public void CompareEventModelTestShouldFail()\n        {\n            var clone = _eventModel with { StartNodeId = \"SomethingElse\" };\n\n            // Should not be equal\n            Assert.IsType<EventMonitoredItemModel>(clone);\n            Assert.False(clone.Equals(_eventModel));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Parser/ContentFilterParserTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n#nullable enable\nnamespace Azure.IIoT.OpcUa.Publisher.Parser.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class ContentFilterParserTests\n    {\n        private readonly IJsonSerializer _serializer = new DefaultJsonSerializer();\n        private readonly ITestOutputHelper _output;\n\n        public ContentFilterParserTests(ITestOutputHelper output)\n        {\n            _output = output;\n        }\n\n        [Fact]\n        public async Task AnnexBPart1Example1Async()\n        {\n            // (((AType.A = 5) or InList(BType.B, 3,5,7)) and BaseObjectType.displayName LIKE \"Main%\")\n            const string query = @\"\n    select *\n    from BaseObjectType, AType, BType\n    where ((AType/A = 5) or BType/B in (3,5,7)) and BaseObjectType.displayName like 'Main%'\n\";\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"AType\", new [] { \"/A\" }, \"A\"),\n                new IdentifierMetaData(\"BType\", new [] { \"/B\" }, \"B\")\n            };\n\n            var filter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(filter);\n            Assert.NotNull(filter.SelectClauses);\n            Assert.NotEmpty(filter.SelectClauses);\n            Assert.NotNull(filter.WhereClause);\n\n            var expectedWhere = new ContentFilterModel\n            {\n                Elements = new[]\n                {\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.And,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                Index = 1\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 2\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.Like,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"i=58\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.DisplayName\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = \"Main%\"\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.Or,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                Index = 3\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 4\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.InList,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"BType\",\n                                BrowsePath = new [] { \"/B\" },\n                                AttributeId = NodeAttribute.Value\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 3\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 5\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 7\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.Equals,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"AType\",\n                                BrowsePath = new [] { \"/A\" },\n                                AttributeId = NodeAttribute.Value\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 5\n                            }\n                        }\n                    }\n                }\n            };\n\n            var evtFilter = _serializer.SerializeToString(filter.WhereClause);\n            var expFilter = _serializer.SerializeToString(expectedWhere);\n            Assert.Equal(expFilter, evtFilter);\n        }\n\n        [Fact]\n        public async Task AnnexBPart1Example2Async()\n        {\n            const string query = @\"\n    select *\n    from SystemEventType, Area1, Area2\n    where oftype SystemEventType and (inview Area1 or inview Area2)\n\";\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.SystemEventType.ToString(), new [] { \"/A\" }, \"A\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.SystemEventType.ToString(), new [] { \"/B\" }, \"B\")\n            };\n\n            var filter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(filter);\n            Assert.NotNull(filter.SelectClauses);\n            Assert.NotEmpty(filter.SelectClauses);\n            Assert.NotNull(filter.WhereClause);\n\n            var expectedWhere = new ContentFilterModel\n            {\n                Elements = new[]\n                {\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.And,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                Index = 1\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 4\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.Or,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                Index = 2\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 3\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.InView,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"Area2\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.InView,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"Area1\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel\n                    {\n                        FilterOperator = FilterOperatorType.OfType,\n                        FilterOperands = new [] {\n                            new FilterOperandModel\n                            {\n                                // Literal\n                                Value = Opc.Ua.ObjectTypeIds.SystemEventType.ToString(),\n                                DataType = \"NodeId\"\n                            }\n                        }\n                    }\n                }\n            };\n\n            var evtFilter = _serializer.SerializeToString(filter.WhereClause);\n            var expFilter = _serializer.SerializeToString(expectedWhere);\n            Assert.Equal(expFilter, evtFilter);\n        }\n\n        [Fact]\n        public async Task AnnexBPart2Example1Async()\n        {\n            const string query1 = @\"\n    select PersonType/LastName, AnimalType/Name, ScheduleType/Period\n    from PersonType, AnimalType, ScheduleType, HasSchedule, HasPet\n    where PersonType relatedTo (\n        AnimalType relatedTo (ScheduleType, HasSchedule, 1), HasPet, 1)\n\";\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"PersonType\", new [] { \"/LastName\" }, \"LastName\"),\n                new IdentifierMetaData(\"HasPet\", Array.Empty<string>(), \"HasPet\"),\n                new IdentifierMetaData(\"AnimalType\", new [] { \"/Name\" }, \"Name\"),\n                new IdentifierMetaData(\"HasSchedule\", Array.Empty<string>(), \"HasSchedule\"),\n                new IdentifierMetaData(\"ScheduleType\", new [] { \"/Period\" }, \"Period\")\n            };\n\n            var filter = await parser.ParseEventFilterAsync(query1, context, default);\n            _output.WriteLine(_serializer.SerializeToString(filter, SerializeOption.Indented));\n\n            Assert.NotNull(filter);\n            Assert.NotNull(filter.SelectClauses);\n            Assert.NotEmpty(filter.SelectClauses);\n            Assert.NotNull(filter.WhereClause);\n\n            var expectedWhere = new ContentFilterModel\n            {\n                Elements = new[]\n                {\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.RelatedTo,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 1\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"HasPet\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 1\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.RelatedTo,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"AnimalType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"ScheduleType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"HasSchedule\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 1\n                            }\n                        }\n                    }\n                }\n            };\n\n            var evtFilter = _serializer.SerializeToString(filter.WhereClause);\n            var expFilter = _serializer.SerializeToString(expectedWhere);\n            Assert.Equal(expFilter, evtFilter);\n\n            const string query2 = @\"\n    select /LastName, /Name, /Period\n    from PersonType, AnimalType, ScheduleType, HasSchedule, HasPet\n    where PersonType relatedTo (\n        AnimalType relatedTo (ScheduleType, HasSchedule, 1), HasPet, 1)\n\";\n            var filter2 = await parser.ParseEventFilterAsync(query2, context, default);\n            var filterJson1 = _serializer.SerializeToString(filter);\n            var filterJson2 = _serializer.SerializeToString(filter2);\n            Assert.Equal(filterJson1, filterJson2);\n        }\n\n        [Fact]\n        public async Task AnnexBPart2Example2Async()\n        {\n            const string query = @\"\n    select /LastName, AnimalType/Name\n    from PersonType, HasChild, CatType AnimalType, HasSchedule, FeedingScheduleType\n    where\n        PersonType relatedTo (PersonType, HasChild, 1)\n    or\n        CatType relatedTo (FeedingScheduleType, HasSchedule, 1)\n\";\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"PersonType\", new [] { \"/LastName\" }, \"LastName\"),\n                new IdentifierMetaData(\"HasPet\", Array.Empty<string>(), \"HasPet\"),\n                new IdentifierMetaData(\"AnimalType\", new [] { \"/Name\" }, \"Name\"),\n                new IdentifierMetaData(\"CatType\", new [] { \"/Name\" }, \"Name\"),\n                new IdentifierMetaData(\"HasSchedule\", Array.Empty<string>(), \"HasSchedule\"),\n                new IdentifierMetaData(\"FeedingScheduleType\",new [] {  \"/Period\" }, \"Period\")\n            };\n\n            var filter = await parser.ParseEventFilterAsync(query, context, default);\n            _output.WriteLine(_serializer.SerializeToString(filter, SerializeOption.Indented));\n\n            Assert.NotNull(filter);\n            Assert.NotNull(filter.SelectClauses);\n            Assert.NotEmpty(filter.SelectClauses);\n            Assert.NotNull(filter.WhereClause);\n\n            var expectedWhere = new ContentFilterModel\n            {\n                Elements = new[]\n                {\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.Or,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                Index = 1\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 2\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.RelatedTo,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"CatType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"FeedingScheduleType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"HasSchedule\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 1\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.RelatedTo,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"HasChild\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 1\n                            }\n                        }\n                    }\n                }\n            };\n\n            var evtFilter = _serializer.SerializeToString(filter.WhereClause);\n            var expFilter = _serializer.SerializeToString(expectedWhere);\n            Assert.Equal(expFilter, evtFilter);\n        }\n\n        [Fact]\n        public async Task AnnexBPart2Example3Async()\n        {\n            // Get PersonType.LastName, AnimalType.Name, ScheduleType.Period\n            // where a person has a pet and the animal has a feeding schedule\n            // and the person has a Zipcode = ‘02138’\n            // and (the Schedule.Period is Daily or Hourly)\n            // and Amount to feed is > 10.\n\n            const string query = @\"\n    select PersonType/LastName, AnimalType/Name, ScheduleType/Period\n    from PersonType, AnimalType, ScheduleType, HasSchedule, HasPet, Int32\n    where PersonType relatedTo\n        (AnimalType relatedTo (ScheduleType, HasSchedule, 1), HasPet, 1)\n    and PersonType/Zipcode = '02138'\n    and (PersonType<HasPet>AnimalType<HasSchedule>FeedingSchedule/Period = 'Daily'\n      or PersonType<HasPet>AnimalType<HasSchedule>FeedingSchedule/Period = 'Hourly')\n    and PersonType<HasPet>AnimalType<HasSchedule>FeedingSchedule/Amount > (10 cast(Int32))\n\";\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"PersonType\", new [] { \"/LastName\" }, \"LastName\"),\n                new IdentifierMetaData(\"PersonType\", new [] { \"/Zipcode\" }, \"Zipcode\"),\n                new IdentifierMetaData(\"PersonType\",\n                    new [] { \"<HasPet>AnimalType\", \"<HasSchedule>FeedingSchedule\", \"/Period\" }, \"Period\"),\n                new IdentifierMetaData(\"PersonType\",\n                    new [] { \"<HasPet>AnimalType\", \"<HasSchedule>FeedingSchedule\", \"/Amount\" }, \"Amount\"),\n                new IdentifierMetaData(\"HasPet\", Array.Empty<string>(), \"HasPet\"),\n                new IdentifierMetaData(\"AnimalType\", new [] { \"/Name\" }, \"Name\"),\n                new IdentifierMetaData(\"Int32\", Array.Empty<string>(), \"Int32\"),\n                new IdentifierMetaData(\"HasSchedule\", Array.Empty<string>(), \"HasSchedule\"),\n                new IdentifierMetaData(\"ScheduleType\", new [] { \"/Period\" }, \"Period\")\n            };\n\n            var filter = await parser.ParseEventFilterAsync(query, context, default);\n            _output.WriteLine(_serializer.SerializeToString(filter, SerializeOption.Indented));\n\n            Assert.NotNull(filter);\n            Assert.NotNull(filter.SelectClauses);\n            Assert.NotEmpty(filter.SelectClauses);\n            Assert.NotNull(filter.WhereClause);\n        }\n\n        [Fact]\n        public async Task AnnexBPart2Example4Async()\n        {\n            // Get PersonType.LastName where a person has a child who has a pet.\n\n            const string query = @\"\n    select PersonType/LastName\n    from PersonType, AnimalType, HasPet, HasChild\n    where PersonType relatedTo\n        (PersonType relatedTo (AnimalType, HasPet, 1), HasChild, 1)\n\";\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"PersonType\", new [] { \"/LastName\" }, \"LastName\"),\n                new IdentifierMetaData(\"HasPet\", Array.Empty<string>(), \"HasPet\"),\n                new IdentifierMetaData(\"AnimalType\", new [] { \"/Name\" }, \"Name\"),\n                new IdentifierMetaData(\"HasChild\", Array.Empty<string>(), \"HasChild\")\n            };\n\n            var filter = await parser.ParseEventFilterAsync(query, context, default);\n            _output.WriteLine(_serializer.SerializeToString(filter, SerializeOption.Indented));\n\n            Assert.NotNull(filter);\n            Assert.NotNull(filter.SelectClauses);\n            Assert.NotEmpty(filter.SelectClauses);\n            Assert.NotNull(filter.WhereClause);\n\n            var expectedWhere = new ContentFilterModel\n            {\n                Elements = new[]\n                {\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.RelatedTo,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 1\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"HasChild\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 1\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.RelatedTo,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"AnimalType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"HasPet\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 1\n                            }\n                        }\n                    }\n                }\n            };\n\n            var evtFilter = _serializer.SerializeToString(filter.WhereClause);\n            var expFilter = _serializer.SerializeToString(expectedWhere);\n            Assert.Equal(expFilter, evtFilter);\n        }\n\n        [Fact]\n        public async Task AnnexBPart2Example5Async()\n        {\n            // Get the last names of children that have the same first name as a parent of theirs\n\n            const string query = @\"\n    select parent/LastName\n    from PersonType parent, PersonType child, HasChild\n    where parent relatedTo (child, HasChild, 1)\n      and parent/FirstName = child/FirstName\n\";\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"PersonType\", new [] { \"/LastName\" }, \"LastName\"),\n                new IdentifierMetaData(\"PersonType\", new [] { \"/FirstName\" }, \"FirstName\"),\n                new IdentifierMetaData(\"HasChild\", Array.Empty<string>(), \"HasChild\")\n            };\n\n            var filter = await parser.ParseEventFilterAsync(query, context, default);\n            _output.WriteLine(_serializer.SerializeToString(filter, SerializeOption.Indented));\n\n            Assert.NotNull(filter);\n            Assert.NotNull(filter.SelectClauses);\n            Assert.NotEmpty(filter.SelectClauses);\n            Assert.NotNull(filter.WhereClause);\n\n            var expectedWhere = new ContentFilterModel\n            {\n                Elements = new[]\n                {\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.And,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                Index = 1\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 2\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.Equals,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = new [] { \"/FirstName\" },\n                                AttributeId = NodeAttribute.Value,\n                                Alias = \"parent\"\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = new [] { \"/FirstName\" },\n                                AttributeId = NodeAttribute.Value,\n                                Alias = \"child\"\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel {\n                        FilterOperator = FilterOperatorType.RelatedTo,\n                        FilterOperands = new[]\n                        {\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId,\n                                Alias = \"parent\"\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"PersonType\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId,\n                                Alias = \"child\"\n                            },\n                            new FilterOperandModel\n                            {\n                                NodeId = \"HasChild\",\n                                BrowsePath = Array.Empty<string>(),\n                                AttributeId = NodeAttribute.NodeId\n                            },\n                            new FilterOperandModel\n                            {\n                                Value = 1\n                            }\n                        }\n                    }\n                }\n            };\n\n            var evtFilter = _serializer.SerializeToString(filter.WhereClause);\n            var expFilter = _serializer.SerializeToString(expectedWhere);\n            Assert.Equal(expFilter, evtFilter);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Parser/EventFilterParserTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n#nullable enable\nnamespace Azure.IIoT.OpcUa.Publisher.Parser.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class EventFilterParserTests\n    {\n        private readonly IJsonSerializer _serializer = new DefaultJsonSerializer();\n        private readonly ITestOutputHelper _output;\n\n        public EventFilterParserTests(ITestOutputHelper output)\n        {\n            _output = output;\n        }\n\n        [Theory]\n        [InlineData(\"SELECT *\")]\n        [InlineData(\"SELECT * FROM BaseEventType\")]\n        [InlineData(\"SELECT * FROM ns0:BaseEventType\")]\n        public async Task SimpleStatementParsingNoPrefixNoWhereTestsAsync(string query)\n        {\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/Severity\" }, \"Severity\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceNode\" }, \"SourceNode\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceName\" }, \"SourceName\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/LocalTime\" }, \"LocalTime\")\n            };\n            var eventFilter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(eventFilter);\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.NotEmpty(eventFilter.SelectClauses);\n            Assert.Null(eventFilter.WhereClause);\n            _output.WriteLine(_serializer.SerializeToString(eventFilter, SerializeOption.Indented));\n        }\n\n        [Theory]\n        [InlineData(\"SELECT * FROM BaseEventType \" +\n            \"WHERE /Severity > 5 AND /SourceName = 'SouthMotor'\")]\n        [InlineData(\"SELECT * \" +\n            \"WHERE /Severity > 5 AND /SourceName = 'SouthMotor'\")]\n        [InlineData(\"SELECT /Severity, /SourceNode FROM BaseEventType \" +\n            \"WHERE !(/Severity <= 5 OR /SourceName == 'SouthMotor')\")]\n        [InlineData(\"SELECT /LocalTime FROM BaseEventType \" +\n            \"WHERE NOT ISNULL /LocalTime \" +\n            \"AND (/Severity <> 5 OR /SourceName != 'SouthMotor')\")]\n        [InlineData(\"SELECT E/Severity, E/SourceNode FROM BaseEventType E \" +\n            \"WHERE !(E/Severity <= 5 OR E/SourceName == 'SouthMotor')\")]\n        [InlineData(\"SELECT E/0:Severity, E/SourceNode FROM ns0:BaseEventType E \" +\n            \"WHERE NOT (E/0:Severity <= 5 OR E/0:SourceName == 'SouthMotor')\")]\n        [InlineData(\"SELECT /0:LocalTime FROM ns0:BaseEventType \" +\n            \"WHERE NOT ISNULL /0:LocalTime \" +\n            \"AND (/0:Severity <> 5 OR /0:SourceName != 'SouthMotor')\")]\n        [InlineData(\"SELECT E/Severity, /SourceNode FROM BaseEventType E \" +\n            \"WHERE !(E/Severity <= 5 OR E/SourceName == 'SouthMotor')\")]\n        [InlineData(\"SELECT E/0:Severity, /SourceNode FROM ns0:BaseEventType E \" +\n            \"WHERE NOT (E/0:Severity <= 5 OR E/0:SourceName == 'SouthMotor')\")]\n        public async Task SimpleStatementParsingNoPrefixTestsAsync(string query)\n        {\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/Severity\" }, \"Severity\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceNode\" }, \"SourceNode\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceName\" }, \"SourceName\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/LocalTime\" }, \"LocalTime\")\n            };\n            var eventFilter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(eventFilter);\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.NotEmpty(eventFilter.SelectClauses);\n            Assert.NotNull(eventFilter.WhereClause);\n            var where = eventFilter.WhereClause!.Elements;\n            Assert.NotNull(where);\n            Assert.NotEmpty(where);\n            _output.WriteLine(_serializer.SerializeToString(eventFilter, SerializeOption.Indented));\n        }\n\n        [Theory]\n        [InlineData(\"PREFIX ua <http://microsoft/ua> SELECT * FROM ua:BaseEventType \" +\n            \"WHERE /ua:Severity > 5 AND /ua:SourceName = 'SouthMotor'\")]\n        [InlineData(\"PREFIX ua <http://microsoft/ua> \" +\n            \"SELECT /ua:Severity, /ua:SourceNode FROM ua:BaseEventType \" +\n            \"WHERE !(/ua:Severity <= 5 OR /ua:SourceName == 'SouthMotor')\")]\n        [InlineData(\"PREFIX ua <http://microsoft/ua> PREFIX f <http://microsoft/f> \" +\n            \"SELECT /f:LocalTime FROM ua:BaseEventType \" +\n            \"WHERE NOT ISNULL /f:LocalTime \" +\n            \"AND (/ua:Severity <> 5 OR /ua:SourceName != 'SouthMotor')\")]\n        [InlineData(\"PREFIX ua <http://microsoft/ua> PREFIX f <http://microsoft/f> \" +\n            \"SELECT E/ua:Severity, E/ua:SourceNode FROM ua:BaseEventType E \" +\n            \"WHERE !(E/ua:Severity <= 5 OR E/ua:SourceName == 'SouthMotor')\")]\n        public async Task SimpleStatementParsingTestsAsync(string query)\n        {\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"http://microsoft/ua#BaseEventType\",\n                    new[] { \"/[http://microsoft/ua#Severity]\" }, \"Severity\"),\n                new IdentifierMetaData(\"http://microsoft/ua#BaseEventType\",\n                    new[] { \"/[http://microsoft/ua#SourceNode]\" }, \"SourceNode\"),\n                new IdentifierMetaData(\"http://microsoft/ua#BaseEventType\",\n                    new[] { \"/[http://microsoft/ua#SourceName]\" }, \"SourceName\"),\n                new IdentifierMetaData(\"http://microsoft/ua#BaseEventType\",\n                    new[] { \"/[http://microsoft/f#LocalTime]\" }, \"LocalTime\")\n            };\n            var eventFilter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(eventFilter);\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.NotEmpty(eventFilter.SelectClauses);\n            Assert.NotNull(eventFilter.WhereClause);\n            var where = eventFilter.WhereClause!.Elements;\n            Assert.NotNull(where);\n            Assert.NotEmpty(where);\n            _output.WriteLine(_serializer.SerializeToString(eventFilter, SerializeOption.Indented));\n        }\n\n        [Theory]\n        [InlineData(\"SELECT * FROM ´http://microsoft/ua#BaseEventType´ \" +\n            \"WHERE ´/[http://microsoft/ua#Severity]´ > 5 \" +\n            \"AND ´/[http://microsoft/ua#SourceName]´ = 'SouthMotor'\")]\n        [InlineData(\"SELECT ´E/[http://microsoft/ua#Severity]´, ´E/[http://microsoft/ua#SourceNode]´ \" +\n            \"FROM ´http://microsoft/ua#BaseEventType´ E \" +\n            \"WHERE !(´E/[http://microsoft/ua#Severity]´ <= 5 \" +\n            \"   OR ´E/[http://microsoft/ua#SourceName]´ == 'SouthMotor')\")]\n        public async Task SimpleStatementParsingTestsInlineNamespacesAsync(string query)\n        {\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"http://microsoft/ua#BaseEventType\",\n                    new[] { \"/[http://microsoft/ua#Severity]\" }, \"Severity\"),\n                new IdentifierMetaData(\"http://microsoft/ua#BaseEventType\",\n                    new[] { \"/[http://microsoft/ua#SourceNode]\" }, \"SourceNode\"),\n                new IdentifierMetaData(\"http://microsoft/ua#BaseEventType\",\n                    new[] { \"/[http://microsoft/ua#SourceName]\" }, \"SourceName\"),\n                new IdentifierMetaData(\"http://microsoft/ua#BaseEventType\",\n                    new[] { \"/[http://microsoft/f#LocalTime]\" }, \"LocalTime\")\n            };\n            var eventFilter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(eventFilter);\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.NotEmpty(eventFilter.SelectClauses);\n            Assert.NotNull(eventFilter.WhereClause);\n            var where = eventFilter.WhereClause!.Elements;\n            Assert.NotNull(where);\n            Assert.NotEmpty(where);\n            _output.WriteLine(_serializer.SerializeToString(eventFilter, SerializeOption.Indented));\n        }\n\n        [Theory]\n        [InlineData(\"SELECT\")]\n        [InlineData(\"SELECT \" +\n            \"WHERE /Severity > 5 AND /SourceName = 'SouthMotor'\")]\n        [InlineData(\"FROM BaseEventType\")]\n        [InlineData(\"SELECT * FROM 0:BaseEventType\")]\n        [InlineData(\"SELECT * FROM BaseEventType \" +\n            \"WHERE /ua:Severity > 5 AND /SourceName = 'SouthMotor'\")]\n        [InlineData(\"PREFIX ua f SELECT * FROM BaseEventType \" +\n            \"WHERE /ua:Severity > 5 AND /ub:SourceName = 'SouthMotor'\")]\n        [InlineData(\"SELECT * \" +\n            \"WHERE /Severity > 5 NAND /SourceName = 'SouthMotor'\")]\n        public async Task SimpleStatementParsingFailsTestsAsync(string query)\n        {\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/Severity\" }, \"Severity\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceNode\" }, \"SourceNode\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceName\" }, \"SourceName\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/LocalTime\" }, \"LocalTime\")\n            };\n            await Assert.ThrowsAsync<ParserException>(\n                () => parser.ParseEventFilterAsync(query, context, default));\n        }\n\n        [Fact]\n        public async Task SimpleStatementTest2Async()\n        {\n            const string query = \"SELECT * FROM BaseEventType WHERE /Severity > 5 AND /SourceName = 'SouthMotor'\";\n\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/Severity\" }, \"Severity\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceNode\" }, \"SourceNode\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceName\" }, \"SourceName\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/LocalTime\" }, \"LocalTime\")\n            };\n            var eventFilter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(eventFilter);\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.NotEmpty(eventFilter.SelectClauses);\n            Assert.NotNull(eventFilter.WhereClause);\n            var where = eventFilter.WhereClause!.Elements;\n            Assert.NotNull(where);\n            Assert.NotEmpty(where);\n            _output.WriteLine(_serializer.SerializeToString(eventFilter, SerializeOption.Indented));\n        }\n\n        [Fact]\n        public async Task SimpleStatementTest3Async()\n        {\n            const string query = \"SELECT * FROM BaseEventType WHERE /Severity > 5 AND /SourceName = 'SouthMotor'\";\n\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/Severity\" }, \"Severity\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceNode\" }, \"SourceNode\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceName\" }, \"SourceName\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/LocalTime\" }, \"LocalTime\")\n            };\n            var eventFilter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(eventFilter);\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.NotEmpty(eventFilter.SelectClauses);\n            Assert.NotNull(eventFilter.WhereClause);\n            var where = eventFilter.WhereClause!.Elements;\n            Assert.NotNull(where);\n            Assert.NotEmpty(where);\n            _output.WriteLine(_serializer.SerializeToString(eventFilter, SerializeOption.Indented));\n        }\n\n        [Fact]\n        public async Task SimpleStatementTest4Async()\n        {\n            const string query =\n                @\"\nPREFIX t http://test/#\nSELECT *\nFROM BaseEventType\nWHERE\n    (/Severity > 5 AND /Severity < 10)\n  OR /SourceNode IN('t:i=1544'^^NodeId, 't:i=1545'^^NodeId)\";\n\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/Severity\" }, \"Severity\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceNode\" }, \"SourceNode\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/SourceName\" }, \"SourceName\"),\n                new IdentifierMetaData(Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                    new[] { \"/LocalTime\" }, \"LocalTime\")\n            };\n            var eventFilter = await parser.ParseEventFilterAsync(query, context, default);\n\n            Assert.NotNull(eventFilter);\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.NotEmpty(eventFilter.SelectClauses);\n            Assert.NotNull(eventFilter.WhereClause);\n            var where = eventFilter.WhereClause!.Elements;\n            Assert.NotNull(where);\n            Assert.NotEmpty(where);\n            _output.WriteLine(_serializer.SerializeToString(eventFilter, SerializeOption.Indented));\n        }\n\n        [Fact]\n        public async Task AlarmsTestFilterTestAsync()\n        {\n            var parser = new FilterQueryParser(_serializer);\n            var context = new TestParserContext\n            {\n                new IdentifierMetaData(\"i=2041\",\n                    new[] { \"/Severity\" }, \"Severity\"),\n                new IdentifierMetaData(\"i=2041\",\n                    new[] { \"/SourceNode\" }, \"SourceNode\"),\n                new IdentifierMetaData(\"i=10751\",\n                    new[] { \"/Additional\" }, \"Additional\")\n            };\n\n            const string query1 = @\"\nPREFIX ac <http://opcfoundation.org/AlarmCondition>\nSELECT * FROM i=10751, i=2041\nWHERE\n    OFTYPE i=10751 AND\n    /SourceNode IN ('ac:s=1%3aMetals%2fSouthMotor'^^NodeId)\n\";\n            var filter1 = await parser.ParseEventFilterAsync(query1, context, default);\n\n            // Test with default aliasing\n            const string query2 = @\"\nPREFIX ac <http://opcfoundation.org/AlarmCondition>\nSELECT /Additional, /Severity, /SourceNode FROM TripAlarmType, BaseEventType\nWHERE\n    OFTYPE TripAlarmType AND\n    /SourceNode IN ('ac:s=1%3aMetals%2fSouthMotor'^^NodeId)\n\";\n            var filter2 = await parser.ParseEventFilterAsync(query2, context, default);\n\n            var whereExpected = new ContentFilterModel\n            {\n                Elements = new[]\n                {\n                    new ContentFilterElementModel // Index 0\n                    {\n                        FilterOperator = FilterOperatorType.And,\n                        FilterOperands = new [] {\n                            // Filter element indexes\n                            new FilterOperandModel\n                            {\n                                Index = 1\n                            },\n                            new FilterOperandModel\n                            {\n                                Index = 2\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel // Index 1\n                    {\n                        FilterOperator = FilterOperatorType.InList,\n                        FilterOperands = new [] {\n                            // Source node property of base event type should be ...\n                            new FilterOperandModel\n                            {\n                                // Simple attribute\n                                AttributeId = NodeAttribute.Value,\n                                // Note: Default namespace which we omit\n                                NodeId = Opc.Ua.ObjectTypeIds.BaseEventType.ToString(),\n                                BrowsePath = new[] { \"/\" + Opc.Ua.BrowseNames.SourceNode }\n                            },\n                            // ...In the following list\n                            new FilterOperandModel\n                            {\n                                // Literal\n                                Value = \"http://opcfoundation.org/AlarmCondition#s=1%3aMetals%2fSouthMotor\",\n                                DataType = \"NodeId\"\n                            }\n                        }\n                    },\n                    new ContentFilterElementModel // Index 2\n                    {\n                        FilterOperator = FilterOperatorType.OfType,\n                        FilterOperands = new[] {\n                            new FilterOperandModel\n                            {\n                                // Literal\n                                Value = Opc.Ua.ObjectTypeIds.TripAlarmType.ToString(),\n                                DataType = \"NodeId\"\n                            }\n                        }\n                    }\n                }\n            };\n\n            Assert.NotNull(filter1);\n            Assert.NotNull(filter1.SelectClauses);\n            Assert.Equal(3, filter1.SelectClauses!.Count);\n            Assert.NotNull(filter1.WhereClause);\n\n            var f1 = _serializer.SerializeToString(filter1);\n            var f2 = _serializer.SerializeToString(filter2);\n            Assert.Equal(f1, f2);\n\n            var evtFilter = _serializer.SerializeToString(filter1.WhereClause);\n            var expFilter = _serializer.SerializeToString(whereExpected);\n            Assert.Equal(expFilter, evtFilter);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Parser/TestParserContext.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n#nullable enable\nnamespace Azure.IIoT.OpcUa.Publisher.Parser.Tests\n{\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    public sealed class TestParserContext : List<IdentifierMetaData>,\n        IFilterParserContext\n    {\n        public Task<IEnumerable<IdentifierMetaData>> GetIdentifiersAsync(string typeId,\n            CancellationToken ct)\n        {\n            return Task.FromResult(this.Where(id => id.TypeDefinitionId == typeId));\n        }\n\n        public bool TryGetNamespaceUri(uint index, out string? namespaceUri)\n        {\n            if (index == 0)\n            {\n                namespaceUri = string.Empty;\n                return true;\n            }\n            namespaceUri = null;\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Properties/AssemblyInfo.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#if !DEBUG\nusing Xunit;\n[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly, MaxParallelThreads = 4)]\n#endif\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/empty_pn.json",
    "content": "[]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_2.5_legacy.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"username\",\n        \"OpcAuthenticationPassword\": \"password\",\n        \"NodeId\": {\n            \"Identifier\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\"\n        }\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_2.5_legacy_error.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"username\",\n        \"OpcAuthenticationPassword\": \"password\",\n        \"NodeId\": {\n            \"Identifier\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\"\n        },\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_assets.json",
    "content": "[\n    {\n        \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"Anonymous\",\n        \"OpcAuthenticationUsername\": \"\",\n        \"OpcAuthenticationPassword\": \"\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\"\n            }\n        ]\n    },\n    {\n        \"DataSetWriterId\": \"Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetWriterGroup\": \"Leaf1\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_assets_with_optional_fields.json",
    "content": "[\n    {\n        \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"Anonymous\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"OpcSamplingIntervalTimespan\": \"00:00:01.500\",\n                \"OpcPublishingIntervalTimespan\": \"00:00:01.500\",\n                \"HeartbeatIntervalTimespan\": \"00:00:01.500\",\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            }\n        ]\n    },\n    {\n        \"DataSetWriterId\": \"Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetName\": \"Tag_Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetWriterGroup\": \"Leaf1\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"OpcSamplingInterval\": 2000,\n                \"OpcPublishingInterval\": 2000,\n                \"HeartbeatInterval\": 2,\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_events.json",
    "content": "﻿[\n    {\n        \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"SimpleEvents\",\n                \"QueueSize\": 10,\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Message\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CycleId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CurrentStep\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=16;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"DataSetWriterId\": \"Leaf1_1000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf1_1000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetWriterGroup\": \"Leaf1\",\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2255\",\n                \"DisplayName\": \"Alarms\",\n                \"QueueSize\": 10,\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Message\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=17;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_opc_nodes_empty.json",
    "content": "[\n    {\n        \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"Anonymous\",\n        \"OpcAuthenticationUsername\": \"\",\n        \"OpcAuthenticationPassword\": \"\",\n        \"OpcNodes\": []\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_opc_nodes_empty_and_null.json",
    "content": "[\n    {\n        \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"Anonymous\",\n        \"OpcAuthenticationUsername\": \"\",\n        \"OpcAuthenticationPassword\": \"\",\n        \"OpcNodes\": []\n    },\n    {\n        \"DataSetWriterId\": \"Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetName\": \"Tag_Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetWriterGroup\": \"Leaf1\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\"\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_opc_nodes_null.json",
    "content": "[\n    {\n        \"DataSetWriterId\": \"Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetName\": \"Tag_Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetWriterGroup\": \"Leaf1\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\"\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/pn_pending_alarms.json",
    "content": "﻿[\n  {\n    \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n    \"Tag\": \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n    \"DataSetWriterGroup\": \"Leaf0\",\n    \"DataSetPublishingInterval\": 10000,\n    \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n    \"UseSecurity\": false,\n    \"OpcNodes\": [\n      {\n        \"DisplayName\": \"PendingAlarms\",\n        \"Id\": \"i=2253\",\n        \"EventFilter\": {\n          \"TypeDefinitionId\": \"i=2041\"\n        },\n        \"ConditionHandling\": {\n          \"UpdateInterval\": 10,\n          \"SnapshotInterval\": 20\n        }\n      }\n    ]\n  },\n  {\n    \"DataSetWriterId\": \"Leaf1_1000_3085991c-b85c-4311-9bfb-a916da952234\",\n    \"Tag\": \"Tag_Leaf1_1000_3085991c-b85c-4311-9bfb-a916da952234\",\n    \"DataSetWriterGroup\": \"Leaf1\",\n    \"DataSetPublishingInterval\": 1000,\n    \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n    \"UseSecurity\": false,\n    \"OpcNodes\": [\n      {\n        \"DisplayName\": \"OtherAlarms\",\n        \"Id\": \"i=2255\",\n        \"EventFilter\": {\n          \"TypeDefinitionId\": \"i=2044\"\n        },\n        \"ConditionHandling\": {\n          \"UpdateInterval\": 10,\n          \"SnapshotInterval\": 20\n        }\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/publishednodes.json",
    "content": "[\n    {\n        \"EndpointUrl\": \"opc.tcp://server1:49580\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=Node-Server1\",\n                \"DisplayName\": \"Node-Server1\"\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://server2:49580\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=Node-Server2\",\n                \"DisplayName\": \"Node-Server2\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/publishednodes_with_duplicates.json",
    "content": "[\n    {\n        \"EndpointUrl\": \"opc.tcp://10.0.0.1:59412\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"user\",\n        \"OpcAuthenticationPassword\": \"passwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=Variable1.Line1.Power\",\n                \"DisplayName\": \"Variable1_Power\",\n                \"OpcSamplingInterval\": 60000,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 3343,\n                \"SkipFirst\": false\n            },\n            {\n                \"Id\": \"ns=2;s=Variable1.Line1.Speed\",\n                \"DisplayName\": \"Variable1_Line1_Speed\",\n                \"OpcSamplingInterval\": 900000,\n                \"OpcPublishingInterval\": 900000,\n                \"HeartbeatInterval\": 3465,\n                \"SkipFirst\": false\n            },\n            {\n                \"Id\": \"ns=2;s=Variable1.Line1.Power\",\n                \"DisplayName\": \"Variable1_Line1_Power\",\n                \"OpcSamplingInterval\": 60000,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 3343,\n                \"SkipFirst\": false\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Publisher/publishednodeswithoptionalfields.json",
    "content": "[\n    {\n        \"EndpointUrl\": \"opc.tcp://server1:49580\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=Node-Server1\",\n                \"DisplayName\": \"Node-Server1\",\n                \"OpcSamplingInterval\": 2000,\n                \"OpcPublishingInterval\": 2000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://server2:49580\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=Node-Server2\",\n                \"DisplayName\": \"Node-Server2\",\n                \"OpcSamplingInterval\": 2000,\n                \"OpcPublishingInterval\": 2000\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Runtime/TopicBuilderTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Runtime\n{\n    using FluentAssertions;\n    using Microsoft.Extensions.Configuration;\n    using System.Collections.Generic;\n    using Xunit;\n\n    public class TopicBuilderTests\n    {\n        [Fact]\n        public void TestRootTopicBuilding()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            new TopicBuilder(options.Value).RootTopic.Should().Be(options.Value.PublisherId);\n        }\n\n        [Fact]\n        public void TestMethodTopicBuilding1()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            new TopicBuilder(options.Value).MethodTopic.Should().Be($\"{options.Value.PublisherId}/methods\");\n        }\n\n        [Fact]\n        public void TestMethodTopicBuilding2()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.Method = null;\n            new TopicBuilder(options.Value).MethodTopic.Should().BeEmpty();\n        }\n\n        [Fact]\n        public void TestMethodTopicBuilding3()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.Method = null;\n            new TopicBuilder(options.Value, null, new TopicTemplatesOptions\n            {\n                Method = \"{RootTopic}/methods\"\n            }).MethodTopic.Should().Be($\"{options.Value.PublisherId}/methods\");\n        }\n\n        [Fact]\n        public void TestEventsTopicBuilding1()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            new TopicBuilder(options.Value).EventsTopic.Should().Be($\"{options.Value.PublisherId}/EventSource/EventName\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuildingWithDefault()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            new TopicBuilder(options.Value, variables: new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).TelemetryTopic.Should().Be($\"{options.Value.PublisherId}/messages/Bar\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding1()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.Telemetry = \"{RootTopic}/{WriterGroup}/{DataSetWriter}\";\n            new TopicBuilder(options.Value, variables: new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).TelemetryTopic.Should().Be($\"{options.Value.PublisherId}/Bar/Foo\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding2()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.Telemetry = \"{RootTopic}/{Unknown}/{DataSetWriter}\";\n            new TopicBuilder(options.Value, variables: new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).TelemetryTopic.Should().Be($\"{options.Value.PublisherId}/Unknown/Foo\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding3()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.Telemetry = \"{RootTopic}/{TelemetryTopic}/{DataSetWriter}\";\n            new TopicBuilder(options.Value, variables: new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).TelemetryTopic.Should().Be($\"{options.Value.PublisherId}/TelemetryTopic/Foo\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding4()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.Root = \"{PublisherId}\";\n            options.Value.TopicTemplates.Telemetry = \"{PublisherId}/{RootTopic}\";\n            new TopicBuilder(options.Value).TelemetryTopic.Should().Be($\"{options.Value.PublisherId}/PublisherId\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding5()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.Root = \"{TelemetryTopic}\";\n            options.Value.TopicTemplates.Telemetry = \"{RootTopic}\";\n            new TopicBuilder(options.Value).TelemetryTopic.Should().Be(\"TelemetryTopic\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding6()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.TopicTemplates.Telemetry = \"{TelemetryTopic}\";\n            new TopicBuilder(options.Value).TelemetryTopic.Should().Be(\"TelemetryTopic\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding7()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.Telemetry =\n                \"{RootTopic}/writer/{DataSetWriter}/group/{WriterGroup}/messages\";\n            new TopicBuilder(options.Value, variables: new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).TelemetryTopic.Should().Be($\"{options.Value.PublisherId}/writer/Foo/group/Bar/messages\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding8()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            new TopicBuilder(options.Value, null, new TopicTemplatesOptions\n            {\n                Telemetry = \"{RootTopic}/writer/{DataSetWriter}/group/{WriterGroup}/messages\"\n            }, new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).TelemetryTopic.Should().Be($\"{options.Value.PublisherId}/writer/Foo/group/Bar/messages\");\n        }\n\n        [Fact]\n        public void TestTelemetryTopicBuilding9()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n#pragma warning disable CA1308 // Normalize strings to uppercase\n            options.Value.TopicTemplates.Telemetry =\n                \"{RootTopic}/writer/{DataSetWriter}/group/{WriterGroup}/messages\".ToLowerInvariant();\n#pragma warning restore CA1308 // Normalize strings to uppercase\n            new TopicBuilder(options.Value, variables: new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).TelemetryTopic.Should().Be($\"{options.Value.PublisherId}/writer/Foo/group/Bar/messages\");\n        }\n\n        [Fact]\n        public void TestMetadataTopicBuildingWithDefaultIsNull()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            new TopicBuilder(options.Value, variables: new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).DataSetMetaDataTopic.Should().BeEmpty();\n        }\n\n        [Fact]\n        public void TestMetadataTopicBuilding1()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.DataSetMetaData = \"{TelemetryTopic}/metadata\";\n            new TopicBuilder(options.Value, variables: new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).DataSetMetaDataTopic.Should().Be($\"{options.Value.PublisherId}/messages/Bar/metadata\");\n        }\n\n        [Fact]\n        public void TestMetadataTopicBuilding2()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.PublisherId = \"MyPublisher\";\n            options.Value.TopicTemplates.DataSetMetaData = \"{TelemetryTopic}/$someothername\";\n            new TopicBuilder(options.Value, null, new TopicTemplatesOptions\n            {\n                DataSetMetaData = \"{TelemetryTopic}/metadata\"\n            }, new Dictionary<string, string>\n            {\n                [\"DataSetWriter\"] = \"Foo\",\n                [\"WriterGroup\"] = \"Bar\"\n            }).DataSetMetaDataTopic.Should().Be($\"{options.Value.PublisherId}/messages/Bar/metadata\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Alarms/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Alarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests : IClassFixture<AlarmsServer>\n    {\n        public NodeServicesTests(AlarmsServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private AlarmServerTests<ConnectionModel> GetTests()\n        {\n            return new AlarmServerTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly ITestOutputHelper _output;\n        private readonly AlarmsServer _server;\n\n        [Fact]\n        public Task BrowseAreaPathTestAsync()\n        {\n            return GetTests().BrowseAreaPathTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseMetalsSouthMotorTestAsync()\n        {\n            return GetTests().BrowseMetalsSouthMotorTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseColoursEastTankTestAsync()\n        {\n            return GetTests().BrowseColoursEastTankTestAsync();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest1Async()\n        {\n            return GetTests().CompileAlarmQueryTest1Async();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest2Async()\n        {\n            return GetTests().CompileAlarmQueryTest2Async();\n        }\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleTripAlarmQueryTestAsync()\n        {\n            return GetTests().CompileSimpleTripAlarmQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Asset/ConfigurationTest1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Asset\n{\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection1.Name)]\n    public class ConfigurationTest1\n    {\n        public ConfigurationTest1(AssetServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private AssetTests1 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests1(c => new ConfigurationServices(c, _server.Client,\n                new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                _output.BuildLoggerFor<ConfigurationServices>(Logging.Level)),\n                _server.GetConnection());\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task ConfigureAndDeleteAssetsAsync()\n        {\n            return GetTests().ConfigureAndDeleteAssetsAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Asset/ConfigurationTest2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Asset\n{\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection2.Name)]\n    public class ConfigurationTest2\n    {\n        public ConfigurationTest2(AssetServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private AssetTests2 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests2(c => new ConfigurationServices(c, _server.Client,\n                new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                _output.BuildLoggerFor<ConfigurationServices>(Logging.Level)),\n                _server.GetConnection());\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task ConfigureAsset1Async()\n        {\n            return GetTests().ConfigureAsset1Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset2Async()\n        {\n            return GetTests().ConfigureAsset2Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset3Async()\n        {\n            return GetTests().ConfigureAsset3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Asset/ConfigurationTest3.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Asset\n{\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection3.Name)]\n    public class ConfigurationTest3\n    {\n        public ConfigurationTest3(AssetServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private AssetTests3 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests3(c => new ConfigurationServices(c, _server.Client,\n                new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                _output.BuildLoggerFor<ConfigurationServices>(Logging.Level)),\n                _server.GetConnection());\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task ConfigureAsset1Async()\n        {\n            return GetTests().ConfigureAsset1Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset2Async()\n        {\n            return GetTests().ConfigureAsset2Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset3Async()\n        {\n            return GetTests().ConfigureAsset3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Asset/ConfigurationTest4.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Asset\n{\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection4.Name)]\n    public class ConfigurationTest4\n    {\n        public ConfigurationTest4(AssetServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private AssetTests4 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests4(c => new ConfigurationServices(c, _server.Client,\n                new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                _output.BuildLoggerFor<ConfigurationServices>(Logging.Level)),\n                _server.GetConnection());\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task ConfigureDuplicateAssetFailsAsync()\n        {\n            return GetTests().ConfigureDuplicateAssetFailsAsync();\n        }\n\n        [Fact]\n        public Task ConfigureAssetFails1Async()\n        {\n            return GetTests().ConfigureAssetFails1Async();\n        }\n\n        [Fact]\n        public Task ConfigureWithBadStreamFails1Async()\n        {\n            return GetTests().ConfigureWithBadStreamFails1Async();\n        }\n\n        [Fact]\n        public Task ConfigureWithBadStreamFails2Async()\n        {\n            return GetTests().ConfigureWithBadStreamFails2Async();\n        }\n\n        [Fact]\n        public Task ConfigureWithBadStreamFails3Async()\n        {\n            return GetTests().ConfigureWithBadStreamFails3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Asset/WriteCollection1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Asset\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection1 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite1\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Asset/WriteCollection2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Asset\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection2 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite2\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Asset/WriteCollection3.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Asset\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection3 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite3\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Asset/WriteCollection4.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Asset\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection4 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite4\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/AssetDeviceIntegrationTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.Iot.Operations.Services.AssetAndDeviceRegistry.Models;\n    using Furly.Azure.IoT.Operations.Services;\n    using Furly.Extensions.Serializers;\n    using AssetModel = Iot.Operations.Services.AssetAndDeviceRegistry.Models.Asset;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Moq;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Autofac.Util;\n\n    public class AssetDeviceIntegrationTests\n    {\n        public AssetDeviceIntegrationTests()\n        {\n            // Initialize mocks\n            _srMock.Setup(x => x.Register(It.IsAny<IAioSrCallbacks>())).Returns(new Disposable());\n            _optionsMock.SetupGet(o => o.Value).Returns(new PublisherOptions\n            {\n                PublisherId = \"aio\"\n            });\n        }\n\n        [Fact]\n        public void ConstructorInitializesFields()\n        {\n            // Arrange/Act\n            var sut = CreateSut();\n            // Assert\n            Assert.NotNull(sut);\n        }\n\n        [Fact]\n        public async Task DisposeAsyncCanBeCalledMultipleTimes()\n        {\n            // Arrange\n            var sut = CreateSut();\n            // Act\n            await sut.DisposeAsync();\n            // Should not throw\n            await sut.DisposeAsync();\n        }\n\n        [Fact]\n        public void DisposeCallsDisposeAsyncMethod()\n        {\n            // Arrange\n            var sut = CreateSut();\n            // Act/Assert\n            sut.Dispose();\n            // Should not throw\n            sut.Dispose();\n        }\n\n        [Fact]\n        public void OnDeviceCreatedAddsDeviceAndWritesToChangeFeed()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device();\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n\n            // Act\n            sut.OnDeviceCreated(deviceName, endpointName, device);\n            // Assert: device should be in the internal dictionary\n            Assert.Single(sut.Devices, d => d.DeviceName == deviceName);\n        }\n\n        [Fact]\n        public void OnDeviceCreatedThrowsIfChangeFeedWasCompleted()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device();\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            TryCompleteChannel(sut);\n\n            // Act / Assert\n            Assert.Throws<ObjectDisposedException>(\n                () => sut.OnDeviceCreated(deviceName, endpointName, device));\n        }\n\n        [Fact]\n        public void OnDeviceUpdatedUpdatesDeviceAndWritesToChangeFeed()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device();\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            // Act\n            sut.OnDeviceUpdated(deviceName, endpointName, device);\n            // Assert: device should be in the internal dictionary\n            Assert.Single(sut.Devices, d => d.DeviceName == deviceName);\n        }\n\n        [Fact]\n        public void OnDeviceUpdatedThrowsIfChangeFeedWasCompleted()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device();\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            TryCompleteChannel(sut);\n\n            // Act / Assert\n            Assert.Throws<ObjectDisposedException>(\n                () => sut.OnDeviceUpdated(deviceName, endpointName, device));\n        }\n\n        [Fact]\n        public void OnDeviceDeletedRemovesDeviceAndWritesToChangeFeed()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device();\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            // Add device first\n            sut.OnDeviceCreated(deviceName, endpointName, device);\n            // Act\n            sut.OnDeviceDeleted(deviceName, endpointName);\n            // Assert: device should be removed from the internal dictionary\n            Assert.DoesNotContain(sut.Devices, d => d.DeviceName == deviceName);\n        }\n\n        [Fact]\n        public void OnDeviceDeletedThrowsIfChangeFeedWasCompleted()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device();\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            // Add device first\n            sut.OnDeviceCreated(deviceName, endpointName, device);\n            TryCompleteChannel(sut);\n\n            // Act / Assert\n            Assert.Throws<ObjectDisposedException>(\n                () => sut.OnDeviceDeleted(deviceName, endpointName));\n        }\n\n        [Fact]\n        public void OnAssetCreatedAddsAssetAndWritesToChangeFeed()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var asset = new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                }\n            };\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            const string assetName = \"asset1\";\n\n            // Act\n            sut.OnDeviceCreated(deviceName, endpointName, new Device());\n            sut.OnAssetCreated(deviceName, endpointName, assetName, asset);\n            // Assert: asset should be in the internal dictionary\n            Assert.Single(sut.Assets, a => a.AssetName == assetName);\n        }\n\n        [Fact]\n        public void OnAssetCreatedThrowsIfChangeFeedWasCompleted()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var asset = new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                }\n            };\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            const string assetName = \"asset1\";\n            TryCompleteChannel(sut);\n\n            // Act / Assert\n            Assert.Throws<ObjectDisposedException>(\n                () => sut.OnAssetCreated(deviceName, endpointName, assetName, asset));\n        }\n\n        [Fact]\n        public void OnAssetUpdatedUpdatesAssetAndWritesToChangeFeed()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var asset = new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                }\n            };\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            const string assetName = \"asset1\";\n            // Act\n            sut.OnAssetUpdated(deviceName, endpointName, assetName, asset);\n            // Assert: asset should be in the internal dictionary\n            Assert.Single(sut.Assets, a => a.AssetName == assetName);\n        }\n\n        [Fact]\n        public void OnAssetUpdatedThrowsIfChangeFeedWasCompleted()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var asset = new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                }\n            };\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            const string assetName = \"asset1\";\n            TryCompleteChannel(sut);\n\n            // Act / Assert\n            Assert.Throws<ObjectDisposedException>(\n                () => sut.OnAssetUpdated(deviceName, endpointName, assetName, asset));\n        }\n\n        [Fact]\n        public void OnAssetDeletedRemovesAssetAndWritesToChangeFeed()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var asset = new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                }\n            };\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            const string assetName = \"asset1\";\n            // Add asset first\n            sut.OnDeviceCreated(deviceName, endpointName, new Device());\n            sut.OnAssetCreated(deviceName, endpointName, assetName, asset);\n            // Act\n            sut.OnAssetDeleted(deviceName, endpointName, assetName);\n            // Assert: asset should be removed from the internal dictionary\n            Assert.DoesNotContain(sut.Assets, a => a.AssetName == assetName);\n        }\n\n        [Fact]\n        public void OnAssetDeletedThrowsIfChangeFeedWasCompleted()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var asset = new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                }\n            };\n            const string deviceName = \"dev1\";\n            const string endpointName = \"ep1\";\n            const string assetName = \"asset1\";\n            // Add asset first\n            sut.OnDeviceCreated(deviceName, endpointName, new Device());\n            sut.OnAssetCreated(deviceName, endpointName, assetName, asset);\n            TryCompleteChannel(sut);\n            // Act / Assert\n            Assert.Throws<ObjectDisposedException>(\n                () => sut.OnAssetDeleted(deviceName, endpointName, assetName));\n        }\n\n        [Fact]\n        public async Task RunAsyncProcessesChangeFeedWithoutException()\n        {\n            // Arrange\n            var sut = CreateSut();\n            using var cts = new System.Threading.CancellationTokenSource(100); // Cancel after 100ms\n            // Act/Assert\n            await sut.RunAsync(cts.Token); // Should not throw\n        }\n\n        [Fact]\n        public async Task RunDiscoveryUsingTypesAsyncReportsDiscoveredAssets()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device\n            {\n                Endpoints = new DeviceEndpoints\n                {\n                    Inbound = new Dictionary<string, InboundEndpointSchemaMapValue>\n                    {\n                        { \"ep1\",\n                            new InboundEndpointSchemaMapValue\n                            {\n                                Address = \"opc.tcp://localhost:4840\"\n                            }\n                        }\n                    }\n                }\n            };\n            var resource = new AssetDeviceIntegration.DeviceEndpointResource(\n                \"dev1\", device, \"ep1\");\n            var types = new List<string> { \"ns=2;s=Type1\" };\n            var errors = new AssetDeviceIntegration.ValidationErrors(sut);\n\n            var publishedNodesEntry = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://endpoint\",\n                DataSetWriterGroup = \"AssetGroup\",\n                WriterGroupRootNodeId = \"rootId\",\n                WriterGroupType = \"typeRef\",\n                OpcNodes = new List<OpcNodeModel>\n                {\n                    new OpcNodeModel\n                    {\n                        Id = \"ns=2;s=Type1\",\n                        DisplayName = \"Node1\"\n                    }\n                }\n            };\n            var serviceResponseMock = new ServiceResponse<PublishedNodesEntryModel>\n            {\n                ErrorInfo = null,\n                Result = publishedNodesEntry\n            };\n\n            _configurationServicesMock\n                .Setup(s => s.ExpandAsync(\n                    It.IsAny<PublishedNodesEntryModel>(),\n                    It.IsAny<PublishedNodeExpansionModel>(),\n                    default))\n                .Returns(AsyncEnumerable.Range(0, 1).Select(_ => serviceResponseMock));\n#pragma warning disable CA2012 // Use ValueTasks correctly\n            _clientMock.Setup(c => c.ReportDiscoveredAssetAsync(\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<DiscoveredAsset>(), null, default))\n                .Returns(ValueTask.FromResult<DiscoveredAssetResponseSchema>(null))\n                .Verifiable();\n#pragma warning restore CA2012 // Use ValueTasks correctly\n\n            // Act\n            await sut.RunDiscoveryUsingTypesAsync(resource, new DeviceEndpointConfiguration { AssetTypes = types },\n                errors, default);\n\n            // Assert\n            _clientMock\n                .Verify(c => c.ReportDiscoveredAssetAsync(\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<DiscoveredAsset>(), null, default), Times.AtLeastOnce());\n        }\n\n        [Fact]\n        public async Task RunDiscoveryUsingTypesAsyncReportsNothingIfNothingIsFound()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device\n            {\n                Endpoints = new DeviceEndpoints\n                {\n                    Inbound = new Dictionary<string, InboundEndpointSchemaMapValue>\n                    {\n                        { \"ep1\",\n                            new InboundEndpointSchemaMapValue\n                            {\n                                Address = \"opc.tcp://localhost:4840\"\n                            }\n                        }\n                    }\n                }\n            };\n            var resource = new AssetDeviceIntegration.DeviceEndpointResource(\n                \"dev1\", device, \"ep1\");\n            var types = new List<string> { \"ns=2;s=Type1\" };\n            var errors = new AssetDeviceIntegration.ValidationErrors(sut);\n\n            var publishedNodesEntry = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://endpoint\",\n                DataSetWriterGroup = \"AssetGroup\",\n                WriterGroupRootNodeId = \"rootId\",\n                WriterGroupType = \"typeRef\",\n                OpcNodes = new List<OpcNodeModel>()\n            };\n            var serviceResponseMock = new ServiceResponse<PublishedNodesEntryModel>\n            {\n                ErrorInfo = null,\n                Result = publishedNodesEntry\n            };\n\n            _configurationServicesMock\n                .Setup(s => s.ExpandAsync(\n                    It.IsAny<PublishedNodesEntryModel>(),\n                    It.IsAny<PublishedNodeExpansionModel>(),\n                    default))\n                .Returns(AsyncEnumerable.Range(0, 1).Select(_ => serviceResponseMock));\n#pragma warning disable CA2012 // Use ValueTasks correctly\n            _clientMock.Setup(c => c.ReportDiscoveredAssetAsync(\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<DiscoveredAsset>(), null, default))\n                .Returns(ValueTask.FromResult<DiscoveredAssetResponseSchema>(null))\n                .Verifiable();\n#pragma warning restore CA2012 // Use ValueTasks correctly\n\n            // Act\n            await sut.RunDiscoveryUsingTypesAsync(resource, new DeviceEndpointConfiguration { AssetTypes = types },\n                errors, default);\n\n            // Assert\n            _clientMock\n                .Verify(c => c.ReportDiscoveredAssetAsync(\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<DiscoveredAsset>(), null, default), Times.Never);\n        }\n\n        [Fact]\n        public async Task RunDiscoveryUsingTypesAsyncEndpointNotFoundReportsError()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new Device();\n            var resource = new AssetDeviceIntegration.DeviceEndpointResource(\"dev1\", device, \"ep1\");\n            var types = new List<string> { \"ns=2;s=Type1\" };\n            var errors = new AssetDeviceIntegration.ValidationErrors(sut);\n\n            // Act\n            await sut.RunDiscoveryUsingTypesAsync(resource, new DeviceEndpointConfiguration { AssetTypes = types },\n                errors, default);\n            // Assert: error should be recorded (no exception thrown)\n        }\n\n        [Fact]\n        public async Task ToPublishedNodesAsyncWithDatasetsAndEventsReturnsEntries()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var d = new Device\n            {\n                Endpoints = new DeviceEndpoints\n                {\n                    Inbound = new Dictionary<string, InboundEndpointSchemaMapValue>\n                    {\n                        { \"ep1\",\n                            new InboundEndpointSchemaMapValue\n                            {\n                                Address = \"opc.tcp://localhost:4840\"\n                            }\n                        }\n                    }\n                }\n            };\n            var device = new AssetDeviceIntegration.DeviceResource(\"dev1\", d);\n            sut.OnDeviceCreated(\"dev1\", \"ep1\", d);\n            var dataset = new AssetDataset\n            {\n                Name = \"ds1\",\n                DataPoints = new List<AssetDatasetDataPointSchemaElement>\n                {\n                    new AssetDatasetDataPointSchemaElement { Name = \"dp1\", DataSource = \"ns=2;s=dp1\" }\n                }\n            };\n            var @event = new AssetEvent { Name = \"ev1\", DataSource = \"ns=2;s=ev1\" };\n            var eg = new AssetEventGroup { Name = \"eg1\", Events = new List<AssetEvent> { @event } };\n            var asset = new AssetDeviceIntegration.AssetResource(\"asset1\", new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef { DeviceName = \"dev1\", EndpointName = \"ep1\" },\n                Datasets = new List<AssetDataset> { dataset },\n                EventGroups = new List<AssetEventGroup> { eg }\n            });\n            var errors = new AssetDeviceIntegration.ValidationErrors(sut);\n            _serializerMock\n                .Setup(s => s.Deserialize(It.IsAny<ReadOnlySequence<byte>>(), It.IsAny<Type>()))\n                .Returns((object)null);\n\n            // Act\n            var result = await sut.ToPublishedNodesAsync(\n                new[] { device }, new[] { asset }, errors, default);\n\n            // Assert\n            Assert.NotNull(result);\n        }\n\n        [Fact]\n        public async Task ToPublishedNodesAsyncDeviceNotFoundReportsError()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var asset = new AssetDeviceIntegration.AssetResource(\"asset1\", new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef { DeviceName = \"devX\", EndpointName = \"epX\" }\n            });\n            var errors = new AssetDeviceIntegration.ValidationErrors(sut);\n\n            // Act\n            var result = await sut.ToPublishedNodesAsync(\n                Array.Empty<AssetDeviceIntegration.DeviceResource>(), new[] { asset }, errors, default);\n\n            // Assert\n            Assert.NotNull(result);\n        }\n\n        [Fact]\n        public async Task ToPublishedNodesAsyncReturnsExpectedEntries()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var device = new AssetDeviceIntegration.DeviceResource(\"dev1\", new Device\n            {\n                Endpoints = new DeviceEndpoints\n                {\n                    Inbound = new Dictionary<string, InboundEndpointSchemaMapValue>\n                    {\n                        { \"ep1\",\n                            new InboundEndpointSchemaMapValue\n                            {\n                                Address = \"opc.tcp://localhost:4840\"\n                            }\n                        }\n                    }\n                }\n            });\n            var asset = new AssetDeviceIntegration.AssetResource(\"asset1\", new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                },\n                Datasets = null,\n                EventGroups = null\n            });\n            var errors = new AssetDeviceIntegration.ValidationErrors(sut);\n\n            // Act\n            var result = await sut.ToPublishedNodesAsync(\n                new[] { device }, new[] { asset }, errors, default);\n\n            // Assert\n            Assert.NotNull(result);\n            // Should be empty because no datasets/events, but no error thrown\n        }\n\n        [Fact]\n        public void CollectAssetAndDevicePropertiesReturnsExpectedDictionary()\n        {\n            // Arrange\n            var device = new AssetDeviceIntegration.DeviceResource(\"dev1\", new Device\n            {\n                Model = \"X\",\n                Manufacturer = \"Y\"\n            });\n            var asset = new AssetDeviceIntegration.AssetResource(\"asset1\", new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                },\n                Model = null,\n                Manufacturer = \"B\"\n            });\n\n            // Act\n            var result = AssetDeviceIntegration.CollectAssetAndDeviceProperties(\n                asset, device);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.Equal(\"X\", result[nameof(Device.Model)]);\n            Assert.Equal(\"B\", result[nameof(AssetModel.Manufacturer)]);\n        }\n\n        [Fact]\n        public async Task ValidationErrorsReportAsyncReportsDeviceAndAssetStatus()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var errors = new AssetDeviceIntegration.ValidationErrors(sut);\n            var device = new AssetDeviceIntegration.DeviceEndpointResource(\"dev1\", new Device(), \"ep1\");\n            var asset = new AssetDeviceIntegration.AssetResource(\"asset1\", new AssetModel\n            {\n                DeviceRef = new AssetDeviceRef\n                {\n                    DeviceName = \"dev1\",\n                    EndpointName = \"ep1\"\n                }\n            });\n            errors.OnError(device, \"code1\", \"error1\");\n            errors.OnError(asset, \"code2\", \"error2\");\n#pragma warning disable CA2012 // Use ValueTasks correctly\n            _clientMock\n                .Setup(c => c.UpdateDeviceStatusAsync(\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<DeviceStatus>(),\n                    It.IsAny<TimeSpan?>(),\n                    It.IsAny<CancellationToken>()))\n                .Returns(ValueTask.FromResult<DeviceStatus>(null))\n                .Verifiable();\n#pragma warning restore CA2012 // Use ValueTasks correctly\n#pragma warning disable CA2012 // Use ValueTasks correctly\n            _clientMock\n                .Setup(c => c.UpdateAssetStatusAsync(\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<AssetStatus>(),\n                    It.IsAny<TimeSpan?>(),\n                    It.IsAny<CancellationToken>()))\n                .Returns(ValueTask.FromResult<AssetStatus>(null))\n                .Verifiable();\n#pragma warning restore CA2012 // Use ValueTasks correctly\n\n            // Act\n            await errors.ReportAsync(default);\n\n            // Assert\n            _clientMock\n                .Verify(c => c.UpdateDeviceStatusAsync(\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<DeviceStatus>(),\n                    It.IsAny<TimeSpan?>(),\n                    It.IsAny<System.Threading.CancellationToken>()), Times.AtLeastOnce());\n            _clientMock\n                .Verify(c => c.UpdateAssetStatusAsync(\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<string>(),\n                    It.IsAny<AssetStatus>(),\n                    It.IsAny<TimeSpan?>(),\n                    It.IsAny<System.Threading.CancellationToken>()), Times.AtLeastOnce());\n        }\n\n        [Fact]\n        public void ValidationErrorsOnErrorAddsError()\n        {\n            // Arrange\n            var sut = CreateSut();\n            var errors = new AssetDeviceIntegration.ValidationErrors(sut);\n            var device = new AssetDeviceIntegration.DeviceEndpointResource(\"dev1\", new Device(), \"ep1\");\n\n            // Act\n            errors.OnError(device, \"code1\", \"error1\");\n            // No assert, just ensure no exception and internal state updated\n        }\n\n        private static void TryCompleteChannel(AssetDeviceIntegration sut)\n        {\n            // Simulate full channel by completing writer\n            var field = typeof(AssetDeviceIntegration).GetField(\"_changeFeed\",\n                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);\n            var channel =\n                (System.Threading.Channels.Channel<(string, AssetDeviceIntegration.Resource)>)\n                    field.GetValue(sut);\n            channel.Writer.TryComplete();\n        }\n\n        private AssetDeviceIntegration CreateSut()\n        {\n            return new(_clientMock.Object, _srMock.Object, _publishedNodesMock.Object, _configurationServicesMock.Object,\n                _connectionsMock.Object, _discoveryMock.Object, _serializerMock.Object,\n                _optionsMock.Object, _loggerMock.Object);\n        }\n\n        private readonly Mock<IOptions<PublisherOptions>> _optionsMock = new();\n        private readonly Mock<IDiscoveryServices> _discoveryMock = new();\n        private readonly Mock<IConnectionServices<ConnectionModel>> _connectionsMock = new();\n        private readonly Mock<IAioAdrClient> _clientMock = new();\n        private readonly Mock<IAioSrClient> _srMock = new();\n        private readonly Mock<IPublishedNodesServices> _publishedNodesMock = new();\n        private readonly Mock<IJsonSerializer> _serializerMock = new();\n        private readonly Mock<IConfigurationServices> _configurationServicesMock = new();\n        private readonly Mock<ILogger<AssetDeviceIntegration>> _loggerMock = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/DeterministicAlarms/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.DeterministicAlarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests1 : IClassFixture<DeterministicAlarmsServer1>\n    {\n        public NodeServicesTests1(DeterministicAlarmsServer1 server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private DeterministicAlarmsTests1<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests1<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly ITestOutputHelper _output;\n        private readonly DeterministicAlarmsServer1 _server;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1TemperatureHighTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1TemperatureHighTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2LightOffTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2LightOffTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2DoorOpenTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/DeterministicAlarms/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.DeterministicAlarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests2 : IClassFixture<DeterministicAlarmsServer2>\n    {\n        public NodeServicesTests2(DeterministicAlarmsServer2 server, ITestOutputHelper output)\n        {\n            _output = output;\n            _server = server;\n        }\n\n        private DeterministicAlarmsTests2<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests2<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly ITestOutputHelper _output;\n        private readonly DeterministicAlarmsServer2 _server;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Encoder/MonitoredItemMessageEncoderJsonGzipTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Moq;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Linq;\n    using Xunit;\n\n    public class MonitoredItemMessageEncoderJsonGzipTests\n    {\n        /// <summary>\n        /// Create compliant encoder\n        /// </summary>\n        /// <returns></returns>\n        private static NetworkMessageEncoder GetEncoder()\n        {\n            var loggerMock = new Mock<ILogger<NetworkMessageEncoder>>();\n            var metricsMock = new Mock<IMetricsContext>();\n            metricsMock.SetupGet(m => m.TagList).Returns(new TagList());\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            return new NetworkMessageEncoder(options, metricsMock.Object, loggerMock.Object);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyMessagesTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new List<OpcUaSubscriptionNotification>();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyDataSetMessageModelTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new[] { new OpcUaSubscriptionNotification(DateTimeOffset.UtcNow) };\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeTooBigMessageTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(3, false,\n                encoding: MessageEncoding.JsonGzip, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(6, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeDataTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false,\n                encoding: MessageEncoding.JsonGzip, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            if (encodeBatchFlag)\n            {\n                Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(20, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(1, encoder.MessagesProcessedCount);\n                Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n            }\n            else\n            {\n                Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(20, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(210, encoder.MessagesProcessedCount);\n                Assert.Equal(0.10, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n            }\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeDataWithMultipleNotificationsTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false,\n                encoding: MessageEncoding.JsonGzip, isSampleMode: true);\n            messages =\n            [\n                new (messages[0], messages.SelectMany(n => n.Notifications).ToList())\n            ];\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            if (encodeBatchFlag)\n            {\n                Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(1, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(1, encoder.MessagesProcessedCount);\n                Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n            }\n            else\n            {\n                Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(1, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(210, encoder.MessagesProcessedCount);\n                Assert.Equal(0.005, Math.Round(encoder.AvgNotificationsPerMessage, 3));\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeChunkTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 8 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(50, false,\n                MessageEncoding.JsonGzip, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            var count = networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count);\n            Assert.All(networkMessages, m => Assert.All(((NetworkMessage)m.Event).Buffers,\n                m => Assert.True(m.Length <= maxMessageSize, m.Length.ToString(CultureInfo.InvariantCulture))));\n            if (encodeBatchFlag)\n            {\n                Assert.InRange(count, 2, 3);\n                Assert.Equal(50, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal((uint)count, encoder.MessagesProcessedCount);\n                Assert.Equal(25, Math.Round(encoder.AvgNotificationsPerMessage));\n            }\n            else\n            {\n                Assert.InRange(count, 1270, 1280);\n                Assert.Equal(50, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal((uint)count, encoder.MessagesProcessedCount);\n                Assert.Equal(0.04, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n            }\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeEventTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, true,\n                encoding: MessageEncoding.JsonGzip, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(1u, encoder.NotificationsProcessedCount);\n            Assert.Equal(0u, encoder.NotificationsDroppedCount);\n            Assert.Equal(1u, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeEventsTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true,\n                encoding: MessageEncoding.JsonGzip, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            if (encodeBatchFlag)\n            {\n                Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(20, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(1, encoder.MessagesProcessedCount);\n                Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n            }\n            else\n            {\n                Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(20, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(210, encoder.MessagesProcessedCount);\n                Assert.Equal(0.10, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Encoder/MonitoredItemMessageEncoderJsonTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Moq;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Linq;\n    using Xunit;\n\n    public class MonitoredItemMessageEncoderJsonTests\n    {\n        /// <summary>\n        /// Create compliant encoder\n        /// </summary>\n        /// <returns></returns>\n        private static NetworkMessageEncoder GetEncoder()\n        {\n            var loggerMock = new Mock<ILogger<NetworkMessageEncoder>>();\n            var metricsMock = new Mock<IMetricsContext>();\n            metricsMock.SetupGet(m => m.TagList).Returns(new TagList());\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            return new NetworkMessageEncoder(options, metricsMock.Object, loggerMock.Object);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyMessagesTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new List<OpcUaSubscriptionNotification>();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyDataSetMessageModelTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new[] { new OpcUaSubscriptionNotification(DateTimeOffset.UtcNow) };\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeTooBigMessageTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(3, false, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(6, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeAsUadpNotSupportedTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(3, false,\n                encoding: MessageEncoding.Uadp, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(6, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeDataTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            if (encodeBatchFlag)\n            {\n                Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(20, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(1, encoder.MessagesProcessedCount);\n                Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n            }\n            else\n            {\n                Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(20, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(210, encoder.MessagesProcessedCount);\n                Assert.Equal(0.10, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n            }\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeDataWithMultipleNotificationsTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, isSampleMode: true);\n            messages =\n            [\n                new (messages[0], messages.SelectMany(n => n.Notifications).ToList())\n            ];\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            if (encodeBatchFlag)\n            {\n                Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(1, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(1, encoder.MessagesProcessedCount);\n                Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n            }\n            else\n            {\n                Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(1, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(210, encoder.MessagesProcessedCount);\n                Assert.Equal(0.005, Math.Round(encoder.AvgNotificationsPerMessage, 3));\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeChunkTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 8 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(50, false, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            var count = networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count);\n            Assert.All(networkMessages, m => Assert.All(((NetworkMessage)m.Event).Buffers,\n                m => Assert.True(m.Length <= maxMessageSize, m.Length.ToString(CultureInfo.InvariantCulture))));\n            if (encodeBatchFlag)\n            {\n                Assert.InRange(count, 31, 33);\n                Assert.Equal(50, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal((uint)count, encoder.MessagesProcessedCount);\n                Assert.Equal(1.56, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n            }\n            else\n            {\n                Assert.InRange(count, 1270, 1280);\n                Assert.Equal(50, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal((uint)count, encoder.MessagesProcessedCount);\n                Assert.Equal(0.04, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n            }\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeEventTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, true, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(1u, encoder.NotificationsProcessedCount);\n            Assert.Equal(0u, encoder.NotificationsDroppedCount);\n            Assert.Equal(1u, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeEventsTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true, isSampleMode: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            if (encodeBatchFlag)\n            {\n                Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(20, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(1, encoder.MessagesProcessedCount);\n                Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n            }\n            else\n            {\n                Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n                Assert.Equal(20, encoder.NotificationsProcessedCount);\n                Assert.Equal(0, encoder.NotificationsDroppedCount);\n                Assert.Equal(210, encoder.MessagesProcessedCount);\n                Assert.Equal(0.10, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Encoder/NetworkMessage.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using Furly.Extensions.Logging;\n    using Furly.Extensions.Messaging;\n    using Moq;\n    using Opc.Ua;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    public sealed class NetworkMessage : IEvent\n    {\n        public CloudEventHeader CloudEvent { get; private set; }\n\n        public IEvent AsCloudEvent(CloudEventHeader header)\n        {\n            CloudEvent = header;\n            return this;\n        }\n\n        public DateTimeOffset Timestamp { get; private set; }\n\n        public IEvent SetTimestamp(DateTimeOffset value)\n        {\n            Timestamp = value;\n            return this;\n        }\n\n        public QoS QoS { get; private set; }\n\n        public IEvent SetQoS(QoS value)\n        {\n            QoS = value;\n            return this;\n        }\n\n        public string ContentType { get; private set; }\n\n        public IEvent SetContentType(string value)\n        {\n            ContentType = value;\n            return this;\n        }\n\n        public string ContentEncoding { get; private set; }\n\n        public IEvent SetContentEncoding(string value)\n        {\n            ContentEncoding = value;\n            return this;\n        }\n\n        public string Topic { get; private set; }\n\n        public IEvent SetTopic(string value)\n        {\n            Topic = value;\n            return this;\n        }\n\n        public IEventSchema Schema { get; private set; }\n\n        public IEvent SetSchema(IEventSchema schema)\n        {\n            Schema = schema;\n            return this;\n        }\n\n        public bool Retain { get; private set; }\n\n        public IEvent SetRetain(bool value)\n        {\n            Retain = value;\n            return this;\n        }\n\n        public TimeSpan Ttl { get; private set; }\n\n        public IEvent SetTtl(TimeSpan value)\n        {\n            Ttl = value;\n            return this;\n        }\n\n        public IList<ReadOnlySequence<byte>> Buffers { get; } = [];\n\n        public IEvent AddBuffers(IEnumerable<ReadOnlySequence<byte>> value)\n        {\n            Buffers.AddRange(value);\n            return this;\n        }\n\n        public Dictionary<string, string> Properties { get; } = [];\n\n        public IEvent AddProperty(string name, string value)\n        {\n            Properties.AddOrUpdate(name, value);\n            return this;\n        }\n\n        public static IEvent Create()\n        {\n            return new NetworkMessage();\n        }\n\n        public static IList<OpcUaSubscriptionNotification> GenerateSampleSubscriptionNotifications(\n            uint numOfMessages, bool eventList = false,\n            MessageEncoding encoding = MessageEncoding.Json,\n            NetworkMessageContentFlags extraNetworkMessageMask = 0,\n            bool isSampleMode = false, bool randomTopic = false)\n        {\n            var messages = new List<OpcUaSubscriptionNotification>();\n            const string publisherId = \"Publisher\";\n            var writer = new DataSetWriterModel\n            {\n                Id = string.Empty,\n                DataSet = new PublishedDataSetModel\n                {\n                    DataSetSource = new PublishedDataSetSourceModel\n                    {\n                        PublishedVariables = new PublishedDataItemsModel\n                        {\n                            PublishedData = new List<PublishedDataSetVariableModel>()\n                        }\n                    },\n                    DataSetMetaData = new DataSetMetaDataModel\n                    {\n                        Name = \"testdataset\",\n                        DataSetClassId = Guid.NewGuid()\n                    }\n                }\n            };\n            var writerGroup = new WriterGroupModel\n            {\n                Id = string.Empty,\n                MessageSettings = new WriterGroupMessageSettingsModel\n                {\n                    NetworkMessageContentMask =\n                        NetworkMessageContentFlags.PublisherId |\n                        NetworkMessageContentFlags.WriterGroupId |\n                        NetworkMessageContentFlags.NetworkMessageNumber |\n                        NetworkMessageContentFlags.SequenceNumber |\n                        NetworkMessageContentFlags.PayloadHeader |\n                        NetworkMessageContentFlags.Timestamp |\n                        NetworkMessageContentFlags.DataSetClassId |\n                        (isSampleMode ? NetworkMessageContentFlags.MonitoredItemMessage : NetworkMessageContentFlags.NetworkMessageHeader) |\n                        NetworkMessageContentFlags.DataSetMessageHeader |\n                        extraNetworkMessageMask\n                },\n                MessageType = encoding\n            };\n            var seq = 1u;\n\n            var subscriber = new Mock<ISubscriber>();\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var dataItem = new OpcUaMonitoredItem.DataChange(subscriber.Object, new DataMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\"\n            }, Log.Console<OpcUaMonitoredItem.DataChange>(), TimeProvider.System);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var eventItem = new OpcUaMonitoredItem.Event(subscriber.Object, new EventMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                EventFilter = new EventFilterModel()\n            }, Log.Console<OpcUaMonitoredItem.Event>(), TimeProvider.System);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            eventItem.Fields.Add((\"1\", default));\n            eventItem.Fields.Add((\"2\", default));\n            eventItem.Fields.Add((\"3\", default));\n            eventItem.Fields.Add((\"4\", default));\n            eventItem.Fields.Add((\"5\", default));\n            eventItem.Fields.Add((\"6\", default));\n\n            for (uint i = 0; i < numOfMessages; i++)\n            {\n                var suffix = $\"-{i}\";\n\n                var notifications = new OpcUaMonitoredItem.MonitoredItemNotifications();\n\n                for (uint k = 0; k < i + 1; k++)\n                {\n                    var notificationSuffix = suffix + $\"-{k}\";\n\n                    var displayName = \"DisplayName\" + notificationSuffix;\n                    var nodeId = \"NodeId\" + notificationSuffix;\n                    if (eventList)\n                    {\n                        var eventFieldList = new EventFieldList\n                        {\n                            ClientHandle = k,\n                            EventFields = new Variant[] { 1, 2, 3, 4, 5, 6 },\n                            Message = new NotificationMessage\n                            {\n                                SequenceNumber = seq++\n                            }\n                        };\n                        // Fake the item to be created as part of the subscription and grab the data\n                        eventItem.Template = eventItem.Template with\n                        {\n                            StartNodeId = nodeId,\n                            DataSetFieldId = nodeId,\n                            DataSetFieldName = displayName,\n                        };\n                        eventItem.DisplayName = displayName;\n                        eventItem.StartNodeId = new NodeId(nodeId, 0);\n                        eventItem.Handle = eventItem;\n                        eventItem.Valid = true;\n                        eventItem.TryGetMonitoredItemNotifications(DateTimeOffset.UtcNow, eventFieldList, notifications);\n                    }\n                    else\n                    {\n                        var monitoredItemNotification = new MonitoredItemNotification\n                        {\n                            ClientHandle = k,\n                            Value = new DataValue(new Variant(k), new StatusCode(0), DateTime.UtcNow),\n                            Message = new NotificationMessage\n                            {\n                                SequenceNumber = seq++\n                            }\n                        };\n                        // Fake the item to be created as part of the subscription and grab the data\n                        dataItem.Template = dataItem.Template with\n                        {\n                            StartNodeId = nodeId,\n                            DataSetFieldId = nodeId,\n                            DataSetFieldName = displayName,\n                        };\n                        dataItem.DisplayName = displayName;\n                        dataItem.StartNodeId = new NodeId(nodeId, 0);\n                        dataItem.Handle = dataItem;\n                        dataItem.Valid = true;\n                        dataItem.TryGetMonitoredItemNotifications(DateTimeOffset.UtcNow,\n                            monitoredItemNotification, notifications);\n                    }\n                }\n\n#pragma warning disable CA5394 // Do not use insecure randomness\n                var message = new OpcUaSubscriptionNotification(DateTimeOffset.UtcNow,\n                    notifications: notifications.Notifications[subscriber.Object])\n                {\n                    Context = new DataSetWriterContext\n                    {\n                        NextWriterSequenceNumber = () => i,\n                        DataSetWriterId = 1,\n                        Qos = null,\n                        Topic = randomTopic ? Guid.NewGuid().ToString() : string.Empty,\n                        Retain = false,\n                        Ttl = randomTopic ? TimeSpan.FromSeconds(Random.Shared.Next(60)) : null,\n                        PublisherId = publisherId,\n                        ExtensionFields = Array.Empty<(string, DataValue)>(),\n                        Schema = null, // TODO\n                        CloudEvent = null, // TODO\n                        Writer = writer,\n                        WriterName = writer.DataSetWriterName ?? Constants.DefaultDataSetWriterName,\n                        MetaData = null,\n                        WriterGroup = writerGroup\n                    },\n                    PublishTimestamp = DateTimeOffset.UtcNow,\n                    MessageType = eventList ? Encoders.PubSub.MessageType.Event : Encoders.PubSub.MessageType.KeyFrame,\n                    EndpointUrl = \"EndpointUrl\" + suffix,\n                    ApplicationUri = \"ApplicationUri\" + suffix\n                };\n#pragma warning restore CA5394 // Do not use insecure randomness\n\n                messages.Add(message);\n            }\n\n            return messages;\n        }\n\n        public void Dispose()\n        {\n        }\n\n        public ValueTask SendAsync(CancellationToken ct = default)\n        {\n            return ValueTask.CompletedTask;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Encoder/NetworkMessageEncoderJsonGzipTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Moq;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Linq;\n    using Xunit;\n\n    public class NetworkMessageEncoderJsonGzipTests\n    {\n        /// <summary>\n        /// Create compliant encoder\n        /// </summary>\n        /// <returns></returns>\n        private static NetworkMessageEncoder GetEncoder()\n        {\n            var loggerMock = new Mock<ILogger<NetworkMessageEncoder>>();\n            var metricsMock = new Mock<IMetricsContext>();\n            metricsMock.SetupGet(m => m.TagList).Returns(new TagList());\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.UseStandardsCompliantEncoding = true;\n            return new NetworkMessageEncoder(options, metricsMock.Object, loggerMock.Object);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyMessagesTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new List<OpcUaSubscriptionNotification>();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyDataSetMessageModelTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new[]\n            {\n                new OpcUaSubscriptionNotification(DateTimeOffset.UtcNow)\n            };\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeTooBigJsonMessageTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(3, false, MessageEncoding.JsonGzip);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(3, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.JsonGzip);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            // Batch or no batch, the difference is that we cram all notifications\n            // into a message or write all messages as array in batch mode. If\n            // single message is desired, single message mode should be set (see next test).\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeChunkTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 8 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(500, false, MessageEncoding.JsonGzip);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            var count = networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count);\n            Assert.All(networkMessages, m => Assert.All(((NetworkMessage)m.Event).Buffers,\n                m => Assert.True(m.Length <= maxMessageSize, m.Length.ToString(CultureInfo.InvariantCulture))));\n            Assert.InRange(count, 150, 212);\n            Assert.Equal(500, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal((uint)count, encoder.MessagesProcessedCount);\n            Assert.InRange(Math.Round(encoder.AvgNotificationsPerMessage), 2, 3);\n        }\n\n        [Fact]\n        public void EncodeJsonSingleMessageTest()\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.JsonGzip,\n                NetworkMessageContentFlags.SingleDataSetMessage);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, false);\n\n            Assert.Equal(20, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(20, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeEventsJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true, MessageEncoding.JsonGzip);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Fact]\n        public void EncodeEventsSingleMessageJsonTest()\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true, MessageEncoding.JsonGzip,\n                NetworkMessageContentFlags.SingleDataSetMessage);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, false);\n\n            // Single message, no array envelope due to batching resulting in 210 events from 20 notifications.\n            Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(210, encoder.MessagesProcessedCount);\n            Assert.Equal(0.10, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeMetadataJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.JsonGzip);\n            messages[10] = messages[10] with\n            {\n                // Emit metadata\n                MessageType = Encoders.PubSub.MessageType.Metadata,\n                Context = ((DataSetWriterContext)messages[10].Context) with\n                {\n                    MetaData = new PublishedDataSetMessageSchemaModel\n                    {\n                        Id = \"dataset\",\n                        DataSetFieldContentFlags = null,\n                        DataSetMessageContentFlags = null,\n                        MetaData = new PublishedDataSetMetaDataModel\n                        {\n                            DataSetMetaData = new DataSetMetaDataModel\n                            {\n                                Name = \"test\"\n                            },\n                            Fields = new[]\n                            {\n                                new PublishedFieldMetaDataModel\n                                {\n                                    Name = \"test\",\n                                    BuiltInType = (byte)BuiltInType.UInt16\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(3, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(19, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(3, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeNothingTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.JsonGzip);\n            messages[0].MessageType = Encoders.PubSub.MessageType.KeyFrame;\n            messages[0].Notifications.Clear();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n            Assert.Equal(0, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeKeepAliveTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.JsonGzip);\n            messages[0].MessageType = Encoders.PubSub.MessageType.KeepAlive;\n            messages[0].Notifications.Clear();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Single(networkMessages);\n            Assert.Equal(1, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Encoder/NetworkMessageEncoderJsonTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Moq;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Linq;\n    using Xunit;\n\n    public class NetworkMessageEncoderJsonTests\n    {\n        /// <summary>\n        /// Create compliant encoder\n        /// </summary>\n        /// <returns></returns>\n        private static NetworkMessageEncoder GetEncoder()\n        {\n            var loggerMock = new Mock<ILogger<NetworkMessageEncoder>>();\n            var metricsMock = new Mock<IMetricsContext>();\n            metricsMock.SetupGet(m => m.TagList).Returns(new TagList());\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.UseStandardsCompliantEncoding = true;\n            return new NetworkMessageEncoder(options, metricsMock.Object, loggerMock.Object);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyMessagesTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new List<OpcUaSubscriptionNotification>();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyDataSetMessageModelTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new[] { new OpcUaSubscriptionNotification(DateTimeOffset.UtcNow) };\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeTooBigJsonMessageTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(3, false, MessageEncoding.Json);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(3, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Json);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            // Batch or no batch, the difference is that we cram all notifications\n            // into a message or write all messages as array in batch mode. If\n            // single message is desired, single message mode should be set (see next test).\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeJsonWithRandomTopicTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Json, randomTopic: true);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            // Batch or no batch, each notification has its own topic, so every single one generates a message\n\n            Assert.Equal(20, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(20, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeChunkTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 8 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(500, false, MessageEncoding.Json);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            var count = networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count(b => b.Length != 0));\n            Assert.All(networkMessages, m => Assert.All(((NetworkMessage)m.Event).Buffers,\n                m => Assert.True(m.Length <= maxMessageSize, m.Length.ToString(CultureInfo.InvariantCulture))));\n            Assert.InRange(count, 65, 68);\n            Assert.Equal(95, encoder.NotificationsProcessedCount);\n            Assert.Equal((uint)500 - 95, encoder.NotificationsDroppedCount);\n            Assert.Equal((uint)count, encoder.MessagesProcessedCount);\n            Assert.Equal(1, Math.Round(encoder.AvgNotificationsPerMessage));\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeJsonSingleMessageTest(bool randomTopic)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Json,\n                NetworkMessageContentFlags.SingleDataSetMessage, randomTopic: randomTopic);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, false);\n\n            Assert.Equal(20, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(20, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeEventsJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true, MessageEncoding.Json);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Fact]\n        public void EncodeEventsSingleMessageJsonTest()\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true, MessageEncoding.Json,\n                NetworkMessageContentFlags.SingleDataSetMessage);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, false);\n\n            // Single message, no array envelope due to batching resulting in 210 events from 20 notifications.\n            Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(210, encoder.MessagesProcessedCount);\n            Assert.Equal(0.10, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeMetadataJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Json);\n            messages[10] = messages[10] with\n            {\n                // Emit metadata\n                MessageType = Encoders.PubSub.MessageType.Metadata,\n                Context = ((DataSetWriterContext)messages[10].Context) with\n                {\n                    MetaData = new PublishedDataSetMessageSchemaModel\n                    {\n                        Id = \"dataset\",\n                        DataSetFieldContentFlags = null,\n                        DataSetMessageContentFlags = null,\n                        MetaData = new PublishedDataSetMetaDataModel\n                        {\n                            DataSetMetaData = new DataSetMetaDataModel\n                            {\n                                Name = \"test\"\n                            },\n                            Fields = new[]\n                            {\n                                new PublishedFieldMetaDataModel\n                                {\n                                    Name = \"test\",\n                                    BuiltInType = (byte)BuiltInType.UInt16\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(3, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(19, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(3, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeNothingTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.Json);\n            messages[0].MessageType = Encoders.PubSub.MessageType.KeyFrame;\n            messages[0].Notifications.Clear();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n            Assert.Equal(0, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeKeepAliveTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.Json);\n            messages[0].MessageType = Encoders.PubSub.MessageType.KeepAlive;\n            messages[0].Notifications.Clear();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Single(networkMessages);\n            Assert.Equal(1, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Encoder/NetworkMessageEncoderLegacyTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Moq;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using Xunit;\n\n    public class NetworkMessageEncoderLegacyTests\n    {\n        /// <summary>\n        /// Create legacy encoder\n        /// </summary>\n        /// <returns></returns>\n        private static NetworkMessageEncoder GetEncoder()\n        {\n            var loggerMock = new Mock<ILogger<NetworkMessageEncoder>>();\n            var metricsMock = new Mock<IMetricsContext>();\n            metricsMock.SetupGet(m => m.TagList).Returns(new TagList());\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.UseStandardsCompliantEncoding = false;\n            return new NetworkMessageEncoder(options, metricsMock.Object, loggerMock.Object);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyMessagesTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new List<OpcUaSubscriptionNotification>();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EmptyDataSetMessageModelTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = new[]\n            {\n                new OpcUaSubscriptionNotification(DateTimeOffset.UtcNow)\n            };\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeTooBigJsonMessageTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(3, false, MessageEncoding.Json);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(3, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Json);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            // Batch or no batch, the difference is that we cram all notifications\n            // into a message or write all messages as array in batch mode. If\n            // single message is desired, single message mode should be set (see next test).\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public void EncodeChunkTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 8 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(500, false, MessageEncoding.Json);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            var count = networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count(b => b.Length != 0));\n            Assert.InRange(count, 66, 68);\n            Assert.Equal(95, encoder.NotificationsProcessedCount);\n            Assert.Equal((uint)500 - 95, encoder.NotificationsDroppedCount);\n            Assert.Equal((uint)count, encoder.MessagesProcessedCount);\n            Assert.Equal(1, Math.Round(encoder.AvgNotificationsPerMessage));\n        }\n\n        [Fact]\n        public void EncodeJsonSingleMessageTest()\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Json,\n                NetworkMessageContentFlags.SingleDataSetMessage);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, false);\n\n            Assert.Equal(20, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(20, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeEventsJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true, MessageEncoding.Json);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Fact]\n        public void EncodeEventsSingleMessageJsonTest()\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true, MessageEncoding.Json,\n                NetworkMessageContentFlags.SingleDataSetMessage);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, false);\n\n            // Single message, no array envelope due to batching resulting in 210 events from 20 notifications.\n            Assert.Equal(210, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(210, encoder.MessagesProcessedCount);\n            Assert.Equal(0.10, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeMetadataJsonTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Json);\n            messages[10] = messages[10] with\n            {\n                // Emit metadata\n                MessageType = Encoders.PubSub.MessageType.Metadata,\n                Context = ((DataSetWriterContext)messages[10].Context) with\n                {\n                    MetaData = new PublishedDataSetMessageSchemaModel\n                    {\n                        Id = \"dataset\",\n                        DataSetFieldContentFlags = null,\n                        DataSetMessageContentFlags = null,\n                        MetaData = new PublishedDataSetMetaDataModel\n                        {\n                            DataSetMetaData = new DataSetMetaDataModel\n                            {\n                                Name = \"test\"\n                            },\n                            Fields = new[]\n                            {\n                                new PublishedFieldMetaDataModel\n                                {\n                                    Name = \"test\",\n                                    BuiltInType = (byte)BuiltInType.UInt16\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(3, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(19, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(3, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeNothingTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.Json);\n            messages[0].MessageType = Encoders.PubSub.MessageType.KeyFrame;\n            messages[0].Notifications.Clear();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n            Assert.Equal(0, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeKeepAliveTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.Json);\n            messages[0].MessageType = Encoders.PubSub.MessageType.KeepAlive;\n            messages[0].Notifications.Clear();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Single(networkMessages);\n            Assert.Equal(1, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Encoder/NetworkMessageEncoderUadpTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Moq;\n    using Opc.Ua;\n    using System;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Linq;\n    using Xunit;\n\n    public class NetworkMessageEncoderUadpTests\n    {\n        private static NetworkMessageEncoder GetEncoder()\n        {\n            var loggerMock = new Mock<ILogger<NetworkMessageEncoder>>();\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            var metricsMock = new Mock<IMetricsContext>();\n            metricsMock.SetupGet(m => m.TagList).Returns(new TagList());\n            return new NetworkMessageEncoder(options, metricsMock.Object, loggerMock.Object);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeChunkedUadpMessageTest1(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(10, false, MessageEncoding.Uadp);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(33, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.All(networkMessages, m => Assert.All(((NetworkMessage)m.Event).Buffers,\n                m => Assert.True(m.Length <= maxMessageSize, m.Length.ToString(CultureInfo.InvariantCulture))));\n            Assert.Equal(10, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(33, encoder.MessagesProcessedCount);\n            Assert.Equal(0.30, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeChunkedUadpMessageTest2(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(100, false, MessageEncoding.Uadp);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(2025, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.All(networkMessages, m => Assert.All(((NetworkMessage)m.Event).Buffers,\n                m => Assert.True(m.Length <= maxMessageSize, m.Length.ToString(CultureInfo.InvariantCulture))));\n            Assert.Equal(100, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(2025, encoder.MessagesProcessedCount);\n            Assert.Equal(0.05, Math.Round(encoder.AvgNotificationsPerMessage, 2));\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeUadpTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Uadp);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeEventsUadpTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, true, MessageEncoding.Uadp);\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(1, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(20, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(20, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeMetadataUadpTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(20, false, MessageEncoding.Uadp);\n            messages[10] = messages[10] with\n            {\n                // Emit metadata\n                MessageType = Encoders.PubSub.MessageType.Metadata,\n                Context = ((DataSetWriterContext)messages[10].Context) with\n                {\n                    MetaData = new PublishedDataSetMessageSchemaModel\n                    {\n                        Id = \"dataset\",\n                        DataSetFieldContentFlags = null,\n                        DataSetMessageContentFlags = null,\n                        MetaData = new PublishedDataSetMetaDataModel\n                        {\n                            DataSetMetaData = new DataSetMetaDataModel\n                            {\n                                Name = \"test\"\n                            },\n                            Fields = new[]\n                            {\n                                new PublishedFieldMetaDataModel\n                                {\n                                    Name = \"test\",\n                                    BuiltInType = (byte)BuiltInType.UInt16\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(3, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(19, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(3, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeMetadataUadpChunkTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 100;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.Uadp);\n            messages[0] = messages[0] with\n            {\n                // Emit metadata\n                MessageType = Encoders.PubSub.MessageType.Metadata,\n                Context = ((DataSetWriterContext)messages[0].Context) with\n                {\n                    MetaData = new PublishedDataSetMessageSchemaModel\n                    {\n                        Id = \"dataset\",\n                        DataSetFieldContentFlags = null,\n                        DataSetMessageContentFlags = null,\n                        MetaData = new PublishedDataSetMetaDataModel\n                        {\n                            DataSetMetaData = new DataSetMetaDataModel\n                            {\n                                Name = \"test\"\n                            },\n                            Fields = Enumerable.Range(0, 10000)\n                            .Select(r => new PublishedFieldMetaDataModel\n                            {\n                                Name = \"testfield\" + r,\n                                BuiltInType = (byte)BuiltInType.UInt16\n                            })\n                            .ToList()\n                        }\n                    }\n                }\n            };\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Equal(8194, networkMessages.Sum(m => ((NetworkMessage)m.Event).Buffers.Count));\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(8194, encoder.MessagesProcessedCount);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeNothingTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.Uadp);\n            messages[0].MessageType = Encoders.PubSub.MessageType.KeyFrame;\n            messages[0].Notifications.Clear();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Empty(networkMessages);\n            Assert.Equal(0, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(0, encoder.MessagesProcessedCount);\n            Assert.Equal(0, encoder.AvgNotificationsPerMessage);\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public void EncodeKeepAliveTest(bool encodeBatchFlag)\n        {\n            const int maxMessageSize = 256 * 1024;\n            var messages = NetworkMessage.GenerateSampleSubscriptionNotifications(1, false, MessageEncoding.Uadp);\n            messages[0].MessageType = Encoders.PubSub.MessageType.KeepAlive;\n            messages[0].Notifications.Clear();\n\n            using var encoder = GetEncoder();\n            var networkMessages = encoder.Encode(NetworkMessage.Create, messages, maxMessageSize, encodeBatchFlag);\n\n            Assert.Single(networkMessages);\n            Assert.Equal(1, encoder.NotificationsProcessedCount);\n            Assert.Equal(0, encoder.NotificationsDroppedCount);\n            Assert.Equal(1, encoder.MessagesProcessedCount);\n            Assert.Equal(1, encoder.AvgNotificationsPerMessage);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/FileSystem/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.FileSystem\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(FileCollection.Name)]\n    public class BrowseTests\n    {\n        public BrowseTests(FileSystemServer server)\n        {\n            _server = server;\n        }\n\n        private BrowseTests<ConnectionModel> GetTests()\n        {\n            return new BrowseTests<ConnectionModel>(\n                () => new FileSystemServices<ConnectionModel>(_server.Client,\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n\n        [Fact]\n        public Task GetFileSystemsTest1Async()\n        {\n            return GetTests().GetFileSystemsTest1Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest1Async()\n        {\n            return GetTests().GetDirectoriesTest1Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest2Async()\n        {\n            return GetTests().GetDirectoriesTest2Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest3Async()\n        {\n            return GetTests().GetDirectoriesTest3Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest4Async()\n        {\n            return GetTests().GetDirectoriesTest4Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest5Async()\n        {\n            return GetTests().GetDirectoriesTest5Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest6Async()\n        {\n            return GetTests().GetDirectoriesTest6Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest1Async()\n        {\n            return GetTests().GetFilesTest1Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest2Async()\n        {\n            return GetTests().GetFilesTest2Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest3Async()\n        {\n            return GetTests().GetFilesTest3Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest4Async()\n        {\n            return GetTests().GetFilesTest4Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest5Async()\n        {\n            return GetTests().GetFilesTest5Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest6Async()\n        {\n            return GetTests().GetFilesTest6Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/FileSystem/FileCollection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.FileSystem\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class FileCollection : ICollectionFixture<FileSystemServer>\n    {\n        public const string Name = \"FileSystem\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/FileSystem/OperationsTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.FileSystem\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(FileCollection.Name)]\n    public class OperationsTests\n    {\n        public OperationsTests(FileSystemServer server)\n        {\n            _server = server;\n        }\n\n        private OperationsTests<ConnectionModel> GetTests()\n        {\n            return new OperationsTests<ConnectionModel>(\n                () => new FileSystemServices<ConnectionModel>(_server.Client,\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n\n        [Fact]\n        public Task CreateDirectoryTest1Async()\n        {\n            return GetTests().CreateDirectoryTest1Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest2Async()\n        {\n            return GetTests().CreateDirectoryTest2Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest3Async()\n        {\n            return GetTests().CreateDirectoryTest3Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest4Async()\n        {\n            return GetTests().CreateDirectoryTest4Async();\n        }\n\n        [Fact]\n        public Task DeleteDirectoryTest1Async()\n        {\n            return GetTests().DeleteDirectoryTest1Async();\n        }\n\n        [Fact]\n        public Task DeleteDirectoryTest2Async()\n        {\n            return GetTests().DeleteDirectoryTest2Async();\n        }\n\n        [Fact]\n        public Task DeleteDirectoryTest3Async()\n        {\n            return GetTests().DeleteDirectoryTest3Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest1Async()\n        {\n            return GetTests().CreateFileTest1Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest2Async()\n        {\n            return GetTests().CreateFileTest2Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest3Async()\n        {\n            return GetTests().CreateFileTest3Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest4Async()\n        {\n            return GetTests().CreateFileTest4Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest1Async()\n        {\n            return GetTests().GetFileInfoTest1Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest2Async()\n        {\n            return GetTests().GetFileInfoTest2Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest3Async()\n        {\n            return GetTests().GetFileInfoTest3Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest1Async()\n        {\n            return GetTests().DeleteFileTest1Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest2Async()\n        {\n            return GetTests().DeleteFileTest2Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest3Async()\n        {\n            return GetTests().DeleteFileTest3Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest4Async()\n        {\n            return GetTests().DeleteFileTest4Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest5Async()\n        {\n            return GetTests().DeleteFileTest5Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/FileSystem/ReadTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.FileSystem\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(FileCollection.Name)]\n    public class ReadTests\n    {\n        public ReadTests(FileSystemServer server)\n        {\n            _server = server;\n        }\n\n        private ReadTests<ConnectionModel> GetTests()\n        {\n            return new ReadTests<ConnectionModel>(\n                () => new FileSystemServices<ConnectionModel>(_server.Client,\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n\n        [Fact]\n        public Task ReadFileTest0Async()\n        {\n            return GetTests().ReadFileTest0Async();\n        }\n\n        [Fact]\n        public Task ReadFileTest1Async()\n        {\n            return GetTests().ReadFileTest1Async();\n        }\n\n        [Fact]\n        public Task ReadFileTest2Async()\n        {\n            return GetTests().ReadFileTest2Async();\n        }\n\n        [Fact]\n        public Task ReadFileTest3Async()\n        {\n            return GetTests().ReadFileTest3Async();\n        }\n\n        [Fact]\n        public Task ReadFileTest4Async()\n        {\n            return GetTests().ReadFileTest4Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/FileSystem/WriteTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.FileSystem\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(FileCollection.Name)]\n    public class WriteTests\n    {\n        public WriteTests(FileSystemServer server)\n        {\n            _server = server;\n        }\n\n        private WriteTests<ConnectionModel> GetTests()\n        {\n            return new WriteTests<ConnectionModel>(\n                () => new FileSystemServices<ConnectionModel>(_server.Client,\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n\n        [Fact]\n        public Task WriteFileTest0Async()\n        {\n            return GetTests().WriteFileTest0Async();\n        }\n\n        [Fact]\n        public Task WriteFileTest1Async()\n        {\n            return GetTests().WriteFileTest1Async();\n        }\n\n        [Fact]\n        public Task WriteFileTest2Async()\n        {\n            return GetTests().WriteFileTest2Async();\n        }\n\n        [Fact]\n        public Task AppendFileTest0Async()\n        {\n            return GetTests().AppendFileTest0Async();\n        }\n\n        [Fact]\n        public Task AppendFileTest1Async()\n        {\n            return GetTests().AppendFileTest1Async();\n        }\n\n        [Fact]\n        public Task AppendFileTest2Async()\n        {\n            return GetTests().AppendFileTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalAccess/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class NodeServicesTests\n    {\n        public NodeServicesTests(HistoricalAccessServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private NodeHistoricalAccessTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalAccessTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetInt16NodeHistoryConfiguration()\n        {\n            return GetTests().HistoryGetInt16NodeHistoryConfigurationAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetInt64NodeHistoryConfigurationAsync()\n        {\n            return GetTests().HistoryGetInt64NodeHistoryConfigurationAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetNodeHistoryConfigurationFromBadNode()\n        {\n            return GetTests().HistoryGetNodeHistoryConfigurationFromBadNodeAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalAccess/ReadAtTimesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadAtTimesTests\n    {\n        public ReadAtTimesTests(HistoricalAccessServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private HistoryReadValuesAtTimesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesAtTimesTests<ConnectionModel>(_server,\n                () => new HistoryServices<ConnectionModel>(\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                    new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                        _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                        new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions())),\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest1Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest2Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest3Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest4Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest4Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt32ValuesAtTimesTest1Async()\n        {\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt32ValuesAtTimesTest2Async()\n        {\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalAccess/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class ReadCollection : ICollectionFixture<HistoricalAccessServer>\n    {\n        public const string Name = \"HistoricalAccessRead\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalAccess/ReadModifiedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadModifiedTests\n    {\n        public ReadModifiedTests(HistoricalAccessServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private HistoryReadValuesModifiedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesModifiedTests<ConnectionModel>(_server,\n                () => new HistoryServices<ConnectionModel>(\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                    new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                        _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                        new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions())),\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task HistoryReadInt16ValuesModifiedTestAsync()\n        {\n            return GetTests().HistoryReadInt16ValuesModifiedTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt16ValuesModifiedTestAsync()\n        {\n            return GetTests().HistoryStreamInt16ValuesModifiedTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalAccess/ReadProcessedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadProcessedTests\n    {\n        public ReadProcessedTests(HistoricalAccessServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private HistoryReadValuesProcessedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesProcessedTests<ConnectionModel>(_server,\n                () => new HistoryServices<ConnectionModel>(\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                    new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                        _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                        new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions())),\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest1Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest2Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest3Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamUInt64ProcessedValuesTest1Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamUInt64ProcessedValuesTest2Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamUInt64ProcessedValuesTest3Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalAccess/ReadValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadValuesTests\n    {\n        public ReadValuesTests(HistoricalAccessServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private HistoryReadValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesTests<ConnectionModel>(_server,\n                () => new HistoryServices<ConnectionModel>(\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                    new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                        _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                        new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions())),\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest1Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest2Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest3Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest4Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest4Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt64ValuesTest1Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt64ValuesTest2Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt64ValuesTest3Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt64ValuesTest4Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest4Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalAccess/UpdateValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class UpdateValuesTests\n    {\n        public UpdateValuesTests(HistoricalAccessServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private HistoryUpdateValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryUpdateValuesTests<ConnectionModel>(\n                () => new HistoryServices<ConnectionModel>(\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                    new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                        _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                        new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions())),\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest3Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest4Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest4Async();\n        }\n\n        [Fact]\n        public Task HistoryDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryDeleteUInt32ValuesTest1Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalEvents/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class NodeServicesTests\n    {\n        public NodeServicesTests(HistoricalEventsServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private NodeHistoricalEventsTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalEventsTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalEventsServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/HistoricalEvents/ReadCollection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.HistoricalEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class ReadCollection : ICollectionFixture<HistoricalEventsServer>\n    {\n        public const string Name = \"HistoricalEventsRead\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Plc/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Plc\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests1 : IClassFixture<PlcServer>\n    {\n        public NodeServicesTests1(PlcServer server, ITestOutputHelper output)\n        {\n            _output = output;\n            _server = server;\n        }\n\n        private SimulatorNodesTests<ConnectionModel> GetTests()\n        {\n            return new SimulatorNodesTests<ConnectionModel>(_server,\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly ITestOutputHelper _output;\n        private readonly PlcServer _server;\n\n        [Fact]\n        public Task AlternatingBooleanTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().AlternatingBooleanTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task BadNodeHasAlternatingStatusCodeAsync()\n        {\n            return GetTests().BadNodeHasAlternatingStatusCodeAsync();\n        }\n\n        [Fact]\n        public Task FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync();\n        }\n\n        [Fact]\n        public Task FastUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().FastUIntScalar1TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task NegativeTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().NegativeTrendDataNodeHasValueWithTrendAsync();\n        }\n\n        [Fact]\n        public Task NegativeTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().NegativeTrendDataTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task PositiveTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().PositiveTrendDataNodeHasValueWithTrendAsync();\n        }\n\n        [Fact]\n        public Task PositiveTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().PositiveTrendDataTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task RandomSignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomSignedInt32TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task RandomUnsignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomUnsignedInt32TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync();\n        }\n\n        [Fact]\n        public Task SlowUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().SlowUIntScalar1TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInDipDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInDipDataAsync();\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInSpikeDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInSpikeDataAsync();\n        }\n\n        [Fact]\n        public Task TelemetryFastNodeTestAsync()\n        {\n            return GetTests().TelemetryFastNodeTestAsync();\n        }\n\n        [Fact]\n        public Task TelemetryStepUpTestAsync()\n        {\n            return GetTests().TelemetryStepUpTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/Plc/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.Plc\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests2 : IClassFixture<PlcServer>\n    {\n        public NodeServicesTests2(PlcServer server, ITestOutputHelper output)\n        {\n            _output = output;\n            _server = server;\n        }\n\n        private PlcModelComplexTypeTests<ConnectionModel> GetTests()\n        {\n            return new PlcModelComplexTypeTests<ConnectionModel>(_server,\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly ITestOutputHelper _output;\n        private readonly PlcServer _server;\n\n        [Fact]\n        public Task PlcModelHeaterTestsAsync()\n        {\n            return GetTests().PlcModelHeaterTestsAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/PublishedNodesJsonServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Tests.Utils;\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Runtime;\n    using Azure.IIoT.OpcUa.Publisher.Storage;\n    using FluentAssertions;\n    using Furly.Exceptions;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Moq;\n    using Neovolve.Logging.Xunit;\n    using Publisher.Services;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// Tests the publisher configuration services\n    /// </summary>\n    public class PublishedNodesJsonServicesTests : TempFileProviderBase\n    {\n        /// <summary>\n        /// Constructor that initializes common resources used by tests.\n        /// </summary>\n        /// <param name=\"output\"></param>\n        public PublishedNodesJsonServicesTests(ITestOutputHelper output)\n        {\n            _newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n            _loggerFactory = LogFactory.Create(output, Logging.Config);\n\n            var clientConfigMock = new OpcUaClientConfig(new ConfigurationBuilder().Build()).ToOptions();\n\n            _options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            _options.Value.PublishedNodesFile = _tempFile;\n            _options.Value.UseFileChangePolling = true;\n            _options.Value.DefaultTransport = WriterGroupTransport.Mqtt;\n            _options.Value.MessagingProfile = MessagingProfile.Get(\n                MessagingMode.PubSub, MessageEncoding.Json);\n\n            _publishedNodesJobConverter = new PublishedNodesConverter(\n                _loggerFactory.CreateLogger<PublishedNodesConverter>(), _newtonSoftJsonSerializer, _options);\n\n            // Note that each test is responsible for setting content of _tempFile;\n            Utils.CopyContent(\"Publisher/empty_pn.json\", _tempFile);\n\n            using var factory = new PhysicalFileProviderFactory(_options,\n                _loggerFactory.CreateLogger<PhysicalFileProviderFactory>());\n            _publishedNodesProvider = new PublishedNodesProvider(factory, _options,\n                _loggerFactory.CreateLogger<PublishedNodesProvider>());\n            _triggerMock = new Mock<IWriterGroupControl>();\n            var factoryMock = new Mock<IWriterGroupScopeFactory>();\n            var lifetime = new Mock<IWriterGroupScope>();\n            lifetime.SetupGet(l => l.WriterGroup).Returns(_triggerMock.Object);\n            factoryMock\n                .Setup(factory => factory.Create(It.IsAny<WriterGroupModel>()))\n                .Returns(lifetime.Object);\n            _publisher = new PublisherService(factoryMock.Object, _options,\n                _loggerFactory.CreateLogger<PublisherService>());\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                _loggerFactory.Dispose();\n                _publishedNodesProvider.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// This method should be called only after content of _tempFile is set.\n        /// </summary>\n        private PublishedNodesJsonServices InitPublisherConfigService()\n        {\n            var configService = new PublishedNodesJsonServices(\n                _publishedNodesJobConverter,\n                _publisher,\n                _loggerFactory.CreateLogger<PublishedNodesJsonServices>(),\n                _publishedNodesProvider,\n                _newtonSoftJsonSerializer\n            );\n            configService.GetAwaiter().GetResult();\n            return configService;\n        }\n\n        [Fact]\n        public async Task TestCreateUpdateWithAmbigousNodesArgumentsAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = \"alwaysthesameid\"\n                })\n                .ToList();\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = opcNodes;\n\n            // The call should throw an exception.\n            await FluentActions\n                .Invoking(async () => await configService.CreateOrUpdateDataSetWriterEntryAsync(writer))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Field ids must be present and unique.\");\n        }\n\n        [Fact]\n        public async Task TestCreateUpdateWithoutEndpointUrlThrowsAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = opcNodes;\n            writer.EndpointUrl = null;\n\n            // The call should throw an exception.\n            await FluentActions\n                .Invoking(async () => await configService.CreateOrUpdateDataSetWriterEntryAsync(writer))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Missing endpoint url in entry\");\n        }\n\n        [Fact]\n        public async Task TestCreateUpdateWithoutNodeIdThrowsAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = opcNodes;\n\n            // The call should throw an exception.\n            await FluentActions\n                .Invoking(async () => await configService.CreateOrUpdateDataSetWriterEntryAsync(writer))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Node must contain a node ID\");\n        }\n\n        [Fact]\n        public async Task TestCreateUpdateWithWithNodeIdAsDataSetFieldAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = opcNodes;\n\n            // The call should not throw an exception.\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task TestCreateUpdateWithNodesWithPublishingIntervalSetArgumentsAsync(bool timespan)\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"test{i}\",\n                    OpcPublishingIntervalTimespan = timespan ? TimeSpan.FromSeconds(1) : null,\n                    OpcPublishingInterval = timespan ? null : 1\n                })\n                .ToList();\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = opcNodes;\n\n            // The call should throw an exception.\n            await FluentActions\n                .Invoking(async () => await configService.CreateOrUpdateDataSetWriterEntryAsync(writer))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Publishing interval not allowed on node level. Must be set at writer level.\");\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task TestAddNodesWithPublishingIntervalSetArgumentsAsync(bool timespan)\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"test{i}\"\n                })\n                .ToList();\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n\n            if (timespan)\n            {\n                opcNodes.ForEach(n => n.OpcPublishingIntervalTimespan = TimeSpan.FromSeconds(1));\n            }\n            else\n            {\n                opcNodes.ForEach(n => n.OpcPublishingInterval = 1);\n            }\n\n            // The call should throw an exception.\n            await FluentActions\n                .Invoking(async () => await configService.AddOrUpdateNodesAsync(writer.DataSetWriterGroup!,\n                    writer.DataSetWriterId!, opcNodes.Skip(1).ToList()))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Publishing interval not allowed on node level. Must be set at writer level.\");\n        }\n\n        [Fact]\n        public async Task TestCreateUpdateRemoveWriterEntries1Async()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            await FluentActions\n                .Invoking(async () => await configService\n                    .GetDataSetWriterEntryAsync(\"test12\", \"test2\"))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Could not find entry with provided writer id and writer group.\");\n\n            const int numberOfNodes = 3;\n            var opcNodes = Enumerable.Range(0, numberOfNodes)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n\n            var writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Should().BeEmpty();\n\n            var writer = GenerateEndpoint(0, opcNodes, false);\n\n            // Create\n            writer.OpcNodes = opcNodes;\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Count.Should().Be(1);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            writerResult.DisableSubscriptionTransfer.Should().BeNull();\n            writerResult.OpcNodes.Should().BeNull();\n\n            // Update\n            var updatedWriter = writer with { DisableSubscriptionTransfer = true };\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(updatedWriter);\n            writerResult = await configService.GetDataSetWriterEntryAsync(\n                updatedWriter.DataSetWriterGroup!, updatedWriter.DataSetWriterId!);\n            writerResult.DisableSubscriptionTransfer.Should().BeTrue();\n            writerResult.OpcNodes.Should().BeNull();\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Count.Should().Be(1);\n            var nodes = await configService.GetNodesAsync(updatedWriter.DataSetWriterGroup!,\n                updatedWriter.DataSetWriterId!);\n            nodes.Count.Should().Be(numberOfNodes);\n\n            // Add\n            opcNodes.ForEach(o => o.OpcPublishingIntervalTimespan = null); // Reset in memory changes\n            var writer2 = GenerateEndpoint(1, opcNodes, false);\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer2);\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Count.Should().Be(2);\n\n            // Create ambigous entry\n            opcNodes.ForEach(o => o.OpcPublishingIntervalTimespan = null); // Reset in memory changes\n            updatedWriter = writer2 with { DisableSubscriptionTransfer = true };\n            await configService.AddOrUpdateEndpointsAsync(updatedWriter.YieldReturn().ToList());\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Count.Should().Be(3);\n\n            opcNodes.ForEach(o => o.OpcPublishingIntervalTimespan = null); // Reset in memory changes\n            await FluentActions\n                .Invoking(async () => await configService\n                    .CreateOrUpdateDataSetWriterEntryAsync(writer2))\n                .Should()\n                .ThrowAsync<ResourceInvalidStateException>()\n                .WithMessage(\"Trying to find entry with provided writer id produced ambigious results.\");\n            await FluentActions\n                .Invoking(async () => await configService\n                    .GetDataSetWriterEntryAsync(writer2.DataSetWriterGroup!, writer2.DataSetWriterId!))\n                .Should()\n                .ThrowAsync<ResourceInvalidStateException>()\n                .WithMessage(\"Trying to find entry with provided writer id produced ambigious results.\");\n\n            // Remove\n            await configService.RemoveDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Count.Should().Be(2);\n\n            await FluentActions\n                .Invoking(async () => await configService\n                    .GetDataSetWriterEntryAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Could not find entry with provided writer id and writer group.\");\n\n            // Remove force\n            await configService.RemoveDataSetWriterEntryAsync(writer2.DataSetWriterGroup!,\n                writer2.DataSetWriterId!, true);\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Should().BeEmpty();\n        }\n\n        [Fact]\n        public async Task TestCreateUpdateRemoveWriterEntries2Async()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            await FluentActions\n                .Invoking(async () => await configService\n                    .GetDataSetWriterEntryAsync(\"test12\", \"test2\"))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Could not find entry with provided writer id and writer group.\");\n\n            const int numberOfNodes = 3;\n            var opcNodes = Enumerable.Range(0, numberOfNodes)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n\n            var writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Should().BeEmpty();\n\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = null;\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Count.Should().Be(1);\n            var nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Should().BeEmpty();\n\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            writerResult.DisableSubscriptionTransfer.Should().BeNull();\n            writerResult.OpcNodes.Should().BeNull();\n\n            // Remove\n            await configService.RemoveDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Should().BeEmpty();\n\n            await FluentActions\n                .Invoking(async () => await configService\n                    .GetDataSetWriterEntryAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Could not find entry with provided writer id and writer group.\");\n\n            // No failure when forcing\n            await configService.RemoveDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!, true);\n            writers = await configService.GetConfiguredEndpointsAsync();\n            writers.Should().BeEmpty();\n        }\n\n        [Fact]\n        public async Task TestRemoveNodesWithEmptyIdsAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n            await FluentActions\n                .Invoking(async () => await configService\n                .RemoveNodesAsync(\"test\", \"test\", Array.Empty<string>()))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Field ids must be specified.\");\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task TestRemoveNodesFromEmptyWriterAsync(bool useNullAsEmpty)\n        {\n            await using var configService = InitPublisherConfigService();\n            const int numberOfNodes = 3;\n            var opcNodes = Enumerable.Range(0, numberOfNodes)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = useNullAsEmpty ? null : Array.Empty<OpcNodeModel>();\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            await FluentActions\n                .Invoking(async () => await configService\n                .RemoveNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, new[] { \"1\" }))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"No nodes in dataset.\");\n        }\n\n        [Fact]\n        public async Task TestGetNodesWithEmptyEntryAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfNodes = 3;\n            var opcNodes = Enumerable.Range(0, numberOfNodes)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = null;\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            var nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Should().BeEmpty();\n\n            await FluentActions\n                .Invoking(async () => await configService\n                .GetNodeAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, \"1\"))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Node with id 1 not found.\");\n        }\n\n        [Fact]\n        public async Task TestAddQueryAndRemoveNodesAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfNodes = 3;\n            var opcNodes = Enumerable.Range(0, numberOfNodes)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            var nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(1);\n\n            // Add\n            await configService.AddOrUpdateNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                opcNodes.Skip(1).ToList());\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(numberOfNodes);\n\n            // Update\n            opcNodes.ForEach(node => node.OpcSamplingIntervalTimespan = TimeSpan.FromSeconds(3));\n            await configService.AddOrUpdateNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                opcNodes);\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(numberOfNodes);\n            nodes.Should().AllSatisfy(nodes => nodes.OpcSamplingIntervalTimespan.Should().Be(TimeSpan.FromSeconds(3)));\n\n            // Remove\n            await configService.RemoveNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                \"1\".YieldReturn().ToList());\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(numberOfNodes - 1);\n            nodes.Should().NotContain(node => node.DataSetFieldId == \"1\");\n\n            // Add a lot of nodes\n            opcNodes = Enumerable.Range(0, 10000)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n\n            await configService.AddOrUpdateNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                opcNodes);\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(10000);\n\n            // Query tests\n\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, \"99\", 100);\n            nodes.Count.Should().Be(100);\n            nodes[0].Should().NotBeNull().And.Match<OpcNodeModel>(node => node.DataSetFieldId == \"100\");\n\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                nodes[^1].DataSetFieldId, 10000);\n            nodes[0].Should().NotBeNull().And.Match<OpcNodeModel>(node => node.DataSetFieldId == \"200\");\n            nodes.Count.Should().Be(9800);\n\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                null, 5000);\n            nodes.Count.Should().Be(5000);\n            nodes[0].Should().NotBeNull().And.Match<OpcNodeModel>(node => node.DataSetFieldId == \"0\");\n\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                nodes[^1].DataSetFieldId);\n            nodes[0].Should().NotBeNull().And.Match<OpcNodeModel>(node => node.DataSetFieldId == \"5000\");\n            nodes.Count.Should().Be(5000);\n\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                nodes[^1].DataSetFieldId);\n            nodes.Count.Should().Be(0);\n\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                \"testtesttest\");\n            nodes.Count.Should().Be(0);\n\n            // Remove 200 items\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                \"99\", 200);\n            await configService.RemoveNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                nodes.Select(node => node.DataSetFieldId).ToList());\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                null, 20000);\n            nodes.Count.Should().Be(9800);\n\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                \"99\", 100);\n            nodes.Count.Should().Be(100);\n            nodes[0].Should().NotBeNull().And.Match<OpcNodeModel>(node => node.DataSetFieldId == \"300\");\n\n            // Remove every other\n            await configService.RemoveNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                Enumerable.Range(0, 10000).Where(i => i % 2 == 0).Select(i => $\"{i}\").ToList());\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(4900);\n\n            // Remove something not there\n            await FluentActions\n                .Invoking(async () => await configService.RemoveNodesAsync(writer.DataSetWriterGroup!,\n                    writer.DataSetWriterId!,\n                    Enumerable.Range(0, 10000).Where(i => i % 2 == 0).Select(i => $\"{i}\").ToList()))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Specified nodes not found in dataset\");\n            await FluentActions\n                .Invoking(async () => await configService.RemoveNodesAsync(writer.DataSetWriterGroup!,\n                    writer.DataSetWriterId!, new[] { \"0\" }))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Specified node not found in dataset\");\n\n            // Remove partial\n            await configService.RemoveNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                 new[] { \"0\", \"1\" });\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(4899);\n\n            // Remove all but original\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(1);\n\n            writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            writerResult.DisableSubscriptionTransfer.Should().BeNull();\n            writerResult.OpcNodes.Should().BeNull();\n        }\n\n        [Fact]\n        public async Task TestGetNodeAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfNodes = 3;\n            var opcNodes = Enumerable.Range(0, numberOfNodes)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            writer.OpcNodes = opcNodes;\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            var node = await configService.GetNodeAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, \"1\");\n            node.Should().NotBeNull();\n            node.Id.Should().Be(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\");\n\n            await FluentActions\n                .Invoking(async () => await configService\n                    .GetNodeAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, \"4\"))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Node with id 4 not found.\");\n\n            await configService.RemoveNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, new[] { \"1\" });\n            await FluentActions\n                .Invoking(async () => await configService\n                    .GetNodeAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, \"1\"))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Node with id 1 not found.\");\n\n            node = await configService.GetNodeAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, \"0\");\n            node.Should().NotBeNull();\n            node.Id.Should().Be(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\");\n\n            await configService.RemoveDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            await FluentActions\n                .Invoking(async () => await configService\n                    .GetNodeAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!, \"0\"))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Could not find entry with provided writer id and writer group.\");\n        }\n\n        [Fact]\n        public async Task TestInsertNodesAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfNodes = 3;\n            var opcNodes = Enumerable.Range(0, numberOfNodes)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            var nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!,\n                writer.DataSetWriterId!);\n            nodes.Count.Should().Be(1);\n\n            var i = 1;\n            while (i < 1000)\n            {\n#pragma warning disable CA5394 // Do not use insecure randomness\n                var batchSize = (Random.Shared.Next() % 3) + 1;\n                var offset = Random.Shared.Next() % i;\n#pragma warning restore CA5394 // Do not use insecure randomness\n                opcNodes = Enumerable.Range(i, batchSize)\n                    .Select(i => new OpcNodeModel\n                    {\n                        Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                        DataSetFieldId = $\"{i}\"\n                    })\n                    .ToList();\n                i += batchSize;\n                await configService.AddOrUpdateNodesAsync(writer.DataSetWriterGroup!,\n                    writer.DataSetWriterId!, opcNodes, $\"{offset}\");\n            }\n\n            nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(i);\n\n            await FluentActions\n                .Invoking(async () => await configService\n                    .AddOrUpdateNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!,\n                        opcNodes, $\"{i + 1}\"))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(\"Field to insert after not found.\");\n        }\n\n        [Fact]\n        public async Task AddWithoutDistinctIdsResultsInErrorAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n            var opcNodes = Enumerable.Range(0, 10)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = \"alwaysthesameid\"\n                })\n                .ToList();\n\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            var nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(1);\n\n            await FluentActions\n                .Invoking(async () => await configService.AddOrUpdateNodesAsync(writer.DataSetWriterGroup!,\n                    writer.DataSetWriterId!, opcNodes.Skip(1).ToList()))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Field ids must be present and unique.\");\n        }\n\n        [Fact]\n        public async Task AddWithoutNodeIdResultsInErrorAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n            var opcNodes = Enumerable.Range(0, 10)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"i={i}\",\n                    DataSetFieldId = $\"{i}\"\n                })\n                .ToList();\n\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            var nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(1);\n            opcNodes.ForEach(n => n.Id = null);\n\n            await FluentActions\n                .Invoking(async () => await configService.AddOrUpdateNodesAsync(writer.DataSetWriterGroup!,\n                    writer.DataSetWriterId!, opcNodes.Skip(1).ToList()))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Node must contain a node ID\");\n        }\n\n        [Fact]\n        public async Task AddWithDistinctNodeIdButNoDataSetFieldIdSucceedsAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n            var opcNodes = Enumerable.Range(0, 10)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            var nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(1);\n\n            await configService.AddOrUpdateNodesAsync(writer.DataSetWriterGroup!,\n                    writer.DataSetWriterId!, opcNodes.Skip(1).ToList());\n        }\n\n        [Fact]\n        public async Task RemoveWithoutDistinctIdsResultsInErrorAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n            var opcNodes = Enumerable.Range(0, 10)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = \"alwaysthesameid\"\n                })\n                .ToList();\n\n            // Create writer\n            var writer = GenerateEndpoint(0, opcNodes, false);\n            await configService.CreateOrUpdateDataSetWriterEntryAsync(writer);\n            var writerResult = await configService.GetDataSetWriterEntryAsync(\n                writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n\n            var nodes = await configService.GetNodesAsync(writer.DataSetWriterGroup!, writer.DataSetWriterId!);\n            nodes.Count.Should().Be(1);\n\n            await FluentActions\n                .Invoking(async () => await configService.RemoveNodesAsync(writer.DataSetWriterGroup!,\n                    writer.DataSetWriterId!, new[] { \"1\", \"1\", \"2\" }))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Field ids must be unique.\");\n        }\n\n        [Fact]\n        public async Task StartStopTest1Async()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            await configService.PublishStartAsync(new ConnectionModel\n            {\n                Endpoint = new EndpointModel\n                {\n                    Url = \"opc.tcp://testendpoint1\"\n                }\n            }, new PublishStartRequestModel\n            {\n                Item = new PublishedItemModel\n                {\n                    HeartbeatInterval = TimeSpan.FromMinutes(1),\n                    PublishingInterval = TimeSpan.FromSeconds(2),\n                    NodeId = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\",\n                    DisplayName = \"test\",\n                    SamplingInterval = TimeSpan.FromSeconds(3)\n                }\n            });\n\n            var entries = await configService.GetConfiguredEndpointsAsync(true);\n            entries.Count.Should().Be(1);\n            entries[0].EndpointUrl.Should().Be(\"opc.tcp://testendpoint1\");\n            entries[0].UseSecurity.Should().BeFalse();\n            entries[0].OpcNodes.Count.Should().Be(1);\n            entries[0].MessageEncoding.Should().Be(MessageEncoding.Json);\n            entries[0].MessagingMode.Should().Be(MessagingMode.FullSamples);\n            var node = entries[0].OpcNodes[0];\n            node.Id.Should().Be(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\");\n            node.HeartbeatInterval.Should().BeNull();\n            node.OpcPublishingInterval.Should().BeNull();\n            node.OpcSamplingInterval.Should().BeNull();\n            node.HeartbeatIntervalTimespan.Should().Be(TimeSpan.FromMinutes(1));\n            node.OpcPublishingIntervalTimespan.Should().Be(TimeSpan.FromSeconds(2));\n            node.OpcSamplingIntervalTimespan.Should().Be(TimeSpan.FromSeconds(3));\n\n            var list = await configService.PublishListAsync(new ConnectionModel\n            {\n                Endpoint = new EndpointModel\n                {\n                    Url = \"opc.tcp://testendpoint1\"\n                }\n            }, new PublishedItemListRequestModel());\n\n            list.Items.Count.Should().Be(1);\n            list.Items[0].HeartbeatInterval.Should().Be(node.HeartbeatIntervalTimespan);\n            list.Items[0].PublishingInterval.Should().Be(node.OpcPublishingIntervalTimespan);\n            list.Items[0].SamplingInterval.Should().Be(node.OpcSamplingIntervalTimespan);\n\n            await configService.PublishStopAsync(new ConnectionModel\n            {\n                Endpoint = new EndpointModel\n                {\n                    Url = \"opc.tcp://testendpoint1\"\n                }\n            }, new PublishStopRequestModel\n            {\n                NodeId = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\"\n            });\n\n            entries = await configService.GetConfiguredEndpointsAsync(true);\n            entries.Count.Should().Be(1);\n            entries[0].OpcNodes.Should().BeEmpty();\n\n            list = await configService.PublishListAsync(new ConnectionModel\n            {\n                Endpoint = new EndpointModel\n                {\n                    Url = \"opc.tcp://testendpoint1\"\n                }\n            }, new PublishedItemListRequestModel());\n            list.Items.Should().BeEmpty();\n        }\n\n        [Fact]\n        public async Task StartStopTest2Async()\n        {\n            await using var configService = InitPublisherConfigService();\n            var opcNodes = Enumerable.Range(0, 101)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = \"alwaysthesameid\"\n                })\n                .ToList();\n            var items = Enumerable.Range(1, 100).Select(i => GenerateEndpoint(i, opcNodes, true) with\n            {\n                DataSetWriterGroup = null,\n                MessageEncoding = MessageEncoding.Json,\n                MessagingMode = MessagingMode.FullSamples,\n                DataSetWriterId = null,\n                DataSetPublishingInterval = null\n            }).ToList();\n            await configService.SetConfiguredEndpointsAsync(items);\n\n            var results = await configService.GetConfiguredEndpointsAsync(false);\n            results.Count.Should().Be(100);\n\n            var list = await configService.PublishListAsync(new ConnectionModel\n            {\n                Endpoint = new EndpointModel\n                {\n                    Url = results[0].EndpointUrl\n                }\n            }, new PublishedItemListRequestModel());\n            list.Items.Count.Should().Be(2);\n\n            var updated = list.Items[0] with\n            {\n                HeartbeatInterval = TimeSpan.FromMinutes(1),\n            };\n            // Update\n            await configService.PublishStartAsync(new ConnectionModel\n            {\n                Endpoint = new EndpointModel\n                {\n                    Url = results[0].EndpointUrl\n                }\n            }, new PublishStartRequestModel\n            {\n                Item = updated\n            });\n\n            var entries = await configService.GetConfiguredEndpointsAsync(true);\n            entries.Count.Should().Be(100);\n            var entry = entries.Find(e => e.EndpointUrl == results[0].EndpointUrl);\n            entry.Should().NotBeNull();\n            entry.MessageEncoding.Should().Be(MessageEncoding.Json);\n            entry.MessagingMode.Should().Be(MessagingMode.FullSamples);\n            entry.OpcNodes.Count.Should().Be(2);\n            var node = entry.OpcNodes[0];\n            node.Id.Should().Be(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt0\");\n            node.HeartbeatInterval.Should().BeNull();\n            node.HeartbeatIntervalTimespan.Should().Be(TimeSpan.FromMinutes(1));\n\n            await configService.PublishStopAsync(new ConnectionModel\n            {\n                Endpoint = new EndpointModel\n                {\n                    Url = results[0].EndpointUrl\n                }\n            }, new PublishStopRequestModel\n            {\n                NodeId = updated.NodeId\n            });\n\n            entries = await configService.GetConfiguredEndpointsAsync(true);\n            entries.Count.Should().Be(100);\n            entry = entries.Find(e => e.EndpointUrl == results[0].EndpointUrl);\n            entry.MessageEncoding.Should().Be(MessageEncoding.Json);\n            entry.MessagingMode.Should().Be(MessagingMode.FullSamples);\n            entry.OpcNodes.Count.Should().Be(1);\n        }\n\n        [Fact]\n        public async Task Legacy25PublishedNodesFileAsync()\n        {\n            Utils.CopyContent(\"Publisher/pn_2.5_legacy.json\", _tempFile);\n            await using (var configService = InitPublisherConfigService())\n            {\n                var endpoints = await configService.GetConfiguredEndpointsAsync();\n                Assert.Single(endpoints);\n\n                var endpoint = endpoints[0];\n                Assert.Equal(\"opc.tcp://opcplc:50000\", endpoint.EndpointUrl);\n                Assert.False(endpoint.UseSecurity);\n                Assert.Equal(OpcAuthenticationMode.UsernamePassword, endpoint.OpcAuthenticationMode);\n                Assert.Equal(\"username\", endpoint.OpcAuthenticationUsername);\n                Assert.Null(endpoint.OpcAuthenticationPassword);\n\n                endpoint.OpcAuthenticationPassword = \"password\";\n\n                var nodes = await configService.GetConfiguredNodesOnEndpointAsync(endpoint);\n                Assert.Single(nodes);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\", nodes[0].Id);\n\n                endpoint.OpcNodes =\n                [\n                    new() {\n                        Id = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2\"\n                    }\n                ];\n\n                await configService.PublishNodesAsync(endpoint);\n\n                endpoints = await configService.GetConfiguredEndpointsAsync();\n                Assert.Single(endpoints);\n\n                endpoint.OpcNodes = null;\n                nodes = await configService.GetConfiguredNodesOnEndpointAsync(endpoint);\n                Assert.Equal(2, nodes.Count);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\", nodes[0].Id);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2\", nodes[1].Id);\n            }\n            // Simulate restart.\n            await using (var configService = InitPublisherConfigService())\n            {\n                // We should get the same endpoint and nodes after restart.\n                var endpoints = await configService.GetConfiguredEndpointsAsync();\n                Assert.Single(endpoints);\n\n                var endpoint = endpoints[0];\n                Assert.Equal(\"opc.tcp://opcplc:50000\", endpoint.EndpointUrl);\n                Assert.False(endpoint.UseSecurity);\n                Assert.Equal(OpcAuthenticationMode.UsernamePassword, endpoint.OpcAuthenticationMode);\n                Assert.Equal(\"username\", endpoint.OpcAuthenticationUsername);\n                Assert.Null(endpoint.OpcAuthenticationPassword);\n\n                endpoint.OpcAuthenticationPassword = \"password\";\n\n                var nodes = await configService.GetConfiguredNodesOnEndpointAsync(endpoint);\n                Assert.Equal(2, nodes.Count);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\", nodes[0].Id);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2\", nodes[1].Id);\n            }\n        }\n\n        [Fact]\n        public async Task UpdateConfiguredEndpointsAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n            var opcNodes = Enumerable.Range(0, 101)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\",\n                    DataSetFieldId = \"alwaysthesameid\"\n                })\n                .ToList();\n            var items = Enumerable.Range(1, 100).Select(i => GenerateEndpoint(i, opcNodes, false)).ToList();\n            await configService.SetConfiguredEndpointsAsync(items);\n\n            var results = await configService.GetConfiguredEndpointsAsync(false);\n            results.Count.Should().Be(100);\n\n            await configService.UnpublishAllNodesAsync(results[50]);\n            results = await configService.GetConfiguredEndpointsAsync(false);\n            results.Count.Should().Be(99);\n\n            // purge\n            await configService.UnpublishAllNodesAsync(null);\n            results = await configService.GetConfiguredEndpointsAsync(false);\n            results.Should().BeEmpty();\n        }\n\n        [Fact]\n        public async Task UpdateConfiguredEndpointsWithBrowsePathsAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n            var opcNodes = Enumerable.Range(0, 101)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = null,\n                    BrowsePath = new[]\n                    {\n                        \"Objects\",\n                        \"Telemetry\",\n                        $\"FastUInt{i}\"\n                    },\n                    DataSetFieldId = \"alwaysthesameid\"\n                })\n                .ToList();\n            var items = Enumerable.Range(1, 100).Select(i => GenerateEndpoint(i, opcNodes, false)).ToList();\n            await configService.SetConfiguredEndpointsAsync(items);\n\n            var results = await configService.GetConfiguredEndpointsAsync(false);\n            results.Count.Should().Be(100);\n\n            await configService.UnpublishAllNodesAsync(results[50]);\n            results = await configService.GetConfiguredEndpointsAsync(false);\n            results.Count.Should().Be(99);\n\n            // purge\n            await configService.UnpublishAllNodesAsync(new PublishedNodesEntryModel { EndpointUrl = null! });\n            results = await configService.GetConfiguredEndpointsAsync(false);\n            results.Should().BeEmpty();\n        }\n\n        [Fact]\n        public async Task Legacy25PublishedNodesFileErrorAsync()\n        {\n            Utils.CopyContent(\"Publisher/pn_2.5_legacy_error.json\", _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            // Transformation of published nodes entries should throw a serialization error since\n            // Engine/pn_2.5_legacy_error.json contains both NodeId and OpcNodes.\n            // So as a result, we should end up with zero endpoints.\n            var endpoints = await configService.GetConfiguredEndpointsAsync();\n            Assert.Empty(endpoints);\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/pn_assets.json\")]\n        [InlineData(\"Publisher/pn_assets_with_optional_fields.json\")]\n        public void TestPnJsonWithMultipleJobsExpectDifferentJobIds(string publishedNodesFile)\n        {\n            Utils.CopyContent(publishedNodesFile, _tempFile);\n            using var configService = InitPublisherConfigService();\n            Assert.Equal(2, _publisher.WriterGroups.Count);\n        }\n\n        [Fact]\n        public async Task TestSerializableExceptionResponseAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 1;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            var endpoints = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => GenerateEndpoint(i, opcNodes, false))\n                .ToList();\n\n            await configService.PublishNodesAsync(endpoints[0]);\n\n            const string details = \"{\\\"DataSetWriterId\\\":\\\"DataSetWriterId0\\\",\\\"DataSetWriterGroup\\\":\\\"DataSetWriterGroup\\\",\\\"OpcNodes\\\":[{\\\"Id\\\":\\\"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowUInt0\\\",\\\"OpcPublishingIntervalTimespan\\\":\\\"00:00:01\\\"}],\\\"EndpointUrl\\\":\\\"opc.tcp://opcplc:50000\\\",\\\"UseSecurity\\\":null,\\\"OpcAuthenticationMode\\\":\\\"anonymous\\\"}\";\n            const string exceptionResponse = \"Nodes not found: \\n\" + details;\n            var opcNodes1 = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=SlowUInt{i}\"\n                })\n                .ToList();\n            var endpointsToDelete = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => GenerateEndpoint(i, opcNodes1, false))\n                .ToList();\n\n            // try to unpublish a not published nodes.\n            await FluentActions\n                .Invoking(async () => await configService.UnpublishNodesAsync(endpointsToDelete[0]))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage(exceptionResponse);\n        }\n\n        [Fact]\n        public async Task TestPublishNodesEmptyAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            var request = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://opcplc:50000\"\n            };\n\n            // Check null OpcNodes in request.\n            await FluentActions\n                .Invoking(async () => await configService\n                    .PublishNodesAsync(request))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"null or empty OpcNodes is provided in request\");\n\n            request.OpcNodes = [];\n\n            // Check empty OpcNodes in request.\n            await FluentActions\n                .Invoking(async () => await configService\n                    .PublishNodesAsync(request))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"null or empty OpcNodes is provided in request\");\n        }\n\n        [Theory]\n        [InlineData(false, false)]\n        [InlineData(false, true)]\n        [InlineData(true, false)]\n        [InlineData(true, true)]\n        public async Task TestUnpublishNodesEmptyOpcNodesAsync(\n            bool useEmptyOpcNodes,\n            bool customEndpoint)\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            var endpoints = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => GenerateEndpoint(i, opcNodes, customEndpoint))\n                .ToList();\n\n            await configService.PublishNodesAsync(endpoints[0]);\n            await configService.PublishNodesAsync(endpoints[1]);\n            await configService.PublishNodesAsync(endpoints[2]);\n\n            endpoints[1] = GenerateEndpoint(1, opcNodes, customEndpoint);\n            endpoints[1].OpcNodes = useEmptyOpcNodes\n                ? new List<OpcNodeModel>()\n                : null;\n\n            // Check null or empty OpcNodes in request.\n            await FluentActions\n                .Invoking(async () => await configService\n                    .UnpublishNodesAsync(endpoints[1]))\n                .Should()\n                .NotThrowAsync();\n\n            var configuredEndpoints = await configService\n                .GetConfiguredEndpointsAsync();\n\n            Assert.Equal(2, configuredEndpoints.Count);\n\n            Assert.True(endpoints[0].HasSameDataSet(configuredEndpoints[0]));\n            Assert.True(endpoints[2].HasSameDataSet(configuredEndpoints[1]));\n        }\n\n        [Fact]\n        public async Task TestAddOrUpdateEndpointsMultipleEndpointEntriesAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            var endpoints = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => GenerateEndpoint(i, opcNodes, false))\n                .ToList();\n\n            // Make endpoint at index 0 and 2 the same.\n            endpoints[2].DataSetWriterId = endpoints[0].DataSetWriterId;\n            endpoints[2].DataSetWriterGroup = endpoints[0].DataSetWriterGroup;\n            endpoints[2].DataSetPublishingInterval = endpoints[0].DataSetPublishingInterval;\n\n            // The call should throw an exception.\n            await FluentActions\n                .Invoking(async () => await configService\n                    .AddOrUpdateEndpointsAsync(endpoints))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Request contains two entries for the same endpoint at index 0 and 2\");\n        }\n\n        [Fact]\n        public async Task TestAddOrUpdateEndpointsWithNonDefaultWriterGroupTransportAndSecurityAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            var endpoints = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => GenerateEndpoint(i, opcNodes, false))\n                .ToList();\n\n            endpoints.ForEach(ep => ep.WriterGroupTransport = WriterGroupTransport.FileSystem);\n            endpoints.ForEach(ep => ep.EndpointSecurityMode = SecurityMode.Best);\n\n            await configService.AddOrUpdateEndpointsAsync(endpoints);\n\n            var configuredEndpoints = await configService.GetConfiguredEndpointsAsync();\n            Assert.All(configuredEndpoints, ep =>\n            {\n                Assert.Equal(WriterGroupTransport.FileSystem, ep.WriterGroupTransport);\n                Assert.Equal(SecurityMode.Best, ep.EndpointSecurityMode);\n            });\n        }\n\n        [Fact]\n        public async Task TestAddOrUpdateEndpointsMultipleEndpointEntriesTimespanAsync()\n        {\n            await using var configService = InitPublisherConfigService();\n\n            const int numberOfEndpoints = 3;\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            var endpoints = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => GenerateEndpoint(i, opcNodes, false))\n                .ToList();\n\n            endpoints.ForEach(e =>\n                e.DataSetPublishingIntervalTimespan =\n                TimeSpan.FromMilliseconds(e.DataSetPublishingInterval ?? 1000));\n\n            // Make endpoint at index 0 and 2 the same.\n            endpoints[2].DataSetWriterId = endpoints[0].DataSetWriterId;\n            endpoints[2].DataSetWriterGroup = endpoints[0].DataSetWriterGroup;\n            endpoints[2].DataSetPublishingIntervalTimespan = endpoints[0].DataSetPublishingIntervalTimespan;\n\n            // The call should throw an exception.\n            await FluentActions\n                .Invoking(async () => await configService\n                    .AddOrUpdateEndpointsAsync(endpoints))\n                .Should()\n                .ThrowAsync<BadRequestException>()\n                .WithMessage(\"Request contains two entries for the same endpoint at index 0 and 2\");\n        }\n\n        [Theory]\n        [InlineData(false)]\n        [InlineData(true)]\n        public async Task TestAddOrUpdateEndpointsAddEndpointsAsync(\n            bool useDataSetSpecificEndpoints\n        )\n        {\n            _options.Value.MaxNodesPerDataSet = 2;\n\n            await using var configService = InitPublisherConfigService();\n\n            Assert.Empty(_publisher.WriterGroups);\n\n            const int numberOfEndpoints = 3;\n\n            var opcNodes = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            var endpoints = Enumerable.Range(0, numberOfEndpoints)\n                .Select(i => GenerateEndpoint(i, opcNodes, useDataSetSpecificEndpoints))\n                .ToList();\n\n            var tasks = new List<Task>();\n            for (var i = 0; i < numberOfEndpoints; i++)\n            {\n                tasks.Add(configService.AddOrUpdateEndpointsAsync(\n                    new List<PublishedNodesEntryModel> { endpoints[i] }));\n            }\n\n            await Task.WhenAll(tasks);\n\n            for (var i = 0; i < numberOfEndpoints; i++)\n            {\n                var endpointNodes = await configService\n                    .GetConfiguredNodesOnEndpointAsync(endpoints[i]);\n\n                AssertSameNodes(endpoints[i], endpointNodes);\n            }\n\n            Assert.Single(_publisher.WriterGroups);\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/pn_events.json\")]\n        [InlineData(\"Publisher/pn_pending_alarms.json\")]\n        [InlineData(\"Publisher/empty_pn.json\")]\n        [InlineData(\"Publisher/pn_assets.json\")]\n        [InlineData(\"Publisher/pn_assets_with_optional_fields.json\")]\n        [InlineData(\"Publisher/publishednodes.json\")]\n        [InlineData(\"Publisher/publishednodeswithoptionalfields.json\")]\n        [InlineData(\"Publisher/publishednodes_with_duplicates.json\")]\n        public async Task TestAddOrUpdateEndpointsRemoveEndpointsAsync(string publishedNodesFile)\n        {\n            Utils.CopyContent(publishedNodesFile, _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            var payload = Utils.GetFileContent(publishedNodesFile);\n            var payloadRequests = _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(payload);\n\n            var index = 0;\n            foreach (var request in payloadRequests)\n            {\n                request.OpcNodes = index % 2 == 0\n                    ? null\n                    : new List<OpcNodeModel>();\n                ++index;\n\n                var shouldThrow = !_publishedNodesJobConverter.ToPublishedNodes(0, default, _publisher.WriterGroups)\n                    .Select(p => p.PropagatePublishingIntervalToNodes())\n                    .Any(dataSet => dataSet.HasSameDataSet(request.PropagatePublishingIntervalToNodes()));\n                if (shouldThrow)\n                {\n                    await FluentActions\n                        .Invoking(async () => await configService\n                            .AddOrUpdateEndpointsAsync(new List<PublishedNodesEntryModel> { request }))\n                        .Should()\n                        .ThrowAsync<ResourceNotFoundException>()\n                        .WithMessage($\"Endpoint not found: {request.EndpointUrl}\");\n                }\n                else\n                {\n                    await FluentActions\n                        .Invoking(async () => await configService\n                            .AddOrUpdateEndpointsAsync(new List<PublishedNodesEntryModel> { request }))\n                        .Should()\n                        .NotThrowAsync();\n                }\n            }\n\n            var configuredEndpoints = await configService\n                .GetConfiguredEndpointsAsync();\n            Assert.Empty(configuredEndpoints);\n        }\n\n        [Fact]\n        public async Task TestAddOrUpdateEndpointsAddAndRemoveAsync()\n        {\n            _options.Value.MaxNodesPerDataSet = 2;\n\n            await using var configService = InitPublisherConfigService();\n\n            Assert.Empty(_publisher.WriterGroups);\n\n            var opcNodes = Enumerable.Range(0, 5)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            var endpoints = Enumerable.Range(0, 5)\n                .Select(i => GenerateEndpoint(i, opcNodes))\n                .ToList();\n\n            var tasks = new List<Task>();\n            for (var i = 0; i < 3; i++)\n            {\n                tasks.Add(configService.PublishNodesAsync(endpoints[i]));\n            }\n\n            await Task.WhenAll(tasks);\n\n            for (var i = 0; i < 3; i++)\n            {\n                var endpointNodes = await configService\n                    .GetConfiguredNodesOnEndpointAsync(endpoints[i]);\n\n                AssertSameNodes(endpoints[i], endpointNodes);\n            }\n\n            // Helper method.\n            async Task AssertGetConfiguredNodesOnEndpointThrows(\n                PublishedNodesJsonServices publisherConfigurationService,\n                PublishedNodesEntryModel endpoint\n            )\n            {\n                await FluentActions\n                    .Invoking(async () => await publisherConfigurationService\n                        .GetConfiguredNodesOnEndpointAsync(endpoint))\n                    .Should()\n                    .ThrowAsync<ResourceNotFoundException>()\n                    .WithMessage($\"Endpoint not found: {endpoint.EndpointUrl}\");\n            }\n\n            // Those calls should throw.\n            for (var i = 3; i < 5; i++)\n            {\n                await AssertGetConfiguredNodesOnEndpointThrows(configService, endpoints[i]);\n            }\n\n            var updateRequest = Enumerable.Range(0, 5)\n                .Select(i => GenerateEndpoint(i, opcNodes))\n                .ToList();\n            updateRequest[0].OpcNodes = null; // Should result in endpoint deletion.\n            updateRequest[1].OpcNodes = []; // Should result in endpoint deletion.\n            updateRequest[2].OpcNodes = [.. opcNodes.GetRange(0, 4)];\n            updateRequest[3].OpcNodes = null; // Should throw as endpoint does not exist.\n\n            // Should throw as updateRequest[3] endpoint is not present in current configuratoin.\n            await FluentActions\n                .Invoking(async () => await configService\n                    .AddOrUpdateEndpointsAsync(updateRequest))\n                .Should()\n                .ThrowAsync<ResourceNotFoundException>()\n                .WithMessage($\"Endpoint not found: {updateRequest[3].EndpointUrl}\");\n\n            updateRequest.RemoveAt(3);\n            await configService.AddOrUpdateEndpointsAsync(updateRequest);\n\n            // Check endpoint 0.\n            await AssertGetConfiguredNodesOnEndpointThrows(configService, endpoints[0]);\n\n            // Check endpoint 1.\n            await AssertGetConfiguredNodesOnEndpointThrows(configService, endpoints[1]);\n\n            // Check endpoint 2.\n            var endpointNodes2 = await configService\n                .GetConfiguredNodesOnEndpointAsync(endpoints[2]);\n\n            AssertSameNodes(updateRequest[2], endpointNodes2);\n\n            // Check endpoint 3.\n            await AssertGetConfiguredNodesOnEndpointThrows(configService, endpoints[3])\n;\n\n            // Check endpoint 4.\n            var endpointNodes4 = await configService\n                .GetConfiguredNodesOnEndpointAsync(endpoints[4]);\n\n            AssertSameNodes(updateRequest[3], endpointNodes4);\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/pn_opc_nodes_empty.json\")]\n        [InlineData(\"Publisher/pn_opc_nodes_null.json\")]\n        public async Task TestInitStandaloneJobOrchestratorFromEmptyOpcNodes1Async(string publishedNodesFile)\n        {\n            Utils.CopyContent(publishedNodesFile, _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            // Behavior change in 2.9.10 we now allow empty entries\n            var configuredEndpoints = await configService.GetConfiguredEndpointsAsync();\n            Assert.Single(configuredEndpoints);\n\n            // There should also not be any job entries.\n            var group = Assert.Single(_publisher.WriterGroups);\n            var writer = Assert.Single(group.DataSetWriters);\n            Assert.Empty(writer.DataSet.DataSetSource.PublishedVariables.PublishedData);\n        }\n\n        [Fact]\n        public async Task TestInitStandaloneJobOrchestratorFromEmptyOpcNodes2Async()\n        {\n            Utils.CopyContent(\"Publisher/pn_opc_nodes_empty_and_null.json\", _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            // Behavior change in 2.9.10 we now allow empty entries\n            var configuredEndpoints = await configService.GetConfiguredEndpointsAsync();\n            Assert.Equal(2, configuredEndpoints.Count);\n\n            // There should also not be any job entries.\n            Assert.Equal(2, _publisher.WriterGroups.Count);\n            Assert.All(_publisher.WriterGroups\n                .Select(d => d.DataSetWriters), writers =>\n                {\n                    var writer = Assert.Single(writers);\n                    Assert.Empty(writer.DataSet.DataSetSource.PublishedVariables.PublishedData);\n                });\n        }\n\n        [Fact]\n        public async Task OptionalFieldsPublishedNodesFileAsync()\n        {\n            Utils.CopyContent(\"Publisher/pn_assets_with_optional_fields.json\", _tempFile);\n            await using (var configService = InitPublisherConfigService())\n            {\n                var endpoints = await configService.GetConfiguredEndpointsAsync();\n                Assert.Equal(2, endpoints.Count);\n\n                Assert.Equal(\"Leaf0\", endpoints[0].DataSetWriterGroup);\n                Assert.Equal(\"opc.tcp://opcplc:50000\", endpoints[0].EndpointUrl);\n                Assert.False(endpoints[0].UseSecurity);\n                Assert.Equal(OpcAuthenticationMode.Anonymous, endpoints[0].OpcAuthenticationMode);\n                Assert.Equal(\"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\", endpoints[0].DataSetWriterId);\n                Assert.Equal(\"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\", endpoints[0].DataSetName);\n\n                Assert.Equal(\"Leaf1\", endpoints[1].DataSetWriterGroup);\n                Assert.Equal(\"opc.tcp://opcplc:50000\", endpoints[1].EndpointUrl);\n                Assert.False(endpoints[1].UseSecurity);\n                Assert.Equal(OpcAuthenticationMode.UsernamePassword, endpoints[1].OpcAuthenticationMode);\n                Assert.Equal(\"Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\", endpoints[1].DataSetWriterId);\n                Assert.Equal(\"Tag_Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\", endpoints[1].DataSetName);\n                endpoints[0].OpcNodes = null;\n                var nodes = await configService.GetConfiguredNodesOnEndpointAsync(endpoints[0]);\n                Assert.Single(nodes);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\", nodes[0].Id);\n\n                endpoints[0].OpcNodes =\n                [\n                    new() {\n                        Id = \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2\"\n                    }\n                ];\n\n                await configService.PublishNodesAsync(endpoints[0]);\n\n                endpoints = await configService.GetConfiguredEndpointsAsync();\n                Assert.Single(endpoints);\n\n                endpoints[0].OpcNodes = null;\n                nodes = await configService.GetConfiguredNodesOnEndpointAsync(endpoints[0]);\n                Assert.Equal(2, nodes.Count);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\", nodes[0].Id);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2\", nodes[1].Id);\n            }\n            // Simulate restart.\n            await using (var configService = InitPublisherConfigService())\n            {\n                // We should get the same endpoint and nodes after restart.\n                var endpoints = await configService.GetConfiguredEndpointsAsync();\n                Assert.Single(endpoints);\n\n                Assert.Equal(\"Leaf0\", endpoints[0].DataSetWriterGroup);\n                Assert.Equal(\"opc.tcp://opcplc:50000\", endpoints[0].EndpointUrl);\n                Assert.False(endpoints[0].UseSecurity);\n                Assert.Equal(OpcAuthenticationMode.Anonymous, endpoints[0].OpcAuthenticationMode);\n                Assert.Equal(\"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\", endpoints[0].DataSetWriterId);\n                Assert.Equal(\"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\", endpoints[0].DataSetName);\n\n                var nodes = await configService.GetConfiguredNodesOnEndpointAsync(endpoints[0]);\n                Assert.Equal(2, nodes.Count);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\", nodes[0].Id);\n                Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2\", nodes[1].Id);\n            }\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/publishednodes.json\")]\n        [InlineData(\"Publisher/publishednodeswithoptionalfields.json\")]\n        [InlineData(\"Publisher/pn_assets.json\")]\n        [InlineData(\"Publisher/pn_assets_with_optional_fields.json\")]\n        [InlineData(\"Publisher/pn_events.json\")]\n        [InlineData(\"Publisher/pn_pending_alarms.json\")]\n        public async Task PublishNodesOnEmptyConfigurationAsync(string publishedNodesFile)\n        {\n            Utils.CopyContent(\"Publisher/empty_pn.json\", _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            var payload = Utils.GetFileContent(publishedNodesFile);\n            foreach (var request in _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(payload))\n            {\n                await FluentActions\n                    .Invoking(async () => await configService.PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            _publisher.WriterGroups.Count\n                .Should()\n                .Be(1);\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/publishednodes.json\", \"Publisher/publishednodeswithoptionalfields.json\")]\n        [InlineData(\"Publisher/publishednodeswithoptionalfields.json\", \"Publisher/publishednodes.json\")]\n        [InlineData(\"Publisher/pn_assets.json\", \"Publisher/pn_assets_with_optional_fields.json\")]\n        [InlineData(\"Publisher/pn_assets_with_optional_fields.json\", \"Publisher/pn_assets.json\")]\n        [InlineData(\"Publisher/pn_events.json\", \"Publisher/pn_pending_alarms.json\")]\n        public async Task PublishNodesOnExistingConfigurationAsync(string existingConfig, string newConfig)\n        {\n            Utils.CopyContent(existingConfig, _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            var payload = Utils.GetFileContent(newConfig);\n            foreach (var request in _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(payload))\n            {\n                await FluentActions\n                    .Invoking(async () => await configService.PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            _publisher.WriterGroups.Count\n                .Should()\n                .Be(1);\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/publishednodes.json\", \"Publisher/pn_assets.json\")]\n        [InlineData(\"Publisher/publishednodeswithoptionalfields.json\", \"Publisher/pn_assets_with_optional_fields.json\")]\n        [InlineData(\"Publisher/pn_assets.json\", \"Publisher/publishednodes.json\")]\n        [InlineData(\"Publisher/pn_assets_with_optional_fields.json\", \"Publisher/publishednodeswithoptionalfields.json\")]\n        public async Task PublishNodesOnNewConfigurationAsync(string existingConfig, string newConfig)\n        {\n            Utils.CopyContent(existingConfig, _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            var payload = Utils.GetFileContent(newConfig);\n            foreach (var request in _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(payload))\n            {\n                await FluentActions\n                    .Invoking(async () => await configService.PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            _publisher.WriterGroups.Count\n                .Should()\n                .Be(1);\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/publishednodes.json\")]\n        [InlineData(\"Publisher/publishednodeswithoptionalfields.json\")]\n        [InlineData(\"Publisher/pn_assets.json\")]\n        [InlineData(\"Publisher/pn_assets_with_optional_fields.json\")]\n        public async Task UnpublishNodesOnExistingConfigurationAsync(string publishedNodesFile)\n        {\n            Utils.CopyContent(publishedNodesFile, _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            var payload = Utils.GetFileContent(publishedNodesFile);\n            foreach (var request in _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(payload))\n            {\n                await FluentActions\n                    .Invoking(async () => await configService.UnpublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            _publisher.WriterGroups.Count\n                .Should()\n                .Be(0);\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/publishednodes.json\", \"Publisher/pn_assets.json\")]\n        [InlineData(\"Publisher/publishednodeswithoptionalfields.json\", \"Publisher/pn_assets_with_optional_fields.json\")]\n        [InlineData(\"Publisher/pn_assets.json\", \"Publisher/publishednodes.json\")]\n        [InlineData(\"Publisher/pn_assets_with_optional_fields.json\", \"Publisher/publishednodeswithoptionalfields.json\")]\n        public async Task UnpublishNodesOnNonExistingConfigurationAsync(string existingConfig, string newConfig)\n        {\n            Utils.CopyContent(existingConfig, _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            var payload = Utils.GetFileContent(newConfig);\n            foreach (var request in _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(payload))\n            {\n                await FluentActions\n                    .Invoking(async () => await configService.UnpublishNodesAsync(request))\n                    .Should()\n                    .ThrowAsync<ResourceNotFoundException>()\n                    .WithMessage($\"Endpoint not found: {request.EndpointUrl}\");\n            }\n\n            _publisher.WriterGroups.Sum(writerGroup => writerGroup.DataSetWriters.Count)\n                .Should()\n                .Be(2);\n        }\n\n        [Theory]\n        [InlineData(2, 10)]\n        // [InlineData(100, 1000)]\n        public async Task PublishNodesStressTestAsync(int numberOfEndpoints, int numberOfNodes)\n        {\n            await using (var fileStream = new FileStream(_tempFile, FileMode.Open, FileAccess.Write))\n            {\n                fileStream.Write(Encoding.UTF8.GetBytes(\"[]\"));\n            }\n            await using var configService = InitPublisherConfigService();\n\n            var payload = new List<PublishedNodesEntryModel>();\n            for (var endpointIndex = 0; endpointIndex < numberOfEndpoints; ++endpointIndex)\n            {\n                var model = new PublishedNodesEntryModel\n                {\n                    EndpointUrl = $\"opc.tcp://server{endpointIndex}:49580\",\n                    OpcNodes = []\n                };\n                for (var nodeIndex = 0; nodeIndex < numberOfNodes; ++nodeIndex)\n                {\n                    model.OpcNodes.Add(new OpcNodeModel\n                    {\n                        Id = $\"ns=2;s=Node-Server-{nodeIndex}\"\n                    });\n                }\n\n                payload.Add(model);\n            }\n\n            // Publish all nodes.\n            foreach (var request in payload)\n            {\n                await FluentActions\n                    .Invoking(async () => await configService.PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            void CheckEndpointsAndNodes(\n                int expectedNumberOfEndpoints,\n                int expectedNumberOfNodesPerEndpoint\n            )\n            {\n                var writerGroups = _publisher.WriterGroups;\n                writerGroups\n                    .SelectMany(writerGroup => writerGroup.DataSetWriters)\n                    .Count(v => v.DataSet.DataSetSource.PublishedVariables.PublishedData.Count == expectedNumberOfNodesPerEndpoint)\n                    .Should()\n                    .Be(expectedNumberOfEndpoints);\n            }\n\n            // Check\n            CheckEndpointsAndNodes(numberOfEndpoints, numberOfNodes);\n\n            // Publish one more node for each endpoint.\n            var payloadDiff = new List<PublishedNodesEntryModel>();\n            for (var endpointIndex = 0; endpointIndex < numberOfEndpoints; ++endpointIndex)\n            {\n                var model = new PublishedNodesEntryModel\n                {\n                    EndpointUrl = $\"opc.tcp://server{endpointIndex}:49580\",\n                    OpcNodes = [\n                        new() {\n                            Id = $\"ns=2;s=Node-Server-{numberOfNodes}\"\n                        }\n                    ]\n                };\n\n                payloadDiff.Add(model);\n            }\n\n            foreach (var request in payloadDiff)\n            {\n                await FluentActions\n                    .Invoking(async () => await configService.PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            // Check\n            CheckEndpointsAndNodes(numberOfEndpoints, numberOfNodes + 1);\n\n            // Unpublish new nodes for each endpoint.\n            foreach (var request in payloadDiff)\n            {\n                await FluentActions\n                    .Invoking(async () => await configService.UnpublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            // Check\n            CheckEndpointsAndNodes(numberOfEndpoints, numberOfNodes);\n        }\n\n        private static PublishedNodesEntryModel GenerateEndpoint(\n            int dataSetIndex,\n            List<OpcNodeModel> opcNodes,\n            bool customEndpoint = false\n        )\n        {\n            return new PublishedNodesEntryModel\n            {\n                EndpointUrl = customEndpoint\n                    ? $\"opc.tcp://opcplc:{50000 + dataSetIndex}\"\n                    : \"opc.tcp://opcplc:50000\",\n                DataSetWriterId = $\"DataSetWriterId{dataSetIndex}\",\n                DataSetWriterGroup = \"DataSetWriterGroup\",\n                DataSetPublishingInterval = (dataSetIndex + 1) * 1000,\n                OpcNodes = [.. opcNodes.GetRange(0, dataSetIndex + 1)]\n            };\n        }\n\n        private static void AssertSameNodes(PublishedNodesEntryModel endpoint, List<OpcNodeModel> nodes)\n        {\n            endpoint.PropagatePublishingIntervalToNodes();\n            Assert.True(endpoint.OpcNodes.SetEqualsSafe(nodes, (a, b) => a.IsSame(b)));\n        }\n\n        private readonly NewtonsoftJsonSerializer _newtonSoftJsonSerializer;\n        private readonly ILoggerFactory _loggerFactory;\n        private readonly PublishedNodesConverter _publishedNodesJobConverter;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly PublishedNodesProvider _publishedNodesProvider;\n        private readonly Mock<IWriterGroupControl> _triggerMock;\n        private readonly PublisherService _publisher;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/RuntimeStateReporterTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using FluentAssertions;\n    using Furly;\n    using Furly.Extensions.Logging;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Furly.Extensions.Storage.Services;\n    using Microsoft.Extensions.Configuration;\n    using Moq;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class RuntimeStateReporterTests\n    {\n        [Fact]\n        public async Task ReportingDisabledTestAsync()\n        {\n            var client = new Mock<IEventClient>();\n            var collector = new Mock<IDiagnosticCollector>();\n\n            IJsonSerializer _serializer = new NewtonsoftJsonSerializer();\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            // This will disable state reporting.\n            options.Value.EnableRuntimeStateReporting = false;\n\n            var _logger = Log.Console<RuntimeStateReporter>();\n\n            using var runtimeStateReporter = new RuntimeStateReporter(\n                client.Object.YieldReturn(),\n                _serializer,\n                new MemoryKVStore().YieldReturn(),\n                options,\n                collector.Object,\n                _logger);\n\n            await FluentActions\n                .Invoking(async () => await runtimeStateReporter.SendRestartAnnouncementAsync(default))\n                .Should()\n                .NotThrowAsync()\n                ;\n            client.Verify(c => c.CreateEvent(), Times.Never());\n        }\n\n        [Fact]\n        public async Task ClientNotInitializedTestAsync()\n        {\n            var client = new Mock<IEventClient>();\n            var collector = new Mock<IDiagnosticCollector>();\n            client.Setup(m => m.CreateEvent()).Throws<IOException>();\n\n            IJsonSerializer _serializer = new NewtonsoftJsonSerializer();\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.EnableRuntimeStateReporting = true;\n\n            var _logger = Log.Console<RuntimeStateReporter>();\n\n            using var runtimeStateReporter = new RuntimeStateReporter(\n                client.Object.YieldReturn(),\n                _serializer,\n                new MemoryKVStore().YieldReturn(),\n                options,\n                collector.Object,\n                _logger);\n\n            await FluentActions\n                .Invoking(async () => await runtimeStateReporter.SendRestartAnnouncementAsync(default))\n                .Should()\n                .NotThrowAsync()\n                ;\n        }\n\n        [Fact]\n        public async Task ReportingTestAsync()\n        {\n            var _client = new Mock<IEventClient>();\n            var collector = new Mock<IDiagnosticCollector>();\n\n            var _message = new Mock<IEvent>()\n                .SetupAllProperties();\n            _message\n                .Setup(m => m.Dispose());\n            _client\n                .Setup(c => c.CreateEvent())\n                .Returns(_message.Object);\n            _message\n                .Setup(c => c.SendAsync(It.IsAny<CancellationToken>()))\n                .Returns(ValueTask.CompletedTask);\n\n            var contentType = string.Empty;\n            var contentEncoding = string.Empty;\n            var routingInfo = string.Empty;\n            List<ReadOnlySequence<byte>> buffers = null;\n            _message.Setup(c => c.SetRetain(It.Is<bool>(v => v)))\n                .Returns(_message.Object);\n            _message.Setup(c => c.AddProperty(It.IsAny<string>(), It.IsAny<string>()))\n                .Callback<string, string>((k, v) =>\n                {\n                    if (k == OpcUa.Constants.MessagePropertyRoutingKey)\n                    {\n                        routingInfo = v;\n                    }\n                })\n                .Returns(_message.Object);\n            _message.Setup(c => c.SetContentType(It.IsAny<string>()))\n                .Callback<string>(v => contentType = v)\n                .Returns(_message.Object);\n            _message.Setup(c => c.SetContentEncoding(It.IsAny<string>()))\n                .Callback<string>(v => contentEncoding = v)\n                .Returns(_message.Object);\n            _message.Setup(c => c.AddBuffers(It.IsAny<IEnumerable<ReadOnlySequence<byte>>>()))\n                .Callback<IEnumerable<ReadOnlySequence<byte>>>(v => buffers = v.ToList())\n                .Returns(_message.Object);\n            _message.Setup(c => c.SetTopic(It.IsAny<string>()))\n                .Returns(_message.Object);\n\n            IJsonSerializer _serializer = new NewtonsoftJsonSerializer();\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.EnableRuntimeStateReporting = true;\n            options.Value.RuntimeStateRoutingInfo = \"runtimeinfo\";\n\n            var _logger = Log.Console<RuntimeStateReporter>();\n\n            using var runtimeStateReporter = new RuntimeStateReporter(\n                _client.Object.YieldReturn(),\n                _serializer,\n                new MemoryKVStore().YieldReturn(),\n                options,\n                collector.Object,\n                _logger);\n\n            await FluentActions\n                .Invoking(async () => await runtimeStateReporter.SendRestartAnnouncementAsync(default))\n                .Should()\n                .NotThrowAsync()\n                ;\n\n            _message.Verify(c => c.SendAsync(It.IsAny<CancellationToken>()), Times.Once());\n            _message.Verify(m => m.Dispose(), Times.Once());\n\n            Assert.Equal(\"runtimeinfo\", routingInfo);\n            Assert.Equal(ContentMimeType.Json, contentType);\n            Assert.Equal(Encoding.UTF8.WebName, contentEncoding);\n\n            Assert.Single(buffers);\n            var body = Encoding.UTF8.GetString(buffers[0].FirstSpan);\n            Assert.StartsWith(\"{\\\"MessageType\\\":\\\"RestartAnnouncement\\\",\\\"MessageVersion\\\":1,\\\"TimestampUtc\\\":\", body, StringComparison.Ordinal);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/SimpleEvents/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.SimpleEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests : IClassFixture<SimpleEventsServer>\n    {\n        public NodeServicesTests(SimpleEventsServer server, ITestOutputHelper output)\n        {\n            _output = output;\n            _server = server;\n        }\n\n        private SimpleEventsServerTests<ConnectionModel> GetTests()\n        {\n            return new SimpleEventsServerTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly ITestOutputHelper _output;\n        private readonly SimpleEventsServer _server;\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleEventsQueryTestAsync()\n        {\n            return GetTests().CompileSimpleEventsQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/BrowsePathTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class BrowsePathTests\n    {\n        public BrowsePathTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private BrowsePathTests<ConnectionModel> GetTests()\n        {\n            return new BrowsePathTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test3Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethodsTestAsync()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethodsTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/BrowseStreamTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class BrowseStreamTests\n    {\n        public BrowseStreamTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private BrowseStreamTests<ConnectionModel> GetTests()\n        {\n            return new BrowseStreamTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            return GetTests().NodeBrowseInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            return GetTests().NodeBrowseInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter3Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter4Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter5Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter5Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsInfoTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class BrowseTests\n    {\n        public BrowseTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private BrowseServicesTests<ConnectionModel> GetTests()\n        {\n            return new BrowseServicesTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            return GetTests().NodeBrowseInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            return GetTests().NodeBrowseInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest1Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest2Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest3Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest4Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test1Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test2Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesWithValuesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesWithValuesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesRawModeTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesRawModeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest1Async()\n        {\n            return GetTests().NodeBrowseContinuationTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest2Async()\n        {\n            return GetTests().NodeBrowseContinuationTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest3Async()\n        {\n            return GetTests().NodeBrowseContinuationTest3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest4Async()\n        {\n            return GetTests().NodeBrowseContinuationTest4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsInfoTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/CallArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class CallArrayTests\n    {\n        public CallArrayTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test5Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/CallScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class CallScalarTests\n    {\n        public CallScalarTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test5Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler2ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler2ResetTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler1ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler1ResetTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/ExpandTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ExpandTests1\n    {\n        public ExpandTests1(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private ConfigurationTests1 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new ConfigurationTests1(new ConfigurationServices(null!, _server.Client,\n                new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                _output.BuildLoggerFor<ConfigurationServices>(Logging.Level)),\n                _server.GetConnection());\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task ExpandObjectWithBrowsePathTest1Async()\n        {\n            return GetTests().ExpandObjectWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithBrowsePathTest2Async()\n        {\n            return GetTests().ExpandObjectWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectTest1Async()\n        {\n            return GetTests().ExpandObjectTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectTest2Async()\n        {\n            return GetTests().ExpandObjectTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest1Async()\n        {\n            return GetTests().ExpandServerObjectTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest2Async()\n        {\n            return GetTests().ExpandServerObjectTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest3Async()\n        {\n            return GetTests().ExpandServerObjectTest3Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest4Async()\n        {\n            return GetTests().ExpandServerObjectTest4Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest5Async()\n        {\n            return GetTests().ExpandServerObjectTest5Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectTypeTest1Async()\n        {\n            return GetTests().ExpandBaseObjectTypeTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectTypeTest2Async()\n        {\n            return GetTests().ExpandBaseObjectTypeTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectsAndObjectTypesTestAsync()\n        {\n            return GetTests().ExpandBaseObjectsAndObjectTypesTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerDrumTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerDrumTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerDrumAndValveTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerDrumAndValveTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandValveTypeTestAsync()\n        {\n            return GetTests().ExpandValveTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandTestDataObjectTypeTestAsync()\n        {\n            return GetTests().ExpandTestDataObjectTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandServerTypeTestAsync()\n        {\n            return GetTests().ExpandServerTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandServerTypeWithMethodsTestAsync()\n        {\n            return GetTests().ExpandServerTypeWithMethodsTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandPublishSubscribeTestAsync()\n        {\n            return GetTests().ExpandPublishSubscribeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandVariablesTest1Async()\n        {\n            return GetTests().ExpandVariablesTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariablesAndObjectsTest1Async()\n        {\n            return GetTests().ExpandVariablesAndObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest1Async()\n        {\n            return GetTests().ExpandVariableTypesTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest2Async()\n        {\n            return GetTests().ExpandVariableTypesTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest3Async()\n        {\n            return GetTests().ExpandVariableTypesTest3Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithNoObjectsTest1Async()\n        {\n            return GetTests().ExpandObjectWithNoObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithNoObjectsTest2Async()\n        {\n            return GetTests().ExpandObjectWithNoObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandEmptyEntryTest1Async()\n        {\n            return GetTests().ExpandEmptyEntryTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandEmptyEntryTest2Async()\n        {\n            return GetTests().ExpandEmptyEntryTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest1Async()\n        {\n            return GetTests().ExpandBadNodeIdTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest2Async()\n        {\n            return GetTests().ExpandBadNodeIdTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest3Async()\n        {\n            return GetTests().ExpandBadNodeIdTest3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/ExpandTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ExpandTests2\n    {\n        public ExpandTests2(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private ConfigurationTests2 GetTests()\n        {\n            return new ConfigurationTests2(c => new ConfigurationServices(c, _server.Client,\n                new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions(),\n                _output.BuildLoggerFor<ConfigurationServices>(Logging.Level)),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task ConfigureFromObjectErrorTest1Async()\n        {\n            return GetTests().ConfigureFromObjectErrorTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromObjectErrorTest2Async()\n        {\n            return GetTests().ConfigureFromObjectErrorTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromObjectErrorTest3Async()\n        {\n            return GetTests().ConfigureFromObjectErrorTest3Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromObjectWithBrowsePathTest1Async()\n        {\n            return GetTests().ConfigureFromObjectWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromObjectWithBrowsePathTest2Async()\n        {\n            return GetTests().ConfigureFromObjectWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromObjectTest1Async()\n        {\n            return GetTests().ConfigureFromObjectTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromObjectTest2Async()\n        {\n            return GetTests().ConfigureFromObjectTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromServerObjectTest1Async()\n        {\n            return GetTests().ConfigureFromServerObjectTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromServerObjectTest2Async()\n        {\n            return GetTests().ConfigureFromServerObjectTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromServerObjectTest3Async()\n        {\n            return GetTests().ConfigureFromServerObjectTest3Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromServerObjectTest4Async()\n        {\n            return GetTests().ConfigureFromServerObjectTest4Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromServerObjectTest5Async()\n        {\n            return GetTests().ConfigureFromServerObjectTest5Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromBaseObjectTypeTest1Async()\n        {\n            return GetTests().ConfigureFromBaseObjectTypeTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromBaseObjectTypeTest2Async()\n        {\n            return GetTests().ConfigureFromBaseObjectTypeTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromBaseObjectsAndObjectTypesTestAsync()\n        {\n            return GetTests().ConfigureFromBaseObjectsAndObjectTypesTestAsync();\n        }\n\n        [Fact]\n        public Task ConfigureFromVariablesTest1Async()\n        {\n            return GetTests().ConfigureFromVariablesTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromVariablesAndObjectsTest1Async()\n        {\n            return GetTests().ConfigureFromVariablesAndObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromVariableTypesTest1Async()\n        {\n            return GetTests().ConfigureFromVariableTypesTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromVariableTypesTest2Async()\n        {\n            return GetTests().ConfigureFromVariableTypesTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromVariableTypesTest3Async()\n        {\n            return GetTests().ConfigureFromVariableTypesTest3Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromObjectWithNoObjectsTest1Async()\n        {\n            return GetTests().ConfigureFromObjectWithNoObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromObjectWithNoObjectsTest2Async()\n        {\n            return GetTests().ConfigureFromObjectWithNoObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromEmptyEntryTest1Async()\n        {\n            return GetTests().ConfigureFromEmptyEntryTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromEmptyEntryTest2Async()\n        {\n            return GetTests().ConfigureFromEmptyEntryTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromBadNodeIdTest1Async()\n        {\n            return GetTests().ConfigureFromBadNodeIdTest1Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromBadNodeIdTest2Async()\n        {\n            return GetTests().ConfigureFromBadNodeIdTest2Async();\n        }\n\n        [Fact]\n        public Task ConfigureFromBadNodeIdTest3Async()\n        {\n            return GetTests().ConfigureFromBadNodeIdTest3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/MetadataArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class MetadataArrayTests\n    {\n        public MetadataArrayTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/MetadataScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class MetadataScalarTests\n    {\n        public MetadataScalarTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/MetadataTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class MetadataTests\n    {\n        public MetadataTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private NodeMetadataTests<ConnectionModel> GetTests()\n        {\n            return new NodeMetadataTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForFolderTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForFolderTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerObjectTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerObjectTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForConditionTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForConditionTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataTestForBaseEventTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataTestForBaseEventTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseInterfaceTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseInterfaceTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseDataVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseDataVariableTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForPropertyTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForPropertyTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForAudioVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForAudioVariableTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerStatusVariableTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerStatusVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForRedundancySupportPropertyTestAsync()\n        {\n            return GetTests().NodeGetMetadataForRedundancySupportPropertyTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/ReadArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ValueReadArrayTests\n    {\n        public ValueReadArrayTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private ReadArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadArrayValueTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), (c, n, s) => _server.Client.ReadValueAsync(c, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableNodeClassTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableAccessLevelTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArraySByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStructureValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUIntegerValueVariableTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class ReadCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataRead\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/ReadScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ValueReadScalarTests\n    {\n        public ValueReadScalarTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private ReadScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadScalarValueTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(ep, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableNodeClassTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableAccessLevelTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarSByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStructuredValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDataAccessMeasurementFloatValueTestAsync()\n        {\n            return GetTests().NodeReadDataAccessMeasurementFloatValueTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsDebugTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsDebugTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/WriteArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class ValueWriteArrayTests\n    {\n        public ValueWriteArrayTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private WriteArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteArrayValueTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), (c, n, s) => _server.Client.ReadValueAsync(c, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeWriteStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArraySByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayVariantValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayVariantValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStructureValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/WriteCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataWrite\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Services/TestData/WriteScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Services.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Microsoft.Extensions.Configuration;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class ValueWriteScalarTests\n    {\n        public ValueWriteScalarTests(TestDataServer server, ITestOutputHelper output)\n        {\n            _server = server;\n            _output = output;\n        }\n\n        private WriteScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteScalarValueTests<ConnectionModel>(\n                () => new NodeServices<ConnectionModel>(_server.Client, _server.Parser,\n                    _output.BuildLoggerFor<NodeServices<ConnectionModel>>(Logging.Level),\n                    new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions()),\n                _server.GetConnection(), (c, n, s) => _server.Client.ReadValueAsync(c, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly ITestOutputHelper _output;\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarSByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStructuredValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUIntegerValueVariableTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/Extensions/RelativePathExTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Xunit;\n\n    public class RelativePathExTests\n    {\n        [Fact]\n        public void EncodeDecodePath1()\n        {\n            var path = new string[] {\n                \"<!#http://contoso.com/ua#i=44>Test\",\n                \"<!HasChild>Test\",\n                \"<#HasChild>Test\",\n                \"<!#HasProperty>Test\",\n                \"<HasComponent>Test\",\n                \"/foo\",\n                \".bar\",\n                \"/!#flah\",\n                \"!#flah\",\n                \"xxxx\"\n            };\n\n            var context = new ServiceMessageContext();\n            var relative = path.ToRelativePath(context);\n            var result = relative.AsString(context, NamespaceFormat.Uri);\n\n            Assert.Equal(path, result);\n        }\n\n        [Fact]\n        public void EncodeDecodePath2()\n        {\n            var path = new string[] {\n                \"<!HasChild>Test\",\n                \"<#http://opcfoundation.org/ua#i_33>Test\",\n                \"<#!HasProperty>Test\",\n                \"<#!http://contoso.com/ua#i_44>Test\",\n                \"<http://opcfoundation.org/ua#i_33>Test\",\n                \"#foo\",\n                \"!.bar\",\n                \"!#/flah\",\n                \"!/#flah\",\n                \"!xxxx\"\n            };\n\n            var context = new ServiceMessageContext();\n            var relative = path.ToRelativePath(context);\n            var expected = relative.AsString(context, NamespaceFormat.Uri);\n            relative = expected.ToRelativePath(context);\n            var result = relative.AsString(context, NamespaceFormat.Uri);\n\n            Assert.Equal(expected, result);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/Extensions/SequenceNumberTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Opc.Ua.Extensions\n{\n    using System.Linq;\n    using Xunit;\n\n    public class SequenceNumberTests\n    {\n        [Fact]\n        public void TestIncrementSequenceNumber0()\n        {\n            uint v = 3234232;\n            var v2 = SequenceNumber.Increment32(ref v);\n            Assert.Equal(v, v2);\n            Assert.Equal(3234232u + 1u, v);\n        }\n\n        [Fact]\n        public void TestIncrementSequenceNumber1()\n        {\n            var v = 0xffffffff;\n            var v2 = SequenceNumber.Increment32(ref v);\n            Assert.Equal(v, v2);\n            Assert.Equal(1u, v);\n        }\n\n        [Fact]\n        public void TestIncrementSequenceNumber2()\n        {\n            uint v = 0;\n            var v2 = SequenceNumber.Increment32(ref v);\n            Assert.Equal(v, v2);\n            Assert.Equal(1u, v);\n        }\n\n        [Fact]\n        public void TestIncrementSequenceNumber3()\n        {\n            var v = 0xfffffffe;\n            var v2 = SequenceNumber.Increment32(ref v);\n            Assert.Equal(v, v2);\n            Assert.Equal(0xffffffff, v);\n        }\n\n        [Fact]\n        public void TestGetMissingSequenceNumbers0()\n        {\n            var missing = SequenceNumber.Missing(4u, 4u, out var dropped).ToList();\n            Assert.Empty(missing);\n            Assert.False(dropped);\n            missing = [.. SequenceNumber.Missing(0u, 0u, out dropped)];\n            Assert.Empty(missing);\n            Assert.False(dropped);\n            missing = [.. SequenceNumber.Missing(0xffffffffu, 0xffffffffu, out dropped)];\n            Assert.Empty(missing);\n            Assert.False(dropped);\n        }\n\n        [Fact]\n        public void TestGetMissingSequenceNumbers1()\n        {\n            var missing = SequenceNumber.Missing(0xffffffffu, 1u, out var dropped).ToList();\n            Assert.Empty(missing);\n            Assert.False(dropped);\n        }\n\n        [Fact]\n        public void TestGetMissingSequenceNumbers2()\n        {\n            var missing = SequenceNumber.Missing(1u, 0xffffffffu, out var dropped).ToList();\n            Assert.Empty(missing);\n            Assert.False(dropped);\n        }\n\n        [Fact]\n        public void TestGetMissingSequenceNumbers3()\n        {\n            var missing = SequenceNumber.Missing(0xfffffffeu, 2u, out var dropped).ToList();\n            Assert.Equal(new uint[] { 0xffffffff, 1u }, missing);\n            Assert.True(dropped);\n            missing = [.. SequenceNumber.Missing(2u, 0xfffffffeu, out dropped)];\n            Assert.Equal(new uint[] { 0xffffffff, 1u }, missing);\n            Assert.False(dropped);\n        }\n\n        [Fact]\n        public void TestGetMissingSequenceNumbers4()\n        {\n            var missing = SequenceNumber.Missing(0xfffffffeu, 3u, out var dropped).ToList();\n            Assert.Equal(new uint[] { 0xffffffff, 1u, 2u }, missing);\n            Assert.True(dropped);\n            missing = [.. SequenceNumber.Missing(3u, 0xfffffffeu, out dropped)];\n            Assert.Equal(new uint[] { 0xffffffff, 1u, 2u }, missing);\n            Assert.False(dropped);\n        }\n\n        [Fact]\n        public void TestGetMissingSequenceNumbers5()\n        {\n            const uint maxInt = unchecked(int.MaxValue);\n            const uint minInt = unchecked((uint)int.MinValue);\n            var missing = SequenceNumber.Missing(maxInt - 1, minInt + 1, out var dropped).ToList();\n            Assert.Equal(new uint[] { maxInt, minInt }, missing);\n            Assert.True(dropped);\n            missing = [.. SequenceNumber.Missing(minInt + 1, maxInt - 1, out dropped)];\n            Assert.Equal(new uint[] { maxInt, minInt }, missing);\n            Assert.False(dropped);\n            missing = [.. SequenceNumber.Missing(minInt, maxInt, out dropped)];\n            Assert.Empty(missing);\n            Assert.False(dropped);\n            missing = [.. SequenceNumber.Missing(maxInt, minInt, out dropped)];\n            Assert.Empty(missing);\n            Assert.False(dropped);\n            missing = [.. SequenceNumber.Missing(maxInt, maxInt, out dropped)];\n            Assert.Empty(missing);\n            Assert.False(dropped);\n            missing = [.. SequenceNumber.Missing(minInt, minInt, out dropped)];\n            Assert.Empty(missing);\n            Assert.False(dropped);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/GetBrowsePathsFromRootTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Extensions\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public sealed class GetBrowsePathsFromRootTests : IClassFixture<PlcServer>\n    {\n        public GetBrowsePathsFromRootTests(PlcServer server)\n        {\n            _server = server;\n        }\n\n        private readonly PlcServer _server;\n\n        [Fact]\n        public async Task GetBrowsePathsFromRootTest1Async()\n        {\n            var nodes = new[]\n            {\n                Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n            };\n            var results = await _server.Client.ExecuteAsync(_server.GetConnection(),\n                async context =>\n                {\n                    var results = await context.Session.GetBrowsePathsFromRootAsync(new RequestHeader(),\n                        nodes.Select(n => n.ToNodeId(context.Session.MessageContext)).ToList(),\n                        context.Ct);\n\n                    return results.Select(r => r.Path.Elements\n                        .Select(e => e.TargetName.AsString(context.Session.MessageContext, NamespaceFormat.Index))\n                        .ToList());\n                });\n\n            var result = Assert.Single(results);\n            Assert.Equal(\"Objects/2:OpcPlc/2:Telemetry/2:Fast/2:FastUIntScalar1\", result.Aggregate((a, b) => $\"{a}/{b}\"));\n        }\n\n        [Fact]\n        public async Task GetBrowsePathsFromRootTest2Async()\n        {\n            var nodes = new[]\n            {\n                Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar10\"\n            };\n            var results = await _server.Client.ExecuteAsync(_server.GetConnection(),\n                async context =>\n                {\n                    return await context.Session.GetBrowsePathsFromRootAsync(new RequestHeader(),\n                        nodes.Select(n => n.ToNodeId(context.Session.MessageContext)).ToList(),\n                        context.Ct);\n                });\n\n            var result = Assert.Single(results);\n            Assert.Empty(result.Path.Elements);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(StatusCodes.BadNodeIdUnknown, result.ErrorInfo.StatusCode);\n        }\n\n        [Fact]\n        public async Task GetBrowsePathsFromRootTest3Async()\n        {\n            var nodes = new[]\n            {\n                Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\",\n                Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar2\",\n                Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar3\"\n            };\n            var results = await _server.Client.ExecuteAsync(_server.GetConnection(),\n                async context =>\n                {\n                    var results = await context.Session.GetBrowsePathsFromRootAsync(new RequestHeader(),\n                        nodes.Select(n => n.ToNodeId(context.Session.MessageContext)).ToList(),\n                        context.Ct);\n\n                    return results.Select(r => r.Path.Elements\n                        .Select(e => e.TargetName.AsString(context.Session.MessageContext, NamespaceFormat.Index))\n                        .ToList());\n                });\n\n            Assert.Collection(results,\n                result => Assert.Equal(\"Objects/2:OpcPlc/2:Telemetry/2:Fast/2:FastUIntScalar1\", result.Aggregate((a, b) => $\"{a}/{b}\")),\n                result => Assert.Equal(\"Objects/2:OpcPlc/2:Telemetry/2:Fast/2:FastUIntScalar2\", result.Aggregate((a, b) => $\"{a}/{b}\")),\n                result => Assert.Equal(\"Objects/2:OpcPlc/2:Telemetry/2:Fast/2:FastUIntScalar3\", result.Aggregate((a, b) => $\"{a}/{b}\"))\n            );\n        }\n\n        [Fact]\n        public async Task GetBrowsePathsFromRootTest4Async()\n        {\n            var nodes = new[]\n            {\n                Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\",\n                Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar10\"\n            };\n            var results = await _server.Client.ExecuteAsync(_server.GetConnection(),\n                async context =>\n                {\n                    return await context.Session.GetBrowsePathsFromRootAsync(new RequestHeader(),\n                        nodes.Select(n => n.ToNodeId(context.Session.MessageContext)).ToList(),\n                        context.Ct);\n                });\n\n            Assert.Collection(results,\n                result =>\n                {\n                    Assert.NotEmpty(result.Path.Elements);\n                    Assert.Null(result.ErrorInfo);\n                    Assert.Equal(5, result.Path.Elements.Count);\n                },\n                result =>\n                {\n                    Assert.Empty(result.Path.Elements);\n                    Assert.NotNull(result.ErrorInfo);\n                    Assert.Equal(StatusCodes.BadNodeIdUnknown, result.ErrorInfo.StatusCode);\n                });\n        }\n\n        [Theory]\n        [InlineData(0)]\n        [InlineData(146)]\n        [InlineData(13523)]\n        //[InlineData(50000)]\n        public async Task GetBrowsePathsFromRootTest5Async(int count)\n        {\n            var nodes = Enumerable.Range(0, count).Select(n => Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\").ToList();\n            var results = await _server.Client.ExecuteAsync(_server.GetConnection(),\n                async context =>\n                {\n                    var results = await context.Session.GetBrowsePathsFromRootAsync(new RequestHeader(),\n                        nodes.ConvertAll(n => n.ToNodeId(context.Session.MessageContext)),\n                        context.Ct);\n\n                    return results.Select(r => r.Path.Elements\n                        .Select(e => e.TargetName.AsString(context.Session.MessageContext, NamespaceFormat.Index))\n                        .ToList());\n                });\n\n            Assert.All(results, result => Assert.Equal(\n                \"Objects/2:OpcPlc/2:Telemetry/2:Fast/2:FastUIntScalar1\", result.Aggregate((a, b) => $\"{a}/{b}\")));\n        }\n\n        [Fact]\n        public async Task GetBrowsePathsFromRootTest7Async()\n        {\n            var nodes = new[]\n            {\n                ObjectIds.ObjectsFolder,\n                ObjectIds.TypesFolder,\n                ObjectIds.EventTypesFolder,\n                ObjectTypeIds.BaseConditionClassType,\n                DataTypeIds.AliasNameDataType,\n                DataTypeIds.XVType,\n                VariableIds.AlarmConditionType_ActiveState,\n                VariableIds.Server_ServerCapabilities_MaxSelectClauseParameters,\n                VariableIds.Server_LocalTime,\n                VariableIds.AcknowledgeableConditionType_AckedState,\n                VariableIds.Server_ServerStatus_CurrentTime,\n                ObjectIds.Server\n            };\n            var results = await _server.Client.ExecuteAsync(_server.GetConnection(),\n                async context =>\n                {\n                    var results = await context.Session.GetBrowsePathsFromRootAsync(\n                        new RequestHeader(), nodes, context.Ct);\n\n                    return results\n                        .Select(r => r.Path.Elements\n                            .Select(e => e.TargetName.AsString(context.Session.MessageContext, NamespaceFormat.Index))\n                            .Aggregate((a, b) => $\"{a}/{b}\"))\n                        .ToList();\n                });\n\n            Assert.Collection(results,\n                result => Assert.Equal(\"Objects\", result),\n                result => Assert.Equal(\"Types\", result),\n                result => Assert.Equal(\"Types/EventTypes\", result),\n                result => Assert.Equal(\"Types/ObjectTypes/BaseObjectType/BaseConditionClassType\", result),\n                result => Assert.Equal(\"Types/DataTypes/BaseDataType/Structure/AliasNameDataType\", result),\n                result => Assert.Equal(\"Types/DataTypes/BaseDataType/Structure/XVType\", result),\n                result => Assert.Equal(\"Types/EventTypes/BaseEventType/ConditionType/AcknowledgeableConditionType/AlarmConditionType/ActiveState\", result),\n                result => Assert.Equal(\"Objects/Server/ServerCapabilities/MaxSelectClauseParameters\", result),\n                result => Assert.Equal(\"Objects/Server/LocalTime\", result),\n                result => Assert.Equal(\"Types/EventTypes/BaseEventType/ConditionType/AcknowledgeableConditionType/AckedState\", result),\n                result => Assert.Equal(\"Objects/Server/ServerStatus/CurrentTime\", result),\n                result => Assert.Equal(\"Objects/Server\", result)\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/GetSimpleEventFilterTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Moq;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class GetSimpleEventFilterTests : OpcUaMonitoredItemTestsBase\n    {\n        [Fact]\n        public async Task SetupSimpleFilterForBaseEventTypeAsync()\n        {\n            // Arrange\n            var template = new EventMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                EventFilter = new EventFilterModel\n                {\n                    TypeDefinitionId = ObjectTypeIds.BaseEventType.ToString()\n                }\n            };\n\n            // Act\n            var monitoredItem = await GetMonitoredItemAsync(template);\n\n            // Assert\n            Assert.NotNull(monitoredItem.Filter);\n            Assert.IsType<EventFilter>(monitoredItem.Filter);\n            var eventFilter = (EventFilter)monitoredItem.Filter;\n\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.Equal(2, eventFilter.SelectClauses.Count);\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[0].TypeDefinitionId);\n            Assert.Equal(BrowseNames.Message, eventFilter.SelectClauses[0].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[1].TypeDefinitionId);\n            Assert.Equal(BrowseNames.EventType, eventFilter.SelectClauses[1].BrowsePath.ElementAtOrDefault(0));\n\n            Assert.NotNull(eventFilter.WhereClause);\n            Assert.NotNull(eventFilter.WhereClause.Elements);\n            Assert.Single(eventFilter.WhereClause.Elements);\n            Assert.Equal(FilterOperator.OfType, eventFilter.WhereClause.Elements[0].FilterOperator);\n            Assert.NotNull(eventFilter.WhereClause.Elements[0].FilterOperands);\n            Assert.Single(eventFilter.WhereClause.Elements[0].FilterOperands);\n            Assert.IsType<LiteralOperand>(eventFilter.WhereClause.Elements[0].FilterOperands[0].Body);\n            var operand = (LiteralOperand)eventFilter.WhereClause.Elements[0].FilterOperands[0].Body;\n            Assert.IsType<NodeId>(operand.Value.Value);\n            var nodeId = (NodeId)operand.Value.Value;\n            Assert.Equal(nodeId, ObjectTypeIds.BaseEventType);\n        }\n\n        [Fact]\n        public async Task SetupSimpleFilterForConditionTypeAsync()\n        {\n            // Arrange\n            var template = new EventMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                EventFilter = new EventFilterModel\n                {\n                    TypeDefinitionId = ObjectTypeIds.ConditionType.ToString()\n                }\n            };\n\n            // Act\n            var monitoredItem = await GetMonitoredItemAsync(template);\n\n            // Assert\n            Assert.NotNull(monitoredItem.Filter);\n            Assert.IsType<EventFilter>(monitoredItem.Filter);\n            var eventFilter = (EventFilter)monitoredItem.Filter;\n\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.Equal(7, eventFilter.SelectClauses.Count);\n            Assert.Equal(Attributes.NodeId, eventFilter.SelectClauses[0].AttributeId);\n            Assert.Equal(ObjectTypeIds.ConditionType, eventFilter.SelectClauses[0].TypeDefinitionId);\n            Assert.Empty(eventFilter.SelectClauses[0].BrowsePath);\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[1].TypeDefinitionId);\n            Assert.Equal(BrowseNames.Comment, eventFilter.SelectClauses[1].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[2].TypeDefinitionId);\n            Assert.Equal(BrowseNames.ConditionName, eventFilter.SelectClauses[2].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[3].TypeDefinitionId);\n            Assert.Equal(BrowseNames.EnabledState, eventFilter.SelectClauses[3].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[4].TypeDefinitionId);\n            Assert.Equal(BrowseNames.EnabledState, eventFilter.SelectClauses[4].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(BrowseNames.Id, eventFilter.SelectClauses[4].BrowsePath.ElementAtOrDefault(1));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[5].TypeDefinitionId);\n            Assert.Equal(BrowseNames.Message, eventFilter.SelectClauses[5].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[6].TypeDefinitionId);\n            Assert.Equal(BrowseNames.EventType, eventFilter.SelectClauses[6].BrowsePath.ElementAtOrDefault(0));\n\n            Assert.NotNull(eventFilter.WhereClause);\n            Assert.NotNull(eventFilter.WhereClause.Elements);\n            Assert.Single(eventFilter.WhereClause.Elements);\n            Assert.Equal(FilterOperator.OfType, eventFilter.WhereClause.Elements[0].FilterOperator);\n            Assert.NotNull(eventFilter.WhereClause.Elements[0].FilterOperands);\n            Assert.Single(eventFilter.WhereClause.Elements[0].FilterOperands);\n            Assert.IsType<LiteralOperand>(eventFilter.WhereClause.Elements[0].FilterOperands[0].Body);\n            var operand = (LiteralOperand)eventFilter.WhereClause.Elements[0].FilterOperands[0].Body;\n            Assert.IsType<NodeId>(operand.Value.Value);\n            var nodeId = (NodeId)operand.Value.Value;\n            Assert.Equal(nodeId, ObjectTypeIds.ConditionType);\n        }\n\n        [Fact]\n        public async Task SetupSimpleFilterForConditionTypeWithConditionHandlingEnabledAsync()\n        {\n            // Arrange\n            var template = new EventMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                EventFilter = new EventFilterModel\n                {\n                    TypeDefinitionId = ObjectTypeIds.ConditionType.ToString()\n                },\n                ConditionHandling = new ConditionHandlingOptionsModel\n                {\n                    SnapshotInterval = 10\n                }\n            };\n\n            // Act\n            var monitoredItem = await GetMonitoredItemAsync(template);\n\n            // Assert\n            Assert.NotNull(monitoredItem.Filter);\n            Assert.IsType<EventFilter>(monitoredItem.Filter);\n            var eventFilter = (EventFilter)monitoredItem.Filter;\n\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.Equal(8, eventFilter.SelectClauses.Count);\n            Assert.Equal(Attributes.NodeId, eventFilter.SelectClauses[0].AttributeId);\n            Assert.Equal(ObjectTypeIds.ConditionType, eventFilter.SelectClauses[0].TypeDefinitionId);\n            Assert.Empty(eventFilter.SelectClauses[0].BrowsePath);\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[1].TypeDefinitionId);\n            Assert.Equal(BrowseNames.Comment, eventFilter.SelectClauses[1].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[2].TypeDefinitionId);\n            Assert.Equal(BrowseNames.ConditionName, eventFilter.SelectClauses[2].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[3].TypeDefinitionId);\n            Assert.Equal(BrowseNames.EnabledState, eventFilter.SelectClauses[3].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[4].TypeDefinitionId);\n            Assert.Equal(BrowseNames.EnabledState, eventFilter.SelectClauses[4].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(BrowseNames.Id, eventFilter.SelectClauses[4].BrowsePath.ElementAtOrDefault(1));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[5].TypeDefinitionId);\n            Assert.Equal(BrowseNames.Message, eventFilter.SelectClauses[5].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[6].TypeDefinitionId);\n            Assert.Equal(BrowseNames.EventType, eventFilter.SelectClauses[6].BrowsePath.ElementAtOrDefault(0));\n            Assert.Equal(ObjectTypeIds.ConditionType, eventFilter.SelectClauses[7].TypeDefinitionId);\n            Assert.Equal(BrowseNames.Retain, eventFilter.SelectClauses[7].BrowsePath.ElementAtOrDefault(0));\n\n            Assert.NotNull(eventFilter.WhereClause);\n            Assert.NotNull(eventFilter.WhereClause.Elements);\n            Assert.Single(eventFilter.WhereClause.Elements);\n            Assert.Equal(FilterOperator.OfType, eventFilter.WhereClause.Elements[0].FilterOperator);\n            Assert.NotNull(eventFilter.WhereClause.Elements[0].FilterOperands);\n            Assert.Single(eventFilter.WhereClause.Elements[0].FilterOperands);\n            Assert.IsType<LiteralOperand>(eventFilter.WhereClause.Elements[0].FilterOperands[0].Body);\n            var operand = (LiteralOperand)eventFilter.WhereClause.Elements[0].FilterOperands[0].Body;\n            Assert.IsType<NodeId>(operand.Value.Value);\n            var nodeId = (NodeId)operand.Value.Value;\n            Assert.Equal(nodeId, ObjectTypeIds.ConditionType);\n        }\n\n        public GetSimpleEventFilterTests()\n        {\n            AddNode(_baseObjectTypeNode);\n            AddNode(_baseEventTypeNode);\n            AddNode(_messageNode);\n            AddNode(_conditionTypeNode);\n            AddNode(_conditionNameNode);\n            AddNode(_commentNode);\n            AddNode(_enabledStateNode);\n            AddNode(_idNode);\n            _baseObjectTypeNode.ReferenceTable.Add(ReferenceTypeIds.HasSubtype, false, ObjectTypeIds.BaseEventType);\n            _baseEventTypeNode.ReferenceTable.Add(ReferenceTypeIds.HasSubtype, true, ObjectTypeIds.BaseObjectType);\n            _baseEventTypeNode.ReferenceTable.Add(ReferenceTypeIds.HasProperty, false, _messageNode.NodeId);\n            _messageNode.ReferenceTable.Add(ReferenceTypeIds.HasProperty, true, ObjectTypeIds.BaseEventType);\n            _baseEventTypeNode.ReferenceTable.Add(ReferenceTypeIds.HasSubtype, false, ObjectTypeIds.ConditionType);\n            _conditionTypeNode.ReferenceTable.Add(ReferenceTypeIds.HasSubtype, true, ObjectTypeIds.BaseEventType);\n            _conditionTypeNode.ReferenceTable.Add(ReferenceTypeIds.HasProperty, false, _conditionNameNode.NodeId);\n            _conditionTypeNode.ReferenceTable.Add(ReferenceTypeIds.HasProperty, false, _commentNode.NodeId);\n            _conditionNameNode.ReferenceTable.Add(ReferenceTypeIds.HasProperty, true, ObjectTypeIds.ConditionType);\n            _conditionTypeNode.ReferenceTable.Add(ReferenceTypeIds.HasComponent, false, _enabledStateNode.NodeId);\n            _enabledStateNode.ReferenceTable.Add(ReferenceTypeIds.HasComponent, true, ObjectTypeIds.ConditionType);\n            _enabledStateNode.ReferenceTable.Add(ReferenceTypeIds.HasProperty, false, _idNode.NodeId);\n            _idNode.ReferenceTable.Add(ReferenceTypeIds.HasProperty, true, _enabledStateNode.NodeId);\n            _commentNode.ReferenceTable.Add(ReferenceTypeIds.HasProperty, true, ObjectTypeIds.ConditionType);\n        }\n\n        protected override Node GetNode(uint id)\n        {\n            return _nodes.TryGetValue(id, out var node) ? node : base.GetNode(id);\n        }\n\n        private void AddNode(Node node)\n        {\n            _nodes[(uint)node.NodeId.Identifier] = node;\n        }\n\n        private readonly Node _baseObjectTypeNode = new()\n        {\n            AccessRestrictions = 0,\n            Description = null,\n            DisplayName = BrowseNames.BaseObjectType,\n            Handle = null,\n            NodeClass = Opc.Ua.NodeClass.ObjectType,\n            NodeId = ObjectTypeIds.BaseObjectType\n        };\n        private readonly Node _baseEventTypeNode = new()\n        {\n            AccessRestrictions = 0,\n            Description = null,\n            DisplayName = BrowseNames.BaseEventType,\n            Handle = null,\n            NodeClass = Opc.Ua.NodeClass.ObjectType,\n            NodeId = ObjectTypeIds.BaseEventType\n        };\n        private readonly Node _messageNode = new()\n        {\n            AccessRestrictions = 0,\n            Description = null,\n            DisplayName = BrowseNames.Message,\n            BrowseName = BrowseNames.Message,\n            Handle = null,\n            NodeClass = Opc.Ua.NodeClass.Variable,\n            NodeId = VariableIds.BaseEventType_Message\n        };\n        private readonly Node _conditionTypeNode = new()\n        {\n            AccessRestrictions = 0,\n            Description = null,\n            DisplayName = BrowseNames.ConditionType,\n            Handle = null,\n            NodeClass = Opc.Ua.NodeClass.ObjectType,\n            NodeId = ObjectTypeIds.ConditionType\n        };\n        private readonly Node _conditionNameNode = new()\n        {\n            AccessRestrictions = 0,\n            Description = null,\n            DisplayName = BrowseNames.ConditionName,\n            BrowseName = BrowseNames.ConditionName,\n            Handle = null,\n            NodeClass = Opc.Ua.NodeClass.Variable,\n            NodeId = VariableIds.ConditionType_ConditionName\n        };\n        private readonly Node _commentNode = new()\n        {\n            AccessRestrictions = 0,\n            Description = null,\n            DisplayName = BrowseNames.Comment,\n            BrowseName = BrowseNames.Comment,\n            Handle = null,\n            NodeClass = Opc.Ua.NodeClass.Variable,\n            NodeId = VariableIds.ConditionType_Comment\n        };\n        private readonly Node _enabledStateNode = new()\n        {\n            AccessRestrictions = 0,\n            Description = null,\n            DisplayName = BrowseNames.EnabledState,\n            BrowseName = BrowseNames.EnabledState,\n            Handle = null,\n            NodeClass = Opc.Ua.NodeClass.Variable,\n            NodeId = VariableIds.ConditionType_EnabledState\n        };\n        private readonly Node _idNode = new()\n        {\n            AccessRestrictions = 0,\n            Description = null,\n            DisplayName = BrowseNames.Id,\n            BrowseName = BrowseNames.Id,\n            Handle = null,\n            NodeClass = Opc.Ua.NodeClass.Variable,\n            NodeId = VariableIds.ConditionType_EnabledState_Id\n        };\n\n        private readonly Dictionary<uint, Node> _nodes = [];\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/OpcUaApplicationTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Autofac;\n    using Furly.Exceptions;\n    using Opc.Ua;\n    using System;\n    using System.Linq;\n    using System.Security.Cryptography;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class OpcUaApplicationTests\n    {\n        [Fact]\n        public async Task GetApplicationCertificateTest1Async()\n        {\n            await using var bootstrap = Build();\n            var oldCerts = bootstrap.Resolve<IOpcUaCertificates>();\n            await CleanAsync(oldCerts, CertificateStoreName.Application);\n\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.Application, true);\n            Assert.Equal(3, certificates.Count);\n            Assert.All(certificates, own => Assert.True(own.HasPrivateKey));\n        }\n\n        [Fact]\n        public async Task GetApplicationCertificateTest2Async()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.Application);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.Application);\n            Assert.Empty(certificates);\n\n            using var newCert = CreateRSACertificate(\"test\");\n            var p = Guid.NewGuid().ToString();\n            await certs.AddCertificateAsync(CertificateStoreName.Application,\n                newCert.Export(X509ContentType.Pfx, p), p);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Application, true);\n            var own = Assert.Single(certificates);\n            Assert.True(own.HasPrivateKey);\n        }\n\n        [Fact]\n        public async Task GetTrustedCertificatesTest1Async()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Empty(certificates);\n\n            using var newCert = CreateRSACertificate(\"test\");\n            var p = Guid.NewGuid().ToString();\n            await certs.AddCertificateAsync(CertificateStoreName.Trusted,\n                newCert.Export(X509ContentType.Pfx, p), p);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            var cert = Assert.Single(certificates);\n            Assert.Equal(cert.Thumbprint, newCert.Thumbprint);\n\n            await certs.RemoveCertificateAsync(CertificateStoreName.Trusted, newCert.Thumbprint);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Empty(certificates);\n        }\n\n        [Fact]\n        public async Task GetTrustedCertificatesTest2Async()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Empty(certificates);\n\n            using var newCert = CreateRSACertificate(\"test\");\n            var p = Guid.NewGuid().ToString();\n            var pfx = newCert.Export(X509ContentType.Pfx, p);\n            await certs.AddCertificateAsync(CertificateStoreName.Trusted, pfx, p);\n            await certs.AddCertificateAsync(CertificateStoreName.Trusted, pfx, p);\n            await certs.AddCertificateAsync(CertificateStoreName.Trusted, pfx, p);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            var cert = Assert.Single(certificates);\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n        }\n\n        [Fact]\n        public async Task GetTrustedCertificatesTest3Async()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Empty(certificates);\n\n            using var newCert1 = CreateRSACertificate(\"test1\");\n            using var newCert2 = CreateRSACertificate(\"test2\");\n            using var newCert3 = CreateRSACertificate(\"test3\");\n            var p1 = Guid.NewGuid().ToString();\n            var p2 = Guid.NewGuid().ToString();\n            var p3 = Guid.NewGuid().ToString();\n            await certs.AddCertificateAsync(CertificateStoreName.Trusted,\n                newCert1.Export(X509ContentType.Pfx, p1), p1);\n            await certs.AddCertificateAsync(CertificateStoreName.Trusted,\n                newCert2.Export(X509ContentType.Pfx, p2), p2);\n            await certs.AddCertificateAsync(CertificateStoreName.Trusted,\n                newCert3.Export(X509ContentType.Pfx, p3), p3);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Equal(3, certificates.Count);\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n        }\n\n        [Fact]\n        public async Task GetTrustedCertificatesTest4Async()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n            await CleanAsync(certs, CertificateStoreName.Issuer);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Empty(certificates);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Issuer);\n            Assert.Empty(certificates);\n\n            using var newCert1 = CreateRSACertificate(\"test1\");\n            using var newCert2 = CreateRSACertificate(\"test2\");\n            using var newCert3 = CreateRSACertificate(\"test3\");\n            var chain = newCert1.RawData.Concat(newCert2.RawData).Concat(newCert3.RawData).ToArray();\n\n            await certs.AddCertificateChainAsync(chain);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Single(certificates);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Issuer);\n            Assert.Equal(2, certificates.Count);\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n            await CleanAsync(certs, CertificateStoreName.Issuer);\n        }\n\n        [Fact]\n        public async Task GetTrustedHttpsCertificatesTestAsync()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.Https);\n            await CleanAsync(certs, CertificateStoreName.HttpsIssuer);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.Https);\n            Assert.Empty(certificates);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.HttpsIssuer);\n            Assert.Empty(certificates);\n\n            using var newCert1 = CreateRSACertificate(\"test1\");\n            using var newCert2 = CreateRSACertificate(\"test2\");\n            using var newCert3 = CreateRSACertificate(\"test3\");\n            var chain = newCert1.RawData.Concat(newCert2.RawData).Concat(newCert3.RawData).ToArray();\n\n            await certs.AddCertificateChainAsync(chain, true);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Https);\n            Assert.Single(certificates);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.HttpsIssuer);\n            Assert.Equal(2, certificates.Count);\n            await CleanAsync(certs, CertificateStoreName.Https);\n            await CleanAsync(certs, CertificateStoreName.HttpsIssuer);\n        }\n\n        [Fact]\n        public async Task ApproveRejectedCertificateTestAsync()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n            await CleanAsync(certs, CertificateStoreName.Rejected);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Empty(certificates);\n\n            using var rejectedCert = CreateRSACertificate(\"test1\");\n            var p = Guid.NewGuid().ToString();\n            await certs.AddCertificateAsync(CertificateStoreName.Rejected,\n                rejectedCert.Export(X509ContentType.Pfx, p), p);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Rejected);\n            Assert.Single(certificates);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            Assert.Empty(certificates);\n\n            await certs.ApproveRejectedCertificateAsync(rejectedCert.Thumbprint);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Rejected);\n            Assert.Empty(certificates);\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.Trusted);\n            var approved = Assert.Single(certificates);\n            Assert.Equal(approved.Thumbprint, rejectedCert.Thumbprint);\n\n            await CleanAsync(certs, CertificateStoreName.Rejected);\n            await CleanAsync(certs, CertificateStoreName.Trusted);\n        }\n\n        [Fact]\n        public async Task ApproveRejectedCertificateNotFoundTestAsync()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            using var rejectedCert = CreateRSACertificate(\"test1\");\n            await Assert.ThrowsAsync<ResourceNotFoundException>(\n                async () => await certs.ApproveRejectedCertificateAsync(rejectedCert.Thumbprint));\n        }\n\n        [Fact]\n        public async Task RemoveCertificateNotFoundTestAsync()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            using var rejectedCert = CreateRSACertificate(\"test1\");\n            await Assert.ThrowsAsync<ResourceNotFoundException>(\n                async () => await certs.RemoveCertificateAsync(\n                    CertificateStoreName.Trusted, rejectedCert.Thumbprint));\n        }\n\n        [Fact]\n        public async Task GetUserCertificateTest1Async()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.User);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.User);\n            Assert.Empty(certificates);\n\n            using var newCert1 = CreateRSACertificate(\"user1\");\n            using var newCert2 = CreateRSACertificate(\"user2\");\n            using var newCert3 = CreateRSACertificate(\"user3\");\n            var p1 = Guid.NewGuid().ToString();\n            var p2 = Guid.NewGuid().ToString();\n            var p3 = Guid.NewGuid().ToString();\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert1.Export(X509ContentType.Pfx, p1), p1);\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert2.Export(X509ContentType.Pfx, p2), p2);\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert3.Export(X509ContentType.Pfx, p3), p3);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.User, true);\n            Assert.Equal(3, certificates.Count);\n            Assert.All(certificates, c => Assert.False(c.HasPrivateKey));\n\n            var config = container.Resolve<IOpcUaConfiguration>();\n\n            var credential = new CredentialModel\n            {\n                Type = CredentialType.X509Certificate,\n                Value = new UserIdentityModel\n                {\n                    User = \"DC=user2\",\n                    Password = p2\n                }\n            };\n            var identity = await credential.ToUserIdentityAsync(config.Value);\n            Assert.NotNull(identity);\n            Assert.Equal(UserTokenType.Certificate, identity.TokenType);\n            var x509Token = identity.GetIdentityToken() as X509IdentityToken;\n            Assert.NotNull(x509Token);\n            Assert.True(x509Token.Certificate.HasPrivateKey);\n            Assert.Equal(newCert2.Thumbprint, x509Token.Certificate.Thumbprint);\n        }\n\n        [Fact]\n        public async Task GetUserCertificateTest2Async()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.User);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.User);\n            Assert.Empty(certificates);\n\n            using var newCert1 = CreateRSACertificate(\"user1\");\n            using var newCert2 = CreateRSACertificate(\"user2\");\n            using var newCert3 = CreateRSACertificate(\"user3\");\n            var p1 = Guid.NewGuid().ToString();\n            var p2 = Guid.NewGuid().ToString();\n            var p3 = Guid.NewGuid().ToString();\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert1.Export(X509ContentType.Pfx, p1), p1);\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert2.Export(X509ContentType.Pfx, p2), p2);\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert3.Export(X509ContentType.Pfx, p3), p3);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.User, true);\n            Assert.Equal(3, certificates.Count);\n            Assert.All(certificates, c => Assert.False(c.HasPrivateKey));\n\n            var config = container.Resolve<IOpcUaConfiguration>();\n            var credential = new CredentialModel\n            {\n                Type = CredentialType.X509Certificate,\n                Value = new UserIdentityModel\n                {\n                    Thumbprint = newCert3.Thumbprint,\n                    Password = p3\n                }\n            };\n            var identity = await credential.ToUserIdentityAsync(config.Value);\n            Assert.NotNull(identity);\n            Assert.Equal(UserTokenType.Certificate, identity.TokenType);\n            var x509Token = identity.GetIdentityToken() as X509IdentityToken;\n            Assert.NotNull(x509Token);\n            Assert.True(x509Token.Certificate.HasPrivateKey);\n            Assert.Equal(newCert3.Thumbprint, x509Token.Certificate.Thumbprint);\n        }\n\n        [Fact]\n        public async Task GetUserCertificateTest3Async()\n        {\n            await using var container = Build();\n            var certs = container.Resolve<IOpcUaCertificates>();\n            await CleanAsync(certs, CertificateStoreName.User);\n            var certificates = await certs.ListCertificatesAsync(CertificateStoreName.User);\n            Assert.Empty(certificates);\n\n            using var newCert1 = CreateRSACertificate(\"user1\");\n            using var newCert2 = CreateRSACertificate(\"user2\");\n            using var newCert3 = CreateRSACertificate(\"user3\");\n            var p1 = Guid.NewGuid().ToString();\n            var p2 = Guid.NewGuid().ToString();\n            var p3 = Guid.NewGuid().ToString();\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert1.Export(X509ContentType.Pfx, p1), p1);\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert2.Export(X509ContentType.Pfx, p2), p2);\n            await certs.AddCertificateAsync(CertificateStoreName.User,\n                newCert3.Export(X509ContentType.Pfx, p3), p3);\n\n            certificates = await certs.ListCertificatesAsync(CertificateStoreName.User, true);\n            Assert.Equal(3, certificates.Count);\n            Assert.All(certificates, c => Assert.False(c.HasPrivateKey));\n\n            var config = container.Resolve<IOpcUaConfiguration>();\n            var credential = new CredentialModel\n            {\n                Type = CredentialType.X509Certificate,\n                Value = new UserIdentityModel\n                {\n                    Thumbprint = newCert3.Thumbprint,\n                    Password = p1\n                }\n            };\n            var ex = await Assert.ThrowsAsync<ServiceResultException>(\n                async () => await credential.ToUserIdentityAsync(config.Value));\n            Assert.Equal(StatusCodes.BadCertificateInvalid, ex.StatusCode);\n\n            config = container.Resolve<IOpcUaConfiguration>();\n            credential = new CredentialModel\n            {\n                Type = CredentialType.X509Certificate,\n                Value = new UserIdentityModel\n                {\n                    Password = p3\n                }\n            };\n            ex = await Assert.ThrowsAsync<ServiceResultException>(\n                async () => await credential.ToUserIdentityAsync(config.Value));\n            Assert.Equal(StatusCodes.BadNotSupported, ex.StatusCode);\n\n            config = container.Resolve<IOpcUaConfiguration>();\n            credential = new CredentialModel\n            {\n                Type = CredentialType.X509Certificate,\n                Value = new UserIdentityModel\n                {\n                    Thumbprint = newCert3.Thumbprint\n                }\n            };\n            ex = await Assert.ThrowsAsync<ServiceResultException>(\n                async () => await credential.ToUserIdentityAsync(config.Value));\n            Assert.Equal(StatusCodes.BadCertificateInvalid, ex.StatusCode);\n        }\n\n        private static async Task CleanAsync(IOpcUaCertificates certs, CertificateStoreName store)\n        {\n            var certificates = await certs.ListCertificatesAsync(store);\n            foreach (var c in certificates)\n            {\n                await certs.RemoveCertificateAsync(store, c.Thumbprint);\n            }\n        }\n\n        private static X509Certificate2 CreateRSACertificate(string name)\n        {\n            using var rsa = RSA.Create();\n            var req = new CertificateRequest(\"DC=\" + name, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);\n            req.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, false));\n            return req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddHours(5));\n        }\n\n        private static IContainer Build()\n        {\n            var containerBuilder = new ContainerBuilder();\n            containerBuilder.AddLogging();\n            containerBuilder.AddOpcUaStack();\n            containerBuilder.AddNewtonsoftJsonSerializer();\n            return containerBuilder.Build();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/OpcUaMonitoredItemTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using Opc.Ua;\n    using DeadbandType = Publisher.Models.DeadbandType;\n    using MonitoringMode = Publisher.Models.MonitoringMode;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class OpcUaMonitoredItemTests : OpcUaMonitoredItemTestsBase\n    {\n        [Fact]\n        public async Task SetDefaultValuesWhenPropertiesAreNullInBaseTemplateAsync()\n        {\n            var template = new DataMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                DiscardNew = null\n            };\n            var monitoredItem = await GetMonitoredItemAsync(template) as OpcUaMonitoredItem.DataChange;\n\n            Assert.Equal(Attributes.Value, monitoredItem.AttributeId);\n            Assert.Equal(Opc.Ua.MonitoringMode.Reporting, monitoredItem.MonitoringMode);\n            Assert.Equal(1000, monitoredItem.SamplingInterval);\n            Assert.True(monitoredItem.DiscardOldest);\n            Assert.False(monitoredItem.SkipMonitoredItemNotification());\n        }\n\n        [Fact]\n        public async Task SetSkipFirstBeforeFirstNotificationProcessedSucceedsTestsAsync()\n        {\n            var template = new DataMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                SkipFirst = true\n            };\n            var monitoredItem = await GetMonitoredItemAsync(template) as OpcUaMonitoredItem.DataChange;\n            Assert.False(monitoredItem.TrySetSkipFirst(true));\n            Assert.True(monitoredItem.TrySetSkipFirst(false));\n            Assert.True(monitoredItem.TrySetSkipFirst(true));\n            Assert.True(monitoredItem.TrySetSkipFirst(false));\n            Assert.True(monitoredItem.TrySetSkipFirst(true));\n            Assert.True(monitoredItem.SkipMonitoredItemNotification());\n            // This is allowed since it does not matter\n            Assert.True(monitoredItem.TrySetSkipFirst(false));\n            Assert.False(monitoredItem.TrySetSkipFirst(true));\n            Assert.False(monitoredItem.SkipMonitoredItemNotification());\n        }\n\n        [Fact]\n        public async Task SetSkipFirstAfterFirstNotificationProcessedFailsTestsAsync()\n        {\n            var template = new DataMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                SkipFirst = true\n            };\n            var monitoredItem = await GetMonitoredItemAsync(template) as OpcUaMonitoredItem.DataChange;\n            Assert.True(monitoredItem.SkipMonitoredItemNotification());\n            Assert.False(monitoredItem.TrySetSkipFirst(true));\n            // This is allowed since it does not matter\n            Assert.True(monitoredItem.TrySetSkipFirst(false));\n            Assert.False(monitoredItem.TrySetSkipFirst(true));\n            // This is allowed since it does not matter\n            Assert.True(monitoredItem.TrySetSkipFirst(false));\n            Assert.False(monitoredItem.SkipMonitoredItemNotification());\n        }\n\n        [Fact]\n        public async Task NotsetSkipFirstAfterFirstNotificationProcessedFailsSettingTestsAsync()\n        {\n            var template = new DataMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\"\n            };\n            var monitoredItem = await GetMonitoredItemAsync(template) as OpcUaMonitoredItem.DataChange;\n            Assert.False(monitoredItem.SkipMonitoredItemNotification());\n            Assert.False(monitoredItem.TrySetSkipFirst(true));\n            Assert.False(monitoredItem.SkipMonitoredItemNotification());\n        }\n\n        [Fact]\n        public async Task SetBaseValuesWhenPropertiesAreSetInBaseTemplateAsync()\n        {\n            var template = new DataMonitoredItemModel\n            {\n                DataSetFieldId = \"i=2258\",\n                DataSetFieldName = \"DisplayName\",\n                AttributeId = (NodeAttribute)Attributes.Value,\n                IndexRange = \"5:20\",\n                RelativePath = new[] { \"RelativePath1\", \"RelativePath2\" },\n                MonitoringMode = MonitoringMode.Sampling,\n                StartNodeId = \"i=2258\",\n                DataSetClassFieldId = Guid.NewGuid(),\n                QueueSize = 10,\n                SkipFirst = true,\n                SamplingInterval = TimeSpan.FromMilliseconds(10000),\n                DiscardNew = true\n            };\n            var monitoredItem = await GetMonitoredItemAsync(template) as OpcUaMonitoredItem.DataChange;\n\n            Assert.Equal(\"DisplayName\", monitoredItem.DisplayName);\n            Assert.Equal((uint)NodeAttribute.Value, monitoredItem.AttributeId);\n            Assert.Equal(\"5:20\", monitoredItem.IndexRange);\n            Assert.Equal(Opc.Ua.MonitoringMode.Sampling, monitoredItem.MonitoringMode);\n            Assert.Equal(\"i=2258\", monitoredItem.StartNodeId);\n            Assert.Equal(10u, monitoredItem.QueueSize);\n            Assert.Equal(10000, monitoredItem.SamplingInterval);\n            Assert.False(monitoredItem.DiscardOldest);\n            Assert.Null(monitoredItem.Handle);\n            Assert.True(monitoredItem.SkipMonitoredItemNotification());\n        }\n\n        [Fact]\n        public async Task SetDataChangeFilterWhenBaseTemplateIsDataTemplateAsync()\n        {\n            var template = new DataMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                DataChangeFilter = new DataChangeFilterModel\n                {\n                    DataChangeTrigger = DataChangeTriggerType.StatusValue,\n                    DeadbandType = DeadbandType.Percent,\n                    DeadbandValue = 10.0\n                }\n            };\n            var monitoredItem = await GetMonitoredItemAsync(template);\n\n            Assert.NotNull(monitoredItem.Filter);\n            Assert.IsType<DataChangeFilter>(monitoredItem.Filter);\n\n            var dataChangeFilter = (DataChangeFilter)monitoredItem.Filter;\n            Assert.Equal(DataChangeTrigger.StatusValue, dataChangeFilter.Trigger);\n            Assert.Equal((uint)Opc.Ua.DeadbandType.Percent, dataChangeFilter.DeadbandType);\n            Assert.Equal(10.0, dataChangeFilter.DeadbandValue);\n        }\n\n        [Fact]\n        public async Task SetEventFilterWhenBaseTemplateIsEventTemplateAsync()\n        {\n            var template = new EventMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                EventFilter = new EventFilterModel\n                {\n                    SelectClauses = new List<SimpleAttributeOperandModel> {\n                        new()\n                        {\n                            TypeDefinitionId = \"i=2041\",\n                            BrowsePath = new []{ \"EventId\" }\n                        }\n                    },\n                    WhereClause = new ContentFilterModel\n                    {\n                        Elements = new List<ContentFilterElementModel> {\n                            new() {\n                                FilterOperator = FilterOperatorType.OfType,\n                                FilterOperands = new List<FilterOperandModel> {\n                                    new() {\n                                        Value = \"ns=2;i=235\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n            var monitoredItem = await GetMonitoredItemAsync(template);\n\n            Assert.NotNull(monitoredItem.Filter);\n            Assert.IsType<EventFilter>(monitoredItem.Filter);\n\n            var eventFilter = (EventFilter)monitoredItem.Filter;\n            Assert.NotEmpty(eventFilter.SelectClauses);\n            Assert.Equal(ObjectTypeIds.BaseEventType, eventFilter.SelectClauses[0].TypeDefinitionId);\n            Assert.Equal(\"EventId\", eventFilter.SelectClauses[0].BrowsePath.ElementAtOrDefault(0));\n            Assert.NotNull(eventFilter.WhereClause);\n            Assert.Single(eventFilter.WhereClause.Elements);\n            Assert.Equal(FilterOperator.OfType, eventFilter.WhereClause.Elements[0].FilterOperator);\n            Assert.Single(eventFilter.WhereClause.Elements[0].FilterOperands);\n            Assert.IsType<LiteralOperand>(eventFilter.WhereClause.Elements[0].FilterOperands[0].Body);\n\n            var literalOperand = (LiteralOperand)eventFilter.WhereClause.Elements[0].FilterOperands[0].Body;\n            Assert.Equal(new NodeId(\"ns=2;i=235\"), literalOperand.Value.Value);\n        }\n\n        [Fact]\n        public async Task AddConditionTypeSelectClausesWhenPendingAlarmsIsSetInEventTemplateAsync()\n        {\n            var template = new EventMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                EventFilter = new EventFilterModel(),\n                ConditionHandling = new ConditionHandlingOptionsModel\n                {\n                    SnapshotInterval = 10,\n                    UpdateInterval = 20\n                }\n            };\n            var monitoredItem = await GetMonitoredItemAsync(template);\n\n            Assert.NotNull(monitoredItem.Filter);\n            Assert.IsType<EventFilter>(monitoredItem.Filter);\n\n            var eventFilter = (EventFilter)monitoredItem.Filter;\n            Assert.NotNull(eventFilter.SelectClauses);\n            Assert.Equal(11, eventFilter.SelectClauses.Count);\n            Assert.Equal(Attributes.NodeId, eventFilter.SelectClauses[9].AttributeId);\n            Assert.Equal(ObjectTypeIds.ConditionType, eventFilter.SelectClauses[9].TypeDefinitionId);\n            Assert.Empty(eventFilter.SelectClauses[9].BrowsePath);\n            Assert.Equal(Attributes.Value, eventFilter.SelectClauses[10].AttributeId);\n            Assert.Equal(ObjectTypeIds.ConditionType, eventFilter.SelectClauses[10].TypeDefinitionId);\n            Assert.Equal(\"Retain\", eventFilter.SelectClauses[10].BrowsePath.FirstOrDefault());\n        }\n\n        [Fact]\n        public async Task SetupFieldNameWithNamespaceNameWhenNamespaceIndexIsUsedAsync()\n        {\n            var template = new EventMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                EventFilter = new EventFilterModel\n                {\n                    SelectClauses = new List<SimpleAttributeOperandModel> {\n                        new()\n                        {\n                            TypeDefinitionId = \"nsu=http://opcfoundation.org/Quickstarts/SimpleEvents;i=235\",\n                            BrowsePath = new []{ \"2:CycleId\" }\n                        },\n                        new()\n                        {\n                            TypeDefinitionId = \"nsu=http://opcfoundation.org/Quickstarts/SimpleEvents;i=235\",\n                            BrowsePath = new []{ \"2:CurrentStep\" }\n                        }\n                    },\n                    WhereClause = new ContentFilterModel\n                    {\n                        Elements = new List<ContentFilterElementModel>\n                        {\n                            new()\n                            {\n                                FilterOperator = FilterOperatorType.OfType,\n                                FilterOperands = new List<FilterOperandModel> {\n                                    new() {\n                                        Value = \"ns=2;i=235\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n\n            var namespaceTable = new NamespaceTable(new[] {\n                Namespaces.OpcUa,\n                \"http://opcfoundation.org/UA/Diagnostics\",\n                \"http://opcfoundation.org/Quickstarts/SimpleEvents\"\n            });\n            var eventItem = await GetMonitoredItemAsync(template, namespaceTable) as OpcUaMonitoredItem.Event;\n\n            Assert.Equal(((EventFilter)eventItem.Filter).SelectClauses.Count, eventItem.Fields.Count);\n            Assert.Equal(\"http://opcfoundation.org/Quickstarts/SimpleEvents#CycleId\", eventItem.Fields[0].Name);\n            Assert.Equal(\"http://opcfoundation.org/Quickstarts/SimpleEvents#CurrentStep\", eventItem.Fields[1].Name);\n        }\n\n        [Fact]\n        public async Task UseDefaultFieldNameWhenNamespaceTableIsEmptyAsync()\n        {\n            var namespaceUris = new NamespaceTable();\n            namespaceUris.Append(\"http://test\");\n            namespaceUris.Append(\"http://opcfoundation.org/Quickstarts/SimpleEvents\");\n\n            var template = new EventMonitoredItemModel\n            {\n                StartNodeId = \"i=2258\",\n                EventFilter = new EventFilterModel\n                {\n                    SelectClauses = new List<SimpleAttributeOperandModel>\n                    {\n                        new()\n                        {\n                            TypeDefinitionId = \"nsu=http://opcfoundation.org/Quickstarts/SimpleEvents;i=235\",\n                            BrowsePath = new []{ \"2:CycleId\" }\n                        },\n                        new()\n                        {\n                            TypeDefinitionId = \"nsu=http://opcfoundation.org/Quickstarts/SimpleEvents;i=235\",\n                            BrowsePath = new []{ \"2:CurrentStep\" }\n                        }\n                    },\n                    WhereClause = new ContentFilterModel\n                    {\n                        Elements = new List<ContentFilterElementModel>\n                        {\n                            new()\n                            {\n                                FilterOperator = FilterOperatorType.OfType,\n                                FilterOperands = new List<FilterOperandModel>\n                                {\n                                    new()\n                                    {\n                                        Value = \"ns=2;i=235\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n\n            var eventItem = await GetMonitoredItemAsync(template, namespaceUris) as OpcUaMonitoredItem.Event;\n\n            Assert.Equal(((EventFilter)eventItem.Filter).SelectClauses.Count, eventItem.Fields.Count);\n            Assert.Equal(\"http://opcfoundation.org/Quickstarts/SimpleEvents#CycleId\", eventItem.Fields[0].Name);\n            Assert.Equal(\"http://opcfoundation.org/Quickstarts/SimpleEvents#CurrentStep\", eventItem.Fields[1].Name);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/OpcUaMonitoredItemTestsBase.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Extensions;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using Furly.Extensions.Logging;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Moq;\n    using Opc.Ua;\n    using Opc.Ua.Client;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    public abstract class OpcUaMonitoredItemTestsBase\n    {\n        protected virtual Mock<IOpcUaSession> SetupMockedSession(NamespaceTable namespaceTable = null)\n        {\n            using var mock = Autofac.Extras.Moq.AutoMock.GetLoose();\n            namespaceTable ??= new NamespaceTable();\n\n            var s = new Mock<ISession>();\n            s.Setup(x => x.ReadNodeAsync(It.IsAny<NodeId>(), It.IsAny<CancellationToken>()))\n                .Returns((NodeId x, CancellationToken _)\n                => Task.FromResult(GetNode(x)));\n            s.Setup(x => x.ReadNodesAsync(It.IsAny<IList<NodeId>>(), It.IsAny<NodeClass>(), It.IsAny<bool>(), It.IsAny<CancellationToken>()))\n                .Returns((IList<NodeId> nodeIds, NodeClass nodeClass, bool includeReferences, CancellationToken cancellationToken)\n                => Task.FromResult(GetNodes(nodeIds, nodeClass, includeReferences)));\n            s.Setup(x => x.FetchReferencesAsync(It.IsAny<NodeId>(), It.IsAny<CancellationToken>()))\n                .Returns((NodeId x, CancellationToken _)\n                => Task.FromResult(new ReferenceDescriptionCollection(GetReferences(x))));\n\n            var nodeCache = new LruNodeCache(s.Object);\n\n            var session = mock.Mock<IOpcUaSession>();\n            var messageContext = new ServiceMessageContext\n            {\n                NamespaceUris = namespaceTable\n            };\n            var codec = new JsonVariantEncoder(messageContext, new NewtonsoftJsonSerializer());\n            session.SetupGet(x => x.Codec).Returns(codec);\n            session.SetupGet(x => x.LruNodeCache).Returns(nodeCache);\n            session.SetupGet(x => x.MessageContext).Returns(messageContext);\n\n            return session;\n        }\n\n        protected virtual IEnumerable<ReferenceDescription> GetReferences(NodeId x)\n        {\n            var node = GetNode(x);\n            return node == null ? Array.Empty<ReferenceDescription>() :\n                node.ReferenceTable.Select(r => new ReferenceDescription\n                {\n                    ReferenceTypeId = new NodeId(r.ReferenceTypeId),\n                    IsForward = !r.IsInverse,\n                    NodeId = new ExpandedNodeId(r.TargetId)\n                });\n        }\n\n        protected virtual IEnumerable<ReferenceDescription> GetReferences(uint id)\n        {\n            return Array.Empty<ReferenceDescription>();\n        }\n\n        protected virtual (IList<Node>, IList<ServiceResult>) GetNodes(\n            IList<NodeId> nodeIds, NodeClass nodeClass, bool includeReferences)\n        {\n            var nodes = new List<Node>();\n            var results = new List<ServiceResult>();\n            foreach (var id in nodeIds)\n            {\n                var node = GetNode(id);\n                if (node != null && (nodeClass == NodeClass.Unspecified || node.NodeClass == nodeClass))\n                {\n                    nodes.Add(node);\n                    results.Add(ServiceResult.Good);\n                }\n                else\n                {\n                    results.Add(new ServiceResult(StatusCodes.BadNodeIdUnknown));\n                }\n            }\n            return (nodes, results);\n        }\n\n        protected virtual Node GetNode(NodeId x)\n        {\n            if (x.IdType == IdType.Numeric && x.Identifier is uint id)\n            {\n                return GetNode(id);\n            }\n            return null;\n        }\n\n        protected virtual Node GetNode(uint id)\n        {\n            return null;\n        }\n\n        internal async Task<OpcUaMonitoredItem> GetMonitoredItemAsync(BaseMonitoredItemModel template,\n            NamespaceTable namespaceUris = null)\n        {\n            var session = SetupMockedSession(namespaceUris).Object;\n            var subscriber = new Mock<ISubscriber>();\n            var monitoredItemWrapper = OpcUaMonitoredItem.Create(null!,\n                (subscriber.Object, template).YieldReturn(),\n                Log.ConsoleFactory(), TimeProvider.System).Single();\n            using var subscription = new SimpleSubscription();\n            monitoredItemWrapper.AddTo(subscription, session, out _);\n            if (monitoredItemWrapper.FinalizeAddTo != null)\n            {\n                await monitoredItemWrapper.FinalizeAddTo(session, default);\n            }\n            return monitoredItemWrapper;\n        }\n\n        internal sealed class SimpleSubscription : Subscription\n        {\n            public SimpleSubscription()\n            {\n            }\n\n            public SimpleSubscription(Subscription template, bool copyEventHandlers)\n                : base(template, copyEventHandlers)\n            {\n            }\n\n            public override Subscription CloneSubscription(bool copyEventHandlers)\n            {\n                throw new NotImplementedException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/Transport/Extensions/NetworkInformationExTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack.Transport\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport;\n    using System.Net.NetworkInformation;\n    using Xunit;\n\n    public class NetworkInformationExTests\n    {\n        [Fact]\n        public void TestCopy()\n        {\n            var addr1 = new PhysicalAddress([0, 1, 2, 3, 4, 5, 6, 7]);\n            var addr2 = new PhysicalAddress([0, 1, 2, 3, 4, 5, 6, 7]);\n            var addr3 = addr1.Copy();\n\n            Assert.Equal(addr1, addr2);\n            Assert.Equal(addr1, addr3);\n            Assert.Equal(addr2, addr3);\n            Assert.Equal(addr1.GetHashCode(), addr2.GetHashCode());\n            Assert.Equal(addr1.GetHashCode(), addr3.GetHashCode());\n        }\n\n        [Fact]\n        public void TestNotEqual()\n        {\n            var addr1 = new PhysicalAddress([0, 1, 2, 3, 4, 5, 6, 7]);\n            var addr2 = new PhysicalAddress([1, 1, 2, 3, 4, 5, 6, 7]);\n            var addr3 = new PhysicalAddress([1, 1, 2, 3, 4, 5, 6]);\n\n            Assert.NotEqual(addr1, addr2);\n            Assert.NotEqual(addr1, addr3);\n            Assert.NotEqual(addr2, addr3);\n            Assert.NotEqual(addr1.GetHashCode(), addr2.GetHashCode());\n            Assert.NotEqual(addr1.GetHashCode(), addr3.GetHashCode());\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/Transport/Models/AddressRangeTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack.Transport.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Net;\n    using Xunit;\n\n    public class AddressRangeTests\n    {\n        [Fact]\n        public void TestSubnetRange1()\n        {\n            var range = new AddressRange(\n                IPAddress.Parse(\"10.93.232.185\"), 20);\n\n            Assert.Equal(IPAddress.Parse(\"10.93.224.0\"), (IPv4Address)range.Low);\n            Assert.Equal(IPAddress.Parse(\"10.93.239.255\"), (IPv4Address)range.High);\n            Assert.Equal(4096, range.Count);\n        }\n\n        [Fact]\n        public void TestSubnetRange2()\n        {\n            var range = new AddressRange(\n                IPAddress.Parse(\"10.93.232.185\"), IPAddress.Parse(\"255.255.240.0\"));\n\n            Assert.Equal(IPAddress.Parse(\"10.93.224.0\"), (IPv4Address)range.Low);\n            Assert.Equal(IPAddress.Parse(\"10.93.239.255\"), (IPv4Address)range.High);\n            Assert.Equal(4096, range.Count);\n        }\n\n        [Fact]\n        public void TestSubnetNicLocal()\n        {\n            var nics = NetworkInformationEx.GetAllNetInterfaces(NetworkClass.Wired).ToList();\n            if (nics.Count == 0)\n            {\n                return;\n            }\n            var nic = nics[0];\n            var range = new AddressRange(nic, true);\n\n            Assert.Equal(nic.UnicastAddress, (IPv4Address)range.Low);\n            Assert.Equal(nic.UnicastAddress, (IPv4Address)range.High);\n            Assert.Equal(1, range.Count);\n        }\n\n        [Fact]\n        public void TestSubnetNic()\n        {\n            var nics = NetworkInformationEx.GetAllNetInterfaces(NetworkClass.Wired).ToList();\n            if (nics.Count == 0)\n            {\n                return;\n            }\n            var nic = nics[0];\n            var expected = new AddressRange(nic.UnicastAddress, nic.SubnetMask);\n            var range = new AddressRange(nic);\n\n            Assert.Equal((IPv4Address)expected.Low, (IPv4Address)range.Low);\n            Assert.Equal((IPv4Address)expected.High, (IPv4Address)range.High);\n            Assert.Equal(expected.Count, range.Count);\n        }\n\n        [Fact]\n        public void TestSingleAddress()\n        {\n            var range = new AddressRange(IPAddress.Loopback, 32, \"local\");\n\n            var list = new List<uint>();\n            range.FillNextBatch(list, 1000);\n\n            Assert.Single(list);\n            Assert.Equal(IPAddress.Loopback, (IPv4Address)list.Single());\n            Assert.Equal(IPAddress.Loopback, (IPv4Address)range.High);\n            Assert.Equal(IPAddress.Loopback, (IPv4Address)range.Low);\n        }\n\n        [Fact]\n        public void TestSimpleRange()\n        {\n            var range = new AddressRange(0, 255);\n\n            Assert.Equal(0u, range.Low);\n            Assert.Equal(255u, range.High);\n            Assert.Equal(256, range.Count);\n            Assert.Equal(IPAddress.Any, (IPv4Address)range.Low);\n        }\n\n        [Fact]\n        public void TestEquality1()\n        {\n            var range1 = new AddressRange(0, 255);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Equal(range1, range2);\n            Assert.True(range1 == range2);\n            Assert.False(range1 != range2);\n        }\n\n        [Fact]\n        public void TestNoneEquality1()\n        {\n            var range1 = new AddressRange(0, 255);\n            var range2 = new AddressRange(1, 255);\n\n            Assert.NotEqual(range1, range2);\n            Assert.True(range1 != range2);\n            Assert.False(range1 == range2);\n        }\n\n        [Fact]\n        public void TestEquality2()\n        {\n            var range1 = new AddressRange((IPv4Address)0u, 24);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Equal(range1, range2);\n            Assert.True(range1 == range2);\n            Assert.False(range1 != range2);\n        }\n\n        [Fact]\n        public void TestParsing1()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0/24\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.Single());\n            Assert.Equal(\"custom\", range1.First().Nic);\n            Assert.Equal(\"0.0.0.0/24\", range1.First().ToString());\n        }\n\n        [Fact]\n        public void TestParsing1WithRange()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0-0.0.0.255\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.Single());\n            Assert.Equal(\"custom\", range1.First().Nic);\n            Assert.Equal(\"0.0.0.0/24\", range1.First().ToString());\n        }\n\n        [Fact]\n        public void TestParsing1WithNic()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0/24[abc]\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.Single());\n            Assert.Equal(\"abc\", range1.First().Nic);\n            Assert.Equal(\"0.0.0.0/24 [abc]\", range1.First().ToString());\n        }\n\n        [Fact]\n        public void TestParsing2()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0/24,0.0.0.0/24\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.First());\n            Assert.Equal(\"custom\", range1.First().Nic);\n            Assert.Equal(\"0.0.0.0/24\", range1.First().ToString());\n        }\n\n        [Fact]\n        public void TestParsing2WithNic()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0/24[xyz],0.0.0.0/24[abc def ]\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.First());\n            Assert.Equal(\"xyz\", range1.First().Nic);\n        }\n\n        [Fact]\n        public void TestParsing3()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0/24;0.0.0.0/24;;;\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.First());\n            Assert.Equal(\"custom\", range1.First().Nic);\n        }\n\n        [Fact]\n        public void TestParsing3b()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0/24;0.0.0.0-0.0.0.255;;;\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.First());\n            Assert.Equal(\"custom\", range1.First().Nic);\n            Assert.Equal(\"0.0.0.0/24\", range1.First().ToString());\n        }\n\n        [Fact]\n        public void TestParsing4()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0/24[abc];0.0.0.0/24[abc];;;\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.First());\n            Assert.Equal(\"abc\", range1.First().Nic);\n        }\n\n        [Fact]\n        public void TestParsing5()\n        {\n            var success = AddressRange.TryParse(\"0.0.0.0/24 [abc];0.0.0.0-0.0.0.255[abc];;;\", out var range1);\n            Assert.True(success);\n            var range2 = new AddressRange(0, 255);\n\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.First());\n            Assert.Equal(\"abc\", range1.First().Nic);\n        }\n\n        [Fact]\n        public void TestParsing6()\n        {\n            const string str = \"1.1.1.1/24[abc];2.2.2.2/24[cde];3.3.3.3/24 [efg]\";\n            var success = AddressRange.TryParse(str, out var ranges);\n\n            var range1 = new AddressRange(16843008, 16843263);\n            var range2 = new AddressRange(33686016, 33686271);\n            var range3 = new AddressRange(50529024, 50529279);\n\n            Assert.Collection(ranges,\n                a =>\n                {\n                    Assert.Equal(range1, a);\n                    Assert.Equal(\"abc\", a.Nic);\n                },\n                b =>\n                {\n                    Assert.Equal(range2, b);\n                    Assert.Equal(\"cde\", b.Nic);\n                },\n                c =>\n                {\n                    Assert.Equal(range3, c);\n                    Assert.Equal(\"efg\", c.Nic);\n                });\n            Assert.Equal(\"1.1.1.0/24 [abc];2.2.2.0/24 [cde];3.3.3.0/24 [efg]\",\n                AddressRange.Format(ranges));\n        }\n\n        [Fact]\n        public void TestParsing7()\n        {\n            const string str = \"192.168.1.0-192.168.2.9[abc]\";\n            var success = AddressRange.TryParse(str, out var ranges);\n            Assert.True(success);\n\n            var range1 = new AddressRange(3232235776, 3232236031);\n            var range2 = new AddressRange(3232236032, 3232236039);\n            var range3 = new AddressRange(3232236040, 3232236041);\n\n            Assert.Collection(ranges,\n                a =>\n                {\n                    Assert.Equal(range1, a);\n                    Assert.Equal(\"abc\", a.Nic);\n                },\n                b =>\n                {\n                    Assert.Equal(range2, b);\n                    Assert.Equal(\"abc\", b.Nic);\n                },\n                c =>\n                {\n                    Assert.Equal(range3, c);\n                    Assert.Equal(\"abc\", c.Nic);\n                });\n\n            Assert.Equal(\"192.168.1.0/24 [abc];192.168.2.0/29 [abc];192.168.2.8/31 [abc]\",\n                AddressRange.Format(ranges));\n        }\n\n        [Fact]\n        public void TestParseFormatExceptions()\n        {\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0/24;x/2;;\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.=0/24\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0-0..0\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0-0.0.\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0/16-0.0.0.0/22\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0-0.0.0.222/3\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0[]\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0.0/2\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0/88\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0.0.0.0/88[333]\"));\n            Assert.Throws<FormatException>(() => AddressRange.Parse(\"0..0/88\"));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/Transport/Models/IPv4AddressTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack.Transport.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models;\n    using System;\n    using System.Net;\n    using Xunit;\n\n    public class IPv4AddressTests\n    {\n        [Fact]\n        public void TestEmptyAddress()\n        {\n            var address = new IPv4Address([0, 0, 0, 0]);\n            uint val = address;\n            long val2 = address;\n            Assert.Equal(0u, val);\n            Assert.Equal(0L, val2);\n            Assert.Equal(address, IPAddress.Any);\n        }\n\n        [Fact]\n        public void TestIncrementAddress()\n        {\n            var address = new IPv4Address([255, 255, 255, 255]);\n            var any = new IPv4Address([0, 0, 0, 0]);\n            var incremented = address + 1;\n            address++;\n            Assert.Equal(0u, (uint)incremented);\n            Assert.Equal(IPAddress.Any, incremented);\n            Assert.Equal(any, incremented);\n            Assert.Equal(0u, (uint)address);\n            Assert.Equal(IPAddress.Any, address);\n            Assert.Equal(any, address);\n        }\n\n        [Fact]\n        public void TestDecrementAddress()\n        {\n            var address = new IPv4Address([0, 0, 0, 0]);\n            var bcast = new IPv4Address([255, 255, 255, 255]);\n            var decremented = address - 1;\n            address--;\n            Assert.Equal((uint)bcast, (uint)decremented);\n            Assert.Equal(IPAddress.Broadcast, decremented);\n            Assert.Equal(bcast, decremented);\n            Assert.Equal(-1, (int)decremented);\n            Assert.Equal((uint)bcast, (uint)address);\n            Assert.Equal(bcast, address);\n            Assert.Equal(IPAddress.Broadcast, address);\n            Assert.Equal(-1, (int)address);\n        }\n\n        [Fact]\n        public void TestSubtractAddress()\n        {\n            var bcast = new IPv4Address([255, 255, 255, 255]);\n            var any = new IPv4Address([0, 0, 0, 0]);\n            var subtracted = bcast - bcast;\n            Assert.Equal(0u, subtracted);\n            Assert.Equal(IPAddress.Any, (IPv4Address)subtracted);\n            Assert.Equal(any, (IPv4Address)subtracted);\n        }\n\n        [Fact]\n        public void ThrowForSize()\n        {\n            Assert.Throws<ArgumentException>(() => new IPv4Address([]));\n            Assert.Throws<ArgumentException>(() => new IPv4Address([0]));\n            Assert.Throws<ArgumentException>(() => new IPv4Address([0, 1, 1, 2, 1]));\n            Assert.Throws<ArgumentException>(() => new IPv4Address([0, 2, 4]));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Stack/Transport/Models/PortRangeTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Stack.Transport.Models\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Transport.Models;\n    using System;\n    using System.Linq;\n    using Xunit;\n\n    public class PortRangeTests\n    {\n        [Fact]\n        public void TestSimpleRange()\n        {\n            var range1 = new PortRange(0, 100);\n            var range2 = new PortRange(100, 0);\n\n            Assert.Equal(101, range1.Count);\n            Assert.Equal(range1, range2);\n            Assert.False(range1 != range2);\n            Assert.True(range1 == range2);\n            Assert.True(range1.Overlaps(range2));\n            Assert.True(range1.Contains(0));\n            Assert.True(range1.Contains(100));\n            Assert.True(range1.Contains(6));\n        }\n\n        [Fact]\n        public void TestNoneEquality1()\n        {\n            var range1 = new PortRange(0, 4);\n            var range2 = new PortRange(1, 4);\n\n            Assert.NotEqual(range1, range2);\n            Assert.True(range1 != range2);\n            Assert.False(range1 == range2);\n            Assert.True(range1.Overlaps(range2));\n        }\n\n        [Fact]\n        public void TestNoneEquality2()\n        {\n            var range1 = new PortRange(0, 4);\n            var range2 = new PortRange(7, 9);\n\n            Assert.NotEqual(range1, range2);\n            Assert.True(range1 != range2);\n            Assert.False(range1 == range2);\n            Assert.False(range1.Overlaps(range2));\n        }\n\n        [Fact]\n        public void TestParsing1()\n        {\n            var success = PortRange.TryParse(\"0-100\", out var range1);\n            var range2 = new PortRange(0, 100);\n\n            Assert.True(success);\n            Assert.Single(range1);\n            Assert.Equal(range2, range1.Single());\n            Assert.Equal(\"0-100\", PortRange.Format(range1));\n        }\n\n        [Fact]\n        public void TestParsing2()\n        {\n            var success = PortRange.TryParse(\"0-100;144\", out var range1);\n            var range2 = new PortRange(0, 100);\n            var range3 = new PortRange(144);\n\n            Assert.True(success);\n            Assert.Equal(range2, range1.First());\n            Assert.Equal(range3, range1.Skip(1).First());\n            Assert.Equal(2, range1.Count());\n            Assert.Equal(\"0-100;144\", PortRange.Format(range1));\n        }\n\n        [Fact]\n        public void TestParsing2b()\n        {\n            var success = PortRange.TryParse(\"0-100;44\", out var range1);\n            var range2 = new PortRange(0, 100);\n\n            Assert.True(success);\n            Assert.Equal(range2, range1.First());\n            Assert.Single(range1);\n            Assert.Equal(\"0-100\", PortRange.Format(range1));\n        }\n\n        [Fact]\n        public void TestParsing3()\n        {\n            var success = PortRange.TryParse(\"0,3,6,,,,\", out var range1);\n\n            Assert.True(success);\n            Assert.Equal(new PortRange(0), range1.First());\n            Assert.Equal(new PortRange(3), range1.Skip(1).First());\n            Assert.Equal(new PortRange(6), range1.Skip(2).First());\n            Assert.Equal(3, range1.Count());\n            Assert.Equal(\"0;3;6\", PortRange.Format(range1));\n        }\n\n        [Fact]\n        public void TestParsing3b()\n        {\n            var success = PortRange.TryParse(\"0-1,3-4,6-9,,,,\", out var range1);\n\n            Assert.True(success);\n            Assert.Equal(new PortRange(0, 1), range1.First());\n            Assert.Equal(new PortRange(3, 4), range1.Skip(1).First());\n            Assert.Equal(new PortRange(6, 9), range1.Skip(2).First());\n            Assert.Equal(3, range1.Count());\n            Assert.Equal(\"0-1;3-4;6-9\", PortRange.Format(range1));\n        }\n\n        [Fact]\n        public void TestParsing3c()\n        {\n            var success = PortRange.TryParse(\"0-1;3-4;6-*\", out var range1);\n\n            Assert.True(success);\n            Assert.Equal(new PortRange(0, 1), range1.First());\n            Assert.Equal(new PortRange(3, 4), range1.Skip(1).First());\n            Assert.Equal(new PortRange(6, 65536), range1.Skip(2).First());\n            Assert.Equal(3, range1.Count());\n            Assert.Equal(\"0-1;3-4;6-*\", PortRange.Format(range1));\n        }\n\n        [Fact]\n        public void TestParsing3d()\n        {\n            var success = PortRange.TryParse(\"0-1,1-2,2-3,,,,\", out var range1);\n\n            Assert.True(success);\n            Assert.Single(range1);\n            Assert.Equal(new PortRange(0, 3), range1.First());\n            Assert.Equal(\"0-3\", PortRange.Format(range1));\n        }\n\n        [Fact]\n        public void TestParsing4()\n        {\n            var success = PortRange.TryParse(\",,,,\", out var range1);\n            Assert.True(success);\n            Assert.Empty(range1);\n        }\n\n        [Fact]\n        public void TestParsing5()\n        {\n            var success = PortRange.TryParse(\"*\", out var range1);\n            Assert.True(success);\n            Assert.Single(range1);\n            Assert.Equal(new PortRange(0, 65536), range1.Single());\n            Assert.Equal(\"*\", range1.Single().ToString());\n        }\n\n        [Fact]\n        public void TestParsing6()\n        {\n            var success = PortRange.TryParse(\"100-*\", out var range1);\n            Assert.True(success);\n            Assert.Single(range1);\n            Assert.Equal(new PortRange(100, 65536), range1.Single());\n            Assert.Equal(\"100-*\", range1.Single().ToString());\n        }\n\n        [Fact]\n        public void TestParsing7()\n        {\n            var success = PortRange.TryParse(\"*-100\", out var range1);\n            Assert.True(success);\n            Assert.Single(range1);\n            Assert.Equal(new PortRange(0, 100), range1.Single());\n            Assert.Equal(\"0-100\", range1.Single().ToString());\n        }\n\n        [Fact]\n        public void TestParseFormatExceptions()\n        {\n            Assert.Throws<FormatException>(() => PortRange.Parse(\"0.0.0.0/24;x/2;;\"));\n            Assert.Throws<FormatException>(() => PortRange.Parse(\"abf,d\"));\n            Assert.Throws<FormatException>(() => PortRange.Parse(\"0-1-2\"));\n            Assert.Throws<FormatException>(() => PortRange.Parse(\"0,1-2,f,\"));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Storage/PublishedNodesJobConverterTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Storage\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Storage;\n    using Furly.Azure.IoT.Edge.Services;\n    using Furly.Extensions.Logging;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Options;\n    using Moq;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    /// <summary>\n    /// The referenced schema file across these test is a linked asset in the\n    /// project file set to copy to the output build directory so that it can\n    /// be easily referenced here.\n    /// </summary>\n    public class PublishedNodesJobConverterTests\n    {\n        [Fact]\n        public void PnPlcEmptyTest()\n        {\n            const string pn = @\"\n[\n]\n\";\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var writerGroups = converter.Read(pn);\n\n            // No writerGroups\n            Assert.Empty(writerGroups);\n        }\n\n        [Fact]\n        public void PnPlcNullNodesTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"OpcAuthenticationUsername\": \"OpcAuthenticationUsername\",\n        \"OpcAuthenticationPassword\": \"OpcAuthenticationPassword\"\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions(), null);\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Equal(\"OpcAuthenticationPassword\", entry.OpcAuthenticationPassword);\n            Assert.Equal(\"OpcAuthenticationUsername\", entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n            Assert.Null(entry.OpcNodes);\n\n            var writerGroups = converter.ToWriterGroups(entries);\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var writer = Assert.Single(group.DataSetWriters);\n            Assert.NotNull(writer.DataSet?.DataSetSource);\n            Assert.NotNull(writer.DataSet.DataSetSource.PublishedVariables?.PublishedData);\n            Assert.Empty(writer.DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.NotNull(writer.DataSet.DataSetSource.PublishedEvents?.PublishedData);\n            Assert.Empty(writer.DataSet.DataSetSource.PublishedEvents.PublishedData);\n\n            var credential = writer.DataSet.DataSetSource.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.UserName, credential.Type);\n            Assert.Equal(\"OpcAuthenticationPassword\", credential.Value.Password);\n            Assert.Equal(\"OpcAuthenticationUsername\", credential.Value.User);\n\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups);\n            entry = Assert.Single(entries);\n            Assert.Equal(\"OpcAuthenticationPassword\", entry.OpcAuthenticationPassword);\n            Assert.Equal(\"OpcAuthenticationUsername\", entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n            Assert.Empty(entry.OpcNodes);\n        }\n\n        [Fact]\n        public void PnPlcNoNodesTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": []\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions(), null);\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Empty(entry.OpcNodes);\n\n            var writerGroups = converter.ToWriterGroups(entries);\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var writer = Assert.Single(group.DataSetWriters);\n            Assert.NotNull(writer.DataSet?.DataSetSource);\n            Assert.NotNull(writer.DataSet.DataSetSource.PublishedVariables?.PublishedData);\n            Assert.Empty(writer.DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.NotNull(writer.DataSet.DataSetSource.PublishedEvents?.PublishedData);\n            Assert.Empty(writer.DataSet.DataSetSource.PublishedEvents.PublishedData);\n\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups);\n            entry = Assert.Single(entries);\n            Assert.Empty(entry.OpcNodes);\n        }\n\n        [Theory]\n        [InlineData(false, false)]\n        [InlineData(true, false)]\n        [InlineData(true, true)]\n        public void PnPlcPlainTextUserNamePasswordTest(bool withCryptoProvider, bool providerThrows)\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"OpcAuthenticationUsername\": \"OpcAuthenticationUsername\",\n        \"OpcAuthenticationPassword\": \"OpcAuthenticationPassword\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions(),\n                cryptoProvider: withCryptoProvider ? providerThrows ? CreateThrowProvider() : CreateMockProvider() : null);\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Equal(\"OpcAuthenticationPassword\", entry.OpcAuthenticationPassword);\n            Assert.Equal(\"OpcAuthenticationUsername\", entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n\n            var writerGroups = converter.ToWriterGroups(entries);\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var credential = Assert.Single(group.DataSetWriters).DataSet?.DataSetSource?.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.UserName, credential.Type);\n            Assert.Equal(\"OpcAuthenticationPassword\", credential.Value.Password);\n            Assert.Equal(\"OpcAuthenticationUsername\", credential.Value.User);\n\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups);\n            entry = Assert.Single(entries);\n            Assert.Equal(\"OpcAuthenticationPassword\", entry.OpcAuthenticationPassword);\n            Assert.Equal(\"OpcAuthenticationUsername\", entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void PnPlcPlainTextUserNamePasswordWithCryptoProviderForceEncryptionTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"OpcAuthenticationUsername\": \"DecryptedAuthUsername\",\n        \"OpcAuthenticationPassword\": \"DecryptedAuthPassword\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.ForceCredentialEncryption = true;\n            var converter = new PublishedNodesConverter(logger, _serializer, options, CreateMockProvider());\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Equal(\"DecryptedAuthPassword\", entry.OpcAuthenticationPassword);\n            Assert.Equal(\"DecryptedAuthUsername\", entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n\n            var writerGroups = converter.ToWriterGroups(entries);\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var credential = Assert.Single(group.DataSetWriters).DataSet?.DataSetSource?.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.UserName, credential.Type);\n            Assert.Equal(\"DecryptedAuthPassword\", credential.Value.Password);\n            Assert.Equal(\"DecryptedAuthUsername\", credential.Value.User);\n\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups);\n            entry = Assert.Single(entries);\n            var encryptedAuthUsername = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthUsername\"));\n            var encryptedAuthPassword = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthPassword\"));\n            Assert.Equal(encryptedAuthPassword, entry.EncryptedAuthPassword);\n            Assert.Equal(encryptedAuthUsername, entry.EncryptedAuthUsername);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void PnPlcEncryptedUserNamePasswordWithoutCryptoProviderTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"EncryptedAuthUsername\": \"EncryptedAuthUsername\",\n        \"EncryptedAuthPassword\": \"EncryptedAuthPassword\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Equal(\"EncryptedAuthUsername\", entry.EncryptedAuthUsername);\n            Assert.Equal(\"EncryptedAuthPassword\", entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n\n            var writerGroups = converter.ToWriterGroups(entries);\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var credential = Assert.Single(group.DataSetWriters).DataSet?.DataSetSource?.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.None, credential.Type);\n            Assert.Null(credential.Value);\n\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups);\n            entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.Anonymous, entry.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void PnPlcEncryptedUserNamePasswordWithThrowingCryptoProviderTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"EncryptedAuthUsername\": \"EncryptedAuthUsername\",\n        \"EncryptedAuthPassword\": \"EncryptedAuthPassword\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions(), cryptoProvider: CreateThrowProvider());\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Equal(\"EncryptedAuthUsername\", entry.EncryptedAuthUsername);\n            Assert.Equal(\"EncryptedAuthPassword\", entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n\n            var writerGroups = converter.ToWriterGroups(entries);\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var credential = Assert.Single(group.DataSetWriters).DataSet?.DataSetSource?.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.None, credential.Type);\n            Assert.Null(credential.Value);\n\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups);\n            entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.Anonymous, entry.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void PnPlcEncryptedUserNamePasswordWithCryptoProviderTest()\n        {\n            var encryptedAuthUsername = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthUsername\"));\n            var encryptedAuthPassword = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthPassword\"));\n            var pn = $$\"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"EncryptedAuthUsername\": \"{{encryptedAuthUsername}}\",\n        \"EncryptedAuthPassword\": \"{{encryptedAuthPassword}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions(), cryptoProvider: CreateMockProvider());\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Equal(encryptedAuthUsername, encryptedAuthUsername);\n            Assert.Equal(encryptedAuthPassword, entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n\n            var writerGroups = converter.ToWriterGroups(entries);\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var credential = Assert.Single(group.DataSetWriters).DataSet?.DataSetSource?.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.UserName, credential.Type);\n            Assert.Equal(\"DecryptedAuthPassword\", credential.Value.Password);\n            Assert.Equal(\"DecryptedAuthUsername\", credential.Value.User);\n\n            // Now we should have converted back to plain text\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups);\n            entry = Assert.Single(entries);\n            Assert.Equal(\"DecryptedAuthPassword\", entry.OpcAuthenticationPassword);\n            Assert.Equal(\"DecryptedAuthUsername\", entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void PnPlcEncryptedUserNamePasswordWithCryptoProviderAndForceEncryptionTest()\n        {\n            var encryptedAuthUsername = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthUsername\"));\n            var encryptedAuthPassword = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthPassword\"));\n            var pn = $$\"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"EncryptedAuthUsername\": \"{{encryptedAuthUsername}}\",\n        \"EncryptedAuthPassword\": \"{{encryptedAuthPassword}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.ForceCredentialEncryption = true;\n            var converter = new PublishedNodesConverter(logger, _serializer, options, CreateMockProvider());\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Equal(encryptedAuthUsername, encryptedAuthUsername);\n            Assert.Equal(encryptedAuthPassword, entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n\n            var writerGroups = converter.ToWriterGroups(entries);\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var credential = Assert.Single(group.DataSetWriters).DataSet?.DataSetSource?.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.UserName, credential.Type);\n            Assert.Equal(\"DecryptedAuthPassword\", credential.Value.Password);\n            Assert.Equal(\"DecryptedAuthUsername\", credential.Value.User);\n\n            // Now we should have converted back to encrypted\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups);\n            entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Equal(encryptedAuthUsername, entry.EncryptedAuthUsername);\n            Assert.Equal(encryptedAuthPassword, entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void PnPlcEncryptedUserNamePasswordWithoutCryptoProviderAndForceEncryptionTest()\n        {\n            var encryptedAuthUsername = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthUsername\"));\n            var encryptedAuthPassword = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthPassword\"));\n            var pn = $$\"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"EncryptedAuthUsername\": \"{{encryptedAuthUsername}}\",\n        \"EncryptedAuthPassword\": \"{{encryptedAuthPassword}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var failFastCalled = false;\n            Publisher.Runtime.FailFast = (_, _) => failFastCalled = true;\n\n            var logger = Log.Console<PublishedNodesConverter>();\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.ForceCredentialEncryption = true;\n            var converter = new PublishedNodesConverter(logger, _serializer, options);\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Equal(encryptedAuthUsername, encryptedAuthUsername);\n            Assert.Equal(encryptedAuthPassword, entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n            Assert.True(failFastCalled); // Process exited\n            failFastCalled = false;\n\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var credential = Assert.Single(group.DataSetWriters).DataSet?.DataSetSource?.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.None, credential.Type);\n            Assert.Null(credential.Value);\n\n            // Fake credential\n            credential.Value = new UserIdentityModel { User = \"user\", Password = \"password\" };\n            credential.Type = CredentialType.UserName;\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups).ToList();\n            Assert.True(failFastCalled); // Process exited\n            entry = Assert.Single(entries);\n            Assert.Equal(\"password\", entry.OpcAuthenticationPassword);\n            Assert.Equal(\"user\", entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void PnPlcEncryptedUserNamePasswordWithoutThrowingCryptoProviderAndForceEncryptionTest()\n        {\n            var encryptedAuthUsername = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthUsername\"));\n            var encryptedAuthPassword = Convert.ToBase64String(Encoding.UTF8.GetBytes(\"EncryptedAuthPassword\"));\n            var pn = $$\"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcAuthenticationMode\": \"usernamePassword\",\n        \"EncryptedAuthUsername\": \"{{encryptedAuthUsername}}\",\n        \"EncryptedAuthPassword\": \"{{encryptedAuthPassword}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var failFastCalled = false;\n            Publisher.Runtime.FailFast = (_, _) => failFastCalled = true;\n\n            var logger = Log.Console<PublishedNodesConverter>();\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.ForceCredentialEncryption = true;\n            var converter = new PublishedNodesConverter(logger, _serializer, options, CreateThrowProvider());\n\n            var entries = converter.Read(pn);\n            var entry = Assert.Single(entries);\n            Assert.Null(entry.OpcAuthenticationPassword);\n            Assert.Null(entry.OpcAuthenticationUsername);\n            Assert.Equal(encryptedAuthUsername, encryptedAuthUsername);\n            Assert.Equal(encryptedAuthPassword, entry.EncryptedAuthPassword);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n            Assert.True(failFastCalled); // Process exited\n            failFastCalled = false;\n\n            Assert.NotEmpty(writerGroups);\n            var group = Assert.Single(writerGroups);\n            var credential = Assert.Single(group.DataSetWriters).DataSet?.DataSetSource?.Connection?.User;\n            Assert.NotNull(credential);\n            Assert.Equal(CredentialType.None, credential.Type);\n            Assert.Null(credential.Value);\n\n            // Now we should have converted back to encrypted\n            // Fake credential\n            credential.Value = new UserIdentityModel { User = \"user\", Password = \"password\" };\n            credential.Type = CredentialType.UserName;\n            entries = converter.ToPublishedNodes(3, DateTimeOffset.UtcNow, writerGroups).ToList();\n            Assert.True(failFastCalled); // Process exited\n            entry = Assert.Single(entries);\n            Assert.Equal(\"password\", entry.OpcAuthenticationPassword);\n            Assert.Equal(\"user\", entry.OpcAuthenticationUsername);\n            Assert.Null(entry.EncryptedAuthPassword);\n            Assert.Null(entry.EncryptedAuthUsername);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, entry.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetWriterIdTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterId\": \"testid\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"testid\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSetWriterName);\n            Assert.Equal(\"5256a3e80f028d78c673bac7866a09b3b3bb69fa_0\", writerGroups\n                .Single().DataSetWriters\n                .Single().Id);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetWriterIdIsNullTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"39d40f4aae5f07696bc0737f6ba45a4d4bd63d79_0\", writerGroups\n                .Single().DataSetWriters\n                .Single().Id);\n            Assert.Null(writerGroups\n                .Single().DataSetWriters\n                .Single().DataSetWriterName);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetWriterGroupTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterGroup\": \"testgroup\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"testgroup\", writerGroups\n                .Single().Name);\n            Assert.Equal(\"8b7a6decc0651d269ea794c7e699bfcf77a97c31\", writerGroups\n                .Single().Id);\n            Assert.Null(writerGroups // Will be set later based on configuration.\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Group);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetFieldId1Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DataSetFieldId\": \"testfieldid1\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"testfieldid1\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().Id);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetFieldId2Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DataSetFieldId\": \"testfieldid1\"\n            },\n            {\n                \"Id\": \"i=2259\",\n                \"DataSetFieldId\": \"testfieldid2\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(2, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Count);\n            Assert.Equal(\"testfieldid1\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData[0].Id);\n            Assert.Equal(\"testfieldid2\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData[writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Count - 1].Id);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetFieldIdDuplicateTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DataSetFieldId\": \"testfieldid\"\n            },\n            {\n                \"Id\": \"i=2259\",\n                \"DataSetFieldId\": \"testfieldid\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(2, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Count);\n            Assert.Equal(\"testfieldid\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData[0].Id);\n            Assert.Equal(\"testfieldid\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData[writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Count - 1].Id);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDisplayNameDuplicateTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DisplayName\": \"testdisplayname\"\n            },\n            {\n                \"Id\": \"i=2259\",\n                \"DisplayName\": \"testdisplayname\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(2, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Count);\n            Assert.Equal(\"testdisplayname\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData[0].PublishedVariableDisplayName);\n            Assert.Equal(\"testdisplayname\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData[writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Count - 1].PublishedVariableDisplayName);\n        }\n\n        [Fact]\n        public void PnPlcPubSubFullDuplicateTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DisplayName\": \"testdisplayname\",\n                \"DataSetFieldId\": \"testfieldid\"\n            },\n            {\n                \"Id\": \"i=2259\",\n                \"DisplayName\": \"testdisplayname\",\n                \"DataSetFieldId\": \"testfieldid\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(2, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Count);\n            Assert.Equal(\"testfieldid\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData[0].Id);\n            Assert.Equal(\"testfieldid\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData[writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Count - 1].Id);\n        }\n\n        [Fact]\n        public void PnPlcPubSubFullTest1()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterGroup\": \"testgroup\",\n        \"DataSetWriterId\": \"testwriterid\",\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DataSetFieldId\": \"testfieldid1\",\n                \"OpcPublishingInterval\": 2000\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Single(writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.Equal(\"testfieldid1\", writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData[0].Id);\n            Assert.Equal(\"i=2258\", writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData[0].PublishedVariableNodeId);\n            Assert.Equal(\"testgroup\", writerGroups\n                .Single().Name);\n            Assert.Equal(\"8b7a6decc0651d269ea794c7e699bfcf77a97c31\", writerGroups\n                .Single().Id);\n            Assert.Null(writerGroups // Will be set later based on configuration.\n                .Single().DataSetWriters[0].DataSet.DataSetSource.Connection.Group);\n            Assert.Equal(\"testwriterid\", writerGroups\n                .Single().DataSetWriters[0].DataSetWriterName);\n            Assert.Equal(2000, writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubFullTest2()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterGroup\": \"testgroup\",\n        \"DataSetWriterId\": \"testwriterid\",\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DataSetFieldId\": \"testfieldid1\",\n                \"OpcPublishingInterval\": 1000\n            },\n            {\n                \"Id\": \"i=2259\",\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            // Single group, single writer, double published data\n            Assert.Equal(2, writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData.Count);\n            Assert.Equal(\"testfieldid1\", writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData[0].Id);\n            Assert.Equal(\"i=2258\", writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData[0].PublishedVariableNodeId);\n            Assert.Null(writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData[1].Id);\n            Assert.Equal(\"i=2259\", writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData[1].PublishedVariableNodeId);\n            Assert.Equal(\"testgroup\", writerGroups\n                .Single().Name);\n            Assert.Equal(\"8b7a6decc0651d269ea794c7e699bfcf77a97c31\", writerGroups\n                .Single().Id);\n            Assert.Null(writerGroups // Will be set later based on configuration.\n                .Single().DataSetWriters[0].DataSet.DataSetSource.Connection.Group);\n            Assert.Equal(\"testwriterid\", writerGroups\n                .Single().DataSetWriters[0].DataSetWriterName);\n            Assert.Equal(1000, writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubFullTest3()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetWriterGroup\": \"testgroup\",\n        \"DataSetWriterId\": \"testwriterid\",\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DataSetFieldId\": \"testfieldid1\",\n                \"OpcPublishingInterval\": 2000\n            },\n            {\n                \"Id\": \"i=2259\",\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            // Single group, double writer, single published data\n            Assert.Single(writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.Equal(\"testfieldid1\", writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData[0].Id);\n            Assert.Equal(\"i=2258\", writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData[0].PublishedVariableNodeId);\n            Assert.Null(writerGroups\n                .Single().DataSetWriters[writerGroups\n                .Single().DataSetWriters.Count - 1].DataSet.DataSetSource.PublishedVariables.PublishedData[writerGroups\n                .Single().DataSetWriters[writerGroups\n                .Single().DataSetWriters.Count - 1].DataSet.DataSetSource.PublishedVariables.PublishedData.Count - 1].Id);\n            Assert.Equal(\"i=2259\", writerGroups\n                .Single().DataSetWriters[writerGroups\n                .Single().DataSetWriters.Count - 1].DataSet.DataSetSource.PublishedVariables.PublishedData[writerGroups\n                .Single().DataSetWriters[writerGroups\n                .Single().DataSetWriters.Count - 1].DataSet.DataSetSource.PublishedVariables.PublishedData.Count - 1].PublishedVariableNodeId);\n            Assert.Equal(\"testgroup\", writerGroups\n                .Single().Name);\n            Assert.Equal(\"8b7a6decc0651d269ea794c7e699bfcf77a97c31\", writerGroups\n                .Single().Id);\n            Assert.Null(writerGroups // Will be set later based on configuration.\n                .Single().DataSetWriters[0].DataSet.DataSetSource.Connection.Group);\n            Assert.Equal(\"testwriterid\", writerGroups\n                .Single().DataSetWriters[0].DataSetWriterName);\n            Assert.Equal(2000, writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n            Assert.Equal(1000, writerGroups\n                .Single().DataSetWriters[writerGroups\n                .Single().DataSetWriters.Count - 1].DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetPublishingInterval1Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(1000, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetPublishingInterval2Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"OpcPublishingInterval\": 2000\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(2000, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetPublishingInterval3Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\"\n            },\n            {\n                \"Id\": \"i=2259\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(1000, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetPublishingInterval4Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"OpcPublishingInterval\": 2000\n            },\n            {\n                \"Id\": \"i=2259\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(2000, writerGroups\n                .First().DataSetWriters[0].DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetPublishingIntervalTimespan1Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingIntervalTimespan\": \"00:00:01\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(1000, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetPublishingIntervalTimespan2Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingIntervalTimespan\": \"00:00:01\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"OpcPublishingIntervalTimespan\": \"00:00:02\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(2000, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetPublishingIntervalTimespan3Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingIntervalTimespan\": \"00:00:01\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\"\n            },\n            {\n                \"Id\": \"i=2259\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(1000, writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDataSetPublishingIntervalTimespan4Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingIntervalTimespan\": \"00:00:01\",\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n            },\n            {\n                \"Id\": \"i=2259\",\n                \"OpcPublishingInterval\": 3000\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(1000, writerGroups\n                .Single().DataSetWriters[0].DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDisplayName1Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DisplayName\": \"testdisplayname1\"\n            },\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"testdisplayname1\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().PublishedVariableDisplayName);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDisplayName2Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n            },\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Null(writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().Id);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDisplayName3Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DisplayName\": \"testdisplayname1\",\n                \"DataSetFieldId\": \"testdatasetfieldid1\",\n            },\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"testdatasetfieldid1\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().Id);\n        }\n\n        [Fact]\n        public void PnPlcPubSubDisplayName4Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DataSetFieldId\": \"testdatasetfieldid1\",\n            },\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"testdatasetfieldid1\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().Id);\n        }\n\n        [Fact]\n        public void PnPlcPubSubPublishedNodeDisplayName1Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DisplayName\": \"testdisplayname1\"\n            },\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"testdisplayname1\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().PublishedVariableDisplayName);\n        }\n\n        [Fact]\n        public void PnPlcPubSubPublishedNodeDisplayName2Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n            },\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Null(writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().PublishedVariableDisplayName);\n        }\n\n        [Fact]\n        public void PnPlcPubSubPublishedNodeDisplayName3Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DisplayName\": \"testdisplayname1\",\n                \"DataSetFieldId\": \"testdatasetfieldid1\",\n            },\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Equal(\"testdisplayname1\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().PublishedVariableDisplayName);\n        }\n\n        [Fact]\n        public void PnPlcPubSubPublishedNodeDisplayName4Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"DataSetPublishingInterval\": 1000,\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DataSetFieldId\": \"testdatasetfieldid1\",\n            },\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Null(writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.PublishedVariables.PublishedData.Single().PublishedVariableDisplayName);\n        }\n\n        [Fact]\n        public void PnPlcHeartbeatInterval2Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatInterval\": 2\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Single(writerGroups\n                .Single().DataSetWriters);\n            Assert.Equal(\"opc.tcp://localhost:50000\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n            Assert.Equal(2, j\n                .DataSetWriters.Single()\n                .DataSet.DataSetSource.PublishedVariables.PublishedData.Single()\n                .HeartbeatInterval.Value.TotalSeconds);\n        }\n\n        [Fact]\n        public void PnPlcHeartbeatIntervalTimespanTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"HeartbeatIntervalTimespan\": \"00:00:01.500\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Single(writerGroups\n                .Single().DataSetWriters);\n            Assert.Equal(\"opc.tcp://localhost:50000\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n            Assert.Equal(1500, j\n                .DataSetWriters.Single()\n                .DataSet.DataSetSource.PublishedVariables.PublishedData.Single()\n                .HeartbeatInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcHeartbeatSkipSingleTrueTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"SkipSingle\": true\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Single(writerGroups\n                .Single().DataSetWriters);\n            Assert.Equal(\"opc.tcp://localhost:50000\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n        }\n\n        [Fact]\n        public void PnPlcHeartbeatSkipSingleFalseTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"SkipSingle\": false\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            Assert.Single(writerGroups);\n            Assert.Single(writerGroups\n                .Single().DataSetWriters);\n            Assert.Equal(\"opc.tcp://localhost:50000\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n        }\n\n        [Fact]\n        public void PnPlcPublishingInterval2000Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"OpcPublishingInterval\": 2000\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n            Assert.Single(j.DataSetWriters);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(\"opc.tcp://localhost:50000\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n            Assert.Equal(2000, j.DataSetWriters.Single()\n                .DataSet.DataSetSource.SubscriptionSettings.PublishingInterval.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcPublishingIntervalCliTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n            Assert.Single(j.DataSetWriters);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(\"opc.tcp://localhost:50000\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n            Assert.Null(j.DataSetWriters.Single()\n                .DataSet.DataSetSource.SubscriptionSettings.PublishingInterval);\n        }\n\n        [Fact]\n        public void PnPlcSamplingInterval2000Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"OpcSamplingInterval\": 2000\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n            Assert.Single(j.DataSetWriters);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(\"opc.tcp://localhost:50000\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n            Assert.Equal(2000, j\n             .DataSetWriters.Single()\n             .DataSet.DataSetSource.PublishedVariables.PublishedData.Single()\n             .SamplingIntervalHint.Value.TotalMilliseconds);\n        }\n\n        [Fact]\n        public void PnPlcExpandedNodeIdTest()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"ExpandedNodeId\": \"nsu=http://opcfoundation.org/UA/;i=2258\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n            Assert.Single(j.DataSetWriters);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(\"opc.tcp://localhost:50000\", writerGroups\n                .Single().DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n        }\n\n        [Fact]\n        public void PnPlcExpandedNodeId2Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"ExpandedNodeId\": \"nsu=http://opcfoundation.org/UA/;i=2258\"\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2262\"\n            },\n            {\n                \"Id\": \"ns=2;s=AlternatingBoolean\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Single(j.DataSetWriters);\n            Assert.Equal(\"opc.tcp://localhost:50000\", j.DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n        }\n\n        [Fact]\n        public void PnPlcExpandedNodeId3Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\"\n            },\n            {\n                \"Id\": \"ns=2;s=DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Single(j.DataSetWriters);\n            Assert.Equal(\"opc.tcp://localhost:50000\", j.DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n        }\n\n        [Fact]\n        public void PnPlcExpandedNodeId4Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"NodeId\": {\n                \"Identifier\": \"i=2258\"\n        }\n        },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"NodeId\": {\n            \"Identifier\": \"ns=0;i=2261\"\n        }\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n\n            {\n                \"ExpandedNodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\"\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2262\"\n            },\n            {\n                \"Id\": \"ns=2;s=DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Single(j.DataSetWriters);\n            Assert.Equal(\"opc.tcp://localhost:50000\", j.DataSetWriters\n                .Single().DataSet.DataSetSource.Connection.Endpoint.Url);\n        }\n\n        [Fact]\n        public void PnPlcMultiJob1Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost1:50000\",\n        \"NodeId\": {\n                \"Identifier\": \"i=2258\"\n        }\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost2:50000\",\n        \"NodeId\": {\n            \"Identifier\": \"ns=0;i=2261\"\n        }\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost3:50000\",\n        \"OpcNodes\": [\n\n            {\n                \"ExpandedNodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\"\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost4:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2262\"\n            },\n            {\n                \"Id\": \"ns=2;s=DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(4, j.DataSetWriters.Count);\n        }\n\n        [Fact]\n        public void PnPlcMultiJob2Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50001\",\n        \"NodeId\": {\n                \"Identifier\": \"i=2258\",\n        }\n        },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n        \"NodeId\": {\n            \"Identifier\": \"ns=0;i=2261\"\n        }\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50003\",\n        \"OpcNodes\": [\n            {\n                \"OpcPublishingInterval\": 1000,\n                \"ExpandedNodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\"\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50004\",\n        \"OpcNodes\": [\n            {\n                \"OpcPublishingInterval\": 1000,\n                \"Id\": \"i=2262\"\n            },\n            {\n                \"OpcPublishingInterval\": 1000,\n                \"Id\": \"ns=2;s=DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\",\n                \"OpcPublishingInterval\": 1000\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var endpointUrls = new string[] {\n                \"opc.tcp://localhost:50001\",\n                \"opc.tcp://localhost:50002\",\n                \"opc.tcp://localhost:50003\",\n                \"opc.tcp://localhost:50004\"\n            };\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(4, j.DataSetWriters.Count);\n            Assert.True(endpointUrls.ToHashSet().SetEqualsSafe(\n                j.DataSetWriters.Select(w => w.DataSet.DataSetSource.Connection.Endpoint.Url)));\n        }\n\n        [Fact]\n        public void PnPlcMultiJob3Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"NodeId\": {\n                \"Identifier\": \"i=2258\",\n        }\n        },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"NodeId\": {\n            \"Identifier\": \"ns=0;i=2261\"\n        }\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50001\",\n        \"OpcNodes\": [\n            {\n                \"OpcPublishingInterval\": 1000,\n                \"ExpandedNodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\"\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50001\",\n        \"OpcNodes\": [\n            {\n                \"OpcPublishingInterval\": 1000,\n                \"Id\": \"i=2262\"\n            },\n            {\n                \"OpcPublishingInterval\": 1000,\n                \"Id\": \"ns=2;s=DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\",\n                \"OpcPublishingInterval\": 1000\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var endpointUrls = new string[] {\n                \"opc.tcp://localhost:50000\",\n                \"opc.tcp://localhost:50001\"\n            };\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(2, j.DataSetWriters.Count);\n            Assert.True(endpointUrls.ToHashSet().SetEqualsSafe(\n                j.DataSetWriters.Select(w => w.DataSet.DataSetSource.Connection.Endpoint.Url)));\n        }\n\n        [Fact]\n        public void PnPlcMultiJob4Test()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"NodeId\": {\n                \"Identifier\": \"i=2258\",\n        }\n        },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"NodeId\": {\n            \"Identifier\": \"ns=0;i=2261\"\n        }\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50001\",\n        \"OpcNodes\": [\n            {\n                \"ExpandedNodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\"\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50001\",\n        \"OpcNodes\": [\n            {\n                \"OpcPublishingInterval\": 2000,\n                \"Id\": \"i=2262\"\n            },\n            {\n                \"OpcPublishingInterval\": 2000,\n                \"Id\": \"ns=2;s=DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\",\n            }\n        ]\n    }\n]\n\n\"\"\";\n            var endpointUrls = new string[] {\n                \"opc.tcp://localhost:50000\",\n                \"opc.tcp://localhost:50001\"\n            };\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries);\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(3, j.DataSetWriters.Count);\n            Assert.True(endpointUrls.ToHashSet().SetEqualsSafe(\n                j.DataSetWriters.Select(w => w.DataSet.DataSetSource.Connection.Endpoint.Url)));\n        }\n\n        [Theory]\n        [InlineData(\"Publisher/publishednodes_with_duplicates.json\")]\n        public async Task PnWithDuplicatesTestAsync(string publishedNodesJsonFile)\n        {\n            var pn = await File.ReadAllTextAsync(publishedNodesJsonFile);\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(2, j.DataSetWriters.Count);\n            Assert.All(j.DataSetWriters, dataSetWriter => Assert.Equal(\"opc.tcp://10.0.0.1:59412\",\n                dataSetWriter.DataSet.DataSetSource.Connection.Endpoint.Url));\n            Assert.Single(j.DataSetWriters, dataSetWriter => TimeSpan.FromMinutes(15) ==\n                dataSetWriter.DataSet.DataSetSource.SubscriptionSettings.PublishingInterval);\n            Assert.Single(j.DataSetWriters, dataSetWriter => TimeSpan.FromMinutes(1) ==\n                dataSetWriter.DataSet.DataSetSource.SubscriptionSettings.PublishingInterval);\n            Assert.Single(j.DataSetWriters, dataSetWriter =>\n                dataSetWriter.DataSet.DataSetSource.PublishedVariables.PublishedData.Any(\n                    p => TimeSpan.FromMinutes(15) == p.SamplingIntervalHint));\n            Assert.Equal(3, j.DataSetWriters.Sum(dataSetWriter =>\n                dataSetWriter.DataSet.DataSetSource.PublishedVariables.PublishedData.Count));\n        }\n\n        [Fact]\n        public void PnPlcMultiJobBatching1Test()\n        {\n            var pn = new StringBuilder(\"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n\n\"\"\");\n\n            for (var i = 1; i < 10000; i++)\n            {\n                pn\n                    .Append(\"{ \\\"Id\\\": \\\"i=\")\n                    .Append(i)\n                    .Append(\"\\\" },\");\n            }\n\n            pn.Append(\"\"\"\n\n            { \"Id\": \"i=10000\" }\n        ]\n    }\n]\n\n\"\"\");\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn.ToString());\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            // No writerGroups\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(10, j.DataSetWriters.Count);\n            Assert.All(j.DataSetWriters, dataSetWriter => Assert.Equal(\"opc.tcp://localhost:50000\",\n                dataSetWriter.DataSet.DataSetSource.Connection.Endpoint.Url));\n            Assert.All(j.DataSetWriters, dataSetWriter => Assert.Null(\n                dataSetWriter.DataSet.DataSetSource.SubscriptionSettings.PublishingInterval));\n            Assert.All(j.DataSetWriters, dataSetWriter => Assert.All(\n                dataSetWriter.DataSet.DataSetSource.PublishedVariables.PublishedData,\n                    p => Assert.Null(p.SamplingIntervalHint)));\n            Assert.All(j.DataSetWriters, dataSetWriter =>\n                Assert.Equal(1000,\n                    dataSetWriter.DataSet.DataSetSource.PublishedVariables.PublishedData.Count));\n        }\n\n        [Fact]\n        public void PnPlcMultiJobBatching2Test()\n        {\n            var pn = new StringBuilder(\"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n\n\"\"\");\n\n            for (var i = 1; i < 10000; i++)\n            {\n                pn\n                    .Append(\"{ \\\"Id\\\": \\\"i=\")\n                    .Append(i)\n                    .Append('\\\"')\n                    .Append(i % 2 == 1 ? \",\\\"OpcPublishingInterval\\\": 2000\" : null)\n                    .Append(\"},\");\n            }\n\n            pn.Append(\"\"\"\n\n            { \"Id\": \"i=10000\" }\n        ]\n    }\n]\n\n\"\"\");\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn.ToString());\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            // No writerGroups\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n\n            Assert.Null(j.MessageSettings);\n\n            Assert.Equal(10, j.DataSetWriters.Count);\n            Assert.All(j.DataSetWriters, dataSetWriter => Assert.Equal(\"opc.tcp://localhost:50000\",\n                dataSetWriter.DataSet.DataSetSource.Connection.Endpoint.Url));\n            Assert.Equal(\n                new TimeSpan?[] {\n                    TimeSpan.FromMilliseconds(2000),\n                    TimeSpan.FromMilliseconds(2000),\n                    TimeSpan.FromMilliseconds(2000),\n                    TimeSpan.FromMilliseconds(2000),\n                    TimeSpan.FromMilliseconds(2000),\n                    null,\n                    null,\n                    null,\n                    null,\n                    null\n                }, j.DataSetWriters.Select(dataSetWriter =>\n                    dataSetWriter.DataSet.DataSetSource.SubscriptionSettings?.PublishingInterval));\n\n            Assert.All(j.DataSetWriters, dataSetWriter => Assert.All(\n                dataSetWriter.DataSet.DataSetSource.PublishedVariables.PublishedData,\n                    p => Assert.Null(p.SamplingIntervalHint)));\n            Assert.All(j.DataSetWriters, dataSetWriter =>\n                Assert.Equal(1000,\n                    dataSetWriter.DataSet.DataSetSource.PublishedVariables.PublishedData.Count));\n        }\n\n        [Fact]\n        public void PnPlcJobWithAllEventPropertiesTest()\n        {\n            var pn = new StringBuilder(\"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"DisplayName\": \"TestingDisplayName\",\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ],\n                            \"AttributeId\": \"BrowseName\",\n                            \"IndexRange\": \"5:20\"\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"NodeId\": \"i=2041\",\n                                        \"BrowsePath\": [\n                                            \"EventId\"\n                                        ],\n                                        \"AttributeId\": \"BrowseName\",\n                                        \"Value\": \"ns=2;i=235\",\n                                        \"IndexRange\": \"5:20\",\n                                        \"Index\": 10,\n                                        \"Alias\": \"Test\",\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n]\n\n\"\"\");\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn.ToString());\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            // Check writerGroups\n            Assert.Single(writerGroups);\n            Assert.Single(writerGroups[0].DataSetWriters);\n            Assert.Single(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedEvents.PublishedData);\n            Assert.NotNull(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedVariables);\n            Assert.NotNull(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedEvents);\n            Assert.Empty(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.Single(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedEvents.PublishedData);\n\n            // Check model\n            var model = writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedEvents.PublishedData[0];\n            Assert.Equal(\"TestingDisplayName\", model.PublishedEventName);\n            Assert.Equal(\"i=2258\", model.EventNotifier);\n\n            // Check select clauses\n            Assert.Single(model.SelectedFields);\n            Assert.Equal(\"i=2041\", model.SelectedFields[0].TypeDefinitionId);\n            Assert.Single(model.SelectedFields[0].BrowsePath);\n            Assert.Equal(\"EventId\", model.SelectedFields[0].BrowsePath[0]);\n            Assert.Equal(NodeAttribute.BrowseName, model.SelectedFields[0].AttributeId.Value);\n            Assert.Equal(\"5:20\", model.SelectedFields[0].IndexRange);\n            Assert.NotNull(model.Filter);\n            Assert.Single(model.Filter.Elements);\n            Assert.Equal(FilterOperatorType.OfType, model.Filter.Elements[0].FilterOperator);\n            Assert.Single(model.Filter.Elements[0].FilterOperands);\n            Assert.Equal(\"i=2041\", model.Filter.Elements[0].FilterOperands[0].NodeId);\n            Assert.Equal(\"ns=2;i=235\", model.Filter.Elements[0].FilterOperands[0].Value);\n\n            // Check where clause\n            Assert.Single(model.Filter.Elements[0].FilterOperands[0].BrowsePath);\n            Assert.Equal(\"EventId\", model.Filter.Elements[0].FilterOperands[0].BrowsePath[0]);\n            Assert.Equal(NodeAttribute.BrowseName, model.Filter.Elements[0].FilterOperands[0].AttributeId.Value);\n            Assert.Equal(\"5:20\", model.Filter.Elements[0].FilterOperands[0].IndexRange);\n            Assert.NotNull(model.Filter.Elements[0].FilterOperands[0].Index);\n            Assert.Equal((uint)10, model.Filter.Elements[0].FilterOperands[0].Index.Value);\n            Assert.Equal(\"Test\", model.Filter.Elements[0].FilterOperands[0].Alias);\n        }\n\n        [Fact]\n        public void PnPlcMultiJob1TestWithDataItemsAndEvents()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost1:50000\",\n        \"NodeId\": {\n            \"Identifier\": \"i=2258\"\n        }\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost2:50000\",\n        \"NodeId\": {\n            \"Identifier\": \"ns=0;i=2261\"\n        }\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost3:50000\",\n        \"OpcNodes\": [\n            {\n                \"ExpandedNodeId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\",\n                \"DisplayName\": \"AlternatingBoolean\"\n            },\n            {\n                \"Id\": \"i=2253\",\n                \"OpcPublishingInterval\": 5000,\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=2;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://localhost4:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2262\"\n            },\n            {\n                \"Id\": \"ns=2;s=DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\"\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            var writers = Assert.Single(writerGroups).DataSetWriters;\n\n            Assert.Equal(5, writers.Count);\n            Assert.Single(writers[0].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            var dataItemModel = writers[0].DataSet.DataSetSource.PublishedVariables.PublishedData[0];\n            Assert.Equal(\"i=2258\", dataItemModel.PublishedVariableNodeId);\n            Assert.Empty(writers[0].DataSet.DataSetSource.PublishedEvents.PublishedData);\n\n            Assert.Single(writers[1].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.Empty(writers[1].DataSet.DataSetSource.PublishedEvents.PublishedData);\n            dataItemModel = writers[1].DataSet.DataSetSource.PublishedVariables.PublishedData[0];\n            Assert.Equal(\"ns=0;i=2261\", dataItemModel.PublishedVariableNodeId);\n\n            Assert.Single(writers[2].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.Empty(writers[2].DataSet.DataSetSource.PublishedEvents.PublishedData);\n            dataItemModel = writers[2].DataSet.DataSetSource.PublishedVariables.PublishedData[0];\n            Assert.Equal(\"AlternatingBoolean\", dataItemModel.PublishedVariableDisplayName);\n            Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=AlternatingBoolean\", dataItemModel.PublishedVariableNodeId);\n\n            Assert.Empty(writers[3].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.NotEmpty(writers[3].DataSet.DataSetSource.PublishedEvents.PublishedData);\n            var eventModel = writers[3].DataSet.DataSetSource.PublishedEvents.PublishedData[0];\n            Assert.Equal(\"i=2253\", eventModel.EventNotifier);\n            Assert.Single(eventModel.SelectedFields);\n            Assert.Equal(\"i=2041\", eventModel.SelectedFields[0].TypeDefinitionId);\n            Assert.Single(eventModel.SelectedFields[0].BrowsePath);\n            Assert.Equal(\"EventId\", eventModel.SelectedFields[0].BrowsePath[0]);\n            Assert.NotNull(eventModel.Filter);\n            Assert.Single(eventModel.Filter.Elements);\n            Assert.Equal(FilterOperatorType.OfType, eventModel.Filter.Elements[0].FilterOperator);\n            Assert.Single(eventModel.Filter.Elements[0].FilterOperands);\n            Assert.Equal(\"ns=2;i=235\", eventModel.Filter.Elements[0].FilterOperands[0].Value);\n\n            Assert.NotEmpty(writers[4].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.Empty(writers[4].DataSet.DataSetSource.PublishedEvents.PublishedData);\n            dataItemModel = writers[4].DataSet.DataSetSource.PublishedVariables.PublishedData[0];\n            Assert.Equal(\"i=2262\", dataItemModel.PublishedVariableNodeId);\n            dataItemModel = writers[4].DataSet.DataSetSource.PublishedVariables.PublishedData[1];\n            Assert.Equal(\"ns=2;s=DipData\", dataItemModel.PublishedVariableNodeId);\n            dataItemModel = writers[4].DataSet.DataSetSource.PublishedVariables.PublishedData[2];\n            Assert.Equal(\"nsu=http://microsoft.com/Opc/OpcPlc/;s=NegativeTrendData\", dataItemModel.PublishedVariableNodeId);\n        }\n\n        [Fact]\n        public void PnPlcJobTestWithEvents()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://desktop-fhd2fr4:62563/Quickstarts/SimpleEventsServer\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"DisplayName2253\",\n                \"OpcPublishingInterval\": 5000,\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventType\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"SourceNode\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"SourceName\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Time\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"ReceiveTime\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"LocalTime\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Message\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Severity\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"2:CycleId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"2:CurrentStep\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=2;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n            Assert.Single(writerGroups[0].DataSetWriters);\n            Assert.Empty(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.Single(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedEvents.PublishedData);\n\n            Assert.All(j.DataSetWriters, dataSetWriter =>\n               Assert.Single(dataSetWriter.DataSet.DataSetSource.PublishedEvents.PublishedData));\n\n            var eventModel = writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedEvents.PublishedData[0];\n            Assert.Equal(\"DisplayName2253\", eventModel.PublishedEventName);\n            Assert.Equal(\"i=2253\", eventModel.EventNotifier);\n            Assert.Equal(11, eventModel.SelectedFields.Count);\n            Assert.All(eventModel.SelectedFields, x =>\n            {\n                Assert.Equal(\"i=2041\", x.TypeDefinitionId);\n                Assert.Single(x.BrowsePath);\n            });\n            Assert.Equal(new[] {\n                \"EventId\",\n                \"EventType\",\n                \"SourceNode\",\n                \"SourceName\",\n                \"Time\",\n                \"ReceiveTime\",\n                \"LocalTime\",\n                \"Message\",\n                \"Severity\",\n                \"2:CycleId\",\n                \"2:CurrentStep\"\n            }, eventModel.SelectedFields.Select(x => x.BrowsePath[0]));\n        }\n\n        [Fact]\n        public void PnPlcJobTestWithConditionHandling()\n        {\n            const string pn = \"\"\"\n\n[\n    {\n        \"EndpointUrl\": \"opc.tcp://desktop-fhd2fr4:62563/Quickstarts/SimpleEventsServer\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"OpcPublishingInterval\": 5000,\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"ns=2;i=235\"\n                },\n                \"ConditionHandling\": {\n                    \"UpdateInterval\": 10,\n                    \"SnapshotInterval\": 30\n                }\n            }\n        ]\n    }\n]\n\n\"\"\";\n\n            var logger = Log.Console<PublishedNodesConverter>();\n\n            var converter = new PublishedNodesConverter(logger, _serializer, GetOptions());\n\n            var entries = converter.Read(pn);\n            var writerGroups = converter.ToWriterGroups(entries).ToList();\n\n            Assert.NotEmpty(writerGroups);\n            var j = Assert.Single(writerGroups);\n            Assert.Single(writerGroups[0].DataSetWriters);\n            Assert.Empty(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedVariables.PublishedData);\n            Assert.Single(writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedEvents.PublishedData);\n\n            Assert.All(j.DataSetWriters, dataSetWriter =>\n               Assert.Single(dataSetWriter.DataSet.DataSetSource.PublishedEvents.PublishedData));\n\n            var eventModel = writerGroups[0].DataSetWriters[0].DataSet.DataSetSource.PublishedEvents.PublishedData[0];\n            Assert.Equal(\"i=2253\", eventModel.EventNotifier);\n            Assert.Equal(\"ns=2;i=235\", eventModel.TypeDefinitionId);\n            Assert.NotNull(eventModel.ConditionHandling);\n            Assert.Equal(10, eventModel.ConditionHandling.UpdateInterval);\n            Assert.Equal(30, eventModel.ConditionHandling.SnapshotInterval);\n        }\n\n        private static IIoTEdgeWorkloadApi CreateMockProvider()\n        {\n            var provider = new Mock<IIoTEdgeWorkloadApi>();\n            provider.Setup(p => p.DecryptAsync(It.IsAny<string>(), It.IsAny<ReadOnlyMemory<byte>>(), It.IsAny<CancellationToken>()))\n                .Returns((string _, ReadOnlyMemory<byte> cipher, CancellationToken _) => ValueTask.FromResult<ReadOnlyMemory<byte>>(\n                    Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(cipher.Span).Replace(\"Encrypted\", \"Decrypted\", StringComparison.Ordinal)).AsMemory()));\n            provider.Setup(p => p.EncryptAsync(It.IsAny<string>(), It.IsAny<ReadOnlyMemory<byte>>(), It.IsAny<CancellationToken>()))\n                .Returns((string _, ReadOnlyMemory<byte> plaintext, CancellationToken _) => ValueTask.FromResult<ReadOnlyMemory<byte>>(\n                    Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(plaintext.Span).Replace(\"Decrypted\", \"Encrypted\", StringComparison.Ordinal)).AsMemory()));\n            return provider.Object;\n        }\n\n        private static IIoTEdgeWorkloadApi CreateThrowProvider()\n        {\n            var provider = new Mock<IIoTEdgeWorkloadApi>();\n#pragma warning disable CA2012 // Use ValueTasks correctly\n            provider.Setup(p => p.DecryptAsync(It.IsAny<string>(), It.IsAny<ReadOnlyMemory<byte>>(), It.IsAny<CancellationToken>()))\n                .Returns(ValueTask.FromException<ReadOnlyMemory<byte>>(new FormatException(\"DecryptAsync\")));\n            provider.Setup(p => p.EncryptAsync(It.IsAny<string>(), It.IsAny<ReadOnlyMemory<byte>>(), It.IsAny<CancellationToken>()))\n                .Returns(ValueTask.FromException<ReadOnlyMemory<byte>>(new FormatException(\"EncryptAsync\")));\n#pragma warning restore CA2012 // Use ValueTasks correctly\n            return provider.Object;\n        }\n\n        private static IOptions<PublisherOptions> GetOptions()\n        {\n            var options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            options.Value.MessagingProfile = MessagingProfile.Get(MessagingMode.Samples, MessageEncoding.Json);\n            return options;\n        }\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Utils/TempFileProviderBase.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Utils\n{\n    using System;\n    using System.IO;\n\n    /// <summary>\n    /// Base class that provides a temporary file that will be cleaned up on disposal.\n    /// </summary>\n    public class TempFileProviderBase : IDisposable\n    {\n        protected readonly string _tempFile;\n\n        public TempFileProviderBase()\n        {\n            _tempFile = Path.GetTempFileName();\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            try\n            {\n                // Remove temporary published nodes file if one was created.\n                if (File.Exists(_tempFile))\n                {\n                    File.Delete(_tempFile);\n                }\n            }\n            catch\n            {\n                // Nothign to do.\n            }\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher/tests/Utils/Utils.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Utils\n{\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// Utilities for tests.\n    /// </summary>\n    public static class Utils\n    {\n        /// <summary>\n        /// Get content of a file as string.\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <returns></returns>\n        public static string GetFileContent(string path)\n        {\n            using var payloadReader = new StreamReader(path);\n            return payloadReader.ReadToEnd();\n        }\n\n        /// <summary>\n        /// Copy content of source file to destination file.\n        /// </summary>\n        /// <param name=\"sourcePath\"></param>\n        /// <param name=\"destinationPath\"></param>\n        /// <returns></returns>\n        public static void CopyContent(string sourcePath, string destinationPath)\n        {\n            var content = GetFileContent(sourcePath);\n\n            using var fileStream = new FileStream(destinationPath,\n                FileMode.Open, FileAccess.Write, FileShare.ReadWrite);\n            fileStream.Write(Encoding.UTF8.GetBytes(content));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/AdditionalData.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Flags that are set by the historian when\n    /// returning archived values.\n    /// </summary>\n    [Flags]\n    [DataContract]\n    public enum AdditionalData\n    {\n        /// <summary>\n        /// No additional data\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None = 0x0,\n\n        /// <summary>\n        /// A data value which was calculated with an\n        /// incomplete interval.\n        /// </summary>\n        [EnumMember(Value = \"Partial\")]\n        Partial = 0x4,\n\n        /// <summary>\n        /// A raw data value that hides other data at\n        /// the same timestamp.\n        /// </summary>\n        [EnumMember(Value = \"ExtraData\")]\n        ExtraData = 0x8,\n\n        /// <summary>\n        /// Multiple values match the aggregate criteria\n        /// (i.e. multiple minimum values at different\n        /// timestamps within the same interval)\n        /// </summary>\n        [EnumMember(Value = \"MultipleValues\")]\n        MultipleValues = 0x10\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/AggregateConfigurationModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Aggregate configuration\n    /// </summary>\n    [DataContract]\n    public sealed record class AggregateConfigurationModel\n    {\n        /// <summary>\n        /// Whether to treat uncertain as bad\n        /// </summary>\n        [DataMember(Name = \"treatUncertainAsBad\", Order = 1,\n            EmitDefaultValue = false)]\n        public bool? TreatUncertainAsBad { get; set; }\n\n        /// <summary>\n        /// Percent of data that is bad\n        /// </summary>\n        [DataMember(Name = \"percentDataBad\", Order = 2,\n            EmitDefaultValue = false)]\n        public byte? PercentDataBad { get; set; }\n\n        /// <summary>\n        /// Percent of data that is good\n        /// </summary>\n        [DataMember(Name = \"percentDataGood\", Order = 3,\n            EmitDefaultValue = false)]\n        public byte? PercentDataGood { get; set; }\n\n        /// <summary>\n        /// Whether to use sloped extrapolation.\n        /// </summary>\n        [DataMember(Name = \"useSlopedExtrapolation\", Order = 4,\n            EmitDefaultValue = false)]\n        public bool? UseSlopedExtrapolation { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/AggregateFilterModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Aggregate Filter\n    /// </summary>\n    [DataContract]\n    public sealed record class AggregateFilterModel\n    {\n        /// <summary>\n        /// Start time\n        /// </summary>\n        [DataMember(Name = \"startTime\", Order = 0,\n            EmitDefaultValue = false)]\n        public DateTime? StartTime { get; set; }\n\n        /// <summary>\n        /// Aggregate type\n        /// </summary>\n        [DataMember(Name = \"aggregateTypeId\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? AggregateTypeId { get; set; }\n\n        /// <summary>\n        /// Processing Interval\n        /// </summary>\n        [DataMember(Name = \"processingInterval\", Order = 2,\n            EmitDefaultValue = false)]\n        public TimeSpan? ProcessingInterval { get; set; }\n\n        /// <summary>\n        /// Aggregate Configuration - use an empty configuration\n        /// to clear the configuration and use the server defaults.\n        /// Returns null if the default configuration in the\n        /// server is being used.\n        /// </summary>\n        [DataMember(Name = \"aggregateConfiguration\", Order = 3,\n            EmitDefaultValue = false)]\n        public AggregateConfigurationModel? AggregateConfiguration { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ApplicationInfoModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Application info model\n    /// </summary>\n    [DataContract]\n    public sealed record class ApplicationInfoModel\n    {\n        /// <summary>\n        /// Unique application id\n        /// </summary>\n        [DataMember(Name = \"applicationId\", Order = 0)]\n        public required string ApplicationId { get; set; }\n\n        /// <summary>\n        /// Type of application\n        /// </summary>\n        /// <example>Server</example>\n        [DataMember(Name = \"applicationType\", Order = 1)]\n        public ApplicationType ApplicationType { get; set; }\n\n        /// <summary>\n        /// Unique application uri\n        /// </summary>\n        [DataMember(Name = \"applicationUri\", Order = 2)]\n        public required string ApplicationUri { get; set; }\n\n        /// <summary>\n        /// Product uri\n        /// </summary>\n        [DataMember(Name = \"productUri\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? ProductUri { get; set; }\n\n        /// <summary>\n        /// Default name of application\n        /// </summary>\n        [DataMember(Name = \"applicationName\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? ApplicationName { get; set; }\n\n        /// <summary>\n        /// Locale of default name - defaults to \"en\"\n        /// </summary>\n        [DataMember(Name = \"locale\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? Locale { get; set; }\n\n        /// <summary>\n        /// Localized Names of application keyed on locale\n        /// </summary>\n        [DataMember(Name = \"localizedNames\", Order = 6,\n            EmitDefaultValue = false)]\n        public IReadOnlyDictionary<string, string>? LocalizedNames { get; set; }\n\n        /// <summary>\n        /// The capabilities advertised by the server.\n        /// </summary>\n        /// <example>LDS</example>\n        /// <example>DA</example>\n        [DataMember(Name = \"capabilities\", Order = 7,\n            EmitDefaultValue = false)]\n        public IReadOnlySet<string>? Capabilities { get; set; }\n\n        /// <summary>\n        /// Discovery urls of the server\n        /// </summary>\n        [DataMember(Name = \"discoveryUrls\", Order = 8,\n            EmitDefaultValue = false)]\n        public IReadOnlySet<string>? DiscoveryUrls { get; set; }\n\n        /// <summary>\n        /// Discovery profile uri\n        /// </summary>\n        [DataMember(Name = \"discoveryProfileUri\", Order = 9,\n            EmitDefaultValue = false)]\n        public string? DiscoveryProfileUri { get; set; }\n\n        /// <summary>\n        /// Gateway server uri\n        /// </summary>\n        [DataMember(Name = \"gatewayServerUri\", Order = 10,\n            EmitDefaultValue = false)]\n        public string? GatewayServerUri { get; set; }\n\n        /// <summary>\n        /// Host addresses of server application or null\n        /// </summary>\n        [DataMember(Name = \"hostAddresses\", Order = 11,\n            EmitDefaultValue = false)]\n        public IReadOnlySet<string>? HostAddresses { get; set; }\n\n        /// <summary>\n        /// Site of the application\n        /// </summary>\n        /// <example>productionlineA</example>\n        /// <example>cellB</example>\n        [DataMember(Name = \"siteId\", Order = 12,\n            EmitDefaultValue = false)]\n        public string? SiteId { get; set; }\n\n        /// <summary>\n        /// Discoverer that registered the application\n        /// </summary>\n        [DataMember(Name = \"discovererId\", Order = 13,\n            EmitDefaultValue = false)]\n        public string? DiscovererId { get; set; }\n\n        /// <summary>\n        /// Last time application was seen if not visible\n        /// </summary>\n        [DataMember(Name = \"notSeenSince\", Order = 14,\n            EmitDefaultValue = false)]\n        public DateTimeOffset? NotSeenSince { get; set; }\n\n        /// <summary>\n        /// Created\n        /// </summary>\n        [DataMember(Name = \"created\", Order = 15,\n            EmitDefaultValue = false)]\n        public OperationContextModel? Created { get; set; }\n\n        /// <summary>\n        /// Updated\n        /// </summary>\n        [DataMember(Name = \"updated\", Order = 16,\n            EmitDefaultValue = false)]\n        public OperationContextModel? Updated { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ApplicationRegistrationModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Application with optional list of endpoints\n    /// </summary>\n    [DataContract]\n    public sealed record class ApplicationRegistrationModel\n    {\n        /// <summary>\n        /// Application information\n        /// </summary>\n        [DataMember(Name = \"application\", Order = 0)]\n        [Required]\n        public required ApplicationInfoModel Application { get; set; }\n\n        /// <summary>\n        /// List of endpoints for it\n        /// </summary>\n        [DataMember(Name = \"endpoints\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<EndpointRegistrationModel>? Endpoints { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ApplicationType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Application type\n    /// </summary>\n    [DataContract]\n    public enum ApplicationType\n    {\n        /// <summary>\n        /// Application is server\n        /// </summary>\n        [EnumMember(Value = \"Server\")]\n        Server,\n\n        /// <summary>\n        /// Application is client\n        /// </summary>\n        [EnumMember(Value = \"Client\")]\n        Client,\n\n        /// <summary>\n        /// Application is client and server\n        /// </summary>\n        [EnumMember(Value = \"ClientAndServer\")]\n        ClientAndServer,\n\n        /// <summary>\n        /// Application is discovery server\n        /// </summary>\n        [EnumMember(Value = \"DiscoveryServer\")]\n        DiscoveryServer\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/AttributeReadRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Attribute to read\n    /// </summary>\n    [DataContract]\n    public sealed record class AttributeReadRequestModel\n    {\n        /// <summary>\n        /// Node to read from or write to (mandatory)\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0)]\n        [Required]\n        public required string NodeId { get; set; }\n\n        /// <summary>\n        /// Attribute to read or write\n        /// </summary>\n        [DataMember(Name = \"attribute\", Order = 1)]\n        [Required]\n        public required NodeAttribute Attribute { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/AttributeReadResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Attribute value read\n    /// </summary>\n    [DataContract]\n    public sealed record class AttributeReadResponseModel\n    {\n        /// <summary>\n        /// Attribute value\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 0)]\n        [SkipValidation]\n        public required VariantValue Value { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/AttributeWriteRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Attribute and value to write to it\n    /// </summary>\n    [DataContract]\n    public sealed record class AttributeWriteRequestModel\n    {\n        /// <summary>\n        /// Node to write to (mandatory)\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0)]\n        [Required]\n        public required string NodeId { get; set; }\n\n        /// <summary>\n        /// Attribute to write (mandatory)\n        /// </summary>\n        [DataMember(Name = \"attribute\", Order = 1)]\n        [Required]\n        public required NodeAttribute Attribute { get; set; }\n\n        /// <summary>\n        /// Value to write (mandatory)\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 2)]\n        [SkipValidation]\n        public required VariantValue Value { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/AttributeWriteResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Attribute write result\n    /// </summary>\n    [DataContract]\n    public sealed record class AttributeWriteResponseModel\n    {\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/AuthenticationMethodModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Authentication Method model\n    /// </summary>\n    [DataContract]\n    public sealed record class AuthenticationMethodModel\n    {\n        /// <summary>\n        /// Method id\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0)]\n        [Required]\n        public required string Id { get; set; }\n\n        /// <summary>\n        /// Type of credential\n        /// </summary>\n        [DataMember(Name = \"credentialType\", Order = 1)]\n        public CredentialType CredentialType { get; set; }\n\n        /// <summary>\n        /// Security policy to use when passing credential.\n        /// </summary>\n        [DataMember(Name = \"securityPolicy\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? SecurityPolicy { get; set; }\n\n        /// <summary>\n        /// Method specific configuration\n        /// </summary>\n        [DataMember(Name = \"configuration\", Order = 3,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public VariantValue? Configuration { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/Azure.IIoT.OpcUa.Publisher.Models.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <IsPackable>true</IsPackable>\n    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n    <Description>Azure OPC Publisher Sdk shared models</Description>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Furly.Extensions.Abstractions\" Version=\"1.1.54\" />\n    <PackageReference Include=\"System.Private.Uri\" Version=\"4.3.2\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowseDirection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Direction to browse\n    /// </summary>\n    [DataContract]\n    public enum BrowseDirection\n    {\n        /// <summary>\n        /// Browse forward (default)\n        /// </summary>\n        [EnumMember(Value = \"Forward\")]\n        Forward,\n\n        /// <summary>\n        /// Browse backward\n        /// </summary>\n        [EnumMember(Value = \"Backward\")]\n        Backward,\n\n        /// <summary>\n        /// Browse both directions\n        /// </summary>\n        [EnumMember(Value = \"Both\")]\n        Both\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowseFirstRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Browse request model\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowseFirstRequestModel\n    {\n        /// <summary>\n        /// Node to browse.\n        /// (defaults to root folder).\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// Direction to browse in\n        /// (default: forward)\n        /// </summary>\n        [DataMember(Name = \"direction\", Order = 1,\n            EmitDefaultValue = false)]\n        public BrowseDirection? Direction { get; set; }\n\n        /// <summary>\n        /// View to browse\n        /// (default: null = new view = All nodes).\n        /// </summary>\n        [DataMember(Name = \"view\", Order = 2,\n            EmitDefaultValue = false)]\n        public BrowseViewModel? View { get; set; }\n\n        /// <summary>\n        /// Reference types to browse.\n        /// (default: hierarchical).\n        /// </summary>\n        [DataMember(Name = \"referenceTypeId\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? ReferenceTypeId { get; set; }\n\n        /// <summary>\n        /// Whether to include subtypes of the reference type.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"noSubtypes\", Order = 4,\n            EmitDefaultValue = false)]\n        public bool? NoSubtypes { get; set; }\n\n        /// <summary>\n        /// Max number of references to return. There might\n        /// be less returned as this is up to the client\n        /// restrictions.  Set to 0 to return no references\n        /// or target nodes.\n        /// (default is decided by client e.g. 60)\n        /// </summary>\n        [DataMember(Name = \"maxReferencesToReturn\", Order = 5,\n            EmitDefaultValue = false)]\n        public uint? MaxReferencesToReturn { get; set; }\n\n        /// <summary>\n        /// Whether to collapse all references into a set of\n        /// unique target nodes and not show reference\n        /// information.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"targetNodesOnly\", Order = 6,\n           EmitDefaultValue = false)]\n        public bool? TargetNodesOnly { get; set; }\n\n        /// <summary>\n        /// Whether to read variable values on target nodes.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"readVariableValues\", Order = 7,\n            EmitDefaultValue = false)]\n        public bool? ReadVariableValues { get; set; }\n\n        /// <summary>\n        /// Filter returned target nodes by only returning\n        /// nodes that have classes defined in this array.\n        /// (default: null - all targets are returned)\n        /// </summary>\n        [DataMember(Name = \"nodeClassFilter\", Order = 8,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<NodeClass>? NodeClassFilter { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 9,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n\n        /// <summary>\n        /// Whether to only return the raw node id\n        /// information and not read the target node.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"nodeIdsOnly\", Order = 10,\n            EmitDefaultValue = false)]\n        public bool? NodeIdsOnly { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowseFirstResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Browse response model\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowseFirstResponseModel\n    {\n        /// <summary>\n        /// Node info for the currently browsed node\n        /// </summary>\n        [DataMember(Name = \"node\", Order = 0)]\n        public required NodeModel Node { get; set; }\n\n        /// <summary>\n        /// References returned\n        /// </summary>\n        [DataMember(Name = \"references\", Order = 1)]\n        public required IReadOnlyList<NodeReferenceModel> References { get; set; }\n\n        /// <summary>\n        /// Continuation token if more results pending.\n        /// </summary>\n        [DataMember(Name = \"continuationToken\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? ContinuationToken { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 3,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowseNextRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request node browsing continuation\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowseNextRequestModel\n    {\n        /// <summary>\n        /// Continuation token from previews browse request.\n        /// (mandatory)\n        /// </summary>\n        [DataMember(Name = \"continuationToken\", Order = 0)]\n        [Required]\n        public required string ContinuationToken { get; set; }\n\n        /// <summary>\n        /// Whether to abort browse and release.\n        /// (default: false)\n        /// </summary>\n        [DataMember(Name = \"abort\", Order = 1,\n            EmitDefaultValue = false)]\n        public bool? Abort { get; set; }\n\n        /// <summary>\n        /// Whether to collapse all references into a set of\n        /// unique target nodes and not show reference\n        /// information.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"targetNodesOnly\", Order = 2,\n            EmitDefaultValue = false)]\n        public bool? TargetNodesOnly { get; set; }\n\n        /// <summary>\n        /// Whether to read variable values on target nodes.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"readVariableValues\", Order = 3,\n            EmitDefaultValue = false)]\n        public bool? ReadVariableValues { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 4,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n\n        /// <summary>\n        /// Whether to only return the raw node id\n        /// information and not read the target node.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"nodeIdsOnly\", Order = 5,\n            EmitDefaultValue = false)]\n        public bool? NodeIdsOnly { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowseNextResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of node browse continuation\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowseNextResponseModel\n    {\n        /// <summary>\n        /// References returned\n        /// </summary>\n        [DataMember(Name = \"references\", Order = 0)]\n        public required IReadOnlyList<NodeReferenceModel> References { get; set; }\n\n        /// <summary>\n        /// Continuation token if more results pending.\n        /// </summary>\n        [DataMember(Name = \"continuationToken\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? ContinuationToken { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 2,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowsePathRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Browse nodes by path\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowsePathRequestModel\n    {\n        /// <summary>\n        /// Node to browse from (defaults to root folder).\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// The paths to browse from node.\n        /// (mandatory)\n        /// </summary>\n        [DataMember(Name = \"browsePaths\", Order = 1)]\n        [Required]\n        public required IReadOnlyList<IReadOnlyList<string>> BrowsePaths { get; set; }\n\n        /// <summary>\n        /// Whether to read variable values on target nodes.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"readVariableValues\", Order = 2,\n            EmitDefaultValue = false)]\n        public bool? ReadVariableValues { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 3,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n\n        /// <summary>\n        /// Whether to only return the raw node id\n        /// information and not read the target node.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"nodeIdsOnly\", Order = 4,\n            EmitDefaultValue = false)]\n        public bool? NodeIdsOnly { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowsePathResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of node browse continuation\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowsePathResponseModel\n    {\n        /// <summary>\n        /// Targets\n        /// </summary>\n        [DataMember(Name = \"targets\", Order = 0,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<NodePathTargetModel>? Targets { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowseStreamChunkModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Browse stream chunk\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowseStreamChunkModel\n    {\n        /// <summary>\n        /// Source node id\n        /// </summary>\n        [DataMember(Name = \"sourceId\", Order = 0)]\n        public required string SourceId { get; init; }\n\n        /// <summary>\n        /// Source node attributes if this chunk contains\n        /// the source node attributes that were read.\n        /// This can be null, then reference is not\n        /// null.\n        /// </summary>\n        [DataMember(Name = \"attributes\", Order = 1,\n            EmitDefaultValue = false)]\n        public NodeModel? Attributes { get; init; }\n\n        /// <summary>\n        /// References read from the source node to a target\n        /// node. This can be null, then attributes is not\n        /// null.\n        /// </summary>\n        [DataMember(Name = \"reference\", Order = 2,\n            EmitDefaultValue = false)]\n        public NodeReferenceModel? Reference { get; init; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 3,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowseStreamRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Browse stream request model\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowseStreamRequestModel\n    {\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 0,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; init; }\n\n        /// <summary>\n        /// Start nodes to browse.\n        /// (defaults to root folder).\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 1)]\n        public IReadOnlyList<string>? NodeIds { get; init; }\n\n        /// <summary>\n        /// Direction to browse in\n        /// (default: forward)\n        /// </summary>\n        [DataMember(Name = \"direction\", Order = 2,\n            EmitDefaultValue = false)]\n        public BrowseDirection? Direction { get; init; }\n\n        /// <summary>\n        /// View to browse\n        /// (default: null = new view = All nodes).\n        /// </summary>\n        [DataMember(Name = \"view\", Order = 3,\n            EmitDefaultValue = false)]\n        public BrowseViewModel? View { get; init; }\n\n        /// <summary>\n        /// Reference types to browse.\n        /// (default: hierarchical).\n        /// </summary>\n        [DataMember(Name = \"referenceTypeId\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? ReferenceTypeId { get; init; }\n\n        /// <summary>\n        /// Whether to include subtypes of the reference type.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"noSubtypes\", Order = 5,\n            EmitDefaultValue = false)]\n        public bool? NoSubtypes { get; init; }\n\n        /// <summary>\n        /// Whether to read variable values on source nodes.\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"readVariableValues\", Order = 6,\n            EmitDefaultValue = false)]\n        public bool? ReadVariableValues { get; init; }\n\n        /// <summary>\n        /// Whether to not browse recursively\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"noRecurse\", Order = 7,\n            EmitDefaultValue = false)]\n        public bool? NoRecurse { get; init; }\n\n        /// <summary>\n        /// Filter returned target nodes by only returning\n        /// nodes that have classes defined in this array.\n        /// (default: null - all targets are returned)\n        /// </summary>\n        [DataMember(Name = \"nodeClassFilter\", Order = 8,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<NodeClass>? NodeClassFilter { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/BrowseViewModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// View to browse\n    /// </summary>\n    [DataContract]\n    public sealed record class BrowseViewModel\n    {\n        /// <summary>\n        /// Node of the view to browse\n        /// </summary>\n        [DataMember(Name = \"viewId\", Order = 0)]\n        [Required]\n        public required string ViewId { get; set; }\n\n        /// <summary>\n        /// Browses specific version of the view.\n        /// </summary>\n        [DataMember(Name = \"version\", Order = 1,\n            EmitDefaultValue = false)]\n        public uint? Version { get; set; }\n\n        /// <summary>\n        /// Browses at or before this timestamp.\n        /// </summary>\n        [DataMember(Name = \"timestamp\", Order = 2,\n            EmitDefaultValue = false)]\n        public DateTime? Timestamp { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/CertificateStoreName.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// The types of certificate stores\n    /// </summary>\n    [DataContract]\n    public enum CertificateStoreName\n    {\n        /// <summary>\n        /// Own store\n        /// </summary>\n        [EnumMember(Value = \"Application\")]\n        Application,\n\n        /// <summary>\n        /// Rejected store\n        /// </summary>\n        [EnumMember(Value = \"Rejected\")]\n        Rejected,\n\n        /// <summary>\n        /// Trusted store\n        /// </summary>\n        [EnumMember(Value = \"Trusted\")]\n        Trusted,\n\n        /// <summary>\n        /// Https certificates\n        /// </summary>\n        [EnumMember(Value = \"Https\")]\n        Https,\n\n        /// <summary>\n        /// User store\n        /// </summary>\n        [EnumMember(Value = \"User\")]\n        User,\n\n        /// <summary>\n        /// Opc Ua certificate issuer store\n        /// </summary>\n        [EnumMember(Value = \"Issuer\")]\n        Issuer,\n\n        /// <summary>\n        /// Https certificate issuer store\n        /// </summary>\n        [EnumMember(Value = \"HttpsIssuer\")]\n        HttpsIssuer,\n\n        /// <summary>\n        /// User issuer store\n        /// </summary>\n        [EnumMember(Value = \"UserIssuer\")]\n        UserIssuer,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ChannelDiagnosticModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Channel diagnostics model\n    /// </summary>\n    [DataContract]\n    public record class ChannelDiagnosticModel\n    {\n        /// <summary>\n        /// Timestamp of the diagnostic information\n        /// </summary>\n        [DataMember(Name = \"timeStamp\", Order = 1)]\n        public required DateTimeOffset TimeStamp { get; init; }\n\n        /// <summary>\n        /// The session id if connected. Empty if disconnected.\n        /// </summary>\n        [DataMember(Name = \"sessionId\", Order = 2,\n             EmitDefaultValue = false)]\n        public string? SessionId { get; init; }\n\n        /// <summary>\n        /// When the session was created.\n        /// </summary>\n        [DataMember(Name = \"sessionCreated\", Order = 3,\n             EmitDefaultValue = false)]\n        public DateTimeOffset? SessionCreated { get; init; }\n\n        /// <summary>\n        /// The connection information specified by user.\n        /// </summary>\n        [DataMember(Name = \"connection\", Order = 4)]\n        public required ConnectionModel Connection { get; init; }\n\n        /// <summary>\n        /// Effective remote ip address used for the\n        /// connection if connected. Empty if disconnected.\n        /// </summary>\n        [DataMember(Name = \"remoteIpAddress\", Order = 5,\n             EmitDefaultValue = false)]\n        public string? RemoteIpAddress { get; init; }\n\n        /// <summary>\n        /// The effective remote port used when connected,\n        /// null if disconnected.\n        /// </summary>\n        [DataMember(Name = \"remotePort\", Order = 6,\n             EmitDefaultValue = false)]\n        public int? RemotePort { get; init; }\n\n        /// <summary>\n        /// Effective local ip address used for the connection\n        /// if connected. Empty if disconnected.\n        /// </summary>\n        [DataMember(Name = \"localIpAddress\", Order = 7,\n             EmitDefaultValue = false)]\n        public string? LocalIpAddress { get; init; }\n\n        /// <summary>\n        /// The effective local port used when connected,\n        /// null if disconnected.\n        /// </summary>\n        [DataMember(Name = \"localPort\", Order = 8,\n             EmitDefaultValue = false)]\n        public int? LocalPort { get; init; }\n\n        /// <summary>\n        /// The id assigned to the channel that the token\n        /// belongs to.\n        /// </summary>\n        [DataMember(Name = \"channelId\", Order = 9,\n             EmitDefaultValue = false)]\n        public uint? ChannelId { get; init; }\n\n        /// <summary>\n        /// The id assigned to the token.\n        /// </summary>\n        [DataMember(Name = \"tokenId\", Order = 10,\n             EmitDefaultValue = false)]\n        public uint? TokenId { get; init; }\n\n        /// <summary>\n        /// When the token was created by the server\n        /// (refers to the server's clock).\n        /// </summary>\n        [DataMember(Name = \"createdAt\", Order = 11,\n             EmitDefaultValue = false)]\n        public DateTime? CreatedAt { get; init; }\n\n        /// <summary>\n        /// The lifetime of the token\n        /// </summary>\n        [DataMember(Name = \"lifetime\", Order = 12,\n             EmitDefaultValue = false)]\n        public TimeSpan? Lifetime { get; init; }\n\n        /// <summary>\n        /// Client keys\n        /// </summary>\n        [DataMember(Name = \"client\", Order = 13,\n             EmitDefaultValue = false)]\n        public ChannelKeyModel? Client { get; init; }\n\n        /// <summary>\n        /// Server keys\n        /// </summary>\n        [DataMember(Name = \"server\", Order = 14,\n             EmitDefaultValue = false)]\n        public ChannelKeyModel? Server { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ChannelKeyModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Channel token key model.\n    /// </summary>\n    [DataContract]\n    public record class ChannelKeyModel\n    {\n        /// <summary>\n        /// Iv\n        /// </summary>\n        [DataMember(Name = \"iv\", Order = 0)]\n        public required IReadOnlyList<byte> Iv { get; init; }\n\n        /// <summary>\n        /// Key\n        /// </summary>\n        [DataMember(Name = \"key\", Order = 1)]\n        public required IReadOnlyList<byte> Key { get; init; }\n\n        /// <summary>\n        /// Signature length\n        /// </summary>\n        [DataMember(Name = \"sigLen\", Order = 2)]\n        public required int SigLen { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ConditionHandlingOptionsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Condition handling options model\n    /// </summary>\n    [DataContract]\n    public sealed record class ConditionHandlingOptionsModel\n    {\n        /// <summary>\n        /// Time interval for sending pending interval updates in seconds.\n        /// </summary>\n        [DataMember(Name = \"updateInterval\", Order = 1,\n            EmitDefaultValue = false)]\n        public int? UpdateInterval { get; set; }\n\n        /// <summary>\n        /// Time interval for sending pending interval snapshot in seconds.\n        /// </summary>\n        [DataMember(Name = \"snapshotInterval\", Order = 2,\n            EmitDefaultValue = false)]\n        public int? SnapshotInterval { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ConnectionDiagnosticsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Connection diagnostics\n    /// </summary>\n    [DataContract]\n    public record class ConnectionDiagnosticsModel\n    {\n        /// <summary>\n        /// The connection information specified by user.\n        /// </summary>\n        [DataMember(Name = \"connection\", Order = 0)]\n        public required ConnectionModel Connection { get; init; }\n\n        /// <summary>\n        /// The session and subscriptions diagnostics from\n        /// the server.\n        /// </summary>\n        [DataMember(Name = \"server\", Order = 1,\n            EmitDefaultValue = false)]\n        public SessionDiagnosticsModel? Server { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ConnectionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Connection model\n    /// </summary>\n    [DataContract]\n    public sealed record class ConnectionModel\n    {\n        /// <summary>\n        /// Endpoint information\n        /// </summary>\n        [DataMember(Name = \"endpoint\", Order = 0)]\n        [Required]\n        public required EndpointModel Endpoint { get; set; }\n\n        /// <summary>\n        /// User\n        /// </summary>\n        [DataMember(Name = \"user\", Order = 1,\n            EmitDefaultValue = false)]\n        public CredentialModel? User { get; set; }\n\n        /// <summary>\n        /// Diagnostics configuration\n        /// </summary>\n        [DataMember(Name = \"diagnostics\", Order = 2,\n             EmitDefaultValue = false)]\n        public DiagnosticsModel? Diagnostics { get; set; }\n\n        /// <summary>\n        /// Connection group allows splitting connections\n        /// per purpose.\n        /// </summary>\n        [DataMember(Name = \"group\", Order = 3,\n             EmitDefaultValue = false)]\n        public string? Group { get; set; }\n\n        /// <summary>\n        /// Optional list of preferred locales in preference order.\n        /// </summary>\n        [DataMember(Name = \"locales\", Order = 4,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? Locales { get; set; }\n\n        /// <summary>\n        /// Connection options to apply to the created\n        /// connection.\n        /// </summary>\n        [DataMember(Name = \"options\", Order = 5,\n             EmitDefaultValue = false)]\n        public ConnectionOptions Options { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ConnectionOptions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Options that can be applied to a connection\n    /// </summary>\n    [Flags]\n    [DataContract]\n    public enum ConnectionOptions\n    {\n        /// <summary>\n        /// No options\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None = 0x0,\n\n        /// <summary>\n        /// Create a reverse connection\n        /// </summary>\n        [EnumMember(Value = \"UseReverseConnect\")]\n        UseReverseConnect = 0x1,\n\n        /// <summary>\n        /// Do not load complex types\n        /// </summary>\n        [EnumMember(Value = \"NoComplexTypeSystem\")]\n        NoComplexTypeSystem = 0x10,\n\n        /// <summary>\n        /// Do not transfer subscription on reconnect\n        /// </summary>\n        [EnumMember(Value = \"NoSubscriptionTransfer\")]\n        NoSubscriptionTransfer = 0x20,\n\n        /// <summary>\n        /// Dump diagnostics on a timer\n        /// </summary>\n        [EnumMember(Value = \"DumpDiagnostics\")]\n        DumpDiagnostics = 0x100\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/Constants.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa\n{\n    /// <summary>\n    /// Common twin properties\n    /// </summary>\n    public static class Constants\n    {\n        /// <summary>\n        /// Type property name constant\n        /// </summary>\n        public const string TwinPropertyTypeKey = \"__type__\";\n\n        /// <summary>\n        /// Site id property name constant\n        /// </summary>\n        public const string TwinPropertySiteKey = \"__siteid__\";\n\n        /// <summary>\n        /// Semver Version property name constant\n        /// </summary>\n        public const string TwinPropertyVersionKey = \"__version__\";\n\n        /// <summary>\n        /// Full Version property name constant\n        /// </summary>\n        public const string TwinPropertyFullVersionKey = \"__fullversion__\";\n\n        /// <summary>\n        /// Scheme property constant\n        /// </summary>\n        public const string TwinPropertySchemeKey = \"__scheme__\";\n\n        /// <summary>\n        /// Hostname property constant\n        /// </summary>\n        public const string TwinPropertyHostnameKey = \"__hostname__\";\n\n        /// <summary>\n        /// Adresseses property constant\n        /// </summary>\n        public const string TwinPropertyIpAddressesKey = \"__ip__\";\n\n        /// <summary>\n        /// Port key constant\n        /// </summary>\n        public const string TwinPropertyPortKey = \"__port__\";\n\n        /// <summary>\n        /// Spi key property name constant\n        /// </summary>\n        public const string TwinPropertyApiKeyKey = \"__apikey__\";\n\n        /// <summary>\n        /// Certificate property name constant\n        /// </summary>\n        public const string TwinPropertyCertificateKey = \"__certificate__\";\n\n        /// <summary>\n        /// Routing info message property\n        /// </summary>\n        public const string MessagePropertyRoutingKey = \"$$RoutingInfo\";\n\n        /// <summary>\n        /// Routing info message property\n        /// </summary>\n        public const string MessagePropertySchemaKey = \"$$MessageSchema\";\n\n        /// <summary>\n        /// Gateway identity\n        /// </summary>\n        public const string EntityTypeGateway = \"iiotedge\";\n\n        /// <summary>\n        /// Publisher module identity\n        /// </summary>\n        public const string EntityTypePublisher = \"OpcPublisher\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ContentFilterElementModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// An expression element in the filter ast\n    /// </summary>\n    [DataContract]\n    public sealed record class ContentFilterElementModel\n    {\n        /// <summary>\n        /// The operator to use on the operands\n        /// </summary>\n        [DataMember(Name = \"filterOperator\", Order = 0,\n            EmitDefaultValue = false)]\n        public FilterOperatorType FilterOperator { get; set; }\n\n        /// <summary>\n        /// The operands in the element for the operator\n        /// </summary>\n        [DataMember(Name = \"filterOperands\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<FilterOperandModel>? FilterOperands { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ContentFilterModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Content filter\n    /// </summary>\n    [DataContract]\n    public sealed record class ContentFilterModel\n    {\n        /// <summary>\n        /// The flat list of elements in the filter AST\n        /// </summary>\n        [DataMember(Name = \"elements\", Order = 0)]\n        public IReadOnlyList<ContentFilterElementModel>? Elements { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/CredentialModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Credential model. For backwards compatibility\n    /// the actual credentials to pass to the server is set\n    /// through the value property.\n    /// </summary>\n    [DataContract]\n    public sealed record class CredentialModel\n    {\n        /// <summary>\n        /// Type of credential\n        /// </summary>\n        [DataMember(Name = \"type\", Order = 0,\n            EmitDefaultValue = false)]\n        public CredentialType? Type { get; set; }\n\n        /// <summary>\n        /// Credential to pass to server. Can be omitted in case of\n        /// <see cref=\"CredentialType.None\"/>.\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 1,\n            EmitDefaultValue = false)]\n        public UserIdentityModel? Value { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/CredentialType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Type of credentials to use for authentication\n    /// </summary>\n    [DataContract]\n    public enum CredentialType\n    {\n        /// <summary>\n        /// No credentials for anonymous access\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None,\n\n        /// <summary>\n        /// User name and password as credential\n        /// </summary>\n        [EnumMember(Value = \"UserName\")]\n        UserName,\n\n        /// <summary>\n        /// Credential is a x509 certificate\n        /// </summary>\n        [EnumMember(Value = \"X509Certificate\")]\n        X509Certificate,\n\n        /// <summary>\n        /// Jwt token as credential\n        /// </summary>\n        [EnumMember(Value = \"JwtToken\")]\n        JwtToken\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataChangeFilterModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Data change filter\n    /// </summary>\n    [DataContract]\n    public sealed record class DataChangeFilterModel\n    {\n        /// <summary>\n        /// Data change trigger type\n        /// </summary>\n        [DataMember(Name = \"dataChangeTrigger\", Order = 0,\n            EmitDefaultValue = false)]\n        public DataChangeTriggerType? DataChangeTrigger { get; set; }\n\n        /// <summary>\n        /// Dead band\n        /// </summary>\n        [DataMember(Name = \"deadbandType\", Order = 1,\n            EmitDefaultValue = false)]\n        public DeadbandType? DeadbandType { get; set; }\n\n        /// <summary>\n        /// Dead band value\n        /// </summary>\n        [DataMember(Name = \"deadbandValue\", Order = 2,\n            EmitDefaultValue = false)]\n        public double? DeadbandValue { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataChangeTriggerType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Data change trigger\n    /// </summary>\n    [DataContract]\n    public enum DataChangeTriggerType\n    {\n        /// <summary>\n        /// Status\n        /// </summary>\n        [EnumMember(Value = \"Status\")]\n        Status,\n\n        /// <summary>\n        /// Status value\n        /// </summary>\n        [EnumMember(Value = \"StatusValue\")]\n        StatusValue,\n\n        /// <summary>\n        /// Status value and timestamp\n        /// </summary>\n        [EnumMember(Value = \"StatusValueTimestamp\")]\n        StatusValueTimestamp\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataLocation.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Indicate the data location\n    /// </summary>\n    [DataContract]\n    public enum DataLocation\n    {\n        /// <summary>\n        ///  A raw data value.\n        /// </summary>\n        [EnumMember(Value = \"Raw\")]\n        Raw = 0,\n\n        /// <summary>\n        /// Calculated data\n        /// </summary>\n        [EnumMember(Value = \"Calculated\")]\n        Calculated = 1,\n\n        /// <summary>\n        /// A data value which was interpolated.\n        /// </summary>\n        [EnumMember(Value = \"Interpolated\")]\n        Interpolated = 2,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataSetFieldContentFlags.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Content for dataset field\n    /// </summary>\n    [Flags]\n    [DataContract]\n    public enum DataSetFieldContentFlags\n    {\n        /// <summary>\n        /// Status code\n        /// </summary>\n        [EnumMember(Value = \"StatusCode\")]\n        StatusCode = 0x1,\n\n        /// <summary>\n        /// Source timestamp\n        /// </summary>\n        [EnumMember(Value = \"SourceTimestamp\")]\n        SourceTimestamp = 0x2,\n\n        /// <summary>\n        /// Server timestamp\n        /// </summary>\n        [EnumMember(Value = \"ServerTimestamp\")]\n        ServerTimestamp = 0x4,\n\n        /// <summary>\n        /// Source picoseconds\n        /// </summary>\n        [EnumMember(Value = \"SourcePicoSeconds\")]\n        SourcePicoSeconds = 0x8,\n\n        /// <summary>\n        /// Server picoseconds\n        /// </summary>\n        [EnumMember(Value = \"ServerPicoSeconds\")]\n        ServerPicoSeconds = 0x10,\n\n        /// <summary>\n        /// Raw value\n        /// </summary>\n        [EnumMember(Value = \"RawData\")]\n        RawData = 0x20,\n\n        /// <summary>\n        /// Write data set with one entry as value\n        /// </summary>\n        [EnumMember(Value = \"SingleFieldDegradeToValue\")]\n        SingleFieldDegradeToValue = 0x1000,\n\n        /// <summary>\n        /// Node id included\n        /// </summary>\n        [EnumMember(Value = \"NodeId\")]\n        NodeId = 0x10000,\n\n        /// <summary>\n        /// Display name included\n        /// </summary>\n        [EnumMember(Value = \"DisplayName\")]\n        DisplayName = 0x20000,\n\n        /// <summary>\n        /// Endpoint url included\n        /// </summary>\n        [EnumMember(Value = \"EndpointUrl\")]\n        EndpointUrl = 0x40000,\n\n        /// <summary>\n        /// Application uri\n        /// </summary>\n        [EnumMember(Value = \"ApplicationUri\")]\n        ApplicationUri = 0x80000,\n\n        /// <summary>\n        /// Subscription id included\n        /// </summary>\n        [EnumMember(Value = \"SubscriptionId\")]\n        SubscriptionId = 0x100000,\n\n        /// <summary>\n        /// Extension fields included\n        /// </summary>\n        [EnumMember(Value = \"ExtensionFields\")]\n        ExtensionFields = 0x200000\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataSetMessageContentFlags.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Data set message content\n    /// </summary>\n    [DataContract]\n    [Flags]\n    public enum DataSetMessageContentFlags\n    {\n        /// <summary>\n        /// Timestamp\n        /// </summary>\n        [EnumMember(Value = \"Timestamp\")]\n        Timestamp = 0x1,\n\n        /// <summary>\n        /// Picoseconds (uadp)\n        /// </summary>\n        [EnumMember(Value = \"PicoSeconds\")]\n        PicoSeconds = 0x2,\n\n        /// <summary>\n        /// Metadata version (json)\n        /// </summary>\n        [EnumMember(Value = \"MetaDataVersion\")]\n        MetaDataVersion = 0x4,\n\n        /// <summary>\n        /// Status\n        /// </summary>\n        [EnumMember(Value = \"Status\")]\n        Status = 0x8,\n\n        /// <summary>\n        /// Dataset writer id (json)\n        /// </summary>\n        [EnumMember(Value = \"DataSetWriterId\")]\n        DataSetWriterId = 0x10,\n\n        /// <summary>\n        /// Major version (uadp)\n        /// </summary>\n        [EnumMember(Value = \"MajorVersion\")]\n        MajorVersion = 0x20,\n\n        /// <summary>\n        /// Minor version (uadp)\n        /// </summary>\n        [EnumMember(Value = \"MinorVersion\")]\n        MinorVersion = 0x40,\n\n        /// <summary>\n        /// Sequence number\n        /// </summary>\n        [EnumMember(Value = \"SequenceNumber\")]\n        SequenceNumber = 0x80,\n\n        /// <summary>\n        /// Default Uadp\n        /// </summary>\n        [EnumMember(Value = \"DefaultUadp\")]\n        DefaultUadp = SequenceNumber |\n            DataSetWriterId | Timestamp |\n            MajorVersion | MinorVersion |\n            Status | PicoSeconds,\n\n        /// <summary>\n        /// Message type (json)\n        /// </summary>\n        [EnumMember(Value = \"MessageType\")]\n        MessageType = 0x100,\n\n        /// <summary>\n        /// Dataset writer name (json)\n        /// </summary>\n        [EnumMember(Value = \"DataSetWriterName\")]\n        DataSetWriterName = 0x200,\n\n        /// <summary>\n        /// Default non-reversible json\n        /// </summary>\n        [EnumMember(Value = \"DefaultJson\")]\n        DefaultJson = MessageType | DataSetWriterName |\n            SequenceNumber | DataSetWriterId |\n            Timestamp | MetaDataVersion | Status,\n\n        /// <summary>\n        /// Reversible encoding (json)\n        /// </summary>\n        [EnumMember(Value = \"ReversibleFieldEncoding\")]\n        ReversibleFieldEncoding = 0x400,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataSetMetaDataModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Metadata for the published dataset\n    /// </summary>\n    [DataContract]\n    public sealed record class DataSetMetaDataModel\n    {\n        /// <summary>\n        /// Name of the dataset\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Name { get; set; }\n\n        /// <summary>\n        /// Dataset class id\n        /// </summary>\n        [DataMember(Name = \"dataSetClassId\", Order = 3,\n            EmitDefaultValue = false)]\n        public Guid DataSetClassId { get; set; }\n\n        /// <summary>\n        /// Description of the dataset\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? Description { get; set; }\n\n        /// <summary>\n        /// Major version\n        /// </summary>\n        [DataMember(Name = \"majorVersion\", Order = 5,\n            EmitDefaultValue = false)]\n        public uint? MajorVersion { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataSetOrderingType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Ordering model\n    /// </summary>\n    [DataContract]\n    public enum DataSetOrderingType\n    {\n        /// <summary>\n        /// None\n        /// </summary>\n        None = 0,\n\n        /// <summary>\n        /// Ascending writer id\n        /// </summary>\n        [EnumMember(Value = \"AscendingWriterId\")]\n        AscendingWriterId = 1,\n\n        /// <summary>\n        /// Single\n        /// </summary>\n        [EnumMember(Value = \"AscendingWriterIdSingle\")]\n        AscendingWriterIdSingle = 2,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataSetRoutingMode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Specifies how OPC UA node paths are mapped to message routing paths/topics.\n    /// Controls automatic topic structure generation from OPC UA address space.\n    /// Used to create a unified namespace when publishing to message brokers\n    /// that support hierarchical routing like MQTT.\n    /// </summary>\n    [DataContract]\n    public enum DataSetRoutingMode\n    {\n        /// <summary>\n        /// Disable automatic topic path generation.\n        /// Uses only explicitly configured topic templates and queue names.\n        /// Provides maximum control over message routing.\n        /// Best when custom routing patterns are required.\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None = 0,\n\n        /// <summary>\n        /// Automatically generate topic paths using OPC UA browse names.\n        /// Creates hierarchical paths matching the OPC UA address space structure.\n        /// Makes data organization intuitive and discoverable.\n        /// Example: \"Objects/Server/Data/Value1\"\n        /// Falls back to configured templates if specified.\n        /// </summary>\n        [EnumMember(Value = \"UseBrowseNames\")]\n        UseBrowseNames = 1,\n\n        /// <summary>\n        /// Generate topic paths using browse names prefixed with namespace index.\n        /// Ensures unique paths when nodes have same names in different namespaces.\n        /// Preserves complete namespace context in the routing path.\n        /// Example: \"0:Objects/2:MyDevice/2:Sensors/2:Temperature\"\n        /// Falls back to configured templates if specified.\n        /// </summary>\n        [EnumMember(Value = \"UseBrowseNamesWithNamespaceIndex\")]\n        UseBrowseNamesWithNamespaceIndex = 2,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataSetWriterMessageSettingsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Data set writer message model\n    /// </summary>\n    [DataContract]\n    public sealed record class DataSetWriterMessageSettingsModel\n    {\n        /// <summary>\n        /// Dataset message content\n        /// </summary>\n        [DataMember(Name = \"dataSetMessageContentMask\", Order = 0,\n            EmitDefaultValue = false)]\n        public DataSetMessageContentFlags? DataSetMessageContentMask { get; set; }\n\n        /// <summary>\n        /// Configured size of network message\n        /// </summary>\n        [DataMember(Name = \"configuredSize\", Order = 1,\n            EmitDefaultValue = false)]\n        public ushort? ConfiguredSize { get; set; }\n\n        /// <summary>\n        /// Uadp metwork message number\n        /// </summary>\n        [DataMember(Name = \"networkMessageNumber\", Order = 2,\n            EmitDefaultValue = false)]\n        public ushort? NetworkMessageNumber { get; set; }\n\n        /// <summary>\n        /// Uadp dataset offset\n        /// </summary>\n        [DataMember(Name = \"dataSetOffset\", Order = 3,\n            EmitDefaultValue = false)]\n        public ushort? DataSetOffset { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataSetWriterModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Data set writer description\n    /// </summary>\n    [DataContract]\n    public sealed record class DataSetWriterModel\n    {\n        /// <summary>\n        /// Dataset writer identifier.\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0)]\n        public required string Id { get; set; }\n\n        /// <summary>\n        /// Published dataset inline definition\n        /// </summary>\n        [DataMember(Name = \"dataSet\", Order = 1,\n            EmitDefaultValue = false)]\n        public PublishedDataSetModel? DataSet { get; set; }\n\n        /// <summary>\n        /// Dataset field content mask\n        /// </summary>\n        [DataMember(Name = \"dataSetFieldContentMask\", Order = 2,\n            EmitDefaultValue = false)]\n        public DataSetFieldContentFlags? DataSetFieldContentMask { get; set; }\n\n        /// <summary>\n        /// Data set message settings\n        /// </summary>\n        [DataMember(Name = \"messageSettings\", Order = 3,\n            EmitDefaultValue = false)]\n        public DataSetWriterMessageSettingsModel? MessageSettings { get; set; }\n\n        /// <summary>\n        /// Keyframe count\n        /// </summary>\n        [DataMember(Name = \"keyFrameCount\", Order = 4,\n            EmitDefaultValue = false)]\n        public uint? KeyFrameCount { get; set; }\n\n        /// <summary>\n        /// Dataset writer name.\n        /// </summary>\n        [DataMember(Name = \"dataSetWriterName\", Order = 5)]\n        public string? DataSetWriterName { get; set; }\n\n        /// <summary>\n        /// Metadata message sending interval\n        /// </summary>\n        [DataMember(Name = \"metaDataUpdateTime\", Order = 6,\n            EmitDefaultValue = false)]\n        public TimeSpan? MetaDataUpdateTime { get; set; }\n\n        /// <summary>\n        /// Metadata queue settings the writer should use to publish\n        /// metadata messages to.\n        /// </summary>\n        [DataMember(Name = \"metaData\", Order = 7,\n            EmitDefaultValue = false)]\n        public PublishingQueueSettingsModel? MetaData { get; set; }\n\n        /// <summary>\n        /// Queue settings writer should use to publish messages\n        /// to. Overrides the writer group queue settings.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"publishing\", Order = 8,\n            EmitDefaultValue = false)]\n        public PublishingQueueSettingsModel? Publishing { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DataTypeMetadataModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Data type metadata model\n    /// </summary>\n    [DataContract]\n    public sealed record class DataTypeMetadataModel\n    {\n        /// <summary>\n        /// The data type for the instance declaration.\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? DataType { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DeadbandType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Deadband type\n    /// </summary>\n    [DataContract]\n    public enum DeadbandType\n    {\n        /// <summary>\n        /// Absolute\n        /// </summary>\n        [EnumMember(Value = \"Absolute\")]\n        Absolute,\n\n        /// <summary>\n        /// Percentage\n        /// </summary>\n        [EnumMember(Value = \"Percent\")]\n        Percent\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DeleteEventsDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// The events to delete\n    /// </summary>\n    [DataContract]\n    public sealed record class DeleteEventsDetailsModel\n    {\n        /// <summary>\n        /// Events to delete\n        /// </summary>\n        [DataMember(Name = \"eventIds\", Order = 0)]\n        [Required]\n        public required IReadOnlyList<byte[]> EventIds { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DeleteValuesAtTimesDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Deletes data at times\n    /// </summary>\n    [DataContract]\n    public sealed record class DeleteValuesAtTimesDetailsModel\n    {\n        /// <summary>\n        /// The timestamps to delete\n        /// </summary>\n        [DataMember(Name = \"reqTimes\", Order = 0)]\n        [Required]\n        public required IReadOnlyList<DateTime> ReqTimes { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DeleteValuesDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Delete values\n    /// </summary>\n    [DataContract]\n    public sealed record class DeleteValuesDetailsModel\n    {\n        /// <summary>\n        /// Start time\n        /// </summary>\n        [DataMember(Name = \"startTime\", Order = 0,\n            EmitDefaultValue = false)]\n        public DateTime? StartTime { get; set; }\n\n        /// <summary>\n        /// End time to delete until\n        /// </summary>\n        [DataMember(Name = \"endTime\", Order = 1,\n            EmitDefaultValue = false)]\n        public DateTime? EndTime { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiagnosticsLevel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Level of diagnostics requested in responses\n    /// </summary>\n    [DataContract]\n    public enum DiagnosticsLevel\n    {\n        /// <summary>\n        /// Include no diagnostics in response\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None = 0,\n\n        /// <summary>\n        /// Include status and symbol text (default)\n        /// </summary>\n        [EnumMember(Value = \"Status\")]\n        Status = 1,\n\n        /// <summary>\n        /// Include additional information\n        /// </summary>\n        [EnumMember(Value = \"Information\")]\n        Information = 10,\n\n        /// <summary>\n        /// Include inner diagnostics for tracing\n        /// </summary>\n        [EnumMember(Value = \"Debug\")]\n        Debug = 50,\n\n        /// <summary>\n        /// Include full diagnostics trace.\n        /// </summary>\n        [EnumMember(Value = \"Verbose\")]\n        Verbose = 100\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiagnosticsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Diagnostics configuration\n    /// </summary>\n    [DataContract]\n    public sealed record class DiagnosticsModel\n    {\n        /// <summary>\n        /// Requested level of response diagnostics.\n        /// (default: None)\n        /// </summary>\n        [DataMember(Name = \"level\", Order = 0,\n            EmitDefaultValue = false)]\n        public DiagnosticsLevel? Level { get; set; }\n\n        /// <summary>\n        /// Client audit log entry.\n        /// (default: client generated)\n        /// </summary>\n        [DataMember(Name = \"auditId\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? AuditId { get; set; }\n\n        /// <summary>\n        /// Timestamp of request.\n        /// (default: client generated)\n        /// </summary>\n        [DataMember(Name = \"timeStamp\", Order = 2,\n            EmitDefaultValue = false)]\n        public DateTime? TimeStamp { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiscoveryCancelRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Discovery cancel request\n    /// </summary>\n    [DataContract]\n    public sealed record class DiscoveryCancelRequestModel\n    {\n        /// <summary>\n        /// Id of discovery request\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Operation audit context\n        /// </summary>\n        [DataMember(Name = \"context\", Order = 1,\n            EmitDefaultValue = false)]\n        public OperationContextModel? Context { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiscoveryConfigModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Discovery configuration api model\n    /// </summary>\n    [DataContract]\n    public sealed record class DiscoveryConfigModel\n    {\n        /// <summary>\n        /// Address ranges to scan (null == all wired nics)\n        /// </summary>\n        [DataMember(Name = \"addressRangesToScan\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? AddressRangesToScan { get; set; }\n\n        /// <summary>\n        /// Network probe timeout\n        /// </summary>\n        [DataMember(Name = \"networkProbeTimeout\", Order = 1,\n            EmitDefaultValue = false)]\n        public TimeSpan? NetworkProbeTimeout { get; set; }\n\n        /// <summary>\n        /// Max network probes that should ever run.\n        /// </summary>\n        [DataMember(Name = \"maxNetworkProbes\", Order = 2,\n            EmitDefaultValue = false)]\n        public int? MaxNetworkProbes { get; set; }\n\n        /// <summary>\n        /// Port ranges to scan (null == all unassigned)\n        /// </summary>\n        [DataMember(Name = \"portRangesToScan\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? PortRangesToScan { get; set; }\n\n        /// <summary>\n        /// Port probe timeout\n        /// </summary>\n        [DataMember(Name = \"portProbeTimeout\", Order = 4,\n            EmitDefaultValue = false)]\n        public TimeSpan? PortProbeTimeout { get; set; }\n\n        /// <summary>\n        /// Max port probes that should ever run.\n        /// </summary>\n        [DataMember(Name = \"maxPortProbes\", Order = 5,\n            EmitDefaultValue = false)]\n        public int? MaxPortProbes { get; set; }\n\n        /// <summary>\n        /// Probes that must always be there as percent of max.\n        /// </summary>\n        [DataMember(Name = \"minPortProbesPercent\", Order = 6,\n            EmitDefaultValue = false)]\n        public int? MinPortProbesPercent { get; set; }\n\n        /// <summary>\n        /// Delay time between discovery sweeps\n        /// </summary>\n        [DataMember(Name = \"idleTimeBetweenScans\", Order = 7,\n            EmitDefaultValue = false)]\n        public TimeSpan? IdleTimeBetweenScans { get; set; }\n\n        /// <summary>\n        /// List of preset discovery urls to use\n        /// </summary>\n        [DataMember(Name = \"discoveryUrls\", Order = 8,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? DiscoveryUrls { get; set; }\n\n        /// <summary>\n        /// List of locales to filter with during discovery\n        /// </summary>\n        [DataMember(Name = \"locales\", Order = 9,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? Locales { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiscoveryEventModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n\n    /// <summary>\n    /// One of n events with the discovered application info\n    /// </summary>\n    public sealed record class DiscoveryEventModel\n    {\n        /// <summary>\n        /// Timestamp of the discovery sweep.\n        /// </summary>\n        public DateTimeOffset TimeStamp { get; set; }\n\n        /// <summary>\n        /// Index in the batch with same timestamp.\n        /// </summary>\n        public int Index { get; set; }\n\n        /// <summary>\n        /// Discovered endpoint in form of endpoint registration\n        /// </summary>\n        public EndpointRegistrationModel? Registration { get; set; }\n\n        /// <summary>\n        /// Application to which this endpoint belongs\n        /// </summary>\n        public ApplicationInfoModel? Application { get; set; }\n\n        /// <summary>\n        /// Discovery result summary on last element\n        /// </summary>\n        public DiscoveryResultModel? Result { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiscoveryMode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Discovery mode to use\n    /// </summary>\n    [DataContract]\n    public enum DiscoveryMode\n    {\n        /// <summary>\n        /// No discovery\n        /// </summary>\n        [EnumMember(Value = \"Off\")]\n        Off,\n\n        /// <summary>\n        /// Find and use local discovery server on edge device\n        /// </summary>\n        [EnumMember(Value = \"Local\")]\n        Local,\n\n        /// <summary>\n        /// Find and use all LDS in all connected networks\n        /// </summary>\n        [EnumMember(Value = \"Network\")]\n        Network,\n\n        /// <summary>\n        /// Fast network scan of */24 and known list of ports\n        /// </summary>\n        [EnumMember(Value = \"Fast\")]\n        Fast,\n\n        /// <summary>\n        /// Perform a deep scan of all networks.\n        /// </summary>\n        [EnumMember(Value = \"Scan\")]\n        Scan\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiscoveryProgressModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Discovery progress\n    /// </summary>\n    [DataContract]\n    public sealed record class DiscoveryProgressModel\n    {\n        /// <summary>\n        /// Id of discovery request\n        /// </summary>\n        [DataMember(Name = \"requestId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? RequestId { get; set; }\n\n        /// <summary>\n        /// Event type\n        /// </summary>\n        [DataMember(Name = \"eventType\", Order = 1)]\n        public DiscoveryProgressType EventType { get; set; }\n\n        /// <summary>\n        /// Discoverer that registered the application\n        /// </summary>\n        [DataMember(Name = \"discovererId\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? DiscovererId { get; set; }\n\n        /// <summary>\n        /// Additional request information as per event\n        /// </summary>\n        [DataMember(Name = \"requestDetails\", Order = 3,\n            EmitDefaultValue = false)]\n        public IReadOnlyDictionary<string, string>? RequestDetails { get; set; }\n\n        /// <summary>\n        /// Timestamp of the message\n        /// </summary>\n        [DataMember(Name = \"timeStamp\", Order = 4)]\n        public DateTimeOffset TimeStamp { get; set; }\n\n        /// <summary>\n        /// Number of workers running\n        /// </summary>\n        [DataMember(Name = \"workers\", Order = 5,\n            EmitDefaultValue = false)]\n        public int? Workers { get; set; }\n\n        /// <summary>\n        /// Progress\n        /// </summary>\n        [DataMember(Name = \"progress\", Order = 6,\n            EmitDefaultValue = false)]\n        public int? Progress { get; set; }\n\n        /// <summary>\n        /// Total\n        /// </summary>\n        [DataMember(Name = \"total\", Order = 7,\n            EmitDefaultValue = false)]\n        public int? Total { get; set; }\n\n        /// <summary>\n        /// Number of items discovered\n        /// </summary>\n        [DataMember(Name = \"discovered\", Order = 8,\n            EmitDefaultValue = false)]\n        public int? Discovered { get; set; }\n\n        /// <summary>\n        /// Discovery result\n        /// </summary>\n        [DataMember(Name = \"result\", Order = 9,\n            EmitDefaultValue = false)]\n        public string? Result { get; set; }\n\n        /// <summary>\n        /// Discovery result details\n        /// </summary>\n        [DataMember(Name = \"resultDetails\", Order = 10,\n            EmitDefaultValue = false)]\n        public IReadOnlyDictionary<string, string>? ResultDetails { get; set; }\n\n        /// <summary>\n        /// Discovery request\n        /// </summary>\n        [DataMember(Name = \"request\", Order = 11,\n            EmitDefaultValue = false)]\n        public required DiscoveryRequestModel Request { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiscoveryProgressType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Discovery progress event type\n    /// </summary>\n    [DataContract]\n    public enum DiscoveryProgressType\n    {\n        /// <summary>\n        /// Discovery run pending\n        /// </summary>\n        [EnumMember(Value = \"Pending\")]\n        Pending,\n\n        /// <summary>\n        /// Discovery run started\n        /// </summary>\n        [EnumMember(Value = \"Started\")]\n        Started,\n\n        /// <summary>\n        /// Discovery was cancelled\n        /// </summary>\n        [EnumMember(Value = \"Cancelled\")]\n        Cancelled,\n\n        /// <summary>\n        /// Discovery resulted in error\n        /// </summary>\n        [EnumMember(Value = \"Error\")]\n        Error,\n\n        /// <summary>\n        /// Discovery finished\n        /// </summary>\n        [EnumMember(Value = \"Finished\")]\n        Finished,\n\n        /// <summary>\n        /// Network scanning started\n        /// </summary>\n        [EnumMember(Value = \"NetworkScanStarted\")]\n        NetworkScanStarted,\n\n        /// <summary>\n        /// Network scanning result\n        /// </summary>\n        [EnumMember(Value = \"NetworkScanResult\")]\n        NetworkScanResult,\n\n        /// <summary>\n        /// Network scan progress\n        /// </summary>\n        [EnumMember(Value = \"NetworkScanProgress\")]\n        NetworkScanProgress,\n\n        /// <summary>\n        /// Network scan finished\n        /// </summary>\n        [EnumMember(Value = \"NetworkScanFinished\")]\n        NetworkScanFinished,\n\n        /// <summary>\n        /// Port scan started\n        /// </summary>\n        [EnumMember(Value = \"PortScanStarted\")]\n        PortScanStarted,\n\n        /// <summary>\n        /// Port scan result\n        /// </summary>\n        [EnumMember(Value = \"PortScanResult\")]\n        PortScanResult,\n\n        /// <summary>\n        /// Port scan progress\n        /// </summary>\n        [EnumMember(Value = \"PortScanProgress\")]\n        PortScanProgress,\n\n        /// <summary>\n        /// Port scan finished\n        /// </summary>\n        [EnumMember(Value = \"PortScanFinished\")]\n        PortScanFinished,\n\n        /// <summary>\n        /// Server discovery started\n        /// </summary>\n        [EnumMember(Value = \"ServerDiscoveryStarted\")]\n        ServerDiscoveryStarted,\n\n        /// <summary>\n        /// Endpoint discovery started\n        /// </summary>\n        [EnumMember(Value = \"EndpointsDiscoveryStarted\")]\n        EndpointsDiscoveryStarted,\n\n        /// <summary>\n        /// Endpoint discovery finished\n        /// </summary>\n        [EnumMember(Value = \"EndpointsDiscoveryFinished\")]\n        EndpointsDiscoveryFinished,\n\n        /// <summary>\n        /// Server discovery finished\n        /// </summary>\n        [EnumMember(Value = \"ServerDiscoveryFinished\")]\n        ServerDiscoveryFinished,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiscoveryRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Discovery request\n    /// </summary>\n    [DataContract]\n    public sealed record class DiscoveryRequestModel\n    {\n        /// <summary>\n        /// Id of discovery request\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Discovery mode to use\n        /// </summary>\n        [DataMember(Name = \"discovery\", Order = 1,\n            EmitDefaultValue = false)]\n        public DiscoveryMode? Discovery { get; set; }\n\n        /// <summary>\n        /// Scan configuration to use\n        /// </summary>\n        [DataMember(Name = \"configuration\", Order = 2,\n            EmitDefaultValue = false)]\n        public DiscoveryConfigModel? Configuration { get; set; }\n\n        /// <summary>\n        /// Operation audit context\n        /// </summary>\n        [DataMember(Name = \"context\", Order = 3,\n            EmitDefaultValue = false)]\n        public OperationContextModel? Context { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/DiscoveryResultModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of a discovery run - part of last event element\n    /// in batch\n    /// </summary>\n    [DataContract]\n    public sealed record class DiscoveryResultModel\n    {\n        /// <summary>\n        /// Id of discovery request\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Configuration used during discovery\n        /// </summary>\n        [DataMember(Name = \"discoveryConfig\", Order = 1,\n            EmitDefaultValue = false)]\n        public DiscoveryConfigModel? DiscoveryConfig { get; set; }\n\n        /// <summary>\n        /// If true, only register, do not unregister based\n        /// on these events.\n        /// </summary>\n        [DataMember(Name = \"registerOnly\", Order = 2,\n            EmitDefaultValue = false)]\n        public bool? RegisterOnly { get; set; }\n\n        /// <summary>\n        /// If discovery failed, result information\n        /// </summary>\n        [DataMember(Name = \"diagnostics\", Order = 3,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public VariantValue? Diagnostics { get; set; }\n\n        /// <summary>\n        /// Operation audit context\n        /// </summary>\n        [DataMember(Name = \"context\", Order = 4,\n            EmitDefaultValue = false)]\n        public OperationContextModel? Context { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EndpointConnectivityState.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// State of the endpoint after activation\n    /// </summary>\n    [DataContract]\n    public enum EndpointConnectivityState\n    {\n        /// <summary>\n        /// Client connecting to endpoint\n        /// </summary>\n        [EnumMember(Value = \"Connecting\")]\n        Connecting,\n\n        /// <summary>\n        /// Server not reachable\n        /// </summary>\n        [EnumMember(Value = \"NotReachable\")]\n        NotReachable,\n\n        /// <summary>\n        /// Server busy - try later\n        /// </summary>\n        [EnumMember(Value = \"Busy\")]\n        Busy,\n\n        /// <summary>\n        /// Client is not trusted - update client cert\n        /// </summary>\n        [EnumMember(Value = \"NoTrust\")]\n        NoTrust,\n\n        /// <summary>\n        /// Server certificate is invalid - update server certificate\n        /// </summary>\n        [EnumMember(Value = \"CertificateInvalid\")]\n        CertificateInvalid,\n\n        /// <summary>\n        /// Connected and ready\n        /// </summary>\n        [EnumMember(Value = \"Ready\")]\n        Ready,\n\n        /// <summary>\n        /// Any other connection error\n        /// </summary>\n        [EnumMember(Value = \"Error\")]\n        Error,\n\n        /// <summary>\n        /// Client disconnected\n        /// </summary>\n        [EnumMember(Value = \"Disconnected\")]\n        Disconnected,\n\n        /// <summary>\n        /// User is not authorized to connect.\n        /// </summary>\n        [EnumMember(Value = \"Unauthorized\")]\n        Unauthorized\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EndpointEventModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Endpoint Event model\n    /// </summary>\n    [DataContract]\n    public sealed record class EndpointEventModel\n    {\n        /// <summary>\n        /// Type of event\n        /// </summary>\n        [DataMember(Name = \"eventType\", Order = 0)]\n        public EndpointEventType EventType { get; set; }\n\n        /// <summary>\n        /// Endpoint id\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Endpoint info\n        /// </summary>\n        [DataMember(Name = \"endpoint\", Order = 2)]\n        public required EndpointInfoModel Endpoint { get; set; }\n\n        /// <summary>\n        /// Context\n        /// </summary>\n        [DataMember(Name = \"context\", Order = 3,\n            EmitDefaultValue = false)]\n        public OperationContextModel? Context { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EndpointEventType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Activation state of the endpoint twin\n    /// </summary>\n    [DataContract]\n    public enum EndpointEventType\n    {\n        /// <summary>\n        /// New\n        /// </summary>\n        [EnumMember(Value = \"New\")]\n        New,\n\n        /// <summary>\n        /// Enabled\n        /// </summary>\n        [EnumMember(Value = \"Enabled\")]\n        Enabled,\n\n        /// <summary>\n        /// Disabled\n        /// </summary>\n        [EnumMember(Value = \"Disabled\")]\n        Disabled,\n\n        /// <summary>\n        /// Deleted\n        /// </summary>\n        [EnumMember(Value = \"Deleted\")]\n        Deleted,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EndpointInfoModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Endpoint info\n    /// </summary>\n    [DataContract]\n    public sealed record class EndpointInfoModel\n    {\n        /// <summary>\n        /// Endpoint registration\n        /// </summary>\n        [DataMember(Name = \"registration\", Order = 0)]\n        [Required]\n        public required EndpointRegistrationModel Registration { get; set; }\n\n        /// <summary>\n        /// Application id endpoint is registered under.\n        /// </summary>\n        [DataMember(Name = \"applicationId\", Order = 1)]\n        [Required]\n        public required string ApplicationId { get; set; }\n\n        /// <summary>\n        /// Last state of the endpoint\n        /// </summary>\n        [DataMember(Name = \"endpointState\", Order = 3,\n            EmitDefaultValue = false)]\n        public EndpointConnectivityState? EndpointState { get; set; }\n\n        /// <summary>\n        /// Last time endpoint was seen\n        /// </summary>\n        [DataMember(Name = \"notSeenSince\", Order = 5,\n            EmitDefaultValue = false)]\n        public DateTimeOffset? NotSeenSince { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EndpointModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Endpoint model\n    /// </summary>\n    [DataContract]\n    public sealed record class EndpointModel\n    {\n        /// <summary>\n        /// Endpoint url to use to connect with\n        /// </summary>\n        [DataMember(Name = \"url\", Order = 0)]\n        [Required]\n        public required string Url { get; set; }\n\n        /// <summary>\n        /// Alternative endpoint urls that can be used for\n        /// accessing and validating the server\n        /// </summary>\n        [DataMember(Name = \"alternativeUrls\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlySet<string>? AlternativeUrls { get; set; }\n\n        /// <summary>\n        /// Security Mode to use for communication.\n        /// default to best.\n        /// </summary>\n        [DataMember(Name = \"securityMode\", Order = 2,\n            EmitDefaultValue = false)]\n        public SecurityMode? SecurityMode { get; set; }\n\n        /// <summary>\n        /// Security policy uri to use for communication.\n        /// default to best.\n        /// </summary>\n        [DataMember(Name = \"securityPolicy\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? SecurityPolicy { get; set; }\n\n        /// <summary>\n        /// Endpoint certificate thumbprint\n        /// </summary>\n        [DataMember(Name = \"certificate\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? Certificate { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EndpointRegistrationModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Endpoint registration\n    /// </summary>\n    [DataContract]\n    public sealed record class EndpointRegistrationModel\n    {\n        /// <summary>\n        /// Endpoint identifier which is hashed from\n        /// the supervisor, site and url.\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0)]\n        [Required]\n        public required string Id { get; set; }\n\n        /// <summary>\n        /// Original endpoint url of the endpoint\n        /// </summary>\n        [DataMember(Name = \"endpointUrl\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? EndpointUrl { get; set; }\n\n        /// <summary>\n        /// Registered site of the endpoint\n        /// </summary>\n        [DataMember(Name = \"siteId\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? SiteId { get; set; }\n\n        /// <summary>\n        /// Entity that registered and can access the endpoint\n        /// </summary>\n        [DataMember(Name = \"discovererId\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? DiscovererId { get; set; }\n\n        /// <summary>\n        /// Endpoint information of the registration\n        /// </summary>\n        [DataMember(Name = \"endpoint\", Order = 5)]\n        public EndpointModel? Endpoint { get; set; }\n\n        /// <summary>\n        /// Security level of the endpoint\n        /// </summary>\n        [DataMember(Name = \"securityLevel\", Order = 6,\n            EmitDefaultValue = false)]\n        public int? SecurityLevel { get; set; }\n\n        /// <summary>\n        /// Supported authentication methods that can be selected to\n        /// obtain a credential and used to interact with the endpoint.\n        /// </summary>\n        [DataMember(Name = \"authenticationMethods\", Order = 7,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<AuthenticationMethodModel>? AuthenticationMethods { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EnumDescriptionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Enum type schema\n    /// </summary>\n    [DataContract]\n    public record class EnumDescriptionModel\n    {\n        /// <summary>\n        /// Data type identifier\n        /// </summary>\n        [DataMember(Name = \"dataTypeId\", Order = 1)]\n        public required string DataTypeId { get; set; }\n\n        /// <summary>\n        /// Name of the type\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 2)]\n        public required string Name { get; set; }\n\n        /// <summary>\n        /// Fields of the enum\n        /// </summary>\n        [DataMember(Name = \"fields\", Order = 3)]\n        public required IReadOnlyList<EnumFieldDescriptionModel> Fields { get; set; }\n\n        /// <summary>\n        /// Underlying built in type of the enum.\n        /// Default is integer.\n        /// </summary>\n        [DataMember(Name = \"builtInType\", Order = 4,\n            EmitDefaultValue = false)]\n        public byte? BuiltInType { get; set; }\n\n        /// <summary>\n        /// This is an option set and represents bit flags.\n        /// </summary>\n        [DataMember(Name = \"isOptionSet\", Order = 5,\n            EmitDefaultValue = false)]\n        public bool IsOptionSet { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EnumFieldDescriptionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Enum description field\n    /// </summary>\n    [DataContract]\n    public record class EnumFieldDescriptionModel\n    {\n        /// <summary>\n        /// Name of the type\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 1)]\n        public required string Name { get; set; }\n\n        /// <summary>\n        /// Value of the field in the enum\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 2)]\n        public long Value { get; set; }\n\n        /// <summary>\n        /// Name to display to user\n        /// </summary>\n        [DataMember(Name = \"displayName\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? DisplayName { get; set; }\n\n        /// <summary>\n        /// Description\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? Description { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/EventFilterModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Event filter\n    /// </summary>\n    [DataContract]\n    public sealed record class EventFilterModel\n    {\n        /// <summary>\n        /// Select clauses\n        /// </summary>\n        [DataMember(Name = \"selectClauses\", Order = 0,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<SimpleAttributeOperandModel>? SelectClauses { get; set; }\n\n        /// <summary>\n        /// Where clause\n        /// </summary>\n        [DataMember(Name = \"whereClause\", Order = 1,\n            EmitDefaultValue = false)]\n        public ContentFilterModel? WhereClause { get; set; }\n\n        /// <summary>\n        /// Simple event Type definition node id\n        /// </summary>\n        [DataMember(Name = \"typeDefinitionId\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? TypeDefinitionId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ExceptionDeviationType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Exception deviation type\n    /// </summary>\n    [DataContract]\n    public enum ExceptionDeviationType\n    {\n        /// <summary>\n        /// Absolute value\n        /// </summary>\n        [EnumMember(Value = \"AbsoluteValue\")]\n        AbsoluteValue,\n\n        /// <summary>\n        /// Percent of value\n        /// </summary>\n        [EnumMember(Value = \"PercentOfValue\")]\n        PercentOfValue,\n\n        /// <summary>\n        /// Percent of a range\n        /// </summary>\n        [EnumMember(Value = \"PercentOfRange\")]\n        PercentOfRange,\n\n        /// <summary>\n        /// Percent of range\n        /// </summary>\n        [EnumMember(Value = \"PercentOfEURange\")]\n        PercentOfEURange\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ExtensionFieldModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Extension fields\n    /// </summary>\n    [DataContract]\n    public record ExtensionFieldModel\n    {\n        /// <summary>\n        /// Field name or display name of the published variable\n        /// </summary>\n        [DataMember(Name = \"dataSetFieldName\", Order = 1,\n            EmitDefaultValue = false)]\n        public required string DataSetFieldName { get; init; }\n\n        /// <summary>\n        /// Name of the published dataset\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 2,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public required VariantValue Value { get; init; }\n\n        /// <summary>\n        /// Identifier of field in the dataset class.\n        /// </summary>\n        [DataMember(Name = \"dataSetClassFieldId\", Order = 3,\n            EmitDefaultValue = false)]\n        public Guid DataSetClassFieldId { get; init; }\n\n        /// <summary>\n        /// Description for the field as it should show up in\n        /// the data set meta data.\n        /// </summary>\n        [DataMember(Name = \"dataSetFieldDescription\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? DataSetFieldDescription { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/FileInfoModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// File info\n    /// </summary>\n    [DataContract]\n    public record FileInfoModel\n    {\n        /// <summary>\n        /// The size of the file in Bytes. When a file is\n        /// currently opened for write, the size might not be\n        /// accurate or available.\n        /// </summary>\n        [DataMember(Name = \"size\", Order = 0,\n            EmitDefaultValue = false)]\n        public long? Size { get; init; }\n\n        /// <summary>\n        /// Whether the file is writable.\n        /// </summary>\n        [DataMember(Name = \"writable\", Order = 1,\n           EmitDefaultValue = false)]\n        public bool Writable { get; init; }\n\n        /// <summary>\n        /// The number of currently valid file handles on\n        /// the file.\n        /// </summary>\n        [DataMember(Name = \"openCount\", Order = 2,\n           EmitDefaultValue = false)]\n        public ushort OpenCount { get; init; }\n\n        /// <summary>\n        /// The media type of the file based on RFC 2046.\n        /// </summary>\n        [DataMember(Name = \"mimeType\", Order = 3,\n           EmitDefaultValue = false)]\n        public string? MimeType { get; init; }\n\n        /// <summary>\n        /// The maximum number of bytes of\n        /// the read and write buffers.\n        /// </summary>\n        [DataMember(Name = \"maxBufferSize\", Order = 4,\n            EmitDefaultValue = false)]\n        public uint? MaxBufferSize { get; init; }\n\n        /// <summary>\n        /// The time the file was last modified.\n        /// </summary>\n        [DataMember(Name = \"lastModified\", Order = 5,\n            EmitDefaultValue = false)]\n        public DateTime? LastModified { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/FileOpenWriteOptionsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// File open for write options\n    /// </summary>\n    [DataContract]\n    public record FileOpenWriteOptionsModel\n    {\n        /// <summary>\n        /// The write mode to use when writing to the file.\n        /// The default mode is \"Create\", erasing the file\n        /// if it exists and writing a new one.\n        /// </summary>\n        [DataMember(Name = \"mode\", Order = 1,\n            EmitDefaultValue = false)]\n        public FileWriteMode Mode { get; init; }\n\n        /// <summary>\n        /// Optional method to call to close and commit the\n        /// file after writing is done. Many file types require\n        /// to call a special method when closing to make the\n        /// content persist, e.g., during device or software\n        /// update or when uploding configuration. The method\n        /// id is specific to the file type opened.\n        /// </summary>\n        [DataMember(Name = \"closeMethodId\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? CloseAndCommitMethodId { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/FileSystemObjectModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// File system object model\n    /// </summary>\n    [DataContract]\n    public record FileSystemObjectModel\n    {\n        /// <summary>\n        /// The node id of the filesystem object\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? NodeId { get; init; }\n\n        /// <summary>\n        /// The browse path to the filesystem object\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 1,\n           EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; init; }\n\n        /// <summary>\n        /// The name of the filesystem object\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 2,\n           EmitDefaultValue = false)]\n        public string? Name { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/FileWriteMode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// File write mode\n    /// </summary>\n    [DataContract]\n    public enum FileWriteMode\n    {\n        /// <summary>\n        /// The existing content of the file is erased.\n        /// </summary>\n        [EnumMember(Value = \"Create\")]\n        Create,\n\n        /// <summary>\n        /// The file is opened for writing.\n        /// </summary>\n        [EnumMember(Value = \"Write\")]\n        Write,\n\n        /// <summary>\n        /// The file is opened and positioned\n        /// at end of the file\n        /// </summary>\n        [EnumMember(Value = \"Append\")]\n        Append\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/FilterOperandModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Filter operand\n    /// </summary>\n    [DataContract]\n    public sealed record class FilterOperandModel\n    {\n        /// <summary>\n        /// Element reference in the outer list if\n        /// operand is an element operand\n        /// </summary>\n        [DataMember(Name = \"index\", Order = 0,\n            EmitDefaultValue = false)]\n        public uint? Index { get; set; }\n\n        /// <summary>\n        /// Variant value if operand is a literal\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 1,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public VariantValue? Value { get; set; }\n\n        /// <summary>\n        /// Type definition node id if operand is\n        /// simple or full attribute operand.\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// Browse path of attribute operand\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 3,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// Attribute id\n        /// </summary>\n        [DataMember(Name = \"attributeId\", Order = 4,\n            EmitDefaultValue = false)]\n        public NodeAttribute? AttributeId { get; set; }\n\n        /// <summary>\n        /// Index range of attribute operand\n        /// </summary>\n        [DataMember(Name = \"indexRange\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? IndexRange { get; set; }\n\n        /// <summary>\n        /// Optional alias to refer to it makeing it a\n        /// full blown attribute operand\n        /// </summary>\n        [DataMember(Name = \"alias\", Order = 6,\n            EmitDefaultValue = false)]\n        public string? Alias { get; set; }\n\n        /// <summary>\n        /// Data type if operand is a literal\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 7,\n            EmitDefaultValue = false)]\n        public string? DataType { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/FilterOperatorType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Filter operator type\n    /// </summary>\n    [DataContract]\n    public enum FilterOperatorType\n    {\n        /// <summary>\n        /// Equals\n        /// </summary>\n        [EnumMember(Value = \"Equals\")]\n        Equals,\n\n        /// <summary>\n        /// Element == null\n        /// </summary>\n        [EnumMember(Value = \"IsNull\")]\n        IsNull,\n\n        /// <summary>\n        /// Greater than\n        /// </summary>\n        [EnumMember(Value = \"GreaterThan\")]\n        GreaterThan,\n\n        /// <summary>\n        /// Less than\n        /// </summary>\n        [EnumMember(Value = \"LessThan\")]\n        LessThan,\n\n        /// <summary>\n        /// Greater than or equal\n        /// </summary>\n        [EnumMember(Value = \"GreaterThanOrEqual\")]\n        GreaterThanOrEqual,\n\n        /// <summary>\n        /// Less than or equal\n        /// </summary>\n        [EnumMember(Value = \"LessThanOrEqual\")]\n        LessThanOrEqual,\n\n        /// <summary>\n        /// String match\n        /// </summary>\n        [EnumMember(Value = \"Like\")]\n        Like,\n\n        /// <summary>\n        /// Logical not\n        /// </summary>\n        [EnumMember(Value = \"Not\")]\n        Not,\n\n        /// <summary>\n        /// Between\n        /// </summary>\n        [EnumMember(Value = \"Between\")]\n        Between,\n\n        /// <summary>\n        /// In list\n        /// </summary>\n        [EnumMember(Value = \"InList\")]\n        InList,\n\n        /// <summary>\n        /// Logical And\n        /// </summary>\n        [EnumMember(Value = \"And\")]\n        And,\n\n        /// <summary>\n        /// Logical Or\n        /// </summary>\n        [EnumMember(Value = \"Or\")]\n        Or,\n\n        /// <summary>\n        /// Cast\n        /// </summary>\n        [EnumMember(Value = \"Cast\")]\n        Cast,\n\n        /// <summary>\n        /// View scope\n        /// </summary>\n        [EnumMember(Value = \"InView\")]\n        InView,\n\n        /// <summary>\n        /// Type test\n        /// </summary>\n        [EnumMember(Value = \"OfType\")]\n        OfType,\n\n        /// <summary>\n        /// Relationship\n        /// </summary>\n        [EnumMember(Value = \"RelatedTo\")]\n        RelatedTo,\n\n        /// <summary>\n        /// Bitwise and\n        /// </summary>\n        [EnumMember(Value = \"BitwiseAnd\")]\n        BitwiseAnd,\n\n        /// <summary>\n        /// Bitwise or\n        /// </summary>\n        [EnumMember(Value = \"BitwiseOr\")]\n        BitwiseOr\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/GetConfiguredEndpointsRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Get configured endpoints request call\n    /// </summary>\n    [DataContract]\n    public sealed record class GetConfiguredEndpointsRequestModel\n    {\n        /// <summary>\n        /// Include nodes that make up the configuration\n        /// </summary>\n        [DataMember(Name = \"includeNodes\", Order = 0,\n            EmitDefaultValue = false)]\n        public bool? IncludeNodes { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/GetConfiguredEndpointsResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of GetConfiguredEndpoints method call\n    /// </summary>\n    [DataContract]\n    public sealed record class GetConfiguredEndpointsResponseModel\n    {\n        /// <summary>\n        /// Collection of Endpoints in the configuration\n        /// </summary>\n        [DataMember(Name = \"endpoints\", Order = 0,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<PublishedNodesEntryModel>? Endpoints { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/GetConfiguredNodesOnEndpointResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of GetConfiguredNodesOnEndpoint method call\n    /// </summary>\n    [DataContract]\n    public sealed record class GetConfiguredNodesOnEndpointResponseModel\n    {\n        /// <summary>\n        /// Collection of Nodes configured for a particular endpoint\n        /// </summary>\n        [DataMember(Name = \"opcNodes\", Order = 0,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<OpcNodeModel>? OpcNodes { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HeartbeatBehavior.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Controls how heartbeat messages are handled for monitored items.\n    /// Heartbeats help maintain awareness of node state and connection health\n    /// even when values don't change. Can be configured globally via the\n    /// --hbb command line option. Works with heartbeat interval settings.\n    /// </summary>\n    [DataContract]\n    [Flags]\n    public enum HeartbeatBehavior\n    {\n        /// <summary>\n        /// Default behavior that sends last known value when heartbeat triggers.\n        /// Reports exact state regardless of value quality or status.\n        /// Most straightforward option for basic monitoring.\n        /// Value may be bad or uncertain quality.\n        /// </summary>\n        [EnumMember(Value = \"WatchdogLKV\")]\n        WatchdogLKV = 0x0,\n\n        /// <summary>\n        /// Sends only good quality values when heartbeat triggers.\n        /// Ensures reported values meet quality requirements.\n        /// May not reflect actual current state if last good value is old.\n        /// Use when data quality is more important than immediacy.\n        /// </summary>\n        [EnumMember(Value = \"WatchdogLKG\")]\n        WatchdogLKG = 0x1,\n\n        /// <summary>\n        /// Periodically publishes last known value at heartbeat interval.\n        /// Provides regular state updates regardless of value changes.\n        /// Useful for monitoring systems that expect periodic updates.\n        /// Higher bandwidth usage due to regular messages.\n        /// </summary>\n        [EnumMember(Value = \"PeriodicLKV\")]\n        PeriodicLKV = 0x2,\n\n        /// <summary>\n        /// Periodically publishes last good quality value at heartbeat interval.\n        /// Combines periodic updates with quality filtering.\n        /// Ensures regular, quality-checked status updates.\n        /// Best choice for reliable system state monitoring.\n        /// </summary>\n        [EnumMember(Value = \"PeriodicLKG\")]\n        PeriodicLKG = WatchdogLKG | PeriodicLKV,\n\n        /// <summary>\n        /// Like WatchdogLKV but updates timestamps on each heartbeat.\n        /// Helps distinguish between multiple heartbeat messages.\n        /// Useful when downstream systems track value freshness.\n        /// Can be combined with other behaviors using flags.\n        /// </summary>\n        [EnumMember(Value = \"WatchdogLKVWithUpdatedTimestamps\")]\n        WatchdogLKVWithUpdatedTimestamps = 0x4,\n\n        // Others can be combining Cont, LKG with 0x4\n\n        /// <summary>\n        /// Records heartbeat events in diagnostics without sending messages.\n        /// Allows monitoring heartbeat behavior without generating traffic.\n        /// Useful for testing and troubleshooting configurations.\n        /// Can be combined with other behaviors using flags.\n        /// </summary>\n        [EnumMember(Value = \"WatchdogLKVDiagnosticsOnly\")]\n        WatchdogLKVDiagnosticsOnly = 0x8,\n\n        // Others can be combining Cont, LKG with 0x8\n\n        /// <summary>\n        /// Reserved, do not use\n        /// </summary>\n#pragma warning disable CA1700 // Do not name enum values 'Reserved'\n        Reserved = 0x10,\n#pragma warning restore CA1700 // Do not name enum values 'Reserved'\n\n        /// <summary>\n        /// Only sends periodic heartbeat messages with last known value.\n        /// Filters out regular value change notifications.\n        /// Reduces message volume in fast-changing nodes.\n        /// Use when only periodic snapshots are needed.\n        /// </summary>\n        [EnumMember(Value = \"PeriodicLKVDropValue\")]\n        PeriodicLKVDropValue = PeriodicLKV | Reserved,\n\n        /// <summary>\n        /// Only sends periodic heartbeat messages with last good value.\n        /// Combines periodic-only updates with quality filtering.\n        /// Most restrictive option for message generation.\n        /// Best for reducing traffic while ensuring quality.\n        /// </summary>\n        [EnumMember(Value = \"PeriodicLKGDropValue\")]\n        PeriodicLKGDropValue = PeriodicLKG | Reserved,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoricEventModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Historic event\n    /// </summary>\n    [DataContract]\n    public sealed record class HistoricEventModel\n    {\n        /// <summary>\n        /// The selected fields of the event\n        /// </summary>\n        [DataMember(Name = \"eventFields\", Order = 0)]\n        [SkipValidation]\n        public required IReadOnlyList<VariantValue> EventFields { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoricValueModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Historic data\n    /// </summary>\n    [DataContract]\n    public sealed record class HistoricValueModel\n    {\n        /// <summary>\n        /// The value of data value.\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 0)]\n        [SkipValidation]\n        public VariantValue? Value { get; set; }\n\n        /// <summary>\n        /// Built in data type of the updated values\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? DataType { get; set; }\n\n        /// <summary>\n        /// The status code associated with the value.\n        /// </summary>\n        [DataMember(Name = \"status\", Order = 2,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? Status { get; set; }\n\n        /// <summary>\n        /// The source timestamp associated with the value.\n        /// </summary>\n        [DataMember(Name = \"sourceTimestamp\", Order = 3,\n            EmitDefaultValue = false)]\n        public DateTime? SourceTimestamp { get; set; }\n\n        /// <summary>\n        /// Additional resolution for the source timestamp.\n        /// </summary>\n        [DataMember(Name = \"sourcePicoseconds\", Order = 4,\n            EmitDefaultValue = false)]\n        public ushort? SourcePicoseconds { get; set; }\n\n        /// <summary>\n        /// The server timestamp associated with the value.\n        /// </summary>\n        [DataMember(Name = \"serverTimestamp\", Order = 5,\n            EmitDefaultValue = false)]\n        public DateTime? ServerTimestamp { get; set; }\n\n        /// <summary>\n        /// Additional resolution for the server timestamp.\n        /// </summary>\n        [DataMember(Name = \"serverPicoseconds\", Order = 6,\n            EmitDefaultValue = false)]\n        public ushort? ServerPicoseconds { get; set; }\n\n        /// <summary>\n        /// Indicates the location of the data. (Default: raw)\n        /// </summary>\n        [DataMember(Name = \"dataLocation\", Order = 7,\n            EmitDefaultValue = false)]\n        public DataLocation? DataLocation { get; set; }\n\n        /// <summary>\n        /// modification information when reading modifications.\n        /// </summary>\n        [DataMember(Name = \"modificationInfo\", Order = 8,\n            EmitDefaultValue = false)]\n        public ModificationInfoModel? ModificationInfo { get; set; }\n\n        /// <summary>\n        /// History information if any (default: none)\n        /// </summary>\n        [DataMember(Name = \"additionalData\", Order = 9,\n            EmitDefaultValue = false)]\n        public AdditionalData? AdditionalData { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryConfigurationModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// History configuration\n    /// </summary>\n    [DataContract]\n    public sealed record class HistoryConfigurationModel\n    {\n        /// <summary>\n        /// specifies whether the historical data was\n        /// collected in such a manner that it should\n        /// be displayed as SlopedInterpolation (sloped\n        /// line between points) or as SteppedInterpolation\n        /// (vertically-connected horizontal lines\n        /// between points) when raw data is examined.\n        /// This Property also effects how some\n        /// Aggregates are calculated\n        /// </summary>\n        [DataMember(Name = \"stepped\", Order = 0,\n            EmitDefaultValue = false)]\n        public bool? Stepped { get; set; }\n\n        /// <summary>\n        /// Human readable string that specifies how\n        /// the value of this HistoricalDataNode is\n        /// calculated\n        /// </summary>\n        [DataMember(Name = \"definition\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? Definition { get; set; }\n\n        /// <summary>\n        /// Specifies the maximum interval between data\n        /// points in the history repository\n        /// regardless of their value change\n        /// </summary>\n        [DataMember(Name = \"maxTimeInterval\", Order = 2,\n            EmitDefaultValue = false)]\n        public TimeSpan? MaxTimeInterval { get; set; }\n\n        /// <summary>\n        /// Specifies the minimum interval between\n        /// data points in the history repository\n        /// regardless of their value change\n        /// </summary>\n        [DataMember(Name = \"minTimeInterval\", Order = 3,\n            EmitDefaultValue = false)]\n        public TimeSpan? MinTimeInterval { get; set; }\n\n        /// <summary>\n        /// Minimum amount that the data for the\n        /// Node shall change in order for the change\n        /// to be reported to the history database\n        /// </summary>\n        [DataMember(Name = \"exceptionDeviation\", Order = 4,\n            EmitDefaultValue = false)]\n        public double? ExceptionDeviation { get; set; }\n\n        /// <summary>\n        /// Specifies how the ExceptionDeviation is\n        /// determined\n        /// </summary>\n        [DataMember(Name = \"exceptionDeviationType\", Order = 5,\n            EmitDefaultValue = false)]\n        public ExceptionDeviationType? ExceptionDeviationType { get; set; }\n\n        /// <summary>\n        /// The date before which there is no data in the\n        /// archive either online or offline\n        /// </summary>\n        [DataMember(Name = \"startOfArchive\", Order = 6,\n            EmitDefaultValue = false)]\n        public DateTime? StartOfArchive { get; set; }\n\n        /// <summary>\n        /// The last date of the archive\n        /// </summary>\n        [DataMember(Name = \"endOfArchive\", Order = 7,\n            EmitDefaultValue = false)]\n        public DateTime? EndOfArchive { get; set; }\n\n        /// <summary>\n        /// Date of the earliest data in the online archive\n        /// </summary>\n        [DataMember(Name = \"startOfOnlineArchive\", Order = 8,\n            EmitDefaultValue = false)]\n        public DateTime? StartOfOnlineArchive { get; set; }\n\n        /// <summary>\n        /// Server supports ServerTimestamps in addition\n        /// to SourceTimestamp\n        /// </summary>\n        [DataMember(Name = \"serverTimestampSupported\", Order = 9,\n            EmitDefaultValue = false)]\n        public bool? ServerTimestampSupported { get; set; }\n\n        /// <summary>\n        /// Aggregate configuration\n        /// </summary>\n        [DataMember(Name = \"aggregateConfiguration\", Order = 10,\n            EmitDefaultValue = false)]\n        public AggregateConfigurationModel? AggregateConfiguration { get; set; }\n\n        /// <summary>\n        /// Allowed aggregate functions\n        /// </summary>\n        [DataMember(Name = \"aggregateFunctions\", Order = 11,\n            EmitDefaultValue = false)]\n        public IReadOnlyDictionary<string, string>? AggregateFunctions { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryConfigurationRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request history configuration\n    /// </summary>\n    [DataContract]\n    public sealed record class HistoryConfigurationRequestModel\n    {\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 0,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n\n        /// <summary>\n        /// Continuation token to continue reading more\n        /// results.\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 1)]\n        [Required]\n        public required string NodeId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryConfigurationResponseModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Response with history configuration\n    /// </summary>\n    [DataContract]\n    public sealed record class HistoryConfigurationResponseModel\n    {\n        /// <summary>\n        /// History Configuration\n        /// results.\n        /// </summary>\n        [DataMember(Name = \"configuration\", Order = 0)]\n        public HistoryConfigurationModel? Configuration { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryReadNextRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request node history read continuation\n    /// </summary>\n    [DataContract]\n    public sealed record class HistoryReadNextRequestModel\n    {\n        /// <summary>\n        /// Continuation token to continue reading more\n        /// results.\n        /// </summary>\n        [DataMember(Name = \"continuationToken\", Order = 0)]\n        [Required]\n        public required string ContinuationToken { get; set; }\n\n        /// <summary>\n        /// Abort reading after this read\n        /// </summary>\n        [DataMember(Name = \"abort\", Order = 1,\n            EmitDefaultValue = false)]\n        public bool? Abort { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 2,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryReadNextResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// History read continuation result\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [DataContract]\n    public sealed record class HistoryReadNextResponseModel<T> where T : class\n    {\n        /// <summary>\n        /// History as json encoded extension object\n        /// </summary>\n        [DataMember(Name = \"history\", Order = 0)]\n        public required T? History { get; set; }\n\n        /// <summary>\n        /// Continuation token if more results pending.\n        /// </summary>\n        [DataMember(Name = \"continuationToken\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? ContinuationToken { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 2,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryReadRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request node history read\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [DataContract]\n    public sealed record class HistoryReadRequestModel<T> where T : class\n    {\n        /// <summary>\n        /// Node to read from (mandatory without browse path)\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// An optional path from NodeId instance to\n        /// the actual node.\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// The HistoryReadDetailsType extension object\n        /// encoded in json and containing the tunneled\n        /// Historian reader request.\n        /// </summary>\n        [DataMember(Name = \"details\", Order = 2)]\n        [Required]\n        public required T Details { get; set; }\n\n        /// <summary>\n        /// Index range to read, e.g. 1:2,0:1 for 2 slices\n        /// out of a matrix or 0:1 for the first item in\n        /// an array, string or bytestring.\n        /// See 7.22 of part 4: NumericRange.\n        /// </summary>\n        [DataMember(Name = \"indexRange\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? IndexRange { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 4,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n\n        /// <summary>\n        /// Decide what timestamps to return.\n        /// </summary>\n        [DataMember(Name = \"timestampsToReturn\", Order = 5,\n            EmitDefaultValue = false)]\n        public TimestampsToReturn? TimestampsToReturn { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryReadResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// History read results\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [DataContract]\n    public sealed record class HistoryReadResponseModel<T> where T : class\n    {\n        /// <summary>\n        /// History as json encoded extension object\n        /// </summary>\n        [DataMember(Name = \"history\", Order = 0)]\n        public required T? History { get; set; }\n\n        /// <summary>\n        /// Continuation token if more results pending.\n        /// </summary>\n        [DataMember(Name = \"continuationToken\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? ContinuationToken { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 2,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryServerCapabilitiesModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// History Server capabilities\n    /// </summary>\n    [DataContract]\n    public sealed record class HistoryServerCapabilitiesModel\n    {\n        /// <summary>\n        /// Server supports historic data access\n        /// </summary>\n        [DataMember(Name = \"supportsHistoricData\", Order = 0,\n            EmitDefaultValue = false)]\n        public bool AccessHistoryDataCapability { get; set; }\n\n        /// <summary>\n        /// Server supports historic event access\n        /// </summary>\n        [DataMember(Name = \"supportsHistoricEvents\", Order = 1,\n            EmitDefaultValue = false)]\n        public bool AccessHistoryEventsCapability { get; set; }\n\n        /// <summary>\n        /// Maximum number of historic data values that will\n        /// be returned in a single read.\n        /// </summary>\n        [DataMember(Name = \"maxReturnDataValues\", Order = 2,\n            EmitDefaultValue = false)]\n        public uint? MaxReturnDataValues { get; set; }\n\n        /// <summary>\n        /// Maximum number of events that will be returned\n        /// in a single read.\n        /// </summary>\n        [DataMember(Name = \"maxReturnEventValues\", Order = 3,\n            EmitDefaultValue = false)]\n        public uint? MaxReturnEventValues { get; set; }\n\n        /// <summary>\n        /// Server supports inserting data\n        /// </summary>\n        [DataMember(Name = \"insertDataCapability\", Order = 4,\n            EmitDefaultValue = false)]\n        public bool? InsertDataCapability { get; set; }\n\n        /// <summary>\n        /// Server supports replacing historic data\n        /// </summary>\n        [DataMember(Name = \"replaceDataCapability\", Order = 5,\n            EmitDefaultValue = false)]\n        public bool? ReplaceDataCapability { get; set; }\n\n        /// <summary>\n        /// Server supports updating historic data\n        /// </summary>\n        [DataMember(Name = \"updateDataCapability\", Order = 6,\n            EmitDefaultValue = false)]\n        public bool? UpdateDataCapability { get; set; }\n\n        /// <summary>\n        /// Server supports deleting raw data\n        /// </summary>\n        [DataMember(Name = \"deleteRawCapability\", Order = 7,\n            EmitDefaultValue = false)]\n        public bool? DeleteRawCapability { get; set; }\n\n        /// <summary>\n        /// Server support deleting data at times\n        /// </summary>\n        [DataMember(Name = \"deleteAtTimeCapability\", Order = 8,\n            EmitDefaultValue = false)]\n        public bool? DeleteAtTimeCapability { get; set; }\n\n        /// <summary>\n        /// Server supports inserting events\n        /// </summary>\n        [DataMember(Name = \"insertEventCapability\", Order = 9,\n            EmitDefaultValue = false)]\n        public bool? InsertEventCapability { get; set; }\n\n        /// <summary>\n        /// Server supports replacing events\n        /// </summary>\n        [DataMember(Name = \"replaceEventCapability\", Order = 10,\n            EmitDefaultValue = false)]\n        public bool? ReplaceEventCapability { get; set; }\n\n        /// <summary>\n        /// Server supports updating events\n        /// </summary>\n        [DataMember(Name = \"updateEventCapability\", Order = 11,\n            EmitDefaultValue = false)]\n        public bool? UpdateEventCapability { get; set; }\n\n        /// <summary>\n        /// Server supports deleting events\n        /// </summary>\n        [DataMember(Name = \"deleteEventCapability\", Order = 12,\n            EmitDefaultValue = false)]\n        public bool? DeleteEventCapability { get; set; }\n\n        /// <summary>\n        /// Allows inserting annotations\n        /// </summary>\n        [DataMember(Name = \"insertAnnotationCapability\", Order = 13,\n            EmitDefaultValue = false)]\n        public bool? InsertAnnotationCapability { get; set; }\n\n        /// <summary>\n        /// Server supports ServerTimestamps in addition\n        /// to SourceTimestamp\n        /// </summary>\n        [DataMember(Name = \"serverTimestampSupported\", Order = 14,\n            EmitDefaultValue = false)]\n        public bool? ServerTimestampSupported { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"aggregateFunctions\", Order = 15,\n            EmitDefaultValue = false)]\n        public IReadOnlyDictionary<string, string>? AggregateFunctions { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryUpdateOperation.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// History update type\n    /// </summary>\n    [DataContract]\n    public enum HistoryUpdateOperation\n    {\n        /// <summary>\n        /// Insert\n        /// </summary>\n        [EnumMember(Value = \"Insert\")]\n        Insert = 1,\n\n        /// <summary>\n        /// Replace\n        /// </summary>\n        [EnumMember(Value = \"Replace\")]\n        Replace,\n\n        /// <summary>\n        /// Update\n        /// </summary>\n        [EnumMember(Value = \"Update\")]\n        Update,\n\n        /// <summary>\n        /// Delete\n        /// </summary>\n        [EnumMember(Value = \"Delete\")]\n        Delete,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryUpdateRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request node history update\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [DataContract]\n    public sealed record class HistoryUpdateRequestModel<T> where T : class\n    {\n        /// <summary>\n        /// Node to update (mandatory without browse path)\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// An optional path from NodeId instance to\n        /// the actual node.\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// The HistoryUpdateDetailsType extension object\n        /// encoded as json Variant and containing the tunneled\n        /// update request for the Historian server. The value\n        /// is updated at edge using above node address.\n        /// </summary>\n        [DataMember(Name = \"details\", Order = 2)]\n        [Required]\n        public required T Details { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 3,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/HistoryUpdateResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// History update results\n    /// </summary>\n    [DataContract]\n    public sealed record class HistoryUpdateResponseModel\n    {\n        /// <summary>\n        /// List of results from the update operation\n        /// </summary>\n        [DataMember(Name = \"results\", Order = 0,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<ServiceResultModel>? Results { get; set; }\n\n        /// <summary>\n        /// Service result in case of service call error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/InstanceDeclarationModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Instance declaration meta data\n    /// </summary>\n    [DataContract]\n    public sealed record class InstanceDeclarationModel\n    {\n        /// <summary>\n        /// The type that the declaration belongs to.\n        /// </summary>\n        [DataMember(Name = \"rootTypeId\", Order = 0)]\n        public string? RootTypeId { get; set; }\n\n        /// <summary>\n        /// The browse path\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 1)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// A localized path to the instance declaration.\n        /// </summary>\n        [DataMember(Name = \"displayPath\", Order = 2)]\n        public string? DisplayPath { get; set; }\n\n        /// <summary>\n        /// The modelling rule for the instance\n        /// declaration (i.e. Mandatory or Optional).\n        /// </summary>\n        [DataMember(Name = \"modellingRule\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? ModellingRule { get; set; }\n\n        /// <summary>\n        /// The node id for the instance.\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// The node class of the instance declaration.\n        /// </summary>\n        [DataMember(Name = \"nodeClass\", Order = 5)]\n        public NodeClass NodeClass { get; set; }\n\n        /// <summary>\n        /// The browse name for the instance declaration.\n        /// </summary>\n        [DataMember(Name = \"browseName\", Order = 6,\n            EmitDefaultValue = false)]\n        public string? BrowseName { get; set; }\n\n        /// <summary>\n        /// The display name for the instance declaration.\n        /// </summary>\n        [DataMember(Name = \"displayName\", Order = 7,\n            EmitDefaultValue = false)]\n        public string? DisplayName { get; set; }\n\n        /// <summary>\n        /// The description for the instance declaration.\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 8,\n            EmitDefaultValue = false)]\n        public string? Description { get; set; }\n\n        /// <summary>\n        /// Variable meta data\n        /// </summary>\n        [DataMember(Name = \"variable\", Order = 9,\n            EmitDefaultValue = false)]\n        public VariableMetadataModel? VariableMetadata { get; set; }\n\n        /// <summary>\n        /// Method meta data\n        /// </summary>\n        [DataMember(Name = \"method\", Order = 10,\n            EmitDefaultValue = false)]\n        public MethodMetadataModel? MethodMetadata { get; set; }\n\n        /// <summary>\n        /// An instance declaration that has been overridden\n        /// by the current instance.\n        /// </summary>\n        [DataMember(Name = \"overriddenDeclaration\", Order = 11,\n            EmitDefaultValue = false)]\n        public InstanceDeclarationModel? OverriddenDeclaration { get; set; }\n\n        /// <summary>\n        /// The modelling rule node id.\n        /// </summary>\n        [DataMember(Name = \"modellingRuleId\", Order = 12,\n            EmitDefaultValue = false)]\n        public string? ModellingRuleId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/LocalizedTextModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Localized text.\n    /// </summary>\n    [DataContract]\n    public sealed record class LocalizedTextModel\n    {\n        /// <summary>\n        /// Text\n        /// </summary>\n        [DataMember(Name = \"text\", Order = 0)]\n        public required string Text { get; set; }\n\n        /// <summary>\n        /// Locale or null for default locale\n        /// </summary>\n        [DataMember(Name = \"locale\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? Locale { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MessageEncoding.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Specifies the encoding format for OPC UA Publisher messages.\n    /// Can be combined with compression and reversibility flags to control\n    /// message format characteristics.\n    /// </summary>\n    [DataContract]\n    [Flags]\n    public enum MessageEncoding\n    {\n        /// <summary>\n        /// OPC UA binary encoding format (UADP).\n        /// Most efficient format with smallest message size.\n        /// Best choice when receivers can handle binary OPC UA encoding.\n        /// </summary>\n        [EnumMember(Value = \"Uadp\")]\n        Uadp = 0x1,\n\n        /// <summary>\n        /// Standard JSON encoding format.\n        /// Human-readable format suitable for most messaging systems.\n        /// Default encoding when not specified otherwise.\n        /// May lose some OPC UA type information.\n        /// </summary>\n        [EnumMember(Value = \"Json\")]\n        Json = 0x2,\n\n        /// <summary>\n        /// XML encoding format.\n        /// Most verbose but highly compatible format.\n        /// Provides good interoperability with legacy systems.\n        /// </summary>\n        [EnumMember(Value = \"Xml\")]\n        Xml = 0x4,\n\n        /// <summary>\n        /// Apache Avro binary encoding format.\n        /// Schema-based encoding that supports evolution.\n        /// Provides good balance between size and compatibility.\n        /// </summary>\n        [EnumMember(Value = \"Avro\")]\n        Avro = 0x8,\n\n        /// <summary>\n        /// Flag indicating that messages preserve all OPC UA type information\n        /// and can be decoded back to the original data structure.\n        /// Use with Json or other encodings to ensure lossless transmission.\n        /// </summary>\n        [EnumMember(Value = \"IsReversible\")]\n        IsReversible = 0x40,\n\n        /// <summary>\n        /// JSON encoding that preserves all OPC UA type information.\n        /// Combination of Json and IsReversible flags.\n        /// Allows exact reconstruction of original OPC UA data types.\n        /// Larger message size than standard JSON encoding.\n        /// </summary>\n        [EnumMember(Value = \"JsonReversible\")]\n        JsonReversible = Json | IsReversible,\n\n        /// <summary>\n        /// Flag indicating that messages should be compressed using GZIP.\n        /// Reduces bandwidth usage at the cost of additional processing.\n        /// Most effective with text-based encodings like JSON and XML.\n        /// </summary>\n        IsGzipCompressed = 0x80,\n\n        /// <summary>\n        /// GZIP compressed JSON encoding.\n        /// Combination of Json and IsGzipCompressed flags.\n        /// Provides good compromise between size and readability.\n        /// Recommended for bandwidth-constrained scenarios.\n        /// </summary>\n        [EnumMember(Value = \"JsonGzip\")]\n        JsonGzip = Json | IsGzipCompressed,\n\n        /// <summary>\n        /// GZIP compressed Avro encoding.\n        /// Combination of Avro and IsGzipCompressed flags.\n        /// Maximum compression for binary format.\n        /// Best choice for minimal bandwidth usage.\n        /// </summary>\n        [EnumMember(Value = \"AvroGzip\")]\n        AvroGzip = IsGzipCompressed | Avro,\n\n        /// <summary>\n        /// GZIP compressed JSON encoding with full type preservation.\n        /// Combines Json, IsReversible and IsGzipCompressed flags.\n        /// Ensures lossless data transmission with minimal bandwidth.\n        /// Recommended for reliable systems integration.\n        /// </summary>\n        [EnumMember(Value = \"JsonReversibleGzip\")]\n        JsonReversibleGzip = JsonGzip | IsReversible,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MessageTimestamp.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Message timestamp configuration option\n    /// </summary>\n    [DataContract]\n    public enum MessageTimestamp\n    {\n        /// <summary>\n        /// The time (utc) the message was created either because\n        /// it was received from the server or as heartbeat, using\n        /// the publisher module clock.\n        /// </summary>\n        [EnumMember(Value = \"CurrentTimeUtc\")]\n        CurrentTimeUtc,\n\n        /// <summary>\n        /// The publish time of the subscription notification\n        /// which is using the server clock. None if not provided\n        /// or available.\n        /// </summary>\n        [EnumMember(Value = \"PublishTime\")]\n        PublishTime,\n\n        /// <summary>\n        /// The time (utc) the message was encoded and subsequently\n        /// put on the wire, using the publisher module clock.\n        /// </summary>\n        [EnumMember(Value = \"EncodingTimeUtc\")]\n        EncodingTimeUtc,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MessagingMode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Defines how OPC UA Publisher formats and structures messages for transport.\n    /// Each mode provides different trade-offs between message completeness,\n    /// bandwidth efficiency, and compatibility with different message consumers.\n    /// </summary>\n    [DataContract]\n    public enum MessagingMode\n    {\n        /// <summary>\n        /// OPC UA PubSub standard format as specified in Part 14 of the OPC UA spec.\n        /// Includes complete message metadata and supports all PubSub features.\n        /// Default mode that provides best compatibility and completeness.\n        /// Recommended for standards-compliant message processing.\n        /// </summary>\n        [EnumMember(Value = \"PubSub\")]\n        PubSub,\n\n        /// <summary>\n        /// Simple JSON telemetry format compatible with Azure Time Series Insights.\n        /// Each message contains basic node information and value changes.\n        /// More compact than PubSub mode but with limited metadata.\n        /// Suitable for simple monitoring scenarios.\n        /// </summary>\n        [EnumMember(Value = \"Samples\")]\n        Samples,\n\n        /// <summary>\n        /// Complete OPC UA network message format including all headers and metadata.\n        /// Provides maximum information about the message context and data.\n        /// Largest message size but enables full featured message processing.\n        /// Use when complete message context is required.\n        /// </summary>\n        [EnumMember(Value = \"FullNetworkMessages\")]\n        FullNetworkMessages,\n\n        /// <summary>\n        /// Enhanced samples format with complete metadata and timestamps.\n        /// Similar to Samples mode but includes additional context information.\n        /// Provides good balance between completeness and message size.\n        /// Suitable for advanced monitoring with historical context.\n        /// </summary>\n        [EnumMember(Value = \"FullSamples\")]\n        FullSamples,\n\n        /// <summary>\n        /// Dataset messages without network message wrapper.\n        /// Includes dataset metadata but omits network-level headers.\n        /// Reduced message size while maintaining dataset context.\n        /// Good choice when network-level information is not needed.\n        /// </summary>\n        [EnumMember(Value = \"DataSetMessages\")]\n        DataSetMessages,\n\n        /// <summary>\n        /// Individual dataset message without network message wrapper.\n        /// Similar to DataSetMessages but optimized for single dataset scenarios.\n        /// More efficient than batched messages when publishing single datasets.\n        /// Best for simple publisher configurations with one dataset.\n        /// </summary>\n        [EnumMember(Value = \"SingleDataSetMessage\")]\n        SingleDataSetMessage,\n\n        /// <summary>\n        /// Pure key-value pairs representing datasets without any headers.\n        /// Maximum efficiency with minimal overhead.\n        /// Requires consumers to understand data context from configuration.\n        /// Use when minimal message size is critical and context is known.\n        /// </summary>\n        [EnumMember(Value = \"DataSets\")]\n        DataSets,\n\n        /// <summary>\n        /// Single dataset as key-value pairs without headers.\n        /// Most efficient format for single dataset scenarios.\n        /// Like DataSets mode but optimized for single dataset publishing.\n        /// Best for minimal overhead in simple configurations.\n        /// </summary>\n        [EnumMember(Value = \"SingleDataSet\")]\n        SingleDataSet,\n\n        /// <summary>\n        /// Datasets containing only raw values without type information.\n        /// Most compact representation of data values.\n        /// May lose OPC UA type information in transmission.\n        /// Use only when data types are known by consumers.\n        /// </summary>\n        [EnumMember(Value = \"RawDataSets\")]\n        RawDataSets,\n\n        /// <summary>\n        /// Single dataset with raw values only.\n        /// Most compact format possible for single dataset.\n        /// Combines benefits of SingleDataSet and RawDataSets modes.\n        /// Best choice when absolute minimum message size is required.\n        /// </summary>\n        [EnumMember(Value = \"SingleRawDataSet\")]\n        SingleRawDataSet\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MethodCallArgumentModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Method argument model\n    /// </summary>\n    [DataContract]\n    public sealed record class MethodCallArgumentModel\n    {\n        /// <summary>\n        /// Initial value or value to use\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 0)]\n        [SkipValidation]\n        public VariantValue? Value { get; set; }\n\n        /// <summary>\n        /// Data type Id of the value (from meta data)\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 1)]\n        public string? DataType { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MethodCallRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Call request model\n    /// </summary>\n    /// <remarks>\n    /// A method call request can specify the targets in several ways:\n    /// <ul>\n    /// <li>Specify methodId and objectId node ids and leave the browse\n    /// paths null.</li>\n    /// <li>Specify an objectBrowsePath to a real object node from\n    /// the node specified with objectId.  If objectId == null, the\n    /// root node (i=84) is used. </li>\n    /// <li>Specify a methodBrowsePath from the above object node\n    /// to the actual method node to call on the object.  methodId\n    /// remains null.</li>\n    /// <li>Like previously, but specify methodId and method browse\n    /// path from it to a real method node.</li>\n    /// </ul>\n    /// </remarks>\n    [DataContract]\n    public sealed record class MethodCallRequestModel\n    {\n        /// <summary>\n        /// Method id of method to call.\n        /// </summary>\n        [DataMember(Name = \"methodId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? MethodId { get; set; }\n\n        /// <summary>\n        /// Context of the method, i.e. an object or object type\n        /// node.  If null then the method is called in the context\n        /// of the inverse HasComponent reference of the MethodId\n        /// if it exists.\n        /// </summary>\n        [DataMember(Name = \"objectId\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? ObjectId { get; set; }\n\n        /// <summary>\n        /// Arguments for the method - null means no args\n        /// </summary>\n        [DataMember(Name = \"arguments\", Order = 2,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<MethodCallArgumentModel?>? Arguments { get; set; }\n\n        /// <summary>\n        /// An optional component path from the node identified by\n        /// MethodId or from a resolved objectId to the actual\n        /// method node.\n        /// </summary>\n        [DataMember(Name = \"methodBrowsePath\", Order = 3,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? MethodBrowsePath { get; set; }\n\n        /// <summary>\n        /// An optional component path from the node identified by\n        /// ObjectId to the actual object or objectType node.\n        /// If ObjectId is null, the root node (i=84) is used\n        /// </summary>\n        [DataMember(Name = \"objectBrowsePath\", Order = 4,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? ObjectBrowsePath { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 5,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MethodCallResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Method call response model\n    /// </summary>\n    [DataContract]\n    public sealed record class MethodCallResponseModel\n    {\n        /// <summary>\n        /// Resulting output values of method call\n        /// </summary>\n        [DataMember(Name = \"results\", Order = 0)]\n        public required IReadOnlyList<MethodCallArgumentModel> Results { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MethodMetadataArgumentModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Method argument metadata model\n    /// </summary>\n    [DataContract]\n    public sealed record class MethodMetadataArgumentModel\n    {\n        /// <summary>\n        /// Name of the argument\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 0)]\n        public required string Name { get; set; }\n\n        /// <summary>\n        /// Optional description of argument\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? Description { get; set; }\n\n        /// <summary>\n        /// Data type node of the argument\n        /// </summary>\n        [DataMember(Name = \"type\", Order = 2)]\n        public required NodeModel Type { get; set; }\n\n        /// <summary>\n        /// Default value for the argument\n        /// </summary>\n        [DataMember(Name = \"defaultValue\", Order = 3,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public VariantValue? DefaultValue { get; set; }\n\n        /// <summary>\n        /// Optional, scalar if not set\n        /// </summary>\n        [DataMember(Name = \"valueRank\", Order = 4,\n            EmitDefaultValue = false)]\n        public NodeValueRank? ValueRank { get; set; }\n\n        /// <summary>\n        /// Optional Array dimension of argument\n        /// </summary>\n        [DataMember(Name = \"arrayDimensions\", Order = 5,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<uint>? ArrayDimensions { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 6,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MethodMetadataModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Method metadata model\n    /// </summary>\n    [DataContract]\n    public record class MethodMetadataModel\n    {\n        /// <summary>\n        /// Id of object that the method is a component of\n        /// </summary>\n        [DataMember(Name = \"objectId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? ObjectId { get; set; }\n\n        /// <summary>\n        /// Input argument meta data\n        /// </summary>\n        [DataMember(Name = \"inputArguments\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<MethodMetadataArgumentModel>? InputArguments { get; set; }\n\n        /// <summary>\n        /// output argument meta data\n        /// </summary>\n        [DataMember(Name = \"outputArguments\", Order = 2,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<MethodMetadataArgumentModel>? OutputArguments { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MethodMetadataRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Method metadata request model\n    /// </summary>\n    [DataContract]\n    public sealed record class MethodMetadataRequestModel\n    {\n        /// <summary>\n        /// Method id of method to call.\n        /// (Required)\n        /// </summary>\n        [DataMember(Name = \"methodId\", Order = 0)]\n        public string? MethodId { get; set; }\n\n        /// <summary>\n        /// An optional component path from the node identified by\n        /// MethodId to the actual method node.\n        /// </summary>\n        [DataMember(Name = \"methodBrowsePath\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? MethodBrowsePath { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 2,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MethodMetadataResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of method metadata query\n    /// </summary>\n    [DataContract]\n    public sealed record class MethodMetadataResponseModel : MethodMetadataModel\n    {\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 3,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ModelChangeHandlingOptionsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Describes how model changes are published\n    /// </summary>\n    [DataContract]\n    public sealed record class ModelChangeHandlingOptionsModel\n    {\n        /// <summary>\n        /// Rebrowse period\n        /// </summary>\n        [DataMember(Name = \"rebrowseIntervalTimespan\", Order = 1,\n            EmitDefaultValue = false)]\n        public TimeSpan? RebrowseIntervalTimespan { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ModificationInfoModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Modification information\n    /// </summary>\n    [DataContract]\n    public sealed record class ModificationInfoModel\n    {\n        /// <summary>\n        /// Modification time\n        /// </summary>\n        [DataMember(Name = \"modificationTime\", Order = 0,\n            EmitDefaultValue = false)]\n        public DateTime? ModificationTime { get; set; }\n\n        /// <summary>\n        /// Operation\n        /// </summary>\n        [DataMember(Name = \"updateType\", Order = 1,\n            EmitDefaultValue = false)]\n        public HistoryUpdateOperation? UpdateType { get; set; }\n\n        /// <summary>\n        /// User who made the change\n        /// </summary>\n        [DataMember(Name = \"userName\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? UserName { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MonitoredItemWatchdogCondition.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Defines the conditions that trigger the subscription watchdog behavior.\n    /// Works in conjunction with OpcNodeWatchdogTimespan to determine when nodes\n    /// are considered \"late\" and DataSetWriterWatchdogBehavior to define the response.\n    /// Can be configured globally via the --mwc command line option.\n    /// </summary>\n    [DataContract]\n    [Flags]\n    public enum MonitoredItemWatchdogCondition\n    {\n        /// <summary>\n        /// Triggers watchdog behavior only when all monitored items exceed their timeout.\n        /// Most lenient condition that waits for complete communication loss.\n        /// Reduces false positives when some nodes update less frequently.\n        /// Suitable when all nodes must be non-responsive to indicate an issue.\n        /// </summary>\n        [EnumMember(Value = \"WhenAllAreLate\")]\n        WhenAllAreLate,\n\n        /// <summary>\n        /// Triggers watchdog behavior when any monitored item exceeds its timeout.\n        /// Default behavior that provides quickest response to communication issues.\n        /// May trigger more frequently in systems with variable update rates.\n        /// Best for critical monitoring where any delay requires attention.\n        /// </summary>\n        [EnumMember(Value = \"WhenAnyIsLate\")]\n        WhenAnyIsLate\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/MonitoringItemMode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Monitoring modes\n    /// </summary>\n    [DataContract]\n    public enum MonitoringMode\n    {\n        /// <summary>\n        /// Disabled\n        /// </summary>\n        [EnumMember(Value = \"Disabled\")]\n        Disabled,\n\n        /// <summary>\n        /// Sampling\n        /// </summary>\n        [EnumMember(Value = \"Sampling\")]\n        Sampling,\n\n        /// <summary>\n        /// Reporting\n        /// </summary>\n        [EnumMember(Value = \"Reporting\")]\n        Reporting\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NamespaceFormat.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Namespace serialization format for node ids\n    /// and qualified names.\n    /// </summary>\n    [DataContract]\n    public enum NamespaceFormat\n    {\n        /// <summary>\n        /// The legacy uri format\n        /// </summary>\n        [EnumMember(Value = \"Uri\")]\n        Uri,\n\n        /// <summary>\n        /// With ns= namespace index except for index 0\n        /// </summary>\n        [EnumMember(Value = \"Index\")]\n        Index,\n\n        /// <summary>\n        /// With nsu= namespace except for namespace 0\n        /// </summary>\n        [EnumMember(Value = \"Expanded\")]\n        Expanded,\n\n        /// <summary>\n        /// With nsu= namespace even for namespace 0\n        /// </summary>\n        [EnumMember(Value = \"ExpandedWithNamespace0\")]\n        ExpandedWithNamespace0,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NetworkMessageContentFlags.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Network message content\n    /// </summary>\n    [DataContract]\n    [Flags]\n    public enum NetworkMessageContentFlags\n    {\n        /// <summary>\n        /// Publisher id\n        /// </summary>\n        [EnumMember(Value = \"PublisherId\")]\n        PublisherId = 0x1,\n\n        /// <summary>\n        /// Group header\n        /// </summary>\n        [EnumMember(Value = \"GroupHeader\")]\n        GroupHeader = 0x2,\n\n        /// <summary>\n        /// Writer group id\n        /// </summary>\n        [EnumMember(Value = \"WriterGroupId\")]\n        WriterGroupId = 0x4,\n\n        /// <summary>\n        /// Group version\n        /// </summary>\n        [EnumMember(Value = \"GroupVersion\")]\n        GroupVersion = 0x8,\n\n        /// <summary>\n        /// Network message number\n        /// </summary>\n        [EnumMember(Value = \"NetworkMessageNumber\")]\n        NetworkMessageNumber = 0x10,\n\n        /// <summary>\n        /// Sequence number\n        /// </summary>\n        [EnumMember(Value = \"SequenceNumber\")]\n        SequenceNumber = 0x20,\n\n        /// <summary>\n        /// Payload header\n        /// </summary>\n        [EnumMember(Value = \"PayloadHeader\")]\n        PayloadHeader = 0x40,\n\n        /// <summary>\n        /// Timestamp\n        /// </summary>\n        [EnumMember(Value = \"Timestamp\")]\n        Timestamp = 0x80,\n\n        /// <summary>\n        /// Picoseconds\n        /// </summary>\n        [EnumMember(Value = \"Picoseconds\")]\n        Picoseconds = 0x100,\n\n        /// <summary>\n        /// Dataset class id\n        /// </summary>\n        [EnumMember(Value = \"DataSetClassId\")]\n        DataSetClassId = 0x200,\n\n        /// <summary>\n        /// Promoted fields\n        /// </summary>\n        [EnumMember(Value = \"PromotedFields\")]\n        PromotedFields = 0x400,\n\n        /// <summary>\n        /// Network message header\n        /// </summary>\n        [EnumMember(Value = \"NetworkMessageHeader\")]\n        NetworkMessageHeader = 0x800,\n\n        /// <summary>\n        /// Dataset message header\n        /// </summary>\n        [EnumMember(Value = \"DataSetMessageHeader\")]\n        DataSetMessageHeader = 0x1000,\n\n        /// <summary>\n        /// Single dataset messages\n        /// </summary>\n        [EnumMember(Value = \"SingleDataSetMessage\")]\n        SingleDataSetMessage = 0x2000,\n\n        /// <summary>\n        /// Reply to\n        /// </summary>\n        [EnumMember(Value = \"ReplyTo\")]\n        ReplyTo = 0x4000,\n\n        /// <summary>\n        /// Wrap messages in array (publisher extension)\n        /// </summary>\n        [EnumMember(Value = \"UseArrayEnvelope\")]\n        UseArrayEnvelope = 0x1000000,\n\n        /// <summary>\n        /// Use compatibility mode with 2.8 (publisher extension)\n        /// </summary>\n        [EnumMember(Value = \"UseCompatibilityMode\")]\n        UseCompatibilityMode = 0x2000000,\n\n        /// <summary>\n        /// Monitored item message (publisher extension)\n        /// </summary>\n        [EnumMember(Value = \"MonitoredItemMessage\")]\n        MonitoredItemMessage = 0x8000000,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeAccessLevel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Flags that can be set for the AccessLevel attribute.\n    /// </summary>\n    [Flags]\n    [DataContract]\n    public enum NodeAccessLevel\n    {\n        /// <summary>\n        /// No access\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None = 0x0,\n\n        /// <summary>\n        /// The current value of the Variable may be read.\n        /// </summary>\n        [EnumMember(Value = \"CurrentRead\")]\n        CurrentRead = 0x1,\n\n        /// <summary>\n        /// The current value of the Variable may be written.\n        /// </summary>\n        [EnumMember(Value = \"CurrentWrite\")]\n        CurrentWrite = 0x2,\n\n        /// <summary>\n        /// The history for the Variable may be read.\n        /// </summary>\n        [EnumMember(Value = \"HistoryRead\")]\n        HistoryRead = 0x4,\n\n        /// <summary>\n        /// The history for the Variable may be updated.\n        /// </summary>\n        [EnumMember(Value = \"HistoryWrite\")]\n        HistoryWrite = 0x8,\n\n        /// <summary>\n        /// Indicates if the Variable generates\n        /// SemanticChangeEvents when its value changes.\n        /// </summary>\n        [EnumMember(Value = \"SemanticChange\")]\n        SemanticChange = 0x10,\n\n        /// <summary>\n        /// Indicates if the current StatusCode of the\n        /// value is writable.\n        /// </summary>\n        [EnumMember(Value = \"StatusWrite\")]\n        StatusWrite = 0x20,\n\n        /// <summary>\n        /// Indicates if the current SourceTimestamp is\n        /// writable.\n        /// </summary>\n        [EnumMember(Value = \"TimestampWrite\")]\n        TimestampWrite = 0x40,\n\n        /// <summary>\n        /// Reads are not atomic.\n        /// </summary>\n        [EnumMember(Value = \"NonatomicRead\")]\n        NonatomicRead = 0x100,\n\n        /// <summary>\n        /// Writes are not atomic\n        /// </summary>\n        [EnumMember(Value = \"NonatomicWrite\")]\n        NonatomicWrite = 0x200,\n\n        /// <summary>\n        /// Writes cannot be performed with IndexRange.\n        /// </summary>\n        [EnumMember(Value = \"WriteFullArrayOnly\")]\n        WriteFullArrayOnly = 0x400,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeAccessRestrictions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Flags that can be read or written in the\n    /// AccessRestrictions attribute.\n    /// </summary>\n    [Flags]\n    [DataContract]\n    public enum NodeAccessRestrictions\n    {\n        /// <summary>\n        /// No restrictions\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None = 0x0,\n\n        /// <summary>\n        /// The Client can only access the Node when using a\n        /// SecureChannel which digitally signs all messages.\n        /// </summary>\n        [EnumMember(Value = \"SigningRequired\")]\n        SigningRequired = 0x1,\n\n        /// <summary>\n        /// The Client can only access the Node when using a\n        /// SecureChannel which encrypts all messages.\n        /// </summary>\n        [EnumMember(Value = \"EncryptionRequired\")]\n        EncryptionRequired = 0x2,\n\n        /// <summary>\n        /// The Client cannot access the Node when using\n        /// SessionlessInvoke Service invocation.\n        /// </summary>\n        [EnumMember(Value = \"SessionRequired\")]\n        SessionRequired = 0x4\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeAttribute.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Node attribute identifiers\n    /// </summary>\n    [DataContract]\n    public enum NodeAttribute\n    {\n        /// <summary>\n        /// Node identifier\n        /// </summary>\n        [EnumMember(Value = \"NodeId\")]\n        NodeId = 1,\n\n        /// <summary>\n        /// Node class\n        /// </summary>\n        [EnumMember(Value = \"NodeClass\")]\n        NodeClass,\n\n        /// <summary>\n        /// Browse name\n        /// </summary>\n        [EnumMember(Value = \"BrowseName\")]\n        BrowseName,\n\n        /// <summary>\n        /// Display name\n        /// </summary>\n        [EnumMember(Value = \"DisplayName\")]\n        DisplayName,\n\n        /// <summary>\n        /// Description\n        /// </summary>\n        [EnumMember(Value = \"Description\")]\n        Description,\n\n        /// <summary>\n        /// Node write mask\n        /// </summary>\n        [EnumMember(Value = \"WriteMask\")]\n        WriteMask,\n\n        /// <summary>\n        /// User write mask\n        /// </summary>\n        [EnumMember(Value = \"UserWriteMask\")]\n        UserWriteMask,\n\n        /// <summary>\n        /// Is abstract\n        /// </summary>\n        [EnumMember(Value = \"IsAbstract\")]\n        IsAbstract,\n\n        /// <summary>\n        /// Symmetric\n        /// </summary>\n        [EnumMember(Value = \"Symmetric\")]\n        Symmetric,\n\n        /// <summary>\n        /// Inverse name\n        /// </summary>\n        [EnumMember(Value = \"InverseName\")]\n        InverseName,\n\n        /// <summary>\n        /// Contains no loop\n        /// </summary>\n        [EnumMember(Value = \"ContainsNoLoops\")]\n        ContainsNoLoops,\n\n        /// <summary>\n        /// Event notifier\n        /// </summary>\n        [EnumMember(Value = \"EventNotifier\")]\n        EventNotifier,\n\n        /// <summary>\n        /// Value for variable\n        /// </summary>\n        [EnumMember(Value = \"Value\")]\n        Value,\n\n        /// <summary>\n        /// Datatype\n        /// </summary>\n        [EnumMember(Value = \"DataType\")]\n        DataType,\n\n        /// <summary>\n        /// Value rank\n        /// </summary>\n        [EnumMember(Value = \"ValueRank\")]\n        ValueRank,\n\n        /// <summary>\n        /// Array dimension\n        /// </summary>\n        [EnumMember(Value = \"ArrayDimensions\")]\n        ArrayDimensions,\n\n        /// <summary>\n        /// Accesslevel\n        /// </summary>\n        [EnumMember(Value = \"AccessLevel\")]\n        AccessLevel,\n\n        /// <summary>\n        /// User access level\n        /// </summary>\n        [EnumMember(Value = \"UserAccessLevel\")]\n        UserAccessLevel,\n\n        /// <summary>\n        /// Minimum sampling interval\n        /// </summary>\n        [EnumMember(Value = \"MinimumSamplingInterval\")]\n        MinimumSamplingInterval,\n\n        /// <summary>\n        /// Whether node is historizing\n        /// </summary>\n        [EnumMember(Value = \"Historizing\")]\n        Historizing,\n\n        /// <summary>\n        /// Method can be called\n        /// </summary>\n        [EnumMember(Value = \"Executable\")]\n        Executable,\n\n        /// <summary>\n        /// User can call method\n        /// </summary>\n        [EnumMember(Value = \"UserExecutable\")]\n        UserExecutable,\n\n        /// <summary>\n        /// Data type definition\n        /// </summary>\n        [EnumMember(Value = \"DataTypeDefinition\")]\n        DataTypeDefinition,\n\n        /// <summary>\n        /// Role permissions\n        /// </summary>\n        [EnumMember(Value = \"RolePermissions\")]\n        RolePermissions,\n\n        /// <summary>\n        /// User role permissions\n        /// </summary>\n        [EnumMember(Value = \"UserRolePermissions\")]\n        UserRolePermissions,\n\n        /// <summary>\n        /// Access restrictions on node\n        /// </summary>\n        [EnumMember(Value = \"AccessRestrictions\")]\n        AccessRestrictions\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeClass.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Node class\n    /// </summary>\n    [DataContract]\n    public enum NodeClass\n    {\n        /// <summary>\n        /// Object class\n        /// </summary>\n        [EnumMember(Value = \"Object\")]\n#pragma warning disable CA1720 // Identifier contains type name\n        Object,\n#pragma warning restore CA1720 // Identifier contains type name\n\n        /// <summary>\n        /// Variable\n        /// </summary>\n        [EnumMember(Value = \"Variable\")]\n        Variable,\n\n        /// <summary>\n        /// Method class\n        /// </summary>\n        [EnumMember(Value = \"Method\")]\n        Method,\n\n        /// <summary>\n        /// Object type\n        /// </summary>\n        [EnumMember(Value = \"ObjectType\")]\n        ObjectType,\n\n        /// <summary>\n        /// Variable type\n        /// </summary>\n        [EnumMember(Value = \"VariableType\")]\n        VariableType,\n\n        /// <summary>\n        /// Reference type\n        /// </summary>\n        [EnumMember(Value = \"ReferenceType\")]\n        ReferenceType,\n\n        /// <summary>\n        /// Data type\n        /// </summary>\n        [EnumMember(Value = \"DataType\")]\n        DataType,\n\n        /// <summary>\n        /// View class\n        /// </summary>\n        [EnumMember(Value = \"View\")]\n        View\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeEventNotifier.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Flags that can be set for the EventNotifier attribute.\n    /// </summary>\n    [Flags]\n    [DataContract]\n    public enum NodeEventNotifier\n    {\n        /// <summary>\n        /// The Object or View produces event\n        /// notifications.\n        /// </summary>\n        [EnumMember(Value = \"SubscribeToEvents\")]\n        SubscribeToEvents = 0x1,\n\n        /// <summary>\n        /// The Object has an event history which may\n        /// be read.\n        /// </summary>\n        [EnumMember(Value = \"HistoryRead\")]\n        HistoryRead = 0x4,\n\n        /// <summary>\n        /// The Object has an event history which may\n        /// be updated.\n        /// </summary>\n        [EnumMember(Value = \"HistoryWrite\")]\n        HistoryWrite = 0x8,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeIdModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Represents an OPC UA Node identifier in string format.\n    /// Used to identify nodes in the OPC UA address space for monitoring.\n    /// Supports standard OPC UA node ID formats including:\n    /// - Namespace index and identifier (ns=0;i=85)\n    /// - String identifiers (ns=2;s=MyNode)\n    /// - GUID identifiers (ns=3;g=8599E6C4-6667-4FB7-9EA9-C6896B31DB02)\n    /// - Opaque/binary identifiers (ns=4;b=FA34E...)\n    /// </summary>\n    [DataContract]\n    public sealed record class NodeIdModel\n    {\n        /// <summary>\n        /// The node identifier string in standard OPC UA notation.\n        /// Format: ns={namespace};{type}={value}\n        /// Examples:\n        /// - ns=0;i=85 (numeric identifier)\n        /// - ns=2;s=MyNode (string identifier)\n        /// - ns=3;g=8599E6C4-6667-4FB7-9EA9-C6896B31DB02 (GUID)\n        /// - ns=4;b=FA34E... (binary/opaque)\n        /// If namespace index is omitted, ns=0 is assumed.\n        /// </summary>\n        [DataMember(Name = \"Identifier\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Identifier { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeMetadataRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Node metadata request model\n    /// </summary>\n    [DataContract]\n    public sealed record class NodeMetadataRequestModel\n    {\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 0,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n\n        /// <summary>\n        /// Node id of the type.\n        /// (Required)\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 1)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// An optional component path from the node identified by\n        /// NodeId to the actual node.\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 2,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeMetadataResponseModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Node metadata model\n    /// </summary>\n    [DataContract]\n    public sealed record class NodeMetadataResponseModel\n    {\n        /// <summary>\n        /// The node id of the node\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// The class of the node\n        /// </summary>\n        [DataMember(Name = \"nodeClass\", Order = 1)]\n        public NodeClass NodeClass { get; set; }\n\n        /// <summary>\n        /// The display name of the node.\n        /// </summary>\n        [DataMember(Name = \"displayName\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? DisplayName { get; set; }\n\n        /// <summary>\n        /// The description for the node.\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? Description { get; set; }\n\n        /// <summary>\n        /// Variable meta data if the node is of class\n        /// <see cref=\"NodeClass.VariableType\"/> or\n        /// <see cref=\"NodeClass.Variable\"/> otherwise\n        /// null.\n        /// </summary>\n        [DataMember(Name = \"variableMetadata\", Order = 4,\n            EmitDefaultValue = false)]\n        public VariableMetadataModel? VariableMetadata { get; set; }\n\n        /// <summary>\n        /// Data type meta data if the node is of class\n        /// <see cref=\"NodeClass.DataType\"/> otherwise\n        /// null.\n        /// </summary>\n        [DataMember(Name = \"dataTypeMetadata\", Order = 5,\n            EmitDefaultValue = false)]\n        public DataTypeMetadataModel? DataTypeMetadata { get; set; }\n\n        /// <summary>\n        /// Method meta data if the node is of class\n        /// <see cref=\"NodeClass.Method\"/> otherwise\n        /// null.\n        /// </summary>\n        [DataMember(Name = \"nethodMetadata\", Order = 6,\n            EmitDefaultValue = false)]\n        public MethodMetadataModel? MethodMetadata { get; set; }\n\n        /// <summary>\n        /// The returned type definition if the node is\n        /// of class <see cref=\"NodeClass.Object\"/> or\n        /// <see cref=\"NodeClass.Variable\"/>\n        /// referenced a type definition node or if the node\n        /// is a <see cref=\"NodeClass.VariableType\"/>,\n        /// <see cref=\"NodeClass.ObjectType\"/>,\n        /// or <see cref=\"NodeClass.ReferenceType\"/>,\n        /// </summary>\n        [DataMember(Name = \"typeDefinition\", Order = 7,\n            EmitDefaultValue = false)]\n        public TypeDefinitionModel? TypeDefinition { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 8,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Node model\n    /// </summary>\n    [DataContract]\n    public sealed record class NodeModel\n    {\n        /// <summary>\n        /// Type of node\n        /// </summary>\n        [DataMember(Name = \"nodeClass\", Order = 0,\n            EmitDefaultValue = false)]\n        public NodeClass? NodeClass { get; set; }\n\n        /// <summary>\n        /// Display name\n        /// </summary>\n        [DataMember(Name = \"displayName\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? DisplayName { get; set; }\n\n        /// <summary>\n        /// Id of node.\n        /// (Mandatory).\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 2)]\n        [Required]\n        public required string NodeId { get; set; }\n\n        /// <summary>\n        /// Description if any\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? Description { get; set; }\n\n        /// <summary>\n        /// Browse name\n        /// </summary>\n        [DataMember(Name = \"browseName\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? BrowseName { get; set; }\n\n        /// <summary>\n        /// Value of variable or default value of the\n        /// subtyped variable in case node is a variable\n        /// type, otherwise null.\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 5,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public VariantValue? Value { get; set; }\n\n        /// <summary>\n        /// Pico seconds part of when value was read at source.\n        /// </summary>\n        [DataMember(Name = \"sourcePicoseconds\", Order = 6,\n            EmitDefaultValue = false)]\n        public ushort? SourcePicoseconds { get; set; }\n\n        /// <summary>\n        /// Timestamp of when value was read at source.\n        /// </summary>\n        [DataMember(Name = \"sourceTimestamp\", Order = 7,\n            EmitDefaultValue = false)]\n        public DateTime? SourceTimestamp { get; set; }\n\n        /// <summary>\n        /// Pico seconds part of when value was read at server.\n        /// </summary>\n        [DataMember(Name = \"serverPicoseconds\", Order = 8,\n            EmitDefaultValue = false)]\n        public ushort? ServerPicoseconds { get; set; }\n\n        /// <summary>\n        /// Timestamp of when value was read at server.\n        /// </summary>\n        [DataMember(Name = \"serverTimestamp\", Order = 9,\n            EmitDefaultValue = false)]\n        public DateTime? ServerTimestamp { get; set; }\n\n        /// <summary>\n        /// Service result in case of error reading the value\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 10,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n\n        /// <summary>\n        /// Node access restrictions if any.\n        /// (default: none)\n        /// </summary>\n        [DataMember(Name = \"accessRestrictions\", Order = 11,\n            EmitDefaultValue = false)]\n        public NodeAccessRestrictions? AccessRestrictions { get; set; }\n\n        /// <summary>\n        /// Default write mask for the node\n        /// (default: 0)\n        /// </summary>\n        [DataMember(Name = \"writeMask\", Order = 12,\n            EmitDefaultValue = false)]\n        public uint? WriteMask { get; set; }\n\n        /// <summary>\n        /// User write mask for the node\n        /// (default: 0)\n        /// </summary>\n        [DataMember(Name = \"userWriteMask\", Order = 13,\n            EmitDefaultValue = false)]\n        public uint? UserWriteMask { get; set; }\n\n        /// <summary>\n        /// Whether type is abstract, if type can\n        /// be abstract.  Null if not type node.\n        /// (default: false)\n        /// </summary>\n        [DataMember(Name = \"isAbstract\", Order = 14,\n            EmitDefaultValue = false)]\n        public bool? IsAbstract { get; set; }\n\n        /// <summary>\n        /// Whether a view contains loops. Null if\n        /// not a view.\n        /// </summary>\n        [DataMember(Name = \"containsNoLoops\", Order = 15,\n            EmitDefaultValue = false)]\n        public bool? ContainsNoLoops { get; set; }\n\n        /// <summary>\n        /// If object or view and eventing, event notifier\n        /// to subscribe to.\n        /// (default: no events supported)\n        /// </summary>\n        [DataMember(Name = \"eventNotifier\", Order = 16,\n            EmitDefaultValue = false)]\n        public NodeEventNotifier? EventNotifier { get; set; }\n\n        /// <summary>\n        /// If method node class, whether method can\n        /// be called.\n        /// </summary>\n        [DataMember(Name = \"executable\", Order = 17,\n            EmitDefaultValue = false)]\n        public bool? Executable { get; set; }\n\n        /// <summary>\n        /// If method node class, whether method can\n        /// be called by current user.\n        /// (default: false if not executable)\n        /// </summary>\n        [DataMember(Name = \"userExecutable\", Order = 18,\n            EmitDefaultValue = false)]\n        public bool? UserExecutable { get; set; }\n\n        /// <summary>\n        /// Data type definition in case node is a\n        /// data type node and definition is available,\n        /// otherwise null.\n        /// </summary>\n        [DataMember(Name = \"dataTypeDefinition\", Order = 19,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public VariantValue? DataTypeDefinition { get; set; }\n\n        /// <summary>\n        /// Default access level for value in variable\n        /// node or null if not a variable.\n        /// (default: No access)\n        /// </summary>\n        [DataMember(Name = \"accessLevel\", Order = 20,\n            EmitDefaultValue = false)]\n        public NodeAccessLevel? AccessLevel { get; set; }\n\n        /// <summary>\n        /// User access level for value in variable node\n        /// or null.\n        /// (default: No access)\n        /// </summary>\n        [DataMember(Name = \"userAccessLevel\", Order = 21,\n            EmitDefaultValue = false)]\n        public NodeAccessLevel? UserAccessLevel { get; set; }\n\n        /// <summary>\n        /// If variable the datatype of the variable.\n        /// (default: null)\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 22,\n            EmitDefaultValue = false)]\n        public string? DataType { get; set; }\n\n        /// <summary>\n        /// Value rank of the variable data of a variable\n        /// or variable type, otherwise null.\n        /// (default: scalar = -1)\n        /// </summary>\n        [DataMember(Name = \"valueRank\", Order = 23,\n            EmitDefaultValue = false)]\n        public NodeValueRank? ValueRank { get; set; }\n\n        /// <summary>\n        /// Array dimensions of variable or variable type.\n        /// (default: empty array)\n        /// </summary>\n        [DataMember(Name = \"arrayDimensions\", Order = 24,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<uint>? ArrayDimensions { get; set; }\n\n        /// <summary>\n        /// Whether the value of a variable is historizing.\n        /// (default: false)\n        /// </summary>\n        [DataMember(Name = \"historizing\", Order = 25,\n            EmitDefaultValue = false)]\n        public bool? Historizing { get; set; }\n\n        /// <summary>\n        /// Minimum sampling interval for the variable\n        /// value, otherwise null if not a variable node.\n        /// (default: null)\n        /// </summary>\n        [DataMember(Name = \"minimumSamplingInterval\", Order = 26,\n            EmitDefaultValue = false)]\n        public double? MinimumSamplingInterval { get; set; }\n\n        /// <summary>\n        /// Inverse name of the reference if the node is\n        /// a reference type, otherwise null.\n        /// </summary>\n        [DataMember(Name = \"inverseName\", Order = 27,\n            EmitDefaultValue = false)]\n        public string? InverseName { get; set; }\n\n        /// <summary>\n        /// Whether the reference is symmetric in case\n        /// the node is a reference type, otherwise\n        /// null.\n        /// </summary>\n        [DataMember(Name = \"symmetric\", Order = 28,\n            EmitDefaultValue = false)]\n        public bool? Symmetric { get; set; }\n\n        /// <summary>\n        /// Role permissions\n        /// </summary>\n        [DataMember(Name = \"rolePermissions\", Order = 29,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<RolePermissionModel>? RolePermissions { get; set; }\n\n        /// <summary>\n        /// User Role permissions\n        /// </summary>\n        [DataMember(Name = \"userRolePermissions\", Order = 30,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<RolePermissionModel>? UserRolePermissions { get; set; }\n\n        /// <summary>\n        /// Optional type definition of the node\n        /// </summary>\n        [DataMember(Name = \"typeDefinitionId\", Order = 31,\n            EmitDefaultValue = false)]\n        public string? TypeDefinitionId { get; set; }\n\n        /// <summary>\n        /// Whether node has children which are defined as\n        /// any forward hierarchical references.\n        /// (default: unknown)\n        /// </summary>\n        [DataMember(Name = \"children\", Order = 32,\n            EmitDefaultValue = false)]\n        public bool? Children { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodePathTargetModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Node path target\n    /// </summary>\n    [DataContract]\n    public sealed record class NodePathTargetModel\n    {\n        /// <summary>\n        /// The target browse path\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 0)]\n        public required IReadOnlyList<string> BrowsePath { get; set; }\n\n        /// <summary>\n        /// Target node\n        /// </summary>\n        [DataMember(Name = \"target\", Order = 1)]\n        public required NodeModel Target { get; set; }\n\n        /// <summary>\n        /// Remaining index in path\n        /// </summary>\n        [DataMember(Name = \"remainingPathIndex\", Order = 2,\n            EmitDefaultValue = false)]\n        public int? RemainingPathIndex { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeReferenceModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Reference model\n    /// </summary>\n    [DataContract]\n    public sealed record class NodeReferenceModel\n    {\n        /// <summary>\n        /// Reference Type id\n        /// </summary>\n        [DataMember(Name = \"referenceTypeId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? ReferenceTypeId { get; set; }\n\n        /// <summary>\n        /// Browse direction of reference\n        /// </summary>\n        [DataMember(Name = \"direction\", Order = 1,\n            EmitDefaultValue = false)]\n        public BrowseDirection? Direction { get; set; }\n\n        /// <summary>\n        /// Target node\n        /// </summary>\n        [DataMember(Name = \"target\", Order = 2)]\n        [Required]\n        public required NodeModel Target { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 3,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// The node type\n    /// </summary>\n    [DataContract]\n    public enum NodeType\n    {\n        /// <summary>\n        /// Unknown\n        /// </summary>\n        [EnumMember(Value = \"Unknown\")]\n        Unknown,\n\n        /// <summary>\n        /// Variable\n        /// </summary>\n        [EnumMember(Value = \"Variable\")]\n        Variable,\n\n        /// <summary>\n        /// Data variable\n        /// </summary>\n        [EnumMember(Value = \"DataVariable\")]\n        DataVariable,\n\n        /// <summary>\n        /// Variable\n        /// </summary>\n        [EnumMember(Value = \"Property\")]\n        Property,\n\n        /// <summary>\n        /// Data type\n        /// </summary>\n        [EnumMember(Value = \"DataType\")]\n        DataType,\n\n        /// <summary>\n        /// View class\n        /// </summary>\n        [EnumMember(Value = \"View\")]\n        View,\n\n        /// <summary>\n        /// Regular object type\n        /// </summary>\n        [EnumMember(Value = \"Object\")]\n#pragma warning disable CA1720 // Identifier contains type name\n        Object,\n#pragma warning restore CA1720 // Identifier contains type name\n\n        /// <summary>\n        /// Type is event type\n        /// </summary>\n        [EnumMember(Value = \"Event\")]\n        Event,\n\n        /// <summary>\n        /// Interface type\n        /// </summary>\n        [EnumMember(Value = \"Interface\")]\n        Interface\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/NodeValueRank.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Constants defined for the ValueRank attribute.\n    /// </summary>\n    [Flags]\n    [DataContract]\n#pragma warning disable CA2217 // Do not mark enums with FlagsAttribute\n    public enum NodeValueRank\n#pragma warning restore CA2217 // Do not mark enums with FlagsAttribute\n    {\n        /// <summary>\n        /// The variable may be a scalar or a one\n        /// dimensional array.\n        /// </summary>\n        [EnumMember(Value = \"ScalarOrOneDimension\")]\n        ScalarOrOneDimension = -3,\n\n        /// <summary>\n        /// The variable may be a scalar or an array of\n        /// any dimension.\n        /// </summary>\n        [EnumMember(Value = \"Any\")]\n        Any = -2,\n\n        /// <summary>\n        /// The variable is always a scalar.\n        /// </summary>\n        [EnumMember(Value = \"Scalar\")]\n        Scalar = Any | OneDimension,\n\n        /// <summary>\n        /// The variable is always an array with one or\n        /// more dimensions.\n        /// </summary>\n        [EnumMember(Value = \"OneOrMoreDimensions\")]\n        OneOrMoreDimensions = 0,\n\n        /// <summary>\n        /// The variable is always one dimensional array.\n        /// </summary>\n        [EnumMember(Value = \"OneDimension\")]\n        OneDimension = 1,\n\n        /// <summary>\n        /// The variable is always an array with two or\n        /// more dimensions.\n        /// </summary>\n        [EnumMember(Value = \"TwoDimensions\")]\n        TwoDimensions = 2\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/OpcAuthenticationMode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Specifies the authentication method used to connect to OPC UA servers.\n    /// The chosen mode determines how the Publisher authenticates itself to servers.\n    /// When using credentials or certificates, encrypted communication should be enabled\n    /// via UseSecurity or EndpointSecurityMode to protect authentication secrets.\n    /// </summary>\n    [DataContract]\n    public enum OpcAuthenticationMode\n    {\n        /// <summary>\n        /// No authentication credentials provided (default).\n        /// Server must allow anonymous access for connections to succeed.\n        /// Least secure option - use only when no security requirements exist\n        /// or in secure, isolated networks.\n        /// </summary>\n        [EnumMember(Value = \"Anonymous\")]\n        Anonymous,\n\n        /// <summary>\n        /// Authenticate using username and password credentials.\n        /// Requires OpcAuthenticationUsername and OpcAuthenticationPassword.\n        /// WARNING: Always use with encrypted communication (SignAndEncrypt)\n        /// to prevent credential exposure. Credentials can be stored encrypted\n        /// at rest using the --fce command line option.\n        /// </summary>\n        [EnumMember(Value = \"UsernamePassword\")]\n        UsernamePassword,\n\n        /// <summary>\n        /// Authenticate using X.509 certificates.\n        /// Uses certificate from User certificate store in PKI configuration.\n        /// OpcAuthenticationUsername specifies the certificate subject name.\n        /// OpcAuthenticationPassword provides the private key password if needed.\n        /// Most secure option when properly managed.\n        /// </summary>\n        [EnumMember(Value = \"Certificate\")]\n        Certificate\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/OpcNodeModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Messaging;\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Defines configuration for monitoring an OPC UA node.\n    /// Contains settings for sampling, filtering, publishing\n    /// behavior, and message routing. This model allows\n    /// fine-grained control over how each node's data is collected\n    /// and transmitted. Part of a PublishedNodesEntryModel's\n    /// OpcNodes collection.\n    /// </summary>\n    [DataContract]\n    public record class OpcNodeModel\n    {\n        /// <summary>\n        /// The OPC UA node identifier string in standard notation.\n        /// Format: ns={namespace};{type}={value} Required field that\n        /// uniquely identifies the node to monitor. Examples:\n        /// \"ns=2;s=MyTag\", \"ns=0;i=2258\" See OPC UA Part 3 for node\n        /// ID format specifications.\n        /// </summary>\n        [DataMember(Name = \"Id\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Server-side sampling rate in milliseconds. Determines how\n        /// often the server checks for value changes. Default from\n        /// DataSetSamplingInterval if not specified. Should be less\n        /// than or equal to OpcPublishingInterval for effective\n        /// sampling. Ignored when OpcSamplingIntervalTimespan is\n        /// defined.\n        /// </summary>\n        [DataMember(Name = \"OpcSamplingInterval\", Order = 1,\n            EmitDefaultValue = false)]\n        public int? OpcSamplingInterval { get; set; }\n\n        /// <summary>\n        /// Server-side sampling rate as a TimeSpan. Takes precedence\n        /// over OpcSamplingInterval if both are defined. Provides\n        /// more precise control over timing than milliseconds.\n        /// Example: \"00:00:00.100\" for 100ms sampling. Should be\n        /// less than or equal to OpcPublishingIntervalTimespan for\n        /// effective sampling.\n        /// </summary>\n        [DataMember(Name = \"OpcSamplingIntervalTimespan\", Order = 2,\n            EmitDefaultValue = false)]\n        public TimeSpan? OpcSamplingIntervalTimespan { get; set; }\n\n        /// <summary>\n        /// Custom identifier for this node in dataset messages. Used\n        /// as field name in message payloads if specified. Falls back\n        /// to DisplayName if not provided. Helps correlate data with\n        /// specific measurements or tags. Must be unique within a\n        /// dataset writer.\n        /// </summary>\n        [DataMember(Name = \"DataSetFieldId\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? DataSetFieldId { get; set; }\n\n        /// <summary>\n        /// Unique identifier for correlating fields with dataset\n        /// class metadata. Links monitored item data with dataset\n        /// class field definitions. Used to provide context and type\n        /// information for the field. Must match corresponding field\n        /// ID in dataset class metadata. Important for proper message\n        /// decoding by subscribers.\n        /// </summary>\n        [DataMember(Name = \"DataSetClassFieldId\", Order = 4,\n            EmitDefaultValue = false)]\n        public Guid DataSetClassFieldId { get; set; }\n\n        /// <summary>\n        /// Human-readable name for the monitored item. Used as field\n        /// identifier if DataSetFieldId not specified. Can be\n        /// overridden by actual node DisplayName if\n        /// FetchDisplayName=true. Helps identify data sources in\n        /// messages and logs. Should be unique within a dataset for\n        /// clear identification.\n        /// </summary>\n        [DataMember(Name = \"DisplayName\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? DisplayName { get; set; }\n\n        /// <summary>\n        /// Size of the server-side queue for this monitored item.\n        /// Controls how many values can be buffered during slow\n        /// connections. Values are discarded according to DiscardNew\n        /// when queue is full. Default is 1 unless otherwise\n        /// configured. Larger queues help prevent data loss but use\n        /// more server memory.\n        /// </summary>\n        [DataMember(Name = \"QueueSize\", Order = 6,\n            EmitDefaultValue = false)]\n        public uint? QueueSize { get; set; }\n\n        /// <summary>\n        /// Controls queue overflow behavior for monitored items.\n        /// True: Discard newest values when queue is full (LIFO).\n        /// False: Discard oldest values when queue is full (FIFO,\n        /// default). Use True to preserve historical data during\n        /// connection issues. Use False to maintain current value\n        /// accuracy.\n        /// </summary>\n        [DataMember(Name = \"DiscardNew\", Order = 7,\n            EmitDefaultValue = false)]\n        public bool? DiscardNew { get; set; }\n\n        /// <summary>\n        /// Specifies what triggers value change notifications. Only\n        /// applies to DataItems (not Events or Alarms). Options:\n        /// - Status: Changes in status or quality\n        /// - StatusValue: Changes in value or status (default)\n        /// - StatusValueTimestamp: Any change including timestamp\n        /// Controls sensitivity of change detection.\n        /// </summary>\n        [DataMember(Name = \"DataChangeTrigger\", Order = 8,\n            EmitDefaultValue = false)]\n        public DataChangeTriggerType? DataChangeTrigger { get; set; }\n\n        /// <summary>\n        /// Deadband type of the data change filter to apply. Does not\n        /// apply to events.\n        /// </summary>\n        [DataMember(Name = \"DeadbandType\", Order = 9,\n            EmitDefaultValue = false)]\n        public DeadbandType? DeadbandType { get; set; }\n\n        /// <summary>\n        /// Deadband value of the data change filter to apply. Does\n        /// not apply to events\n        /// </summary>\n        [DataMember(Name = \"DeadbandValue\", Order = 10,\n            EmitDefaultValue = false)]\n        public double? DeadbandValue { get; set; }\n\n        /// <summary>\n        /// Event Filter to apply. When specified the node is assmed\n        /// to be an event notifier node to subscribe to.\n        /// </summary>\n        [DataMember(Name = \"EventFilter\", Order = 11,\n            EmitDefaultValue = false)]\n        public EventFilterModel? EventFilter { get; set; }\n\n        /// <summary>\n        /// Settings for pending condition handling\n        /// </summary>\n        [DataMember(Name = \"ConditionHandling\", Order = 12,\n            EmitDefaultValue = false)]\n        public ConditionHandlingOptionsModel? ConditionHandling { get; set; }\n\n        /// <summary>\n        /// Relative path through the address space to reach target\n        /// node. Sequence of browse names from starting node to\n        /// target. Example: [\"Objects\", \"Server\", \"Data\",\n        /// \"Dynamic\", \"Scalar\"]. Allows referencing nodes through\n        /// hierarchical structure. Alternative to direct node ID\n        /// addressing.\n        /// </summary>\n        [DataMember(Name = \"BrowsePath\", Order = 14,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// The OPC UA attribute to monitor on the node. Default is\n        /// Value (13) for variables. Common alternatives:\n        /// - DisplayName (4): Human-readable name\n        /// - Description (5): Detailed information\n        /// - BrowseName (3): Browse name.\n        /// See OPC UA Part 6 for complete attribute list.\n        /// </summary>\n        [DataMember(Name = \"AttributeId\", Order = 15,\n            EmitDefaultValue = false)]\n        public NodeAttribute? AttributeId { get; set; }\n\n        /// <summary>\n        /// Range specification for array or string values. Format:\n        /// \"start:end\" or \"index\". Examples: \"0:3\" (first 4\n        /// elements), \"7\" (8th element) Allows monitoring specific\n        /// array elements. Default: null (entire value monitored)\n        /// </summary>\n        [DataMember(Name = \"IndexRange\", Order = 16,\n            EmitDefaultValue = false)]\n        public string? IndexRange { get; set; }\n\n        /// <summary>\n        /// Custom routing topic/queue for this node's messages.\n        /// Overrides writer and writer group queue settings. Enables\n        /// node-specific message routing patterns. Messages are split\n        /// into separate network messages when nodes have different\n        /// topics. Format depends on transport (e.g., MQTT topic\n        /// syntax).\n        /// </summary>\n        [DataMember(Name = \"Topic\", Order = 17,\n            EmitDefaultValue = false)]\n        public string? Topic { get; set; }\n\n        /// <summary>\n        /// Quality of service to use for the node. Overrides the\n        /// writer and Writer group quality of service and together\n        /// with queue name causes network messages to be split.\n        /// </summary>\n        [DataMember(Name = \"QualityOfService\", Order = 18,\n            EmitDefaultValue = false)]\n        public QoS? QualityOfService { get; set; }\n\n        /// <summary>\n        /// Controls heartbeat message generation for this node.\n        /// Overrides DefaultHeartbeatBehavior from parent\n        /// configuration. See HeartbeatBehavior enum for available\n        /// options. Node-specific heartbeat settings allow\n        /// fine-grained control over connection monitoring and state\n        /// maintenance.\n        /// </summary>\n        [DataMember(Name = \"HeartbeatBehavior\", Order = 19,\n            EmitDefaultValue = false)]\n        public HeartbeatBehavior? HeartbeatBehavior { get; set; }\n\n        /// <summary>\n        /// Node-specific heartbeat interval in milliseconds.\n        /// Overrides DefaultHeartbeatInterval from parent\n        /// configuration. Controls how often heartbeat messages are\n        /// generated. Set to 0 to disable heartbeats for this node.\n        /// Ignored when HeartbeatIntervalTimespan is defined.\n        /// </summary>\n        [DataMember(Name = \"HeartbeatInterval\", Order = 20,\n            EmitDefaultValue = false)]\n        public int? HeartbeatInterval { get; set; }\n\n        /// <summary>\n        /// Node-specific heartbeat interval as TimeSpan. Takes\n        /// precedence over HeartbeatInterval if both defined.\n        /// Overrides DefaultHeartbeatIntervalTimespan setting.\n        /// Provides more precise control over timing. Example:\n        /// \"00:00:10\" for 10-second interval.\n        /// </summary>\n        [DataMember(Name = \"HeartbeatIntervalTimespan\", Order = 21,\n            EmitDefaultValue = false)]\n        public TimeSpan? HeartbeatIntervalTimespan { get; set; }\n\n        /// <summary>\n        /// Controls handling of initial value notification. True:\n        /// Suppress first value from monitored item. False: Publish\n        /// initial value (default). Useful when only changes are\n        /// relevant. Server always sends initial value on creation.\n        /// </summary>\n        [DataMember(Name = \"SkipFirst\", Order = 22,\n            EmitDefaultValue = false)]\n        public bool? SkipFirst { get; set; }\n\n        /// <summary>\n        /// Client-side publishing rate in milliseconds. Controls how\n        /// often the server sends notifications. Must be >=\n        /// OpcSamplingInterval for proper operation. Overrides\n        /// DataSetPublishingInterval when specified. Ignored if\n        /// OpcPublishingIntervalTimespan is defined.\n        /// </summary>\n        [DataMember(Name = \"OpcPublishingInterval\", Order = 23,\n            EmitDefaultValue = false)]\n        public int? OpcPublishingInterval { get; set; }\n\n        /// <summary>\n        /// OpcPublishingInterval as TimeSpan.\n        /// </summary>\n        [DataMember(Name = \"OpcPublishingIntervalTimespan\", Order = 24,\n            EmitDefaultValue = false)]\n        public TimeSpan? OpcPublishingIntervalTimespan { get; set; }\n\n        /// <summary>\n        /// Use periodic reads instead of monitored items. True: Sample\n        /// using CyclicRead service calls False: Use standard\n        /// subscription monitoring (default) Useful for nodes that\n        /// don't support monitoring or when consistent sampling\n        /// timing is required. Consider CyclicReadMaxAge when\n        /// enabled.\n        /// </summary>\n        [DataMember(Name = \"UseCyclicRead\", Order = 25,\n            EmitDefaultValue = false)]\n        public bool? UseCyclicRead { get; set; }\n\n        /// <summary>\n        /// Optimize node access using RegisterNodes service. True:\n        /// Register node for faster subsequent reads False: Use\n        /// direct node access (default) Can improve performance for\n        /// frequently accessed nodes. Server must support\n        /// RegisterNodes service.\n        /// </summary>\n        [DataMember(Name = \"RegisterNode\", Order = 26,\n            EmitDefaultValue = false)]\n        public bool? RegisterNode { get; set; }\n\n        /// <summary>\n        /// Retrieve node's DisplayName attribute on startup. True:\n        /// Query and use actual display name False: Use configured\n        /// DisplayName (default) Overrides DataSetFetchDisplayNames\n        /// setting. Used for human-readable field identification.\n        /// </summary>\n        [DataMember(Name = \"FetchDisplayName\", Order = 27,\n            EmitDefaultValue = false)]\n        public bool? FetchDisplayName { get; set; }\n\n        /// <summary>\n        /// Configuration for model change tracking nodes\n        /// </summary>\n        [DataMember(Name = \"ModelChangeHandling\", Order = 28,\n            EmitDefaultValue = false)]\n        public ModelChangeHandlingOptionsModel? ModelChangeHandling { get; set; }\n\n        /// <summary>\n        /// Collection of dependent nodes triggered by this node. Read\n        /// atomically when parent node changes. Limited to one level\n        /// of triggering (no cascading). Useful for maintaining data\n        /// consistency between related measurements. Changes to\n        /// triggered nodes must be made through parent node's API\n        /// calls.\n        /// </summary>\n        [DataMember(Name = \"TriggeredNodes\", Order = 29,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<OpcNodeModel>? TriggeredNodes { get; set; }\n\n        /// <summary>\n        /// Maximum age for cached values in cyclic reads. Specified in\n        /// milliseconds. Default: 0 (no caching) Only applies when\n        /// UseCyclicRead is true. Server may return cached value if\n        /// within max age. Helps reduce server load in high-frequency\n        /// reads. Ignored when CyclicReadMaxAgeTimespan is defined.\n        /// </summary>\n        [DataMember(Name = \"CyclicReadMaxAge\", Order = 31,\n            EmitDefaultValue = false)]\n        public int? CyclicReadMaxAge { get; set; }\n\n        /// <summary>\n        /// Maximum age for cached values in cyclic reads as TimeSpan.\n        /// Takes precedence over CyclicReadMaxAge if both defined.\n        /// Only applies when UseCyclicRead is true. Default:\n        /// \"00:00:00\" (no caching) Example: \"00:00:00.500\" for 500ms\n        /// max cache age. Helps optimize read performance vs data\n        /// freshness.\n        /// </summary>\n        [DataMember(Name = \"CyclicReadMaxAgeTimespan\", Order = 32,\n            EmitDefaultValue = false)]\n        public TimeSpan? CyclicReadMaxAgeTimespan { get; set; }\n\n        /// <summary>\n        /// A type definition id that references a well known opc ua\n        /// type definition node for the variable represented by this\n        /// node entry.\n        /// </summary>\n        [DataMember(Name = \"TypeDefinitionId\", Order = 33,\n            EmitDefaultValue = false)]\n        public string? TypeDefinitionId { get; set; }\n\n        /// <summary>\n        /// If the node is a method this is the method metadata that\n        /// represents the input and output arguments of the method.\n        /// </summary>\n        [DataMember(Name = \"MethodMetadata\", Order = 34,\n            EmitDefaultValue = false)]\n        public MethodMetadataModel? MethodMetadata { get; set; }\n\n        /// <summary>\n        /// Alternative node identifier with full namespace URI. Same\n        /// as Id but uses complete namespace URI instead of index.\n        /// Format: \"nsu={uri};{type}={value}\" Example:\n        /// \"nsu=http://opcfoundation.org/UA/;i=2258\" Provides more\n        /// portable node identification across servers.\n        /// </summary>\n        [DataMember(Name = \"ExpandedNodeId\", Order = 40,\n            EmitDefaultValue = false)]\n        public string? ExpandedNodeId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/OperationContextModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Operation log model\n    /// </summary>\n    [DataContract]\n    public sealed record class OperationContextModel\n    {\n        /// <summary>\n        /// User\n        /// </summary>\n        [DataMember(Name = \"AuthorityId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? AuthorityId { get; set; }\n\n        /// <summary>\n        /// Operation time\n        /// </summary>\n        [DataMember(Name = \"Time\", Order = 1,\n            EmitDefaultValue = false)]\n        public DateTimeOffset Time { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/OperationLimitsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Server limits\n    /// </summary>\n    [DataContract]\n    public sealed record class OperationLimitsModel\n    {\n        /// <summary>\n        /// Min supported sampling rate\n        /// </summary>\n        [DataMember(Name = \"minSupportedSampleRate\", Order = 0,\n            EmitDefaultValue = false)]\n        public double? MinSupportedSampleRate { get; set; }\n\n        /// <summary>\n        /// Max browse continuation points\n        /// </summary>\n        [DataMember(Name = \"maxBrowseContinuationPoints\", Order = 1,\n            EmitDefaultValue = false)]\n        public ushort? MaxBrowseContinuationPoints { get; set; }\n\n        /// <summary>\n        /// Max query continuation points\n        /// </summary>\n        [DataMember(Name = \"maxQueryContinuationPoints\", Order = 2,\n            EmitDefaultValue = false)]\n        public ushort? MaxQueryContinuationPoints { get; set; }\n\n        /// <summary>\n        /// Max history continuation points\n        /// </summary>\n        [DataMember(Name = \"maxHistoryContinuationPoints\", Order = 3,\n            EmitDefaultValue = false)]\n        public ushort? MaxHistoryContinuationPoints { get; set; }\n\n        /// <summary>\n        /// Max array length supported\n        /// </summary>\n        [DataMember(Name = \"maxArrayLength\", Order = 4,\n            EmitDefaultValue = false)]\n        public uint? MaxArrayLength { get; set; }\n\n        /// <summary>\n        /// Max string length supported\n        /// </summary>\n        [DataMember(Name = \"maxStringLength\", Order = 5,\n            EmitDefaultValue = false)]\n        public uint? MaxStringLength { get; set; }\n\n        /// <summary>\n        /// Max byte buffer length supported\n        /// </summary>\n        [DataMember(Name = \"maxByteStringLength\", Order = 6,\n            EmitDefaultValue = false)]\n        public uint? MaxByteStringLength { get; set; }\n\n        /// <summary>\n        /// Max nodes that can be part of a single browse call.\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerBrowse\", Order = 7,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerBrowse { get; set; }\n\n        /// <summary>\n        /// Max nodes that can be read in single read call\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerRead\", Order = 8,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerRead { get; set; }\n\n        /// <summary>\n        /// Max nodes that can be read in single write call\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerWrite\", Order = 9,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerWrite { get; set; }\n\n        /// <summary>\n        /// Max nodes that can be read in single method call\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerMethodCall\", Order = 10,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerMethodCall { get; set; }\n\n        /// <summary>\n        /// Number of nodes that can be in a History Read value call\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerHistoryReadData\", Order = 11,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerHistoryReadData { get; set; }\n\n        /// <summary>\n        /// Number of nodes that can be in a History Read events call\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerHistoryReadEvents\", Order = 12,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerHistoryReadEvents { get; set; }\n\n        /// <summary>\n        /// Number of nodes that can be in a History Update call\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerHistoryUpdateData\", Order = 13,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerHistoryUpdateData { get; set; }\n\n        /// <summary>\n        /// Number of nodes that can be in a History events update call\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerHistoryUpdateEvents\", Order = 14,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerHistoryUpdateEvents { get; set; }\n\n        /// <summary>\n        /// Max nodes that can be registered at once\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerRegisterNodes\", Order = 15,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerRegisterNodes { get; set; }\n\n        /// <summary>\n        /// Max nodes that can be part of a browse path\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerTranslatePathsToNodeIds\", Order = 16,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerTranslatePathsToNodeIds { get; set; }\n\n        /// <summary>\n        /// Max nodes that can be added or removed in a single call.\n        /// </summary>\n        [DataMember(Name = \"maxNodesPerNodeManagement\", Order = 17,\n            EmitDefaultValue = false)]\n        public uint? MaxNodesPerNodeManagement { get; set; }\n\n        /// <summary>\n        /// Max monitored items that can be updated at once.\n        /// </summary>\n        [DataMember(Name = \"maxMonitoredItemsPerCall\", Order = 18,\n            EmitDefaultValue = false)]\n        public uint? MaxMonitoredItemsPerCall { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"Azure.IIoT.OpcUa.Publisher.Models.Tests\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishBulkRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Publish in bulk request\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishBulkRequestModel\n    {\n        /// <summary>\n        /// Node to add\n        /// </summary>\n        [DataMember(Name = \"nodesToAdd\", Order = 0,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<PublishedItemModel>? NodesToAdd { get; set; }\n\n        /// <summary>\n        /// Node to remove\n        /// </summary>\n        [DataMember(Name = \"nodesToRemove\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? NodesToRemove { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 2,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishBulkResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of bulk request\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishBulkResponseModel\n    {\n        /// <summary>\n        /// Node to add\n        /// </summary>\n        [DataMember(Name = \"nodesToAdd\", Order = 0,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<ServiceResultModel>? NodesToAdd { get; set; }\n\n        /// <summary>\n        /// Node to remove\n        /// </summary>\n        [DataMember(Name = \"nodesToRemove\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<ServiceResultModel>? NodesToRemove { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishDiagnosticInfoModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Model for a diagnostic info.\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishDiagnosticInfoModel\n    {\n        /// <summary>\n        /// Endpoints covered by the diagnostics model.\n        /// The endpoints are all part of the same writer\n        /// group. Specify\n        /// </summary>\n        [DataMember(Name = \"endpoints\", Order = 0,\n            EmitDefaultValue = true)]\n        public IReadOnlyList<PublishedNodesEntryModel>? Endpoints { get; set; }\n\n        /// <summary>\n\t\t/// SentMessagesPerSec\n\t\t/// </summary>\n        [DataMember(Name = \"sentMessagesPerSec\", Order = 1,\n            EmitDefaultValue = true)]\n        public double SentMessagesPerSec { get; set; }\n\n        /// <summary>\n\t\t/// IngestionDuration\n\t\t/// </summary>\n        [DataMember(Name = \"ingestionDuration\", Order = 2,\n            EmitDefaultValue = true)]\n        public TimeSpan IngestionDuration { get; set; }\n\n        /// <summary>\n\t\t/// IngressDataChanges\n\t\t/// </summary>\n        [DataMember(Name = \"ingressDataChanges\", Order = 3,\n            EmitDefaultValue = true)]\n        public long IngressDataChanges { get; set; }\n\n        /// <summary>\n        /// IngressValueChanges\n        /// </summary>\n        [DataMember(Name = \"ingressValueChanges\", Order = 4,\n            EmitDefaultValue = true)]\n        public long IngressValueChanges { get; set; }\n\n        /// <summary>\n        /// IngressBatchBlockBufferSize\n        /// </summary>\n        [DataMember(Name = \"ingressBatchBlockBufferSize\", Order = 5,\n            EmitDefaultValue = true)]\n        public long IngressBatchBlockBufferSize { get; set; }\n\n        /// <summary>\n        /// EncodingBlockInputSize\n        /// </summary>\n        [DataMember(Name = \"encodingBlockInputSize\", Order = 6,\n            EmitDefaultValue = true)]\n        public long EncodingBlockInputSize { get; set; }\n\n        /// <summary>\n        /// EncodingBlockOutputSize\n        /// </summary>\n        [DataMember(Name = \"encodingBlockOutputSize\", Order = 7,\n            EmitDefaultValue = true)]\n        public long EncodingBlockOutputSize { get; set; }\n\n        /// <summary>\n        /// EncoderNotificationsProcessed\n        /// </summary>\n        [DataMember(Name = \"encoderNotificationsProcessed\", Order = 8,\n            EmitDefaultValue = true)]\n        public long EncoderNotificationsProcessed { get; set; }\n\n        /// <summary>\n        /// EncoderNotificationsDropped\n        /// </summary>\n        [DataMember(Name = \"encoderNotificationsDropped\", Order = 9,\n            EmitDefaultValue = true)]\n        public long EncoderNotificationsDropped { get; set; }\n\n        /// <summary>\n        /// EncoderIoTMessagesProcessed\n        /// </summary>\n        [DataMember(Name = \"encoderIoTMessagesProcessed\", Order = 10,\n            EmitDefaultValue = true)]\n        public long EncoderIoTMessagesProcessed { get; set; }\n\n        /// <summary>\n        /// EncoderAvgNotificationsMessage\n        /// </summary>\n        [DataMember(Name = \"encoderAvgNotificationsMessage\", Order = 11,\n            EmitDefaultValue = true)]\n        public double EncoderAvgNotificationsMessage { get; set; }\n\n        /// <summary>\n        /// EncoderAvgIoTMessageBodySize\n        /// </summary>\n        [DataMember(Name = \"encoderAvgIoTMessageBodySize\", Order = 12,\n            EmitDefaultValue = true)]\n        public double EncoderAvgIoTMessageBodySize { get; set; }\n\n        /// <summary>\n        /// EncoderAvgIoTChunkUsage\n        /// </summary>\n        [DataMember(Name = \"encoderAvgIoTChunkUsage\", Order = 13,\n            EmitDefaultValue = true)]\n        public double EncoderAvgIoTChunkUsage { get; set; }\n\n        /// <summary>\n        /// EstimatedIoTChunksPerDay\n        /// </summary>\n        [DataMember(Name = \"estimatedIoTChunksPerDay\", Order = 14,\n            EmitDefaultValue = true)]\n        public double EstimatedIoTChunksPerDay { get; set; }\n\n        /// <summary>\n        /// OutgressInputBufferCount\n        /// </summary>\n        [DataMember(Name = \"outgressInputBufferCount\", Order = 16,\n            EmitDefaultValue = true)]\n        public long OutgressInputBufferCount { get; set; }\n\n        /// <summary>\n        /// OutgressInputBufferDropped\n        /// </summary>\n        [DataMember(Name = \"outgressInputBufferDropped\", Order = 17,\n            EmitDefaultValue = true)]\n        public long OutgressInputBufferDropped { get; set; }\n\n        /// <summary>\n        /// OutgressIoTMessageCount\n        /// </summary>\n        [DataMember(Name = \"outgressIoTMessageCount\", Order = 18,\n            EmitDefaultValue = true)]\n        public long OutgressIoTMessageCount { get; set; }\n\n        /// <summary>\n        /// ConnectionRetries\n        /// </summary>\n        [DataMember(Name = \"connectionRetries\", Order = 19,\n            EmitDefaultValue = true)]\n        public long ConnectionRetries { get; set; }\n\n        /// <summary>\n        /// OpcEndpointConnected\n        /// </summary>\n        [DataMember(Name = \"opcEndpointConnected\", Order = 20,\n            EmitDefaultValue = true)]\n        public bool OpcEndpointConnected { get; set; }\n\n        /// <summary>\n        /// MonitoredOpcNodesSucceededCount\n        /// </summary>\n        [DataMember(Name = \"monitoredOpcNodesSucceededCount\", Order = 21,\n            EmitDefaultValue = true)]\n        public long MonitoredOpcNodesSucceededCount { get; set; }\n\n        /// <summary>\n        /// MonitoredOpcNodesFailedCount\n        /// </summary>\n        [DataMember(Name = \"monitoredOpcNodesFailedCount\", Order = 22,\n            EmitDefaultValue = true)]\n        public long MonitoredOpcNodesFailedCount { get; set; }\n\n        /// <summary>\n        /// Number of incoming event notifications\n        /// </summary>\n        [DataMember(Name = \"ingressEventNotifications\", Order = 23,\n            EmitDefaultValue = true)]\n        public long IngressEventNotifications { get; set; }\n\n        /// <summary>\n        /// Total incoming events so far.\n        /// </summary>\n        [DataMember(Name = \"ingressEvents\", Order = 24,\n            EmitDefaultValue = true)]\n        public long IngressEvents { get; set; }\n\n        /// <summary>\n        /// Encoder max message split ratio\n        /// </summary>\n        [DataMember(Name = \"encoderMaxMessageSplitRatio\", Order = 25,\n            EmitDefaultValue = true)]\n        public double EncoderMaxMessageSplitRatio { get; set; }\n\n        /// <summary>\n        /// Data changes received in the last minute\n        /// </summary>\n        [DataMember(Name = \"ingressDataChangesInLastMinute\", Order = 26,\n            EmitDefaultValue = true)]\n        public long IngressDataChangesInLastMinute { get; set; }\n\n        /// <summary>\n        /// Value changes received in the last minute\n        /// </summary>\n        [DataMember(Name = \"ingressValueChangesInLastMinute\", Order = 27,\n            EmitDefaultValue = true)]\n        public long IngressValueChangesInLastMinute { get; set; }\n\n        /// <summary>\n        /// Number of heartbeats of the total value changes\n        /// </summary>\n        [DataMember(Name = \"ingressHeartbeats\", Order = 28,\n            EmitDefaultValue = true)]\n        public long IngressHeartbeats { get; set; }\n\n        /// <summary>\n        /// Number of cyclic reads of the total value changes\n        /// </summary>\n        [DataMember(Name = \"ingressCyclicReads\", Order = 29,\n            EmitDefaultValue = true)]\n        public long IngressCyclicReads { get; set; }\n\n        /// <summary>\n        /// Legacy Endpoint Information\n        /// </summary>\n        public PublishedNodesEntryModel? Endpoint\n        {\n            get => Endpoints?.Count != 1 ? null :\n                Endpoints[0];\n            set => Endpoints = value == null ? null :\n                new List<PublishedNodesEntryModel> { value };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishStartRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Publish request\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishStartRequestModel\n    {\n        /// <summary>\n        /// Node to publish\n        /// </summary>\n        [DataMember(Name = \"item\", Order = 0)]\n        [Required]\n        public required PublishedItemModel Item { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 1,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishStartResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of publish request\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishStartResponseModel\n    {\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 0,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishStopRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Unpublish request\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishStopRequestModel\n    {\n        /// <summary>\n        /// Node of published item to unpublish\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0)]\n        [Required]\n        public required string NodeId { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 1,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishStopResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of publish stop request\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishStopResponseModel\n    {\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 0,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataItemsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Published items\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataItemsModel\n    {\n        /// <summary>\n        /// Published data variables\n        /// </summary>\n        [DataMember(Name = \"publishedData\", Order = 0)]\n        public IReadOnlyList<PublishedDataSetVariableModel>? PublishedData { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetEventModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Describes event fields to be published\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetEventModel\n    {\n        /// <summary>\n        /// Identifier of event in the dataset.\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Event notifier to subscribe to (or start node)\n        /// </summary>\n        [DataMember(Name = \"eventNotifier\", Order = 1)]\n        public string? EventNotifier { get; set; }\n\n        /// <summary>\n        /// Browse path to event notifier node (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 2,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// Event fields to select\n        /// </summary>\n        [DataMember(Name = \"selectedFields\", Order = 3)]\n        public IReadOnlyList<SimpleAttributeOperandModel>? SelectedFields { get; set; }\n\n        /// <summary>\n        /// Filter to use to select event fields\n        /// </summary>\n        [DataMember(Name = \"filter\", Order = 4)]\n        public ContentFilterModel? Filter { get; set; }\n\n        /// <summary>\n        /// Queue size (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"queueSize\", Order = 5,\n            EmitDefaultValue = false)]\n        public uint? QueueSize { get; set; }\n\n        /// <summary>\n        /// Discard new values if queue is full (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"discardNew\", Order = 6,\n            EmitDefaultValue = false)]\n        public bool? DiscardNew { get; set; }\n\n        /// <summary>\n        /// Monitoring mode (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"monitoringMode\", Order = 7,\n            EmitDefaultValue = false)]\n        public MonitoringMode? MonitoringMode { get; set; }\n\n        /// <summary>\n        /// Condition handling settings\n        /// </summary>\n        [DataMember(Name = \"conditionHandling\", Order = 9)]\n        public ConditionHandlingOptionsModel? ConditionHandling { get; set; }\n\n        /// <summary>\n        /// Simple event Type definition id\n        /// </summary>\n        [DataMember(Name = \"typeDefinitionId\", Order = 10)]\n        public string? TypeDefinitionId { get; set; }\n\n        /// <summary>\n        /// Event name\n        /// </summary>\n        [DataMember(Name = \"publishedEventName\", Order = 11,\n            EmitDefaultValue = false)]\n        public string? PublishedEventName { get; set; }\n\n        /// <summary>\n        /// Read event name from node.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"readEventNameFromNode\", Order = 12,\n            EmitDefaultValue = false)]\n        public bool? ReadEventNameFromNode { get; set; }\n\n        /// <summary>\n        /// Model change event publishing configuration.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"modelChangeHandling\", Order = 13,\n            EmitDefaultValue = false)]\n        public ModelChangeHandlingOptionsModel? ModelChangeHandling { get; set; }\n\n        /// <summary>\n        /// Triggering configuration.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"triggering\", Order = 14,\n            EmitDefaultValue = false)]\n        public PublishedDataSetTriggerModel? Triggering { get; set; }\n\n        /// <summary>\n        /// Queue settings writer should use to publish messages\n        /// to. Overrides the writer and writer group queue settings.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"publishing\", Order = 15,\n            EmitDefaultValue = false)]\n        public PublishingQueueSettingsModel? Publishing { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetMessageSchemaModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Used to generate various message schemas for a data set message\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetMessageSchemaModel\n    {\n        /// <summary>\n        /// The identifier of the schema\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 1,\n            EmitDefaultValue = false)]\n        public required string Id { get; init; }\n\n        /// <summary>\n        /// Metadata describing the data set message content\n        /// </summary>\n        [DataMember(Name = \"metaData\", Order = 2,\n            EmitDefaultValue = false)]\n        public required PublishedDataSetMetaDataModel MetaData { get; init; }\n\n        /// <summary>\n        /// Dataset content encoding flags\n        /// </summary>\n        [DataMember(Name = \"dataSetMessageContentFlags\", Order = 3,\n            EmitDefaultValue = false)]\n        public required DataSetMessageContentFlags? DataSetMessageContentFlags { get; init; }\n\n        /// <summary>\n        /// Dataset field encoding flags\n        /// </summary>\n        [DataMember(Name = \"dataSetFieldContentFlags\", Order = 4,\n            EmitDefaultValue = false)]\n        public required DataSetFieldContentFlags? DataSetFieldContentFlags { get; init; }\n\n        /// <summary>\n        /// Optional type name for the message type\n        /// </summary>\n        [DataMember(Name = \"typeName\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? TypeName { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetMetaDataModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Published metadata\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetMetaDataModel\n    {\n        /// <summary>\n        /// Minor version\n        /// </summary>\n        [DataMember(Name = \"minorVersion\", Order = 0,\n            EmitDefaultValue = false)]\n        public uint MinorVersion { get; init; }\n\n        /// <summary>\n        /// Provides context of the dataset meta data that is to\n        /// be emitted. If set to null no dataset metadata is emitted.\n        /// </summary>\n        [DataMember(Name = \"dataSetMetaData\", Order = 1,\n            EmitDefaultValue = false)]\n        public required DataSetMetaDataModel DataSetMetaData { get; init; }\n\n        /// <summary>\n        /// Field metadata\n        /// </summary>\n        [DataMember(Name = \"fields\", Order = 2,\n            EmitDefaultValue = false)]\n        public required IReadOnlyList<PublishedFieldMetaDataModel> Fields { get; init; }\n\n        /// <summary>\n        /// Structure schema definitions\n        /// </summary>\n        [DataMember(Name = \"StructureDataTypes\", Order = 3,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<StructureDescriptionModel>? StructureDataTypes { get; set; }\n\n        /// <summary>\n        /// Enum schema definitions\n        /// </summary>\n        [DataMember(Name = \"enumDataTypes\", Order = 4,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<EnumDescriptionModel>? EnumDataTypes { get; set; }\n\n        /// <summary>\n        /// Simple type schema definitions\n        /// </summary>\n        [DataMember(Name = \"simpleDataTypes\", Order = 5,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<SimpleTypeDescriptionModel>? SimpleDataTypes { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetMethodModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Describes methods that can be called and results published\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetMethodModel\n    {\n        /// <summary>\n        /// Identifier of method in the dataset.\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Node id of the method or starting point of browse path\n        /// </summary>\n        [DataMember(Name = \"methodId\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? MethodId { get; set; }\n\n        /// <summary>\n        /// Browse path to event notifier node (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 2,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// Method metadata\n        /// </summary>\n        [DataMember(Name = \"metadata\", Order = 3)]\n        public MethodMetadataModel? Metadata { get; set; }\n\n        /// <summary>\n        /// Simple event Type definition id\n        /// </summary>\n        [DataMember(Name = \"typeDefinitionId\", Order = 4)]\n        public string? TypeDefinitionId { get; set; }\n\n        /// <summary>\n        /// Triggering configuration.\n        /// </summary>\n        [DataMember(Name = \"triggering\", Order = 5,\n            EmitDefaultValue = false)]\n        public PublishedDataSetTriggerModel? Triggering { get; set; }\n\n        /// <summary>\n        /// Queue settings writer should use to publish messages\n        /// to. Overrides the writer and writer group queue settings.\n        /// </summary>\n        [DataMember(Name = \"publishing\", Order = 6,\n            EmitDefaultValue = false)]\n        public PublishingQueueSettingsModel? Publishing { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Published data set describing metadata and dataset source\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetModel\n    {\n        /// <summary>\n        /// Name of the published dataset\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Name { get; set; }\n\n        /// <summary>\n        /// Data set source\n        /// </summary>\n        [DataMember(Name = \"dataSetSource\", Order = 1)]\n        public PublishedDataSetSourceModel? DataSetSource { get; set; }\n\n        /// <summary>\n        /// Provides context of the dataset meta data that is to\n        /// be emitted. If set to null no dataset metadata is emitted.\n        /// </summary>\n        [DataMember(Name = \"dataSetMetaData\", Order = 2,\n            EmitDefaultValue = false)]\n        public DataSetMetaDataModel? DataSetMetaData { get; set; }\n\n        /// <summary>\n        /// Extension fields\n        /// </summary>\n        [DataMember(Name = \"extensionFields\", Order = 3,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<ExtensionFieldModel>? ExtensionFields { get; set; }\n\n        /// <summary>\n        /// Send keep alive messages for the data set\n        /// </summary>\n        [DataMember(Name = \"sendKeepAlive\", Order = 4,\n            EmitDefaultValue = false)]\n        public bool? SendKeepAlive { get; set; }\n\n        /// <summary>\n        /// Whenever sending a keep alive message send a keyframe\n        /// message instead.\n        /// </summary>\n        [DataMember(Name = \"keepAliveAsKeyFrame\", Order = 5,\n            EmitDefaultValue = false)]\n        public bool? KeepAliveAsKeyFrame { get; set; }\n\n        /// <summary>\n        /// The data set routing option\n        /// </summary>\n        [DataMember(Name = \"routing\", Order = 6,\n            EmitDefaultValue = false)]\n        public DataSetRoutingMode? Routing { get; set; }\n\n        /// <summary>\n        /// Root node of the dataset\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"rootNode\", Order = 7,\n            EmitDefaultValue = false)]\n        public string? RootNode { get; set; }\n\n        /// <summary>\n        /// Type of the dataset\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"type\", Order = 8,\n            EmitDefaultValue = false)]\n        public string? Type { get; set; }\n\n        /// <summary>\n        /// Subject of the dataset\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"subject\", Order = 9,\n            EmitDefaultValue = false)]\n        public string? Subject { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetSettingsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Published dataset settings - corresponds to SubscriptionModel\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetSettingsModel\n    {\n        /// <summary>\n        /// Publishing interval\n        /// </summary>\n        [DataMember(Name = \"publishingInterval\", Order = 0,\n            EmitDefaultValue = false)]\n        public TimeSpan? PublishingInterval { get; set; }\n\n        /// <summary>\n        /// Life time\n        /// </summary>\n        [DataMember(Name = \"lifeTimeCount\", Order = 1,\n            EmitDefaultValue = false)]\n        public uint? LifeTimeCount { get; set; }\n\n        /// <summary>\n        /// Max keep alive count\n        /// </summary>\n        [DataMember(Name = \"maxKeepAliveCount\", Order = 2,\n            EmitDefaultValue = false)]\n        public uint? MaxKeepAliveCount { get; set; }\n\n        /// <summary>\n        /// Max notifications per publish\n        /// </summary>\n        [DataMember(Name = \"maxNotificationsPerPublish\", Order = 3,\n            EmitDefaultValue = false)]\n        public uint? MaxNotificationsPerPublish { get; set; }\n\n        /// <summary>\n        /// Priority\n        /// </summary>\n        [DataMember(Name = \"priority\", Order = 4,\n            EmitDefaultValue = false)]\n        public byte? Priority { get; set; }\n\n        /// <summary>\n        /// Triggers automatic monitored items display name discovery\n        /// </summary>\n        [DataMember(Name = \"resolveDisplayName\", Order = 5,\n            EmitDefaultValue = false)]\n        public bool? ResolveDisplayName { get; set; }\n\n        /// <summary>\n        /// Use deferred acknoledgements\n        /// </summary>\n        [DataMember(Name = \"useDeferredAcknoledgements\", Order = 6,\n            EmitDefaultValue = false)]\n        public bool? UseDeferredAcknoledgements { get; set; }\n\n        /// <summary>\n        /// Will set the subscription to have publishing\n        /// enabled and every monitored item created to be\n        /// in desired monitoring mode.\n        /// </summary>\n        [DataMember(Name = \"enableImmediatePublishing\", Order = 8,\n            EmitDefaultValue = false)]\n        public bool? EnableImmediatePublishing { get; set; }\n\n        /// <summary>\n        /// Enable sequential publishing feature in the stack.\n        /// </summary>\n        [DataMember(Name = \"enableSequentialPublishing\", Order = 9,\n            EmitDefaultValue = false)]\n        public bool? EnableSequentialPublishing { get; set; }\n\n        /// <summary>\n        /// Republish after transferring the subscription during\n        /// reconnect handling.\n        /// </summary>\n        [DataMember(Name = \"republishAfterTransfer\", Order = 10,\n            EmitDefaultValue = false)]\n        public bool? RepublishAfterTransfer { get; set; }\n\n        /// <summary>\n        /// Subscription watchdog behavior\n        /// </summary>\n        [DataMember(Name = \"watchdogBehavior\", Order = 11,\n            EmitDefaultValue = false)]\n        public SubscriptionWatchdogBehavior? WatchdogBehavior { get; set; }\n\n        /// <summary>\n        /// Monitored item watchdog timeout\n        /// </summary>\n        [DataMember(Name = \"monitoredItemWatchdogTimeout\", Order = 13,\n            EmitDefaultValue = false)]\n        public TimeSpan? MonitoredItemWatchdogTimeout { get; set; }\n\n        /// <summary>\n        /// Monitored item watchdog timeout\n        /// </summary>\n        [DataMember(Name = \"monitoredItemWatchdogCondition\", Order = 14,\n            EmitDefaultValue = false)]\n        public MonitoredItemWatchdogCondition? MonitoredItemWatchdogCondition { get; set; }\n\n        /// <summary>\n        /// Default sampling interval\n        /// </summary>\n        [DataMember(Name = \"defaultSamplingInterval\", Order = 15,\n            EmitDefaultValue = false)]\n        public TimeSpan? DefaultSamplingInterval { get; set; }\n\n        /// <summary>\n        /// Default heartbeat interval\n        /// </summary>\n        [DataMember(Name = \"DefaultHeartbeatInterval\", Order = 16,\n            EmitDefaultValue = false)]\n        public TimeSpan? DefaultHeartbeatInterval { get; set; }\n\n        /// <summary>\n        /// The default behavior of heartbeat\n        /// </summary>\n        [DataMember(Name = \"DefaultHeartbeatBehavior\", Order = 17,\n            EmitDefaultValue = false)]\n        public HeartbeatBehavior? DefaultHeartbeatBehavior { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetSourceModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Data set source akin to a monitored item subscription.\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetSourceModel\n    {\n        /// <summary>\n        /// Either published data variables\n        /// </summary>\n        [DataMember(Name = \"publishedVariables\", Order = 0,\n            EmitDefaultValue = false)]\n        public PublishedDataItemsModel? PublishedVariables { get; set; }\n\n        /// <summary>\n        /// Or published events data\n        /// </summary>\n        [DataMember(Name = \"publishedEvents\", Order = 1,\n            EmitDefaultValue = false)]\n        public PublishedEventItemsModel? PublishedEvents { get; set; }\n\n        /// <summary>\n        /// Or published method calls\n        /// </summary>\n        [DataMember(Name = \"publishedMethods\", Order = 2,\n            EmitDefaultValue = false)]\n        public PublishedMethodItemsModel? PublishedMethods { get; set; }\n\n        /// <summary>\n        /// Connection information (publisher extension)\n        /// </summary>\n        [DataMember(Name = \"connection\", Order = 3)]\n        public ConnectionModel? Connection { get; set; }\n\n        /// <summary>\n        /// Subscription settings (publisher extension)\n        /// </summary>\n        [DataMember(Name = \"subscriptionSettings\", Order = 4,\n            EmitDefaultValue = false)]\n        public PublishedDataSetSettingsModel? SubscriptionSettings { get; set; }\n\n        /// <summary>\n        /// Identifies the source of the dataset to subscribers.\n        /// (publisher extension)\n        /// </summary>\n        [DataMember(Name = \"uri\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? Uri { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetTriggerModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Triggered items.\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetTriggerModel\n    {\n        /// <summary>\n        /// Either published data variables\n        /// </summary>\n        [DataMember(Name = \"publishedVariables\", Order = 0,\n            EmitDefaultValue = false)]\n        public PublishedDataItemsModel? PublishedVariables { get; set; }\n\n        /// <summary>\n        /// Or published events triggering\n        /// </summary>\n        [DataMember(Name = \"publishedEvents\", Order = 1,\n            EmitDefaultValue = false)]\n        public PublishedEventItemsModel? PublishedEvents { get; set; }\n\n        /// <summary>\n        /// Or published calls\n        /// </summary>\n        [DataMember(Name = \"publishedMethods\", Order = 2,\n            EmitDefaultValue = false)]\n        public PublishedMethodItemsModel? PublishedMethods { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedDataSetVariableModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// A published variable\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedDataSetVariableModel\n    {\n        /// <summary>\n        /// Field index of this variable in the dataset.\n        /// </summary>\n        [DataMember(Name = \"fieldIndex\", Order = 0,\n            EmitDefaultValue = false)]\n        public int FieldIndex { get; set; }\n\n        /// <summary>\n        /// Node id of the variable\n        /// </summary>\n        [DataMember(Name = \"publishedVariableNodeId\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? PublishedVariableNodeId { get; set; }\n\n        /// <summary>\n        /// Display name of the published variable\n        /// </summary>\n        [DataMember(Name = \"publishedVariableDisplayName\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? PublishedVariableDisplayName { get; set; }\n\n        /// <summary>\n        /// An optional component path from the node identified by\n        /// PublishedVariableNodeId to the actual node to publish\n        /// (Publisher extension).\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 3,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// Default is <see cref=\"NodeAttribute.Value\"/>.\n        /// </summary>\n        [DataMember(Name = \"attribute\", Order = 4,\n            EmitDefaultValue = false)]\n        public NodeAttribute? Attribute { get; set; }\n\n        /// <summary>\n        /// Index range\n        /// </summary>\n        [DataMember(Name = \"indexRange\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? IndexRange { get; set; }\n\n        /// <summary>\n        /// Sampling Interval hint - default is best effort\n        /// </summary>\n        [DataMember(Name = \"samplingIntervalHint\", Order = 6,\n            EmitDefaultValue = false)]\n        public TimeSpan? SamplingIntervalHint { get; set; }\n\n        /// <summary>\n        /// Data change trigger\n        /// </summary>\n        [DataMember(Name = \"dataChangeTrigger\", Order = 7,\n            EmitDefaultValue = false)]\n        public DataChangeTriggerType? DataChangeTrigger { get; set; }\n\n        /// <summary>\n        /// Deadband type\n        /// </summary>\n        [DataMember(Name = \"deadbandType\", Order = 8,\n            EmitDefaultValue = false)]\n        public DeadbandType? DeadbandType { get; set; }\n\n        /// <summary>\n        /// Deadband value\n        /// </summary>\n        [DataMember(Name = \"deadbandValue\", Order = 9,\n            EmitDefaultValue = false)]\n        public double? DeadbandValue { get; set; }\n\n        /// <summary>\n        /// Substitution value for bad / empty results (not supported yet)\n        /// </summary>\n        [DataMember(Name = \"substituteValue\", Order = 10,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public VariantValue? SubstituteValue { get; set; }\n\n        /// <summary>\n        /// Monitoring mode (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"monitoringMode\", Order = 12,\n            EmitDefaultValue = false)]\n        public MonitoringMode? MonitoringMode { get; set; }\n\n        /// <summary>\n        /// Queue size (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"serverQueueSize\", Order = 13,\n            EmitDefaultValue = false)]\n        public uint? ServerQueueSize { get; set; }\n\n        /// <summary>\n        /// Discard new values if queue is full (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"discardNew\", Order = 14,\n            EmitDefaultValue = false)]\n        public bool? DiscardNew { get; set; }\n\n        /// <summary>\n        /// Behavior of the heartbeatfeature (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"heartbeatBehavior\", Order = 15,\n            EmitDefaultValue = false)]\n        public HeartbeatBehavior? HeartbeatBehavior { get; set; }\n\n        /// <summary>\n        /// Hidden trigger that triggers reporting this variable on\n        /// at a minimum interval. Mutually exclusive with TriggerId.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"heartbeatInterval\", Order = 16,\n            EmitDefaultValue = false)]\n        public TimeSpan? HeartbeatInterval { get; set; }\n\n        /// <summary>\n        /// Instruct the monitored item to skip the first\n        /// received value (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"skipFirst\", Order = 17,\n            EmitDefaultValue = false)]\n        public bool? SkipFirst { get; set; }\n\n        /// <summary>\n        /// Identifier of field in the dataset class.\n        /// </summary>\n        [DataMember(Name = \"dataSetClassFieldId\", Order = 18,\n            EmitDefaultValue = false)]\n        public Guid DataSetClassFieldId { get; set; }\n\n        /// <summary>\n        /// Try and perform a cyclic read using the client\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"samplingUsingCyclicRead\", Order = 19,\n            EmitDefaultValue = false)]\n        public bool? SamplingUsingCyclicRead { get; set; }\n\n        /// <summary>\n        /// Try and register the node before sampling\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"registerNodeForSampling\", Order = 20,\n            EmitDefaultValue = false)]\n        public bool? RegisterNodeForSampling { get; set; }\n\n        /// <summary>\n        /// Read the display name from the node\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"readDisplayNameFromNode\", Order = 21,\n            EmitDefaultValue = false)]\n        public bool? ReadDisplayNameFromNode { get; set; }\n\n        /// <summary>\n        /// Triggering configuration\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"triggering\", Order = 22,\n            EmitDefaultValue = false)]\n        public PublishedDataSetTriggerModel? Triggering { get; set; }\n\n        /// <summary>\n        /// Queue settings writer should use to publish messages\n        /// to. Overrides the writer and writer group queue settings.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"publishing\", Order = 23,\n            EmitDefaultValue = false)]\n        public PublishingQueueSettingsModel? Publishing { get; set; }\n\n        /// <summary>\n        /// The max cache age to use for cyclic reads.\n        /// Default is 0 (uncached reads).\n        /// </summary>\n        [DataMember(Name = \"cyclicReadMaxAge\", Order = 24,\n            EmitDefaultValue = false)]\n        public TimeSpan? CyclicReadMaxAge { get; set; }\n\n        /// <summary>\n        /// Type definition id\n        /// </summary>\n        [DataMember(Name = \"typeDefinitionId\", Order = 25,\n            EmitDefaultValue = false)]\n        public string? TypeDefinitionId { get; set; }\n\n        /// <summary>\n        /// Unique Identifier of variable in the dataset.\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 30,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedEventItemsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Published items\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedEventItemsModel\n    {\n        /// <summary>\n        /// Published data variables\n        /// </summary>\n        [DataMember(Name = \"publishedData\", Order = 0)]\n        public IReadOnlyList<PublishedDataSetEventModel>? PublishedData { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedFieldMetaDataModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Metadata containing the field schema definitions for\n    /// items produced by the dataset writer\n    /// </summary>\n    [DataContract]\n    public record class PublishedFieldMetaDataModel\n    {\n        /// <summary>\n        /// Name of the field\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 0,\n            EmitDefaultValue = false)]\n        public required string Name { get; init; }\n\n        /// <summary>\n        /// Field id\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 1,\n            EmitDefaultValue = false)]\n        public Guid Id { get; init; }\n\n        /// <summary>\n        /// Description\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? Description { get; init; }\n\n        /// <summary>\n        /// Flags\n        /// </summary>\n        [DataMember(Name = \"flags\", Order = 3,\n            EmitDefaultValue = false)]\n        public ushort Flags { get; init; }\n\n        /// <summary>\n        /// Underlying built in type of the type\n        /// </summary>\n        [DataMember(Name = \"builtInType\", Order = 4,\n            EmitDefaultValue = false)]\n        public byte BuiltInType { get; init; }\n\n        /// <summary>\n        /// Data type\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? DataType { get; init; }\n\n        /// <summary>\n        /// Value rank of the type\n        /// </summary>\n        [DataMember(Name = \"valueRank\", Order = 6,\n            EmitDefaultValue = false)]\n        public int ValueRank { get; init; }\n\n        /// <summary>\n        /// Array dimensions if non scalar\n        /// </summary>\n        [DataMember(Name = \"arrayDimensions\", Order = 7,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<uint>? ArrayDimensions { get; init; }\n\n        /// <summary>\n        /// Max string length\n        /// </summary>\n        [DataMember(Name = \"maxStringLength\", Order = 8,\n            EmitDefaultValue = false)]\n        public uint MaxStringLength { get; init; }\n\n        /// <summary>\n        /// Properties of the field\n        /// </summary>\n        [DataMember(Name = \"properties\", Order = 10,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<ExtensionFieldModel>? Properties { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedItemListRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request list of published items\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedItemListRequestModel\n    {\n        /// <summary>\n        /// Continuation token or null to start\n        /// </summary>\n        [DataMember(Name = \"continuationToken\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? ContinuationToken { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 2,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedItemListResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// List of published nodes\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedItemListResponseModel\n    {\n        /// <summary>\n        /// Monitored items\n        /// </summary>\n        [DataMember(Name = \"items\", Order = 0)]\n        public IReadOnlyList<PublishedItemModel>? Items { get; set; }\n\n        /// <summary>\n        /// Continuation or null if final\n        /// </summary>\n        [DataMember(Name = \"continuationToken\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? ContinuationToken { get; set; }\n    }\n\n    /// <summary>\n    /// List of published nodes\n    /// </summary>\n    [DataContract]\n    public sealed record class SetEndpointConfigurationRequestModel\n    {\n        /// <summary>\n        /// Monitored items\n        /// </summary>\n        [DataMember(Name = \"items\", Order = 0)]\n        public IReadOnlyList<PublishedItemModel>? Items { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedItemModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// A monitored and published item\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedItemModel\n    {\n        /// <summary>\n        /// Variable node monitored\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0)]\n        [Required]\n        public required string NodeId { get; set; }\n\n        /// <summary>\n        /// Display name of the variable node monitored\n        /// </summary>\n        [DataMember(Name = \"displayName\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? DisplayName { get; set; }\n\n        /// <summary>\n        /// Publishing interval to use\n        /// </summary>\n        [DataMember(Name = \"publishingInterval\", Order = 2,\n            EmitDefaultValue = false)]\n        public TimeSpan? PublishingInterval { get; set; }\n\n        /// <summary>\n        /// Sampling interval to use\n        /// </summary>\n        [DataMember(Name = \"samplingInterval\", Order = 3,\n            EmitDefaultValue = false)]\n        public TimeSpan? SamplingInterval { get; set; }\n\n        /// <summary>\n        /// Heartbeat interval to use\n        /// </summary>\n        [DataMember(Name = \"heartbeatInterval\", Order = 4,\n            EmitDefaultValue = false)]\n        public TimeSpan? HeartbeatInterval { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedMethodItemsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Published items\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedMethodItemsModel\n    {\n        /// <summary>\n        /// Published data variables\n        /// </summary>\n        [DataMember(Name = \"publishedData\", Order = 0)]\n        public IReadOnlyList<PublishedDataSetMethodModel>? PublishedData { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedNetworkMessageSchemaModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Used to generate various message schemas for a network message\n    /// </summary>\n    public sealed record class PublishedNetworkMessageSchemaModel\n    {\n        /// <summary>\n        /// The identifier of the schema to generate\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 1,\n            EmitDefaultValue = false)]\n        public required string Id { get; init; }\n\n        /// <summary>\n        /// The version of the schema\n        /// </summary>\n        [DataMember(Name = \"version\", Order = 2,\n            EmitDefaultValue = false)]\n        public required ulong Version { get; init; }\n\n        /// <summary>\n        /// Data set messages in the network message\n        /// </summary>\n        [DataMember(Name = \"dataSetMessages\", Order = 3,\n            EmitDefaultValue = false)]\n        public required IReadOnlyList<PublishedDataSetMessageSchemaModel?> DataSetMessages { get; init; }\n\n        /// <summary>\n        /// Dataset content encoding flags\n        /// </summary>\n        [DataMember(Name = \"networkMessageContentFlags\", Order = 4,\n            EmitDefaultValue = false)]\n        public required NetworkMessageContentFlags? NetworkMessageContentFlags { get; init; }\n\n        /// <summary>\n        /// Optional type name for the message type\n        /// </summary>\n        [DataMember(Name = \"typeName\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? TypeName { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedNodeCreateAssetRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request to create an asset in the configuration api\n    /// </summary>\n    /// <typeparam name=\"T\">Type of the configuration</typeparam>\n    [DataContract]\n    public sealed record class PublishedNodeCreateAssetRequestModel<T>\n    {\n        /// <summary>\n        /// Optional request header to use for all operations\n        /// against the server.\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 1,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; init; }\n\n        /// <summary>\n        /// The asset entry in the configuration that is to be\n        /// created or updated. It must contain the writer group\n        /// id as well as the data set name which is the name of\n        /// asset.\n        /// </summary>\n        [DataMember(Name = \"entry\", Order = 2)]\n        [Required]\n        public required PublishedNodesEntryModel Entry { get; init; }\n\n        /// <summary>\n        /// The asset configuration to use when creating the asset.\n        /// </summary>\n        [DataMember(Name = \"configuration\", Order = 3)]\n        [Required]\n        public required T Configuration { get; init; }\n\n        /// <summary>\n        /// Time to wait after the configuration is applied to perform\n        /// the configuration of the asset in the configuration api.\n        /// This is to let the server settle.\n        /// </summary>\n        [DataMember(Name = \"waitTime\", Order = 4,\n            EmitDefaultValue = false)]\n        public TimeSpan? WaitTime { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedNodeDeleteAssetRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Contains entry in the published nodes configuration representing\n    /// the asset as well as an optional request header.\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedNodeDeleteAssetRequestModel\n    {\n        /// <summary>\n        /// Optional request header to use for all operations\n        /// against the server.\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 1,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; init; }\n\n        /// <summary>\n        /// The asset entry in the configuration that is either\n        /// to be deleted. It must contain the as well as the writer\n        /// id which represents the asset id.\n        /// </summary>\n        [DataMember(Name = \"entry\", Order = 2)]\n        [Required]\n        public required PublishedNodesEntryModel Entry { get; init; }\n\n        /// <summary>\n        /// The asset on the server is deleted no matter whether\n        /// the removal in the publisher configuration was successful\n        /// or not.\n        /// </summary>\n        [DataMember(Name = \"force\", Order = 3,\n            EmitDefaultValue = false)]\n        public bool Force { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedNodeExpansionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// <para>\n    /// Node expansion configuration. Configures how an entry should\n    /// be expanded into configuration. If a node is an object it is\n    /// expanded to all contained variables.\n    /// </para>\n    /// <para>\n    /// If a node is an object type, all objects of that type are\n    /// searched from the object root node. These found objects are\n    /// then expanded into their variables.\n    /// </para>\n    /// <para>\n    /// If the node is a variable, the variable is expanded to include\n    /// all contained variables or properties. All entries will have\n    /// the data set field id configured as data set class id.\n    /// </para>\n    /// <para>\n    /// If a node is a variable type, then all variables of this type\n    /// are found and added to a single writer entry. Note: That by\n    /// themselves these variables are no further expanded.\n    /// </para>\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishedNodeExpansionModel\n    {\n        /// <summary>\n        /// Optional request header to use for all operations\n        /// against the server.\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 1,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; init; }\n\n        /// <summary>\n        /// By default the api will create a new distinct\n        /// writer per expanded object. Objects that cannot\n        /// be expanded are part of the originally provided\n        /// writer. The writer id is then post fixed with\n        /// the data set field id of the object node field.\n        /// If true, all variables of all expanded nodes are\n        /// added to the originally provided entry.\n        /// </summary>\n        [DataMember(Name = \"createSingleWriter\", Order = 2,\n            EmitDefaultValue = false)]\n        public bool CreateSingleWriter { get; init; }\n\n        /// <summary>\n        /// Max number of levels to expand an instance node\n        /// such as an object or variable into resulting\n        /// variables.\n        /// If the node is a variable instance to start with\n        /// but the <see cref=\"ExcludeRootIfInstanceNode\"/>\n        /// property is set to excluded it, then setting this\n        /// value to 0 is equivalent to a value of 1 to get\n        /// the first level of variables contained in the\n        /// variable, but not the variable itself. Otherwise\n        /// only the variable itelf is returned. If the node\n        /// is an object instance, 0 is equivalent to\n        /// infinite and all levels are expanded.\n        /// </summary>\n        [DataMember(Name = \"maxLevelsToExpand\", Order = 3,\n            EmitDefaultValue = false)]\n        public uint MaxLevelsToExpand { get; init; }\n\n        /// <summary>\n        /// Do not consider subtypes of an object type when\n        /// searching for instances of the type.\n        /// </summary>\n        [DataMember(Name = \"noSubTypesOfTypeNodes\", Order = 4,\n            EmitDefaultValue = false)]\n        public bool NoSubTypesOfTypeNodes { get; init; }\n\n        /// <summary>\n        /// If the node is an object or variable instance do\n        /// not include it but only the instances underneath\n        /// them.\n        /// </summary>\n        [DataMember(Name = \"excludeRootIfInstanceNode\", Order = 5,\n            EmitDefaultValue = false)]\n        public bool ExcludeRootIfInstanceNode { get; init; }\n\n        /// <summary>\n        /// Max browse depth for object search operation or\n        /// when searching for an instance of a type.\n        /// To only expand an object to its variables set\n        /// this value to 0. The depth of expansion of a\n        /// variable itself can be controlled via the\n        /// <see cref=\"MaxLevelsToExpand\"/>\" property.\n        /// If the root object is excluded a value of 0 is\n        /// equivalent to a value of 1 to get the first level\n        /// of objects contained in the object but not the\n        /// object itself, e.g. a folder object.\n        /// </summary>\n        [DataMember(Name = \"maxDepth\", Order = 6,\n            EmitDefaultValue = false)]\n        public uint? MaxDepth { get; init; }\n\n        /// <summary>\n        /// If false, treats instance nodes found just like\n        /// objects that need to be expanded. In case of a\n        /// companion spec object type this could be set to\n        /// true, flattening the structure into a single\n        /// writer that represents the object in its entirety.\n        /// However, when using generic interfaces that can\n        /// be implemented across objects in the address\n        /// space and only its variables are important, it\n        /// might be useful to set this to false.\n        /// </summary>\n        [DataMember(Name = \"flattenTypeInstance\", Order = 7,\n            EmitDefaultValue = false)]\n        public bool FlattenTypeInstance { get; init; }\n\n        /// <summary>\n        /// Include not just variables and events but also\n        /// methods when expanding an object.\n        /// </summary>\n        [DataMember(Name = \"includeMethods\", Order = 8,\n            EmitDefaultValue = false)]\n        public bool IncludeMethods { get; init; }\n\n        /// <summary>\n        /// Errors are silently discarded and only\n        /// successfully expanded nodes are returned.\n        /// </summary>\n        [DataMember(Name = \"discardErrors\", Order = 9,\n            EmitDefaultValue = false)]\n        public bool DiscardErrors { get; init; }\n\n        /// <summary>\n        /// Use the browse name as display name for nodes. The\n        /// display name is rooted in the parent node from\n        /// which browsing occurs, or just the browse name if\n        /// the browse root is not a parent.\n        /// </summary>\n        [DataMember(Name = \"useBrowseNameAsDisplayName\", Order = 10,\n            EmitDefaultValue = false)]\n        public bool UseBrowseNameAsDisplayName { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedNodesEntryModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// <para>\n    /// Configuration model for OPC UA Publisher that defines how\n    /// OPC UA nodes are published to messaging systems. Used to\n    /// configure connections to OPC UA servers, setup node\n    /// monitoring, and control message publishing.\n    /// </para>\n    /// <para>\n    /// Key features:\n    /// - Endpoint configuration and security settings\n    /// - Writer group and dataset organization\n    /// - Publishing intervals and sampling controls\n    /// - Message batching and triggering\n    /// - Subscription and monitoring options\n    /// - Heartbeat and watchdog behaviors\n    /// - Security modes and authentication\n    /// </para>\n    /// <para>\n    /// For detailed configuration options, see individual\n    /// properties.\n    /// </para>\n    /// </summary>\n    [DataContract]\n    public record class PublishedNodesEntryModel\n    {\n        /// <summary>\n        /// A monotonically increasing number identifying the change\n        /// version. At this point the version number is informational\n        /// only, but should be provided in API requests if available.\n        /// Not used inside file based configuration.\n        /// </summary>\n        [DataMember(Name = \"Version\", Order = 0,\n            EmitDefaultValue = false)]\n        public uint? Version { get; set; }\n\n        /// <summary>\n        /// The time the Publisher configuration was last updated.\n        /// Read only and informational only.\n        /// </summary>\n        [DataMember(Name = \"LastChangeDateTime\", Order = 1,\n            EmitDefaultValue = false)]\n        public DateTimeOffset? LastChangeDateTime { get; set; }\n\n        /// <summary>\n        /// The unique identifier for a data set writer used to collect\n        /// OPC UA nodes to be semantically grouped and published with\n        /// the same publishing interval. When not specified, uses a\n        /// string representing the common publishing interval of the\n        /// nodes in the data set collection. This attribute uniquely\n        /// identifies a data set within a DataSetWriterGroup. The\n        /// uniqueness is determined using the provided DataSetWriterId\n        /// and the publishing interval of the grouped OpcNodes.\n        /// </summary>\n        [DataMember(Name = \"DataSetWriterId\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? DataSetWriterId { get; set; }\n\n        /// <summary>\n        /// The data set writer group collecting datasets defined for a\n        /// certain endpoint. This attribute is used to identify the\n        /// session opened into the server. The default value consists\n        /// of the EndpointUrl string, followed by a deterministic hash\n        /// composed of the EndpointUrl, UseSecurity,\n        /// OpcAuthenticationMode, UserName and Password attributes.\n        /// </summary>\n        [DataMember(Name = \"DataSetWriterGroup\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? DataSetWriterGroup { get; set; }\n\n        /// <summary>\n        /// The DataSet collection grouping the nodes to be published\n        /// for the specific DataSetWriter. Each node can specify\n        /// monitoring parameters including sampling intervals, deadband\n        /// settings, and event filtering options. Contains variable\n        /// nodes or event notifiers to monitor.\n        /// </summary>\n        [DataMember(Name = \"OpcNodes\", Order = 4,\n            EmitDefaultValue = false)]\n        public IList<OpcNodeModel>? OpcNodes { get; set; }\n\n        /// <summary>\n        /// The optional dataset class id as it shall appear in dataset\n        /// messages and dataset metadata. Used to uniquely identify the\n        /// type of dataset being published. Default: Guid.Empty\n        /// </summary>\n        [DataMember(Name = \"DataSetClassId\", Order = 5,\n            EmitDefaultValue = false)]\n        public Guid DataSetClassId { get; set; }\n\n        /// <summary>\n        /// The optional name of the dataset as it will appear in the\n        /// dataset metadata. Used for identification and organization\n        /// of datasets.\n        /// </summary>\n        [DataMember(Name = \"DataSetName\", Order = 6,\n            EmitDefaultValue = false)]\n        public string? DataSetName { get; set; }\n\n        /// <summary>\n        /// The publishing interval used for a grouped set of nodes\n        /// under a certain DataSetWriter, expressed in milliseconds.\n        /// When a specific node underneath DataSetWriter defines\n        /// OpcPublishingInterval (or Timespan), its value will\n        /// overwrite this interval and potentially split the data set\n        /// writer into more than one subscription. Ignored when\n        /// DataSetPublishingIntervalTimespan is present.\n        /// </summary>\n        [DataMember(Name = \"DataSetPublishingInterval\", Order = 7,\n            EmitDefaultValue = false)]\n        public int? DataSetPublishingInterval { get; set; }\n\n        /// <summary>\n        /// The publishing interval for a dataset writer, expressed as a\n        /// TimeSpan value. Takes precedence over\n        /// DataSetPublishingInterval if defined. Provides more precise\n        /// control over timing than milliseconds. When overridden by\n        /// node-specific intervals, the writer may split into multiple\n        /// subscriptions.\n        /// </summary>\n        [DataMember(Name = \"DataSetPublishingIntervalTimespan\", Order = 8,\n            EmitDefaultValue = false)]\n        public TimeSpan? DataSetPublishingIntervalTimespan { get; set; }\n\n        /// <summary>\n        /// Controls key frame insertion frequency in the message\n        /// stream. A key frame contains all current values, while\n        /// delta frames only contain changes. Setting this ensures\n        /// periodic complete state updates, useful for late-joining\n        /// consumers or state synchronization. Key frames can also\n        /// include configured DataSetExtensionFields for additional\n        /// context. Default: 0 (key frames disabled)\n        /// </summary>\n        [DataMember(Name = \"DataSetKeyFrameCount\", Order = 9,\n            EmitDefaultValue = false)]\n        public uint? DataSetKeyFrameCount { get; set; }\n\n        /// <summary>\n        /// The interval in milliseconds at which metadata messages are\n        /// sent, even when the metadata has not changed. Only applies\n        /// when metadata messaging is supported or explicitly enabled.\n        /// Ignored when MetaDataUpdateTimeTimespan is defined.\n        /// </summary>\n        [DataMember(Name = \"MetaDataUpdateTime\", Order = 10,\n            EmitDefaultValue = false)]\n        public int? MetaDataUpdateTime { get; set; }\n\n        /// <summary>\n        /// The interval as TimeSpan at which metadata messages are\n        /// sent, even when metadata has not changed. Takes precedence\n        /// over MetaDataUpdateTime if both are defined. Only applies\n        /// when metadata messaging is supported or explicitly enabled.\n        /// </summary>\n        [DataMember(Name = \"MetaDataUpdateTimeTimespan\", Order = 11,\n            EmitDefaultValue = false)]\n        public TimeSpan? MetaDataUpdateTimeTimespan { get; set; }\n\n        /// <summary>\n        /// Controls whether to send keep alive messages for this\n        /// dataset when a subscription keep alive notification is\n        /// received. Keep alive messages help maintain connection\n        /// status awareness. Only valid if the messaging mode supports\n        /// keep alive messages. Default: false\n        /// </summary>\n        [DataMember(Name = \"SendKeepAliveDataSetMessages\", Order = 12,\n            EmitDefaultValue = false)]\n        public bool? SendKeepAliveDataSetMessages { get; set; }\n\n        /// <summary>\n        /// The required OPC UA server endpoint URL to connect to. This\n        /// is the only required field in the configuration. Format:\n        /// \"opc.tcp://host:port/path\"\n        /// </summary>\n        [DataMember(Name = \"EndpointUrl\", Order = 13)]\n        [Required]\n        public required string EndpointUrl { get; set; }\n\n        /// <summary>\n        /// Defines how many publishing timer expirations to wait\n        /// before sending a keep-alive message when no notifications\n        /// are pending. Works with SendKeepAliveDataSetMessages to\n        /// maintain connection awareness. Keep-alive messages help\n        /// detect connection issues even when no data changes are\n        /// occurring.\n        /// </summary>\n        [DataMember(Name = \"MaxKeepAliveCount\", Order = 14,\n            EmitDefaultValue = false)]\n        public uint? MaxKeepAliveCount { get; set; }\n\n        /// <summary>\n        /// The optional description of the dataset.\n        /// </summary>\n        [DataMember(Name = \"DataSetDescription\", Order = 15,\n            EmitDefaultValue = false)]\n        public string? DataSetDescription { get; set; }\n\n        /// <summary>\n        /// Priority of the writer subscription.\n        /// </summary>\n        [DataMember(Name = \"Priority\", Order = 16,\n            EmitDefaultValue = false)]\n        public byte? Priority { get; set; }\n\n        /// <summary>\n        /// Optional key-value pairs inserted into key frame and\n        /// metadata messages in the same data set. Values are\n        /// formatted using OPC UA Variant JSON encoding. Used to add\n        /// contextual information to datasets.\n        /// </summary>\n        [DataMember(Name = \"DataSetExtensionFields\", Order = 17,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public IDictionary<string, VariantValue>? DataSetExtensionFields { get; set; }\n\n        /// <summary>\n        /// The specific security mode to use for the specified\n        /// endpoint. Overrides <see cref=\"UseSecurity\"/> setting. If\n        /// the security mode is not available with any configured\n        /// security policy connectivity will fail. Default:\n        /// <see cref=\"SecurityMode.NotNone\"/> if <see cref=\"UseSecurity\"/>\n        /// is <c>true</c>, otherwise <see cref=\"SecurityMode.None\"/>\n        /// </summary>\n        [DataMember(Name = \"EndpointSecurityMode\", Order = 18,\n            EmitDefaultValue = false)]\n        public SecurityMode? EndpointSecurityMode { get; set; }\n\n        /// <summary>\n        /// The security policy URI to use for the endpoint connection.\n        /// Overrides UseSecurity setting and refines\n        /// EndpointSecurityMode choice. Examples include\n        /// \"http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256\".\n        /// If the specified policy is not available with the chosen\n        /// security mode, connectivity will fail. This allows enforcing\n        /// specific security requirements.\n        /// </summary>\n        [DataMember(Name = \"EndpointSecurityPolicy\", Order = 19,\n            EmitDefaultValue = false)]\n        public string? EndpointSecurityPolicy { get; set; }\n\n        /// <summary>\n        /// The messaging mode to use when publishing the data sets in\n        /// the writer group. Supported modes include:\n        /// - PubSub: OPC UA PubSub standard format\n        /// - Samples: Simple JSON telemetry format (default)\n        /// - FullNetworkMessages: Complete network message format\n        /// - DataSetMessages: Dataset-only message format\n        /// - RawDataSets: Minimal dataset format\n        /// See messageformats.md documentation for details on each\n        /// format.\n        /// </summary>\n        [DataMember(Name = \"MessagingMode\", Order = 20,\n            EmitDefaultValue = false)]\n        public MessagingMode? MessagingMode { get; set; }\n\n        /// <summary>\n        /// The encoding format to use for messages in the writer\n        /// group. Options include:\n        /// - Json: Standard JSON encoding\n        /// - JsonReversible: Lossless JSON encoding\n        /// - JsonGzip: Compressed JSON\n        /// - JsonReversibleGzip: Compressed lossless JSON\n        /// - Uadp: Binary OPC UA encoding (most efficient)\n        /// Choose based on bandwidth requirements and receiver\n        /// capabilities.\n        /// </summary>\n        [DataMember(Name = \"MessageEncoding\", Order = 21,\n            EmitDefaultValue = false)]\n        public MessageEncoding? MessageEncoding { get; set; }\n\n        /// <summary>\n        /// The number of notifications that are queued before a\n        /// network message is generated. Controls message batching for\n        /// optimizing network traffic vs latency. For historic reasons\n        /// the default value is 50 unless otherwise configured via the\n        /// --bs command line option.\n        /// </summary>\n        [DataMember(Name = \"BatchSize\", Order = 22,\n            EmitDefaultValue = false)]\n        public uint? BatchSize { get; set; }\n\n        /// <summary>\n        /// The interval at which batched network messages are\n        /// published, in milliseconds. Messages are published when\n        /// this interval elapses or when BatchSize is reached. For\n        /// historic reasons the default is 10 seconds unless\n        /// configured via --bi. Ignored when\n        /// BatchTriggerIntervalTimespan is specified. Used with\n        /// BatchSize to optimize network traffic vs latency.\n        /// </summary>\n        [DataMember(Name = \"BatchTriggerInterval\", Order = 23,\n            EmitDefaultValue = false)]\n        public int? BatchTriggerInterval { get; set; }\n\n        /// <summary>\n        /// The interval at which batched network messages are\n        /// published, as a TimeSpan. Takes precedence over\n        /// BatchTriggerInterval if both are defined. Messages are\n        /// published when this interval elapses or when BatchSize is\n        /// reached. Provides more precise control over publishing\n        /// timing than millisecond interval. Used with BatchSize to\n        /// optimize network traffic vs latency.\n        /// </summary>\n        [DataMember(Name = \"BatchTriggerIntervalTimespan\", Order = 24,\n            EmitDefaultValue = false)]\n        public TimeSpan? BatchTriggerIntervalTimespan { get; set; }\n\n        /// <summary>\n        /// Use reverse connect to connect ot the endpoint\n        /// </summary>\n        [DataMember(Name = \"UseReverseConnect\", Order = 25,\n            EmitDefaultValue = false)]\n        public bool? UseReverseConnect { get; set; }\n\n        /// <summary>\n        /// Configure the dataset routing behavior for the contained\n        /// nodes.\n        /// </summary>\n        [DataMember(Name = \"DataSetRouting\", Order = 26,\n            EmitDefaultValue = false)]\n        public DataSetRoutingMode? DataSetRouting { get; set; }\n\n        /// <summary>\n        /// Overrides the default writer group topic template for\n        /// message routing. Used to customize where messages from this\n        /// writer group are published. Particularly useful when\n        /// publishing to MQTT topics or message queues where specific\n        /// routing patterns are needed.\n        /// </summary>\n        [DataMember(Name = \"WriterGroupQueueName\", Order = 27,\n            EmitDefaultValue = false)]\n        public string? WriterGroupQueueName { get; set; }\n\n        /// <summary>\n        /// The quality of service level for message delivery. Options:\n        /// - AtMostOnce: Fire and forget delivery\n        /// - AtLeastOnce: Guaranteed delivery, possible duplicates\n        ///   (default)\n        /// - ExactlyOnce: Guaranteed single delivery\n        /// QoS is only applied if supported by the chosen transport.\n        /// </summary>\n        [DataMember(Name = \"WriterGroupQualityOfService\", Order = 28,\n            EmitDefaultValue = false)]\n        public QoS? WriterGroupQualityOfService { get; set; }\n\n        /// <summary>\n        /// Specifies the transport technology to use for publishing\n        /// messages. Controls how messages are delivered to the\n        /// messaging system. Available transports can be found in\n        /// transports.md documentation. Common options include Azure\n        /// IoT Hub (default), MQTT, and MQTT v5.\n        /// </summary>\n        [DataMember(Name = \"WriterGroupTransport\", Order = 29,\n            EmitDefaultValue = false)]\n        public WriterGroupTransport? WriterGroupTransport { get; set; }\n\n        /// <summary>\n        /// Controls whether to use a secure OPC UA transport mode to\n        /// establish a session. When true, defaults to\n        /// SecurityMode.NotNone which requires signed or encrypted\n        /// communication. When false, uses SecurityMode.None with no\n        /// security. Can be overridden by EndpointSecurityMode and\n        /// EndpointSecurityPolicy settings. Use encrypted\n        /// communication whenever possible to protect credentials and\n        /// data.\n        /// </summary>\n        [DataMember(Name = \"UseSecurity\", Order = 30)]\n        public bool? UseSecurity { get; set; }\n\n        /// <summary>\n        /// Specifies the authentication mode for connecting to the OPC\n        /// UA server. Supported modes:\n        /// - Anonymous: No authentication (default)\n        /// - UsernamePassword: Username and password authentication\n        /// - Certificate: Certificate-based authentication using X.509\n        ///   certificates\n        /// When using credentials or certificates, encrypted\n        /// communication should be enabled via UseSecurity or\n        /// EndpointSecurityMode to protect secrets. For certificate\n        /// auth, the certificate must be in the User certificate\n        /// store.\n        /// </summary>\n        [DataMember(Name = \"OpcAuthenticationMode\", Order = 31)]\n        public OpcAuthenticationMode OpcAuthenticationMode { get; set; }\n\n        /// <summary>\n        /// The encrypted username for authentication when\n        /// OpcAuthenticationMode is UsernamePassword. Encrypted\n        /// credentials at rest can be enforced using the --fce command\n        /// line option. Version 2.6+ stores credentials in plain text\n        /// by default, while 2.5 and below always encrypted them.\n        /// </summary>\n        [DataMember(Name = \"EncryptedAuthUsername\", Order = 32,\n            EmitDefaultValue = false)]\n        public string? EncryptedAuthUsername { get; set; }\n\n        /// <summary>\n        /// The encrypted password for authentication when\n        /// OpcAuthenticationMode is UsernamePassword. For certificate\n        /// authentication, contains the password to access the private\n        /// key. Encrypted credentials at rest can be enforced using\n        /// the --fce command line option. Version 2.6+ stores\n        /// credentials in plain text by default, while 2.5 and below\n        /// always encrypted them.\n        /// </summary>\n        [DataMember(Name = \"EncryptedAuthPassword\", Order = 33,\n            EmitDefaultValue = false)]\n        public string? EncryptedAuthPassword { get; set; }\n\n        /// <summary>\n        /// The plaintext username for UsernamePassword authentication,\n        /// or the subject name of the certificate for Certificate\n        /// authentication. When using Certificate mode, this refers to\n        /// a certificate in the User certificate store of the PKI\n        /// configuration.\n        /// </summary>\n        [DataMember(Name = \"OpcAuthenticationUsername\", Order = 34,\n            EmitDefaultValue = false)]\n        public string? OpcAuthenticationUsername { get; set; }\n\n        /// <summary>\n        /// The plaintext password for UsernamePassword authentication,\n        /// or the password protecting the private key for Certificate\n        /// authentication. For Certificate mode, this must match the\n        /// password used when adding the certificate to the PKI store.\n        /// </summary>\n        [DataMember(Name = \"OpcAuthenticationPassword\", Order = 35,\n            EmitDefaultValue = false)]\n        public string? OpcAuthenticationPassword { get; set; }\n\n        /// <summary>\n        /// Overrides the writer group queue name at the individual\n        /// writer level. When specified, causes network messages to be\n        /// split across different queues. The split also takes QoS\n        /// settings into account, allowing fine-grained control over\n        /// message routing and delivery guarantees.\n        /// </summary>\n        [DataMember(Name = \"QueueName\", Order = 36,\n            EmitDefaultValue = false)]\n        public string? QueueName { get; set; }\n\n        /// <summary>\n        /// The queue name to use for metadata messages from this\n        /// writer. Overrides the default metadata topic template.\n        /// Allows routing metadata to specific destinations separate\n        /// from data messages.\n        /// </summary>\n        [DataMember(Name = \"MetaDataQueueName\", Order = 37,\n            EmitDefaultValue = false)]\n        public string? MetaDataQueueName { get; set; }\n\n        /// <summary>\n        /// The QoS level for this writer's messages. Overrides the\n        /// writer group QoS setting. When specified with a custom\n        /// queue name, causes network messages to be split with\n        /// different delivery guarantees.\n        /// </summary>\n        [DataMember(Name = \"QualityOfService\", Order = 38,\n            EmitDefaultValue = false)]\n        public QoS? QualityOfService { get; set; }\n\n        /// <summary>\n        /// Specifies how many partitions to split the writer group\n        /// into when publishing to target topics. Used to distribute\n        /// message load and enable parallel processing by consumers.\n        /// Default is 1 partition. Particularly useful for\n        /// high-throughput scenarios or when using partitioned\n        /// queues/topics in the messaging system.\n        /// </summary>\n        [DataMember(Name = \"WriterGroupPartitions\", Order = 39,\n            EmitDefaultValue = false)]\n        public int? WriterGroupPartitions { get; set; }\n\n        /// <summary>\n        /// Controls whether subscription transfer is disabled during\n        /// reconnect. When false (default), attempts to transfer\n        /// subscriptions on reconnect to maintain data continuity. Set\n        /// to true to fix interoperability issues with servers that\n        /// don't support subscription transfer. Can be configured\n        /// globally via command line options.\n        /// </summary>\n        [DataMember(Name = \"DisableSubscriptionTransfer\", Order = 40,\n            EmitDefaultValue = false)]\n        public bool? DisableSubscriptionTransfer { get; set; }\n\n        /// <summary>\n        /// Controls whether to republish missed values after a\n        /// subscription is transferred during reconnect handling. Only\n        /// applies when DisableSubscriptionTransfer is false. Helps\n        /// ensure no data is lost during connection interruptions.\n        /// Default: true\n        /// </summary>\n        [DataMember(Name = \"RepublishAfterTransfer\", Order = 41,\n            EmitDefaultValue = false)]\n        public bool? RepublishAfterTransfer { get; set; }\n\n        /// <summary>\n        /// The timeout duration used to monitor whether monitored\n        /// items in the subscription are continuously reporting fresh\n        /// data. This watchdog mechanism helps detect stale data or\n        /// connectivity issues. When this timeout expires, the\n        /// configured DataSetWriterWatchdogBehavior is triggered based\n        /// on OpcNodeWatchdogCondition. Expressed as a TimeSpan value.\n        /// </summary>\n        [DataMember(Name = \"OpcNodeWatchdogTimespan\", Order = 42,\n            EmitDefaultValue = false)]\n        public TimeSpan? OpcNodeWatchdogTimespan { get; set; }\n\n        /// <summary>\n        /// Defines what action to take when the watchdog timer\n        /// triggers. Available behaviors:\n        /// - Diagnostic: Log the event only\n        /// - Reset: Reset the subscription\n        /// - FailFast: Terminate the connection\n        /// - ExitProcess: Shut down the publisher\n        /// The behavior is executed when watchdog conditions are met\n        /// according to OpcNodeWatchdogCondition. Can be configured\n        /// via --dwb command line option.\n        /// </summary>\n        [DataMember(Name = \"DataSetWriterWatchdogBehavior\", Order = 43,\n            EmitDefaultValue = false)]\n        public SubscriptionWatchdogBehavior? DataSetWriterWatchdogBehavior { get; set; }\n\n        /// <summary>\n        /// Specifies the condition that triggers the watchdog\n        /// behavior. Options:\n        /// - WhenAnyAreLate: Execute when any monitored item is late\n        ///   (default)\n        /// - WhenAllAreLate: Execute only when all items are late\n        /// Can be configured via --mwc command line option. Used in\n        /// conjunction with OpcNodeWatchdogTimespan and\n        /// DataSetWriterWatchdogBehavior to implement monitoring and\n        /// recovery strategies.\n        /// </summary>\n        [DataMember(Name = \"OpcNodeWatchdogCondition\", Order = 44,\n            EmitDefaultValue = false)]\n        public MonitoredItemWatchdogCondition? OpcNodeWatchdogCondition { get; set; }\n\n        /// <summary>\n        /// Default sampling interval in milliseconds for all monitored\n        /// items in the dataset. Used if individual nodes don't\n        /// specify their own sampling interval. Follows OPC UA\n        /// specification for sampling behavior. Ignored when\n        /// DataSetSamplingIntervalTimespan is present. Defaults to\n        /// value configured via --oi command line option.\n        /// </summary>\n        [DataMember(Name = \"DataSetSamplingInterval\", Order = 45,\n            EmitDefaultValue = false)]\n        public int? DataSetSamplingInterval { get; set; }\n\n        /// <summary>\n        /// Default sampling interval as TimeSpan for all monitored\n        /// items in the dataset. Takes precedence over\n        /// DataSetSamplingInterval if both are defined. Used if\n        /// individual nodes don't specify their own sampling interval.\n        /// Provides more precise control over sampling timing. Follows\n        /// OPC UA specification for sampling behavior.\n        /// </summary>\n        [DataMember(Name = \"DataSetSamplingIntervalTimespan\", Order = 46,\n            EmitDefaultValue = false)]\n        public TimeSpan? DataSetSamplingIntervalTimespan { get; set; }\n\n        /// <summary>\n        /// Controls whether to fetch display names of monitored\n        /// variable nodes and use those inside messages as field\n        /// names. When true, fetches display names for all nodes. If\n        /// false, uses DisplayName value if provided; if not provided,\n        /// uses the node id. Can be configured via --fd command line\n        /// option.\n        /// </summary>\n        [DataMember(Name = \"DataSetFetchDisplayNames\", Order = 47,\n            EmitDefaultValue = false)]\n        public bool? DataSetFetchDisplayNames { get; set; }\n\n        /// <summary>\n        /// Time-to-live duration for messages sent through the writer\n        /// group. Only applied if the transport technology supports\n        /// message TTL. After this duration expires, messages may be\n        /// discarded by the messaging system. Used to prevent stale\n        /// data from being processed by consumers.\n        /// </summary>\n        [DataMember(Name = \"WriterGroupMessageTtlTimepan\", Order = 49,\n            EmitDefaultValue = false)]\n        public TimeSpan? WriterGroupMessageTtlTimepan { get; set; }\n\n        /// <summary>\n        /// Controls whether messages should be retained by the\n        /// messaging system. Only applied if the transport technology\n        /// supports message retention. When true, messages are kept by\n        /// the broker even after delivery. Useful for late-joining\n        /// subscribers to receive the last known values.\n        /// </summary>\n        [DataMember(Name = \"WriterGroupMessageRetention\", Order = 50,\n            EmitDefaultValue = false)]\n        public bool? WriterGroupMessageRetention { get; set; }\n\n        /// <summary>\n        /// Time-to-live duration for messages sent by this specific\n        /// writer. Overrides WriterGroupMessageTtlTimespan at the\n        /// individual writer level. Only applied if the transport\n        /// technology supports message TTL. Allows different TTL\n        /// settings for different types of data.\n        /// </summary>\n        [DataMember(Name = \"MessageTtlTimespan\", Order = 52,\n            EmitDefaultValue = false)]\n        public TimeSpan? MessageTtlTimespan { get; set; }\n\n        /// <summary>\n        /// Controls message retention for this specific writer.\n        /// Overrides WriterGroupMessageRetention at the individual\n        /// writer level. Only applied if the transport technology\n        /// supports retention. Together with QueueName, allows\n        /// splitting messages across different queues with different\n        /// retention policies.\n        /// </summary>\n        [DataMember(Name = \"MessageRetention\", Order = 53,\n            EmitDefaultValue = false)]\n        public bool? MessageRetention { get; set; }\n\n        /// <summary>\n        /// The interval in milliseconds at which to publish heartbeat\n        /// messages. Heartbeat acts like a watchdog that fires after\n        /// this interval has passed and no new value has been\n        /// received. A value of 0 disables heartbeat. Ignored when\n        /// DefaultHeartbeatIntervalTimespan is defined. See\n        /// heartbeat.md for detailed behavior documentation.\n        /// </summary>\n        [DataMember(Name = \"DefaultHeartbeatInterval\", Order = 54,\n            EmitDefaultValue = false)]\n        public int? DefaultHeartbeatInterval { get; set; }\n\n        /// <summary>\n        /// The heartbeat interval as TimeSpan for all nodes in this\n        /// dataset. Takes precedence over DefaultHeartbeatInterval if\n        /// defined. Controls how often heartbeat messages are\n        /// published when no value changes occur.\n        /// </summary>\n        [DataMember(Name = \"DefaultHeartbeatIntervalTimespan\", Order = 55,\n            EmitDefaultValue = false)]\n        public TimeSpan? DefaultHeartbeatIntervalTimespan { get; set; }\n\n        /// <summary>\n        /// Configures how heartbeat messages are handled for all\n        /// nodes. Supported behaviors:\n        /// - WatchdogLKV: Last Known Value semantics (default)\n        /// - WatchdogLKG: Last Known Good value semantics\n        /// - PeriodicLKV: Continuous periodic sending of last known\n        ///   value\n        /// - PeriodicLKG: Continuous periodic sending of last good\n        ///   value\n        /// - PeriodicLKVDropValue: Periodic reporting only, drop\n        ///   out-of-period values\n        /// - PeriodicLKGDropValue: Periodic reporting only, drop\n        ///   out-of-period values\n        /// Can be configured via --hbb command line option.\n        /// </summary>\n        [DataMember(Name = \"DefaultHeartbeatBehavior\", Order = 56,\n            EmitDefaultValue = false)]\n        public HeartbeatBehavior? DefaultHeartbeatBehavior { get; set; }\n\n        /// <summary>\n        /// Contains an uri identifier that allows correlation of the writer\n        /// data set source into other systems. Will be used as part of\n        /// cloud events header if enabled.\n        /// </summary>\n        [DataMember(Name = \"DataSetSourceUri\", Order = 57,\n            EmitDefaultValue = false)]\n        public string? DataSetSourceUri { get; set; }\n\n        /// <summary>\n        /// Contains an identifier that allows correlation of the writer\n        /// group into other systems in the context of the source. Will be\n        /// used as part of cloud events header if enabled.\n        /// </summary>\n        [DataMember(Name = \"DataSetSubject\", Order = 58,\n            EmitDefaultValue = false)]\n        public string? DataSetSubject { get; set; }\n\n        /// <summary>\n        /// Additional properties of the writer group that should be retained\n        /// with the configuration.\n        /// </summary>\n        [DataMember(Name = \"WriterGroupProperties\", Order = 59,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public Dictionary<string, VariantValue>? WriterGroupProperties { get; set; }\n\n        /// <summary>\n        /// A type definition id that references a well known opc ua type\n        /// definition node for the dataset represented by this entry.\n        /// If set it is used in context of cloud events to specify a concrete\n        /// type of dataset message in the cloud events type header.\n        /// </summary>\n        [DataMember(Name = \"DataSetType\", Order = 60,\n            EmitDefaultValue = false)]\n        public string? DataSetType { get; set; }\n\n        /// <summary>\n        /// A root node that all nodes that use a non rooted browse paths in the\n        /// dataset should start from.\n        /// </summary>\n        [DataMember(Name = \"DataSetRootNodeId\", Order = 61,\n            EmitDefaultValue = false)]\n        public string? DataSetRootNodeId { get; set; }\n\n        /// <summary>\n        /// A node that represents the writer group in the server address space.\n        /// This is the instance id of the root node from which all datasets\n        /// originate. It is informational only and would not need to be\n        /// configured\n        /// </summary>\n        [DataMember(Name = \"WriterGroupRootNodeId\", Order = 62,\n            EmitDefaultValue = false)]\n        public string? WriterGroupRootNodeId { get; set; }\n\n        /// <summary>\n        /// A type that is attached to the writer group and explains the shape\n        /// of the writer group. It is the type definition id of the writer\n        /// group root node id. It is informational only and would not need\n        /// to be configured\n        /// </summary>\n        [DataMember(Name = \"WriterGroupType\", Order = 63,\n            EmitDefaultValue = false)]\n        public string? WriterGroupType { get; set; }\n\n        /// <summary>\n        /// Metadata retention setting for the dataset writer.\n        /// </summary>\n        [DataMember(Name = \"MetaDataRetention\", Order = 65,\n            EmitDefaultValue = false)]\n        public bool? MetaDataRetention { get; set; }\n\n        /// <summary>\n        /// Metadata time-to-live duration for the dataset writer.\n        /// </summary>\n        [DataMember(Name = \"MetaDataTtlTimespan\", Order = 66,\n            EmitDefaultValue = false)]\n        public TimeSpan? MetaDataTtlTimespan { get; set; }\n\n        /// <summary>\n        /// When sending of keep alive messages is enabled, this\n        /// flag controls whether the keep alive messages are sent\n        /// as key frames. Key frames contain all current values.\n        /// </summary>\n        [DataMember(Name = \"SendKeepAliveAsKeyFrameMessages\", Order = 67,\n            EmitDefaultValue = false)]\n        public bool? SendKeepAliveAsKeyFrameMessages { get; set; }\n\n        /// <summary>\n        /// Set a publisher id to use that is different form the\n        /// global publisher identity.\n        /// </summary>\n        [DataMember(Name = \"PublisherId\", Order = 68,\n            EmitDefaultValue = false)]\n        public string? PublisherId { get; set; }\n\n        /// <summary>\n        /// Pass connection string for the transport layer. This works\n        /// for transports that support connection strings such as\n        /// IoT Hub or Event Hubs. It enables overriding the default\n        /// connection string configured for the publisher. The transport\n        /// must be configured using the command line options first, and\n        /// can be overriden here. If it is not configured on the command\n        /// line first, the setting here is ignored.\n        /// </summary>\n        [DataMember(Name = \"WriterGroupTransportConfiguration\", Order = 69,\n            EmitDefaultValue = false)]\n        public string? WriterGroupTransportConfiguration { get; set; }\n\n        /// <summary>\n        /// Enables detailed server diagnostics logging for the\n        /// connection. When enabled, provides additional diagnostic\n        /// information useful for troubleshooting connectivity,\n        /// authentication, and subscription issues. The diagnostics\n        /// data is included in the publisher's logs. Default: false\n        /// </summary>\n        [DataMember(Name = \"DumpConnectionDiagnostics\", Order = 98,\n            EmitDefaultValue = false)]\n        public bool? DumpConnectionDiagnostics { get; set; }\n\n        /// <summary>\n        /// Specifies a single node to monitor using namespace index\n        /// syntax (\"ns=\"). Alternative to using OpcNodes list for\n        /// simple monitoring scenarios.\n        /// </summary>\n        [DataMember(Name = \"NodeId\", Order = 99,\n            EmitDefaultValue = false)]\n        public NodeIdModel? NodeId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedNodesEntryRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Wraps a request and a published nodes entry to bind to a\n    /// body more easily for api that requires an entry and additional\n    /// configuration\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [DataContract]\n    public sealed record class PublishedNodesEntryRequestModel<T>\n    {\n        /// <summary>\n        /// Published nodes entry\n        /// </summary>\n        [DataMember(Name = \"entry\", Order = 0)]\n        [Required]\n        public required PublishedNodesEntryModel Entry { get; init; }\n\n        /// <summary>\n        /// Request\n        /// </summary>\n        [DataMember(Name = \"request\", Order = 1)]\n        public T? Request { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishedNodesResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    /// <summary>\n    /// PublishNodes direct method response\n    /// </summary>\n    public sealed record class PublishedNodesResponseModel\n    {\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublisherDiagnosticTargetType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Target to sent publisher diagnostics to\n    /// </summary>\n    [DataContract]\n    public enum PublisherDiagnosticTargetType\n    {\n        /// <summary>\n        /// Diagnostics are emitted to logger\n        /// </summary>\n        [EnumMember(Value = \"Logger\")]\n        Logger,\n\n        /// <summary>\n        /// Diagnostics are sent as events\n        /// </summary>\n        [EnumMember(Value = \"Events\")]\n        Events\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/PublishingQueueSettingsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Messaging;\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Publishing Queue settings\n    /// </summary>\n    [DataContract]\n    public sealed record class PublishingQueueSettingsModel\n    {\n        /// <summary>\n        /// Queue name writer should use to publish messages to.\n        /// </summary>\n        [DataMember(Name = \"queueName\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? QueueName { get; set; }\n\n        /// <summary>\n        /// Desired Quality of service to use in case of broker\n        /// transport that supports configuring delivery guarantees.\n        /// </summary>\n        [DataMember(Name = \"requestedDeliveryGuarantee\", Order = 2,\n            EmitDefaultValue = false)]\n        public QoS? RequestedDeliveryGuarantee { get; set; }\n\n        /// <summary>\n        /// Desired Time to live to use in case of using a broker\n        /// transport that supports ttl.\n        /// </summary>\n        [DataMember(Name = \"ttl\", Order = 3,\n            EmitDefaultValue = false)]\n        public TimeSpan? Ttl { get; set; }\n\n        /// <summary>\n        /// If the broker transport supports message retention this\n        /// setting determines if the messages should be retained\n        /// in the queue.\n        /// </summary>\n        [DataMember(Name = \"retain\", Order = 4,\n            EmitDefaultValue = false)]\n        public bool? Retain { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/QueryCompilationRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Query compiler request model\n    /// </summary>\n    [DataContract]\n    public record class QueryCompilationRequestModel\n    {\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 0,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; init; }\n\n        /// <summary>\n        /// The query to compile.\n        /// </summary>\n        [DataMember(Name = \"query\", Order = 1)]\n        [Required]\n        public required string Query { get; init; }\n\n        /// <summary>\n        /// Query type\n        /// </summary>\n        [DataMember(Name = \"queryType\", Order = 2)]\n        public QueryType QueryType { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/QueryCompilationResponseModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Query compiler response model\n    /// </summary>\n    [DataContract]\n    public record class QueryCompilationResponseModel\n    {\n        /// <summary>\n        /// Service result returned by server in case of\n        /// error during parsing or compilation.\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 0,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; init; }\n\n        /// <summary>\n        /// Event filter result if request was to create\n        /// an event filter.\n        /// </summary>\n        [DataMember(Name = \"eventFilter\", Order = 1,\n            EmitDefaultValue = false)]\n        public EventFilterModel? EventFilter { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/QueryType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Query type\n    /// </summary>\n    [DataContract]\n    public enum QueryType\n    {\n        /// <summary>\n        /// Query is an event filter\n        /// </summary>\n        [EnumMember(Value = \"Event\")]\n        Event,\n\n        /// <summary>\n        /// Query is a query description\n        /// </summary>\n        [EnumMember(Value = \"Query\")]\n        Query\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ReadEventsDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Read event data\n    /// </summary>\n    [DataContract]\n    public sealed record class ReadEventsDetailsModel\n    {\n        /// <summary>\n        /// Start time to read from\n        /// </summary>\n        [DataMember(Name = \"startTime\", Order = 0,\n            EmitDefaultValue = false)]\n        public DateTime? StartTime { get; set; }\n\n        /// <summary>\n        /// End time to read to\n        /// </summary>\n        [DataMember(Name = \"endTime\", Order = 1,\n            EmitDefaultValue = false)]\n        public DateTime? EndTime { get; set; }\n\n        /// <summary>\n        /// Number of events to read\n        /// </summary>\n        [DataMember(Name = \"numEvents\", Order = 2,\n            EmitDefaultValue = false)]\n        public uint? NumEvents { get; set; }\n\n        /// <summary>\n        /// The filter to use to select the event fields\n        /// </summary>\n        [DataMember(Name = \"filter\", Order = 3,\n            EmitDefaultValue = false)]\n        public EventFilterModel? Filter { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ReadModifiedValuesDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Read modified data\n    /// </summary>\n    [DataContract]\n    public sealed record class ReadModifiedValuesDetailsModel\n    {\n        /// <summary>\n        /// The start time to read from\n        /// </summary>\n        [DataMember(Name = \"startTime\", Order = 0,\n            EmitDefaultValue = false)]\n        public DateTime? StartTime { get; set; }\n\n        /// <summary>\n        /// The end time to read to\n        /// </summary>\n        [DataMember(Name = \"endTime\", Order = 1,\n            EmitDefaultValue = false)]\n        public DateTime? EndTime { get; set; }\n\n        /// <summary>\n        /// The number of values to read\n        /// </summary>\n        [DataMember(Name = \"numValues\", Order = 2,\n            EmitDefaultValue = false)]\n        public uint? NumValues { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ReadProcessedValuesDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Read processed historic data\n    /// </summary>\n    [DataContract]\n    public sealed record class ReadProcessedValuesDetailsModel\n    {\n        /// <summary>\n        /// Start time to read from.\n        /// </summary>\n        [DataMember(Name = \"startTime\", Order = 0,\n            EmitDefaultValue = false)]\n        public DateTime? StartTime { get; set; }\n\n        /// <summary>\n        /// End time to read until\n        /// </summary>\n        [DataMember(Name = \"endTime\", Order = 1,\n            EmitDefaultValue = false)]\n        public DateTime? EndTime { get; set; }\n\n        /// <summary>\n        /// Interval to process\n        /// </summary>\n        [DataMember(Name = \"processingInterval\", Order = 2,\n            EmitDefaultValue = false)]\n        public TimeSpan? ProcessingInterval { get; set; }\n\n        /// <summary>\n        /// The aggregate type to apply. Can be the name of\n        /// the aggregate if available in the history server\n        /// capabilities, or otherwise will be used as a node\n        /// id referring to the aggregate.\n        /// </summary>\n        [DataMember(Name = \"aggregateType\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? AggregateType { get; set; }\n\n        /// <summary>\n        /// Aggregate Configuration - use null or empty configuration\n        /// to use the server defaults.\n        /// </summary>\n        [DataMember(Name = \"aggregateConfiguration\", Order = 4,\n            EmitDefaultValue = false)]\n        public AggregateConfigurationModel? AggregateConfiguration { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ReadRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request node attribute read\n    /// </summary>\n    [DataContract]\n    public sealed record class ReadRequestModel\n    {\n        /// <summary>\n        /// Attributes to read\n        /// </summary>\n        [DataMember(Name = \"attributes\", Order = 0)]\n        [Required]\n        public required IReadOnlyList<AttributeReadRequestModel> Attributes { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 1,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ReadResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of attribute reads\n    /// </summary>\n    [DataContract]\n    public sealed record class ReadResponseModel\n    {\n        /// <summary>\n        /// All results of attribute reads\n        /// </summary>\n        [DataMember(Name = \"results\", Order = 0)]\n        public required IReadOnlyList<AttributeReadResponseModel> Results { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ReadValuesAtTimesDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Read data at specified times\n    /// </summary>\n    [DataContract]\n    public sealed record class ReadValuesAtTimesDetailsModel\n    {\n        /// <summary>\n        /// Requested datums\n        /// </summary>\n        [DataMember(Name = \"reqTimes\", Order = 0)]\n        [Required]\n        public required IReadOnlyList<DateTime> ReqTimes { get; set; }\n\n        /// <summary>\n        /// Whether to use simple bounds\n        /// </summary>\n        [DataMember(Name = \"useSimpleBounds\", Order = 1,\n            EmitDefaultValue = false)]\n        public bool? UseSimpleBounds { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ReadValuesDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Read historic values\n    /// </summary>\n    [DataContract]\n    public sealed record class ReadValuesDetailsModel\n    {\n        /// <summary>\n        /// Beginning of period to read. Set to null\n        /// if no specific start time is specified.\n        /// </summary>\n        [DataMember(Name = \"startTime\", Order = 0,\n            EmitDefaultValue = false)]\n        public DateTime? StartTime { get; set; }\n\n        /// <summary>\n        /// End of period to read. Set to null if no\n        /// specific end time is specified.\n        /// </summary>\n        [DataMember(Name = \"endTime\", Order = 1,\n            EmitDefaultValue = false)]\n        public DateTime? EndTime { get; set; }\n\n        /// <summary>\n        /// The maximum number of values returned for any Node\n        /// over the time range. If only one time is specified,\n        /// the time range shall extend to return this number\n        /// of values. 0 or null indicates that there is no\n        /// maximum.\n        /// </summary>\n        [DataMember(Name = \"numValues\", Order = 2,\n            EmitDefaultValue = false)]\n        public uint? NumValues { get; set; }\n\n        /// <summary>\n        /// Whether to return the bounding values or not.\n        /// </summary>\n        [DataMember(Name = \"returnBounds\", Order = 3,\n            EmitDefaultValue = false)]\n        public bool? ReturnBounds { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/RelativePathElementModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// An element of a relative path\n    /// </summary>\n    [DataContract]\n    public record class RelativePathElementModel\n    {\n        /// <summary>\n        /// Target browse name with namespace\n        /// </summary>\n        [DataMember(Name = \"TargetName\", Order = 0)]\n        public required string TargetName { get; init; }\n\n        /// <summary>\n        /// Reference type identifier.\n        /// (default is hierarchical reference)\n        /// </summary>\n        [DataMember(Name = \"ReferenceTypeId\", Order = 1)]\n        public required string ReferenceTypeId { get; init; }\n\n        /// <summary>\n        /// Whether the reference is inverse\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"IsInverse\", Order = 2,\n            EmitDefaultValue = false)]\n        public bool? IsInverse { get; init; }\n\n        /// <summary>\n        /// Whether reference subtypes should be excluded\n        /// (default is false)\n        /// </summary>\n        [DataMember(Name = \"noSubtypes\", Order = 3,\n            EmitDefaultValue = false)]\n        public bool? NoSubtypes { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/RequestEnvelope.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Wraps a request and a connection to bind to a\n    /// body more easily for api that requires a\n    /// connection endpoint\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [DataContract]\n    public record class RequestEnvelope<T>\n    {\n        /// <summary>\n        /// Connection the request is targeting\n        /// </summary>\n        [DataMember(Name = \"connection\", Order = 0)]\n        [Required]\n        public required ConnectionModel Connection { get; set; }\n\n        /// <summary>\n        /// Request\n        /// </summary>\n        [DataMember(Name = \"request\", Order = 1)]\n        public T? Request { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/RequestHeaderModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request header model\n    /// </summary>\n    [DataContract]\n    public sealed record class RequestHeaderModel\n    {\n        /// <summary>\n        /// Optional User Elevation. We suggest to use the\n        /// connection object to elevate the user instead of\n        /// using the request elevation.\n        /// </summary>\n        [DataMember(Name = \"elevation\", Order = 0,\n            EmitDefaultValue = false)]\n        public CredentialModel? Elevation { get; set; }\n\n        /// <summary>\n        /// Optional list of preferred locales in preference\n        /// order to be used during connecting the session.\n        /// We suggest to use the connection object to set\n        /// the locales\n        /// </summary>\n        [DataMember(Name = \"locales\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? Locales { get; set; }\n\n        /// <summary>\n        /// Optional diagnostics configuration for the\n        /// service call. This configures the returned\n        /// diagnostic information in the result.\n        /// </summary>\n        [DataMember(Name = \"diagnostics\", Order = 2,\n            EmitDefaultValue = false)]\n        public DiagnosticsModel? Diagnostics { get; set; }\n\n        /// <summary>\n        /// Optional namespace format to use when serializing\n        /// nodes and qualified names in responses.\n        /// </summary>\n        [DataMember(Name = \"namespaceFormat\", Order = 3,\n            EmitDefaultValue = false)]\n        public NamespaceFormat? NamespaceFormat { get; set; }\n\n        /// <summary>\n        /// Operation timeout in ms. This applies to every\n        /// operation that is invoked, not to the entire\n        /// transaction and overrides the configured operation\n        /// timeout.\n        /// </summary>\n        [DataMember(Name = \"operationTimeout\", Order = 4,\n            EmitDefaultValue = false)]\n        public int? OperationTimeout { get; set; }\n\n        /// <summary>\n        /// Service call timeout in ms. As opposed to the\n        /// operation timeout this terminates the entire\n        /// transaction if it takes longer than the timeout to\n        /// complete. Note that a connect and reconnect during\n        /// the service call is gated by the connect timeout\n        /// setting. If a connect timeout is not specified\n        /// this timeout is used also for connect timeout.\n        /// </summary>\n        [DataMember(Name = \"serviceCallTimeout\", Order = 5,\n            EmitDefaultValue = false)]\n        public int? ServiceCallTimeout { get; set; }\n\n        /// <summary>\n        /// Connect timeout in ms. As opposed to the service call\n        /// timeout this terminates the entire transaction if\n        /// it takes longer than the timeout to connect a session\n        /// A connect and reconnect during the service call\n        /// resets the timeout therefore the overall time for\n        /// the call to complete can be longer than specified.\n        /// </summary>\n        [DataMember(Name = \"connectTimeout\", Order = 6,\n            EmitDefaultValue = false)]\n        public int? ConnectTimeout { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/RolePermissionModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Role permission model\n    /// </summary>\n    [DataContract]\n    public sealed record class RolePermissionModel\n    {\n        /// <summary>\n        /// Identifier of the role object.\n        /// </summary>\n        [DataMember(Name = \"roleId\", Order = 0)]\n        [Required]\n        public required string RoleId { get; set; }\n\n        /// <summary>\n        /// Permissions assigned for the role.\n        /// </summary>\n        [DataMember(Name = \"permissions\", Order = 1,\n            EmitDefaultValue = false)]\n        public RolePermissions? Permissions { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/RolePermissions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Individual permissions assigned to a role\n    /// </summary>\n    [Flags]\n    [DataContract]\n    public enum RolePermissions\n    {\n        /// <summary>\n        /// No permissions\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None = 0x0,\n\n        /// <summary>\n        /// Gives role the Browse permissions.\n        /// </summary>\n        [EnumMember(Value = \"Browse\")]\n        Browse = 0x1,\n\n        /// <summary>\n        /// Gives role the ReadRolePermissions permissions.\n        /// </summary>\n        [EnumMember(Value = \"ReadRolePermissions\")]\n        ReadRolePermissions = 0x2,\n\n        /// <summary>\n        /// Gives role the WriteAttribute permissions.\n        /// </summary>\n        [EnumMember(Value = \"WriteAttribute\")]\n        WriteAttribute = 0x4,\n\n        /// <summary>\n        /// Gives role the WriteRolePermissions permissions.\n        /// </summary>\n        [EnumMember(Value = \"WriteRolePermissions\")]\n        WriteRolePermissions = 0x8,\n\n        /// <summary>\n        /// Gives role the WriteHistorizing permissions.\n        /// </summary>\n        [EnumMember(Value = \"WriteHistorizing\")]\n        WriteHistorizing = 0x10,\n\n        /// <summary>\n        /// Gives role the Read permissions.\n        /// </summary>\n        [EnumMember(Value = \"Read\")]\n        Read = 0x20,\n\n        /// <summary>\n        /// Gives role the Write value permissions.\n        /// </summary>\n        [EnumMember(Value = \"Write\")]\n        Write = 0x40,\n\n        /// <summary>\n        /// Gives role the ReadHistory permissions.\n        /// </summary>\n        [EnumMember(Value = \"ReadHistory\")]\n        ReadHistory = 0x80,\n\n        /// <summary>\n        /// Gives role the InsertHistory permissions.\n        /// </summary>\n        [EnumMember(Value = \"InsertHistory\")]\n        InsertHistory = 0x100,\n\n        /// <summary>\n        /// Gives role the ModifyHistory permissions.\n        /// </summary>\n        [EnumMember(Value = \"ModifyHistory\")]\n        ModifyHistory = 0x200,\n\n        /// <summary>\n        /// Gives role the DeleteHistory permissions.\n        /// </summary>\n        [EnumMember(Value = \"DeleteHistory\")]\n        DeleteHistory = 0x400,\n\n        /// <summary>\n        /// Gives role the ReceiveEvents permissions.\n        /// </summary>\n        [EnumMember(Value = \"ReceiveEvents\")]\n        ReceiveEvents = 0x800,\n\n        /// <summary>\n        /// Gives role the Call permissions.\n        /// </summary>\n        [EnumMember(Value = \"Call\")]\n        Call = 0x1000,\n\n        /// <summary>\n        /// Gives role the AddReference permissions.\n        /// </summary>\n        [EnumMember(Value = \"AddReference\")]\n        AddReference = 0x2000,\n\n        /// <summary>\n        /// Gives role the RemoveReference permissions.\n        /// </summary>\n        [EnumMember(Value = \"RemoveReference\")]\n        RemoveReference = 0x4000,\n\n        /// <summary>\n        /// Gives role the DeleteNode permissions.\n        /// </summary>\n        [EnumMember(Value = \"DeleteNode\")]\n        DeleteNode = 0x8000,\n\n        /// <summary>\n        /// Gives role the AddNode permissions.\n        /// </summary>\n        [EnumMember(Value = \"AddNode\")]\n        AddNode = 0x10000,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/RuntimeStateEventModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Model for reporting runtime state.\n    /// </summary>\n    [DataContract]\n    public class RuntimeStateEventModel\n    {\n        /// <summary>\n        /// Defines the message type that is sent.\n        /// </summary>\n        [DataMember(Name = \"MessageType\", Order = 0,\n            EmitDefaultValue = true)]\n        public RuntimeStateEventType MessageType { get; set; }\n\n        /// <summary>\n        /// Defines the message version.\n        /// </summary>\n        [DataMember(Name = \"MessageVersion\", Order = 1,\n            EmitDefaultValue = true)]\n        public int MessageVersion { get; set; }\n\n        /// <summary>\n        /// The utc timestamp of the runtime state event\n        /// </summary>\n        [DataMember(Name = \"TimestampUtc\", Order = 2,\n            EmitDefaultValue = true)]\n        public DateTimeOffset TimestampUtc { get; set; }\n\n        /// <summary>\n        /// The Publisher version\n        /// </summary>\n        [DataMember(Name = \"Version\", Order = 3,\n            EmitDefaultValue = true)]\n        public string? Version { get; set; }\n\n        /// <summary>\n        /// The Publisher Id if available\n        /// </summary>\n        [DataMember(Name = \"PublisherId\", Order = 4,\n            EmitDefaultValue = true)]\n        public string? PublisherId { get; set; }\n\n        /// <summary>\n        /// The Site if available\n        /// </summary>\n        [DataMember(Name = \"Site\", Order = 5,\n            EmitDefaultValue = true)]\n        public string? Site { get; set; }\n\n        /// <summary>\n        /// The Device Id if available\n        /// </summary>\n        [DataMember(Name = \"DeviceId\", Order = 6,\n            EmitDefaultValue = true)]\n        public string? DeviceId { get; set; }\n\n        /// <summary>\n        /// The Module Id if available\n        /// </summary>\n        [DataMember(Name = \"ModuleId\", Order = 7,\n            EmitDefaultValue = true)]\n        public string? ModuleId { get; set; }\n\n        /// <summary>\n        /// The Publisher semantic version string\n        /// </summary>\n        [DataMember(Name = \"SemVer\", Order = 8,\n            EmitDefaultValue = true)]\n        public string? SemVer { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/RuntimeStateEventType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Enum of valid values for MessageType.\n    /// </summary>\n    [DataContract]\n    public enum RuntimeStateEventType\n    {\n        /// <summary>\n        /// Restart announcement.\n        /// </summary>\n        [EnumMember(Value = \"RestartAnnouncement\")]\n        RestartAnnouncement,\n\n        /// <summary>\n        /// Runtime state is running\n        /// </summary>\n        [EnumMember(Value = \"Running\")]\n        Running,\n\n        /// <summary>\n        /// Shutdown announcement.\n        /// </summary>\n        [EnumMember(Value = \"ShutdownAnnouncement\")]\n        ShutdownAnnouncement,\n\n        /// <summary>\n        /// Runtime state is stopped\n        /// </summary>\n        [EnumMember(Value = \"Stopped\")]\n        Stopped,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/SecurityMode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Specifies the security mode for OPC UA endpoint connections.\n    /// Determines how messages are protected during transmission between\n    /// the Publisher and OPC UA servers. Proper security mode selection\n    /// is crucial for protecting sensitive data and credentials.\n    /// </summary>\n    [DataContract]\n    [Flags]\n    public enum SecurityMode\n    {\n        /// <summary>\n        /// Selects the highest security level available from the server.\n        /// WARNING: May select None if no secure endpoints are available.\n        /// Not recommended for production - use explicit security modes\n        /// to enforce security requirements.\n        /// </summary>\n        [EnumMember(Value = \"Best\")]\n        Best,\n\n        /// <summary>\n        /// Messages are signed but not encrypted.\n        /// Ensures message integrity and authenticity.\n        /// Protects against tampering but not eavesdropping.\n        /// Use when data confidentiality is not required.\n        /// </summary>\n        [EnumMember(Value = \"Sign\")]\n        Sign,\n\n        /// <summary>\n        /// Messages are both signed and encrypted.\n        /// Provides maximum security with full message protection.\n        /// Ensures confidentiality, integrity, and authenticity.\n        /// Recommended when transmitting sensitive data or credentials.\n        /// </summary>\n        [EnumMember(Value = \"SignAndEncrypt\")]\n        SignAndEncrypt,\n\n        /// <summary>\n        /// No message security applied.\n        /// WARNING: Transmits all data in clear text.\n        /// Should only be used in secure networks or for testing.\n        /// Not recommended for production environments.\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None,\n\n        /// <summary>\n        /// Requires either Sign or SignAndEncrypt mode.\n        /// Ensures some level of message protection.\n        /// Default when UseSecurity is true.\n        /// Recommended minimum security for production use.\n        /// </summary>\n        [EnumMember(Value = \"NotNone\")]\n        NotNone,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ServerCapabilitiesModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Server capabilities\n    /// </summary>\n    [DataContract]\n    public sealed record class ServerCapabilitiesModel\n    {\n        /// <summary>\n        /// Operation limits\n        /// </summary>\n        [DataMember(Name = \"operationLimits\", Order = 0)]\n        public required OperationLimitsModel OperationLimits { get; set; }\n\n        /// <summary>\n        /// Supported locales\n        /// </summary>\n        [DataMember(Name = \"supportedLocales\", Order = 1)]\n        public IReadOnlyList<string>? SupportedLocales { get; set; }\n\n        /// <summary>\n        /// Server profiles\n        /// </summary>\n        [DataMember(Name = \"serverProfileArray\", Order = 2)]\n        public IReadOnlyList<string>? ServerProfiles { get; set; }\n\n        /// <summary>\n        /// Supported modelling rules\n        /// </summary>\n        [DataMember(Name = \"modellingRules\", Order = 3,\n            EmitDefaultValue = false)]\n        public IReadOnlyDictionary<string, string>? ModellingRules { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"aggregateFunctions\", Order = 4,\n            EmitDefaultValue = false)]\n        public IReadOnlyDictionary<string, string>? AggregateFunctions { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"MaxSessions\", Order = 5,\n            EmitDefaultValue = false)]\n        public uint? MaxSessions { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"MaxSubscriptions\", Order = 6,\n            EmitDefaultValue = false)]\n        public uint? MaxSubscriptions { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"MaxMonitoredItems\", Order = 7,\n            EmitDefaultValue = false)]\n        public uint? MaxMonitoredItems { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"MaxSubscriptionsPerSession\", Order = 8,\n            EmitDefaultValue = false)]\n        public uint? MaxSubscriptionsPerSession { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"MaxMonitoredItemsPerSubscription\", Order = 9,\n            EmitDefaultValue = false)]\n        public uint? MaxMonitoredItemsPerSubscription { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"MaxSelectClauseParameters\", Order = 10,\n            EmitDefaultValue = false)]\n        public uint? MaxSelectClauseParameters { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"MaxWhereClauseParameters\", Order = 11,\n            EmitDefaultValue = false)]\n        public uint? MaxWhereClauseParameters { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"MaxMonitoredItemsQueueSize\", Order = 12,\n            EmitDefaultValue = false)]\n        public uint? MaxMonitoredItemsQueueSize { get; set; }\n\n        /// <summary>\n        /// Supported aggregate functions\n        /// </summary>\n        [DataMember(Name = \"conformanceUnits\", Order = 13,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? ConformanceUnits { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ServerEndpointQueryModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Endpoint model\n    /// </summary>\n    [DataContract]\n    public sealed record class ServerEndpointQueryModel\n    {\n        /// <summary>\n        /// Discovery url to use to query\n        /// </summary>\n        [DataMember(Name = \"discoveryUrl\", Order = 0)]\n        public string? DiscoveryUrl { get; set; }\n\n        /// <summary>\n        /// Endpoint url that should match the found endpoint\n        /// </summary>\n        [DataMember(Name = \"url\", Order = 1)]\n        public string? Url { get; set; }\n\n        /// <summary>\n        /// Endpoint must support this Security Mode.\n        /// </summary>\n        [DataMember(Name = \"securityMode\", Order = 2,\n            EmitDefaultValue = false)]\n        public SecurityMode? SecurityMode { get; set; }\n\n        /// <summary>\n        /// Endpoint must support this Security policy.\n        /// </summary>\n        [DataMember(Name = \"securityPolicy\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? SecurityPolicy { get; set; }\n\n        /// <summary>\n        /// Endpoint must match with this certificate thumbprint\n        /// </summary>\n        [DataMember(Name = \"certificate\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? Certificate { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ServerRegistrationRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Server registration request\n    /// </summary>\n    [DataContract]\n    public sealed record class ServerRegistrationRequestModel\n    {\n        /// <summary>\n        /// Discovery url to use for registration\n        /// </summary>\n        [DataMember(Name = \"discoveryUrl\", Order = 0)]\n        [Required]\n        public required string DiscoveryUrl { get; set; }\n\n        /// <summary>\n        /// User defined request id\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? Id { get; set; }\n\n        /// <summary>\n        /// Operation audit context\n        /// </summary>\n        [DataMember(Name = \"context\", Order = 3,\n           EmitDefaultValue = false)]\n        public OperationContextModel? Context { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ServiceCounterModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Service counters\n    /// </summary>\n    [DataContract]\n    public record class ServiceCounterModel\n    {\n        /// <summary>\n        /// Total count\n        /// </summary>\n        [DataMember(Name = \"totalCount\", Order = 1,\n            EmitDefaultValue = false)]\n        public uint TotalCount { get; init; }\n\n        /// <summary>\n        /// Error count\n        /// </summary>\n        [DataMember(Name = \"errorCount\", Order = 2,\n            EmitDefaultValue = false)]\n        public uint ErrorCount { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ServiceResponse.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Response envelope\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [DataContract]\n    public sealed record class ServiceResponse<T> where T : class\n    {\n        /// <summary>\n        /// Result\n        /// </summary>\n        [DataMember(Name = \"result\", Order = 0,\n            EmitDefaultValue = false)]\n        public T? Result { get; init; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ServiceResultModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Service result\n    /// </summary>\n    [DataContract]\n    public sealed record class ServiceResultModel\n    {\n        /// <summary>\n        /// Error code - if null operation succeeded.\n        /// </summary>\n        [DataMember(Name = \"statusCode\", Order = 0,\n            EmitDefaultValue = false)]\n        public uint StatusCode { get; set; }\n\n        /// <summary>\n        /// Error message in case of error or null.\n        /// </summary>\n        [DataMember(Name = \"errorMessage\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? ErrorMessage { get; set; }\n\n        /// <summary>\n        /// Symbolic identifier\n        /// </summary>\n        [DataMember(Name = \"symbolicId\", Order = 2)]\n        public string? SymbolicId { get; set; }\n\n        /// <summary>\n        /// Locale of the error message\n        /// </summary>\n        [DataMember(Name = \"locale\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? Locale { get; set; }\n\n        /// <summary>\n        /// Additional information if available\n        /// </summary>\n        [DataMember(Name = \"additionalInfo\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? AdditionalInfo { get; set; }\n\n        /// <summary>\n        /// Namespace uri\n        /// </summary>\n        [DataMember(Name = \"namespaceUri\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? NamespaceUri { get; set; }\n\n        /// <summary>\n        /// Inner result if any\n        /// </summary>\n        [DataMember(Name = \"inner\", Order = 6,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? Inner { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/SessionDiagnosticsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Session diagnostics\n    /// </summary>\n    [DataContract]\n    public record class SessionDiagnosticsModel\n    {\n        /// <summary>\n        /// Session id\n        /// </summary>\n        [DataMember(Name = \"sessionId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? SessionId { get; init; }\n\n        /// <summary>\n        /// Session name\n        /// </summary>\n        [DataMember(Name = \"sessionName\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? SessionName { get; init; }\n\n        /// <summary>\n        /// Server uri\n        /// </summary>\n        [DataMember(Name = \"serverUri\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? ServerUri { get; init; }\n\n        /// <summary>\n        /// Actual session timeout\n        /// </summary>\n        [DataMember(Name = \"actualSessionTimeout\", Order = 3,\n            EmitDefaultValue = false)]\n        public double ActualSessionTimeout { get; init; }\n\n        /// <summary>\n        /// Max response message size\n        /// </summary>\n        [DataMember(Name = \"maxResponseMessageSize\", Order = 8,\n            EmitDefaultValue = false)]\n        public uint MaxResponseMessageSize { get; init; }\n\n        /// <summary>\n        /// Connection established\n        /// </summary>\n        [DataMember(Name = \"connectTime\", Order = 9,\n            EmitDefaultValue = false)]\n        public DateTime ConnectTime { get; init; }\n\n        /// <summary>\n        /// Last contact\n        /// </summary>\n        [DataMember(Name = \"lastContactTime\", Order = 10,\n            EmitDefaultValue = false)]\n        public DateTime LastContactTime { get; init; }\n\n        /// <summary>\n        /// Current subscriptions count\n        /// </summary>\n        [DataMember(Name = \"currentSubscriptionsCount\", Order = 11,\n            EmitDefaultValue = false)]\n        public uint CurrentSubscriptionsCount { get; init; }\n\n        /// <summary>\n        /// Current monitored items count\n        /// </summary>\n        [DataMember(Name = \"currentMonitoredItemsCount\", Order = 12,\n            EmitDefaultValue = false)]\n        public uint CurrentMonitoredItemsCount { get; init; }\n\n        /// <summary>\n        /// Current publish requests in queue\n        /// </summary>\n        [DataMember(Name = \"currentPublishRequestsInQueue\", Order = 13,\n            EmitDefaultValue = false)]\n        public uint CurrentPublishRequestsInQueue { get; init; }\n\n        /// <summary>\n        /// Total request count\n        /// </summary>\n        [DataMember(Name = \"totalRequestCount\", Order = 14,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? TotalRequestCount { get; init; }\n\n        /// <summary>\n        /// Unauthorized request count\n        /// </summary>\n        [DataMember(Name = \"unauthorizedRequestCount\", Order = 15,\n            EmitDefaultValue = false)]\n        public uint UnauthorizedRequestCount { get; init; }\n\n        /// <summary>\n        /// Read count\n        /// </summary>\n        [DataMember(Name = \"readCount\", Order = 16,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? ReadCount { get; init; }\n\n        /// <summary>\n        /// History read counts\n        /// </summary>\n        [DataMember(Name = \"historyReadCount\", Order = 17,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? HistoryReadCount { get; init; }\n\n        /// <summary>\n        /// Write counts\n        /// </summary>\n        [DataMember(Name = \"writeCount\", Order = 18,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? WriteCount { get; init; }\n\n        /// <summary>\n        /// History update count\n        /// </summary>\n        [DataMember(Name = \"historyUpdateCount\", Order = 19,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? HistoryUpdateCount { get; init; }\n\n        /// <summary>\n        /// Call count\n        /// </summary>\n        [DataMember(Name = \"callCount\", Order = 20,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? CallCount { get; init; }\n\n        /// <summary>\n        /// Create monitored item count\n        /// </summary>\n        [DataMember(Name = \"createMonitoredItemsCount\", Order = 21,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? CreateMonitoredItemsCount { get; init; }\n\n        /// <summary>\n        /// Modify monitored item counts\n        /// </summary>\n        [DataMember(Name = \"modifyMonitoredItemsCount\", Order = 22,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? ModifyMonitoredItemsCount { get; init; }\n\n        /// <summary>\n        /// Set monitoring mode counts\n        /// </summary>\n        [DataMember(Name = \"setMonitoringModeCount\", Order = 23,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? SetMonitoringModeCount { get; init; }\n\n        /// <summary>\n        /// Set triggering counts\n        /// </summary>\n        [DataMember(Name = \"setTriggeringCount\", Order = 24,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? SetTriggeringCount { get; init; }\n\n        /// <summary>\n        /// Delete monitored items counts\n        /// </summary>\n        [DataMember(Name = \"deleteMonitoredItemsCount\", Order = 25,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? DeleteMonitoredItemsCount { get; init; }\n\n        /// <summary>\n        /// Create Subscription count\n        /// </summary>\n        [DataMember(Name = \"createSubscriptionCount\", Order = 26,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? CreateSubscriptionCount { get; init; }\n\n        /// <summary>\n        /// Modify subscription count\n        /// </summary>\n        [DataMember(Name = \"modifySubscriptionCount\", Order = 27,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? ModifySubscriptionCount { get; init; }\n\n        /// <summary>\n        /// Set publishing mode count\n        /// </summary>\n        [DataMember(Name = \"setPublishingModeCount\", Order = 28,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? SetPublishingModeCount { get; init; }\n\n        /// <summary>\n        /// Publish counts\n        /// </summary>\n        [DataMember(Name = \"publishCount\", Order = 29,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? PublishCount { get; init; }\n\n        /// <summary>\n        /// Republish count\n        /// </summary>\n        [DataMember(Name = \"republishCount\", Order = 30,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? RepublishCount { get; init; }\n\n        /// <summary>\n        /// Transfer subscriptions count\n        /// </summary>\n        [DataMember(Name = \"transferSubscriptionsCount\", Order = 31,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? TransferSubscriptionsCount { get; init; }\n\n        /// <summary>\n        /// Delete subscriptions count\n        /// </summary>\n        [DataMember(Name = \"deleteSubscriptionsCount\", Order = 32,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? DeleteSubscriptionsCount { get; init; }\n\n        /// <summary>\n        /// Add nodes count\n        /// </summary>\n        [DataMember(Name = \"addNodesCount\", Order = 33,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? AddNodesCount { get; init; }\n\n        /// <summary>\n        /// Add References count\n        /// </summary>\n        [DataMember(Name = \"addReferencesCount\", Order = 34,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? AddReferencesCount { get; init; }\n\n        /// <summary>\n        /// Delete nodes count\n        /// </summary>\n        [DataMember(Name = \"deleteNodesCount\", Order = 35,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? DeleteNodesCount { get; init; }\n\n        /// <summary>\n        /// Delete References count\n        /// </summary>\n        [DataMember(Name = \"deleteReferencesCount\", Order = 36,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? DeleteReferencesCount { get; init; }\n\n        /// <summary>\n        /// Browse count\n        /// </summary>\n        [DataMember(Name = \"browseCount\", Order = 37,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? BrowseCount { get; init; }\n\n        /// <summary>\n        /// Browse next count\n        /// </summary>\n        [DataMember(Name = \"browseNextCount\", Order = 38,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? BrowseNextCount { get; init; }\n\n        /// <summary>\n        /// Translate browse paths to node ids count\n        /// </summary>\n        [DataMember(Name = \"translateBrowsePathsToNodeIdsCount\", Order = 39,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? TranslateBrowsePathsToNodeIdsCount { get; init; }\n\n        /// <summary>\n        /// Query first count\n        /// </summary>\n        [DataMember(Name = \"queryFirstCount\", Order = 40,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? QueryFirstCount { get; init; }\n\n        /// <summary>\n        /// Query next count\n        /// </summary>\n        [DataMember(Name = \"queryNextCount\", Order = 41,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? QueryNextCount { get; init; }\n\n        /// <summary>\n        /// Register nodes count\n        /// </summary>\n        [DataMember(Name = \"registerNodesCount\", Order = 42,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? RegisterNodesCount { get; init; }\n\n        /// <summary>\n        /// Unregister nodes count\n        /// </summary>\n        [DataMember(Name = \"unregisterNodesCount\", Order = 43,\n            EmitDefaultValue = false)]\n        public ServiceCounterModel? UnregisterNodesCount { get; init; }\n\n        /// <summary>\n        /// Subscription diagnostics\n        /// </summary>\n        [DataMember(Name = \"subscriptions\", Order = 44,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<SubscriptionDiagnosticsModel>? Subscriptions { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/SetConfiguredEndpointsRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Set configured endpoints request call\n    /// </summary>\n    [DataContract]\n    public sealed record class SetConfiguredEndpointsRequestModel\n    {\n        /// <summary>\n        /// Endpoints and nodes that make up the configuration\n        /// </summary>\n        [DataMember(Name = \"endpoints\", Order = 0,\n            EmitDefaultValue = false)]\n        public IEnumerable<PublishedNodesEntryModel>? Endpoints { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/SimpleAttributeOperandModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Simple attribute operand model\n    /// </summary>\n    [DataContract]\n    public record class SimpleAttributeOperandModel\n    {\n        /// <summary>\n        /// Type definition node id if operand is\n        /// simple or full attribute operand.\n        /// </summary>\n        [DataMember(Name = \"typeDefinitionId\", Order = 0)]\n        public string? TypeDefinitionId { get; set; }\n\n        /// <summary>\n        /// Browse path of attribute operand\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// Attribute id\n        /// </summary>\n        [DataMember(Name = \"attributeId\", Order = 2,\n            EmitDefaultValue = false)]\n        public NodeAttribute? AttributeId { get; set; }\n\n        /// <summary>\n        /// Index range of attribute operand\n        /// </summary>\n        [DataMember(Name = \"indexRange\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? IndexRange { get; set; }\n\n        /// <summary>\n        /// Optional display name\n        /// </summary>\n        [DataMember(Name = \"displayName\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? DisplayName { get; set; }\n\n        /// <summary>\n        /// Optional data set class field id (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"dataSetClassFieldId\", Order = 5,\n            EmitDefaultValue = false)]\n        public Guid DataSetClassFieldId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/SimpleTypeDescriptionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Simple type schema\n    /// </summary>\n    [DataContract]\n    public record class SimpleTypeDescriptionModel\n    {\n        /// <summary>\n        /// Data type identifier\n        /// </summary>\n        [DataMember(Name = \"dataTypeId\", Order = 1)]\n        public required string DataTypeId { get; set; }\n\n        /// <summary>\n        /// Name of the type\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 2)]\n        public required string Name { get; set; }\n\n        /// <summary>\n        /// Base data type\n        /// </summary>\n        [DataMember(Name = \"baseDataType\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? BaseDataType { get; set; }\n\n        /// <summary>\n        /// Underlying built in type of the enum.\n        /// Default is integer.\n        /// </summary>\n        [DataMember(Name = \"builtInType\", Order = 4,\n            EmitDefaultValue = false)]\n        public byte? BuiltInType { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/SkipValidationAttribute.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace System.ComponentModel.DataAnnotations\n{\n    /// <summary>\n    /// Always validates true\n    /// </summary>\n    [AttributeUsage(AttributeTargets.All, AllowMultiple = false)]\n    public class SkipValidationAttribute : ValidationAttribute\n    {\n        /// <inheritdoc/>\n        public override bool IsValid(object? value)\n        {\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/StructureDescriptionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Structure type schema\n    /// </summary>\n    public record class StructureDescriptionModel\n    {\n        /// <summary>\n        /// Data type identifier\n        /// </summary>\n        [DataMember(Name = \"dataTypeId\", Order = 1)]\n        public required string DataTypeId { get; set; }\n\n        /// <summary>\n        /// Name of the type\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 2)]\n        public required string Name { get; set; }\n\n        /// <summary>\n        /// Type of the structure. Default is structure.\n        /// </summary>\n        [DataMember(Name = \"structureType\", Order = 3,\n            EmitDefaultValue = false)]\n        public StructureType? StructureType { get; set; }\n\n        /// <summary>\n        /// Fields of the structure\n        /// </summary>\n        [DataMember(Name = \"Fields\", Order = 4)]\n        public required IReadOnlyList<StructureFieldDescriptionModel> Fields { get; set; }\n\n        /// <summary>\n        /// Base data type\n        /// </summary>\n        [DataMember(Name = \"baseDataType\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? BaseDataType { get; set; }\n\n        /// <summary>\n        /// Default encoding\n        /// </summary>\n        [DataMember(Name = \"defaultEncodingId\", Order = 6,\n            EmitDefaultValue = false)]\n        public string? DefaultEncodingId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/StructureFieldDescriptionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Structure field description\n    /// </summary>\n    [DataContract]\n    public record class StructureFieldDescriptionModel\n    {\n        /// <summary>\n        /// Name of the field\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 1)]\n        public required string Name { get; set; }\n\n        /// <summary>\n        /// Data type schema\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 2)]\n        public required string DataType { get; set; }\n\n        /// <summary>\n        /// Description of the field\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? Description { get; set; }\n\n        /// <summary>\n        /// Optionality of the field\n        /// </summary>\n        [DataMember(Name = \"isOptional\", Order = 4,\n            EmitDefaultValue = false)]\n        public bool IsOptional { get; set; }\n\n        /// <summary>\n        /// Value rank of the type\n        /// </summary>\n        [DataMember(Name = \"valueRank\", Order = 6,\n            EmitDefaultValue = false)]\n        public int ValueRank { get; set; }\n\n        /// <summary>\n        /// Array dimensions if non scalar\n        /// </summary>\n        [DataMember(Name = \"arrayDimensions\", Order = 7,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<uint>? ArrayDimensions { get; set; }\n\n        /// <summary>\n        /// Max string length\n        /// </summary>\n        [DataMember(Name = \"maxStringLength\", Order = 8,\n            EmitDefaultValue = false)]\n        public uint MaxStringLength { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/StructureType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Type of structure\n    /// </summary>\n    [DataContract]\n    public enum StructureType\n    {\n        /// <summary>\n        /// Default\n        /// </summary>\n        [EnumMember(Value = \"Structure\")]\n        Structure = 0,\n\n        /// <summary>\n        /// With optional fields\n        /// </summary>\n        [EnumMember(Value = \"StructureWithOptionalFields\")]\n        StructureWithOptionalFields = 1,\n\n        /// <summary>\n        /// Union\n        /// </summary>\n        [EnumMember(Value = \"Union\")]\n        Union = 2,\n\n        /// <summary>\n        /// With subtyped values\n        /// </summary>\n        [EnumMember(Value = \"StructureWithSubtypedValues\")]\n        StructureWithSubtypedValues = 3,\n\n        /// <summary>\n        /// Union but with subtyped values\n        /// </summary>\n        [EnumMember(Value = \"UnionWithSubtypedValues\")]\n        UnionWithSubtypedValues = 4,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/SubscriptionDiagnosticsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Subscription diagnostics\n    /// </summary>\n    [DataContract]\n    public record class SubscriptionDiagnosticsModel\n    {\n        /// <summary>\n        /// Subscription id\n        /// </summary>\n        [DataMember(Name = \"subscriptionId\", Order = 0,\n            EmitDefaultValue = false)]\n        public uint SubscriptionId { get; init; }\n\n        /// <summary>\n        /// Subscription priority\n        /// </summary>\n        [DataMember(Name = \"priority\", Order = 1,\n            EmitDefaultValue = false)]\n        public byte Priority { get; init; }\n\n        /// <summary>\n        /// Publishing interval\n        /// </summary>\n        [DataMember(Name = \"publishingInterval\", Order = 2,\n            EmitDefaultValue = false)]\n        public double PublishingInterval { get; init; }\n\n        /// <summary>\n        /// Max keep alive count\n        /// </summary>\n        [DataMember(Name = \"maxKeepAliveCount\", Order = 3,\n            EmitDefaultValue = false)]\n        public uint MaxKeepAliveCount { get; init; }\n\n        /// <summary>\n        /// Max lifetime count\n        /// </summary>\n        [DataMember(Name = \"maxLifetimeCount\", Order = 4,\n            EmitDefaultValue = false)]\n        public uint MaxLifetimeCount { get; init; }\n\n        /// <summary>\n        /// Current keep alive count\n        /// </summary>\n        [DataMember(Name = \"currentKeepAliveCount\", Order = 5,\n            EmitDefaultValue = false)]\n        public uint CurrentKeepAliveCount { get; init; }\n\n        /// <summary>\n        /// Current lifetime count\n        /// </summary>\n        [DataMember(Name = \"currentLifetimeCount\", Order = 6,\n            EmitDefaultValue = false)]\n        public uint CurrentLifetimeCount { get; init; }\n\n        /// <summary>\n        /// Max notifications per publish\n        /// </summary>\n        [DataMember(Name = \"maxNotificationsPerPublish\", Order = 7,\n            EmitDefaultValue = false)]\n        public uint MaxNotificationsPerPublish { get; init; }\n\n        /// <summary>\n        /// Publishing enabled\n        /// </summary>\n        [DataMember(Name = \"publishingEnabled\", Order = 8,\n            EmitDefaultValue = false)]\n        public bool PublishingEnabled { get; init; }\n\n        /// <summary>\n        /// Modify count\n        /// </summary>\n        [DataMember(Name = \"modifyCount\", Order = 9,\n            EmitDefaultValue = false)]\n        public uint ModifyCount { get; init; }\n\n        /// <summary>\n        /// Subscription enable count\n        /// </summary>\n        [DataMember(Name = \"enableCount\", Order = 10,\n            EmitDefaultValue = false)]\n        public uint EnableCount { get; init; }\n\n        /// <summary>\n        /// Disable count\n        /// </summary>\n        [DataMember(Name = \"disableCount\", Order = 11,\n            EmitDefaultValue = false)]\n        public uint DisableCount { get; init; }\n\n        /// <summary>\n        /// Monitored item count\n        /// </summary>\n        [DataMember(Name = \"monitoredItemCount\", Order = 12,\n            EmitDefaultValue = false)]\n        public uint MonitoredItemCount { get; init; }\n\n        /// <summary>\n        /// Disabled monitored item count\n        /// </summary>\n        [DataMember(Name = \"disabledMonitoredItemCount\", Order = 13,\n            EmitDefaultValue = false)]\n        public uint DisabledMonitoredItemCount { get; init; }\n\n        /// <summary>\n        /// Publish request count\n        /// </summary>\n        [DataMember(Name = \"publishRequestCount\", Order = 14,\n            EmitDefaultValue = false)]\n        public uint PublishRequestCount { get; init; }\n\n        /// <summary>\n        /// Late publish request count\n        /// </summary>\n        [DataMember(Name = \"latePublishRequestCount\", Order = 15,\n            EmitDefaultValue = false)]\n        public uint LatePublishRequestCount { get; init; }\n\n        /// <summary>\n        /// Data change notifications count\n        /// </summary>\n        [DataMember(Name = \"dataChangeNotificationsCount\", Order = 16,\n            EmitDefaultValue = false)]\n        public uint DataChangeNotificationsCount { get; init; }\n\n        /// <summary>\n        /// Event notifications count\n        /// </summary>\n        [DataMember(Name = \"eventNotificationsCount\", Order = 17,\n            EmitDefaultValue = false)]\n        public uint EventNotificationsCount { get; init; }\n\n        /// <summary>\n        /// Total Notifications count\n        /// </summary>\n        [DataMember(Name = \"notificationsCount\", Order = 18,\n            EmitDefaultValue = false)]\n        public uint NotificationsCount { get; init; }\n\n        /// <summary>\n        /// Unacknowledged message count\n        /// </summary>\n        [DataMember(Name = \"unacknowledgedMessageCount\", Order = 19,\n            EmitDefaultValue = false)]\n        public uint UnacknowledgedMessageCount { get; init; }\n\n        /// <summary>\n        /// Discarded message count\n        /// </summary>\n        [DataMember(Name = \"discardedMessageCount\", Order = 20,\n            EmitDefaultValue = false)]\n        public uint DiscardedMessageCount { get; init; }\n\n        /// <summary>\n        /// Next sequence number\n        /// </summary>\n        [DataMember(Name = \"nextSequenceNumber\", Order = 21,\n            EmitDefaultValue = false)]\n        public uint NextSequenceNumber { get; init; }\n\n        /// <summary>\n        /// Monitoring queue overflow count\n        /// </summary>\n        [DataMember(Name = \"monitoringQueueOverflowCount\", Order = 22,\n            EmitDefaultValue = false)]\n        public uint MonitoringQueueOverflowCount { get; init; }\n\n        /// <summary>\n        /// Event queue overflow count\n        /// </summary>\n        [DataMember(Name = \"eventQueueOverFlowCount\", Order = 23,\n            EmitDefaultValue = false)]\n        public uint EventQueueOverFlowCount { get; init; }\n\n        /// <summary>\n        /// Transfer request count\n        /// </summary>\n        [DataMember(Name = \"transferRequestCount\", Order = 24,\n            EmitDefaultValue = false)]\n        public uint TransferRequestCount { get; init; }\n\n        /// <summary>\n        /// Transferred to alt client count\n        /// </summary>\n        [DataMember(Name = \"transferredToAltClientCount\", Order = 25,\n            EmitDefaultValue = false)]\n        public uint TransferredToAltClientCount { get; init; }\n\n        /// <summary>\n        /// Transferred to same client count\n        /// </summary>\n        [DataMember(Name = \"transferredToSameClientCount\", Order = 26,\n            EmitDefaultValue = false)]\n        public uint TransferredToSameClientCount { get; init; }\n\n        /// <summary>\n        /// Publish request count\n        /// </summary>\n        [DataMember(Name = \"republishRequestCount\", Order = 27,\n            EmitDefaultValue = false)]\n        public uint RepublishRequestCount { get; init; }\n\n        /// <summary>\n        /// Republish message request count\n        /// </summary>\n        [DataMember(Name = \"republishMessageRequestCount\", Order = 28,\n            EmitDefaultValue = false)]\n        public uint RepublishMessageRequestCount { get; init; }\n\n        /// <summary>\n        /// Republish message count\n        /// </summary>\n        [DataMember(Name = \"republishMessageCount\", Order = 29,\n            EmitDefaultValue = false)]\n        public uint RepublishMessageCount { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/SubscriptionWatchdogBehavior.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Defines how the publisher responds when monitored items stop reporting data.\n    /// The watchdog triggers when items are late according to OpcNodeWatchdogTimespan\n    /// and OpcNodeWatchdogCondition settings. Can be configured globally via the\n    /// --dwb command line option.\n    /// </summary>\n    [DataContract]\n    [Flags]\n    public enum SubscriptionWatchdogBehavior\n    {\n        /// <summary>\n        /// Log watchdog events to diagnostics output only.\n        /// Least intrusive behavior that maintains normal operation.\n        /// Useful for monitoring and troubleshooting connection issues.\n        /// Recommended for non-critical monitoring scenarios.\n        /// </summary>\n        [EnumMember(Value = \"Diagnostic\")]\n        Diagnostic,\n\n        /// <summary>\n        /// Attempts to reestablish the subscription when watchdog triggers.\n        /// Automatically recovers from temporary connection issues.\n        /// May cause brief interruption during reset operation.\n        /// Good balance between reliability and availability.\n        /// </summary>\n        [EnumMember(Value = \"Reset\")]\n        Reset,\n\n        /// <summary>\n        /// Immediately terminates the publisher application when triggered.\n        /// Most aggressive recovery option that forces complete restart.\n        /// Useful when clean restart is required for recovery.\n        /// WARNING: Will disrupt all active subscriptions.\n        /// </summary>\n        [EnumMember(Value = \"FailFast\")]\n        FailFast,\n\n        /// <summary>\n        /// Gracefully exits the process with exit code -10 when triggered.\n        /// Allows container orchestrators or service managers to handle restart.\n        /// Provides clean shutdown with specific error indication.\n        /// Suitable for managed deployment environments.\n        /// </summary>\n        [EnumMember(Value = \"ExitProcess\")]\n        ExitProcess\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/TestConnectionRequestModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Test connection request\n    /// </summary>\n    [DataContract]\n    public sealed record class TestConnectionRequestModel\n    {\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 0,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/TestConnectionResponseModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Test connection response\n    /// </summary>\n    [DataContract]\n    public sealed record class TestConnectionResponseModel\n    {\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 0,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/TimestampsToReturn.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Timestamps\n    /// </summary>\n    [DataContract]\n    public enum TimestampsToReturn\n    {\n        /// <summary>\n        /// Both time stamps\n        /// </summary>\n        [EnumMember(Value = \"Both\")]\n        Both,\n\n        /// <summary>\n        /// Source time\n        /// </summary>\n        [EnumMember(Value = \"Source\")]\n        Source,\n\n        /// <summary>\n        /// Server time\n        /// </summary>\n        [EnumMember(Value = \"Server\")]\n        Server,\n\n        /// <summary>\n        /// No timestamp\n        /// </summary>\n        [EnumMember(Value = \"None\")]\n        None\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/TypeDefinitionModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Type definition\n    /// </summary>\n    [DataContract]\n    public sealed record class TypeDefinitionModel\n    {\n        /// <summary>\n        /// The node id of the type of the node\n        /// </summary>\n        [DataMember(Name = \"typeDefinitionId\", Order = 0)]\n        [Required]\n        public required string TypeDefinitionId { get; set; }\n\n        /// <summary>\n        /// The type of the node\n        /// </summary>\n        [DataMember(Name = \"nodeType\", Order = 1)]\n        public NodeType NodeType { get; set; }\n\n        /// <summary>\n        /// Display name\n        /// </summary>\n        [DataMember(Name = \"displayName\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? DisplayName { get; set; }\n\n        /// <summary>\n        /// Browse name\n        /// </summary>\n        [DataMember(Name = \"browseName\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? BrowseName { get; set; }\n\n        /// <summary>\n        /// Description if any\n        /// </summary>\n        [DataMember(Name = \"description\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? Description { get; set; }\n\n        /// <summary>\n        /// Super types hierarchy starting from base type\n        /// up to <see cref=\"TypeDefinitionId\"/> which is\n        /// not included.\n        /// </summary>\n        [DataMember(Name = \"typeHierarchy\", Order = 5,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<NodeModel>? TypeHierarchy { get; set; }\n\n        /// <summary>\n        /// Fully inherited instance declarations of the type\n        /// of the node.\n        /// </summary>\n        [DataMember(Name = \"typeMembers\", Order = 6,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<InstanceDeclarationModel>? Declarations { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/UpdateEventsDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Insert, upsert or replace historic events\n    /// </summary>\n    [DataContract]\n    public sealed record class UpdateEventsDetailsModel\n    {\n        /// <summary>\n        /// The filter to use to select the events\n        /// </summary>\n        [DataMember(Name = \"filter\", Order = 0,\n            EmitDefaultValue = false)]\n        public EventFilterModel? Filter { get; set; }\n\n        /// <summary>\n        /// The new events to insert\n        /// </summary>\n        [DataMember(Name = \"events\", Order = 1)]\n        [Required]\n        public required IReadOnlyList<HistoricEventModel> Events { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/UpdateValuesDetailsModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Insert, upsert, or update historic values\n    /// </summary>\n    [DataContract]\n    public sealed record class UpdateValuesDetailsModel\n    {\n        /// <summary>\n        /// Values to insert\n        /// </summary>\n        [DataMember(Name = \"values\", Order = 0)]\n        [Required]\n        public required IReadOnlyList<HistoricValueModel> Values { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/UserIdentityModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// User identity model\n    /// </summary>\n    [DataContract]\n    public sealed record class UserIdentityModel\n    {\n        /// <summary>\n        /// <para>\n        /// For <see cref=\"CredentialType.UserName\"/> authentication\n        /// this is the name of the user.\n        /// </para>\n        /// <para>\n        /// For <see cref=\"CredentialType.X509Certificate\"/> authentication\n        /// this is the subject name of the certificate that has been\n        /// configured.\n        /// Either <see cref=\"User\"/> or <see cref=\"Thumbprint\"/> must be\n        /// used to select the certificate in the user certificate store.\n        /// </para>\n        /// <para>\n        /// Not used for the other authentication types.\n        /// </para>\n        /// </summary>\n        [DataMember(Name = \"user\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? User { get; set; }\n\n        /// <summary>\n        /// <para>\n        /// For <see cref=\"CredentialType.UserName\"/> authentication\n        /// this is the password of the user.\n        /// </para>\n        /// <para>\n        /// For <see cref=\"CredentialType.X509Certificate\"/> authentication\n        /// this is the passcode to export the configured certificate's\n        /// private key.\n        /// </para>\n        /// <para>\n        /// Not used for the other authentication types.\n        /// </para>\n        /// </summary>\n        [DataMember(Name = \"password\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? Password { get; set; }\n\n        /// <summary>\n        /// <para>\n        /// For <see cref=\"CredentialType.X509Certificate\"/> authentication\n        /// this is the thumbprint of the configured certificate to use.\n        /// Either <see cref=\"User\"/> or <see cref=\"Thumbprint\"/> must be\n        /// used to select the certificate in the user certificate store.\n        /// </para>\n        /// <para>\n        /// Not used for the other authentication types.\n        /// </para>\n        /// </summary>\n        [DataMember(Name = \"thumbprint\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? Thumbprint { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ValueReadRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request node value read\n    /// </summary>\n    [DataContract]\n    public sealed record class ValueReadRequestModel\n    {\n        /// <summary>\n        /// Node to read from (mandatory)\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// An optional path from NodeId instance to\n        /// an actual node.\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// Index range to read, e.g. 1:2,0:1 for 2 slices\n        /// out of a matrix or 0:1 for the first item in\n        /// an array, string or bytestring.\n        /// See 7.22 of part 4: NumericRange.\n        /// </summary>\n        [DataMember(Name = \"indexRange\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? IndexRange { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 3,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n\n        /// <summary>\n        /// Maximum age of the value to be read in milliseconds.\n        /// The age of the value is based on the difference\n        /// between the ServerTimestamp and the time when\n        /// the Server starts processing the request.\n        /// If not supplied, the Server shall attempt to read\n        /// a new value from the data source.\n        /// </summary>\n        [DataMember(Name = \"maxAge\", Order = 4,\n            EmitDefaultValue = false)]\n        public TimeSpan? MaxAge { get; set; }\n\n        /// <summary>\n        /// Decide what timestamps to return.\n        /// </summary>\n        [DataMember(Name = \"timestampsToReturn\", Order = 5,\n            EmitDefaultValue = false)]\n        public TimestampsToReturn? TimestampsToReturn { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ValueReadResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Value read response model\n    /// </summary>\n    [DataContract]\n    public sealed record class ValueReadResponseModel\n    {\n        /// <summary>\n        /// Value read\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 0,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public VariantValue? Value { get; set; }\n\n        /// <summary>\n        /// Built in data type of the value read.\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? DataType { get; set; }\n\n        /// <summary>\n        /// Pico seconds part of when value was read at source.\n        /// </summary>\n        [DataMember(Name = \"sourcePicoseconds\", Order = 2,\n            EmitDefaultValue = false)]\n        public ushort? SourcePicoseconds { get; set; }\n\n        /// <summary>\n        /// Timestamp of when value was read at source.\n        /// </summary>\n        [DataMember(Name = \"sourceTimestamp\", Order = 3,\n            EmitDefaultValue = false)]\n        public DateTime? SourceTimestamp { get; set; }\n\n        /// <summary>\n        /// Pico seconds part of when value was read at server.\n        /// </summary>\n        [DataMember(Name = \"serverPicoseconds\", Order = 4,\n            EmitDefaultValue = false)]\n        public ushort? ServerPicoseconds { get; set; }\n\n        /// <summary>\n        /// Timestamp of when value was read at server.\n        /// </summary>\n        [DataMember(Name = \"serverTimestamp\", Order = 5,\n            EmitDefaultValue = false)]\n        public DateTime? ServerTimestamp { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 6,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ValueWriteRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Value write request model\n    /// </summary>\n    [DataContract]\n    public sealed record class ValueWriteRequestModel\n    {\n        /// <summary>\n        /// Node id to write value to.\n        /// </summary>\n        [DataMember(Name = \"nodeId\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? NodeId { get; set; }\n\n        /// <summary>\n        /// An optional path from NodeId instance to\n        /// the actual node.\n        /// </summary>\n        [DataMember(Name = \"browsePath\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? BrowsePath { get; set; }\n\n        /// <summary>\n        /// Value to write. The system tries to convert\n        /// the value according to the data type value,\n        /// e.g. convert comma seperated value strings\n        /// into arrays.  (Mandatory)\n        /// </summary>\n        [DataMember(Name = \"value\", Order = 2)]\n        [SkipValidation]\n        public required VariantValue Value { get; set; }\n\n        /// <summary>\n        /// A built in datatype for the value. This can\n        /// be a data type from browse, or a built in\n        /// type.\n        /// (default: best effort)\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 3,\n            EmitDefaultValue = false)]\n        public string? DataType { get; set; }\n\n        /// <summary>\n        /// Index range to write\n        /// </summary>\n        [DataMember(Name = \"indexRange\", Order = 4,\n            EmitDefaultValue = false)]\n        public string? IndexRange { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 5,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/ValueWriteResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Value write response model\n    /// </summary>\n    [DataContract]\n    public sealed record class ValueWriteResponseModel\n    {\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 0,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/VariableMetadataModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Variable metadata model\n    /// </summary>\n    [DataContract]\n    public sealed record class VariableMetadataModel\n    {\n        /// <summary>\n        /// The data type for the variable.\n        /// </summary>\n        [DataMember(Name = \"dataType\", Order = 0,\n            EmitDefaultValue = false)]\n        public DataTypeMetadataModel? DataType { get; set; }\n\n        /// <summary>\n        /// The value rank of the variable.\n        /// </summary>\n        [DataMember(Name = \"valueRank\", Order = 1,\n            EmitDefaultValue = false)]\n        public NodeValueRank? ValueRank { get; set; }\n\n        /// <summary>\n        /// Array dimensions of the variable.\n        /// </summary>\n        [DataMember(Name = \"arrayDimensions\", Order = 2,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<uint>? ArrayDimensions { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/WriteRequestModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Request node attribute write\n    /// </summary>\n    [DataContract]\n    public sealed record class WriteRequestModel\n    {\n        /// <summary>\n        /// Attributes to update\n        /// </summary>\n        [DataMember(Name = \"attributes\", Order = 0)]\n        [Required]\n        public required IReadOnlyList<AttributeWriteRequestModel> Attributes { get; set; }\n\n        /// <summary>\n        /// Optional request header\n        /// </summary>\n        [DataMember(Name = \"header\", Order = 1,\n            EmitDefaultValue = false)]\n        public RequestHeaderModel? Header { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/WriteResponseModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Result of attribute write\n    /// </summary>\n    [DataContract]\n    public sealed record class WriteResponseModel\n    {\n        /// <summary>\n        /// All results of attribute writes\n        /// </summary>\n        [DataMember(Name = \"results\", Order = 0)]\n        public required IReadOnlyList<AttributeWriteResponseModel> Results { get; set; }\n\n        /// <summary>\n        /// Service result in case of error\n        /// </summary>\n        [DataMember(Name = \"errorInfo\", Order = 1,\n            EmitDefaultValue = false)]\n        public ServiceResultModel? ErrorInfo { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/WriterGroupDiagnosticModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Model for a diagnostic info.\n    /// </summary>\n    [DataContract]\n    public record class WriterGroupDiagnosticModel\n    {\n        /// <summary>\n        /// Publisher version string\n        /// </summary>\n        [DataMember(Name = \"PublisherVersion\", Order = 99,\n            EmitDefaultValue = true)]\n        public string? PublisherVersion { get; set; }\n\n        /// <summary>\n        /// Writer group name\n        /// </summary>\n        [DataMember(Name = \"WriterGroupName\", Order = 98,\n            EmitDefaultValue = true)]\n        public string? WriterGroupName { get; set; }\n\n        /// <summary>\n        /// Timestamp for this diagnostics information\n        /// </summary>\n        [DataMember(Name = \"Timestamp\", Order = 0,\n            EmitDefaultValue = true)]\n        public DateTimeOffset Timestamp { get; set; }\n\n        /// <summary>\n        /// Ingestion start\n        /// </summary>\n        [DataMember(Name = \"IngestionStart\", Order = 1,\n            EmitDefaultValue = true)]\n        public DateTimeOffset IngestionStart { get; set; }\n\n        /// <summary>\n        /// Ingestion duration\n        /// </summary>\n        [DataMember(Name = \"IngestionDuration\", Order = 2,\n            EmitDefaultValue = true)]\n        public TimeSpan IngestionDuration { get; set; }\n\n        /// <summary>\n        /// SentMessagesPerSec\n        /// </summary>\n        [DataMember(Name = \"SentMessagesPerSec\", Order = 3,\n            EmitDefaultValue = true)]\n        public double SentMessagesPerSec { get; set; }\n\n        /// <summary>\n        /// IngressDataChanges\n        /// </summary>\n        [DataMember(Name = \"IngressDataChanges\", Order = 4,\n            EmitDefaultValue = true)]\n        public long IngressDataChanges { get; set; }\n\n        /// <summary>\n        /// IngressValueChanges\n        /// </summary>\n        [DataMember(Name = \"IngressValueChanges\", Order = 5,\n            EmitDefaultValue = true)]\n        public long IngressValueChanges { get; set; }\n\n        /// <summary>\n        /// Number of heartbeats of the total values\n        /// </summary>\n        [DataMember(Name = \"IngressHeartbeats\", Order = 6,\n            EmitDefaultValue = true)]\n        public long IngressHeartbeats { get; set; }\n\n        /// <summary>\n        /// Number of cyclic reads of all sampled values\n        /// </summary>\n        [DataMember(Name = \"IngressCyclicReads\", Order = 7,\n            EmitDefaultValue = true)]\n        public long IngressCyclicReads { get; set; }\n\n        /// <summary>\n        /// Data changes received in the last minute\n        /// </summary>\n        [DataMember(Name = \"IngressDataChangesInLastMinute\", Order = 8,\n            EmitDefaultValue = true)]\n        public long IngressDataChangesInLastMinute { get; set; }\n\n        /// <summary>\n        /// Value changes received in the last minute\n        /// </summary>\n        [DataMember(Name = \"IngressValueChangesInLastMinute\", Order = 9,\n            EmitDefaultValue = true)]\n        public long IngressValueChangesInLastMinute { get; set; }\n\n        /// <summary>\n        /// IngressBatchBlockBufferSize\n        /// </summary>\n        [DataMember(Name = \"IngressBatchBlockBufferSize\", Order = 10,\n            EmitDefaultValue = true)]\n        public long IngressBatchBlockBufferSize { get; set; }\n\n        /// <summary>\n        /// EncodingBlockInputSize\n        /// </summary>\n        [DataMember(Name = \"EncodingBlockInputSize\", Order = 11,\n            EmitDefaultValue = true)]\n        public long EncodingBlockInputSize { get; set; }\n\n        /// <summary>\n        /// EncodingBlockOutputSize\n        /// </summary>\n        [DataMember(Name = \"EncodingBlockOutputSize\", Order = 12,\n            EmitDefaultValue = true)]\n        public long EncodingBlockOutputSize { get; set; }\n\n        /// <summary>\n        /// EncoderNotificationsProcessed\n        /// </summary>\n        [DataMember(Name = \"EncoderNotificationsProcessed\", Order = 13,\n            EmitDefaultValue = true)]\n        public long EncoderNotificationsProcessed { get; set; }\n\n        /// <summary>\n        /// EncoderNotificationsDropped\n        /// </summary>\n        [DataMember(Name = \"EncoderNotificationsDropped\", Order = 14,\n            EmitDefaultValue = true)]\n        public long EncoderNotificationsDropped { get; set; }\n\n        /// <summary>\n        /// EncoderIoTMessagesProcessed\n        /// </summary>\n        [DataMember(Name = \"EncoderIoTMessagesProcessed\", Order = 15,\n            EmitDefaultValue = true)]\n        public long EncoderIoTMessagesProcessed { get; set; }\n\n        /// <summary>\n        /// EncoderAvgNotificationsMessage\n        /// </summary>\n        [DataMember(Name = \"EncoderAvgNotificationsMessage\", Order = 16,\n            EmitDefaultValue = true)]\n        public double EncoderAvgNotificationsMessage { get; set; }\n\n        /// <summary>\n        /// EncoderAvgIoTMessageBodySize\n        /// </summary>\n        [DataMember(Name = \"EncoderAvgIoTMessageBodySize\", Order = 17,\n            EmitDefaultValue = true)]\n        public double EncoderAvgIoTMessageBodySize { get; set; }\n\n        /// <summary>\n        /// EncoderAvgIoTChunkUsage\n        /// </summary>\n        [DataMember(Name = \"EncoderAvgIoTChunkUsage\", Order = 18,\n            EmitDefaultValue = true)]\n        public double EncoderAvgIoTChunkUsage { get; set; }\n\n        /// <summary>\n        /// EstimatedIoTChunksPerDay\n        /// </summary>\n        [DataMember(Name = \"EstimatedIoTChunksPerDay\", Order = 19,\n            EmitDefaultValue = true)]\n        public double EstimatedIoTChunksPerDay { get; set; }\n\n        /// <summary>\n        /// OutgressInputBufferCount\n        /// </summary>\n        [DataMember(Name = \"OutgressInputBufferCount\", Order = 20,\n            EmitDefaultValue = true)]\n        public long OutgressInputBufferCount { get; set; }\n\n        /// <summary>\n        /// OutgressInputBufferDropped\n        /// </summary>\n        [DataMember(Name = \"OutgressInputBufferDropped\", Order = 21,\n            EmitDefaultValue = true)]\n        public long OutgressInputBufferDropped { get; set; }\n\n        /// <summary>\n        /// OutgressIoTMessageCount\n        /// </summary>\n        [DataMember(Name = \"OutgressIoTMessageCount\", Order = 22,\n            EmitDefaultValue = true)]\n        public long OutgressIoTMessageCount { get; set; }\n\n        /// <summary>\n        /// Connection Retries\n        /// </summary>\n        [DataMember(Name = \"ConnectionRetries\", Order = 23,\n            EmitDefaultValue = true)]\n        public long ConnectionRetries { get; set; }\n\n        /// <summary>\n        /// OpcEndpointConnected\n        /// </summary>\n        [DataMember(Name = \"OpcEndpointConnected\", Order = 24,\n            EmitDefaultValue = true)]\n        public bool OpcEndpointConnected { get; set; }\n\n        /// <summary>\n        /// MonitoredOpcNodesSucceededCount\n        /// </summary>\n        [DataMember(Name = \"MonitoredOpcNodesSucceededCount\", Order = 25,\n            EmitDefaultValue = true)]\n        public long MonitoredOpcNodesSucceededCount { get; set; }\n\n        /// <summary>\n        /// MonitoredOpcNodesFailedCount\n        /// </summary>\n        [DataMember(Name = \"MonitoredOpcNodesFailedCount\", Order = 26,\n            EmitDefaultValue = true)]\n        public long MonitoredOpcNodesFailedCount { get; set; }\n\n        /// <summary>\n        /// Number of incoming event notifications\n        /// </summary>\n        [DataMember(Name = \"IngressEventNotifications\", Order = 27,\n            EmitDefaultValue = true)]\n        public long IngressEventNotifications { get; set; }\n\n        /// <summary>\n        /// Total incoming events so far.\n        /// </summary>\n        [DataMember(Name = \"IngressEvents\", Order = 28,\n            EmitDefaultValue = true)]\n        public long IngressEvents { get; set; }\n\n        /// <summary>\n        /// Encoder max message split ratio\n        /// </summary>\n        [DataMember(Name = \"EncoderMaxMessageSplitRatio\", Order = 29,\n            EmitDefaultValue = true)]\n        public double EncoderMaxMessageSplitRatio { get; set; }\n\n        /// <summary>\n        /// Number of incoming keep alive notifications\n        /// </summary>\n        [DataMember(Name = \"IngressKeepAliveNotifications\", Order = 30,\n            EmitDefaultValue = true)]\n        public long IngressKeepAliveNotifications { get; set; }\n\n        /// <summary>\n        /// Number of endpoints connected\n        /// </summary>\n        [DataMember(Name = \"NumberOfConnectedEndpoints\", Order = 36,\n            EmitDefaultValue = true)]\n        public int NumberOfConnectedEndpoints { get; set; }\n\n        /// <summary>\n        /// Number of endpoints disconnected\n        /// </summary>\n        [DataMember(Name = \"NumberOfDisconnectedEndpoints\", Order = 37,\n            EmitDefaultValue = true)]\n        public int NumberOfDisconnectedEndpoints { get; set; }\n\n        /// <summary>\n        /// Number of model changes generated\n        /// </summary>\n        [DataMember(Name = \"IngressModelChanges\", Order = 39,\n            EmitDefaultValue = true)]\n        public long IngressModelChanges { get; set; }\n\n        /// <summary>\n        /// Events in the last minute\n        /// </summary>\n        [DataMember(Name = \"IngressEventsInLastMinute\", Order = 40,\n            EmitDefaultValue = true)]\n        public long IngressEventsInLastMinute { get; set; }\n\n        /// <summary>\n        /// Heartbeats in the last minute\n        /// </summary>\n        [DataMember(Name = \"IngressHeartbeatsInLastMinute\", Order = 41,\n            EmitDefaultValue = true)]\n        public long IngressHeartbeatsInLastMinute { get; set; }\n\n        /// <summary>\n        /// Cyclic reads last minute\n        /// </summary>\n        [DataMember(Name = \"IngressCyclicReadsInLastMinute\", Order = 42,\n            EmitDefaultValue = true)]\n        public long IngressCyclicReadsInLastMinute { get; set; }\n\n        /// <summary>\n        /// Number of model changes generated\n        /// </summary>\n        [DataMember(Name = \"IngressModelChangesInLastMinute\", Order = 43,\n            EmitDefaultValue = true)]\n        public long IngressModelChangesInLastMinute { get; set; }\n\n        /// <summary>\n        /// Event list notifications in the last minute\n        /// </summary>\n        [DataMember(Name = \"IngressEventNotificationsInLastMinute\", Order = 44,\n            EmitDefaultValue = true)]\n        public long IngressEventNotificationsInLastMinute { get; set; }\n\n        /// <summary>\n        /// Messages failed sending\n        /// </summary>\n        [DataMember(Name = \"OutgressIoTMessageFailedCount\", Order = 45,\n            EmitDefaultValue = true)]\n        public long OutgressIoTMessageFailedCount { get; set; }\n\n        /// <summary>\n        /// Total server queue overflows\n        /// </summary>\n        [DataMember(Name = \"ServerQueueOverflows\", Order = 46,\n            EmitDefaultValue = true)]\n        public long ServerQueueOverflows { get; set; }\n\n        /// <summary>\n        /// Queue server queue overflows in the last minute\n        /// </summary>\n        [DataMember(Name = \"ServerQueueOverflowsInLastMinute\", Order = 47,\n            EmitDefaultValue = true)]\n        public long ServerQueueOverflowsInLastMinute { get; set; }\n\n        /// <summary>\n        /// Sampled values in the completed cyclic reads\n        /// </summary>\n        [DataMember(Name = \"IngressSampledValues\", Order = 48,\n            EmitDefaultValue = true)]\n        public long IngressSampledValues { get; set; }\n\n        /// <summary>\n        /// Sampled values in the last minute\n        /// </summary>\n        [DataMember(Name = \"IngressSampledValuesInLastMinute\", Order = 49,\n            EmitDefaultValue = true)]\n        public long IngressSampledValuesInLastMinute { get; set; }\n\n        /// <summary>\n        /// Notifications dropped before pushing to publish queue\n        /// </summary>\n        [DataMember(Name = \"IngressNotificationsDropped\", Order = 50,\n            EmitDefaultValue = true)]\n        public long IngressNotificationsDropped { get; set; }\n\n        /// <summary>\n        /// Total partitions\n        /// </summary>\n        [DataMember(Name = \"TotalPublishQueuePartitions\", Order = 51,\n            EmitDefaultValue = true)]\n        public int TotalPublishQueuePartitions { get; set; }\n\n        /// <summary>\n        /// Active partitions\n        /// </summary>\n        [DataMember(Name = \"ActivePublishQueuePartitions\", Order = 52,\n            EmitDefaultValue = true)]\n        public int ActivePublishQueuePartitions { get; set; }\n\n        /// <summary>\n        /// Gets the CPU utilization percentage.\n        /// </summary>\n        [DataMember(Name = \"CpuUsedPercentage\", Order = 60,\n            EmitDefaultValue = true)]\n        public double CpuUsedPercentage { get; set; }\n\n        /// <summary>\n        /// Gets the CPU units available in the system.\n        /// </summary>\n        [DataMember(Name = \"GuaranteedCpuUnits\", Order = 61,\n            EmitDefaultValue = true)]\n        public double GuaranteedCpuUnits { get; set; }\n\n        /// <summary>\n        /// Gets the maximum CPU units available in the system.\n        /// </summary>\n        [DataMember(Name = \"MaximumCpuUnits\", Order = 62,\n            EmitDefaultValue = true)]\n        public double MaximumCpuUnits { get; set; }\n\n        /// <summary>\n        /// Gets the memory utilization percentage.\n        /// </summary>\n        [DataMember(Name = \"MemoryUsedPercentage\", Order = 63,\n            EmitDefaultValue = true)]\n        public double MemoryUsedPercentage { get; set; }\n\n        /// <summary>\n        /// Gets the memory used in bytes.\n        /// </summary>\n        [DataMember(Name = \"MemoryUsedInBytes\", Order = 64,\n            EmitDefaultValue = true)]\n        public ulong MemoryUsedInBytes { get; set; }\n\n        /// <summary>\n        /// Gets the memory allocated to the system in bytes.\n        /// </summary>\n        [DataMember(Name = \"GuaranteedMemoryInBytes\", Order = 65,\n            EmitDefaultValue = true)]\n        public ulong GuaranteedMemoryInBytes { get; set; }\n\n        /// <summary>\n        /// Gets the Request Memory Limit or the Maximum allocated for the VM.\n        /// </summary>\n        [DataMember(Name = \"MaximumMemoryInBytes\", Order = 66,\n            EmitDefaultValue = true)]\n        public ulong MaximumMemoryInBytes { get; set; }\n\n        /// <summary>\n        /// Nodes that are late reporting if watchdog is enabled\n        /// </summary>\n        [DataMember(Name = \"MonitoredOpcNodesLateCount\", Order = 67,\n            EmitDefaultValue = true)]\n        public long MonitoredOpcNodesLateCount { get; set; }\n\n        /// <summary>\n        /// Nodes with active heartbeat timer\n        /// </summary>\n        [DataMember(Name = \"ActiveHeartbeatCount\", Order = 68,\n            EmitDefaultValue = true)]\n        public long ActiveHeartbeatCount { get; set; }\n\n        /// <summary>\n        /// Nodes with active condition snapshot timer\n        /// </summary>\n        [DataMember(Name = \"ActiveConditionCount\", Order = 69,\n            EmitDefaultValue = true)]\n        public long ActiveConditionCount { get; set; }\n\n        /// <summary>\n        /// ConnectionCount\n        /// </summary>\n        [DataMember(Name = \"ConnectionCount\", Order = 70,\n            EmitDefaultValue = true)]\n        public long ConnectionCount { get; set; }\n\n        /// <summary>\n        /// Number of writers in the writer group\n        /// </summary>\n        [DataMember(Name = \"NumberOfWriters\", Order = 71,\n            EmitDefaultValue = true)]\n        public int NumberOfWriters { get; set; }\n\n        /// <summary>\n        /// Total Publish requests of all clients assigned to\n        /// the group.\n        /// </summary>\n        [DataMember(Name = \"TotalPublishRequests\", Order = 72,\n            EmitDefaultValue = true)]\n        public int TotalPublishRequests { get; set; }\n\n        /// <summary>\n        /// Total  Good publish requests of all clients assigned to\n        /// the group. They might not apply to the subscriptions\n        /// assigned to the group.\n        /// </summary>\n        [DataMember(Name = \"TotalGoodPublishRequests\", Order = 73,\n            EmitDefaultValue = true)]\n        public int TotalGoodPublishRequests { get; set; }\n\n        /// <summary>\n        /// Total bad publish requests of all clients assigned to\n        /// the group. They might not apply to the subscriptions\n        /// assigned to the group.\n        /// </summary>\n        [DataMember(Name = \"TotalBadPublishRequests\", Order = 74,\n            EmitDefaultValue = true)]\n        public int TotalBadPublishRequests { get; set; }\n\n        /// <summary>\n        /// Total min publish requests of all clients assigned to\n        /// the group.\n        /// </summary>\n        [DataMember(Name = \"TotalMinPublishRequests\", Order = 75,\n            EmitDefaultValue = true)]\n        public int TotalMinPublishRequests { get; set; }\n\n        /// <summary>\n        /// Total number of monitored nodes in the writer group.\n        /// </summary>\n        [DataMember(Name = \"MonitoredOpcNodesCount\", Order = 76,\n            EmitDefaultValue = true)]\n        public int MonitoredOpcNodesCount { get; set; }\n\n        /// <summary>\n        /// Container Cpu limit utilization\n        /// </summary>\n        [DataMember(Name = \"CpuLimitUtilization\", Order = 77,\n            EmitDefaultValue = true)]\n        public double CpuLimitUtilization { get; set; }\n\n        /// <summary>\n        /// Container Cpu request utilization\n        /// </summary>\n        [DataMember(Name = \"CpuRequestUtilization\", Order = 78,\n            EmitDefaultValue = true)]\n        public double CpuRequestUtilization { get; set; }\n\n        /// <summary>\n        /// Container memory limit utilization\n        /// </summary>\n        [DataMember(Name = \"MemoryLimitUtilization\", Order = 79,\n            EmitDefaultValue = true)]\n        public double MemoryLimitUtilization { get; set; }\n\n        /// <summary>\n        /// Connections currently reconnecting\n        /// </summary>\n        [DataMember(Name = \"ConnectionsReconnecting\", Order = 80,\n            EmitDefaultValue = true)]\n        public int ConnectionsReconnecting { get; set; }\n\n        /// <summary>\n        /// Successful connection keep alives since last reconnect\n        /// </summary>\n        [DataMember(Name = \"ConnectionKeepAlives\", Order = 81,\n            EmitDefaultValue = true)]\n        public long ConnectionKeepAlives { get; set; }\n\n        /// <summary>\n        /// Total keep alives over all connections\n        /// </summary>\n        [DataMember(Name = \"ConnectionKeepAlivesTotal\", Order = 82,\n            EmitDefaultValue = true)]\n        public long ConnectionKeepAlivesTotal { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/WriterGroupMessageSettingsModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Writer group message configuration\n    /// </summary>\n    [DataContract]\n    public sealed record class WriterGroupMessageSettingsModel\n    {\n        /// <summary>\n        /// Network message content\n        /// </summary>\n        [DataMember(Name = \"networkMessageContentMask\", Order = 0,\n            EmitDefaultValue = false)]\n        public NetworkMessageContentFlags? NetworkMessageContentMask { get; set; }\n\n        /// <summary>\n        /// Group version\n        /// </summary>\n        [DataMember(Name = \"groupVersion\", Order = 1,\n            EmitDefaultValue = false)]\n        public uint? GroupVersion { get; set; }\n\n        /// <summary>\n        /// Uadp dataset ordering\n        /// </summary>\n        [DataMember(Name = \"dataSetOrdering\", Order = 2,\n            EmitDefaultValue = false)]\n        public DataSetOrderingType? DataSetOrdering { get; set; }\n\n        /// <summary>\n        /// Uadp Sampling offset\n        /// </summary>\n        [DataMember(Name = \"samplingOffset\", Order = 3,\n            EmitDefaultValue = false)]\n        public double? SamplingOffset { get; set; }\n\n        /// <summary>\n        /// Publishing offset for uadp messages\n        /// </summary>\n        [DataMember(Name = \"publishingOffset\", Order = 4,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<double>? PublishingOffset { get; set; }\n\n        /// <summary>\n        /// Max messages per publish\n        /// </summary>\n        [DataMember(Name = \"maxDataSetMessagesPerPublish\", Order = 5,\n            EmitDefaultValue = false)]\n        public uint? MaxDataSetMessagesPerPublish { get; set; }\n\n        /// <summary>\n        /// Optional namespace format to use when serializing\n        /// nodes and qualified names in responses.\n        /// </summary>\n        [DataMember(Name = \"namespaceFormat\", Order = 6,\n            EmitDefaultValue = false)]\n        public NamespaceFormat? NamespaceFormat { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/WriterGroupModel.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Network message writer group model\n    /// </summary>\n    [DataContract]\n    public sealed record class WriterGroupModel\n    {\n        /// <summary>\n        /// Writer group identifier\n        /// </summary>\n        [DataMember(Name = \"id\", Order = 0)]\n        [Required]\n        public required string Id { get; set; }\n\n        /// <summary>\n        /// Network message types to generate\n        /// (publisher extension)\n        /// </summary>\n        [DataMember(Name = \"messageType\", Order = 1,\n            EmitDefaultValue = false)]\n        public MessageEncoding? MessageType { get; set; }\n\n        /// <summary>\n        /// The data set writers generating\n        /// dataset messages in the group\n        /// </summary>\n        [DataMember(Name = \"dataSetWriters\", Order = 2,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<DataSetWriterModel>? DataSetWriters { get; set; }\n\n        /// <summary>\n        /// Network message configuration\n        /// </summary>\n        [DataMember(Name = \"messageSettings\", Order = 3,\n            EmitDefaultValue = false)]\n        public WriterGroupMessageSettingsModel? MessageSettings { get; set; }\n\n        /// <summary>\n        /// Priority of the writer group\n        /// </summary>\n        [DataMember(Name = \"priority\", Order = 4,\n            EmitDefaultValue = false)]\n        public byte? Priority { get; set; }\n\n        /// <summary>\n        /// Name of the writer group\n        /// </summary>\n        [DataMember(Name = \"name\", Order = 5,\n            EmitDefaultValue = false)]\n        public string? Name { get; set; }\n\n        /// <summary>\n        /// Locales to use\n        /// </summary>\n        [DataMember(Name = \"localeIds\", Order = 6,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<string>? LocaleIds { get; set; }\n\n        /// <summary>\n        /// Header layout uri\n        /// </summary>\n        [DataMember(Name = \"headerLayoutUri\", Order = 7,\n            EmitDefaultValue = false)]\n        public string? HeaderLayoutUri { get; set; }\n\n        /// <summary>\n        /// Security mode\n        /// </summary>\n        [DataMember(Name = \"securityMode\", Order = 8,\n            EmitDefaultValue = false)]\n        public SecurityMode? SecurityMode { get; set; }\n\n        /// <summary>\n        /// Security group to use\n        /// </summary>\n        [DataMember(Name = \"securityGroupId\", Order = 9,\n            EmitDefaultValue = false)]\n        public string? SecurityGroupId { get; set; }\n\n        /// <summary>\n        /// Security key services to use\n        /// </summary>\n        [DataMember(Name = \"securityKeyServices\", Order = 10,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<ConnectionModel>? SecurityKeyServices { get; set; }\n\n        /// <summary>\n        /// Max network message size. The max size is limited\n        /// by the capabilities of the underlying event client\n        /// transport, e.g., 256k in the case of IoT Hub.\n        /// </summary>\n        [DataMember(Name = \"maxNetworkMessageSize\", Order = 11,\n            EmitDefaultValue = false)]\n        public uint? MaxNetworkMessageSize { get; set; }\n\n        /// <summary>\n        /// Publishing interval is the time to wait before\n        /// generating a network message from the queue of\n        /// collected notifications. The default is set to\n        /// the value of the BatchTriggerInterval option.\n        /// </summary>\n        [DataMember(Name = \"publishingInterval\", Order = 12,\n            EmitDefaultValue = false)]\n        public TimeSpan? PublishingInterval { get; set; }\n\n        /// <summary>\n        /// Keep alive time\n        /// </summary>\n        [DataMember(Name = \"keepAliveTime\", Order = 13,\n            EmitDefaultValue = false)]\n        public TimeSpan? KeepAliveTime { get; set; }\n\n        /// <summary>\n        /// Number of notifications to queue before sending a batch\n        /// (Publisher extension).\n        /// The default is set to the value of the BatchSize option.\n        /// </summary>\n        [DataMember(Name = \"notificationPublishThreshold\", Order = 14,\n            EmitDefaultValue = false)]\n        public uint? NotificationPublishThreshold { get; set; }\n\n        /// <summary>\n        /// Max publish queue size.\n        /// </summary>\n        [DataMember(Name = \"publishQueueSize\", Order = 15,\n            EmitDefaultValue = false)]\n        public uint? PublishQueueSize { get; set; }\n\n        /// <summary>\n        /// Desired Transport to use. If transport is not registered\n        /// the default (first) registered transport is used.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"transport\", Order = 16,\n            EmitDefaultValue = false)]\n        public WriterGroupTransport? Transport { get; set; }\n\n        /// <summary>\n        /// Queue settings to use for messages in the writer group.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"publishing\", Order = 17,\n            EmitDefaultValue = false)]\n        public PublishingQueueSettingsModel? Publishing { get; set; }\n\n        /// <summary>\n        /// Number of partitions to create of the publish queue.\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"publishQueuePartitions\", Order = 18,\n            EmitDefaultValue = false)]\n        public int? PublishQueuePartitions { get; set; }\n\n        /// <summary>\n        /// Root node of the writer group\n        /// </summary>\n        [DataMember(Name = \"rootNode\", Order = 19,\n            EmitDefaultValue = false)]\n        public string? RootNode { get; set; }\n\n        /// <summary>\n        /// Type of the writer group\n        /// </summary>\n        [DataMember(Name = \"type\", Order = 20,\n            EmitDefaultValue = false)]\n        public string? Type { get; set; }\n\n        /// <summary>\n        /// Writer group properties and attributes\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"properties\", Order = 21,\n            EmitDefaultValue = false)]\n        [SkipValidation]\n        public Dictionary<string, VariantValue>? Properties { get; set; }\n\n        /// <summary>\n        /// Publisher identifier if different from the global one\n        /// (Publisher extension)\n        /// </summary>\n        [DataMember(Name = \"publisherId\", Order = 22,\n            EmitDefaultValue = false)]\n        public string? PublisherId { get; set; }\n\n        /// <summary>\n        /// Writer group transport configuration (optional)\n        /// </summary>\n        [DataMember(Name = \"transportConfiguration\", Order = 23,\n            EmitDefaultValue = false)]\n        public string? TransportConfiguration { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/WriterGroupTransport.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Specifies the transport technology used to publish messages from OPC Publisher.\n    /// Each transport offers different capabilities for message delivery, routing,\n    /// and quality of service. The transport choice affects how messages are delivered\n    /// and what features are available.\n    /// </summary>\n    [DataContract]\n    public enum WriterGroupTransport\n    {\n        /// <summary>\n        /// Default transport using Azure IoT Hub or IoT Edge.\n        /// Provides secure, reliable message delivery to Azure cloud.\n        /// Supports message batching, compression, and QoS.\n        /// Message size limited to 256KB by IoT Hub.\n        /// </summary>\n        [EnumMember(Value = \"IoTHub\")]\n        IoTHub,\n\n        /// <summary>\n        /// Publish to any MQTT broker using MQTT v3.1.1 protocol.\n        /// Supports configurable topics and QoS levels.\n        /// Compatible with most MQTT brokers (Mosquitto, HiveMQ, etc.).\n        /// Good choice for local network publishing.\n        /// </summary>\n        [EnumMember(Value = \"Mqtt\")]\n        Mqtt,\n\n        /// <summary>\n        /// Direct publishing to Azure Event Hubs.\n        /// Designed for high-throughput data ingestion.\n        /// Supports partitioning for parallel processing.\n        /// Suitable for big data and analytics scenarios.\n        /// </summary>\n        [EnumMember(Value = \"EventHub\")]\n        EventHub,\n\n        /// <summary>\n        /// Publishing through Dapr pub/sub building block.\n        /// Provides transport abstraction and flexibility.\n        /// Supports multiple message brokers through components.\n        /// Ideal for cloud-native and microservices architectures.\n        /// </summary>\n        [EnumMember(Value = \"Dapr\")]\n        Dapr,\n\n        /// <summary>\n        /// Publish messages to HTTP endpoints (webhooks).\n        /// Supports configurable endpoints and authentication.\n        /// Messages sent as HTTP POST requests.\n        /// Useful for integration with web services and APIs.\n        /// </summary>\n        [EnumMember(Value = \"Http\")]\n        Http,\n\n        /// <summary>\n        /// Write messages to local or network file system.\n        /// Supports various file formats and patterns.\n        /// Useful for logging, debugging, or offline scenarios.\n        /// Can integrate with file-based processing systems.\n        /// </summary>\n        [EnumMember(Value = \"FileSystem\")]\n        FileSystem,\n\n        /// <summary>\n        /// Publish to Aio MQTT broker using MQTT v5 protocol.\n        /// </summary>\n        [EnumMember(Value = \"AioMqtt\")]\n        AioMqtt,\n\n        /// <summary>\n        /// Publish to Aio Distributed State store.\n        /// </summary>\n        [EnumMember(Value = \"AioDss\")]\n        AioDss,\n\n        /// <summary>\n        /// Messages are discarded without being published.\n        /// Used for testing or when only monitoring is needed.\n        /// No external dependencies or configuration required.\n        /// Minimal resource usage as messages are dropped.\n        /// </summary>\n        [EnumMember(Value = \"Null\")]\n        Null\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/X509CertificateChainModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Certificate chain\n    /// </summary>\n    [DataContract]\n    public sealed record class X509CertificateChainModel\n    {\n        /// <summary>\n        /// Chain\n        /// </summary>\n        [DataMember(Name = \"chain\", Order = 0,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<X509CertificateModel>? Chain { get; set; }\n\n        /// <summary>\n        /// Chain validation status if validated\n        /// </summary>\n        [DataMember(Name = \"status\", Order = 1,\n            EmitDefaultValue = false)]\n        public IReadOnlyList<X509ChainStatus>? Status { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/X509CertificateModel.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Certificate model\n    /// </summary>\n    [DataContract]\n    public sealed record class X509CertificateModel\n    {\n        /// <summary>\n        /// Subject\n        /// </summary>\n        [DataMember(Name = \"subject\", Order = 0,\n            EmitDefaultValue = false)]\n        public string? Subject { get; set; }\n\n        /// <summary>\n        /// Thumbprint\n        /// </summary>\n        [DataMember(Name = \"thumbprint\", Order = 1,\n            EmitDefaultValue = false)]\n        public string? Thumbprint { get; set; }\n\n        /// <summary>\n        /// Serial number\n        /// </summary>\n        [DataMember(Name = \"serialNumber\", Order = 2,\n            EmitDefaultValue = false)]\n        public string? SerialNumber { get; set; }\n\n        /// <summary>\n        /// Not before validity\n        /// </summary>\n        [DataMember(Name = \"notBeforeUtc\", Order = 3,\n            EmitDefaultValue = false)]\n        public DateTime? NotBeforeUtc { get; set; }\n\n        /// <summary>\n        /// Not after validity\n        /// </summary>\n        [DataMember(Name = \"notAfterUtc\", Order = 4,\n            EmitDefaultValue = false)]\n        public DateTime? NotAfterUtc { get; set; }\n\n        /// <summary>\n        /// Self signed certificate\n        /// </summary>\n        [DataMember(Name = \"selfSigned\", Order = 5,\n            EmitDefaultValue = false)]\n        public bool? SelfSigned { get; set; }\n\n        /// <summary>\n        /// Certificate as Pkcs12\n        /// </summary>\n        [DataMember(Name = \"pfx\", Order = 6)]\n        public IReadOnlyCollection<byte>? Pfx { get; set; }\n\n        /// <summary>\n        /// Contains private key\n        /// </summary>\n        [DataMember(Name = \"hasPrivateKey\", Order = 7,\n            EmitDefaultValue = false)]\n        public bool? HasPrivateKey { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/src/X509ChainStatus.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models\n{\n    using System;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Status of x509 chain\n    /// </summary>\n    [Flags]\n    [DataContract]\n    public enum X509ChainStatus\n    {\n        /// <summary>\n        /// Specifies that the X509 chain is not valid due to an invalid\n        /// time value, such as a value that indicates an expired certificate.\n        /// </summary>\n        [EnumMember(Value = \"NotTimeValid\")]\n        NotTimeValid = 0x1,\n\n        /// <summary>\n        /// Specifies that the X509 chain is invalid due to a revoked certificate.\n        /// </summary>\n        [EnumMember(Value = \"Revoked\")]\n        Revoked = 0x4,\n\n        /// <summary>\n        /// Specifies that the X509 chain is invalid due to an invalid\n        /// certificate signature.\n        /// </summary>\n        [EnumMember(Value = \"NotSignatureValid\")]\n        NotSignatureValid = 0x8,\n\n        /// <summary>\n        /// Specifies that the key usage is not valid.\n        /// </summary>\n        [EnumMember(Value = \"NotValidForUsage\")]\n        NotValidForUsage = 0x10,\n\n        /// <summary>\n        /// Specifies that the X509 chain is invalid due to an untrusted\n        /// root certificate.\n        /// </summary>\n        [EnumMember(Value = \"UntrustedRoot\")]\n        UntrustedRoot = 0x20,\n\n        /// <summary>\n        /// Specifies that it is not possible to determine whether the\n        /// certificate has been revoked. This can be due to the certificate\n        /// revocation list (CRL) being offline or unavailable.\n        /// </summary>\n        [EnumMember(Value = \"RevocationStatusUnknown\")]\n        RevocationStatusUnknown = 0x40,\n\n        /// <summary>\n        /// Specifies that the X509 chain could not be built.\n        /// </summary>\n        [EnumMember(Value = \"Cyclic\")]\n        Cyclic = 0x80,\n\n        /// <summary>\n        /// Specifies that the X509 chain is invalid due to an invalid\n        /// extension.\n        /// </summary>\n        [EnumMember(Value = \"InvalidExtension\")]\n        InvalidExtension = 0x100,\n\n        /// <summary>\n        /// Specifies that the X509 chain is invalid due to invalid\n        /// policy constraints.\n        /// </summary>\n        [EnumMember(Value = \"InvalidPolicyConstraints\")]\n        InvalidPolicyConstraints = 0x200,\n\n        /// <summary>\n        /// Specifies that the X509 chain is invalid due to invalid\n        /// basic constraints.\n        /// </summary>\n        [EnumMember(Value = \"InvalidBasicConstraints\")]\n        InvalidBasicConstraints = 0x400,\n\n        /// <summary>\n        /// Specifies that the X509 chain is invalid due to invalid\n        /// name constraints.\n        /// </summary>\n        [EnumMember(Value = \"InvalidNameConstraints\")]\n        InvalidNameConstraints = 0x800,\n\n        /// <summary>\n        /// Specifies that the certificate does not have a supported\n        /// name constraint or has a name constraint that is unsupported.\n        /// </summary>\n        [EnumMember(Value = \"HasNotSupportedNameConstraint\")]\n        HasNotSupportedNameConstraint = 0x1000,\n\n        /// <summary>\n        /// Specifies that the certificate has an undefined name constraint.\n        /// </summary>\n        [EnumMember(Value = \"HasNotDefinedNameConstraint\")]\n        HasNotDefinedNameConstraint = 0x2000,\n\n        /// <summary>\n        /// Specifies that the certificate has an impermissible name\n        /// constraint.\n        /// </summary>\n        [EnumMember(Value = \"HasNotPermittedNameConstraint\")]\n        HasNotPermittedNameConstraint = 0x4000,\n\n        /// <summary>\n        /// Specifies that the X509 chain is invalid because a certificate\n        /// has excluded a name constraint.\n        /// </summary>\n        [EnumMember(Value = \"HasExcludedNameConstraint\")]\n        HasExcludedNameConstraint = 0x8000,\n\n        /// <summary>\n        /// Specifies that the X509 chain could not be built up to the\n        /// root certificate.\n        /// </summary>\n        [EnumMember(Value = \"PartialChain\")]\n        PartialChain = 0x10000,\n\n        /// <summary>\n        /// Specifies that the trust list is not valid because of an invalid\n        /// time value, such as one that indicates that the CTL has expired.\n        /// </summary>\n        [EnumMember(Value = \"CtlNotTimeValid\")]\n        CtlNotTimeValid = 0x20000,\n\n        /// <summary>\n        /// Specifies that the trust list contains an invalid signature.\n        /// </summary>\n        [EnumMember(Value = \"CtlNotSignatureValid\")]\n        CtlNotSignatureValid = 0x40000,\n\n        /// <summary>\n        /// Specifies that the trust list is not valid for this use.\n        /// </summary>\n        [EnumMember(Value = \"CtlNotValidForUsage\")]\n        CtlNotValidForUsage = 0x80000,\n\n        /// <summary>\n        /// Specifies that the certificate has not been strong signed.\n        /// </summary>\n        [EnumMember(Value = \"HasWeakSignature\")]\n        HasWeakSignature = 0x100000,\n\n        /// <summary>\n        /// Specifies that the online certificate revocation list\n        /// the X509 chain relies on is currently offline.\n        /// </summary>\n        [EnumMember(Value = \"OfflineRevocation\")]\n        OfflineRevocation = 0x1000000,\n\n        /// <summary>\n        /// Specifies that there is no certificate policy extension in\n        /// the certificate.\n        /// </summary>\n        [EnumMember(Value = \"NoIssuanceChainPolicy\")]\n        NoIssuanceChainPolicy = 0x2000000,\n\n        /// <summary>\n        /// Specifies that the certificate is explicitly distrusted.\n        /// </summary>\n        [EnumMember(Value = \"ExplicitDistrust\")]\n        ExplicitDistrust = 0x4000000,\n\n        /// <summary>\n        /// Specifies that the certificate does not support a critical\n        /// extension.\n        /// </summary>\n        [EnumMember(Value = \"HasNotSupportedCriticalExtension\")]\n        HasNotSupportedCriticalExtension = 0x8000000\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/tests/Azure.IIoT.OpcUa.Publisher.Models.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ParallelAlgorithm>aggressive</ParallelAlgorithm>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"AutoFixture\" Version=\"4.18.1\" />\n    <PackageReference Include=\"FluentAssertions\" Version=\"[7.2.0]\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.0\" />\n    <PackageReference Include=\"coverlet.msbuild\" Version=\"6.0.4\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"System.Net.Http\" Version=\"4.3.4\" />\n    <PackageReference Include=\"System.Text.RegularExpressions\" Version=\"4.3.1\" />\n    <PackageReference Include=\"xunit\" Version=\"2.9.3\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"3.1.5\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"Furly.Extensions.Json\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Extensions.MessagePack\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Extensions.Newtonsoft\" Version=\"1.1.54\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\Azure.IIoT.OpcUa.Publisher.Models.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Service Include=\"{82a7f48d-3b50-4b1e-b82e-3ada8210c358}\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/tests/Fixtures/TypeFixture.cs",
    "content": "﻿//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Reflection;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Helper\n    /// </summary>\n    public static class TypeFixture\n    {\n        public static IEnumerable<object[]> GetDataContractTypes()\n        {\n            return GetAllModelTypes<BrowseDirection>()\n                .Distinct()\n                .Select(t => new object[] { t });\n        }\n\n        public static IEnumerable<Type> GetAllModelTypes<T>()\n        {\n            return typeof(T).Assembly.GetExportedTypes()\n                .Where(t => t.GetCustomAttribute<DataContractAttribute>() != null\n                    && t.GetGenericArguments().Length == 0);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/tests/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage\n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given\n// a specific target and scoped to a namespace, type, member, etc.\n\nusing System.Diagnostics.CodeAnalysis;\n\n[assembly: SuppressMessage(\"Reliability\", \"CA2007:Consider calling ConfigureAwait on the awaited task\", Justification = \"xunit\")]\n[assembly: SuppressMessage(\"Usage\", \"xUnit1042:The member referenced by the MemberData attribute returns untyped data rows\", Justification = \"xunit\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/tests/JsonSerializerTests.cs",
    "content": "﻿//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models.Tests\n{\n    using AutoFixture;\n    using AutoFixture.Kernel;\n    using FluentAssertions;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text.Json;\n    using Xunit;\n\n    public class JsonSerializerTests\n    {\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeScalarTypeToBuffer(Type type)\n        {\n            var instance = Activator.CreateInstance(type);\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, type);\n            var result = _serializer.Deserialize(buffer.ToArray(), type);\n\n            result.Should().BeEquivalentTo(instance);\n        }\n\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeScalarTypeToString(Type type)\n        {\n            var instance = Activator.CreateInstance(type);\n\n            var str = _serializer.SerializeObjectToString(instance);\n            var result = _serializer.Deserialize(str, type);\n\n            result.Should().BeEquivalentTo(instance);\n            var expectedString = JsonSerializer.Serialize(instance, _serializer.Settings);\n            str.Should().Be(expectedString);\n        }\n\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeScalarTypeToBufferWithFixture(Type type)\n        {\n            var fixture = new Fixture();\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlySet<>), typeof(HashSet<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyList<>), typeof(List<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyDictionary<,>), typeof(Dictionary<,>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyCollection<>), typeof(List<>)));\n            fixture.Behaviors\n                .OfType<ThrowingRecursionBehavior>()\n                .ToList()\n                .ForEach(b => fixture.Behaviors.Remove(b));\n            fixture.Behaviors.Add(new OmitOnRecursionBehavior(recursionDepth: 2));\n            // Create some random variant value\n            fixture.Register(() => _serializer.FromObject(Activator.CreateInstance(type)));\n            // Ensure utc datetimes\n            fixture.Register(() => DateTimeOffset.UtcNow);\n            fixture.Register(() => DateTime.UtcNow);\n            var instance = new SpecimenContext(fixture).Resolve(new SeededRequest(type, null));\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, type);\n            var result = _serializer.Deserialize(buffer.ToArray(), type);\n\n            result.Should().BeEquivalentTo(instance, options => options.AllowingInfiniteRecursion());\n        }\n\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeArrayTypeToBufferWithFixture(Type type)\n        {\n            var fixture = new Fixture { RepeatCount = 2 };\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlySet<>), typeof(HashSet<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyList<>), typeof(List<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyDictionary<,>), typeof(Dictionary<,>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyCollection<>), typeof(List<>)));\n            fixture.Behaviors\n                .OfType<ThrowingRecursionBehavior>()\n                .ToList()\n                .ForEach(b => fixture.Behaviors.Remove(b));\n            fixture.Behaviors.Add(new OmitOnRecursionBehavior(recursionDepth: 2));\n            // Create some random variant value\n            fixture.Register(() => _serializer.FromObject(Activator.CreateInstance(type)));\n            // Ensure utc datetimes\n            fixture.Register(() => DateTimeOffset.UtcNow);\n            fixture.Register(() => DateTime.UtcNow);\n            var builder = new SpecimenContext(fixture);\n            var instance = ((IEnumerable)builder.Resolve(\n                new MultipleRequest(new SeededRequest(type, null)))).Cast<object>().ToArray();\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, instance.GetType());\n            var result = _serializer.Deserialize(buffer.ToArray(), type.MakeArrayType());\n\n            result.Should().BeEquivalentTo(instance, options => options.AllowingInfiniteRecursion());\n        }\n\n        private readonly DefaultJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/tests/MsgPackSerializerTests.cs",
    "content": "﻿//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models.Tests\n{\n    using AutoFixture;\n    using AutoFixture.Kernel;\n    using FluentAssertions;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.MessagePack;\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Xunit;\n\n    public class MsgPackSerializerTests\n    {\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeScalarTypeToBuffer(Type type)\n        {\n            var instance = Activator.CreateInstance(type);\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, type);\n            var result = _serializer.Deserialize(buffer.ToArray(), type);\n\n            result.Should().BeEquivalentTo(instance);\n        }\n\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeScalarTypeToBufferWithFixture(Type type)\n        {\n            var fixture = new Fixture();\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlySet<>), typeof(HashSet<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyList<>), typeof(List<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyDictionary<,>), typeof(Dictionary<,>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyCollection<>), typeof(List<>)));\n            fixture.Behaviors\n                .OfType<ThrowingRecursionBehavior>()\n                .ToList()\n                .ForEach(b => fixture.Behaviors.Remove(b));\n            fixture.Behaviors.Add(new OmitOnRecursionBehavior(recursionDepth: 2));\n            // Create some random variant value\n            fixture.Register(() => _serializer.FromObject(Activator.CreateInstance(type)));\n            // Ensure utc datetimes\n            fixture.Register(() => DateTimeOffset.UtcNow);\n            fixture.Register(() => DateTime.UtcNow);\n            var instance = new SpecimenContext(fixture).Resolve(new SeededRequest(type, null));\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, type);\n            var result = _serializer.Deserialize(buffer.ToArray(), type);\n\n            result.Should().BeEquivalentTo(instance, options => options.AllowingInfiniteRecursion());\n        }\n\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeArrayTypeToBufferWithFixture(Type type)\n        {\n            var fixture = new Fixture();\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlySet<>), typeof(HashSet<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyList<>), typeof(List<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyDictionary<,>), typeof(Dictionary<,>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyCollection<>), typeof(List<>)));\n            fixture.Behaviors\n                .OfType<ThrowingRecursionBehavior>()\n                .ToList()\n                .ForEach(b => fixture.Behaviors.Remove(b));\n            fixture.Behaviors.Add(new OmitOnRecursionBehavior(recursionDepth: 2));\n            // Create some random variant value\n            fixture.Register(() => _serializer.FromObject(Activator.CreateInstance(type)));\n            // Ensure utc datetimes\n            fixture.Register(() => DateTimeOffset.UtcNow);\n            fixture.Register(() => DateTime.UtcNow);\n            var builder = new SpecimenContext(fixture);\n            var instance = ((IEnumerable)builder.Resolve(\n                new MultipleRequest(new SeededRequest(type, null)))).Cast<object>().ToArray();\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, instance.GetType());\n            var result = _serializer.Deserialize(buffer.ToArray(), type.MakeArrayType());\n\n            result.Should().BeEquivalentTo(instance, options => options.AllowingInfiniteRecursion());\n        }\n\n        private readonly MessagePackSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/tests/NewtonsoftSerializerTests.cs",
    "content": "﻿//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models.Tests\n{\n    using AutoFixture;\n    using AutoFixture.Kernel;\n    using FluentAssertions;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Newtonsoft.Json;\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Xunit;\n\n    public class NewtonsoftSerializerTests\n    {\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeScalarTypeToBuffer(Type type)\n        {\n            var instance = Activator.CreateInstance(type);\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, type);\n            var result = _serializer.Deserialize(buffer.ToArray(), type);\n\n            result.Should().BeEquivalentTo(instance);\n        }\n\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeScalarTypeToString(Type type)\n        {\n            var instance = Activator.CreateInstance(type);\n\n            var str = _serializer.SerializeObjectToString(instance, type);\n            var result = _serializer.Deserialize(str, type);\n\n            result.Should().BeEquivalentTo(instance);\n            var expectedString = JsonConvert.SerializeObject(instance, _serializer.Settings);\n            str.Should().Be(expectedString);\n        }\n\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeScalarTypeToBufferWithFixture(Type type)\n        {\n            var fixture = new Fixture();\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlySet<>), typeof(HashSet<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyList<>), typeof(List<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyDictionary<,>), typeof(Dictionary<,>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyCollection<>), typeof(List<>)));\n            fixture.Behaviors\n                .OfType<ThrowingRecursionBehavior>()\n                .ToList()\n                .ForEach(b => fixture.Behaviors.Remove(b));\n            fixture.Behaviors.Add(new OmitOnRecursionBehavior(recursionDepth: 2));\n            // Create some random variant value\n            fixture.Register(() => _serializer.FromObject(Activator.CreateInstance(type)));\n            // Ensure utc datetimes\n            fixture.Register(() => DateTimeOffset.UtcNow);\n            fixture.Register(() => DateTime.UtcNow);\n            var instance = new SpecimenContext(fixture).Resolve(new SeededRequest(type, null));\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, type);\n            var result = _serializer.Deserialize(buffer.ToArray(), type);\n\n            result.Should().BeEquivalentTo(instance, options => options.AllowingInfiniteRecursion());\n        }\n\n        [Theory]\n        [MemberData(nameof(TypeFixture.GetDataContractTypes), MemberType = typeof(TypeFixture))]\n        public void SerializerDeserializeArrayTypeToBufferWithFixture(Type type)\n        {\n            var fixture = new Fixture { RepeatCount = 2 };\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlySet<>), typeof(HashSet<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyList<>), typeof(List<>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyDictionary<,>), typeof(Dictionary<,>)));\n            fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyCollection<>), typeof(List<>)));\n            fixture.Behaviors\n                .OfType<ThrowingRecursionBehavior>()\n                .ToList()\n                .ForEach(b => fixture.Behaviors.Remove(b));\n            fixture.Behaviors.Add(new OmitOnRecursionBehavior(recursionDepth: 2));\n            // Create some random variant value\n            fixture.Register(() => _serializer.FromObject(Activator.CreateInstance(type)));\n            // Ensure utc datetimes\n            fixture.Register(() => DateTimeOffset.UtcNow);\n            fixture.Register(() => DateTime.UtcNow);\n            var builder = new SpecimenContext(fixture);\n            var instance = ((IEnumerable)builder.Resolve(\n                new MultipleRequest(new SeededRequest(type, null)))).Cast<object>().ToArray();\n\n            var buffer = _serializer.SerializeObjectToMemory(instance, instance.GetType());\n            var result = _serializer.Deserialize(buffer.ToArray(), type.MakeArrayType());\n\n            result.Should().BeEquivalentTo(instance, options => options.AllowingInfiniteRecursion());\n        }\n\n        private readonly NewtonsoftJsonSerializer _serializer = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Models/tests/PublishNodesEndpointApiModelTests.cs",
    "content": "//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Models.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using System;\n    using Xunit;\n\n    public class PublishedNodesEntryModelTests\n    {\n        [Fact]\n        public void UseSecurityDeserializationTest()\n        {\n            var newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n\n            var modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"NodeId\": {\n        \"Identifier\": \"ns=0;i=2261\"\n    }\n}\n\n\"\"\";\n            var model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.Null(model.UseSecurity);\n\n            modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"UseSecurity\": false,\n    \"NodeId\": {\n        \"Identifier\": \"ns=0;i=2261\"\n    }\n}\n\n\"\"\";\n\n            model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.False(model.UseSecurity);\n\n            modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"UseSecurity\": true,\n    \"NodeId\": {\n        \"Identifier\": \"ns=0;i=2261\"\n    }\n}\n\n\"\"\";\n\n            model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.True(model.UseSecurity);\n        }\n\n        [Fact]\n        public void UseSecuritySerializationTest()\n        {\n            var newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n\n            var model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            var modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.DoesNotContain(\"\\\"UseSecurity\\\":false\", modeJson, StringComparison.Ordinal);\n\n            model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                UseSecurity = false,\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"UseSecurity\\\":false\", modeJson, StringComparison.Ordinal);\n\n            model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                UseSecurity = true,\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"UseSecurity\\\":true\", modeJson, StringComparison.Ordinal);\n        }\n\n        [Fact]\n        public void OpcAuthenticationModeDeserializationTest()\n        {\n            var newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n\n            var modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            var model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.Equal(OpcAuthenticationMode.Anonymous, model.OpcAuthenticationMode);\n\n            modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"OpcAuthenticationMode\": \"anonymous\",\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.Equal(OpcAuthenticationMode.Anonymous, model.OpcAuthenticationMode);\n\n            modelJson = \"\"\"\n\n{\n    \"EndpointUrl\": \"opc.tcp://localhost:50002\",\n    \"OpcAuthenticationMode\": \"usernamePassword\",\n    \"OpcNodes\": [\n        { \"Identifier\": \"ns=0;i=2261\" }\n    ]\n}\n\n\"\"\";\n\n            model = newtonSoftJsonSerializer.Deserialize<PublishedNodesEntryModel>(modelJson);\n            Assert.Equal(OpcAuthenticationMode.UsernamePassword, model.OpcAuthenticationMode);\n        }\n\n        [Fact]\n        public void OpcAuthenticationModeSerializationTest()\n        {\n            var newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n\n            var model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            var modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"OpcAuthenticationMode\\\":\\\"Anonymous\\\"\", modeJson, StringComparison.Ordinal);\n\n            model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                OpcAuthenticationMode = OpcAuthenticationMode.Anonymous,\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"OpcAuthenticationMode\\\":\\\"Anonymous\\\"\", modeJson, StringComparison.Ordinal);\n\n            model = new PublishedNodesEntryModel\n            {\n                EndpointUrl = \"opc.tcp://localhost:50000\",\n                OpcAuthenticationMode = OpcAuthenticationMode.UsernamePassword,\n                OpcNodes = [\n                    new() {\n                        Id = \"i=2258\"\n                    }\n                ]\n            };\n\n            modeJson = newtonSoftJsonSerializer.SerializeToString(model);\n            Assert.Contains(\"\\\"OpcAuthenticationMode\\\":\\\"UsernamePassword\\\"\", modeJson, StringComparison.Ordinal);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Azure.IIoT.OpcUa.Publisher.Module.Cli.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ServerGarbageCollection>true</ServerGarbageCollection>\n    <Nullable>enable</Nullable>\n    <TieredPGO>true</TieredPGO>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Furly.Azure.IoT\" Version=\"1.1.54\" />\n    <PackageReference Include=\"System.IO.FileSystem\" Version=\"4.3.0\" />\n    <PackageReference Include=\"System.Net.Primitives\" Version=\"4.3.1\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa.Publisher.Testing\\src\\Azure.IIoT.OpcUa.Publisher.Testing.Servers.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\Azure.IIoT.OpcUa.Publisher.Module.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Profiles\\*.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"Initfiles\\*.init\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"publishednodes.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Initfiles/Kepserver.init",
    "content": "###\n// @delay 5\n// @retries 3\nExpandAndCreateOrUpdateDataSetWriterEntries_V2\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"opc.tcp://DESKTOP-BGFJS91:50001\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"Simulation\",\n        \"OpcNodes\": [\n            { \"Id\": \"ns=2;s=Sim.CH1\" }\n        ]\n    },\n    \"request\": {\n        \"maxLevelsToExpand\": 1,\n        \"createSingleWriter\": true\n    }\n}\n\n###\n# @on-error\nShutdown_V2\n\ntrue\n###\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Initfiles/MachineTools.init",
    "content": "﻿###\n\n// 3 retries in case of failure, with a delay of 5 seconds between\n// @delay 5\n// @retries 3\n\n// Creates writer entries for all objects that implement the\n// machine tool object type or one of its subtypes on the\n// umati reference server\nExpandAndCreateOrUpdateDataSetWriterEntries_V2\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"opc.tcp://opcua.umati.app:4840\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"MachineTools\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/MachineTool/;i=13\" }\n        ]\n    },\n    \"request\": {\n        \"flattenTypeInstance\": true\n    }\n}\n\n###\n\n// Shutdown the publisher in case the expansion failed\n// and let docker restart it. The Fail fast argument\n// provided as json payload.\n# @on-error\nShutdown_V2\n\ntrue\n\n###"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Initfiles/Machinery.init",
    "content": "﻿###\n// @delay 5\nExpandAndCreateOrUpdateDataSetWriterEntries\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"opc.tcp://opcua.umati.app:4840\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"Machinery Objects\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Machinery/;i=1001\" }\n        ]\n    },\n    \"request\": {\n        \"flattenTypeInstance\": true\n    }\n}\n\n// @retries 3\n###\nShutdown\n// @on-error\n###\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Initfiles/Objects.init",
    "content": "###\n// @delay 5\n// @retries 3\nExpandAndCreateOrUpdateDataSetWriterEntries_V2\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"Objects\",\n        \"OpcNodes\": [\n            { \"Id\": \"i=85\" }\n        ]\n    }\n}\n\n###\n# @on-error\nShutdown_V2\n\ntrue\n###\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Initfiles/Variables.init",
    "content": "###\n// @delay 5\n// @retries 3\nExpandAndCreateOrUpdateDataSetWriterEntries_V2\n\n{\n    \"entry\": {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"Variables\",\n        \"OpcNodes\": [\n            { \"Id\": \"i=85\" }\n        ]\n    },\n    \"request\": {\n        \"createSingleWriter\": true,\n        \"maxDepth\": 10,\n        \"discardErrors\": true\n    }\n}\n\n###\n# @on-error\nShutdown_V2\n\ntrue\n###\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/AllBad.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"MessagingMode\": \"PubSub\",\n        \"DataSetPublishingInterval\": 100,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=0;s=unknown1\",\n                \"OpcSamplingInterval\": 100,\n                \"FetchDisplayName\": true\n            },\n            {\n                \"Id\": \"ns=0;s=unknown2\",\n                \"OpcSamplingInterval\": 100\n            },\n            {\n                \"Id\": \"ns=0;s=unknown3\",\n                \"OpcSamplingInterval\": 100\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/BrowsePath.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"BrowsePath\": [\n                    \"Objects\",\n                    \"Server\",\n                    \"ServerStatus\",\n                    \"CurrentTime\"\n                ],\n                \"DisplayName\": \"ServerTime\"\n            },\n            {\n                \"BrowsePath\": [\n                    \"Objects\",\n                    \"Server\",\n                    \"ServerStatus\",\n                    \"State\"\n                ],\n                \"DisplayName\": \"ServerState\"\n            },\n            {\n                \"BrowsePath\": [\n                    \"Objects\",\n                    \"17:OpcPlc\",\n                    \"17:Telemetry\",\n                    \"17:Fast\",\n                    \"17:FastUIntScalar1\"\n                ],\n                \"DisplayName\": \"FastUIntScalar1\"\n            },\n            {\n                \"BrowsePath\": [\n                    \"Objects\",\n                    \"nsu=http://opcfoundation.org/UA/Plc/Applications;OpcPlc\",\n                    \"nsu=http://opcfoundation.org/UA/Plc/Applications;Telemetry\",\n                    \"nsu=http://opcfoundation.org/UA/Plc/Applications;Fast\",\n                    \"nsu=http://opcfoundation.org/UA/Plc/Applications;FastUIntScalar2\"\n                ],\n                \"DisplayName\": \"FastUIntScalar2\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/CyclicReads.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\",\n                \"UseCyclicRead\": true\n            },\n            {\n                \"Id\": \"ns=24;i=1259\",\n                \"UseCyclicRead\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/DataItems.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"EndpointSecurityMode\": \"Sign\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=24;i=1259\",\n                \"OpcSamplingInterval\": 2000,\n                \"OpcPublishingInterval\": 2000,\n                \"DisplayName\": \"Output\",\n                \"SkipFirst\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/DataSetTopics.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Status\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc;s=Plc\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Items/Produced\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Items/Routing\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Random/SignedInt32\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Random/UnsignedInt32\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Health\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Fast/UInt/Scalar1\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Fast/UInt/Scalar2\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Fast/UInt/Scalar3\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Fast/Random/UInt/Scalar1\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Fast/Random/UInt/Scalar2\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Fast/Random/UInt/Scalar3\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Trend\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Trend\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Slow/UInt/Scalar1\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Slow/UInt/Scalar2\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Slow/UInt/Scalar3\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Slow/UInt/Scalar1/Bad\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Slow/UInt/Scalar1/Random\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Slow/UInt/Scalar2/Random\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Slow/UInt/Scalar3/Random\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Slow/UInt/Scalar1/Random/Bad\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"QueueName\": \"{RootTopic}/{DataSetWriterName}/Health\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/Deadband.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"EndpointSecurityMode\": \"SignAndEncrypt\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"http://test.org/UA/Data/#i=11224\",\n                \"OpcSamplingInterval\": 1000,\n                \"OpcPublishingInterval\": 1000,\n                \"QueueSize\": 10,\n                \"DeadbandType\": \"Absolute\",\n                \"DeadbandValue\": 5.0,\n                \"DisplayName\": \"DoubleValues\"\n            },\n            {\n                \"Id\": \"http://test.org/UA/Data/#i=11206\",\n                \"OpcSamplingInterval\": 1000,\n                \"OpcPublishingInterval\": 1000,\n                \"QueueSize\": 10,\n                \"DeadbandType\": \"Percent\",\n                \"DeadbandValue\": 5.0,\n                \"DisplayName\": \"Int64Values\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/Empty.json",
    "content": "﻿[\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/Extremes.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=504fb315-75db-ef6e-2650-7c499743800a\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=LongString10kB\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=LongString50kB\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=LongString100kB\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=LongString200kB\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadFastUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadFastRandomUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=Special_\\u0022!\\u00A7$%\\u0026/()=?\\u0060\\u00B4\\\\\\u002B~*\\u0027#_-:.;,\\u003C\\u003E|@^\\u00B0\\u20AC\\u00B5{[]}\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/FastTime.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"DataSetPublishingInterval\": 10,\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=24;i=1259\",\n                \"OpcSamplingInterval\": 10,\n                \"QueueSize\": 10\n            },\n            {\n                \"Id\": \"i=2258\",\n                \"OpcSamplingInterval\": 10,\n                \"QueueSize\": 10\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/FixedAndData.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"i=2258\" },\n            { \"Id\": \"i=2271\" },\n            { \"Id\": \"i=2254\" },\n            { \"Id\": \"i=2255\" },\n            { \"Id\": \"i=11702\" },\n            { \"Id\": \"i=11703\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/Fixedvalue.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"i=2271\" },\n            { \"Id\": \"i=2254\" },\n            { \"Id\": \"i=2255\" },\n            { \"Id\": \"i=11702\" },\n            { \"Id\": \"i=11703\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/Heartbeat.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=24;i=1259\",\n                \"OpcPublishingInterval\": 20000,\n                \"HeartbeatInterval\": 20,\n                \"DisplayName\": \"Output\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/Heartbeat2.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\",\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 60000,\n                \"HeartbeatInterval\": 60\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/Heartbeat3.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"DefaultHeartbeatInterval\": 60000,\n        \"DataSetPublishingInterval\": 1000,\n        \"DataSetSamplingInterval\": 1000,\n        \"DataSetFetchDisplayNames\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/Isa95Jobs.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"Isa95JobResponseData\",\n                \"QueueSize\": 10,\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"nsu=http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/;i=1006\"\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/KeepAlive.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"SendKeepAliveDataSetMessages\": true,\n        \"MessagingMode\": \"PubSub\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2259\",\n                \"FetchDisplayName\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/KeyFrames.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"MessagingMode\": \"PubSub\",\n        \"DataSetExtensionFields\": {\n            \"EngineeringUnits\": \"mm/sec\",\n            \"AssetId\": 5,\n            \"Important\": false,\n            \"Variance\": 12.3465\n        },\n        \"DataSetKeyFrameCount\": 10,\n        \"DataSetPublishingInterval\": 100,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"OpcSamplingInterval\": 100,\n                \"FetchDisplayName\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/ModelChanges.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"EndpointSecurityMode\": \"SignAndEncrypt\",\n        \"OpcNodes\": [\n            {\n                \"ModelChangeHandling\": {\n                    \"RebrowsePeriod\": \"00:00:10\"\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/MultiDataSetWriter.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc;s=Plc\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Assembly\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterId\": \"Packaging\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/MultiEndpoint.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc;s=Plc\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/MultiWriterGroup.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc;s=Plc\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/MultiWriterGroupFs.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc;s=Plc\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"MES\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"MES\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Test\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Test\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Assembly1\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Assembly1\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\" }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Assembly2\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Assembly2\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Assembly2\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Assembly\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Assembly2\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Packaging1\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Packaging1\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Packaging1\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Packaging1\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetWriterGroup\": \"Packaging\",\n        \"WriterGroupTransport\": \"FileSystem\",\n        \"WriterGroupTransportConfiguration\": \"Packaging2\",\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/NoNodes.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"EndpointSecurityMode\": \"Sign\",\n        \"OpcNodes\": []\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/PendingAlarms.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"DisplayName\": \"PendingAlarms\",\n                \"Id\": \"i=2253\",\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"i=2041\"\n                },\n                \"ConditionHandling\": {\n                    \"UpdateInterval\": 10,\n                    \"SnapshotInterval\": 20\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/PlcSimulation.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc;s=Plc\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\" },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"OpcPublishingInterval\": 10000\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"OpcPublishingInterval\": 10000\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"OpcPublishingInterval\": 10000\n            },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/RegisteredRead.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=24;i=1259\",\n                \"OpcSamplingInterval\": 500,\n                \"FetchDisplayName\": true,\n                \"RegisterNode\": true,\n                \"UseCyclicRead\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/SimpleEvents.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"SimpleEvents\",\n                \"QueueSize\": 10,\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Message\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CycleId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CurrentStep\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=16;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/SlowSample.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"DataSetFetchDisplayNames\": true,\n        \"DataSetSamplingInterval\": 30000,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/SomeBad.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"MessagingMode\": \"PubSub\",\n        \"DataSetPublishingInterval\": 100,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=24;i=1259\",\n                \"OpcSamplingInterval\": 1000,\n                \"FetchDisplayName\": true\n            },\n            {\n                \"Id\": \"ns=0;s=unknown2\",\n                \"OpcSamplingInterval\": 100\n            },\n            {\n                \"Id\": \"ns=0;s=unknown3\",\n                \"OpcSamplingInterval\": 100\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/SubscribeErrors.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\" },\n            { \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=RandomSignedInt32\" },\n            { \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DoesNotExist\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/TopicPerNode.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"MessagingMode\": \"RawDataSets\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\",\n                \"Topic\": \"{RootTopic}/StepUp\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\",\n                \"Topic\": \"{RootTopic}/AlternatingBoolean\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\",\n                \"Topic\": \"{RootTopic}/Random/Int/Scalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\",\n                \"Topic\": \"{RootTopic}/Random/UInt/Scalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\",\n                \"Topic\": \"{RootTopic}/DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\",\n                \"Topic\": \"{RootTopic}/Fast/UInt/Scalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\",\n                \"Topic\": \"{RootTopic}/Fast/UInt/Scalar2\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\",\n                \"Topic\": \"{RootTopic}/Fast/UInt/Scalar3\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\",\n                \"Topic\": \"{RootTopic}/Fast/UInt/Scalar1/Random\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\",\n                \"Topic\": \"{RootTopic}/Fast/UInt/Scalar2/Random\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\",\n                \"Topic\": \"{RootTopic}/Fast/UInt/Scalar3/Random\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\",\n                \"Topic\": \"{RootTopic}/TrendData/Negative\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\",\n                \"Topic\": \"{RootTopic}/TrendData/Positive\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\",\n                \"Topic\": \"{RootTopic}/Slow/UInt/Scalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\",\n                \"Topic\": \"{RootTopic}/Slow/UInt/Scalar2\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\",\n                \"Topic\": \"{RootTopic}/Slow/UInt/Scalar3\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\",\n                \"Topic\": \"{RootTopic}/Slow/UInt/Scalar1/Bad\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\",\n                \"Topic\": \"{RootTopic}/Slow/UInt/Scalar1/Random\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\",\n                \"Topic\": \"{RootTopic}/Slow/UInt/Scalar2/Random\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\",\n                \"Topic\": \"{RootTopic}/Slow/UInt/Scalar3/Random\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\",\n                \"Topic\": \"{RootTopic}/Slow/UInt/Scalar1/Random/Bad\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\",\n                \"Topic\": \"{RootTopic}/SpikeData\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Profiles/UnifiedNamespace.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": true,\n        \"MessagingMode\": \"SingleRawDataSet\",\n        \"DataSetRouting\": \"UseBrowseNames\",\n        \"OpcNodes\": [\n            {\n                \"ModelChangeHandling\": {\n                    \"RebrowsePeriod\": \"00:00:10\"\n                }\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=StepUp\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=AlternatingBoolean\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomUnsignedInt32\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=DipData\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar2\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastUIntScalar3\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar2\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=FastRandomUIntScalar3\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=NegativeTrendData\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=PositiveTrendData\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar2\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowUIntScalar3\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowUIntScalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar2\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SlowRandomUIntScalar3\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=BadSlowRandomUIntScalar1\"\n            },\n            {\n                \"Id\": \"nsu=http://opcfoundation.org/UA/Plc/Applications;s=SpikeData\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Program.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Runtime\n{\n    using Autofac;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Sample;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using Furly.Azure;\n    using Furly.Azure.IoT;\n    using Furly.Azure.IoT.Models;\n    using Furly.Exceptions;\n    using Furly.Extensions.Logging;\n    using Furly.Extensions.Serializers;\n    using Microsoft.AspNetCore.Hosting.Server;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Nito.AsyncEx;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Net;\n    using System.Text.RegularExpressions;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Publisher module host process\n    /// </summary>\n    public static class Program\n    {\n        /// <summary>\n        /// Entry point\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public static void Main(string[] args)\n        {\n            var checkTrust = false;\n            var withServer = false;\n            string? deviceId = null, moduleId = null;\n            int? reverseConnectPort = null;\n\n            var loggerFactory = Log.ConsoleFactory();\n            var logger = loggerFactory.CreateLogger<PublisherModule>();\n\n            logger.PublisherModuleInit();\n            var instances = 1;\n            string? connectionString = null;\n            string? publishProfile = null;\n            string? publishInitProfile = null;\n            string? publishInitFilePath = null;\n            string? publishedNodesFilePath = null;\n            var useNullTransport = false;\n            string? dumpMessages = null;\n            string? dumpMessagesOutput = null;\n            var scaleunits = 0u;\n            var errorResponseRate = 0;\n            var unknownArgs = new List<string>();\n            try\n            {\n                for (var i = 0; i < args.Length; i++)\n                {\n                    switch (args[i])\n                    {\n                        case \"--error-rate\":\n                            i++;\n                            if (i < args.Length && int.TryParse(args[i], out var rate))\n                            {\n                                errorResponseRate = rate;\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --error-rate\");\n                        case \"--dump-profiles\":\n                            Console.WriteLine();\n                            Console.WriteLine();\n                            Console.WriteLine(\"The following messaging profiles are supported (selected with --mm and --me):\");\n                            Console.WriteLine();\n                            Console.Write(MessagingProfile.GetAllAsMarkdownTable());\n                            return;\n                        case \"-C\":\n                        case \"--connection-string\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                connectionString = args[i];\n                                break;\n                            }\n                            throw new ArgumentException(\n                                \"Missing argument for --connection-string\");\n                        case \"-?\":\n                        case \"-h\":\n                        case \"--help\":\n                            throw new ArgumentException(\"Help\");\n                        case \"-N\":\n                        case \"--instances\":\n                            i++;\n                            if (i < args.Length && int.TryParse(args[i], out instances))\n                            {\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --instances\");\n                        case \"-U\":\n                        case \"--scale\":\n                            i++;\n                            if (i < args.Length && uint.TryParse(args[i], out scaleunits))\n                            {\n                                withServer = true;\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --scale\");\n                        case \"--reverse-connect\":\n                            reverseConnectPort = 4840;\n                            break;\n                        case \"--port\":\n                            i++;\n                            if (i < args.Length && int.TryParse(args[i], out var port))\n                            {\n                                reverseConnectPort = port;\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --port\");\n                        case \"-T\":\n                        case \"--only-trusted\":\n                            checkTrust = true;\n                            break;\n                        case \"-X\":\n                        case \"--out-null\":\n                            useNullTransport = true;\n                            break;\n                        case \"-S\":\n                        case \"--with-server\":\n                            withServer = true;\n                            break;\n                        case \"-D\":\n                        case \"--dump-messages\":\n                            i++;\n                            useNullTransport = true;\n                            if (i < args.Length)\n                            {\n                                dumpMessages = args[i];\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --dump-messages\");\n                        case \"-O\":\n                        case \"--dump-output\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                dumpMessagesOutput = args[i];\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --dump-output\");\n                        case \"-P\":\n                        case \"--publish-profile\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                publishProfile = args[i];\n                                withServer = true;\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --publish-profile\");\n                        case \"-I\":\n                        case \"--init-profile\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                publishInitProfile = args[i];\n                                withServer = true;\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --init-profile\");\n                        case \"--pnjson\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                publishedNodesFilePath = args[i];\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --pnjson\");\n                        case \"--init\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                publishInitFilePath = args[i];\n                                break;\n                            }\n                            throw new ArgumentException(\"Missing argument for --init\");\n                        case \"--\":\n                            break;\n                        default:\n                            unknownArgs.Add(args[i]);\n                            break;\n                    }\n                }\n\n                if (string.IsNullOrEmpty(connectionString) && !useNullTransport)\n                {\n                    try\n                    {\n                        var configuration = new ConfigurationBuilder()\n                            .AddFromDotEnvFile()\n                            .AddEnvironmentVariables()\n                            .Build();\n                        connectionString = configuration.GetValue(\"PCS_IOTHUB_CONNSTRING\", string.Empty);\n                        if (string.IsNullOrEmpty(connectionString))\n                        {\n                            connectionString = configuration.GetValue(\"_HUB_CS\", string.Empty);\n                        }\n                        if (!string.IsNullOrEmpty(connectionString) &&\n                            !ConnectionString.TryParse(connectionString, out _))\n                        {\n                            throw new ArgumentException(\"Bad connection string configured.\");\n                        }\n                    }\n                    catch (Exception e)\n                    {\n                        logger.MissingConnectionString(e.Message);\n                    }\n                }\n\n                deviceId = Dns.GetHostName().ToUpperInvariant();\n                logger.UsingDeviceId(deviceId);\n                moduleId = \"publisher\";\n                logger.UsingModuleId(moduleId);\n\n                args = [.. unknownArgs];\n            }\n            catch (Exception e)\n            {\n                Console.Error.WriteLine(\n                    $@\"{e.Message}\n\nUsage:       Azure.IIoT.OpcUa.Publisher.Module.Cli [options]\n\nOptions:\n     -C\n    --connection-string\n             IoT Hub owner connection string to use to connect to IoT hub for\n             operations on the registry.  If not provided, read from environment.\n\n    --help\n     -?\n     -h      Prints out this help.\n\");\n                return;\n            }\n\n            AppDomain.CurrentDomain.UnhandledException +=\n                (s, e) => logger.UnhandledException(e.ExceptionObject as Exception);\n\n            using var cts = new CancellationTokenSource();\n            Task hostingTask;\n            try\n            {\n                if (dumpMessages != null)\n                {\n                    hostingTask = DumpMessagesAsync(dumpMessages, publishProfile, publishInitProfile,\n                        loggerFactory, TimeSpan.FromMinutes(2), scaleunits, errorResponseRate,\n                        dumpMessagesOutput, args, cts.Token);\n                }\n                else if (!withServer)\n                {\n                    if (publishInitFilePath != null && !File.Exists(publishInitFilePath))\n                    {\n                        publishInitFilePath = $\"./Initfiles/{publishInitFilePath}.init\";\n                        if (File.Exists(publishInitFilePath))\n                        {\n                            const string copyTo = \"profile.init\";\n                            File.Copy(publishInitFilePath, copyTo, true);\n                            File.SetLastWriteTimeUtc(copyTo, DateTime.UtcNow);\n                            publishInitFilePath = copyTo;\n                        }\n                        else\n                        {\n                            publishInitFilePath = null;\n                        }\n                    }\n                    hostingTask = HostAsync(connectionString, loggerFactory,\n                        deviceId, moduleId, args, reverseConnectPort, !checkTrust,\n                        publishInitFilePath, publishedNodesFilePath, cts.Token);\n                }\n                else\n                {\n                    hostingTask = WithServerAsync(connectionString, loggerFactory, deviceId,\n                        moduleId, args, publishProfile, publishInitProfile, scaleunits,\n                        errorResponseRate, !checkTrust, reverseConnectPort, cts.Token);\n                }\n\n                while (!cts.Token.IsCancellationRequested)\n                {\n                    var key = Console.ReadKey();\n                    switch (key.KeyChar)\n                    {\n                        case 'X':\n                        case 'x':\n                            Console.WriteLine(\"Exiting...\");\n                            cts.Cancel();\n                            break;\n                        case 'P':\n                        case 'p':\n                            Console.WriteLine(\"Restarting publisher...\");\n                            kRestartPublisher.Set();\n                            break;\n                        case 'S':\n                        case 's':\n                            Console.WriteLine(\"Restarting server...\");\n                            kRestartServer.Set();\n                            break;\n                        case 'C':\n                            Console.WriteLine(\"Closing sessions and subscriptions in server\");\n                            ServerControl?.CloseSessions(true);\n                            break;\n                        case 'c':\n                            Console.WriteLine(\"Closing sessions in server\");\n                            ServerControl?.CloseSessions(false);\n                            break;\n                        case 'D':\n                        case 'd':\n                            Console.WriteLine(\"Closing subscriptions in server\");\n                            ServerControl?.CloseSubscriptions();\n                            break;\n                        case '!':\n                            var control = ServerControl;\n                            if (control != null)\n                            {\n                                Console.WriteLine(\"Chaos !!!!!!!!!!!!!...\");\n                                control.Chaos = !control.Chaos;\n                            }\n                            break;\n                    }\n                }\n\n                // Wait for hosting task to exit\n                hostingTask.GetAwaiter().GetResult();\n            }\n            catch (Exception e)\n            {\n                logger.UnhandledException(e);\n            }\n        }\n\n        private static readonly AsyncAutoResetEvent kRestartServer = new(false);\n        private static readonly AsyncAutoResetEvent kRestartPublisher = new(false);\n\n        private static ITestServer? ServerControl { get; set; }\n\n        /// <summary>\n        /// Host the module with connection string loaded from iot hub\n        /// </summary>\n        /// <param name=\"connectionString\"></param>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"deviceId\"></param>\n        /// <param name=\"moduleId\"></param>\n        /// <param name=\"args\"></param>\n        /// <param name=\"reverseConnectPort\"></param>\n        /// <param name=\"acceptAll\"></param>\n        /// <param name=\"publishInitFile\"></param>\n        /// <param name=\"publishedNodesFilePath\"></param>\n        /// <param name=\"ct\"></param>\n        private static async Task HostAsync(string? connectionString, ILoggerFactory loggerFactory,\n            string deviceId, string moduleId, string[] args, int? reverseConnectPort,\n            bool acceptAll, string? publishInitFile, string? publishedNodesFilePath = null,\n            CancellationToken ct = default)\n        {\n            var logger = loggerFactory.CreateLogger<PublisherModule>();\n            logger.ConnectionStringStart(deviceId, moduleId);\n\n            ConnectionString? cs = null;\n            if (connectionString != null)\n            {\n                while (true)\n                {\n                    try\n                    {\n                        cs = await AddOrGetAsync(connectionString, deviceId, moduleId,\n                            logger).ConfigureAwait(false);\n\n                        logger.ConnectionStringRetrieved(deviceId, moduleId);\n                        break;\n                    }\n                    catch (Exception ex)\n                    {\n                        logger.ConnectionStringFailed(ex, deviceId, moduleId);\n                    }\n                }\n            }\n\n            while (!ct.IsCancellationRequested)\n            {\n                using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);\n\n                var running = RunAsync(logger, deviceId, moduleId, args, acceptAll, cs,\n                    reverseConnectPort, publishedNodesFilePath, publishInitFile, cts.Token);\n\n                Console.WriteLine(\"Publisher running (Press P to restart)...\");\n                await kRestartPublisher.WaitAsync(ct).ConfigureAwait(false);\n                try\n                {\n                    await cts.CancelAsync().ConfigureAwait(false);\n                    await running.ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) { }\n            }\n\n            static async Task RunAsync(ILogger logger, string deviceId, string moduleId, string[] args,\n                bool acceptAll, ConnectionString? cs, int? reverseConnectPort, string? publishedNodesFilePath,\n                string? publishInitFile, CancellationToken ct)\n            {\n                logger.PublisherModuleStarting(deviceId, moduleId);\n                var arguments = args.ToList();\n                if (publishedNodesFilePath == null)\n                {\n                    publishedNodesFilePath = \"profile.json\";\n                    await CopyProfileToPnJsonAsync(\"Empty\", publishedNodesFilePath, null, ct).ConfigureAwait(false);\n                }\n\n                arguments.Add($\"--pf={publishedNodesFilePath}\");\n\n                if (publishInitFile != null)\n                {\n                    arguments.Add($\"--pi={publishInitFile}\");\n                }\n                if (!args.Any(a => a.StartsWith(\"-t=\", StringComparison.OrdinalIgnoreCase)))\n                {\n                    if (cs != null)\n                    {\n                        arguments.Add($\"--ec={cs}\");\n                    }\n                    else\n                    {\n                        arguments.Add(\"-t=Null\");\n                    }\n                }\n                arguments.Add(\"--cl=5\"); // enable 5 second client linger\n                if (acceptAll)\n                {\n                    // Accept all certificates\n                    arguments.Add(\"--aa\");\n                }\n                if (reverseConnectPort != null)\n                {\n                    // Since we started the server with reverse connect\n                    // default the profile to use reverse connect\n                    arguments.Add(\"--urc\");\n                }\n                await Publisher.Module.Program.RunAsync([.. arguments], ct).ConfigureAwait(false);\n                logger.PublisherModuleExited(deviceId, moduleId);\n            }\n        }\n\n        /// <summary>\n        /// setup publishing from sample server\n        /// </summary>\n        /// <param name=\"connectionString\"></param>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"deviceId\"></param>\n        /// <param name=\"moduleId\"></param>\n        /// <param name=\"args\"></param>\n        /// <param name=\"publishProfile\"></param>\n        /// <param name=\"publishInitProfile\"></param>\n        /// <param name=\"scaleunits\"></param>\n        /// <param name=\"errorRate\"></param>\n        /// <param name=\"acceptAll\"></param>\n        /// <param name=\"reverseConnectPort\"></param>\n        /// <param name=\"ct\"></param>\n        private static async Task WithServerAsync(string? connectionString, ILoggerFactory loggerFactory,\n            string deviceId, string moduleId, string[] args, string? publishProfile, string? publishInitProfile,\n            uint scaleunits, int errorRate, bool acceptAll, int? reverseConnectPort, CancellationToken ct)\n        {\n            try\n            {\n                using var server = new ServerWrapper(scaleunits, errorRate, loggerFactory, reverseConnectPort);\n                // Start test server\n                var endpointUrl = $\"opc.tcp://localhost:{server.Port}/UA/SampleServer\";\n\n                var publishInitFile = await LoadInitFileAsync(publishInitProfile, endpointUrl,\n                    ct).ConfigureAwait(false);\n\n                if (publishInitFile != null && publishProfile == null)\n                {\n                    publishProfile = \"Empty\";\n                }\n\n                var publishedNodesFilePath = await LoadPnJsonAsync(server, publishProfile,\n                    endpointUrl, ct).ConfigureAwait(false);\n\n                // Start publisher module\n                await HostAsync(connectionString, loggerFactory, deviceId, moduleId,\n                    args, reverseConnectPort, acceptAll, publishInitFile, publishedNodesFilePath,\n                    ct).ConfigureAwait(false);\n            }\n            catch (OperationCanceledException) { }\n        }\n\n        /// <summary>\n        /// Dump messages\n        /// </summary>\n        /// <param name=\"messageMode\"></param>\n        /// <param name=\"publishProfile\"></param>\n        /// <param name=\"publishInitProfile\"></param>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"duration\"></param>\n        /// <param name=\"scaleunits\"></param>\n        /// <param name=\"errorRate\"></param>\n        /// <param name=\"dumpMessagesOutput\"></param>\n        /// <param name=\"args\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        private static async Task DumpMessagesAsync(string messageMode, string? publishProfile,\n            string? publishInitProfile, ILoggerFactory loggerFactory, TimeSpan duration,\n            uint scaleunits, int errorRate, string? dumpMessagesOutput, string[] args, CancellationToken ct)\n        {\n            try\n            {\n                // Dump one message encoding at a time\n                var rootFolder = Path.Combine(dumpMessagesOutput ?? \".\", \"dump\");\n                foreach (var messageProfile in MessagingProfile.Supported)\n                {\n                    if (messageProfile.MessageEncoding.HasFlag(MessageEncoding.IsGzipCompressed))\n                    {\n                        // No need to dump gzip\n                        continue;\n                    }\n\n                    if (messageMode != \"all\" &&\n                        !messageProfile.MessagingMode.ToString().Equals(\n                            messageMode, StringComparison.OrdinalIgnoreCase) &&\n                        !messageProfile.MessageEncoding.ToString().Equals(\n                            messageMode, StringComparison.OrdinalIgnoreCase))\n                    {\n                        Console.WriteLine($\"Skipping {messageProfile}...\");\n                        continue;\n                    }\n\n                    var outputFolder = Path.Combine(rootFolder, messageProfile.MessagingMode.ToString(),\n                        messageProfile.MessageEncoding.ToString());\n                    if (Directory.Exists(outputFolder) && Directory.EnumerateFiles(outputFolder).Any())\n                    {\n                        continue;\n                    }\n                    Directory.CreateDirectory(outputFolder);\n                    await DumpPublishingProfiles(outputFolder, messageProfile, publishProfile,\n                        publishInitProfile).ConfigureAwait(false);\n                }\n            }\n            catch (OperationCanceledException) { }\n\n            // Dump message profile for all publishing profiles\n            async Task DumpPublishingProfiles(string rootFolder, MessagingProfile messageProfile,\n                string? profile, string? publishInitProfile)\n            {\n                if (publishInitProfile != null)\n                {\n                    var outputFolder = Path.Combine(rootFolder, publishInitProfile);\n\n                    await DumpMessagesForDuration(outputFolder, \"Empty\", messageProfile,\n                        publishInitProfile, args).ConfigureAwait(false);\n\n                    return;\n                }\n\n                foreach (var publishProfile in Directory.EnumerateFiles(\"./Profiles\", \"*.json\"))\n                {\n                    var publishProfileName = Path.GetFileNameWithoutExtension(publishProfile);\n                    if (profile == null &&\n                       (publishProfileName.StartsWith(\"Unified\", StringComparison.OrdinalIgnoreCase) ||\n                        publishProfileName.StartsWith(\"Empty\", StringComparison.OrdinalIgnoreCase) ||\n                        publishProfileName.StartsWith(\"NoNodes\", StringComparison.OrdinalIgnoreCase)))\n                    {\n                        continue;\n                    }\n                    if (profile != null && !publishProfileName.Equals(profile, StringComparison.OrdinalIgnoreCase))\n                    {\n                        continue;\n                    }\n                    var logger = loggerFactory.CreateLogger(publishProfileName);\n                    var outputFolder = Path.Combine(rootFolder, publishProfileName);\n                    if (Directory.Exists(outputFolder) && Directory.EnumerateFiles(outputFolder).Any())\n                    {\n                        continue;\n                    }\n                    Directory.CreateDirectory(outputFolder);\n                    await DumpMessagesForDuration(outputFolder, publishProfile, messageProfile,\n                        null, args).ConfigureAwait(false);\n                }\n            }\n\n            async Task DumpMessagesForDuration(string outputFolder, string publishProfile,\n                MessagingProfile messageProfile, string? publishInitProfile, string[] args)\n            {\n                using var runtime = new CancellationTokenSource(duration);\n                try\n                {\n                    using var linkedToken = CancellationTokenSource.CreateLinkedTokenSource(\n                        ct, runtime.Token);\n                    var name = Path.GetFileNameWithoutExtension(publishProfile);\n                    Console.Title = $\"Dumping {messageProfile} for {name}...\";\n                    await RunAsync(loggerFactory, publishProfile, messageProfile,\n                        outputFolder, scaleunits, errorRate, args, publishInitProfile, linkedToken.Token).ConfigureAwait(false);\n                }\n                catch (OperationCanceledException) when (runtime.IsCancellationRequested) { }\n            }\n\n            static async Task RunAsync(ILoggerFactory loggerFactory, string publishProfile,\n                MessagingProfile messageProfile, string outputFolder, uint scaleunits, int errorRate, string[] args,\n                string? publishInitProfile, CancellationToken ct)\n            {\n                // Start test server\n                using var server = new ServerWrapper(scaleunits, errorRate, loggerFactory, null);\n                var name = Path.GetFileNameWithoutExtension(publishProfile);\n                var endpointUrl = $\"opc.tcp://localhost:{server.Port}/UA/SampleServer\";\n\n                var publishedNodesFilePath = await LoadPnJsonAsync(server, name, endpointUrl,\n                    ct).ConfigureAwait(false);\n                if (publishedNodesFilePath == null)\n                {\n                    return;\n                }\n\n                var initProfile = Path.GetFileNameWithoutExtension(publishInitProfile);\n                var publishInitFile = await LoadInitFileAsync(initProfile, endpointUrl, ct).ConfigureAwait(false);\n\n                //\n                // Check whether the profile overrides the messaging mode, then set it to the desired\n                // one regardless of whether it will work or not\n                //\n                var check = await File.ReadAllTextAsync(publishedNodesFilePath, ct).ConfigureAwait(false);\n                if (check.Contains(\"\\\"MessagingMode\\\":\", StringComparison.InvariantCulture) &&\n                    !check.Contains($\"\\\"MessagingMode\\\": \\\"{messageProfile.MessagingMode}\\\"\",\n                    StringComparison.InvariantCulture))\n                {\n                    check = ReplacePropertyValue(check, \"MessagingMode\", messageProfile.MessagingMode.ToString());\n                    await File.WriteAllTextAsync(publishedNodesFilePath, check, ct).ConfigureAwait(false);\n                }\n\n                var arguments = new HashSet<string>\n                    {\n                        \"-c\",\n                        \"--ps\",\n                        $\"--pf={publishedNodesFilePath}\",\n                        $\"--me={messageProfile.MessageEncoding}\",\n                        $\"--mm={messageProfile.MessagingMode}\",\n                        $\"--ttt={name}/{{WriterGroup}}\",\n                        $\"--mdt={name}/{{WriterGroup}}\",\n                        \"-t=FileSystem\",\n                        $\"-o={outputFolder}\",\n                        \"--aa\"\n                    };\n                if (publishInitFile != null)\n                {\n                    arguments.Add($\"--pi={publishInitFile}\");\n                }\n                args.ForEach(a => arguments.Add(a));\n                await Publisher.Module.Program.RunAsync([.. arguments], ct).ConfigureAwait(false);\n            }\n        }\n\n        private static async Task<string?> LoadPnJsonAsync(ServerWrapper server, string? publishProfile,\n            string? endpointUrl, CancellationToken ct)\n        {\n            const string publishedNodesFilePath = \"profile.json\";\n            if (!string.IsNullOrEmpty(publishProfile))\n            {\n                await CopyProfileToPnJsonAsync(publishProfile, publishedNodesFilePath, endpointUrl, ct).ConfigureAwait(false);\n                return publishedNodesFilePath;\n            }\n\n            var testServer = await server.Server.Task.ConfigureAwait(false);\n            if (testServer?.PublishedNodesJson != null && endpointUrl != null)\n            {\n                var json = testServer.PublishedNodesJson.Replace(\"{{EndpointUrl}}\",\n                    endpointUrl, StringComparison.Ordinal);\n\n                // var entries = JsonSerializer.Deserialize<PublishedNodesEntryModel[]>(server.PublishedNodesJson);\n\n                await File.WriteAllTextAsync(publishedNodesFilePath, json, ct).ConfigureAwait(false);\n                return publishedNodesFilePath;\n            }\n            return null;\n        }\n\n        private static async Task CopyProfileToPnJsonAsync(string publishProfile, string publishedNodesFilePath,\n            string? endpointUrl, CancellationToken ct)\n        {\n            var publishedNodesFile = $\"./Profiles/{publishProfile}.json\";\n            if (!File.Exists(publishedNodesFile))\n            {\n                throw new ArgumentException($\"Profile {publishProfile} does not exist\");\n            }\n            var text = await File.ReadAllTextAsync(publishedNodesFile, ct).ConfigureAwait(false);\n            if (endpointUrl != null)\n            {\n                text = text.Replace(\"{{EndpointUrl}}\", endpointUrl, StringComparison.Ordinal);\n            }\n            await File.WriteAllTextAsync(publishedNodesFilePath, text, ct).ConfigureAwait(false);\n        }\n\n        private static async Task<string?> LoadInitFileAsync(string? initProfile, string endpointUrl,\n            CancellationToken ct)\n        {\n            const string initFile = \"profile.init\";\n            if (!string.IsNullOrEmpty(initProfile))\n            {\n                var publishedNodesFile = $\"./Initfiles/{initProfile}.init\";\n                if (!File.Exists(publishedNodesFile))\n                {\n                    throw new ArgumentException($\"Init profile {initProfile} does not exist\");\n                }\n                await File.WriteAllTextAsync(initFile,\n                    (await File.ReadAllTextAsync(publishedNodesFile, ct).ConfigureAwait(false))\n                    .Replace(\"{{EndpointUrl}}\", endpointUrl,\n                        StringComparison.Ordinal), ct).ConfigureAwait(false);\n\n                return initFile;\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// Add or get module identity\n        /// </summary>\n        /// <param name=\"connectionString\"></param>\n        /// <param name=\"deviceId\"></param>\n        /// <param name=\"moduleId\"></param>\n        /// <param name=\"logger\"></param>\n        private static async Task<ConnectionString> AddOrGetAsync(string connectionString,\n            string deviceId, string moduleId, ILogger logger)\n        {\n            var builder = new ContainerBuilder();\n            builder.AddIoTHubServiceClient();\n            builder.Configure<IoTHubServiceOptions>(\n                options => options.ConnectionString = connectionString);\n            builder.AddDefaultJsonSerializer();\n            builder.AddLogging();\n            var container = builder.Build();\n            await using (container.ConfigureAwait(false))\n            {\n                var registry = container.Resolve<IIoTHubTwinServices>();\n\n                // Create iot edge gateway\n                try\n                {\n                    await registry.CreateOrUpdateAsync(new DeviceTwinModel\n                    {\n                        Id = deviceId,\n                        Tags = new Dictionary<string, VariantValue>\n                        {\n                            [Constants.TwinPropertyTypeKey] = Constants.EntityTypeGateway\n                        },\n                        IotEdge = true\n                    }, false).ConfigureAwait(false);\n                }\n                catch (ResourceConflictException)\n                {\n                    logger.IotEdgeDeviceExists(deviceId);\n                }\n\n                // Create publisher module\n                try\n                {\n                    await registry.CreateOrUpdateAsync(new DeviceTwinModel\n                    {\n                        Id = deviceId,\n                        ModuleId = moduleId\n                    }, false, default).ConfigureAwait(false);\n                }\n                catch (ResourceConflictException)\n                {\n                    logger.PublisherExists(moduleId);\n                }\n                var module = await registry.GetRegistrationAsync(deviceId, moduleId).ConfigureAwait(false);\n                return ConnectionString.CreateModuleConnectionString(registry.HostName,\n                    deviceId, moduleId, module.PrimaryKey!);\n            }\n        }\n\n        /// <summary>\n        /// Wraps server and disposes after use\n        /// </summary>\n        private sealed class ServerWrapper : IDisposable\n        {\n            public int Port { get; } = 61457;\n\n            public TaskCompletionSource<ITestServer?> Server { get; private set; } = new();\n\n            /// <summary>\n            /// Create wrapper\n            /// </summary>\n            /// <param name=\"scaleunits\"></param>\n            /// <param name=\"errorRate\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"reverseConnectPort\"></param>\n            public ServerWrapper(uint scaleunits, int errorRate, ILoggerFactory logger, int? reverseConnectPort)\n            {\n                _cts = new CancellationTokenSource();\n                _server = RunSampleServerAsync(scaleunits, errorRate, logger, Port, reverseConnectPort, _cts.Token);\n            }\n\n            /// <inheritdoc/>\n            public void Dispose()\n            {\n                _cts.Cancel();\n                _server.Wait();\n                _cts.Dispose();\n            }\n\n            /// <summary>\n            /// Run server until cancelled\n            /// </summary>\n            /// <param name=\"scaleunits\"></param>\n            /// <param name=\"errorRate\"></param>\n            /// <param name=\"loggerFactory\"></param>\n            /// <param name=\"port\"></param>\n            /// <param name=\"reverseConnectPort\"></param>\n            /// <param name=\"ct\"></param>\n            private async Task RunSampleServerAsync(uint scaleunits, int errorRate,\n                ILoggerFactory loggerFactory, int port, int? reverseConnectPort, CancellationToken ct)\n            {\n                var logger = loggerFactory.CreateLogger<ServerWrapper>();\n                while (!ct.IsCancellationRequested)\n                {\n                    try\n                    {\n                        using (var server = new ServerConsoleHost(\n                            new ServerFactory(loggerFactory.CreateLogger<ServerFactory>(),\n                                Directory.GetCurrentDirectory(), scaleunits)\n                            {\n                                LogStatus = false,\n                                EnableDiagnostics = true\n                            }, loggerFactory.CreateLogger<ServerConsoleHost>())\n                        {\n                            PkiRootPath = Path.Combine(Directory.GetCurrentDirectory(), \"server\"),\n                            AutoAccept = true\n                        })\n                        {\n                            logger.ServerRestarting();\n                            await server.StartAsync(new List<int> { port }).ConfigureAwait(false);\n                            server.TestServer.InjectErrorResponseRate = errorRate;\n                            Server.SetResult(server.TestServer);\n                            ServerControl = server.TestServer;\n                            logger.ServerRestarted();\n                            if (reverseConnectPort != null)\n                            {\n                                logger.ReverseConnectToClient();\n                                await server.AddReverseConnectionAsync(\n                                    new Uri($\"opc.tcp://localhost:{reverseConnectPort}\"),\n                                    1).ConfigureAwait(false);\n                            }\n                            await kRestartServer.WaitAsync(ct).ConfigureAwait(false);\n                            ServerControl = null;\n                            logger.StoppingServer();\n                            Server = new TaskCompletionSource<ITestServer?>();\n                        }\n\n                        logger.ServerStopped();\n                        logger.WaitingToRestartServer();\n                        await kRestartServer.WaitAsync(ct).ConfigureAwait(false);\n                    }\n                    catch (OperationCanceledException) { }\n                    catch (Exception ex)\n                    {\n                        logger.ServerException(ex);\n                    }\n                }\n                ServerControl = null;\n                logger.ServerExited();\n            }\n\n            private readonly CancellationTokenSource _cts;\n            private readonly Task _server;\n        }\n\n        public static string ReplacePropertyValue(string json, string propertyName, string newValue)\n        {\n            var pattern = $\"\\\"{propertyName}\\\"\\\\s*:\\\\s*\\\"[^\\\"]*\\\"\";\n            var replacement = $\"\\\"{propertyName}\\\": \\\"{newValue}\\\"\";\n            return Regex.Replace(json, pattern, replacement);\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for Program\n    /// </summary>\n    internal static partial class ProgramLogging\n    {\n        private const int EventClass = 0;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Publisher module command line interface.\")]\n        public static partial void PublisherModuleInit(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Error {Error}: Missing connection string - continue...\")]\n        public static partial void MissingConnectionString(this ILogger logger, string error);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Using <deviceId> '{DeviceId}'\")]\n        public static partial void UsingDeviceId(this ILogger logger, string deviceId);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Using <moduleId> '{ModuleId}'\")]\n        public static partial void UsingModuleId(this ILogger logger, string moduleId);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"Exception\")]\n        public static partial void UnhandledException(this ILogger logger, Exception? exception);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"Create or retrieve connection string for {DeviceId} {ModuleId}...\")]\n        public static partial void ConnectionStringStart(this ILogger logger, string deviceId, string moduleId);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Retrieved connection string for {DeviceId} {ModuleId}.\")]\n        public static partial void ConnectionStringRetrieved(this ILogger logger, string deviceId, string moduleId);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Error,\n            Message = \"Failed to get connection string for {DeviceId} {ModuleId}...\")]\n        public static partial void ConnectionStringFailed(this ILogger logger, Exception exception, string deviceId, string moduleId);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"Starting publisher module {DeviceId} {ModuleId}...\")]\n        public static partial void PublisherModuleStarting(this ILogger logger, string deviceId, string moduleId);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"Publisher module {DeviceId} {ModuleId} exited.\")]\n        public static partial void PublisherModuleExited(this ILogger logger, string deviceId, string moduleId);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Information,\n            Message = \"IoT Edge device {DeviceId} already exists.\")]\n        public static partial void IotEdgeDeviceExists(this ILogger logger, string deviceId);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Information,\n            Message = \"Publisher {ModuleId} already exists...\")]\n        public static partial void PublisherExists(this ILogger logger, string moduleId);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"(Re-)Starting server...\")]\n        public static partial void ServerRestarting(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"Server (re-)started (Press S to kill).\")]\n        public static partial void ServerRestarted(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Information,\n            Message = \"Reverse connect to client...\")]\n        public static partial void ReverseConnectToClient(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Information,\n            Message = \"Stopping server...\")]\n        public static partial void StoppingServer(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 17, Level = LogLevel.Information,\n            Message = \"Server stopped.\")]\n        public static partial void ServerStopped(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 18, Level = LogLevel.Information,\n            Message = \"Waiting to restarting server (Press S to restart)...\")]\n        public static partial void WaitingToRestartServer(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 19, Level = LogLevel.Error,\n            Message = \"Server ran into exception.\")]\n        public static partial void ServerException(this ILogger logger, Exception exception);\n\n        [LoggerMessage(EventId = EventClass + 20, Level = LogLevel.Information,\n            Message = \"Server exited.\")]\n        public static partial void ServerExited(this ILogger logger);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System;\n\n[assembly: CLSCompliant(false)]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/cli/publishednodes.json",
    "content": ""
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Azure.IIoT.OpcUa.Publisher.Module.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n    <ServerGarbageCollection>true</ServerGarbageCollection>\n    <EnableSdkContainerSupport>true</EnableSdkContainerSupport>\n    <Nullable>enable</Nullable>\n    <TieredPGO>true</TieredPGO>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ContainerRepository>iotedge/opc-publisher</ContainerRepository>\n    <ContainerBaseImage>mcr.microsoft.com/dotnet/aspnet:9.0-azurelinux3.0-distroless</ContainerBaseImage>\n  </PropertyGroup>\n  <ItemGroup>\n    <ContainerEnvironmentVariable Include=\"ASPNETCORE_HTTP_PORTS\" Value=\"\" />\n    <ContainerEnvironmentVariable Include=\"DOTNET_ReadyToRun\" Value=\"0\" />\n    <ContainerEnvironmentVariable Include=\"DOTNET_TieredPGO\" Value=\"1\" />\n    <ContainerEnvironmentVariable Include=\"DOTNET_TC_QuickJitForLoops\" Value=\"1\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ContainerPort Include=\"9071\" Type=\"tcp\" />\n    <ContainerPort Include=\"9072\" Type=\"tcp\" />\n    <ContainerPort Include=\"80\" Type=\"tcp\" />\n    <ContainerPort Include=\"443\" Type=\"tcp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectCapability Include=\"AzureIoTEdgeModule\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Remove=\"pki\\**\" />\n    <EmbeddedResource Remove=\"pki\\**\" />\n    <None Remove=\"pki\\**\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Furly.Extensions.AspNetCore\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Extensions.Mqtt\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Extensions.Dapr\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Extensions.MessagePack\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Azure.EventHubs\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Azure.IoT\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Azure.Identity\" Version=\"1.17.0\" />\n    <PackageReference Include=\"Azure.Core\" Version=\"1.49.0\" />\n    <PackageReference Include=\"Furly.Tunnel\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Mono.Options\" Version=\"6.12.0.148\" />\n    <PackageReference Include=\"OpenTelemetry.Extensions.Hosting\" Version=\"1.13.0\" />\n    <PackageReference Include=\"OpenTelemetry.Exporter.OpenTelemetryProtocol\" Version=\"1.13.0\" />\n    <PackageReference Include=\"OpenTelemetry.Exporter.Prometheus.AspNetCore\" Version=\"1.12.0-beta.1\" />\n    <PackageReference Include=\"OpenTelemetry.Exporter.Console\" Version=\"1.13.0\" />\n    <PackageReference Include=\"OpenTelemetry.Instrumentation.Http\" Version=\"1.12.0\" />\n    <PackageReference Include=\"OpenTelemetry.Instrumentation.AspNetCore\" Version=\"1.12.0\" />\n    <PackageReference Include=\"OpenTelemetry.Instrumentation.Runtime\" Version=\"1.12.0\" />\n    <PackageReference Include=\"System.Net.Http\" Version=\"4.3.4\" />\n    <PackageReference Include=\"System.Security.Cryptography.X509Certificates\" Version=\"4.3.2\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa.Publisher\\src\\Azure.IIoT.OpcUa.Publisher.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/CertificatesController.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Asp.Versioning;\n    using Furly;\n    using Furly.Tunnel.Router;\n    using Microsoft.AspNetCore.Authorization;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// This section lists the certificate APi provided by OPC Publisher providing\n    /// all public and private key infrastructure (PKI) related API methods.\n    /// </para>\n    /// <para>\n    /// The method name for all transports other than HTTP (which uses the shown\n    /// HTTP methods and resource uris) is the name of the subsection header.\n    /// To use the version specific method append \"_V1\" or \"_V2\" to the method\n    /// name.\n    /// </para>\n    /// </summary>\n    [Version(\"_V1\")]\n    [Version(\"_V2\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    [ControllerExceptionFilter]\n    [ApiVersion(\"2\")]\n    [Route(\"v{version:apiVersion}/pki\")]\n    [ApiController]\n    [Authorize]\n    [Produces(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    [Consumes(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    public class CertificatesController : ControllerBase, IMethodController\n    {\n        /// <summary>\n        /// Create controller with service\n        /// </summary>\n        /// <param name=\"certificates\"></param>\n        public CertificatesController(IOpcUaCertificates certificates)\n        {\n            _certificates = certificates ??\n                throw new ArgumentNullException(nameof(certificates));\n        }\n\n        /// <summary>\n        /// ListCertificates\n        /// </summary>\n        /// <remarks>\n        /// Get the certificates in the specified certificate store\n        /// </remarks>\n        /// <param name=\"store\">The store to enumerate</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The list of certificates currently in the store.</returns>\n        /// <exception cref=\"ArgumentException\">if store name is invalid.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information such as store name\n        /// is invalid</response>\n        /// <response code=\"404\">Nothing could be found.</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet(\"{store}/certs\")]\n        public async Task<IReadOnlyList<X509CertificateModel>> ListCertificatesAsync(\n            string store, CancellationToken ct = default)\n        {\n            if (!Enum.TryParse<CertificateStoreName>(store, out var storeType))\n            {\n                throw new ArgumentException(\"Invalid store name\");\n            }\n            return await _certificates.ListCertificatesAsync(storeType, false,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// ListCertificateRevocationLists\n        /// </summary>\n        /// <remarks>\n        /// Get the certificates in the specified certificated store\n        /// </remarks>\n        /// <param name=\"store\">The store to enumerate</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The list of certificates revocation lists currently\n        /// in the store.</returns>\n        /// <exception cref=\"ArgumentException\">if store name is invalid.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information such as store name\n        /// is invalid</response>\n        /// <response code=\"404\">Nothing could be found.</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet(\"{store}/crls\")]\n        public async Task<IReadOnlyList<byte[]>> ListCertificateRevocationListsAsync(\n            string store, CancellationToken ct = default)\n        {\n            if (!Enum.TryParse<CertificateStoreName>(store, out var storeType))\n            {\n                throw new ArgumentException(\"Invalid store name\");\n            }\n            return await _certificates.ListCertificateRevocationListsAsync(storeType,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// AddCertificate\n        /// </summary>\n        /// <remarks>\n        /// Add a certificate to the specified store. The certificate is provided\n        /// as a pfx/pkcs12 optionally password protected blob.\n        /// </remarks>\n        /// <param name=\"store\">The store to add the certificate to</param>\n        /// <param name=\"pfxBlob\">The pfx encoded certificate.</param>\n        /// <param name=\"password\">The optional password of the pfx</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"pfxBlob\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentException\">if store name is invalid.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information such as store name\n        /// is invalid</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPatch(\"{store}/certs\")]\n        public async Task AddCertificateAsync(string store,\n            [FromBody][Required] byte[] pfxBlob, [FromQuery] string? password,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(pfxBlob);\n            if (!Enum.TryParse<CertificateStoreName>(store, out var storeType))\n            {\n                throw new ArgumentException(\"Invalid store name\");\n            }\n            await _certificates.AddCertificateAsync(storeType, pfxBlob, password,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// AddCertificateRevocationList\n        /// </summary>\n        /// <remarks>\n        /// Add a certificate revocation list to the specified store. The certificate\n        /// revocation list is provided as a der encoded blob.\n        /// </remarks>\n        /// <param name=\"store\">The store to add the certificate to</param>\n        /// <param name=\"crl\">The pfx encoded certificate.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"crl\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentException\">if store name is invalid.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPatch(\"{store}/crls\")]\n        public async Task AddCertificateRevocationListAsync(string store,\n            [FromBody][Required] byte[] crl, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(crl);\n            if (!Enum.TryParse<CertificateStoreName>(store, out var storeType))\n            {\n                throw new ArgumentException(\"Invalid store name\");\n            }\n            await _certificates.AddCertificateRevocationListAsync(storeType, crl,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// AddCertificateChain\n        /// </summary>\n        /// <remarks>\n        /// Add a certificate chain to the specified store. The certificate is provided\n        /// as a concatenated asn encoded set of certificates with the first the\n        /// one to add, and the remainder the issuer chain.\n        /// </remarks>\n        /// <param name=\"certificateChain\">The certificate chain.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificateChain\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"trusted/certs\")]\n        public async Task AddCertificateChainAsync([FromBody][Required] byte[] certificateChain,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(certificateChain);\n            await _certificates.AddCertificateChainAsync(certificateChain, false,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// ApproveRejectedCertificate\n        /// </summary>\n        /// <remarks>\n        /// Move a rejected certificate from the rejected folder to the trusted\n        /// folder on the publisher.\n        /// </remarks>\n        /// <param name=\"thumbprint\">The thumbprint of the certificate to trust.</param>\n        /// <param name=\"ct\"></param>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"rejected/certs/{thumbprint}/approve\")]\n        public async Task ApproveRejectedCertificateAsync(string thumbprint,\n            CancellationToken ct = default)\n        {\n            await _certificates.ApproveRejectedCertificateAsync(thumbprint,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// AddTrustedHttpsCertificateAsync\n        /// </summary>\n        /// <remarks>\n        /// Add a certificate chain to the trusted https store. The certificate is\n        /// provided as a concatenated set of certificates with the first the\n        /// one to add, and the remainder the issuer chain.\n        /// </remarks>\n        /// <param name=\"certificateChain\">The certificate chain.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"certificateChain\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"https/certs\")]\n        public async Task AddTrustedHttpsCertificateAsync([FromBody][Required] byte[] certificateChain,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(certificateChain);\n            await _certificates.AddCertificateChainAsync(certificateChain, true,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// RemoveCertificate\n        /// </summary>\n        /// <remarks>\n        /// Remove a certificate with the provided thumbprint from the specified\n        /// store.\n        /// </remarks>\n        /// <param name=\"store\">The store to add the certificate to</param>\n        /// <param name=\"thumbprint\">The thumbprint of the certificate to delete.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentException\">if store name is invalid.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information such store name is invalid</response>\n        /// <response code=\"404\">Nothing could be found.</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpDelete(\"{store}/certs/{thumbprint}\")]\n        public async Task RemoveCertificateAsync(string store,\n            string thumbprint, CancellationToken ct = default)\n        {\n            if (!Enum.TryParse<CertificateStoreName>(store, out var storeType))\n            {\n                throw new ArgumentException(\"Invalid store name\");\n            }\n            await _certificates.RemoveCertificateAsync(storeType, thumbprint,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// RemoveCertificateRevocationList\n        /// </summary>\n        /// <remarks>\n        /// Remove a certificate revocation list from the specified store.\n        /// </remarks>\n        /// <param name=\"store\">The store to add the certificate to</param>\n        /// <param name=\"crl\">The crl to delete.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentException\">if store name is invalid.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information such store name is invalid</response>\n        /// <response code=\"404\">Nothing could be found.</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpDelete(\"{store}/crls\")]\n        public async Task RemoveCertificateRevocationListAsync(string store,\n            byte[] crl, CancellationToken ct = default)\n        {\n            if (!Enum.TryParse<CertificateStoreName>(store, out var storeType))\n            {\n                throw new ArgumentException(\"Invalid store name\");\n            }\n            await _certificates.RemoveCertificateRevocationListAsync(storeType, crl,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// RemoveAll\n        /// </summary>\n        /// <remarks>\n        /// Remove all certificates and revocation lists from the specified\n        /// store.\n        /// </remarks>\n        /// <param name=\"store\">The store to add the certificate to</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentException\">if store name is invalid.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information such store name is invalid</response>\n        /// <response code=\"404\">Nothing could be found.</response>\n        /// <response code=\"500\">An internal error ocurred.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpDelete(\"{store}\")]\n        public async Task RemoveAllAsync(string store, CancellationToken ct = default)\n        {\n            if (!Enum.TryParse<CertificateStoreName>(store, out var storeType))\n            {\n                throw new ArgumentException(\"Invalid store name\");\n            }\n            await _certificates.CleanAsync(storeType, ct).ConfigureAwait(false);\n        }\n\n        private readonly IOpcUaCertificates _certificates;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/ConfigurationController.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Asp.Versioning;\n    using Furly;\n    using Furly.Tunnel.Router;\n    using Microsoft.AspNetCore.Authorization;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// This section contains the API to configure OPC Publisher.\n    /// </para>\n    /// <para>\n    /// The method name for all transports other than HTTP (which uses the shown\n    /// HTTP methods and resource uris) is the name of the subsection header.\n    /// To use the version specific method append \"_V1\" or \"_V2\" to the method\n    /// name.\n    /// </para>\n    /// </summary>\n    [Version(\"_V2\")]\n    [Version(\"_V1\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    [ControllerExceptionFilter]\n    [ApiVersion(\"2\")]\n    [Route(\"v{version:apiVersion}/configuration\")]\n    [ApiController]\n    [Authorize]\n    [Produces(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    [Consumes(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    public class ConfigurationController : ControllerBase, IMethodController\n    {\n        /// <summary>\n        /// Create publisher methods controller\n        /// </summary>\n        /// <param name=\"configServices\"></param>\n        public ConfigurationController(IPublishedNodesServices configServices)\n        {\n            _configServices = configServices;\n        }\n\n        /// <summary>\n        /// PublishStart\n        /// </summary>\n        /// <remarks>\n        /// Start publishing values from a node on a server. The group field in the\n        /// Connection Model can be used to specify a writer group identifier that will\n        /// be used in the configuration entry that is created from it inside OPC Publisher.\n        /// </remarks>\n        /// <param name=\"request\">The server and node to publish.</param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"start\")]\n        public async Task<PublishStartResponseModel> PublishStartAsync(\n            [FromBody][Required] RequestEnvelope<PublishStartRequestModel> request)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _configServices.PublishStartAsync(request.Connection,\n                request.Request).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// PublishStop\n        /// </summary>\n        /// <remarks>\n        /// Stop publishing values from a node on the specified server. The group field\n        /// that was used in the Connection Model to start publishing must also be\n        /// specified in this connection model.\n        /// </remarks>\n        /// <param name=\"request\">The node to stop publishing</param>\n        /// <returns>The result of the stop operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"404\">The item could not be unpublished</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"stop\")]\n        public async Task<PublishStopResponseModel> PublishStopAsync(\n            [FromBody][Required] RequestEnvelope<PublishStopRequestModel> request)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _configServices.PublishStopAsync(request.Connection,\n                request.Request).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// PublishBulk\n        /// </summary>\n        /// <remarks>\n        /// Configure node values to publish and unpublish in bulk. The group field in\n        /// the Connection Model can be used to specify a writer group identifier that\n        /// will be used in the configuration entry that is created from it inside OPC\n        /// Publisher.\n        /// </remarks>\n        /// <param name=\"request\">The nodes to publish or unpublish.</param>\n        /// <returns>The result for each operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"404\">The item could not be unpublished</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"bulk\")]\n        public async Task<PublishBulkResponseModel> PublishBulkAsync(\n            [FromBody][Required] RequestEnvelope<PublishBulkRequestModel> request)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _configServices.PublishBulkAsync(request.Connection,\n                request.Request).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// PublishList\n        /// </summary>\n        /// <remarks>\n        /// Get all published nodes for a server endpoint.\n        /// The group field that was used in the Connection Model to start\n        /// publishing must also be specified in this connection model.\n        /// </remarks>\n        /// <param name=\"request\"></param>\n        /// <returns>The list of published nodes.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The items were found and returned.</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"list\")]\n        public async Task<PublishedItemListResponseModel> PublishListAsync(\n            [FromBody][Required] RequestEnvelope<PublishedItemListRequestModel> request)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _configServices.PublishListAsync(request.Connection,\n                request.Request).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// [PublishNodes](./directmethods.md#publishnodes_v1)\n        /// </summary>\n        /// <remarks>\n        /// PublishNodes enables a client to add a set of nodes to be published.\n        /// Further information is provided in the OPC Publisher documentation.\n        /// </remarks>\n        /// <param name=\"request\">The request contains the nodes to publish.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The result of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"nodes\")]\n        public async Task<PublishedNodesResponseModel> PublishNodesAsync(\n            [FromBody][Required] PublishedNodesEntryModel request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _configServices.PublishNodesAsync(request, ct).ConfigureAwait(false);\n            return new PublishedNodesResponseModel();\n        }\n\n        /// <summary>\n        /// [UnpublishNodes](./directmethods.md#unpublishnodes_v1)\n        /// </summary>\n        /// <remarks>\n        /// UnpublishNodes method enables a client to remove nodes from a previously\n        /// configured DataSetWriter. Further information is provided in the\n        /// OPC Publisher documentation.\n        /// </remarks>\n        /// <param name=\"request\">The request payload specifying the nodes to\n        /// unpublish.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The result of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"404\">The nodes could not be unpublished</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"nodes/unpublish\")]\n        public async Task<PublishedNodesResponseModel> UnpublishNodesAsync(\n            [FromBody][Required] PublishedNodesEntryModel request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _configServices.UnpublishNodesAsync(request, ct).ConfigureAwait(false);\n            return new PublishedNodesResponseModel();\n        }\n\n        /// <summary>\n        /// [UnpublishAllNodes](./directmethods.md#unpublishallnodes_v1)\n        /// </summary>\n        /// <remarks>\n        /// Unpublish all specified nodes or all nodes in the publisher\n        /// configuration.  Further information is provided in the\n        /// OPC Publisher documentation.\n        /// </remarks>\n        /// <param name=\"request\">The request contains the parts of the\n        /// configuration to remove.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The result of the operation.</returns>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"404\">The nodes could not be unpublished</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"nodes/unpublish/all\")]\n        public async Task<PublishedNodesResponseModel> UnpublishAllNodesAsync(\n            [FromBody] PublishedNodesEntryModel? request, CancellationToken ct = default)\n        {\n            await _configServices.UnpublishAllNodesAsync(request, ct).ConfigureAwait(false);\n            return new PublishedNodesResponseModel();\n        }\n\n        /// <summary>\n        /// [AddOrUpdateEndpoints](./directmethods.md#addorupdateendpoints_v1)\n        /// </summary>\n        /// <remarks>\n        /// Add or update endpoint configuration and nodes on a server.\n        /// Further information is provided in the OPC Publisher documentation.\n        /// </remarks>\n        /// <param name=\"request\">The parts of the configuration to add or\n        /// update.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The result of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"404\">The endpoint was not found to add to</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPatch]\n        public async Task<PublishedNodesResponseModel> AddOrUpdateEndpointsAsync(\n            [FromBody][Required] IReadOnlyList<PublishedNodesEntryModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _configServices.AddOrUpdateEndpointsAsync(request, ct).ConfigureAwait(false);\n            return new PublishedNodesResponseModel();\n        }\n\n        /// <summary>\n        /// [GetConfiguredEndpoints](./directmethods.md#getconfiguredendpoints_v1)\n        /// </summary>\n        /// <remarks>\n        /// Get a list of nodes under a configured endpoint in the configuration.\n        /// Further information is provided in the OPC Publisher documentation.\n        /// configuration.\n        /// </remarks>\n        /// <param name=\"request\">Optional but can be spcified to include\n        /// the nodes in the response.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The result of the operation.</returns>\n        /// <response code=\"200\">The data was retrieved.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet]\n        public async Task<GetConfiguredEndpointsResponseModel> GetConfiguredEndpointsAsync(\n            [FromQuery] GetConfiguredEndpointsRequestModel? request = null,\n            CancellationToken ct = default)\n        {\n            var response = await _configServices.GetConfiguredEndpointsAsync(\n                request?.IncludeNodes ?? false, ct).ConfigureAwait(false);\n            return new GetConfiguredEndpointsResponseModel\n            {\n                Endpoints = response\n            };\n        }\n\n        /// <summary>\n        /// [SetConfiguredEndpoints](./directmethods.md#setconfiguredendpoints_v1)\n        /// </summary>\n        /// <remarks>\n        /// Enables clients to update the entire published nodes configuration\n        /// in one call. This includes clearing the existing configuration.\n        /// Further information is provided in the OPC Publisher documentation.\n        /// configuration.\n        /// </remarks>\n        /// <param name=\"request\">The new published nodes configuration</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The result of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPut]\n        public async Task SetConfiguredEndpointsAsync(\n            [FromBody][Required] SetConfiguredEndpointsRequestModel request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _configServices.SetConfiguredEndpointsAsync(new List<PublishedNodesEntryModel>(\n                request.Endpoints ?? []),\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// [GetConfiguredNodesOnEndpoint](./directmethods.md#getconfigurednodesonendpoint_v)\n        /// </summary>\n        /// <remarks>\n        /// Get the nodes of a published nodes entry object returned earlier from\n        /// a call to GetConfiguredEndpoints. Further information is provided in\n        /// the OPC Publisher documentation.\n        /// </remarks>\n        /// <param name=\"request\">The entry model from a call to GetConfiguredEndpoints\n        /// for which to gather the nodes.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The result of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The information was returned.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"404\">The entry was not found.</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"endpoints/list/nodes\")]\n        public async Task<GetConfiguredNodesOnEndpointResponseModel> GetConfiguredNodesOnEndpointAsync(\n            [FromBody][Required] PublishedNodesEntryModel request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _configServices.GetConfiguredNodesOnEndpointAsync(\n                request, ct).ConfigureAwait(false);\n            return new GetConfiguredNodesOnEndpointResponseModel\n            {\n                OpcNodes = response\n            };\n        }\n\n        /// <summary>\n        /// [GetDiagnosticInfo](./directmethods.md#getdiagnosticinfo_v1)\n        /// </summary>\n        /// <remarks>\n        /// Get the list of diagnostics info for all dataset writers in the OPC Publisher\n        /// at the point the call is received. Further information is provided in the\n        /// OPC Publisher documentation.\n        /// </remarks>\n        /// <param name=\"ct\"></param>\n        /// <returns>The list of diagnostic infos for currently active writers.</returns>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"405\">Call not supported or functionality disabled.</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status405MethodNotAllowed)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"diagnostics\")]\n        public async Task<List<PublishDiagnosticInfoModel>> GetDiagnosticInfoAsync(\n            CancellationToken ct = default)\n        {\n            return await _configServices.GetDiagnosticInfoAsync(ct).ConfigureAwait(false);\n        }\n\n        private readonly IPublishedNodesServices _configServices;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/DiagnosticsController.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Asp.Versioning;\n    using Furly;\n    using Furly.Tunnel.Router;\n    using Microsoft.AspNetCore.Authorization;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// This section lists the diagnostics APi provided by OPC Publisher providing\n    /// connection related diagnostics API methods.\n    /// </para>\n    /// <para>\n    /// The method name for all transports other than HTTP (which uses the shown\n    /// HTTP methods and resource uris) is the name of the subsection header.\n    /// To use the version specific method append \"_V1\" or \"_V2\" to the method\n    /// name.\n    /// </para>\n    /// </summary>\n    [Version(\"_V1\")]\n    [Version(\"_V2\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    [ControllerExceptionFilter]\n    [ApiVersion(\"2\")]\n    [Route(\"v{version:apiVersion}\")]\n    [ApiController]\n    [Authorize]\n    [Produces(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    [Consumes(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    public class DiagnosticsController : ControllerBase, IMethodController\n    {\n        /// <summary>\n        /// Create controller with service\n        /// </summary>\n        /// <param name=\"diagnostics\"></param>\n        public DiagnosticsController(IClientDiagnostics diagnostics)\n        {\n            _diagnostics = diagnostics ??\n                throw new ArgumentNullException(nameof(diagnostics));\n        }\n\n        /// <summary>\n        /// ResetAllConnections\n        /// </summary>\n        /// <remarks>\n        /// Can be used to reset all established connections causing a full\n        /// reconnect and recreate of all subscriptions.\n        /// </remarks>\n        /// <param name=\"ct\"></param>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet(\"reset\")]\n        public async Task ResetAllConnectionsAsync(CancellationToken ct = default)\n        {\n            await _diagnostics.ResetAllConnectionsAsync(ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetActiveConnections\n        /// </summary>\n        /// <remarks>\n        /// Get all active connections the publisher is currently managing.\n        /// </remarks>\n        /// <param name=\"ct\"></param>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet(\"connections\")]\n        public Task<IReadOnlyList<ConnectionModel>> GetActiveConnectionsAsync(\n            CancellationToken ct = default)\n        {\n            ct.ThrowIfCancellationRequested();\n            return Task.FromResult(_diagnostics.ActiveConnections);\n        }\n\n        /// <summary>\n        /// GetConnectionDiagnostics\n        /// </summary>\n        /// <remarks>\n        /// Get diagnostics for all active clients including server and\n        /// client session diagnostics.\n        /// </remarks>\n        /// <param name=\"ct\"></param>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet(\"diagnostics/connections\")]\n        public IAsyncEnumerable<ConnectionDiagnosticsModel> GetConnectionDiagnosticsAsync(\n            CancellationToken ct = default)\n        {\n            return _diagnostics.GetConnectionDiagnosticsAsync(ct);\n        }\n\n        /// <summary>\n        /// GetChannelDiagnostics\n        /// </summary>\n        /// <remarks>\n        /// Get channel diagnostic information for all connections.\n        /// </remarks>\n        /// <param name=\"ct\"></param>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet(\"diagnostics/channels\")]\n        public Task<IReadOnlyList<ChannelDiagnosticModel>> GetChannelDiagnosticsAsync(\n            CancellationToken ct = default)\n        {\n            ct.ThrowIfCancellationRequested();\n            return Task.FromResult(_diagnostics.ChannelDiagnostics);\n        }\n\n        /// <summary>\n        /// WatchChannelDiagnostics\n        /// </summary>\n        /// <remarks>\n        /// Get channel diagnostic information for all connections.\n        /// The first set of diagnostics are the diagnostics active for\n        /// all connections, continue reading to get updates.\n        /// </remarks>\n        /// <param name=\"ct\"></param>\n        /// <response code=\"200\">The operation was successful.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet(\"diagnostics/channels/watch\")]\n        public IAsyncEnumerable<ChannelDiagnosticModel> WatchChannelDiagnosticsAsync(\n            CancellationToken ct = default)\n        {\n            return _diagnostics.WatchChannelDiagnosticsAsync(ct);\n        }\n\n        private readonly IClientDiagnostics _diagnostics;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/DiscoveryController.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Asp.Versioning;\n    using Furly;\n    using Furly.Tunnel.Router;\n    using Microsoft.AspNetCore.Authorization;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using System;\n    using System.ComponentModel.DataAnnotations;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// OPC UA and network discovery related API.\n    /// </para>\n    /// <para>\n    /// The method name for all transports other than HTTP (which uses the shown\n    /// HTTP methods and resource uris) is the name of the subsection header.\n    /// To use the version specific method append \"_V1\" or \"_V2\" to the method\n    /// </para>\n    /// </summary>\n    [Version(\"_V1\")]\n    [Version(\"_V2\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    [ControllerExceptionFilter]\n    [ApiVersion(\"2\")]\n    [Route(\"v{version:apiVersion}/discovery\")]\n    [ApiController]\n    [Authorize]\n    [Produces(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    [Consumes(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    public class DiscoveryController : ControllerBase, IMethodController\n    {\n        /// <summary>\n        /// Create controller with service\n        /// </summary>\n        /// <param name=\"discover\"></param>\n        /// <param name=\"servers\"></param>\n        public DiscoveryController(INetworkDiscovery discover,\n            IServerDiscovery servers)\n        {\n            _discover = discover ?? throw new ArgumentNullException(nameof(discover));\n            _servers = servers ?? throw new ArgumentNullException(nameof(servers));\n        }\n\n        /// <summary>\n        /// FindServer\n        /// </summary>\n        /// <remarks>\n        /// Find servers matching the specified endpoint query spec.\n        /// </remarks>\n        /// <param name=\"endpoint\">The endpoint query specifying the\n        /// matching criteria for the discovered endpoints.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The application information of a found server.\n        /// Endpoints are only included in the response if they match\n        /// the query specification. If no server is found the call\n        /// returns 404 NotFound error.\n        /// </returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"endpoint\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"findserver\")]\n        public async Task<ApplicationRegistrationModel> FindServerAsync(\n            [FromBody][Required] ServerEndpointQueryModel endpoint, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            return await _servers.FindServerAsync(endpoint, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Register\n        /// </summary>\n        /// <remarks>\n        /// Start server registration. The results of the registration\n        /// are published as events to the default event transport.\n        /// </remarks>\n        /// <param name=\"request\">Contains all information to perform\n        /// the registration request including discovery url to use.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>Returns true if the registration request was\n        /// processed.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"register\")]\n        public async Task<bool> RegisterAsync(\n            [FromBody][Required] ServerRegistrationRequestModel request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _discover.RegisterAsync(request, ct: ct).ConfigureAwait(false);\n            return true;\n        }\n\n        /// <summary>\n        /// Discover\n        /// </summary>\n        /// <remarks>\n        /// Start network discovery using the provided discovery request\n        /// configuration. The discovery results are published to the\n        /// configured default event transport.\n        /// </remarks>\n        /// <param name=\"request\">The discovery configuration to use\n        /// during the discovery run.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>Returns true if the discovery operation started.\n        /// </returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost]\n        public async Task<bool> DiscoverAsync(\n            [FromBody][Required] DiscoveryRequestModel request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _discover.DiscoverAsync(request, ct: ct).ConfigureAwait(false);\n            return true;\n        }\n\n        /// <summary>\n        /// Cancel\n        /// </summary>\n        /// <remarks>\n        /// Cancel a discovery run that is ongoing using the discovery\n        /// request token specified in the discover operation.\n        /// </remarks>\n        /// <param name=\"request\">The information needed to cancel the\n        /// discovery operation.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>Returns true if the cancellation request was processed.\n        /// </returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"cancel\")]\n        public async Task<bool> CancelAsync(\n            [FromBody][Required] DiscoveryCancelRequestModel request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _discover.CancelAsync(request, ct: ct).ConfigureAwait(false);\n            return true;\n        }\n\n        private readonly INetworkDiscovery _discover;\n        private readonly IServerDiscovery _servers;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/FileSystemController.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Asp.Versioning;\n    using Furly;\n    using Furly.Extensions.Serializers;\n    using Furly.Tunnel.Router;\n    using Microsoft.AspNetCore.Authorization;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using Microsoft.Extensions.Primitives;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// This section lists the file transfer API provided by OPC Publisher providing\n    /// access to file transfer services to move files in and out of a server\n    /// using the File transfer specification.\n    /// </para>\n    /// <para>\n    /// The method name for all transports other than HTTP (which uses the shown\n    /// HTTP methods and resource uris) is the name of the subsection header.\n    /// To use the version specific method append \"_V1\" or \"_V2\" to the method\n    /// name.\n    /// </para>\n    /// </summary>\n    [Version(\"_V1\")]\n    [Version(\"_V2\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    [ControllerExceptionFilter]\n    [ApiVersion(\"2\")]\n    [Route(\"v{version:apiVersion}/filesystem\")]\n    [ApiController]\n    [Authorize]\n    [Produces(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    [Consumes(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    public class FileSystemController : ControllerBase, IMethodController\n    {\n        /// <summary>\n        /// Create controller with service\n        /// </summary>\n        /// <param name=\"files\"></param>\n        /// <param name=\"serializer\"></param>\n        public FileSystemController(IFileSystemServices<ConnectionModel> files,\n            IJsonSerializer serializer)\n        {\n            _files = files ?? throw new ArgumentNullException(nameof(files));\n            _serializer = serializer ?? throw new ArgumentNullException(nameof(serializer));\n        }\n\n        /// <summary>\n        /// GetFileSystems\n        /// </summary>\n        /// <remarks>\n        /// Gets all file systems of the server.\n        /// </remarks>\n        /// <param name=\"connection\">The connection information identifying the\n        /// server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The directories.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"connection\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"list\")]\n        public IAsyncEnumerable<ServiceResponse<FileSystemObjectModel>> GetFileSystemsAsync(\n            [FromBody][Required] ConnectionModel connection,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            return _files.GetFileSystemsAsync(connection, ct);\n        }\n\n        /// <summary>\n        /// GetDirectories\n        /// </summary>\n        /// <remarks>\n        /// Gets all directories in a directory or file system\n        /// </remarks>\n        /// <param name=\"request\">The directory or filesystem object and connection\n        /// information identifying the server to connect to perform the operation\n        /// on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The directories.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"list/directories\")]\n        public async Task<ServiceResponse<IEnumerable<FileSystemObjectModel>>> GetDirectoriesAsync(\n            [FromBody][Required] RequestEnvelope<FileSystemObjectModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _files.GetDirectoriesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetFiles\n        /// </summary>\n        /// <remarks>\n        /// Get files in a directory or file system on a server.\n        /// </remarks>\n        /// <param name=\"request\">The directory or filesystem object and connection\n        /// information identifying the server to connect to perform the operation\n        /// on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The file information.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"list/files\")]\n        public async Task<ServiceResponse<IEnumerable<FileSystemObjectModel>>> GetFilesAsync(\n            [FromBody][Required] RequestEnvelope<FileSystemObjectModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _files.GetFilesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetParent\n        /// </summary>\n        /// <remarks>\n        /// Gets the parent directory or filesystem of a file or directory.\n        /// </remarks>\n        /// <param name=\"request\">The file or directory object and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The parent directory or filesystem.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"parent\")]\n        public async Task<ServiceResponse<FileSystemObjectModel>> GetParentAsync(\n            [FromBody][Required] RequestEnvelope<FileSystemObjectModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _files.GetParentAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetFileInfo\n        /// </summary>\n        /// <remarks>\n        /// Gets the file information for a file on the server.\n        /// </remarks>\n        /// <param name=\"request\">The file object and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The file information.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"info/file\")]\n        public async Task<ServiceResponse<FileInfoModel>> GetFileInfoAsync(\n            [FromBody][Required] RequestEnvelope<FileSystemObjectModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _files.GetFileInfoAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// CreateFile\n        /// </summary>\n        /// <remarks>\n        /// Create a new file in a directory or file system on the server\n        /// </remarks>\n        /// <param name=\"request\">The file system or directory object to create the\n        /// file in and the connection information identifying the server to\n        /// connect to perform the operation on.</param>\n        /// <param name=\"name\">The name of the file to create as child\n        /// under the directory or filesystem provided</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The new directory.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"create/file/{name}\")]\n        public async Task<ServiceResponse<FileSystemObjectModel>> CreateFileAsync(\n            [FromBody][Required] RequestEnvelope<FileSystemObjectModel> request,\n            string name, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(name);\n            return await _files.CreateFileAsync(request.Connection,\n                request.Request, name, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// CreateDirectory\n        /// </summary>\n        /// <remarks>\n        /// Create a new directory in an existing file system or directory on the server.\n        /// </remarks>\n        /// <param name=\"request\">The file system or directory object to create the\n        /// directory in and the connection information identifying the server to\n        /// connect to perform the operation on.</param>\n        /// <param name=\"name\">The name of the directory to create as child\n        /// under the parent directory provided</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The new file.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"create/directory/{name}\")]\n        public async Task<ServiceResponse<FileSystemObjectModel>> CreateDirectoryAsync(\n            [FromBody][Required] RequestEnvelope<FileSystemObjectModel> request,\n            string name, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(name);\n            return await _files.CreateDirectoryAsync(request.Connection,\n                request.Request, name, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// DeleteFileSystemObject\n        /// </summary>\n        /// <remarks>\n        /// Delete a file or directory in an existing file system on the server.\n        /// </remarks>\n        /// <param name=\"request\">The file or directory object to delete and the\n        /// connection information identifying the server to connect to perform\n        /// the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The new file.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"delete\")]\n        public async Task<ServiceResultModel> DeleteFileSystemObjectAsync(\n            [FromBody][Required] RequestEnvelope<FileSystemObjectModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _files.DeleteFileSystemObjectAsync(request.Connection,\n                request.Request, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// DeleteFileOrDirectory\n        /// </summary>\n        /// <remarks>\n        /// Delete a file or directory in the specified directory or file system.\n        /// </remarks>\n        /// <param name=\"request\">The filesystem or directory object in which to\n        /// delete the specified file or directory and the connection to use for\n        /// the operation.</param>\n        /// <param name=\"fileOrDirectoryNodeId\">The node id of the file or\n        /// directory to delete</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The new file.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"delete/{fileOrDirectoryNodeId}\")]\n        public async Task<ServiceResultModel> DeleteFileOrDirectoryAsync(\n            [FromBody][Required] RequestEnvelope<FileSystemObjectModel> request,\n            string fileOrDirectoryNodeId, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(fileOrDirectoryNodeId);\n            return await _files.DeleteFileSystemObjectAsync(request.Connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = fileOrDirectoryNodeId\n                }, request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Download\n        /// </summary>\n        /// <remarks>\n        /// Download a file from the server\n        /// </remarks>\n        /// <param name=\"connectionJson\">The connection information identifying the server\n        /// to connect to perform the operation on. This is passed as json serialized via\n        /// the header \"x-ms-connection\"</param>\n        /// <param name=\"fileObjectJson\">The file object to upload. This is passed as json\n        /// serialized via the header \"x-ms-target\"</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"connectionJson\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"fileObjectJson\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"NotSupportedException\">The operation is not supported\n        /// over the transport chosen</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpGet(\"download\")]\n        public async Task DownloadAsync(\n            [FromHeader(Name = \"x-ms-connection\")][Required] string connectionJson,\n            [FromHeader(Name = \"x-ms-target\")][Required] string fileObjectJson,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(connectionJson);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(fileObjectJson);\n\n            var connection = _serializer.Deserialize<ConnectionModel>(connectionJson);\n            var fileObject = _serializer.Deserialize<FileSystemObjectModel>(fileObjectJson);\n\n            ArgumentNullException.ThrowIfNull(connection);\n            ArgumentNullException.ThrowIfNull(fileObject);\n\n            if (HttpContext == null)\n            {\n                throw new NotSupportedException(\"Download not supported\");\n            }\n            var response = HttpContext.Response;\n            await response.StartAsync(ct).ConfigureAwait(false);\n            var result = await _files.CopyToAsync(connection,\n                fileObject, response.Body, ct).ConfigureAwait(false);\n            if (result?.StatusCode != 0)\n            {\n                HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;\n                HttpContext.Response.Headers.Append(\"errorInfo\",\n                    new StringValues(_serializer.SerializeObjectToString(result)));\n            }\n            await response.CompleteAsync().ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Upload\n        /// </summary>\n        /// <remarks>\n        /// Upload a file to the server.\n        /// </remarks>\n        /// <param name=\"connectionJson\">The connection information identifying the server\n        /// to connect to perform the operation on. This is passed as json serialized via\n        /// the header \"x-ms-connection\"</param>\n        /// <param name=\"fileObjectJson\">The file object to upload. This is passed as json\n        /// serialized via the header \"x-ms-target\"</param>\n        /// <param name=\"writeOptionsJson\">The file write options to use passed as\n        /// header \"x-ms-mode\"</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"connectionJson\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"fileObjectJson\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"writeOptionsJson\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"NotSupportedException\">The operation is not supported\n        /// over the transport chosen</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"upload\")]\n        public async Task UploadAsync(\n            [FromHeader(Name = \"x-ms-connection\")][Required] string connectionJson,\n            [FromHeader(Name = \"x-ms-target\")][Required] string fileObjectJson,\n            [FromHeader(Name = \"x-ms-options\")][Required] string writeOptionsJson,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(connectionJson);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(fileObjectJson);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(writeOptionsJson);\n\n            var connection = _serializer.Deserialize<ConnectionModel>(connectionJson);\n            var fileObject = _serializer.Deserialize<FileSystemObjectModel>(fileObjectJson);\n            var options = _serializer.Deserialize<FileOpenWriteOptionsModel?>(writeOptionsJson);\n\n            ArgumentNullException.ThrowIfNull(connection);\n            ArgumentNullException.ThrowIfNull(fileObject);\n\n            if (HttpContext == null)\n            {\n                throw new NotSupportedException(\"Upload not supported\");\n            }\n\n            await using var _ = HttpContext.Request.Body.ConfigureAwait(false);\n            var result = await _files.CopyFromAsync(connection,\n                fileObject, HttpContext.Request.Body, options, ct).ConfigureAwait(false);\n\n            if (result?.StatusCode != 0)\n            {\n                HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;\n                HttpContext.Response.Headers.Append(\"errorInfo\",\n                    new StringValues(_serializer.SerializeObjectToString(result)));\n            }\n        }\n        private readonly IFileSystemServices<ConnectionModel> _files;\n        private readonly IJsonSerializer _serializer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/GeneralController.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Asp.Versioning;\n    using Furly;\n    using Furly.Extensions.Serializers;\n    using Furly.Tunnel.Router;\n    using Microsoft.AspNetCore.Authorization;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// This section lists the general APi provided by OPC Publisher providing\n    /// all connection, endpoint and address space related API methods.\n    /// </para>\n    /// <para>\n    /// The method name for all transports other than HTTP (which uses the shown\n    /// HTTP methods and resource uris) is the name of the subsection header.\n    /// To use the version specific method append \"_V1\" or \"_V2\" to the method\n    /// name.\n    /// </para>\n    /// </summary>\n    [Version(\"_V1\")]\n    [Version(\"_V2\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    [ControllerExceptionFilter]\n    [ApiVersion(\"2\")]\n    [Route(\"v{version:apiVersion}\")]\n    [ApiController]\n    [Authorize]\n    [Produces(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    [Consumes(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    public class GeneralController : ControllerBase, IMethodController\n    {\n        /// <summary>\n        /// Create controller with service\n        /// </summary>\n        /// <param name=\"endpoints\"></param>\n        /// <param name=\"certificates\"></param>\n        /// <param name=\"nodes\"></param>\n        public GeneralController(IConnectionServices<ConnectionModel> endpoints,\n            ICertificateServices<EndpointModel> certificates,\n            INodeServices<ConnectionModel> nodes)\n        {\n            _certificates = certificates ??\n                throw new ArgumentNullException(nameof(certificates));\n            _nodes = nodes ??\n                throw new ArgumentNullException(nameof(nodes));\n            _endpoints = endpoints ??\n                throw new ArgumentNullException(nameof(endpoints));\n        }\n\n        /// <summary>\n        /// GetServerCapabilities\n        /// </summary>\n        /// <remarks>\n        /// Get the capabilities of the server. The server capabilities are exposed\n        /// as a property of the server object and this method provides a convinient\n        /// way to retrieve them.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The server capabilities.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"capabilities\")]\n        public async Task<ServerCapabilitiesModel> GetServerCapabilitiesAsync(\n            [FromBody][Required] RequestEnvelope<RequestHeaderModel?> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            return await _nodes.GetServerCapabilitiesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Browse\n        /// </summary>\n        /// <remarks>\n        /// Browse a a node to discover its references. For more information consult\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.2\">\n        /// the relevant section of the OPC UA reference specification</a>.\n        /// The operation might return a continuation token. The continuation token\n        /// can be used in the BrowseNext method call to retrieve the remainder of\n        /// references or additional continuation tokens.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The references and optional continuation token</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"browse/first\")]\n        public async Task<BrowseFirstResponseModel> BrowseAsync(\n            [FromBody][Required] RequestEnvelope<BrowseFirstRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.BrowseFirstAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// BrowseNext\n        /// </summary>\n        /// <remarks>\n        /// Browse next\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The references and optional continuation token</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"browse/next\")]\n        public async Task<BrowseNextResponseModel> BrowseNextAsync(\n            [FromBody][Required] RequestEnvelope<BrowseNextRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.BrowseNextAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// BrowseStream (only HTTP transport)\n        /// </summary>\n        /// <remarks>\n        /// Recursively browse a node to discover its references and nodes.\n        /// The results are returned as a stream of nodes and references. Consult\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.2\">\n        /// the relevant section of the OPC UA reference specification</a> for more\n        /// information.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The nodes and references as stream.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"browse\")]\n        public IAsyncEnumerable<BrowseStreamChunkModel> BrowseStreamAsync(\n            [FromBody][Required] RequestEnvelope<BrowseStreamRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return _nodes.BrowseAsync(request.Connection, request.Request, ct);\n        }\n\n        /// <summary>\n        /// BrowsePath\n        /// </summary>\n        /// <remarks>\n        /// Translate a start node and browse path into 0 or more target nodes.\n        /// Allows programming aginst types in OPC UA. For more information consult\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.8.4\">\n        /// the relevant section of the OPC UA reference specification</a>.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The target nodes found.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"browse/path\")]\n        public async Task<BrowsePathResponseModel> BrowsePathAsync(\n            [FromBody][Required] RequestEnvelope<BrowsePathRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.BrowsePathAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// ValueRead\n        /// </summary>\n        /// <remarks>\n        /// Read the value of a variable node. This uses the service detailed in the\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.1\">\n        /// relevant section of the OPC UA reference specification</a>.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The value read from the node variable or error information.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"read\")]\n        public async Task<ValueReadResponseModel> ValueReadAsync(\n            [FromBody][Required] RequestEnvelope<ValueReadRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.ValueReadAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// ValueWrite\n        /// </summary>\n        /// <remarks>\n        /// Write the value of a variable node. This uses the service detailed in\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.4\">\n        /// the relevant section of the OPC UA reference specification</a>.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The result of the write operation or error information.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"write\")]\n        public async Task<ValueWriteResponseModel> ValueWriteAsync(\n            [FromBody][Required] RequestEnvelope<ValueWriteRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.ValueWriteAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetMetadata\n        /// </summary>\n        /// <remarks>\n        /// Get the type metadata for a any node. For data type nodes the\n        /// response contains the data type metadata including fields. For\n        /// method nodes the output and input arguments metadata is provided.\n        /// For objects and object types the instance declaration is returned.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The meta data of the node and optionally error information\n        /// in case of failure.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"metadata\")]\n        public async Task<NodeMetadataResponseModel> GetMetadataAsync(\n            [FromBody][Required] RequestEnvelope<NodeMetadataRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.GetMetadataAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// CompileQuery\n        /// </summary>\n        /// <remarks>\n        /// Compile a query string into a query spec that can be used when\n        /// setting up event filters on monitored items that monitor events.\n        /// </remarks>\n        /// <param name=\"request\">The compilation request and connection\n        /// information.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The compilation response.</returns>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"query/compile\")]\n        public async Task<QueryCompilationResponseModel> CompileQueryAsync(\n            [FromBody][Required] RequestEnvelope<QueryCompilationRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.CompileQueryAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// MethodMetadata\n        /// </summary>\n        /// <remarks>\n        /// Get the metadata for calling the method. This API is obsolete.\n        /// Use the more powerful GetMetadata method instead.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The method meta data and optionally error information\n        /// in case of failure.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"call/$metadata\")]\n        public async Task<MethodMetadataResponseModel> MethodMetadataAsync(\n            [FromBody][Required] RequestEnvelope<MethodMetadataRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.GetMethodMetadataAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// MethodCall\n        /// </summary>\n        /// <remarks>\n        /// Call a method on the OPC UA server endpoint with the specified input\n        /// arguments and received the result in the form of the method output arguments.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11.2\">\n        /// the relevant section of the OPC UA reference specification</a> for more\n        /// information.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The output argument values of the method call and optionally\n        /// error information in case of failure.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"call\")]\n        public async Task<MethodCallResponseModel> MethodCallAsync(\n            [FromBody][Required] RequestEnvelope<MethodCallRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.MethodCallAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// NodeRead\n        /// </summary>\n        /// <remarks>\n        /// Read any writeable attribute of a specified node on the server. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.2\">\n        /// the relevant section of the OPC UA reference specification</a> for more\n        /// information. The attributes supported by the node are dependend\n        /// on the node class of the node.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The value of the attribute read and optionally\n        /// error information in case of failure.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"read/attributes\")]\n        public async Task<ReadResponseModel> NodeReadAsync(\n            [FromBody][Required] RequestEnvelope<ReadRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.ReadAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// NodeWrite\n        /// </summary>\n        /// <remarks>\n        /// Write any writeable attribute of a specified node on the server. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.4\">\n        /// the relevant section of the OPC UA reference specification</a> for more\n        /// information. The attributes supported by the node are dependend\n        /// on the node class of the node.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The write operation result and optionally\n        /// error information in case of failure.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"write/attributes\")]\n        public async Task<WriteResponseModel> NodeWriteAsync(\n            [FromBody][Required] RequestEnvelope<WriteRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.WriteAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryRead\n        /// </summary>\n        /// <remarks>\n        /// Read the history using the respective OPC UA service call. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// the relevant section of the OPC UA reference specification</a> for more\n        /// information. If continuation is returned the remaining results\n        /// of the operation can be read using the HistoryReadNext method.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"historyread/first\")]\n        public async Task<HistoryReadResponseModel<VariantValue>> HistoryReadAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<VariantValue>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.HistoryReadAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReadNext\n        /// </summary>\n        /// <remarks>\n        /// Read next history using the respective OPC UA service call. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// the relevant section of the OPC UA reference specification</a> for more\n        /// information.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The history read results.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"historyread/next\")]\n        public async Task<HistoryReadNextResponseModel<VariantValue>> HistoryReadNextAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadNextRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.HistoryReadNextAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryUpdate\n        /// </summary>\n        /// <remarks>\n        /// Update history using the respective OPC UA service call. Consult the\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// relevant section of the OPC UA reference specification</a> for more\n        /// information.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The update result.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"historyupdate\")]\n        public async Task<HistoryUpdateResponseModel> HistoryUpdateAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<VariantValue>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.HistoryUpdateAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetEndpointCertificate\n        /// </summary>\n        /// <remarks>\n        /// Get a server endpoint's certificate and certificate chain if\n        /// available.\n        /// </remarks>\n        /// <param name=\"endpoint\">The server endpoint to get the certificate\n        /// for.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The certificate of the server endpoint</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"endpoint\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"certificate\")]\n        public async Task<X509CertificateChainModel> GetEndpointCertificateAsync(\n            [FromBody][Required] EndpointModel endpoint, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            return await _certificates.GetEndpointCertificateAsync(endpoint,\n                ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryGetServerCapabilities\n        /// </summary>\n        /// <remarks>\n        /// Get the historian capabilities exposed as part of the OPC UA server\n        /// server object.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The historian capabilities of the server.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"history/capabilities\")]\n        public async Task<HistoryServerCapabilitiesModel> HistoryGetServerCapabilitiesAsync(\n            [FromBody][Required] RequestEnvelope<RequestHeaderModel?> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            return await _nodes.HistoryGetServerCapabilitiesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryGetConfiguration\n        /// </summary>\n        /// <remarks>\n        /// Get the historian configuration of a historizing node in the OPC UA server\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The node historian configuration.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"history/configuration\")]\n        public async Task<HistoryConfigurationResponseModel> HistoryGetConfigurationAsync(\n            [FromBody][Required] RequestEnvelope<HistoryConfigurationRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _nodes.HistoryGetConfigurationAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// TestConnection\n        /// </summary>\n        /// <remarks>\n        /// Test connection to an opc ua server. The call will not establish\n        /// any persistent connection but will just allow a client to test\n        /// that the server is available.\n        /// </remarks>\n        /// <param name=\"request\">The request payload and connection information\n        /// identifying the server to connect to perform the operation on.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The test results.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"test\")]\n        public async Task<TestConnectionResponseModel> TestConnectionAsync(\n            [FromBody][Required] RequestEnvelope<TestConnectionRequestModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _endpoints.TestConnectionAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        private readonly ICertificateServices<EndpointModel> _certificates;\n        private readonly IConnectionServices<ConnectionModel> _endpoints;\n        private readonly INodeServices<ConnectionModel> _nodes;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/HistoryController.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Asp.Versioning;\n    using Furly;\n    using Furly.Tunnel.Router;\n    using Microsoft.AspNetCore.Authorization;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// This section lists all OPC UA HDA or Historian related API provided by\n    /// OPC Publisher.\n    /// </para>\n    /// <para>\n    /// The method name for all transports other than HTTP (which uses the shown\n    /// HTTP methods and resource uris) is the name of the subsection header.\n    /// To use the version specific method append \"_V1\" or \"_V2\" to the method\n    /// name.\n    /// </para>\n    /// </summary>\n    [Version(\"_V1\")]\n    [Version(\"_V2\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    [ControllerExceptionFilter]\n    [ApiVersion(\"2\")]\n    [Route(\"v{version:apiVersion}/history\")]\n    [ApiController]\n    [Authorize]\n    [Produces(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    [Consumes(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    public class HistoryController : ControllerBase, IMethodController\n    {\n        /// <summary>\n        /// Create controller with service\n        /// </summary>\n        /// <param name=\"historian\"></param>\n        public HistoryController(IHistoryServices<ConnectionModel> historian)\n        {\n            _history = historian ?? throw new ArgumentNullException(nameof(historian));\n        }\n\n        /// <summary>\n        /// HistoryReplaceEvents\n        /// </summary>\n        /// <remarks>\n        /// Replace events in a timeseries in the historian of the OPC UA server. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The events to replace with in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"events/replace\")]\n        public async Task<HistoryUpdateResponseModel> HistoryReplaceEventsAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<UpdateEventsDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReplaceEventsAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryInsertEvents\n        /// </summary>\n        /// <remarks>\n        /// Insert event entries into a specified timeseries of the historian. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The events to insert into the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"events/insert\")]\n        public async Task<HistoryUpdateResponseModel> HistoryInsertEventsAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<UpdateEventsDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryInsertEventsAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryUpsertEvents\n        /// </summary>\n        /// <remarks>\n        /// Upsert events into a time series of the opc server historian.  See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The events to upsert into the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"events/upsert\")]\n        public async Task<HistoryUpdateResponseModel> HistoryUpsertEventsAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<UpdateEventsDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryUpsertEventsAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryDeleteEvents\n        /// </summary>\n        /// <remarks>\n        /// Delete event entries in a timeseries of the server historian.  See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The events to delete in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"events/delete\")]\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteEventsAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<DeleteEventsDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryDeleteEventsAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryDeleteValuesAtTimes\n        /// </summary>\n        /// <remarks>\n        /// Delete value change entries in a timeseries of the server historian. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to delete in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/delete/attimes\")]\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteValuesAtTimesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryDeleteValuesAtTimesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryDeleteModifiedValues\n        /// </summary>\n        /// <remarks>\n        /// Delete value change entries in a timeseries of the server historian. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to delete in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/delete/modified\")]\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteModifiedValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<DeleteValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryDeleteModifiedValuesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryDeleteValues\n        /// </summary>\n        /// <remarks>\n        /// Delete value change entries in a timeseries of the server historian. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to delete in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/delete\")]\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<DeleteValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryDeleteValuesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReplaceValues\n        /// </summary>\n        /// <remarks>\n        /// Replace value change entries in a timeseries of the server historian. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to replace with in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/replace\")]\n        public async Task<HistoryUpdateResponseModel> HistoryReplaceValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<UpdateValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReplaceValuesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryInsertValues\n        /// </summary>\n        /// <remarks>\n        /// Insert value change entries in a timeseries of the server historian. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to insert into the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/insert\")]\n        public async Task<HistoryUpdateResponseModel> HistoryInsertValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<UpdateValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryInsertValuesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryUpsertValues\n        /// </summary>\n        /// <remarks>\n        /// Upsert value change entries in a timeseries of the server historian. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.5\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to upsert into the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The results of the operation.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/upsert\")]\n        public async Task<HistoryUpdateResponseModel> HistoryUpsertValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryUpdateRequestModel<UpdateValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryUpsertValuesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReadEvents\n        /// </summary>\n        /// <remarks>\n        /// Read an event timeseries inside the OPC UA server historian. See\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The events to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The events read from the historian.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"events/read/first\")]\n        public async Task<HistoryReadResponseModel<HistoricEventModel[]>> HistoryReadEventsAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadEventsDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReadEventsAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReadEventsNext\n        /// </summary>\n        /// <remarks>\n        /// Continue reading an event timeseries inside the OPC UA server historian.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The continuation from a previous read request.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The events read from the historian.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"events/read/next\")]\n        public async Task<HistoryReadNextResponseModel<HistoricEventModel[]>> HistoryReadEventsNextAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadNextRequestModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReadEventsNextAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReadValues\n        /// </summary>\n        /// <remarks>\n        /// Read a data change timeseries inside the OPC UA server historian.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The values read from the historian.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read/first\")]\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReadValuesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReadValuesAtTimes\n        /// </summary>\n        /// <remarks>\n        /// Read parts of a timeseries inside the OPC UA server historian.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The values read from the historian.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read/first/attimes\")]\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAtTimesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadValuesAtTimesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReadValuesAtTimesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReadProcessedValues\n        /// </summary>\n        /// <remarks>\n        /// Read processed timeseries data inside the OPC UA server historian.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The processed values read from the historian.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read/first/processed\")]\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadProcessedValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadProcessedValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReadProcessedValuesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReadModifiedValues\n        /// </summary>\n        /// <remarks>\n        /// Read modified changes in a timeseries inside the OPC UA server historian.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The modified values read from the historian.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read/first/modified\")]\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadModifiedValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadModifiedValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReadModifiedValuesAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryReadValuesNext\n        /// </summary>\n        /// <remarks>\n        /// Continue reading a timeseries inside the OPC UA server historian.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The continuation token from a previous read operation.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The values read from the historian.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read/next\")]\n        public async Task<HistoryReadNextResponseModel<HistoricValueModel[]>> HistoryReadValuesNextAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadNextRequestModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return await _history.HistoryReadValuesNextAsync(request.Connection,\n                request.Request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// HistoryStreamValues (only HTTP transport)\n        /// </summary>\n        /// <remarks>\n        /// Read an entire timeseries from an OPC UA server historian as stream.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The values read from the historian as stream.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read\")]\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return _history.HistoryStreamValuesAsync(request.Connection, request.Request, ct);\n        }\n\n        /// <summary>\n        /// HistoryStreamModifiedValues (only HTTP transport)\n        /// </summary>\n        /// <remarks>\n        /// Read an entire modified series from an OPC UA server historian as stream.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The modified values read from the historian as stream.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read/modified\")]\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamModifiedValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadModifiedValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return _history.HistoryStreamModifiedValuesAsync(request.Connection, request.Request, ct);\n        }\n\n        /// <summary>\n        /// HistoryStreamValuesAtTimes (only HTTP transport)\n        /// </summary>\n        /// <remarks>\n        /// Read specific timeseries data from an OPC UA server historian as stream.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The values read from the historian as stream.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read/attimes\")]\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAtTimesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadValuesAtTimesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return _history.HistoryStreamValuesAtTimesAsync(request.Connection, request.Request, ct);\n        }\n\n        /// <summary>\n        /// HistoryStreamProcessedValues (only HTTP transport)\n        /// </summary>\n        /// <remarks>\n        /// Read processed timeseries data from an OPC UA server historian as stream.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The values to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The processed values read from the historian as stream.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"values/read/processed\")]\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamProcessedValuesAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadProcessedValuesDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return _history.HistoryStreamProcessedValuesAsync(request.Connection, request.Request, ct);\n        }\n\n        /// <summary>\n        /// HistoryStreamEvents (only HTTP transport)\n        /// </summary>\n        /// <remarks>\n        /// Read an entire event timeseries from an OPC UA server historian as stream.\n        /// See <a href=\"https://reference.opcfoundation.org/Core/Part11/v104/docs/\">\n        /// the relevant section of the OPC UA reference specification</a> and\n        /// <a href=\"https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.3\">\n        /// respective service documentation</a> for more information.\n        /// </remarks>\n        /// <param name=\"request\">The events to read in the timeseries.</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The events read from the historian as stream.</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The operation was successful or the response payload\n        /// contains relevant error information.</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"events/read\")]\n        public IAsyncEnumerable<HistoricEventModel> HistoryStreamEventsAsync(\n            [FromBody][Required] RequestEnvelope<HistoryReadRequestModel<ReadEventsDetailsModel>> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Connection);\n            ArgumentNullException.ThrowIfNull(request.Request);\n            return _history.HistoryStreamEventsAsync(request.Connection, request.Request, ct);\n        }\n\n        private readonly IHistoryServices<ConnectionModel> _history;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/LegacyController.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Furly.Tunnel.Router;\n    using System;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Legacy controller\n    /// </summary>\n    [Version(\"_V2\")]\n    [Version(\"_V1\")]\n    [Version(\"\")]\n    [ControllerExceptionFilter]\n    public class LegacyController : IMethodController\n    {\n        /// <summary>\n        /// Handler for GetInfo direct method\n        /// </summary>\n        /// <exception cref=\"NotSupportedException\"></exception>\n#pragma warning disable CA1822 // Mark members as static\n        public Task GetInfoAsync()\n#pragma warning restore CA1822 // Mark members as static\n        {\n            return Task.FromException(new NotSupportedException(\n                \"GetInfo not supported\"));\n        }\n\n        /// <summary>\n        /// Handler for GetDiagnosticLog direct method - not supported\n        /// </summary>\n        /// <exception cref=\"NotSupportedException\"></exception>\n#pragma warning disable CA1822 // Mark members as static\n        public Task GetDiagnosticLogAsync()\n#pragma warning restore CA1822 // Mark members as static\n        {\n            return Task.FromException(new NotSupportedException(\n                \"GetDiagnosticLog not supported\"));\n        }\n\n        /// <summary>\n        /// Handler for GetDiagnosticStartupLog direct method - not supported\n        /// </summary>\n        /// <exception cref=\"NotSupportedException\"></exception>\n#pragma warning disable CA1822 // Mark members as static\n        public Task GetDiagnosticStartupLogAsync()\n#pragma warning restore CA1822 // Mark members as static\n        {\n            return Task.FromException(new NotSupportedException(\n                \"GetDiagnosticStartupLog not supported\"));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/PublisherController.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation. All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Furly.Tunnel.Router;\n    using System;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Publisher controller\n    /// </summary>\n    [Version(\"_V2\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    public class PublisherController : IMethodController\n    {\n        /// <summary>\n        /// Support restarting the module\n        /// </summary>\n        /// <param name=\"process\"></param>\n        /// <param name=\"apikey\"></param>\n        /// <param name=\"certificate\"></param>\n        public PublisherController(IProcessControl process, IApiKeyProvider apikey,\n            ISslCertProvider certificate)\n        {\n            _apikey = apikey;\n            _certificate = certificate;\n            _process = process;\n        }\n\n        /// <summary>\n        /// Get ApiKey to use when calling the HTTP API.\n        /// </summary>\n        /// <returns></returns>\n        public Task<string?> GetApiKeyAsync()\n        {\n            return Task.FromResult(_apikey.ApiKey);\n        }\n\n        /// <summary>\n        /// Get server certificate as PEM.\n        /// </summary>\n        /// <returns></returns>\n        public Task<string?> GetServerCertificateAsync()\n        {\n            return Task.FromResult(_certificate.Certificate?.ExportCertificatePem());\n        }\n\n        /// <summary>\n        /// Shutdown\n        /// </summary>\n        /// <param name=\"failFast\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        public async Task ShutdownAsync(bool failFast = false)\n        {\n            if (!_process.Shutdown(failFast))\n            {\n                // Should be gone now\n                await Task.Delay(TimeSpan.FromSeconds(10)).ConfigureAwait(false);\n                throw new NotSupportedException(\"Failed to invoke shutdown\");\n            }\n        }\n\n        /// <summary>\n        /// Legacy shutdown\n        /// </summary>\n        /// <returns></returns>\n        public Task ExitApplicationAsync()\n        {\n            return ShutdownAsync();\n        }\n\n        private readonly IApiKeyProvider _apikey;\n        private readonly ISslCertProvider _certificate;\n        private readonly IProcessControl _process;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Controllers/WriterController.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Controllers\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Filters;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Asp.Versioning;\n    using Furly;\n    using Furly.Extensions.AspNetCore.OpenApi;\n    using Furly.Extensions.Http;\n    using Furly.Extensions.Serializers;\n    using Furly.Tunnel.Router;\n    using Microsoft.AspNetCore.Authorization;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using System;\n    using System.Collections.Generic;\n    using System.ComponentModel.DataAnnotations;\n    using System.Globalization;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// <para>\n    /// This section contains the API to configure data set writers and writer\n    /// groups inside OPC Publisher. It supersedes the configuration API.\n    /// Applications should use one or the other, but not both at the same\n    /// time.\n    /// </para>\n    /// <para>\n    /// The method name for all transports other than HTTP (which uses the shown\n    /// HTTP methods and resource uris) is the name of the subsection header.\n    /// To use the version specific method append \"_V1\" or \"_V2\" to the method\n    /// name.\n    /// </para>\n    /// </summary>\n    [Version(\"_V2\")]\n    [Version(\"_V1\")]\n    [Version(\"\")]\n    [RouterExceptionFilter]\n    [ControllerExceptionFilter]\n    [ApiVersion(\"2\")]\n    [Route(\"v{version:apiVersion}/writer\")]\n    [ApiController]\n    [Authorize]\n    [Produces(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    [Consumes(ContentMimeType.Json, ContentMimeType.MsgPack)]\n    public class WriterController : ControllerBase, IMethodController\n    {\n        /// <summary>\n        /// Create publisher methods controller\n        /// </summary>\n        /// <param name=\"publisher\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"assets\"></param>\n        /// <param name=\"serializer\"></param>\n        public WriterController(IPublishedNodesServices publisher,\n            IConfigurationServices configuration, IAssetConfiguration<byte[]> assets,\n            IJsonSerializer serializer)\n        {\n            _publisher = publisher;\n            _configuration = configuration;\n            _assets = assets;\n            _serializer = serializer;\n        }\n\n        /// <summary>\n        /// CreateOrUpdateDataSetWriterEntry\n        /// </summary>\n        /// <remarks>\n        /// Create a published nodes entry for a specific writer group and dataset writer.\n        /// The entry must specify a unique writer group and dataset writer id. A null value\n        /// is treated as empty string. If the entry is found it is replaced, if it is not\n        /// found, it is created. If more than one entry is found with the same writer group\n        /// and writer id an error is returned. The writer entry provided must include at\n        /// least one node which will be the initial set. All nodes must specify a unique\n        /// dataSetFieldId. A null value is treated as empty string. Publishing intervals\n        /// at node level are also not supported and generate an error. Publishing\n        /// intervals must be configured at the data set writer level.\n        /// </remarks>\n        /// <param name=\"dataSetWriterEntry\">The entry to create for the writer</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterEntry\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The item was created</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to update.</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [HttpPut]\n        public async Task CreateOrUpdateDataSetWriterEntryAsync(\n            [FromBody][Required] PublishedNodesEntryModel dataSetWriterEntry,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterEntry);\n            await _publisher.CreateOrUpdateDataSetWriterEntryAsync(\n                dataSetWriterEntry, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetDataSetWriterEntry\n        /// </summary>\n        /// <remarks>\n        /// Get the published nodes entry for a specific writer group and dataset writer.\n        /// Dedicated errors are returned if no, or no unique entry could be found. The\n        /// entry does not contain the nodes. Nodes can be retrieved using the GetNodes\n        /// API.\n        /// </remarks>\n        /// <param name=\"dataSetWriterGroup\">The writer group name of the entry</param>\n        /// <param name=\"dataSetWriterId\">The data set writer identifer of the entry</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The entry selected without nodes</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterGroup\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterId\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The item was found</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">There is no unique item present.</response>\n        /// <response code=\"404\">The item was not found</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [HttpGet(\"{dataSetWriterGroup}/{dataSetWriterId}\")]\n        public async Task<PublishedNodesEntryModel> GetDataSetWriterEntryAsync(\n            string dataSetWriterGroup, string dataSetWriterId, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            return await _publisher.GetDataSetWriterEntryAsync(\n                dataSetWriterGroup, dataSetWriterId, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// AddOrUpdateNodes\n        /// </summary>\n        /// <remarks>\n        /// Add Nodes to a dedicated data set writer in a writer group. Each node must have\n        /// a unique DataSetFieldId. If the field already exists, the node is updated.\n        /// If a node does not have a dataset field id an error is returned. Publishing\n        /// intervals at node level are also not supported and generate an error. Publishing\n        /// intervals must be configured at the data set writer level.\n        /// </remarks>\n        /// <param name=\"dataSetWriterGroup\">The writer group name of the entry</param>\n        /// <param name=\"dataSetWriterId\">The data set writer identifer of the entry</param>\n        /// <param name=\"opcNodes\">Nodes to add or update</param>\n        /// <param name=\"insertAfterFieldId\">Field after which to insert the nodes. If\n        /// not specified, nodes are added at the end of the entry</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterGroup\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterId\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"opcNodes\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The items were added</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique entry could not be found to add to.</response>\n        /// <response code=\"404\">The entry was not found</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [HttpPost(\"{dataSetWriterGroup}/{dataSetWriterId}/add\")]\n        public async Task AddOrUpdateNodesAsync(string dataSetWriterGroup, string dataSetWriterId,\n            [FromBody][Required] IReadOnlyList<OpcNodeModel> opcNodes,\n            [FromQuery] string? insertAfterFieldId = null, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            ArgumentNullException.ThrowIfNull(opcNodes);\n            await _publisher.AddOrUpdateNodesAsync(dataSetWriterGroup, dataSetWriterId,\n                opcNodes, insertAfterFieldId, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// AddOrUpdateNode\n        /// </summary>\n        /// <remarks>\n        /// Add a node to a dedicated data set writer in a writer group. A node must have\n        /// a unique DataSetFieldId. If the field already exists, the node is updated.\n        /// If a node does not have a dataset field id an error is returned. Publishing\n        /// intervals at node level are also not supported and generate an error. Publishing\n        /// intervals must be configured at the data set writer level.\n        /// </remarks>\n        /// <param name=\"dataSetWriterGroup\">The writer group name of the entry</param>\n        /// <param name=\"dataSetWriterId\">The data set writer identifer of the entry</param>\n        /// <param name=\"opcNode\">Node to add or update</param>\n        /// <param name=\"insertAfterFieldId\">Field after which to insert the nodes. If\n        /// not specified, nodes are added at the end of the entry</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterGroup\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterId\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"opcNode\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The item was added</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to update.</response>\n        /// <response code=\"404\">An entry was not found to add the node to</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [HttpPut(\"{dataSetWriterGroup}/{dataSetWriterId}\")]\n        public async Task AddOrUpdateNodeAsync(string dataSetWriterGroup, string dataSetWriterId,\n            [FromBody][Required] OpcNodeModel opcNode,\n            [FromQuery] string? insertAfterFieldId = null, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            ArgumentNullException.ThrowIfNull(opcNode);\n            await _publisher.AddOrUpdateNodesAsync(dataSetWriterGroup, dataSetWriterId,\n                new[] { opcNode }, insertAfterFieldId, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// RemoveNodes\n        /// </summary>\n        /// <remarks>\n        /// Remove Nodes that match the provided data set field ids from a data set writer\n        /// in a writer group. If one of the fields is not found, no error is returned,\n        /// however, if all fields are not found an error is returned.\n        /// </remarks>\n        /// <param name=\"dataSetWriterGroup\">The writer group name of the entry</param>\n        /// <param name=\"dataSetWriterId\">The data set writer identifer of the entry</param>\n        /// <param name=\"dataSetFieldIds\">The identifiers of the fields to remove</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterGroup\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterId\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetFieldIds\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">Some or all items were removed</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to remove from.</response>\n        /// <response code=\"404\">The entry or all items to remove were not found</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [HttpPost(\"{dataSetWriterGroup}/{dataSetWriterId}/remove\")]\n        public async Task RemoveNodesAsync(string dataSetWriterGroup, string dataSetWriterId,\n            [FromBody][Required] IReadOnlyList<string> dataSetFieldIds,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            ArgumentNullException.ThrowIfNull(dataSetFieldIds);\n            await _publisher.RemoveNodesAsync(dataSetWriterGroup, dataSetWriterId,\n                dataSetFieldIds, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// RemoveNode\n        /// </summary>\n        /// <remarks>\n        /// Remove a node with the specified data set field id from a data set writer\n        /// in a writer group. If the field is not found, an error is returned.\n        /// </remarks>\n        /// <param name=\"dataSetWriterGroup\">The writer group name of the entry</param>\n        /// <param name=\"dataSetWriterId\">The data set writer identifer of the entry</param>\n        /// <param name=\"dataSetFieldId\">Identifier of the field to remove</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterGroup\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterId\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetFieldId\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The item was removed</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to remove from.</response>\n        /// <response code=\"404\">The entry or item to remove was not found</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [HttpDelete(\"{dataSetWriterGroup}/{dataSetWriterId}/{dataSetFieldId}\")]\n        public async Task RemoveNodeAsync(string dataSetWriterGroup, string dataSetWriterId,\n            string dataSetFieldId, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            ArgumentNullException.ThrowIfNull(dataSetFieldId);\n            await _publisher.RemoveNodesAsync(dataSetWriterGroup, dataSetWriterId,\n                new[] { dataSetFieldId }, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetNode\n        /// </summary>\n        /// <remarks>\n        /// Get a node from a dataset in a writer group.\n        /// Dedicated errors are returned if no, or no unique entry could be found, or\n        /// the node does not exist.\n        /// </remarks>\n        /// <param name=\"dataSetWriterGroup\">The writer group name of the entry</param>\n        /// <param name=\"dataSetWriterId\">The data set writer identifer of the entry</param>\n        /// <param name=\"dataSetFieldId\">The data set field id of the node to return</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>The node inside the dataset</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterGroup\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterId\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetFieldId\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The item was retrieved</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to get a node from.</response>\n        /// <response code=\"404\">The entry or item was not found</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [HttpGet(\"{dataSetWriterGroup}/{dataSetWriterId}/{dataSetFieldId}\")]\n        public async Task<OpcNodeModel> GetNodeAsync(\n            string dataSetWriterGroup, string dataSetWriterId, string dataSetFieldId,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            ArgumentNullException.ThrowIfNull(dataSetFieldId);\n            return await _publisher.GetNodeAsync(\n                dataSetWriterGroup, dataSetWriterId, dataSetFieldId, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetNodes\n        /// </summary>\n        /// <remarks>\n        /// Get Nodes from a data set writer in a writer group. The nodes can optionally\n        /// be offset from a previous last node identified by the dataSetFieldId and\n        /// pageanated by the pageSize. If the dataSetFieldId is not found, an empty list\n        /// is returned. If the dataSetFieldId is not specified, the first page is returned.\n        /// </remarks>\n        /// <param name=\"dataSetWriterGroup\">The writer group name of the entry</param>\n        /// <param name=\"dataSetWriterId\">The data set writer identifer of the entry</param>\n        /// <param name=\"lastDataSetFieldId\">the field id after which to start the page.\n        /// If not specified, nodes from the beginning are returned.</param>\n        /// <param name=\"pageSize\">Number of nodes to return</param>\n        /// <param name=\"ct\"></param>\n        /// <returns>List of nodes or none if none were found</returns>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterGroup\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterId\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The items were found</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to get nodes from.</response>\n        /// <response code=\"404\">The entry was not found</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [HttpGet(\"{dataSetWriterGroup}/{dataSetWriterId}/nodes\")]\n        [AutoRestExtension(NextPageLinkName = \"lastDataSetFieldId\")]\n        public async Task<IReadOnlyList<OpcNodeModel>> GetNodesAsync(\n            string dataSetWriterGroup, string dataSetWriterId,\n            [FromQuery] string? lastDataSetFieldId = null,\n            [FromQuery] int? pageSize = null, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            if (Request != null)\n            {\n                if (Request.Headers.TryGetValue(HttpHeader.ContinuationToken, out var value))\n                {\n                    lastDataSetFieldId = value.FirstOrDefault();\n                }\n                if (Request.Headers.TryGetValue(HttpHeader.MaxItemCount, out value))\n                {\n                    pageSize = int.Parse(value.FirstOrDefault()!,\n                        CultureInfo.InvariantCulture);\n                }\n            }\n            return await _publisher.GetNodesAsync(dataSetWriterGroup, dataSetWriterId,\n                lastDataSetFieldId, pageSize, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// RemoveDataSetWriterEntry\n        /// </summary>\n        /// <remarks>\n        /// Remove the published nodes entry for a specific data set writer in a writer\n        /// group. Dedicated errors are returned if no, or no unique entry could be found.\n        /// </remarks>\n        /// <param name=\"dataSetWriterGroup\">The writer group name of the entry</param>\n        /// <param name=\"dataSetWriterId\">The data set writer identifer of the entry</param>\n        /// <param name=\"force\">Force delete all writers even if more than one were\n        /// found. Does not error when none were found.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterGroup\"/>\n        /// is <c>null</c>.</exception>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"dataSetWriterId\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The entry was removed</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to remove.</response>\n        /// <response code=\"404\">The entry to remove was not found</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]\n        [HttpDelete(\"{dataSetWriterGroup}/{dataSetWriterId}\")]\n        public async Task RemoveDataSetWriterEntryAsync(string dataSetWriterGroup,\n            string dataSetWriterId, [FromQuery] bool force = false, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            await _publisher.RemoveDataSetWriterEntryAsync(dataSetWriterGroup,\n                dataSetWriterId, force, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// ExpandWriter\n        /// </summary>\n        /// <remarks>\n        /// Expands the provided nodes in the entry to a series of published node entries.\n        /// The provided entry is used template. The entry is expanded using expansion\n        /// configuration provided. Expanded entries are returned one by one with error\n        /// information if any. The configuration is not updated but the resulting entries\n        /// can be modified and later saved in the configuration using the configuration\n        /// API. The server must be online and accessible\n        /// for the expansion to work.\n        /// </remarks>\n        /// <param name=\"request\">The entry to expand and the node expansion configuration\n        /// to use. If no configuration is provided a default configuration is used which\n        /// and no error entries are returned.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The item was created</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to update.</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"expand\")]\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> ExpandWriterAsync(\n            [FromBody][Required] PublishedNodesEntryRequestModel<PublishedNodeExpansionModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            var expansion = request.Request ?? new PublishedNodeExpansionModel { DiscardErrors = true };\n            return _configuration.ExpandAsync(request.Entry, expansion, ct);\n        }\n\n        /// <summary>\n        /// ExpandAndCreateOrUpdateDataSetWriterEntries\n        /// </summary>\n        /// <remarks>\n        /// Create a series of published nodes entries using the provided entry as template.\n        /// The entry is expanded using expansion configuration provided. Expanded entries\n        /// are returned one by one with error information if any. The configuration is also\n        /// saved in the local configuration store. The server must be online and accessible\n        /// for the expansion to work.\n        /// </remarks>\n        /// <param name=\"request\">The entry to create for the writer and node expansion\n        /// configuration to use</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The item was created</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"403\">A unique item could not be found to update.</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost]\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> ExpandAndCreateOrUpdateDataSetWriterEntriesAsync(\n            [FromBody][Required] PublishedNodesEntryRequestModel<PublishedNodeExpansionModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            var expansion = request.Request ?? new PublishedNodeExpansionModel { DiscardErrors = false };\n            return _configuration.CreateOrUpdateAsync(request.Entry, expansion, ct);\n        }\n\n        /// <summary>\n        /// CreateOrUpdateAsset (With binary configuration)\n        /// </summary>\n        /// <remarks>\n        /// Creates an asset from the entry in the request and the configuration provided\n        /// in the Web of Things Asset configuration byte buffer. The entry must contain a\n        /// data set name which will be used as the asset name. The writer can stay empty.\n        /// It will be set to the asset id on successful return. The server must support the\n        /// WoT profile per <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\"/>.\n        /// The asset will be created and the configuration updated to reference it. A\n        /// wait time can be provided as optional query parameter to wait until the server\n        /// has settled after uploading the configuration.\n        /// </remarks>\n        /// <param name=\"request\">The contains the entry and WoT file to configure the\n        /// server to expose the asset.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The asset was created</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"assets/create\")]\n        [Ignore]\n        public async Task<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAsset2Async(\n            [FromBody][Required] PublishedNodeCreateAssetRequestModel<byte[]> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            return await _assets.CreateOrUpdateAssetAsync(request, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// CreateOrUpdateAsset\n        /// </summary>\n        /// <remarks>\n        /// Creates an asset from the entry in the request and the configuration provided\n        /// in the Web of Things Asset json configuration property. The entry must contain\n        /// a data set name which will be used as the asset name. The writer can stay empty.\n        /// It will be set to the asset id on successful return. The server must support the\n        /// WoT profile per <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\"/>.\n        /// The asset will be created and the configuration updated to reference it. A\n        /// wait time can be provided as optional query parameter to wait until the server\n        /// has settled after uploading the configuration.\n        /// </remarks>\n        /// <param name=\"request\">The contains the entry and WoT file to configure the\n        /// server to expose the asset.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The asset was created</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"assets\")]\n        public async Task<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAssetAsync(\n            [FromBody][Required] PublishedNodeCreateAssetRequestModel<VariantValue> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            return await _assets.CreateOrUpdateAssetAsync(new PublishedNodeCreateAssetRequestModel<byte[]>\n            {\n                Entry = request.Entry,\n                WaitTime = request.WaitTime,\n                Header = request.Header,\n                Configuration = _serializer.SerializeObjectToMemory(request.Configuration).ToArray()\n            }, ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// GetAllAssets\n        /// </summary>\n        /// <remarks>\n        /// Get a list of entries representing the assets in the server. This will not touch\n        /// the configuration, it will obtain the list from the server. If the server does not\n        /// support <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\"/> the\n        /// result will be empty.\n        /// </remarks>\n        /// <param name=\"request\">The entry to use to list the assets with the optional\n        /// header information used when invoking services on the server.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">Successfully completed the listing</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"assets/list\")]\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> GetAllAssetsAsync(\n            [FromBody][Required] PublishedNodesEntryRequestModel<RequestHeaderModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            return _assets.GetAllAssetsAsync(request.Entry, request.Request, ct);\n        }\n\n        /// <summary>\n        /// DeleteAsset\n        /// </summary>\n        /// <remarks>\n        /// Delete the asset referenced by the entry in the request. The entry must contain\n        /// the asset id to delete. The asset id is the data set writer id. The entry must\n        /// also contain the writer group id or deletion of the asset in the configuration\n        /// will fail before the asset is deleted. The server must support WoT connectivity\n        /// profile per <see href=\"https://reference.opcfoundation.org/WoT/v100/docs/\"/>.\n        /// First the entry in the configuration will be deleted and then the asset on the\n        /// server. If deletion of the asset in the configuration fails it will not be\n        /// deleted in the server. An optional request option force can be used to force\n        /// the deletion of the asset in the server regardless of the failure to delete the\n        /// entry in the configuration.\n        /// </remarks>\n        /// <param name=\"request\">Request that contains the entry of the asset that\n        /// should be deleted.</param>\n        /// <param name=\"ct\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"request\"/>\n        /// is <c>null</c>.</exception>\n        /// <response code=\"200\">The asset was deleted successfully</response>\n        /// <response code=\"400\">The passed in information is invalid</response>\n        /// <response code=\"408\">The operation timed out.</response>\n        /// <response code=\"500\">An unexpected error occurred</response>\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status403Forbidden)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status408RequestTimeout)]\n        [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)]\n        [HttpPost(\"assets/delete\")]\n        public async Task<ServiceResultModel> DeleteAssetAsync(\n            [FromBody][Required] PublishedNodeDeleteAssetRequestModel request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            return await _assets.DeleteAssetAsync(request, ct).ConfigureAwait(false);\n        }\n\n        private readonly IPublishedNodesServices _publisher;\n        private readonly IConfigurationServices _configuration;\n        private readonly IAssetConfiguration<byte[]> _assets;\n        private readonly IJsonSerializer _serializer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Filters/ControllerExceptionFilterAttribute.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Filters\n{\n    using Azure.IIoT.OpcUa.Exceptions;\n    using Furly.Exceptions;\n    using Furly.Tunnel.Exceptions;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.AspNetCore.Mvc;\n    using Microsoft.AspNetCore.Mvc.Filters;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Diagnostics.ExceptionSummarization;\n    using System;\n    using System.IO;\n    using System.Net;\n    using System.Net.Sockets;\n    using System.Security;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Detect all the unhandled exceptions returned by the API controllers\n    /// and decorate the response accordingly, managing the HTTP status code\n    /// and preparing a JSON response with useful error details.\n    /// When including the stack trace, split the text in multiple lines\n    /// for an easier parsing.\n    /// @see https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters\n    /// </summary>\n    public sealed class ControllerExceptionFilterAttribute : ExceptionFilterAttribute\n    {\n        /// <inheritdoc />\n        public override void OnException(ExceptionContext context)\n        {\n            ArgumentNullException.ThrowIfNull(context);\n\n            if (context.Exception == null)\n            {\n                base.OnException(context);\n                return;\n            }\n\n            if (context.Exception is AggregateException ae)\n            {\n                var root = ae.GetBaseException();\n                if (root is AggregateException && ae.InnerExceptions.Count > 0)\n                {\n                    context.Exception = ae.InnerExceptions[0];\n                }\n                else\n                {\n                    context.Exception = root;\n                }\n            }\n\n            var summarizer = context.HttpContext?.RequestServices?\n                .GetService<IExceptionSummarizer>();\n            switch (context.Exception)\n            {\n                case ResourceNotFoundException:\n                    context.Result = GetResponse(HttpStatusCode.NotFound,\n                        context.Exception, summarizer);\n                    break;\n                case ResourceInvalidStateException:\n                    context.Result = GetResponse(HttpStatusCode.Forbidden,\n                        context.Exception, summarizer);\n                    break;\n                case ResourceConflictException:\n                    context.Result = GetResponse(HttpStatusCode.Conflict,\n                        context.Exception, summarizer);\n                    break;\n                case UnauthorizedAccessException:\n                case SecurityException:\n                    context.Result = GetResponse(HttpStatusCode.Unauthorized,\n                        context.Exception, summarizer);\n                    break;\n                case MethodCallStatusException mcs:\n                    context.Result = new ObjectResult(mcs.Details.ToProblemDetails());\n                    break;\n                case SerializerException:\n                case MethodCallException:\n                case BadRequestException:\n                case ArgumentException:\n                    context.Result = GetResponse(HttpStatusCode.BadRequest,\n                        context.Exception, summarizer);\n                    break;\n                case NotSupportedException:\n                    context.Result = GetResponse(HttpStatusCode.MethodNotAllowed,\n                        context.Exception, summarizer);\n                    break;\n                case NotImplementedException:\n                    context.Result = GetResponse(HttpStatusCode.NotImplemented,\n                        context.Exception, summarizer);\n                    break;\n                case TimeoutException:\n                    context.Result = GetResponse(HttpStatusCode.RequestTimeout,\n                        context.Exception, summarizer);\n                    break;\n                case SocketException:\n                case IOException:\n                    context.Result = GetResponse(HttpStatusCode.BadGateway,\n                        context.Exception, summarizer);\n                    break;\n\n                //\n                // The following will most certainly be retried by our\n                // service client implementations and thus dependent\n                // services:\n                //\n                //      InternalServerError\n                //      BadGateway\n                //      ServiceUnavailable\n                //      GatewayTimeout\n                //      PreconditionFailed\n                //      TemporaryRedirect\n                //      TooManyRequests\n                //\n                // As such, if you want to terminate make sure exception\n                // is caught ahead of here and returns a status other than\n                // one of the above.\n                //\n\n                case ServerBusyException:\n                    context.Result = GetResponse(HttpStatusCode.TooManyRequests,\n                        context.Exception, summarizer);\n                    break;\n                case ResourceOutOfDateException:\n                    context.Result = GetResponse(HttpStatusCode.PreconditionFailed,\n                        context.Exception, summarizer);\n                    break;\n                case ExternalDependencyException:\n                    context.Result = GetResponse(HttpStatusCode.ServiceUnavailable,\n                        context.Exception, summarizer);\n                    break;\n                default:\n                    context.Result = GetResponse(HttpStatusCode.InternalServerError,\n                        context.Exception, summarizer);\n                    break;\n            }\n        }\n\n        /// <inheritdoc />\n        public override Task OnExceptionAsync(ExceptionContext context)\n        {\n            try\n            {\n                OnException(context);\n                return Task.CompletedTask;\n            }\n            catch (Exception)\n            {\n                return base.OnExceptionAsync(context);\n            }\n        }\n\n        /// <summary>\n        /// Create result\n        /// </summary>\n        /// <param name=\"code\"></param>\n        /// <param name=\"exception\"></param>\n        /// <param name=\"summarizer\"></param>\n        /// <returns></returns>\n        private static ObjectResult GetResponse(HttpStatusCode code, Exception exception,\n            IExceptionSummarizer? summarizer)\n        {\n            if (summarizer != null)\n            {\n                var ex = exception.AsMethodCallStatusException((int)code, summarizer);\n                return new ObjectResult(ex.Details.ToProblemDetails())\n                {\n                    StatusCode = (int)code\n                };\n            }\n\n            return new ObjectResult(exception.Message)\n            {\n                StatusCode = (int)code\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Filters/RouterExceptionFilterAttribute.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Filters\n{\n    using Azure.IIoT.OpcUa.Exceptions;\n    using Furly.Exceptions;\n    using Furly.Tunnel.Router;\n    using System;\n    using System.IO;\n    using System.Net;\n    using System.Net.Sockets;\n    using System.Security;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Convert all the exceptions returned by the module controllers to a\n    /// status code.\n    /// </summary>\n    public sealed class RouterExceptionFilterAttribute : ExceptionFilterAttribute\n    {\n        /// <inheritdoc />\n        public override Exception Filter(Exception exception, out int status)\n        {\n            switch (exception)\n            {\n                case AggregateException ae:\n                    var root = ae.GetBaseException();\n                    if (root is not AggregateException ae2)\n                    {\n                        return Filter(root, out status);\n                    }\n                    status = (int)HttpStatusCode.InternalServerError;\n                    Exception? result = null;\n                    foreach (var ex in ae2.InnerExceptions)\n                    {\n                        result = Filter(ex, out status);\n                        if (status != (int)HttpStatusCode.InternalServerError)\n                        {\n                            break;\n                        }\n                    }\n                    return result ?? new InvalidOperationException();\n                case ResourceNotFoundException:\n                    status = (int)HttpStatusCode.NotFound;\n                    break;\n                case ResourceInvalidStateException:\n                    status = (int)HttpStatusCode.Forbidden;\n                    break;\n                case ResourceConflictException:\n                    status = (int)HttpStatusCode.Conflict;\n                    break;\n                case SecurityException:\n                case UnauthorizedAccessException:\n                    status = (int)HttpStatusCode.Unauthorized;\n                    break;\n                case MethodCallStatusException mcse:\n                    status = mcse.Details.Status\n                        ?? (int)HttpStatusCode.InternalServerError;\n                    break;\n                case SerializerException:\n                case MethodCallException:\n                case BadRequestException:\n                case ArgumentException:\n                    status = (int)HttpStatusCode.BadRequest;\n                    break;\n                case NotImplementedException:\n                    status = (int)HttpStatusCode.NotImplemented;\n                    break;\n                case NotSupportedException:\n                    status = (int)HttpStatusCode.MethodNotAllowed;\n                    break;\n                case TimeoutException:\n                    status = (int)HttpStatusCode.RequestTimeout;\n                    break;\n                case SocketException:\n                case IOException:\n                    status = (int)HttpStatusCode.BadGateway;\n                    break;\n                case MessageSizeLimitException:\n                    status = (int)HttpStatusCode.RequestEntityTooLarge;\n                    break;\n                case TaskCanceledException:\n                case OperationCanceledException:\n                    status = (int)HttpStatusCode.Gone;\n                    return new OperationCanceledException(\n                        \"Request was canceled by the client or after timeout.\");\n\n                //\n                // The following will most certainly be retried by our\n                // service client implementations and thus dependent\n                // services:\n                //\n                //      InternalServerError\n                //      GatewayTimeout\n                //      PreconditionFailed\n                //      TemporaryRedirect\n                //      TooManyRequests\n                //\n                // As such, if you want to terminate make sure exception\n                // is caught ahead of here and returns a status other than\n                // one of the above.\n                //\n\n                case ServerBusyException:\n                    status = (int)HttpStatusCode.TooManyRequests;\n                    break;\n                case ExternalDependencyException:\n                    status = (int)HttpStatusCode.ServiceUnavailable;\n                    break;\n                case ResourceOutOfDateException:\n                    status = (int)HttpStatusCode.PreconditionFailed;\n                    break;\n                default:\n                    status = (int)HttpStatusCode.InternalServerError;\n                    break;\n            }\n            return exception;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Program.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module\n{\n    using Autofac.Extensions.DependencyInjection;\n    using Azure.IIoT.OpcUa.Publisher.Module.Runtime;\n    using Furly.Extensions.Hosting;\n    using k8s;\n    using Microsoft.AspNetCore.Hosting;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Hosting;\n    using System;\n    using System.Diagnostics;\n    using System.IO;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Module\n    /// </summary>\n    public static class Program\n    {\n        /// <summary>\n        /// Log logo\n        /// </summary>\n        /// <param name=\"userString\"></param>\n        private static void LogLogo(string userString)\n        {\n            Console.WriteLine($@\"\n ██████╗ ██████╗  ██████╗    ██████╗ ██╗   ██╗██████╗ ██╗     ██╗███████╗██╗  ██╗███████╗██████╗\n██╔═══██╗██╔══██╗██╔════╝    ██╔══██╗██║   ██║██╔══██╗██║     ██║██╔════╝██║  ██║██╔════╝██╔══██╗\n██║   ██║██████╔╝██║         ██████╔╝██║   ██║██████╔╝██║     ██║███████╗███████║█████╗  ██████╔╝\n██║   ██║██╔═══╝ ██║         ██╔═══╝ ██║   ██║██╔══██╗██║     ██║╚════██║██╔══██║██╔══╝  ██╔══██╗\n╚██████╔╝██║     ╚██████╗    ██║     ╚██████╔╝██████╔╝███████╗██║███████║██║  ██║███████╗██║  ██║\n ╚═════╝ ╚═╝      ╚═════╝    ╚═╝      ╚═════╝ ╚═════╝ ╚══════╝╚═╝╚══════╝╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝\n{PublisherConfig.Version,97}\n{userString,97}\n\");\n        }\n\n        /// <summary>\n        /// Main entry point\n        /// </summary>\n        /// <param name=\"args\"></param>\n        public static void Main(string[] args)\n        {\n#if DEBUG\n            if (args.Any(a => a.Contains(\"wfd\", StringComparison.InvariantCultureIgnoreCase) ||\n                a.Contains(\"waitfordebugger\", StringComparison.InvariantCultureIgnoreCase)) ||\n                KubernetesClientConfiguration.IsInCluster())\n            {\n                Console.WriteLine(\"Waiting for debugger being attached...\");\n                while (!Debugger.IsAttached)\n                {\n                    Thread.Sleep(1000);\n                }\n                Console.WriteLine(\"Debugger attached.\");\n                Debugger.Break();\n            }\n#endif\n            using var cts = new CancellationTokenSource();\n            RunAsync(args, cts.Token).GetAwaiter().GetResult();\n        }\n\n        /// <summary>\n        /// Async main entry point\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static async Task RunAsync(string[] args, CancellationToken ct)\n        {\n            var userString = string.Empty;\n\n            if (PublisherConfig.IsContainer)\n            {\n                var currentDir = Environment.CurrentDirectory;\n                var currentUser = Environment.UserName;\n                if (!IsWriteable(currentDir))\n                {\n                    currentDir = \"/home\" +\n                        (string.IsNullOrEmpty(currentUser) ? currentDir : $\"/{currentUser}\");\n                    // Rootless containers have read-only filesystem except /home\n                    Environment.CurrentDirectory = currentDir;\n                }\n                userString =  $\"Running as [{currentUser}] in {currentDir}\";\n            }\n\n            LogLogo(userString);\n            await CreateHostBuilder(args).RunAsync(ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Create host builder\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <returns></returns>\n        public static IHostBuilder CreateHostBuilder(string[] args)\n        {\n            return Host.CreateDefaultBuilder()\n                .UseServiceProviderFactory(new AutofacServiceProviderFactory())\n                .ConfigureHostConfiguration(builder => builder\n                    .SetBasePath(Directory.GetCurrentDirectory())\n                    .AddJsonFile(\"appsettings.json\", true)\n                    .AddEnvironmentVariables()\n                    .AddFromDotEnvFile()\n                    .AddSecrets()\n                    .AddConnectorAdditionalConfiguration()\n                    .AddInMemoryCollection(new CommandLine(args)))\n                .ConfigureWebHostDefaults(builder => builder\n                    //.UseUrls(\"http://*:9702\", \"https://*:9703\")\n                    .UseStartup<Startup>()\n                    .UseKestrel(o => o.AddServerHeader = false))\n                ;\n        }\n\n\n        /// <summary>\n        /// Tests whether the path is writeable\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <returns></returns>\n        private static bool IsWriteable(string path)\n        {\n            try\n            {\n                string tempFilePath = Path.Combine(path, Path.GetRandomFileName());\n                using (FileStream fs = File.Create(tempFilePath))\n                {\n                    // File created successfully, directory is writable\n                }\n                // Delete the temporary file\n                File.Delete(tempFilePath);\n                return true;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"Azure.IIoT.OpcUa.Publisher.Module.Tests\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Runtime/CommandLine.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Runtime\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Runtime;\n    using Furly.Azure.IoT.Edge;\n    using Furly.Extensions.Messaging;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Mono.Options;\n    using Newtonsoft.Json;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n\n    /// <summary>\n    /// Class that represents a dictionary with all command line arguments from\n    /// the current and legacy versions of the OPC Publisher. They are represented\n    /// via configuration interfaces that is injected into the publisher container.\n    /// </summary>\n    public sealed class CommandLine : Dictionary<string, string?>\n    {\n        /// <summary>\n        /// Creates a new instance of the cli options based on existing configuration values.\n        /// </summary>\n        public CommandLine()\n        {\n            _logger = new CommandLineLogger();\n        }\n\n        internal enum HelpType\n        {\n            None,\n            CommandLine,\n            EnvVars,\n            MessageProfiles\n        }\n\n        /// <summary>\n        /// Parse arguments and set values in the environment the way the new configuration expects it.\n        /// </summary>\n        /// <param name=\"args\">The specified command line arguments.</param>\n        /// <param name=\"logger\"></param>\n        public CommandLine(string[] args, CommandLineLogger? logger = null)\n        {\n            _logger = logger ?? new CommandLineLogger();\n            var help = HelpType.None;\n            var unsupportedOptions = new List<string>();\n            var legacyOptions = new List<string>();\n\n            // Key for the Legacy (before 2.9) compatibility mode. Controlled the content type value\n            const string LegacyCompatibility = \"LegacyCompatibility\";\n\n            // command line options\n            var options = new Mono.Options.OptionSet\n            {\n                \"\",\n                \"General\",\n                \"-------\",\n                \"\",\n\n                // show help\n                { \"h|help\",\n                    \"Show help and exit.\\n\",\n                    _ => help = HelpType.CommandLine },\n                { \"help-env\",\n                    \"Show environment variables and exit.\\n\",\n                    _ => help = HelpType.EnvVars},\n                { \"help-mm\",\n                    \"Show message modes and exit.\\n\",\n                    _ => help = HelpType.MessageProfiles},\n\n                // Publisher configuration options\n                { $\"f|pf=|publishfile=|{PublisherConfig.PublishedNodesFileKey}=\",\n                    \"The name of the file containing the configuration of the nodes to be published as well as the information to connect to the OPC UA server sources.\\nThis file is also used to persist changes made through the control plane, e.g., through IoT Hub device method calls.\\nWhen no file is specified a default `publishednodes.json` file is created in the working directory.\\nDefault: `publishednodes.json`\\n\",\n                    s => this[PublisherConfig.PublishedNodesFileKey] = s },\n                { $\"cf|createifnotexist:|{PublisherConfig.CreatePublishFileIfNotExistKey}:\",\n                    \"Permit publisher to create the the specified publish file if it does not exist. The new file will be created under the access rights of the publisher module.\\nThe default file 'publishednodes.json' is always created when no file name was provided on the command line and this option is ignored.\\nIf a file was specified but does not exist and should not be created the module exits.\\nDefault: `false`\\n\",\n                    (bool? b) => this[PublisherConfig.CreatePublishFileIfNotExistKey] = b?.ToString() ?? \"True\" },\n                { $\"pol|usepolling:|{PublisherConfig.UseFileChangePollingKey}:\",\n                    \"Poll for file changes instead of using a file system watcher.\\nUse this setting when the underlying file system does not support file system notifications such as in some docker container setups.\\nDefault: `false`\\n\",\n                    (bool? b) => this[PublisherConfig.UseFileChangePollingKey] = b?.ToString() ?? \"True\" },\n                { $\"fe|forceencryptedcredentials:|{PublisherConfig.ForceCredentialEncryptionKey}:\",\n                    \"If set to true the publisher will never write plain text credentials into the published nodes configuration file.\\nIf a credential cannot be written to the file using the IoT Edge workload API crypto provider the publisher will exit with an error.\\nDefault: `false` (write secrets as plain text into the configuration file which should be properly ACL'ed)\\n\",\n                    (bool? b) => this[PublisherConfig.ForceCredentialEncryptionKey] = b?.ToString() ?? \"True\" },\n                { $\"id|publisherid=|{PublisherConfig.PublisherIdKey}=\",\n                    \"Sets the publisher id of the publisher.\\nDefault: `not set` which results in the IoT edge identity being used \\n\",\n                    s => this[PublisherConfig.PublisherIdKey] = s},\n                { $\"s|site=|{PublisherConfig.SiteIdKey}=\",\n                    \"Sets the site name of the publisher module.\\nDefault: `not set` \\n\",\n                    s => this[PublisherConfig.SiteIdKey] = s},\n                { $\"pi|initfile:|{Configuration.FileSystem.InitFilePathKey}:\",\n                    $\"A file from which to read initialization instructions.\\nUse this option to have OPC Publisher run a set of method calls found in this file.\\nThe file must be formatted using a subset of the .http/.rest file format without support for indentation, scripting or environment variables.\\nDefault: `not set` (disabled). If only a file name is specified, it is loaded from the path of the file specifed using `-f` (`{PublisherConfig.PublishedNodesFileKey}`). If just the argument is provided without a value the default is `publishednodes.init`.\\n\",\n                    pi => this[Configuration.FileSystem.InitFilePathKey] = pi ?? \" \" },\n                { $\"il|initlog=|{Configuration.FileSystem.InitLogFileKey}=\",\n                    $\"A file into which the results of the initialization instructions are written.\\nOnly valid if `--pi` option (`{Configuration.FileSystem.InitFilePathKey}`) is specified.\\nDefault: If a init file is set using `--pi` (`{Configuration.FileSystem.InitFilePathKey}`), it is appended with the `.log` extension. If just a file name is used, the file is created in the same folder as the init file configured using the `--pi` command line option (`{Configuration.FileSystem.InitFilePathKey}`).\\n\",\n                    il => this[Configuration.FileSystem.InitLogFileKey] = il },\n                { $\"rs|runtimestatereporting:|{PublisherConfig.EnableRuntimeStateReportingKey}:\",\n                    \"Enable that when publisher starts or restarts it reports its runtime state using a restart message.\\nDefault: `false` (disabled)\\n\",\n                    (bool? b) => this[PublisherConfig.EnableRuntimeStateReportingKey] = b?.ToString() ?? \"True\"},\n                { $\"api-key=|{PublisherConfig.ApiKeyOverrideKey}=\",\n                    \"Sets the api key that must be used to authenticate calls on the publisher REST endpoint.\\nDefault: `not set` (Key will be generated if not available) \\n\",\n                    s => this[PublisherConfig.ApiKeyOverrideKey] = s},\n                { $\"doa|disableopenapi:|{PublisherConfig.DisableOpenApiEndpointKey}:\",\n                    \"Disable the OPC Publisher Open API endpoint exposed by the built-in HTTP server.\\nDefault: `false` (enabled).\\n\",\n                    (bool? b) => this[PublisherConfig.DisableOpenApiEndpointKey] = b?.ToString() ?? \"True\" },\n\n                \"\",\n                \"Messaging configuration\",\n                \"-----------------------\",\n                \"\",\n\n                { $\"c|strict:|{PublisherConfig.UseStandardsCompliantEncodingKey}:\",\n                    \"Use strict OPC UA standard compliance. It is recommended to run the publisher in compliant mode for best interoperability.\\nBe aware that explicitly specifying other command line options can result in non-comnpliance despite this option being set.\\nDefault: `false` for backwards compatibility (2.5.x - 2.8.x)\\n\",\n                    (bool? b) => this[PublisherConfig.UseStandardsCompliantEncodingKey] = b?.ToString() ?? \"True\" },\n                { $\"nf|namespaceformat=|{PublisherConfig.DefaultNamespaceFormatKey}=\",\n                    $\"The format to use when serializing node ids and qualified names containing a namespace uri into a string.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<NamespaceFormat>())}`\\nDefault: `{nameof(NamespaceFormat.Expanded)}` if `-c` is specified, otherwise `{nameof(NamespaceFormat.Uri)}` for backwards compatibility.\\n\",\n                    (NamespaceFormat m) => this[PublisherConfig.DefaultNamespaceFormatKey] = m.ToString() },\n                { $\"mm|messagingmode=|{PublisherConfig.MessagingModeKey}=\",\n                    $\"The messaging mode for messages\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<MessagingMode>())}`\\nDefault: `{nameof(MessagingMode.PubSub)}` if `-c` is specified, otherwise `{nameof(MessagingMode.Samples)}` for backwards compatibility.\\n\",\n                    (MessagingMode m) => this[PublisherConfig.MessagingModeKey] = m.ToString() },\n                { $\"ode|optimizeddatasetencoding:|{PublisherConfig.WriteValueWhenDataSetHasSingleEntryKey}:\",\n                    \"When a data set has a single entry the encoder will write only the value of a data set entry and omit the key.\\nThis is not compliant with OPC UA Part 14.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[PublisherConfig.WriteValueWhenDataSetHasSingleEntryKey] = b?.ToString() ?? \"True\" },\n\n                // TODO: Add ability to specify networkmessage mask\n                // TODO: Add ability to specify dataset message mask\n                // TODO: Add ability to specify dataset field message mask\n                // TODO: Allow override of content type\n                // TODO: Allow overriding schema\n\n                { $\"me|messageencoding=|{PublisherConfig.MessageEncodingKey}=\",\n                    $\"The message encoding for messages\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<MessageEncoding>())}`\\nDefault: `{nameof(MessageEncoding.Json)}`.\\n\",\n                    (MessageEncoding m) => this[PublisherConfig.MessageEncodingKey] = m.ToString() },\n                    { $\"fm|fullfeaturedmessage=|{PublisherConfig.FullFeaturedMessageKey}=\",\n                        \"The full featured mode for messages (all fields filled in) for backwards compatibilty. \\nDefault: `false` for legacy compatibility.\\n\",\n                        (string b) => this[PublisherConfig.FullFeaturedMessageKey] = b, /* hidden = */ true },\n                { $\"bi|batchtriggerinterval=|{PublisherConfig.BatchTriggerIntervalKey}=\",\n                    $\"The network message publishing interval in milliseconds. Determines the publishing period at which point messages are emitted.\\nWhen `--bs` (`{PublisherConfig.BatchSizeKey}`) is 1 and `--bi` is set to 0 batching is disabled.\\nDefault: `10000` (10 seconds).\\nAlso can be set using `BatchTriggerInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`.\\n\",\n                    (uint k) => this[PublisherConfig.BatchTriggerIntervalKey] = TimeSpan.FromMilliseconds(k).ToString() },\n                    { \"si|iothubsendinterval=\",\n                        \"The network message publishing interval in seconds for backwards compatibilty. \\nDefault: `10` seconds.\\n\",\n                        (string k) => this[PublisherConfig.BatchTriggerIntervalKey] = TimeSpan.FromSeconds(int.Parse(k, CultureInfo.CurrentCulture)).ToString(), /* hidden = */ true },\n                { $\"bs|batchsize=|{PublisherConfig.BatchSizeKey}=\",\n                    $\"The number of incoming OPC UA subscription notifications to collect until sending a network messages. When `--bs` (`{PublisherConfig.BatchSizeKey}`) is set to 1 and `--bi` (`{PublisherConfig.BatchTriggerIntervalKey}`) is 0 batching is disabled and messages are sent as soon as notifications arrive.\\nDefault: `50`.\\n\",\n                    (uint i) => this[PublisherConfig.BatchSizeKey] = i.ToString(CultureInfo.CurrentCulture) },\n                { $\"rdb|removedupsinbatch:|{PublisherConfig.RemoveDuplicatesFromBatchKey}:\",\n                    \"Use this option to remove values with the same node id from batch messages in legacy `Samples` mode. Sends only the latest value as per the value's source timestamp.\\nOnly applies to `Samples` mode, otherwise this setting is ignored.\\nDefault: `false` (keep all duplicate values).\\n\",\n                    (bool? b) => this[PublisherConfig.RemoveDuplicatesFromBatchKey] = b?.ToString() ?? \"True\" },\n                { $\"ms|maxmessagesize=|iothubmessagesize=|{PublisherConfig.IoTHubMaxMessageSizeKey}=\",\n                    \"The maximum size of the messages to emit. In case the encoder cannot encode a message because the size would be exceeded, the message is dropped. Otherwise the encoder will aim to chunk messages if possible. \\nDefault: `256k` in case of IoT Hub messages, `0` otherwise.\\n\",\n                    (uint i) => this[PublisherConfig.IoTHubMaxMessageSizeKey] = i.ToString(CultureInfo.CurrentCulture) },\n                { $\"qos|{PublisherConfig.DefaultQualityOfServiceKey}=\",\n                    $\"The default quality of service to use for data set messages.\\nThis does not apply to metadata messages which are always sent with `AtLeastOnce` semantics.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<QoS>())}`\\nDefault: `{nameof(QoS.AtLeastOnce)}`.\\n\",\n                    (QoS q) => this[PublisherConfig.DefaultQualityOfServiceKey] = q.ToString() },\n                { $\"ttl|{PublisherConfig.DefaultMessageTimeToLiveKey}=\",\n                    \"The default time to live for all network message published in milliseconds if the transport supports it.\\nThis does not apply to metadata messages which are always sent with a ttl of the metadata update interval or infinite ttl.\\nDefault: `not set` (infinite).\\n\",\n                    (uint k) => this[PublisherConfig.DefaultMessageTimeToLiveKey] = TimeSpan.FromMilliseconds(k).ToString() },\n                { $\"retain:|{PublisherConfig.DefaultMessageRetentionKey}:\",\n                    \"Whether by default to send messages with retain flag to a broker if the transport supports it.\\nThis does not apply to metadata messages which are always sent as retained messages.\\nDefault: `false'.\\n\",\n                    (bool? b) => this[PublisherConfig.DefaultMessageRetentionKey] = b?.ToString() ?? \"True\" },\n\n                // TODO: Add ConfiguredMessageSize\n\n                { $\"mts|messagetimestamp=|{PublisherConfig.MessageTimestampKey}=\",\n                    $\"The value to set as as the timestamp property of messages during encoding (if the encoding supports writing message timestamps).\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<MessageTimestamp>())}`\\nDefault: `{nameof(MessageTimestamp.CurrentTimeUtc)}` to use the time when the message was created in OPC Publisher.\\n\",\n                    (MessageTimestamp m) => this[PublisherConfig.MessageTimestampKey] = m.ToString() },\n                { $\"npd|maxnodesperdataset=|{PublisherConfig.MaxNodesPerDataSetKey}=\",\n                    \"Maximum number of nodes within a Subscription. When there are more nodes configured for a data set writer, they will be added to new subscriptions. This also affects metadata message size. \\nDefault: `1000`.\\n\",\n                    (uint i) => this[PublisherConfig.MaxNodesPerDataSetKey] = i.ToString(CultureInfo.CurrentCulture) },\n                { $\"kfc|keyframecount=|{PublisherConfig.DefaultKeyFrameCountKey}=\",\n                    \"The default number of delta messages to send until a key frame message is sent. If 0, no key frame messages are sent, if 1, every message will be a key frame. \\nDefault: `0`.\\n\",\n                    (uint i) => this[PublisherConfig.DefaultKeyFrameCountKey] = i.ToString(CultureInfo.CurrentCulture) },\n                { $\"ka|sendkeepalives:|{PublisherConfig.EnableDataSetKeepAlivesKey}:\",\n                    \"Enables sending keep alive messages triggered by writer subscription's keep alive notifications. This setting can be used to enable the messaging profile's support for keep alive messages.\\nIf the chosen messaging profile does not support keep alive messages this setting is ignored.\\nDefault: `false` (to save bandwidth).\\n\",\n                    (bool? b) => this[PublisherConfig.EnableDataSetKeepAlivesKey] = b?.ToString() ?? \"True\" },\n                { $\"kaf|keepalivesaskeyframe:|{PublisherConfig.SendDataSetKeepAlivesAsKeyFrameKey}:\",\n                    \"When the sending of keep alive messages is enabled determines whether the empty keep alive message will be promoted to a key frame messages\\nDefault: `false`.\\n\",\n                    (bool? b) => this[PublisherConfig.SendDataSetKeepAlivesAsKeyFrameKey] = b?.ToString() ?? \"True\" },\n                { $\"msi|metadatasendinterval=|{PublisherConfig.DefaultMetaDataUpdateTimeKey}=\",\n                    $\"Default value in milliseconds for the metadata send interval which determines in which interval metadata is sent.\\nEven when disabled, metadata is still sent when the metadata version changes unless `--mm=*Samples` (`{PublisherConfig.MessagingModeKey})=*Samples`) is set in which case this setting is ignored. Only valid for network message encodings. \\nDefault: `0` which means periodic sending of metadata is disabled.\\n\",\n                    (uint i) => this[PublisherConfig.DefaultMetaDataUpdateTimeKey] = TimeSpan.FromMilliseconds(i).ToString() },\n                { $\"dm|disablemetadata:|{PublisherConfig.DisableDataSetMetaDataKey}:\",\n                    $\"Disables sending any metadata when metadata version changes. This setting can be used to also override the messaging profile's default support for metadata sending.\\nIt is recommended to disable sending metadata when too many nodes are part of a data set as this can slow down start up time.\\nDefault: `False` if the messaging profile selected supports sending metadata and `--strict` (`{PublisherConfig.UseStandardsCompliantEncodingKey}`) is set but not '--dct' (`{PublisherConfig.DisableComplexTypeSystemKey}`), `True` otherwise.\\n\",\n                    (bool? b) => this[PublisherConfig.DisableDataSetMetaDataKey] = b?.ToString() ?? \"True\" },\n                    { $\"lc|legacycompatibility=|{LegacyCompatibility}=\",\n                        \"Run the publisher in legacy (2.5.x) compatibility mode.\\nDefault: `false` (disabled).\\n\",\n                        b => this[LegacyCompatibility] = b, /* hidden = */ true },\n                { $\"amt|asyncmetadataloadtimeout=|{PublisherConfig.AsyncMetaDataLoadTimeoutKey}=\",\n                    $\"The default duration in seconds a publish request should wait until the meta data is loaded.\\nLoaded metadata guarantees a metadata message is sent before the first message is sent but loading of metadata takes time during subscription setup. Set to `0` to block until metadata is loaded.\\nOnly used if meta data is supported and enabled.\\nDefault: `{PublisherConfig.AsyncMetaDataLoadTimeoutDefaultMillis}` milliseconds.\\n\",\n                    (uint i) => this[PublisherConfig.AsyncMetaDataLoadTimeoutKey] = TimeSpan.FromMilliseconds(i).ToString() },\n                { $\"ps|publishschemas:|{PublisherConfig.PublishMessageSchemaKey}:\",\n                    \"Publish the Avro or Json message schemas to schema registry or subtopics.\\nAutomatically enables complex type system and metadata support.\\nOnly has effect if the messaging profile supports publishing schemas.\\nDefault: `True` if the message encoding requires schemas (for example Avro) otherwise `False`.\\n\",\n                    (bool? b) => this[PublisherConfig.PublishMessageSchemaKey] = b?.ToString() ?? \"True\" },\n                    { $\"asj|preferavro:|{PublisherConfig.PreferAvroOverJsonSchemaKey}:\",\n                        \"Publish Avro schema even for Json encoded messages. Automatically enables publishing schemas as if `--ps` was set.\\nDefault: `false`.\\n\",\n                        (bool? b) => this[PublisherConfig.PreferAvroOverJsonSchemaKey] = b?.ToString() ?? \"True\" },\n                    { $\"daf|disableavrofiles:|{Configuration.AvroWriter.DisableKey}:\",\n                        \"Disable writing avro files and instead dump messages and schema as zip files using the filesystem transport.\\nDefault: `false`.\\n\",\n                        (bool? b) => this[Configuration.AvroWriter.DisableKey] = b?.ToString() ?? \"True\" },\n                { $\"om|maxsendqueuesize=|{PublisherConfig.MaxNetworkMessageSendQueueSizeKey}=\",\n                    $\"The maximum number of messages to buffer on the send path before messages are dropped.\\nDefault: `{PublisherConfig.MaxNetworkMessageSendQueueSizeDefault}`\\n\",\n                    (uint i) => this[PublisherConfig.MaxNetworkMessageSendQueueSizeKey] = i.ToString(CultureInfo.InvariantCulture) },\n                    { \"maxoutgressmessages|MaxOutgressMessages=\", \"Deprecated - do not use\",\n                        (string i) => this[PublisherConfig.MaxNetworkMessageSendQueueSizeKey] = i, /* hidden = */ true },\n                { $\"wgp|writergrouppartitions=|{PublisherConfig.DefaultWriterGroupPartitionCountKey}=\",\n                    \"The number of partitions to split the writer group into. Each partition represents a data flow to the transport sink. The partition is selected by topic hash.\\nDefault: `0` (partitioning is disabled)\\n\",\n                    (ushort i) => this[PublisherConfig.DefaultWriterGroupPartitionCountKey] = i.ToString(CultureInfo.InvariantCulture) },\n                { $\"t|dmt=|defaultmessagetransport=|{PublisherConfig.DefaultTransportKey}=\",\n                    $\"The desired transport to use to publish network messages with.\\nRequires the transport to be properly configured (see transport settings).\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<WriterGroupTransport>())}`\\nDefault: `{nameof(WriterGroupTransport.IoTHub)}` or the first configured transport of the allowed value list.\\n\",\n                    (WriterGroupTransport p) => this[PublisherConfig.DefaultTransportKey] = p.ToString() },\n\n                \"\",\n                \"Transport settings\",\n                \"------------------\",\n                \"\",\n                { $\"b|mqc=|mqttclientconnectionstring=|{Configuration.MqttBroker.MqttClientConnectionStringKey}=\",\n                    $\"An mqtt connection string to use. Use this option to connect OPC Publisher to a MQTT Broker endpoint.\\nTo connect to an MQTT broker use the format 'HostName=<IPorDnsName>;Port=<Port>[;Username=<Username>;Password=<Password>;Protocol=<'v5'|'v311'>]'. To publish via MQTT by default specify `-t={nameof(WriterGroupTransport.Mqtt)}`.\\nDefault: `not set`.\\n\",\n                    mqc => this[Configuration.MqttBroker.MqttClientConnectionStringKey] = mqc },\n                { $\"e|ec=|edgehubconnectionstring=|dc=|deviceconnectionstring=|{Configuration.IoTEdge.EdgeHubConnectionString}=\",\n                    $\"A edge hub or iot hub connection string to use if you run OPC Publisher outside of IoT Edge. The connection string can be obtained from the IoT Hub portal. It is not required to use this option if running inside IoT Edge. To publish through IoT Edge by default specify `-t={nameof(WriterGroupTransport.IoTHub)}`.\\nDefault: `not set`.\\n\",\n                    dc => this[Configuration.IoTEdge.EdgeHubConnectionString] = dc },\n                    { $\"ht|ih=|iothubprotocol=|{Configuration.IoTEdge.HubTransport}=\",\n                        $\"Protocol to use for communication with EdgeHub.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<TransportOption>())}`\\nDefault: `{nameof(TransportOption.Mqtt)}` if device or edge hub connection string is provided, ignored otherwise.\\n\",\n                        (TransportOption p) => this[Configuration.IoTEdge.HubTransport] = p.ToString() },\n                { $\"eh=|eventhubnamespaceconnectionstring=|{Configuration.EventHubs.EventHubNamespaceConnectionString}=\",\n                    \"The connection string of an existing event hub namespace to use for the Azure EventHub transport.\\nDefault: `not set`.\\n\",\n                    eh => this[Configuration.EventHubs.EventHubNamespaceConnectionString] = eh },\n                { $\"sg=|schemagroup=|{Configuration.EventHubs.SchemaGroupNameKey}=\",\n                    \"The schema group in an event hub namespace to publish message schemas to.\\nDefault: `not set`.\\n\",\n                    sg => this[Configuration.EventHubs.SchemaGroupNameKey] = sg },\n                { $\"d|dcs=|daprconnectionstring=|{Configuration.Dapr.DaprConnectionStringKey}=\",\n                    $\"Connect the OPC Publisher to a dapr pub sub component using a connection string.\\nThe connection string specifies the PubSub component to use and allows you to configure the side car connection if needed.\\nUse the format 'PubSubComponent=<PubSubComponent>[;GrpcPort=<GrpcPort>;HttpPort=<HttpPort>[;Scheme=<'https'|'http'>][;Host=<IPorDnsName>]][;CheckSideCarHealth=<'true'|'false'>]'.\\nTo publish through dapr by default specify `-t={nameof(WriterGroupTransport.Dapr)}`.\\nDefault: `not set`.\\n\",\n                    dcs => this[Configuration.Dapr.DaprConnectionStringKey] = dcs },\n                { $\"w|hcs=|httpconnectionstring=|{Configuration.Http.HttpConnectionStringKey}=\",\n                    $\"Allows OPC Publisher to publish multipart messages to a topic path using the http protocol (web hook). Specify the target host and configure the optional connection settings using a connection string of the format 'HostName=<IPorDnsName>[;Port=<Port>][;Scheme=<'https'|'http'>][;Put=true][;ApiKey=<ApiKey>]'. To publish via HTTP by default specify `-t={nameof(WriterGroupTransport.Http)}`.\\nDefault: `not set`.\\n\",\n                    hcs => this[Configuration.Http.HttpConnectionStringKey] = hcs },\n                { $\"o|outdir=|{Configuration.FileSystem.OutputRootKey}=\",\n                    $\"A folder to write messages into.\\nUse this option to have OPC Publisher write messages to a folder structure under this folder. The structure reflects the topic tree. To publish into the file system folder by default specify `-t={nameof(WriterGroupTransport.FileSystem)}`.\\nDefault: `not set`.\\n\",\n                    or => this[Configuration.FileSystem.OutputRootKey] = or },\n                { $\"p|httpserverport=|{PublisherConfig.HttpServerPortKey}=\",\n                    $\"The port on which the http server of OPC Publisher is listening.\\nDefault: `{PublisherConfig.HttpServerPortDefault}` if no value is provided.\\n\",\n                    p => this[PublisherConfig.HttpServerPortKey] = p },\n                { $\"unsecurehttp:|{PublisherConfig.UnsecureHttpServerPortKey}:\",\n                    $\"Allow unsecure access to the REST api of OPC Publisher. A port can be specified if the default port {PublisherConfig.UnsecureHttpServerPortDefault} is not desired.\\nDo not enable this in production as it exposes the Api Key on the network.\\nDefault: `disabled`, if specified without a port `{PublisherConfig.UnsecureHttpServerPortDefault}` port is used.\\n\",\n                    (ushort? p) => this[PublisherConfig.UnsecureHttpServerPortKey] = p?.ToString(CultureInfo.CurrentCulture) ?? PublisherConfig.UnsecureHttpServerPortDefault.ToString(CultureInfo.CurrentCulture) },\n                { $\"rtc|renewtlscert:|{PublisherConfig.RenewTlsCertificateOnStartupKey}:\",\n                    \"If set a new tls certificate is created during startup updating any previously created ones.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[PublisherConfig.RenewTlsCertificateOnStartupKey] = b?.ToString() ?? \"True\" },\n                { $\"useopenapiv3:|{Configuration.OpenApi.UseOpenApiV3Key}:\",\n                    \"If enabled exposes the open api schema of OPC Publisher using v3 schema (yaml).\\nOnly valid if Open API endpoint is not disabled.\\nDefault: `v2` (json).\\n\",\n                    (bool? b) => this[Configuration.OpenApi.UseOpenApiV3Key] = b?.ToString() ?? \"True\" },\n\n                \"\",\n                \"Routing configuration\",\n                \"---------------------\",\n                \"\",\n\n                { $\"rtt|roottopictemplate:|{PublisherConfig.RootTopicTemplateKey}:\",\n                    \"The default root topic of OPC Publisher.\\nIf not specified, the `{{PublisherId}}` template is the root topic.\\nCurrently only the template variables\\n    `{{SiteId}}` and\\n    `{{PublisherId}}`\\ncan be used as dynamic substituations in the template. If the template variable does not exist it is replaced with the `$default` string.\\nDefault: `{{PublisherId}}`.\\n\",\n                    t => this[PublisherConfig.RootTopicTemplateKey] = t },\n                { $\"mtt|methodtopictemplate=|{PublisherConfig.MethodTopicTemplateKey}=\",\n                    \"The topic at which OPC Publisher's method handler is mounted.\\nIf not specified, the `{{RootTopic}}/methods` template will be used as root topic with the method names as sub topic.\\nOnly\\n    `{{RootTopic}}`\\n    `{{SiteId}}` and\\n    `{{PublisherId}}`\\ncan currently be used as replacement variables in the template.\\nDefault: `{{RootTopic}}/methods`.\\n\",\n                    t => this[PublisherConfig.MethodTopicTemplateKey] = t },\n                { $\"ttt|telemetrytopictemplate:|{PublisherConfig.TelemetryTopicTemplateKey}:\",\n                    \"The default topic that all messages are sent to.\\nIf not specified, the `{{RootTopic}}/messages/{{WriterGroup}}` template will be used as root topic for all events sent by OPC Publisher.\\nThe template variables\\n    `{{RootTopic}}`\\n    `{{SiteId}}`\\n    `{{Encoding}}`\\n    `{{PublisherId}}`\\n    `{{DataSetClassId}}`\\n    `{{DataSetWriter}}` and\\n    `{{WriterGroup}}`\\n can be used as dynamic parts in the template. If a template variable does not exist the name of the variable is emitted.\\nDefault: `{{RootTopic}}/messages/{{WriterGroup}}`.\\n\",\n                    t => this[PublisherConfig.TelemetryTopicTemplateKey] = t },\n                { $\"ett|eventstopictemplate=|{PublisherConfig.EventsTopicTemplateKey}=\",\n                    \"The topic into which OPC Publisher publishes any events that are not telemetry messages such as discovery or runtime events.\\nIf not specified, the `{{RootTopic}}/events` template will be used.\\nOnly\\n    `{{RootTopic}}`\\n    `{{SiteId}}`\\n    `{{Encoding}}` and\\n    `{{PublisherId}}`\\ncan currently be used as replacement variables in the template.\\nDefault: `{{RootTopic}}/events`.\\n\",\n                    t => this[PublisherConfig.EventsTopicTemplateKey] = t },\n                { $\"dtt|diagnosticstopictemplate=|{PublisherConfig.DiagnosticsTopicTemplateKey}=\",\n                    \"The topic into which OPC Publisher publishes writer group diagnostics events.\\nIf not specified, the `{{RootTopic}}/diagnostics/{{WriterGroup}}` template will be used.\\nOnly\\n    `{{RootTopic}}`\\n    `{{SiteId}}`\\n    `{{Encoding}}`\\n    `{{PublisherId}}` and\\n    `{{WriterGroup}}`\\ncan currently be used as replacement variables in the template.\\nDefault: `{{RootTopic}}/diagnostics/{{WriterGroup}}`\\n\",\n                    t => this[PublisherConfig.DiagnosticsTopicTemplateKey] = t },\n                { $\"mdt|metadatatopictemplate:|{PublisherConfig.DataSetMetaDataTopicTemplateKey}:\",\n                    \"The topic that metadata should be sent to.\\nIn case of MQTT the message will by default be sent as RETAIN message with a TTL of either metadata send interval or infinite if metadata send interval is not configured.\\nOnly valid if metadata is supported and/or explicitely enabled.\\nThe template variables\\n    `{{RootTopic}}`\\n    `{{SiteId}}`\\n    `{{TelemetryTopic}}`\\n    `{{Encoding}}`\\n    `{{PublisherId}}`\\n    `{{DataSetClassId}}`\\n    `{{DataSetWriter}}` and\\n    `{{WriterGroup}}`\\ncan be used as dynamic parts in the template. \\nDefault: `{{TelemetryTopic}}` which means metadata is sent to the same output as regular messages. If specified without value, the default output is `{{TelemetryTopic}}/metadata`.\\n\",\n                    s => this[PublisherConfig.DataSetMetaDataTopicTemplateKey] = !string.IsNullOrEmpty(s) ? s : PublisherConfig.MetadataTopicTemplateDefault },\n                { $\"stt|schematopictemplate:|{PublisherConfig.SchemaTopicTemplateKey}:\",\n                    $\"The topic that schemas should be sent to if schema publishing is configured.\\nIn case of MQTT schemas will not be sent with .\\nOnly valid if schema publishing is enabled using `--ps` (`{PublisherConfig.PublishMessageSchemaKey}`) command line option ().\\n\" +\n                    \"The template variables\\n    `{{RootTopic}}`\\n    `{{SiteId}}`\\n    `{{PublisherId}}`\\n    `{{TelemetryTopic}}`\\ncan be used as variables inside the template. \\nDefault: `{{TelemetryTopic}}/schema` which means the schema is sent to a sub topic where the telemetry message is sent to.\\n\",\n                    s => this[PublisherConfig.SchemaTopicTemplateKey] = !string.IsNullOrEmpty(s) ? s : PublisherConfig.SchemaTopicTemplateDefault },\n                { $\"uns|datasetrouting=|{PublisherConfig.DefaultDataSetRoutingKey}=\",\n                    $\"Configures whether messages should automatically be routed using the browse path of the monitored item inside the address space starting from the RootFolder.\\nThe browse path is appended as topic structure to the telemetry topic root which can be configured using `--ttt` (`{PublisherConfig.TelemetryTopicTemplateKey}`). Reserved characters in browse names are escaped with their hex ASCII code.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<DataSetRoutingMode>())}`\\nDefault: `{nameof(DataSetRoutingMode.None)}` (Topics must be configured).\\n\",\n                    (DataSetRoutingMode m) => this[PublisherConfig.DefaultDataSetRoutingKey] = m.ToString() },\n                { $\"ri|enableroutinginfo:|{PublisherConfig.EnableDataSetRoutingInfoKey}:\",\n                    $\"Add routing information to messages. The name of the property is `{Constants.MessagePropertyRoutingKey}` and the value is the `DataSetWriterGroup` from which the particular message is emitted. Disabled if `{PublisherConfig.EnableCloudEventsKey}` is enabled.\\nDefault: `{PublisherConfig.EnableDataSetRoutingInfoDefault}`.\\n\",\n                    (bool? b) => this[PublisherConfig.EnableDataSetRoutingInfoKey] = b?.ToString() ?? \"True\" },\n                { $\"ce|cloudevents:|{PublisherConfig.EnableCloudEventsKey}:\",\n                    $\"Add cloud event headers to messages. The cloud events comply to the opc ua cloud events extension.\\nDefault: `{PublisherConfig.EnableCloudEventsDefault}`.\\n\",\n                    (bool? b) => this[PublisherConfig.EnableCloudEventsKey] = b?.ToString() ?? \"True\" },\n\n                \"\",\n                \"Subscription settings\",\n                \"---------------------\",\n                \"\",\n\n                { $\"oi|opcsamplinginterval=|{OpcUaSubscriptionConfig.DefaultSamplingIntervalKey}=\",\n                    \"Default value in milliseconds to request the servers to sample values. This value is used if an explicit sampling interval for a node was not configured. \\nDefault: `1000`.\\nAlso can be set using `DefaultSamplingInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`.\\n\",\n                    (uint i) => this[OpcUaSubscriptionConfig.DefaultSamplingIntervalKey] = TimeSpan.FromMilliseconds(i).ToString() },\n                { $\"op|opcpublishinginterval=|{OpcUaSubscriptionConfig.DefaultPublishingIntervalKey}=\",\n                    \"Default value in milliseconds for the publishing interval setting of a subscription created with an OPC UA server. This value is used if an explicit publishing interval was not configured.\\nWhen setting to `0` the server decides the lowest publishing interval it can support.\\nDefault: `1000`.\\nAlso can be set using `DefaultPublishingInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`.\\n\",\n                    (uint i) => this[OpcUaSubscriptionConfig.DefaultPublishingIntervalKey] = TimeSpan.FromMilliseconds(i).ToString() },\n                { $\"eip|immediatepublishing:|{OpcUaSubscriptionConfig.EnableImmediatePublishingKey}:\",\n                    \"By default OPC Publisher will create a subscription with publishing disabled and only enable it after it has filled it with all configured monitored items. Use this setting to create the subscription with publishing already enabled.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.EnableImmediatePublishingKey] = b?.ToString() ?? \"True\" },\n                { $\"ska|keepalivecount=|{OpcUaSubscriptionConfig.DefaultKeepAliveCountKey}=\",\n                    \"Specifies the default number of publishing intervals before a keep alive is returned with the next queued publishing response.\\nDefault: `auto set based on publishing interval`.\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.DefaultKeepAliveCountKey] = u.ToString(CultureInfo.CurrentCulture) },\n                    { \"kt|keepalivethreshold=|MaxKeepAliveCount=\",\n                    \"Legacy way of specifying the keep alive counter.\\n\",\n                        (string s) => this[OpcUaSubscriptionConfig.DefaultKeepAliveCountKey] = s, /* hidden = */ true },\n                { $\"slt|lifetimecount=|{OpcUaSubscriptionConfig.DefaultLifetimeCountKey}=\",\n                    \"Default subscription lifetime count which is a multiple of the keep alive counter and when reached instructs the server to declare the subscription invalid.\\nDefault: `auto set based on publishing interval`.\\n\",\n                    (uint i) => this[OpcUaSubscriptionConfig.DefaultLifetimeCountKey] = i.ToString(CultureInfo.CurrentCulture) },\n                    { \"MinSubscriptionLifetime=\", \"Legacy way of specifying the subscription lifetime.\",\n                        (string s) => this[OpcUaSubscriptionConfig.DefaultLifetimeCountKey] = s, /* hidden = */ true },\n                { $\"fd|fetchdisplayname:|{OpcUaSubscriptionConfig.FetchOpcNodeDisplayNameKey}:\",\n                    \"Fetches the displayname for the monitored items subscribed if a display name was not specified in the configuration.\\nNote: This has high impact on OPC Publisher startup performance.\\nDefault: `false` (disabled).\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.FetchOpcNodeDisplayNameKey] = b?.ToString() ?? \"True\" },\n                { $\"fp|fetchpathfromroot:|{OpcUaSubscriptionConfig.FetchOpcBrowsePathFromRootKey}:\",\n                    \"(Experimental) Explicitly disable or enable retrieving relative paths from root for monitored items.\\nDefault: `false` (disabled).\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.FetchOpcBrowsePathFromRootKey] = b?.ToString() ?? \"True\" },\n                { $\"qs|queuesize=|{OpcUaSubscriptionConfig.DefaultQueueSizeKey}=\",\n                    \"Default queue size for all monitored items if queue size was not specified in the configuration.\\nDefault: `1` (for backwards compatibility).\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.DefaultQueueSizeKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"aq|autosetqueuesize:|{OpcUaSubscriptionConfig.AutoSetQueueSizesKey}:\",\n                    \"(Experimental) Automatically calculate queue sizes for monitored items using the subscription publishing interval and the item's sampling rate as max(configured queue size, roundup(publishinginterval / samplinginterval)).\\nNote that the server might revise the queue size down if it cannot handle the calculated size.\\nDefault: `false` (disabled).\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.AutoSetQueueSizesKey] = b?.ToString() ?? \"True\" },\n                { $\"ndo|nodiscardold:|{OpcUaSubscriptionConfig.DefaultDiscardNewKey}:\",\n                    \"The publisher is using this as default value for the discard old setting of monitored item queue configuration. Setting to true will ensure that new values are dropped before older ones are drained. \\nDefault: `false` (which is the OPC UA default).\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.DefaultDiscardNewKey] = b?.ToString() ?? \"True\" },\n                { $\"mc|monitoreditemdatachangetrigger=|{OpcUaSubscriptionConfig.DefaultDataChangeTriggerKey}=\",\n                    $\"Default data change trigger for all monitored items configured in the published nodes configuration unless explicitly overridden.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<DataChangeTriggerType>())}`\\nDefault: `{nameof(DataChangeTriggerType.StatusValue)}` (which is the OPC UA default).\\n\",\n                    (DataChangeTriggerType t) => this[OpcUaSubscriptionConfig.DefaultDataChangeTriggerKey] = t.ToString() },\n                { $\"mwt|monitoreditemwatchdog=|{OpcUaSubscriptionConfig.DefaultMonitoredItemWatchdogSecondsKey}=\",\n                    \"The subscription and monitored item watchdog timeout in seconds the subscription uses to check on late reporting monitored items unless overridden in the published nodes configuration explicitly.\\nDefault: `not set` (watchdog disabled).\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.DefaultMonitoredItemWatchdogSecondsKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"mwc|monitoreditemwatchdogcondition=|{OpcUaSubscriptionConfig.DefaultMonitoredItemWatchdogConditionKey}=\",\n                    $\"The default condition when to run the action configured as the watchdog behavior. The condition can be overridden in the published nodes configuration.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<MonitoredItemWatchdogCondition>())}`\\nDefault: `{nameof(MonitoredItemWatchdogCondition.WhenAllAreLate)}` (if enabled).\\n\",\n                    (MonitoredItemWatchdogCondition b) => this[OpcUaSubscriptionConfig.DefaultMonitoredItemWatchdogConditionKey] = b.ToString() },\n                { $\"dwb|watchdogbehavior=|{OpcUaSubscriptionConfig.DefaultWatchdogBehaviorKey}=\",\n                    $\"Default behavior of the subscription and monitored item watchdog mechanism unless overridden in the published nodes configuration explicitly.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<SubscriptionWatchdogBehavior>())}`\\nDefault: `{nameof(SubscriptionWatchdogBehavior.Diagnostic)}` (if enabled).\\n\",\n                    (SubscriptionWatchdogBehavior b) => this[OpcUaSubscriptionConfig.DefaultWatchdogBehaviorKey] = b.ToString() },\n                { $\"sf|skipfirst:|{OpcUaSubscriptionConfig.DefaultSkipFirstKey}:\",\n                    $\"The publisher is using this as default value for the skip first setting of nodes configured without a skip first setting. A value of True will skip sending the first notification received when the monitored item is added to the subscription.\\nDefault: `{OpcUaSubscriptionConfig.DefaultSkipFirstDefault}` (disabled).\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.DefaultSkipFirstKey] = b?.ToString() ?? \"True\" },\n                    { \"skipfirstevent:\", \"Maintained for backwards compatibility, do not use.\",\n                        (string b) => this[OpcUaSubscriptionConfig.DefaultSkipFirstKey] = b ?? \"True\", /* hidden = */ true },\n                { $\"rat|republishaftertransfer:|{OpcUaSubscriptionConfig.DefaultRepublishAfterTransferKey}:\",\n                    $\"Configure whether publisher republishes missed subscription notifications still in the server queue after transferring a subscription during reconnect handling.\\nThis can result in out of order notifications after a reconnect but minimizes data loss.\\nDefault: `{OpcUaSubscriptionConfig.DefaultRepublishAfterTransferDefault}` (disabled).\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.DefaultRepublishAfterTransferKey] = b?.ToString() ?? \"True\" },\n                { $\"hbb|heartbeatbehavior=|{OpcUaSubscriptionConfig.DefaultHeartbeatBehaviorKey}=\",\n                    $\"Default behavior of the heartbeat mechanism unless overridden in the published nodes configuration explicitly.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<HeartbeatBehavior>().Where(n => !n.StartsWith(nameof(HeartbeatBehavior.Reserved), StringComparison.InvariantCulture)))}`\\nDefault: `{nameof(HeartbeatBehavior.WatchdogLKV)}` (Sending LKV in a watchdog fashion).\\n\",\n                    (HeartbeatBehavior b) => this[OpcUaSubscriptionConfig.DefaultHeartbeatBehaviorKey] = b.ToString() },\n                { $\"hb|heartbeatinterval=|{OpcUaSubscriptionConfig.DefaultHeartbeatIntervalKey}=\",\n                    \"The publisher is using this as default value in seconds for the heartbeat interval setting of nodes that were configured without a heartbeat interval setting. A heartbeat is sent at this interval if no value has been received.\\nDefault: `0` (disabled)\\nAlso can be set using `DefaultHeartbeatInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`.\\n\",\n                    (uint i) => this[OpcUaSubscriptionConfig.DefaultHeartbeatIntervalKey] = TimeSpan.FromSeconds(i).ToString() },\n                { $\"ucr|usecyclicreads:|{OpcUaSubscriptionConfig.DefaultSamplingUsingCyclicReadKey}:\",\n                    \"All nodes should be sampled using periodical client reads instead of subscriptions services, unless otherwise configured.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.DefaultSamplingUsingCyclicReadKey] = b?.ToString() ?? \"True\" },\n                { $\"xmi|maxmonitoreditems=|{OpcUaSubscriptionConfig.MaxMonitoredItemPerSubscriptionKey}=\",\n                    \"Max monitored items per subscription until the subscription is split.\\nThis is used if the server does not provide limits in its server capabilities.\\nDefault: `not set`.\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.MaxMonitoredItemPerSubscriptionKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"da|deferredacks:|{OpcUaSubscriptionConfig.UseDeferredAcknoledgementsKey}:\",\n                    \"(Experimental) Acknoledge subscription notifications only when the data has been successfully published.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.UseDeferredAcknoledgementsKey] = b?.ToString() ?? \"True\" },\n                { $\"rbp|rebrowseperiod=|{OpcUaSubscriptionConfig.DefaultRebrowsePeriodKey}=\",\n                    $\"(Experimental) The default time to wait until the address space model is browsed again when generating model change notifications.\\nDefault: `{OpcUaSubscriptionConfig.DefaultRebrowsePeriodDefault}`.\\n\",\n                    (TimeSpan t) => this[OpcUaSubscriptionConfig.DefaultRebrowsePeriodKey] = t.ToString() },\n                { $\"sqp|sequentialpublishing:|{OpcUaSubscriptionConfig.EnableSequentialPublishingKey}:\",\n                    $\"Set to false to disable sequential publishing in the protocol stack.\\nDefault: `{OpcUaSubscriptionConfig.EnableSequentialPublishingDefault}` (enabled).\\n\",\n                    (bool? b) => this[OpcUaSubscriptionConfig.EnableSequentialPublishingKey] = b?.ToString() ?? \"True\" },\n                { $\"smi|subscriptionmanagementinterval=|{OpcUaSubscriptionConfig.SubscriptionManagementIntervalSecondsKey}=\",\n                    \"The interval in seconds after which the publisher re-applies the desired state of the subscription to a session.\\nDefault: `0` (only on configuration change).\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.SubscriptionManagementIntervalSecondsKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"bnr|badnoderetrydelay=|{OpcUaSubscriptionConfig.BadMonitoredItemRetryDelaySecondsKey}=\",\n                    $\"The delay in seconds after which nodes that were rejected by the server while added or updating a subscription or while publishing, are re-applied to a subscription.\\nSet to 0 to disable retrying.\\nDefault: `{OpcUaSubscriptionConfig.BadMonitoredItemRetryDelayDefaultSec}` seconds.\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.BadMonitoredItemRetryDelaySecondsKey] = u.ToString(CultureInfo.CurrentCulture)  },\n                { $\"inr|invalidnoderetrydelay=|{OpcUaSubscriptionConfig.InvalidMonitoredItemRetryDelaySecondsKey}=\",\n                    $\"The delay in seconds after which the publisher attempts to re-apply nodes that were incorrectly configured to a subscription.\\nSet to 0 to disable retrying.\\nDefault: `{OpcUaSubscriptionConfig.InvalidMonitoredItemRetryDelayDefaultSec}` seconds.\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.InvalidMonitoredItemRetryDelaySecondsKey] = u.ToString(CultureInfo.CurrentCulture)  },\n                { $\"bmd|badnoderetrymaxdelay=|{OpcUaSubscriptionConfig.BadMonitoredItemRetryDelayMaxSecondsKey}=\",\n                    $\"The max delay in seconds between retrying nodes that were rejected by the server while added or updating a subscription or while publishing.\\nWhen set an exponential retry policy is used with the `--bmr` (`{OpcUaSubscriptionConfig.BadMonitoredItemRetryDelaySecondsKey}`) value as the starting delay.\\nDefault: `not set`.\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.BadMonitoredItemRetryDelayMaxSecondsKey] = u.ToString(CultureInfo.CurrentCulture)  },\n                { $\"imd|invalidnoderetrymaxdelay=|{OpcUaSubscriptionConfig.InvalidMonitoredItemRetryDelayMaxSecondsKey}=\",\n                    $\"The max  delay in seconds between retrying nodes that were incorrectly configured in the a subscription.\\nWhen set an exponential retry policy is used with the `--inr` (`{OpcUaSubscriptionConfig.InvalidMonitoredItemRetryDelaySecondsKey}`) value as the starting delay.\\nDefault: `not set`.\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.InvalidMonitoredItemRetryDelayMaxSecondsKey] = u.ToString(CultureInfo.CurrentCulture)  },\n                { $\"ser|subscriptionerrorretrydelay=|{OpcUaSubscriptionConfig.SubscriptionErrorRetryDelaySecondsKey}=\",\n                    $\"The delay in seconds between attempts to create a subscription in a session.\\nSet to 0 to disable retrying.\\nDefault: `{OpcUaSubscriptionConfig.SubscriptionErrorRetryDelayDefaultSec}` seconds.\\n\",\n                    (uint u) => this[OpcUaSubscriptionConfig.SubscriptionErrorRetryDelaySecondsKey] = u.ToString(CultureInfo.CurrentCulture) },\n\n                { $\"urc|usereverseconnect:|{PublisherConfig.DefaultUseReverseConnectKey}:\",\n                    \"(Experimental) Use reverse connect for all endpoints in the published nodes configuration unless otherwise configured.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[PublisherConfig.DefaultUseReverseConnectKey] = b?.ToString() ?? \"True\" },\n                { $\"dtr|disabletransferonreconnect:|{PublisherConfig.DisableSubscriptionTransferKey}:\",\n                    \"Do not attempt to transfer subscriptions when reconnecting but re-establish the subscription.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[PublisherConfig.DisableSubscriptionTransferKey] = b?.ToString() ?? \"True\" },\n                { $\"dct|disablecomplextypesystem:|{PublisherConfig.DisableComplexTypeSystemKey}:\",\n                    \"Never load the complex type system for any connections that are required for subscriptions.\\nThis setting not just disables meta data messages but also prevents transcoding of unknown complex types in outgoing messages.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[PublisherConfig.DisableComplexTypeSystemKey] = b?.ToString() ?? \"True\" },\n                { $\"dsg|disablesessionpergroup:|{PublisherConfig.DisableSessionPerWriterGroupKey}:\",\n                    $\"Disable creating a separate session per writer group. Instead sessions are re-used across writer groups.\\nDefault: `{PublisherConfig.DisableSessionPerWriterGroupDefault}`.\\n\",\n                    (bool? b) => this[PublisherConfig.DisableSessionPerWriterGroupKey] = b?.ToString() ?? \"True\" },\n                { $\"ipi|ignorepublishingintervals:|{PublisherConfig.IgnoreConfiguredPublishingIntervalsKey}:\",\n                    $\"Always use the publishing interval provided via `--op` ({OpcUaSubscriptionConfig.DefaultPublishingIntervalKey}) and ignore all publishing interval settings in the configuration.\\nCombine with `--op=0` (({OpcUaSubscriptionConfig.DefaultPublishingIntervalKey})=0) to let the server use the lowest publishing interval it can support.\\nDefault: `{PublisherConfig.IgnoreConfiguredPublishingIntervalsDefault}` (disabled).\\n\",\n                    (bool? b) => this[PublisherConfig.IgnoreConfiguredPublishingIntervalsKey] = b?.ToString() ?? \"True\" },\n\n                \"\",\n                \"OPC UA Client configuration\",\n                \"---------------------------\",\n                \"\",\n\n                { $\"aa|acceptuntrusted:|{OpcUaClientConfig.AutoAcceptUntrustedCertificatesKey}:\",\n                    \"The publisher accepts untrusted certificates presented by a server it connects to.\\nThis does not include servers presenting bad certificates or certificates that fail chain validation. These errors cannot be suppressed and connection will always be rejected.\\nWARNING: This setting should never be used in production environments!\\n\",\n                    (bool? b) => this[OpcUaClientConfig.AutoAcceptUntrustedCertificatesKey] = b?.ToString() ?? \"True\" },\n                     { \"autoaccept:\", \"Maintained for backwards compatibility, do not use.\",\n                        (string b) => this[OpcUaClientConfig.AutoAcceptUntrustedCertificatesKey] = b ?? \"True\", /* hidden = */ true },\n                { $\"rur|rejectunknownrevocationstatus:|{OpcUaClientConfig.RejectUnknownRevocationStatusKey}:\",\n                    $\"Set this to `False` to accept certificates presented by a server that have an unknown revocation status.\\nWARNING: This setting should never be used in production environments!\\nDefault: `{OpcUaClientConfig.RejectUnknownRevocationStatusDefault}`.\\n\",\n                    (bool? b) => this[OpcUaClientConfig.RejectUnknownRevocationStatusKey] = b?.ToString() ?? \"True\" },\n                { $\"ct|createsessiontimeout=|{OpcUaClientConfig.CreateSessionTimeoutKey}=\",\n                    $\"Amount of time in seconds to wait until a session is connected.\\nDefault: `{OpcUaClientConfig.CreateSessionTimeoutDefaultSec}` seconds.\\n\",\n                    (uint u) => this[OpcUaClientConfig.CreateSessionTimeoutKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"mr|reconnectperiod=|{OpcUaClientConfig.MinReconnectDelayKey}=\",\n                    $\"The minimum amount of time in milliseconds to wait reconnection of session is attempted again.\\nDefault: `{OpcUaClientConfig.MinReconnectDelayDefault}` milliseconds.\\n\",\n                    (uint i) => this[OpcUaClientConfig.MinReconnectDelayKey] = i.ToString(CultureInfo.CurrentCulture) },\n                { $\"xr|maxreconnectperiod=|{OpcUaClientConfig.MaxReconnectDelayKey}=\",\n                    $\"The maximum amount of time in millseconds to wait between reconnection attempts of the session.\\nDefault: `{OpcUaClientConfig.MaxReconnectDelayDefault}` milliseconds.\\n\",\n                    (uint i) => this[OpcUaClientConfig.MaxReconnectDelayKey] = i.ToString(CultureInfo.CurrentCulture) },\n                { $\"sto|sessiontimeout=|{OpcUaClientConfig.DefaultSessionTimeoutKey}=\",\n                    $\"Maximum amount of time in seconds that a session should remain open by the OPC server without any activity (session timeout). Requested from the OPC server at session creation.\\nDefault: `{OpcUaClientConfig.DefaultSessionTimeoutDefaultSec}` seconds.\\n\",\n                    (uint u) => this[OpcUaClientConfig.DefaultSessionTimeoutKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"ki|keepaliveinterval=|{OpcUaClientConfig.KeepAliveIntervalKey}=\",\n                    $\"The interval in seconds the publisher is sending keep alive messages to the OPC servers on the endpoints it is connected to.\\nDefault: `{OpcUaClientConfig.KeepAliveIntervalDefaultSec}` seconds.\\n\",\n                    (uint i) => this[OpcUaClientConfig.KeepAliveIntervalKey] = i.ToString(CultureInfo.CurrentCulture) },\n                { $\"sct|servicecalltimeout=|{OpcUaClientConfig.DefaultServiceCallTimeoutKey}=\",\n                    $\"Maximum amount of time in seconds that a service call should take before it is being cancelled.\\nThis value can be overridden in the request header.\\nDefault: `{OpcUaClientConfig.DefaultServiceCallTimeoutDefaultSec}` seconds.\\n\",\n                    (uint u) => this[OpcUaClientConfig.DefaultServiceCallTimeoutKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"cto|connecttimeout=|{OpcUaClientConfig.DefaultConnectTimeoutKey}=\",\n                    \"Maximum amount of time in seconds that a service call should wait for a connected session to be used.\\nThis value can be overridden in the request header.\\nDefault: `not set` (in this case the default service call timeout value is used).\\n\",\n                    (uint u) => this[OpcUaClientConfig.DefaultConnectTimeoutKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"ot|operationtimeout=|{OpcUaClientConfig.OperationTimeoutKey}=\",\n                    $\"The operation service call timeout of individual service requests to the server in milliseconds. As opposed to the `--sct` ({OpcUaClientConfig.DefaultServiceCallTimeoutKey}) timeout, this is the timeout hint provided to the server in every request.\\nThis value can be overridden in the request header.\\nDefault: `{OpcUaClientConfig.OperationTimeoutDefault}` milliseconds.\\n\",\n                    (uint u) => this[OpcUaClientConfig.OperationTimeoutKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"cl|clientlinger=|{OpcUaClientConfig.LingerTimeoutSecondsKey}=\",\n                    \"Amount of time in seconds to delay closing a client and underlying session after the a last service call.\\nUse this setting to speed up multiple subsequent calls.\\nDefault: `0` sec (no linger).\\n\",\n                    (uint u) => this[OpcUaClientConfig.LingerTimeoutSecondsKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"rcp|reverseconnectport=|{OpcUaClientConfig.ReverseConnectPortKey}=\",\n                    $\"The port to use when accepting inbound reverse connect requests from servers.\\nDefault: `{OpcUaClientConfig.ReverseConnectPortDefault}`.\\n\",\n                    (ushort u) => this[OpcUaClientConfig.ReverseConnectPortKey] = u.ToString(CultureInfo.CurrentCulture) },\n\n                { $\"mnr|maxnodesperread=|{OpcUaClientConfig.MaxNodesPerReadOverrideKey}=\",\n                    \"Limit max number of nodes to read in a single read request when batching reads or the server limit if less.\\nDefault: `0` (using server limit).\\n\",\n                    (uint u) => this[OpcUaClientConfig.MaxNodesPerReadOverrideKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"mnb|maxnodesperbrowse=|{OpcUaClientConfig.MaxNodesPerBrowseOverrideKey}=\",\n                    \"Limit max number of nodes per browse request when batching browse operations or the server limit if less.\\nDefault: `0` (using server limit).\\n\",\n                    (uint u) => this[OpcUaClientConfig.MaxNodesPerBrowseOverrideKey] = u.ToString(CultureInfo.CurrentCulture) },\n\n                { $\"ncc|nodecachecapacity=|{OpcUaClientConfig.NodeCacheCapacityKey}=\",\n                    \"The max size of the node caches used in the complex type system.\\nThere are caches (values, nodes, references).\\nDefault: `4096`.\\n\",\n                    (uint u) => this[OpcUaClientConfig.NodeCacheCapacityKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"nct|nodecachetimeout=|{OpcUaClientConfig.NodeCacheTimeoutKey}=\",\n                    \"The timeout of a node cache entries if not used in milliseconds.\\nDefault: `3600`.\\n\",\n                    (uint u) => this[OpcUaClientConfig.NodeCacheTimeoutKey] = u.ToString(CultureInfo.CurrentCulture) },\n\n                { $\"mpr|minpublishrequests=|{OpcUaClientConfig.MinPublishRequestsKey}=\",\n                    $\"Minimum number of publish requests to queue once subscriptions are created in the session.\\nDefault: `{OpcUaClientConfig.MinPublishRequestsDefault}`.\\n\",\n                    (uint u) => this[OpcUaClientConfig.MinPublishRequestsKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"ppr|percentpublishrequests=|{OpcUaClientConfig.PublishRequestsPerSubscriptionPercentKey}=\",\n                    $\"Percentage ratio of publish requests per subscriptions in the session in percent up to the number configured using `--xpr` ({OpcUaClientConfig.MaxPublishRequestsKey}).\\nDefault: `{OpcUaClientConfig.PublishRequestsPerSubscriptionPercentDefault}`% (1 request per subscription).\\n\",\n                    (ushort u) => this[OpcUaClientConfig.PublishRequestsPerSubscriptionPercentKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"xpr|maxpublishrequests=|{OpcUaClientConfig.MaxPublishRequestsKey}=\",\n                    $\"Maximum number of publish requests to every queue once subscriptions are created in the session.\\nDefault: `{OpcUaClientConfig.MaxPublishRequestsDefault}`.\\n\",\n                    (uint u) => this[OpcUaClientConfig.MaxPublishRequestsKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"dcp|disablecomplextypepreloading:|{OpcUaClientConfig.DisableComplexTypePreloadingKey}:\",\n                    \"Complex types (structures, enumerations) a server exposes are preloaded from the server after the session is connected. In some cases this can cause problems either on the client or server itself. Use this setting to disable pre-loading support.\\nNote that since the complex type system is used for meta data messages it will still be loaded at the time the subscription is created, therefore also disable meta data support if you want to ensure the complex types are never loaded for an endpoint.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[OpcUaClientConfig.DisableComplexTypePreloadingKey] = b?.ToString() ?? \"True\" },\n\n                { $\"otl|opctokenlifetime=|{OpcUaClientConfig.SecurityTokenLifetimeKey}=\",\n                    \"OPC UA Stack Transport Secure Channel - Security token lifetime in milliseconds.\\nDefault: `3600000` (1h).\\n\",\n                    (uint u) => this[OpcUaClientConfig.SecurityTokenLifetimeKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"ocl|opcchannellifetime=|{OpcUaClientConfig.ChannelLifetimeKey}=\",\n                    \"OPC UA Stack Transport Secure Channel - Channel lifetime in milliseconds.\\nDefault: `300000` (5 min).\\n\",\n                    (uint u) => this[OpcUaClientConfig.ChannelLifetimeKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"omb|opcmaxbufferlen=|{OpcUaClientConfig.MaxBufferSizeKey}=\",\n                    \"OPC UA Stack Transport Secure Channel - Max buffer size.\\nDefault: `65535` (64KB -1).\\n\",\n                    (uint u) => this[OpcUaClientConfig.MaxBufferSizeKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"oml|opcmaxmessagelen=|{OpcUaClientConfig.MaxMessageSizeKey}=\",\n                    \"OPC UA Stack Transport Secure Channel - Max message size.\\nDefault: `4194304` (4 MB).\\n\",\n                    (uint u) => this[OpcUaClientConfig.MaxMessageSizeKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"oal|opcmaxarraylen=|{OpcUaClientConfig.MaxArrayLengthKey}=\",\n                    \"OPC UA Stack Transport Secure Channel - Max array length.\\nDefault: `65535` (64KB - 1).\\n\",\n                    (uint u) => this[OpcUaClientConfig.MaxArrayLengthKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"ol|opcmaxstringlen=|{OpcUaClientConfig.MaxStringLengthKey}=\",\n                    \"The max length of a string opc can transmit/receive over the OPC UA secure channel.\\nDefault: `130816` (128KB - 256).\\n\",\n                    (uint u) => this[OpcUaClientConfig.MaxStringLengthKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"obl|opcmaxbytestringlen=|{OpcUaClientConfig.MaxByteStringLengthKey}=\",\n                    \"OPC UA Stack Transport Secure Channel - Max byte string length.\\nDefault: `1048576` (1MB).\\n\",\n                    (uint u) => this[OpcUaClientConfig.MaxByteStringLengthKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"au|appuri=|{OpcUaClientConfig.ApplicationUriKey}=\",\n                    \"Application URI as per OPC UA definition inside the OPC UA client application configuration presented to the server.\\nDefault: `not set`.\\n\",\n                    s => this[OpcUaClientConfig.ApplicationUriKey] = s },\n                { $\"pu|producturi=|{OpcUaClientConfig.ProductUriKey}=\",\n                    \"The Product URI as per OPC UA definition insde the OPC UA client application configuration presented to the server.\\nDefault: `not set`.\\n\",\n                    s => this[OpcUaClientConfig.ProductUriKey] = s },\n\n                { $\"rejectsha1=|{OpcUaClientConfig.RejectSha1SignedCertificatesKey}=\",\n                    \"If set to `False` OPC Publisher will accept SHA1 certificates which have been officially deprecated and are unsafe to use.\\nNote: Set this to `False` to support older equipment that uses Sha1 signed certificates rather than using no security.\\nDefault: `True`.\\n\",\n                    (bool b) => this[OpcUaClientConfig.RejectSha1SignedCertificatesKey] = b.ToString() },\n                { $\"mks|minkeysize=|{OpcUaClientConfig.MinimumCertificateKeySizeKey}=\",\n                    \"Minimum accepted certificate size.\\nNote: It is recommended to this value to the highest certificate key size possible based on the connected OPC UA servers.\\nDefault: 1024.\\n\",\n                    s => this[OpcUaClientConfig.MinimumCertificateKeySizeKey] = s },\n                { $\"tm|trustmyself=|{OpcUaClientConfig.AddAppCertToTrustedStoreKey}=\",\n                    \"Set to `False` to disable adding the publisher's own certificate to the trusted store automatically.\\nDefault: `True`.\\n\",\n                    (bool b) => this[OpcUaClientConfig.AddAppCertToTrustedStoreKey] = b.ToString() },\n                { $\"sn|appcertsubjectname=|{OpcUaClientConfig.ApplicationCertificateSubjectNameKey}=\",\n                    $\"The subject name for the app cert.\\nDefault: `CN=<the value of --an|--appname|{OpcUaClientConfig.ApplicationNameKey}>, C=DE, S=Bav, O=Microsoft, DC=localhost`.\\n\",\n                    s => this[OpcUaClientConfig.ApplicationCertificateSubjectNameKey] = s },\n                { $\"an|appname=|{OpcUaClientConfig.ApplicationNameKey}=\",\n                    $\"The name for the app (used during OPC UA authentication).\\nDefault: `{OpcUaClientConfig.ApplicationNameDefault}`\\n\",\n                    s => this[OpcUaClientConfig.ApplicationNameKey] = s },\n                { $\"pki|pkirootpath=|{OpcUaClientConfig.PkiRootPathKey}=\",\n                    \"PKI certificate store root path.\\nDefault: `pki`.\\n\",\n                    s => this[OpcUaClientConfig.PkiRootPathKey] = s },\n                { $\"ap|appcertstorepath=|{OpcUaClientConfig.ApplicationCertificateStorePathKey}=\",\n                    \"The path where the own application cert should be stored.\\nDefault: $\\\"{{PkiRootPath}}/own\\\".\\n\",\n                    s => this[OpcUaClientConfig.ApplicationCertificateStorePathKey] = s },\n                { $\"apt|at=|appcertstoretype=|{OpcUaClientConfig.ApplicationCertificateStoreTypeKey}=\",\n                    $\"The own application cert store type.\\nAllowed values:\\n    `{CertificateStoreType.Directory}`\\n    `{CertificateStoreType.X509Store}`\\n    `{FlatCertificateStore.StoreTypeName}`\\nDefault: `{CertificateStoreType.Directory}`.\\n\",\n                    s => SetStoreType(s, OpcUaClientConfig.ApplicationCertificateStoreTypeKey, \"apt\") },\n                { $\"cfa|configurefromappcert:|{OpcUaClientConfig.TryConfigureFromExistingAppCertKey}:\",\n                    \"Automatically set the application subject name, host name and application uri from the first valid application certificate found in the application certificate store path.\\nIf the chosen certificate is valid, it will be used, otherwise a new, self-signed certificate with the information will be created.\\nDefault: `false`.\\n\",\n                    (bool? b) => this[OpcUaClientConfig.TryConfigureFromExistingAppCertKey] = b?.ToString() ?? \"True\" },\n                { $\"apw|appcertstorepwd=|{OpcUaClientConfig.ApplicationCertificatePasswordKey}=\",\n                    \"Password to use when storing the application certificate in the store folder if the store is of type `Directory`.\\nDefault: empty, which means application certificate is not protected by default.\\n\",\n                    s => this[OpcUaClientConfig.ApplicationCertificatePasswordKey] = s },\n                { $\"tp|trustedcertstorepath=|{OpcUaClientConfig.TrustedPeerCertificatesPathKey}=\",\n                    \"The path of the trusted cert store.\\nDefault: $\\\"{{PkiRootPath}}/trusted\\\".\\n\",\n                    s => this[OpcUaClientConfig.TrustedPeerCertificatesPathKey] = s },\n                { $\"tpt|{OpcUaClientConfig.TrustedPeerCertificatesTypeKey}=\",\n                    $\"Trusted peer certificate store type.\\nAllowed values:\\n    `{CertificateStoreType.Directory}`\\n    `{CertificateStoreType.X509Store}`\\n    `{FlatCertificateStore.StoreTypeName}`\\nDefault: `{CertificateStoreType.Directory}`.\\n\",\n                    s => SetStoreType(s, OpcUaClientConfig.TrustedPeerCertificatesTypeKey, \"tpt\") },\n                { $\"rp|rejectedcertstorepath=|{OpcUaClientConfig.RejectedCertificateStorePathKey}=\",\n                    \"The path of the rejected cert store.\\nDefault: $\\\"{{PkiRootPath}}/rejected\\\".\\n\",\n                    s => this[OpcUaClientConfig.RejectedCertificateStorePathKey] = s },\n                { $\"rpt|{OpcUaClientConfig.RejectedCertificateStoreTypeKey}=\",\n                    $\"Rejected certificate store type.\\nAllowed values:\\n    `{CertificateStoreType.Directory}`\\n    `{CertificateStoreType.X509Store}`\\n    `{FlatCertificateStore.StoreTypeName}`\\nDefault: `{CertificateStoreType.Directory}`.\\n\",\n                    s => SetStoreType(s, OpcUaClientConfig.RejectedCertificateStoreTypeKey, \"rpt\") },\n                { $\"ip|issuercertstorepath=|{OpcUaClientConfig.TrustedIssuerCertificatesPathKey}=\",\n                    \"The path of the trusted issuer cert store.\\nDefault: $\\\"{{PkiRootPath}}/issuer\\\".\\n\",\n                    s => this[OpcUaClientConfig.TrustedIssuerCertificatesPathKey] = s },\n                { $\"ipt|{OpcUaClientConfig.TrustedIssuerCertificatesTypeKey}=\",\n                    $\"Trusted issuer certificate store type.\\nAllowed values:\\n    `{CertificateStoreType.Directory}`\\n    `{CertificateStoreType.X509Store}`\\n    `{FlatCertificateStore.StoreTypeName}`\\nDefault: `{CertificateStoreType.Directory}`.\\n\",\n                    s => SetStoreType(s, OpcUaClientConfig.TrustedIssuerCertificatesTypeKey, \"ipt\") },\n                { $\"up|usercertstorepath=|{OpcUaClientConfig.TrustedUserCertificatesPathKey}=\",\n                    \"The path of the certificate store for user certificates.\\nDefault: $\\\"{{PkiRootPath}}/users\\\".\\n\",\n                    s => this[OpcUaClientConfig.TrustedUserCertificatesPathKey] = s },\n                { $\"upt|{OpcUaClientConfig.TrustedUserCertificatesTypeKey}=\",\n                    $\"Type of certificate store for all User certificates.\\nAllowed values:\\n    `{CertificateStoreType.Directory}`\\n    `{CertificateStoreType.X509Store}`\\n    `{FlatCertificateStore.StoreTypeName}`\\nDefault: `{CertificateStoreType.Directory}`.\\n\",\n                    s => SetStoreType(s, OpcUaClientConfig.TrustedUserCertificatesTypeKey, \"upt\") },\n                { $\"uip|userissuercertstorepath=|{OpcUaClientConfig.UserIssuerCertificatesPathKey}=\",\n                    \"The path of the user issuer cert store.\\nDefault: $\\\"{{PkiRootPath}}/users/issuer\\\".\\n\",\n                    s => this[OpcUaClientConfig.UserIssuerCertificatesPathKey] = s },\n                { $\"uit|{OpcUaClientConfig.UserIssuerCertificatesTypeKey}=\",\n                    $\"Type of the issuer certificate store for User certificates.\\nAllowed values:\\n    `{CertificateStoreType.Directory}`\\n    `{CertificateStoreType.X509Store}`\\n    `{FlatCertificateStore.StoreTypeName}`\\nDefault: `{CertificateStoreType.Directory}`.\\n\",\n                    s => SetStoreType(s, OpcUaClientConfig.UserIssuerCertificatesTypeKey, \"uip\") },\n\n                \"\",\n                \"Diagnostic options\",\n                \"------------------\",\n                \"\",\n\n                { $\"ll|loglevel=|{Configuration.LoggingLevel.LogLevelKey}=\",\n                    $\"The loglevel to use.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<LogLevel>())}`\\nDefault: `{LogLevel.Information}`.\\n\",\n                    (LogLevel l) => this[Configuration.LoggingLevel.LogLevelKey] = l.ToString() },\n                { $\"lfm|logformat=|{Configuration.LoggingFormat.LogFormatKey}=\",\n                    $\"The log format to use when writing to the console.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Configuration.LoggingFormat.LogFormatsSupported)}`\\nDefault: `{Configuration.LoggingFormat.LogFormatDefault}`.\\n\",\n                    (string s) => this[Configuration.LoggingFormat.LogFormatKey] = s },\n                { $\"di|diagnosticsinterval=|{PublisherConfig.DiagnosticsIntervalKey}=\",\n                    $\"Produce publisher diagnostic information at this specified interval in seconds.\\nBy default diagnostics are written to the OPC Publisher logger (which requires at least --loglevel or environment variable `{Configuration.LoggingLevel.LogLevelKey}` =`information`) unless configured differently using `--pd` ({PublisherConfig.DiagnosticsTargetKey}).\\n`0` disables diagnostic output.\\nDefault:60000 (60 seconds).\\nAlso can be set using `DiagnosticsInterval` environment variable in the form of a duration string in the form `[d.]hh:mm:ss[.fffffff]`\\\".\\n\",\n                    (uint i) => this[PublisherConfig.DiagnosticsIntervalKey] = TimeSpan.FromSeconds(i).ToString() },\n                { $\"pd|diagnosticstarget=|{PublisherConfig.DiagnosticsTargetKey}=\",\n                    $\"Configures how to emit diagnostics information at the `--di` ({PublisherConfig.DiagnosticsIntervalKey}) configured interval.\\nUse this to for example emit diagnostics as events to the event topic template instead of the console.\\nAllowed values:\\n    `{string.Join(\"`\\n    `\", Enum.GetNames<PublisherDiagnosticTargetType>())}`\\nDefault: `{PublisherDiagnosticTargetType.Logger}`.\\n\",\n                    (PublisherDiagnosticTargetType d) => this[PublisherConfig.DiagnosticsTargetKey] = d.ToString() },\n                { $\"dr|disableresourcemonitoring:|{PublisherConfig.DisableResourceMonitoringKey}:\",\n                    \"Disable resource monitoring as part of the diagnostics output and metrics.\\nDefault: `false` (enabled).\\n\",\n                    (bool? b) => this[PublisherConfig.DisableResourceMonitoringKey] = b?.ToString() ?? \"True\" },\n                { $\"ln|lognotifications:|{PublisherConfig.DebugLogNotificationsKey}:\",\n                    \"Log ingress subscription notifications at Informational level to aid debugging.\\nDefault: `disabled`.\\n\",\n                    (bool? b) => this[PublisherConfig.DebugLogNotificationsKey] = b?.ToString() ?? \"True\" },\n                { $\"lnh|lognotificationsandheartbeats:|{PublisherConfig.DebugLogNotificationsWithHeartbeatKey}:\",\n                    $\"Include heartbeats in notifications log.\\nIf set also implicitly enables debug logging via `--ln` ({PublisherConfig.DebugLogNotificationsKey}).\\nDefault: `disabled`.\\n\",\n                    (bool? b) => this[PublisherConfig.DebugLogNotificationsWithHeartbeatKey] = b?.ToString() ?? \"True\" },\n                { $\"lnf|lognotificationfilter=|{PublisherConfig.DebugLogNotificationsFilterKey}=\",\n                    $\"Only log notifications where the data set field name, subscription name, or data set name match the provided regular expression pattern.\\nIf set implicitly enables debug logging via `--ln`  ({PublisherConfig.DebugLogNotificationsKey}).\\nDefault: `null` (matches all).\\n\",\n                    (string? r) => this[PublisherConfig.DebugLogNotificationsFilterKey] = r },\n                { $\"len|logencodednotifications:|{PublisherConfig.DebugLogEncodedNotificationsKey}:\",\n                    \"Log encoded subscription and monitored item notifications at Informational level to aid debugging.\\nDefault: `disabled`.\\n\",\n                    (bool? b) => this[PublisherConfig.DebugLogEncodedNotificationsKey] = b?.ToString() ?? \"True\" },\n                { $\"sl|opcstacklogging:|{OpcUaClientConfig.EnableOpcUaStackLoggingKey}:\",\n                    \"Enable opc ua stack logging beyond logging at error level.\\nDefault: `disabled`.\\n\",\n                    (bool? b) => this[OpcUaClientConfig.EnableOpcUaStackLoggingKey] = b?.ToString() ?? \"True\" },\n                { $\"ksf|keysetlogfolder:|{OpcUaClientConfig.OpcUaKeySetLogFolderNameKey}:\",\n                    \"Writes negotiated symmetric keys for all running client connection to this file.\\nThe file can be loaded by Wireshark 4.3 and used to decrypt encrypted channels when analyzing network traffic captures.\\nNote that enabling this feature presents a security risk!\\nDefault: `disabled`.\\n\",\n                    (string? f) => this[OpcUaClientConfig.OpcUaKeySetLogFolderNameKey] = f ?? Directory.GetCurrentDirectory() },\n                { $\"ecw|enableconsolewriter:|{Configuration.ConsoleWriter.EnableKey}:\",\n                    \"Enable writing encoded messages to standard error log through the filesystem transport (must enable via `-t FileSystem` and `-o` must be set to either `stderr` or `stdout`).\\nDefault: `false`.\\n\",\n                    (bool? b) => this[Configuration.ConsoleWriter.EnableKey] = b?.ToString() ?? \"True\" },\n                { $\"oc|otlpcollector=|{Configuration.Otel.OtlpCollectorEndpointKey}=\",\n                    \"Specifiy the OpenTelemetry collector grpc endpoint url to export diagnostics to.\\nDefault: `disabled`.\\n\",\n                    s => this[Configuration.Otel.OtlpCollectorEndpointKey] = s },\n                { $\"eol|enableotellogging:|{Configuration.Otel.EnableOtelLoggingKey}:\",\n                    \"Enable logging over open telemetry endpoint.\\nBy default only metrics are enabled.\\nDefault: `disabled`.\\n\",\n                    (bool? b) => this[Configuration.Otel.EnableOtelLoggingKey] = b?.ToString() ?? \"True\" },\n                { $\"eot|enableoteltraces:|{Configuration.Otel.EnableOtelTracesKey}:\",\n                    \"Enable traces over open telemetry endpoint.\\nBy default only metrics are emitted.\\nDefault: `disabled`.\\n\",\n                    (bool? b) => this[Configuration.Otel.EnableOtelTracesKey] = b?.ToString() ?? \"True\" },\n                { $\"oxi|otlpexportinterval=|{Configuration.Otel.OtlpExportIntervalMillisecondsKey}=\",\n                    $\"The interval in milliseconds when OpenTelemetry is exported to the collector endpoint.\\nDefault: `{Configuration.Otel.OtlpExportIntervalMillisecondsDefault}` ({Configuration.Otel.OtlpExportIntervalMillisecondsDefault / 1000} seconds).\\n\",\n                    (uint i) => this[Configuration.Otel.OtlpExportIntervalMillisecondsKey] = TimeSpan.FromMilliseconds(i).ToString() },\n                { $\"mms|maxmetricstreams=|{Configuration.Otel.OtlpMaxMetricStreamsKey}=\",\n                    $\"Specifiy the max number of streams to collect in the default view.\\nDefault: `{Configuration.Otel.OtlpMaxMetricDefault}`.\\n\",\n                    (uint u) => this[Configuration.Otel.OtlpMaxMetricStreamsKey] = u.ToString(CultureInfo.CurrentCulture) },\n                { $\"em|enableprometheusendpoint:|{Configuration.Otel.EnableMetricsKey}:\",\n                    \"Explicitly enable or disable exporting prometheus metrics directly on the standard path.\\nDefault: `disabled` if Otlp collector is configured, otherwise `enabled`.\\n\",\n                    (bool? b) => this[Configuration.Otel.EnableMetricsKey] = b?.ToString() ?? \"True\" },\n                { $\"ari|addruntimeinstrumentation:|{Configuration.Otel.OtlpRuntimeInstrumentationKey}:\",\n                    $\"Include metrics captured for the underlying runtime and web server.\\nDefault: `{Configuration.Otel.OtlpRuntimeInstrumentationDefault}`.\\n\",\n                    (bool? b) => this[Configuration.Otel.OtlpRuntimeInstrumentationKey] = b?.ToString() ?? \"True\" },\n                { $\"ats|addtotalsuffix:|{Configuration.Otel.OtlpTotalNameSuffixForCountersKey}:\",\n                    $\"Add total suffix to all counter instrument names when exporting metrics via prometheus exporter.\\nDefault: `{Configuration.Otel.OtlpTotalNameSuffixForCountersDefault}`.\\n\",\n                    (bool? b) => this[Configuration.Otel.OtlpTotalNameSuffixForCountersKey] = b?.ToString() ?? \"True\" },\n\n                // testing purposes\n\n                { \"sc|scaletestcount=\",\n                    \"The number of monitored item clones in scale tests.\\n\",\n                    (string i) => this[PublisherConfig.ScaleTestCountKey] = i, /* hidden = */ true },\n\n                // Legacy: unsupported and hidden\n                { \"mq|monitoreditemqueuecapacity=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"mq|monitoreditemqueuecapacity\"), /* hidden = */ true },\n                { \"tc|telemetryconfigfile=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"tc|telemetryconfigfile\"), /* hidden = */ true },\n                { \"ic|iotcentral=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"ic|iotcentral\"), /* hidden = */ true },\n                { \"ns|noshutdown=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"ns|noshutdown\"), /* hidden = */ true },\n                { \"rf|runforever\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"rf|runforever\"), /* hidden = */ true },\n                { \"pn|portnum=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"pn|portnum\"), /* hidden = */ true },\n                { \"pa|path=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"pa|path\"), /* hidden = */ true },\n                { \"lr|ldsreginterval=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"lr|ldsreginterval\"), /* hidden = */ true },\n                { \"ss|suppressedopcstatuscodes=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"ss|suppressedopcstatuscodes\"), /* hidden = */ true },\n                { \"csr\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"csr\"), /* hidden = */ true },\n                { \"ab|applicationcertbase64=\", \"Legacy - do not use.\",_ => legacyOptions.Add(\"ab|applicationcertbase64\"), /* hidden = */ true },\n                { \"af|applicationcertfile=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"af|applicationcertfile\"), /* hidden = */ true },\n                { \"pk|privatekeyfile=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"pk|privatekeyfile\"), /* hidden = */ true },\n                { \"pb|privatekeybase64=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"pb|privatekeybase64\"), /* hidden = */ true },\n                { \"cp|certpassword=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"cp|certpassword\"), /* hidden = */ true },\n                { \"tb|addtrustedcertbase64=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"tb|addtrustedcertbase64\"), /* hidden = */ true },\n                { \"tf|addtrustedcertfile=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"tf|addtrustedcertfile\"), /* hidden = */ true },\n                { \"tt|trustedcertstoretype=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"tt|trustedcertstoretype\"), /* hidden = */ true },\n                { \"rt|rejectedcertstoretype=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"rt|rejectedcertstoretype\"), /* hidden = */ true },\n                { \"it|issuercertstoretype=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"it|issuercertstoretype\"), /* hidden = */ true },\n                { \"ib|addissuercertbase64=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"ib|addissuercertbase64\"), /* hidden = */ true },\n                { \"if|addissuercertfile=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"if|addissuercertfile\"), /* hidden = */ true },\n                { \"rb|updatecrlbase64=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"rb|updatecrlbase64\"), /* hidden = */ true },\n                { \"uc|updatecrlfile=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"uc|updatecrlfile\"), /* hidden = */ true },\n                { \"rc|removecert=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"rc|removecert\"), /* hidden = */ true },\n                { \"dt|devicecertstoretype=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"dt|devicecertstoretype\"), /* hidden = */ true },\n                { \"dp|devicecertstorepath=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"dp|devicecertstorepath\"), /* hidden = */ true },\n                { \"i|install\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"i|install\"), /* hidden = */ true },\n                { \"st|opcstacktracemask=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"st|opcstacktracemask\"), /* hidden = */ true },\n                { \"sd|shopfloordomain=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"sd|shopfloordomain\"), /* hidden = */ true },\n                { \"vc|verboseconsole=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"vc|verboseconsole\"), /* hidden = */ true },\n                { \"as|autotrustservercerts=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"as|autotrustservercerts\"), /* hidden = */ true },\n                { \"l|lf|logfile=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"l|lf|logfile\"), /* hidden = */ true },\n                { \"lt|logflushtimespan=\", \"Legacy - do not use.\", _ => legacyOptions.Add(\"lt|logflushtimespan\"), /* hidden = */ true }\n            };\n\n            try\n            {\n                unsupportedOptions = options.Parse(args);\n            }\n            catch (Exception e)\n            {\n                _logger.Warning(\"Parse args exception {0}.\", e.Message);\n                _logger.ExitProcess(160);\n                return;\n            }\n\n            if (unsupportedOptions.Count > 0)\n            {\n                foreach (var option in unsupportedOptions)\n                {\n                    _logger.Warning(\"Option {0} wrong or not supported, \" +\n                        \"please use -h option to get all the supported options.\", option);\n                }\n            }\n\n            if (legacyOptions.Count > 0)\n            {\n                foreach (var option in legacyOptions)\n                {\n                    _logger.Warning(\"Legacy option {0} not supported, please use -h option to get all the supported options.\", option);\n                }\n            }\n\n            switch (help)\n            {\n                case HelpType.CommandLine:\n                    options.WriteOptionDescriptions(Console.Out);\n                    _logger.ExitProcess(0);\n                    return;\n                case HelpType.EnvVars:\n                    var envVars = options\n                        .Where(o =>\n                            !o.Hidden &&\n                            o.OptionValueType != OptionValueType.None &&\n                            !o.GetNames().Any(n => n.Contains(\"help\", StringComparison.OrdinalIgnoreCase)))\n                        .Select(o => new\n                        {\n                            key = o.GetNames().Last(),\n                            description = o.Description\n                        })\n                        .ToList();\n                    Console.WriteLine(JsonConvert.SerializeObject(envVars, Formatting.Indented));\n                    _logger.ExitProcess(0);\n                    return;\n                case HelpType.MessageProfiles:\n                    Console.WriteLine(MessagingProfile.GetAllAsMarkdownTable());\n                    return;\n            }\n            // Test the publisher configuration for having all necessary content\n            var configuration = new ConfigurationBuilder()\n                .SetBasePath(Directory.GetCurrentDirectory())\n                .AddJsonFile(\"appsettings.json\", true)\n                .AddEnvironmentVariables()\n                .AddFromDotEnvFile()\n                .AddConnectorAdditionalConfiguration()\n                .AddInMemoryCollection(this).Build();\n            try\n            {\n                // Throws if the messaging profile configuration is invalid\n                _ = new PublisherConfig(configuration).ToOptions();\n            }\n            catch (Exception ex)\n            {\n                _logger.Warning(\"{0}\\nPlease use -h option to get all the supported options.\",\n                    ex.Message);\n                _logger.ExitProcess(170);\n                return;\n            }\n\n            // Validate edge configuration\n            var iotEdgeOptions = new IoTEdgeClientOptions();\n            new Configuration.IoTEdge(configuration).Configure(iotEdgeOptions);\n            var publisherOptions = new PublisherOptions();\n            new Configuration.Aio(configuration).Configure(publisherOptions);\n\n            // Check that the important values are provided\n            if (iotEdgeOptions.EdgeHubConnectionString == null &&\n                publisherOptions.IsAzureIoTOperationsConnector == null)\n            {\n                _logger.Warning(\n                    \"To connect to Azure IoT Hub you must run as module inside IoT Edge or \" +\n                    \"specify a device connection string using EdgeHubConnectionString \" +\n                    \"environment variable or command line.\");\n            }\n\n            void SetStoreType(string s, string storeTypeKey, string optionName)\n            {\n                if (s.Equals(CertificateStoreType.X509Store, StringComparison.OrdinalIgnoreCase) ||\n                    s.Equals(CertificateStoreType.Directory, StringComparison.OrdinalIgnoreCase) ||\n                    s.Equals(FlatCertificateStore.StoreTypeName, StringComparison.OrdinalIgnoreCase))\n                {\n                    this[storeTypeKey] = s;\n                    return;\n                }\n                throw new OptionException(\"Bad store type\", optionName);\n            }\n        }\n\n        private readonly CommandLineLogger _logger;\n    }\n\n    /// <summary>\n    /// Log command line errors\n    /// </summary>\n    public class CommandLineLogger\n    {\n        /// <summary>\n        /// Call exit with exit code\n        /// </summary>\n        /// <param name=\"exitCode\"></param>\n        public virtual void ExitProcess(int exitCode)\n        {\n            Publisher.Runtime.Exit(exitCode);\n        }\n\n        /// <summary>\n        /// Write a log event with the Warning level.\n        /// </summary>\n        /// <param name=\"messageTemplate\">Message template describing the event.</param>\n        public virtual void Warning(string messageTemplate)\n        {\n            Console.WriteLine(messageTemplate);\n        }\n\n        /// <summary>\n        /// Write a log event with the Warning level.\n        /// </summary>\n        /// <typeparam name=\"T0\"></typeparam>\n        /// <param name=\"messageTemplate\">Message template describing the event.</param>\n        /// <param name=\"propertyValue0\">Object positionally formatted into the message template.</param>\n        public virtual void Warning<T0>(string messageTemplate,\n            T0 propertyValue0)\n        {\n            Console.WriteLine(string.Format(CultureInfo.CurrentCulture,\n                messageTemplate, propertyValue0));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Runtime/Configuration.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Runtime\n{\n    using Autofac;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Encoders.Schemas;\n    using Azure.IIoT.OpcUa.Publisher.Module.Controllers;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.Iot.Operations.Protocol;\n    using Furly.Azure.EventHubs;\n    using Furly.Azure.IoT.Edge;\n    using Furly.Azure.IoT.Operations.Runtime;\n    using Furly.Extensions.AspNetCore.OpenApi;\n    using Furly.Extensions.Configuration;\n    using Furly.Extensions.Dapr;\n    using Furly.Extensions.Logging;\n    using Furly.Extensions.Messaging.Runtime;\n    using Furly.Extensions.Mqtt;\n    using Furly.Extensions.Rpc.Runtime;\n    using Furly.Tunnel.Router.Services;\n    using k8s;\n    using Microsoft.AspNetCore.Builder;\n    using Microsoft.AspNetCore.Hosting;\n    using Microsoft.AspNetCore.Server.Kestrel.Core;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Logging.Console;\n    using Microsoft.Extensions.Options;\n    using Microsoft.OpenApi.Models;\n    using OpenTelemetry;\n    using OpenTelemetry.Exporter;\n    using OpenTelemetry.Logs;\n    using OpenTelemetry.Metrics;\n    using OpenTelemetry.Trace;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Net;\n    using System.Text.RegularExpressions;\n\n    /// <summary>\n    /// Configuration extensions\n    /// </summary>\n    public static class Configuration\n    {\n        /// <summary>\n        /// Add all publisher dependencies minus connectivity components.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public static void AddPublisherServices(this ContainerBuilder builder)\n        {\n            builder.AddDefaultJsonSerializer();\n            builder.AddNewtonsoftJsonSerializer();\n            builder.AddMessagePackSerializer();\n            builder.AddPublisherCore();\n\n            builder.RegisterType<HealthCheckRegistrar>()\n                .AsImplementedInterfaces().SingleInstance();\n            builder.RegisterType<CommandLine>()\n                .AsImplementedInterfaces().AsSelf().SingleInstance();\n            builder.RegisterType<LoggingLevel>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<ConsoleLogging<ConsoleFormatterOptions>>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<ConsoleLogging<SimpleConsoleFormatterOptions>>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<ConsoleLogging<JsonConsoleFormatterOptions>>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<Syslog>()\n                .AsImplementedInterfaces().AsSelf().SingleInstance();\n            builder.RegisterType<Kestrel>()\n                .AsImplementedInterfaces();\n\n            // Register and configure controllers\n            builder.RegisterType<MethodRouter>()\n                .AsImplementedInterfaces().SingleInstance()\n                .PropertiesAutowired(\n                    PropertyWiringOptions.AllowCircularDependencies);\n            builder.RegisterType<Router>()\n                .AsImplementedInterfaces();\n\n            builder.RegisterType<PublisherController>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<ConfigurationController>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<WriterController>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<GeneralController>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<HistoryController>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<DiscoveryController>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<CertificatesController>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<DiagnosticsController>()\n                .AsImplementedInterfaces();\n        }\n\n        /// <summary>\n        /// Add resource monitoring\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddResourceMonitoring(this IServiceCollection services,\n            IConfiguration configuration)\n        {\n            var publisherOptions = new PublisherConfig(configuration).ToOptions();\n            if (publisherOptions.Value.DisableResourceMonitoring != true)\n            {\n                services.AddResourceMonitoring();\n            }\n        }\n\n        /// <summary>\n        /// Add mqtt client\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddMqttClient(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            var mqttOptions = new MqttOptions();\n            new MqttBroker(configuration).Configure(mqttOptions);\n            if (mqttOptions.HostName != null)\n            {\n                builder.AddMqttClient();\n                builder.RegisterType<MqttBroker>()\n                    .AsImplementedInterfaces();\n                builder.RegisterType<SchemaTopicBuilder>()\n                    .AsImplementedInterfaces();\n            }\n        }\n\n        /// <summary>\n        /// Add IoT edge services\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddIoTEdgeServices(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            // Validate edge configuration\n            var iotEdgeOptions = new IoTEdgeClientOptions();\n            new IoTEdge(configuration).Configure(iotEdgeOptions);\n            if (iotEdgeOptions.EdgeHubConnectionString != null)\n            {\n                builder.AddIoTEdgeServices();\n                builder.RegisterType<IoTEdge>()\n                    .AsImplementedInterfaces();\n            }\n        }\n\n        /// <summary>\n        /// Add IoT operations services\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddIoTOperationsServices(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            var publisherOptions = new PublisherOptions();\n            new Aio(configuration).Configure(publisherOptions);\n            if (publisherOptions.IsAzureIoTOperationsConnector.HasValue)\n            {\n                // builder.AddAzureIoTOperations();\n                builder.AddAzureIoTOperationsCore();\n                builder.AddAdrClient();\n                builder.AddTelemetryPublisher();\n                builder.AddSchemaRegistry();\n                // builder.AddLeaderElection();\n                // builder.AddStateStore();\n\n                if (publisherOptions.UseFileChangePolling == true)\n                {\n                    builder.Configure<AioOptions>(options =>\n                        options.FileSystemPollingInterval = TimeSpan.FromSeconds(5));\n                }\n\n                builder.RegisterType<Aio>().AsImplementedInterfaces();\n                if (publisherOptions.IsAzureIoTOperationsConnector.Value)\n                {\n                    builder.RegisterInstance(new HybridLogicalClock(\n                        DateTime.UtcNow, 0, publisherOptions.PublisherId))\n                        .AsSelf().SingleInstance();\n                    builder.RegisterType<AssetDeviceIntegration>()\n                        .AsSelf().AsImplementedInterfaces().SingleInstance();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Add Event Hubs client\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddEventHubsClient(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            // Validate edge configuration\n            var eventHubsOptions = new EventHubsClientOptions();\n            new EventHubs(configuration).Configure(eventHubsOptions);\n            if (eventHubsOptions.ConnectionString != null)\n            {\n                builder.AddHubEventClient();\n                builder.RegisterType<EventHubs>()\n                    .AsImplementedInterfaces();\n            }\n        }\n\n        /// <summary>\n        /// Add file system client\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddFileSystemEventClient(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            var fsOptions = new FileSystemEventClientOptions();\n            new FileSystem(configuration).Configure(fsOptions);\n            if (fsOptions.OutputFolder != null)\n            {\n                builder.AddFileSystemEventClient();\n                builder.RegisterType<FileSystem>()\n                    .AsImplementedInterfaces();\n                builder.RegisterType<AvroWriter>()\n                    .AsImplementedInterfaces();\n                builder.RegisterType<ConsoleWriter>()\n                    .AsImplementedInterfaces();\n            }\n        }\n\n        /// <summary>\n        /// Add file system rpc server\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddFileSystemRpcServer(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            var fsOptions = new FileSystemRpcServerOptions();\n            new FileSystem(configuration).Configure(fsOptions);\n            if (fsOptions.RequestFilePath != null)\n            {\n                builder.AddFileSystemRpcServer();\n                builder.RegisterType<FileSystem>()\n                    .AsImplementedInterfaces();\n            }\n        }\n\n        /// <summary>\n        /// Add http event client\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddHttpEventClient(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            var httpOptions = new HttpEventClientOptions();\n            new Http(configuration).Configure(httpOptions);\n            if (httpOptions.HostName != null)\n            {\n                builder.AddHttpEventClient();\n                builder.RegisterType<Http>()\n                    .AsImplementedInterfaces();\n            }\n        }\n\n        /// <summary>\n        /// Add dapr client\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddDaprPubSubClient(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            var daprOptions = new DaprOptions();\n            new Dapr(configuration).Configure(daprOptions);\n            if (!string.IsNullOrWhiteSpace(daprOptions.PubSubComponent))\n            {\n                builder.AddDaprPubSubClient();\n                builder.RegisterType<Dapr>()\n                    .AsImplementedInterfaces();\n            }\n        }\n\n        /// <summary>\n        /// Add dapr client\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        public static void AddDaprStateStoreClient(this ContainerBuilder builder,\n            IConfiguration configuration)\n        {\n            var daprOptions = new DaprOptions();\n            new Dapr(configuration).Configure(daprOptions);\n            if (!string.IsNullOrWhiteSpace(daprOptions.StateStoreName))\n            {\n                builder.AddDaprStateStoreClient();\n                builder.RegisterType<Dapr>()\n                    .AsImplementedInterfaces();\n            }\n        }\n\n        /// <summary>\n        /// Use prometheus endpoint\n        /// </summary>\n        /// <param name=\"app\"></param>\n        /// <returns></returns>\n        public static IApplicationBuilder UseOpenTelemetryPrometheusEndpoint(this IApplicationBuilder app)\n        {\n            if (app.ApplicationServices.GetService<Otel>()?.AddPrometheusEndpoint == true)\n            {\n                app.UseOpenTelemetryPrometheusScrapingEndpoint();\n            }\n            return app;\n        }\n\n        /// <summary>\n        /// Add open api\n        /// </summary>\n        /// <param name=\"services\"></param>\n        public static IServiceCollection AddOpenApi(this IServiceCollection services)\n        {\n            return services\n                .AddSingleton<IConfigureOptions<OpenApiOptions>, OpenApi>()\n                .AddSingleton<IConfigureNamedOptions<OpenApiOptions>, OpenApi>()\n                .AddSwagger(Constants.EntityTypePublisher, string.Empty);\n        }\n\n        /// <summary>\n        /// Use open api\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public static IApplicationBuilder UseOpenApi(this IApplicationBuilder builder)\n        {\n            var options = builder.ApplicationServices.GetService<IOptions<PublisherOptions>>();\n            if (options?.Value.DisableOpenApiEndpoint != true)\n            {\n                return builder.UseSwagger();\n            }\n            return builder;\n        }\n\n        /// <summary>\n        /// Add open telemetry to the logging builder\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"configure\"></param>\n        public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder,\n            IConfiguration configuration, Action<OpenTelemetryLoggerOptions> configure)\n        {\n            var configurator = new Otel(configuration);\n            if (configurator.EnableOtelLogging)\n            {\n                builder.Services.AddOtel();\n                builder.AddOpenTelemetry(options =>\n                {\n                    configure(options);\n                    options.AddOtlpExporter((o, _) => configurator.Configure(\"Logging\", o));\n                });\n            }\n            return builder;\n        }\n\n        /// <summary>\n        /// Enable tracing if tracing enabled\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"configure\"></param>\n        /// <returns></returns>\n        public static OpenTelemetryBuilder WithTracing(this OpenTelemetryBuilder builder,\n            IConfiguration configuration, Action<TracerProviderBuilder> configure)\n        {\n            var configurator = new Otel(configuration);\n            if (configurator.EnableOtelTraces)\n            {\n                return builder.WithTracing(options =>\n                {\n                    options.ConfigureServices(services => services.AddOtel());\n                    options.AddOtlpExporter(o => configurator.Configure(\"Traces\", o));\n                    if (configurator.AddRuntimeInstrumentation)\n                    {\n                        options = options\n                            .AddHttpClientInstrumentation()\n                            .AddAspNetCoreInstrumentation();\n                    }\n                    configure(options);\n                });\n            }\n            return builder;\n        }\n\n        /// <summary>\n        /// Enable tracing if tracing enabled\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"configure\"></param>\n        /// <returns></returns>\n        public static OpenTelemetryBuilder WithMetrics(this OpenTelemetryBuilder builder,\n            IConfiguration configuration, Action<MeterProviderBuilder> configure)\n        {\n            var configurator = new Otel(configuration);\n            if (configurator.AddPrometheusEndpoint ||\n                configurator.EnableOtelMetrics ||\n                configurator.AddRuntimeInstrumentation) // We use runtime instrumentation for diagnostics\n            {\n                return builder.WithMetrics(options =>\n                {\n                    options.ConfigureServices(services => services.AddOtel());\n                    if (configurator.AddPrometheusEndpoint)\n                    {\n                        options.SetMaxMetricStreams(configurator.MaxMetricStreams);\n                        options.AddPrometheusExporter(o =>\n                        {\n                            o.DisableTotalNameSuffixForCounters =\n                                !configurator.EnableTotalNameSuffixForCounters;\n\n                            //\n                            // Configures scrape endpoint response caching. Multiple scrape requests\n                            // within the cache duration time period will receive the same previously\n                            // generated response. Disable response caching. The default value is 300.\n                            //\n                            o.ScrapeResponseCacheDurationMilliseconds = 0;\n                        });\n                        if (configurator.AddRuntimeInstrumentation)\n                        {\n                            options = options\n                                .AddHttpClientInstrumentation()\n                                .AddAspNetCoreInstrumentation();\n                        }\n                    }\n                    if (configurator.EnableOtelMetrics)\n                    {\n                        options = options\n                            .SetMaxMetricStreams(configurator.MaxMetricStreams)\n                            .AddOtlpExporter(o => configurator.Configure(\"Metrics\", o));\n\n                        if (configurator.AddRuntimeInstrumentation)\n                        {\n                            options = options\n                                .AddHttpClientInstrumentation()\n                                .AddAspNetCoreInstrumentation();\n                        }\n                    }\n                    if (configurator.AddRuntimeInstrumentation)\n                    {\n                        options = options.AddRuntimeInstrumentation();\n                    }\n                    configure(options);\n                });\n            }\n            return builder;\n        }\n\n        /// <summary>\n        /// Adds secrets from a env file that is located at $ADDITIONAL_CONFIGURATION\n        /// Defaults to .env file in docker /run/secrets folder.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public static IConfigurationBuilder AddSecrets(this IConfigurationBuilder builder)\n        {\n            try\n            {\n                return builder.Add(new DotEnvFileSource(\n                    Environment.GetEnvironmentVariable(\"ADDITIONAL_CONFIGURATION\")\n                        ?? \"/run/secrets/.env\"));\n            }\n            catch (UnauthorizedAccessException)\n            {\n                return builder;\n            }\n        }\n\n        /// <summary>\n        /// Add connector configuration\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <returns></returns>\n        public static IConfigurationBuilder AddConnectorAdditionalConfiguration(\n            this IConfigurationBuilder builder)\n        {\n            var connectorConfigMountPath = Environment.GetEnvironmentVariable(\n                Azure.Iot.Operations.Connector.ConnectorConfigurations.\n                    ConnectorFileMountSettings.ConnectorConfigMountPathEnvVar);\n            if (string.IsNullOrEmpty(connectorConfigMountPath))\n            {\n                return builder;\n            }\n            var additionalConfiguration = Path.Combine(connectorConfigMountPath,\n                \"ADDITIONAL_CONNECTOR_CONFIGURATION\");\n            var diagnostics = Path.Combine(connectorConfigMountPath,\n                 Azure.Iot.Operations.Connector.ConnectorConfigurations.\n                    ConnectorFileMountSettings.ConnectorDiagnosticsConfigFileName);\n            return builder\n                .AddJsonFile(diagnostics, optional: true,\n                    reloadOnChange: true)\n                .AddJsonFile(additionalConfiguration, optional: true,\n                    reloadOnChange: true);\n        }\n\n        /// <summary>\n        /// Add obs configuration\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <returns></returns>\n        private static IServiceCollection AddOtel(this IServiceCollection services)\n        {\n            return services\n                .AddSingleton<Otel>()\n                .AddSingleton<IConfigureOptions<MetricReaderOptions>>(\n                    services => services.GetRequiredService<Otel>())\n                .AddSingleton<IConfigureNamedOptions<MetricReaderOptions>>(\n                    services => services.GetRequiredService<Otel>())\n                ;\n        }\n\n        /// <summary>\n        /// Otel configuration from environment\n        /// </summary>\n        internal sealed class Otel : ConfigureOptionBase<MetricReaderOptions>\n        {\n            public const string EnableMetricsKey = \"EnableMetrics\";\n            public const string EnableOtelLoggingKey = \"EnableOtelLogging\";\n            public const string EnableOtelTracesKey = \"EnableOtelTraces\";\n            public const string OtlpCollectorEndpointKey = \"OtlpCollectorEndpoint\";\n            public const string OtlpMaxMetricStreamsKey = \"OtlpMaxMetricStreams\";\n            public const string OtlpExportIntervalMillisecondsKey = \"OtlpExportIntervalMilliseconds\";\n            public const string OtlpRuntimeInstrumentationKey = \"OtlpRuntimeInstrumentation\";\n            public const string OtlpTotalNameSuffixForCountersKey = \"OtlpTotalNameSuffixForCounters\";\n\n            public const int OtlpExportIntervalMillisecondsDefault = 15000;\n            public const int OtlpMaxMetricDefault = 4000;\n            public const bool OtlpRuntimeInstrumentationDefault = false;\n            public const bool OtlpTotalNameSuffixForCountersDefault = false;\n\n            /// <summary>\n            /// Add runtime instrumentation\n            /// </summary>\n            public bool AddRuntimeInstrumentation\n                => GetBoolOrDefault(OtlpRuntimeInstrumentationKey, OtlpRuntimeInstrumentationDefault);\n\n            /// <summary>\n            /// Otlp collector endpoint\n            /// </summary>\n            public string OTlpMetricsEndpoint => GetStringOrDefault(OtlpCollectorEndpointKey,\n                GetStringOrDefault(\"OTLP_GRPC_METRIC_ENDPOINT\",\n                    GetStringOrDefault(\"OTLP_HTTP_METRIC_ENDPOINT\", string.Empty)));\n\n            /// <summary>\n            /// Otlp collector endpoint\n            /// </summary>\n            public string OTlpTracesEndpoint => GetStringOrDefault(OtlpCollectorEndpointKey,\n                GetStringOrDefault(\"OTLP_GRPC_TRACE_ENDPOINT\",\n                    GetStringOrDefault(\"OTLP_HTTP_TRACE_ENDPOINT\", string.Empty)));\n\n            /// <summary>\n            /// Otlp collector endpoint\n            /// </summary>\n            public string OTlpLogEndpoint => GetStringOrDefault(OtlpCollectorEndpointKey,\n                GetStringOrDefault(\"OTLP_GRPC_LOG_ENDPOINT\",\n                    GetStringOrDefault(\"OTLP_HTTP_LOG_ENDPOINT\", string.Empty)));\n\n            /// <summary>\n            /// Enable otel or prometheus metrics\n            /// </summary>\n            public bool EnableMetrics\n                => GetBoolOrDefault(EnableMetricsKey);\n\n            /// <summary>\n            /// Use prometheus\n            /// </summary>\n            public bool AddPrometheusEndpoint\n                => GetBoolOrDefault(EnableMetricsKey) && string.IsNullOrEmpty(OTlpMetricsEndpoint);\n\n            /// <summary>\n            /// Use otel metrics exporter\n            /// </summary>\n            public bool EnableOtelMetrics\n                => GetBoolOrDefault(EnableMetricsKey) && !string.IsNullOrEmpty(OTlpMetricsEndpoint);\n\n            /// <summary>\n            /// Logging over otel enabled and endpoint configured\n            /// </summary>\n            public bool EnableOtelLogging\n                => GetBoolOrDefault(EnableOtelLoggingKey) && !string.IsNullOrEmpty(OTlpLogEndpoint);\n\n            /// <summary>\n            /// Traces over otel\n            /// </summary>\n            public bool EnableOtelTraces\n                => GetBoolOrDefault(EnableOtelTracesKey) && !string.IsNullOrEmpty(OTlpTracesEndpoint);\n\n            /// <summary>\n            /// Max metrics to collect, the default in otel is 1000\n            /// </summary>\n            public int MaxMetricStreams\n                => Math.Max(1, GetIntOrDefault(OtlpMaxMetricStreamsKey, OtlpMaxMetricDefault));\n\n            /// <summary>\n            /// Enable total suffix\n            /// </summary>\n            public bool EnableTotalNameSuffixForCounters\n                => GetBoolOrDefault(OtlpTotalNameSuffixForCountersKey, OtlpTotalNameSuffixForCountersDefault);\n\n            /// <inheritdoc/>\n            public void Configure(string? name, OtlpExporterOptions options)\n            {\n                var endpoint = name switch\n                {\n                    \"Metrics\" => OTlpMetricsEndpoint,\n                    \"Traces\" => OTlpTracesEndpoint,\n                    \"Logging\" => OTlpLogEndpoint,\n                    _ => null,\n                };\n                if (!string.IsNullOrEmpty(endpoint) &&\n                    Uri.TryCreate(endpoint, UriKind.RelativeOrAbsolute, out var uri))\n                {\n                    options.Endpoint = new UriBuilder(uri)\n                    {\n                        Scheme = Uri.UriSchemeHttp\n                    }.Uri;\n                }\n            }\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, MetricReaderOptions options)\n            {\n                options.PeriodicExportingMetricReaderOptions =\n                    new PeriodicExportingMetricReaderOptions\n                    {\n                        ExportIntervalMilliseconds = GetIntOrDefault(\n                            OtlpExportIntervalMillisecondsKey,\n                            GetIntOrDefault(\"OTLP_METRIC_EXPORT_INTERVAL_3P\",\n                                OtlpExportIntervalMillisecondsDefault))\n                    };\n            }\n\n            /// <summary>\n            /// Create otlp configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public Otel(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Configure kestrel setup\n        /// </summary>\n        internal sealed class Kestrel : ConfigureOptionBase<KestrelServerOptions>\n        {\n            /// <summary>\n            /// Create kestrel configuration\n            /// </summary>\n            /// <param name=\"certificates\"></param>\n            /// <param name=\"options\"></param>\n            /// <param name=\"configuration\"></param>\n            public Kestrel(ISslCertProvider certificates, IOptions<PublisherOptions> options,\n                IConfiguration configuration)\n                : base(configuration)\n            {\n                _certificates = certificates;\n                _options = options;\n            }\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, KestrelServerOptions options)\n            {\n                if (_options.Value.UnsecureHttpServerPort != null)\n                {\n                    options.ListenAnyIP(_options.Value.UnsecureHttpServerPort.Value);\n                }\n\n                if (_options.Value.HttpServerPort != null)\n                {\n                    options.Listen(IPAddress.Any, _options.Value.HttpServerPort.Value,\n                        listenOptions => listenOptions.UseHttps(httpsOptions => httpsOptions\n                            .ServerCertificateSelector = (_, _) => _certificates.Certificate));\n                }\n            }\n\n            private readonly IOptions<PublisherOptions> _options;\n            private readonly ISslCertProvider _certificates;\n        }\n\n        /// <summary>\n        /// Configure logger filter\n        /// </summary>\n        internal sealed class LoggingLevel : ConfigureOptionBase<LoggerFilterOptions>\n        {\n            /// <summary>\n            /// Configuration\n            /// </summary>\n            public const string LogLevelKey = \"LogLevel\";\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, LoggerFilterOptions options)\n            {\n                var levelString = GetStringOrDefault(LogLevelKey);\n                if (!string.IsNullOrEmpty(levelString))\n                {\n                    if (Enum.TryParse<LogLevel>(levelString, true, out var ll))\n                    {\n                        options.MinLevel = ll;\n                    }\n                    else\n                    {\n                        // Compatibilty with serilog\n                        switch (levelString)\n                        {\n                            case \"Verbose\":\n                                options.MinLevel = LogLevel.Trace;\n                                break;\n                            case \"Fatal\":\n                                options.MinLevel = LogLevel.Critical;\n                                break;\n                        }\n                    }\n                    // Use command line configuration only\n                    return;\n                }\n\n                // Get diagnostic config from { logs: { level: x } }\n                levelString = GetStringOrDefault(\"logs:level\");\n                if (string.IsNullOrEmpty(levelString))\n                {\n                    return;\n                }\n                switch (levelString.ToLowerInvariant())\n                {\n                    case \"trace\":\n                        options.MinLevel = LogLevel.Trace;\n                        return;\n                    case \"debug\":\n                        options.MinLevel = LogLevel.Debug;\n                        return;\n                    case \"info\":\n                        options.MinLevel = LogLevel.Information;\n                        return;\n                    case \"warn\":\n                        options.MinLevel = LogLevel.Warning;\n                        return;\n                    case \"error\":\n                        options.MinLevel = LogLevel.Error;\n                        return;\n                    case \"none\":\n                        options.MinLevel = LogLevel.None;\n                        return;\n                }\n                // Since it is free form, try to adapt to .net log level names\n                if (Enum.TryParse<LogLevel>(levelString, true, out var logLevel))\n                {\n                    options.MinLevel = logLevel;\n                }\n            }\n\n            /// <summary>\n            /// Create logging configurator\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public LoggingLevel(IConfiguration configuration) : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Logging format\n        /// </summary>\n        internal class LoggingFormat : PostConfigureOptionBase<ConsoleLoggerOptions>\n        {\n            /// <summary>\n            /// Supported formats\n            /// </summary>\n            public static readonly string[] LogFormatsSupported =\n            [\n                ConsoleFormatterNames.Simple,\n                Syslog.FormatterName,\n                ConsoleFormatterNames.Systemd\n            ];\n\n            /// <summary>\n            /// Configuration\n            /// </summary>\n            public const string LogFormatKey = \"LogFormat\";\n\n            /// <summary>\n            /// Default format\n            /// </summary>\n            public const string LogFormatDefault = ConsoleFormatterNames.Simple;\n\n            /// <inheritdoc/>\n            public override void PostConfigure(string? name, ConsoleLoggerOptions options)\n            {\n                switch (GetStringOrDefault(LogFormatKey))\n                {\n                    case Syslog.FormatterName:\n                        options.FormatterName = Syslog.FormatterName;\n                        break;\n                    case ConsoleFormatterNames.Systemd:\n                        options.FormatterName = ConsoleFormatterNames.Systemd;\n                        break;\n                    case ConsoleFormatterNames.Simple:\n                        options.FormatterName = ConsoleFormatterNames.Simple;\n                        break;\n                    default:\n                        options.FormatterName = LogFormatDefault;\n                        break;\n                }\n            }\n\n            /// <summary>\n            /// Create logging configurator\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public LoggingFormat(IConfiguration configuration) : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Logging format\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        internal sealed class ConsoleLogging<T> : LoggingFormat,\n            IConfigureOptions<T>, IConfigureNamedOptions<T> where T : ConsoleFormatterOptions\n        {\n            /// <inheritdoc/>\n            public void Configure(string? name, T options)\n            {\n                options.TimestampFormat = \"[yy-MM-dd HH:mm:ss.ffff] \";\n                options.IncludeScopes = true;\n                options.UseUtcTimestamp = true;\n            }\n\n            /// <inheritdoc/>\n            public void Configure(T options)\n            {\n                Configure(null, options);\n            }\n\n            /// <summary>\n            /// Create logging configurator\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public ConsoleLogging(IConfiguration configuration) : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Configure the method router\n        /// </summary>\n        internal sealed class Router : PostConfigureOptionBase<RouterOptions>\n        {\n            /// <summary>\n            /// Create configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            /// <param name=\"options\"></param>\n            public Router(IConfiguration configuration,\n                IOptions<PublisherOptions> options) : base(configuration)\n            {\n                _options = options;\n            }\n\n            /// <inheritdoc/>\n            public override void PostConfigure(string? name, RouterOptions options)\n            {\n                options.MountPoint ??= new TopicBuilder(_options.Value).MethodTopic;\n            }\n\n            private readonly IOptions<PublisherOptions> _options;\n        }\n\n        /// <summary>\n        /// Configure the Dapr event client\n        /// </summary>\n        internal sealed class Dapr : ConfigureOptionBase<DaprOptions>\n        {\n            public const string PubSubComponentKey = \"PubSubComponent\";\n            public const string StateStoreKey = \"StateStore\";\n            public const string HttpPortKey = \"HttpPort\";\n            public const string GrpcPortKey = \"GrpcPort\";\n            public const string SchemeKey = \"Scheme\";\n            public const string HostKey = \"Host\";\n            public const string CheckSideCarHealthKey = \"CheckSideCarHealth\";\n            public const string DaprConnectionStringKey = \"DaprConnectionString\";\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, DaprOptions options)\n            {\n                var daprConnectionString = GetStringOrDefault(DaprConnectionStringKey);\n                if (daprConnectionString != null)\n                {\n                    options.PubSubComponent = null;\n                    options.StateStoreName = null;\n\n                    var properties = ToDictionary(daprConnectionString);\n                    if (properties.TryGetValue(PubSubComponentKey, out var component))\n                    {\n                        options.PubSubComponent = component;\n                    }\n\n                    if (properties.TryGetValue(StateStoreKey, out var stateStore))\n                    {\n                        options.StateStoreName = stateStore;\n                    }\n\n                    // Select the scheme, default to http (side car)\n                    if (!properties.TryGetValue(SchemeKey, out var scheme))\n                    {\n                        scheme = \"http\";\n                    }\n\n                    // Select the host, default to localhost\n                    if (!properties.TryGetValue(HostKey, out var host))\n                    {\n                        host = \"localhost\";\n                    }\n\n                    // Check whether to check side car health\n                    if (properties.TryGetValue(CheckSideCarHealthKey, out var value) &&\n                        bool.TryParse(value, out var check))\n                    {\n                        options.CheckSideCarHealthBeforeAccess = check;\n                    }\n\n                    // Permit the port to be set if provided, otherwise use defaults.\n                    if (properties.TryGetValue(GrpcPortKey, out value) &&\n                        int.TryParse(value, CultureInfo.InvariantCulture, out var port))\n                    {\n                        options.GrpcEndpoint = scheme + \"://\" + host + \":\" + port;\n                    }\n\n                    if (properties.TryGetValue(HttpPortKey, out value) &&\n                        int.TryParse(value, CultureInfo.InvariantCulture, out port))\n                    {\n                        options.HttpEndpoint = scheme + \"://\" + host + \":\" + port;\n                    }\n                }\n                else\n                {\n                    options.PubSubComponent ??= GetStringOrDefault(PubSubComponentKey);\n                    options.StateStoreName ??= GetStringOrDefault(StateStoreKey);\n                }\n\n                // The api token should be part of the environment if dapr is supported\n                options.ApiToken ??= GetStringOrDefault(EnvironmentVariable.DAPRAPITOKEN);\n            }\n\n            /// <summary>\n            /// Create configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public Dapr(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Configure the http event client\n        /// </summary>\n        internal sealed class Http : ConfigureOptionBase<HttpEventClientOptions>\n        {\n            public const string HttpConnectionStringKey = \"HttpConnectionString\";\n            public const string WebHookHostUrlKey = \"WebHookHostUrl\";\n            public const string HostNameKey = \"HostName\";\n            public const string PortKey = \"Port\";\n            public const string SchemeKey = \"Scheme\";\n            public const string PutKey = \"Put\";\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, HttpEventClientOptions options)\n            {\n                var httpConnectionString = GetStringOrDefault(HttpConnectionStringKey);\n                if (httpConnectionString != null)\n                {\n                    var properties = ToDictionary(httpConnectionString);\n\n                    if (properties.TryGetValue(HostNameKey, out var value))\n                    {\n                        options.HostName = value;\n                    }\n\n                    // Permit the port to be set if provided, otherwise use defaults.\n                    if (properties.TryGetValue(PortKey, out value) &&\n                        int.TryParse(value, CultureInfo.InvariantCulture, out var port))\n                    {\n                        options.Port = port;\n                    }\n\n                    if (properties.TryGetValue(SchemeKey, out value) &&\n                        value.Equals(\"http\", StringComparison.OrdinalIgnoreCase))\n                    {\n                        options.UseHttpScheme = true;\n                    }\n\n                    if (properties.TryGetValue(PutKey, out _))\n                    {\n                        options.UseHttpPutMethod = true;\n                    }\n                }\n                else\n                {\n                    var url = GetStringOrDefault(WebHookHostUrlKey);\n                    if (!string.IsNullOrEmpty(url) &&\n                        Uri.TryCreate(url, UriKind.Absolute, out var uri))\n                    {\n                        options.HostName = uri.Host;\n                        options.Port = uri.Port;\n                        options.UseHttpScheme = uri.Scheme == Uri.UriSchemeHttp;\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Create configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public Http(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Open api configuration\n        /// </summary>\n        internal sealed class OpenApi : ConfigureOptionBase<OpenApiOptions>\n        {\n            public const string UseOpenApiV3Key = \"UseOpenApiV3\";\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, OpenApiOptions options)\n            {\n                options.SchemaVersion = GetBoolOrDefault(UseOpenApiV3Key) ? 3 : 2;\n                options.ProjectUri = new Uri(\"https://www.github.com/Azure/Industrial-IoT\");\n                options.License = new OpenApiLicense\n                {\n                    Name = \"MIT LICENSE\",\n                    Url = new Uri(\"https://opensource.org/licenses/MIT\")\n                };\n            }\n\n            /// <summary>\n            /// Create configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public OpenApi(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Configure the file based event client\n        /// </summary>\n        internal sealed class FileSystem : ConfigureOptionBase<FileSystemEventClientOptions>,\n            IConfigureOptions<FileSystemRpcServerOptions>,\n            IConfigureNamedOptions<FileSystemRpcServerOptions>\n        {\n            public const string OutputRootKey = \"OutputRoot\";\n            public const string InitFilePathKey = \"InitFilePath\";\n            public const string InitLogFileKey = \"InitLogFile\";\n\n            /// <inheritdoc/>\n            public void Configure(FileSystemRpcServerOptions options)\n            {\n                Configure(null, options);\n            }\n\n            /// <inheritdoc/>\n            public void Configure(string? name, FileSystemRpcServerOptions options)\n            {\n                var publishedNodesFile = GetStringOrDefault(\n                    PublisherConfig.PublishedNodesFileKey);\n                var rootFolder = Path.GetDirectoryName(publishedNodesFile)\n                    ?? Environment.CurrentDirectory;\n\n                options.RequestFilePath ??= GetStringOrDefault(InitFilePathKey);\n                if (options.RequestFilePath == null)\n                {\n                    return;\n                }\n\n                if (options.RequestFilePath.Trim().Length == 0)\n                {\n                    // We use pn.json file path and publishednodes.init file name\n                    options.RequestFilePath = Path.Combine(rootFolder,\n                        \"publishednodes.init\");\n                }\n\n                // Just file?\n                else if (string.IsNullOrEmpty(\n                    Path.GetDirectoryName(options.RequestFilePath)))\n                {\n                    options.RequestFilePath = Path.Combine(rootFolder,\n                        options.RequestFilePath!);\n                }\n\n                options.ResponseFilePath ??= GetStringOrDefault(InitLogFileKey);\n                if (options.ResponseFilePath == null && options.RequestFilePath != null)\n                {\n                    options.ResponseFilePath = options.RequestFilePath + \".log\";\n                }\n\n                // Just file?\n                else if (string.IsNullOrEmpty(\n                    Path.GetDirectoryName(options.ResponseFilePath)))\n                {\n                    options.ResponseFilePath = Path.Combine(Path.GetDirectoryName(\n                        options.RequestFilePath) ?? Environment.CurrentDirectory,\n                        options.ResponseFilePath!);\n                }\n            }\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, FileSystemEventClientOptions options)\n            {\n                options.OutputFolder ??= GetStringOrDefault(OutputRootKey);\n            }\n\n            /// <summary>\n            /// Create configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public FileSystem(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Configure mqtt broker\n        /// </summary>\n        internal sealed class MqttBroker : ConfigureOptionBase<MqttOptions>\n        {\n            /// <summary>\n            /// Configuration\n            /// </summary>\n            public const string MqttClientConnectionStringKey = \"MqttClientConnectionString\";\n            public const string ClientPartitionsKey = \"MqttClientPartitions\";\n            public const string KeepAlivePeriodKey = \"MqttBrokerKeepAlivePeriod\";\n            public const string ClientIdKey = \"MqttClientId\";\n            public const string UserNameKey = \"MqttBrokerUserName\";\n            public const string PasswordKey = \"MqttBrokerPasswordKey\";\n            public const string HostNameKey = \"MqttBrokerHostName\";\n            public const string HostPortKey = \"MqttBrokerPort\";\n            public const string ProtocolKey = \"MqttProtocolVersion\";\n            public const string UseTlsKey = \"MqttBrokerUsesTls\";\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, MqttOptions options)\n            {\n                var mqttClientConnectionString = GetStringOrDefault(MqttClientConnectionStringKey);\n                if (mqttClientConnectionString != null)\n                {\n                    var properties = ToDictionary(mqttClientConnectionString);\n                    if (properties.TryGetValue(nameof(options.HostName), out var value))\n                    {\n                        options.HostName = value;\n                    }\n                    if (properties.TryGetValue(nameof(options.Port), out value) &&\n                        int.TryParse(value, CultureInfo.InvariantCulture, out var port))\n                    {\n                        options.Port = port;\n                    }\n                    if (properties.TryGetValue(nameof(options.UserName), out value))\n                    {\n                        options.UserName = value;\n                    }\n                    if (properties.TryGetValue(nameof(options.Password), out value))\n                    {\n                        options.Password = value;\n                    }\n                    if (properties.TryGetValue(nameof(options.Protocol), out value) &&\n                        Enum.TryParse<MqttVersion>(value, true, out var version))\n                    {\n                        options.Protocol = version;\n                    }\n                    if (properties.TryGetValue(nameof(options.UseTls), out value) &&\n                        bool.TryParse(value, out var useTls))\n                    {\n                        options.UseTls = useTls;\n                    }\n                    if (properties.TryGetValue(nameof(options.KeepAlivePeriod), out value) &&\n                        TimeSpan.TryParse(value, out var keepAlive))\n                    {\n                        options.KeepAlivePeriod = keepAlive;\n                    }\n                    if (properties.TryGetValue(\"Partitions\", out value) &&\n                        int.TryParse(value, out var partitions))\n                    {\n                        options.NumberOfClientPartitions = partitions;\n                    }\n                }\n                else\n                {\n                    if (string.IsNullOrEmpty(options.HostName))\n                    {\n                        options.ClientId = GetStringOrDefault(HostNameKey);\n                    }\n                    if (string.IsNullOrEmpty(options.UserName))\n                    {\n                        options.UserName = GetStringOrDefault(UserNameKey);\n                    }\n                    if (string.IsNullOrEmpty(options.Password))\n                    {\n                        options.Password = GetStringOrDefault(PasswordKey);\n                    }\n                    options.Port ??= GetIntOrNull(HostPortKey);\n                    if (Enum.TryParse<MqttVersion>(GetStringOrDefault(ProtocolKey),\n                        true, out var version))\n                    {\n                        options.Protocol = version;\n                    }\n                    options.UseTls ??= GetBoolOrNull(UseTlsKey);\n                    options.NumberOfClientPartitions ??= GetIntOrNull(ClientPartitionsKey);\n                    if (options.KeepAlivePeriod == null)\n                    {\n                        options.KeepAlivePeriod = GetDurationOrNull(KeepAlivePeriodKey);\n                    }\n                }\n                if (string.IsNullOrEmpty(options.ClientId))\n                {\n                    options.ClientId = GetStringOrDefault(ClientIdKey);\n                }\n            }\n\n            /// <summary>\n            /// Transport configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public MqttBroker(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Avro file writer configuration\n        /// </summary>\n        internal sealed class AvroWriter : ConfigureOptionBase<AvroFileWriterOptions>\n        {\n            public const string DisableKey = \"DisableAvroFileWriter\";\n\n            public override void Configure(string? name, AvroFileWriterOptions options)\n            {\n                options.Disabled = GetBoolOrDefault(DisableKey);\n            }\n\n            /// <summary>\n            /// Transport configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public AvroWriter(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Console file writer configuration\n        /// </summary>\n        internal sealed class ConsoleWriter : ConfigureOptionBase<ConsoleWriterOptions>\n        {\n            public const string EnableKey = \"EnableConsoleWriter\";\n\n            public override void Configure(string? name, ConsoleWriterOptions options)\n            {\n                options.Enabled = GetBoolOrDefault(EnableKey);\n            }\n\n            /// <summary>\n            /// Transport configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public ConsoleWriter(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Configure schema topic templates\n        /// </summary>\n        internal sealed class SchemaTopicBuilder : ConfigureOptionBase<MqttOptions>\n        {\n            /// <inheritdoc/>\n            public override void Configure(string? name, MqttOptions options)\n            {\n                if (_options.Value.SchemaOptions != null &&\n                    _options.Value.TopicTemplates.Schema != null)\n                {\n                    options.ConfigureSchemaMessage = message =>\n                    {\n                        //\n                        // Set the telemetry topic template to the passed\n                        // in message topic\n                        //\n                        var templates = new TopicTemplatesOptions\n                        {\n                            Telemetry = message.Topic\n                        };\n                        message.Topic = new TopicBuilder(_options.Value,\n                            templates: templates).SchemaTopic;\n                    };\n                }\n            }\n\n            /// <inheritdoc/>\n            public SchemaTopicBuilder(IConfiguration configuration,\n                IOptions<PublisherOptions> options)\n                : base(configuration)\n            {\n                _options = options;\n            }\n\n            private readonly IOptions<PublisherOptions> _options;\n        }\n\n        /// <summary>\n        /// Configure edge client\n        /// </summary>\n        internal sealed class IoTEdge : ConfigureOptionBase<IoTEdgeClientOptions>\n        {\n            /// <summary>\n            /// Configuration\n            /// </summary>\n            public const string HubTransport = \"Transport\";\n            public const string UpstreamProtocol = \"UpstreamProtocol\";\n            public const string EdgeHubConnectionString = \"EdgeHubConnectionString\";\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, IoTEdgeClientOptions options)\n            {\n                if (string.IsNullOrEmpty(options.EdgeHubConnectionString))\n                {\n                    options.EdgeHubConnectionString = GetStringOrDefault(EdgeHubConnectionString);\n                }\n                if (options.EdgeHubConnectionString == null &&\n                    Environment.GetEnvironmentVariable(\"IOTEDGE_DEVICEID\") != null)\n                {\n                    options.EdgeHubConnectionString = string.Empty;\n                }\n                if (options.Transport == TransportOption.None)\n                {\n                    if (Enum.TryParse<TransportOption>(GetStringOrDefault(HubTransport),\n                            out var transport) ||\n                        Enum.TryParse(GetStringOrDefault(UpstreamProtocol),\n                            out transport))\n                    {\n                        options.Transport = transport;\n                    }\n                }\n                options.Product = $\"OpcPublisher_{GetType().Assembly.GetReleaseVersion()}\";\n            }\n\n            /// <summary>\n            /// Transport configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public IoTEdge(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Configure Azure IoT Operations integration\n        /// </summary>\n        internal sealed class Aio : ConfigureOptionBase<PublisherOptions>\n        {\n            /// <summary>\n            /// Configuration\n            /// </summary>\n            public const string BrokerHostName = \"AIO_BROKER_HOSTNAME\";\n            public const string ConnectorId = \"CONNECTOR_ID\";\n\n            public const string DiscoveredDeviceEndpointTypeKey =\n                \"AioDiscoveredDeviceEndpointType\";\n            public const string DiscoveredDeviceEndpointTypeVersionKey =\n                \"AioDiscoveredDeviceEndpointTypeVersion\";\n            public const string NetworkDiscoveryModeKey =\n                \"AioNetworkDiscoveryMode\";\n            public const string NetworkDiscoveryIntervalKey =\n                \"AioNetworkDiscoveryInterval\";\n            public const string NetworkDiscoveryAddressRangesToScanKey =\n                \"AioNetworkDiscoveryAddressRangesToScan\";\n            public const string NetworkDiscoveryNetworkProbeTimeoutKey =\n                \"AioNetworkDiscoveryNetworkProbeTimeout\";\n            public const string NetworkDiscoveryMaxNetworkProbesKey =\n                \"AioNetworkDiscoveryMaxNetworkProbes\";\n            public const string NetworkDiscoveryPortRangesToScanKey =\n                \"AioNetworkDiscoveryPortRangesToScan\";\n            public const string NetworkDiscoveryPortProbeTimeoutKey =\n                \"AioNetworkDiscoveryPortProbeTimeout\";\n            public const string NetworkDiscoveryMaxPortProbesKey =\n                \"AioNetworkDiscoveryMaxPortProbes\";\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, PublisherOptions options)\n            {\n                if (!KubernetesClientConfiguration.IsInCluster())\n                {\n                    return;\n                }\n                var connectorId = GetStringOrDefault(ConnectorId);\n                if (string.IsNullOrEmpty(connectorId))\n                {\n                    return;\n                }\n\n                // Set default connector operations mode\n                options.IsAzureIoTOperationsConnector = true;\n                options.UseStandardsCompliantEncoding = true;\n                options.EnableCloudEvents = true;\n                options.DiagnosticsTarget = Models.PublisherDiagnosticTargetType.Events;\n                options.EnableRuntimeStateReporting = true;\n                options.AllowedEventAndDiagnosticsTransports.Add(\n                    Models.WriterGroupTransport.AioMqtt);\n                options.SchemaOptions = new SchemaOptions();\n                options.RuntimeStateRoutingInfo = \"status\";\n                options.PublisherId = connectorId;\n\n                options.AioDiscoveredDeviceEndpointType =\n                    GetStringOrDefault(DiscoveredDeviceEndpointTypeKey);\n                options.AioDiscoveredDeviceEndpointTypeVersion =\n                    GetStringOrDefault(DiscoveredDeviceEndpointTypeVersionKey);\n                var discoveryMode = GetStringOrDefault(NetworkDiscoveryModeKey);\n                if (Enum.TryParse<Models.DiscoveryMode>(discoveryMode, true, out var mode))\n                {\n                    options.AioNetworkDiscoveryMode = mode;\n                }\n                options.AioNetworkDiscoveryInterval =\n                    GetDurationOrNull(NetworkDiscoveryIntervalKey, TimeSpan.FromHours(12));\n                options.AioNetworkDiscovery.AddressRangesToScan =\n                    GetStringOrDefault(NetworkDiscoveryAddressRangesToScanKey);\n                options.AioNetworkDiscovery.NetworkProbeTimeout =\n                    GetDurationOrNull(NetworkDiscoveryNetworkProbeTimeoutKey);\n                options.AioNetworkDiscovery.MaxNetworkProbes =\n                    GetIntOrNull(NetworkDiscoveryMaxNetworkProbesKey);\n                options.AioNetworkDiscovery.PortRangesToScan =\n                    GetStringOrDefault(NetworkDiscoveryPortRangesToScanKey);\n                options.AioNetworkDiscovery.PortProbeTimeout =\n                    GetDurationOrNull(NetworkDiscoveryPortProbeTimeoutKey);\n                options.AioNetworkDiscovery.MaxPortProbes =\n                    GetIntOrNull(NetworkDiscoveryMaxPortProbesKey);\n                options.UseFileChangePolling =\n                    GetBoolOrNull(PublisherConfig.UseFileChangePollingKey);\n            }\n\n            /// <summary>\n            /// Create configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public Aio(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Configure event hub client\n        /// </summary>\n        internal sealed class EventHubs : ConfigureOptionBase<EventHubsClientOptions>\n        {\n            /// <summary>\n            /// Configuration\n            /// </summary>\n            public const string SchemaGroupNameKey = \"SchemaGroupName\";\n            public const string EventHubNamespaceConnectionString = \"EventHubNamespaceConnectionString\";\n\n            /// <inheritdoc/>\n            public override void Configure(string? name, EventHubsClientOptions options)\n            {\n                if (string.IsNullOrEmpty(options.ConnectionString))\n                {\n                    options.ConnectionString = GetStringOrDefault(EventHubNamespaceConnectionString);\n                }\n\n                var schemaGroupName = GetStringOrDefault(SchemaGroupNameKey);\n\n                if (!string.IsNullOrEmpty(schemaGroupName))\n                {\n                    options.SchemaRegistry = new SchemaRegistryOptions\n                    {\n                        FullyQualifiedNamespace = string.Empty, // TODO: Remove\n                        SchemaGroupName = schemaGroupName\n                    };\n                }\n            }\n\n            /// <summary>\n            /// Transport configuration\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            public EventHubs(IConfiguration configuration)\n                : base(configuration)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Parse connection string as dictionary\n        /// </summary>\n        /// <param name=\"valuePairString\"></param>\n        /// <param name=\"kvpDelimiter\"></param>\n        /// <param name=\"kvpSeparator\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        /// <exception cref=\"FormatException\"></exception>\n        private static Dictionary<string, string> ToDictionary(string valuePairString,\n            char kvpDelimiter = ';', char kvpSeparator = '=')\n        {\n            if (string.IsNullOrWhiteSpace(valuePairString))\n            {\n                throw new ArgumentException(\"Malformed Token\");\n            }\n\n            valuePairString = valuePairString.Trim(';');\n\n            // This regex allows semi-colons to be part of the allowed characters\n            // for device names. Although new devices are not\n            // allowed to have semi-colons in the name, some legacy devices still\n            // have them and so this name validation cannot be changed.\n            var parts = new Regex($\"(?:^|{kvpDelimiter})([^{kvpDelimiter}{kvpSeparator}]*){kvpSeparator}\")\n                .Matches(valuePairString)\n                .Cast<Match>()\n                .Select(m => new string[] {\n                    m.Result(\"$1\"),\n                    valuePairString[\n                        (m.Index + m.Value.Length)..(m.NextMatch().Success ? m.NextMatch().Index : valuePairString.Length)]\n                })\n                .ToList();\n\n            if (parts.Count == 0 || parts.Any(p => p.Length != 2))\n            {\n                throw new FormatException(\"Malformed Token\");\n            }\n            return parts.ToDictionary(kvp => kvp[0], (kvp) => kvp[1], StringComparer.OrdinalIgnoreCase);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Runtime/Security.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Runtime\n{\n    using Microsoft.AspNetCore.Authentication;\n    using Microsoft.AspNetCore.Http;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Net.Http.Headers;\n    using System.Security.Claims;\n    using System.Text.Encodings.Web;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Security configuration\n    /// </summary>\n    internal static class Security\n    {\n        /// <summary>\n        /// Api key scheme\n        /// </summary>\n        public const string ApiKeyScheme = \"ApiKey\";\n\n        /// <summary>\n        /// Use api key handler\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        /// <returns></returns>\n        public static AuthenticationBuilder UsingConfiguredApiKey(this AuthenticationBuilder builder)\n        {\n            builder.Services.AddHttpContextAccessor();\n            builder.Services.AddAuthentication(ApiKeyScheme)\n                .AddScheme<AuthenticationSchemeOptions, ApiKeyHandler>(ApiKeyScheme, null);\n            return builder;\n        }\n\n        /// <summary>\n        /// Api key authentication handler\n        /// </summary>\n        internal sealed class ApiKeyHandler : AuthenticationHandler<AuthenticationSchemeOptions>\n        {\n            /// <summary>\n            /// Create authentication handler\n            /// </summary>\n            /// <param name=\"options\"></param>\n            /// <param name=\"logger\"></param>\n            /// <param name=\"encoder\"></param>\n            /// <param name=\"context\"></param>\n            /// <param name=\"apiKeyProvider\"></param>\n            public ApiKeyHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,\n                ILoggerFactory logger, UrlEncoder encoder, IHttpContextAccessor context,\n                IApiKeyProvider apiKeyProvider) :\n                base(options, logger, encoder)\n            {\n                _context = context;\n                _apiKeyProvider = apiKeyProvider;\n            }\n\n            /// <inheritdoc/>\n            protected override Task<AuthenticateResult> HandleAuthenticateAsync()\n            {\n                var httpContext = _context.HttpContext;\n                if (httpContext == null)\n                {\n                    return Task.FromResult(AuthenticateResult.Fail(\n                        \"No request.\"));\n                }\n\n                var authorization = httpContext.Request.Headers.Authorization;\n                if (authorization.Count == 0 || string.IsNullOrEmpty(authorization[0]))\n                {\n                    return Task.FromResult(AuthenticateResult.Fail(\n                        \"Missing Authorization header.\"));\n                }\n                try\n                {\n                    var header = AuthenticationHeaderValue.Parse(authorization[0]!);\n                    if (header.Scheme != ApiKeyScheme)\n                    {\n                        return Task.FromResult(AuthenticateResult.NoResult());\n                    }\n\n                    if (_apiKeyProvider.ApiKey != header.Parameter?.Trim())\n                    {\n                        throw new UnauthorizedAccessException();\n                    }\n\n                    var claims = new[]\n                    {\n                        new Claim(ClaimTypes.NameIdentifier, ApiKeyScheme)\n                    };\n\n                    var identity = new ClaimsIdentity(claims, Scheme.Name);\n                    var principal = new ClaimsPrincipal(identity);\n                    var ticket = new AuthenticationTicket(principal, Scheme.Name);\n                    return Task.FromResult(AuthenticateResult.Success(ticket));\n                }\n                catch (Exception ex)\n                {\n                    return Task.FromResult(AuthenticateResult.Fail(ex));\n                }\n            }\n\n            private readonly IHttpContextAccessor _context;\n            private readonly IApiKeyProvider _apiKeyProvider;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Runtime/Syslog.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Runtime\n{\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Logging.Abstractions;\n    using Microsoft.Extensions.Logging.Console;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Globalization;\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// Logging formatter compatible with syslogs format.\n    /// </summary>\n    public sealed class Syslog : ConsoleFormatter, IDisposable\n    {\n        /// <summary>\n        /// The default timestamp format for all IoT compatible logging events..\n        /// </summary>\n        public const string DefaultTimestampFormat = \"yyyy-MM-ddTHH:mm:ss.fffZ \";\n\n        /// <summary>\n        /// Name of the formatter\n        /// </summary>\n        public const string FormatterName = \"syslog\";\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"Syslog\"/> class.\n        /// </summary>\n        /// <param name=\"options\"></param>\n        public Syslog(IOptionsMonitor<ConsoleFormatterOptions> options)\n            : base(FormatterName)\n        {\n            _optionsReloadToken = options.OnChange(opt =>\n            {\n                _options = opt;\n                _includeScopes = opt.IncludeScopes;\n            });\n            _options = options.CurrentValue;\n            _serviceId = \"opcpublisher@311\";\n            _timestampFormat = DefaultTimestampFormat;\n            _includeScopes = _options.IncludeScopes;\n        }\n\n        /// <inheritdoc/>\n        public override void Write<TState>(in LogEntry<TState> logEntry,\n            IExternalScopeProvider? scopeProvider, TextWriter textWriter)\n        {\n            var message = logEntry.Formatter?.Invoke(logEntry.State, logEntry.Exception);\n            if (message is null)\n            {\n                return;\n            }\n            var messageBuilder = new StringBuilder(kInitialLength)\n                .Append(kSyslogMap[(int)logEntry.LogLevel])\n                .Append(DateTimeOffset.UtcNow.ToString(_timestampFormat, CultureInfo.InvariantCulture));\n            if (_includeScopes && scopeProvider != null && !string.IsNullOrEmpty(_serviceId))\n            {\n                messageBuilder.Append('[').Append(_serviceId);\n                scopeProvider.ForEachScope((scope, state) =>\n                    state.Append(' ').Append(scope), messageBuilder);\n                messageBuilder.Append(\"] \");\n            }\n            messageBuilder.Append(\"- \").AppendLine(message);\n            if (logEntry.Exception != null)\n            {\n                // TODO: syslog format does not support stack traces\n                messageBuilder.AppendLine(logEntry.Exception.ToString());\n            }\n            textWriter.Write(messageBuilder.ToString());\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _optionsReloadToken?.Dispose();\n        }\n\n        private const int kInitialLength = 256;\n\n        /// <summary>\n        /// Map of <see cref=\"LogLevel\"/> to syslog severity.\n        /// </summary>\n        private static readonly string[] kSyslogMap =\n        [\n            /* Trace */ \"<7>\",\n            /* Debug */ \"<7>\",\n            /* Info  */ \"<6>\",\n            /* Warn */  \"<4>\",\n            /* Error */ \"<3>\",\n            /* Crit  */ \"<3>\"\n        ];\n\n        private readonly IDisposable? _optionsReloadToken;\n        private readonly string _timestampFormat;\n        private readonly string _serviceId;\n        private bool _includeScopes;\n        private ConsoleFormatterOptions _options;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/src/Startup.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Runtime;\n    using Autofac;\n    using Autofac.Extensions.DependencyInjection;\n    using Microsoft.AspNetCore.Builder;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Hosting;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Logging.Console;\n    using OpenTelemetry.Logs;\n    using OpenTelemetry.Metrics;\n    using OpenTelemetry.Resources;\n    using OpenTelemetry.Trace;\n    using System;\n\n    /// <summary>\n    /// Webservice startup\n    /// </summary>\n    public class Startup\n    {\n        /// <summary>\n        /// Configuration\n        /// </summary>\n        public IConfigurationRoot Configuration { get; }\n\n        /// <summary>\n        /// Create startup\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        public Startup(IConfiguration configuration)\n        {\n            Configuration = new ConfigurationBuilder()\n                .AddConfiguration(configuration)\n                .AddFromDotEnvFile()\n                .AddEnvironmentVariables()\n                .Build();\n\n            // Set polling mode on file watcher if configured\n            if (Configuration.GetValue<string>(PublisherConfig.UseFileChangePollingKey)?\n                .Equals(\"True\", StringComparison.OrdinalIgnoreCase) ?? false)\n            {\n                Environment.SetEnvironmentVariable(\"DOTNET_USE_POLLING_FILE_WATCHER\", \"1\");\n            }\n        }\n\n        /// <summary>\n        /// Configure services\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <returns></returns>\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddLogging(options => options\n                .AddDebug()\n                .AddConsole()\n                .AddConsoleFormatter<Syslog, ConsoleFormatterOptions>()\n                .AddOpenTelemetry(Configuration, options =>\n                {\n                    options.IncludeScopes = true;\n                    options.ParseStateValues = true;\n                    options.IncludeFormattedMessage = true;\n                    options.SetResourceBuilder(ResourceBuilder.CreateDefault()\n                        .AddTelemetrySdk()\n                        .AddService(Constants.EntityTypePublisher,\n                            default, GetType().Assembly.GetReleaseVersion().ToString()));\n                }))\n                ;\n\n            services.AddHttpClient();\n            services.AddResourceMonitoring(Configuration);\n            services.AddExceptionSummarizer(builder =>\n            {\n                builder.AddDefaultProviders();\n                // TODO: Add opc ua exceptions\n            });\n\n            services.AddRouting();\n            services.AddHealthChecks();\n            services.AddMemoryCache();\n            services.AddResponseCompression(options => options.EnableForHttps = true);\n\n            services.AddAuthorization();\n            services.AddAuthentication()\n                .UsingConfiguredApiKey()\n                ;\n\n            services.AddOpenTelemetry()\n                .ConfigureResource(r => r\n                    .AddService(Constants.EntityTypePublisher,\n                        default, GetType().Assembly.GetReleaseVersion().ToString()))\n                .WithTracing(Configuration, builder => builder\n                    .SetSampler(new AlwaysOnSampler())\n                    .AddHttpClientInstrumentation()\n                    .AddAspNetCoreInstrumentation())\n                .WithMetrics(Configuration, builder => builder\n                    .AddMeter(Diagnostics.Meter.Name))\n                ;\n\n            services.AddControllers()\n                .AddJsonSerializer()\n                .AddMessagePackSerializer()\n                ;\n\n            services.AddOpenApi();\n        }\n\n        /// <summary>\n        /// This method is called by the runtime, after the ConfigureServices\n        /// method above and used to add middleware\n        /// </summary>\n        /// <param name=\"app\"></param>\n        /// <param name=\"appLifetime\"></param>\n#pragma warning disable CA1822 // Mark members as static\n        public void Configure(IApplicationBuilder app, IHostApplicationLifetime appLifetime)\n#pragma warning restore CA1822 // Mark members as static\n        {\n            app.UseRouting();\n\n            // app.UseHsts();\n            // app.UseHttpsRedirection();\n            app.UseResponseCompression();\n\n            app.UseAuthentication();\n            app.UseAuthorization();\n            app.UseOpenApi();\n            app.UseOpenTelemetryPrometheusEndpoint();\n\n            app.UseEndpoints(endpoints =>\n            {\n                endpoints.MapControllers();\n                endpoints.MapHealthChecks(\"/healthz\");\n            });\n\n            var applicationContainer = app.ApplicationServices.GetAutofacRoot();\n            appLifetime.ApplicationStopped.Register(applicationContainer.Dispose);\n        }\n\n        /// <summary>\n        /// Autofac configuration.\n        /// </summary>\n        /// <param name=\"builder\"></param>\n        public virtual void ConfigureContainer(ContainerBuilder builder)\n        {\n            // Register publisher services and transports\n            builder.AddPublisherServices();\n\n            //\n            // Order is important here because we want\n            // to fall back in the reverse order for\n            // sending operational and discovery events!\n            //\n            builder.AddMemoryKeyValueStore();\n            builder.AddDaprStateStoreClient(Configuration);\n            builder.AddNullEventClient();\n            builder.AddFileSystemEventClient(Configuration);\n            builder.AddFileSystemRpcServer(Configuration);\n            builder.AddHttpEventClient(Configuration);\n            builder.AddDaprPubSubClient(Configuration);\n            builder.AddEventHubsClient(Configuration);\n            builder.AddMqttClient(Configuration);\n            builder.AddIoTEdgeServices(Configuration);\n            builder.AddIoTOperationsServices(Configuration);\n\n            // Register configuration interfaces\n            builder.RegisterInstance(Configuration)\n                .AsImplementedInterfaces();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Azure.IIoT.OpcUa.Publisher.Module.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <ParallelAlgorithm>aggressive</ParallelAlgorithm>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Json.More.Net\" Version=\"2.1.3\" />\n    <PackageReference Include=\"FluentAssertions\" Version=\"[7.2.0]\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.Mvc.Testing\" Version=\"9.0.9\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.0\" />\n    <PackageReference Include=\"Moq\" Version=\"[4.20.2]\" />\n    <PackageReference Include=\"Neovolve.Logging.Xunit\" Version=\"6.3.0\" />\n    <PackageReference Include=\"xunit\" Version=\"2.9.3\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"3.1.5\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"Xunit.SkippableFact\" Version=\"1.5.23\" />\n    <PackageReference Include=\"coverlet.msbuild\" Version=\"6.0.4\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\Azure.IIoT.OpcUa.Publisher.Module.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa.Publisher.Sdk\\src\\Azure.IIoT.OpcUa.Publisher.Sdk.csproj\" />\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa.Publisher.Testing\\tests\\Azure.IIoT.OpcUa.Publisher.Testing.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Resources\\*.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Service Include=\"{82a7f48d-3b50-4b1e-b82e-3ada8210c358}\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Clients/Adapters/DiscoveryApiAdapter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n#nullable enable\nnamespace Azure.IIoT.OpcUa.Publisher.Service.Clients.Adapters\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implements discovery services as adapter on top of discovery api.\n    /// </summary>\n    public sealed class DiscoveryApiAdapter : INetworkDiscovery, IServerDiscovery\n    {\n        /// <summary>\n        /// Create adapter\n        /// </summary>\n        /// <param name=\"client\"></param>\n        public DiscoveryApiAdapter(IDiscoveryApi client)\n        {\n            _client = client ?? throw new ArgumentNullException(nameof(client));\n        }\n\n        /// <inheritdoc/>\n        public async Task RegisterAsync(ServerRegistrationRequestModel request,\n            CancellationToken ct = default)\n        {\n            await _client.RegisterAsync(request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task DiscoverAsync(DiscoveryRequestModel request,\n            CancellationToken ct = default)\n        {\n            await _client.DiscoverAsync(request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task CancelAsync(DiscoveryCancelRequestModel request,\n            CancellationToken ct = default)\n        {\n            await _client.CancelAsync(request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ApplicationRegistrationModel> FindServerAsync(\n            ServerEndpointQueryModel query,\n            CancellationToken ct = default)\n        {\n            return await _client.FindServerAsync(query, ct).ConfigureAwait(false);\n        }\n\n        private readonly IDiscoveryApi _client;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Clients/Adapters/HistoryApiAdapter.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n#nullable enable\nnamespace Azure.IIoT.OpcUa.Publisher.Service.Clients.Adapters\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Adapts historian services to historic access services\n    /// </summary>\n    public sealed class HistoryApiAdapter : IHistoryServices<ConnectionModel>\n    {\n        /// <summary>\n        /// Create service\n        /// </summary>\n        /// <param name=\"client\"></param>\n        public HistoryApiAdapter(IHistoryApi client)\n        {\n            _client = client ?? throw new ArgumentNullException(nameof(client));\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryDeleteEventsAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<DeleteEventsDetailsModel> request, CancellationToken ct)\n        {\n            return _client.HistoryDeleteEventsAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryDeleteValuesAtTimesAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryDeleteValuesAtTimesAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryDeleteModifiedValuesAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryDeleteModifiedValuesAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryDeleteValuesAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryDeleteValuesAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryReplaceEventsAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryReplaceEventsAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryReplaceValuesAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryReplaceValuesAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryInsertEventsAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryInsertEventsAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryInsertValuesAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryInsertValuesAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryUpsertEventsAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryUpsertEventsAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public Task<HistoryUpdateResponseModel> HistoryUpsertValuesAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return _client.HistoryUpsertValuesAsync(endpoint, request, ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricEventModel[]>> HistoryReadEventsAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadEventsDetailsModel> request,\n            CancellationToken ct)\n        {\n            return await _client.HistoryReadEventsAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<HistoricEventModel[]>> HistoryReadEventsNextAsync(\n            ConnectionModel endpoint, HistoryReadNextRequestModel request, CancellationToken ct)\n        {\n            return await _client.HistoryReadEventsNextAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return await _client.HistoryReadValuesAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAtTimesAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return await _client.HistoryReadValuesAtTimesAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadProcessedValuesAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return await _client.HistoryReadProcessedValuesAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadModifiedValuesAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            return await _client.HistoryReadModifiedValuesAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<HistoricValueModel[]>> HistoryReadValuesNextAsync(\n            ConnectionModel endpoint, HistoryReadNextRequestModel request, CancellationToken ct)\n        {\n            return await _client.HistoryReadValuesNextAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadValuesDetailsModel> request, CancellationToken ct)\n        {\n            // TODO:\n            throw new NotImplementedException();\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamModifiedValuesAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request, CancellationToken ct)\n        {\n            // TODO:\n            throw new NotImplementedException();\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAtTimesAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request, CancellationToken ct)\n        {\n            // TODO:\n            throw new NotImplementedException();\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamProcessedValuesAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request, CancellationToken ct)\n        {\n            // TODO:\n            throw new NotImplementedException();\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<HistoricEventModel> HistoryStreamEventsAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadEventsDetailsModel> request, CancellationToken ct)\n        {\n            // TODO:\n            throw new NotImplementedException();\n        }\n\n        private readonly IHistoryApi _client;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Clients/Adapters/PublisherApiAdapter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n#nullable enable\nnamespace Azure.IIoT.OpcUa.Publisher.Service.Clients.Adapters\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implements node services as adapter on top of twin api.\n    /// </summary>\n    public sealed class PublisherApiAdapter : ICertificateServices<EndpointModel>\n    {\n        /// <summary>\n        /// Create adapter\n        /// </summary>\n        /// <param name=\"client\"></param>\n        public PublisherApiAdapter(IDiscoveryApi client)\n        {\n            _client = client ?? throw new ArgumentNullException(nameof(client));\n        }\n\n        /// <inheritdoc/>\n        public async Task<X509CertificateChainModel> GetEndpointCertificateAsync(\n            EndpointModel endpoint, CancellationToken ct)\n        {\n            return await _client.GetEndpointCertificateAsync(endpoint, ct).ConfigureAwait(false);\n        }\n\n        private readonly IDiscoveryApi _client;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Clients/Adapters/TwinApiAdapter.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n#nullable enable\nnamespace Azure.IIoT.OpcUa.Publisher.Service.Clients.Adapters\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implements node services as adapter on top of twin api.\n    /// </summary>\n    public sealed class TwinApiAdapter : INodeServices<ConnectionModel>\n    {\n        /// <summary>\n        /// Create adapter\n        /// </summary>\n        /// <param name=\"client\"></param>\n        public TwinApiAdapter(ITwinApi client)\n        {\n            _client = client ?? throw new ArgumentNullException(nameof(client));\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowseFirstResponseModel> BrowseFirstAsync(ConnectionModel endpoint,\n            BrowseFirstRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeBrowseFirstAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowseNextResponseModel> BrowseNextAsync(ConnectionModel endpoint,\n            BrowseNextRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeBrowseNextAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<BrowseStreamChunkModel> BrowseAsync(ConnectionModel endpoint,\n            BrowseStreamRequestModel request, CancellationToken ct = default)\n        {\n            // TODO\n            throw new NotSupportedException(\"Browse stream is not supported\");\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowsePathResponseModel> BrowsePathAsync(ConnectionModel endpoint,\n            BrowsePathRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeBrowsePathAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ValueReadResponseModel> ValueReadAsync(ConnectionModel endpoint,\n            ValueReadRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeValueReadAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ValueWriteResponseModel> ValueWriteAsync(ConnectionModel endpoint,\n            ValueWriteRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeValueWriteAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<MethodMetadataResponseModel> GetMethodMetadataAsync(ConnectionModel endpoint,\n            MethodMetadataRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeMethodGetMetadataAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<MethodCallResponseModel> MethodCallAsync(ConnectionModel endpoint,\n            MethodCallRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeMethodCallAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ReadResponseModel> ReadAsync(ConnectionModel endpoint,\n            ReadRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeReadAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<WriteResponseModel> WriteAsync(ConnectionModel endpoint,\n            WriteRequestModel request, CancellationToken ct)\n        {\n            return await _client.NodeWriteAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServerCapabilitiesModel> GetServerCapabilitiesAsync(ConnectionModel endpoint,\n            RequestHeaderModel? header, CancellationToken ct)\n        {\n            return await _client.GetServerCapabilitiesAsync(endpoint, header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<NodeMetadataResponseModel> GetMetadataAsync(ConnectionModel endpoint,\n            NodeMetadataRequestModel request, CancellationToken ct)\n        {\n            return await _client.GetMetadataAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<QueryCompilationResponseModel> CompileQueryAsync(ConnectionModel endpoint,\n            QueryCompilationRequestModel request, CancellationToken ct)\n        {\n            return await _client.CompileQueryAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryServerCapabilitiesModel> HistoryGetServerCapabilitiesAsync(\n            ConnectionModel endpoint, RequestHeaderModel? header, CancellationToken ct)\n        {\n            return await _client.HistoryGetServerCapabilitiesAsync(endpoint, header, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryConfigurationResponseModel> HistoryGetConfigurationAsync(\n            ConnectionModel endpoint, HistoryConfigurationRequestModel request, CancellationToken ct)\n        {\n            return await _client.HistoryGetConfigurationAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<VariantValue>> HistoryReadAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<VariantValue> request,\n            CancellationToken ct)\n        {\n            return await _client.HistoryReadAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<VariantValue>> HistoryReadNextAsync(\n            ConnectionModel endpoint, HistoryReadNextRequestModel request,\n            CancellationToken ct)\n        {\n            return await _client.HistoryReadNextAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryUpdateAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<VariantValue> request,\n            CancellationToken ct)\n        {\n            return await _client.HistoryUpdateAsync(endpoint, request, ct).ConfigureAwait(false);\n        }\n\n        private readonly ITwinApi _client;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Clients/ConfigurationServicesRestClient.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Clients\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Net.Http;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implementation of file system services over http\n    /// </summary>\n    public sealed class ConfigurationServicesRestClient : IConfigurationServices,\n        IAssetConfiguration<Stream>, IAssetConfiguration<byte[]>,\n        IAssetConfiguration<VariantValue>\n    {\n        /// <summary>\n        /// Create service client\n        /// </summary>\n        /// <param name=\"httpClient\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"serializer\"></param>\n        public ConfigurationServicesRestClient(IHttpClientFactory httpClient,\n            IOptions<SdkOptions> options, ISerializer serializer) :\n            this(httpClient, options?.Value.Target, serializer)\n        {\n        }\n\n        /// <summary>\n        /// Create service client\n        /// </summary>\n        /// <param name=\"httpClient\"></param>\n        /// <param name=\"serviceUri\"></param>\n        /// <param name=\"serializer\"></param>\n        public ConfigurationServicesRestClient(IHttpClientFactory httpClient, string serviceUri,\n            ISerializer serializer = null)\n        {\n            if (string.IsNullOrWhiteSpace(serviceUri))\n            {\n                throw new ArgumentNullException(nameof(serviceUri),\n                    \"Please configure the Url of the endpoint micro service.\");\n            }\n            _serviceUri = serviceUri.TrimEnd('/');\n            _serializer = serializer ?? new NewtonsoftJsonSerializer();\n            _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> ExpandAsync(\n            PublishedNodesEntryModel entry, PublishedNodeExpansionModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(entry);\n            var uri = new Uri($\"{_serviceUri}/v2/writer/expand\");\n            return _httpClient.PostStreamAsync<ServiceResponse<PublishedNodesEntryModel>>(uri,\n                RequestBody(entry, request), _serializer, ct: ct);\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAsync(\n            PublishedNodesEntryModel entry, PublishedNodeExpansionModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(entry);\n            var uri = new Uri($\"{_serviceUri}/v2/writer\");\n            return _httpClient.PostStreamAsync<ServiceResponse<PublishedNodesEntryModel>>(uri,\n                RequestBody(entry, request), _serializer, ct: ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAssetAsync(\n            PublishedNodeCreateAssetRequestModel<Stream> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetName);\n            ArgumentNullException.ThrowIfNull(request.Configuration);\n            var uri = new Uri($\"{_serviceUri}/v2/writer/assets/create\");\n            var buffer = request.Configuration.ReadAsBuffer();\n            var requestWithBuffer = new PublishedNodeCreateAssetRequestModel<byte[]>\n            {\n                Entry = request.Entry,\n                Header = request.Header,\n                WaitTime = request.WaitTime,\n                Configuration = [.. buffer]\n            };\n            return await _httpClient.PostAsync<ServiceResponse<PublishedNodesEntryModel>>(uri,\n                requestWithBuffer, _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        public async Task<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAssetAsync(\n            PublishedNodeCreateAssetRequestModel<VariantValue> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetName);\n            var uri = new Uri($\"{_serviceUri}/v2/writer/assets\");\n            return await _httpClient.PostAsync<ServiceResponse<PublishedNodesEntryModel>>(uri,\n                request, _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<PublishedNodesEntryModel>> CreateOrUpdateAssetAsync(\n            PublishedNodeCreateAssetRequestModel<byte[]> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetName);\n            ArgumentNullException.ThrowIfNull(request.Configuration);\n            var uri = new Uri($\"{_serviceUri}/v2/writer/assets/create\");\n            return await _httpClient.PostAsync<ServiceResponse<PublishedNodesEntryModel>>(uri,\n                request, _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<ServiceResponse<PublishedNodesEntryModel>> GetAllAssetsAsync(\n            PublishedNodesEntryModel entry, RequestHeaderModel header, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(entry);\n            var uri = new Uri($\"{_serviceUri}/v2/writer/assets/list\");\n            return _httpClient.PostStreamAsync<ServiceResponse<PublishedNodesEntryModel>>(uri,\n                RequestBody(entry, header), _serializer, ct: ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResultModel> DeleteAssetAsync(\n            PublishedNodeDeleteAssetRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            ArgumentNullException.ThrowIfNull(request.Entry);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(request.Entry.DataSetWriterId);\n            var uri = new Uri($\"{_serviceUri}/v2/writer/assets/delete\");\n            return await _httpClient.PostAsync<ServiceResultModel>(uri,\n                request, _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Create envelope\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"request\"></param>\n        /// <returns></returns>\n        private static PublishedNodesEntryRequestModel<T> RequestBody<T>(PublishedNodesEntryModel entry,\n            T request)\n        {\n            return new PublishedNodesEntryRequestModel<T> { Entry = entry, Request = request };\n        }\n\n        private readonly IHttpClientFactory _httpClient;\n        private readonly ISerializer _serializer;\n        private readonly string _serviceUri;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Clients/FileSystemServicesRestClient.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Clients\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.IO.Pipelines;\n    using System.Linq;\n    using System.Net.Http;\n    using System.Net.Http.Headers;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implementation of file system services over http\n    /// </summary>\n    public sealed class FileSystemServicesRestClient : IFileSystemServices<ConnectionModel>\n    {\n        /// <summary>\n        /// Create service client\n        /// </summary>\n        /// <param name=\"httpClient\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"serializer\"></param>\n        public FileSystemServicesRestClient(IHttpClientFactory httpClient,\n            IOptions<SdkOptions> options, ISerializer serializer) :\n            this(httpClient, options?.Value.Target, serializer)\n        {\n        }\n\n        /// <summary>\n        /// Create service client\n        /// </summary>\n        /// <param name=\"httpClient\"></param>\n        /// <param name=\"serviceUri\"></param>\n        /// <param name=\"serializer\"></param>\n        public FileSystemServicesRestClient(IHttpClientFactory httpClient, string serviceUri,\n            ISerializer serializer = null)\n        {\n            if (string.IsNullOrWhiteSpace(serviceUri))\n            {\n                throw new ArgumentNullException(nameof(serviceUri),\n                    \"Please configure the Url of the endpoint micro service.\");\n            }\n            _serviceUri = serviceUri.TrimEnd('/');\n            _serializer = serializer ?? new NewtonsoftJsonSerializer();\n            _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<ServiceResponse<FileSystemObjectModel>> GetFileSystemsAsync(\n            ConnectionModel endpoint, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            var uri = new Uri($\"{_serviceUri}/v2/filesystem/list\");\n            return _httpClient.PostStreamAsync<ServiceResponse<FileSystemObjectModel>>(uri,\n                endpoint, _serializer, ct: ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<IEnumerable<FileSystemObjectModel>>> GetDirectoriesAsync(\n            ConnectionModel endpoint, FileSystemObjectModel fileSystemOrDirectory, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(fileSystemOrDirectory);\n            var uri = new Uri($\"{_serviceUri}/v2/filesystem/list/directories\");\n            return await _httpClient.PostAsync<ServiceResponse<IEnumerable<FileSystemObjectModel>>>(uri,\n                RequestBody(endpoint, fileSystemOrDirectory), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<IEnumerable<FileSystemObjectModel>>> GetFilesAsync(\n            ConnectionModel endpoint, FileSystemObjectModel fileSystemOrDirectory, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(fileSystemOrDirectory);\n            var uri = new Uri($\"{_serviceUri}/v2/filesystem/list/files\");\n            return await _httpClient.PostAsync<ServiceResponse<IEnumerable<FileSystemObjectModel>>>(uri,\n                RequestBody(endpoint, fileSystemOrDirectory), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<FileSystemObjectModel>> GetParentAsync(ConnectionModel endpoint,\n            FileSystemObjectModel fileOrDirectoryObject, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(fileOrDirectoryObject);\n            var uri = new Uri($\"{_serviceUri}/v2/filesystem/parent\");\n            return await _httpClient.PostAsync<ServiceResponse<FileSystemObjectModel>>(uri,\n                RequestBody(endpoint, fileOrDirectoryObject), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<FileInfoModel>> GetFileInfoAsync(ConnectionModel endpoint,\n            FileSystemObjectModel file, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(file);\n            var uri = new Uri($\"{_serviceUri}/v2/filesystem/info/file\");\n            return await _httpClient.PostAsync<ServiceResponse<FileInfoModel>>(uri,\n                RequestBody(endpoint, file), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<Stream>> OpenReadAsync(ConnectionModel endpoint,\n            FileSystemObjectModel file, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(file);\n            return await DownloadStream.CreateAsync(this, endpoint, file, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public Task<ServiceResponse<Stream>> OpenWriteAsync(ConnectionModel endpoint,\n            FileSystemObjectModel file, FileOpenWriteOptionsModel options, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(file);\n\n            return Task.FromResult(UploadStream.Create(this, endpoint, file, options, ct));\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<FileSystemObjectModel>> CreateDirectoryAsync(ConnectionModel endpoint,\n            FileSystemObjectModel fileSystemOrDirectory, string name, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(fileSystemOrDirectory);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(name);\n            var uri = new Uri($\"{_serviceUri}/v2/filesystem/create/directory/{name.UrlEncode()}\");\n            return await _httpClient.PostAsync<ServiceResponse<FileSystemObjectModel>>(uri,\n                RequestBody(endpoint, fileSystemOrDirectory), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResponse<FileSystemObjectModel>> CreateFileAsync(ConnectionModel endpoint,\n            FileSystemObjectModel fileSystemOrDirectory, string name, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(fileSystemOrDirectory);\n            ArgumentNullException.ThrowIfNullOrWhiteSpace(name);\n            var uri = new Uri($\"{_serviceUri}/v2/filesystem/create/file/{name.UrlEncode()}\");\n            return await _httpClient.PostAsync<ServiceResponse<FileSystemObjectModel>>(uri,\n                RequestBody(endpoint, fileSystemOrDirectory), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServiceResultModel> DeleteFileSystemObjectAsync(ConnectionModel endpoint,\n            FileSystemObjectModel fileOrDirectoryObject, FileSystemObjectModel parentFileSystemOrDirectory,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(fileOrDirectoryObject);\n            if (parentFileSystemOrDirectory == null)\n            {\n                var uri = new Uri($\"{_serviceUri}/v2/filesystem/delete\");\n                return await _httpClient.PostAsync<ServiceResultModel>(uri,\n                    RequestBody(endpoint, fileOrDirectoryObject), _serializer, ct: ct).ConfigureAwait(false);\n            }\n            else\n            {\n                if (fileOrDirectoryObject.BrowsePath?.Count > 0)\n                {\n                    throw new NotSupportedException(\"Not yet supported\");\n                }\n                var uri = new Uri($\"{_serviceUri}/v2/filesystem/delete/{fileOrDirectoryObject.NodeId.UrlEncode()}\");\n                return await _httpClient.PostAsync<ServiceResultModel>(uri,\n                    RequestBody(endpoint, parentFileSystemOrDirectory), _serializer, ct: ct).ConfigureAwait(false);\n            }\n        }\n\n        /// <summary>\n        /// Create envelope\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <returns></returns>\n        private static RequestEnvelope<T> RequestBody<T>(ConnectionModel connection, T request)\n        {\n            return new RequestEnvelope<T> { Connection = connection, Request = request };\n        }\n\n        /// <summary>\n        /// File stream wraps a body of a response\n        /// </summary>\n        internal sealed class DownloadStream : Stream\n        {\n            /// <inheritdoc/>\n            public override bool CanRead => _body.CanRead;\n            /// <inheritdoc/>\n            public override bool CanSeek => _body.CanSeek;\n            /// <inheritdoc/>\n            public override bool CanWrite => _body.CanWrite;\n            /// <inheritdoc/>\n            public override long Length => _body.Length;\n            /// <inheritdoc/>\n            public override long Position\n            {\n                get => _body.Position;\n                set => _body.Position = value;\n            }\n\n            /// <summary>\n            /// Create download stream\n            /// </summary>\n            /// <param name=\"httpClient\"></param>\n            /// <param name=\"request\"></param>\n            /// <param name=\"body\"></param>\n            private DownloadStream(HttpClient httpClient, HttpRequestMessage request, Stream body)\n            {\n                _httpClient = httpClient;\n                _request = request;\n                _body = body;\n            }\n\n            /// <inheritdoc/>\n            public static async Task<ServiceResponse<Stream>> CreateAsync(FileSystemServicesRestClient outer,\n                ConnectionModel endpoint, FileSystemObjectModel file, CancellationToken ct)\n            {\n                var uri = new Uri($\"{outer._serviceUri}/v2/filesystem/download\");\n                var httpClient = outer._httpClient.CreateClient();\n                httpClient.Timeout = TimeSpan.FromMinutes(2);\n\n                var _serializer = new NewtonsoftJsonSerializer();\n                using var request = new HttpRequestMessage(HttpMethod.Get, uri);\n                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(\"application/octet-stream\"));\n                request.Headers.Add(\"x-ms-target\", _serializer.SerializeObjectToString(file));\n                request.Headers.Add(\"x-ms-connection\", _serializer.SerializeObjectToString(endpoint));\n                try\n                {\n                    var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead,\n                        ct).ConfigureAwait(false);\n                    var stream = await response.Content.ReadAsStreamAsync(ct);\n                    if (!response.IsSuccessStatusCode)\n                    {\n                        string errorInfo = null;\n                        if (response.Headers.TryGetValues(\"errorInfo\", out var header))\n                        {\n                            errorInfo = header.FirstOrDefault();\n                        }\n                        response.Dispose();\n                        if (errorInfo != null)\n                        {\n                            // Error response\n                            return new ServiceResponse<Stream>\n                            {\n                                ErrorInfo = _serializer.Deserialize<ServiceResultModel>(errorInfo)\n                            };\n                        }\n                        throw new HttpRequestException($\"Failed to download file: {response.StatusCode}\");\n                    }\n                    var client = httpClient;\n                    httpClient = null;\n                    return new ServiceResponse<Stream>\n                    {\n                        Result = new DownloadStream(client, request, stream)\n                    };\n                }\n                finally\n                {\n                    httpClient?.Dispose();\n                }\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                if (disposing)\n                {\n                    _body.Dispose();\n                    _request.Dispose();\n                    _httpClient.Dispose();\n                }\n                base.Dispose(disposing);\n            }\n\n            /// <inheritdoc/>\n            public override void Flush()\n            {\n                _body.Flush();\n            }\n\n            /// <inheritdoc/>\n            public override int Read(byte[] buffer, int offset, int count)\n            {\n                return _body.Read(buffer, offset, count);\n            }\n\n            /// <inheritdoc/>\n            public override long Seek(long offset, SeekOrigin origin)\n            {\n                return _body.Seek(offset, origin);\n            }\n\n            /// <inheritdoc/>\n            public override void SetLength(long value)\n            {\n                _body.SetLength(value);\n            }\n\n            /// <inheritdoc/>\n            public override void Write(byte[] buffer, int offset, int count)\n            {\n                _body.Write(buffer, offset, count);\n            }\n\n            private readonly HttpClient _httpClient;\n            private readonly HttpRequestMessage _request;\n            private readonly Stream _body;\n        }\n\n        /// <summary>\n        /// Write stream wraps a request content body\n        /// </summary>\n        internal sealed class UploadStream : Stream\n        {\n            /// <inheritdoc/>\n            public override bool CanRead => false;\n            /// <inheritdoc/>\n            public override bool CanSeek => false;\n            /// <inheritdoc/>\n            public override bool CanWrite => true;\n            /// <inheritdoc/>\n            public override long Length => _length;\n            /// <inheritdoc/>\n            public override long Position { get; set; }\n\n            /// <summary>\n            /// Service response\n            /// </summary>\n            public ServiceResponse<Stream> Result { get; private set; }\n\n            /// <summary>\n            /// Create upload stream\n            /// </summary>\n            /// <param name=\"httpClient\"></param>\n            /// <param name=\"request\"></param>\n            /// <param name=\"serializer\"></param>\n            /// <param name=\"ct\"></param>\n            public UploadStream(HttpClient httpClient,\n                HttpRequestMessage request, IJsonSerializer serializer, CancellationToken ct)\n            {\n                _httpClient = httpClient;\n                _request = request;\n                _serializer = serializer;\n                _request.Content = new StreamContent(_pipe.Reader.AsStream(false));\n                _streaming = StartAsync(ct);\n            }\n\n            /// <inheritdoc/>\n            public static ServiceResponse<Stream> Create(FileSystemServicesRestClient outer,\n                ConnectionModel endpoint, FileSystemObjectModel file, FileOpenWriteOptionsModel options,\n                CancellationToken ct)\n            {\n                var uri = new Uri($\"{outer._serviceUri}/v2/filesystem/upload\");\n                var httpClient = outer._httpClient.CreateClient();\n                httpClient.Timeout = TimeSpan.FromMinutes(2);\n                var request = new HttpRequestMessage(HttpMethod.Post, uri);\n\n                var serializer = new NewtonsoftJsonSerializer();\n                request.Headers.Add(\"x-ms-target\", serializer.SerializeObjectToString(file));\n                request.Headers.Add(\"x-ms-connection\", serializer.SerializeObjectToString(endpoint));\n                request.Headers.Add(\"x-ms-options\", serializer.SerializeObjectToString(options));\n\n                var stream = new UploadStream(httpClient, request, serializer, ct);\n                return new ServiceResponse<Stream>\n                {\n                    Result = stream\n                };\n            }\n\n            /// <inheritdoc/>\n            public override void Flush()\n            {\n            }\n\n            /// <inheritdoc/>\n            public override long Seek(long offset, SeekOrigin origin)\n            {\n                throw new NotSupportedException();\n            }\n\n            /// <inheritdoc/>\n            public override void SetLength(long value)\n            {\n                throw new NotSupportedException();\n            }\n\n            /// <inheritdoc/>\n            public override int Read(byte[] buffer, int offset, int count)\n            {\n                throw new NotSupportedException();\n            }\n\n            /// <inheritdoc/>\n            public override void Write(byte[] buffer, int offset, int count)\n            {\n                _pipe.Writer.Write(buffer.AsSpan().Slice(offset, count));\n                _length += count;\n            }\n\n            /// <inheritdoc/>\n            public override async ValueTask DisposeAsync()\n            {\n                // Stream owner is done writing and disposes\n                if (_streaming != null)\n                {\n                    try\n                    {\n                        await _pipe.Writer.CompleteAsync().ConfigureAwait(false);\n\n                        // now wait until fully sent and result received\n                        await _streaming.ConfigureAwait(false);\n                        _streaming = null;\n                    }\n                    catch (OperationCanceledException) { } // Ct triggered\n                    finally\n                    {\n                        _request.Dispose();\n                        _httpClient.Dispose();\n                    }\n                }\n                await base.DisposeAsync();\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                if (disposing && _streaming != null)\n                {\n                    DisposeAsync().AsTask().GetAwaiter().GetResult();\n                }\n                base.Dispose(disposing);\n            }\n\n            /// <summary>\n            /// Start streaming\n            /// </summary>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            /// <exception cref=\"HttpRequestException\"></exception>\n            private async Task StartAsync(CancellationToken ct)\n            {\n                var response = await _httpClient.SendAsync(_request, ct).ConfigureAwait(false);\n\n                // Stream fully sent and response returned\n                if (!response.IsSuccessStatusCode)\n                {\n                    string errorInfo = null;\n                    if (response.Headers.TryGetValues(\"errorInfo\", out var header))\n                    {\n                        errorInfo = header.FirstOrDefault();\n                    }\n                    response.Dispose();\n                    if (errorInfo != null)\n                    {\n                        // Error response\n                        Result = new ServiceResponse<Stream>\n                        {\n                            ErrorInfo = _serializer.Deserialize<ServiceResultModel>(errorInfo)\n                        };\n                    }\n                    throw new HttpRequestException($\"Failed to upload file: {response.StatusCode}\");\n                }\n            }\n\n            private readonly HttpClient _httpClient;\n            private readonly HttpRequestMessage _request;\n            private readonly Pipe _pipe = new();\n            private readonly IJsonSerializer _serializer;\n            private int _length;\n            private Task _streaming;\n        }\n\n        private readonly IHttpClientFactory _httpClient;\n        private readonly ISerializer _serializer;\n        private readonly string _serviceUri;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Clients/HistoryServicesRestClient.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Clients\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Generic;\n    using System.Net.Http;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implementation of Historian services over http.\n    /// </summary>\n    public sealed class HistoryServicesRestClient : IHistoryServices<ConnectionModel>\n    {\n        /// <summary>\n        /// Create service client\n        /// </summary>\n        /// <param name=\"httpClient\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"serializer\"></param>\n        public HistoryServicesRestClient(IHttpClientFactory httpClient,\n            IOptions<SdkOptions> options, ISerializer serializer) :\n            this(httpClient, options?.Value.Target, serializer)\n        {\n        }\n\n        /// <summary>\n        /// Create service client\n        /// </summary>\n        /// <param name=\"httpClient\"></param>\n        /// <param name=\"serviceUri\"></param>\n        /// <param name=\"serializer\"></param>\n        public HistoryServicesRestClient(IHttpClientFactory httpClient, string serviceUri,\n            ISerializer serializer = null)\n        {\n            if (string.IsNullOrWhiteSpace(serviceUri))\n            {\n                throw new ArgumentNullException(nameof(serviceUri),\n                    \"Please configure the Url of the endpoint micro service.\");\n            }\n            _serializer = serializer ?? new NewtonsoftJsonSerializer();\n            _serviceUri = serviceUri.TrimEnd('/');\n            _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read/first\");\n            return await _httpClient.PostAsync<HistoryReadResponseModel<HistoricValueModel[]>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadModifiedValuesAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read/first/modified\");\n            return await _httpClient.PostAsync<HistoryReadResponseModel<HistoricValueModel[]>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAtTimesAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read/first/attimes\");\n            return await _httpClient.PostAsync<HistoryReadResponseModel<HistoricValueModel[]>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadProcessedValuesAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read/first/processed\");\n            return await _httpClient.PostAsync<HistoryReadResponseModel<HistoricValueModel[]>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<HistoricValueModel[]>> HistoryReadValuesNextAsync(\n            ConnectionModel endpoint, HistoryReadNextRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.ContinuationToken))\n            {\n                throw new ArgumentException(\"Continuation missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read/next\");\n            return await _httpClient.PostAsync<HistoryReadNextResponseModel<HistoricValueModel[]>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricEventModel[]>> HistoryReadEventsAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<ReadEventsDetailsModel> request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/events/read/first\");\n            return await _httpClient.PostAsync<HistoryReadResponseModel<HistoricEventModel[]>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<HistoricEventModel[]>> HistoryReadEventsNextAsync(\n            ConnectionModel endpoint, HistoryReadNextRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.ContinuationToken))\n            {\n                throw new ArgumentException(\"Continuation missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/history/events/read/next\");\n            return await _httpClient.PostAsync<HistoryReadNextResponseModel<HistoricEventModel[]>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryReplaceValuesAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/replace\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryReplaceEventsAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/events/replace\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryInsertValuesAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/insert\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryUpsertValuesAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/upsert\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryInsertEventsAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/events/insert\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryUpsertEventsAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/events/upsert\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteValuesAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<DeleteValuesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/delete\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteValuesAtTimesAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/delete/attimes\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteModifiedValuesAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<DeleteValuesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/delete/modified\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteEventsAsync(ConnectionModel endpoint,\n            HistoryUpdateRequestModel<DeleteEventsDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/events/delete\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadValuesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read\");\n            return _httpClient.PostStreamAsync<HistoricValueModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct);\n        }\n\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamModifiedValuesAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read/modified\");\n            return _httpClient.PostStreamAsync<HistoricValueModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct);\n        }\n\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamValuesAtTimesAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read/attimes\");\n            return _httpClient.PostStreamAsync<HistoricValueModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct);\n        }\n\n        public IAsyncEnumerable<HistoricValueModel> HistoryStreamProcessedValuesAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/values/read/processed\");\n            return _httpClient.PostStreamAsync<HistoricValueModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct);\n        }\n\n        public IAsyncEnumerable<HistoricEventModel> HistoryStreamEventsAsync(ConnectionModel endpoint,\n            HistoryReadRequestModel<ReadEventsDetailsModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/history/events/read\");\n            return _httpClient.PostStreamAsync<HistoricEventModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct);\n        }\n\n        /// <summary>\n        /// Create envelope\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <returns></returns>\n        private static RequestEnvelope<T> RequestBody<T>(ConnectionModel connection, T request)\n        {\n            return new RequestEnvelope<T> { Connection = connection, Request = request };\n        }\n\n        private readonly IHttpClientFactory _httpClient;\n        private readonly ISerializer _serializer;\n        private readonly string _serviceUri;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Clients/NodeServicesRestClient.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Clients\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Net.Http;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implementation of node services over http\n    /// </summary>\n    public sealed class NodeServicesRestClient : INodeServices<ConnectionModel>\n    {\n        /// <summary>\n        /// Create service client\n        /// </summary>\n        /// <param name=\"httpClient\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"serializer\"></param>\n        public NodeServicesRestClient(IHttpClientFactory httpClient,\n            IOptions<SdkOptions> options, ISerializer serializer) :\n            this(httpClient, options?.Value.Target, serializer)\n        {\n        }\n\n        /// <summary>\n        /// Create service client\n        /// </summary>\n        /// <param name=\"httpClient\"></param>\n        /// <param name=\"serviceUri\"></param>\n        /// <param name=\"serializer\"></param>\n        public NodeServicesRestClient(IHttpClientFactory httpClient, string serviceUri,\n            ISerializer serializer = null)\n        {\n            if (string.IsNullOrWhiteSpace(serviceUri))\n            {\n                throw new ArgumentNullException(nameof(serviceUri),\n                    \"Please configure the Url of the endpoint micro service.\");\n            }\n            _serviceUri = serviceUri.TrimEnd('/');\n            _serializer = serializer ?? new NewtonsoftJsonSerializer();\n            _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));\n        }\n\n        /// <inheritdoc/>\n        public IAsyncEnumerable<BrowseStreamChunkModel> BrowseAsync(ConnectionModel endpoint,\n            BrowseStreamRequestModel request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/browse\");\n            return _httpClient.PostStreamAsync<BrowseStreamChunkModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowseFirstResponseModel> BrowseFirstAsync(ConnectionModel endpoint,\n            BrowseFirstRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/browse/first\");\n            return await _httpClient.PostAsync<BrowseFirstResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowseNextResponseModel> BrowseNextAsync(ConnectionModel endpoint,\n            BrowseNextRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.ContinuationToken == null)\n            {\n                throw new ArgumentException(\"Continuation missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/browse/next\");\n            return await _httpClient.PostAsync<BrowseNextResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowsePathResponseModel> BrowsePathAsync(ConnectionModel endpoint,\n            BrowsePathRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.BrowsePaths == null || request.BrowsePaths.Count == 0 ||\n                request.BrowsePaths.Any(p => p == null || p.Count == 0))\n            {\n                throw new ArgumentException(\"Browse paths missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/browse/path\");\n            return await _httpClient.PostAsync<BrowsePathResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ReadResponseModel> ReadAsync(ConnectionModel endpoint,\n            ReadRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Attributes == null || request.Attributes.Count == 0)\n            {\n                throw new ArgumentException(nameof(request.Attributes));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/read/attributes\");\n            return await _httpClient.PostAsync<ReadResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<WriteResponseModel> WriteAsync(ConnectionModel endpoint,\n            WriteRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Attributes == null || request.Attributes.Count == 0)\n            {\n                throw new ArgumentException(nameof(request.Attributes));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/write/attributes\");\n            return await _httpClient.PostAsync<WriteResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ValueReadResponseModel> ValueReadAsync(ConnectionModel endpoint,\n            ValueReadRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/read\");\n            return await _httpClient.PostAsync<ValueReadResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ValueWriteResponseModel> ValueWriteAsync(ConnectionModel endpoint,\n            ValueWriteRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Value is null)\n            {\n                throw new ArgumentException(\"Value missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/write\");\n            return await _httpClient.PostAsync<ValueWriteResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<MethodMetadataResponseModel> GetMethodMetadataAsync(\n            ConnectionModel endpoint, MethodMetadataRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/call/$metadata\");\n            return await _httpClient.PostAsync<MethodMetadataResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<MethodCallResponseModel> MethodCallAsync(\n            ConnectionModel endpoint, MethodCallRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/call\");\n            return await _httpClient.PostAsync<MethodCallResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<NodeMetadataResponseModel> GetMetadataAsync(ConnectionModel endpoint,\n            NodeMetadataRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/metadata\");\n            return await _httpClient.PostAsync<NodeMetadataResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<QueryCompilationResponseModel> CompileQueryAsync(ConnectionModel endpoint,\n            QueryCompilationRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            var uri = new Uri($\"{_serviceUri}/v2/query/compile\");\n            return await _httpClient.PostAsync<QueryCompilationResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServerCapabilitiesModel> GetServerCapabilitiesAsync(ConnectionModel endpoint,\n            RequestHeaderModel header, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            var uri = new Uri($\"{_serviceUri}/v2/capabilities\");\n            return await _httpClient.PostAsync<ServerCapabilitiesModel>(uri,\n                RequestBody(endpoint, header), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryServerCapabilitiesModel> HistoryGetServerCapabilitiesAsync(\n            ConnectionModel endpoint, RequestHeaderModel header, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            var uri = new Uri($\"{_serviceUri}/v2/history/capabilities\");\n            return await _httpClient.PostAsync<HistoryServerCapabilitiesModel>(uri,\n                RequestBody(endpoint, header), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryConfigurationResponseModel> HistoryGetConfigurationAsync(\n            ConnectionModel endpoint, HistoryConfigurationRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.NodeId == null)\n            {\n                throw new ArgumentException(\"NodeId missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/history/configuration\");\n            return await _httpClient.PostAsync<HistoryConfigurationResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<VariantValue>> HistoryReadAsync(\n            ConnectionModel endpoint, HistoryReadRequestModel<VariantValue> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/historyread/first\");\n            return await _httpClient.PostAsync<HistoryReadResponseModel<VariantValue>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<VariantValue>> HistoryReadNextAsync(\n            ConnectionModel endpoint, HistoryReadNextRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.ContinuationToken))\n            {\n                throw new ArgumentException(\"Continuation missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}v2/historyread/next\");\n            return await _httpClient.PostAsync<HistoryReadNextResponseModel<VariantValue>>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryUpdateAsync(\n            ConnectionModel endpoint, HistoryUpdateRequestModel<VariantValue> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var uri = new Uri($\"{_serviceUri}/v2/historyupdate\");\n            return await _httpClient.PostAsync<HistoryUpdateResponseModel>(uri,\n                RequestBody(endpoint, request), _serializer, ct: ct).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// Create envelope\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <returns></returns>\n        private static RequestEnvelope<T> RequestBody<T>(ConnectionModel connection, T request)\n        {\n            return new RequestEnvelope<T> { Connection = connection, Request = request };\n        }\n\n        private readonly IHttpClientFactory _httpClient;\n        private readonly ISerializer _serializer;\n        private readonly string _serviceUri;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Alarms/Json/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Alarms.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests : IClassFixture<AlarmsServer>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests(AlarmsServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AlarmServerTests<ConnectionModel> GetTests()\n        {\n            return new AlarmServerTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly AlarmsServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task BrowseAreaPathTestAsync()\n        {\n            return GetTests().BrowseAreaPathTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseMetalsSouthMotorTestAsync()\n        {\n            return GetTests().BrowseMetalsSouthMotorTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseColoursEastTankTestAsync()\n        {\n            return GetTests().BrowseColoursEastTankTestAsync();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest1Async()\n        {\n            return GetTests().CompileAlarmQueryTest1Async();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest2Async()\n        {\n            return GetTests().CompileAlarmQueryTest2Async();\n        }\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleTripAlarmQueryTestAsync()\n        {\n            return GetTests().CompileSimpleTripAlarmQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Alarms/MsgPack/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Alarms.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests : IClassFixture<AlarmsServer>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests(AlarmsServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AlarmServerTests<ConnectionModel> GetTests()\n        {\n            return new AlarmServerTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly AlarmsServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task BrowseAreaPathTestAsync()\n        {\n            return GetTests().BrowseAreaPathTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseMetalsSouthMotorTestAsync()\n        {\n            return GetTests().BrowseMetalsSouthMotorTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseColoursEastTankTestAsync()\n        {\n            return GetTests().BrowseColoursEastTankTestAsync();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest1Async()\n        {\n            return GetTests().CompileAlarmQueryTest1Async();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest2Async()\n        {\n            return GetTests().CompileAlarmQueryTest2Async();\n        }\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleTripAlarmQueryTestAsync()\n        {\n            return GetTests().CompileSimpleTripAlarmQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/Json/ConfigurationTest1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.IO;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection1.Name)]\n    public sealed class ConfigurationTest1 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ConfigurationTest1(AssetServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AssetTests1 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests1(_ => _client.Resolve<IAssetConfiguration<Stream>>(),\n                _server.GetConnection(), false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ConfigureAndDeleteAssetsAsync()\n        {\n            return GetTests().ConfigureAndDeleteAssetsAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/Json/ConfigurationTest2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.IO;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection2.Name)]\n    public sealed class ConfigurationTest2 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ConfigurationTest2(AssetServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AssetTests2 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests2(_ => _client.Resolve<IAssetConfiguration<Stream>>(),\n                _server.GetConnection(), false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ConfigureAsset1Async()\n        {\n            return GetTests().ConfigureAsset1Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset2Async()\n        {\n            return GetTests().ConfigureAsset2Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset3Async()\n        {\n            return GetTests().ConfigureAsset3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/Json/ConfigurationTest3.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection3.Name)]\n    public sealed class ConfigurationTest3 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ConfigurationTest3(AssetServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AssetTests3 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests3(_ => _client.Resolve<IAssetConfiguration<byte[]>>(),\n                _server.GetConnection(), false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ConfigureAsset1Async()\n        {\n            return GetTests().ConfigureAsset1Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset2Async()\n        {\n            return GetTests().ConfigureAsset2Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset3Async()\n        {\n            return GetTests().ConfigureAsset3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/Json/ConfigurationTest4.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.IO;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection4.Name)]\n    public sealed class ConfigurationTest4 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ConfigurationTest4(AssetServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AssetTests4 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests4(_ => _client.Resolve<IAssetConfiguration<Stream>>(),\n                _server.GetConnection(), false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ConfigureDuplicateAssetFailsAsync()\n        {\n            return GetTests().ConfigureDuplicateAssetFailsAsync();\n        }\n\n        [SkippableFact]\n        public Task ConfigureAssetFails1Async()\n        {\n            Skip.If(true, \"Using bytes only\");\n            return GetTests().ConfigureAssetFails1Async();\n        }\n\n        [SkippableFact]\n        public Task ConfigureWithBadStreamFails1Async()\n        {\n            Skip.If(true, \"Using bytes only\");\n            return GetTests().ConfigureWithBadStreamFails1Async();\n        }\n\n        [SkippableFact]\n        public Task ConfigureWithBadStreamFails2Async()\n        {\n            Skip.If(true, \"Using bytes only\");\n            return GetTests().ConfigureWithBadStreamFails2Async();\n        }\n\n        [SkippableFact]\n        public Task ConfigureWithBadStreamFails3Async()\n        {\n            Skip.If(true, \"Using bytes only\");\n            return GetTests().ConfigureWithBadStreamFails3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/Json/WriteCollection1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection1 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite1RestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/Json/WriteCollection2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection2 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite2RestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/Json/WriteCollection3.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection3 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite3RestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/Json/WriteCollection4.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection4 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite4RestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/MsgPack/ConfigurationTest1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.IO;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection1.Name)]\n    public sealed class ConfigurationTest1 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ConfigurationTest1(AssetServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AssetTests1 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests1(_ => _client.Resolve<IAssetConfiguration<Stream>>(),\n                _server.GetConnection(), false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ConfigureAndDeleteAssetsAsync()\n        {\n            return GetTests().ConfigureAndDeleteAssetsAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/MsgPack/ConfigurationTest2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.IO;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection2.Name)]\n    public sealed class ConfigurationTest2 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ConfigurationTest2(AssetServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AssetTests2 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests2(_ => _client.Resolve<IAssetConfiguration<Stream>>(),\n                _server.GetConnection(), false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ConfigureAsset1Async()\n        {\n            return GetTests().ConfigureAsset1Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset2Async()\n        {\n            return GetTests().ConfigureAsset2Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset3Async()\n        {\n            return GetTests().ConfigureAsset3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/MsgPack/ConfigurationTest3.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection3.Name)]\n    public sealed class ConfigurationTest3 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ConfigurationTest3(AssetServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AssetTests3 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests3(_ => _client.Resolve<IAssetConfiguration<byte[]>>(),\n                _server.GetConnection(), false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ConfigureAsset1Async()\n        {\n            return GetTests().ConfigureAsset1Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset2Async()\n        {\n            return GetTests().ConfigureAsset2Async();\n        }\n\n        [Fact]\n        public Task ConfigureAsset3Async()\n        {\n            return GetTests().ConfigureAsset3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/MsgPack/ConfigurationTest4.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.IO;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection4.Name)]\n    public sealed class ConfigurationTest4 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ConfigurationTest4(AssetServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private AssetTests4 GetTests()\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            return new AssetTests4(_ => _client.Resolve<IAssetConfiguration<Stream>>(),\n                _server.GetConnection(), false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n        }\n\n        private readonly AssetServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ConfigureDuplicateAssetFailsAsync()\n        {\n            return GetTests().ConfigureDuplicateAssetFailsAsync();\n        }\n\n        [SkippableFact]\n        public Task ConfigureAssetFails1Async()\n        {\n            Skip.If(true, \"Using bytes only\");\n            return GetTests().ConfigureAssetFails1Async();\n        }\n\n        [SkippableFact]\n        public Task ConfigureWithBadStreamFails1Async()\n        {\n            Skip.If(true, \"Using bytes only\");\n            return GetTests().ConfigureWithBadStreamFails1Async();\n        }\n\n        [SkippableFact]\n        public Task ConfigureWithBadStreamFails2Async()\n        {\n            Skip.If(true, \"Using bytes only\");\n            return GetTests().ConfigureWithBadStreamFails2Async();\n        }\n\n        [SkippableFact]\n        public Task ConfigureWithBadStreamFails3Async()\n        {\n            Skip.If(true, \"Using bytes only\");\n            return GetTests().ConfigureWithBadStreamFails3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/MsgPack/WriteCollection1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection1 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite1RestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/MsgPack/WriteCollection2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection2 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite2RestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/MsgPack/WriteCollection3.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection3 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite3RestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Asset/MsgPack/WriteCollection4.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Asset.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection4 : ICollectionFixture<AssetServer>\n    {\n        public const string Name = \"AssetWrite4RestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/DeterministicAlarms/Json/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.DeterministicAlarms.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests1 : IClassFixture<DeterministicAlarmsServer1>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests1(DeterministicAlarmsServer1 server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private DeterministicAlarmsTests1<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests1<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly DeterministicAlarmsServer1 _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1TemperatureHighTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1TemperatureHighTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2LightOffTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2LightOffTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2DoorOpenTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/DeterministicAlarms/Json/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.DeterministicAlarms.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests2 : IClassFixture<DeterministicAlarmsServer2>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests2(DeterministicAlarmsServer2 server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private DeterministicAlarmsTests2<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests2<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly DeterministicAlarmsServer2 _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/DeterministicAlarms/MsgPack/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.DeterministicAlarms.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests1 : IClassFixture<DeterministicAlarmsServer1>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests1(DeterministicAlarmsServer1 server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private DeterministicAlarmsTests1<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests1<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly DeterministicAlarmsServer1 _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1TemperatureHighTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1TemperatureHighTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2LightOffTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2LightOffTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2DoorOpenTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/DeterministicAlarms/MsgPack/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.DeterministicAlarms.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests2 : IClassFixture<DeterministicAlarmsServer2>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests2(DeterministicAlarmsServer2 server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private DeterministicAlarmsTests2<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests2<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly DeterministicAlarmsServer2 _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/DmApiPublisherControllerTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Controllers;\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Services;\n    using Azure.IIoT.OpcUa.Publisher.Storage;\n    using Azure.IIoT.OpcUa.Publisher.Tests.Utils;\n    using Autofac;\n    using FluentAssertions;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Moq;\n    using Neovolve.Logging.Xunit;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// Tests the Direct Methods API for the pubisher\n    /// </summary>\n    public sealed class DmApiPublisherControllerTests : TempFileProviderBase\n    {\n        /// <summary>\n        /// Constructor that initializes common resources used by tests.\n        /// </summary>\n        /// <param name=\"output\"></param>\n        public DmApiPublisherControllerTests(ITestOutputHelper output)\n        {\n            _newtonSoftJsonSerializer = new NewtonsoftJsonSerializer();\n            _loggerFactory = LogFactory.Create(output, Logging.Config);\n\n            _options = new PublisherConfig(new ConfigurationBuilder().Build()).ToOptions();\n            _options.Value.PublishedNodesFile = _tempFile;\n            _options.Value.UseFileChangePolling = true;\n            _options.Value.MessagingProfile = MessagingProfile.Get(\n                MessagingMode.PubSub, MessageEncoding.Json);\n\n            _publishedNodesJobConverter = new PublishedNodesConverter(\n                _loggerFactory.CreateLogger<PublishedNodesConverter>(), _newtonSoftJsonSerializer, _options);\n\n            // Note that each test is responsible for setting content of _tempFile;\n            CopyContent(\"Resources/empty_pn.json\", _tempFile);\n\n            using var factory = new PhysicalFileProviderFactory(_options,\n                _loggerFactory.CreateLogger<PhysicalFileProviderFactory>());\n            _publishedNodesProvider = new PublishedNodesProvider(factory, _options,\n                _loggerFactory.CreateLogger<PublishedNodesProvider>());\n            _triggerMock = new Mock<IWriterGroupControl>();\n            var factoryMock = new Mock<IWriterGroupScopeFactory>();\n            var lifetime = new Mock<IWriterGroupScope>();\n            lifetime.SetupGet(l => l.WriterGroup).Returns(_triggerMock.Object);\n            factoryMock\n                .Setup(factory => factory.Create(It.IsAny<WriterGroupModel>()))\n                .Returns(lifetime.Object);\n            _publisher = new PublisherService(factoryMock.Object, _options,\n                _loggerFactory.CreateLogger<PublisherService>());\n            _diagnostic = new Mock<IDiagnosticCollector>();\n            var mockDiag = new WriterGroupDiagnosticModel();\n            _diagnostic.Setup(m => m.TryGetDiagnosticsForWriterGroup(It.IsAny<string>(), out mockDiag)).Returns(true);\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                _loggerFactory.Dispose();\n                _publishedNodesProvider.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// This method should be called only after content of _tempFile is set.\n        /// </summary>\n        private PublishedNodesJsonServices InitPublisherConfigService()\n        {\n            var configService = new PublishedNodesJsonServices(\n                _publishedNodesJobConverter,\n                _publisher,\n                _loggerFactory.CreateLogger<PublishedNodesJsonServices>(),\n                _publishedNodesProvider,\n                _newtonSoftJsonSerializer,\n                _diagnostic.Object\n            );\n            configService.GetAwaiter().GetResult();\n            return configService;\n        }\n\n        [Fact]\n        public async Task DmApiPublishUnpublishNodesTestAsync()\n        {\n            CopyContent(\"Resources/empty_pn.json\", _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            var methodsController = new ConfigurationController(configService);\n\n            using var publishPayloads = new StreamReader(\"Resources/DmApiPayloadCollection.json\");\n            var publishNodesRequest = _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(\n                await publishPayloads.ReadToEndAsync());\n\n            foreach (var request in publishNodesRequest)\n            {\n                var initialNode = request.OpcNodes[0];\n                for (var i = 0; i < 10000; i++)\n                {\n                    request.OpcNodes.Add(new OpcNodeModel\n                    {\n                        Id = initialNode.Id + i.ToString(CultureInfo.InvariantCulture),\n                        DataSetFieldId = initialNode.DataSetFieldId,\n                        DisplayName = initialNode.DisplayName,\n                        ExpandedNodeId = initialNode.ExpandedNodeId,\n                        HeartbeatIntervalTimespan = initialNode.HeartbeatIntervalTimespan,\n                        OpcPublishingInterval = initialNode.OpcPublishingInterval,\n                        OpcPublishingIntervalTimespan = initialNode.OpcPublishingIntervalTimespan,\n                        OpcSamplingInterval = initialNode.OpcSamplingInterval,\n                        QueueSize = initialNode.QueueSize,\n                        SkipFirst = initialNode.SkipFirst,\n                        DataChangeTrigger = initialNode.DataChangeTrigger,\n                        DeadbandType = initialNode.DeadbandType,\n                        DeadbandValue = initialNode.DeadbandValue\n                    });\n                }\n\n                await FluentActions\n                    .Invoking(async () => await methodsController.PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync()\n                    ;\n            }\n\n            var writerGroup = Assert.Single(_publisher.WriterGroups);\n            Assert.Equal(8u, _publisher.Version);\n\n            foreach (var request in publishNodesRequest)\n            {\n                await FluentActions\n                    .Invoking(async () => await methodsController\n                    .UnpublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync()\n                    ;\n            }\n\n            Assert.Empty(_publisher.WriterGroups);\n            Assert.Equal(15u, _publisher.Version);\n        }\n\n        [Fact]\n        public async Task DmApiPublishUnpublishAllNodesTestAsync()\n        {\n            CopyContent(\"Resources/empty_pn.json\", _tempFile);\n            await using var configService = InitPublisherConfigService();\n            var methodsController = new ConfigurationController(configService);\n\n            using var publishPayloads = new StreamReader(\"Resources/DmApiPayloadCollection.json\");\n            var publishNodesRequest = _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(\n                await publishPayloads.ReadToEndAsync());\n\n            foreach (var request in publishNodesRequest)\n            {\n                var initialNode = request.OpcNodes[0];\n                for (var i = 0; i < 10000; i++)\n                {\n                    request.OpcNodes.Add(new OpcNodeModel\n                    {\n                        Id = initialNode.Id + i.ToString(CultureInfo.InvariantCulture),\n                        DataSetFieldId = initialNode.DataSetFieldId,\n                        DisplayName = initialNode.DisplayName,\n                        ExpandedNodeId = initialNode.ExpandedNodeId,\n                        HeartbeatIntervalTimespan = initialNode.HeartbeatIntervalTimespan,\n                        OpcPublishingInterval = initialNode.OpcPublishingInterval,\n                        OpcSamplingInterval = initialNode.OpcSamplingInterval,\n                        QueueSize = initialNode.QueueSize,\n                        SkipFirst = initialNode.SkipFirst,\n                        DataChangeTrigger = initialNode.DataChangeTrigger,\n                        DeadbandType = initialNode.DeadbandType,\n                        DeadbandValue = initialNode.DeadbandValue\n                    });\n                }\n\n                await FluentActions\n                    .Invoking(async () => await methodsController.PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            var writerGroup = Assert.Single(_publisher.WriterGroups);\n\n            var unpublishAllNodesRequest = publishNodesRequest.GroupBy(pn => string.Concat(pn.EndpointUrl, pn.DataSetWriterId, pn.DataSetPublishingInterval))\n                .Select(g => g.First()).ToList();\n\n            foreach (var request in unpublishAllNodesRequest)\n            {\n                request.OpcNodes?.Clear();\n                await FluentActions\n                    .Invoking(async () => await methodsController\n                    .UnpublishAllNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            Assert.Empty(_publisher.WriterGroups);\n        }\n\n        [Fact]\n        public async Task DmApiPublishNodesToJobTestAsync()\n        {\n            CopyContent(\"Resources/empty_pn.json\", _tempFile);\n            await using var configService = InitPublisherConfigService();\n\n            var methodsController = new ConfigurationController(configService);\n\n            using var publishPayloads = new StreamReader(\"Resources/DmApiPayloadCollection.json\");\n            var publishNodesRequests = _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>\n                (await publishPayloads.ReadToEndAsync());\n\n            foreach (var request in publishNodesRequests)\n            {\n                await FluentActions\n                    .Invoking(async () => await methodsController\n                    .PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync()\n                    ;\n            }\n\n            var writerGroup = Assert.Single(_publisher.WriterGroups);\n\n            writerGroup.DataSetWriters.Count.Should().Be(6);\n\n            Assert.All(writerGroup.DataSetWriters,\n                writer => Assert.Equal(publishNodesRequests[0].EndpointUrl,\n                    writer.DataSet.DataSetSource.Connection.Endpoint.Url));\n            Assert.Equal(publishNodesRequests\n                .Select(n => (n.UseSecurity ?? false) ? SecurityMode.SignAndEncrypt : SecurityMode.None)\n                .ToHashSet(),\n                writerGroup.DataSetWriters\n                .Select(w => w.DataSet.DataSetSource.Connection.Endpoint.SecurityMode.Value)\n                .ToHashSet());\n            Assert.Equal(9,\n                writerGroup.DataSetWriters.Sum(w => w.DataSet.DataSetSource.PublishedVariables.PublishedData.Count));\n        }\n\n        [Fact]\n        public async Task DmApiGetConfiguredNodesOnEndpointAsyncTestAsync()\n        {\n            const string endpointUrl = \"opc.tcp://opcplc:50010\";\n\n            var endpointRequest = new PublishedNodesEntryModel\n            {\n                EndpointUrl = endpointUrl\n            };\n\n            var (d, methodsController) = await PublishNodeAsync(\"Resources/DmApiPayloadTwoEndpoints.json\");\n            var response = await FluentActions\n                    .Invoking(async () => await methodsController\n                    .GetConfiguredNodesOnEndpointAsync(endpointRequest))\n                    .Should()\n                    .NotThrowAsync();\n            await d.DisposeAsync();\n\n            response.Subject.OpcNodes.Count\n                .Should()\n                .Be(2);\n            response.Subject.OpcNodes[0].Id\n                .Should()\n                .Be(\"ns=2;s=FastUInt1\");\n            response.Subject.OpcNodes[1].Id\n                .Should()\n                .Be(\"ns=2;s=FastUInt2\");\n        }\n\n        [Fact]\n        public async Task DmApiGetConfiguredNodesOnEndpointAsyncDataSetWriterGroupTestAsync()\n        {\n            const string endpointUrl = \"opc.tcp://opcplc:50000\";\n            const string dataSetWriterGroup = \"Leaf0\";\n            const string dataSetWriterId = \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\";\n            const string dataSetName = \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\";\n            const OpcAuthenticationMode authenticationMode = OpcAuthenticationMode.UsernamePassword;\n            const string username = \"usr\";\n            const string password = \"pwd\";\n\n            var endpointRequest = new PublishedNodesEntryModel\n            {\n                EndpointUrl = endpointUrl,\n                DataSetWriterGroup = dataSetWriterGroup,\n                DataSetWriterId = dataSetWriterId,\n                DataSetName = dataSetName,\n                OpcAuthenticationMode = authenticationMode,\n                OpcAuthenticationUsername = username,\n                OpcAuthenticationPassword = password\n            };\n\n            var (d, methodsController) = await PublishNodeAsync(\"Resources/DmApiPayloadTwoEndpoints.json\",\n                a => a.DataSetWriterGroup == \"Leaf0\");\n            var response = await FluentActions\n                    .Invoking(async () => await methodsController\n                    .GetConfiguredNodesOnEndpointAsync(endpointRequest))\n                    .Should()\n                    .NotThrowAsync();\n            await d.DisposeAsync();\n\n            response.Subject.OpcNodes.Count\n                .Should()\n                .Be(1);\n            response.Subject.OpcNodes[0].Id\n                .Should()\n                .Be(\"ns=2;s=SlowUInt1\");\n        }\n\n        [Fact]\n        public async Task DmApiGetConfiguredNodesOnEndpointAsyncDataSetWriterIdTestAsync()\n        {\n            // Testing that we can differentiate between endpoints\n            // even if they only have different DataSetWriterIds.\n\n            var opcNodes = Enumerable.Range(0, 5)\n                .Select(i => new OpcNodeModel\n                {\n                    Id = $\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\"\n                })\n                .ToList();\n\n            var endpoints = Enumerable.Range(0, 5)\n                .Select(i => new PublishedNodesEntryModel\n                {\n                    EndpointUrl = \"opc.tcp://opcplc:50000\",\n                    DataSetWriterId = i != 0\n                        ? $\"DataSetWriterId{i}\"\n                        : null,\n                    OpcNodes = [.. opcNodes.GetRange(0, i + 1)]\n                })\n                .ToList();\n\n            var (d, methodsController) = await PublishNodeAsync(\"Resources/empty_pn.json\");\n\n            for (var i = 0; i < 5; ++i)\n            {\n                await methodsController.PublishNodesAsync(endpoints[i]);\n            }\n\n            for (var i = 0; i < 5; ++i)\n            {\n                var response = await FluentActions\n                        .Invoking(async () => await methodsController\n                        .GetConfiguredNodesOnEndpointAsync(endpoints[i]))\n                        .Should()\n                        .NotThrowAsync();\n\n                response.Subject.OpcNodes.Count\n                    .Should()\n                    .Be(i + 1);\n                response.Subject.OpcNodes[response.Subject.OpcNodes.Count - 1].Id\n                    .Should()\n                    .Be($\"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt{i}\");\n            }\n            await d.DisposeAsync();\n        }\n\n        [Fact]\n        public async Task DmApiGetConfiguredNodesOnEndpointAsyncUseSecurityTestAsync()\n        {\n            const string endpointUrl = \"opc.tcp://opcplc:50000\";\n            const bool useSecurity = false;\n\n            var endpointRequest = new PublishedNodesEntryModel\n            {\n                EndpointUrl = endpointUrl,\n                UseSecurity = useSecurity\n            };\n\n            var (d, methodsController) = await PublishNodeAsync(\"Resources/DmApiPayloadTwoEndpoints.json\");\n\n            var response = await FluentActions\n                    .Invoking(async () => await methodsController\n                    .GetConfiguredNodesOnEndpointAsync(endpointRequest))\n                    .Should()\n                    .NotThrowAsync();\n            await d.DisposeAsync();\n\n            response.Subject.OpcNodes.Count\n                .Should()\n                .Be(1);\n            response.Subject.OpcNodes[0].Id\n                .Should()\n                .Be(\"ns=2;s=SlowUInt3\");\n        }\n\n        [Fact]\n        public async Task DmApiGetConfiguredNodesOnEndpointAsyncOpcAuthenticationModeTestAsync()\n        {\n            const string endpointUrl = \"opc.tcp://opcplc:50000\";\n            const string dataSetWriterGroup = \"Leaf1\";\n            const string dataSetWriterId = \"Leaf1_10000_3085991c-b85c-4311-9bfb-a916da952235\";\n            const string dataSetName = \"Tag_Leaf1_10000_3085991c-b85c-4311-9bfb-a916da952235\";\n            const int dataSetPublishingInterval = 3000;\n            const OpcAuthenticationMode authenticationMode = OpcAuthenticationMode.Anonymous;\n\n            var endpointRequest = new PublishedNodesEntryModel\n            {\n                EndpointUrl = endpointUrl,\n                DataSetWriterGroup = dataSetWriterGroup,\n                DataSetWriterId = dataSetWriterId,\n                DataSetName = dataSetName,\n                DataSetPublishingInterval = dataSetPublishingInterval,\n                OpcAuthenticationMode = authenticationMode\n            };\n\n            var (d, methodsController) = await PublishNodeAsync(\"Resources/DmApiPayloadTwoEndpoints.json\",\n                a => a.DataSetWriterGroup == \"Leaf1\");\n\n            var response = await FluentActions\n                    .Invoking(async () => await methodsController\n                    .GetConfiguredNodesOnEndpointAsync(endpointRequest))\n                    .Should()\n                    .NotThrowAsync();\n            await d.DisposeAsync();\n\n            response.Subject.OpcNodes.Count\n                .Should()\n                .Be(1);\n            response.Subject.OpcNodes[0].Id\n                .Should()\n                .Be(\"ns=2;s=SlowUInt2\");\n        }\n\n        [Fact]\n        public async Task DmApiGetConfiguredNodesOnEndpointAsyncUsernamePasswordTestAsync()\n        {\n            const string endpointUrl = \"opc.tcp://opcplc:50000\";\n            const OpcAuthenticationMode authenticationMode = OpcAuthenticationMode.UsernamePassword;\n            const string username = \"usr\";\n            const string password = \"pwd\";\n\n            var endpointRequest = new PublishedNodesEntryModel\n            {\n                EndpointUrl = endpointUrl,\n                OpcAuthenticationMode = authenticationMode,\n                OpcAuthenticationUsername = username,\n                OpcAuthenticationPassword = password\n            };\n\n            var (d, methodsController) = await PublishNodeAsync(\"Resources/DmApiPayloadTwoEndpoints.json\");\n\n            var response = await FluentActions\n                    .Invoking(async () => await methodsController\n                    .GetConfiguredNodesOnEndpointAsync(endpointRequest))\n                    .Should()\n                    .NotThrowAsync();\n            await d.DisposeAsync();\n\n            response.Subject.OpcNodes.Count\n                .Should()\n                .Be(2);\n            response.Subject.OpcNodes[0].Id\n                .Should()\n                .Be(\"ns=2;s=FastUInt3\");\n            response.Subject.OpcNodes[1].Id\n                .Should()\n                .Be(\"ns=2;s=FastUInt4\");\n        }\n\n        /// <summary>\n        /// publish nodes from publishedNodesFile\n        /// </summary>\n        /// <param name=\"publishedNodesFile\"></param>\n        /// <param name=\"predicate\"></param>\n        private async Task<(PublishedNodesJsonServices, ConfigurationController)> PublishNodeAsync(string publishedNodesFile,\n            Func<PublishedNodesEntryModel, bool> predicate = null)\n        {\n            CopyContent(\"Resources/empty_pn.json\", _tempFile);\n            var configService = InitPublisherConfigService();\n\n            var methodsController = new ConfigurationController(configService);\n\n            using var publishPayloads = new StreamReader(publishedNodesFile);\n            var publishNodesRequest = _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>(\n                await publishPayloads.ReadToEndAsync().ConfigureAwait(false));\n\n            foreach (var request in publishNodesRequest.Where(predicate ?? (_ => true)))\n            {\n                await FluentActions\n                    .Invoking(async () => await methodsController.PublishNodesAsync(request).ConfigureAwait(false))\n                    .Should()\n                    .NotThrowAsync()\n                    .ConfigureAwait(false);\n            }\n            return (configService, methodsController);\n        }\n\n        [Theory]\n        [InlineData(\"Resources/DmApiPayloadCollection.json\")]\n        public async Task DmApiGetConfiguredEndpointsTestAsync(string publishedNodesFile)\n        {\n            CopyContent(\"Resources/empty_pn.json\", _tempFile);\n            await using var configService = InitPublisherConfigService();\n            var methodsController = new ConfigurationController(configService);\n\n            using var publishPayloads = new StreamReader(publishedNodesFile);\n            var publishNodesRequests = _newtonSoftJsonSerializer.Deserialize<List<PublishedNodesEntryModel>>\n                (await publishPayloads.ReadToEndAsync());\n\n            // Check that GetConfiguredEndpointsAsync returns empty list\n            var endpoints = await FluentActions\n                .Invoking(async () => await methodsController\n                .GetConfiguredEndpointsAsync())\n                .Should()\n                .NotThrowAsync();\n\n            endpoints.Subject.Endpoints.Count.Should().Be(0);\n\n            // Publish nodes\n            foreach (var request in publishNodesRequests)\n            {\n                await FluentActions\n                    .Invoking(async () => await methodsController\n                    .PublishNodesAsync(request))\n                    .Should()\n                    .NotThrowAsync();\n            }\n\n            // Check configured endpoints count\n            endpoints = await FluentActions\n                .Invoking(async () => await methodsController\n                .GetConfiguredEndpointsAsync())\n                .Should()\n                .NotThrowAsync();\n\n            endpoints.Subject.Endpoints.Count.Should().Be(5);\n            var tags = endpoints.Subject.Endpoints.Select(e => e.DataSetName).ToHashSet();\n            tags.Should().Contain(\"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\");\n            tags.Should().Contain(\"Tag_Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\");\n            tags.Should().Contain(\"Tag_Leaf2_10000_3085991c-b85c-4311-9bfb-a916da952234\");\n            tags.Should().Contain(\"Tag_Leaf3_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\");\n            tags.Should().Contain((string)null);\n\n            var endpointsHash = endpoints.Subject.Endpoints.Select(e => e.GetHashCode()).ToList();\n            Assert.Equal(endpointsHash.Distinct().Count(), endpointsHash.Count);\n        }\n\n        [Fact]\n        public async Task DmApiGetDiagnosticInfoTestAsync()\n        {\n            CopyContent(\"Resources/empty_pn.json\", _tempFile);\n            await using var configService = InitPublisherConfigService();\n            var methodsController = new ConfigurationController(configService);\n\n            var response = await FluentActions\n                    .Invoking(async () => await methodsController\n                    .GetDiagnosticInfoAsync())\n                    .Should()\n                    .NotThrowAsync();\n\n            response.Subject\n                .Should()\n                .NotBeNull();\n        }\n\n        /// <summary>\n        /// Copy content of source file to destination file.\n        /// </summary>\n        /// <param name=\"sourcePath\"></param>\n        /// <param name=\"destinationPath\"></param>\n        /// <returns></returns>\n        private static void CopyContent(string sourcePath, string destinationPath)\n        {\n            var content = GetFileContent(sourcePath);\n\n            using var fileStream = new FileStream(destinationPath, FileMode.OpenOrCreate,\n                FileAccess.Write, FileShare.ReadWrite);\n            fileStream.Write(Encoding.UTF8.GetBytes(content));\n\n            static string GetFileContent(string path)\n            {\n                using var payloadReader = new StreamReader(path);\n                return payloadReader.ReadToEnd();\n            }\n        }\n\n        private readonly NewtonsoftJsonSerializer _newtonSoftJsonSerializer;\n        private readonly ILoggerFactory _loggerFactory;\n        private readonly PublishedNodesConverter _publishedNodesJobConverter;\n        private readonly IOptions<PublisherOptions> _options;\n        private readonly PublishedNodesProvider _publishedNodesProvider;\n        private readonly Mock<IWriterGroupControl> _triggerMock;\n        private readonly PublisherService _publisher;\n        private readonly Mock<IDiagnosticCollector> _diagnostic;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/Json/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(FileCollection.Name)]\n    public sealed class BrowseTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public BrowseTests(FileSystemServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private BrowseTests<ConnectionModel> GetTests()\n        {\n            return new BrowseTests<ConnectionModel>(\n               _client.Resolve<IFileSystemServices<ConnectionModel>>,\n               _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task GetFileSystemsTest1Async()\n        {\n            return GetTests().GetFileSystemsTest1Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest1Async()\n        {\n            return GetTests().GetDirectoriesTest1Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest2Async()\n        {\n            return GetTests().GetDirectoriesTest2Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest3Async()\n        {\n            return GetTests().GetDirectoriesTest3Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest4Async()\n        {\n            return GetTests().GetDirectoriesTest4Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest5Async()\n        {\n            return GetTests().GetDirectoriesTest5Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest6Async()\n        {\n            return GetTests().GetDirectoriesTest6Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest1Async()\n        {\n            return GetTests().GetFilesTest1Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest2Async()\n        {\n            return GetTests().GetFilesTest2Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest3Async()\n        {\n            return GetTests().GetFilesTest3Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest4Async()\n        {\n            return GetTests().GetFilesTest4Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest5Async()\n        {\n            return GetTests().GetFilesTest5Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest6Async()\n        {\n            return GetTests().GetFilesTest6Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/Json/FileCollection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class FileCollection : ICollectionFixture<FileSystemServer>\n    {\n        public const string Name = \"FileSystemRestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/Json/OperationsTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(FileCollection.Name)]\n    public sealed class OperationsTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public OperationsTests(FileSystemServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private OperationsTests<ConnectionModel> GetTests()\n        {\n            return new OperationsTests<ConnectionModel>(\n              _client.Resolve<IFileSystemServices<ConnectionModel>>,\n              _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task CreateDirectoryTest1Async()\n        {\n            return GetTests().CreateDirectoryTest1Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest2Async()\n        {\n            return GetTests().CreateDirectoryTest2Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest3Async()\n        {\n            return GetTests().CreateDirectoryTest3Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest4Async()\n        {\n            return GetTests().CreateDirectoryTest4Async();\n        }\n\n        [SkippableFact]\n        public Task DeleteDirectoryTest1Async()\n        {\n            Skip.If(true, \"TODO\");\n            return GetTests().DeleteDirectoryTest1Async();\n        }\n\n        [Fact]\n        public Task DeleteDirectoryTest2Async()\n        {\n            return GetTests().DeleteDirectoryTest2Async();\n        }\n\n        [Fact]\n        public Task DeleteDirectoryTest3Async()\n        {\n            return GetTests().DeleteDirectoryTest3Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest1Async()\n        {\n            return GetTests().CreateFileTest1Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest2Async()\n        {\n            return GetTests().CreateFileTest2Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest3Async()\n        {\n            return GetTests().CreateFileTest3Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest4Async()\n        {\n            return GetTests().CreateFileTest4Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest1Async()\n        {\n            return GetTests().GetFileInfoTest1Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest2Async()\n        {\n            return GetTests().GetFileInfoTest2Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest3Async()\n        {\n            return GetTests().GetFileInfoTest3Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest1Async()\n        {\n            return GetTests().DeleteFileTest1Async();\n        }\n\n        [SkippableFact]\n        public Task DeleteFileTest2Async()\n        {\n            Skip.If(true, \"TODO\");\n            return GetTests().DeleteFileTest2Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest3Async()\n        {\n            return GetTests().DeleteFileTest3Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest4Async()\n        {\n            return GetTests().DeleteFileTest4Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest5Async()\n        {\n            return GetTests().DeleteFileTest5Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/Json/ReadTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(FileCollection.Name)]\n    public sealed class ReadTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadTests(FileSystemServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private ReadTests<ConnectionModel> GetTests()\n        {\n            return new ReadTests<ConnectionModel>(\n                _client.Resolve<IFileSystemServices<ConnectionModel>>,\n                _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ReadFileTest0Async()\n        {\n            return GetTests().ReadFileTest0Async();\n        }\n\n        [SkippableFact]\n        public Task ReadFileTest1Async()\n        {\n            Skip.If(true);\n            return GetTests().ReadFileTest1Async();\n        }\n\n        [SkippableFact]\n        public Task ReadFileTest2Async()\n        {\n            Skip.If(true);\n            return GetTests().ReadFileTest2Async();\n        }\n\n        [SkippableFact]\n        public Task ReadFileTest3Async()\n        {\n            Skip.If(true);\n            return GetTests().ReadFileTest3Async();\n        }\n\n        [SkippableFact]\n        public Task ReadFileTest4Async()\n        {\n            Skip.If(true);\n            return GetTests().ReadFileTest4Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/Json/WriteTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(FileCollection.Name)]\n    public sealed class WriteTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public WriteTests(FileSystemServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private WriteTests<ConnectionModel> GetTests()\n        {\n            return new WriteTests<ConnectionModel>(\n                _client.Resolve<IFileSystemServices<ConnectionModel>>,\n                _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task WriteFileTest0Async()\n        {\n            return GetTests().WriteFileTest0Async();\n        }\n\n        [SkippableFact]\n        public Task WriteFileTest1Async()\n        {\n            Skip.If(true);\n            return GetTests().WriteFileTest1Async();\n        }\n\n        [SkippableFact]\n        public Task WriteFileTest2Async()\n        {\n            Skip.If(true);\n            return GetTests().WriteFileTest2Async();\n        }\n\n        [Fact]\n        public Task AppendFileTest0Async()\n        {\n            return GetTests().AppendFileTest0Async();\n        }\n\n        [SkippableFact]\n        public Task AppendFileTest1Async()\n        {\n            Skip.If(true);\n            return GetTests().AppendFileTest1Async();\n        }\n\n        [Fact]\n        public Task AppendFileTest2Async()\n        {\n            return GetTests().AppendFileTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/MsgPack/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(FileCollection.Name)]\n    public sealed class BrowseTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public BrowseTests(FileSystemServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private BrowseTests<ConnectionModel> GetTests()\n        {\n            return new BrowseTests<ConnectionModel>(\n               _client.Resolve<IFileSystemServices<ConnectionModel>>,\n               _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task GetFileSystemsTest1Async()\n        {\n            return GetTests().GetFileSystemsTest1Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest1Async()\n        {\n            return GetTests().GetDirectoriesTest1Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest2Async()\n        {\n            return GetTests().GetDirectoriesTest2Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest3Async()\n        {\n            return GetTests().GetDirectoriesTest3Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest4Async()\n        {\n            return GetTests().GetDirectoriesTest4Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest5Async()\n        {\n            return GetTests().GetDirectoriesTest5Async();\n        }\n\n        [Fact]\n        public Task GetDirectoriesTest6Async()\n        {\n            return GetTests().GetDirectoriesTest6Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest1Async()\n        {\n            return GetTests().GetFilesTest1Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest2Async()\n        {\n            return GetTests().GetFilesTest2Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest3Async()\n        {\n            return GetTests().GetFilesTest3Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest4Async()\n        {\n            return GetTests().GetFilesTest4Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest5Async()\n        {\n            return GetTests().GetFilesTest5Async();\n        }\n\n        [Fact]\n        public Task GetFilesTest6Async()\n        {\n            return GetTests().GetFilesTest6Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/MsgPack/FileCollection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class FileCollection : ICollectionFixture<FileSystemServer>\n    {\n        public const string Name = \"FileSystemRestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/MsgPack/OperationsTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(FileCollection.Name)]\n    public sealed class OperationsTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public OperationsTests(FileSystemServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private OperationsTests<ConnectionModel> GetTests()\n        {\n            return new OperationsTests<ConnectionModel>(\n              _client.Resolve<IFileSystemServices<ConnectionModel>>,\n              _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task CreateDirectoryTest1Async()\n        {\n            return GetTests().CreateDirectoryTest1Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest2Async()\n        {\n            return GetTests().CreateDirectoryTest2Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest3Async()\n        {\n            return GetTests().CreateDirectoryTest3Async();\n        }\n\n        [Fact]\n        public Task CreateDirectoryTest4Async()\n        {\n            return GetTests().CreateDirectoryTest4Async();\n        }\n\n        [SkippableFact]\n        public Task DeleteDirectoryTest1Async()\n        {\n            Skip.If(true, \"TODO\");\n            return GetTests().DeleteDirectoryTest1Async();\n        }\n\n        [Fact]\n        public Task DeleteDirectoryTest2Async()\n        {\n            return GetTests().DeleteDirectoryTest2Async();\n        }\n\n        [Fact]\n        public Task DeleteDirectoryTest3Async()\n        {\n            return GetTests().DeleteDirectoryTest3Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest1Async()\n        {\n            return GetTests().CreateFileTest1Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest2Async()\n        {\n            return GetTests().CreateFileTest2Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest3Async()\n        {\n            return GetTests().CreateFileTest3Async();\n        }\n\n        [Fact]\n        public Task CreateFileTest4Async()\n        {\n            return GetTests().CreateFileTest4Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest1Async()\n        {\n            return GetTests().GetFileInfoTest1Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest2Async()\n        {\n            return GetTests().GetFileInfoTest2Async();\n        }\n\n        [Fact]\n        public Task GetFileInfoTest3Async()\n        {\n            return GetTests().GetFileInfoTest3Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest1Async()\n        {\n            return GetTests().DeleteFileTest1Async();\n        }\n\n        [SkippableFact]\n        public Task DeleteFileTest2Async()\n        {\n            Skip.If(true, \"TODO\");\n            return GetTests().DeleteFileTest2Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest3Async()\n        {\n            return GetTests().DeleteFileTest3Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest4Async()\n        {\n            return GetTests().DeleteFileTest4Async();\n        }\n\n        [Fact]\n        public Task DeleteFileTest5Async()\n        {\n            return GetTests().DeleteFileTest5Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/MsgPack/ReadTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(FileCollection.Name)]\n    public sealed class ReadTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadTests(FileSystemServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private ReadTests<ConnectionModel> GetTests()\n        {\n            return new ReadTests<ConnectionModel>(\n                _client.Resolve<IFileSystemServices<ConnectionModel>>,\n                _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ReadFileTest0Async()\n        {\n            return GetTests().ReadFileTest0Async();\n        }\n\n        [SkippableFact]\n        public Task ReadFileTest1Async()\n        {\n            Skip.If(true);\n            return GetTests().ReadFileTest1Async();\n        }\n\n        [SkippableFact]\n        public Task ReadFileTest2Async()\n        {\n            Skip.If(true);\n            return GetTests().ReadFileTest2Async();\n        }\n\n        [SkippableFact]\n        public Task ReadFileTest3Async()\n        {\n            Skip.If(true);\n            return GetTests().ReadFileTest3Async();\n        }\n\n        [SkippableFact]\n        public Task ReadFileTest4Async()\n        {\n            Skip.If(true);\n            return GetTests().ReadFileTest4Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/FileSystem/MsgPack/WriteTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.FileSystem.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(FileCollection.Name)]\n    public sealed class WriteTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public WriteTests(FileSystemServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private WriteTests<ConnectionModel> GetTests()\n        {\n            return new WriteTests<ConnectionModel>(\n                _client.Resolve<IFileSystemServices<ConnectionModel>>,\n                _server.GetConnection(), _server.TempPath);\n        }\n\n        private readonly FileSystemServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task WriteFileTest0Async()\n        {\n            return GetTests().WriteFileTest0Async();\n        }\n\n        [SkippableFact]\n        public Task WriteFileTest1Async()\n        {\n            Skip.If(true);\n            return GetTests().WriteFileTest1Async();\n        }\n\n        [SkippableFact]\n        public Task WriteFileTest2Async()\n        {\n            Skip.If(true);\n            return GetTests().WriteFileTest2Async();\n        }\n\n        [Fact]\n        public Task AppendFileTest0Async()\n        {\n            return GetTests().AppendFileTest0Async();\n        }\n\n        [SkippableFact]\n        public Task AppendFileTest1Async()\n        {\n            Skip.If(true);\n            return GetTests().AppendFileTest1Async();\n        }\n\n        [Fact]\n        public Task AppendFileTest2Async()\n        {\n            return GetTests().AppendFileTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/Json/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class NodeServicesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private NodeHistoricalAccessTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalAccessTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetInt16NodeHistoryConfiguration()\n        {\n            return GetTests().HistoryGetInt16NodeHistoryConfigurationAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetInt64NodeHistoryConfigurationAsync()\n        {\n            return GetTests().HistoryGetInt64NodeHistoryConfigurationAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetNodeHistoryConfigurationFromBadNode()\n        {\n            return GetTests().HistoryGetNodeHistoryConfigurationFromBadNodeAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/Json/ReadAtTimesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ReadAtTimesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadAtTimesTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryReadValuesAtTimesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesAtTimesTests<ConnectionModel>(_server,\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest1Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest2Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest3Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest4Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest4Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt32ValuesAtTimesTest1Async()\n        {\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt32ValuesAtTimesTest2Async()\n        {\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/Json/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public sealed class ReadCollection : ICollectionFixture<HistoricalAccessServer>\n    {\n        public const string Name = \"HistoricalAccessServerReadRestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/Json/ReadModifiedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ReadModifiedTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadModifiedTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryReadValuesModifiedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesModifiedTests<ConnectionModel>(_server,\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryReadInt16ValuesModifiedTestAsync()\n        {\n            return GetTests().HistoryReadInt16ValuesModifiedTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt16ValuesModifiedTestAsync()\n        {\n            return GetTests().HistoryStreamInt16ValuesModifiedTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/Json/ReadProcessedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ReadProcessedTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadProcessedTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryReadValuesProcessedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesProcessedTests<ConnectionModel>(_server,\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest1Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest2Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest3Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamUInt64ProcessedValuesTest1Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamUInt64ProcessedValuesTest2Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamUInt64ProcessedValuesTest3Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/Json/ReadValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ReadValuesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadValuesTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryReadValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesTests<ConnectionModel>(_server,\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest1Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest2Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest3Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest4Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest4Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt64ValuesTest1Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt64ValuesTest2Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt64ValuesTest3Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryStreamInt64ValuesTest4Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest4Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/Json/UpdateValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class UpdateValuesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public UpdateValuesTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryUpdateValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryUpdateValuesTests<ConnectionModel>(\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest3Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest4Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest4Async();\n        }\n\n        [Fact]\n        public Task HistoryDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryDeleteUInt32ValuesTest1Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/MsgPack/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class NodeServicesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private NodeHistoricalAccessTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalAccessTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetInt16NodeHistoryConfiguration()\n        {\n            return GetTests().HistoryGetInt16NodeHistoryConfigurationAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetInt64NodeHistoryConfigurationAsync()\n        {\n            return GetTests().HistoryGetInt64NodeHistoryConfigurationAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetNodeHistoryConfigurationFromBadNode()\n        {\n            return GetTests().HistoryGetNodeHistoryConfigurationFromBadNodeAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/MsgPack/ReadAtTimesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ReadAtTimesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadAtTimesTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryReadValuesAtTimesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesAtTimesTests<ConnectionModel>(_server,\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest1Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest2Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest3Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest4Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest4Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt32ValuesAtTimesTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest1Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt32ValuesAtTimesTest2Async()\n        {\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/MsgPack/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public sealed class ReadCollection : ICollectionFixture<HistoricalAccessServer>\n    {\n        public const string Name = \"HistoricalAccessServerReadRestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/MsgPack/ReadModifiedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ReadModifiedTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadModifiedTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryReadValuesModifiedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesModifiedTests<ConnectionModel>(_server,\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryReadInt16ValuesModifiedTestAsync()\n        {\n            return GetTests().HistoryReadInt16ValuesModifiedTestAsync();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt16ValuesModifiedTestAsync()\n        {\n            return GetTests().HistoryStreamInt16ValuesModifiedTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/MsgPack/ReadProcessedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ReadProcessedTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadProcessedTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryReadValuesProcessedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesProcessedTests<ConnectionModel>(_server,\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest1Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest2Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest2Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryReadUInt64ProcessedValuesTest3Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest3Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest1Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest1Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest2Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest2Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest3Async()\n        {\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/MsgPack/ReadValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ReadValuesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ReadValuesTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryReadValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesTests<ConnectionModel>(_server,\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest1Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest2Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest3Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest4Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest4Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest1Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest1Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest2Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest2Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest3Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest3Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest4Async()\n        {\n            return GetTests().HistoryStreamInt64ValuesTest4Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalAccess/MsgPack/UpdateValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalAccess.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class UpdateValuesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public UpdateValuesTests(HistoricalAccessServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private HistoryUpdateValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryUpdateValuesTests<ConnectionModel>(\n                _client.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest3Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest4Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest4Async();\n        }\n\n        [Fact]\n        public Task HistoryDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryDeleteUInt32ValuesTest1Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalEvents/Json/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalEvents.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class NodeServicesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests(HistoricalEventsServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private NodeHistoricalEventsTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalEventsTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalEventsServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalEvents/Json/ReadCollection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalEvents.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public sealed class ReadCollection : ICollectionFixture<HistoricalEventsServer>\n    {\n        public const string Name = \"HistoricalEventsServerReadRestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalEvents/MsgPack/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalEvents.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class NodeServicesTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests(HistoricalEventsServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private NodeHistoricalEventsTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalEventsTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalEventsServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/HistoricalEvents/MsgPack/ReadCollection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.HistoricalEvents.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public sealed class ReadCollection : ICollectionFixture<HistoricalEventsServer>\n    {\n        public const string Name = \"HistoricalEventsServerReadRestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Plc/Json/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Plc.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests1 : IClassFixture<PlcServer>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests1(PlcServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private SimulatorNodesTests<ConnectionModel> GetTests()\n        {\n            return new SimulatorNodesTests<ConnectionModel>(_server,\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly PlcServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task AlternatingBooleanTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().AlternatingBooleanTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task BadNodeHasAlternatingStatusCodeAsync()\n        {\n            return GetTests().BadNodeHasAlternatingStatusCodeAsync();\n        }\n\n        [Fact]\n        public Task FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync();\n        }\n\n        [Fact]\n        public Task FastUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().FastUIntScalar1TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task NegativeTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().NegativeTrendDataNodeHasValueWithTrendAsync();\n        }\n\n        [Fact]\n        public Task NegativeTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().NegativeTrendDataTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task PositiveTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().PositiveTrendDataNodeHasValueWithTrendAsync();\n        }\n\n        [Fact]\n        public Task PositiveTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().PositiveTrendDataTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task RandomSignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomSignedInt32TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task RandomUnsignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomUnsignedInt32TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync();\n        }\n\n        [Fact]\n        public Task SlowUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().SlowUIntScalar1TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInDipDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInDipDataAsync();\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInSpikeDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInSpikeDataAsync();\n        }\n\n        [Fact]\n        public Task TelemetryFastNodeTestAsync()\n        {\n            return GetTests().TelemetryFastNodeTestAsync();\n        }\n\n        [Fact]\n        public Task TelemetryStepUpTestAsync()\n        {\n            return GetTests().TelemetryStepUpTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Plc/Json/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Plc.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests2 : IClassFixture<PlcServer>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests2(PlcServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private PlcModelComplexTypeTests<ConnectionModel> GetTests()\n        {\n            return new PlcModelComplexTypeTests<ConnectionModel>(_server,\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly PlcServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task PlcModelHeaterTestsAsync()\n        {\n            return GetTests().PlcModelHeaterTestsAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Plc/MsgPack/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Plc.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests1 : IClassFixture<PlcServer>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests1(PlcServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private SimulatorNodesTests<ConnectionModel> GetTests()\n        {\n            return new SimulatorNodesTests<ConnectionModel>(_server,\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly PlcServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task AlternatingBooleanTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().AlternatingBooleanTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task BadNodeHasAlternatingStatusCodeAsync()\n        {\n            return GetTests().BadNodeHasAlternatingStatusCodeAsync();\n        }\n\n        [Fact]\n        public Task FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync();\n        }\n\n        [Fact]\n        public Task FastUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().FastUIntScalar1TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task NegativeTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().NegativeTrendDataNodeHasValueWithTrendAsync();\n        }\n\n        [Fact]\n        public Task NegativeTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().NegativeTrendDataTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task PositiveTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().PositiveTrendDataNodeHasValueWithTrendAsync();\n        }\n\n        [Fact]\n        public Task PositiveTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().PositiveTrendDataTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task RandomSignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomSignedInt32TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task RandomUnsignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomUnsignedInt32TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync();\n        }\n\n        [Fact]\n        public Task SlowUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().SlowUIntScalar1TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInDipDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInDipDataAsync();\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInSpikeDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInSpikeDataAsync();\n        }\n\n        [Fact]\n        public Task TelemetryFastNodeTestAsync()\n        {\n            return GetTests().TelemetryFastNodeTestAsync();\n        }\n\n        [Fact]\n        public Task TelemetryStepUpTestAsync()\n        {\n            return GetTests().TelemetryStepUpTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/Plc/MsgPack/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.Plc.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests2 : IClassFixture<PlcServer>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests2(PlcServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private PlcModelComplexTypeTests<ConnectionModel> GetTests()\n        {\n            return new PlcModelComplexTypeTests<ConnectionModel>(_server,\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly PlcServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task PlcModelHeaterTestsAsync()\n        {\n            return GetTests().PlcModelHeaterTestsAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/SimpleEvents/Json/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.SimpleEvents.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests : IClassFixture<SimpleEventsServer>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests(SimpleEventsServer server,\n            PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private SimpleEventsServerTests<ConnectionModel> GetTests()\n        {\n            return new SimpleEventsServerTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly SimpleEventsServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleEventsQueryTestAsync()\n        {\n            return GetTests().CompileSimpleEventsQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/SimpleEvents/MsgPack/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.SimpleEvents.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests : IClassFixture<SimpleEventsServer>, IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public NodeServicesTests(SimpleEventsServer server,\n            PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private SimpleEventsServerTests<ConnectionModel> GetTests()\n        {\n            return new SimpleEventsServerTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly SimpleEventsServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleEventsQueryTestAsync()\n        {\n            return GetTests().CompileSimpleEventsQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/BrowsePathTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class BrowsePathTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public BrowsePathTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private BrowsePathTests<ConnectionModel> GetTests()\n        {\n            return new BrowsePathTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test3Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethodsTestAsync()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethodsTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/BrowseStreamTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class BrowseStreamTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public BrowseStreamTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private BrowseStreamTests<ConnectionModel> GetTests()\n        {\n            return new BrowseStreamTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            return GetTests().NodeBrowseInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            return GetTests().NodeBrowseInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter3Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter4Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter5Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter5Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsOperationsTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class BrowseTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public BrowseTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private BrowseServicesTests<ConnectionModel> GetTests()\n        {\n            return new BrowseServicesTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                    _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            return GetTests().NodeBrowseInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            return GetTests().NodeBrowseInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest1Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest2Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest3Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest4Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test1Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test2Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesWithValuesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesWithValuesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesRawModeTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesRawModeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest1Async()\n        {\n            return GetTests().NodeBrowseContinuationTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest2Async()\n        {\n            return GetTests().NodeBrowseContinuationTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest3Async()\n        {\n            return GetTests().NodeBrowseContinuationTest3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest4Async()\n        {\n            return GetTests().NodeBrowseContinuationTest4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsInfoTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/CallArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public sealed class CallArrayTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public CallArrayTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test5Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/CallScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public sealed class CallScalarTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public CallScalarTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test5Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler2ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler2ResetTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler1ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler1ResetTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/ExpandTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ExpandTests1 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ExpandTests1(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private ConfigurationTests1 GetTests()\n        {\n            return new ConfigurationTests1(_client.Resolve<IConfigurationServices>(),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ExpandObjectWithBrowsePathTest1Async()\n        {\n            return GetTests().ExpandObjectWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithBrowsePathTest2Async()\n        {\n            return GetTests().ExpandObjectWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectTest1Async()\n        {\n            return GetTests().ExpandObjectTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectTest2Async()\n        {\n            return GetTests().ExpandObjectTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest1Async()\n        {\n            return GetTests().ExpandServerObjectTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest2Async()\n        {\n            return GetTests().ExpandServerObjectTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest3Async()\n        {\n            return GetTests().ExpandServerObjectTest3Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest4Async()\n        {\n            return GetTests().ExpandServerObjectTest4Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest5Async()\n        {\n            return GetTests().ExpandServerObjectTest5Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectTypeTest1Async()\n        {\n            return GetTests().ExpandBaseObjectTypeTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectTypeTest2Async()\n        {\n            return GetTests().ExpandBaseObjectTypeTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectsAndObjectTypesTestAsync()\n        {\n            return GetTests().ExpandBaseObjectsAndObjectTypesTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerDrumTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerDrumTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerDrumAndValveTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerDrumAndValveTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandValveTypeTestAsync()\n        {\n            return GetTests().ExpandValveTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandTestDataObjectTypeTestAsync()\n        {\n            return GetTests().ExpandTestDataObjectTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandServerTypeTestAsync()\n        {\n            return GetTests().ExpandServerTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandServerTypeWithMethodsTestAsync()\n        {\n            return GetTests().ExpandServerTypeWithMethodsTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandPublishSubscribeTestAsync()\n        {\n            return GetTests().ExpandPublishSubscribeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandVariablesTest1Async()\n        {\n            return GetTests().ExpandVariablesTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariablesAndObjectsTest1Async()\n        {\n            return GetTests().ExpandVariablesAndObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest1Async()\n        {\n            return GetTests().ExpandVariableTypesTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest2Async()\n        {\n            return GetTests().ExpandVariableTypesTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest3Async()\n        {\n            return GetTests().ExpandVariableTypesTest3Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithNoObjectsTest1Async()\n        {\n            return GetTests().ExpandObjectWithNoObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithNoObjectsTest2Async()\n        {\n            return GetTests().ExpandObjectWithNoObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandEmptyEntryTest1Async()\n        {\n            return GetTests().ExpandEmptyEntryTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandEmptyEntryTest2Async()\n        {\n            return GetTests().ExpandEmptyEntryTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest1Async()\n        {\n            return GetTests().ExpandBadNodeIdTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest2Async()\n        {\n            return GetTests().ExpandBadNodeIdTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest3Async()\n        {\n            return GetTests().ExpandBadNodeIdTest3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/MetadataArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class MetadataArrayTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public MetadataArrayTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n               _client.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/MetadataScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class MetadataScalarTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public MetadataScalarTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n               _client.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/MetadataTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class MetadataTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public MetadataTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private NodeMetadataTests<ConnectionModel> GetTests()\n        {\n            return new NodeMetadataTests<ConnectionModel>(\n               _client.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForFolderTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForFolderTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerObjectTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerObjectTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForConditionTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForConditionTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataTestForBaseEventTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataTestForBaseEventTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseInterfaceTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseInterfaceTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseDataVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseDataVariableTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForPropertyTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForPropertyTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForAudioVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForAudioVariableTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerStatusVariableTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerStatusVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForRedundancySupportPropertyTestAsync()\n        {\n            return GetTests().NodeGetMetadataForRedundancySupportPropertyTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public sealed class ReadCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataServerReadRestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/ValueReadArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ValueReadArrayTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ValueReadArrayTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private ReadArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadArrayValueTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableNodeClassTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableAccessLevelTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArraySByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStructureValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUIntegerValueVariableTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/ValueReadScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ValueReadScalarTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ValueReadScalarTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private ReadScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadScalarValueTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableNodeClassTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableAccessLevelTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarSByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStructuredValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDataAccessMeasurementFloatValueTestAsync()\n        {\n            return GetTests().NodeReadDataAccessMeasurementFloatValueTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsDebugTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsDebugTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/ValueWriteArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public sealed class ValueWriteArrayTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ValueWriteArrayTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private WriteArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteArrayValueTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeWriteStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArraySByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayVariantValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayVariantValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStructureValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/ValueWriteScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public sealed class ValueWriteScalarTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ValueWriteScalarTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.Json);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private WriteScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteScalarValueTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarSByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStructuredValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUIntegerValueVariableTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/Json/WriteCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.Json\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public sealed class WriteCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataServerWriteRestJson\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/BrowsePathTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class BrowsePathTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public BrowsePathTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private BrowsePathTests<ConnectionModel> GetTests()\n        {\n            return new BrowsePathTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test3Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethodsTestAsync()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethodsTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/BrowseStreamTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class BrowseStreamTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public BrowseStreamTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private BrowseStreamTests<ConnectionModel> GetTests()\n        {\n            return new BrowseStreamTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            return GetTests().NodeBrowseInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            return GetTests().NodeBrowseInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter3Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter4Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter5Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter5Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsOperationsTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class BrowseTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public BrowseTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private BrowseServicesTests<ConnectionModel> GetTests()\n        {\n            return new BrowseServicesTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                    _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            return GetTests().NodeBrowseInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            return GetTests().NodeBrowseInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest1Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest2Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest3Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest4Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test1Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test2Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesWithValuesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesWithValuesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesRawModeTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesRawModeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest1Async()\n        {\n            return GetTests().NodeBrowseContinuationTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest2Async()\n        {\n            return GetTests().NodeBrowseContinuationTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest3Async()\n        {\n            return GetTests().NodeBrowseContinuationTest3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest4Async()\n        {\n            return GetTests().NodeBrowseContinuationTest4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsInfoTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/CallArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public sealed class CallArrayTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public CallArrayTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test5Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/CallScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public sealed class CallScalarTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public CallScalarTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test5Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler2ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler2ResetTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler1ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler1ResetTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/ExpandTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ExpandTests1 : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ExpandTests1(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private ConfigurationTests1 GetTests()\n        {\n            return new ConfigurationTests1(_client.Resolve<IConfigurationServices>(),\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task ExpandObjectWithBrowsePathTest1Async()\n        {\n            return GetTests().ExpandObjectWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithBrowsePathTest2Async()\n        {\n            return GetTests().ExpandObjectWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectTest1Async()\n        {\n            return GetTests().ExpandObjectTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectTest2Async()\n        {\n            return GetTests().ExpandObjectTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest1Async()\n        {\n            return GetTests().ExpandServerObjectTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest2Async()\n        {\n            return GetTests().ExpandServerObjectTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest3Async()\n        {\n            return GetTests().ExpandServerObjectTest3Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest4Async()\n        {\n            return GetTests().ExpandServerObjectTest4Async();\n        }\n\n        [Fact]\n        public Task ExpandServerObjectTest5Async()\n        {\n            return GetTests().ExpandServerObjectTest5Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectTypeTest1Async()\n        {\n            return GetTests().ExpandBaseObjectTypeTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectTypeTest2Async()\n        {\n            return GetTests().ExpandBaseObjectTypeTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBaseObjectsAndObjectTypesTestAsync()\n        {\n            return GetTests().ExpandBaseObjectsAndObjectTypesTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerDrumTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerDrumTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandBoilerDrumAndValveTypeTestAsync()\n        {\n            return GetTests().ExpandBoilerDrumAndValveTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandValveTypeTestAsync()\n        {\n            return GetTests().ExpandValveTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandTestDataObjectTypeTestAsync()\n        {\n            return GetTests().ExpandTestDataObjectTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandServerTypeTestAsync()\n        {\n            return GetTests().ExpandServerTypeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandServerTypeWithMethodsTestAsync()\n        {\n            return GetTests().ExpandServerTypeWithMethodsTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandPublishSubscribeTestAsync()\n        {\n            return GetTests().ExpandPublishSubscribeTestAsync();\n        }\n\n        [Fact]\n        public Task ExpandVariablesTest1Async()\n        {\n            return GetTests().ExpandVariablesTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariablesAndObjectsTest1Async()\n        {\n            return GetTests().ExpandVariablesAndObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest1Async()\n        {\n            return GetTests().ExpandVariableTypesTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest2Async()\n        {\n            return GetTests().ExpandVariableTypesTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandVariableTypesTest3Async()\n        {\n            return GetTests().ExpandVariableTypesTest3Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithNoObjectsTest1Async()\n        {\n            return GetTests().ExpandObjectWithNoObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandObjectWithNoObjectsTest2Async()\n        {\n            return GetTests().ExpandObjectWithNoObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandEmptyEntryTest1Async()\n        {\n            return GetTests().ExpandEmptyEntryTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandEmptyEntryTest2Async()\n        {\n            return GetTests().ExpandEmptyEntryTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest1Async()\n        {\n            return GetTests().ExpandBadNodeIdTest1Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest2Async()\n        {\n            return GetTests().ExpandBadNodeIdTest2Async();\n        }\n\n        [Fact]\n        public Task ExpandBadNodeIdTest3Async()\n        {\n            return GetTests().ExpandBadNodeIdTest3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/MetadataArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class MetadataArrayTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public MetadataArrayTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n               _client.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/MetadataScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class MetadataScalarTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public MetadataScalarTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n               _client.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/MetadataTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class MetadataTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public MetadataTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private NodeMetadataTests<ConnectionModel> GetTests()\n        {\n            return new NodeMetadataTests<ConnectionModel>(\n               _client.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForFolderTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForFolderTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerObjectTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerObjectTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForConditionTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForConditionTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataTestForBaseEventTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataTestForBaseEventTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseInterfaceTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseInterfaceTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseDataVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseDataVariableTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForPropertyTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForPropertyTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForAudioVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForAudioVariableTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerStatusVariableTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerStatusVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForRedundancySupportPropertyTestAsync()\n        {\n            return GetTests().NodeGetMetadataForRedundancySupportPropertyTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public sealed class ReadCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataServerReadRestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/ValueReadArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ValueReadArrayTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ValueReadArrayTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private ReadArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadArrayValueTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableNodeClassTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableAccessLevelTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArraySByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStructureValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUIntegerValueVariableTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/ValueReadScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class ValueReadScalarTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ValueReadScalarTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private ReadScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadScalarValueTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableNodeClassTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableAccessLevelTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarSByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStructuredValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDataAccessMeasurementFloatValueTestAsync()\n        {\n            return GetTests().NodeReadDataAccessMeasurementFloatValueTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsDebugTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsDebugTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/ValueWriteArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public sealed class ValueWriteArrayTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ValueWriteArrayTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private WriteArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteArrayValueTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeWriteStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArraySByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayVariantValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayVariantValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStructureValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/ValueWriteScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public sealed class ValueWriteScalarTests : IClassFixture<PublisherModuleFixture>, IDisposable\n    {\n        public ValueWriteScalarTests(TestDataServer server, PublisherModuleFixture module, ITestOutputHelper output)\n        {\n            _server = server;\n            _client = module.CreateRestClientContainer(output, TestSerializerType.MsgPack);\n        }\n\n        public void Dispose()\n        {\n            _client.Dispose();\n        }\n\n        private WriteScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteScalarValueTests<ConnectionModel>(\n                _client.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly IContainer _client;\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarSByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStructuredValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUIntegerValueVariableTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Controller/TestData/MsgPack/WriteCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Controller.TestData.MsgPack\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public sealed class WriteCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataServerWriteRestMsgPack\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Fixtures/PublisherIntegrationTestBase.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Autofac;\n    using Furly.Extensions.Mqtt;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Microsoft.Extensions.Logging;\n    using Neovolve.Logging.Xunit;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Text.Json;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// Json message\n    /// </summary>\n    /// <param name=\"Topic\"></param>\n    /// <param name=\"Message\"></param>\n    /// <param name=\"ContentType\"></param>\n    public readonly record struct JsonMessage(string Topic, JsonElement Message, string ContentType);\n\n    /// <summary>\n    /// Base class for integration testing, it connects to the server, runs\n    /// publisher and injects mocked IoTHub services.\n    /// </summary>\n    public class PublisherIntegrationTestBase : IDisposable\n    {\n        protected string EndpointUrl { get; set; }\n        protected CancellationToken Ct => _cts.Token;\n\n        /// <summary>\n        /// Create fixture\n        /// </summary>\n        /// <param name=\"testOutputHelper\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <param name=\"testName\"></param>\n        public PublisherIntegrationTestBase(ITestOutputHelper testOutputHelper,\n            TimeSpan? timeout = null, string testName = null)\n        {\n            _cts = new CancellationTokenSource(timeout ?? kTotalTestTimeout);\n            _testOutputHelper = testOutputHelper;\n            _logFactory = LogFactory.Create(testOutputHelper, Logging.Config);\n            _logger = _logFactory.CreateLogger(testName ?? \"PublisherIntegrationTest\");\n        }\n\n        /// <summary>\n        /// Dispose\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing && !_disposedValue)\n            {\n                _disposedValue = true;\n\n                if (_cts.IsCancellationRequested)\n                {\n                    _logger.TestTimeout();\n                }\n\n                if (_publisher != null)\n                {\n                    StopPublisherAsync().WaitAsync(TimeSpan.FromMinutes(1)).GetAwaiter().GetResult();\n                }\n\n                _cts.Dispose();\n                _logFactory.Dispose();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Get one message from running publisher\n        /// </summary>\n        /// <param name=\"test\"></param>\n        /// <param name=\"publishedNodesFile\"></param>\n        /// <param name=\"predicate\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"arguments\"></param>\n        /// <returns></returns>\n        protected Task<List<JsonMessage>> ProcessMessagesAsync(string test, string publishedNodesFile,\n            Func<JsonElement, JsonElement> predicate = null, string messageType = null,\n            string[] arguments = default)\n        {\n            // Collect messages from server with default settings\n            return ProcessMessagesAsync(test, publishedNodesFile, kTelemetryTimeout, 1,\n                predicate, messageType, arguments);\n        }\n\n        /// <summary>\n        /// Get one message from a running publisher\n        /// </summary>\n        /// <param name=\"test\"></param>\n        /// <param name=\"publishedNodesFile\"></param>\n        /// <param name=\"predicate\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"arguments\"></param>\n        /// <param name=\"version\"></param>\n        /// <returns></returns>\n        protected Task<(JsonMessage? Metadata, List<JsonMessage> Messages)> ProcessMessagesAndMetadataAsync(\n            string test, string publishedNodesFile, Func<JsonElement, JsonElement> predicate = null,\n            string messageType = null, string[] arguments = default, MqttVersion? version = null)\n        {\n            // Collect messages from server with default settings\n            return ProcessMessagesAndMetadataAsync(test, publishedNodesFile, kTelemetryTimeout, 1,\n                predicate, messageType, arguments, version);\n        }\n\n        /// <summary>\n        /// Process messages and return\n        /// </summary>\n        /// <param name=\"test\"></param>\n        /// <param name=\"publishedNodesFile\"></param>\n        /// <param name=\"messageCollectionTimeout\"></param>\n        /// <param name=\"messageCount\"></param>\n        /// <param name=\"predicate\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"arguments\"></param>\n        /// <returns></returns>\n        protected async Task<List<JsonMessage>> ProcessMessagesAsync(string test, string publishedNodesFile,\n            TimeSpan messageCollectionTimeout, int messageCount, Func<JsonElement, JsonElement> predicate = null,\n            string messageType = null, string[] arguments = default)\n        {\n            var (_, messages) = await ProcessMessagesAndMetadataAsync(test, publishedNodesFile,\n                messageCollectionTimeout, messageCount, predicate, messageType, arguments).ConfigureAwait(false);\n            return messages;\n        }\n\n        /// <summary>\n        /// Start publisher and wait for messages and return them\n        /// </summary>\n        /// <param name=\"test\"></param>\n        /// <param name=\"publishedNodesFile\"></param>\n        /// <param name=\"messageCollectionTimeout\"></param>\n        /// <param name=\"messageCount\"></param>\n        /// <param name=\"predicate\"></param>\n        /// <param name=\"messageType\"></param>\n        /// <param name=\"arguments\"></param>\n        /// <param name=\"version\"></param>\n        /// <returns></returns>\n        protected async Task<(JsonMessage? Metadata, List<JsonMessage> Messages)> ProcessMessagesAndMetadataAsync(\n            string test, string publishedNodesFile, TimeSpan messageCollectionTimeout, int messageCount,\n            Func<JsonElement, JsonElement> predicate = null, string messageType = null, string[] arguments = default,\n            MqttVersion? version = null)\n        {\n            StartPublisher(test, publishedNodesFile, arguments, version);\n            try\n            {\n                return await WaitForMessagesAndMetadataAsync(messageCollectionTimeout,\n                    messageCount, predicate, messageType).ConfigureAwait(false);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        /// <summary>\n        /// Wait for one message\n        /// </summary>\n        /// <param name=\"predicate\"></param>\n        /// <param name=\"messageType\"></param>\n        protected Task<List<JsonMessage>> WaitForMessagesAsync(\n            Func<JsonElement, JsonElement> predicate = null, string messageType = null)\n        {\n            // Collect messages from server with default settings\n            return WaitForMessagesAsync(kTelemetryTimeout, 1, predicate, messageType);\n        }\n\n        /// <summary>\n        /// Wait for one message\n        /// </summary>\n        /// <param name=\"messageCollectionTimeout\"></param>\n        /// <param name=\"messageCount\"></param>\n        /// <param name=\"predicate\"></param>\n        /// <param name=\"messageType\"></param>\n        protected async Task<List<JsonMessage>> WaitForMessagesAsync(TimeSpan messageCollectionTimeout,\n            int messageCount, Func<JsonElement, JsonElement> predicate = null, string messageType = null)\n        {\n            // Collect messages from server with default settings\n            var (_, messages) = await WaitForMessagesAndMetadataAsync(messageCollectionTimeout,\n                messageCount, predicate, messageType).ConfigureAwait(false);\n            return messages;\n        }\n\n        /// <summary>\n        /// Wait for messages\n        /// </summary>\n        /// <param name=\"messageCollectionTimeout\"></param>\n        /// <param name=\"messageCount\"></param>\n        /// <param name=\"predicate\"></param>\n        /// <param name=\"messageType\"></param>\n        protected async Task<(JsonMessage? Metadata, List<JsonMessage> Messages)> WaitForMessagesAndMetadataAsync(\n            TimeSpan messageCollectionTimeout, int messageCount, Func<JsonElement, JsonElement> predicate = null,\n            string messageType = null)\n        {\n            var stopWatch = new Stopwatch();\n            stopWatch.Start();\n            var messages = new List<JsonMessage>();\n\n            JsonMessage? metadata = null;\n            using var cts = new CancellationTokenSource(messageCollectionTimeout);\n            try\n            {\n                await foreach (var evt in _publisher.ReadTelemetryAsync(cts.Token))\n                {\n                    if (evt.Properties.TryGetValue(Constants.MessagePropertySchemaKey, out var schematype) &&\n                        schematype != MessageSchemaTypes.NetworkMessageJson &&\n                        schematype != MessageSchemaTypes.MonitoredItemMessageJson &&\n                        schematype != MessageSchemaTypes.NetworkMessageUadp)\n                    {\n                        continue;\n                    }\n                    if (evt.Data.IsEmpty)\n                    {\n                        // Skip empty messages\n                        continue;\n                    }\n                    var json = Encoding.UTF8.GetString(evt.Data.ToArray());\n                    var document = JsonDocument.Parse(json);\n                    json = JsonSerializer.Serialize(document, kIndented);\n                    var element = document.RootElement;\n                    if (element.ValueKind == JsonValueKind.Array)\n                    {\n                        foreach (var item in element.EnumerateArray())\n                        {\n                            Add(messages, item, ref metadata, predicate, messageType, _messageIds,\n                                evt.Topic, evt.ContentType);\n                        }\n                    }\n                    else if (element.ValueKind == JsonValueKind.Object)\n                    {\n                        Add(messages, element, ref metadata, predicate, messageType, _messageIds,\n                            evt.Topic, evt.ContentType);\n                    }\n                    if (messages.Count >= messageCount)\n                    {\n                        break;\n                    }\n                }\n            }\n            catch (OperationCanceledException) { }\n            _logger.MessagesReceived(messages.Count, stopWatch.Elapsed);\n            return (metadata, messages.Take(messageCount).ToList());\n\n            static void Add(List<JsonMessage> messages, JsonElement item, ref JsonMessage? metadata,\n                Func<JsonElement, JsonElement> predicate, string messageType, HashSet<string> messageIds,\n                string topic, string contentType)\n            {\n                if (messageType != null)\n                {\n                    if (item.TryGetProperty(\"MessageType\", out var v))\n                    {\n                        var type = v.GetString();\n                        if (type == \"ua-metadata\")\n                        {\n                            metadata = new JsonMessage(topic, item, contentType);\n                        }\n                        if (type != messageType)\n                        {\n                            return;\n                        }\n                    }\n                    if (item.TryGetProperty(\"MessageId\", out var id))\n                    {\n                        Assert.True(messageIds.Add(id.GetString()));\n                    }\n                }\n                var add = item;\n                if (predicate != null)\n                {\n                    add = predicate(item);\n                }\n                if (add.ValueKind == JsonValueKind.Object)\n                {\n                    messages.Add(new JsonMessage(topic, add, contentType));\n                }\n            }\n        }\n\n        private static readonly JsonSerializerOptions kIndented = new()\n        {\n            WriteIndented = true\n        };\n\n        /// <summary>\n        /// Start publisher\n        /// </summary>\n        /// <param name=\"test\"></param>\n        /// <param name=\"publishedNodesFile\"></param>\n        /// <param name=\"arguments\"></param>\n        /// <param name=\"version\"></param>\n        /// <param name=\"reverseConnectPort\"></param>\n        /// <param name=\"keepAliveInterval\"></param>\n        /// <param name=\"securityMode\"></param>\n        protected void StartPublisher(string test, string publishedNodesFile = null,\n            string[] arguments = default, MqttVersion? version = null, int? reverseConnectPort = null,\n            int keepAliveInterval = 120, SecurityMode? securityMode = null)\n        {\n            var sw = Stopwatch.StartNew();\n            _logger = _logFactory.CreateLogger(test);\n\n            arguments ??= [];\n            _publishedNodesFilePath = Path.GetTempFileName();\n            WritePublishedNodes(test, publishedNodesFile, reverseConnectPort != null, securityMode);\n\n            arguments =\n            [\n                .. arguments,\n                .. new[]\n                {\n                    $\"--pf={_publishedNodesFilePath}\"\n                },\n            ];\n\n            if (OperatingSystem.IsLinux())\n            {\n                arguments = [.. arguments, \"--pol\"];\n            }\n\n            if (reverseConnectPort != null)\n            {\n                arguments =\n                [\n                    .. arguments,\n                    .. new[]\n                    {\n                        $\"--rcp={reverseConnectPort.Value}\"\n                    },\n                ];\n            }\n\n            _publisher = new PublisherModule(null, null, null, null,\n                _testOutputHelper, arguments, version, keepAliveInterval);\n            _logger.PublisherStarted(sw.Elapsed);\n        }\n\n        /// <summary>\n        /// Update published nodes file\n        /// </summary>\n        /// <param name=\"test\"></param>\n        /// <param name=\"publishedNodesFile\"></param>\n        /// <param name=\"useReverseConnect\"></param>\n        /// <param name=\"securityMode\"></param>\n        protected void WritePublishedNodes(string test, string publishedNodesFile, bool useReverseConnect = false,\n            SecurityMode? securityMode = null)\n        {\n            if (!string.IsNullOrEmpty(publishedNodesFile))\n            {\n                var pnJson = File.ReadAllText(publishedNodesFile)\n                    .Replace(\"\\\"{{UseReverseConnect}}\\\"\", useReverseConnect ? \"true\" : \"false\", StringComparison.Ordinal)\n                    .Replace(\"{{EndpointUrl}}\", EndpointUrl, StringComparison.Ordinal)\n                    .Replace(\"{{SecurityMode}}\", (securityMode ?? SecurityMode.None).ToString(), StringComparison.Ordinal)\n                    .Replace(\"{{DataSetWriterGroup}}\", test, StringComparison.Ordinal);\n                File.WriteAllText(_publishedNodesFilePath, pnJson);\n            }\n        }\n\n        /// <summary>\n        /// Get publisher api\n        /// </summary>\n        protected IPublisherApi PublisherApi => _publisher?.ClientContainer?.Resolve<IPublisherApi>();\n\n        /// <summary>\n        /// Stop publisher\n        /// </summary>\n        protected async Task StopPublisherAsync()\n        {\n            if (_publisher != null)\n            {\n                var sw = Stopwatch.StartNew();\n\n                await _publisher.DisposeAsync();\n                _publisher = null;\n\n                if (File.Exists(_publishedNodesFilePath))\n                {\n                    File.Delete(_publishedNodesFilePath);\n                }\n                _logger.PublisherStopped(sw.Elapsed);\n            }\n        }\n\n        /// <summary>\n        /// Get endpoints from file\n        /// </summary>\n        /// <param name=\"test\"></param>\n        /// <param name=\"publishedNodesFile\"></param>\n        /// <param name=\"useReverseConnect\"></param>\n        /// <param name=\"securityMode\"></param>\n        /// <returns></returns>\n        protected PublishedNodesEntryModel[] GetEndpointsFromFile(string test, string publishedNodesFile,\n            bool useReverseConnect = false, SecurityMode? securityMode = null)\n        {\n            IJsonSerializer serializer = new NewtonsoftJsonSerializer();\n            var fileContent = File.ReadAllText(publishedNodesFile)\n                .Replace(\"\\\"{{UseReverseConnect}}\\\"\", useReverseConnect ? \"true\" : \"false\", StringComparison.Ordinal)\n                .Replace(\"{{EndpointUrl}}\", EndpointUrl, StringComparison.Ordinal)\n                .Replace(\"{{SecurityMode}}\", (securityMode ?? SecurityMode.None).ToString(), StringComparison.Ordinal)\n                .Replace(\"{{DataSetWriterGroup}}\", test, StringComparison.Ordinal);\n            return serializer.Deserialize<PublishedNodesEntryModel[]>(fileContent);\n        }\n\n        private static readonly TimeSpan kTelemetryTimeout = TimeSpan.FromMinutes(2);\n        private static readonly TimeSpan kTotalTestTimeout = TimeSpan.FromMinutes(5);\n        private readonly CancellationTokenSource _cts;\n        private readonly ITestOutputHelper _testOutputHelper;\n        private readonly HashSet<string> _messageIds = [];\n        private readonly ILoggerFactory _logFactory;\n        private ILogger _logger;\n        private PublisherModule _publisher;\n        private string _publishedNodesFilePath;\n        private bool _disposedValue;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for PublisherIntegrationTestBase\n    /// </summary>\n    internal static partial class PublisherIntegrationTestLogging\n    {\n        private const int EventClass = 0;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"OperationCanceledException thrown due to test time out.\")]\n        public static partial void TestTimeout(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Received {MessageCount} messages in {Elapsed}.\")]\n        public static partial void MessagesReceived(this ILogger logger, int messageCount, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Publisher started in {Elapsed}.\")]\n        public static partial void PublisherStarted(this ILogger logger, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Publisher stopped in {Elapsed}.\")]\n        public static partial void PublisherStopped(this ILogger logger, TimeSpan elapsed);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Fixtures/PublisherModule.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Clients;\n    using Azure.IIoT.OpcUa.Publisher.Module.Runtime;\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Azure.IIoT.OpcUa.Publisher.Sdk.Clients;\n    using Azure.IIoT.OpcUa.Publisher.Service.Clients.Adapters;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Runtime;\n    using Autofac;\n    using Autofac.Extensions.DependencyInjection;\n    using Furly.Azure;\n    using Furly.Azure.IoT;\n    using Furly.Azure.IoT.Edge;\n    using Furly.Azure.IoT.Mock;\n    using Furly.Azure.IoT.Mock.Services;\n    using Furly.Azure.IoT.Models;\n    using Furly.Extensions.Hosting;\n    using Furly.Extensions.Messaging;\n    using Furly.Extensions.Mqtt;\n    using Furly.Extensions.Mqtt.Clients;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Utils;\n    using Furly.Tunnel.Protocol;\n    using Microsoft.AspNetCore.Hosting;\n    using Microsoft.AspNetCore.Mvc.Testing;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Hosting;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Neovolve.Logging.Xunit;\n    using Opc.Ua;\n    using System;\n    using System.Buffers;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Net.Http;\n    using System.Net.Http.Headers;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Channels;\n    using System.Threading.Tasks;\n    using Xunit.Abstractions;\n\n    /// <summary>\n    /// Publisher telemetry\n    /// </summary>\n    /// <param name=\"DeviceId\"></param>\n    /// <param name=\"ModuleId\"></param>\n    /// <param name=\"Topic\"></param>\n    /// <param name=\"Data\"></param>\n    /// <param name=\"ContentType\"></param>\n    /// <param name=\"ContentEncoding\"></param>\n    /// <param name=\"Properties\"></param>\n    public sealed record class PublisherTelemetry(string DeviceId, string ModuleId,\n        string Topic, ReadOnlySequence<byte> Data, string ContentType, string ContentEncoding,\n        IReadOnlyDictionary<string, string> Properties);\n\n    /// <summary>\n    /// Opc Publisher module fixture\n    /// </summary>\n    public sealed class PublisherModule : WebApplicationFactory<ModuleStartup>, IHttpClientFactory\n    {\n        /// <summary>\n        /// Sdk target\n        /// </summary>\n        public string Target { get; }\n\n        /// <summary>\n        /// Current directory\n        /// </summary>\n        public string CurrentDirectory { get; }\n\n        /// <summary>\n        /// ServerPkiRootPath\n        /// </summary>\n        public string ServerPkiRootPath { get; }\n\n        /// <summary>\n        /// ClientPkiRootPath\n        /// </summary>\n        public string ClientPkiRootPath { get; }\n\n        /// <summary>\n        /// Hub container\n        /// </summary>\n        public IContainer ClientContainer { get; }\n\n        /// <summary>\n        /// Create fixture\n        /// </summary>\n        /// <param name=\"messageSink\"></param>\n        /// <param name=\"devices\"></param>\n        /// <param name=\"deviceId\"></param>\n        /// <param name=\"moduleId\"></param>\n        /// <param name=\"testOutputHelper\"></param>\n        /// <param name=\"arguments\"></param>\n        /// <param name=\"version\"></param>\n        /// <param name=\"keepAliveInterval\"></param>\n        public PublisherModule(IMessageSink messageSink, IEnumerable<DeviceTwinModel> devices = null,\n            string deviceId = null, string moduleId = null, ITestOutputHelper testOutputHelper = null,\n            string[] arguments = default, MqttVersion? version = null, int keepAliveInterval = 120)\n        {\n            _logFactory = testOutputHelper != null ? LogFactory.Create(testOutputHelper, Logging.Config) : null;\n            ClientContainer = CreateIoTHubSdkClientContainer(messageSink, testOutputHelper, devices, version);\n\n            // Create module identitity\n            deviceId ??= Utils.GetHostName();\n            moduleId ??= Guid.NewGuid().ToString();\n            arguments ??= [];\n\n            var publisherModule = new DeviceTwinModel\n            {\n                Id = deviceId,\n                ModuleId = moduleId\n            };\n\n            var service = ClientContainer.Resolve<IIoTHubTwinServices>();\n            var twin = service.CreateOrUpdateAsync(publisherModule).AsTask().GetAwaiter().GetResult();\n            var device = service.GetRegistrationAsync(twin.Id, twin.ModuleId).AsTask().GetAwaiter().GetResult();\n\n            _useMqtt = version != null;\n            if (_useMqtt)\n            {\n                // Resolve the mqtt server to make sure it is running\n                _ = ClientContainer.Resolve<MqttServer>().GetAwaiter().GetResult();\n            }\n\n            CurrentDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());\n            if (!Directory.Exists(CurrentDirectory))\n            {\n                Directory.CreateDirectory(CurrentDirectory);\n            }\n\n            ServerPkiRootPath = Path.Combine(CurrentDirectory, \"pki\",\n                Guid.NewGuid().ToByteArray().ToBase16String());\n            ClientPkiRootPath = Path.Combine(CurrentDirectory, \"pki\",\n                Guid.NewGuid().ToByteArray().ToBase16String());\n\n            // Create a virtual connection betwenn publisher module and hub\n            var hub = ClientContainer.Resolve<IIoTHub>();\n            _connection = hub.Connect(device.Id, device.ModuleId);\n\n            // Start module\n            var edgeHubCs = ConnectionString.CreateModuleConnectionString(\n                \"test.test.org\", device.Id, device.ModuleId, device.PrimaryKey);\n            var mqttOptions = ClientContainer.Resolve<IOptions<MqttOptions>>();\n            var mqttCs = $\"HostName={mqttOptions.Value.HostName};Port={mqttOptions.Value.Port};\" +\n                $\"UserName={mqttOptions.Value.UserName};Password={mqttOptions.Value.Password};\" +\n                $\"UseTls={mqttOptions.Value.UseTls};Protocol={mqttOptions.Value.Protocol};\" +\n                $\"Partitions={mqttOptions.Value.NumberOfClientPartitions};\" +\n                $\"KeepAlivePeriod={mqttOptions.Value.KeepAlivePeriod}\"\n                ;\n            var publisherId = Guid.NewGuid().ToString();\n            arguments =\n            [\n                .. arguments,\n                .. new[]\n                {\n                    $\"--id={publisherId}\",\n                    $\"--ec={edgeHubCs}\",\n                    $\"--mqc={mqttCs}\",\n                    $\"--ki={keepAliveInterval}\",\n                    \"--aa\"\n                },\n            ];\n            if (OperatingSystem.IsLinux())\n            {\n                arguments = [.. arguments, \"--pol\"];\n            }\n            if (_useMqtt)\n            {\n                arguments = [.. arguments, \"-t=Mqtt\"];\n            }\n\n            if (!arguments.Any(a =>\n                a.StartsWith(\"-f=\", StringComparison.Ordinal) ||\n                a.StartsWith(\"--pf=\", StringComparison.Ordinal) ||\n                a.StartsWith(\"--publishfile=\", StringComparison.Ordinal)))\n            {\n                arguments =\n                [\n                    .. arguments,\n                    \"--cf\",\n                    \"--pf=\" +\n                        Path.Combine(CurrentDirectory, \"publishednodes.json\"),\n                ];\n            }\n\n            var configBuilder = new ConfigurationBuilder()\n                .AddInMemoryCollection(new Dictionary<string, string>\n                {\n                    { \"PkiRootPath\", ClientPkiRootPath }\n                })\n                .AddInMemoryCollection(new CommandLine(arguments))\n                ;\n\n            _config = configBuilder.Build();\n            _ = Server; // Ensure server is created\n\n            // Register with the telemetry handler to receive telemetry events\n            if (!_useMqtt)\n            {\n                var register = ClientContainer.Resolve<IEventRegistration<IIoTHubTelemetryHandler>>();\n                _telemetry = new IoTHubTelemetryHandler();\n                _handler1 = register.Register(_telemetry);\n                Target = Furly.Azure.HubResource.Format(null, device.Id, device.ModuleId);\n            }\n            else\n            {\n                _consumer = new EventConsumer();\n                var register = ClientContainer.Resolve<IEventSubscriber>();\n                var options = Resolve<IOptions<PublisherOptions>>();\n\n                var topicBuilder = new TopicBuilder(options.Value);\n                _handler2 = register.SubscribeAsync(topicBuilder.RootTopic + \"/messages/#\", _consumer)\n                    .AsTask().GetAwaiter().GetResult();\n                Target = topicBuilder.MethodTopic;\n            }\n        }\n\n        /// <inheritdoc/>\n        protected override IHostBuilder CreateHostBuilder()\n        {\n            return Host.CreateDefaultBuilder();\n        }\n\n        /// <inheritdoc/>\n        protected override void ConfigureWebHost(IWebHostBuilder builder)\n        {\n            builder\n                .UseContentRoot(\".\")\n                .UseStartup<ModuleStartup>()\n                .UseConfiguration(_config)\n                .ConfigureServices(services => services\n                    .AddMvc()\n                        .AddApplicationPart(typeof(Startup).Assembly)\n                        .AddControllersAsServices())\n                ;\n            base.ConfigureWebHost(builder);\n        }\n\n        /// <inheritdoc/>\n        protected override IHost CreateHost(IHostBuilder builder)\n        {\n            builder\n                .UseServiceProviderFactory(new AutofacServiceProviderFactory())\n                .ConfigureContainer<ContainerBuilder>(ConfigureContainer)\n                ;\n            return base.CreateHost(builder);\n        }\n\n        /// <inheritdoc/>\n        public HttpClient CreateClient(string name)\n        {\n            return CreateClient(new WebApplicationFactoryClientOptions\n            {\n                AllowAutoRedirect = false\n            });\n        }\n\n        /// <inheritdoc/>\n        protected override void ConfigureClient(HttpClient client)\n        {\n            var apiKey = _connection.Twin.State[Constants.TwinPropertyApiKeyKey].ConvertTo<string>();\n            base.ConfigureClient(client);\n            client.DefaultRequestHeaders.Authorization =\n                new AuthenticationHeaderValue(\"ApiKey\", apiKey);\n            client.Timeout = TimeSpan.FromMinutes(30);\n        }\n\n        /// <summary>\n        /// Resolve service from publisher module\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <returns></returns>\n        public T Resolve<T>()\n        {\n            return (T)Server.Services.GetService(typeof(T));\n        }\n\n        /// <summary>\n        /// Read publisher telemetry\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public IAsyncEnumerable<PublisherTelemetry> ReadTelemetryAsync(CancellationToken ct)\n        {\n            if (_telemetry != null)\n            {\n                return _telemetry.Reader.ReadAllAsync(ct);\n            }\n            else if (_consumer != null)\n            {\n                return _consumer.Reader.ReadAllAsync(ct);\n            }\n            else\n            {\n                throw new InvalidOperationException(\"No consumer configured.\");\n            }\n        }\n\n        /// <inheritdoc/>\n        public override async ValueTask DisposeAsync()\n        {\n            await base.DisposeAsync();\n\n            // Throw if we cannot dispose\n            using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(5));\n            await InnerDisposeAsync().WaitAsync(cts.Token);\n\n            _logFactory?.Dispose();\n\n            async Task InnerDisposeAsync()\n            {\n                _connection.Close();\n                _handler1?.Dispose();\n                if (_handler2 != null)\n                {\n                    await _handler2.DisposeAsync();\n                }\n                if (Directory.Exists(CurrentDirectory))\n                {\n                    Try.Op(() => Directory.Delete(CurrentDirectory, true));\n                }\n                ClientContainer.Dispose();\n            }\n        }\n\n        internal sealed class IoTEdgeMockIdentity : IIoTEdgeDeviceIdentity\n        {\n            public string Hub { get; } = \"Hub\";\n            public string DeviceId { get; } = \"DeviceId\";\n            public string ModuleId { get; } = \"ModuleId\";\n            public string Gateway { get; } = \"Gateway\";\n        }\n\n        /// <inheritdoc/>\n        public void ConfigureContainer(ContainerBuilder builder)\n        {\n            // Register publisher services\n            builder.AddPublisherServices();\n            builder.RegisterType<TestClientConfig>()\n                .AsImplementedInterfaces();\n\n            builder.RegisterType<IoTEdgeMockIdentity>()\n                .AsImplementedInterfaces().InstancePerLifetimeScope();\n            if (_connection.EventClient is IProcessIdentity identity)\n            {\n                builder.RegisterInstance(identity);\n            }\n            builder.RegisterInstance(_connection.EventClient);\n            builder.RegisterInstance(_connection.RpcServer);\n            builder.RegisterInstance(_connection.Twin);\n\n            if (_logFactory != null)\n            {\n                builder.RegisterInstance(_logFactory);\n            }\n\n            // Register transport services\n            if (_useMqtt)\n            {\n                // Dont just register if the broker is not running or\n                // otherwise the connect hangs during startup.\n                // TODO: Look into this.\n                builder.AddMqttClient(_config);\n            }\n            // Override client config\n            builder.RegisterInstance(_config).AsImplementedInterfaces();\n            // Override process control\n            builder.RegisterType<ExitOverride>()\n                .AsImplementedInterfaces().SingleInstance();\n        }\n\n        /// <summary>\n        /// Create client container\n        /// </summary>\n        /// <param name=\"output\"></param>\n        /// <param name=\"serializerType\"></param>\n        /// <returns></returns>\n        public IContainer CreateClientScope(ITestOutputHelper output,\n            TestSerializerType serializerType)\n        {\n            var builder = new ContainerBuilder();\n\n            builder.ConfigureServices(services => services.AddLogging());\n            builder.AddOptions();\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            builder.RegisterInstance(LogFactory.Create(output, Logging.Config))\n                .AsImplementedInterfaces();\n#pragma warning restore CA2000 // Dispose objects before losing scope\n\n            // Add API\n            builder.Configure<SdkOptions>(options =>\n                options.Target = Server.BaseAddress.ToString());\n            builder.RegisterType<NodeServicesRestClient>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<HistoryServicesRestClient>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<FileSystemServicesRestClient>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<ConfigurationServicesRestClient>()\n                .AsImplementedInterfaces();\n\n            switch (serializerType)\n            {\n                case TestSerializerType.NewtonsoftJson:\n                    builder.AddNewtonsoftJsonSerializer();\n                    break;\n                case TestSerializerType.Json:\n                    builder.AddDefaultJsonSerializer();\n                    break;\n                case TestSerializerType.MsgPack:\n                    builder.AddMessagePackSerializer();\n                    break;\n            }\n\n            // Register http client factory\n            builder.RegisterInstance(this)\n                .As<IHttpClientFactory>().ExternallyOwned(); // Do not dispose\n            return builder.Build();\n        }\n\n        /// <summary>\n        /// Create hub container\n        /// </summary>\n        /// <param name=\"messageSink\"></param>\n        /// <param name=\"testOutputHelper\"></param>\n        /// <param name=\"devices\"></param>\n        /// <param name=\"mqttVersion\"></param>\n        /// <returns></returns>\n        private IContainer CreateIoTHubSdkClientContainer(IMessageSink messageSink = null,\n            ITestOutputHelper testOutputHelper = null, IEnumerable<DeviceTwinModel> devices = null,\n            MqttVersion? mqttVersion = null)\n        {\n            var builder = new ContainerBuilder();\n\n            builder.AddNewtonsoftJsonSerializer();\n            builder.Configure<SdkOptions>(options => options.Target = Target);\n            builder.ConfigureServices(services =>\n            {\n                services.AddHttpClient();\n                services.AddLogging(logging =>\n                {\n                    if (messageSink != null)\n                    {\n                        // logging.AddXunit(messageSink); // TODO\n                    }\n                    if (testOutputHelper != null)\n                    {\n                        logging.AddXunit(testOutputHelper);\n                    }\n                    else\n                    {\n                        logging.AddConsole();\n                    }\n                });\n            });\n\n            builder.Configure<IoTHubServiceOptions>(option =>\n            {\n                option.ConnectionString = ConnectionString.CreateServiceConnectionString(\n                    \"test.test.org\", \"iothubowner\", Convert.ToBase64String(\n                        Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()))).ToString();\n            });\n\n            // Configure mqtt\n            builder.ConfigureMqtt(options =>\n            {\n                options.AllowUntrustedCertificates = true;\n                options.UseTls = false;\n                options.Protocol = mqttVersion ?? MqttVersion.v5;\n                options.KeepAlivePeriod = TimeSpan.Zero;\n                options.NumberOfClientPartitions = 1;\n                options.Port = Interlocked.Increment(ref _mqttPort);\n            });\n\n            if (devices != null)\n            {\n                builder.Register(ctx => IoTHubMock.Create(devices, ctx.Resolve<IJsonSerializer>()))\n                   .AsImplementedInterfaces().SingleInstance();\n            }\n            else\n            {\n                builder.RegisterType<IoTHubMock>()\n                    .AsImplementedInterfaces().SingleInstance();\n            }\n\n            if (mqttVersion != null)\n            {\n                // Override the iothub rpcclient with an mqtt server implementation\n                builder.AddMqttServer();\n            }\n\n            builder.RegisterType<ChunkMethodClient>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<PublisherApiClient>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<TwinApiClient>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<HistoryApiClient>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<DiscoveryApiClient>()\n                .AsImplementedInterfaces();\n\n            builder.RegisterType<PublisherApiAdapter>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<TwinApiAdapter>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<HistoryApiAdapter>()\n                .AsImplementedInterfaces();\n            builder.RegisterType<DiscoveryApiAdapter>()\n                .AsImplementedInterfaces();\n\n            return builder.Build();\n        }\n\n        /// <summary>\n        /// Mock exiting\n        /// </summary>\n        internal sealed class ExitOverride : IProcessControl\n        {\n            public bool Shutdown(bool failFast)\n            {\n                return true;\n            }\n        }\n\n        /// <summary>\n        /// Adapter for telemetry handler\n        /// </summary>\n        internal sealed class IoTHubTelemetryHandler : IIoTHubTelemetryHandler\n        {\n            public ChannelReader<PublisherTelemetry> Reader => _channel.Reader;\n\n            internal IoTHubTelemetryHandler()\n            {\n                _channel = Channel.CreateUnbounded<PublisherTelemetry>();\n            }\n\n            public ValueTask HandleAsync(string deviceId, string moduleId, string topic,\n                ReadOnlySequence<byte> data, string contentType, string contentEncoding,\n                IReadOnlyDictionary<string, string> properties, CancellationToken ct)\n            {\n                return _channel.Writer.WriteAsync(new PublisherTelemetry(\n                    deviceId, moduleId, topic, data, contentType, contentEncoding,\n                    properties), ct);\n            }\n\n            private readonly Channel<PublisherTelemetry> _channel;\n        }\n\n        /// <summary>\n        /// Adapter for event consumer\n        /// </summary>\n        internal sealed class EventConsumer : IEventConsumer\n        {\n            public ChannelReader<PublisherTelemetry> Reader => _channel.Reader;\n\n            internal EventConsumer()\n            {\n                _channel = Channel.CreateUnbounded<PublisherTelemetry>();\n            }\n\n            public async Task HandleAsync(string topic, ReadOnlySequence<byte> data,\n                string contentType, IReadOnlyDictionary<string, string> properties,\n                IEventClient responder = null, CancellationToken ct = default)\n            {\n                properties.TryGetValue(\"ContentEncoding\", out var contentEncoding);\n                await _channel.Writer.WriteAsync(new PublisherTelemetry(\n                    null, null, topic, data, contentType, contentEncoding,\n                    properties), ct).ConfigureAwait(false);\n            }\n\n            private readonly Channel<PublisherTelemetry> _channel;\n        }\n\n        private static int _mqttPort = 48882;\n        private readonly IIoTHubConnection _connection;\n        private readonly IConfiguration _config;\n        private readonly bool _useMqtt;\n        private readonly IoTHubTelemetryHandler _telemetry;\n        private readonly IDisposable _handler1;\n        private readonly IAsyncDisposable _handler2;\n        private readonly EventConsumer _consumer;\n        private readonly ILoggerFactory _logFactory;\n    }\n\n    public class ModuleStartup : Startup\n    {\n        public ModuleStartup(IConfiguration configuration)\n            : base(configuration)\n        {\n        }\n\n        public override void ConfigureContainer(ContainerBuilder builder)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Fixtures/PublisherModuleFixture.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures\n{\n    using Autofac;\n    using System;\n    using Xunit.Abstractions;\n\n    public sealed class PublisherModuleMqttv5Fixture : IDisposable\n    {\n        public IContainer SdkContainer => _publisher.ClientContainer;\n\n        /// <summary>\n        /// Create fixture\n        /// </summary>\n        /// <param name=\"messageSink\"></param>\n        public PublisherModuleMqttv5Fixture(IMessageSink messageSink)\n        {\n            _publisher = new PublisherModule(messageSink, version: Furly.Extensions.Mqtt.MqttVersion.v5);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _publisher.Dispose();\n        }\n\n        private readonly PublisherModule _publisher;\n    }\n\n    public sealed class PublisherModuleMqttv311Fixture : IDisposable\n    {\n        public IContainer SdkContainer => _publisher.ClientContainer;\n\n        /// <summary>\n        /// Create fixture\n        /// </summary>\n        /// <param name=\"messageSink\"></param>\n        public PublisherModuleMqttv311Fixture(IMessageSink messageSink)\n        {\n            _publisher = new PublisherModule(messageSink, version: Furly.Extensions.Mqtt.MqttVersion.v311);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _publisher.Dispose();\n        }\n\n        private readonly PublisherModule _publisher;\n    }\n\n    public sealed class PublisherModuleFixture : IDisposable\n    {\n        public IContainer SdkContainer => _publisher.ClientContainer;\n\n        /// <summary>\n        /// Create fixture\n        /// </summary>\n        /// <param name=\"messageSink\"></param>\n        public PublisherModuleFixture(IMessageSink messageSink)\n        {\n            _publisher = new PublisherModule(messageSink);\n        }\n\n        /// <summary>\n        /// Create rest client scope\n        /// </summary>\n        /// <param name=\"output\"></param>\n        /// <param name=\"serializerType\"></param>\n        /// <returns></returns>\n        public IContainer CreateRestClientContainer(ITestOutputHelper output,\n            TestSerializerType serializerType)\n        {\n            return _publisher.CreateClientScope(output, serializerType);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            _publisher.Dispose();\n        }\n\n        private readonly PublisherModule _publisher;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Fixtures/ReferenceServerReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class ReferenceServerReadCollection : ICollectionFixture<ReferenceServer>\n    {\n        public const string Name = \"Read\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Fixtures/TempFileProviderBase.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Tests.Utils\n{\n    using System;\n    using System.IO;\n\n    /// <summary>\n    /// Base class that provides a temporary file that will be cleaned up on disposal.\n    /// </summary>\n    public class TempFileProviderBase : IDisposable\n    {\n        protected readonly string _tempFile;\n\n        public TempFileProviderBase()\n        {\n            _tempFile = Path.GetTempFileName();\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            try\n            {\n                // Remove temporary published nodes file if one was created.\n                if (File.Exists(_tempFile))\n                {\n                    File.Delete(_tempFile);\n                }\n            }\n            catch\n            {\n                // Nothign to do.\n            }\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Fixtures/TestSerializerType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures\n{\n    public enum TestSerializerType\n    {\n        Json,\n        MsgPack,\n        NewtonsoftJson,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Fixtures/TwinIntegrationTestBase.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures\n{\n    using System;\n    using System.Threading;\n    using Xunit.Abstractions;\n\n    public abstract class TwinIntegrationTestBase : IDisposable\n    {\n        protected CancellationToken Ct => _cts.Token;\n\n        protected TwinIntegrationTestBase(ITestOutputHelper testOutputHelper = null,\n            TimeSpan? timeout = null)\n        {\n            _cts = new CancellationTokenSource(timeout ?? kTotalTestTimeout);\n            _testOutputHelper = testOutputHelper;\n        }\n\n        protected virtual void Dispose(bool disposing)\n        {\n            if (!_disposedValue)\n            {\n                if (disposing)\n                {\n                    if (_cts.IsCancellationRequested)\n                    {\n                        _testOutputHelper.WriteLine(\n                            \"OperationCanceledException thrown due to test time out.\");\n                    }\n                    _cts.Dispose();\n                }\n                _disposedValue = true;\n            }\n        }\n\n        public void Dispose()\n        {\n            // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method\n            Dispose(disposing: true);\n            GC.SuppressFinalize(this);\n        }\n\n        private static readonly TimeSpan kTotalTestTimeout =\n#if DEBUG\n            TimeSpan.FromMinutes(60)\n#else\n            TimeSpan.FromMinutes(2)\n#endif\n            ;\n        private readonly CancellationTokenSource _cts;\n        private readonly ITestOutputHelper _testOutputHelper;\n        private bool _disposedValue;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/GlobalSuppressions.cs",
    "content": "﻿// This file is used by Code Analysis to maintain SuppressMessage\n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given\n// a specific target and scoped to a namespace, type, member, etc.\n\nusing System.Diagnostics.CodeAnalysis;\n\n[assembly: SuppressMessage(\"Reliability\", \"CA2007:Consider calling ConfigureAwait on the awaited task\", Justification = \"xunit\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Logging.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests\n{\n    using Microsoft.Extensions.Logging;\n    using Neovolve.Logging.Xunit;\n\n    internal static class Logging\n    {\n        /// <summary>\n        /// Default level\n        /// </summary>\n        public static LogLevel Level => LogLevel.Information;\n\n        /// <summary>\n        /// Configuration\n        /// </summary>\n        public static LoggingConfig Config => new() { LogLevel = Level };\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/Alarms/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.Alarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests : TwinIntegrationTestBase,\n        IClassFixture<AlarmsServer>, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public NodeServicesTests(AlarmsServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private AlarmServerTests<ConnectionModel> GetTests()\n        {\n            return new AlarmServerTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly AlarmsServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task BrowseAreaPathTestAsync()\n        {\n            return GetTests().BrowseAreaPathTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task BrowseMetalsSouthMotorTestAsync()\n        {\n            return GetTests().BrowseMetalsSouthMotorTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task BrowseColoursEastTankTestAsync()\n        {\n            return GetTests().BrowseColoursEastTankTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest1Async()\n        {\n            return GetTests().CompileAlarmQueryTest1Async();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest2Async()\n        {\n            return GetTests().CompileAlarmQueryTest2Async();\n        }\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleTripAlarmQueryTestAsync()\n        {\n            return GetTests().CompileSimpleTripAlarmQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/DeterministicAlarms/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.DeterministicAlarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests1 : TwinIntegrationTestBase,\n        IClassFixture<DeterministicAlarmsServer1>, IClassFixture<PublisherModuleMqttv311Fixture>\n    {\n        public NodeServicesTests1(DeterministicAlarmsServer1 server,\n            PublisherModuleMqttv311Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private DeterministicAlarmsTests1<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests1<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly DeterministicAlarmsServer1 _server;\n        private readonly PublisherModuleMqttv311Fixture _module;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1TemperatureHighTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1TemperatureHighTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2LightOffTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2LightOffTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2DoorOpenTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/DeterministicAlarms/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.DeterministicAlarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests2 : TwinIntegrationTestBase,\n        IClassFixture<DeterministicAlarmsServer2>, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public NodeServicesTests2(DeterministicAlarmsServer2 server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private DeterministicAlarmsTests2<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests2<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly DeterministicAlarmsServer2 _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalAccess/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class NodeServicesTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public NodeServicesTests(HistoricalAccessServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private NodeHistoricalAccessTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalAccessTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task HistoryGetInt16NodeHistoryConfiguration()\n        {\n            return GetTests().HistoryGetInt16NodeHistoryConfigurationAsync(Ct);\n        }\n\n        [Fact]\n        public Task HistoryGetInt64NodeHistoryConfigurationAsync()\n        {\n            return GetTests().HistoryGetInt64NodeHistoryConfigurationAsync(Ct);\n        }\n\n        [Fact]\n        public Task HistoryGetNodeHistoryConfigurationFromBadNode()\n        {\n            return GetTests().HistoryGetNodeHistoryConfigurationFromBadNodeAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalAccess/ReadAtTimesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadAtTimesTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public ReadAtTimesTests(HistoricalAccessServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryReadValuesAtTimesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesAtTimesTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest1Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest2Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest3Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest3Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest4Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest4Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt32ValuesAtTimesTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest1Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt32ValuesAtTimesTest2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest2Async(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalAccess/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name, DisableParallelization = true)]\n    public class ReadCollection : ICollectionFixture<HistoricalAccessServer>\n    {\n        public const string Name = \"HistoricalAccessServerReadModuleMqtt\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalAccess/ReadModifiedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadModifiedTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv311Fixture>\n    {\n        public ReadModifiedTests(HistoricalAccessServer server,\n            PublisherModuleMqttv311Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryReadValuesModifiedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesModifiedTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleMqttv311Fixture _module;\n\n        [Fact]\n        public Task HistoryReadInt16ValuesModifiedTestAsync()\n        {\n            return GetTests().HistoryReadInt16ValuesModifiedTestAsync(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt16ValuesModifiedTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt16ValuesModifiedTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalAccess/ReadProcessedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadProcessedTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public ReadProcessedTests(HistoricalAccessServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryReadValuesProcessedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesProcessedTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest1Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest2Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest2Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryReadUInt64ProcessedValuesTest3Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryReadUInt64ProcessedValuesTest3Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest1Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest2Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest3Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest3Async(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalAccess/ReadValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadValuesTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public ReadValuesTests(HistoricalAccessServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryReadValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest1Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest2Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest3Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest3Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest4Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest4Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt64ValuesTest1Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt64ValuesTest2Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest3Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt64ValuesTest3Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest4Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt64ValuesTest4Async(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalAccess/UpdateValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class UpdateValuesTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public UpdateValuesTests(HistoricalAccessServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryUpdateValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryUpdateValuesTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest3Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest3Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest4Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest4Async(Ct);\n        }\n\n        [Fact]\n        public Task HistoryDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryDeleteUInt32ValuesTest1Async(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalEvents/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class NodeServicesTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public NodeServicesTests(HistoricalEventsServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private NodeHistoricalEventsTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalEventsTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalEventsServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/HistoricalEvents/ReadCollection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.HistoricalEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name, DisableParallelization = true)]\n    public class ReadCollection : ICollectionFixture<HistoricalEventsServer>\n    {\n        public const string Name = \"HistoricalEventsServerReadModuleMqtt\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/Plc/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.Plc\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests1 : TwinIntegrationTestBase,\n        IClassFixture<PlcServer>, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public NodeServicesTests1(PlcServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private SimulatorNodesTests<ConnectionModel> GetTests()\n        {\n            return new SimulatorNodesTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly PlcServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task AlternatingBooleanTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().AlternatingBooleanTelemetryChangesWithPeriodAsync(Ct);\n        }\n\n        [Fact]\n        public Task BadNodeHasAlternatingStatusCodeAsync()\n        {\n            return GetTests().BadNodeHasAlternatingStatusCodeAsync(Ct);\n        }\n\n        [Fact]\n        public Task FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync(Ct);\n        }\n\n        [Fact]\n        public Task FastUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().FastUIntScalar1TelemetryChangesWithPeriodAsync(Ct);\n        }\n\n        [Fact]\n        public Task NegativeTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().NegativeTrendDataNodeHasValueWithTrendAsync(Ct);\n        }\n\n        [Fact]\n        public Task NegativeTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().NegativeTrendDataTelemetryChangesWithPeriodAsync(Ct);\n        }\n\n        [Fact]\n        public Task PositiveTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().PositiveTrendDataNodeHasValueWithTrendAsync(Ct);\n        }\n\n        [Fact]\n        public Task PositiveTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().PositiveTrendDataTelemetryChangesWithPeriodAsync(Ct);\n        }\n\n        [Fact]\n        public Task RandomSignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomSignedInt32TelemetryChangesWithPeriodAsync(Ct);\n        }\n\n        [Fact]\n        public Task RandomUnsignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomUnsignedInt32TelemetryChangesWithPeriodAsync(Ct);\n        }\n\n        [Fact]\n        public Task SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync(Ct);\n        }\n\n        [Fact]\n        public Task SlowUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().SlowUIntScalar1TelemetryChangesWithPeriodAsync(Ct);\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInDipDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInDipDataAsync(Ct);\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInSpikeDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInSpikeDataAsync(Ct);\n        }\n\n        [Fact]\n        public Task TelemetryFastNodeTestAsync()\n        {\n            return GetTests().TelemetryFastNodeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task TelemetryStepUpTestAsync()\n        {\n            return GetTests().TelemetryStepUpTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/Plc/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.Plc\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests2 : TwinIntegrationTestBase,\n        IClassFixture<PlcServer>\n    {\n        public NodeServicesTests2(PlcServer server, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = new PublisherModule(null, testOutputHelper: output,\n                version: Furly.Extensions.Mqtt.MqttVersion.v5);\n        }\n\n        private PlcModelComplexTypeTests<ConnectionModel> GetTests()\n        {\n            return new PlcModelComplexTypeTests<ConnectionModel>(_server,\n                _module.ClientContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                _module.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        private readonly PlcServer _server;\n        private readonly PublisherModule _module;\n\n        [Fact]\n        public Task PlcModelHeaterTestsAsync()\n        {\n            return GetTests().PlcModelHeaterTestsAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/ReferenceServer/MqttConfigurationIntegrationTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.ReferenceServer\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Furly.Extensions.Mqtt;\n    using Json.More;\n    using System;\n    using System.Collections.Generic;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class MqttConfigurationIntegrationTests : PublisherIntegrationTestBase\n    {\n        private readonly ITestOutputHelper _output;\n        private readonly ReferenceServer _fixture;\n\n        public MqttConfigurationIntegrationTests(ITestOutputHelper output)\n            : base(output)\n        {\n            _output = output;\n            _fixture = new ReferenceServer();\n            EndpointUrl = _fixture.EndpointUrl;\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            if (disposing)\n            {\n                _fixture.Dispose();\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task CanSendDataItemToTopicConfiguredWithMethodAsync(bool useMqtt5)\n        {\n            var name = nameof(CanSendDataItemToTopicConfiguredWithMethodAsync) + (useMqtt5 ? \"v5\" : \"v311\");\n            var testInput = GetEndpointsFromFile(name, \"./Resources/DataItems.json\");\n            StartPublisher(name, arguments: [\"--mm=FullSamples\"], // Alternative to --fm=True\n                version: useMqtt5 ? MqttVersion.v5 : MqttVersion.v311);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput[0], Ct);\n                Assert.NotNull(result);\n\n                var messages = await WaitForMessagesAsync();\n                var message = Assert.Single(messages);\n                Assert.Equal(\"ns=23;i=1259\", message.Message.GetProperty(\"NodeId\").GetString());\n                Assert.InRange(message.Message.GetProperty(\"Value\").GetProperty(\"Value\").GetDouble(),\n                    double.MinValue, double.MaxValue);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e, Ct);\n                var n = Assert.Single(nodes.OpcNodes);\n                Assert.Equal(testInput[0].OpcNodes[0].Id, n.Id);\n\n                result = await PublisherApi.UnpublishNodesAsync(e, Ct);\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task CanSendEventToTopicConfiguredWithMethodAsync(bool useMqtt5)\n        {\n            var name = nameof(CanSendEventToTopicConfiguredWithMethodAsync) + (useMqtt5 ? \"v5\" : \"v311\");\n            var testInput = GetEndpointsFromFile(name, \"./Resources/SimpleEvents.json\");\n            StartPublisher(name, version: useMqtt5 ? MqttVersion.v5 : MqttVersion.v311);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput[0], Ct);\n                Assert.NotNull(result);\n\n                var messages = await WaitForMessagesAsync();\n                var message = Assert.Single(messages);\n                Assert.Equal(\"i=2253\", message.Message.GetProperty(\"NodeId\").GetString());\n                Assert.NotEmpty(message.Message.GetProperty(\"Value\").GetProperty(\"EventId\").GetString());\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e, Ct);\n                var n = Assert.Single(nodes.OpcNodes);\n                Assert.Equal(testInput[0].OpcNodes[0].Id, n.Id);\n\n                _output.WriteLine(\"Unpublishing nodes...\");\n                result = await PublisherApi.UnpublishAllNodesAsync(ct: Ct);\n                Assert.NotNull(result);\n\n                _output.WriteLine(\"Checking endpoints...\");\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                _output.WriteLine(\"Stopping publisher...\");\n                await StopPublisherAsync();\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task CanSendPendingConditionsToTopicConfiguredWithMethodAsync(bool useMqtt5)\n        {\n            var name = nameof(CanSendPendingConditionsToTopicConfiguredWithMethodAsync) + (useMqtt5 ? \"v5\" : \"v311\");\n            var testInput = GetEndpointsFromFile(name, \"./Resources/PendingAlarms.json\");\n            StartPublisher(name, version: useMqtt5 ? MqttVersion.v5 : MqttVersion.v311);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput[0], Ct);\n                Assert.NotNull(result);\n\n                var messages = await WaitForMessagesAsync(GetAlarmCondition);\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n\n                var evt = Assert.Single(messages).Message;\n                Assert.Equal(JsonValueKind.Object, evt.ValueKind);\n                Assert.Equal(\"i=2253\", evt.GetProperty(\"NodeId\").GetString());\n                Assert.Equal(\"PendingAlarms\", evt.GetProperty(\"DisplayName\").GetString());\n\n                Assert.True(evt.TryGetProperty(\"Value\", out var sev));\n                Assert.True(sev.TryGetProperty(\"Severity\", out sev));\n                Assert.True(sev.TryGetProperty(\"Value\", out sev));\n                Assert.True(sev.GetInt32() >= 100);\n\n                _output.WriteLine(\"GetConfigured 1\");\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e, Ct);\n                var n = Assert.Single(nodes.OpcNodes);\n                Assert.Equal(testInput[0].OpcNodes[0].Id, n.Id);\n\n                _output.WriteLine(\"Unpublish\");\n                result = await PublisherApi.UnpublishNodesAsync(testInput[0], Ct);\n                Assert.NotNull(result);\n\n                _output.WriteLine(\"GetConfigured 2\");\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task CanSendDataItemToTopicConfiguredWithMethod2Async(bool useMqtt5)\n        {\n            var name = nameof(CanSendDataItemToTopicConfiguredWithMethod2Async) + (useMqtt5 ? \"v5\" : \"v311\");\n            var testInput1 = GetEndpointsFromFile(name, \"./Resources/DataItems.json\");\n            var testInput2 = GetEndpointsFromFile(name, \"./Resources/SimpleEvents.json\");\n            var testInput3 = GetEndpointsFromFile(name, \"./Resources/PendingAlarms.json\");\n            StartPublisher(name, version: useMqtt5 ? MqttVersion.v5 : MqttVersion.v311);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n\n                _output.WriteLine(\"Publishing 1\");\n                await PublisherApi.PublishNodesAsync(testInput1[0], Ct);\n                _output.WriteLine(\"Publishing 2\");\n                await PublisherApi.PublishNodesAsync(testInput2[0], Ct);\n                _output.WriteLine(\"Publishing 3\");\n                await PublisherApi.PublishNodesAsync(testInput3[0], Ct);\n\n                _output.WriteLine(\"Checking endpoints...\");\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                var e = Assert.Single(endpoints.Endpoints);\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e, Ct);\n                Assert.Equal(3, nodes.OpcNodes.Count);\n\n                _output.WriteLine(\"Unpublishing all...\");\n                await PublisherApi.UnpublishAllNodesAsync(ct: Ct);\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n\n                _output.WriteLine(\"Re-adding with AddOrUpdate...\");\n                await PublisherApi.AddOrUpdateEndpointsAsync(new List<PublishedNodesEntryModel>\n                {\n                    new() {\n                        OpcNodes = [.. nodes.OpcNodes],\n                        EndpointUrl = e.EndpointUrl,\n                        UseSecurity = e.UseSecurity,\n                        DataSetWriterGroup = name\n                    }\n                }, Ct);\n\n                _output.WriteLine(\"Checking endpoints...\");\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                e = Assert.Single(endpoints.Endpoints);\n                nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e, Ct);\n                Assert.Equal(3, nodes.OpcNodes.Count);\n\n                _output.WriteLine(\"Removing items...\");\n                await PublisherApi.UnpublishNodesAsync(testInput3[0], Ct);\n                nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e, Ct);\n                Assert.Equal(2, nodes.OpcNodes.Count);\n                await PublisherApi.UnpublishNodesAsync(testInput2[0], Ct);\n                nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e, Ct);\n                Assert.Single(nodes.OpcNodes);\n\n                _output.WriteLine(\"Waiting for remaining...\");\n                var messages = await WaitForMessagesAsync(GetDataFrame);\n                var message = Assert.Single(messages);\n                Assert.Equal(\"ns=23;i=1259\", message.Message.GetProperty(\"NodeId\").GetString());\n                Assert.InRange(message.Message.GetProperty(\"Value\").GetProperty(\"Value\").GetDouble(),\n                    double.MinValue, double.MaxValue);\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync(Ct);\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(e.EndpointUrl, diag.Endpoint.EndpointUrl);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task CanSendPendingConditionsToTopicConfiguredWithMethod2Async(bool useMqtt5)\n        {\n            var name = nameof(CanSendPendingConditionsToTopicConfiguredWithMethod2Async) + (useMqtt5 ? \"v5\" : \"v311\");\n            var testInput = GetEndpointsFromFile(name, \"./Resources/PendingAlarms.json\");\n\n            StartPublisher(name, version: useMqtt5 ? MqttVersion.v5 : MqttVersion.v311);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput[0], Ct);\n                Assert.NotNull(result);\n\n                var messages = await WaitForMessagesAsync(GetAlarmCondition);\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n                var evt = Assert.Single(messages).Message;\n\n                Assert.Equal(JsonValueKind.Object, evt.ValueKind);\n                Assert.Equal(\"i=2253\", evt.GetProperty(\"NodeId\").GetString());\n                Assert.Equal(\"PendingAlarms\", evt.GetProperty(\"DisplayName\").GetString());\n\n                Assert.True(evt.TryGetProperty(\"Value\", out var sev));\n                Assert.True(sev.TryGetProperty(\"Severity\", out sev));\n                Assert.True(sev.TryGetProperty(\"Value\", out sev));\n                Assert.True(sev.GetInt32() >= 100);\n\n                // Disable pending alarms\n                testInput[0].OpcNodes[0].ConditionHandling = null;\n                testInput[0].OpcNodes[0].DisplayName = \"SimpleEvents\";\n                result = await PublisherApi.AddOrUpdateEndpointsAsync(\n                    new List<PublishedNodesEntryModel> { testInput[0] }, Ct);\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e, Ct);\n                var n = Assert.Single(nodes.OpcNodes);\n\n                // TODO: Fix\n                if (n != null) return;\n\n                // Wait until it was applied and we receive normal events again\n                messages = await WaitForMessagesAsync(\n                    message => message.GetProperty(\"DisplayName\").GetString() == \"SimpleEvents\"\n                        && message.GetProperty(\"Value\").GetProperty(\"ReceiveTime\").ValueKind\n                            == JsonValueKind.String ? message : default);\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n\n                var message = Assert.Single(messages);\n                Assert.Equal(\"i=2253\", message.Message.GetProperty(\"NodeId\").GetString());\n                Assert.Equal(\"SimpleEvents\", message.Message.GetProperty(\"DisplayName\").GetString());\n\n                Assert.True(message.Message.TryGetProperty(\"Value\", out sev));\n                Assert.True(sev.TryGetProperty(\"Severity\", out sev));\n                Assert.True(sev.GetInt32() > 0, $\"{message.Message.ToJsonString()}\");\n\n                result = await PublisherApi.UnpublishNodesAsync(testInput[0], Ct);\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync(ct: Ct);\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        private JsonElement GetDataFrame(JsonElement jsonElement)\n        {\n            return jsonElement.GetProperty(\"NodeId\").GetString() != \"i=2253\"\n                    ? jsonElement : default;\n        }\n\n        private static JsonElement GetAlarmCondition(JsonElement jsonElement)\n        {\n            return jsonElement\n                .TryGetProperty(\"Value\", out var node) && node\n                .TryGetProperty(\"SourceNode\", out node) && node\n                .TryGetProperty(\"Value\", out node) && node\n                .GetString().StartsWith(\"http://opcfoundation.org/AlarmCondition#s=1%3a\",\n                    StringComparison.InvariantCulture) ? jsonElement : default;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/ReferenceServer/MqttPubSubIntegrationTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.ReferenceServer\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.ReferenceServer;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Furly.Extensions.Mqtt;\n    using Json.More;\n    using System;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class MqttPubSubIntegrationTests : PublisherIntegrationTestBase\n    {\n        private readonly ReferenceServer _fixture;\n        private readonly ITestOutputHelper _output;\n\n        public MqttPubSubIntegrationTests(ITestOutputHelper output) : base(output)\n        {\n            _output = output;\n            _fixture = new ReferenceServer();\n            EndpointUrl = _fixture.EndpointUrl;\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            if (disposing)\n            {\n                _fixture.Dispose();\n            }\n        }\n\n        [Fact]\n        public async Task CanSendDataItemToMqttBrokerTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemToMqttBrokerTestAsync), \"./Resources/DataItems.json\",\n                messageType: \"ua-data\", arguments: [\"--mm=PubSub\", \"--mdt={TelemetryTopic}/metadatamessage\", \"--dm=False\"],\n                version: MqttVersion.v311);\n\n            // Assert\n            var message = Assert.Single(messages);\n            var output = message.Message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n            Assert.NotNull(metadata);\n            Assert.EndsWith(\"/metadatamessage\", metadata.Value.Topic, StringComparison.Ordinal);\n        }\n\n        [Fact]\n        public async Task CanSendDataItemButNotMetaDataWhenMetaDataIsDisabledTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemButNotMetaDataWhenMetaDataIsDisabledTestAsync), \"./Resources/DataItems.json\",\n                arguments: [\"--dm\", \"--mm=DataSetMessages\"],\n                version: MqttVersion.v5);\n\n            // Assert\n            var message = Assert.Single(messages);\n            var output = message.Message.GetProperty(\"Payload\").GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n            Assert.Null(metadata);\n        }\n\n        [Fact]\n        public async Task CanSendDataItemAsDataSetMessagesToMqttBrokerWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemAsDataSetMessagesToMqttBrokerWithCompliantEncodingTestAsync),\n                \"./Resources/DataItems.json\", messageType: \"ua-deltaframe\",\n                arguments: [\"-c\", \"--mm=DataSetMessages\"],\n                version: MqttVersion.v311);\n\n            // Assert\n            var message = Assert.Single(messages);\n            var output = message.Message.GetProperty(\"Payload\").GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n            Assert.NotNull(metadata);\n        }\n\n        [Fact]\n        public async Task CanSendDataItemAsRawDataSetsToMqttBrokerWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemAsRawDataSetsToMqttBrokerWithCompliantEncodingTestAsync),\n                \"./Resources/DataItems.json\", messageType: \"ua-deltaframe\",\n                arguments: [\"-c\", \"--dm=False\", \"--mm=RawDataSets\", \"--mdt\"],\n                version: MqttVersion.v5);\n\n            // Assert\n            var output = Assert.Single(messages);\n            Assert.NotEqual(JsonValueKind.Null, output.Message.ValueKind);\n            Assert.InRange(output.Message.GetProperty(\"Output\").GetDouble(),\n                double.MinValue, double.MaxValue);\n\n            // Explicitely enabled metadata despite messaging profile\n            Assert.NotNull(metadata);\n            Assert.EndsWith(\"/metadata\", metadata.Value.Topic, StringComparison.Ordinal);\n        }\n\n        [Fact]\n        public async Task CanEncodeWithoutReversibleEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(nameof(CanEncodeWithoutReversibleEncodingTestAsync),\n                \"./Resources/SimpleEvents.json\", messageType: \"ua-data\", arguments: [\"--mm=PubSub\", \"--me=Json\", \"--dm=false\"],\n                version: MqttVersion.v5);\n\n            Assert.Single(result);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var value = m.GetProperty(\"Payload\");\n\n                // Variant encoding is the default\n                var eventId = value.GetProperty(BasicPubSubIntegrationTests.EventId).GetProperty(\"Value\");\n                var message = value.GetProperty(BasicPubSubIntegrationTests.Message).GetProperty(\"Value\");\n                var cycleId = value.GetProperty(BasicPubSubIntegrationTests.CycleIdUri).GetProperty(\"Value\");\n                var currentStep = value.GetProperty(BasicPubSubIntegrationTests.CurrentStepUri).GetProperty(\"Value\");\n\n                Assert.Equal(JsonValueKind.String, eventId.ValueKind);\n                Assert.Equal(JsonValueKind.String, message.ValueKind);\n                Assert.Equal(JsonValueKind.String, cycleId.ValueKind);\n                Assert.Equal(JsonValueKind.String, currentStep.GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, currentStep.GetProperty(\"Duration\").ValueKind);\n            });\n\n            Assert.NotNull(metadata);\n            BasicPubSubIntegrationTests.AssertSimpleEventsMetadata(metadata.Value);\n        }\n\n        [Fact]\n        public async Task CanEncodeWithReversibleEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(nameof(CanEncodeWithReversibleEncodingTestAsync),\n                \"./Resources/SimpleEvents.json\", TimeSpan.FromMinutes(2), 4, messageType: \"ua-data\",\n                arguments: [\"--mm=PubSub\", \"--me=JsonReversible\", \"--dm=False\"],\n                version: MqttVersion.v311);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var body = m.GetProperty(\"Payload\");\n                var eventId = body.GetProperty(BasicPubSubIntegrationTests.EventId).GetProperty(\"Value\");\n                Assert.Equal(\"ByteString\", eventId.GetProperty(\"Type\").GetString());\n                Assert.Equal(JsonValueKind.String, eventId.GetProperty(\"Body\").ValueKind);\n\n                var message = body.GetProperty(BasicPubSubIntegrationTests.Message).GetProperty(\"Value\");\n                Assert.Equal(\"LocalizedText\", message.GetProperty(\"Type\").GetString());\n                Assert.Equal(JsonValueKind.String, message.GetProperty(\"Body\").GetProperty(\"Text\").ValueKind);\n                Assert.Equal(\"en-US\", message.GetProperty(\"Body\").GetProperty(\"Locale\").GetString());\n\n                var cycleId = body.GetProperty(BasicPubSubIntegrationTests.CycleIdUri).GetProperty(\"Value\");\n                Assert.Equal(\"String\", cycleId.GetProperty(\"Type\").GetString());\n                Assert.Equal(JsonValueKind.String, cycleId.GetProperty(\"Body\").ValueKind);\n\n                var currentStep = body.GetProperty(BasicPubSubIntegrationTests.CurrentStepUri).GetProperty(\"Value\");\n                body = currentStep.GetProperty(\"Body\");\n                Assert.Equal(\"ExtensionObject\", currentStep.GetProperty(\"Type\").GetString());\n                Assert.Equal(\"http://opcfoundation.org/SimpleEvents#i=183\", body.GetProperty(\"TypeId\").GetString());\n                Assert.Equal(\"Json\", body.GetProperty(\"Encoding\").GetString());\n                Assert.Equal(JsonValueKind.String, body.GetProperty(\"Body\").GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, body.GetProperty(\"Body\").GetProperty(\"Duration\").ValueKind);\n            });\n\n            Assert.NotNull(metadata);\n            BasicPubSubIntegrationTests.AssertSimpleEventsMetadata(metadata.Value);\n        }\n\n        [Fact]\n        public async Task CanEncodeEventWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(nameof(CanEncodeEventWithCompliantEncodingTestAsync),\n                \"./Resources/SimpleEvents.json\", messageType: \"ua-data\", arguments: [\"-c\", \"--mm=PubSub\", \"--me=Json\"],\n                version: MqttVersion.v5);\n\n            Assert.Single(result);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var value = m.GetProperty(\"Payload\");\n\n                // Variant encoding is the default\n                var eventId = value.GetProperty(BasicPubSubIntegrationTests.EventId).GetProperty(\"Value\");\n                var message = value.GetProperty(BasicPubSubIntegrationTests.Message).GetProperty(\"Value\");\n                var cycleId = value.GetProperty(BasicPubSubIntegrationTests.CycleIdExpanded).GetProperty(\"Value\");\n                var currentStep = value.GetProperty(BasicPubSubIntegrationTests.CurrentStepExpanded).GetProperty(\"Value\");\n\n                Assert.Equal(JsonValueKind.String, eventId.ValueKind);\n                Assert.Equal(JsonValueKind.String, message.ValueKind);\n                Assert.Equal(JsonValueKind.String, cycleId.ValueKind);\n                Assert.Equal(JsonValueKind.String, currentStep.GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, currentStep.GetProperty(\"Duration\").ValueKind);\n            });\n\n            Assert.NotNull(metadata);\n            BasicPubSubIntegrationTests.AssertCompliantSimpleEventsMetadata(metadata.Value);\n        }\n\n        [Fact]\n        public async Task CanEncodeWithReversibleEncodingAndWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(nameof(CanEncodeWithReversibleEncodingAndWithCompliantEncodingTestAsync),\n                \"./Resources/SimpleEvents.json\", TimeSpan.FromMinutes(2), 4, messageType: \"ua-data\",\n                arguments: [\"-c\", \"--mm=PubSub\", \"--me=JsonReversible\"],\n                version: MqttVersion.v311);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var body = m.GetProperty(\"Payload\");\n                var eventId = body.GetProperty(BasicPubSubIntegrationTests.EventId).GetProperty(\"Value\");\n                Assert.Equal(15, eventId.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(JsonValueKind.String, eventId.GetProperty(\"Body\").ValueKind);\n\n                var message = body.GetProperty(BasicPubSubIntegrationTests.Message).GetProperty(\"Value\");\n                Assert.Equal(21, message.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(JsonValueKind.String, message.GetProperty(\"Body\").GetProperty(\"Text\").ValueKind);\n                Assert.Equal(\"en-US\", message.GetProperty(\"Body\").GetProperty(\"Locale\").GetString());\n\n                var cycleId = body.GetProperty(BasicPubSubIntegrationTests.CycleIdExpanded).GetProperty(\"Value\");\n                Assert.Equal(12, cycleId.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(JsonValueKind.String, cycleId.GetProperty(\"Body\").ValueKind);\n\n                var currentStep = body.GetProperty(BasicPubSubIntegrationTests.CurrentStepExpanded).GetProperty(\"Value\");\n                body = currentStep.GetProperty(\"Body\");\n                Assert.Equal(22, currentStep.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(183, body.GetProperty(\"TypeId\").GetProperty(\"Id\").GetInt32());\n                Assert.Equal(JsonValueKind.String, body.GetProperty(\"Body\").GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, body.GetProperty(\"Body\").GetProperty(\"Duration\").ValueKind);\n            });\n\n            Assert.NotNull(metadata);\n            BasicPubSubIntegrationTests.AssertCompliantSimpleEventsMetadata(metadata.Value);\n        }\n\n        [Fact]\n        public async Task CanSendPendingConditionsToMqttBrokerTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(nameof(CanSendPendingConditionsToMqttBrokerTestAsync),\n                \"./Resources/PendingAlarms.json\", BasicPubSubIntegrationTests.GetAlarmCondition, messageType: \"ua-data\",\n                arguments: [\"--mm=PubSub\", \"--dm=False\"], version: MqttVersion.v311);\n\n            // Assert\n            var message = Assert.Single(messages);\n            _output.WriteLine(message.Topic + message.Message.ToJsonString());\n\n            Assert.Equal(JsonValueKind.Object, message.Message.ValueKind);\n            Assert.True(message.Message.GetProperty(\"Payload\").GetProperty(\"Severity\").GetProperty(\"Value\").GetInt32() >= 100);\n\n            Assert.NotNull(metadata);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/ReferenceServer/MqttUnifiedNamespaceTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.ReferenceServer\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Furly.Extensions.Mqtt;\n    using Json.More;\n    using System;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class MqttUnifiedNamespaceTests : PublisherIntegrationTestBase\n    {\n        private readonly ReferenceServer _fixture;\n        private readonly ITestOutputHelper _output;\n\n        public MqttUnifiedNamespaceTests(ITestOutputHelper output) : base(output)\n        {\n            _output = output;\n            _fixture = new ReferenceServer();\n            EndpointUrl = _fixture.EndpointUrl;\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            if (disposing)\n            {\n                _fixture.Dispose();\n            }\n        }\n\n        [Fact]\n        public async Task CanSendAddressSpaceDataToUnifiedNamespaceAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendAddressSpaceDataToUnifiedNamespaceAsync), \"./Resources/DataItems1.json\",\n                messageCollectionTimeout: TimeSpan.FromMinutes(1), messageCount: 10,\n                arguments: [\"--mm=SingleRawDataSet\", \"--uns=UseBrowseNamesWithNamespaceIndex\"], version: MqttVersion.v5);\n\n            // Assert\n            Assert.NotEmpty(messages);\n            var currentTimes = messages.Where(m => m.Topic\n                .EndsWith(nameof(CanSendAddressSpaceDataToUnifiedNamespaceAsync) + \"/Objects/Server/ServerStatus/CurrentTime\",\n                StringComparison.InvariantCulture)).ToList();\n            var outputs = messages.Where(m => m.Topic\n                .EndsWith(nameof(CanSendAddressSpaceDataToUnifiedNamespaceAsync) + \"/Objects/23:Boilers/23:Boiler \\\\x231/23:DrumX001/23:LIX001/23:Output\",\n                StringComparison.InvariantCulture)).ToList();\n            Assert.NotEmpty(currentTimes);\n            Assert.NotEmpty(outputs);\n            if (currentTimes.Count + outputs.Count != messages.Count)\n            {\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n            }\n            // TODO: Fix  Assert.Equal(messages.Count, currentTimes.Count + outputs.Count);\n            Assert.All(currentTimes, a =>\n            {\n                Assert.True(a.Message.TryGetProperty(\"i=2258\", out var dateTimeValue));\n                Assert.True(dateTimeValue.TryGetDateTime(out _));\n            });\n            Assert.All(outputs, a =>\n            {\n                Assert.True(a.Message.TryGetProperty(\"ns=23;i=1259\", out var doubleValue));\n                Assert.True(doubleValue.TryGetDouble(out _));\n            });\n        }\n\n        [Fact]\n        public async Task CanSendAddressSpaceDataToUnifiedNamespaceRawAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendAddressSpaceDataToUnifiedNamespaceRawAsync), \"./Resources/DataItems1.json\",\n                messageCollectionTimeout: TimeSpan.FromMinutes(1), messageCount: 10,\n                arguments: [\"--mm=SingleRawDataSet\", \"--uns=UseBrowseNames\"], version: MqttVersion.v311);\n\n            // Assert\n            Assert.NotEmpty(messages);\n            var currentTimes = messages.Where(m => m.Topic\n                .EndsWith(nameof(CanSendAddressSpaceDataToUnifiedNamespaceRawAsync) + \"/Objects/Server/ServerStatus/CurrentTime\",\n                StringComparison.InvariantCulture)).ToList();\n            var outputs = messages.Where(m => m.Topic\n                .EndsWith(nameof(CanSendAddressSpaceDataToUnifiedNamespaceRawAsync) + \"/Objects/Boilers/Boiler \\\\x231/DrumX001/LIX001/Output\",\n                StringComparison.InvariantCulture)).ToList();\n            Assert.NotEmpty(currentTimes);\n            Assert.NotEmpty(outputs);\n            if (currentTimes.Count + outputs.Count != messages.Count)\n            {\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n            }\n            // TODO: Fix Assert.Equal(messages.Count, currentTimes.Count + outputs.Count);\n            Assert.All(currentTimes, a =>\n            {\n                Assert.True(a.Message.TryGetProperty(\"i=2258\", out var dateTimeValue));\n                Assert.True(dateTimeValue.TryGetDateTime(out _));\n            });\n            Assert.All(outputs, a =>\n            {\n                Assert.True(a.Message.TryGetProperty(\"ns=23;i=1259\", out var doubleValue));\n                Assert.True(doubleValue.TryGetDouble(out _));\n            });\n        }\n\n        [Fact]\n        public async Task CanSendAddressSpaceDataToUnifiedNamespacePerWriterWithRawDataSetsAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendAddressSpaceDataToUnifiedNamespacePerWriterWithRawDataSetsAsync), \"./Resources/UnifiedNamespace.json\",\n                messageCollectionTimeout: TimeSpan.FromMinutes(1), messageCount: 10, version: MqttVersion.v5);\n\n            // Assert\n            Assert.NotEmpty(messages);\n            var currentTimes = messages.Where(m => m.Topic\n                .EndsWith(nameof(CanSendAddressSpaceDataToUnifiedNamespacePerWriterWithRawDataSetsAsync) + \"/Objects/Server/ServerStatus/CurrentTime\",\n                StringComparison.InvariantCulture)).ToList();\n            var outputs = messages.Where(m => m.Topic\n                .EndsWith(nameof(CanSendAddressSpaceDataToUnifiedNamespacePerWriterWithRawDataSetsAsync) + \"/Objects/Boilers/Boiler \\\\x231/DrumX001/LIX001/Output\",\n                StringComparison.InvariantCulture)).ToList();\n            Assert.NotEmpty(currentTimes);\n            Assert.NotEmpty(outputs);\n            if (currentTimes.Count + outputs.Count != messages.Count)\n            {\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n            }\n\n            // TODO: Fix  Assert.Equal(messages.Count, currentTimes.Count + outputs.Count);\n            Assert.All(currentTimes, a =>\n            {\n                Assert.True(a.Message.TryGetProperty(\"i=2258\", out var dateTimeValue));\n                Assert.True(dateTimeValue.TryGetDateTime(out _));\n            });\n            Assert.All(outputs, a =>\n            {\n                Assert.True(a.Message.TryGetProperty(\"ns=23;i=1259\", out var doubleValue));\n                Assert.True(doubleValue.TryGetDouble(out _));\n            });\n        }\n\n        [Fact]\n        public async Task CanSendModelChangeEventsToUnifiedNamespaceAsync()\n        {\n            // TODO: Fix\n            await Task.Delay(1);\n            return; // TODO FIX\n#if FALSE\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendModelChangeEventsToUnifiedNamespace), \"./Resources/ModelChanges.json\",\n                messageCollectionTimeout: TimeSpan.FromMinutes(1), messageCount: 10,\n                arguments: new[] { \"--mm=SingleRawDataSet\", \"--uns=UseBrowseNamesWithNamespaceIndex\" }, version: MqttVersion.v5);\n\n            // Assert\n            Assert.NotEmpty(messages);\n\n            var payload1 = messages[0].Message;\n            _output.WriteLine(payload1.ToJsonString());\n            Assert.NotEqual(JsonValueKind.Null, payload1.ValueKind);\n            Assert.True(Guid.TryParse(payload1.GetProperty(\"EventId\").GetString(), out _));\n            Assert.Equal(\"http://www.microsoft.com/opc-publisher#s=ReferenceChange\",\n                payload1.GetProperty(\"EventType\").GetString());\n            Assert.Equal(\"i=84\", payload1.GetProperty(\"SourceNode\").GetString());\n            Assert.True(DateTime.TryParse(payload1.GetProperty(\"Time\").GetString(), out _));\n            Assert.True(payload1.GetProperty(\"Change\").GetProperty(\"IsForward\").GetBoolean());\n            Assert.Equal(\"Objects\", payload1.GetProperty(\"Change\").GetProperty(\"DisplayName\").GetString());\n            Assert.EndsWith(\"/messages/<<UnknownWriterGroup>>\", messages[0].Topic, StringComparison.Ordinal);\n\n            var payload2 = messages[1].Message;\n            _output.WriteLine(payload2.ToJsonString());\n            Assert.NotEqual(JsonValueKind.Null, payload1.ValueKind);\n            Assert.True(Guid.TryParse(payload2.GetProperty(\"EventId\").GetString(), out _));\n            Assert.Equal(\"http://www.microsoft.com/opc-publisher#s=NodeChange\",\n                payload2.GetProperty(\"EventType\").GetString());\n            Assert.Equal(\"i=85\", payload2.GetProperty(\"SourceNode\").GetString());\n            Assert.True(DateTime.TryParse(payload2.GetProperty(\"Time\").GetString(), out _));\n            Assert.Equal(\"Objects\", payload2.GetProperty(\"Change\").GetProperty(\"DisplayName\").GetString());\n            Assert.EndsWith(\"/messages/<<UnknownWriterGroup>>/Objects\", messages[1].Topic, StringComparison.Ordinal);\n\n            // TODO: currently metadata is sent later\n            // Assert.NotNull(metadata);\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/SimpleEvents/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.SimpleEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public sealed class NodeServicesTests : TwinIntegrationTestBase,\n        IClassFixture<SimpleEventsServer>, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public NodeServicesTests(SimpleEventsServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private SimpleEventsServerTests<ConnectionModel> GetTests()\n        {\n            return new SimpleEventsServerTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly SimpleEventsServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleEventsQueryTestAsync()\n        {\n            return GetTests().CompileSimpleEventsQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/BrowsePathTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class BrowsePathTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public BrowsePathTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private BrowsePathTests<ConnectionModel> GetTests()\n        {\n            return new BrowsePathTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test3Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test3Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethodsTestAsync()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethodsTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/BrowseStreamTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class BrowseStreamTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public BrowseStreamTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private BrowseStreamTests<ConnectionModel> GetTests()\n        {\n            return new BrowseStreamTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [SkippableFact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseInRootTest1Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseInRootTest2Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseBoilersObjectsTest1Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter3Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter3Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter4Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter4Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter5Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter5Async(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDiagnosticsOperationsTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync(Ct);\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class BrowseTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public BrowseTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private BrowseServicesTests<ConnectionModel> GetTests()\n        {\n            return new BrowseServicesTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                    _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            return GetTests().NodeBrowseInRootTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            return GetTests().NodeBrowseInRootTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest1Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest2Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest3Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest3Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest4Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest4Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test1Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test2Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesWithValuesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesWithValuesTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesRawModeTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesRawModeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest1Async()\n        {\n            return GetTests().NodeBrowseContinuationTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest2Async()\n        {\n            return GetTests().NodeBrowseContinuationTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest3Async()\n        {\n            return GetTests().NodeBrowseContinuationTest3Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest4Async()\n        {\n            return GetTests().NodeBrowseContinuationTest4Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsInfoTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/CallArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class CallArrayTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public CallArrayTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test3Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test4Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test5Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test3Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test4Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test3Async(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/CallScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class CallScalarTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv311Fixture>\n    {\n        public CallScalarTests(TestDataServer server,\n            PublisherModuleMqttv311Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv311Fixture _module;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test3Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test4Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test5Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler2ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler2ResetTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler1ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler1ResetTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/MetadataArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class MetadataArrayTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public MetadataArrayTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n               _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/MetadataScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class MetadataScalarTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public MetadataScalarTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n               _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/MetadataTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class MetadataTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public MetadataTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private NodeMetadataTests<ConnectionModel> GetTests()\n        {\n            return new NodeMetadataTests<ConnectionModel>(\n               _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForFolderTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForFolderTypeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerObjectTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerObjectTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForConditionTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForConditionTypeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataTestForBaseEventTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataTestForBaseEventTypeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseInterfaceTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseInterfaceTypeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseDataVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseDataVariableTypeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForPropertyTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForPropertyTypeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForAudioVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForAudioVariableTypeTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerStatusVariableTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerStatusVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForRedundancySupportPropertyTestAsync()\n        {\n            return GetTests().NodeGetMetadataForRedundancySupportPropertyTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name, DisableParallelization = true)]\n    public class ReadCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataServerReadModuleMqtt\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/ValueReadArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ValueReadArrayTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv311Fixture>\n    {\n        public ValueReadArrayTests(TestDataServer server,\n            PublisherModuleMqttv311Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private ReadArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadArrayValueTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv311Fixture _module;\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableNodeClassTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableAccessLevelTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayBooleanValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArraySByteValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt16ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt16ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt32ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt32ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt64ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt64ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayFloatValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDoubleValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStringValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDateTimeValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayGuidValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteStringValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayXmlElementValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNodeIdValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayQualifiedNameValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayLocalizedTextValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStatusCodeValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayVariantValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayEnumerationValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStructureValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNumberValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayIntegerValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUIntegerValueVariableTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/ValueReadScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(ReadCollection.Name)]\n    public class ValueReadScalarTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public ValueReadScalarTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private ReadScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadScalarValueTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableNodeClassTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableAccessLevelTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarSByteValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt16ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt16ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt32ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt32ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt64ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt64ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarFloatValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDoubleValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStringValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDateTimeValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarGuidValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteStringValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarXmlElementValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNodeIdValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarQualifiedNameValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarLocalizedTextValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStatusCodeValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarVariantValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarEnumerationValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStructuredValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNumberValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarIntegerValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUIntegerValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadDataAccessMeasurementFloatValueTestAsync()\n        {\n            return GetTests().NodeReadDataAccessMeasurementFloatValueTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsNoneTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsStatusTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsDebugTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsDebugTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsVerboseTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/ValueWriteArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class ValueWriteArrayTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv5Fixture>\n    {\n        public ValueWriteArrayTests(TestDataServer server,\n            PublisherModuleMqttv5Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private WriteArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteArrayValueTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv5Fixture _module;\n\n        [Fact]\n        public Task NodeWriteStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayBooleanValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArraySByteValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt16ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt16ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt32ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt32ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt64ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt64ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayFloatValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDoubleValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDateTimeValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayGuidValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteStringValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayXmlElementValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayNodeIdValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayQualifiedNameValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayLocalizedTextValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStatusCodeValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayVariantValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayVariantValueVariableTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayEnumerationValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStructureValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest2Async(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/ValueWriteScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    [Collection(WriteCollection.Name)]\n    public class ValueWriteScalarTests : TwinIntegrationTestBase, IClassFixture<PublisherModuleMqttv311Fixture>\n    {\n        public ValueWriteScalarTests(TestDataServer server,\n            PublisherModuleMqttv311Fixture module, ITestOutputHelper output) : base(output)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private WriteScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteScalarValueTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleMqttv311Fixture _module;\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarSByteValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt16ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt16ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt32ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt32ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt64ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt64ValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarFloatValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDoubleValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStringValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDateTimeValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarGuidValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteStringValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarXmlElementValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNodeIdValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarQualifiedNameValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarLocalizedTextValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStatusCodeValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarVariantValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarEnumerationValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStructuredValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNumberValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarIntegerValueVariableTestAsync(Ct);\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUIntegerValueVariableTestAsync(Ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Mqtt/TestData/WriteCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Mqtt.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataServerWriteModuleMqtt\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Properties/AssemblyInfo.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#if !DEBUG\nusing Xunit;\n[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly, MaxParallelThreads = 4)]\n#endif\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/CyclicRead.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseReverseConnect\": \"{{UseReverseConnect}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=23;i=1259\",\n                \"OpcSamplingInterval\": 500,\n                \"FetchDisplayName\": true,\n                \"UseCyclicRead\": true,\n                \"CyclicReadMaxAge\": 500\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/DataItems.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=23;i=1259\",\n                \"OpcSamplingInterval\": 200,\n                \"OpcPublishingInterval\": 200,\n                \"DisplayName\": \"Output\",\n                \"SkipFirst\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/DataItems1.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=23;i=1259\"\n            },\n            {\n                \"Id\": \"i=2258\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/DataItems2.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseReverseConnect\": \"{{UseReverseConnect}}\",\n        \"EndpointSecurityMode\": \"{{SecurityMode}}\",\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"http://test.org/UA/Data/#i=11224\",\n                \"OpcSamplingInterval\": 100,\n                \"OpcPublishingInterval\": 100,\n                \"DisplayName\": \"Output2\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/Deadband.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"http://test.org/UA/Data/#i=11224\",\n                \"OpcSamplingInterval\": 1000,\n                \"OpcPublishingInterval\": 1000,\n                \"QueueSize\": 10,\n                \"DeadbandType\": \"Absolute\",\n                \"DeadbandValue\": 5.0,\n                \"DisplayName\": \"DoubleValues\"\n            },\n            {\n                \"Id\": \"http://test.org/UA/Data/#i=11206\",\n                \"OpcSamplingInterval\": 1000,\n                \"OpcPublishingInterval\": 1000,\n                \"QueueSize\": 10,\n                \"DeadbandType\": \"Percent\",\n                \"DeadbandValue\": 5.0,\n                \"DisplayName\": \"Int64Values\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/DmApiPayloadCollection.json",
    "content": "[\n    {\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"DisplayName\": \"StepUp\",\n                \"OpcSamplingIntervalTimespan\": \"00:00:02\",\n                \"OpcPublishingIntervalTimespan\": \"00:00:01.500\",\n                \"HeartbeatIntervalTimespan\": \"00:00:01.500\",\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"DisplayName\": \"StepUp\",\n                \"OpcSamplingInterval\": 2000,\n                \"OpcPublishingInterval\": 1500,\n                \"HeartbeatInterval\": 4,\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            }\n        ]\n    },\n    {\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"DisplayName\": \"FastUInt1\",\n                \"OpcSamplingIntervalTimespan\": \"00:00:02.000\",\n                \"OpcPublishingIntervalTimespan\": \"00:00:01.500\",\n                \"HeartbeatIntervalTimespan\": \"00:00:01.500\",\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            }\n        ]\n    },\n    {\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetWriterId\": \"Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetName\": \"Tag_Leaf1_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"Username\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"OpcSamplingInterval\": 2000,\n                \"OpcPublishingInterval\": 2000,\n                \"HeartbeatInterval\": 2,\n                \"SkipFirst\": false,\n                \"QueueSize\": 1\n            }\n        ]\n    },\n    {\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetWriterId\": \"Leaf2_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf2_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetPublishingIntervalTimespan\": \"00:00:02.500\",\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\",\n                \"DisplayName\": \"StepUp\",\n                \"OpcSamplingIntervalTimespan\": \"00:00:01.500\",\n                \"OpcPublishingIntervalTimespan\": \"00:00:01.500\",\n                \"HeartbeatIntervalTimespan\": \"00:00:01.500\",\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            }\n        ]\n    },\n    {\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetWriterId\": \"Leaf3_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetName\": \"Tag_Leaf3_10000_2e4fc28f-ffa2-4532-9f22-378d47bbee5d\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"Username\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"DataSetFieldId\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\",\n                \"OpcSamplingInterval\": 2000,\n                \"OpcPublishingInterval\": 2000,\n                \"HeartbeatInterval\": 2,\n                \"SkipFirst\": false,\n                \"QueueSize\": 1\n            },\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"SimpleEvents\",\n                \"QueueSize\": 10,\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Message\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CycleId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CurrentStep\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=16;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=StepUp\"\n            },\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt1\"\n            }\n        ]\n    },\n    {\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"nsu=http://microsoft.com/Opc/OpcPlc/;s=FastUInt2\"\n            }\n        ]\n    }\n\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/DmApiPayloadTwoEndpoints.json",
    "content": "﻿[\n    {\n        \"DataSetWriterGroup\": \"Leaf0\",\n        \"DataSetWriterId\": \"Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"DataSetName\": \"Tag_Leaf0_10000_3085991c-b85c-4311-9bfb-a916da952234\",\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=SlowUInt1\",\n                \"DataSetFieldId\": \"ns=2;s=SlowUInt1\",\n                \"DisplayName\": \"SlowUint1\",\n                \"OpcSamplingInterval\": 2000,\n                \"OpcPublishingInterval\": 1500,\n                \"HeartbeatInterval\": 4,\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            }\n        ]\n    },\n    {\n        \"DataSetWriterGroup\": \"Leaf1\",\n        \"DataSetWriterId\": \"Leaf1_10000_3085991c-b85c-4311-9bfb-a916da952235\",\n        \"DataSetName\": \"Tag_Leaf1_10000_3085991c-b85c-4311-9bfb-a916da952235\",\n        \"DataSetPublishingInterval\": 3000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"OpcAuthenticationMode\": \"Anonymous\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=SlowUInt2\",\n                \"DataSetFieldId\": \"ns=2;s=SlowUInt2\",\n                \"DisplayName\": \"SlowUint\",\n                \"OpcSamplingInterval\": 2000,\n                \"HeartbeatInterval\": 4,\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            }\n        ]\n    },\n    {\n        \"DataSetWriterGroup\": \"Leaf2\",\n        \"DataSetWriterId\": \"Leaf2_10000_3085991c-b85c-4311-9bfb-a916da952235\",\n        \"DataSetName\": \"Tag_Leaf2_10000_3085991c-b85c-4311-9bfb-a916da952235\",\n        \"DataSetPublishingInterval\": 10000,\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"SimpleEvents\",\n                \"QueueSize\": 10,\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Message\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CycleId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CurrentStep\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=16;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"UseSecurity\": false,\n        \"DataSetPublishingIntervalTimespan\": \"00:00:02\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=SlowUInt3\",\n                \"DataSetFieldId\": \"ns=2;s=SlowUInt3\",\n                \"DisplayName\": \"SlowUint\",\n                \"OpcSamplingInterval\": 2000,\n                \"HeartbeatInterval\": 4,\n                \"SkipFirst\": true,\n                \"QueueSize\": 10\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://opcplc:50000\",\n        \"OpcAuthenticationMode\": \"UsernamePassword\",\n        \"OpcAuthenticationUsername\": \"usr\",\n        \"OpcAuthenticationPassword\": \"pwd\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=FastUInt3\",\n                \"OpcPublishingInterval\": 1000\n            },\n            {\n                \"Id\": \"ns=2;s=FastUInt4\",\n                \"OpcPublishingInterval\": 2000\n            }\n        ]\n    },\n    {\n        \"EndpointUrl\": \"opc.tcp://opcplc:50010\",\n        \"OpcAuthenticationMode\": \"Anonymous\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=2;s=FastUInt1\",\n                \"OpcPublishingInterval\": 1000\n            },\n            {\n                \"Id\": \"ns=2;s=FastUInt2\",\n                \"OpcPublishingInterval\": 2000\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/ExtensionFields.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"DataSetExtensionFields\": {\n            \"EngineeringUnits\": \"mm/sec\",\n            \"AssetId\": 5,\n            \"Important\": false,\n            \"Variance\": 12.3465\n        },\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=23;i=1259\",\n                \"OpcSamplingInterval\": 200,\n                \"OpcPublishingInterval\": 200,\n                \"DisplayName\": \"Output\",\n                \"SkipFirst\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/Fixedvalue.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"EndpointSecurityMode\": \"{{SecurityMode}}\",\n        \"DataSetFetchDisplayNames\": true,\n        \"OpcNodes\": [\n            { \"Id\": \"i=2271\" },\n            { \"Id\": \"i=2254\" },\n            { \"Id\": \"i=2255\" }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/Heartbeat.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2271\",\n                \"HeartbeatInterval\": 1\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/Heartbeat2.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=23;i=1259\",\n                \"OpcSamplingInterval\": 100,\n                \"FetchDisplayName\": true,\n                \"OpcPublishingInterval\": 100,\n                \"HeartbeatInterval\": 1,\n                \"HeartbeatBehavior\": \"PeriodicLKVDropValue\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/HeartbeatErrors.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=932534\",\n                \"HeartbeatInterval\": 1\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/Isa95Jobs.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"Isa95JobResponseData\",\n                \"QueueSize\": 10,\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"nsu=http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/;i=1006\"\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/KeepAlive.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseReverseConnect\": \"{{UseReverseConnect}}\",\n        \"SendKeepAliveDataSetMessages\": true,\n        \"MaxKeepAliveCount\": 2,\n        \"MessagingMode\": \"PubSub\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2259\",\n                \"FetchDisplayName\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/KeyFrames.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"MessagingMode\": \"PubSub\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"DataSetExtensionFields\": {\n            \"EngineeringUnits\": \"mm/sec\",\n            \"AssetId\": 5,\n            \"Important\": false,\n            \"Variance\": 12.3465\n        },\n        \"DataSetKeyFrameCount\": 10,\n        \"DataSetPublishingInterval\": 100,\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2258\",\n                \"OpcSamplingInterval\": 100,\n                \"FetchDisplayName\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/ModelChanges.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"OpcNodes\": [\n            {\n                \"ModelChangeHandling\": {\n                    \"RebrowsePeriod\": \"00:00:10\"\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/PendingAlarms.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"DisplayName\": \"PendingAlarms\",\n                \"Id\": \"i=2253\",\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"i=2041\"\n                },\n                \"ConditionHandling\": {\n                    \"UpdateInterval\": 1,\n                    \"SnapshotInterval\": 2\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/RegisteredRead.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseReverseConnect\": \"{{UseReverseConnect}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=23;i=1259\",\n                \"OpcSamplingInterval\": 500,\n                \"FetchDisplayName\": true,\n                \"RegisterNode\": true,\n                \"UseCyclicRead\": true\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/SimpleEvents.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"SimpleEvents\",\n                \"QueueSize\": 10,\n                \"EventFilter\": {\n                    \"SelectClauses\": [\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"EventId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"i=2041\",\n                            \"BrowsePath\": [\n                                \"Message\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CycleId\"\n                            ]\n                        },\n                        {\n                            \"TypeDefinitionId\": \"ns=16;i=235\",\n                            \"BrowsePath\": [\n                                \"16:CurrentStep\"\n                            ]\n                        }\n                    ],\n                    \"WhereClause\": {\n                        \"Elements\": [\n                            {\n                                \"FilterOperator\": \"OfType\",\n                                \"FilterOperands\": [\n                                    {\n                                        \"Value\": \"ns=16;i=235\"\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/SimpleEvents2.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"Alarm\",\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"i=10060\"\n                }\n            },\n            {\n                \"Id\": \"i=2253\",\n                \"DisplayName\": \"CycleStarted\",\n                \"EventFilter\": {\n                    \"TypeDefinitionId\": \"ns=16;i=235\"\n                }\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/UnifiedNamespace.json",
    "content": "﻿[\n    {\n        \"EndpointUrl\": \"{{EndpointUrl}}\",\n        \"UseSecurity\": false,\n        \"DataSetWriterGroup\": \"{{DataSetWriterGroup}}\",\n        \"MessagingMode\": \"RawDataSets\",\n        \"DataSetRouting\": \"UseBrowseNames\",\n        \"OpcNodes\": [\n            {\n                \"Id\": \"ns=23;i=1259\"\n            },\n            {\n                \"Id\": \"i=2258\"\n            }\n        ]\n    }\n]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Resources/empty_pn.json",
    "content": "[]"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Runtime/CommandLineTest.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Runtime\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Runtime;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Test class to override Exit method\n    /// </summary>\n    public class CommandLineTest : CommandLineLogger\n    {\n        /// <summary>\n        /// Exit code\n        /// </summary>\n        public int ExitCode { get; set; } = -1;\n\n        /// <summary>\n        /// Warnings reported by StandaloneCliOptions.\n        /// </summary>\n        public IList<string> Warnings { get; } = [];\n\n        public CommandLine CommandLine { get; }\n\n        public CommandLineTest(string[] args)\n        {\n            CommandLine = new CommandLine(args, this);\n        }\n\n        /// <summary>\n        /// Set exit code\n        /// </summary>\n        /// <param name=\"exitCode\"></param>\n        public override void ExitProcess(int exitCode)\n        {\n            ExitCode = exitCode;\n        }\n\n        /// <inheritdoc/>\n        public override void Warning(string messageTemplate)\n        {\n            Warnings.Add(messageTemplate);\n        }\n\n        /// <inheritdoc/>\n        public override void Warning<T>(string messageTemplate, T propertyValue0)\n        {\n            Warnings.Add(messageTemplate + \"::\" + propertyValue0);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Runtime/PublisherCliTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Runtime\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Runtime;\n    using FluentAssertions;\n    using System;\n    using Xunit;\n\n    /// <summary>\n    /// Class to test Cli options\n    /// </summary>\n    public class PublisherCliTests\n    {\n        public PublisherCliTests()\n        {\n            Environment.SetEnvironmentVariable(\"IOTEDGE_DEVICEID\", \"deviceId\");\n        }\n\n        /// <summary>\n        /// ValidOptionTest\n        /// </summary>\n        /// <param name=\"expected\"></param>\n        /// <param name=\"param\"></param>\n        [Theory]\n        [InlineData(\"testValue\", new string[] { \"-dc\", \"testValue\" })]\n        [InlineData(\"testValue\", new string[] { \"--dc\", \"testValue\" })]\n        [InlineData(\"testValue\", new string[] { \"-ec\", \"testValue\" })]\n        [InlineData(\"testValue\", new string[] { \"--ec\", \"testValue\" })]\n        [InlineData(\"testValue\", new string[] { \"-deviceconnectionstring\", \"testValue\" })]\n        [InlineData(\"testValue\", new string[] { \"--deviceconnectionstring\", \"testValue\" })]\n        public void ValidOptionTest(string expected, string[] param)\n        {\n            var result = new CommandLine(param);\n\n            result.Count\n                .Should()\n                .Be(1);\n\n            result.Values.Should()\n                .Equal(expected);\n        }\n\n        /// <summary>\n        /// Valid boolean option test\n        /// </summary>\n        /// <param name=\"expected\"></param>\n        /// <param name=\"param\"></param>\n        [Theory]\n        [InlineData(\"True\", new string[] { \"-aa\" })]\n        [InlineData(\"True\", new string[] { \"--aa\" })]\n        [InlineData(\"True\", new string[] { \"-autoaccept\" })]\n        [InlineData(\"True\", new string[] { \"--autoaccept\" })]\n        [InlineData(\"True\", new string[] { \"--autoaccept=True\" })]\n        [InlineData(\"False\", new string[] { \"--autoaccept=False\" })]\n        [InlineData(\"False\", new string[] { \"-aa=false\" })]\n        [InlineData(\"True\", new string[] { \"-aa=true\" })]\n        [InlineData(\"True\", new string[] { \"-acceptuntrusted\" })]\n        [InlineData(\"True\", new string[] { \"--acceptuntrusted\" })]\n        [InlineData(\"True\", new string[] { \"--acceptuntrusted=True\" })]\n        [InlineData(\"False\", new string[] { \"--acceptuntrusted=False\" })]\n        [InlineData(\"True\", new string[] { \"--AutoAcceptUntrustedCertificates\" })]\n        [InlineData(\"True\", new string[] { \"--AutoAcceptUntrustedCertificates=True\" })]\n        public void ValidAutoAcceptUntrustedCertificatesOptionTest(string expected, string[] param)\n        {\n            var result = new CommandLine(param);\n\n            result.Count\n                .Should()\n                .Be(1);\n\n            result.Keys.Should()\n                .Equal(\"AutoAcceptUntrustedCertificates\");\n            result.Values.Should()\n                .Equal(expected);\n        }\n\n        /// <summary>\n        /// Valid boolean option test\n        /// </summary>\n        /// <param name=\"expected\"></param>\n        /// <param name=\"param\"></param>\n        [Theory]\n        [InlineData(\"True\", new string[] { \"-c\" })]\n        [InlineData(\"True\", new string[] { \"--c\" })]\n        [InlineData(\"True\", new string[] { \"-strict\" })]\n        [InlineData(\"True\", new string[] { \"--strict\" })]\n        [InlineData(\"True\", new string[] { \"--strict=True\" })]\n        [InlineData(\"False\", new string[] { \"--strict=False\" })]\n        [InlineData(\"True\", new string[] { \"--UseStandardsCompliantEncoding\" })]\n        [InlineData(\"True\", new string[] { \"--UseStandardsCompliantEncoding=True\" })]\n        public void ValidUseStandardsCompliantEncodingOptionTest(string expected, string[] param)\n        {\n            var result = new CommandLine(param);\n\n            result.Count\n                .Should()\n                .Be(1);\n\n            result.Keys.Should()\n                .Equal(PublisherConfig.UseStandardsCompliantEncodingKey);\n            result.Values.Should()\n                .Equal(expected);\n        }\n\n        /// <summary>\n        /// LegacyOptionTest\n        /// </summary>\n        /// <param name=\"cliOption\"></param>\n        /// <param name=\"param\"></param>\n        [Theory]\n        [InlineData(\"tc|telemetryconfigfile\", new string[] { \"-tc\", \"testValue\" })]\n        [InlineData(\"tc|telemetryconfigfile\", new string[] { \"--tc\", \"testValue\" })]\n        [InlineData(\"tc|telemetryconfigfile\", new string[] { \"-telemetryconfigfile\", \"testValue\" })]\n        [InlineData(\"tc|telemetryconfigfile\", new string[] { \"--telemetryconfigfile\", \"testValue\" })]\n        public void LegacyOptionTest(string cliOption, string[] param)\n        {\n            var result = new CommandLineTest(param);\n\n            result.CommandLine.Count.Should().Be(0);\n\n            result.Warnings.Count.Should().Be(1);\n            result.Warnings[0].Should().Be(\n                \"Legacy option {0} not supported, please use -h option to get all the supported options.\"\n                + \"::\" + cliOption\n            );\n        }\n\n        /// <summary>\n        /// UnsupportedOptionTest\n        /// </summary>\n        /// <param name=\"param\"></param>\n        [Theory]\n        [InlineData(\"-xx\")]\n        [InlineData(\"--xx\")]\n        [InlineData(\"--unknown\")]\n        [InlineData(\"-unknown\", \"testValue\")]\n        [InlineData(\"unknown=testValue\")]\n        public void UnsupportedOptionTest(params string[] param)\n        {\n            var result = new CommandLineTest(param);\n\n            result.CommandLine.Count.Should().Be(0);\n\n            result.Warnings.Count.Should().Be(param.Length);\n\n            for (var i = 0; i < result.Warnings.Count; ++i)\n            {\n                var warning = result.Warnings[i];\n                warning.Should().Be(\n                    \"Option {0} wrong or not supported, please use -h option to get all the supported options.\"\n                    + \"::\" + param[i]\n                );\n            }\n        }\n\n        /// <summary>\n        /// MissingOptionParameterTest\n        /// </summary>\n        /// <param name=\"param\"></param>\n        [Theory]\n        [InlineData(\"-dc\")]\n        [InlineData(\"--dc\")]\n        [InlineData(\"-deviceconnectionstring\")]\n        [InlineData(\"--deviceconnectionstring\")]\n        public void MissingOptionParameterTest(params string[] param)\n        {\n            var result = new CommandLineTest(param);\n\n            result.ExitCode.Should().Be(160);\n\n            result.Warnings.Count.Should().Be(1);\n            result.Warnings[0].Should().Be($\"Parse args exception {{0}}.::Missing required value for option '{param[0]}'.\");\n        }\n\n        /// <summary>\n        /// HelpOptionParameterTest\n        /// </summary>\n        /// <param name=\"param\"></param>\n        [Theory]\n        [InlineData([new string[] { \"-h\" }])]\n        [InlineData([new string[] { \"--h\" }])]\n        [InlineData([new string[] { \"-help\" }])]\n        [InlineData([new string[] { \"--help\" }])]\n        public void HelpOptionParameterTest(string[] param)\n        {\n            var result = new CommandLineTest(param);\n\n            result.ExitCode\n                .Should()\n                .Be(0);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Runtime/PublisherControllerTests.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Runtime\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using System;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class PublisherControllerTests : PublisherIntegrationTestBase\n    {\n        private readonly ITestOutputHelper _output;\n\n        public PublisherControllerTests(ITestOutputHelper output) : base(output)\n        {\n            _output = output;\n        }\n\n        [Fact]\n        public async Task GetApiKeyAndCertificateTestAsync()\n        {\n            const string name = nameof(GetApiKeyAndCertificateTestAsync);\n            StartPublisher(name, \"./Resources/empty_pn.json\", arguments: [\"--mm=PubSub\"]);\n            try\n            {\n                var apiKey = await PublisherApi.GetApiKeyAsync();\n                Assert.NotNull(apiKey);\n                Assert.NotNull(Convert.FromBase64String(apiKey));\n\n                var certificate = await PublisherApi.GetServerCertificateAsync();\n                Assert.NotNull(certificate);\n                using var x509 = X509Certificate2.CreateFromPem(certificate);\n                Assert.StartsWith(\"DC=\", x509.Subject, StringComparison.Ordinal);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task ShutdownTestAsync()\n        {\n            const string name = nameof(ShutdownTestAsync);\n            StartPublisher(name, \"./Resources/empty_pn.json\");\n            try\n            {\n                // We mocked this call\n                await PublisherApi.ShutdownAsync();\n                await PublisherApi.ShutdownAsync(true);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/Alarms/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.Alarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public sealed class NodeServicesTests : IClassFixture<AlarmsServer>, IClassFixture<PublisherModuleFixture>\n    {\n        public NodeServicesTests(AlarmsServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private AlarmServerTests<ConnectionModel> GetTests()\n        {\n            return new AlarmServerTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly AlarmsServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task BrowseAreaPathTestAsync()\n        {\n            return GetTests().BrowseAreaPathTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseMetalsSouthMotorTestAsync()\n        {\n            return GetTests().BrowseMetalsSouthMotorTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseColoursEastTankTestAsync()\n        {\n            return GetTests().BrowseColoursEastTankTestAsync();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest1Async()\n        {\n            return GetTests().CompileAlarmQueryTest1Async();\n        }\n\n        [Fact]\n        public Task CompileAlarmQueryTest2Async()\n        {\n            return GetTests().CompileAlarmQueryTest2Async();\n        }\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleTripAlarmQueryTestAsync()\n        {\n            return GetTests().CompileSimpleTripAlarmQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/DeterministicAlarms/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.DeterministicAlarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public sealed class NodeServicesTests1 : IClassFixture<DeterministicAlarmsServer1>, IClassFixture<PublisherModuleFixture>\n    {\n        public NodeServicesTests1(DeterministicAlarmsServer1 server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private DeterministicAlarmsTests1<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests1<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly DeterministicAlarmsServer1 _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1TemperatureHighTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1TemperatureHighTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2LightOffTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2LightOffTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync();\n        }\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine2DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine2DoorOpenTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/DeterministicAlarms/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.DeterministicAlarms\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public sealed class NodeServicesTests2 : IClassFixture<DeterministicAlarmsServer2>, IClassFixture<PublisherModuleFixture>\n    {\n        public NodeServicesTests2(DeterministicAlarmsServer2 server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private DeterministicAlarmsTests2<ConnectionModel> GetTests()\n        {\n            return new DeterministicAlarmsTests2<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly DeterministicAlarmsServer2 _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task BrowseAreaPathVendingMachine1DoorOpenTestAsync()\n        {\n            return GetTests().BrowseAreaPathVendingMachine1DoorOpenTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalAccess/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class NodeServicesTests : IClassFixture<PublisherModuleFixture>\n    {\n        public NodeServicesTests(HistoricalAccessServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private NodeHistoricalAccessTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalAccessTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetInt16NodeHistoryConfiguration()\n        {\n            return GetTests().HistoryGetInt16NodeHistoryConfigurationAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetInt64NodeHistoryConfigurationAsync()\n        {\n            return GetTests().HistoryGetInt64NodeHistoryConfigurationAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetNodeHistoryConfigurationFromBadNode()\n        {\n            return GetTests().HistoryGetNodeHistoryConfigurationFromBadNodeAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalAccess/ReadAtTimesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadAtTimesTests : IClassFixture<PublisherModuleFixture>\n    {\n        public ReadAtTimesTests(HistoricalAccessServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryReadValuesAtTimesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesAtTimesTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest1Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest2Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest3Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt32ValuesAtTimesTest4Async()\n        {\n            return GetTests().HistoryReadInt32ValuesAtTimesTest4Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt32ValuesAtTimesTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest1Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt32ValuesAtTimesTest2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt32ValuesAtTimesTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalAccess/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class ReadCollection : ICollectionFixture<HistoricalAccessServer>\n    {\n        public const string Name = \"HistoricalAccessServerReadModuleSdk\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalAccess/ReadModifiedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadModifiedTests : IClassFixture<PublisherModuleFixture>\n    {\n        public ReadModifiedTests(HistoricalAccessServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryReadValuesModifiedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesModifiedTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task HistoryReadInt16ValuesModifiedTestAsync()\n        {\n            return GetTests().HistoryReadInt16ValuesModifiedTestAsync();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt16ValuesModifiedTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt16ValuesModifiedTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalAccess/ReadProcessedTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadProcessedTests : IClassFixture<PublisherModuleFixture>\n    {\n        public ReadProcessedTests(HistoricalAccessServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryReadValuesProcessedTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesProcessedTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest1Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadUInt64ProcessedValuesTest2Async()\n        {\n            return GetTests().HistoryReadUInt64ProcessedValuesTest2Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryReadUInt64ProcessedValuesTest3Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryReadUInt64ProcessedValuesTest3Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest1Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest2Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamUInt64ProcessedValuesTest3Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamUInt64ProcessedValuesTest3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalAccess/ReadValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class ReadValuesTests : IClassFixture<PublisherModuleFixture>\n    {\n        public ReadValuesTests(HistoricalAccessServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryReadValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryReadValuesTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest1Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest2Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest3Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryReadInt64ValuesTest4Async()\n        {\n            return GetTests().HistoryReadInt64ValuesTest4Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt64ValuesTest1Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt64ValuesTest2Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest3Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt64ValuesTest3Async();\n        }\n\n        [SkippableFact]\n        public Task HistoryStreamInt64ValuesTest4Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().HistoryStreamInt64ValuesTest4Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalAccess/UpdateValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalAccess\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class UpdateValuesTests : IClassFixture<PublisherModuleFixture>\n    {\n        public UpdateValuesTests(HistoricalAccessServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private HistoryUpdateValuesTests<ConnectionModel> GetTests()\n        {\n            return new HistoryUpdateValuesTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<IHistoryServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalAccessServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryUpsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryUpsertUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryReplaceUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryReplaceUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest1Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest2Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest2Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest3Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest3Async();\n        }\n\n        [Fact]\n        public Task HistoryInsertDeleteUInt32ValuesTest4Async()\n        {\n            return GetTests().HistoryInsertDeleteUInt32ValuesTest4Async();\n        }\n\n        [Fact]\n        public Task HistoryDeleteUInt32ValuesTest1Async()\n        {\n            return GetTests().HistoryDeleteUInt32ValuesTest1Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalEvents/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class NodeServicesTests : IClassFixture<PublisherModuleFixture>\n    {\n        public NodeServicesTests(HistoricalEventsServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private NodeHistoricalEventsTests<ConnectionModel> GetTests()\n        {\n            return new NodeHistoricalEventsTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly HistoricalEventsServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/HistoricalEvents/ReadCollection.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.HistoricalEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class ReadCollection : ICollectionFixture<HistoricalEventsServer>\n    {\n        public const string Name = \"HistoricalEventsServerReadModuleSdk\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/Isa95Jobs/BasicPubSubIntegrationTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.Isa95Jobs\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using System;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class BasicPubSubIntegrationTests : PublisherIntegrationTestBase\n    {\n        internal const string EventId = \"EventId\";\n        internal const string Message = \"Message\";\n        internal const string JobResponseExpanded = \"nsu=http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/;JobResponse\";\n        internal const string JobStateExpanded = \"nsu=http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/;JobState\";\n        internal const string JobResponseUri = \"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/#JobResponse\";\n        internal const string JobStateUri = \"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/#JobState\";\n        private readonly ITestOutputHelper _output;\n        private readonly Isa95JobsServer _fixture;\n\n        public BasicPubSubIntegrationTests(ITestOutputHelper output)\n            : base(output)\n        {\n            _output = output;\n            _fixture = new Isa95JobsServer();\n            EndpointUrl = _fixture.EndpointUrl;\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            if (disposing)\n            {\n                _fixture.Dispose();\n            }\n        }\n\n        [Fact]\n        public async Task CanEncodeWithReversibleEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanEncodeWithReversibleEncodingTestAsync),\n                \"./Resources/Isa95Jobs.json\", TimeSpan.FromMinutes(2), 4, messageType: \"ua-data\",\n                arguments: [\"--mm=PubSub\", \"--me=JsonReversible\", \"--dm=false\"]\n            );\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var payload = m.GetProperty(\"Payload\");\n                var eventId = payload.GetProperty(EventId).GetProperty(\"Value\");\n                Assert.Equal(\"ByteString\", eventId.GetProperty(\"Type\").GetString());\n                Assert.Equal(JsonValueKind.String, eventId.GetProperty(\"Body\").ValueKind);\n\n                var message = payload.GetProperty(Message).GetProperty(\"Value\");\n                Assert.Equal(\"LocalizedText\", message.GetProperty(\"Type\").GetString());\n                Assert.Equal(JsonValueKind.String, message.GetProperty(\"Body\").GetProperty(\"Text\").ValueKind);\n                Assert.Equal(\"en-US\", message.GetProperty(\"Body\").GetProperty(\"Locale\").GetString());\n\n                var jobState = payload.GetProperty(JobStateUri).GetProperty(\"Value\");\n                Assert.Equal(\"ExtensionObject\", jobState.GetProperty(\"Type\").GetString());\n                var jobResponse = payload.GetProperty(JobResponseUri).GetProperty(\"Value\");\n                Assert.Equal(\"ExtensionObject\", jobResponse.GetProperty(\"Type\").GetString());\n\n                var extensionObject = jobResponse.GetProperty(\"Body\");\n                Assert.Equal(\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/#i=3013\", extensionObject.GetProperty(\"TypeId\").GetString());\n                Assert.Equal(\"Json\", extensionObject.GetProperty(\"Encoding\").GetString());\n                var body = extensionObject.GetProperty(\"Body\");\n                var equipmentActuals = body.GetProperty(\"EquipmentActuals\");\n                var materialActuals = body.GetProperty(\"MaterialActuals\");\n                Assert.Equal(JsonValueKind.Array, equipmentActuals.ValueKind);\n                Assert.Equal(JsonValueKind.Array, materialActuals.ValueKind);\n\n                Assert.Equal(2, equipmentActuals.GetArrayLength());\n                Assert.Equal(2, materialActuals.GetArrayLength());\n\n                Assert.All(equipmentActuals.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"EquipmentUse\").ValueKind);\n                    Assert.Equal(\"consumable\", e.GetProperty(\"EquipmentUse\").GetString());\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"Quantity\").ValueKind);\n                });\n                Assert.All(materialActuals.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"MaterialClassID\").ValueKind);\n                    Assert.True(e.GetProperty(\"MaterialClassID\").TryGetGuid(out _));\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"MaterialUse\").ValueKind);\n                    Assert.Equal(\"consumable\", e.GetProperty(\"MaterialUse\").GetString());\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"Quantity\").ValueKind);\n                });\n\n                extensionObject = jobState.GetProperty(\"Body\");\n                Assert.Equal(\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/#i=3015\", extensionObject.GetProperty(\"TypeId\").GetString());\n                Assert.Equal(\"Json\", extensionObject.GetProperty(\"Encoding\").GetString());\n                body = extensionObject.GetProperty(\"Body\");\n                var state = body.GetProperty(\"State\");\n                Assert.Equal(JsonValueKind.Array, state.ValueKind);\n                Assert.Equal(3, state.GetArrayLength());\n                Assert.All(state.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.Array, e.GetProperty(\"BrowsePath\").GetProperty(\"Elements\").ValueKind);\n                    Assert.True(e.GetProperty(\"StateNumber\").TryGetInt32(out _));\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"StateText\").GetProperty(\"Text\").ValueKind);\n                    Assert.Equal(\"en-US\", e.GetProperty(\"StateText\").GetProperty(\"Locale\").GetString());\n                });\n            });\n        }\n\n        [Fact]\n        public async Task CanEncodeEventWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanEncodeEventWithCompliantEncodingTestAsync),\n                \"./Resources/Isa95Jobs.json\", messageType: \"ua-data\",\n                arguments: [\"-c\", \"--mm=PubSub\", \"--me=Json\"]);\n\n            Assert.Single(result);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var value = m.GetProperty(\"Payload\");\n\n                // Variant encoding is the default\n                var eventId = value.GetProperty(EventId).GetProperty(\"Value\");\n                var message = value.GetProperty(Message).GetProperty(\"Value\");\n                var jobResponse = value.GetProperty(JobResponseExpanded).GetProperty(\"Value\");\n\n                var equipmentActuals = jobResponse.GetProperty(\"EquipmentActuals\");\n                var materialActuals = jobResponse.GetProperty(\"MaterialActuals\");\n\n                Assert.Equal(JsonValueKind.String, eventId.ValueKind);\n                Assert.Equal(JsonValueKind.String, message.ValueKind);\n                Assert.Equal(JsonValueKind.Array, equipmentActuals.ValueKind);\n                Assert.Equal(JsonValueKind.Array, materialActuals.ValueKind);\n\n                Assert.Equal(2, equipmentActuals.GetArrayLength());\n                Assert.Equal(2, materialActuals.GetArrayLength());\n\n                Assert.All(equipmentActuals.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"EquipmentUse\").ValueKind);\n                    Assert.Equal(\"consumable\", e.GetProperty(\"EquipmentUse\").GetString());\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"Quantity\").ValueKind);\n                });\n                Assert.All(materialActuals.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"MaterialClassID\").ValueKind);\n                    Assert.True(e.GetProperty(\"MaterialClassID\").TryGetGuid(out _));\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"MaterialUse\").ValueKind);\n                    Assert.Equal(\"consumable\", e.GetProperty(\"MaterialUse\").GetString());\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"Quantity\").ValueKind);\n                });\n\n                var jobState = value.GetProperty(JobStateExpanded).GetProperty(\"Value\");\n                var state = jobState.GetProperty(\"State\");\n                Assert.Equal(JsonValueKind.Array, state.ValueKind);\n                Assert.Equal(3, state.GetArrayLength());\n                Assert.All(state.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.Array, e.GetProperty(\"BrowsePath\").GetProperty(\"Elements\").ValueKind);\n                    Assert.True(e.GetProperty(\"StateNumber\").TryGetInt32(out _));\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"StateText\").ValueKind);\n                });\n            });\n        }\n\n        [Fact]\n        public async Task CanEncodeWithReversibleEncodingAndWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanEncodeWithReversibleEncodingAndWithCompliantEncodingTestAsync),\n                \"./Resources/Isa95Jobs.json\", TimeSpan.FromMinutes(2), 4, messageType: \"ua-data\",\n                arguments: [\"-c\", \"--mm=PubSub\", \"--me=JsonReversible\"]);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var payload = m.GetProperty(\"Payload\");\n                var eventId = payload.GetProperty(EventId).GetProperty(\"Value\");\n                Assert.Equal(15, eventId.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(JsonValueKind.String, eventId.GetProperty(\"Body\").ValueKind);\n\n                var message = payload.GetProperty(Message).GetProperty(\"Value\");\n                Assert.Equal(21, message.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(JsonValueKind.String, message.GetProperty(\"Body\").GetProperty(\"Text\").ValueKind);\n                Assert.Equal(\"en-US\", message.GetProperty(\"Body\").GetProperty(\"Locale\").GetString());\n\n                var jobResponse = payload.GetProperty(JobResponseExpanded).GetProperty(\"Value\");\n                Assert.Equal(22, jobResponse.GetProperty(\"Type\").GetInt32());\n                var jobState = payload.GetProperty(JobStateExpanded).GetProperty(\"Value\");\n                Assert.Equal(22, jobState.GetProperty(\"Type\").GetInt32());\n\n                var extensionObject = jobResponse.GetProperty(\"Body\");\n                Assert.Equal(3013, extensionObject.GetProperty(\"TypeId\").GetProperty(\"Id\").GetInt32());\n                Assert.Equal(2, extensionObject.GetProperty(\"TypeId\").GetProperty(\"Namespace\").GetInt32());\n                var body = extensionObject.GetProperty(\"Body\");\n                var equipmentActuals = body.GetProperty(\"EquipmentActuals\");\n                var materialActuals = body.GetProperty(\"MaterialActuals\");\n                Assert.Equal(JsonValueKind.Array, equipmentActuals.ValueKind);\n                Assert.Equal(JsonValueKind.Array, materialActuals.ValueKind);\n\n                Assert.Equal(2, equipmentActuals.GetArrayLength());\n                Assert.Equal(2, materialActuals.GetArrayLength());\n\n                Assert.All(equipmentActuals.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"EquipmentUse\").ValueKind);\n                    Assert.Equal(\"consumable\", e.GetProperty(\"EquipmentUse\").GetString());\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"Quantity\").ValueKind);\n                });\n                Assert.All(materialActuals.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"MaterialClassID\").ValueKind);\n                    Assert.True(e.GetProperty(\"MaterialClassID\").TryGetGuid(out _));\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"MaterialUse\").ValueKind);\n                    Assert.Equal(\"consumable\", e.GetProperty(\"MaterialUse\").GetString());\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"Quantity\").ValueKind);\n                });\n\n                extensionObject = jobState.GetProperty(\"Body\");\n                Assert.Equal(3015, extensionObject.GetProperty(\"TypeId\").GetProperty(\"Id\").GetInt32());\n                Assert.Equal(2, extensionObject.GetProperty(\"TypeId\").GetProperty(\"Namespace\").GetInt32());\n                body = extensionObject.GetProperty(\"Body\");\n                var state = body.GetProperty(\"State\");\n                Assert.Equal(JsonValueKind.Array, state.ValueKind);\n                Assert.Equal(3, state.GetArrayLength());\n                Assert.All(state.EnumerateArray(), e =>\n                {\n                    Assert.Equal(JsonValueKind.Array, e.GetProperty(\"BrowsePath\").GetProperty(\"Elements\").ValueKind);\n                    Assert.True(e.GetProperty(\"StateNumber\").TryGetInt32(out _));\n                    Assert.Equal(JsonValueKind.String, e.GetProperty(\"StateText\").GetProperty(\"Text\").ValueKind);\n                    Assert.Equal(\"en-US\", e.GetProperty(\"StateText\").GetProperty(\"Locale\").GetString());\n                });\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/Plc/NodeServicesTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.Plc\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public sealed class NodeServicesTests1 : IClassFixture<PlcServer>, IClassFixture<PublisherModuleFixture>\n    {\n        public NodeServicesTests1(PlcServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private SimulatorNodesTests<ConnectionModel> GetTests()\n        {\n            return new SimulatorNodesTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly PlcServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task AlternatingBooleanTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().AlternatingBooleanTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task BadNodeHasAlternatingStatusCodeAsync()\n        {\n            return GetTests().BadNodeHasAlternatingStatusCodeAsync();\n        }\n\n        [Fact]\n        public Task FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync();\n        }\n\n        [Fact]\n        public Task FastUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().FastUIntScalar1TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task NegativeTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().NegativeTrendDataNodeHasValueWithTrendAsync();\n        }\n\n        [Fact]\n        public Task NegativeTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().NegativeTrendDataTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task PositiveTrendDataNodeHasValueWithTrendAsync()\n        {\n            return GetTests().PositiveTrendDataNodeHasValueWithTrendAsync();\n        }\n\n        [Fact]\n        public Task PositiveTrendDataTelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().PositiveTrendDataTelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task RandomSignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomSignedInt32TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task RandomUnsignedInt32TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().RandomUnsignedInt32TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync()\n        {\n            return GetTests().SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync();\n        }\n\n        [Fact]\n        public Task SlowUIntScalar1TelemetryChangesWithPeriodAsync()\n        {\n            return GetTests().SlowUIntScalar1TelemetryChangesWithPeriodAsync();\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInDipDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInDipDataAsync();\n        }\n\n        [Fact]\n        public Task TelemetryContainsOutlierInSpikeDataAsync()\n        {\n            return GetTests().TelemetryContainsOutlierInSpikeDataAsync();\n        }\n\n        [Fact]\n        public Task TelemetryFastNodeTestAsync()\n        {\n            return GetTests().TelemetryFastNodeTestAsync();\n        }\n\n        [Fact]\n        public Task TelemetryStepUpTestAsync()\n        {\n            return GetTests().TelemetryStepUpTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/Plc/NodeServicesTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.Plc\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public sealed class NodeServicesTests2 : IClassFixture<PlcServer>, IClassFixture<PublisherModuleFixture>\n    {\n        public NodeServicesTests2(PlcServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private PlcModelComplexTypeTests<ConnectionModel> GetTests()\n        {\n            return new PlcModelComplexTypeTests<ConnectionModel>(_server,\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly PlcServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task PlcModelHeaterTestsAsync()\n        {\n            return GetTests().PlcModelHeaterTestsAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/ReferenceServer/AdvancedPubSubIntegrationTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.ReferenceServer\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Json.More;\n    using System;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class AdvancedPubSubIntegrationTests : PublisherIntegrationTestBase\n    {\n        private readonly ITestOutputHelper _output;\n\n        public AdvancedPubSubIntegrationTests(ITestOutputHelper output) : base(output)\n        {\n            _output = output;\n        }\n\n        [Fact]\n        public async Task RestartServerTestAsync()\n        {\n            var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n            const string name = nameof(RestartServerTestAsync);\n            StartPublisher(name, \"./Resources/Fixedvalue.json\",\n                arguments: [\"--mm=PubSub\", \"--dm=false\"], keepAliveInterval: 1);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                AssertFixedValueMessage(message);\n                Assert.NotNull(metadata);\n\n                await server.RestartAsync(WaitUntilDisconnectedAsync);\n                _output.WriteLine(\"Restarted server\");\n\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                message = Assert.Single(messages).Message;\n                AssertFixedValueMessage(message);\n\n                // When we recreated the session we did not handle new metadata but now that we create we do.\n                // Assert.Null(metadata);\n                Assert.NotNull(metadata);\n            }\n            finally\n            {\n                server.Dispose();\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task RestartServerWithHeartbeatTestAsync()\n        {\n            var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n            const string name = nameof(RestartServerWithHeartbeatTestAsync);\n            StartPublisher(name, \"./Resources/Heartbeat2.json\",\n                arguments: [\"--mm=PubSub\", \"--dm=false\", \"--bs=1\"], keepAliveInterval: 1);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                Assert.NotNull(metadata);\n\n                await server.RestartAsync(WaitUntilDisconnectedAsync);\n                _output.WriteLine(\"Restarted server\");\n\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromSeconds(10), 1000,\n                    messageType: \"ua-data\");\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromSeconds(10), 1,\n                    messageType: \"ua-data\");\n\n                message = Assert.Single(messages).Message;\n                _output.WriteLine(message.ToJsonString());\n                var output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n            }\n            finally\n            {\n                server.Dispose();\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task RestartServerWithCyclicReadTestAsync()\n        {\n            var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n            const string name = nameof(RestartServerWithCyclicReadTestAsync);\n            StartPublisher(name, \"./Resources/CyclicRead.json\",\n                arguments: [\"--mm=PubSub\", \"--dm=false\"], keepAliveInterval: 1);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                Assert.NotNull(metadata);\n\n                await server.RestartAsync(WaitUntilDisconnectedAsync);\n                _output.WriteLine(\"Restarted server\");\n\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromSeconds(10), 1000,\n                    messageType: \"ua-data\");\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                message = Assert.Single(messages).Message;\n            }\n            finally\n            {\n                server.Dispose();\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task SwitchServerWithSameWriterGroupTestAsync()\n        {\n            var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n\n            const string name = nameof(SwitchServerWithSameWriterGroupTestAsync);\n            StartPublisher(name, \"./Resources/DataItems.json\", arguments: [\"--mm=PubSub\", \"--dm=false\"]);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                var output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n                Assert.NotNull(metadata);\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(name, diag.Endpoint.DataSetWriterGroup);\n\n                // Switch to new server\n                var old = server;\n                server = new ReferenceServer();\n                EndpointUrl = server.EndpointUrl;\n                old.Dispose();\n\n                // Point to new server\n                WritePublishedNodes(name, \"./Resources/DataItems.json\");\n\n                // Now we should have torn down the other subscription\n\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                message = Assert.Single(messages).Message;\n                _output.WriteLine(message.ToJsonString());\n\n                output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n                diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                for (var i = 0; i < 10 && diagnostics.Count == 0; i++)\n                {\n                    _output.WriteLine($\"######### {i}: Failed to get diagnosticsinfo.\");\n                    await Task.Delay(1000);\n                    diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                }\n\n                diag = Assert.Single(diagnostics);\n                Assert.Equal(name, diag.Endpoint.DataSetWriterGroup);\n            }\n            finally\n            {\n                server.Dispose();\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task SwitchServerWithDifferentWriterGroupTestAsync()\n        {\n            var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n            const string name = nameof(SwitchServerWithDifferentWriterGroupTestAsync);\n            StartPublisher(name, \"./Resources/DataItems2.json\", arguments: [\"--mm=PubSub\", \"--dm=false\"]);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                var output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output2\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n                Assert.NotNull(metadata);\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(name, diag.Endpoint.DataSetWriterGroup);\n\n                // Switch to new server\n                var old = server;\n                server = new ReferenceServer();\n                EndpointUrl = server.EndpointUrl;\n                old.Dispose();\n\n                // Point to new server\n                const string name2 = nameof(SwitchServerWithDifferentWriterGroupTestAsync) + \"new\";\n                WritePublishedNodes(name2, \"./Resources/DataItems2.json\");\n\n                // Now we should have torn down the other subscription\n\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    predicate: WaitUntilOutput2, messageType: \"ua-data\");\n\n                message = Assert.Single(messages).Message;\n                _output.WriteLine(message.ToJsonString());\n\n                output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output2\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n                diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                for (var i = 0; i < 10 &&\n                    (diagnostics.Count != 1 || diagnostics[0].Endpoint.DataSetWriterGroup != name2); i++)\n                {\n                    _output.WriteLine($\"######### {i}: Failed to get diagnosticsinfo.\");\n                    await Task.Delay(1000);\n                    diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                }\n\n                diag = Assert.Single(diagnostics);\n                Assert.Equal(name2, diag.Endpoint.DataSetWriterGroup);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n                server.Dispose();\n            }\n        }\n\n        [Theory]\n        [InlineData(false, 100)]\n        [InlineData(true, 100)]\n        [InlineData(false, 1)]\n        [InlineData(true, 1)]\n        public async Task AddNodeToDataSetWriterGroupWithNodeUsingDeviceMethodAsync(bool differentPublishingInterval,\n            int maxMonitoredItems)\n        {\n            var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n            const string name = nameof(AddNodeToDataSetWriterGroupWithNodeUsingDeviceMethodAsync);\n            var testInput1 = GetEndpointsFromFile(name, \"./Resources/DataItems.json\");\n            var testInput2 = GetEndpointsFromFile(name, \"./Resources/DataItems2.json\");\n            if (!differentPublishingInterval)\n            {\n                // Set both to the same so that there is a single writer instead of 2\n                testInput2[0].OpcNodes[0].OpcPublishingInterval = testInput1[0].OpcNodes[0].OpcPublishingInterval;\n            }\n            StartPublisher(name, arguments: [\"--mm=PubSub\", \"--dm=false\", \"--xmi=\" + maxMonitoredItems]);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput1[0]);\n                Assert.NotNull(result);\n\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                var message = Assert.Single(messages).Message;\n                var output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n                Assert.NotNull(metadata);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                var n = Assert.Single(nodes.OpcNodes);\n                Assert.Equal(testInput1[0].OpcNodes[0].Id, n.Id);\n\n                // Add another node\n                result = await PublisherApi.PublishNodesAsync(testInput2[0]);\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                e = Assert.Single(endpoints.Endpoints);\n\n                nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                Assert.Equal(2, nodes.OpcNodes.Count);\n                Assert.Contains(testInput1[0].OpcNodes[0].Id, nodes.OpcNodes.Select(e => e.Id));\n                Assert.Contains(testInput2[0].OpcNodes[0].Id, nodes.OpcNodes.Select(e => e.Id));\n\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    predicate: WaitUntilOutput2, messageType: \"ua-data\");\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(0, diag.MonitoredOpcNodesFailedCount);\n                Assert.Equal(2, diag.MonitoredOpcNodesSucceededCount);\n\n                // Remove endpoint\n                result = await PublisherApi.UnpublishNodesAsync(e);\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n                server.Dispose();\n            }\n        }\n\n        [Fact]\n        public async Task SwitchServerWithDifferentDataTestAsync()\n        {\n            var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n            const string name = nameof(SwitchServerWithDifferentDataTestAsync);\n            StartPublisher(name, \"./Resources/DataItems.json\", arguments: [\"--mm=PubSub\", \"--dm=false\"]);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                var output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n                Assert.NotNull(metadata);\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(name, diag.Endpoint.DataSetWriterGroup);\n\n                WritePublishedNodes(name, \"./Resources/empty_pn.json\");\n                for (var i = 0; i < 10 && diagnostics.Count != 0; i++)\n                {\n                    diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                    await Task.Delay(1000);\n                }\n                Assert.Empty(diagnostics);\n\n                // Switch to different server\n                var old = server;\n                server = new ReferenceServer();\n                EndpointUrl = server.EndpointUrl;\n                old.Dispose();\n\n                // Point to new server\n                WritePublishedNodes(name, \"./Resources/DataItems2.json\");\n\n                // Now we should have torn down the other subscription\n\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    predicate: WaitUntilOutput2, messageType: \"ua-data\");\n\n                message = Assert.Single(messages).Message;\n                _output.WriteLine(message.ToJsonString());\n\n                output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output2\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n                Assert.NotNull(metadata);\n\n                diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                diag = Assert.Single(diagnostics);\n                Assert.Equal(name, diag.Endpoint.DataSetWriterGroup);\n            }\n            finally\n            {\n                server.Dispose();\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task SwitchSecuritySettingsTestAsync()\n        {\n            var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n            const string name = nameof(SwitchSecuritySettingsTestAsync);\n            StartPublisher(name, \"./Resources/Fixedvalue.json\", arguments: [\"--mm=PubSub\", \"--dm=false\", \"--aa\"],\n                securityMode: Models.SecurityMode.SignAndEncrypt);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                AssertFixedValueMessage(message);\n                Assert.NotNull(metadata);\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(Models.SecurityMode.SignAndEncrypt, diag.Endpoint.EndpointSecurityMode);\n\n                WritePublishedNodes(name, \"./Resources/Fixedvalue.json\", securityMode: Models.SecurityMode.None);\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                message = Assert.Single(messages).Message;\n                AssertFixedValueMessage(message);\n                Assert.NotNull(metadata);\n\n                diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                diag = Assert.Single(diagnostics);\n                Assert.Null(diag.Endpoint.EndpointSecurityMode);\n\n                WritePublishedNodes(name, \"./Resources/Fixedvalue.json\", securityMode: Models.SecurityMode.Sign);\n                (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                message = Assert.Single(messages).Message;\n                AssertFixedValueMessage(message);\n                Assert.NotNull(metadata);\n\n                diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                diag = Assert.Single(diagnostics);\n                Assert.Equal(Models.SecurityMode.Sign, diag.Endpoint.EndpointSecurityMode);\n            }\n            finally\n            {\n                server.Dispose();\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task RestartConfigurationTestAsync()\n        {\n            using var server = new ReferenceServer();\n            EndpointUrl = server.EndpointUrl;\n            for (var cycles = 0; cycles < 3; cycles++)\n            {\n                const string name = nameof(RestartConfigurationTestAsync);\n                StartPublisher(name, \"./Resources/DataItems.json\", arguments: [\"--mm=PubSub\", \"--dm=false\"]);\n                try\n                {\n                    // Arrange\n                    // Act\n                    await WaitForMessagesAndMetadataAsync(TimeSpan.FromSeconds(5), 1, messageType: \"ua-data\");\n\n                    const string name2 = nameof(RestartConfigurationTestAsync) + \"new\";\n                    WritePublishedNodes(name2, \"./Resources/DataItems2.json\");\n                    var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                    for (var i = 0; i < 60 &&\n                        (diagnostics.Count != 1 || diagnostics[0].Endpoint.DataSetWriterGroup != name2); i++)\n                    {\n                        _output.WriteLine($\"######### {i}: Failed to get diagnosticsinfo.\");\n                        await Task.Delay(500);\n                        diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                    }\n                    var diag = Assert.Single(diagnostics);\n                    Assert.Equal(name2, diag.Endpoint.DataSetWriterGroup);\n                }\n                finally\n                {\n                    await StopPublisherAsync();\n                }\n            }\n        }\n\n        internal static JsonElement WaitUntilOutput2(JsonElement jsonElement)\n        {\n            var messages = jsonElement.GetProperty(\"Messages\");\n            if (messages.ValueKind == JsonValueKind.Array)\n            {\n                var element = messages.EnumerateArray().FirstOrDefault();\n                if (element.GetProperty(\"Payload\").TryGetProperty(\"Output2\", out _))\n                {\n                    return jsonElement;\n                }\n            }\n            return default;\n        }\n\n        private async Task WaitUntilDisconnectedAsync()\n        {\n            using var cts = new CancellationTokenSource(60000);\n            while (true)\n            {\n                cts.Token.ThrowIfCancellationRequested();\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync(cts.Token);\n                var diag = Assert.Single(diagnostics);\n                if (!diag.OpcEndpointConnected)\n                {\n                    _output.WriteLine(\"Disconnected!\");\n                    break;\n                }\n                await Task.Delay(1000, cts.Token);\n            }\n        }\n\n        internal static void AssertFixedValueMessage(JsonElement message)\n        {\n            var m = message.GetProperty(\"Messages\")[0];\n            var type = m.GetProperty(\"MessageType\").GetString();\n            // TODO       Assert.Equal(\"ua-keyframe\", type);\n            var payload1 = m.GetProperty(\"Payload\");\n            var items1 = new[]\n            {\n                payload1.GetProperty(\"LocaleIdArray\"),\n                payload1.GetProperty(\"ServerArray\"),\n                payload1.GetProperty(\"NamespaceArray\")\n            };\n            Assert.All(items1, item =>\n                Assert.Equal(JsonValueKind.Array, item.GetProperty(\"Value\").ValueKind));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/ReferenceServer/BasicPubSubIntegrationTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.ReferenceServer\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using FluentAssertions;\n    using Json.More;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class BasicPubSubIntegrationTests : PublisherIntegrationTestBase\n    {\n        internal const string EventId = \"EventId\";\n        internal const string Message = \"Message\";\n        internal const string CycleIdExpanded = \"nsu=http://opcfoundation.org/SimpleEvents;CycleId\";\n        internal const string CurrentStepExpanded = \"nsu=http://opcfoundation.org/SimpleEvents;CurrentStep\";\n        internal const string CycleIdUri = \"http://opcfoundation.org/SimpleEvents#CycleId\";\n        internal const string CurrentStepUri = \"http://opcfoundation.org/SimpleEvents#CurrentStep\";\n        private readonly ITestOutputHelper _output;\n        private readonly ReferenceServer _fixture;\n\n        public BasicPubSubIntegrationTests(ITestOutputHelper output)\n            : base(output)\n        {\n            _output = output;\n            _fixture = new ReferenceServer();\n            EndpointUrl = _fixture.EndpointUrl;\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            if (disposing)\n            {\n                _fixture.Dispose();\n            }\n        }\n\n        [Fact]\n        public async Task CanSendDataItemToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemToIoTHubTestAsync), \"./Resources/DataItems.json\",\n                messageType: \"ua-data\", arguments: [\"--mm=PubSub\", \"--dm=false\"]);\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            var output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n            Assert.NotNull(metadata);\n        }\n\n        [Fact]\n        public async Task CanSendModelChangeEventsToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var messages = await ProcessMessagesAsync(nameof(CanSendModelChangeEventsToIoTHubTestAsync), \"./Resources/ModelChanges.json\",\n                TimeSpan.FromMinutes(2), 5, messageType: \"ua-data\", arguments: [\"--mm=PubSub\", \"--dm=false\"]);\n\n            // Assert\n            Assert.NotEmpty(messages);\n            var payload1 = messages[0].Message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\");\n            _output.WriteLine(payload1.ToJsonString());\n            Assert.NotEqual(JsonValueKind.Null, payload1.ValueKind);\n            Assert.True(Guid.TryParse(payload1.GetProperty(\"EventId\").GetProperty(\"Value\").GetString(), out _));\n            Assert.Equal(\"http://www.microsoft.com/opc-publisher#s=ReferenceChange\",\n                payload1.GetProperty(\"EventType\").GetProperty(\"Value\").GetString());\n            Assert.True(DateTime.TryParse(payload1.GetProperty(\"Time\").GetProperty(\"Value\").GetString(), out _));\n            Assert.True(payload1.GetProperty(\"Change\").GetProperty(\"Value\").GetProperty(\"IsForward\").GetBoolean());\n            // NO order anymore:\n            // Assert.Equal(\"i=84\", payload1.GetProperty(\"SourceNode\").GetProperty(\"Value\").GetString());\n            // Assert.Equal(\"Objects\", payload1.GetProperty(\"Change\").GetProperty(\"Value\").GetProperty(\"DisplayName\").GetString());\n\n            var payload2 = messages[1].Message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\");\n            _output.WriteLine(payload2.ToJsonString());\n            Assert.NotEqual(JsonValueKind.Null, payload1.ValueKind);\n            Assert.True(Guid.TryParse(payload2.GetProperty(\"EventId\").GetProperty(\"Value\").GetString(), out _));\n            Assert.Equal(\"http://www.microsoft.com/opc-publisher#s=NodeChange\",\n                payload2.GetProperty(\"EventType\").GetProperty(\"Value\").GetString());\n            Assert.True(DateTime.TryParse(payload2.GetProperty(\"Time\").GetProperty(\"Value\").GetString(), out _));\n            // NO order anymore:\n            // Assert.Equal(\"i=85\", payload2.GetProperty(\"SourceNode\").GetProperty(\"Value\").GetString());\n            // Assert.Equal(\"Objects\", payload2.GetProperty(\"Change\").GetProperty(\"Value\").GetProperty(\"DisplayName\").GetString());\n\n            // TODO: currently metadata is sent later\n            // Assert.NotNull(metadata);\n        }\n\n        [Fact]\n        public async Task CanSendDataItemButNotMetaDataWhenMetaDataIsDisabledTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemButNotMetaDataWhenMetaDataIsDisabledTestAsync),\n                \"./Resources/DataItems.json\",\n                arguments: [\"-c\", \"--dm\", \"--mm=DataSetMessages\"]);\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            var output = message.GetProperty(\"Payload\").GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n            Assert.Null(metadata);\n        }\n\n        [Fact]\n        public async Task CanSendDataItemButNotMetaDataWhenComplexTypeSystemIsDisabledTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemButNotMetaDataWhenComplexTypeSystemIsDisabledTestAsync),\n                \"./Resources/DataItems.json\",\n                arguments: [\"-c\", \"--dct\", \"--mm=DataSetMessages\"]);\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            var output = message.GetProperty(\"Payload\").GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n            Assert.Null(metadata);\n        }\n\n        [Fact]\n        public async Task CanSendDataItemAsDataSetMessagesToIoTHubWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemAsDataSetMessagesToIoTHubWithCompliantEncodingTestAsync), \"./Resources/DataItems.json\",\n                messageType: \"ua-deltaframe\", arguments: [\"-c\", \"--mm=DataSetMessages\"]);\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            var output = message.GetProperty(\"Payload\").GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n            Assert.NotNull(metadata);\n        }\n\n        [Fact]\n        public async Task CanSendDataItemAsRawDataSetsToIoTHubWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemAsRawDataSetsToIoTHubWithCompliantEncodingTestAsync), \"./Resources/DataItems.json\",\n                messageType: \"ua-deltaframe\", arguments: [\"-c\", \"--dm=False\", \"--mm=RawDataSets\"]);\n\n            // Assert\n            var output = Assert.Single(messages).Message;\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Output\").GetDouble(), double.MinValue, double.MaxValue);\n\n            // Explicitely enabled metadata despite messaging profile\n            Assert.NotNull(metadata);\n        }\n\n        [Fact]\n        public async Task CanEncodeWithoutReversibleEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanEncodeWithoutReversibleEncodingTestAsync),\n                \"./Resources/SimpleEvents.json\", messageType: \"ua-data\",\n                arguments: [\"--mm=PubSub\", \"--me=Json\", \"--dm=false\"]\n            );\n\n            Assert.Single(result);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var value = m.GetProperty(\"Payload\");\n\n                // Variant encoding is the default\n                var eventId = value.GetProperty(EventId).GetProperty(\"Value\");\n                var message = value.GetProperty(Message).GetProperty(\"Value\");\n                var cycleId = value.GetProperty(CycleIdUri).GetProperty(\"Value\");\n                var currentStep = value.GetProperty(CurrentStepUri).GetProperty(\"Value\");\n\n                Assert.Equal(JsonValueKind.String, eventId.ValueKind);\n                Assert.Equal(JsonValueKind.String, message.ValueKind);\n                Assert.Equal(JsonValueKind.String, cycleId.ValueKind);\n                Assert.Equal(JsonValueKind.String, currentStep.GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, currentStep.GetProperty(\"Duration\").ValueKind);\n            });\n\n            AssertSimpleEventsMetadata(metadata);\n        }\n\n        [Fact]\n        public async Task CanEncodeWithReversibleEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanEncodeWithReversibleEncodingTestAsync),\n                \"./Resources/SimpleEvents.json\", TimeSpan.FromMinutes(2), 4, messageType: \"ua-data\",\n                arguments: [\"--mm=PubSub\", \"--me=JsonReversible\", \"--dm=false\"]\n            );\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var body = m.GetProperty(\"Payload\");\n                var eventId = body.GetProperty(EventId).GetProperty(\"Value\");\n                Assert.Equal(\"ByteString\", eventId.GetProperty(\"Type\").GetString());\n                Assert.Equal(JsonValueKind.String, eventId.GetProperty(\"Body\").ValueKind);\n\n                var message = body.GetProperty(Message).GetProperty(\"Value\");\n                Assert.Equal(\"LocalizedText\", message.GetProperty(\"Type\").GetString());\n                Assert.Equal(JsonValueKind.String, message.GetProperty(\"Body\").GetProperty(\"Text\").ValueKind);\n                Assert.Equal(\"en-US\", message.GetProperty(\"Body\").GetProperty(\"Locale\").GetString());\n\n                var cycleId = body.GetProperty(CycleIdUri).GetProperty(\"Value\");\n                Assert.Equal(\"String\", cycleId.GetProperty(\"Type\").GetString());\n                Assert.Equal(JsonValueKind.String, cycleId.GetProperty(\"Body\").ValueKind);\n\n                var currentStep = body.GetProperty(CurrentStepUri).GetProperty(\"Value\");\n                body = currentStep.GetProperty(\"Body\");\n                Assert.Equal(\"ExtensionObject\", currentStep.GetProperty(\"Type\").GetString());\n                Assert.Equal(\"http://opcfoundation.org/SimpleEvents#i=183\", body.GetProperty(\"TypeId\").GetString());\n                Assert.Equal(\"Json\", body.GetProperty(\"Encoding\").GetString());\n                Assert.Equal(JsonValueKind.String, body.GetProperty(\"Body\").GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, body.GetProperty(\"Body\").GetProperty(\"Duration\").ValueKind);\n            });\n\n            AssertSimpleEventsMetadata(metadata);\n        }\n\n        [Fact]\n        public async Task CanEncodeEventWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanEncodeEventWithCompliantEncodingTestAsync),\n                \"./Resources/SimpleEvents.json\", messageType: \"ua-data\",\n                arguments: [\"-c\", \"--mm=PubSub\", \"--me=Json\"]);\n\n            Assert.Single(result);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var value = m.GetProperty(\"Payload\");\n\n                // Variant encoding is the default\n                var eventId = value.GetProperty(EventId).GetProperty(\"Value\");\n                var message = value.GetProperty(Message).GetProperty(\"Value\");\n                var cycleId = value.GetProperty(CycleIdExpanded).GetProperty(\"Value\");\n                var currentStep = value.GetProperty(CurrentStepExpanded).GetProperty(\"Value\");\n\n                Assert.Equal(JsonValueKind.String, eventId.ValueKind);\n                Assert.Equal(JsonValueKind.String, message.ValueKind);\n                Assert.Equal(JsonValueKind.String, cycleId.ValueKind);\n                Assert.Equal(JsonValueKind.String, currentStep.GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, currentStep.GetProperty(\"Duration\").ValueKind);\n            });\n\n            AssertCompliantSimpleEventsMetadata(metadata);\n        }\n\n        [Fact]\n        public async Task CanEncodeWithReversibleEncodingAndWithCompliantEncodingTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanEncodeWithReversibleEncodingAndWithCompliantEncodingTestAsync),\n                \"./Resources/SimpleEvents.json\", TimeSpan.FromMinutes(2), 4, messageType: \"ua-data\",\n                arguments: [\"-c\", \"--mm=PubSub\", \"--me=JsonReversible\"]);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var body = m.GetProperty(\"Payload\");\n                var eventId = body.GetProperty(EventId).GetProperty(\"Value\");\n                Assert.Equal(15, eventId.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(JsonValueKind.String, eventId.GetProperty(\"Body\").ValueKind);\n\n                var message = body.GetProperty(Message).GetProperty(\"Value\");\n                Assert.Equal(21, message.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(JsonValueKind.String, message.GetProperty(\"Body\").GetProperty(\"Text\").ValueKind);\n                Assert.Equal(\"en-US\", message.GetProperty(\"Body\").GetProperty(\"Locale\").GetString());\n\n                var cycleId = body.GetProperty(CycleIdExpanded).GetProperty(\"Value\");\n                Assert.Equal(12, cycleId.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(JsonValueKind.String, cycleId.GetProperty(\"Body\").ValueKind);\n\n                var currentStep = body.GetProperty(CurrentStepExpanded).GetProperty(\"Value\");\n                body = currentStep.GetProperty(\"Body\");\n                Assert.Equal(22, currentStep.GetProperty(\"Type\").GetInt32());\n                Assert.Equal(183, body.GetProperty(\"TypeId\").GetProperty(\"Id\").GetInt32());\n                Assert.Equal(JsonValueKind.String, body.GetProperty(\"Body\").GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, body.GetProperty(\"Body\").GetProperty(\"Duration\").ValueKind);\n            });\n\n            AssertCompliantSimpleEventsMetadata(metadata);\n        }\n\n        [Fact]\n        public async Task CanEncode2EventsWithCompliantEncodingTestAsync()\n        {\n            var dataSetWriterNames = new HashSet<string>();\n\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanEncode2EventsWithCompliantEncodingTestAsync),\n                \"./Resources/SimpleEvents2.json\", GetBothEvents, messageType: \"ua-data\",\n                arguments: [\"-c\", \"--mm=PubSub\", \"--me=Json\"]);\n\n            Assert.Single(result);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            dataSetWriterNames.Select(d => d.Split('|')[1])\n                .Should().Contain(new[] { \"CycleStarted\", \"Alarm\" });\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var value = m.GetProperty(\"Payload\");\n\n                // Variant encoding is the default\n                var eventId = value.GetProperty(EventId).GetProperty(\"Value\");\n                var message = value.GetProperty(Message).GetProperty(\"Value\");\n                var cycleId = value.GetProperty(CycleIdExpanded).GetProperty(\"Value\");\n                var currentStep = value.GetProperty(CurrentStepExpanded).GetProperty(\"Value\");\n\n                Assert.Equal(JsonValueKind.String, eventId.ValueKind);\n                Assert.Equal(JsonValueKind.String, message.ValueKind);\n                Assert.Equal(JsonValueKind.String, cycleId.ValueKind);\n                Assert.Equal(JsonValueKind.String, currentStep.GetProperty(\"Name\").ValueKind);\n                Assert.Equal(JsonValueKind.Number, currentStep.GetProperty(\"Duration\").ValueKind);\n            });\n\n            JsonElement GetBothEvents(JsonElement jsonElement)\n            {\n                var messages = jsonElement.GetProperty(\"Messages\");\n                if (messages.ValueKind != JsonValueKind.Array)\n                {\n                    return default;\n                }\n\n                var isAllCycleStarted = true;\n                foreach (var element in messages.EnumerateArray())\n                {\n                    var dataSetWriterName = element.GetProperty(\"DataSetWriterName\").GetString();\n                    if (dataSetWriterName != null)\n                    {\n                        dataSetWriterNames.Add(dataSetWriterName);\n                    }\n\n                    if (!dataSetWriterName.EndsWith(\"|CycleStarted\", StringComparison.Ordinal))\n                    {\n                        isAllCycleStarted = false;\n                    }\n                }\n                return dataSetWriterNames.Count == 2 && isAllCycleStarted ? jsonElement : default;\n            }\n        }\n\n        [Fact]\n        public async Task CanSendPendingConditionsToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendPendingConditionsToIoTHubTestAsync), \"./Resources/PendingAlarms.json\", GetAlarmCondition,\n                messageType: \"ua-data\", arguments: [\"--mm=PubSub\", \"--dm=False\"]);\n\n            // Assert\n            Assert.NotEmpty(messages);\n            var message = Assert.Single(messages).Message;\n            _output.WriteLine(message.ToJsonString());\n\n            Assert.Equal(JsonValueKind.Object, message.ValueKind);\n            Assert.True(message.GetProperty(\"Payload\").GetProperty(\"Severity\").GetProperty(\"Value\").GetInt32() >= 100);\n\n            Assert.NotNull(metadata);\n        }\n\n        [Fact]\n        public async Task CanSendExtensionFieldsToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, result) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendExtensionFieldsToIoTHubTestAsync), \"./Resources/ExtensionFields.json\",\n                messageType: \"ua-data\", arguments: [\"--mm=FullNetworkMessages\", \"--dm=false\"]);\n\n            Assert.Single(result);\n\n            var messages = result\n                .SelectMany(x => x.Message.GetProperty(\"Messages\").EnumerateArray())\n                .ToArray();\n\n            // Assert\n            Assert.NotEmpty(messages);\n            Assert.All(messages, m =>\n            {\n                var payload = m.GetProperty(\"Payload\");\n                Assert.False(payload.GetProperty(\"Important\").GetProperty(\"Value\").GetBoolean());\n                Assert.Equal(5, payload.GetProperty(\"AssetId\").GetProperty(\"Value\").GetInt16());\n                Assert.Equal(\"mm/sec\", payload.GetProperty(\"EngineeringUnits\").GetProperty(\"Value\").GetString());\n                Assert.Equal(12.3465, payload.GetProperty(\"Variance\").GetProperty(\"Value\").GetDouble(), 6);\n                Assert.NotEmpty(payload.GetProperty(\"EndpointUrl\").GetProperty(\"Value\").GetString());\n                Assert.NotEmpty(payload.GetProperty(\"ApplicationUri\").GetProperty(\"Value\").GetString());\n            });\n\n            Assert.NotNull(metadata);\n            var metadataFields = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"Fields\");\n            Assert.Equal(JsonValueKind.Array, metadataFields.ValueKind);\n            var fieldNames = metadataFields.EnumerateArray().Select(v => v.GetProperty(\"Name\").GetString()).ToHashSet();\n\n            var expectedNames = new[] { \"Output\", \"EndpointUrl\", \"ApplicationUri\", \"EngineeringUnits\", \"AssetId\", \"Important\", \"Variance\" };\n            Assert.Equal(expectedNames.Length, fieldNames.Count);\n            Assert.All(expectedNames, n => fieldNames.Contains(n));\n        }\n\n        [Fact]\n        public async Task CanSendKeyFramesWithExtensionFieldsToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemToIoTHubTestAsync), \"./Resources/KeyFrames.json\",\n                messageType: \"ua-data\", arguments: [\"--mm=FullNetworkMessages\", \"--dm=false\"]);\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            var firstDataSet = message.GetProperty(\"Messages\")[0];\n            Assert.Equal(\"ua-keyframe\", firstDataSet.GetProperty(\"MessageType\").GetString());\n            var payload = firstDataSet.GetProperty(\"Payload\");\n            Assert.NotEqual(JsonValueKind.Null, payload.ValueKind);\n\n            var time = payload.GetProperty(\"CurrentTime\");\n            Assert.NotEqual(JsonValueKind.Null, time.ValueKind);\n            Assert.True(time.GetProperty(\"Value\").GetDateTime() < DateTime.UtcNow);\n            Assert.False(payload.GetProperty(\"Important\").GetProperty(\"Value\").GetBoolean());\n            Assert.Equal(5, payload.GetProperty(\"AssetId\").GetProperty(\"Value\").GetInt16());\n            Assert.Equal(\"mm/sec\", payload.GetProperty(\"EngineeringUnits\").GetProperty(\"Value\").GetString());\n            Assert.Equal(12.3465, payload.GetProperty(\"Variance\").GetProperty(\"Value\").GetDouble(), 6);\n\n            Assert.NotNull(metadata);\n            var metadataFields = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"Fields\");\n            Assert.Equal(JsonValueKind.Array, metadataFields.ValueKind);\n            var fieldNames = metadataFields.EnumerateArray().Select(v => v.GetProperty(\"Name\").GetString()).ToHashSet();\n\n            var expectedNames = new[] { \"AssetId\", \"CurrentTime\", \"EngineeringUnits\", \"Important\", \"Variance\" };\n            Assert.Equal(expectedNames.Length, fieldNames.Count);\n            Assert.All(expectedNames, n => fieldNames.Contains(n));\n        }\n\n        [Fact]\n        public async Task CanSendFullAndCompliantNetworkMessageWithEndpointUrlAndApplicationUriToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendDataItemToIoTHubTestAsync), \"./Resources/DataItems.json\", messageType: \"ua-data\",\n                arguments: [\"--mm=PubSub\", \"--fm=true\", \"--strict\"]);\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            var firstDataSet = message.GetProperty(\"Messages\")[0];\n            var payload = firstDataSet.GetProperty(\"Payload\");\n            Assert.NotEqual(JsonValueKind.Null, payload.ValueKind);\n            var output = payload.GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n            var ep = payload.GetProperty(\"EndpointUrl\").GetProperty(\"Value\").GetString();\n            Assert.False(string.IsNullOrEmpty(ep));\n            var appuri = payload.GetProperty(\"ApplicationUri\").GetProperty(\"Value\").GetString();\n            Assert.False(string.IsNullOrEmpty(appuri));\n\n            Assert.NotNull(metadata);\n            var fields = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"Fields\");\n            Assert.Equal(JsonValueKind.Array, fields.ValueKind);\n            var fieldNames = fields.EnumerateArray().Select(v => v.GetProperty(\"Name\").GetString()).ToList();\n            Assert.Equal(3, fieldNames.Count);\n            Assert.Equal(\"Output\", fieldNames[0]);\n            Assert.Equal(\"EndpointUrl\", fieldNames[1]);\n            Assert.Equal(\"ApplicationUri\", fieldNames[2]);\n        }\n\n        [Fact]\n        public async Task CanSendKeyFramesWithExtensionFieldsToIoTHubTestJsonReversibleAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendKeyFramesWithExtensionFieldsToIoTHubTestJsonReversibleAsync), \"./Resources/KeyFrames.json\", messageType: \"ua-data\",\n            // NOTE: while we --fm and fullnetworkmessage, the keyframes.json overrides this back to PubSub\n                arguments: [\"--mm=FullNetworkMessages\", \"--me=JsonReversible\", \"--fm=true\", \"--strict\"]);\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            var firstDataSet = message.GetProperty(\"Messages\")[0];\n            Assert.Equal(\"ua-keyframe\", firstDataSet.GetProperty(\"MessageType\").GetString());\n            var payload = firstDataSet.GetProperty(\"Payload\");\n            Assert.NotEqual(JsonValueKind.Null, payload.ValueKind);\n\n            var time = payload.GetProperty(\"CurrentTime\").GetProperty(\"Value\");\n            Assert.NotEqual(JsonValueKind.Null, time.ValueKind);\n            Assert.True(time.GetProperty(\"Body\").GetDateTime() < DateTime.UtcNow);\n\n            var ep = payload.TryGetProperty(\"EndpointUrl\", out _);\n            Assert.False(ep);\n            var appuri = payload.TryGetProperty(\"ApplicationUri\", out _);\n            Assert.False(appuri);\n\n            Assert.False(payload.GetProperty(\"Important\").GetProperty(\"Value\").GetProperty(\"Body\").GetBoolean());\n            Assert.Equal(\"5\", payload.GetProperty(\"AssetId\").GetProperty(\"Value\").GetProperty(\"Body\").GetString());\n            Assert.Equal(\"mm/sec\", payload.GetProperty(\"EngineeringUnits\").GetProperty(\"Value\").GetProperty(\"Body\").GetString());\n            Assert.Equal(12.3465f, payload.GetProperty(\"Variance\").GetProperty(\"Value\").GetProperty(\"Body\").GetSingle());\n\n            Assert.NotNull(metadata);\n            var metadataFields = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"Fields\");\n            Assert.Equal(JsonValueKind.Array, metadataFields.ValueKind);\n            var fieldNames = metadataFields.EnumerateArray().Select(v => v.GetProperty(\"Name\").GetString()).ToHashSet();\n            var expectedNames = new[] { \"AssetId\", \"CurrentTime\", \"EngineeringUnits\", \"Important\", \"Variance\" };\n            Assert.Equal(expectedNames.Length, fieldNames.Count);\n            Assert.All(expectedNames, n => fieldNames.Contains(n));\n            // TODO: Need to have order in fields!  Assert.Equal(metadataFields.EnumerateArray().Select(v => v.GetProperty(\"Name\").GetString()),\n            // TODO: Need to have order in fields!      payload.EnumerateObject().Select(p => p.Name));\n        }\n\n        [Fact]\n        public async Task CyclicReadWithAgeTestAsync()\n        {\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CyclicReadWithAgeTestAsync), \"./Resources/CyclicRead.json\",\n                TimeSpan.FromMinutes(1), 10, messageType: \"ua-data\",\n                arguments: [\"--mm=PubSub\", \"--dm=false\"]);\n\n            // Assert\n            Assert.Equal(10, messages.Count);\n            var message = messages[0].Message;\n            var output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n            Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n            Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n            Assert.NotNull(metadata);\n        }\n\n        [Fact]\n        public async Task PeriodicHeartbeatTestAsync()\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(PeriodicHeartbeatTestAsync), \"./Resources/Heartbeat2.json\",\n                TimeSpan.FromMinutes(1), 10, messageType: \"ua-data\",\n                arguments: [\"--mm=PubSub\", \"-c\"]);\n\n            // Assert\n            Assert.NotNull(metadata);\n            Assert.Equal(10, messages.Count);\n\n            // Assert that all messages are 1 second apart\n            var timestamps = messages.ConvertAll(m => m.Message.GetProperty(\"Messages\")[0]\n                .GetProperty(\"Timestamp\").GetDateTimeOffset());\n\n            _output.WriteLine(string.Join('\\n', timestamps\n                        .Select(t => t.ToString(\"o\", CultureInfo.InvariantCulture))\n                        .ToArray()));\n            var diffs = new List<TimeSpan>();\n            for (var index = 0; index < timestamps.Count - 1; index++)\n            {\n                var diff = timestamps[index + 1] - timestamps[index];\n                diffs.Add(diff);\n            }\n            _output.WriteLine(string.Join('\\n', diffs\n                        .Select(t => t.ToString())\n                        .ToArray()));\n#if FIX\n            // Not stable enough when run with all tests together\n            // TODO: Need a better and more reliable timer mechanism.\n            var allowedVariance = TimeSpan.FromMilliseconds(10);\n            Assert.All(diffs, diff => Assert.True(\n                diff - TimeSpan.FromSeconds(1)< allowedVariance &&\n                diff - TimeSpan.FromSeconds(1) > -allowedVariance, $\"{diff} > {allowedVariance}\"));\n#endif\n        }\n\n        [Theory]\n        [InlineData(100)]\n        [InlineData(1)]\n        public async Task CanSendKeyFramesToIoTHubTestAsync(int maxMonitoredItems)\n        {\n            // Arrange\n            // Act\n            var (metadata, messages) = await ProcessMessagesAndMetadataAsync(\n                nameof(CanSendKeyFramesToIoTHubTestAsync), \"./Resources/KeyFrames.json\", TimeSpan.FromMinutes(2), 11,\n                messageType: \"ua-data\", arguments: [\"--dm=false\", \"--xmi=\" + maxMonitoredItems]);\n\n            // Assert\n            var allDataSetMessages = messages.Select(m => m.Message.GetProperty(\"Messages\")).SelectMany(m => m.EnumerateArray()).ToList();\n            Assert.True(allDataSetMessages.Count >= 11);\n            var dataSetMessages = allDataSetMessages.Take(11).ToArray();\n            Assert.Equal(\"ua-keyframe\", dataSetMessages[0].GetProperty(\"MessageType\").GetString());\n            Assert.All(dataSetMessages.AsSpan(1, 9).ToArray(), m => Assert.Equal(\"ua-deltaframe\", m.GetProperty(\"MessageType\").GetString()));\n            Assert.Equal(\"ua-keyframe\", dataSetMessages[10].GetProperty(\"MessageType\").GetString());\n            Assert.NotNull(metadata);\n        }\n\n        internal static JsonElement GetAlarmCondition(JsonElement jsonElement)\n        {\n            var messages = jsonElement.GetProperty(\"Messages\");\n            return messages.ValueKind != JsonValueKind.Array\n                ? default\n                : messages.EnumerateArray().FirstOrDefault(element =>\n                {\n                    return element.GetProperty(\"MessageType\").GetString() == \"ua-condition\" &&\n                        element.GetProperty(\"Payload\").TryGetProperty(\"SourceNode\", out var node) &&\n                            node.TryGetProperty(\"Value\", out node) &&\n                                node.ValueKind != JsonValueKind.Null &&\n                                node.GetString().StartsWith(\"http://opcfoundation.org/AlarmCondition#s=1%3a\",\n                                    StringComparison.InvariantCulture);\n                });\n        }\n\n        internal static void AssertCompliantSimpleEventsMetadata(JsonMessage? metadata)\n        {\n            Assert.NotNull(metadata);\n            var eventFields = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"Fields\");\n            Assert.Equal(JsonValueKind.Array, eventFields.ValueKind);\n            Assert.Collection(eventFields.EnumerateArray(),\n                v =>\n                {\n                    Assert.Equal(\"EventId\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(15, v.GetProperty(\"DataType\").GetProperty(\"Id\").GetInt32());\n                },\n                v =>\n                {\n                    Assert.Equal(\"Message\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(21, v.GetProperty(\"DataType\").GetProperty(\"Id\").GetInt32());\n                },\n                v =>\n                {\n                    Assert.Equal(CycleIdExpanded, v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(12, v.GetProperty(\"DataType\").GetProperty(\"Id\").GetInt32());\n                },\n                v =>\n                {\n                    Assert.Equal(CurrentStepExpanded, v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(183, v.GetProperty(\"DataType\").GetProperty(\"Id\").GetInt32());\n                    Assert.Equal(\"http://opcfoundation.org/SimpleEvents\",\n                        v.GetProperty(\"DataType\").GetProperty(\"Namespace\").GetString());\n                });\n\n            var namespaces = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"Namespaces\");\n            Assert.Equal(JsonValueKind.Array, namespaces.ValueKind);\n            Assert.Equal(24, namespaces.GetArrayLength());\n            var structureDataTypes = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"StructureDataTypes\");\n            Assert.Equal(JsonValueKind.Array, structureDataTypes.ValueKind);\n            var s = structureDataTypes.EnumerateArray().First().GetProperty(\"StructureDefinition\");\n            Assert.Equal(\"Structure_0\", s.GetProperty(\"StructureType\").GetString());\n            var structureFields = s.GetProperty(\"Fields\");\n            Assert.Equal(JsonValueKind.Array, structureFields.ValueKind);\n            Assert.Collection(structureFields.EnumerateArray(),\n                v =>\n                {\n                    Assert.Equal(\"Name\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(12, v.GetProperty(\"DataType\").GetProperty(\"Id\").GetInt32());\n                },\n                v =>\n                {\n                    Assert.Equal(\"Duration\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(11, v.GetProperty(\"DataType\").GetProperty(\"Id\").GetInt32());\n                });\n        }\n\n        internal static void AssertSimpleEventsMetadata(JsonMessage? metadata)\n        {\n            Assert.NotNull(metadata);\n            var eventFields = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"Fields\");\n            Assert.Equal(JsonValueKind.Array, eventFields.ValueKind);\n            Assert.Collection(eventFields.EnumerateArray(),\n                v =>\n                {\n                    Assert.Equal(\"EventId\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(\"ByteString\", v.GetProperty(\"DataType\").GetString());\n                },\n                v =>\n                {\n                    Assert.Equal(\"Message\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(\"LocalizedText\", v.GetProperty(\"DataType\").GetString());\n                },\n                v =>\n                {\n                    Assert.Equal(\"http://opcfoundation.org/SimpleEvents#CycleId\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(\"String\", v.GetProperty(\"DataType\").GetString());\n                },\n                v =>\n                {\n                    Assert.Equal(\"http://opcfoundation.org/SimpleEvents#CurrentStep\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(\"http://opcfoundation.org/SimpleEvents#i=183\", v.GetProperty(\"DataType\").GetString());\n                });\n\n            var namespaces = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"Namespaces\");\n            Assert.Equal(JsonValueKind.Array, namespaces.ValueKind);\n            Assert.Equal(24, namespaces.GetArrayLength());\n            var structureDataTypes = metadata.Value.Message.GetProperty(\"MetaData\").GetProperty(\"StructureDataTypes\");\n            Assert.Equal(JsonValueKind.Array, structureDataTypes.ValueKind);\n            var s = structureDataTypes.EnumerateArray().First().GetProperty(\"StructureDefinition\");\n            Assert.Equal(\"Structure_0\", s.GetProperty(\"StructureType\").GetString());\n            var structureFields = s.GetProperty(\"Fields\");\n            Assert.Equal(JsonValueKind.Array, structureFields.ValueKind);\n            Assert.Collection(structureFields.EnumerateArray(),\n                v =>\n                {\n                    Assert.Equal(\"Name\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(\"String\", v.GetProperty(\"DataType\").GetString());\n                },\n                v =>\n                {\n                    Assert.Equal(\"Duration\", v.GetProperty(\"Name\").GetString());\n                    Assert.Equal(\"Double\", v.GetProperty(\"DataType\").GetString());\n                });\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/ReferenceServer/BasicSamplesIntegrationTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.ReferenceServer\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Azure.IIoT.OpcUa.Encoders.Models;\n    using FluentAssertions;\n    using Json.More;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class BasicSamplesIntegrationTests : PublisherIntegrationTestBase\n    {\n        private const string kEventId = \"EventId\";\n        private const string kMessage = \"Message\";\n        private const string kCycleId = \"http://opcfoundation.org/SimpleEvents#CycleId\";\n        private const string kCurrentStep = \"http://opcfoundation.org/SimpleEvents#CurrentStep\";\n        private readonly ITestOutputHelper _output;\n        private readonly ReferenceServer _fixture;\n\n        public BasicSamplesIntegrationTests(ITestOutputHelper output)\n            : base(output)\n        {\n            _output = output;\n            _fixture = new ReferenceServer();\n            EndpointUrl = _fixture.EndpointUrl;\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            if (disposing)\n            {\n                _fixture.Dispose();\n            }\n        }\n\n        [Fact]\n        public async Task CanSendDataItemToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var messages = await ProcessMessagesAsync(nameof(CanSendDataItemToIoTHubTestAsync),\n                \"./Resources/DataItems.json\");\n\n            // Assert\n            var message = Assert.Single(messages);\n            Assert.Equal(\"ns=23;i=1259\", message.Message.GetProperty(\"NodeId\").GetString());\n            Assert.InRange(message.Message.GetProperty(\"Value\").GetProperty(\"Value\").GetDouble(),\n                double.MinValue, double.MaxValue);\n        }\n\n        [Theory]\n        [InlineData(MessageTimestamp.EncodingTimeUtc, HeartbeatBehavior.WatchdogLKV)]\n        [InlineData(MessageTimestamp.EncodingTimeUtc, HeartbeatBehavior.WatchdogLKG)]\n        [InlineData(MessageTimestamp.CurrentTimeUtc, HeartbeatBehavior.WatchdogLKVWithUpdatedTimestamps)]\n        [InlineData(MessageTimestamp.PublishTime, HeartbeatBehavior.PeriodicLKV)]\n        public async Task CanSendHeartbeatToIoTHubTestAsync(MessageTimestamp timestamp, HeartbeatBehavior behavior)\n        {\n            // Arrange\n            // Act\n            var messages = await ProcessMessagesAsync(nameof(CanSendHeartbeatToIoTHubTestAsync) + timestamp, \"./Resources/Heartbeat.json\",\n                TimeSpan.FromMinutes(2), 5, arguments: [\"--fm=True\", $\"--mts={timestamp}\", $\"--hbb={behavior}\"]);\n\n            // Assert\n            Assert.True(messages.Count > 1);\n            var timestamps = new HashSet<DateTime>();\n            for (var i = 0; i < messages.Count; i++)\n            {\n                var message = messages[i].Message;\n                _output.WriteLine(message.ToJsonString());\n                if (!message.GetProperty(\"Value\").TryGetProperty(\"StatusCode\", out _))\n                {\n                    Assert.Equal(\"i=2271\", message.GetProperty(\"NodeId\").GetString());\n                    Assert.NotEmpty(message.GetProperty(\"ApplicationUri\").GetString());\n                    Assert.True(message.GetProperty(\"SequenceNumber\").GetUInt32() > 0);\n                    Assert.Equal(\"en-US\", message.GetProperty(\"Value\").GetProperty(\"Value\").EnumerateArray().First().GetString());\n                }\n\n                if (message.TryGetProperty(\"Timestamp\", out _))\n                {\n                    Assert.NotEmpty(message.GetProperty(\"Timestamp\").GetString());\n                    timestamps.Add(message.GetProperty(\"Timestamp\").GetDateTime());\n                }\n            }\n            if (timestamp == MessageTimestamp.PublishTime)\n            {\n                Assert.NotEmpty(timestamps);\n            }\n            else\n            {\n                Assert.Equal(messages.Count, timestamps.Count);\n            }\n        }\n\n        [Theory]\n        [InlineData(HeartbeatBehavior.WatchdogLKV)]\n        [InlineData(HeartbeatBehavior.WatchdogLKVWithUpdatedTimestamps)]\n        [InlineData(HeartbeatBehavior.PeriodicLKV)]\n        public async Task CanSendHeartbeatWithMIErrorToIoTHubTestAsync(HeartbeatBehavior behavior)\n        {\n            // Arrange\n            // Act\n            var messages = await ProcessMessagesAsync(nameof(CanSendHeartbeatWithMIErrorToIoTHubTestAsync),\n                \"./Resources/HeartbeatErrors.json\",\n                TimeSpan.FromMinutes(2), 5, arguments: [\"--fm=True\", $\"--hbb={behavior}\"]);\n\n            // Assert\n            Assert.True(messages.Count > 1);\n            var message = messages[0].Message;\n            _output.WriteLine(message.ToJsonString());\n\n            Assert.Equal(\"i=932534\", message.GetProperty(\"NodeId\").GetString());\n            Assert.NotEmpty(message.GetProperty(\"ApplicationUri\").GetString());\n            Assert.True(message.GetProperty(\"SequenceNumber\").GetUInt32() > 0);\n            Assert.Equal(\"BadNodeIdUnknown\", message.GetProperty(\"Value\")\n                .GetProperty(\"StatusCode\").GetProperty(\"Symbol\").GetString());\n        }\n\n        [Fact]\n        public async Task CanSendDeadbandItemsToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var messages = await ProcessMessagesAsync(nameof(CanSendDeadbandItemsToIoTHubTestAsync),\n                \"./Resources/Deadband.json\",\n                TimeSpan.FromMinutes(2), 20, arguments: [\"--fm=True\"]);\n\n            // Assert\n            messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n            var doubleValues = messages\n                .Where(message => message.Message.GetProperty(\"DisplayName\").GetString() == \"DoubleValues\" &&\n                    message.Message.GetProperty(\"Value\").TryGetProperty(\"Value\", out _));\n            double? dvalue = null;\n            foreach (var message in doubleValues)\n            {\n                Assert.Equal(\"http://test.org/UA/Data/#i=11224\", message.Message.GetProperty(\"NodeId\").GetString());\n                var value1 = message.Message.GetProperty(\"Value\").GetProperty(\"Value\").GetDouble();\n                _output.WriteLine(JsonSerializer.Serialize(message));\n                if (dvalue != null)\n                {\n                    var abs = Math.Abs(dvalue.Value - value1);\n                    Assert.True(abs >= 5.0, $\"Value within absolute deadband limit {abs} < 5 ({dvalue.Value}/{value1})\");\n                }\n                dvalue = value1;\n            }\n            var int64Values = messages\n                .Where(message => message.Message.GetProperty(\"DisplayName\").GetString() == \"Int64Values\" &&\n                    message.Message.GetProperty(\"Value\").TryGetProperty(\"Value\", out _));\n            long? lvalue = null;\n            foreach (var message in int64Values)\n            {\n                Assert.Equal(\"http://test.org/UA/Data/#i=11206\", message.Message.GetProperty(\"NodeId\").GetString());\n                var value1 = message.Message.GetProperty(\"Value\").GetProperty(\"Value\").GetInt64();\n                _output.WriteLine(JsonSerializer.Serialize(message));\n                if (lvalue != null)\n                {\n                    var abs = Math.Abs(lvalue.Value - value1);\n                    // TODO: Investigate this, it should be 10%\n                    Assert.True(abs >= 3, $\"Value within percent deadband limit {abs} < 3% ({lvalue.Value}/{value1})\");\n                }\n                lvalue = value1;\n            }\n        }\n\n        [Fact]\n        public async Task CanSendEventToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var messages = await ProcessMessagesAsync(nameof(CanSendEventToIoTHubTestAsync),\n                \"./Resources/SimpleEvents.json\");\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            Assert.Equal(\"i=2253\", message.GetProperty(\"NodeId\").GetString());\n            Assert.False(message.TryGetProperty(\"ApplicationUri\", out _));\n            Assert.False(message.TryGetProperty(\"Timestamp\", out _));\n            Assert.False(message.TryGetProperty(\"SequenceNumber\", out _));\n            Assert.NotEmpty(message.GetProperty(\"Value\").GetProperty(\"EventId\").GetString());\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task CanSendEventToIoTHubTestFullFeaturedMessageAsync(bool useCurrentTime)\n        {\n            // Arrange\n            // Act\n            var messages = await ProcessMessagesAsync(\n                nameof(CanSendEventToIoTHubTestFullFeaturedMessageAsync), \"./Resources/SimpleEvents.json\",\n                arguments: [\"--fm=true\", useCurrentTime ? \"--mts=CurrentTimeUtc\" : \"--mts=PublishTime\"]);\n\n            // Assert\n            var message = Assert.Single(messages).Message;\n            Assert.Equal(\"i=2253\", message.GetProperty(\"NodeId\").GetString());\n            Assert.NotEmpty(message.GetProperty(\"ApplicationUri\").GetString());\n            Assert.NotEmpty(message.GetProperty(\"Timestamp\").GetString());\n            Assert.True(message.GetProperty(\"SequenceNumber\").GetUInt32() > 0);\n            Assert.NotEmpty(message.GetProperty(\"Value\").GetProperty(\"EventId\").GetString());\n        }\n\n        [Fact]\n        public async Task CanEncodeWithReversibleEncodingSamplesTestAsync()\n        {\n            // Arrange\n            // Act\n            var result = await ProcessMessagesAsync(\n                nameof(CanEncodeWithReversibleEncodingSamplesTestAsync), \"./Resources/SimpleEvents.json\",\n                arguments: [\"--mm=Samples\", \"--me=JsonReversible\"]\n            );\n\n            var m = Assert.Single(result).Message;\n\n            var value = m.GetProperty(\"Value\");\n            var type = value.GetProperty(\"Type\").GetString();\n            var body = value.GetProperty(\"Body\");\n            Assert.Equal(\"ExtensionObject\", type);\n\n            var encoding = body.GetProperty(\"Encoding\").GetString();\n            body = body.GetProperty(\"Body\");\n            Assert.Equal(\"Json\", encoding);\n\n            var eventId = body.GetProperty(kEventId);\n            Assert.Equal(\"ByteString\", eventId.GetProperty(\"Type\").GetString());\n            Assert.Equal(JsonValueKind.String, eventId.GetProperty(\"Body\").ValueKind);\n\n            var message = body.GetProperty(kMessage);\n            Assert.Equal(\"LocalizedText\", message.GetProperty(\"Type\").GetString());\n            Assert.Equal(JsonValueKind.String, message.GetProperty(\"Body\").GetProperty(\"Text\").ValueKind);\n            Assert.Equal(\"en-US\", message.GetProperty(\"Body\").GetProperty(\"Locale\").GetString());\n\n            var cycleId = body.GetProperty(kCycleId);\n            Assert.Equal(\"String\", cycleId.GetProperty(\"Type\").GetString());\n            Assert.Equal(JsonValueKind.String, cycleId.GetProperty(\"Body\").ValueKind);\n\n            var currentStep = body.GetProperty(kCurrentStep);\n            body = currentStep.GetProperty(\"Body\");\n            Assert.Equal(\"ExtensionObject\", currentStep.GetProperty(\"Type\").GetString());\n            Assert.Equal(\"http://opcfoundation.org/SimpleEvents#i=183\", body.GetProperty(\"TypeId\").GetString());\n            Assert.Equal(\"Json\", body.GetProperty(\"Encoding\").GetString());\n            Assert.Equal(JsonValueKind.String, body.GetProperty(\"Body\").GetProperty(\"Name\").ValueKind);\n            Assert.Equal(JsonValueKind.Number, body.GetProperty(\"Body\").GetProperty(\"Duration\").ValueKind);\n\n            var json = value\n                .GetProperty(\"Body\")\n                .GetProperty(\"Body\")\n                .GetRawText();\n            var buffer = Encoding.UTF8.GetBytes(json);\n\n            var serviceMessageContext = new ServiceMessageContext();\n            serviceMessageContext.Factory.AddEncodeableType(typeof(EncodeableDictionary));\n\n            await using var stream = new MemoryStream(buffer);\n            using var decoder = new JsonDecoderEx(stream, serviceMessageContext);\n            var actual = new EncodeableDictionary();\n            actual.Decode(decoder);\n\n            Assert.Equal(4, actual.Count);\n            Assert.Equal(new[] { kEventId, kMessage, kCycleId, kCurrentStep }, actual.Select(x => x.Key));\n            Assert.All(actual.Select(x => x.Value?.Value), Assert.NotNull);\n\n            var eof = decoder.ReadDataValue(null);\n            Assert.Null(eof);\n        }\n\n        [Fact]\n        public async Task CanSendPendingConditionsToIoTHubTestAsync()\n        {\n            // Arrange\n            // Act\n            var messages = await ProcessMessagesAsync(nameof(CanSendPendingConditionsToIoTHubTestAsync),\n                \"./Resources/PendingAlarms.json\", GetAlarmCondition);\n\n            // Assert\n            messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n            var evt = Assert.Single(messages).Message;\n\n            Assert.Equal(JsonValueKind.Object, evt.ValueKind);\n            Assert.Equal(\"i=2253\", evt.GetProperty(\"NodeId\").GetString());\n            Assert.Equal(\"PendingAlarms\", evt.GetProperty(\"DisplayName\").GetString());\n\n            Assert.True(evt.TryGetProperty(\"Value\", out var sev));\n            Assert.True(sev.TryGetProperty(\"Severity\", out sev));\n            Assert.True(sev.TryGetProperty(\"Value\", out sev));\n            Assert.True(sev.GetInt32() >= 100);\n        }\n\n        [Fact]\n        public async Task CanSendDataItemToIoTHubTestWithDeviceMethodAsync()\n        {\n            const string name = nameof(CanSendDataItemToIoTHubTestWithDeviceMethodAsync);\n            var testInput = GetEndpointsFromFile(name, \"./Resources/DataItems.json\");\n            StartPublisher(name, arguments: [\"--mm=FullSamples\"]); // Alternative to --fm=True\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput[0]);\n                Assert.NotNull(result);\n\n                var messages = await WaitForMessagesAsync();\n                var message = Assert.Single(messages).Message;\n                Assert.Equal(\"ns=23;i=1259\", message.GetProperty(\"NodeId\").GetString());\n                Assert.InRange(message.GetProperty(\"Value\").GetProperty(\"Value\").GetDouble(),\n                    double.MinValue, double.MaxValue);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                var n = Assert.Single(nodes.OpcNodes);\n                Assert.Equal(testInput[0].OpcNodes[0].Id, n.Id);\n\n                result = await PublisherApi.UnpublishNodesAsync(e);\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task CanSendEventToIoTHubTestWithDeviceMethodAsync()\n        {\n            const string name = nameof(CanSendEventToIoTHubTestWithDeviceMethodAsync);\n            var testInput = GetEndpointsFromFile(name, \"./Resources/SimpleEvents.json\");\n            StartPublisher(name);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput[0]);\n                Assert.NotNull(result);\n\n                var messages = await WaitForMessagesAsync();\n                var message = Assert.Single(messages).Message;\n                Assert.Equal(\"i=2253\", message.GetProperty(\"NodeId\").GetString());\n                Assert.NotEmpty(message.GetProperty(\"Value\").GetProperty(\"EventId\").GetString());\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                var n = Assert.Single(nodes.OpcNodes);\n                Assert.Equal(testInput[0].OpcNodes[0].Id, n.Id);\n\n                result = await PublisherApi.UnpublishAllNodesAsync();\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task CanSendPendingConditionsToIoTHubTestWithDeviceMethodAsync()\n        {\n            const string name = nameof(CanSendPendingConditionsToIoTHubTestWithDeviceMethodAsync);\n            var testInput = GetEndpointsFromFile(name, \"./Resources/PendingAlarms.json\");\n            StartPublisher(name);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput[0]);\n                Assert.NotNull(result);\n\n                var messages = await WaitForMessagesAsync(GetAlarmCondition);\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n\n                var evt = Assert.Single(messages).Message;\n                Assert.Equal(JsonValueKind.Object, evt.ValueKind);\n                Assert.Equal(\"i=2253\", evt.GetProperty(\"NodeId\").GetString());\n                Assert.Equal(\"PendingAlarms\", evt.GetProperty(\"DisplayName\").GetString());\n\n                Assert.True(evt.TryGetProperty(\"Value\", out var sev));\n                Assert.True(sev.TryGetProperty(\"Severity\", out sev));\n                Assert.True(sev.TryGetProperty(\"Value\", out sev));\n                Assert.True(sev.GetInt32() >= 100);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                var n = Assert.Single(nodes.OpcNodes);\n                Assert.Equal(testInput[0].OpcNodes[0].Id, n.Id);\n\n                result = await PublisherApi.UnpublishNodesAsync(testInput[0]);\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        [Theory]\n        [InlineData(100)]\n        [InlineData(1)]\n        public async Task CanSendDataItemToIoTHubTestWithDeviceMethod2Async(int maxMonitoredItems)\n        {\n            const string name = nameof(CanSendDataItemToIoTHubTestWithDeviceMethod2Async);\n            var testInput1 = GetEndpointsFromFile(name, \"./Resources/DataItems.json\");\n            var testInput2 = GetEndpointsFromFile(name, \"./Resources/SimpleEvents.json\");\n            var testInput3 = GetEndpointsFromFile(name, \"./Resources/PendingAlarms.json\");\n            StartPublisher(name, arguments: [\"--xmi=\" + maxMonitoredItems]);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n\n                await PublisherApi.PublishNodesAsync(testInput1[0]);\n                await PublisherApi.PublishNodesAsync(testInput2[0]);\n                await PublisherApi.PublishNodesAsync(testInput3[0]);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                var e = Assert.Single(endpoints.Endpoints);\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                Assert.Equal(3, nodes.OpcNodes.Count);\n\n                await PublisherApi.UnpublishAllNodesAsync();\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n\n                await PublisherApi.AddOrUpdateEndpointsAsync(new List<PublishedNodesEntryModel>\n                {\n                    new ()\n                    {\n                        OpcNodes = [.. nodes.OpcNodes],\n                        EndpointUrl = e.EndpointUrl,\n                        UseSecurity = e.UseSecurity,\n                        DataSetWriterGroup = name\n                    }\n                });\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                e = Assert.Single(endpoints.Endpoints);\n                nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                Assert.Equal(3, nodes.OpcNodes.Count);\n\n                var messages1 = await WaitForMessagesAsync(GetDataFrame);\n                var message1 = Assert.Single(messages1).Message;\n                Assert.Equal(\"ns=23;i=1259\", message1.GetProperty(\"NodeId\").GetString());\n                Assert.InRange(message1.GetProperty(\"Value\").GetProperty(\"Value\").GetDouble(),\n                    double.MinValue, double.MaxValue);\n\n                _output.WriteLine(\"Removing items...\");\n                await PublisherApi.UnpublishNodesAsync(testInput3[0]);\n                nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                Assert.Equal(2, nodes.OpcNodes.Count);\n                await PublisherApi.UnpublishNodesAsync(testInput2[0]);\n                nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                Assert.Single(nodes.OpcNodes);\n\n                _output.WriteLine(\"Waiting for remaining...\");\n                var messages = await WaitForMessagesAsync(GetDataFrame);\n                var message = Assert.Single(messages).Message;\n                Assert.Equal(\"ns=23;i=1259\", message.GetProperty(\"NodeId\").GetString());\n                Assert.InRange(message.GetProperty(\"Value\").GetProperty(\"Value\").GetDouble(),\n                    double.MinValue, double.MaxValue);\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(e.EndpointUrl, diag.Endpoint.EndpointUrl);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        [Fact]\n        public async Task CanSendPendingConditionsToIoTHubTestWithDeviceMethod2Async()\n        {\n            const string name = nameof(CanSendPendingConditionsToIoTHubTestWithDeviceMethod2Async);\n            var testInput = GetEndpointsFromFile(name, \"./Resources/PendingAlarms.json\");\n\n            StartPublisher(name);\n            try\n            {\n                var endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n\n                var result = await PublisherApi.PublishNodesAsync(testInput[0]);\n                Assert.NotNull(result);\n\n                var messages = await WaitForMessagesAsync(GetAlarmCondition);\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n                var evt = Assert.Single(messages).Message;\n\n                Assert.Equal(JsonValueKind.Object, evt.ValueKind);\n                Assert.Equal(\"i=2253\", evt.GetProperty(\"NodeId\").GetString());\n                Assert.Equal(\"PendingAlarms\", evt.GetProperty(\"DisplayName\").GetString());\n\n                Assert.True(evt.TryGetProperty(\"Value\", out var sev));\n                Assert.True(sev.TryGetProperty(\"Severity\", out sev));\n                Assert.True(sev.TryGetProperty(\"Value\", out sev));\n                Assert.True(sev.GetInt32() >= 100);\n\n                // Disable pending alarms\n                testInput[0].OpcNodes[0].ConditionHandling = null;\n                testInput[0].OpcNodes[0].DisplayName = \"SimpleEvents\";\n                result = await PublisherApi.AddOrUpdateEndpointsAsync(new List<PublishedNodesEntryModel>\n                {\n                    testInput[0]\n                });\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                var e = Assert.Single(endpoints.Endpoints);\n\n                var nodes = await PublisherApi.GetConfiguredNodesOnEndpointAsync(e);\n                var n = Assert.Single(nodes.OpcNodes);\n\n                // Wait until it was applied and we receive normal events again\n                messages = await WaitForMessagesAsync(\n                    message => message.GetProperty(\"DisplayName\").GetString() == \"SimpleEvents\"\n                        && message.GetProperty(\"Value\").GetProperty(\"ReceiveTime\").ValueKind\n                            == JsonValueKind.String ? message : default);\n                messages.ForEach(m => _output.WriteLine(m.Topic + m.Message.ToJsonString()));\n\n                var message = Assert.Single(messages).Message;\n                Assert.Equal(\"i=2253\", message.GetProperty(\"NodeId\").GetString());\n                Assert.Equal(\"SimpleEvents\", message.GetProperty(\"DisplayName\").GetString());\n\n                Assert.True(message.TryGetProperty(\"Value\", out sev));\n                Assert.True(sev.TryGetProperty(\"Severity\", out sev));\n                Assert.True(sev.GetInt32() != 0, $\"{message.ToJsonString()}\");\n\n                result = await PublisherApi.UnpublishNodesAsync(testInput[0]);\n                Assert.NotNull(result);\n\n                endpoints = await PublisherApi.GetConfiguredEndpointsAsync();\n                Assert.Empty(endpoints.Endpoints);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n        }\n\n        private JsonElement GetDataFrame(JsonElement jsonElement)\n        {\n            return jsonElement.GetProperty(\"NodeId\").GetString() != \"i=2253\"\n                    ? jsonElement : default;\n        }\n\n        private static JsonElement GetAlarmCondition(JsonElement jsonElement)\n        {\n            return jsonElement\n                .TryGetProperty(\"Value\", out var node) && node\n                .TryGetProperty(\"SourceNode\", out node) && node\n                .TryGetProperty(\"Value\", out node) && node\n                .GetString().StartsWith(\"http://opcfoundation.org/AlarmCondition#s=1%3a\",\n                    StringComparison.InvariantCulture) ? jsonElement : default;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/ReferenceServer/ReverseConnectIntegrationTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.ReferenceServer\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Neovolve.Logging.Xunit;\n    using System;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading.Tasks;\n    using Xunit;\n    using Xunit.Abstractions;\n\n    public class ReverseConnectIntegrationTests : PublisherIntegrationTestBase\n    {\n        private readonly ITestOutputHelper _output;\n\n        public ReverseConnectIntegrationTests(ITestOutputHelper output) : base(output)\n        {\n            _output = output;\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task RegisteredReadTestAsync(bool useReverseConnect)\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var server = ReferenceServer.Create(LogFactory.Create(_output, Logging.Config), useReverseConnect);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            EndpointUrl = server.EndpointUrl;\n\n            var name = nameof(RegisteredReadTestAsync) + (useReverseConnect ? \"WithReverseConnect\" : \"NoReverseConnect\");\n            StartPublisher(name, \"./Resources/RegisteredRead.json\", arguments: [\"--mm=PubSub\", \"--dm=false\"],\n                reverseConnectPort: useReverseConnect ? server.ReverseConnectPort : null);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                var output = message.GetProperty(\"Messages\")[0].GetProperty(\"Payload\").GetProperty(\"Output\");\n                Assert.NotEqual(JsonValueKind.Null, output.ValueKind);\n                Assert.InRange(output.GetProperty(\"Value\").GetDouble(), double.MinValue, double.MaxValue);\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(name, diag.Endpoint.DataSetWriterGroup);\n                Assert.NotNull(metadata);\n            }\n            finally\n            {\n                server.Dispose();\n                await StopPublisherAsync();\n            }\n        }\n\n        [Theory]\n        [InlineData(true)]\n        [InlineData(false)]\n        public async Task KeepAliveTestAsync(bool useReverseConnect)\n        {\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            using var server = ReferenceServer.Create(LogFactory.Create(_output, Logging.Config), useReverseConnect);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n            EndpointUrl = server.EndpointUrl;\n\n            var name = nameof(KeepAliveTestAsync) + (useReverseConnect ? \"WithReverseConnect\" : \"NoReverseConnect\");\n            StartPublisher(name, \"./Resources/KeepAlive.json\",\n                reverseConnectPort: useReverseConnect ? server.ReverseConnectPort : null);\n            try\n            {\n                // Arrange\n                // Act\n                var (metadata, messages) = await WaitForMessagesAndMetadataAsync(TimeSpan.FromMinutes(2), 1,\n                    predicate: WaitUntilKeepAlive, messageType: \"ua-data\");\n\n                // Assert\n                var message = Assert.Single(messages).Message;\n                Assert.True(message.GetProperty(\"Messages\")[0].TryGetProperty(\"Payload\", out var payload));\n                Assert.Empty(payload.EnumerateObject());\n\n                var diagnostics = await PublisherApi.GetDiagnosticInfoAsync();\n                var diag = Assert.Single(diagnostics);\n                Assert.Equal(name, diag.Endpoint.DataSetWriterGroup);\n            }\n            finally\n            {\n                await StopPublisherAsync();\n            }\n\n            static JsonElement WaitUntilKeepAlive(JsonElement jsonElement)\n            {\n                var messages = jsonElement.GetProperty(\"Messages\");\n                if (messages.ValueKind == JsonValueKind.Array)\n                {\n                    var element = messages.EnumerateArray().FirstOrDefault();\n                    if (element.GetProperty(\"MessageType\").GetString() == \"ua-keepalive\")\n                    {\n                        return jsonElement;\n                    }\n                }\n                return default;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/SimpleEvents/NodeServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.SimpleEvents\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public sealed class NodeServicesTests : IClassFixture<SimpleEventsServer>, IClassFixture<PublisherModuleFixture>\n    {\n        public NodeServicesTests(SimpleEventsServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private SimpleEventsServerTests<ConnectionModel> GetTests()\n        {\n            return new SimpleEventsServerTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly SimpleEventsServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task CompileSimpleBaseEventQueryTestAsync()\n        {\n            return GetTests().CompileSimpleBaseEventQueryTestAsync();\n        }\n\n        [Fact]\n        public Task CompileSimpleEventsQueryTestAsync()\n        {\n            return GetTests().CompileSimpleEventsQueryTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/BrowsePathTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class BrowsePathTests : IClassFixture<PublisherModuleFixture>\n    {\n        public BrowsePathTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private BrowsePathTests<ConnectionModel> GetTests()\n        {\n            return new BrowsePathTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethod3Test3Async()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethod3Test3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowsePathStaticScalarMethodsTestAsync()\n        {\n            return GetTests().NodeBrowsePathStaticScalarMethodsTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/BrowseStreamTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public sealed class BrowseStreamTests : IClassFixture<PublisherModuleFixture>\n    {\n        public BrowseStreamTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private BrowseStreamTests<ConnectionModel> GetTests()\n        {\n            return new BrowseStreamTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [SkippableFact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseInRootTest1Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseInRootTest2Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseBoilersObjectsTest1Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter3Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter3Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter4Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter4Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter5Async()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter5Async();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDiagnosticsOperationsTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync();\n        }\n\n        [SkippableFact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            Skip.If(true, \"Not yet supported\");\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class BrowseTests : IClassFixture<PublisherModuleFixture>\n    {\n        public BrowseTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private BrowseServicesTests<ConnectionModel> GetTests()\n        {\n            return new BrowseServicesTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                    _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeBrowseInRootTest1Async()\n        {\n            return GetTests().NodeBrowseInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseInRootTest2Async()\n        {\n            return GetTests().NodeBrowseInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest1Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseFirstInRootTest2Async()\n        {\n            return GetTests().NodeBrowseFirstInRootTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseBoilersObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseBoilersObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest1Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest2Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest3Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessObjectsTest4Async()\n        {\n            return GetTests().NodeBrowseDataAccessObjectsTest4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test1Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDataAccessFC1001Test2Async()\n        {\n            return GetTests().NodeBrowseDataAccessFC1001Test2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter1Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticScalarVariablesTestWithFilter2Async()\n        {\n            return GetTests().NodeBrowseStaticScalarVariablesTestWithFilter2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesWithValuesTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesWithValuesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseStaticArrayVariablesRawModeTestAsync()\n        {\n            return GetTests().NodeBrowseStaticArrayVariablesRawModeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest1Async()\n        {\n            return GetTests().NodeBrowseContinuationTest1Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest2Async()\n        {\n            return GetTests().NodeBrowseContinuationTest2Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest3Async()\n        {\n            return GetTests().NodeBrowseContinuationTest3Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseContinuationTest4Async()\n        {\n            return GetTests().NodeBrowseContinuationTest4Async();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsInfoTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsInfoTestAsync();\n        }\n\n        [Fact]\n        public Task NodeBrowseDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeBrowseDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/CallArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(WriteCollection.Name)]\n    public class CallArrayTests : IClassFixture<PublisherModuleFixture>\n    {\n        public CallArrayTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod1Test5Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod2Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod2Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticArrayMethod3Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticArrayMethod3Test3Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/CallScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(WriteCollection.Name)]\n    public class CallScalarTests : IClassFixture<PublisherModuleFixture>\n    {\n        public CallScalarTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test3Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test3Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test4Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test4Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod1Test5Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod1Test5Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod2Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod2Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test1Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3Test2Async()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3Test2Async();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync()\n        {\n            return GetTests().NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler2ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler2ResetTestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodCallBoiler1ResetTestAsync()\n        {\n            return GetTests().NodeMethodCallBoiler1ResetTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/MetadataArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class MetadataArrayTests : IClassFixture<PublisherModuleFixture>\n    {\n        public MetadataArrayTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private CallArrayMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallArrayMethodTests<ConnectionModel>(\n               _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticArrayMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticArrayMethod3TestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/MetadataScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class MetadataScalarTests : IClassFixture<PublisherModuleFixture>\n    {\n        public MetadataScalarTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private CallScalarMethodTests<ConnectionModel> GetTests()\n        {\n            return new CallScalarMethodTests<ConnectionModel>(\n               _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection(), newMetadata: true);\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod1TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod1TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod2TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod2TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3TestAsync()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3TestAsync();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async()\n        {\n            return GetTests().NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/MetadataTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class MetadataTests : IClassFixture<PublisherModuleFixture>\n    {\n        public MetadataTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private NodeMetadataTests<ConnectionModel> GetTests()\n        {\n            return new NodeMetadataTests<ConnectionModel>(\n               _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n               _server.GetConnection());\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task GetServerCapabilitiesTestAsync()\n        {\n            return GetTests().GetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task HistoryGetServerCapabilitiesTestAsync()\n        {\n            return GetTests().HistoryGetServerCapabilitiesTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForFolderTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForFolderTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerObjectTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerObjectTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForConditionTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForConditionTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataTestForBaseEventTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataTestForBaseEventTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseInterfaceTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseInterfaceTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForBaseDataVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForBaseDataVariableTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForPropertyTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForPropertyTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForAudioVariableTypeTestAsync()\n        {\n            return GetTests().NodeGetMetadataForAudioVariableTypeTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForServerStatusVariableTestAsync()\n        {\n            return GetTests().NodeGetMetadataForServerStatusVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeGetMetadataForRedundancySupportPropertyTestAsync()\n        {\n            return GetTests().NodeGetMetadataForRedundancySupportPropertyTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/ReadCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class ReadCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataServerReadModuleSdk\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/ValueReadArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class ValueReadArrayTests : IClassFixture<PublisherModuleFixture>\n    {\n        public ValueReadArrayTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private ReadArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadArrayValueTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableNodeClassTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableAccessLevelTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticArrayVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticArrayVariableWriteMaskTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArraySByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayStructureValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticArrayUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticArrayUIntegerValueVariableTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/ValueReadScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(ReadCollection.Name)]\n    public class ValueReadScalarTests : IClassFixture<PublisherModuleFixture>\n    {\n        public ValueReadScalarTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private ReadScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new ReadScalarValueTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableNodeClassTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableNodeClassTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableAccessLevelTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableAccessLevelTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest1Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadAllStaticScalarVariableWriteMaskTest2Async()\n        {\n            return GetTests().NodeReadAllStaticScalarVariableWriteMaskTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarSByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarStructuredValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeReadStaticScalarUIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDataAccessMeasurementFloatValueTestAsync()\n        {\n            return GetTests().NodeReadDataAccessMeasurementFloatValueTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsNoneTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsNoneTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsStatusTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsStatusTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsDebugTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsDebugTestAsync();\n        }\n\n        [Fact]\n        public Task NodeReadDiagnosticsVerboseTestAsync()\n        {\n            return GetTests().NodeReadDiagnosticsVerboseTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/ValueWriteArrayTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(WriteCollection.Name)]\n    public class ValueWriteArrayTests : IClassFixture<PublisherModuleFixture>\n    {\n        public ValueWriteArrayTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private WriteArrayValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteArrayValueTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeWriteStaticArrayBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArraySByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArraySByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStringValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayStringValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayVariantValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayVariantValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayStructureValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticArrayStructureValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayNumberValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayNumberValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayIntegerValueVariableTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest1Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticArrayUIntegerValueVariableTest2Async()\n        {\n            return GetTests().NodeWriteStaticArrayUIntegerValueVariableTest2Async();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/ValueWriteScalarTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Module.Tests.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Testing.Tests;\n    using Autofac;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    [Collection(WriteCollection.Name)]\n    public class ValueWriteScalarTests : IClassFixture<PublisherModuleFixture>\n    {\n        public ValueWriteScalarTests(TestDataServer server, PublisherModuleFixture module)\n        {\n            _server = server;\n            _module = module;\n        }\n\n        private WriteScalarValueTests<ConnectionModel> GetTests()\n        {\n            return new WriteScalarValueTests<ConnectionModel>(\n                _module.SdkContainer.Resolve<INodeServices<ConnectionModel>>,\n                _server.GetConnection(), (ep, n, s) => _server.Client.ReadValueAsync(new ConnectionModel\n                {\n                    Endpoint = new EndpointModel\n                    {\n                        Url = ep.Endpoint.Url,\n                        Certificate = _server.Certificate?.RawData?.ToThumbprint()\n                    }\n                }, n, s));\n        }\n\n        private readonly TestDataServer _server;\n        private readonly PublisherModuleFixture _module;\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async()\n        {\n            return GetTests().NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarSByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarSByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt16ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt16ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt32ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt32ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUInt64ValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUInt64ValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarFloatValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarFloatValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDoubleValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDoubleValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarDateTimeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarDateTimeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarGuidValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarGuidValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarByteStringValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarByteStringValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarXmlElementValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarXmlElementValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarQualifiedNameValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarQualifiedNameValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarLocalizedTextValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarLocalizedTextValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStatusCodeValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStatusCodeValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarVariantValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarVariantValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarEnumerationValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarEnumerationValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarStructuredValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarStructuredValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarNumberValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarNumberValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarIntegerValueVariableTestAsync();\n        }\n\n        [Fact]\n        public Task NodeWriteStaticScalarUIntegerValueVariableTestAsync()\n        {\n            return GetTests().NodeWriteStaticScalarUIntegerValueVariableTestAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/Sdk/TestData/WriteCollection.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Module.Tests.Sdk.TestData\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Xunit;\n\n    [CollectionDefinition(Name)]\n    public class WriteCollection : ICollectionFixture<TestDataServer>\n    {\n        public const string Name = \"TestDataServerWriteModuleSdk\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Module/tests/_dummy_.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.14.36414.22\nMinimumVisualStudioVersion = 10.0.40219.1\nGlobal\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {9B79D755-DAB7-4AC6-8EC0-CB877B3DDA53}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Azure.IIoT.OpcUa.Publisher.Sdk.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <IsPackable>true</IsPackable>\n    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n    <Description>Azure OPC Publisher Module Sdk</Description>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Furly.Extensions.Newtonsoft\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Tunnel\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Extensions\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Microsoft.CSharp\" Version=\"4.7.0\" />\n    <PackageReference Include=\"Microsoft.Extensions.Http\" Version=\"9.0.9\" />\n    <PackageReference Include=\"Microsoft.Extensions.Configuration\" Version=\"9.0.9\" />\n    <PackageReference Include=\"System.Text.Json\" Version=\"9.0.9\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa.Publisher.Models\\src\\Azure.IIoT.OpcUa.Publisher.Models.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Clients/DiscoveryApiClient.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk.Clients\n{\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Furly.Tunnel;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implements node and publish services through command control against\n    /// the OPC Publihser module receiving service requests via device method calls.\n    /// </summary>\n    public sealed class DiscoveryApiClient : IDiscoveryApi\n    {\n        /// <summary>\n        /// Create module client\n        /// </summary>\n        /// <param name=\"methodClient\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <param name=\"serializer\"></param>\n        public DiscoveryApiClient(IMethodClient methodClient, string target,\n            TimeSpan? timeout = null, IJsonSerializer? serializer = null)\n        {\n            _serializer = serializer ??\n                new NewtonsoftJsonSerializer();\n            _methodClient = methodClient ??\n                throw new ArgumentNullException(nameof(methodClient));\n            if (string.IsNullOrEmpty(target))\n            {\n                throw new ArgumentNullException(nameof(target));\n            }\n            _target = target;\n            _timeout = timeout ?? TimeSpan.FromMinutes(1);\n        }\n\n        /// <summary>\n        /// Create module client\n        /// </summary>\n        /// <param name=\"methodClient\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"serializer\"></param>\n        public DiscoveryApiClient(IMethodClient methodClient,\n            IOptions<SdkOptions> options, IJsonSerializer? serializer = null) :\n            this(methodClient, options.Value.Target!, options.Value.Timeout,\n                serializer)\n        {\n        }\n\n        /// <inheritdoc/>\n        public async Task<X509CertificateChainModel> GetEndpointCertificateAsync(\n            EndpointModel endpoint, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(endpoint);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetEndpointCertificate_V2\", _serializer.SerializeToMemory(endpoint),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<X509CertificateChainModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task CancelAsync(DiscoveryCancelRequestModel request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _methodClient.CallMethodAsync(_target,\n                \"Cancel_V2\", _serializer.SerializeToMemory(request),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task DiscoverAsync(DiscoveryRequestModel request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _methodClient.CallMethodAsync(_target,\n                \"Discover_V2\", _serializer.SerializeToMemory(request),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task RegisterAsync(ServerRegistrationRequestModel request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _methodClient.CallMethodAsync(_target,\n                \"Register_V2\", _serializer.SerializeToMemory(request),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ApplicationRegistrationModel> FindServerAsync(\n            ServerEndpointQueryModel query, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(query);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"FindServer_V2\", _serializer.SerializeToMemory(query),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<ApplicationRegistrationModel>(response);\n        }\n\n        private readonly IJsonSerializer _serializer;\n        private readonly IMethodClient _methodClient;\n        private readonly string _target;\n        private readonly TimeSpan _timeout;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Clients/Extensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk.Clients\n{\n    using Furly.Exceptions;\n    using Furly.Extensions.Serializers;\n    using System;\n\n    /// <summary>\n    /// Helper extensions shared by clients\n    /// </summary>\n    internal static class Extensions\n    {\n        /// <summary>\n        /// Deserialize the response or throw if failed.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"serializer\">Register serializers.</param>\n        /// <param name=\"buffer\">Options with serializer configuration.</param>\n        /// <returns></returns>\n        /// <exception cref=\"MethodCallException\"></exception>\n        public static T DeserializeResponse<T>(this ISerializer serializer,\n            ReadOnlyMemory<byte> buffer)\n        {\n            return serializer.Deserialize<T>(buffer) ?? throw new MethodCallException(\"Bad response\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Clients/HistoryApiClient.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk.Clients\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Furly.Tunnel;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implementation of history api.\n    /// </summary>\n    public sealed class HistoryApiClient : IHistoryApi\n    {\n        /// <summary>\n        /// Create module client\n        /// </summary>\n        /// <param name=\"methodClient\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <param name=\"serializer\"></param>\n        public HistoryApiClient(IMethodClient methodClient, string target,\n             TimeSpan? timeout = null, IJsonSerializer? serializer = null)\n        {\n            _serializer = serializer ??\n                new NewtonsoftJsonSerializer();\n            _methodClient = methodClient ??\n                throw new ArgumentNullException(nameof(methodClient));\n            if (string.IsNullOrEmpty(target))\n            {\n                throw new ArgumentNullException(nameof(target));\n            }\n            _target = target;\n            _timeout = timeout ?? TimeSpan.FromMinutes(1);\n        }\n\n        /// <summary>\n        /// Create module client\n        /// </summary>\n        /// <param name=\"methodClient\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"serializer\"></param>\n        public HistoryApiClient(IMethodClient methodClient,\n            IOptions<SdkOptions> options, IJsonSerializer? serializer = null) :\n            this(methodClient, options.Value.Target!, options.Value.Timeout,\n                serializer)\n        {\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadValuesDetailsModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReadValues_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadResponseModel<HistoricValueModel[]>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadModifiedValuesAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReadModifiedValues_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadResponseModel<HistoricValueModel[]>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAtTimesAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReadValuesAtTimes_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadResponseModel<HistoricValueModel[]>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadProcessedValuesAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReadProcessedValues_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadResponseModel<HistoricValueModel[]>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<HistoricValueModel[]>> HistoryReadValuesNextAsync(\n            ConnectionModel connection, HistoryReadNextRequestModel request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.ContinuationToken == null)\n            {\n                throw new ArgumentException(\"Continuation missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReadValuesNext_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadNextResponseModel<HistoricValueModel[]>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryReplaceValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReplaceValues_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryInsertValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryInsertValues_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryUpsertValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryUpsertValues_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<DeleteValuesDetailsModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryDeleteValues_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteModifiedValuesAsync(\n            ConnectionModel connection, HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryDeleteModifiedValues_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteValuesAtTimesAsync(\n            ConnectionModel connection, HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryDeleteValuesAtTimes_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<HistoricEventModel[]>> HistoryReadEventsAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadEventsDetailsModel> request,\n            CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReadEvents_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadResponseModel<HistoricEventModel[]>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<HistoricEventModel[]>> HistoryReadEventsNextAsync(\n            ConnectionModel connection, HistoryReadNextRequestModel request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.ContinuationToken == null)\n            {\n                throw new ArgumentException(\"Continuation missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReadEventsNext_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadNextResponseModel<HistoricEventModel[]>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryReplaceEventsAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReplaceEvents_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryInsertEventsAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryInsertEvents_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryUpsertEventsAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryUpsertEvents_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryDeleteEventsAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<DeleteEventsDetailsModel> request, CancellationToken ct = default)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryDeleteEvents_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        private readonly ISerializer _serializer;\n        private readonly IMethodClient _methodClient;\n        private readonly string _target;\n        private readonly TimeSpan _timeout;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Clients/PublisherApiClient.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk.Clients\n{\n    using Azure.IIoT.OpcUa.Publisher.Sdk;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Furly.Tunnel;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implements node and publish services through command control against\n    /// the OPC Publihser module.\n    /// </summary>\n    public sealed class PublisherApiClient : IPublisherApi\n    {\n        /// <summary>\n        /// Create module client\n        /// </summary>\n        /// <param name=\"methodClient\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <param name=\"serializer\"></param>\n        public PublisherApiClient(IMethodClient methodClient, string target,\n            TimeSpan? timeout = null, IJsonSerializer? serializer = null)\n        {\n            _serializer = serializer ??\n                new NewtonsoftJsonSerializer();\n            _methodClient = methodClient ??\n                throw new ArgumentNullException(nameof(methodClient));\n            if (string.IsNullOrEmpty(target))\n            {\n                throw new ArgumentNullException(nameof(target));\n            }\n            _target = target;\n            _timeout = timeout ?? TimeSpan.FromMinutes(1);\n        }\n\n        /// <summary>\n        /// Create module client\n        /// </summary>\n        /// <param name=\"methodClient\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"serializer\"></param>\n        public PublisherApiClient(IMethodClient methodClient,\n            IOptions<SdkOptions> options, IJsonSerializer? serializer = null) :\n            this(methodClient, options.Value.Target!, options.Value.Timeout,\n                serializer)\n        {\n        }\n\n        /// <inheritdoc/>\n        public async Task CreateOrUpdateDataSetWriterEntryAsync(PublishedNodesEntryModel entry,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(entry);\n            await _methodClient.CallMethodAsync(_target,\n                \"CreateOrUpdateDataSetWriterEntry\", _serializer.SerializeToMemory(entry),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishedNodesEntryModel> GetDataSetWriterEntryAsync(string dataSetWriterGroup,\n            string dataSetWriterId, CancellationToken ct)\n        {\n            ArgumentException.ThrowIfNullOrEmpty(dataSetWriterGroup);\n            ArgumentException.ThrowIfNullOrEmpty(dataSetWriterId);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetDataSetWriterEntry\", _serializer.SerializeToMemory(new\n                {\n                    dataSetWriterGroup,\n                    dataSetWriterId\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishedNodesEntryModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task AddOrUpdateNodesAsync(string dataSetWriterGroup, string dataSetWriterId,\n            IReadOnlyList<OpcNodeModel> opcNodes, string? insertAfterFieldId, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(dataSetWriterGroup);\n            ArgumentNullException.ThrowIfNull(dataSetWriterId);\n            await _methodClient.CallMethodAsync(_target,\n                \"AddOrUpdateNodes\", _serializer.SerializeToMemory(new\n                {\n                    dataSetWriterGroup,\n                    dataSetWriterId,\n                    opcNodes,\n                    insertAfterFieldId\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task RemoveNodesAsync(string dataSetWriterGroup, string dataSetWriterId,\n            IReadOnlyList<string> dataSetFieldIds, CancellationToken ct)\n        {\n            ArgumentException.ThrowIfNullOrEmpty(dataSetWriterGroup);\n            ArgumentException.ThrowIfNullOrEmpty(dataSetWriterId);\n            ArgumentNullException.ThrowIfNull(dataSetFieldIds);\n            if (dataSetFieldIds.Count == 0)\n            {\n                throw new ArgumentException(\"No fields to remove.\", nameof(dataSetFieldIds));\n            }\n            await _methodClient.CallMethodAsync(_target,\n                \"RemoveNodes\", _serializer.SerializeToMemory(new\n                {\n                    dataSetWriterGroup,\n                    dataSetWriterId,\n                    dataSetFieldIds\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<IReadOnlyList<OpcNodeModel>> GetNodesAsync(string dataSetWriterGroup,\n            string dataSetWriterId, string? lastDataSetFieldId, int? pageSize, CancellationToken ct)\n        {\n            ArgumentException.ThrowIfNullOrEmpty(dataSetWriterGroup);\n            ArgumentException.ThrowIfNullOrEmpty(dataSetWriterId);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetNodes\", _serializer.SerializeToMemory(new\n                {\n                    dataSetWriterGroup,\n                    dataSetWriterId,\n                    lastDataSetFieldId,\n                    pageSize\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<List<OpcNodeModel>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task RemoveDataSetWriterEntryAsync(string dataSetWriterGroup,\n            string dataSetWriterId, CancellationToken ct)\n        {\n            ArgumentException.ThrowIfNullOrEmpty(dataSetWriterGroup);\n            ArgumentException.ThrowIfNullOrEmpty(dataSetWriterId);\n            await _methodClient.CallMethodAsync(_target,\n                \"RemoveDataSetWriterEntry\", _serializer.SerializeToMemory(new\n                {\n                    dataSetWriterGroup,\n                    dataSetWriterId\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishStartResponseModel> PublishStartAsync(ConnectionModel connection,\n            PublishStartRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"PublishStart\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishStartResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishStopResponseModel> PublishStopAsync(ConnectionModel connection,\n            PublishStopRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"PublishStop\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishStopResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishBulkResponseModel> PublishBulkAsync(ConnectionModel connection,\n            PublishBulkRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"PublishBulk\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishBulkResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishedItemListResponseModel> PublishListAsync(ConnectionModel connection,\n            PublishedItemListRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"PublishList\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishedItemListResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishedNodesResponseModel> PublishNodesAsync(\n            PublishedNodesEntryModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"PublishNodes\", _serializer.SerializeToMemory(request),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishedNodesResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishedNodesResponseModel> UnpublishNodesAsync(\n            PublishedNodesEntryModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"UnpublishNodes\", _serializer.SerializeToMemory(request),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishedNodesResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishedNodesResponseModel> UnpublishAllNodesAsync(\n            PublishedNodesEntryModel? request, CancellationToken ct)\n        {\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"UnpublishAllNodes\", _serializer.SerializeToMemory(request),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishedNodesResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<PublishedNodesResponseModel> AddOrUpdateEndpointsAsync(\n            IReadOnlyList<PublishedNodesEntryModel> request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n               \"AddOrUpdateEndpoints\", _serializer.SerializeToMemory(request),\n               ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<PublishedNodesResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<GetConfiguredEndpointsResponseModel> GetConfiguredEndpointsAsync(\n            GetConfiguredEndpointsRequestModel? request, CancellationToken ct)\n        {\n            var response = await _methodClient.CallMethodAsync(_target,\n               \"GetConfiguredEndpoints\", request == null ? null : _serializer.SerializeToMemory(request),\n               ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<GetConfiguredEndpointsResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task SetConfiguredEndpointsAsync(\n            SetConfiguredEndpointsRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            await _methodClient.CallMethodAsync(_target,\n               \"SetConfiguredEndpoints\", _serializer.SerializeToMemory(request),\n               ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<GetConfiguredNodesOnEndpointResponseModel> GetConfiguredNodesOnEndpointAsync(\n            PublishedNodesEntryModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetConfiguredNodesOnEndpoint\", _serializer.SerializeToMemory(request),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<GetConfiguredNodesOnEndpointResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<List<PublishDiagnosticInfoModel>> GetDiagnosticInfoAsync(CancellationToken ct)\n        {\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetDiagnosticInfo\", null, ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<List<PublishDiagnosticInfoModel>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task ShutdownAsync(bool failFast, CancellationToken ct)\n        {\n            await _methodClient.CallMethodAsync(_target, \"Shutdown\",\n                _serializer.SerializeToMemory(failFast),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n        }\n\n        /// <inheritdoc/>\n        public async Task<string?> GetServerCertificateAsync(CancellationToken ct)\n        {\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetServerCertificate\", null, ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<string?>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<string?> GetApiKeyAsync(CancellationToken ct)\n        {\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetApiKey\", null, ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<string?>(response);\n        }\n\n        private readonly IJsonSerializer _serializer;\n        private readonly IMethodClient _methodClient;\n        private readonly string _target;\n        private readonly TimeSpan _timeout;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Clients/TwinApiClient.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk.Clients\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Newtonsoft;\n    using Furly.Tunnel;\n    using Microsoft.Extensions.Options;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Implementation of twin api.\n    /// </summary>\n    public sealed class TwinApiClient : ITwinApi\n    {\n        /// <summary>\n        /// Create module client\n        /// </summary>\n        /// <param name=\"methodClient\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"timeout\"></param>\n        /// <param name=\"serializer\"></param>\n        public TwinApiClient(IMethodClient methodClient, string target,\n            TimeSpan? timeout = null, IJsonSerializer? serializer = null)\n        {\n            _serializer = serializer ??\n                new NewtonsoftJsonSerializer();\n            _methodClient = methodClient ??\n                throw new ArgumentNullException(nameof(methodClient));\n            if (string.IsNullOrEmpty(target))\n            {\n                throw new ArgumentNullException(nameof(target));\n            }\n            _target = target;\n            _timeout = timeout ?? TimeSpan.FromMinutes(1);\n        }\n\n        /// <summary>\n        /// Create module client\n        /// </summary>\n        /// <param name=\"methodClient\"></param>\n        /// <param name=\"options\"></param>\n        /// <param name=\"serializer\"></param>\n        public TwinApiClient(IMethodClient methodClient, IOptions<SdkOptions> options,\n            IJsonSerializer? serializer = null) :\n            this(methodClient, options.Value.Target!, options.Value.Timeout,\n                serializer)\n        {\n        }\n\n        /// <inheritdoc/>\n        public async Task<TestConnectionResponseModel> TestConnectionAsync(\n            ConnectionModel connection, TestConnectionRequestModel request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"TestConnection_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<TestConnectionResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowseFirstResponseModel> NodeBrowseFirstAsync(ConnectionModel connection,\n            BrowseFirstRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"Browse_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<BrowseFirstResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowseNextResponseModel> NodeBrowseNextAsync(ConnectionModel connection,\n            BrowseNextRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.ContinuationToken == null)\n            {\n                throw new ArgumentException(\"Continuation missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"BrowseNext_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<BrowseNextResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<BrowsePathResponseModel> NodeBrowsePathAsync(ConnectionModel connection,\n            BrowsePathRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.BrowsePaths == null || request.BrowsePaths.Count == 0 ||\n                request.BrowsePaths.Any(p => p == null || p.Count == 0))\n            {\n                throw new ArgumentException(\"Browse paths missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"BrowsePath_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<BrowsePathResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ReadResponseModel> NodeReadAsync(ConnectionModel connection,\n            ReadRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Attributes == null || request.Attributes.Count == 0)\n            {\n                throw new ArgumentException(nameof(request.Attributes));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"NodeRead_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<ReadResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<WriteResponseModel> NodeWriteAsync(ConnectionModel connection,\n            WriteRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Attributes == null || request.Attributes.Count == 0)\n            {\n                throw new ArgumentException(nameof(request.Attributes));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"NodeWrite_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<WriteResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ValueReadResponseModel> NodeValueReadAsync(ConnectionModel connection,\n            ValueReadRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"ValueRead_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<ValueReadResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ValueWriteResponseModel> NodeValueWriteAsync(ConnectionModel connection,\n            ValueWriteRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Value is null)\n            {\n                throw new ArgumentException(\"Value missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"ValueWrite_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<ValueWriteResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<MethodMetadataResponseModel> NodeMethodGetMetadataAsync(\n            ConnectionModel connection, MethodMetadataRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"MethodMetadata_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<MethodMetadataResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<MethodCallResponseModel> NodeMethodCallAsync(\n            ConnectionModel connection, MethodCallRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"MethodCall_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<MethodCallResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<ServerCapabilitiesModel> GetServerCapabilitiesAsync(\n            ConnectionModel connection, RequestHeaderModel? header, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetServerCapabilities_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    header\n                }),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<ServerCapabilitiesModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<NodeMetadataResponseModel> GetMetadataAsync(ConnectionModel connection,\n            NodeMetadataRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"GetMetadata_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<NodeMetadataResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<QueryCompilationResponseModel> CompileQueryAsync(ConnectionModel connection,\n            QueryCompilationRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"CompileQuery_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<QueryCompilationResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryServerCapabilitiesModel> HistoryGetServerCapabilitiesAsync(\n            ConnectionModel connection, RequestHeaderModel? header, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryGetServerCapabilities_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    header\n                }),\n                ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryServerCapabilitiesModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryConfigurationResponseModel> HistoryGetConfigurationAsync(\n            ConnectionModel connection, HistoryConfigurationRequestModel request, CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryGetConfiguration_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryConfigurationResponseModel>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadResponseModel<VariantValue>> HistoryReadAsync(\n            ConnectionModel connection, HistoryReadRequestModel<VariantValue> request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryRead_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadResponseModel<VariantValue>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryReadNextResponseModel<VariantValue>> HistoryReadNextAsync(\n            ConnectionModel connection, HistoryReadNextRequestModel request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (string.IsNullOrEmpty(request.ContinuationToken))\n            {\n                throw new ArgumentException(\"Continuation missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryReadNext_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryReadNextResponseModel<VariantValue>>(response);\n        }\n\n        /// <inheritdoc/>\n        public async Task<HistoryUpdateResponseModel> HistoryUpdateAsync(\n            ConnectionModel connection, HistoryUpdateRequestModel<VariantValue> request,\n            CancellationToken ct)\n        {\n            ArgumentNullException.ThrowIfNull(connection);\n            if (string.IsNullOrEmpty(connection.Endpoint?.Url))\n            {\n                throw new ArgumentException(\"Endpoint Url missing.\", nameof(connection));\n            }\n            ArgumentNullException.ThrowIfNull(request);\n            if (request.Details == null)\n            {\n                throw new ArgumentException(\"Details missing.\", nameof(request));\n            }\n            var response = await _methodClient.CallMethodAsync(_target,\n                \"HistoryUpdate_V2\", _serializer.SerializeToMemory(new\n                {\n                    connection,\n                    request\n                }), ContentMimeType.Json, _timeout, ct).ConfigureAwait(false);\n            return _serializer.DeserializeResponse<HistoryUpdateResponseModel>(response);\n        }\n\n        private readonly IJsonSerializer _serializer;\n        private readonly IMethodClient _methodClient;\n        private readonly string _target;\n        private readonly TimeSpan _timeout;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/IDiscoveryApi.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Discovery api\n    /// </summary>\n    public interface IDiscoveryApi\n    {\n        /// <summary>\n        /// Kick off onboarding of new server\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task RegisterAsync(ServerRegistrationRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Kick off a one time discovery on all supervisors\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task DiscoverAsync(DiscoveryRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Cancel a discovery request with a particular id\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task CancelAsync(DiscoveryCancelRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Find a server using the endpoint url in the query\n        /// object. Returns a application registration object only\n        /// if the endpoint is part of the application's endpoint\n        /// list.\n        /// </summary>\n        /// <param name=\"query\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ApplicationRegistrationModel> FindServerAsync(\n            ServerEndpointQueryModel query, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get the certificate of an endpoint\n        /// </summary>\n        /// <param name=\"endpoint\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<X509CertificateChainModel> GetEndpointCertificateAsync(\n            EndpointModel endpoint, CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/IHistoryApi.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Represents OPC Historic Access api\n    /// </summary>\n    public interface IHistoryApi\n    {\n        /// <summary>\n        /// Read raw historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read modified historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadModifiedValuesAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadModifiedValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read historic values at specific datum\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadValuesAtTimesAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadValuesAtTimesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read processed historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricValueModel[]>> HistoryReadProcessedValuesAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadProcessedValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read next set of historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadNextResponseModel<HistoricValueModel[]>> HistoryReadValuesNextAsync(\n            ConnectionModel connection, HistoryReadNextRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Replace historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryReplaceValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Insert historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryInsertValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Upsert historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryUpsertValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryDeleteValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete historic values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryDeleteModifiedValuesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<DeleteValuesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete historic values at specified datum\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryDeleteValuesAtTimesAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read event history\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<HistoricEventModel[]>> HistoryReadEventsAsync(\n            ConnectionModel connection, HistoryReadRequestModel<ReadEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read next set of historic events\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadNextResponseModel<HistoricEventModel[]>> HistoryReadEventsNextAsync(\n            ConnectionModel connection, HistoryReadNextRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Replace historic events\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryReplaceEventsAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Insert historic events\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryInsertEventsAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Upsert historic events\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryUpsertEventsAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<UpdateEventsDetailsModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Delete event history\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryDeleteEventsAsync(ConnectionModel connection,\n            HistoryUpdateRequestModel<DeleteEventsDetailsModel> request,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/IPublisherApi.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Publisher module api\n    /// </summary>\n    public interface IPublisherApi\n    {\n        /// <summary>\n        /// Create a published nodes entry for a specific writer group and\n        /// dataset writer.\n        /// </summary>\n        /// <param name=\"entry\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task CreateOrUpdateDataSetWriterEntryAsync(\n            PublishedNodesEntryModel entry, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get the published nodes entry for a specific writer group and dataset\n        /// writer.\n        /// </summary>\n        /// <param name=\"dataSetWriterGroup\"></param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishedNodesEntryModel> GetDataSetWriterEntryAsync(\n            string dataSetWriterGroup, string dataSetWriterId,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Add Nodes to a dedicated data set writer in a writer group.\n        /// </summary>\n        /// <param name=\"dataSetWriterGroup\"></param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"opcNodes\"></param>\n        /// <param name=\"insertAfterFieldId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task AddOrUpdateNodesAsync(string dataSetWriterGroup, string dataSetWriterId,\n            IReadOnlyList<OpcNodeModel> opcNodes, string? insertAfterFieldId = null,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Remove Nodes with the data set field ids from a data set writer in\n        /// a writer group.\n        /// </summary>\n        /// <param name=\"dataSetWriterGroup\"></param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"dataSetFieldIds\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task RemoveNodesAsync(string dataSetWriterGroup, string dataSetWriterId,\n            IReadOnlyList<string> dataSetFieldIds, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get Nodes from a data set writer in a writer group.\n        /// </summary>\n        /// <param name=\"dataSetWriterGroup\"></param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"lastDataSetFieldId\"></param>\n        /// <param name=\"pageSize\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<IReadOnlyList<OpcNodeModel>> GetNodesAsync(string dataSetWriterGroup,\n            string dataSetWriterId, string? lastDataSetFieldId = null,\n            int? pageSize = null, CancellationToken ct = default);\n\n        /// <summary>\n        /// Remove the published nodes entry for a specific data set\n        /// writer in a writer group.\n        /// </summary>\n        /// <param name=\"dataSetWriterGroup\"></param>\n        /// <param name=\"dataSetWriterId\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task RemoveDataSetWriterEntryAsync(string dataSetWriterGroup, string dataSetWriterId,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get configured endpoints\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<GetConfiguredEndpointsResponseModel> GetConfiguredEndpointsAsync(\n            GetConfiguredEndpointsRequestModel? request = null, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get nodes of an endpoint\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<GetConfiguredNodesOnEndpointResponseModel> GetConfiguredNodesOnEndpointAsync(\n            PublishedNodesEntryModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Set configured endpoints\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task SetConfiguredEndpointsAsync(SetConfiguredEndpointsRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Add or update publishing endpoints\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishedNodesResponseModel> AddOrUpdateEndpointsAsync(\n            IReadOnlyList<PublishedNodesEntryModel> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Publish nodes\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishedNodesResponseModel> PublishNodesAsync(\n            PublishedNodesEntryModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Remove all nodes on endpoint\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishedNodesResponseModel> UnpublishAllNodesAsync(\n            PublishedNodesEntryModel? request = null, CancellationToken ct = default);\n\n        /// <summary>\n        /// Stop publishing specified nodes on endpoint\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishedNodesResponseModel> UnpublishNodesAsync(\n            PublishedNodesEntryModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Start publishing node values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishStartResponseModel> PublishStartAsync(ConnectionModel connection,\n            PublishStartRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Start publishing node values\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishStopResponseModel> PublishStopAsync(ConnectionModel connection,\n            PublishStopRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Configure nodes to publish and unpublish in bulk\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishBulkResponseModel> PublishBulkAsync(ConnectionModel connection,\n            PublishBulkRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get all published nodes for connection.\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<PublishedItemListResponseModel> PublishListAsync(ConnectionModel connection,\n            PublishedItemListRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get diagnostic info\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<List<PublishDiagnosticInfoModel>> GetDiagnosticInfoAsync(\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Shutdown publisher\n        /// </summary>\n        /// <param name=\"failFast\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task ShutdownAsync(bool failFast = false,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get server certificate as PEM string\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<string?> GetServerCertificateAsync(CancellationToken ct = default);\n\n        /// <summary>\n        /// Get api key as string\n        /// </summary>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<string?> GetApiKeyAsync(CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/ITwinApi.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Represents Twin api\n    /// </summary>\n    public interface ITwinApi\n    {\n        /// <summary>\n        /// This call is used to test a connection by opening a session\n        /// to the server identified by the connection object.\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<TestConnectionResponseModel> TestConnectionAsync(\n            ConnectionModel connection, TestConnectionRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get the capabilities of the server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ServerCapabilitiesModel> GetServerCapabilitiesAsync(\n            ConnectionModel connection, RequestHeaderModel? header = null,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Browse node on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<BrowseFirstResponseModel> NodeBrowseFirstAsync(ConnectionModel connection,\n            BrowseFirstRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Browse next references on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<BrowseNextResponseModel> NodeBrowseNextAsync(ConnectionModel connection,\n            BrowseNextRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Browse by path on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<BrowsePathResponseModel> NodeBrowsePathAsync(ConnectionModel connection,\n            BrowsePathRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get the node metadata which includes the fields\n        /// and meta data of the type and can be used when constructing\n        /// event filters or calling methods to pass the correct arguments.\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<NodeMetadataResponseModel> GetMetadataAsync(ConnectionModel connection,\n            NodeMetadataRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Compile the query string into a filter query syntax\n        /// structure that can be used in other calls.\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<QueryCompilationResponseModel> CompileQueryAsync(ConnectionModel connection,\n            QueryCompilationRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Call method on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<MethodCallResponseModel> NodeMethodCallAsync(ConnectionModel connection,\n            MethodCallRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get meta data for method call on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<MethodMetadataResponseModel> NodeMethodGetMetadataAsync(ConnectionModel connection,\n            MethodMetadataRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Read node value on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ValueReadResponseModel> NodeValueReadAsync(ConnectionModel connection,\n            ValueReadRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Write node value on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ValueWriteResponseModel> NodeValueWriteAsync(ConnectionModel connection,\n            ValueWriteRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Read node attributes on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<ReadResponseModel> NodeReadAsync(ConnectionModel connection,\n            ReadRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Write node attributes on a server\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<WriteResponseModel> NodeWriteAsync(ConnectionModel connection,\n            WriteRequestModel request, CancellationToken ct = default);\n\n        /// <summary>\n        /// Get history server capabilities\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"header\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryServerCapabilitiesModel> HistoryGetServerCapabilitiesAsync(\n            ConnectionModel connection, RequestHeaderModel? header = null,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Get a node's history configuration\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryConfigurationResponseModel> HistoryGetConfigurationAsync(\n            ConnectionModel connection, HistoryConfigurationRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read node history with custom encoded extension object details\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadResponseModel<VariantValue>> HistoryReadAsync(\n            ConnectionModel connection, HistoryReadRequestModel<VariantValue> request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Read history call with custom encoded extension object details\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryReadNextResponseModel<VariantValue>> HistoryReadNextAsync(\n            ConnectionModel connection, HistoryReadNextRequestModel request,\n            CancellationToken ct = default);\n\n        /// <summary>\n        /// Update using extension object details\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"request\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        Task<HistoryUpdateResponseModel> HistoryUpdateAsync(\n            ConnectionModel connection, HistoryUpdateRequestModel<VariantValue> request,\n            CancellationToken ct = default);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"Azure.IIoT.OpcUa.Publisher.Sdk.Tests\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Sdk/src/SdkOptions.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Sdk\n{\n    using System;\n\n    /// <summary>\n    /// Configuration for IoT Edge Opc Publisher sdk\n    /// </summary>\n    public sealed class SdkOptions\n    {\n        /// <summary>\n        /// Edge target path. This is the mount path of the\n        /// publisher'smethod router which using the publisher\n        /// module's command line arguments and is defaulting to\n        /// <code>\n        /// {PublisherId}/methods\n        /// </code>\n        /// or the device and module identifier in the form of\n        /// <code>\n        /// {deviceId}_module_{moduleId}\n        /// </code>.\n        /// </summary>\n        public string? Target { get; set; }\n\n        /// <summary>\n        /// Call timeout\n        /// </summary>\n        public TimeSpan? Timeout { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/cli/Azure.IIoT.OpcUa.Publisher.Testing.Cli.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ServerGarbageCollection>true</ServerGarbageCollection>\n    <Nullable>disable</Nullable>\n    <EnableSdkContainerSupport>true</EnableSdkContainerSupport>\n    <InvariantGlobalization>false</InvariantGlobalization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ContainerRepository>iot/opc-ua-test-server</ContainerRepository>\n    <ContainerRuntimeIdentifier>linux-x64</ContainerRuntimeIdentifier>\n    <ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:9.0-azurelinux3.0-distroless-extra</ContainerBaseImage>\n  </PropertyGroup>\n  <ItemGroup>\n    <ContainerEnvironmentVariable Include=\"DOTNET_ReadyToRun\" Value=\"0\" />\n    <ContainerEnvironmentVariable Include=\"DOTNET_TieredPGO\" Value=\"1\" />\n    <ContainerEnvironmentVariable Include=\"DOTNET_TC_QuickJitForLoops\" Value=\"1\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Remove=\"pki\\**\" />\n    <EmbeddedResource Remove=\"pki\\**\" />\n    <None Remove=\"pki\\**\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"KubernetesClient\" Version=\"17.0.14\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\Azure.IIoT.OpcUa.Publisher.Testing.Servers.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/cli/FlatCertificateStore.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Cli\n{\n    using Opc.Ua;\n    using Opc.Ua.Security.Certificates;\n    using System;\n    using System.IO;\n    using System.Linq;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// A flat certificate store option to use with a secret/volume mount\n    /// </summary>\n    public sealed class FlatCertificateStore : ICertificateStoreType\n    {\n        /// <summary>\n        /// Identifier for flat directory certificate store.\n        /// </summary>\n        public const string StoreTypeName = \"FlatDirectory\";\n\n        /// <summary>\n        /// Prefix for flat directory certificate store.\n        /// </summary>\n        public const string StoreTypePrefix = $\"{StoreTypeName}:\";\n\n        /// <inheritdoc/>\n        public ICertificateStore CreateStore() => new FlatDirectoryCertificateStore();\n\n        /// <inheritdoc/>\n        public bool SupportsStorePath(string storePath) => !string.IsNullOrEmpty(storePath) &&\n                storePath.StartsWith(StoreTypePrefix,\n                    StringComparison.InvariantCultureIgnoreCase);\n\n        internal sealed class FlatDirectoryCertificateStore : ICertificateStore\n        {\n            private const string CrtExtension = \".crt\";\n            private const string KeyExtension = \".key\";\n\n            private readonly DirectoryCertificateStore _innerStore;\n\n            /// <summary>\n            /// Create certificate store\n            /// </summary>\n            public FlatDirectoryCertificateStore()\n            {\n                _innerStore = new DirectoryCertificateStore(noSubDirs: true);\n            }\n\n            /// <inheritdoc/>\n            public string StoreType => StoreTypeName;\n\n            /// <inheritdoc/>\n            public string StorePath => _innerStore.StorePath;\n\n            /// <inheritdoc/>\n            public bool SupportsLoadPrivateKey => _innerStore.SupportsLoadPrivateKey;\n\n            /// <inheritdoc/>\n            public bool SupportsCRLs => _innerStore.SupportsCRLs;\n\n            public bool NoPrivateKeys => _innerStore.NoPrivateKeys;\n\n            /// <inheritdoc/>\n            public void Dispose() => _innerStore.Dispose();\n\n            /// <inheritdoc/>\n            public void Open(string location, bool noPrivateKeys = true)\n            {\n                ArgumentNullException.ThrowIfNullOrEmpty(location);\n                if (!location.StartsWith(StoreTypePrefix, StringComparison.Ordinal))\n                {\n                    throw new ArgumentException(\n                        $\"Expected argument {nameof(location)} starting with {StoreTypePrefix}\",\n                        nameof(location));\n                }\n                _innerStore.Open(location.Substring(StoreTypePrefix.Length), noPrivateKeys);\n            }\n\n            /// <inheritdoc/>\n            public void Close() => _innerStore.Close();\n\n            /// <inheritdoc/>\n            public Task AddAsync(X509Certificate2 certificate, string password = null, CancellationToken ct = default)\n                => _innerStore.AddAsync(certificate, password, ct);\n\n            /// <inheritdoc/>\n            public Task AddRejectedAsync(X509Certificate2Collection certificates, int maxCertificates, CancellationToken ct = default)\n                => _innerStore.AddRejectedAsync(certificates, maxCertificates, ct);\n\n            /// <inheritdoc/>\n            public Task<bool> DeleteAsync(string thumbprint, CancellationToken ct = default)\n                => _innerStore.DeleteAsync(thumbprint, ct);\n\n            /// <inheritdoc/>\n            public async Task<X509Certificate2Collection> EnumerateAsync(CancellationToken ct = default)\n            {\n                var certificatesCollection =\n                    await _innerStore.EnumerateAsync(ct).ConfigureAwait(false);\n                if (!_innerStore.Directory.Exists)\n                {\n                    return certificatesCollection;\n                }\n\n                foreach (var file in _innerStore.Directory.GetFiles('*' + CrtExtension))\n                {\n                    try\n                    {\n                        var certificates = new X509Certificate2Collection();\n                        certificates.ImportFromPemFile(file.FullName);\n                        certificatesCollection.AddRange(certificates);\n                        foreach (var certificate in certificates)\n                        {\n                            Utils.LogInfo(\"Enumerate certificates - certificate added {thumbprint}\",\n                                certificate.Thumbprint);\n                        }\n                    }\n                    catch (Exception e)\n                    {\n                        Utils.LogError(e, \"Could not load certificate from file: {fileName}\",\n                            file.FullName);\n                    }\n                }\n\n                return certificatesCollection;\n            }\n\n            /// <inheritdoc/>\n            public Task AddCRLAsync(X509CRL crl, CancellationToken ct = default)\n                => _innerStore.AddCRLAsync(crl, ct);\n\n            /// <inheritdoc/>\n            public Task<bool> DeleteCRLAsync(X509CRL crl, CancellationToken ct = default)\n                => _innerStore.DeleteCRLAsync(crl, ct);\n\n            /// <inheritdoc/>\n            public Task<X509CRLCollection> EnumerateCRLsAsync(CancellationToken ct = default)\n                => _innerStore.EnumerateCRLsAsync(ct);\n\n            /// <inheritdoc/>\n            public Task<X509CRLCollection> EnumerateCRLsAsync(X509Certificate2 issuer,\n                bool validateUpdateTime = true, CancellationToken ct = default)\n                => _innerStore.EnumerateCRLsAsync(issuer, validateUpdateTime, ct);\n\n            /// <inheritdoc/>\n            public async Task<X509Certificate2Collection> FindByThumbprintAsync(\n                string thumbprint, CancellationToken ct = default)\n            {\n                var certificatesCollection =\n                    await _innerStore.FindByThumbprintAsync(thumbprint, ct).ConfigureAwait(false);\n\n                if (!_innerStore.Directory.Exists)\n                {\n                    return certificatesCollection;\n                }\n\n                foreach (var file in _innerStore.Directory.GetFiles('*' + CrtExtension))\n                {\n                    try\n                    {\n                        var certificates = new X509Certificate2Collection();\n                        certificates.ImportFromPemFile(file.FullName);\n                        foreach (var certificate in certificates)\n                        {\n                            if (string.Equals(certificate.Thumbprint, thumbprint,\n                                StringComparison.OrdinalIgnoreCase))\n                            {\n                                Utils.LogInfo(\"Find by thumbprint: {thumbprint} - found\", thumbprint);\n                                certificatesCollection.Add(certificate);\n                            }\n                        }\n                    }\n                    catch (Exception e)\n                    {\n                        Utils.LogError(e, \"Could not load certificate from file: {fileName}\",\n                            file.FullName);\n                    }\n                }\n\n                return certificatesCollection;\n            }\n\n            /// <inheritdoc/>\n            public Task<StatusCode> IsRevokedAsync(X509Certificate2 issuer, X509Certificate2 certificate,\n                CancellationToken ct = default)\n                => _innerStore.IsRevokedAsync(issuer, certificate, ct);\n\n            /// <inheritdoc/>\n            public Task<X509Certificate2> LoadPrivateKeyAsync(string thumbprint, string subjectName,\n                string password, CancellationToken ct = default)\n                => LoadPrivateKeyAsync(thumbprint, subjectName, applicationUri: null, certificateType: null, password, ct);\n\n            /// <inheritdoc/>\n            public async Task<X509Certificate2> LoadPrivateKeyAsync(string thumbprint, string subjectName,\n                string applicationUri, NodeId certificateType, string password, CancellationToken ct = default)\n            {\n                if (!_innerStore.Directory.Exists)\n                {\n                    return await _innerStore.LoadPrivateKeyAsync(thumbprint, subjectName, applicationUri,\n                        certificateType, password, ct).ConfigureAwait(false);\n                }\n\n                foreach (var file in _innerStore.Directory.GetFiles('*' + CrtExtension))\n                {\n                    try\n                    {\n                        var keyFile = new FileInfo(file.FullName.Replace(CrtExtension, KeyExtension,\n                            StringComparison.OrdinalIgnoreCase));\n                        if (keyFile.Exists)\n                        {\n                            using var certificate = X509CertificateLoader.LoadCertificateFromFile(\n                                file.FullName);\n                            if (!MatchCertificate(certificate, thumbprint, subjectName,\n                                applicationUri, certificateType))\n                            {\n                                continue;\n                            }\n\n                            var privateKeyCertificate = X509Certificate2.CreateFromPemFile(\n                                file.FullName, keyFile.FullName);\n\n                            Utils.LogInfo(\"Loading private key succeeded for {thumbprint} - {subjectName}\",\n                                thumbprint, subjectName);\n                            return privateKeyCertificate;\n                        }\n                    }\n                    catch (Exception e)\n                    {\n                        Utils.LogError(e,\n                            \"Could not load private key for certificate file: {fileName}\", file.FullName);\n                    }\n                }\n\n                return await _innerStore.LoadPrivateKeyAsync(thumbprint, subjectName, applicationUri,\n                    certificateType, password, ct).ConfigureAwait(false);\n            }\n\n            private static bool MatchCertificate(X509Certificate2 certificate, string thumbprint,\n                string subjectName, string applicationUri, NodeId certificateType)\n            {\n                if (certificateType == null ||\n                    certificateType == ObjectTypeIds.RsaSha256ApplicationCertificateType ||\n                    certificateType == ObjectTypeIds.RsaMinApplicationCertificateType ||\n                    certificateType == ObjectTypeIds.ApplicationCertificateType)\n                {\n                    if (!string.IsNullOrEmpty(thumbprint) &&\n                        !string.Equals(certificate.Thumbprint, thumbprint, StringComparison.OrdinalIgnoreCase))\n                    {\n                        return false;\n                    }\n\n                    if (!string.IsNullOrEmpty(subjectName) &&\n                        !X509Utils.CompareDistinguishedName(subjectName, certificate.Subject) &&\n                        (\n                            subjectName.Contains('=', StringComparison.OrdinalIgnoreCase) ||\n                            !X509Utils.ParseDistinguishedName(certificate.Subject)\n                                .Any(s => s.Equals(\"CN=\" + subjectName, StringComparison.Ordinal))))\n                    {\n                        return false;\n                    }\n\n                    // skip if not RSA certificate\n                    return X509Utils.GetRSAPublicKeySize(certificate) >= 0;\n                }\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/cli/Program.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Cli\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using Furly.Extensions.Logging;\n    using k8s;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Linq;\n    using System.Runtime.Loader;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Test client for opc ua services\n    /// </summary>\n    public static class Program\n    {\n        /// <summary>\n        /// Test client entry point\n        /// </summary>\n        /// <param name=\"args\"></param>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public static void Main(string[] args)\n        {\n#if DEBUG\n            if (args.Any(a => a.Contains(\"wfd\", StringComparison.InvariantCultureIgnoreCase) ||\n                a.Contains(\"waitfordebugger\", StringComparison.InvariantCultureIgnoreCase)) ||\n                KubernetesClientConfiguration.IsInCluster())\n            {\n                Console.WriteLine(\"Waiting for debugger being attached...\");\n                while (!Debugger.IsAttached)\n                {\n                    Thread.Sleep(1000);\n                }\n                Console.WriteLine(\"Debugger attached.\");\n                Debugger.Break();\n            }\n#endif\n            AppDomain.CurrentDomain.UnhandledException +=\n                (s, e) => Console.WriteLine(\"unhandled: \" + e.ExceptionObject);\n            var host = Utils.GetHostName();\n            var runsInKubenetes = KubernetesClientConfiguration.IsInCluster();\n            var ports = new List<int>();\n            var server = \"sample\";\n            try\n            {\n                for (var i = 0; i < args.Length; i++)\n                {\n                    switch (args[i])\n                    {\n                        case \"--server\":\n                        case \"-s\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                server = args[i];\n                                break;\n                            }\n                            throw new ArgumentException(\n                                \"Missing arguments for server option\");\n                        case \"--hosts\":\n                        case \"-H\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                host = args[i];\n                                break;\n                            }\n                            throw new ArgumentException(\n                                \"Missing arguments for hosts option\");\n                        case \"-p\":\n                        case \"--port\":\n                            i++;\n                            if (i < args.Length)\n                            {\n                                ports.Add(ushort.Parse(args[i], CultureInfo.InvariantCulture));\n                                break;\n                            }\n                            throw new ArgumentException(\n                                \"Missing arguments for port option\");\n                        case \"-?\":\n                        case \"-h\":\n                        case \"--help\":\n                            throw new ArgumentException(\"Help\");\n                        default:\n                            throw new ArgumentException($\"Unsupported option '{args[i]}'\");\n                    }\n                }\n                if (ports.Count == 0)\n                {\n                    var envPort = Environment.GetEnvironmentVariable(\"SERVER_PORT\");\n                    if (!string.IsNullOrEmpty(envPort) && int.TryParse(envPort, out var port))\n                    {\n                        ports.Add(port);\n                    }\n                    else\n                    {\n                        throw new ArgumentException(\"Missing port to run sample server.\");\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Console.WriteLine(e.Message);\n                Console.WriteLine(\n                    @\"\nTest server host\nusage:       [options] operation [args]\n\nOptions:\n\n    --hosts / -H            Full host name to use with comma seperated alternative hosts.\n    --port / -p             Port to listen on.\n    --help / -? / -h        Prints out this help.\n\nOperations (Mutually exclusive):\n\n    --server / -s           Run server with the given name (e.g. sample, testdata, etc.)\n\"\n                    );\n                return;\n            }\n\n            if (ports.Count == 0)\n            {\n                ports.Add(runsInKubenetes ? 50000 : 51210);\n            }\n            try\n            {\n                var hosts = host.Split(',', StringSplitOptions.TrimEntries);\n                var alternativeHosts = new List<string>();\n                if (hosts.Length > 1)\n                {\n                    alternativeHosts.AddRange(hosts[1..]);\n                }\n                Debug.Assert(hosts.Length > 0);\n                Console.WriteLine(\"Running ...\");\n                RunServerAsync(server, hosts[0], ports, alternativeHosts, runsInKubenetes).Wait();\n            }\n            catch (Exception e)\n            {\n                Console.WriteLine(e);\n                return;\n            }\n\n            if (!runsInKubenetes)\n            {\n                Console.WriteLine(\"Press key to exit...\");\n                Console.ReadKey();\n            }\n        }\n\n        /// <summary>\n        /// Run server until exit\n        /// </summary>\n        /// <param name=\"serverType\"></param>\n        /// <param name=\"host\"></param>\n        /// <param name=\"ports\"></param>\n        /// <param name=\"alternativeHosts\"></param>\n        /// <param name=\"runsInKubernetes\"></param>\n        private static async Task RunServerAsync(string serverType, string host, IEnumerable<int> ports,\n            List<string> alternativeHosts, bool runsInKubernetes)\n        {\n            var logger = Log.Console<ServerConsoleHost>();\n            var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);\n            AssemblyLoadContext.Default.Unloading += _ => tcs.TrySetResult(true);\n            if (runsInKubernetes)\n            {\n                // Register FlatDirectoryCertificateStoreType as known certificate store type.\n                var certStoreTypeName = CertificateStoreType.GetCertificateStoreTypeByName(\n                    FlatCertificateStore.StoreTypeName);\n                if (certStoreTypeName is null)\n                {\n                    CertificateStoreType.RegisterCertificateStoreType(\n                        FlatCertificateStore.StoreTypeName, new FlatCertificateStore());\n                }\n                Console.WriteLine(\"Running in Kubernetes, using flat certificate store.\");\n            }\n            using var server = new ServerConsoleHost(\n                TestServerFactory.Create(serverType, Log.Console<TestServerFactory>()), logger)\n            {\n                HostName = host,\n                AlternativeHosts = alternativeHosts,\n                UriPath = runsInKubernetes ? string.Empty : null,\n                CertStoreType = runsInKubernetes ? FlatCertificateStore.StoreTypeName : null,\n                PkiRootPath = runsInKubernetes ? FlatCertificateStore.StoreTypePrefix + \"pki\" : null,\n                AutoAccept = true\n            };\n            await server.StartAsync(ports).ConfigureAwait(false);\n#if DEBUG\n            if (!Console.IsInputRedirected && !runsInKubernetes)\n            {\n                Console.WriteLine(\"Press any key to exit...\");\n                Console.TreatControlCAsInput = true;\n                await Task.WhenAny(tcs.Task, Task.Run(Console.ReadKey)).ConfigureAwait(false);\n                return;\n            }\n#endif\n            await tcs.Task.ConfigureAwait(false);\n            logger.LogInformation(\"Exiting.\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/cli/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System;\n\n[assembly: CLSCompliant(false)]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/cli/TestServerFactory.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Cli\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Furly.Extensions.Utils;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using System.Xml;\n\n    /// <summary>\n    /// Reference server factory\n    /// </summary>\n    public class TestServerFactory : IServerFactory\n    {\n        /// <summary>\n        /// Whether to log status\n        /// </summary>\n        public bool LogStatus { get; set; }\n\n        /// <summary>\n        /// Server factory\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"nodes\"></param>\n        public TestServerFactory(ILogger<TestServerFactory> logger,\n            IEnumerable<INodeManagerFactory> nodes)\n        {\n            _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n            _nodes = nodes ?? throw new ArgumentNullException(nameof(nodes));\n        }\n\n        /// <summary>\n        /// Full set of servers\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        public TestServerFactory(ILogger<TestServerFactory> logger) :\n            this(logger, new List<INodeManagerFactory> {\n                new TestData.TestDataServer(),\n                new MemoryBuffer.MemoryBufferServer(),\n                new Boiler.BoilerServer(),\n                new Vehicles.VehiclesServer(),\n                new Reference.ReferenceServer(),\n                new HistoricalEvents.HistoricalEventsServer(new TimeService()),\n                new HistoricalAccess.HistoricalAccessServer(new TimeService()),\n                new Views.ViewsServer(),\n                new DataAccess.DataAccessServer(),\n                new Alarms.AlarmConditionServer(new TimeService()),\n                new PerfTest.PerfTestServer(),\n                new SimpleEvents.SimpleEventsServer(),\n                new Plc.PlcServer(new TimeService(), logger, 1),\n                new FileSystem.FileSystemServer(),\n                new Asset.AssetServer(logger),\n                new Isa95Jobs.Isa95JobControlServer()\n            })\n        {\n        }\n\n        internal static IServerFactory Create(string serverType, ILogger<TestServerFactory> logger)\n        {\n            switch (serverType.ToLowerInvariant())\n            {\n                case \"reference\":\n                    return new TestServerFactory(logger,\n                    [\n                        new Reference.ReferenceServer(),\n                    ]);\n                case \"plc\":\n                    return new TestServerFactory(logger,\n                    [\n                        new Plc.PlcServer(new TimeService(), logger, 1),\n                    ]);\n                case \"asset\":\n                    return new TestServerFactory(logger,\n                    [\n                        new Asset.AssetServer(logger),\n                    ]);\n                case \"testdata\":\n                    return new TestServerFactory(logger,\n                    [\n                        new TestData.TestDataServer(),\n                        new MemoryBuffer.MemoryBufferServer(),\n                        new Boiler.BoilerServer(),\n                        new Vehicles.VehiclesServer(),\n                        new DataAccess.DataAccessServer(),\n                    ]);\n                default:\n                    return new TestServerFactory(logger,\n                    [\n                        new TestData.TestDataServer(),\n                        new MemoryBuffer.MemoryBufferServer(),\n                        new Boiler.BoilerServer(),\n                        new Vehicles.VehiclesServer(),\n                        new Reference.ReferenceServer(),\n                        new HistoricalEvents.HistoricalEventsServer(new TimeService()),\n                        new HistoricalAccess.HistoricalAccessServer(new TimeService()),\n                        new Views.ViewsServer(),\n                        new DataAccess.DataAccessServer(),\n                        new Alarms.AlarmConditionServer(new TimeService()),\n                        new PerfTest.PerfTestServer(),\n                        new SimpleEvents.SimpleEventsServer(),\n                        new Plc.PlcServer(new TimeService(), logger, 1),\n                        new FileSystem.FileSystemServer(),\n                        new Asset.AssetServer(logger),\n                        new Isa95Jobs.Isa95JobControlServer()\n                    ]);\n            }\n        }\n\n        /// <inheritdoc/>\n        public ApplicationConfiguration CreateServer(IEnumerable<int> ports,\n            string pkiRootPath, out ServerBase server, string listenHostName,\n            IEnumerable<string> alternativeAddresses, string path,\n            string certStoreType, Action<ServerConfiguration> configure)\n        {\n            server = new Server(LogStatus, _nodes, _logger);\n            return Server.CreateServerConfiguration(\n                ports, listenHostName, alternativeAddresses, path,\n                pkiRootPath, certStoreType, configure: configure);\n        }\n\n        /// <inheritdoc/>\n        private sealed class Server : ReverseConnectServer\n        {\n            /// <summary>\n            /// Create server\n            /// </summary>\n            /// <param name=\"logStatus\"></param>\n            /// <param name=\"nodes\"></param>\n            /// <param name=\"logger\"></param>\n            internal Server(bool logStatus, IEnumerable<INodeManagerFactory> nodes,\n                ILogger logger)\n            {\n                _logger = logger;\n                _logStatus = logStatus;\n                _nodes = nodes;\n            }\n\n            /// <summary>\n            /// Create configuration\n            /// </summary>\n            /// <param name=\"ports\"></param>\n            /// <param name=\"hostName\"></param>\n            /// <param name=\"alternativeAddresses\"></param>\n            /// <param name=\"path\"></param>\n            /// <param name=\"pkiRootPath\"></param>\n            /// <param name=\"certStoreType\"></param>\n            /// <param name=\"enableDiagnostics\"></param>\n            /// <param name=\"configure\"></param>\n            /// <returns></returns>\n            public static ApplicationConfiguration CreateServerConfiguration(\n                IEnumerable<int> ports, string hostName, IEnumerable<string> alternativeAddresses,\n                string path, string pkiRootPath, string certStoreType, bool enableDiagnostics = false,\n                Action<ServerConfiguration> configure = null)\n            {\n                var extensions = new List<object>\n                {\n                    new MemoryBuffer.MemoryBufferConfiguration\n                    {\n                        Buffers =\n                        [\n                            new MemoryBuffer.MemoryBufferInstance\n                            {\n                                Name = \"UInt32\",\n                                TagCount = 10000,\n                                DataType = \"UInt32\"\n                            },\n                            new MemoryBuffer.MemoryBufferInstance\n                            {\n                                Name = \"Double\",\n                                TagCount = 100,\n                                DataType = \"Double\"\n                            }\n                        ]\n                    }\n                    /// ...\n                };\n                certStoreType ??= CertificateStoreType.Directory;\n                if (string.IsNullOrEmpty(pkiRootPath))\n                {\n                    pkiRootPath = \"pki\";\n                }\n                path ??= \"/UA/SampleServer\";\n                if (path.Length > 0 && !path.StartsWith('/'))\n                {\n                    path = \"/\" + path;\n                }\n                var configuration = new ApplicationConfiguration\n                {\n                    ApplicationName = \"UA Core Sample Server\",\n                    ApplicationType = ApplicationType.Server,\n                    ApplicationUri = $\"urn:{hostName ?? Utils.GetHostName()}:OPCFoundation:CoreSampleServer\",\n                    Extensions = new XmlElementCollection(\n                        extensions.Select(XmlElementEx.SerializeObject)),\n\n                    ProductUri = \"http://opcfoundation.org/UA/SampleServer\",\n                    SecurityConfiguration = new SecurityConfiguration\n                    {\n                        ApplicationCertificate = new CertificateIdentifier\n                        {\n                            StoreType = certStoreType,\n                            StorePath = $\"{pkiRootPath}/own\",\n                            SubjectName = \"UA Core Sample Server\"\n                        },\n                        TrustedPeerCertificates = new CertificateTrustList\n                        {\n                            StoreType = certStoreType,\n                            StorePath = $\"{pkiRootPath}/trusted\"\n                        },\n                        TrustedIssuerCertificates = new CertificateTrustList\n                        {\n                            StoreType = certStoreType,\n                            StorePath = $\"{pkiRootPath}/issuer\"\n                        },\n                        RejectedCertificateStore = new CertificateTrustList\n                        {\n                            StoreType = certStoreType,\n                            StorePath = $\"{pkiRootPath}/rejected\"\n                        },\n                        MinimumCertificateKeySize = 1024,\n                        RejectSHA1SignedCertificates = false,\n                        AutoAcceptUntrustedCertificates = true,\n                        AddAppCertToTrustedStore = true,\n                        RejectUnknownRevocationStatus = true\n                    },\n                    TransportConfigurations = [],\n                    TransportQuotas = new TransportQuotas(),\n                    ServerConfiguration = new ServerConfiguration\n                    {\n                        // Sample server specific\n                        ServerProfileArray = [\n                             \"Standard UA Server Profile\",\n                             \"Data Access Server Facet\",\n                             \"Method Server Facet\"\n                        ],\n                        ServerCapabilities = [\n                            \"DA\"\n                        ],\n                        SupportedPrivateKeyFormats = [\n                            \"PFX\", \"PEM\"\n                        ],\n\n                        NodeManagerSaveFile = \"nodes.xml\",\n                        DiagnosticsEnabled = enableDiagnostics,\n                        ShutdownDelay = 0,\n\n                        // Runtime configuration\n                        BaseAddresses = [.. ports\n                            .Distinct()\n                            .Select(p => $\"opc.tcp://{hostName ?? \"localhost\"}:{p}{path}\")],\n                        AlternateBaseAddresses = alternativeAddresses == null ? null :\n                            [.. alternativeAddresses.Distinct().SelectMany(e => ports\n                                .Distinct()\n                                .Select(p => $\"opc.tcp://{e}:{p}{path}\"))],\n\n                        SecurityPolicies = [\n                            new ServerSecurityPolicy {\n                                SecurityMode = MessageSecurityMode.Sign,\n                                SecurityPolicyUri = SecurityPolicies.Basic256Sha256\n                            },\n                            new ServerSecurityPolicy {\n                                SecurityMode = MessageSecurityMode.SignAndEncrypt,\n                                SecurityPolicyUri =SecurityPolicies.Basic256Sha256\n                            },\n                            new ServerSecurityPolicy {\n                                SecurityMode = MessageSecurityMode.None,\n                                SecurityPolicyUri = SecurityPolicies.None\n                            }\n                        ],\n                        UserTokenPolicies = [\n                            new UserTokenPolicy {\n                                TokenType = UserTokenType.Anonymous,\n                                SecurityPolicyUri = SecurityPolicies.None\n                            },\n                            new UserTokenPolicy {\n                                TokenType = UserTokenType.UserName\n                            },\n                            new UserTokenPolicy {\n                                TokenType = UserTokenType.Certificate\n                            }\n                        ],\n\n                        MinRequestThreadCount = 200,\n                        MaxRequestThreadCount = 2000,\n                        MaxQueuedRequestCount = 2000000,\n\n                        MaxSessionCount = 10000,\n                        MinSessionTimeout = 10000,\n                        MaxSessionTimeout = 3600000,\n                        MaxBrowseContinuationPoints = 1000,\n                        MaxQueryContinuationPoints = 1000,\n                        MaxHistoryContinuationPoints = 1000,\n                        MaxRequestAge = 600000,\n                        MinPublishingInterval = 100,\n                        MaxPublishingInterval = 3600000,\n                        PublishingResolution = 50,\n                        MaxSubscriptionLifetime = 3600000,\n                        MaxMessageQueueSize = 100,\n                        MaxNotificationQueueSize = 100,\n                        MaxNotificationsPerPublish = 1000,\n                        MinMetadataSamplingInterval = 1000,\n                        MaxPublishRequestCount = 20,\n                        MaxSubscriptionCount = 100,\n                        MaxEventQueueSize = 10000,\n                        MinSubscriptionLifetime = 10000,\n\n                        // Do not register with LDS\n                        MaxRegistrationInterval = 0, // TODO\n                        RegistrationEndpoint = null\n                    },\n                    TraceConfiguration = new TraceConfiguration\n                    {\n                        TraceMasks = 1\n                    }\n                };\n                configure?.Invoke(configuration.ServerConfiguration);\n                return configuration;\n            }\n\n            /// <inheritdoc/>\n            protected override ServerProperties LoadServerProperties()\n            {\n                return new ServerProperties\n                {\n                    ManufacturerName = \"OPC Foundation\",\n                    ProductName = \"OPC UA Sample Servers\",\n                    ProductUri = \"http://opcfoundation.org/UA/Samples/v1.0\",\n                    SoftwareVersion = Utils.GetAssemblySoftwareVersion(),\n                    BuildNumber = Utils.GetAssemblyBuildNumber(),\n                    BuildDate = Utils.GetAssemblyTimestamp()\n                };\n            }\n\n            /// <inheritdoc/>\n            protected override MasterNodeManager CreateMasterNodeManager(\n                IServerInternal server, ApplicationConfiguration configuration)\n            {\n                _logger.CreatingNodeManagers();\n                var nodeManagers = _nodes\n                    .Select(n => n.Create(server, configuration));\n                return new MasterNodeManager(server, configuration, null,\n                    nodeManagers.ToArray());\n            }\n\n            /// <inheritdoc/>\n            protected override void OnServerStopping()\n            {\n                _logger.ServerStopping();\n                base.OnServerStopping();\n                _cts.Cancel();\n                _statusLogger?.Wait();\n            }\n\n            /// <inheritdoc/>\n            protected override void OnServerStarted(IServerInternal server)\n            {\n                // start the status thread\n                _cts = new CancellationTokenSource();\n                if (_logStatus)\n                {\n                    _statusLogger = Task.Run(() => LogStatusAsync(_cts.Token));\n\n                    // print notification on session events\n                    CurrentInstance.SessionManager.SessionActivated += OnEvent;\n                    CurrentInstance.SessionManager.SessionClosing += OnEvent;\n                    CurrentInstance.SessionManager.SessionCreated += OnEvent;\n                }\n                base.OnServerStarted(server);\n                // request notifications when the user identity is changed. all valid users are accepted by default.\n                server.SessionManager.ImpersonateUser += SessionManager_ImpersonateUser;\n            }\n\n            /// <inheritdoc/>\n            protected override void OnServerStarting(ApplicationConfiguration configuration)\n            {\n                _logger.ServerStarting();\n                CreateUserIdentityValidators(configuration);\n                base.OnServerStarting(configuration);\n            }\n\n            /// <inheritdoc/>\n            protected override void OnNodeManagerStarted(IServerInternal server)\n            {\n                _logger.NodeManagersStarted();\n                base.OnNodeManagerStarted(server);\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                base.Dispose(disposing);\n                _cts?.Dispose();\n            }\n\n            /// <summary>\n            /// Handle session event by logging status\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"reason\"></param>\n            private void OnEvent(ISession session, SessionEventReason reason)\n            {\n                _lastEventTime = DateTimeOffset.UtcNow;\n                LogSessionStatus(session, reason.ToString());\n            }\n\n            /// <summary>\n            /// Continously log session status if not logged during events\n            /// </summary>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            private async Task LogStatusAsync(CancellationToken ct)\n            {\n                while (!ct.IsCancellationRequested)\n                {\n                    if (DateTimeOffset.UtcNow - _lastEventTime > TimeSpan.FromMilliseconds(6000))\n                    {\n                        foreach (var session in CurrentInstance.SessionManager.GetSessions())\n                        {\n                            LogSessionStatus(session, \"-Status-\", true);\n                        }\n                        _lastEventTime = DateTimeOffset.UtcNow;\n                    }\n                    await Try.Async(() => Task.Delay(1000, ct)).ConfigureAwait(false);\n                }\n            }\n\n            /// <summary>\n            /// Helper to log session status\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"reason\"></param>\n            /// <param name=\"lastContact\"></param>\n            private void LogSessionStatus(ISession session, string reason, bool lastContact = false)\n            {\n                lock (session.DiagnosticsLock)\n                {\n                    var item = $\"{reason,9}:{session.SessionDiagnostics.SessionName,20}:\";\n                    if (lastContact)\n                    {\n                        item += $\"Last Event:{session.SessionDiagnostics.ClientLastContactTime.ToLocalTime():HH:mm:ss}\";\n                    }\n                    else\n                    {\n                        if (session.Identity != null)\n                        {\n                            item += $\":{session.Identity.DisplayName,20}\";\n                        }\n                        item += $\":{session.Id}\";\n                    }\n                    _logger.ItemStatus(item);\n                }\n            }\n\n            /// <summary>\n            /// Creates the objects used to validate the user identity tokens supported by the server.\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            private void CreateUserIdentityValidators(ApplicationConfiguration configuration)\n            {\n                for (var i = 0; i < configuration.ServerConfiguration.UserTokenPolicies.Count; i++)\n                {\n                    var policy = configuration.ServerConfiguration.UserTokenPolicies[i];\n\n                    // ignore policies without an explicit id.\n                    if (string.IsNullOrEmpty(policy.PolicyId))\n                    {\n                        continue;\n                    }\n\n                    // create a validator for an issued token policy.\n                    if (policy.TokenType == UserTokenType.IssuedToken)\n                    {\n                        // the name of the element in the configuration file.\n                        var qname = new XmlQualifiedName(policy.PolicyId, Namespaces.OpcUa);\n\n                        // find the id for the issuer certificate.\n                        var id = configuration.ParseExtension<CertificateIdentifier>(qname);\n\n                        if (id == null)\n                        {\n                            Utils.Trace(\n                                Utils.TraceMasks.Error,\n                                \"Could not load CertificateIdentifier for UserTokenPolicy {0}\",\n                                policy.PolicyId);\n\n                            continue;\n                        }\n                    }\n\n                    // create a validator for a certificate token policy.\n                    if (policy.TokenType == UserTokenType.Certificate)\n                    {\n                        // the name of the element in the configuration file.\n                        var qname = new XmlQualifiedName(policy.PolicyId, Namespaces.OpcUa);\n\n                        // find the location of the trusted issuers.\n                        var trustedIssuers = configuration.ParseExtension<CertificateTrustList>(qname);\n\n                        if (trustedIssuers == null)\n                        {\n                            Utils.Trace(\n                                Utils.TraceMasks.Error,\n                                \"Could not load CertificateTrustList for UserTokenPolicy {0}\",\n                                policy.PolicyId);\n\n                            continue;\n                        }\n\n                        // trusts any certificate in the trusted people store.\n                        _certificateValidator = CertificateValidator.GetChannelValidator();\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Called when a client tries to change its user identity.\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"args\"></param>\n            /// <exception cref=\"ArgumentNullException\"><paramref name=\"session\"/> is <c>null</c>.</exception>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            private void SessionManager_ImpersonateUser(ISession session,\n                ImpersonateEventArgs args)\n            {\n                ArgumentNullException.ThrowIfNull(session);\n\n                if (args.NewIdentity is AnonymousIdentityToken guest)\n                {\n                    args.Identity = new UserIdentity(guest);\n                    Utils.Trace(\"Guest access accepted: {0}\", args.Identity.DisplayName);\n                    return;\n                }\n\n                // check for a user name token.\n                if (args.NewIdentity is UserNameIdentityToken userNameToken)\n                {\n                    var admin = VerifyPassword(userNameToken.UserName, userNameToken.DecryptedPassword);\n                    args.Identity = new UserIdentity(userNameToken);\n                    if (admin)\n                    {\n                        args.Identity = new SystemConfigurationIdentity(args.Identity);\n                    }\n                    Utils.Trace(\"UserName Token accepted: {0}\", args.Identity.DisplayName);\n                    return;\n                }\n\n                // check for x509 user token.\n                if (args.NewIdentity is X509IdentityToken x509Token)\n                {\n                    var admin = VerifyCertificate(x509Token.Certificate);\n                    args.Identity = new UserIdentity(x509Token);\n                    if (admin)\n                    {\n                        args.Identity = new SystemConfigurationIdentity(args.Identity);\n                    }\n                    Utils.Trace(\"X509 Token accepted: {0}\", args.Identity.DisplayName);\n                    return;\n                }\n\n                // check for x509 user token.\n                if (args.NewIdentity is IssuedIdentityToken wssToken)\n                {\n                    var admin = VerifyToken(wssToken);\n                    args.Identity = new UserIdentity(wssToken);\n                    if (admin)\n                    {\n                        args.Identity = new SystemConfigurationIdentity(args.Identity);\n                    }\n                    Utils.Trace(\"Issued Token accepted: {0}\", args.Identity.DisplayName);\n                    return;\n                }\n\n                // construct translation object with default text.\n                var info = new TranslationInfo(\"InvalidToken\", \"en-US\",\n                    \"Specified token is not valid.\");\n                // create an exception with a vendor defined sub-code.\n                throw new ServiceResultException(new ServiceResult(\n                    StatusCodes.BadIdentityTokenRejected, \"Bad token\",\n                    kServerNamespaceUri, new LocalizedText(info)));\n            }\n\n            /// <summary>\n            /// Validates the token\n            /// </summary>\n            /// <param name=\"wssToken\"></param>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            private static bool VerifyToken(IssuedIdentityToken wssToken)\n            {\n                if ((wssToken.TokenData?.Length ?? 0) == 0)\n                {\n                    var info = new TranslationInfo(\"InvalidToken\", \"en-US\",\n                        \"Specified token is empty.\");\n                    // create an exception with a vendor defined sub-code.\n                    throw new ServiceResultException(new ServiceResult(\n                        StatusCodes.BadIdentityTokenRejected, \"Bad token\",\n                        kServerNamespaceUri, new LocalizedText(info)));\n                }\n                return false;\n            }\n\n            /// <summary>\n            /// Validates the password for a username token.\n            /// </summary>\n            /// <param name=\"userName\"></param>\n            /// <param name=\"password\"></param>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            private static bool VerifyPassword(string userName, string password)\n            {\n                if (string.IsNullOrEmpty(password))\n                {\n                    // construct translation object with default text.\n                    var info = new TranslationInfo(\n                        \"InvalidPassword\", \"en-US\",\n                        \"Specified password is not valid for user '{0}'.\",\n                        userName);\n                    // create an exception with a vendor defined sub-code.\n                    throw new ServiceResultException(new ServiceResult(\n                        StatusCodes.BadIdentityTokenRejected, \"InvalidPassword\",\n                        kServerNamespaceUri, new LocalizedText(info)));\n                }\n\n                if (userName.Equals(\"test\", StringComparison.OrdinalIgnoreCase) &&\n                    password == \"test\")\n                {\n                    // Testing purposes only\n                    return true;\n                }\n                return false;\n            }\n\n            /// <summary>\n            /// Verifies that a certificate user token is trusted.\n            /// </summary>\n            /// <param name=\"certificate\"></param>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            private bool VerifyCertificate(X509Certificate2 certificate)\n            {\n                try\n                {\n                    if (_certificateValidator != null)\n                    {\n                        _certificateValidator.Validate(certificate);\n                    }\n                    else\n                    {\n                        CertificateValidator.Validate(certificate);\n                    }\n\n                    // determine if self-signed.\n                    var isSelfSigned = X509Utils.CompareDistinguishedName(\n                        certificate.Subject, certificate.Issuer);\n\n                    // do not allow self signed application certs as user token\n                    if (isSelfSigned && X509Utils.HasApplicationURN(certificate))\n                    {\n                        throw new ServiceResultException(StatusCodes.BadCertificateUseNotAllowed);\n                    }\n                    return false;\n                }\n                catch (Exception e)\n                {\n                    TranslationInfo info;\n                    StatusCode result = StatusCodes.BadIdentityTokenRejected;\n                    if (e is ServiceResultException se &&\n                        se.StatusCode == StatusCodes.BadCertificateUseNotAllowed)\n                    {\n                        info = new TranslationInfo(\n                            \"InvalidCertificate\",\n                            \"en-US\",\n                            \"'{0}' is an invalid user certificate.\",\n                            certificate.Subject);\n\n                        result = StatusCodes.BadIdentityTokenInvalid;\n                    }\n                    else\n                    {\n                        // construct translation object with default text.\n                        info = new TranslationInfo(\n                            \"UntrustedCertificate\",\n                            \"en-US\",\n                            \"'{0}' is not a trusted user certificate.\",\n                            certificate.Subject);\n                    }\n\n                    // create an exception with a vendor defined sub-code.\n                    throw new ServiceResultException(new ServiceResult(\n                        result, info.Key, kServerNamespaceUri, new LocalizedText(info)));\n                }\n            }\n\n            private readonly ILogger _logger;\n            private readonly bool _logStatus;\n            private readonly IEnumerable<INodeManagerFactory> _nodes;\n            private Task _statusLogger;\n            private DateTimeOffset _lastEventTime;\n            private CancellationTokenSource _cts;\n            private ICertificateValidator _certificateValidator;\n\n            private const string kServerNamespaceUri = \"http://opcfoundation.org/UA/Sample/\";\n        }\n\n        private readonly ILogger _logger;\n        private readonly IEnumerable<INodeManagerFactory> _nodes;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for TestServer\n    /// </summary>\n    internal static partial class TestServerLogging\n    {\n        private const int EventClass = 0;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Creating the Node Managers.\")]\n        public static partial void CreatingNodeManagers(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"The server is stopping.\")]\n        public static partial void ServerStopping(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug,\n            Message = \"The server is starting.\")]\n        public static partial void ServerStarting(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"The NodeManagers have started.\")]\n        public static partial void NodeManagersStarted(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"{Log}\")]\n        public static partial void ItemStatus(this ILogger logger, string log);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/AlarmConditionNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    /// <summary>\n    /// A node manager for a simple server that exposes several Areas, Sources and Conditions.\n    /// </summary>\n    /// <remarks>\n    /// This node manager presumes that the information model consists of a hierachy of predefined\n    /// Areas with a number of Sources contained within them. Each individual Source is\n    /// identified by a fully qualified path. The underlying system knows how to access the source\n    /// configuration when it is provided the fully qualified path.\n    /// </remarks>\n    public class AlarmConditionServerNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"timeservice\"></param>\n        public AlarmConditionServerNodeManager(IServerInternal server, ApplicationConfiguration configuration, TimeService timeservice)\n        :\n            base(server, configuration, Namespaces.AlarmCondition)\n        {\n            SystemContext.SystemHandle = _system = new UnderlyingSystem(timeservice);\n            SystemContext.NodeIdFactory = this;\n\n            // get the configuration for the node manager.\n            _configuration = configuration.ParseExtension<AlarmConditionServerConfiguration>();\n\n            // use suitable defaults if no configuration exists.\n            _configuration ??= new AlarmConditionServerConfiguration\n            {\n                Areas = [\n                        new AreaConfiguration {\n                            Name = \"Green\",\n                            SubAreas = [\n                                new AreaConfiguration {\n                                    Name = \"East\",\n                                    SubAreas = [\n                                        new AreaConfiguration {\n                                            Name = \"Red\",\n                                            SourcePaths = [\n                                                \"Colours/EastTank\",\n                                                \"Colours/NorthMotor\"\n                                            ]\n                                        },\n                                        new AreaConfiguration {\n                                            Name = \"Blue\",\n                                            SourcePaths = [\n                                                \"Metals/WestTank\",\n                                                \"Metals/SouthMotor\"\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        new AreaConfiguration {\n                            Name = \"Yellow\",\n                            SubAreas = [\n                                new AreaConfiguration {\n                                    Name = \"West\",\n                                    SubAreas = [\n                                        new AreaConfiguration {\n                                            Name = \"Red\",\n                                            SourcePaths = [\n                                                \"Metals/SouthMotor\",\n                                                \"Colours/NorthMotor\"\n                                            ]\n                                        },\n                                        new AreaConfiguration {\n                                            Name = \"Blue\",\n                                            SourcePaths = [\n                                                \"Colours/EastTank\",\n                                                \"Metals/WestTank\"\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    ]\n            };\n\n            // create the table to store the available areas.\n            _areas = [];\n\n            // create the table to store the available sources.\n            _sources = [];\n            _timeservice = timeservice;\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                if (_system != null)\n                {\n                    _system.Dispose();\n                    _system = null;\n                }\n                if (_simulationTimer != null)\n                {\n                    _simulationTimer.Dispose();\n                    _simulationTimer = null;\n                }\n            }\n\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The node.</param>\n        /// <returns>The new NodeId.</returns>\n        /// <remarks>\n        /// This method is called by the NodeState.Create() method which initializes a Node from\n        /// the type model. During initialization a number of child nodes are created and need to\n        /// have NodeIds assigned to them. This implementation constructs NodeIds by constructing\n        /// strings. Other implementations could assign unique integers or Guids and save the new\n        /// Node in a dictionary for later lookup.\n        /// </remarks>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            return ModelUtils.ConstructIdForComponent(node, NamespaceIndex);\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                if (_configuration.Areas != null)\n                {\n                    // Top level areas need a reference from the Server object.\n                    // These references are added to a list that is returned to the caller.\n                    // The caller will update the Objects folder node.\n\n                    if (!externalReferences.TryGetValue(ObjectIds.Server, out var references))\n                    {\n                        externalReferences[ObjectIds.Server] = references = [];\n                    }\n\n                    for (var ii = 0; ii < _configuration.Areas.Count; ii++)\n                    {\n                        // recursively process each area.\n                        var area = CreateAndIndexAreas(null, _configuration.Areas[ii]);\n                        AddRootNotifier(area);\n\n                        // add an organizes reference from the ObjectsFolder to the area.\n                        references.Add(new NodeStateReference(ReferenceTypeIds.HasNotifier, false, area.NodeId));\n                    }\n                }\n\n                // start the simulation.\n                _system.StartSimulation();\n                _simulationTimer = new Timer(OnRaiseSystemEvents, null, 1000, 1000);\n            }\n        }\n\n        private void OnRaiseSystemEvents(object state)\n        {\n            try\n            {\n                var e = new SystemEventState(null);\n\n                e.Initialize(\n                    SystemContext,\n                    null,\n                    EventSeverity.Medium,\n                    new LocalizedText(\"Raising Events\"));\n\n                e.SetChildValue(SystemContext, BrowseNames.SourceNode, ObjectIds.Server, false);\n                e.SetChildValue(SystemContext, BrowseNames.SourceName, \"Internal\", false);\n\n                Server.ReportEvent(e);\n\n                var ae = new AuditEventState(null);\n\n                ae.Initialize(\n                    SystemContext,\n                    null,\n                    EventSeverity.Medium,\n                    new LocalizedText(\"Events Raised\"),\n                    true,\n                    _timeservice.UtcNow);\n\n                ae.SetChildValue(SystemContext, BrowseNames.SourceNode, ObjectIds.Server, false);\n                ae.SetChildValue(SystemContext, BrowseNames.SourceName, \"Internal\", false);\n\n                Server.ReportEvent(ae);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error in OnRaiseSystemEvents\");\n            }\n        }\n\n        /// <summary>\n        /// Creates and indexes an area defined for the server.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"configuration\"></param>\n        private AreaState CreateAndIndexAreas(AreaState parent, AreaConfiguration configuration)\n        {\n            // create a unique path to the area.\n            var areaPath = Utils.Format(\"{0}/{1}\", (parent != null) ? parent.SymbolicName : string.Empty, configuration.Name);\n            var areaId = ModelUtils.ConstructIdForArea(areaPath, NamespaceIndex);\n\n            // create the object that will be used to access the area and any variables contained within it.\n            var area = new AreaState(SystemContext, parent, areaId, configuration);\n            _areas[areaPath] = area;\n\n            parent?.AddChild(area);\n\n            // create an index any sub-areas defined for the area.\n            if (configuration.SubAreas != null)\n            {\n                for (var ii = 0; ii < configuration.SubAreas.Count; ii++)\n                {\n                    CreateAndIndexAreas(area, configuration.SubAreas[ii]);\n                }\n            }\n\n            // add references to sources.\n            if (configuration.SourcePaths != null)\n            {\n                for (var ii = 0; ii < configuration.SourcePaths.Count; ii++)\n                {\n                    var sourcePath = configuration.SourcePaths[ii];\n\n                    // check if the source already exists because it is referenced by another area.\n\n                    if (!_sources.TryGetValue(sourcePath, out var source))\n                    {\n                        var sourceId = ModelUtils.ConstructIdForSource(sourcePath, NamespaceIndex);\n                        _sources[sourcePath] = source = new SourceState(this, sourceId, sourcePath, _timeservice);\n                    }\n\n                    // HasEventSource and HasNotifier control the propagation of event notifications so\n                    // they are not like other references. These calls set up a link between the source\n                    // and area that will cause events produced by the source to be automatically\n                    // propagated to the area.\n                    source.AddNotifier(SystemContext, ReferenceTypeIds.HasEventSource, true, area);\n                    area.AddNotifier(SystemContext, ReferenceTypeIds.HasEventSource, false, source);\n                }\n            }\n\n            return area;\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                _system.StopSimulation();\n                _areas.Clear();\n                _sources.Clear();\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context,\n            NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // check for check for nodes that are being currently monitored.\n\n                if (MonitoredNodes.TryGetValue(nodeId, out var monitoredNode))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = true,\n                        Node = monitoredNode.Node\n                    };\n                }\n\n                // parse the identifier.\n                var parsedNodeId = ParsedNodeId.Parse(nodeId);\n\n                if (parsedNodeId != null)\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = false,\n                        Node = null,\n                        ParsedNodeId = parsedNodeId\n                    };\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            NodeState target = null;\n\n            // check if already in the cache.\n            if (cache != null)\n            {\n                if (cache.TryGetValue(handle.NodeId, out target))\n                {\n                    // nulls mean a NodeId which was previously found to be invalid has been referenced again.\n                    if (target == null)\n                    {\n                        return null;\n                    }\n\n                    handle.Node = target;\n                    handle.Validated = true;\n                    return handle.Node;\n                }\n\n                target = null;\n            }\n\n            try\n            {\n                // check if the node id has been parsed.\n                if (handle.ParsedNodeId is not ParsedNodeId parsedNodeId)\n                {\n                    return null;\n                }\n\n                NodeState root = null;\n\n                // validate area.\n                if (parsedNodeId.RootType == ModelUtils.Area)\n                {\n                    if (!_areas.TryGetValue(parsedNodeId.RootId, out var area))\n                    {\n                        return null;\n                    }\n\n                    root = area;\n                }\n\n                // validate soucre.\n                else if (parsedNodeId.RootType == ModelUtils.Source)\n                {\n                    if (!_sources.TryGetValue(parsedNodeId.RootId, out var source))\n                    {\n                        return null;\n                    }\n\n                    root = source;\n                }\n\n                // unknown root type.\n                else\n                {\n                    return null;\n                }\n\n                // all done if no components to validate.\n                if (string.IsNullOrEmpty(parsedNodeId.ComponentPath))\n                {\n                    handle.Validated = true;\n                    handle.Node = target = root;\n                    return handle.Node;\n                }\n\n                // validate component.\n                NodeState component = root.FindChildBySymbolicName(context, parsedNodeId.ComponentPath);\n\n                // component does not exist.\n                if (component == null)\n                {\n                    return null;\n                }\n\n                // found a valid component.\n                handle.Validated = true;\n                handle.Node = target = component;\n                return handle.Node;\n            }\n            finally\n            {\n                // store the node in the cache to optimize subsequent lookups.\n                cache?.Add(handle.NodeId, target);\n            }\n        }\n\n        private UnderlyingSystem _system;\n        private readonly AlarmConditionServerConfiguration _configuration;\n        private readonly Dictionary<string, AreaState> _areas;\n        private readonly Dictionary<string, SourceState> _sources;\n        private readonly TimeService _timeservice;\n        private Timer _simulationTimer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/AlarmConditionServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n\n    /// <inheritdoc/>\n    public class AlarmConditionServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.AlarmCondition\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public AlarmConditionServer(TimeService timeservice)\n        {\n            _timeservice = timeservice;\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new AlarmConditionServerNodeManager(server, configuration, _timeservice);\n        }\n\n        private readonly TimeService _timeservice;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/AlarmConditionServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the Alarm Condition server.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.AlarmCondition)]\n    public class AlarmConditionServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public AlarmConditionServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            Areas = [];\n        }\n\n        /// <summary>\n        /// Gets or sets the list of top level Areas exposed by the server.\n        /// </summary>\n        [DataMember(Order = 1)]\n        public AreaConfigurationCollection Areas { get; set; }\n    }\n\n    /// <summary>\n    /// Stores the configuration for a Area within the Alarm Condition server.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.AlarmCondition)]\n    public class AreaConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public AreaConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            Name = null;\n            SubAreas = null;\n            SourcePaths = null;\n        }\n\n        /// <summary>\n        /// The browse name for the instance.\n        /// </summary>\n        [DataMember(Order = 1)]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or set the list of sub-areas.\n        /// </summary>\n        [DataMember(Order = 2)]\n        public AreaConfigurationCollection SubAreas { get; set; }\n\n        /// <summary>\n        /// Gets or set the list of sources.\n        /// </summary>\n        [DataMember(Order = 3)]\n        public StringCollection SourcePaths { get; set; }\n    }\n\n    /// <summary>\n    /// A collection of AreaConfiguration objects.\n    /// </summary>\n    [CollectionDataContract(Name = \"ListOfAreaConfiguration\", Namespace = Namespaces.AlarmCondition, ItemName = \"AreaConfiguration\")]\n    public class AreaConfigurationCollection : List<AreaConfiguration>;\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/AreaState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n\n    /// <summary>\n    /// Maps an alarm area to a UA object node.\n    /// </summary>\n    public class AreaState : FolderState\n    {\n        /// <summary>\n        /// Initializes the area.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"configuration\"></param>\n        public AreaState(\n            ISystemContext context,\n            AreaState parent,\n            NodeId nodeId,\n            AreaConfiguration configuration)\n        :\n            base(parent)\n        {\n            Initialize(context);\n\n            // initialize the area with the fixed metadata.\n            SymbolicName = configuration.Name;\n            NodeId = nodeId;\n            BrowseName = new QualifiedName(Utils.Format(\"{0}\", configuration.Name), nodeId.NamespaceIndex);\n            DisplayName = BrowseName.Name;\n            Description = null;\n            ReferenceTypeId = ReferenceTypeIds.HasNotifier;\n            TypeDefinitionId = ObjectTypeIds.FolderType;\n            EventNotifier = EventNotifiers.SubscribeToEvents;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/ModelUtils.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.Text;\n\n    /// <summary>\n    /// Defines constants and methods used by all classes in the information model.\n    /// </summary>\n    public static class ModelUtils\n    {\n        /// <summary>\n        /// The RootType for a Area node identfier.\n        /// </summary>\n        public const int Area = 0;\n\n        /// <summary>\n        /// The RootType for a Source node identfier.\n        /// </summary>\n        public const int Source = 1;\n\n        /// <summary>\n        /// Constructs a node identifier for a area.\n        /// </summary>\n        /// <param name=\"areaPath\">The area path.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace that qualifies the identifier.</param>\n        /// <returns>The new node identifier.</returns>\n        public static NodeId ConstructIdForArea(string areaPath, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = areaPath,\n                NamespaceIndex = namespaceIndex,\n                RootType = 0\n            };\n\n            return parsedNodeId.Construct();\n        }\n\n        /// <summary>\n        /// Constructs a NodeId for a source.\n        /// </summary>\n        /// <param name=\"sourceId\">The source id.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace.</param>\n        /// <returns>The new NodeId.</returns>\n        public static NodeId ConstructIdForSource(string sourceId, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = sourceId,\n                NamespaceIndex = namespaceIndex,\n                RootType = 1\n            };\n\n            return parsedNodeId.Construct();\n        }\n\n        /// <summary>\n        /// Constructs the node identifier for a component.\n        /// </summary>\n        /// <param name=\"component\">The component.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace.</param>\n        /// <returns>The node identifier for a component.</returns>\n        public static NodeId ConstructIdForComponent(NodeState component, ushort namespaceIndex)\n        {\n            if (component == null)\n            {\n                return null;\n            }\n\n            // components must be instances with a parent.\n\n            if (component is not BaseInstanceState instance || instance.Parent == null)\n            {\n                return component.NodeId;\n            }\n\n            // parent must have a string identifier.\n\n            if (instance.Parent.NodeId.Identifier is not string parentId)\n            {\n                return null;\n            }\n\n            var buffer = new StringBuilder();\n            buffer.Append(parentId);\n\n            // check if the parent is another component.\n            var index = parentId.IndexOf('?');\n\n            if (index < 0)\n            {\n                buffer.Append('?');\n            }\n            else\n            {\n                buffer.Append('/');\n            }\n\n            buffer.Append(component.SymbolicName);\n\n            // return the node identifier.\n            return new NodeId(buffer.ToString(), namespaceIndex);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/Namespaces.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the server.\n        /// </summary>\n        public const string AlarmCondition = \"http://opcfoundation.org/AlarmCondition\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/SourceState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Maps an alarm source to a UA object node.\n    /// </summary>\n    public class SourceState : BaseObjectState\n    {\n        /// <summary>\n        /// Initializes the area.\n        /// </summary>\n        /// <param name=\"nodeManager\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"sourcePath\"></param>\n        /// <param name=\"timeService\"></param>\n        public SourceState(\n            CustomNodeManager2 nodeManager,\n            NodeId nodeId,\n            string sourcePath,\n            TimeService timeService)\n        :\n            base(null)\n        {\n            Initialize(nodeManager.SystemContext);\n\n            // save the node manager that owns the source.\n            _nodeManager = nodeManager;\n            _timeService = timeService;\n\n            // create the source with the underlying system.\n            _source = ((UnderlyingSystem)nodeManager.SystemContext.SystemHandle).CreateSource(sourcePath, OnAlarmChanged);\n\n            // initialize the area with the fixed metadata.\n            SymbolicName = _source.Name;\n            NodeId = nodeId;\n            BrowseName = new QualifiedName(Utils.Format(\"{0}\", _source.Name), nodeId.NamespaceIndex);\n            DisplayName = BrowseName.Name;\n            Description = null;\n            ReferenceTypeId = null;\n            TypeDefinitionId = ObjectTypeIds.BaseObjectType;\n            EventNotifier = EventNotifiers.None;\n\n            // create a dialog.\n            _dialog = CreateDialog(\"OnlineState\");\n\n            // create the table of conditions.\n            _alarms = [];\n            _events = [];\n            _branches = [];\n\n            // request an updated for all alarms.\n            _source.Refresh();\n        }\n\n        /// <summary>\n        /// Returns the last event produced for any conditions belonging to the node or its chilren.\n        /// </summary>\n        /// <param name=\"context\">The system context.</param>\n        /// <param name=\"events\">The list of condition events to return.</param>\n        /// <param name=\"includeChildren\">Whether to recursively report events for the children.</param>\n        public override void ConditionRefresh(ISystemContext context, List<IFilterTarget> events, bool includeChildren)\n        {\n            // need to check if this source has already been processed during this refresh operation.\n            for (var ii = 0; ii < events.Count; ii++)\n            {\n                if (events[ii] is InstanceStateSnapshot e && ReferenceEquals(e.Handle, this))\n                {\n                    return;\n                }\n            }\n\n            // report the dialog.\n            if (_dialog != null)\n            {\n                // do not refresh dialogs that are not active.\n                if (_dialog.Retain.Value)\n                {\n                    // create a snapshot.\n                    var e = new InstanceStateSnapshot();\n                    e.Initialize(context, _dialog);\n\n                    // set the handle of the snapshot to check for duplicates.\n                    e.Handle = this;\n\n                    events.Add(e);\n                }\n            }\n\n            // the alarm objects act as a cache for the last known state and are used to generate refresh events.\n            foreach (var alarm in _alarms.Values)\n            {\n                // do not refresh alarms that are not in an interesting state.\n                if (!alarm.Retain.Value)\n                {\n                    continue;\n                }\n\n                // create a snapshot.\n                var e = new InstanceStateSnapshot();\n                e.Initialize(context, alarm);\n\n                // set the handle of the snapshot to check for duplicates.\n                e.Handle = this;\n\n                events.Add(e);\n            }\n\n            // report any active branches.\n            foreach (var alarm in _branches.Values)\n            {\n                // create a snapshot.\n                var e = new InstanceStateSnapshot();\n                e.Initialize(context, alarm);\n\n                // set the handle of the snapshot to check for duplicates.\n                e.Handle = this;\n\n                events.Add(e);\n            }\n        }\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            _dialog?.Dispose();\n        }\n\n        /// <summary>\n        /// Called when the state of an alarm for the source has changed.\n        /// </summary>\n        /// <param name=\"alarm\"></param>\n        private void OnAlarmChanged(UnderlyingSystemAlarm alarm)\n        {\n            lock (_nodeManager.Lock)\n            {\n                // ignore archived alarms for now.\n                if (alarm.RecordNumber != 0)\n                {\n                    var branchId = new NodeId(alarm.RecordNumber, NodeId.NamespaceIndex);\n\n                    // find the alarm branch.\n\n                    if (!_branches.TryGetValue(branchId, out var branch))\n                    {\n                        _branches[branchId] = branch = CreateAlarm(alarm, branchId);\n                    }\n\n                    // map the system information to the UA defined alarm.\n                    UpdateAlarm(branch, alarm);\n                    ReportChanges(branch);\n\n                    // delete the branch.\n                    if ((alarm.State & UnderlyingSystemAlarmStates.Deleted) != 0)\n                    {\n                        _branches.Remove(branchId);\n                    }\n\n                    return;\n                }\n\n                // find the alarm node.\n\n                if (!_alarms.TryGetValue(alarm.Name, out var node))\n                {\n                    _alarms[alarm.Name] = node = CreateAlarm(alarm, null);\n                }\n\n                // map the system information to the UA defined alarm.\n                UpdateAlarm(node, alarm);\n                ReportChanges(node);\n            }\n        }\n\n        /// <summary>\n        /// Creates a new dialog condition\n        /// </summary>\n        /// <param name=\"dialogName\"></param>\n        private DialogConditionState CreateDialog(string dialogName)\n        {\n            ISystemContext context = _nodeManager.SystemContext;\n\n            var node = new DialogConditionState(this)\n            {\n                SymbolicName = dialogName\n            };\n\n            // specify optional fields.\n            node.EnabledState = new TwoStateVariableState(node);\n            node.EnabledState.TransitionTime = new PropertyState<DateTime>(node.EnabledState);\n            node.EnabledState.EffectiveDisplayName = new PropertyState<LocalizedText>(node.EnabledState);\n            node.EnabledState.Create(context, null, BrowseNames.EnabledState, null, false);\n\n            // specify reference type between the source and the alarm.\n            node.ReferenceTypeId = ReferenceTypeIds.HasComponent;\n\n            // This call initializes the condition from the type model (i.e. creates all of the objects\n            // and variables requried to store its state). The information about the type model was\n            // incorporated into the class when the class was created.\n            node.Create(\n                context,\n                null,\n                new QualifiedName(dialogName, BrowseName.NamespaceIndex),\n                null,\n                true);\n\n            AddChild(node);\n\n            // initialize event information.\n            node.EventId.Value = Guid.NewGuid().ToByteArray();\n            node.EventType.Value = node.TypeDefinitionId;\n            node.SourceNode.Value = NodeId;\n            node.SourceName.Value = SymbolicName;\n            node.ConditionName.Value = node.SymbolicName;\n            node.Time.Value = _timeService.UtcNow;\n            node.ReceiveTime.Value = node.Time.Value;\n            if (node.LocalTime != null)\n            {\n                node.LocalTime.Value = Utils.GetTimeZoneInfo();\n            }\n\n            node.Message.Value = \"The dialog was activated\";\n            node.Retain.Value = true;\n\n            node.SetEnableState(context, true);\n            node.SetSeverity(context, EventSeverity.Low);\n\n            // initialize the dialog information.\n            node.Prompt.Value = \"Please specify a new state for the source.\";\n            node.ResponseOptionSet.Value = _responseOptions;\n            node.DefaultResponse.Value = 2;\n            node.CancelResponse.Value = 2;\n            node.OkResponse.Value = 0;\n\n            // set up method handlers.\n            node.OnRespond = OnRespond;\n\n            // this flag needs to be set because the underlying system does not produce these events.\n            node.AutoReportStateChanges = true;\n\n            // activate the dialog.\n            node.Activate(context);\n\n            // return the new node.\n            return node;\n        }\n\n        /// <summary>\n        /// The responses used with the dialog condition.\n        /// </summary>\n        private readonly LocalizedText[] _responseOptions = [\n            \"Online\",\n            \"Offline\",\n            \"No Change\"\n        ];\n\n        /// <summary>\n        /// Creates a new alarm for the source.\n        /// </summary>\n        /// <param name=\"alarm\">The alarm.</param>\n        /// <param name=\"branchId\">The branch id.</param>\n        /// <returns>The new alarm.</returns>\n        private AlarmConditionState CreateAlarm(UnderlyingSystemAlarm alarm, NodeId branchId)\n        {\n            ISystemContext context = _nodeManager.SystemContext;\n\n            AlarmConditionState node = null;\n\n            // need to map the alarm type to a UA defined alarm type.\n            switch (alarm.AlarmType)\n            {\n                case \"HighAlarm\":\n                    {\n                        var node2 = new ExclusiveDeviationAlarmState(this);\n                        node = node2;\n                        node2.HighLimit = new PropertyState<double>(node2);\n                        break;\n                    }\n\n                case \"HighLowAlarm\":\n                    {\n                        var node2 = new NonExclusiveLevelAlarmState(this);\n                        node = node2;\n\n                        node2.HighHighLimit = new PropertyState<double>(node2);\n                        node2.HighLimit = new PropertyState<double>(node2);\n                        node2.LowLimit = new PropertyState<double>(node2);\n                        node2.LowLowLimit = new PropertyState<double>(node2);\n\n                        node2.HighHighState = new TwoStateVariableState(node2);\n                        node2.HighState = new TwoStateVariableState(node2);\n                        node2.LowState = new TwoStateVariableState(node2);\n                        node2.LowLowState = new TwoStateVariableState(node2);\n\n                        break;\n                    }\n\n                case \"TripAlarm\":\n                    {\n                        node = new TripAlarmState(this);\n                        break;\n                    }\n\n                default:\n                    {\n                        node = new AlarmConditionState(this);\n                        break;\n                    }\n            }\n\n            node.SymbolicName = alarm.Name;\n\n            // add optional components.\n            node.Comment = new ConditionVariableState<LocalizedText>(node);\n            node.ClientUserId = new PropertyState<string>(node);\n            node.AddComment = new AddCommentMethodState(node);\n            node.ConfirmedState = new TwoStateVariableState(node);\n            node.Confirm = new AddCommentMethodState(node);\n\n            if (NodeId.IsNull(branchId))\n            {\n                node.SuppressedState = new TwoStateVariableState(node);\n                node.ShelvingState = new ShelvedStateMachineState(node);\n            }\n\n            // adding optional components to children is a little more complicated since the\n            // necessary initilization strings defined by the class that represents the child.\n            // in this case we pre-create the child, add the optional components\n            // and call create without assigning NodeIds. The NodeIds will be assigned when the\n            // parent object is created.\n            node.EnabledState = new TwoStateVariableState(node);\n            node.EnabledState.TransitionTime = new PropertyState<DateTime>(node.EnabledState);\n            node.EnabledState.EffectiveDisplayName = new PropertyState<LocalizedText>(node.EnabledState);\n            node.EnabledState.Create(context, null, BrowseNames.EnabledState, null, false);\n\n            // same procedure add optional components to the ActiveState component.\n            node.ActiveState = new TwoStateVariableState(node);\n            node.ActiveState.TransitionTime = new PropertyState<DateTime>(node.ActiveState);\n            node.ActiveState.EffectiveDisplayName = new PropertyState<LocalizedText>(node.ActiveState);\n            node.ActiveState.Create(context, null, BrowseNames.ActiveState, null, false);\n\n            // specify reference type between the source and the alarm.\n            node.ReferenceTypeId = ReferenceTypeIds.HasComponent;\n\n            // This call initializes the condition from the type model (i.e. creates all of the objects\n            // and variables requried to store its state). The information about the type model was\n            // incorporated into the class when the class was created.\n            //\n            // This method also assigns new NodeIds to all of the components by calling the INodeIdFactory.New\n            // method on the INodeIdFactory object which is part of the system context. The NodeManager provides\n            // the INodeIdFactory implementation used here.\n            node.Create(\n                context,\n                null,\n                new QualifiedName(alarm.Name, BrowseName.NamespaceIndex),\n                null,\n                true);\n\n            // don't add branches to the address space.\n            if (NodeId.IsNull(branchId))\n            {\n                AddChild(node);\n            }\n\n            // initialize event information.node\n            node.EventType.Value = node.TypeDefinitionId;\n            node.SourceNode.Value = NodeId;\n            node.SourceName.Value = SymbolicName;\n            node.ConditionName.Value = node.SymbolicName;\n            node.Time.Value = _timeService.UtcNow;\n            node.ReceiveTime.Value = node.Time.Value;\n            if (node.LocalTime != null)\n            {\n                node.LocalTime.Value = Utils.GetTimeZoneInfo();\n            }\n            node.BranchId.Value = branchId;\n\n            // set up method handlers.\n            node.OnEnableDisable = OnEnableDisableAlarm;\n            node.OnAcknowledge = OnAcknowledge;\n            node.OnAddComment = OnAddComment;\n            node.OnConfirm = OnConfirm;\n            node.OnShelve = OnShelve;\n            node.OnTimedUnshelve = OnTimedUnshelve;\n\n            // return the new node.\n            return node;\n        }\n\n        /// <summary>\n        /// Updates the alarm with a new state.\n        /// </summary>\n        /// <param name=\"node\">The node.</param>\n        /// <param name=\"alarm\">The alarm.</param>\n        private void UpdateAlarm(AlarmConditionState node, UnderlyingSystemAlarm alarm)\n        {\n            ISystemContext context = _nodeManager.SystemContext;\n\n            // remove old event.\n            if (node.EventId.Value != null)\n            {\n                _events.Remove(Utils.ToHexString(node.EventId.Value));\n            }\n\n            // update the basic event information (include generating a unique id for the event).\n            node.EventId.Value = Guid.NewGuid().ToByteArray();\n            node.Time.Value = _timeService.UtcNow;\n            node.ReceiveTime.Value = node.Time.Value;\n\n            // save the event for later lookup.\n            _events[Utils.ToHexString(node.EventId.Value)] = node;\n\n            // determine the retain state.\n            node.Retain.Value = true;\n\n            if (alarm != null)\n            {\n                node.Time.Value = alarm.Time;\n                node.Message.Value = new LocalizedText(alarm.Reason);\n\n                // update the states.\n                node.SetEnableState(context, (alarm.State & UnderlyingSystemAlarmStates.Enabled) != 0);\n                node.SetAcknowledgedState(context, (alarm.State & UnderlyingSystemAlarmStates.Acknowledged) != 0);\n                node.SetConfirmedState(context, (alarm.State & UnderlyingSystemAlarmStates.Confirmed) != 0);\n                node.SetActiveState(context, (alarm.State & UnderlyingSystemAlarmStates.Active) != 0);\n                node.SetSuppressedState(context, (alarm.State & UnderlyingSystemAlarmStates.Suppressed) != 0);\n\n                // update other information.\n                node.SetComment(context, alarm.Comment, alarm.UserName);\n                node.SetSeverity(context, alarm.Severity);\n\n                node.EnabledState.TransitionTime.Value = alarm.EnableTime;\n                node.ActiveState.TransitionTime.Value = alarm.ActiveTime;\n\n                // check for deleted items.\n                if ((alarm.State & UnderlyingSystemAlarmStates.Deleted) != 0)\n                {\n                    node.Retain.Value = false;\n                }\n\n                // handle high alarms.\n\n                if (node is ExclusiveLimitAlarmState highAlarm)\n                {\n                    highAlarm.HighLimit.Value = alarm.Limits[0];\n\n                    if ((alarm.State & UnderlyingSystemAlarmStates.High) != 0)\n                    {\n                        highAlarm.SetLimitState(context, LimitAlarmStates.High);\n                    }\n                }\n\n                // handle high-low alarms.\n\n                if (node is NonExclusiveLimitAlarmState highLowAlarm)\n                {\n                    highLowAlarm.HighHighLimit.Value = alarm.Limits[0];\n                    highLowAlarm.HighLimit.Value = alarm.Limits[1];\n                    highLowAlarm.LowLimit.Value = alarm.Limits[2];\n                    highLowAlarm.LowLowLimit.Value = alarm.Limits[3];\n\n                    var limit = LimitAlarmStates.Inactive;\n\n                    if ((alarm.State & UnderlyingSystemAlarmStates.HighHigh) != 0)\n                    {\n                        limit |= LimitAlarmStates.HighHigh;\n                    }\n\n                    if ((alarm.State & UnderlyingSystemAlarmStates.High) != 0)\n                    {\n                        limit |= LimitAlarmStates.High;\n                    }\n\n                    if ((alarm.State & UnderlyingSystemAlarmStates.Low) != 0)\n                    {\n                        limit |= LimitAlarmStates.Low;\n                    }\n\n                    if ((alarm.State & UnderlyingSystemAlarmStates.LowLow) != 0)\n                    {\n                        limit |= LimitAlarmStates.LowLow;\n                    }\n\n                    highLowAlarm.SetLimitState(context, limit);\n                }\n            }\n\n            // not interested in disabled or inactive alarms.\n            if (!node.EnabledState.Id.Value || !node.ActiveState.Id.Value)\n            {\n                node.Retain.Value = false;\n            }\n        }\n\n        /// <summary>\n        /// Called when the alarm is enabled or disabled.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"condition\"></param>\n        /// <param name=\"enabling\"></param>\n        private ServiceResult OnEnableDisableAlarm(\n            ISystemContext context,\n            ConditionState condition,\n            bool enabling)\n        {\n            _source.EnableAlarm(condition.SymbolicName, enabling);\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Called when the alarm has a comment added.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"condition\"></param>\n        /// <param name=\"eventId\"></param>\n        /// <param name=\"comment\"></param>\n        private ServiceResult OnAddComment(\n            ISystemContext context,\n            ConditionState condition,\n            byte[] eventId,\n            LocalizedText comment)\n        {\n            var alarm = FindAlarmByEventId(eventId);\n\n            if (alarm == null)\n            {\n                return StatusCodes.BadEventIdUnknown;\n            }\n\n            _source.CommentAlarm(alarm.SymbolicName, GetRecordNumber(alarm), comment, GetUserName(context));\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Called when the alarm is acknowledged.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"condition\"></param>\n        /// <param name=\"eventId\"></param>\n        /// <param name=\"comment\"></param>\n        private ServiceResult OnAcknowledge(\n            ISystemContext context,\n            ConditionState condition,\n            byte[] eventId,\n            LocalizedText comment)\n        {\n            var alarm = FindAlarmByEventId(eventId);\n\n            if (alarm == null)\n            {\n                return StatusCodes.BadEventIdUnknown;\n            }\n\n            _source.AcknowledgeAlarm(alarm.SymbolicName, GetRecordNumber(alarm), comment, GetUserName(context));\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Called when the alarm is confirmed.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"condition\"></param>\n        /// <param name=\"eventId\"></param>\n        /// <param name=\"comment\"></param>\n        private ServiceResult OnConfirm(\n            ISystemContext context,\n            ConditionState condition,\n            byte[] eventId,\n            LocalizedText comment)\n        {\n            var alarm = FindAlarmByEventId(eventId);\n\n            if (alarm == null)\n            {\n                return StatusCodes.BadEventIdUnknown;\n            }\n\n            _source.ConfirmAlarm(alarm.SymbolicName, GetRecordNumber(alarm), comment, GetUserName(context));\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Called when the alarm is shelved.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"alarm\"></param>\n        /// <param name=\"shelving\"></param>\n        /// <param name=\"oneShot\"></param>\n        /// <param name=\"shelvingTime\"></param>\n        private ServiceResult OnShelve(\n            ISystemContext context,\n            AlarmConditionState alarm,\n            bool shelving,\n            bool oneShot,\n            double shelvingTime)\n        {\n            alarm.SetShelvingState(context, shelving, oneShot, shelvingTime);\n            alarm.Message.Value = \"The alarm shelved.\";\n\n            UpdateAlarm(alarm, null);\n            ReportChanges(alarm);\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Called when the alarm is shelved.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"alarm\"></param>\n        private ServiceResult OnTimedUnshelve(\n            ISystemContext context,\n            AlarmConditionState alarm)\n        {\n            // update the alarm state and produce and event.\n            alarm.SetShelvingState(context, false, false, 0);\n            alarm.Message.Value = \"The timed shelving period expired.\";\n\n            UpdateAlarm(alarm, null);\n            ReportChanges(alarm);\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Called when the dialog receives a response.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"dialog\"></param>\n        /// <param name=\"selectedResponse\"></param>\n        private ServiceResult OnRespond(\n            ISystemContext context,\n            DialogConditionState dialog,\n            int selectedResponse)\n        {\n            // response 0 means set the source online.\n            if (selectedResponse == 0)\n            {\n                _source.SetOfflineState(false);\n            }\n\n            // response 1 means set the source offine.\n            if (selectedResponse == 1)\n            {\n                _source.SetOfflineState(true);\n            }\n\n            // other responses mean do nothing.\n            dialog.SetResponse(context, selectedResponse);\n\n            // dialog no longer interesting once it is deactivated.\n            dialog.Message.Value = \"The dialog was deactivated\";\n            dialog.Retain.Value = false;\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Reports the changes to the alarm.\n        /// </summary>\n        /// <param name=\"alarm\"></param>\n        private void ReportChanges(AlarmConditionState alarm)\n        {\n            // report changes to node attributes.\n            alarm.ClearChangeMasks(_nodeManager.SystemContext, true);\n\n            // check if events are being monitored for the source.\n            if (AreEventsMonitored)\n            {\n                // create a snapshot.\n                var e = new InstanceStateSnapshot();\n                e.Initialize(_nodeManager.SystemContext, alarm);\n\n                // report the event.\n                alarm.ReportEvent(_nodeManager.SystemContext, e);\n            }\n        }\n\n        /// <summary>\n        /// Finds the alarm by event id.\n        /// </summary>\n        /// <param name=\"eventId\">The event id.</param>\n        /// <returns>The alarm. Null if not found.</returns>\n        private AlarmConditionState FindAlarmByEventId(byte[] eventId)\n        {\n            if (eventId == null)\n            {\n                return null;\n            }\n\n            if (!_events.TryGetValue(Utils.ToHexString(eventId), out var alarm))\n            {\n                return null;\n            }\n\n            return alarm;\n        }\n\n        /// <summary>\n        /// Gets the record number associated with tge alarm.\n        /// </summary>\n        /// <param name=\"alarm\">The alarm.</param>\n        /// <returns>The record number; 0 if the alarm is not an archived alarm.</returns>\n        private uint GetRecordNumber(AlarmConditionState alarm)\n        {\n            if (alarm == null)\n            {\n                return 0;\n            }\n\n            if (alarm.BranchId == null || alarm.BranchId.Value == null)\n            {\n                return 0;\n            }\n\n            var recordNumber = alarm.BranchId.Value.Identifier as uint?;\n\n            return recordNumber ?? 0;\n        }\n\n        /// <summary>\n        /// Gets the user name associated with the context.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        private string GetUserName(ISystemContext context)\n        {\n            if (context.UserIdentity != null)\n            {\n                return context.UserIdentity.DisplayName;\n            }\n\n            return null;\n        }\n\n        private readonly CustomNodeManager2 _nodeManager;\n        private readonly TimeService _timeService;\n        private readonly UnderlyingSystemSource _source;\n        private readonly Dictionary<string, AlarmConditionState> _alarms;\n        private readonly Dictionary<string, AlarmConditionState> _events;\n        private readonly Dictionary<NodeId, AlarmConditionState> _branches;\n        private readonly DialogConditionState _dialog;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/UnderlyingSystem.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    /// <summary>\n    /// An object that provides access to the underlying system.\n    /// </summary>\n    public class UnderlyingSystem : IDisposable\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UnderlyingSystem\"/> class.\n        /// </summary>\n        /// <param name=\"timeService\"></param>\n        public UnderlyingSystem(TimeService timeService)\n        {\n            _sources = [];\n            _timeService = timeService;\n        }\n\n        /// <summary>\n        /// The finializer implementation.\n        /// </summary>\n        ~UnderlyingSystem()\n        {\n            Dispose(false);\n        }\n\n        /// <summary>\n        /// Frees any unmanaged resources.\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing && _simulationTimer != null)\n            {\n                _simulationTimer.Dispose();\n                _simulationTimer = null;\n            }\n        }\n\n        /// <summary>\n        /// Creates a source.\n        /// </summary>\n        /// <param name=\"sourcePath\">The source path.</param>\n        /// <param name=\"alarmChangeCallback\">The callback invoked when an alarm changes.</param>\n        /// <returns>The source.</returns>\n        public UnderlyingSystemSource CreateSource(string sourcePath, AlarmChangedEventHandler alarmChangeCallback)\n        {\n            UnderlyingSystemSource source = null;\n\n            lock (_lock)\n            {\n                // create a new source.\n                source = new UnderlyingSystemSource(_timeService);\n\n                // extract the name from the path.\n                var name = sourcePath;\n\n                var index = name.LastIndexOf('/');\n\n                if (index != -1)\n                {\n                    name = name[(index + 1)..];\n                }\n\n                // extract the type from the path.\n                var type = sourcePath;\n\n                index = type.IndexOf('/');\n\n                if (index != -1)\n                {\n                    type = type[..index];\n                }\n\n                // create the source.\n                source.SourcePath = sourcePath;\n                source.Name = name;\n                source.SourceType = type;\n                source.OnAlarmChanged = alarmChangeCallback;\n\n                _sources.Add(sourcePath, source);\n            }\n\n            // add the alarms based on the source type.\n            // note that the source and alarm types used here are types defined by the underlying system.\n            // the node manager will need to map these types to UA defined types.\n            switch (source.SourceType)\n            {\n                case \"Colours\":\n                    {\n                        source.CreateAlarm(\"Red\", \"HighAlarm\");\n                        source.CreateAlarm(\"Yellow\", \"HighLowAlarm\");\n                        source.CreateAlarm(\"Green\", \"TripAlarm\");\n                        break;\n                    }\n\n                case \"Metals\":\n                    {\n                        source.CreateAlarm(\"Gold\", \"HighAlarm\");\n                        source.CreateAlarm(\"Silver\", \"HighLowAlarm\");\n                        source.CreateAlarm(\"Bronze\", \"TripAlarm\");\n                        break;\n                    }\n            }\n\n            // return the new source.\n            return source;\n        }\n\n        /// <summary>\n        /// Starts a simulation which causes the alarm states to change.\n        /// </summary>\n        /// <remarks>\n        /// This simulation randomly activates the alarms that belong to the sources.\n        /// Once an alarm is active it has to be acknowledged and confirmed.\n        /// Once an alarm is confirmed it go to the inactive state.\n        /// If the alarm stays active the severity will be gradually increased.\n        /// </remarks>\n        public void StartSimulation()\n        {\n            lock (_lock)\n            {\n                if (_simulationTimer != null)\n                {\n                    _simulationTimer.Dispose();\n                    _simulationTimer = null;\n                }\n\n                _simulationTimer = new Timer(DoSimulation, null, 1000, 1000);\n            }\n        }\n\n        /// <summary>\n        /// Stops the simulation.\n        /// </summary>\n        public void StopSimulation()\n        {\n            lock (_lock)\n            {\n                if (_simulationTimer != null)\n                {\n                    _simulationTimer.Dispose();\n                    _simulationTimer = null;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Simulates a source by updating the state of the alarms belonging to the condition.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void DoSimulation(object state)\n        {\n            try\n            {\n                // get the list of sources.\n                List<UnderlyingSystemSource> sources = null;\n\n                lock (_lock)\n                {\n                    _simulationCounter++;\n                    sources = [.. _sources.Values];\n                }\n\n                // run simulation for each source.\n                for (var ii = 0; ii < sources.Count; ii++)\n                {\n                    sources[ii].DoSimulation(_simulationCounter, ii);\n                }\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error running simulation for system\");\n            }\n        }\n\n        private readonly Lock _lock = new();\n        private readonly Dictionary<string, UnderlyingSystemSource> _sources;\n        private readonly TimeService _timeService;\n        private Timer _simulationTimer;\n        private long _simulationCounter;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/UnderlyingSystemAlarm.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n    using System;\n\n    /// <summary>\n    /// This class stores the state of a alarm known to the system.\n    /// </summary>\n    /// <remarks>\n    /// This class only stores the information about an alarm that a system has. The\n    /// system has no concept of the UA information model and the NodeManager must\n    /// convert the information stored in this class into the UA equivalent.\n    /// </remarks>\n    public class UnderlyingSystemAlarm\n    {\n        /// <summary>\n        /// The source that the alarm belongs to\n        /// </summary>\n        /// <value>The source.</value>\n        public UnderlyingSystemSource Source { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the alarm.\n        /// </summary>\n        /// <value>The name of the alarm.</value>\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the type of the alarm.\n        /// </summary>\n        /// <value>The type of the alarm.</value>\n        public string AlarmType { get; set; }\n\n        /// <summary>\n        /// Gets or sets a unique record number assigned to an archived snapshot of the alarm.\n        /// </summary>\n        /// <value>The record number assigned to an archived snapshot of the alarm.</value>\n        /// <remarks>\n        /// Past state transitions are assigned a record number when they are archived. This\n        /// Record number allows the system to updated archived record. This number is 0 if\n        /// the state transition has not been archived.\n        /// </remarks>\n        public uint RecordNumber { get; set; }\n\n        /// <summary>\n        /// Gets or sets the time when the alarm last changed state.\n        /// </summary>\n        /// <value>The last state change time.</value>\n        public DateTime Time { get; set; }\n\n        /// <summary>\n        /// Gets or sets the reason for the last state change.\n        /// </summary>\n        /// <value>The reason for the last state change.</value>\n        public string Reason { get; set; }\n\n        /// <summary>\n        /// Gets or sets the severity of the alarm.\n        /// </summary>\n        /// <value>The alarm severity.</value>\n        public EventSeverity Severity { get; set; }\n\n        /// <summary>\n        /// Gets or sets the comment associated with the alarm.\n        /// </summary>\n        /// <value>The comment.</value>\n        public string Comment { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the user that provided the comment.\n        /// </summary>\n        /// <value>The name of the user that provided the comment.</value>\n        public string UserName { get; set; }\n\n        /// <summary>\n        /// Gets or sets the current alarm state.\n        /// </summary>\n        /// <value>The current alarm state.</value>\n        public UnderlyingSystemAlarmStates State { get; set; }\n\n        /// <summary>\n        /// Gets or sets the time when the alarm went into the enabled state.\n        /// </summary>\n        /// <value>When the alarm went into the enabled state.</value>\n        public DateTime EnableTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the time when the alarm went into the active state.\n        /// </summary>\n        /// <value>When the alarm went into the active state.</value>\n        public DateTime ActiveTime { get; set; }\n\n        /// <summary>\n        /// Gets or sets the limits that apply to the alarm.\n        /// </summary>\n        /// <value>The limits that apply to the alarm.</value>\n        /// <remarks>\n        /// 1 limit = High\n        /// 2 limits = High, Low\n        /// 4 limits = HighHigh, High, Low, LowLow\n        /// </remarks>\n        public double[] Limits { get; set; }\n\n        /// <summary>\n        /// Creates a snapshort of the alarm.\n        /// </summary>\n        /// <returns>The snapshot,</returns>\n        public UnderlyingSystemAlarm CreateSnapshot()\n        {\n            return (UnderlyingSystemAlarm)MemberwiseClone();\n        }\n\n        /// <summary>\n        /// Sets or clears the bits in the alarm state mask.\n        /// </summary>\n        /// <param name=\"bits\">The bits.</param>\n        /// <param name=\"isSet\">if set to <c>true</c> the bits are set; otherwise they are cleared.</param>\n        /// <returns>True if the state changed as a result of setting the bits.</returns>\n        public bool SetStateBits(UnderlyingSystemAlarmStates bits, bool isSet)\n        {\n            if (isSet)\n            {\n                var currentlySet = (State & bits) == bits;\n                State |= bits;\n                return !currentlySet;\n            }\n\n            var currentlyCleared = (State & ~bits) == State;\n            State &= ~bits;\n            return !currentlyCleared;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/UnderlyingSystemAlarmStates.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using System;\n\n    /// <summary>\n    /// Defines the possible states for the condition.\n    /// </summary>\n    [Flags]\n    public enum UnderlyingSystemAlarmStates\n    {\n        /// <summary>\n        /// The condition state is unknown.\n        /// </summary>\n        None = 0x0,\n\n        /// <summary>\n        /// The condition is enabled and will produce events.\n        /// </summary>\n        Enabled = 0x1,\n\n        /// <summary>\n        /// The condition requires acknowledgement by the user.\n        /// </summary>\n        Acknowledged = 0x2,\n\n        /// <summary>\n        /// The condition requires that the used confirm that action was taken.\n        /// </summary>\n        Confirmed = 0x4,\n\n        /// <summary>\n        /// The condition is active.\n        /// </summary>\n        Active = 0x8,\n\n        /// <summary>\n        /// The condition has been suppressed by the system.\n        /// </summary>\n        Suppressed = 0x10,\n\n        /// <summary>\n        /// The condition has been shelved by the user.\n        /// </summary>\n        Shelved = 0x20,\n\n        /// <summary>\n        /// The condition has exceeed the high-high limit.\n        /// </summary>\n        HighHigh = 0x40,\n\n        /// <summary>\n        /// The condition has exceeed the high limit.\n        /// </summary>\n        High = 0x80,\n\n        /// <summary>\n        /// The condition has exceeed the low limit.\n        /// </summary>\n        Low = 0x100,\n\n        /// <summary>\n        /// The condition has exceeed the low-low limit.\n        /// </summary>\n        LowLow = 0x200,\n\n        /// <summary>\n        /// A mask used to clear all limit bits.\n        /// </summary>\n        Limits = HighHigh | High | Low | LowLow,\n\n        /// <summary>\n        /// The condition has deleted.\n        /// </summary>\n        Deleted = 0x400\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Alarms/UnderlyingSystemSource.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Alarms\n{\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// This class simulates a source in the system.\n    /// </summary>\n    public class UnderlyingSystemSource\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UnderlyingSystemSource\"/> class.\n        /// </summary>\n        /// <param name=\"timeService\"></param>\n        public UnderlyingSystemSource(TimeService timeService)\n        {\n            _alarms = [];\n            _archive = [];\n            _timeService = timeService;\n        }\n\n        /// <summary>\n        /// Used to receive events when the state of an alarm changed.\n        /// </summary>\n        public AlarmChangedEventHandler OnAlarmChanged { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the source.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the fully qualified name for the source.\n        /// </summary>\n        /// <value>The fully qualified name for a source.</value>\n        public string SourcePath { get; set; }\n\n        /// <summary>\n        /// Gets or sets the type of the source.\n        /// </summary>\n        /// <value>The type of the source.</value>\n        public string SourceType { get; set; }\n\n        /// <summary>\n        /// Creates a new active alarm for the source.\n        /// </summary>\n        /// <param name=\"alarmName\">Name of the alarm.</param>\n        /// <param name=\"alarmType\">Type of the alarm.</param>\n        public void CreateAlarm(string alarmName, string alarmType)\n        {\n            var alarm = new UnderlyingSystemAlarm\n            {\n                Source = this,\n                Name = alarmName,\n                AlarmType = alarmType,\n                RecordNumber = 0,\n                Reason = \"Alarm created.\",\n                Time = _timeService.UtcNow,\n                Severity = EventSeverity.Low,\n                Comment = null,\n                UserName = null,\n                State = UnderlyingSystemAlarmStates.Active | UnderlyingSystemAlarmStates.Enabled,\n                EnableTime = _timeService.UtcNow,\n                ActiveTime = _timeService.UtcNow\n            };\n\n            switch (alarmType)\n            {\n                case \"HighAlarm\":\n                    {\n                        alarm.Limits = [80];\n                        alarm.State |= UnderlyingSystemAlarmStates.High;\n                        break;\n                    }\n\n                case \"HighLowAlarm\":\n                    {\n                        alarm.Limits = [90, 70, 30, 10];\n                        alarm.State |= UnderlyingSystemAlarmStates.High;\n                        break;\n                    }\n            }\n\n            lock (_alarms)\n            {\n                _alarms.Add(alarm);\n            }\n        }\n\n        /// <summary>\n        /// Enables or disables the alarm.\n        /// </summary>\n        /// <param name=\"alarmName\">Name of the alarm.</param>\n        /// <param name=\"enabling\">if set to <c>true</c> the alarm is enabled.</param>\n        public void EnableAlarm(string alarmName, bool enabling)\n        {\n            var snapshots = new List<UnderlyingSystemAlarm>();\n\n            lock (_alarms)\n            {\n                var alarm = FindAlarm(alarmName, 0);\n\n                if (alarm != null)\n                {\n                    // enable/disable the alarm.\n                    if (alarm.SetStateBits(UnderlyingSystemAlarmStates.Enabled, enabling))\n                    {\n                        alarm.Time = alarm.EnableTime = _timeService.UtcNow;\n                        alarm.Reason = \"The alarm was \" + (enabling ? \"enabled.\" : \"disabled.\");\n                        snapshots.Add(alarm.CreateSnapshot());\n                    }\n\n                    // enable/disable any archived records for the alarm.\n                    foreach (var record in _archive.Values)\n                    {\n                        if (record.Name != alarmName)\n                        {\n                            continue;\n                        }\n\n                        if (record.SetStateBits(UnderlyingSystemAlarmStates.Enabled, enabling))\n                        {\n                            record.Time = alarm.EnableTime = _timeService.UtcNow;\n                            record.Reason = \"The alarm was \" + (enabling ? \"enabled.\" : \"disabled.\");\n                            snapshots.Add(alarm.CreateSnapshot());\n                        }\n                    }\n                }\n            }\n\n            // report any alarm changes after releasing the lock.\n            for (var ii = 0; ii < snapshots.Count; ii++)\n            {\n                ReportAlarmChange(snapshots[ii]);\n            }\n        }\n\n        /// <summary>\n        /// Adds a comment to an alarm.\n        /// </summary>\n        /// <param name=\"alarmName\">Name of the alarm.</param>\n        /// <param name=\"recordNumber\">The record number.</param>\n        /// <param name=\"comment\">The comment.</param>\n        /// <param name=\"userName\">Name of the user.</param>\n        public void CommentAlarm(string alarmName, uint recordNumber, LocalizedText comment, string userName)\n        {\n            UnderlyingSystemAlarm snapshot = null;\n\n            lock (_alarms)\n            {\n                var alarm = FindAlarm(alarmName, recordNumber);\n\n                if (alarm != null)\n                {\n                    alarm.Time = _timeService.UtcNow;\n                    alarm.Reason = \"A comment was added.\";\n                    alarm.UserName = userName;\n\n                    // only change the comment if a non-null comment was provided.\n                    if (comment != null && (!string.IsNullOrEmpty(comment.Text) || !string.IsNullOrEmpty(comment.Locale)))\n                    {\n                        alarm.Comment = Utils.Format(\"{0}\", comment);\n                    }\n\n                    snapshot = alarm.CreateSnapshot();\n                }\n            }\n\n            if (snapshot != null)\n            {\n                ReportAlarmChange(snapshot);\n            }\n        }\n\n        /// <summary>\n        /// Acknowledges an alarm.\n        /// </summary>\n        /// <param name=\"alarmName\">Name of the alarm.</param>\n        /// <param name=\"recordNumber\">The record number.</param>\n        /// <param name=\"comment\">The comment.</param>\n        /// <param name=\"userName\">Name of the user.</param>\n        public void AcknowledgeAlarm(string alarmName, uint recordNumber, LocalizedText comment, string userName)\n        {\n            UnderlyingSystemAlarm snapshot = null;\n\n            lock (_alarms)\n            {\n                var alarm = FindAlarm(alarmName, recordNumber);\n\n                if (alarm != null)\n                {\n                    if (alarm.SetStateBits(UnderlyingSystemAlarmStates.Acknowledged, true))\n                    {\n                        alarm.Time = _timeService.UtcNow;\n                        alarm.Reason = \"The alarm was acknoweledged.\";\n                        alarm.Comment = Utils.Format(\"{0}\", comment);\n                        alarm.UserName = userName;\n\n                        alarm.SetStateBits(UnderlyingSystemAlarmStates.Confirmed, false);\n                    }\n\n                    snapshot = alarm.CreateSnapshot();\n                }\n            }\n\n            if (snapshot != null)\n            {\n                ReportAlarmChange(snapshot);\n            }\n        }\n\n        /// <summary>\n        /// Confirms an alarm.\n        /// </summary>\n        /// <param name=\"alarmName\">Name of the alarm.</param>\n        /// <param name=\"recordNumber\">The record number.</param>\n        /// <param name=\"comment\">The comment.</param>\n        /// <param name=\"userName\">Name of the user.</param>\n        public void ConfirmAlarm(string alarmName, uint recordNumber, LocalizedText comment, string userName)\n        {\n            UnderlyingSystemAlarm snapshot = null;\n\n            lock (_alarms)\n            {\n                var alarm = FindAlarm(alarmName, recordNumber);\n\n                if (alarm != null)\n                {\n                    if (alarm.SetStateBits(UnderlyingSystemAlarmStates.Confirmed, true))\n                    {\n                        alarm.Time = _timeService.UtcNow;\n                        alarm.Reason = \"The alarm was confirmed.\";\n                        alarm.Comment = Utils.Format(\"{0}\", comment);\n                        alarm.UserName = userName;\n\n                        // remove branch.\n                        if (recordNumber != 0)\n                        {\n                            _archive.Remove(recordNumber);\n                            alarm.SetStateBits(UnderlyingSystemAlarmStates.Deleted, true);\n                        }\n\n                        // de-activate alarm.\n                        else\n                        {\n                            alarm.SetStateBits(UnderlyingSystemAlarmStates.Active, false);\n                        }\n                    }\n\n                    snapshot = alarm.CreateSnapshot();\n                }\n            }\n\n            if (snapshot != null)\n            {\n                ReportAlarmChange(snapshot);\n            }\n        }\n\n        /// <summary>\n        /// Reports the current state of all conditions.\n        /// </summary>\n        public void Refresh()\n        {\n            var snapshots = new List<UnderlyingSystemAlarm>();\n\n            lock (_alarms)\n            {\n                for (var ii = 0; ii < _alarms.Count; ii++)\n                {\n                    var alarm = _alarms[ii];\n                    snapshots.Add(alarm.CreateSnapshot());\n                }\n            }\n\n            // report any alarm changes after releasing the lock.\n            for (var ii = 0; ii < snapshots.Count; ii++)\n            {\n                ReportAlarmChange(snapshots[ii]);\n            }\n        }\n\n        /// <summary>\n        /// Sets the state of the source (surpresses any active alarms).\n        /// </summary>\n        /// <param name=\"offline\">if set to <c>true</c> the source is offline.</param>\n        public void SetOfflineState(bool offline)\n        {\n            IsOffline = offline;\n            var snapshots = new List<UnderlyingSystemAlarm>();\n\n            lock (_alarms)\n            {\n                for (var ii = 0; ii < _alarms.Count; ii++)\n                {\n                    var alarm = _alarms[ii];\n\n                    if (alarm.SetStateBits(UnderlyingSystemAlarmStates.Suppressed, offline))\n                    {\n                        alarm.Time = alarm.EnableTime = _timeService.UtcNow;\n                        alarm.Reason = \"The alarm was \" + (offline ? \"suppressed.\" : \"unsuppressed.\");\n\n                        // check if the alarm change should be reported.\n                        if ((alarm.State & UnderlyingSystemAlarmStates.Enabled) != 0)\n                        {\n                            snapshots.Add(alarm.CreateSnapshot());\n                        }\n                    }\n                }\n            }\n\n            // report any alarm changes after releasing the lock.\n            for (var ii = 0; ii < snapshots.Count; ii++)\n            {\n                ReportAlarmChange(snapshots[ii]);\n            }\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether the source is offline.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if this instance is offline; otherwise, <c>false</c>.\n        /// </value>\n        /// <remarks>\n        /// All alarms for offline sources are suppressed.\n        /// </remarks>\n        public bool IsOffline { get; private set; }\n\n        /// <summary>\n        /// Simulates a source by updating the state of the alarms belonging to the condition.\n        /// </summary>\n        /// <param name=\"counter\">The number of simulation cycles that have elapsed.</param>\n        /// <param name=\"index\">The index of the source within the system.</param>\n        public void DoSimulation(long counter, int index)\n        {\n            try\n            {\n                var snapshots = new List<UnderlyingSystemAlarm>();\n\n                // update the alarms.\n                lock (_alarms)\n                {\n                    for (var ii = 0; ii < _alarms.Count; ii++)\n                    {\n                        UpdateAlarm(_alarms[ii], counter, ii + index, snapshots);\n                    }\n                }\n\n                // report any alarm changes after releasing the lock.\n                for (var ii = 0; ii < snapshots.Count; ii++)\n                {\n                    ReportAlarmChange(snapshots[ii]);\n                }\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error running simulation for source {0}\", SourcePath);\n            }\n        }\n\n        /// <summary>\n        /// Finds the alarm identified by the name.\n        /// </summary>\n        /// <param name=\"alarmName\">Name of the alarm.</param>\n        /// <param name=\"recordNumber\">The record number associated with the alarm.</param>\n        /// <returns>The alarm if null; otherwise null.</returns>\n        private UnderlyingSystemAlarm FindAlarm(string alarmName, uint recordNumber)\n        {\n            lock (_alarms)\n            {\n                // look up archived alarm.\n                if (recordNumber != 0)\n                {\n                    if (!_archive.TryGetValue(recordNumber, out var alarm))\n                    {\n                        return null;\n                    }\n\n                    return alarm;\n                }\n\n                // look up alarm.\n                for (var ii = 0; ii < _alarms.Count; ii++)\n                {\n                    var alarm = _alarms[ii];\n\n                    if (alarm.Name == alarmName)\n                    {\n                        return alarm;\n                    }\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Reports a change to an alarm record.\n        /// </summary>\n        /// <param name=\"alarm\">The alarm.</param>\n        private void ReportAlarmChange(UnderlyingSystemAlarm alarm)\n        {\n            if (OnAlarmChanged != null)\n            {\n                try\n                {\n                    OnAlarmChanged(alarm);\n                }\n                catch (Exception e)\n                {\n                    Utils.Trace(e, \"Unexpected error reporting change to an Alarm for Source {0}.\", SourcePath);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates the state of an alarm.\n        /// </summary>\n        /// <param name=\"alarm\"></param>\n        /// <param name=\"counter\"></param>\n        /// <param name=\"index\"></param>\n        /// <param name=\"snapshots\"></param>\n        private void UpdateAlarm(UnderlyingSystemAlarm alarm, long counter, int index, List<UnderlyingSystemAlarm> snapshots)\n        {\n            string reason = null;\n\n            // ignore disabled alarms.\n            if ((alarm.State & UnderlyingSystemAlarmStates.Enabled) == 0)\n            {\n                return;\n            }\n\n            // check if the alarm needs to be updated this cycle.\n            if (counter % (8 + (index % 4)) == 0)\n            {\n                // check if it is time to activate.\n                if ((alarm.State & UnderlyingSystemAlarmStates.Active) == 0)\n                {\n                    reason = \"The alarm is active.\";\n\n                    alarm.SetStateBits(UnderlyingSystemAlarmStates.Active, true);\n                    alarm.SetStateBits(UnderlyingSystemAlarmStates.Acknowledged | UnderlyingSystemAlarmStates.Confirmed, false);\n                    alarm.Severity = EventSeverity.Low;\n                    alarm.ActiveTime = _timeService.UtcNow;\n\n                    switch (alarm.AlarmType)\n                    {\n                        case \"HighAlarm\":\n                            {\n                                alarm.SetStateBits(UnderlyingSystemAlarmStates.Limits, false);\n                                alarm.SetStateBits(UnderlyingSystemAlarmStates.High, true);\n                                break;\n                            }\n\n                        case \"HighLowAlarm\":\n                            {\n                                alarm.SetStateBits(UnderlyingSystemAlarmStates.Limits, false);\n                                alarm.SetStateBits(UnderlyingSystemAlarmStates.Low, true);\n                                break;\n                            }\n                    }\n                }\n\n                // bump the severity.\n                else if ((alarm.State & UnderlyingSystemAlarmStates.Acknowledged) == 0)\n                {\n                    if (alarm.Severity < EventSeverity.High)\n                    {\n                        reason = \"The alarm severity has increased.\";\n\n                        var values = Enum.GetValues<EventSeverity>();\n\n                        for (var ii = 0; ii < values.Length; ii++)\n                        {\n                            var severity = (EventSeverity)values.GetValue(ii);\n\n                            if (severity > alarm.Severity)\n                            {\n                                alarm.Severity = severity;\n                                break;\n                            }\n                        }\n\n                        if (alarm.Severity > EventSeverity.Medium)\n                        {\n                            switch (alarm.AlarmType)\n                            {\n                                case \"HighLowAlarm\":\n                                    {\n                                        alarm.SetStateBits(UnderlyingSystemAlarmStates.Limits, false);\n                                        alarm.SetStateBits(UnderlyingSystemAlarmStates.LowLow, true);\n                                        break;\n                                    }\n                            }\n                        }\n                    }\n\n                    // give up on the alarm.\n                    else\n                    {\n                        // create an archived state that needs to be acknowledged.\n                        if (alarm.AlarmType == \"TripAlarm\")\n                        {\n                            // check the number of archived states.\n                            var count = 0;\n\n                            foreach (var record in _archive.Values)\n                            {\n                                if (record.Name == alarm.Name)\n                                {\n                                    count++;\n                                }\n                            }\n                            // limit the number of archived states to avoid filling up the display.\n                            if (count < 2)\n                            {\n                                // archive the current state.\n                                var snapshot = alarm.CreateSnapshot();\n                                snapshot.RecordNumber = ++_nextRecordNumber;\n                                snapshot.Severity = EventSeverity.Low;\n                                _archive.Add(snapshot.RecordNumber, snapshot);\n                                snapshots.Add(snapshot);\n                            }\n                        }\n\n                        reason = \"The alarm was deactivated by the system.\";\n                        alarm.SetStateBits(UnderlyingSystemAlarmStates.Active, false);\n                        //alarm.SetStateBits(UnderlyingSystemAlarmStates.Acknowledged | UnderlyingSystemAlarmStates.Confirmed, true);\n                        alarm.Severity = EventSeverity.Low;\n                    }\n                }\n            }\n\n            // update the reason.\n            if (reason != null)\n            {\n                alarm.Time = _timeService.UtcNow;\n                alarm.Reason = reason;\n\n                // return a snapshot used to report the state change.\n                snapshots.Add(alarm.CreateSnapshot());\n            }\n\n            // no change so nothing to report.\n        }\n\n        private readonly List<UnderlyingSystemAlarm> _alarms;\n        private readonly Dictionary<uint, UnderlyingSystemAlarm> _archive;\n        private readonly TimeService _timeService;\n        private uint _nextRecordNumber;\n    }\n\n    /// <summary>\n    /// Used to receive events when the state of an alarm changes.\n    /// </summary>\n    /// <param name=\"alarm\"></param>\n    public delegate void AlarmChangedEventHandler(UnderlyingSystemAlarm alarm);\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/AssetNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\n#nullable enable\n\nnamespace Asset\n{\n    using Microsoft.Extensions.Logging;\n    using Newtonsoft.Json;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n    using System.IO;\n    using System.Linq;\n    using System.Reflection;\n\n    public class AssetNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Create node manager\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"logger\"></param>\n        public AssetNodeManager(IServerInternal server, ApplicationConfiguration configuration,\n            ILogger logger) : base(server, configuration)\n        {\n            SystemContext.NodeIdFactory = this;\n            _logger = logger;\n\n            var extension = configuration.ParseExtension<FolderConfiguration>();\n            _folder = Path.Combine(extension?.CurrentDirectory\n                ?? Directory.GetCurrentDirectory(), \"settings\");\n            // create our settings folder, if required\n            if (!Directory.Exists(_folder))\n            {\n                Directory.CreateDirectory(_folder);\n            }\n\n            // in the node manager constructor, we add all namespaces\n            var namespaceUris = new List<string>\n            {\n                Namespaces.AssetServer\n            };\n\n            LoadNamespaceUrisFromEmbeddedNodesetXml(namespaceUris);\n\n            // add a seperate namespace for each asset from the WoT TD files\n            foreach (var file in Directory.EnumerateFiles(_folder, \"*.jsonld\"))\n            {\n                try\n                {\n                    var contents = File.ReadAllText(file);\n\n                    // parse WoT TD file contents\n                    var td = JsonConvert.DeserializeObject<ThingDescription>(contents)\n                        ?? throw ServiceResultException.Create(\n                            StatusCodes.BadConfigurationError, \"Bad description\");\n\n                    namespaceUris.Add(\"http://opcfoundation.org/UA/\" + td.Name + \"/\");\n\n                    AddNamespacesFromCompanionSpecs(namespaceUris, td);\n                }\n                catch (Exception ex)\n                {\n                    // skip this file, but log an error\n                    _logger.AssetNodeManagerError(ex);\n                }\n            }\n\n            NamespaceUris = namespaceUris;\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                lock (Lock)\n                {\n                    foreach (var manager in _fileManagers.Values)\n                    {\n                        manager.Dispose();\n                    }\n\n                    foreach (var asset in _assets.Values)\n                    {\n                        asset.Dispose();\n                    }\n\n                    _fileManagers.Clear();\n                    _assetManagement.Dispose();\n                }\n            }\n            base.Dispose(disposing);\n        }\n\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            // for new nodes we create, pick our default namespace\n            return new NodeId(Utils.IncrementIdentifier(ref _lastUsedId),\n                (ushort)Server.NamespaceUris.GetIndex(Namespaces.AssetServer));\n        }\n\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                // in the create address space call, we add all our nodes\n                if (!externalReferences.TryGetValue(Opc.Ua.ObjectIds.ObjectsFolder,\n                    out var objectsFolderReferences))\n                {\n                    externalReferences[Opc.Ua.ObjectIds.ObjectsFolder]\n                        = objectsFolderReferences = [];\n                }\n\n                AddNodesFromEmbeddedNodesetXml();\n\n                AddNodesForAssetManagement(objectsFolderReferences);\n\n                foreach (var file in Directory.EnumerateFiles(_folder, \"*.jsonld\"))\n                {\n                    try\n                    {\n                        var contents = File.ReadAllText(file);\n\n                        // parse WoT TD file contents\n                        var td = JsonConvert.DeserializeObject<ThingDescription>(contents);\n                        if (td?.Context == null || td.Name == null)\n                        {\n                            continue;\n                        }\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                        if (CreateAssetNode(td.Name, out var assetNode))\n                        {\n                            AddNodesForThingDescription(assetNode, td);\n                        }\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                    }\n                    catch (Exception ex)\n                    {\n                        // skip this file, but log an error\n                        _logger.AssetConfigError(ex);\n                    }\n                }\n\n                AddReverseReferences(externalReferences);\n                base.CreateAddressSpace(externalReferences);\n            }\n        }\n\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                base.DeleteAddressSpace();\n            }\n        }\n\n        internal ServiceResult OnCreateAsset(ISystemContext _context, MethodState _method,\n            NodeId _objectId, string assetName, ref NodeId assetId)\n        {\n            lock (Lock)\n            {\n                if (string.IsNullOrEmpty(assetName))\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                        \"Argument invalid\");\n                }\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                var success = CreateAssetNode(assetName, out var assetNode);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                if (!success)\n                {\n                    return new ServiceResult(StatusCodes.BadBrowseNameDuplicated,\n                        new LocalizedText(assetNode.NodeId.ToString()));\n                }\n                assetId = assetNode.NodeId;\n                return ServiceResult.Good;\n            }\n        }\n\n        internal ServiceResult OnDeleteAsset(ISystemContext _context, MethodState _method,\n            NodeId _objectId, NodeId assetId)\n        {\n            lock (Lock)\n            {\n                var asset = FindPredefinedNode(assetId, typeof(IWoTAssetTypeState));\n                if (asset == null)\n                {\n                    return ServiceResult.Create(StatusCodes.BadNodeIdUnknown, \"Not found\");\n                }\n\n                var assetName = asset.DisplayName.Text;\n\n                if (_fileManagers.TryGetValue(assetId, out var filemanager))\n                {\n                    filemanager.Delete();  // Delete the file\n                    filemanager.Dispose();\n                    _fileManagers.Remove(assetId);\n                }\n\n                DeleteNode(SystemContext, assetId);\n\n                _tags.Remove(assetName);\n                _assets.Remove(assetName);\n\n                foreach (var key in _uaVariables.Keys.Where(n => n.StartsWith(\n                    assetName + \":\", StringComparison.InvariantCulture)).ToList())\n                {\n                    _uaVariables.Remove(key);\n                }\n\n                return ServiceResult.Good;\n            }\n        }\n\n        internal ServiceResult OnSimpleReadValue(ISystemContext context, NodeState node,\n            ref object? value)\n        {\n            if (!TryGetBinding(node, out var assetInterface, out var assetTag))\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidState, \"Asset not found\");\n            }\n            return assetInterface.Read(assetTag, ref value);\n        }\n\n        internal ServiceResult OnSimpleWriteValue(ISystemContext context, NodeState node,\n            ref object value)\n        {\n            if (!TryGetBinding(node, out var assetInterface, out var assetTag))\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidState, \"Asset not found\");\n            }\n            return assetInterface.Write(assetTag, ref value);\n        }\n\n        internal void OnDataChange(BaseVariableState variable, AssetTag assetTag,\n            object? value, StatusCode statusCode, DateTime timestamp)\n        {\n            lock (Lock)\n            {\n                _logger.DataChange(assetTag);\n\n                variable.Value = value;\n                variable.StatusCode = statusCode;\n                variable.Timestamp = timestamp;\n\n                // notifies any monitored items that the value has changed.\n                variable.ClearChangeMasks(SystemContext, false);\n            }\n        }\n\n        /// <summary>\n        /// Called after creating a MonitoredItem2.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override void OnMonitoredItemCreated(ServerSystemContext context,\n            NodeHandle handle, ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            if (TryGetBinding(handle.Node, out var assetInterface, out var assetTag)\n                && monitoredItem.MonitoringMode != MonitoringMode.Disabled\n                && handle.Node is BaseVariableState source)\n            {\n                assetInterface.Observe(assetTag, monitoredItem.Id, (tag, value, status, timestamp)\n                    => OnDataChange(source, tag, value, status, timestamp));\n            }\n        }\n\n        /// <summary>\n        /// Called after modifying a MonitoredItem2.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override void OnMonitoredItemModified(ServerSystemContext context,\n            NodeHandle handle, ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            if (TryGetBinding(handle.Node, out var assetInterface, out var assetTag)\n                && monitoredItem.MonitoringMode != MonitoringMode.Disabled\n                && handle.Node is BaseVariableState source)\n            {\n                assetInterface.Unobserve(assetTag, monitoredItem.Id);\n                assetInterface.Observe(assetTag, monitoredItem.Id, (tag, value, status, timestamp)\n                    => OnDataChange(source, tag, value, status, timestamp));\n            }\n        }\n\n        /// <summary>\n        /// Called after deleting a MonitoredItem2.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override void OnMonitoredItemDeleted(ServerSystemContext context,\n            NodeHandle handle, ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            if (TryGetBinding(handle.Node, out var assetInterface, out var assetTag)\n                && handle.Node is BaseVariableState)\n            {\n                assetInterface.Unobserve(assetTag, monitoredItem.Id);\n            }\n        }\n\n        /// <summary>\n        /// Called after changing the MonitoringMode for a MonitoredItem2.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        /// <param name=\"previousMode\">The previous monitoring mode.</param>\n        /// <param name=\"monitoringMode\">The current monitoring mode.</param>\n        protected override void OnMonitoringModeChanged(ServerSystemContext context,\n            NodeHandle handle, ISampledDataChangeMonitoredItem monitoredItem, MonitoringMode previousMode,\n            MonitoringMode monitoringMode)\n        {\n            if (TryGetBinding(handle.Node, out var assetInterface, out var assetTag)\n                && handle.Node is BaseVariableState source)\n            {\n                if (previousMode != MonitoringMode.Disabled &&\n                    monitoredItem.MonitoringMode == MonitoringMode.Disabled)\n                {\n                    assetInterface.Unobserve(assetTag, monitoredItem.Id);\n                }\n\n                if (previousMode == MonitoringMode.Disabled &&\n                    monitoredItem.MonitoringMode != MonitoringMode.Disabled)\n                {\n                    assetInterface.Observe(assetTag, monitoredItem.Id, (tag, value, status, timestamp)\n                        => OnDataChange(source, tag, value, status, timestamp));\n                }\n            }\n        }\n\n        public void AddNodesForThingDescription(NodeState parent, ThingDescription td)\n        {\n            lock (Lock)\n            {\n                AddNodesForThingDescriptionInternal(parent, td);\n            }\n        }\n\n        private void AddNodesForThingDescriptionInternal(NodeState parent, ThingDescription td)\n        {\n            ArgumentNullException.ThrowIfNull(td.Context);\n\n            // Limitation, the asset name must be the name we are using as thing name\n            td.Name = parent.BrowseName.Name;\n\n            var newNamespace = \"http://opcfoundation.org/UA/\" + td.Name + \"/\";\n            List<string> namespaceUris = [.. NamespaceUris];\n            if (!namespaceUris.Contains(newNamespace))\n            {\n                namespaceUris.Add(newNamespace);\n            }\n\n            foreach (var ns in td.Context)\n            {\n                var nsUri = ns.ToString() ?? string.Empty;\n                if (!nsUri.Contains(\"https://www.w3.org/\", StringComparison.InvariantCulture) &&\n                    nsUri.Contains(\"opcua\", StringComparison.InvariantCulture))\n                {\n                    var namespaces = JsonConvert.DeserializeObject<OpcUaNamespaces>(nsUri);\n                    if (namespaces?.Namespaces == null)\n                    {\n                        continue;\n                    }\n                    foreach (var opcuaCompanionSpecUrl in namespaces.Namespaces)\n                    {\n                        namespaceUris.Add(opcuaCompanionSpecUrl.ToString());\n                    }\n                }\n            }\n\n            AddNamespacesFromCompanionSpecs(namespaceUris, td);\n\n            NamespaceUris = namespaceUris;\n\n            AddNodesFromCompanionSpecs(td);\n\n            var assetId = GetOrAddAssetForThing(td);\n\n            // create nodes for each TD property\n            if (td.Properties != null)\n            {\n                foreach (var property in td.Properties)\n                {\n                    if (property.Value.Forms != null)\n                    {\n                        foreach (var form in property.Value.Forms)\n                        {\n                            var formString = form?.ToString();\n                            if (formString != null)\n                            {\n                                AddNodeAndAssetTagForWotProperty(parent, td,\n                                    property.Key, property.Value, formString, assetId);\n                            }\n                        }\n                    }\n                }\n            }\n            _logger.WoTParsed(assetId);\n        }\n\n        private bool CreateAssetNode(string assetName, out NodeState assetNode)\n        {\n            // check if the asset node already exists\n            var browser = _assetManagement.CreateBrowser(SystemContext, null,\n                null, false, BrowseDirection.Forward, null, null, true);\n            var reference = browser.Next();\n            while ((reference != null) && (reference is NodeStateReference))\n            {\n                var node = reference as NodeStateReference;\n                if ((node?.Target != null) && (node.Target.DisplayName.Text == assetName))\n                {\n                    assetNode = node.Target;\n                    return false;\n                }\n                reference = browser.Next();\n            }\n\n            var asset = new IWoTAssetTypeState(_assetManagement);\n            asset.Create(SystemContext, NodeId.Null, new QualifiedName(assetName), null, true);\n\n            _assetManagement.AddChild(asset);\n            _fileManagers.Add(asset.NodeId, new FileManager(this, asset.WoTFile, _folder, _logger));\n\n            AddPredefinedNode(SystemContext, asset);\n\n            assetNode = asset;\n            return true;\n        }\n\n        private void AddNodesForAssetManagement(IList<IReference> objectsFolderReferences)\n        {\n            var WoTConNamespaceIndex = (ushort)Server.NamespaceUris.GetIndex(Namespaces.WoT_Con);\n            var assetManagementPassiveNode = (BaseObjectState)FindPredefinedNode(\n                new NodeId(Objects.WoTAssetConnectionManagement, WoTConNamespaceIndex),\n                typeof(BaseObjectState));\n            _assetManagement.Create(SystemContext, assetManagementPassiveNode);\n\n            var createAssetPassiveNode = (MethodState)FindPredefinedNode(\n                new NodeId(Methods.WoTAssetConnectionManagement_CreateAsset,\n                WoTConNamespaceIndex), typeof(MethodState));\n            _assetManagement.CreateAsset = new(null);\n            _assetManagement.CreateAsset.Create(SystemContext, createAssetPassiveNode);\n            _assetManagement.CreateAsset.OnCall =\n                new CreateAssetMethodStateMethodCallHandler(OnCreateAsset);\n\n            var createAssetInputArgumentsPassiveNode = (BaseVariableState)FindPredefinedNode(\n                new NodeId(Variables.WoTAssetConnectionManagementType_CreateAsset_InputArguments,\n                WoTConNamespaceIndex), typeof(BaseVariableState));\n            _assetManagement.CreateAsset.InputArguments = new(null);\n            _assetManagement.CreateAsset.InputArguments.Create(SystemContext,\n                createAssetInputArgumentsPassiveNode);\n\n            var createAssetOutputArgumentsPassiveNode = (BaseVariableState)FindPredefinedNode(\n                new NodeId(Variables.WoTAssetConnectionManagementType_CreateAsset_OutputArguments,\n                WoTConNamespaceIndex), typeof(BaseVariableState));\n            _assetManagement.CreateAsset.OutputArguments = new(null);\n            _assetManagement.CreateAsset.OutputArguments.Create(SystemContext,\n                createAssetOutputArgumentsPassiveNode);\n\n            var deleteAssetPassiveNode = (MethodState)FindPredefinedNode(\n                new NodeId(Methods.WoTAssetConnectionManagement_DeleteAsset,\n                WoTConNamespaceIndex), typeof(MethodState));\n            _assetManagement.DeleteAsset = new(null);\n            _assetManagement.DeleteAsset.Create(SystemContext, deleteAssetPassiveNode);\n            _assetManagement.DeleteAsset.OnCall =\n                new DeleteAssetMethodStateMethodCallHandler(OnDeleteAsset);\n\n            var deleteAssetInputArgumentsPassiveNode = (BaseVariableState)FindPredefinedNode(\n                new NodeId(Variables.WoTAssetConnectionManagementType_DeleteAsset_InputArguments,\n                WoTConNamespaceIndex), typeof(BaseVariableState));\n            _assetManagement.DeleteAsset.InputArguments = new(null);\n            _assetManagement.DeleteAsset.InputArguments.Create(SystemContext,\n                deleteAssetInputArgumentsPassiveNode);\n\n            // create a variable listing our supported WoT protocol bindings\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            CreateVariable(_assetManagement, \"SupportedWoTBindings\",\n                new ExpandedNodeId(DataTypes.UriString), WoTConNamespaceIndex, new[]\n                {\n                    \"https://www.w3.org/2019/wot/modbus\",\n                    \"https://www.github.com/Azure/Industrial-IoT/sim\"\n                });\n#pragma warning restore CA2000 // Dispose objects before losing scope\n\n            // add everything to our server namespace\n            objectsFolderReferences.Add(new NodeStateReference(Opc.Ua.ReferenceTypes.Organizes,\n                false, _assetManagement.NodeId));\n            AddPredefinedNode(SystemContext, _assetManagement);\n        }\n\n        private void AddNamespacesFromCompanionSpecs(List<string> namespaceUris, ThingDescription td)\n        {\n            ArgumentNullException.ThrowIfNull(td.Context);\n            // check if an OPC UA companion spec is mentioned in the WoT TD file\n            foreach (var ns in td.Context)\n            {\n                var nsUri = ns.ToString() ?? string.Empty;\n                if (nsUri.Contains(\"https://www.w3.org/\", StringComparison.InvariantCulture) &&\n                    !nsUri.Contains(\"opcua\", StringComparison.InvariantCulture))\n                {\n                    continue;\n                }\n\n                var namespaces = JsonConvert.DeserializeObject<OpcUaNamespaces>(nsUri);\n                if (namespaces?.Namespaces == null)\n                {\n                    continue;\n                }\n\n                foreach (var opcuaCompanionSpecUrl in namespaces.Namespaces)\n                {\n                    // support local Nodesets\n                    if (!opcuaCompanionSpecUrl.IsAbsoluteUri ||\n                            (!opcuaCompanionSpecUrl.AbsoluteUri.Contains(\"http://\",\n                                StringComparison.InvariantCulture) &&\n                             !opcuaCompanionSpecUrl.AbsoluteUri.Contains(\"https://\",\n                                StringComparison.InvariantCulture)))\n                    {\n                        string? nodesetFile;\n                        if (Path.IsPathFullyQualified(opcuaCompanionSpecUrl.OriginalString))\n                        {\n                            // absolute file path\n                            nodesetFile = opcuaCompanionSpecUrl.OriginalString;\n                        }\n                        else\n                        {\n                            // relative file path\n                            nodesetFile = Path.Combine(Directory.GetCurrentDirectory(),\n                                opcuaCompanionSpecUrl.OriginalString);\n                        }\n\n                        _logger.LoadingNodeset(nodesetFile);\n                        LoadNamespaceUrisFromNodesetXml(namespaceUris, nodesetFile);\n                    }\n                }\n            }\n        }\n\n        private void AddNodesFromCompanionSpecs(ThingDescription td)\n        {\n            ArgumentNullException.ThrowIfNull(td.Context);\n\n            foreach (var ns in td.Context)\n            {\n                var nsUri = ns.ToString() ?? string.Empty;\n                if (nsUri.Contains(\"https://www.w3.org/\", StringComparison.InvariantCulture) &&\n                    !nsUri.Contains(\"opcua\", StringComparison.InvariantCulture))\n                {\n                    continue;\n                }\n\n                var namespaces = JsonConvert.DeserializeObject<OpcUaNamespaces>(nsUri);\n                if (namespaces?.Namespaces == null)\n                {\n                    continue;\n                }\n                foreach (var opcuaCompanionSpecUrl in namespaces.Namespaces)\n                {\n                    // support local Nodesets\n                    if (!opcuaCompanionSpecUrl.IsAbsoluteUri\n                        || (!opcuaCompanionSpecUrl.AbsoluteUri.Contains(\"http://\",\n                                StringComparison.InvariantCulture) &&\n                            !opcuaCompanionSpecUrl.AbsoluteUri.Contains(\"https://\",\n                                StringComparison.InvariantCulture)))\n                    {\n                        string? nodesetFile;\n                        if (Path.IsPathFullyQualified(opcuaCompanionSpecUrl.OriginalString))\n                        {\n                            // absolute file path\n                            nodesetFile = opcuaCompanionSpecUrl.OriginalString;\n                        }\n                        else\n                        {\n                            // relative file path\n                            nodesetFile = Path.Combine(Directory.GetCurrentDirectory(),\n                                opcuaCompanionSpecUrl.OriginalString);\n                        }\n\n                        _logger.AddingNodeset();\n                        AddNodesFromNodesetXml(nodesetFile);\n                    }\n                }\n            }\n        }\n\n        private static void LoadNamespaceUrisFromNodesetXml(List<string> namespaceUris,\n            string nodesetFile)\n        {\n            using var stream = new FileStream(nodesetFile, FileMode.Open, FileAccess.Read);\n            var nodeSet = Opc.Ua.Export.UANodeSet.Read(stream);\n\n            if (nodeSet.NamespaceUris?.Length > 0)\n            {\n                foreach (var ns in nodeSet.NamespaceUris)\n                {\n                    if (!namespaceUris.Contains(ns))\n                    {\n                        namespaceUris.Add(ns);\n                    }\n                }\n            }\n        }\n\n        private void LoadNamespaceUrisFromEmbeddedNodesetXml(List<string> namespaceUris)\n        {\n            var type = GetType().GetTypeInfo();\n            var resourcePath =\n$\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.NodeSet2.xml\";\n            var stream = type.Assembly.GetManifestResourceStream(resourcePath);\n            if (stream == null)\n            {\n                throw new ServiceResultException(\"Failed to load nodeset xml from embedded resource\");\n            }\n            try\n            {\n                var nodeSet = Opc.Ua.Export.UANodeSet.Read(stream);\n                if (nodeSet.NamespaceUris?.Length > 0)\n                {\n                    foreach (var ns in nodeSet.NamespaceUris)\n                    {\n                        if (!namespaceUris.Contains(ns))\n                        {\n                            namespaceUris.Add(ns);\n                        }\n                    }\n                }\n            }\n            finally\n            {\n                stream.Dispose();\n            }\n        }\n\n        private void AddNodesFromNodesetXml(string nodesetFile)\n        {\n            using var stream = new FileStream(nodesetFile, FileMode.Open);\n            var nodeSet = Opc.Ua.Export.UANodeSet.Read(stream);\n\n            var predefinedNodes = new NodeStateCollection();\n\n            nodeSet.Import(SystemContext, predefinedNodes);\n\n            for (var i = 0; i < predefinedNodes.Count; i++)\n            {\n                try\n                {\n                    AddPredefinedNode(SystemContext, predefinedNodes[i]);\n                }\n                catch (Exception ex)\n                {\n                    _logger.AssetNodeManagerError(ex);\n                }\n            }\n        }\n\n        private void AddNodesFromEmbeddedNodesetXml()\n        {\n            var type = GetType().GetTypeInfo();\n            var resourcePath =\n$\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.NodeSet2.xml\";\n            var stream = type.Assembly.GetManifestResourceStream(resourcePath);\n            if (stream == null)\n            {\n                throw new ServiceResultException(\"Failed to load nodeset xml from embedded resource\");\n            }\n            try\n            {\n                var nodeSet = Opc.Ua.Export.UANodeSet.Read(stream);\n                var predefinedNodes = new NodeStateCollection();\n                nodeSet.Import(SystemContext, predefinedNodes);\n\n                for (var i = 0; i < predefinedNodes.Count; i++)\n                {\n                    try\n                    {\n                        AddPredefinedNode(SystemContext, predefinedNodes[i]);\n                    }\n                    catch (Exception ex)\n                    {\n                        _logger.AssetNodeManagerError(ex);\n                    }\n                }\n            }\n            finally\n            {\n                stream.Dispose();\n            }\n        }\n\n        private void AddNodeAndAssetTagForWotProperty(NodeState assetFolder, ThingDescription td,\n            string propertyName, Property property, string form, string assetId)\n        {\n            var assetTag = AddAssetTagForTdProperty(td, propertyName, property, form, assetId);\n\n            // create an OPC UA variable optionally with a specified type.\n            var variable = CreateAssetTagVariable(assetFolder, assetTag.Name,\n                new ExpandedNodeId(DataTypes.Float), assetFolder.NodeId.NamespaceIndex,\n                assetId, !property.ReadOnly);\n\n            _uaVariables.Add($\"{assetId}:{propertyName}\", variable);\n        }\n\n        private AssetTag AddAssetTagForTdProperty(ThingDescription td, string propertyName,\n            Property property, string form, string assetId)\n        {\n            _logger.AddAssetForProperty(property);\n\n            // check if we need to create a new asset first\n            if (!_tags.TryGetValue(assetId, out var tagList))\n            {\n                tagList = [];\n                _tags.Add(assetId, tagList);\n            }\n            if (!Uri.TryCreate(td.Base, UriKind.Absolute, out var baseUri))\n            {\n                throw new FormatException(\"Missing uri information in thing description.\");\n            }\n            else if (baseUri.Scheme == \"modbus+tcp\")\n            {\n                // create an asset tag and add to our list\n                var modbusForm = JsonConvert.DeserializeObject<ModbusForm>(form);\n                if (modbusForm?.Href != null &&\n                    Uri.TryCreate(modbusForm.Href, UriKind.Relative, out var address))\n                {\n                    var tag = new AssetTag<ModbusForm>()\n                    {\n                        Form = modbusForm,\n                        Name = propertyName,\n                        Address = address\n                    };\n                    tagList.AddOrUpdate(propertyName, tag);\n                    return tag;\n                }\n            }\n\n            // else if ... add other protocols here\n\n            else\n            {\n                // create an asset tag and add to our list\n                var genform = JsonConvert.DeserializeObject<SimulatedForm>(form);\n                if (genform?.Href != null &&\n                    Uri.TryCreate(genform.Href, UriKind.Relative, out var address))\n                {\n                    var tag = new AssetTag<SimulatedForm>()\n                    {\n                        Form = genform,\n                        Name = propertyName,\n                        Address = address\n                    };\n                    tagList.AddOrUpdate(propertyName, tag);\n                    return tag;\n                }\n            }\n            throw new FormatException(\"TD Format wrong or unsupported.\");\n        }\n\n        private string GetOrAddAssetForThing(ThingDescription td)\n        {\n            ArgumentNullException.ThrowIfNull(td);\n            ArgumentNullException.ThrowIfNull(td.Base);\n            ArgumentNullException.ThrowIfNull(td.Name);\n\n            if (!_assets.TryGetValue(td.Name, out var assetInterface))\n            {\n                var parsedUri = new Uri(td.Base);\n\n                // Try Create modbus asset\n                if (ModbusTcpAsset.TryConnect(parsedUri, _logger, out assetInterface))\n                {\n                    _logger.CreatedModbusAsset(td.Name);\n                }\n\n                // else ...\n\n                // default\n                assetInterface ??= new SimulatedAsset();\n                _assets.Add(td.Name, assetInterface);\n            }\n\n            Debug.Assert(assetInterface != null);\n            return td.Name;\n        }\n\n        private BaseDataVariableState CreateVariable(NodeState parent, string name,\n            ExpandedNodeId type, ushort namespaceIndex, object? value)\n        {\n            var referenceType = ExpandedNodeId.ToNodeId(ReferenceTypeIds.HasWoTComponent,\n                Server.NamespaceUris);\n            var variable = new BaseDataVariableState(parent)\n            {\n                SymbolicName = name,\n                ReferenceTypeId = referenceType,\n                NodeId = new NodeId(name, namespaceIndex),\n                BrowseName = new QualifiedName(name, namespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None,\n                AccessLevel = AccessLevels.CurrentRead,\n                DataType = ExpandedNodeId.ToNodeId(type, Server.NamespaceUris),\n                Value = value\n            };\n\n            parent.AddReference(referenceType, false, variable.NodeId);\n            variable.AddReference(referenceType, true, parent.NodeId);\n\n            AddPredefinedNode(SystemContext, variable);\n            return variable;\n        }\n\n        private BaseDataVariableState CreateAssetTagVariable(NodeState parent, string name,\n            ExpandedNodeId type, ushort namespaceIndex, string assetId, bool writeable = false)\n        {\n            var referenceType = ExpandedNodeId.ToNodeId(ReferenceTypeIds.HasWoTComponent,\n              Server.NamespaceUris);\n            var variable = new BaseDataVariableState(parent)\n            {\n                SymbolicName = name,\n                Handle = assetId,\n                ReferenceTypeId = referenceType,\n                NodeId = new NodeId(name, namespaceIndex),\n                BrowseName = new QualifiedName(name, namespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None,\n                AccessLevel = AccessLevels.CurrentRead,\n                DataType = ExpandedNodeId.ToNodeId(type, Server.NamespaceUris),\n                OnSimpleReadValue = new NodeValueSimpleEventHandler(OnSimpleReadValue)\n            };\n            if (writeable)\n            {\n                variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n                variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n                variable.UserWriteMask = AttributeWriteMask.ValueForVariableType;\n                variable.WriteMask = AttributeWriteMask.ValueForVariableType;\n                variable.OnSimpleWriteValue = new NodeValueSimpleEventHandler(OnSimpleWriteValue);\n            }\n\n            parent.AddReference(referenceType, false, variable.NodeId);\n            variable.AddReference(referenceType, true, parent.NodeId);\n\n            AddPredefinedNode(SystemContext, variable);\n            return variable;\n        }\n\n        private bool TryGetBinding(NodeState node, [NotNullWhen(true)] out IAsset? assetInterface,\n            [NotNullWhen(true)] out AssetTag? assetTag)\n        {\n            if (node.Handle is not string assetId ||\n                !_assets.TryGetValue(assetId, out assetInterface) ||\n                !_tags.TryGetValue(assetId, out var tag) ||\n                !tag.TryGetValue(node.SymbolicName, out assetTag))\n            {\n                assetInterface = null;\n                assetTag = null;\n                return false;\n            }\n            return true;\n        }\n\n        private readonly WoTAssetConnectionManagementTypeState _assetManagement = new(null);\n        private readonly Dictionary<string, BaseDataVariableState> _uaVariables = [];\n        private readonly Dictionary<string, IAsset> _assets = [];\n        private readonly Dictionary<string, Dictionary<string, AssetTag>> _tags = [];\n        private readonly Dictionary<NodeId, FileManager> _fileManagers = [];\n        private readonly ILogger _logger;\n        private readonly string _folder;\n        private long _lastUsedId;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for AssetNodeManager\n    /// </summary>\n    internal static partial class AssetNodeManagerLogging\n    {\n        private const int EventClass = 0;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Error\")]\n        public static partial void AssetNodeManagerError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Error parsing asset configuration file.\")]\n        public static partial void AssetConfigError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug,\n            Message = \"Data change for {AssetTag}\")]\n        public static partial void DataChange(this ILogger logger, AssetTag assetTag);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"Successfully parsed WoT file for asset: {AssetId}\")]\n        public static partial void WoTParsed(this ILogger logger, string assetId);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"Loading nodeset from local file {File}\")]\n        public static partial void LoadingNodeset(this ILogger logger, string file);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"Adding node set from local nodeset file\")]\n        public static partial void AddingNodeset(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Created modbus asset {AssetId}\")]\n        public static partial void CreatedModbusAsset(this ILogger logger, string assetId);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Debug,\n            Message = \"Add asset for Property {Property}\")]\n        public static partial void AddAssetForProperty(this ILogger logger, Property property);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/AssetServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Asset\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class AssetServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return\n                [\n                    Namespaces.AssetServer,\n                    Namespaces.WoT_Con\n                ];\n            }\n        }\n\n        public AssetServer(ILogger logger)\n        {\n            _logger = logger;\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new AssetNodeManager(server, configuration, _logger);\n        }\n\n        private readonly ILogger _logger;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/AssetTag.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\n#nullable enable\n\nnamespace Asset\n{\n    using System;\n\n    public abstract class AssetTag\n    {\n        /// <summary>\n        /// Tag name\n        /// </summary>\n        public required string Name { get; init; }\n\n        /// <summary>\n        /// Tag address\n        /// </summary>\n        public required Uri Address { get; init; }\n    }\n\n    public class AssetTag<T> : AssetTag\n    {\n        public required T Form { get; init; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/FileManager.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\n#nullable enable\n\nnamespace Asset\n{\n    using Microsoft.Extensions.Logging;\n    using Newtonsoft.Json;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.IO;\n\n    public sealed class FileManager : IDisposable\n    {\n        public FileManager(AssetNodeManager nodeManager, WoTAssetFileTypeState file,\n            string folder, ILogger logger)\n        {\n            _nodeManager = nodeManager;\n            _folder = folder;\n            _file = file;\n            _logger = logger;\n            _file.Size.Value = 0;\n            if (_file.MaxByteStringLength != null)\n            {\n                _file.LastModifiedTime.Value = DateTime.MinValue;\n            }\n\n            _file.Writable.Value = false;\n            _file.UserWritable.Value = false;\n            _file.OpenCount.Value = 0;\n            if (_file.MaxByteStringLength != null)\n            {\n                _file.MaxByteStringLength.Value = ushort.MaxValue;\n            }\n\n            _file.Open.OnCall =\n                new OpenMethodStateMethodCallHandler(OnOpen);\n            _file.Close.OnCall =\n                new CloseMethodStateMethodCallHandler(OnClose);\n            _file.Read.OnCall =\n                new ReadMethodStateMethodCallHandler(OnRead);\n            _file.Write.OnCall =\n                new WriteMethodStateMethodCallHandler(OnWrite);\n            _file.GetPosition.OnCall =\n                new GetPositionMethodStateMethodCallHandler(OnGetPosition);\n            _file.SetPosition.OnCall =\n                new SetPositionMethodStateMethodCallHandler(OnSetPosition);\n            _file.CloseAndUpdate.OnCall =\n                new CloseAndUpdateMethodStateMethodCallHandler(OnCloseAndUpdate);\n        }\n\n        public void Dispose()\n        {\n            lock (_handles)\n            {\n                foreach (var handle in _handles.Values)\n                {\n                    handle.Dispose();\n                }\n                _handles.Clear();\n            }\n        }\n\n        private Handle Find(ISystemContext _context, uint fileHandle)\n        {\n            lock (_handles)\n            {\n                if (!_handles.TryGetValue(fileHandle, out var handle))\n                {\n                    throw new ServiceResultException(\n                        StatusCodes.BadInvalidArgument);\n                }\n\n                if (handle.SessionId != _context.SessionId)\n                {\n                    throw new ServiceResultException(\n                        StatusCodes.BadUserAccessDenied);\n                }\n                return handle;\n            }\n        }\n\n        private ServiceResult OnOpen(ISystemContext _context, MethodState _method,\n            NodeId _objectId, byte mode, ref uint fileHandle)\n        {\n            if (mode != 1 && mode != 6)\n            {\n                return StatusCodes.BadNotSupported;\n            }\n\n            lock (_handles)\n            {\n                try\n                {\n                    if (_handles.Count >= 10)\n                    {\n                        return StatusCodes.BadTooManyOperations;\n                    }\n\n                    if (_writing && mode != 1)\n                    {\n                        return ServiceResult.Create(StatusCodes.BadInvalidState, \"Writing already\");\n                    }\n\n                    Handle handle;\n                    if (mode == 6)\n                    {\n                        // Writing\n                        handle = new Handle(_context.SessionId);\n                        _writing = true;\n                    }\n                    else if (mode == 1)\n                    {\n                        // Reading\n                        var path = Path.Combine(_folder, _file.Parent.DisplayName.Text + \".jsonld\");\n                        handle = new Handle(_context.SessionId, File.Open(path, FileMode.Open));\n                    }\n                    else\n                    {\n                        return ServiceResult.Create(StatusCodes.BadNotSupported, \"Unsupported mode\");\n                    }\n                    fileHandle = ++_nextHandle;\n                    _handles.Add(fileHandle, handle);\n                    _file.OpenCount.Value = (ushort)_handles.Count;\n                }\n                catch (Exception ex)\n                {\n                    return ServiceResult.Create(ex, StatusCodes.BadUserAccessDenied, ex.Message);\n                }\n            }\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnGetPosition(ISystemContext _context,\n            MethodState _method, NodeId _objectId, uint fileHandle,\n            ref ulong position)\n        {\n            var handle = Find(_context, fileHandle);\n            position = (ulong)handle.Stream.Position;\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnSetPosition(ISystemContext _context,\n            MethodState _method, NodeId _objectId, uint fileHandle,\n            ulong position)\n        {\n            var handle = Find(_context, fileHandle);\n            handle.Stream.Seek((long)position, SeekOrigin.Begin);\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnRead(ISystemContext _context,\n            MethodState _method, NodeId _objectId, uint fileHandle,\n            int length, ref byte[] data)\n        {\n            lock (_handles)\n            {\n                var handle = Find(_context, fileHandle);\n\n                if (handle.Writing)\n                {\n                    return StatusCodes.BadInvalidState;\n                }\n\n                if (data?.Length > 0)\n                {\n                    var buffer = new byte[data.Length];\n                    handle.Stream.ReadExactly(data);\n                    data = buffer;\n                }\n                else\n                {\n                    data = [];\n                }\n            }\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnWrite(ISystemContext _context,\n            MethodState _method, NodeId _objectId, uint fileHandle, byte[] data)\n        {\n            lock (_handles)\n            {\n                var handle = Find(_context, fileHandle);\n\n                if (!handle.Writing)\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidState, \"Not writable\");\n                }\n\n                if (data?.Length > 0)\n                {\n                    handle.Stream.Write(data, 0, data.Length);\n                }\n            }\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnClose(ISystemContext _context, MethodState _method,\n            NodeId _objectId, uint fileHandle)\n        {\n            lock (_handles)\n            {\n                if (!_handles.TryGetValue(fileHandle, out var handle))\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                        \"Bad file handle\");\n                }\n\n                if (handle.SessionId != _context.SessionId)\n                {\n                    return ServiceResult.Create(StatusCodes.BadUserAccessDenied,\n                        \"Bad sessionid\");\n                }\n\n                _writing = false;\n                _handles.Remove(fileHandle);\n                handle.Dispose();\n                _file.OpenCount.Value = (ushort)_handles.Count;\n                return ServiceResult.Good;\n            }\n        }\n\n        private ServiceResult OnCloseAndUpdate(ISystemContext _context,\n            MethodState _method, NodeId _objectId, uint fileHandle)\n        {\n            if (!TryGetHandle(_context, fileHandle, out var handle, out var sr))\n            {\n                return sr;\n            }\n            try\n            {\n                // Reset\n                handle.Stream.Position = 0;\n\n                var jsonSerializer = JsonSerializer.CreateDefault();\n                using var text = new StreamReader(handle.Stream);\n                using var reader = new JsonTextReader(text);\n\n                var td = jsonSerializer.Deserialize<ThingDescription>(reader);\n                if (td?.Context == null)\n                {\n                    throw new FormatException(\"Missing context\");\n                }\n                _nodeManager.AddNodesForThingDescription(_file.Parent, td);\n                File.WriteAllText(Path.Combine(_folder,\n                    _file.Parent.DisplayName.Text + \".jsonld\"), JsonConvert.SerializeObject(td));\n\n                return ServiceResult.Good;\n            }\n            catch (Exception ex)\n            {\n                return new ServiceResult(StatusCodes.BadDecodingError, ex);\n            }\n            finally\n            {\n                handle.Dispose();\n            }\n\n            bool TryGetHandle(ISystemContext _context, uint fileHandle,\n                [NotNullWhen(true)] out Handle? handle,\n                [NotNullWhen(false)] out ServiceResult? sr)\n            {\n                lock (_handles)\n                {\n                    if (!_handles.TryGetValue(fileHandle, out handle))\n                    {\n                        sr = StatusCodes.BadInvalidArgument;\n                        return false;\n                    }\n\n                    if (handle.SessionId != _context.SessionId)\n                    {\n                        sr = StatusCodes.BadUserAccessDenied;\n                        return false;\n                    }\n\n                    _writing = false;\n                    _handles.Remove(fileHandle);\n                    _file.OpenCount.Value = (ushort)_handles.Count;\n                    sr = null;\n                    return true;\n                }\n            }\n        }\n\n        public void Delete()\n        {\n            try\n            {\n                File.Delete(Path.Combine(_folder,\n                    _file.Parent.DisplayName.Text + \".jsonld\"));\n            }\n            catch (Exception ex)\n            {\n                _logger.FileManagerError(ex);\n            }\n        }\n\n        private sealed record class Handle : IDisposable\n        {\n            public NodeId SessionId { get; }\n            public Stream Stream { get; }\n            public bool Writing { get; }\n\n            public Handle(NodeId sessionId)\n            {\n                SessionId = sessionId;\n                Writing = true;\n                Stream = new MemoryStream();\n            }\n\n            public Handle(NodeId sessionId, Stream stream)\n            {\n                SessionId = sessionId;\n                Stream = stream;\n            }\n\n            public void Dispose()\n            {\n                Stream.Dispose();\n            }\n        }\n\n        private readonly AssetNodeManager _nodeManager;\n        private readonly WoTAssetFileTypeState _file;\n        private readonly ILogger _logger;\n        private readonly string _folder;\n        private readonly Dictionary<uint, Handle> _handles = [];\n        private bool _writing;\n        private uint _nextHandle = 1u;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for FileManager\n    /// </summary>\n    internal static partial class FileManagerLogging\n    {\n        private const int EventClass = 10;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Error\")]\n        public static partial void FileManagerError(this ILogger logger, Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/IAsset.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using System;\n    using System.Diagnostics.CodeAnalysis;\n\n    public delegate void OnAssetTagChange(AssetTag tag,\n        object? value, StatusCode statusCode, DateTime timestamp);\n\n    /// <summary>\n    /// Asset interface\n    /// </summary>\n    public interface IAsset : IDisposable\n    {\n        /// <summary>\n        /// Read from the asset tag\n        /// </summary>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        ServiceResult Read(AssetTag tag, ref object? value);\n\n        /// <summary>\n        /// Write to the asset tag\n        /// </summary>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        ServiceResult Write(AssetTag tag, ref object value);\n\n        /// <summary>\n        /// Observe\n        /// </summary>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"id\"></param>\n        /// <param name=\"callback\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"/>\n        void Observe(AssetTag tag, uint id, OnAssetTagChange callback);\n\n        /// <summary>\n        /// Unobserve\n        /// </summary>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"/>\n        void Unobserve(AssetTag tag, uint id);\n    }\n\n    /// <summary>\n    /// Creates assets\n    /// </summary>\n    public interface IAssetFactory\n    {\n        /// <summary>\n        /// Try connect\n        /// </summary>\n        /// <param name=\"tdBase\"></param>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"asset\"></param>\n        /// <returns></returns>\n        public static abstract bool TryConnect(Uri tdBase,\n            ILogger logger, [NotNullWhen(true)] out IAsset? asset);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/ModbusBinding.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Newtonsoft.Json;\n    using System.Runtime.Serialization;\n\n    public sealed class ModbusForm : Form\n    {\n        [JsonProperty(\"modv:type\")]\n        public ModbusType PayloadType { get; set; }\n        [JsonProperty(\"modv:entity\")]\n        public ModbusEntity? Entity { get; set; }\n        [JsonProperty(\"modv:function\")]\n        public ModbusFunction? Function { get; set; }\n        [JsonProperty(\"modv:timeout\")]\n        public int? Timeout { get; set; }\n        [JsonProperty(\"modv:mostSignificantByte\")]\n        public bool? MostSignificantByte { get; set; }\n        [JsonProperty(\"modv:mostSignificantWord\")]\n        public bool? MostSignificantWord { get; set; }\n        [JsonProperty(\"modv:zeroBasedAddressing\")]\n        public bool? ZeroBasedAddressing { get; set; }\n        [JsonProperty(\"modv:pollingTime\")]\n        public long ModbusPollingTime { get; set; }\n    }\n\n    [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\n    public enum ModbusEntity\n    {\n        [EnumMember(Value = \"Coil\")]\n        Coil,\n        [EnumMember(Value = \"DiscreteInput\")]\n        DiscreteInput,\n        [EnumMember(Value = \"HoldingRegister\")]\n        HoldingRegister,\n        [EnumMember(Value = \"InputRegister\")]\n        InputRegister,\n    }\n\n    [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\n    public enum ModbusFunction\n    {\n        [EnumMember(Value = \"readCoil\")]\n        ReadCoil = 1,\n        [EnumMember(Value = \"readDiscreteInput\")]\n        ReadDiscreteInput = 2,\n        [EnumMember(Value = \"readHoldingRegisters\")]\n        ReadHoldingRegisters = 3,\n        [EnumMember(Value = \"readInputRegisters\")]\n        ReadInputRegisters = 4,\n        [EnumMember(Value = \"writeSingleCoil\")]\n        WriteSingleCoil = 5,\n        [EnumMember(Value = \"writeSingleHoldingRegister\")]\n        WriteSingleHoldingRegister = 6,\n        [EnumMember(Value = \"writeMultipleCoils\")]\n        WriteMultipleCoils = 15,\n        [EnumMember(Value = \"writeMultipleHoldingRegisters\")]\n        WriteMultipleHoldingRegisters = 16,\n\n        // Not needed\n        // [EnumMember(Value = \"readWriteMultipleRegisters\")]\n        // ReadWriteMultipleRegisters = 23,\n        // [EnumMember(Value = \"readFifoQueue\")]\n        // ReadFifoQueue = 24,\n        // [EnumMember(Value = \"readDeviceIdentification\")]\n        // ReadDeviceIdentification = 43\n    }\n\n    [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\n    public enum ModbusType\n    {\n        [EnumMember(Value = \"xsd:integer\")]\n        Xsdinteger,\n        [EnumMember(Value = \"xsd:boolean\")]\n        Xsdboolean,\n        [EnumMember(Value = \"xsd:string\")]\n        Xsdstring,\n        [EnumMember(Value = \"xsd:float\")]\n        Xsdfloat,\n        [EnumMember(Value = \"xsd:decimal\")]\n        Xsddecimal,\n        [EnumMember(Value = \"xsd:byte\")]\n        Xsdbyte,\n        [EnumMember(Value = \"xsd:short\")]\n        Xsdshort,\n        [EnumMember(Value = \"xsd:int\")]\n        Xsdint,\n        [EnumMember(Value = \"xsd:long\")]\n        Xsdlong,\n        [EnumMember(Value = \"xsd:unsignedByte\")]\n        XsdunsignedByte,\n        [EnumMember(Value = \"xsd:unsignedShort\")]\n        XsdunsignedShort,\n        [EnumMember(Value = \"xsd:unsignedInt\")]\n        XsdunsignedInt,\n        [EnumMember(Value = \"xsd:unsignedLong\")]\n        XsdunsignedLong,\n        [EnumMember(Value = \"xsd:double\")]\n        Xsddouble,\n        [EnumMember(Value = \"xsd:hexBinary\")]\n        XsdhexBinary,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/ModbusFormExtension.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Opc.Ua;\n    using System;\n    using System.Text;\n\n    public static class ModbusFormExtension\n    {\n        /// <summary>\n        /// Get datatype id\n        /// </summary>\n        /// <param name=\"form\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        public static NodeId GetDataTypeId(this ModbusForm form)\n        {\n            switch (form.PayloadType)\n            {\n                case ModbusType.Xsdfloat:\n                    return DataTypeIds.Float;\n                case ModbusType.Xsdinteger:\n                    return DataTypeIds.Integer;\n                case ModbusType.Xsdboolean:\n                    return DataTypeIds.Boolean;\n                case ModbusType.Xsdstring:\n                    return DataTypeIds.String;\n                case ModbusType.Xsddecimal:\n                    return DataTypeIds.Decimal;\n                case ModbusType.Xsdbyte:\n                    return DataTypeIds.SByte;\n                case ModbusType.Xsdshort:\n                    return DataTypeIds.Int16;\n                case ModbusType.Xsdint:\n                    return DataTypeIds.Int32;\n                case ModbusType.Xsdlong:\n                    return DataTypeIds.Int64;\n                case ModbusType.XsdunsignedByte:\n                    return DataTypeIds.Byte;\n                case ModbusType.XsdunsignedShort:\n                    return DataTypeIds.UInt16;\n                case ModbusType.XsdunsignedInt:\n                    return DataTypeIds.UInt32;\n                case ModbusType.XsdunsignedLong:\n                    return DataTypeIds.UInt64;\n                case ModbusType.Xsddouble:\n                    return DataTypeIds.Double;\n                case ModbusType.XsdhexBinary:\n                    return DataTypeIds.ByteString;\n                default:\n                    throw ServiceResultException.Create(StatusCodes.BadNotReadable,\n                        \"Invalid data type\");\n            }\n        }\n\n        /// <summary>\n        /// Convert value to buffer (little endian) to write\n        /// </summary>\n        /// <param name=\"form\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        public static ReadOnlyMemory<byte> ToBuffer(this ModbusForm form, object value)\n        {\n            switch (form.PayloadType)\n            {\n                case ModbusType.Xsdfloat:\n                    return BitConverter.GetBytes((float)value);\n                case ModbusType.Xsdinteger:\n                    return BitConverter.GetBytes((int)value);\n                case ModbusType.Xsdboolean:\n                    return BitConverter.GetBytes((bool)value);\n                case ModbusType.Xsdstring:\n                    return Encoding.UTF8.GetBytes((string)value);\n                case ModbusType.Xsddecimal:\n                    return GetBytes((decimal)value);\n                case ModbusType.Xsdbyte:\n                    return new[] { (byte)(sbyte)value };\n                case ModbusType.Xsdshort:\n                    return BitConverter.GetBytes((short)value);\n                case ModbusType.Xsdint:\n                    return BitConverter.GetBytes((int)value);\n                case ModbusType.Xsdlong:\n                    return BitConverter.GetBytes((long)value);\n                case ModbusType.XsdunsignedByte:\n                    return new[] { (byte)value };\n                case ModbusType.XsdunsignedShort:\n                    return BitConverter.GetBytes((ushort)value);\n                case ModbusType.XsdunsignedInt:\n                    return BitConverter.GetBytes((uint)value);\n                case ModbusType.XsdunsignedLong:\n                    return BitConverter.GetBytes((ulong)value);\n                case ModbusType.Xsddouble:\n                    return BitConverter.GetBytes((double)value);\n                case ModbusType.XsdhexBinary:\n                    return (byte[])value;\n                default:\n                    throw ServiceResultException.Create(StatusCodes.BadNotReadable,\n                        \"Invalid data type\");\n            }\n        }\n\n        /// <summary>\n        /// Convert (little endian) value to object based on modbus type\n        /// </summary>\n        /// <param name=\"form\"></param>\n        /// <param name=\"buffer\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static ServiceResult ToObject(this ModbusForm form,\n            ReadOnlyMemory<byte> buffer, ref object? value)\n        {\n            switch (form.PayloadType)\n            {\n                case ModbusType.Xsdfloat:\n                    value = BitConverter.ToSingle(buffer.Span);\n                    break;\n                case ModbusType.Xsdinteger:\n                    value = BitConverter.ToInt32(buffer.Span);\n                    break;\n                case ModbusType.Xsdboolean:\n                    value = BitConverter.ToBoolean(buffer.Span);\n                    break;\n                case ModbusType.Xsdstring:\n                    value = Encoding.UTF8.GetString(buffer.Span);\n                    break;\n                case ModbusType.Xsddecimal:\n                    value = ToDecimal(buffer.Span);\n                    break;\n                case ModbusType.Xsdbyte:\n                    value = (sbyte)buffer.Span[0];\n                    break;\n                case ModbusType.Xsdshort:\n                    value = BitConverter.ToInt16(buffer.Span);\n                    break;\n                case ModbusType.Xsdint:\n                    value = BitConverter.ToInt32(buffer.Span);\n                    break;\n                case ModbusType.Xsdlong:\n                    value = BitConverter.ToInt64(buffer.Span);\n                    break;\n                case ModbusType.XsdunsignedByte:\n                    value = buffer.Span[0];\n                    break;\n                case ModbusType.XsdunsignedShort:\n                    value = BitConverter.ToUInt16(buffer.Span);\n                    break;\n                case ModbusType.XsdunsignedInt:\n                    value = BitConverter.ToUInt32(buffer.Span);\n                    break;\n                case ModbusType.XsdunsignedLong:\n                    value = BitConverter.ToUInt64(buffer.Span);\n                    break;\n                case ModbusType.Xsddouble:\n                    value = BitConverter.ToDouble(buffer.Span);\n                    break;\n                case ModbusType.XsdhexBinary:\n                    value = buffer.ToArray();\n                    break;\n                default:\n                    return ServiceResult.Create(StatusCodes.BadNotReadable,\n                        \"Invalid data type\");\n            }\n            return ServiceResult.Good;\n        }\n\n        private static decimal ToDecimal(ReadOnlySpan<byte> bytes)\n        {\n            var bits = new int[4];\n            bits[0] = bytes[0] | (bytes[1] << 8) | (bytes[2] << 0x10) | (bytes[3] << 0x18); //lo\n            bits[1] = bytes[4] | (bytes[5] << 8) | (bytes[6] << 0x10) | (bytes[7] << 0x18); //mid\n            bits[2] = bytes[8] | (bytes[9] << 8) | (bytes[10] << 0x10) | (bytes[11] << 0x18); //hi\n            bits[3] = bytes[12] | (bytes[13] << 8) | (bytes[14] << 0x10) | (bytes[15] << 0x18); //flags\n            return new decimal(bits);\n        }\n\n        private static byte[] GetBytes(decimal d)\n        {\n            var bytes = new byte[16];\n\n            var bits = decimal.GetBits(d);\n            var lo = bits[0];\n            var mid = bits[1];\n            var hi = bits[2];\n            var flags = bits[3];\n\n            bytes[0] = (byte)lo;\n            bytes[1] = (byte)(lo >> 8);\n            bytes[2] = (byte)(lo >> 0x10);\n            bytes[3] = (byte)(lo >> 0x18);\n            bytes[4] = (byte)mid;\n            bytes[5] = (byte)(mid >> 8);\n            bytes[6] = (byte)(mid >> 0x10);\n            bytes[7] = (byte)(mid >> 0x18);\n            bytes[8] = (byte)hi;\n            bytes[9] = (byte)(hi >> 8);\n            bytes[10] = (byte)(hi >> 0x10);\n            bytes[11] = (byte)(hi >> 0x18);\n            bytes[12] = (byte)flags;\n            bytes[13] = (byte)(flags >> 8);\n            bytes[14] = (byte)(flags >> 0x10);\n            bytes[15] = (byte)(flags >> 0x18);\n\n            return bytes;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/ModbusProtocol.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Opc.Ua;\n    using System;\n    using System.Buffers;\n    using System.Buffers.Binary;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n\n    internal static class ModbusProtocol\n    {\n        /// <summary>\n        /// Encapsulate MODBUS Application Protocol header\n        /// </summary>\n        /// <param name=\"TransactionId\"></param>\n        /// <param name=\"UnitId\"></param>\n        /// <param name=\"ProtocolId\"></param>\n        internal record struct Mbap(ushort TransactionId, byte UnitId, ushort ProtocolId = 0)\n        {\n            public const int Length = 7;\n        }\n\n        /// <summary>\n        /// Write a request to read modbus data\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"function\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantity\"></param>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        public static void EncodeReadRequest(this IBufferWriter<byte> writer,\n            ModbusFunction function, Mbap mbap, ushort startingAddress, ushort quantity)\n        {\n            switch (function)\n            {\n                case ModbusFunction.ReadCoil:\n                    writer.EncodeReadCoilsRequest(mbap, startingAddress, quantity);\n                    break;\n                case ModbusFunction.ReadDiscreteInput:\n                    writer.EncodeReadDiscreteInputRequest(mbap, startingAddress, quantity);\n                    break;\n                case ModbusFunction.ReadHoldingRegisters:\n                    writer.EncodeReadHoldingRegistersRequest(mbap, startingAddress, quantity);\n                    break;\n                case ModbusFunction.ReadInputRegisters:\n                    writer.EncodeReadInputRegistersRequest(mbap, startingAddress, quantity);\n                    break;\n                default:\n                    throw new NotSupportedException(\"Not a read request\");\n            }\n        }\n\n        /// <summary>\n        /// Write a request to write modbus data\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"function\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantity\"></param>\n        /// <param name=\"registersOrCoils\"></param>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        public static void WriteWriteRequest(this IBufferWriter<byte> writer,\n            ModbusFunction function, Mbap mbap, ushort startingAddress, ushort quantity,\n            ReadOnlySpan<byte> registersOrCoils)\n        {\n            switch (function)\n            {\n                case ModbusFunction.WriteSingleCoil:\n                    writer.EncodeWriteSingleCoilRequest(mbap, startingAddress,\n                        registersOrCoils);\n                    break;\n                case ModbusFunction.WriteMultipleCoils:\n                    writer.EncodeWriteMultipleCoilsRequest(mbap, startingAddress, quantity,\n                        registersOrCoils);\n                    break;\n                case ModbusFunction.WriteSingleHoldingRegister:\n                    writer.EncodeWriteSingleRegisterRequest(mbap, startingAddress,\n                        registersOrCoils);\n                    break;\n                case ModbusFunction.WriteMultipleHoldingRegisters:\n                    writer.EncodeWriteMultipleRegistersRequest(mbap, startingAddress, quantity,\n                        registersOrCoils);\n                    break;\n                default:\n                    throw new NotSupportedException(\"Not a write request\");\n            }\n        }\n\n        /// <summary>\n        /// Try to read the read response\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"function\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"error\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        public static bool TryReadReadResponse(this IBufferWriter<byte> writer,\n            ModbusFunction function, ref ReadOnlySequence<byte> response, ref ServiceResult error)\n        {\n            switch (function)\n            {\n                case ModbusFunction.ReadCoil:\n                    return writer.TryReadReadCoilsResponse(ref response, ref error);\n                case ModbusFunction.ReadDiscreteInput:\n                    return writer.TryReadReadDiscreteInputResponse(ref response, ref error);\n                case ModbusFunction.ReadHoldingRegisters:\n                    return writer.TryReadReadReadHoldingRegistersResponse(ref response, ref error);\n                case ModbusFunction.ReadInputRegisters:\n                    return writer.TryReadReadInputRegistersResponse(ref response, ref error);\n                default:\n                    throw new NotSupportedException(\"Not a read request\");\n            }\n        }\n\n        /// <summary>\n        /// Try to read the write response\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"function\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"outputAddress\"></param>\n        /// <param name=\"quantity\"></param>\n        /// <param name=\"registersOrCoils\"></param>\n        /// <param name=\"error\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"NotSupportedException\"></exception>\n        public static bool TryReadWriteResponse(this IBufferWriter<byte> writer,\n            ModbusFunction function, ref ReadOnlySequence<byte> response,\n            ushort outputAddress, ushort quantity, ReadOnlySpan<byte> registersOrCoils,\n            ref ServiceResult error)\n        {\n            switch (function)\n            {\n                case ModbusFunction.WriteSingleCoil:\n                    return writer.TryReadWriteSingleCoilResponse(ref response,\n                        outputAddress, registersOrCoils, ref error);\n                case ModbusFunction.WriteMultipleCoils:\n                    return writer.TryReadWriteMultipleCoilsResponse(ref response,\n                        outputAddress, quantity, ref error);\n                case ModbusFunction.WriteSingleHoldingRegister:\n                    return writer.TryReadWriteSingleRegisterResponse(ref response,\n                        outputAddress, registersOrCoils, ref error);\n                case ModbusFunction.WriteMultipleHoldingRegisters:\n                    return writer.TryReadWriteMultipleRegistersResponse(ref response,\n                        outputAddress, quantity, ref error);\n                default:\n                    throw new NotSupportedException(\"Not a read request\");\n            }\n        }\n\n        /// <summary>\n        /// Encode read coils request\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantityOfCoils\"></param>\n        public static void EncodeReadCoilsRequest(this IBufferWriter<byte> writer,\n            Mbap mbap, ushort startingAddress, ushort quantityOfCoils)\n        {\n            ArgumentOutOfRangeException.ThrowIfZero(quantityOfCoils);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(quantityOfCoils, 2000);\n            EncodeSimpleRequest(ModbusFunction.ReadCoil, mbap,\n                startingAddress, quantityOfCoils, writer);\n        }\n\n        /// <summary>\n        /// Try read coils response\n        /// </summary>\n        /// <param name=\"output\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"error\"></param>\n        /// <returns></returns>\n        public static bool TryReadReadCoilsResponse(this IBufferWriter<byte> output,\n            ref ReadOnlySequence<byte> response, ref ServiceResult error)\n        {\n            return TryReadBitResponse(ModbusFunction.ReadCoil, ref response,\n                output, ref error);\n        }\n\n        /// <summary>\n        /// Encode writing a single coil request\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"outputAddress\"></param>\n        /// <param name=\"outputValue\"></param>\n        public static void EncodeWriteSingleCoilRequest(this IBufferWriter<byte> writer,\n            Mbap mbap, ushort outputAddress, ReadOnlySpan<byte> outputValue)\n        {\n            ArgumentOutOfRangeException.ThrowIfLessThan(outputValue.Length, 1);\n            var onOff = outputValue[0] != 0 ? (ushort)0xFF00 : (ushort)0x0;\n            EncodeSimpleRequest(ModbusFunction.WriteSingleCoil, mbap,\n                outputAddress, onOff, writer);\n        }\n\n        public static bool TryReadWriteSingleCoilResponse(this IBufferWriter<byte> writer,\n            ref ReadOnlySequence<byte> reader, ushort outputAddress, ReadOnlySpan<byte> outputValue,\n            ref ServiceResult error)\n        {\n            Debug.Assert(writer != null);\n            ArgumentOutOfRangeException.ThrowIfLessThan(outputValue.Length, 1);\n            var onOff = outputValue[0] != 0 ? (ushort)0xFF00 : (ushort)0x0;\n            return TryReadEchoResponse(ModbusFunction.WriteSingleCoil, ref reader,\n                outputAddress, onOff, ref error);\n        }\n\n        public static void EncodeWriteMultipleCoilsRequest(this IBufferWriter<byte> writer,\n            Mbap mbap, ushort outputAddress, ushort quantityOfOutputs, ReadOnlySpan<byte> coilStates)\n        {\n            ArgumentOutOfRangeException.ThrowIfZero(quantityOfOutputs);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(quantityOfOutputs, 0x7b0);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(coilStates.Length, byte.MaxValue);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(quantityOfOutputs, coilStates.Length * 8);\n\n            EncodeWriteBitRequest(ModbusFunction.WriteMultipleCoils, mbap,\n                outputAddress, quantityOfOutputs, coilStates, writer);\n        }\n\n        public static bool TryReadWriteMultipleCoilsResponse(this IBufferWriter<byte> writer,\n            ref ReadOnlySequence<byte> response, ushort outputAddress, ushort quantityOfOutputs,\n            ref ServiceResult error)\n        {\n            Debug.Assert(writer != null);\n            return TryReadEchoResponse(ModbusFunction.WriteMultipleCoils, ref response,\n                outputAddress, quantityOfOutputs, ref error);\n        }\n\n        /// <summary>\n        /// Encode write single register request\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"outputAddress\"></param>\n        /// <param name=\"outputValue\"></param>\n        public static void EncodeWriteSingleRegisterRequest(this IBufferWriter<byte> writer,\n            Mbap mbap, ushort outputAddress, ReadOnlySpan<byte> outputValue)\n        {\n            ArgumentOutOfRangeException.ThrowIfLessThan(outputValue.Length, 2);\n            var value = BitConverter.ToUInt16(outputValue);\n            EncodeSimpleRequest(ModbusFunction.WriteSingleHoldingRegister, mbap,\n                outputAddress, value, writer);\n        }\n\n        /// <summary>\n        /// Try read write single register response\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"outputAddress\"></param>\n        /// <param name=\"outputValue\"></param>\n        /// <param name=\"error\"></param>\n        /// <returns></returns>\n        public static bool TryReadWriteSingleRegisterResponse(this IBufferWriter<byte> writer,\n            ref ReadOnlySequence<byte> response, ushort outputAddress, ReadOnlySpan<byte> outputValue,\n            ref ServiceResult error)\n        {\n            Debug.Assert(writer != null);\n            var value = BitConverter.ToUInt16(outputValue);\n            return TryReadEchoResponse(ModbusFunction.WriteSingleHoldingRegister, ref response,\n                outputAddress, value, ref error);\n        }\n\n        /// <summary>\n        /// Encode write multi register request\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"outputAddress\"></param>\n        /// <param name=\"quantityOfRegisters\"></param>\n        /// <param name=\"registers\"></param>\n        public static void EncodeWriteMultipleRegistersRequest(this IBufferWriter<byte> writer,\n            Mbap mbap, ushort outputAddress, ushort quantityOfRegisters, ReadOnlySpan<byte> registers)\n        {\n            ArgumentOutOfRangeException.ThrowIfZero(quantityOfRegisters);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(quantityOfRegisters, 123);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(quantityOfRegisters, registers.Length / 2);\n\n            EncodeWriteWordRequest(ModbusFunction.WriteMultipleHoldingRegisters, mbap,\n                outputAddress, quantityOfRegisters, registers, writer);\n        }\n\n        /// <summary>\n        /// Try read multi register response\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"outputAddress\"></param>\n        /// <param name=\"quantityOfRegisters\"></param>\n        /// <param name=\"error\"></param>\n        /// <returns></returns>\n        public static bool TryReadWriteMultipleRegistersResponse(this IBufferWriter<byte> writer,\n            ref ReadOnlySequence<byte> response, ushort outputAddress, ushort quantityOfRegisters,\n            ref ServiceResult error)\n        {\n            Debug.Assert(writer != null);\n            return TryReadEchoResponse(ModbusFunction.WriteMultipleHoldingRegisters, ref response,\n                outputAddress, quantityOfRegisters, ref error);\n        }\n\n        /// <summary>\n        /// Encode read discrete input request\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantityOfInputs\"></param>\n        public static void EncodeReadDiscreteInputRequest(this IBufferWriter<byte> writer,\n            Mbap mbap, ushort startingAddress, ushort quantityOfInputs)\n        {\n            ArgumentOutOfRangeException.ThrowIfZero(quantityOfInputs);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(quantityOfInputs, 2000);\n            EncodeSimpleRequest(ModbusFunction.ReadDiscreteInput, mbap,\n                startingAddress, quantityOfInputs, writer);\n        }\n\n        /// <summary>\n        /// Try read response from discrete input\n        /// </summary>\n        /// <param name=\"inputStatus\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"error\"></param>\n        /// <returns></returns>\n        public static bool TryReadReadDiscreteInputResponse(this IBufferWriter<byte> inputStatus,\n            ref ReadOnlySequence<byte> response, ref ServiceResult error)\n        {\n            return TryReadBitResponse(ModbusFunction.ReadDiscreteInput, ref response,\n                inputStatus, ref error);\n        }\n\n        /// <summary>\n        /// Encode read holding registers request\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantityOfRegisters\"></param>\n        public static void EncodeReadHoldingRegistersRequest(this IBufferWriter<byte> writer,\n            Mbap mbap, ushort startingAddress, ushort quantityOfRegisters)\n        {\n            ArgumentOutOfRangeException.ThrowIfZero(quantityOfRegisters);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(quantityOfRegisters, 125);\n            EncodeSimpleRequest(ModbusFunction.ReadHoldingRegisters, mbap,\n                startingAddress, quantityOfRegisters, writer);\n        }\n\n        /// <summary>\n        /// Try read holding registers response\n        /// </summary>\n        /// <param name=\"registerValues\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"error\"></param>\n        /// <returns></returns>\n        public static bool TryReadReadReadHoldingRegistersResponse(this IBufferWriter<byte> registerValues,\n            ref ReadOnlySequence<byte> response, ref ServiceResult error)\n        {\n            return TryReadRegisterResponse(ModbusFunction.ReadHoldingRegisters,\n                ref response, registerValues, ref error);\n        }\n\n        /// <summary>\n        /// Encode read input registers request\n        /// </summary>\n        /// <param name=\"writer\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantityOfInputRegisters\"></param>\n        public static void EncodeReadInputRegistersRequest(this IBufferWriter<byte> writer,\n            Mbap mbap, ushort startingAddress, ushort quantityOfInputRegisters)\n        {\n            ArgumentOutOfRangeException.ThrowIfZero(quantityOfInputRegisters);\n            ArgumentOutOfRangeException.ThrowIfGreaterThan(quantityOfInputRegisters, 0x7D);\n            EncodeSimpleRequest(ModbusFunction.ReadInputRegisters, mbap,\n                startingAddress, quantityOfInputRegisters, writer);\n        }\n\n        /// <summary>\n        /// Try read input registers response\n        /// </summary>\n        /// <param name=\"registerValues\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"error\"></param>\n        /// <returns></returns>\n        public static bool TryReadReadInputRegistersResponse(this IBufferWriter<byte> registerValues,\n            ref ReadOnlySequence<byte> response, ref ServiceResult error)\n        {\n            return TryReadRegisterResponse(ModbusFunction.ReadInputRegisters,\n                ref response, registerValues, ref error);\n        }\n\n        /// <summary>\n        /// Write a modbus request to read a quantity of coils or registers\n        /// </summary>\n        /// <param name=\"function\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantityOrOutputValue\"></param>\n        /// <param name=\"writer\"></param>\n        private static void EncodeSimpleRequest(ModbusFunction function,\n            Mbap mbap, ushort startingAddress, ushort quantityOrOutputValue,\n            IBufferWriter<byte> writer)\n        {\n            const int length = Mbap.Length + 5;\n            var adu = writer.GetSpan(length);\n\n            var request = adu.Slice(Mbap.Length, 5);\n            WriteMbap(mbap, request.Length, adu);\n            WriteRequestHeader(function, startingAddress, quantityOrOutputValue,\n                request);\n\n            writer.Advance(length);\n        }\n\n        /// <summary>\n        /// Write a modbus request with a buffer and buffer count\n        /// </summary>\n        /// <param name=\"function\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantity\"></param>\n        /// <param name=\"bitBuffer\"></param>\n        /// <param name=\"writer\"></param>\n        private static void EncodeWriteBitRequest(ModbusFunction function,\n            Mbap mbap, ushort startingAddress, ushort quantity,\n            ReadOnlySpan<byte> bitBuffer, IBufferWriter<byte> writer)\n        {\n            var length = Mbap.Length + 6 + bitBuffer.Length;\n            var adu = writer.GetSpan(length);\n\n            var request = adu[Mbap.Length..length];\n            WriteRequestHeader(function, startingAddress, quantity, request);\n            request[5] = (byte)bitBuffer.Length;\n            bitBuffer.CopyTo(request[6..]);\n            WriteMbap(mbap, request.Length, adu);\n            writer.Advance(length);\n        }\n\n        /// <summary>\n        /// Write a modbus request with a buffer and buffer count\n        /// </summary>\n        /// <param name=\"function\"></param>\n        /// <param name=\"mbap\"></param>\n        /// <param name=\"startingAddress\"></param>\n        /// <param name=\"quantity\"></param>\n        /// <param name=\"words\"></param>\n        /// <param name=\"writer\"></param>\n        private static void EncodeWriteWordRequest(ModbusFunction function,\n            Mbap mbap, ushort startingAddress, ushort quantity, ReadOnlySpan<byte> words,\n            IBufferWriter<byte> writer)\n        {\n            var length = Mbap.Length + 6 + words.Length;\n            var adu = writer.GetSpan(length);\n\n            var request = adu[Mbap.Length..length];\n            WriteRequestHeader(function, startingAddress, quantity, request);\n            request[5] = (byte)words.Length;\n\n            CopyWords(words, request[6..]);\n            WriteMbap(mbap, request.Length, adu);\n            writer.Advance(length);\n        }\n\n        /// <summary>\n        /// Read and validate echo response\n        /// </summary>\n        /// <param name=\"function\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"outputAddress\"></param>\n        /// <param name=\"outputValue\"></param>\n        /// <param name=\"error\"></param>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private static bool TryReadEchoResponse(ModbusFunction function,\n            ref ReadOnlySequence<byte> response, ushort outputAddress, ushort outputValue,\n            ref ServiceResult error)\n        {\n            var reader = new SequenceReader<byte>(response);\n            if (!TryReadFunctionOrError(ref reader, function, ref error) ||\n                !reader.TryReadBigEndian(out short address) ||\n                !reader.TryReadBigEndian(out short value))\n            {\n                return false;\n            }\n            if (outputAddress != address || value != outputValue)\n            {\n                // Should not happen - reconnect\n                throw new ServiceResultException(\n                    \"Unexpected address or value returned in echo response\");\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// Read coils or input states from response\n        /// </summary>\n        /// <param name=\"function\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"inputStatus\"></param>\n        /// <param name=\"error\"></param>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private static bool TryReadBitResponse(ModbusFunction function,\n            ref ReadOnlySequence<byte> response, IBufferWriter<byte> inputStatus,\n            ref ServiceResult error)\n        {\n            var reader = new SequenceReader<byte>(response);\n            if (!TryReadFunctionOrError(ref reader, function, ref error) ||\n                !reader.TryReadBigEndian(out short byteCount))\n            {\n                return false;\n            }\n            if (reader.UnreadSpan.Length < byteCount)\n            {\n                return false;\n            }\n            inputStatus.Write(reader.UnreadSpan[byteCount..]);\n            reader.Advance(byteCount);\n            return true;\n        }\n\n        /// <summary>\n        /// Read register values from response\n        /// </summary>\n        /// <param name=\"function\"></param>\n        /// <param name=\"response\"></param>\n        /// <param name=\"registerValues\"></param>\n        /// <param name=\"error\"></param>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private static bool TryReadRegisterResponse(ModbusFunction function,\n            ref ReadOnlySequence<byte> response, IBufferWriter<byte> registerValues,\n            ref ServiceResult error)\n        {\n            var reader = new SequenceReader<byte>(response);\n            return\n                TryReadFunctionOrError(ref reader, function, ref error) &&\n                reader.TryReadBigEndian(out short byteCount) &&\n                TryCopyWords(ref reader, registerValues, byteCount);\n        }\n\n        /// <summary>\n        /// Copy from reader to span\n        /// </summary>\n        /// <param name=\"reader\"></param>\n        /// <param name=\"registerValues\"></param>\n        /// <param name=\"byteCount\"></param>\n        /// <returns></returns>\n        private static bool TryCopyWords(ref SequenceReader<byte> reader,\n            IBufferWriter<byte> registerValues, short byteCount)\n        {\n            var span = registerValues.GetSpan(byteCount);\n            Span<byte> tmp = stackalloc byte[2];\n            for (var i = 0; i < byteCount; i += 2)\n            {\n                if (!reader.TryRead(out tmp[0]) || !reader.TryRead(out tmp[1]))\n                {\n                    return false;\n                }\n                if (BitConverter.IsLittleEndian)\n                {\n                    // Convert from big endian by swapping\n                    span[i + 1] = tmp[0];\n                    span[i] = tmp[1];\n                }\n                else\n                {\n                    span[i] = tmp[0];\n                    span[1 + 1] = tmp[1];\n                }\n            }\n            registerValues.Advance(byteCount);\n            return true;\n        }\n\n        /// <summary>\n        /// Copy words from span to span\n        /// </summary>\n        /// <param name=\"reader\"></param>\n        /// <param name=\"span\"></param>\n        private static void CopyWords(ReadOnlySpan<byte> reader,\n            Span<byte> span)\n        {\n            Debug.Assert(span.Length == reader.Length);\n            if (BitConverter.IsLittleEndian)\n            {\n                // Convert from big endian by swapping\n                for (var i = 0; i < reader.Length; i += 2)\n                {\n                    span[i + 1] = reader[i];\n                    span[i] = reader[i + 1];\n                }\n            }\n            else\n            {\n                reader.CopyTo(span);\n            }\n        }\n\n        private static void WriteRequestHeader(ModbusFunction function,\n            ushort startingAddress, ushort quantity, Span<byte> buffer)\n        {\n            buffer[0] = (byte)function;\n            BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(1, 2), startingAddress);\n            BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(3, 2), quantity);\n        }\n\n        private static void WriteMbap(Mbap mbap, int length, Span<byte> buffer)\n        {\n            Debug.Assert(buffer.Length >= Mbap.Length);\n            BinaryPrimitives.WriteUInt16BigEndian(buffer[..2], mbap.TransactionId);\n            BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(2, 2), mbap.ProtocolId);\n            // length is the number of bytes following this field which includes unitid\n            BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(4, 2), (ushort)(length + 1));\n            buffer[6] = mbap.UnitId;\n        }\n\n        private static bool TryReadFunctionOrError(ref SequenceReader<byte> reader,\n            ModbusFunction function, ref ServiceResult error)\n        {\n            if (reader.TryRead(out var functionCode))\n            {\n                if (functionCode == (byte)function)\n                {\n                    return true;\n                }\n                else if ((functionCode & ~0x80) == (byte)function)\n                {\n                    if (reader.TryRead(out var errorCode))\n                    {\n                        error = ToServiceResult(errorCode);\n                        return true;\n                    }\n                }\n                else\n                {\n                    ThrowBadResponse();\n                }\n            }\n            return false;\n\n            [DoesNotReturn]\n            static void ThrowBadResponse() => throw new ServiceResultException(\"Bad response\");\n\n            static ServiceResult ToServiceResult(byte errorCode)\n            {\n                switch (errorCode)\n                {\n                    case 1: return new ServiceResult(StatusCodes.Bad, \"Illegal function\");\n                    case 2: return new ServiceResult(StatusCodes.Bad, \"Illegal data address\");\n                    case 3: return new ServiceResult(StatusCodes.Bad, \"Illegal data value\");\n                    case 4: return new ServiceResult(StatusCodes.Bad, \"Server failure\");\n                    case 5: return new ServiceResult(StatusCodes.Bad, \"Acknowledge\");\n                    case 6: return new ServiceResult(StatusCodes.Bad, \"Server busy\");\n                    case 7: return new ServiceResult(StatusCodes.Bad, \"Negative acknowledge\");\n                    case 8: return new ServiceResult(StatusCodes.Bad, \"Memory parity error\");\n                    case 10: return new ServiceResult(StatusCodes.Bad, \"Gateway path unavailable\");\n                    case 11: return new ServiceResult(StatusCodes.Bad, \"Target unit failed to respond\");\n                    default: return new ServiceResult(StatusCodes.Bad, \"Unknown error\");\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/ModbusTcpAsset.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using System;\n    using System.Buffers;\n    using System.Diagnostics;\n    using System.Diagnostics.CodeAnalysis;\n    using System.Globalization;\n    using System.IO.Pipelines;\n    using System.Net.Sockets;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// See https://w3c.github.io/wot-binding-templates/bindings/protocols/modbus/\n    /// </summary>\n    internal sealed class ModbusTcpAsset : IAsset, IAssetFactory\n    {\n        private ModbusTcpAsset(Uri address, ILogger logger)\n        {\n            _logger = logger;\n\n            // check if we can reach the Modbus asset\n            _unitId = byte.Parse(address.PathAndQuery, CultureInfo.InvariantCulture);\n\n            _address = address;\n            Reconnect();\n        }\n\n        public static bool TryConnect(Uri tdBase, ILogger logger,\n            [NotNullWhen(true)] out IAsset? asset)\n        {\n            // Create modbus asset\n            if (tdBase.Scheme != \"modbus+tcp\")\n            {\n                asset = default;\n                return false;\n            }\n\n            asset = new ModbusTcpAsset(tdBase, logger);\n            return true;\n        }\n\n        public void Dispose()\n        {\n            try\n            {\n                _tcpClient?.Dispose();\n                _tcpClient = null;\n            }\n            finally\n            {\n                _lock.Dispose();\n            }\n        }\n\n        public ServiceResult Read(AssetTag tag, ref object? value)\n        {\n            if (tag is not AssetTag<ModbusForm> modbusTag)\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidArgument, \"Not a modbus tag\");\n            }\n            // {address}?quantity={?quantity}\n            if (!ushort.TryParse(modbusTag.Address.LocalPath, CultureInfo.InvariantCulture,\n                out var registerAddress))\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidArgument, \"Not a register address\");\n            }\n            var form = modbusTag.Form;\n            var function = form.Entity switch\n            {\n                ModbusEntity.Coil => ModbusFunction.ReadCoil,\n                ModbusEntity.DiscreteInput => ModbusFunction.ReadDiscreteInput,\n                ModbusEntity.HoldingRegister => ModbusFunction.ReadHoldingRegisters,\n                ModbusEntity.InputRegister => ModbusFunction.ReadInputRegisters,\n                _ => form.Function ?? ModbusFunction.ReadHoldingRegisters\n            };\n            // Read the amount of registers/coils referenced in this URL\n            var queryParts = modbusTag.Address.Query.Split(['?', '&', '='],\n                StringSplitOptions.RemoveEmptyEntries);\n            ushort quantity = kDefaultQuantity;\n            if (queryParts.Length > 0)\n            {\n                if (queryParts.Length != 2 || queryParts[0] != \"quantity\" ||\n                    !ushort.TryParse(queryParts[1], CultureInfo.InvariantCulture, out quantity))\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                        \"Invalid quantity in query.\");\n                }\n            }\n            var timeout = form.Timeout ?? kDefaultTimeout;\n            try\n            {\n                var tagBytes = ReadAsync(function, registerAddress, quantity, timeout)\n                    .GetAwaiter().GetResult();\n                return form.ToObject(tagBytes, ref value);\n            }\n            catch (ServiceResultException sre)\n            {\n                return sre.Result;\n            }\n        }\n\n        public ServiceResult Write(AssetTag tag, ref object value)\n        {\n            if (tag is not AssetTag<ModbusForm> modbusTag)\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                    \"Not a modbus tag\");\n            }\n            // {address}?quantity={?quantity}\n            if (!ushort.TryParse(modbusTag.Address.LocalPath, CultureInfo.InvariantCulture,\n                out var registerAddress))\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                    \"Not a register address\");\n            }\n\n            var form = modbusTag.Form;\n            // Read the amount of registers/coils referenced in this URL\n            var queryParts = modbusTag.Address.Query.Split(['?', '&', '='],\n                StringSplitOptions.RemoveEmptyEntries);\n            ushort quantity = kDefaultQuantity;\n            if (queryParts.Length > 0)\n            {\n                if (queryParts.Length != 2 || queryParts[0] != \"quantity\" ||\n                    !ushort.TryParse(queryParts[1], CultureInfo.InvariantCulture,\n                    out quantity))\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                        \"Invalid quantity in query.\");\n                }\n            }\n            var function = form.Entity switch\n            {\n                ModbusEntity.DiscreteInput or ModbusEntity.InputRegister\n                    => (ModbusFunction?)null, // Invalid\n                ModbusEntity.Coil when quantity == 1\n                    => ModbusFunction.WriteSingleCoil,\n                ModbusEntity.Coil\n                    => ModbusFunction.WriteMultipleCoils,\n                ModbusEntity.HoldingRegister when quantity == 1\n                    => ModbusFunction.WriteSingleHoldingRegister,\n                ModbusEntity.HoldingRegister\n                    => ModbusFunction.WriteMultipleHoldingRegisters,\n                _ => form.Function ?? ModbusFunction.WriteSingleCoil\n            };\n            if (!function.HasValue)\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                    \"Function or entity not supported\");\n            }\n            var timeout = form.Timeout ?? kDefaultTimeout;\n            try\n            {\n                WriteAsync(function.Value, registerAddress, quantity, timeout,\n                    form.ToBuffer(value)).GetAwaiter().GetResult();\n                return ServiceResult.Good;\n            }\n            catch (ServiceResultException sre)\n            {\n                return sre.Result;\n            }\n        }\n\n        public void Observe(AssetTag tag, uint id, OnAssetTagChange callback)\n        {\n            if (tag is not AssetTag<ModbusForm>)\n            {\n                throw ServiceResultException.Create(StatusCodes.BadInvalidArgument,\n                    \"Not a modbus tag\");\n            }\n\n            // TODO: Implement polling\n        }\n\n        public void Unobserve(AssetTag tag, uint id)\n        {\n            if (tag is not AssetTag<ModbusForm>)\n            {\n                throw ServiceResultException.Create(StatusCodes.BadInvalidArgument,\n                    \"Not a modbus tag\");\n            }\n\n            // TODO: Implement polling\n        }\n\n        private async Task WriteAsync(ModbusFunction function, ushort address, ushort quantity,\n            int timeout, ReadOnlyMemory<byte> values, CancellationToken ct = default)\n        {\n            await _lock.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                ObjectDisposedException.ThrowIf(_tcpClient == null, this);\n                _tcpClient.SendTimeout = timeout;\n                _tcpClient.ReceiveTimeout = timeout;\n\n                Debug.Assert(_writer != null);\n                Debug.Assert(_reader != null);\n\n                var mbap = new ModbusProtocol.Mbap(_transactionID++, _unitId);\n                _writer.WriteWriteRequest(function, mbap, address, quantity, values.Span);\n                // send request to Modbus server\n                await _writer.FlushAsync(ct).ConfigureAwait(false);\n\n                // TODO: go full duplex using transaction id\n                var error = ServiceResult.Good;\n                while (true)\n                {\n                    var result = await _reader.ReadAsync(ct).ConfigureAwait(false);\n                    if (result.IsCanceled)\n                    {\n                        throw new TimeoutException();\n                    }\n                    var buffer = result.Buffer;\n\n                    var responseBuffer = new ArrayBufferWriter<byte>();\n                    if (!responseBuffer.TryReadWriteResponse(function,\n                        ref buffer, address, quantity, values.Span, ref error))\n                    {\n                        // More must be read to completely parse the response\n                        continue;\n                    }\n\n                    //\n                    // All has been read that is to be read or we would have\n                    // thrown here, advance to the end so that next read can\n                    // start\n                    //\n                    _reader.AdvanceTo(buffer.End);\n\n                    // Check error received and throw if not good\n                    if (error != ServiceResult.Good)\n                    {\n                        throw new ServiceResultException(error);\n                    }\n                    return; // Done\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.ModbusTcpAssetError(ex);\n                Reconnect();\n                throw;\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        private async Task<ReadOnlyMemory<byte>> ReadAsync(ModbusFunction function,\n            ushort address, ushort quantity, int timeout, CancellationToken ct = default)\n        {\n            await _lock.WaitAsync(ct).ConfigureAwait(false);\n            try\n            {\n                ObjectDisposedException.ThrowIf(_tcpClient == null, this);\n                _tcpClient.SendTimeout = timeout;\n                _tcpClient.ReceiveTimeout = timeout;\n\n                Debug.Assert(_writer != null);\n                Debug.Assert(_reader != null);\n\n                var mbap = new ModbusProtocol.Mbap(_transactionID++, _unitId);\n                _writer.EncodeReadRequest(function, mbap, address, quantity);\n                // send request to Modbus server\n                await _writer.FlushAsync(ct).ConfigureAwait(false);\n\n                // TODO: go full duplex using transaction id\n                var error = ServiceResult.Good;\n                while (true)\n                {\n                    var result = await _reader.ReadAsync(ct).ConfigureAwait(false);\n                    if (result.IsCanceled)\n                    {\n                        throw new TimeoutException();\n                    }\n                    var buffer = result.Buffer;\n\n                    var responseBuffer = new ArrayBufferWriter<byte>();\n                    if (!responseBuffer.TryReadReadResponse(function,\n                        ref buffer, ref error))\n                    {\n                        // More must be read to completely parse the response\n                        continue;\n                    }\n\n                    //\n                    // All has been read that is to be read or we would have\n                    // thrown here, advance to the end so that next read can\n                    // start\n                    //\n                    _reader.AdvanceTo(buffer.End);\n\n                    // Check error received and throw if not good\n                    if (error != ServiceResult.Good)\n                    {\n                        throw new ServiceResultException(error);\n                    }\n                    return responseBuffer.WrittenMemory;\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.ModbusTcpAssetError(ex);\n                Reconnect();\n                throw;\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        private void Reconnect()\n        {\n            Debug.Assert(_lock.CurrentCount == 0,\n                \"Reconnect should not be called concurrently\");\n            _tcpClient?.Dispose();\n            var port = _address.Port == 0 ? kIanaPort : _address.Port;\n            _tcpClient = new TcpClient(_address.IdnHost, port);\n            var stream = _tcpClient.GetStream();\n            _writer = PipeWriter.Create(stream);\n            _reader = PipeReader.Create(stream);\n        }\n\n        private const int kDefaultQuantity = 1;\n        private const int kIanaPort = 502;\n        /// <summary>\n        /// private const bool kDefaultZeroBaseAddressing = false;\n        /// private const bool kDefaultMostSignificantByte = true;\n        /// private const bool kDefaultMostSignificantWord = true;\n        /// </summary>\n        private const int kDefaultTimeout = Timeout.Infinite;\n        private ushort _transactionID;\n        private readonly byte _unitId;\n        private readonly ILogger _logger;\n        private readonly Uri _address;\n        private readonly SemaphoreSlim _lock = new(1, 1);\n        private TcpClient? _tcpClient;\n        private PipeReader? _reader;\n        private PipeWriter? _writer;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for ModbusTcpAsset\n    /// </summary>\n    internal static partial class ModbusTcpAssetLogging\n    {\n        private const int EventClass = 20;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Error\")]\n        public static partial void ModbusTcpAssetError(this ILogger logger, Exception ex);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/Namespaces.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\n#nullable enable\n\nnamespace Asset\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the server.\n        /// </summary>\n        public const string AssetServer = \"http://opcfoundation.org/AssetServer\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/Samples/SimulatedAsset.td.jsonld",
    "content": "{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:sim3264\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"sim-3264\",\n    \"base\": \"sim://simserver1:443\",\n    \"title\": \"Simulated Asset\",\n    \"properties\": {\n        \"VoltageL1-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"3\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"5\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL1-L2\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"7\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-L3\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"9\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-L1\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"11\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"13\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"15\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"17\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"19\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"139\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"141\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalApparentPower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"63\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalActivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"65\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalReactivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"67\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalPowerFactor\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"69\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/SimulatedAsset.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Threading;\n    using System.Xml;\n    using TestData;\n\n    public sealed class SimulatedAsset : IAsset\n    {\n        public ServiceResult Read(AssetTag tag, ref object? value)\n        {\n            return GetTag(tag).Read(ref value);\n        }\n\n        public ServiceResult Write(AssetTag tag, ref object value)\n        {\n            return GetTag(tag).Write(value);\n        }\n\n        public void Observe(AssetTag tag, uint id, OnAssetTagChange callback)\n        {\n            GetTag(tag).Observe(id, callback);\n        }\n\n        public void Unobserve(AssetTag tag, uint id)\n        {\n            ArgumentNullException.ThrowIfNull(tag.Address);\n            if (_tags.TryGetValue(tag.Address, out var assetTag))\n            {\n                assetTag.Unobserve(id);\n            }\n        }\n\n        public void Dispose()\n        {\n            foreach (var tag in _tags.Values)\n            {\n                tag.Dispose();\n            }\n            _tags.Clear();\n        }\n\n        private SimulatedTag GetTag(AssetTag tag)\n        {\n            if (tag is not AssetTag<SimulatedForm> simTag)\n            {\n                throw ServiceResultException.Create(StatusCodes.BadInvalidArgument,\n                    \"Not a simulated tag\");\n            }\n            ArgumentNullException.ThrowIfNull(tag.Address);\n            return _tags.GetOrAdd(tag.Address, _ => new SimulatedTag(this, simTag));\n        }\n\n        /// <summary>\n        /// Simulated tag\n        /// </summary>\n        internal sealed record class SimulatedTag : IDisposable\n        {\n            public SimulatedAsset Asset { get; }\n\n            public AssetTag<SimulatedForm> Tag { get; }\n\n            /// <summary>\n            /// Create tag\n            /// </summary>\n            /// <param name=\"asset\"></param>\n            /// <param name=\"tag\"></param>\n            public SimulatedTag(SimulatedAsset asset, AssetTag<SimulatedForm> tag)\n            {\n                Asset = asset;\n                Tag = tag;\n                _timer = new Timer(PollValue);\n            }\n\n            public void Dispose()\n            {\n                _timer.Dispose();\n            }\n\n#pragma warning disable IDE0060 // Remove unused parameter\n            public void Observe(uint id, OnAssetTagChange callback)\n#pragma warning restore IDE0060 // Remove unused parameter\n            {\n                if (Interlocked.Increment(ref _monitoringCount) == 1)\n                {\n                    _callback = callback;\n                    _timer.Change(Tag.Form.PollingTime, Tag.Form.PollingTime);\n                }\n            }\n\n#pragma warning disable IDE0060 // Remove unused parameter\n            public void Unobserve(uint id)\n#pragma warning restore IDE0060 // Remove unused parameter\n            {\n                if (Interlocked.Decrement(ref _monitoringCount) == 0)\n                {\n                    _timer.Change(Timeout.Infinite, Timeout.Infinite);\n                }\n            }\n\n            public ServiceResult Write(object value)\n            {\n                throw new NotImplementedException();\n            }\n\n            public ServiceResult Read(ref object? value)\n            {\n                var dataType = Tag.Form.GetDataTypeId();\n                if (NodeId.IsNull(dataType))\n                {\n                    return ServiceResult.Create(StatusCodes.BadDataTypeIdUnknown, \"Bad payload\");\n                }\n                if (Tag.Form.IsArray)\n                {\n                    value = dataType.Identifier switch\n                    {\n                        Opc.Ua.DataTypes.Boolean => _generator.GetRandomArray<bool>(),\n                        Opc.Ua.DataTypes.SByte => _generator.GetRandomArray<sbyte>(),\n                        Opc.Ua.DataTypes.Byte => _generator.GetRandomArray<byte>(),\n                        Opc.Ua.DataTypes.Int16 => _generator.GetRandomArray<short>(),\n                        Opc.Ua.DataTypes.UInt16 => _generator.GetRandomArray<ushort>(),\n                        Opc.Ua.DataTypes.Int32 => _generator.GetRandomArray<int>(),\n                        Opc.Ua.DataTypes.UInt32 => _generator.GetRandomArray<uint>(),\n                        Opc.Ua.DataTypes.Int64 => _generator.GetRandomArray<long>(),\n                        Opc.Ua.DataTypes.UInt64 => _generator.GetRandomArray<ulong>(),\n                        Opc.Ua.DataTypes.Float => _generator.GetRandomArray<float>(),\n                        Opc.Ua.DataTypes.Double => _generator.GetRandomArray<double>(),\n                        Opc.Ua.DataTypes.String => _generator.GetRandomArray<string>(),\n                        Opc.Ua.DataTypes.DateTime => _generator.GetRandomArray<DateTime>(),\n                        Opc.Ua.DataTypes.Guid => _generator.GetRandomArray<Guid>(),\n                        Opc.Ua.DataTypes.ByteString => _generator.GetRandomArray<byte[]>(),\n                        Opc.Ua.DataTypes.XmlElement => _generator.GetRandomArray<XmlElement>(),\n                        Opc.Ua.DataTypes.NodeId => _generator.GetRandomArray<NodeId>(),\n                        Opc.Ua.DataTypes.ExpandedNodeId => _generator.GetRandomArray<ExpandedNodeId>(),\n                        Opc.Ua.DataTypes.QualifiedName => _generator.GetRandomArray<QualifiedName>(),\n                        Opc.Ua.DataTypes.LocalizedText => _generator.GetRandomArray<LocalizedText>(),\n                        Opc.Ua.DataTypes.StatusCode => _generator.GetRandomArray<StatusCode>(),\n                        Opc.Ua.DataTypes.BaseDataType => _generator.GetRandomArray<object>(),\n                        Opc.Ua.DataTypes.Enumeration => _generator.GetRandomArray<int>(),\n                        Opc.Ua.DataTypes.Number => _generator.GetRandomArray(BuiltInType.Number, 100, false),\n                        Opc.Ua.DataTypes.Integer => _generator.GetRandomArray(BuiltInType.Integer, 100, false),\n                        Opc.Ua.DataTypes.UInteger => _generator.GetRandomArray(BuiltInType.UInteger, 100, false),\n                        Opc.Ua.DataTypes.Structure => GetRandomArray(),\n                        _ => null\n                    };\n                    return ServiceResult.Good;\n                }\n\n                value = dataType.Identifier switch\n                {\n                    Opc.Ua.DataTypes.Boolean => _generator.GetRandom<bool>(),\n                    Opc.Ua.DataTypes.SByte => _generator.GetRandom<sbyte>(),\n                    Opc.Ua.DataTypes.Byte => _generator.GetRandom<byte>(),\n                    Opc.Ua.DataTypes.Int16 => _generator.GetRandom<short>(),\n                    Opc.Ua.DataTypes.UInt16 => _generator.GetRandom<ushort>(),\n                    Opc.Ua.DataTypes.Int32 => _generator.GetRandom<int>(),\n                    Opc.Ua.DataTypes.UInt32 => _generator.GetRandom<uint>(),\n                    Opc.Ua.DataTypes.Int64 => _generator.GetRandom<long>(),\n                    Opc.Ua.DataTypes.UInt64 => _generator.GetRandom<ulong>(),\n                    Opc.Ua.DataTypes.Float => _generator.GetRandom<float>(),\n                    Opc.Ua.DataTypes.Double => _generator.GetRandom<double>(),\n                    Opc.Ua.DataTypes.String => _generator.GetRandom<string>(),\n                    Opc.Ua.DataTypes.DateTime => _generator.GetRandom<DateTime>(),\n                    Opc.Ua.DataTypes.Guid => _generator.GetRandom<Guid>(),\n                    Opc.Ua.DataTypes.ByteString => _generator.GetRandom<byte[]>(),\n                    Opc.Ua.DataTypes.XmlElement => _generator.GetRandom<XmlElement>(),\n                    Opc.Ua.DataTypes.NodeId => _generator.GetRandom<NodeId>(),\n                    Opc.Ua.DataTypes.ExpandedNodeId => _generator.GetRandom<ExpandedNodeId>(),\n                    Opc.Ua.DataTypes.QualifiedName => _generator.GetRandom<QualifiedName>(),\n                    Opc.Ua.DataTypes.LocalizedText => _generator.GetRandom<LocalizedText>(),\n                    Opc.Ua.DataTypes.StatusCode => _generator.GetRandom<StatusCode>(),\n                    Opc.Ua.DataTypes.BaseDataType => _generator.GetRandomVariant().Value,\n                    Opc.Ua.DataTypes.Structure => GetRandomStructure(),\n                    Opc.Ua.DataTypes.Enumeration => _generator.GetRandom<int>(),\n                    Opc.Ua.DataTypes.Number => _generator.GetRandom(BuiltInType.Number),\n                    Opc.Ua.DataTypes.Integer => _generator.GetRandom(BuiltInType.Integer),\n                    Opc.Ua.DataTypes.UInteger => _generator.GetRandom(BuiltInType.UInteger),\n                    _ => null\n                };\n\n                return ServiceResult.Good;\n\n                ExtensionObject[]? GetRandomArray()\n                {\n                    var values = _generator.GetRandomArray<ExtensionObject>(10);\n                    for (var i = 0; values != null && i < values.Length; i++)\n                    {\n                        values[i] = GetRandomStructure();\n                    }\n                    return values;\n                }\n\n                ExtensionObject GetRandomStructure()\n                {\n                    if (_generator.GetRandomBoolean())\n                    {\n                        var scalar = new ScalarValueDataType\n                        {\n                            BooleanValue = _generator.GetRandom<bool>(),\n                            SByteValue = _generator.GetRandom<sbyte>(),\n                            ByteValue = _generator.GetRandom<byte>(),\n                            Int16Value = _generator.GetRandom<short>(),\n                            UInt16Value = _generator.GetRandom<ushort>(),\n                            Int32Value = _generator.GetRandom<int>(),\n                            UInt32Value = _generator.GetRandom<uint>(),\n                            Int64Value = _generator.GetRandom<long>(),\n                            UInt64Value = _generator.GetRandom<ulong>(),\n                            FloatValue = _generator.GetRandom<float>(),\n                            DoubleValue = _generator.GetRandom<double>(),\n                            StringValue = _generator.GetRandom<string>(),\n                            DateTimeValue = _generator.GetRandom<DateTime>(),\n                            GuidValue = _generator.GetRandom<Uuid>(),\n                            ByteStringValue = _generator.GetRandom<byte[]>(),\n                            XmlElementValue = _generator.GetRandom<XmlElement>(),\n                            NodeIdValue = _generator.GetRandom<NodeId>(),\n                            ExpandedNodeIdValue = _generator.GetRandom<ExpandedNodeId>(),\n                            QualifiedNameValue = _generator.GetRandom<QualifiedName>(),\n                            LocalizedTextValue = _generator.GetRandom<LocalizedText>(),\n                            StatusCodeValue = _generator.GetRandom<StatusCode>(),\n                            VariantValue = _generator.GetRandomVariant()\n                        };\n                        return new ExtensionObject(scalar);\n                    }\n                    var array = new ArrayValueDataType\n                    {\n                        BooleanValue = _generator.GetRandomArray<bool>(10),\n                        SByteValue = _generator.GetRandomArray<sbyte>(10),\n                        ByteValue = _generator.GetRandomArray<byte>(10),\n                        Int16Value = _generator.GetRandomArray<short>(10),\n                        UInt16Value = _generator.GetRandomArray<ushort>(10),\n                        Int32Value = _generator.GetRandomArray<int>(10),\n                        UInt32Value = _generator.GetRandomArray<uint>(10),\n                        Int64Value = _generator.GetRandomArray<long>(10),\n                        UInt64Value = _generator.GetRandomArray<ulong>(10),\n                        FloatValue = _generator.GetRandomArray<float>(10),\n                        DoubleValue = _generator.GetRandomArray<double>(10),\n                        StringValue = _generator.GetRandomArray<string>(10),\n                        DateTimeValue = _generator.GetRandomArray<DateTime>(10),\n                        GuidValue = _generator.GetRandomArray<Uuid>(10),\n                        ByteStringValue = _generator.GetRandomArray<byte[]>(10),\n                        XmlElementValue = _generator.GetRandomArray<XmlElement>(10),\n                        NodeIdValue = _generator.GetRandomArray<NodeId>(10),\n                        ExpandedNodeIdValue = _generator.GetRandomArray<ExpandedNodeId>(10),\n                        QualifiedNameValue = _generator.GetRandomArray<QualifiedName>(10),\n                        LocalizedTextValue = _generator.GetRandomArray<LocalizedText>(10),\n                        StatusCodeValue = _generator.GetRandomArray<StatusCode>(10)\n                    };\n\n                    var values = _generator.GetRandomArray<object>(10);\n                    for (var i = 0; values != null && i < values.Length; i++)\n                    {\n                        array.VariantValue.Add(new Variant(values[i]));\n                    }\n\n                    return new ExtensionObject(array.TypeId, array);\n                }\n            }\n\n            private void PollValue(object? state)\n            {\n                object? value = null;\n                var result = Read(ref value);\n                _callback?.Invoke(Tag, value, result.StatusCode, DateTime.UtcNow);\n            }\n\n            private readonly Opc.Ua.Test.TestDataGenerator _generator = new();\n            private readonly Timer _timer;\n            private int _monitoringCount;\n            private OnAssetTagChange? _callback;\n        }\n\n        private readonly ConcurrentDictionary<Uri, SimulatedTag> _tags = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/SimulatedBinding.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Newtonsoft.Json;\n\n    public sealed class SimulatedForm : Form\n    {\n        [JsonProperty(\"sim:type\")]\n        public string? PayloadType { get; set; }\n        [JsonProperty(\"sim:array\")]\n        public bool IsArray { get; set; }\n        [JsonProperty(\"sim:pollingTime\")]\n        public long PollingTime { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/SimulatedFormExtension.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Opc.Ua;\n    using System.Reflection;\n\n    public static class SimulatedFormExtension\n    {\n        /// <summary>\n        /// Get datatype id\n        /// </summary>\n        /// <param name=\"form\"></param>\n        /// <returns></returns>\n        public static NodeId GetDataTypeId(this SimulatedForm form)\n        {\n            var fields = typeof(DataTypeIds).GetFields(\n                BindingFlags.Public | BindingFlags.Static);\n            foreach (var field in fields)\n            {\n                try\n                {\n                    var value = field.GetValue(typeof(DataTypeIds)) as NodeId;\n                    if (value != null && field.Name == form.PayloadType)\n                    {\n                        return value;\n                    }\n                }\n                catch\n                {\n                    continue;\n                }\n            }\n            return NodeId.Null;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Asset/ThingDescription.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\n#nullable enable\n\nnamespace Asset\n{\n    using Newtonsoft.Json;\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    public sealed class ThingDescription\n    {\n        [JsonProperty(\"@context\")]\n#pragma warning disable CA1819 // Properties should not return arrays\n        public object[]? Context { get; set; }\n#pragma warning restore CA1819 // Properties should not return arrays\n\n        [JsonProperty(\"id\")]\n        public string? Id { get; set; }\n\n        [JsonProperty(\"securityDefinitions\")]\n        public SecurityDefinitions? SecurityDefinitions { get; set; }\n\n        [JsonProperty(\"security\")]\n#pragma warning disable CA1819 // Properties should not return arrays\n        public string[]? Security { get; set; }\n#pragma warning restore CA1819 // Properties should not return arrays\n\n        [JsonProperty(\"@type\")]\n#pragma warning disable CA1819 // Properties should not return arrays\n        public string[]? Type { get; set; }\n#pragma warning restore CA1819 // Properties should not return arrays\n\n        [JsonProperty(\"name\")]\n        public string? Name { get; set; }\n\n        [JsonProperty(\"base\")]\n        public string? Base { get; set; }\n\n        [JsonProperty(\"title\")]\n        public string? Title { get; set; }\n\n        [JsonProperty(\"properties\")]\n#pragma warning disable CA2227 // Collection properties should be read only\n        public Dictionary<string, Property>? Properties { get; set; }\n#pragma warning restore CA2227 // Collection properties should be read only\n\n        // Actions\n        // Events\n        // Forms\n    }\n\n    public sealed class OpcUaNamespaces\n    {\n        [JsonProperty(\"opcua\")]\n#pragma warning disable CA1819 // Properties should not return arrays\n        public Uri[]? Namespaces { get; set; }\n#pragma warning restore CA1819 // Properties should not return arrays\n    }\n\n    public sealed class Property\n    {\n        [JsonProperty(\"type\")]\n        public TypeEnum Type { get; set; }\n\n        [JsonProperty(\"opcua:nodeId\")]\n        public string? OpcUaNodeId { get; set; }\n\n        [JsonProperty(\"readOnly\")]\n        public bool ReadOnly { get; set; }\n\n        [JsonProperty(\"observable\")]\n        public bool Observable { get; set; }\n\n        [JsonProperty(\"forms\")]\n#pragma warning disable CA1819 // Properties should not return arrays\n        public object[]? Forms { get; set; }\n#pragma warning restore CA1819 // Properties should not return arrays\n    }\n\n    [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\n    public enum Op\n    {\n        [EnumMember(Value = \"readproperty\")]\n        ReadProperty,\n        [EnumMember(Value = \"writeproperty\")]\n        WriteProperty,\n        [EnumMember(Value = \"observeproperty\")]\n        ObserveProperty,\n        [EnumMember(Value = \"unobserveproperty\")]\n        UnobserveProperty,\n    }\n\n    [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]\n    public enum TypeEnum\n    {\n        [EnumMember(Value = \"number\")]\n        Number\n    }\n\n    public abstract class Form\n    {\n        [JsonProperty(\"href\")]\n        public string? Href { get; set; }\n        [JsonProperty(\"op\")]\n#pragma warning disable CA1819 // Properties should not return arrays\n        public Op[]? Op { get; set; }\n#pragma warning restore CA1819 // Properties should not return arrays\n    }\n\n    public sealed class SecurityDefinitions\n    {\n        [JsonProperty(\"nosec_sc\")]\n        public NosecSc? NosecSc { get; set; }\n    }\n\n    public sealed class NosecSc\n    {\n        [JsonProperty(\"scheme\")]\n        public string? Scheme { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Azure.IIoT.OpcUa.Publisher.Testing.Servers.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <Description>Contains several test servers to run tests against</Description>\n    <IsPackable>true</IsPackable>\n    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n    <IsTrimmable>false</IsTrimmable>\n    <EnableTrimAnalyzer>false</EnableTrimAnalyzer>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\Boolean.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\Byte.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\DateTime.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\Double.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\Float.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\Int16.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\Int32.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\Int64.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\SByte.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\String.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\UInt16.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\UInt32.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Dynamic\\UInt64.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\Boolean.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\Byte.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\ByteString.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\DateTime.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\Double.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\Float.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\Int16.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\Int32.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\Int64.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\SByte.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\String.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\UInt16.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\UInt32.txt\" />\n    <EmbeddedResource Include=\"HistoricalAccess\\Data\\Sample\\UInt64.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Generated\\Asset\\Design\\Asset.NodeSet2.xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Generated\\Vehicles\\Design\\Vehicles.Instances.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\Vehicles\\Design\\Vehicles.Types.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\Vehicles\\Design\\Vehicles.Types.Types.bsd\" />\n    <EmbeddedResource Include=\"Generated\\Vehicles\\Design\\Vehicles.Types.Types.xsd\" />\n    <EmbeddedResource Include=\"Generated\\Views\\Design\\Engineering.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\Views\\Design\\Model.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\Views\\Design\\Operations.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\HistoricalEvents\\Design\\HistoricalEvents.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\Plc\\Design\\PlcModel.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\SimpleEvents\\Design\\SimpleEvents.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\TestData\\Design\\TestData.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\MemoryBuffer\\Design\\MemoryBuffer.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\Boiler\\Design\\Boiler.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\Isa95Jobs\\Design\\UAModel.ISA95_JOBCONTROL_V2.PredefinedNodes.uanodes\" />\n    <EmbeddedResource Include=\"Generated\\Isa95Jobs\\Design\\UAModel.ISA95_JOBCONTROL_V2.Types.bsd\" />\n    <EmbeddedResource Include=\"Generated\\Isa95Jobs\\Design\\UAModel.ISA95_JOBCONTROL_V2.Types.xsd\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Furly.Extensions\" Version=\"1.1.54\" />\n    <PackageReference Include=\"System.IO.Pipelines\" Version=\"9.0.9\" />\n    <PackageReference Include=\"System.Linq.Async\" Version=\"6.0.3\" />\n    <PackageReference Include=\"System.Text.Json\" Version=\"9.0.9\" />\n    <PackageReference Include=\"OPCFoundation.NetStandard.Opc.Ua.Server\" Version=\"1.5.377.21\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Boiler/BoilerNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Boiler\n{\n    using Opc.Ua;\n    using Opc.Ua.Sample;\n    using System.Collections.Generic;\n    using System.Reflection;\n\n    /// <summary>\n    /// A node manager the diagnostic information exposed by the server.\n    /// </summary>\n    public class BoilerNodeManager : SampleNodeManager\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public BoilerNodeManager(\n            Opc.Ua.Server.IServerInternal server,\n            ApplicationConfiguration configuration)\n        :\n            base(server)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(configuration != null);\n            var namespaceUris = new List<string> {\n                Namespaces.Boiler,\n                Namespaces.Boiler + \"/Instance\"\n            };\n            NamespaceUris = namespaceUris;\n\n            _namespaceIndex = Server.NamespaceUris.GetIndexOrAppend(namespaceUris[1]);\n\n            //  AddEncodeableNodeManagerTypes(typeof(BoilerNodeManager).Assembly, typeof(BoilerNodeManager).Namespace);\n\n            _lastUsedId = 0;\n            _boilers = [];\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _boilers != null)\n            {\n                foreach (var boiler in _boilers)\n                {\n                    boiler.Dispose();\n                }\n                _boilers = null;\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The node.</param>\n        /// <returns>The new NodeId.</returns>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            var id = Utils.IncrementIdentifier(ref _lastUsedId);\n            return new NodeId(id, _namespaceIndex);\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                base.CreateAddressSpace(externalReferences);\n                CreateBoiler(SystemContext, 2);\n            }\n        }\n\n        /// <summary>\n        /// Creates a boiler and adds it to the address space.\n        /// </summary>\n        /// <param name=\"context\">The context to use.</param>\n        /// <param name=\"unitNumber\">The unit number for the boiler.</param>\n        private void CreateBoiler(SystemContext context, int unitNumber)\n        {\n            var boiler = new BoilerState(null);\n\n            var name = Utils.Format(\"Boiler #{0}\", unitNumber);\n\n            boiler.Create(\n                context,\n                null,\n                new QualifiedName(name, _namespaceIndex),\n                null,\n                true);\n\n            var folder = FindPredefinedNode(\n                ExpandedNodeId.ToNodeId(ObjectIds.Boilers, Server.NamespaceUris),\n                typeof(NodeState));\n\n            folder.AddReference(Opc.Ua.ReferenceTypeIds.Organizes, false, boiler.NodeId);\n            boiler.AddReference(Opc.Ua.ReferenceTypeIds.Organizes, true, folder.NodeId);\n\n            var unitLabel = Utils.Format(\"{0}0\", unitNumber);\n\n            UpdateDisplayName(boiler.InputPipe, unitLabel);\n            UpdateDisplayName(boiler.Drum, unitLabel);\n            UpdateDisplayName(boiler.OutputPipe, unitLabel);\n            UpdateDisplayName(boiler.LevelController, unitLabel);\n            UpdateDisplayName(boiler.FlowController, unitLabel);\n            UpdateDisplayName(boiler.CustomController, unitLabel);\n\n            _boilers.Add(boiler);\n\n            AddPredefinedNode(context, boiler);\n\n            // Autostart boiler simulation state machine\n            var start = boiler.Simulation.Start;\n            IList<Variant> inputArguments = [];\n            IList<Variant> outputArguments = [];\n            var errors = new List<ServiceResult>();\n            start.Call(context, boiler.NodeId, inputArguments, errors, outputArguments);\n        }\n\n        /// <summary>\n        /// Updates the display name for an instance with the unit label name.\n        /// </summary>\n        /// <param name=\"instance\">The instance to update.</param>\n        /// <param name=\"unitLabel\">The label to apply.</param>\n        /// <remarks>This method assumes the DisplayName has the form NameX001 where X0 is the unit label placeholder.</remarks>\n        private void UpdateDisplayName(BaseInstanceState instance, string unitLabel)\n        {\n            var displayName = instance.DisplayName;\n\n            if (displayName != null)\n            {\n                var text = displayName.Text;\n\n                if (text != null)\n                {\n                    text = text.Replace(\"X0\", unitLabel);\n                }\n\n                displayName = new LocalizedText(displayName.Locale, text);\n            }\n\n            instance.DisplayName = displayName;\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            return predefinedNodes;\n        }\n\n        /// <summary>\n        /// Replaces the generic node with a node specific to the model.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"predefinedNode\"></param>\n        protected override NodeState AddBehaviourToPredefinedNode(ISystemContext context, NodeState predefinedNode)\n        {\n            if (predefinedNode is not BaseObjectState passiveNode)\n            {\n                return predefinedNode;\n            }\n\n            var typeId = passiveNode.TypeDefinitionId;\n\n            if (!IsNodeIdInNamespace(typeId) || typeId.IdType != IdType.Numeric)\n            {\n                return predefinedNode;\n            }\n\n            switch ((uint)typeId.Identifier)\n            {\n                case ObjectTypes.BoilerType:\n                    {\n                        if (passiveNode is BoilerState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new BoilerState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        // replace the node in the parent.\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        // Autostart boiler simulation state machine\n                        var start = activeNode.Simulation.Start;\n                        IList<Variant> inputArguments = [];\n                        IList<Variant> outputArguments = [];\n                        var errors = new List<ServiceResult>();\n                        start.Call(context, activeNode.NodeId, inputArguments, errors, outputArguments);\n\n                        _boilers.Add(activeNode);\n                        return activeNode;\n                    }\n            }\n\n            return predefinedNode;\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is created.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"itemToCreate\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        protected override void OnCreateMonitoredItem(\n            ISystemContext systemContext,\n            MonitoredItemCreateRequest itemToCreate,\n            MonitoredNode monitoredNode,\n            DataChangeMonitoredItem monitoredItem)\n        {\n            // TBD\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is created.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"itemToModify\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"previousSamplingInterval\"></param>\n        protected override void OnModifyMonitoredItem(\n            ISystemContext systemContext,\n            MonitoredItemModifyRequest itemToModify,\n            MonitoredNode monitoredNode,\n            DataChangeMonitoredItem monitoredItem,\n            double previousSamplingInterval)\n        {\n            // TBD\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is deleted.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        protected override void OnDeleteMonitoredItem(\n            ISystemContext systemContext,\n            MonitoredNode monitoredNode,\n            DataChangeMonitoredItem monitoredItem)\n        {\n            // TBD\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is created.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"previousMode\"></param>\n        /// <param name=\"currentMode\"></param>\n        protected override void OnSetMonitoringMode(\n            ISystemContext systemContext,\n            MonitoredNode monitoredNode,\n            DataChangeMonitoredItem monitoredItem,\n            MonitoringMode previousMode,\n            MonitoringMode currentMode)\n        {\n            // TBD\n        }\n\n        private readonly ushort _namespaceIndex;\n        private long _lastUsedId;\n        private List<BoilerState> _boilers;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Boiler/BoilerServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Boiler\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class BoilerServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.Boiler,\n                    Namespaces.Boiler + \"Instance\"\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new BoilerNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Boiler/BoilerState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Boiler\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    public partial class BoilerState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            Simulation.OnAfterTransition = OnControlSimulation;\n            _random = new Random();\n        }\n\n        /// <summary>\n        /// Cleans up when the object is disposed.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _simulationTimer != null)\n            {\n                _simulationTimer.Dispose();\n                _simulationTimer = null;\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Changes the state of the simulation.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"machine\"></param>\n        /// <param name=\"transitionId\"></param>\n        /// <param name=\"causeId\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnControlSimulation(\n            ISystemContext context,\n            StateMachineState machine,\n            uint transitionId,\n            uint causeId,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            switch (causeId)\n            {\n                case Opc.Ua.Methods.ProgramStateMachineType_Start:\n                    {\n                        if (_simulationTimer != null)\n                        {\n                            _simulationTimer.Dispose();\n                            _simulationTimer = null;\n                        }\n\n                        var updateRate = Simulation.UpdateRate.Value;\n\n                        if (updateRate < 100)\n                        {\n                            updateRate = 100;\n                            Simulation.UpdateRate.Value = updateRate;\n                        }\n\n                        _simulationContext = context;\n                        _simulationTimer = new Timer(DoSimulation, null, (int)updateRate, (int)updateRate);\n                        break;\n                    }\n\n                case Opc.Ua.Methods.ProgramStateMachineType_Halt:\n                case Opc.Ua.Methods.ProgramStateMachineType_Suspend:\n                    {\n                        if (_simulationTimer != null)\n                        {\n                            _simulationTimer.Dispose();\n                            _simulationTimer = null;\n                        }\n\n                        _simulationContext = context;\n                        break;\n                    }\n\n                case Opc.Ua.Methods.ProgramStateMachineType_Reset:\n                    {\n                        if (_simulationTimer != null)\n                        {\n                            _simulationTimer.Dispose();\n                            _simulationTimer = null;\n                        }\n\n                        _simulationContext = context;\n                        break;\n                    }\n            }\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Rounds a value to the significate digits specified and adds a random perturbation.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"significantDigits\"></param>\n        private double RoundAndPerturb(double value, byte significantDigits)\n        {\n            double offsetToApply = 0;\n\n            if (!value.Equals(0.0))\n            {\n                // need to move all significate digits above the decimal point.\n                var offset = significantDigits - Math.Log10(Math.Abs(value));\n\n                offsetToApply = Math.Floor(offset);\n\n                if (offsetToApply.Equals(offset))\n                {\n                    offsetToApply--;\n                }\n            }\n\n            // round value to significant digits.\n            var perturbedValue = Math.Round(value * Math.Pow(10.0, offsetToApply));\n\n            // apply the perturbation.\n            perturbedValue += (_random.NextDouble() - 0.5) * 5;\n\n            // restore original exponent.\n            return Math.Round(perturbedValue) * Math.Pow(10.0, -offsetToApply);\n        }\n\n        /// <summary>\n        /// Moves the value towards the target.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"target\"></param>\n        /// <param name=\"step\"></param>\n        /// <param name=\"range\"></param>\n        private double Adjust(double value, double target, double step, Opc.Ua.Range range)\n        {\n            // convert percentage step to an absolute step if range is specified.\n            if (range != null)\n            {\n                step *= range.Magnitude;\n            }\n\n            var difference = target - value;\n\n            if (difference < 0)\n            {\n                value -= step;\n\n                if (value < target)\n                {\n                    return target;\n                }\n            }\n            else\n            {\n                value += step;\n\n                if (value > target)\n                {\n                    return target;\n                }\n            }\n\n            return value;\n        }\n\n        /// <summary>\n        /// Returns the value as a percentage of the range.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        private double GetPercentage(AnalogItemState<double> value)\n        {\n            var percentage = value.Value;\n            var range = value.EURange.Value;\n\n            if (range != null)\n            {\n                percentage /= Math.Abs(range.High - range.Low);\n\n                if (Math.Abs(percentage) > 1.0)\n                {\n                    percentage = 1.0;\n                }\n            }\n\n            return percentage;\n        }\n\n        /// <summary>\n        /// Returns the value as a percentage of the range.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <param name=\"range\"></param>\n        private double GetValue(double value, Opc.Ua.Range range)\n        {\n            if (range != null)\n            {\n                return value * range.Magnitude;\n            }\n\n            return value;\n        }\n\n        /// <summary>\n        /// Updates the values for the simulation.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void DoSimulation(object state)\n        {\n            try\n            {\n                _simulationCounter++;\n\n                // adjust level.\n                m_drum.LevelIndicator.Output.Value = Adjust(\n                    m_drum.LevelIndicator.Output.Value,\n                    m_levelController.SetPoint.Value,\n                    0.1,\n                    m_drum.LevelIndicator.Output.EURange.Value);\n\n                // calculate inputs for custom controller.\n                m_customController.Input1.Value = m_levelController.UpdateMeasurement(m_drum.LevelIndicator.Output);\n                m_customController.Input2.Value = GetPercentage(m_inputPipe.FlowTransmitter1.Output);\n                m_customController.Input3.Value = GetPercentage(m_outputPipe.FlowTransmitter2.Output);\n\n                // calculate output for custom controller.\n                m_customController.ControlOut.Value = (m_customController.Input1.Value +\n                    m_customController.Input3.Value - m_customController.Input2.Value) / 2;\n\n                // update flow controller set point.\n                m_flowController.SetPoint.Value = GetValue((m_customController.ControlOut.Value + 1) / 2, m_inputPipe.FlowTransmitter1.Output.EURange.Value);\n\n                var error = m_flowController.UpdateMeasurement(m_inputPipe.FlowTransmitter1.Output);\n\n                // adjust the input valve.\n                m_inputPipe.Valve.Input.Value = Adjust(m_inputPipe.Valve.Input.Value, (error > 0) ? 100 : 0, 10, null);\n\n                // adjust the input flow.\n                m_inputPipe.FlowTransmitter1.Output.Value = Adjust(\n                    m_inputPipe.FlowTransmitter1.Output.Value,\n                    m_flowController.SetPoint.Value,\n                    0.6,\n                    m_inputPipe.FlowTransmitter1.Output.EURange.Value);\n\n                // add pertubations.\n                m_drum.LevelIndicator.Output.Value = RoundAndPerturb(m_drum.LevelIndicator.Output.Value, 3);\n                m_inputPipe.FlowTransmitter1.Output.Value = RoundAndPerturb(m_inputPipe.FlowTransmitter1.Output.Value, 3);\n                m_outputPipe.FlowTransmitter2.Output.Value = RoundAndPerturb(m_outputPipe.FlowTransmitter2.Output.Value, 3);\n\n                ClearChangeMasks(_simulationContext, true);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error during boiler simulation.\");\n            }\n        }\n\n        private ISystemContext _simulationContext;\n        private Timer _simulationTimer;\n        private Random _random;\n#pragma warning disable IDE0052 // Remove unread private members\n        private long _simulationCounter;\n#pragma warning restore IDE0052 // Remove unread private members\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Boiler/BoilerStateMachineState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Boiler\n{\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    public partial class BoilerStateMachineState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            Start.OnCallMethod = OnStart;\n            Start.OnReadExecutable = IsStartExecutable;\n            Start.OnReadUserExecutable = IsStartUserExecutable;\n\n            Suspend.OnCallMethod = OnSuspend;\n            Suspend.OnReadExecutable = IsSuspendExecutable;\n            Suspend.OnReadUserExecutable = IsSuspendUserExecutable;\n\n            Resume.OnCallMethod = OnResume;\n            Resume.OnReadExecutable = IsResumeExecutable;\n            Resume.OnReadUserExecutable = IsResumeUserExecutable;\n\n            Halt.OnCallMethod = OnHalt;\n            Halt.OnReadExecutable = IsHaltExecutable;\n            Halt.OnReadUserExecutable = IsHaltUserExecutable;\n\n            Reset.OnCallMethod = OnResetOverride;\n            Reset.OnReadExecutable = IsResetExecutableOverride;\n            Reset.OnReadUserExecutable = IsResetExecutableOverride;\n        }\n\n        // The following were added to make the existing integration tests pass\n\n        private ServiceResult OnResetOverride(ISystemContext context, MethodState method,\n            IList<object> inputArguments, IList<object> outputArguments)\n        {\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult IsResetExecutableOverride(ISystemContext context,\n            NodeState node, ref bool value)\n        {\n            value = true;\n            return ServiceResult.Good;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Boiler/GenericController.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Boiler\n{\n    using Opc.Ua;\n    using System;\n\n    /// <summary>\n    /// A object representing a generic controller.\n    /// </summary>\n    public partial class GenericControllerState\n    {\n        /// <summary>\n        /// Updates the measurement and calculates the new control output.\n        /// </summary>\n        /// <param name=\"source\"></param>\n        public double UpdateMeasurement(AnalogItemState<double> source)\n        {\n            var range = source.EURange.Value;\n            m_measurement.Value = source.Value;\n\n            // clamp the setpoint.\n            if (range != null)\n            {\n                if (m_setPoint.Value > range.High)\n                {\n                    m_setPoint.Value = range.High;\n                }\n\n                if (m_setPoint.Value < range.Low)\n                {\n                    m_setPoint.Value = range.Low;\n                }\n            }\n\n            // calculate error.\n            m_controlOut.Value = m_setPoint.Value - m_measurement.Value;\n\n            if (range != null)\n            {\n                m_controlOut.Value /= range.Magnitude;\n\n                if (Math.Abs(m_controlOut.Value) > 1.0)\n                {\n                    m_controlOut.Value = (m_controlOut.Value < 0) ? -1.0 : +1.0;\n                }\n            }\n\n            // return the new output.\n            return m_controlOut.Value;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Common/DataChangeMonitoredItem.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing Opc.Ua.Server;\n\nnamespace Opc.Ua.Sample\n{\n    /// <summary>\n    /// Provides a basic monitored item implementation which does not support queuing.\n    /// </summary>\n    public class DataChangeMonitoredItem : IDataChangeMonitoredItem2\n    {\n        /// <summary>\n        /// Constructs a new instance.\n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <param name=\"id\"></param>\n        /// <param name=\"attributeId\"></param>\n        /// <param name=\"indexRange\"></param>\n        /// <param name=\"dataEncoding\"></param>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"monitoringMode\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"samplingInterval\"></param>\n        /// <param name=\"alwaysReportUpdates\"></param>\n        public DataChangeMonitoredItem(\n            MonitoredNode source,\n            uint id,\n            uint attributeId,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            MonitoringMode monitoringMode,\n            uint clientHandle,\n            double samplingInterval,\n            bool alwaysReportUpdates)\n        {\n            _source = source;\n            Id = id;\n            AttributeId = attributeId;\n            _indexRange = indexRange;\n            DataEncoding = dataEncoding;\n            _timestampsToReturn = timestampsToReturn;\n            _diagnosticsMasks = diagnosticsMasks;\n            MonitoringMode = monitoringMode;\n            ClientHandle = clientHandle;\n            _samplingInterval = samplingInterval;\n            _nextSampleTime = DateTime.UtcNow.Ticks;\n            _readyToPublish = false;\n            _readyToTrigger = false;\n            _resendData = false;\n            AlwaysReportUpdates = alwaysReportUpdates;\n            NodeId = source.Node.NodeId;\n        }\n\n        /// <summary>\n        /// Constructs a new instance.\n        /// </summary>\n        /// <param name=\"monitoredItemQueueFactory\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"id\"></param>\n        /// <param name=\"attributeId\"></param>\n        /// <param name=\"indexRange\"></param>\n        /// <param name=\"dataEncoding\"></param>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"monitoringMode\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"samplingInterval\"></param>\n        /// <param name=\"queueSize\"></param>\n        /// <param name=\"discardOldest\"></param>\n        /// <param name=\"filter\"></param>\n        /// <param name=\"range\"></param>\n        /// <param name=\"alwaysReportUpdates\"></param>\n        public DataChangeMonitoredItem(\n            IMonitoredItemQueueFactory monitoredItemQueueFactory,\n            MonitoredNode source,\n            uint id,\n            uint attributeId,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            MonitoringMode monitoringMode,\n            uint clientHandle,\n            double samplingInterval,\n            uint queueSize,\n            bool discardOldest,\n            DataChangeFilter filter,\n            Range range,\n            bool alwaysReportUpdates)\n        {\n            _source = source;\n            _monitoredItemQueueFactory = monitoredItemQueueFactory;\n            Id = id;\n            AttributeId = attributeId;\n            _indexRange = indexRange;\n            DataEncoding = dataEncoding;\n            _timestampsToReturn = timestampsToReturn;\n            _diagnosticsMasks = diagnosticsMasks;\n            MonitoringMode = monitoringMode;\n            ClientHandle = clientHandle;\n            _samplingInterval = samplingInterval;\n            _nextSampleTime = DateTime.UtcNow.Ticks;\n            _readyToPublish = false;\n            _readyToTrigger = false;\n            _resendData = false;\n            _queue = null;\n            _queueSize = queueSize;\n            DataChangeFilter = filter;\n            _range = 0;\n            AlwaysReportUpdates = alwaysReportUpdates;\n            NodeId = source.Node.NodeId;\n\n            if (range != null)\n            {\n                _range = range.High - range.Low;\n            }\n\n            if (queueSize > 1)\n            {\n                _queue = new DataChangeQueueHandler(id, false, _monitoredItemQueueFactory);\n                _queue.SetQueueSize(queueSize, discardOldest, diagnosticsMasks);\n                _queue.SetSamplingInterval(samplingInterval);\n            }\n        }\n\n        /// <summary>\n        /// Constructs a new instance from a template.\n        /// </summary>\n        /// <param name=\"subscriptionStore\"></param>\n        /// <param name=\"monitoredItemQueueFactory\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"storedMonitoredItem\"></param>\n        public DataChangeMonitoredItem(\n            ISubscriptionStore subscriptionStore,\n            IMonitoredItemQueueFactory monitoredItemQueueFactory,\n            MonitoredNode source,\n            IStoredMonitoredItem storedMonitoredItem)\n        {\n            _source = source;\n            _monitoredItemQueueFactory = monitoredItemQueueFactory;\n            Id = storedMonitoredItem.Id;\n            AttributeId = storedMonitoredItem.AttributeId;\n            _indexRange = storedMonitoredItem.ParsedIndexRange;\n            DataEncoding = storedMonitoredItem.Encoding;\n            _timestampsToReturn = storedMonitoredItem.TimestampsToReturn;\n            _diagnosticsMasks = storedMonitoredItem.DiagnosticsMasks;\n            MonitoringMode = storedMonitoredItem.MonitoringMode;\n            ClientHandle = storedMonitoredItem.ClientHandle;\n            _samplingInterval = storedMonitoredItem.SamplingInterval;\n            _nextSampleTime = DateTime.UtcNow.Ticks;\n            _readyToPublish = false;\n            _readyToTrigger = false;\n            _resendData = false;\n            _queue = null;\n            _queueSize = storedMonitoredItem.QueueSize;\n            DataChangeFilter = storedMonitoredItem.FilterToUse as DataChangeFilter;\n            _range = storedMonitoredItem.Range;\n            AlwaysReportUpdates = storedMonitoredItem.AlwaysReportUpdates;\n            _lastValue = storedMonitoredItem.LastValue;\n            _lastError = storedMonitoredItem.LastError;\n            NodeId = storedMonitoredItem.NodeId;\n\n            if (storedMonitoredItem.QueueSize > 1)\n            {\n                IDataChangeMonitoredItemQueue queue = subscriptionStore\n                    .RestoreDataChangeMonitoredItemQueue(\n                        storedMonitoredItem.Id);\n\n                if (queue != null)\n                {\n                    _queue = new DataChangeQueueHandler(\n                        queue,\n                        storedMonitoredItem.DiscardOldest,\n                        storedMonitoredItem.SamplingInterval);\n                }\n                else\n                {\n                    _queue = new DataChangeQueueHandler(\n                        storedMonitoredItem.Id,\n                        false,\n                        _monitoredItemQueueFactory);\n                    _queue.SetQueueSize(\n                        storedMonitoredItem.QueueSize,\n                        storedMonitoredItem.DiscardOldest,\n                        storedMonitoredItem.DiagnosticsMasks);\n                    _queue.SetSamplingInterval(storedMonitoredItem.SamplingInterval);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the id for the attribute being monitored.\n        /// </summary>\n        public uint AttributeId { get; }\n\n        /// <summary>\n        /// Gets the index range used to selected a subset of the value.\n        /// </summary>\n        public NumericRange IndexRange => _indexRange;\n\n        /// <summary>\n        /// Gets the data encoding to use when returning the value.\n        /// </summary>\n        public QualifiedName DataEncoding { get; }\n\n        /// <summary>\n        /// Whether the monitored item should report a value without checking if it was changed.\n        /// </summary>\n        public bool AlwaysReportUpdates { get; set; }\n\n        /// <summary>\n        /// The number of milliseconds until the next sample.\n        /// </summary>\n        public int TimeToNextSample\n        {\n            get\n            {\n                lock (_lock)\n                {\n                    if (MonitoringMode == MonitoringMode.Disabled)\n                    {\n                        return int.MaxValue;\n                    }\n\n                    DateTime now = DateTime.UtcNow;\n\n                    if (_nextSampleTime <= now.Ticks)\n                    {\n                        return 0;\n                    }\n\n                    return (int)((_nextSampleTime - now.Ticks) / TimeSpan.TicksPerMillisecond);\n                }\n            }\n        }\n\n        /// <summary>\n        /// The monitoring mode.\n        /// </summary>\n        public MonitoringMode MonitoringMode { get; private set; }\n\n        /// <summary>\n        /// The sampling interval.\n        /// </summary>\n        public double SamplingInterval\n        {\n            get\n            {\n                lock (_lock)\n                {\n                    return _samplingInterval;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Modifies the monitored item parameters,\n        /// </summary>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"samplingInterval\"></param>\n        public ServiceResult Modify(\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            uint clientHandle,\n            double samplingInterval)\n        {\n            return Modify(\n                diagnosticsMasks,\n                timestampsToReturn,\n                clientHandle,\n                samplingInterval,\n                0,\n                false,\n                null,\n                null);\n        }\n\n        /// <summary>\n        /// Modifies the monitored item parameters,\n        /// </summary>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"samplingInterval\"></param>\n        /// <param name=\"queueSize\"></param>\n        /// <param name=\"discardOldest\"></param>\n        /// <param name=\"filter\"></param>\n        /// <param name=\"range\"></param>\n        public ServiceResult Modify(\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            uint clientHandle,\n            double samplingInterval,\n            uint queueSize,\n            bool discardOldest,\n            DataChangeFilter filter,\n            Range range)\n        {\n            lock (_lock)\n            {\n                _diagnosticsMasks = diagnosticsMasks;\n                _timestampsToReturn = timestampsToReturn;\n                ClientHandle = clientHandle;\n                _queueSize = queueSize;\n\n                // subtract the previous sampling interval.\n                long oldSamplingInterval = (long)(_samplingInterval *\n                    TimeSpan.TicksPerMillisecond);\n\n                if (oldSamplingInterval < _nextSampleTime)\n                {\n                    _nextSampleTime -= oldSamplingInterval;\n                }\n\n                _samplingInterval = samplingInterval;\n\n                // calculate the next sampling interval.\n                long newSamplingInterval = (long)(_samplingInterval *\n                    TimeSpan.TicksPerMillisecond);\n\n                if (_samplingInterval > 0)\n                {\n                    _nextSampleTime += newSamplingInterval;\n                }\n                else\n                {\n                    _nextSampleTime = 0;\n                }\n\n                // update the filter and the range.\n                DataChangeFilter = filter;\n                _range = 0;\n\n                if (range != null)\n                {\n                    _range = range.High - range.Low;\n                }\n\n                // update the queue size.\n                if (queueSize > 1)\n                {\n                    (_queue ??= new DataChangeQueueHandler(Id, false, _monitoredItemQueueFactory))\n                        .SetQueueSize(\n                            queueSize,\n                            discardOldest,\n                            diagnosticsMasks);\n                    _queue.SetSamplingInterval(samplingInterval);\n                }\n                else\n                {\n                    _queue = null;\n                }\n\n                return ServiceResult.Good;\n            }\n        }\n\n        /// <summary>\n        /// Called when the attribute being monitored changed. Reads and queues the value.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        public void ValueChanged(ISystemContext context)\n        {\n            var value = new DataValue();\n\n            ServiceResult error = _source.Node\n                .ReadAttribute(context, AttributeId, NumericRange.Empty, null, value);\n\n            if (ServiceResult.IsBad(error))\n            {\n                value = new DataValue(error.StatusCode);\n            }\n\n            value.ServerTimestamp = DateTime.UtcNow;\n\n            QueueValue(value, error, false);\n        }\n\n        /// <summary>\n        /// The node manager for the monitored item.\n        /// </summary>\n        public INodeManager NodeManager => _source.NodeManager;\n\n        /// <summary>\n        /// The session for the monitored item.\n        /// </summary>\n        public ISession Session\n        {\n            get\n            {\n                ISubscription subscription = SubscriptionCallback;\n\n                if (subscription != null)\n                {\n                    return subscription.Session;\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// The monitored items owner identity.\n        /// </summary>\n        public IUserIdentity EffectiveIdentity\n        {\n            get\n            {\n                ISubscription subscription = SubscriptionCallback;\n                return subscription?.EffectiveIdentity;\n            }\n        }\n\n        /// <summary>\n        /// The identifier for the subscription that the monitored item belongs to.\n        /// </summary>\n        public uint SubscriptionId\n        {\n            get\n            {\n                ISubscription subscription = SubscriptionCallback;\n\n                if (subscription != null)\n                {\n                    return subscription.Id;\n                }\n\n                return 0;\n            }\n        }\n\n        /// <summary>\n        /// The unique identifier for the monitored item.\n        /// </summary>\n        public uint Id { get; }\n\n        /// <summary>\n        /// The client handle.\n        /// </summary>\n        public uint ClientHandle { get; private set; }\n\n        /// <summary>\n        /// The callback to use to notify the subscription when values are ready to publish.\n        /// </summary>\n        public ISubscription SubscriptionCallback { get; set; }\n\n        /// <summary>\n        /// The handle assigned to the monitored item by the node manager.\n        /// </summary>\n        public object ManagerHandle => _source;\n\n        /// <summary>\n        /// The type of monitor item.\n        /// </summary>\n        public int MonitoredItemType => MonitoredItemTypeMask.DataChange;\n\n        /// <summary>\n        /// Returns true if the item is ready to publish.\n        /// </summary>\n        public bool IsReadyToPublish\n        {\n            get\n            {\n                lock (_lock)\n                {\n                    // check if not ready to publish.\n                    if (!_readyToPublish)\n                    {\n                        return false;\n                    }\n\n                    // check if monitoring was turned off.\n                    if (MonitoringMode != MonitoringMode.Reporting)\n                    {\n                        return false;\n                    }\n\n                    // re-queue if too little time has passed since the last publish.\n                    long now = DateTime.UtcNow.Ticks;\n\n                    return _nextSampleTime <= now;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets or Sets a value indicating whether the item is ready to trigger in case it has some linked items.\n        /// </summary>\n        public bool IsReadyToTrigger\n        {\n            get\n            {\n                lock (_lock)\n                {\n                    // only allow to trigger if sampling or reporting.\n                    if (MonitoringMode == MonitoringMode.Disabled)\n                    {\n                        return false;\n                    }\n\n                    return _readyToTrigger;\n                }\n            }\n            set\n            {\n                lock (_lock)\n                {\n                    _readyToTrigger = value;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public bool IsResendData\n        {\n            get\n            {\n                lock (_lock)\n                {\n                    return _resendData;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Returns the results for the create request.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        public ServiceResult GetCreateResult(out MonitoredItemCreateResult result)\n        {\n            lock (_lock)\n            {\n                result = new MonitoredItemCreateResult\n                {\n                    MonitoredItemId = Id,\n                    StatusCode = StatusCodes.Good,\n                    RevisedSamplingInterval = _samplingInterval,\n                    RevisedQueueSize = 0,\n                    FilterResult = null\n                };\n\n                if (_queue != null)\n                {\n                    result.RevisedQueueSize = _queueSize;\n                }\n\n                return ServiceResult.Good;\n            }\n        }\n\n        /// <summary>\n        /// Returns the results for the modify request.\n        /// </summary>\n        /// <param name=\"result\"></param>\n        public ServiceResult GetModifyResult(out MonitoredItemModifyResult result)\n        {\n            lock (_lock)\n            {\n                result = new MonitoredItemModifyResult\n                {\n                    StatusCode = StatusCodes.Good,\n                    RevisedSamplingInterval = _samplingInterval,\n                    RevisedQueueSize = 0,\n                    FilterResult = null\n                };\n\n                if (_queue != null)\n                {\n                    result.RevisedQueueSize = _queueSize;\n                }\n\n                return ServiceResult.Good;\n            }\n        }\n\n        /// <inheritdoc/>\n        public void SetupResendDataTrigger()\n        {\n            lock (_lock)\n            {\n                if (MonitoringMode == MonitoringMode.Reporting)\n                {\n                    _resendData = true;\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public IStoredMonitoredItem ToStorableMonitoredItem()\n        {\n            return new StoredMonitoredItem\n            {\n                SamplingInterval = _samplingInterval,\n                SubscriptionId = SubscriptionCallback.Id,\n                QueueSize = _queueSize,\n                AlwaysReportUpdates = AlwaysReportUpdates,\n                AttributeId = AttributeId,\n                ClientHandle = ClientHandle,\n                DiagnosticsMasks = _diagnosticsMasks,\n                IsDurable = false,\n                Encoding = DataEncoding,\n                FilterToUse = DataChangeFilter,\n                Id = Id,\n                LastError = _lastError,\n                LastValue = _lastValue,\n                MonitoringMode = MonitoringMode,\n                NodeId = _source.Node.NodeId,\n                OriginalFilter = DataChangeFilter,\n                Range = _range,\n                TimestampsToReturn = _timestampsToReturn,\n                ParsedIndexRange = _indexRange\n            };\n        }\n\n        /// <inheritdoc/>\n        public void QueueValue(DataValue value, ServiceResult error)\n        {\n            QueueValue(value, error, false);\n        }\n\n        /// <inheritdoc/>\n        public void QueueValue(DataValue value, ServiceResult error, bool ignoreFilters)\n        {\n            lock (_lock)\n            {\n                // check if value has changed.\n                if (!AlwaysReportUpdates &&\n                    !ignoreFilters &&\n                    !MonitoredItem.ValueChanged(\n                        value,\n                        error,\n                        _lastValue,\n                        _lastError,\n                        DataChangeFilter,\n                        _range))\n                {\n                    return;\n                }\n\n                // make a shallow copy of the value.\n                if (value != null)\n                {\n                    value = new DataValue\n                    {\n                        WrappedValue = value.WrappedValue,\n                        StatusCode = value.StatusCode,\n                        SourceTimestamp = value.SourceTimestamp,\n                        SourcePicoseconds = value.SourcePicoseconds,\n                        ServerTimestamp = value.ServerTimestamp,\n                        ServerPicoseconds = value.ServerPicoseconds\n                    };\n\n                    // ensure the data value matches the error status code.\n                    if (error != null && error.StatusCode.Code != 0)\n                    {\n                        value.StatusCode = error.StatusCode;\n                    }\n                }\n\n                _lastValue = value;\n                _lastError = error;\n\n                // queue value.\n                _queue?.QueueValue(value, error);\n\n                // flag the item as ready to publish.\n                _readyToPublish = true;\n                _readyToTrigger = true;\n            }\n        }\n\n        /// <summary>\n        /// Sets a flag indicating that the semantics for the monitored node have changed.\n        /// </summary>\n        /// <remarks>\n        /// The StatusCode for next value reported by the monitored item will have the SemanticsChanged bit set.\n        /// </remarks>\n        public void SetSemanticsChanged()\n        {\n            lock (_lock)\n            {\n                _semanticsChanged = true;\n            }\n        }\n\n        /// <summary>\n        /// Sets a flag indicating that the structure of the monitored node has changed.\n        /// </summary>\n        /// <remarks>\n        /// The StatusCode for next value reported by the monitored item will have the StructureChanged bit set.\n        /// </remarks>\n        public void SetStructureChanged()\n        {\n            lock (_lock)\n            {\n                _structureChanged = true;\n            }\n        }\n\n        /// <summary>\n        /// Changes the monitoring mode.\n        /// </summary>\n        /// <param name=\"monitoringMode\"></param>\n        public MonitoringMode SetMonitoringMode(MonitoringMode monitoringMode)\n        {\n            lock (_lock)\n            {\n                MonitoringMode previousMode = MonitoringMode;\n\n                if (previousMode == monitoringMode)\n                {\n                    return previousMode;\n                }\n\n                if (previousMode == MonitoringMode.Disabled)\n                {\n                    _nextSampleTime = DateTime.UtcNow.Ticks;\n                    _lastError = null;\n                    _lastValue = null;\n                }\n\n                MonitoringMode = monitoringMode;\n\n                if (monitoringMode == MonitoringMode.Disabled)\n                {\n                    _readyToPublish = false;\n                    _readyToTrigger = false;\n                }\n\n                return previousMode;\n            }\n        }\n\n        /// <summary>\n        /// No filters supported.\n        /// </summary>\n        public DataChangeFilter DataChangeFilter { get; private set; }\n\n        public bool IsDurable => false;\n\n        public NodeId NodeId { get; }\n\n        /// <summary>\n        /// Increments the sample time to the next interval.\n        /// </summary>\n        private void IncrementSampleTime()\n        {\n            // update next sample time.\n            long now = DateTime.UtcNow.Ticks;\n            long samplingInterval = (long)(_samplingInterval * TimeSpan.TicksPerMillisecond);\n\n            if (_nextSampleTime > 0)\n            {\n                long delta = now - _nextSampleTime;\n\n                if (samplingInterval > 0 && delta >= 0)\n                {\n                    _nextSampleTime += ((delta / samplingInterval) + 1) * samplingInterval;\n                }\n            }\n            // set sampling time based on current time.\n            else\n            {\n                _nextSampleTime = now + samplingInterval;\n            }\n        }\n\n        /// <summary>\n        /// Called by the subscription to publish any notification.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"notifications\"></param>\n        /// <param name=\"diagnostics\"></param>\n        /// <param name=\"maxNotificationsPerPublish\"></param>\n        public bool Publish(\n            OperationContext context,\n            Queue<MonitoredItemNotification> notifications,\n            Queue<DiagnosticInfo> diagnostics,\n            uint maxNotificationsPerPublish)\n        {\n            lock (_lock)\n            {\n                // check if not ready to publish.\n                if (!IsReadyToPublish)\n                {\n                    if (!_resendData)\n                    {\n                        return false;\n                    }\n                }\n                else\n                {\n                    // update sample time.\n                    IncrementSampleTime();\n                }\n\n                // check if queuing is enabled.\n                if (_queue != null && (!_resendData || _queue.ItemsInQueue != 0))\n                {\n                    uint notificationCount = 0;\n                    while (\n                        notificationCount < maxNotificationsPerPublish &&\n                        _queue.PublishSingleValue(out DataValue value, out ServiceResult error))\n                    {\n                        Publish(context, value, error, notifications, diagnostics);\n                        notificationCount++;\n\n                        if (_resendData)\n                        {\n                            break;\n                        }\n                    }\n                }\n                else\n                {\n                    Publish(context, _lastValue, _lastError, notifications, diagnostics);\n                }\n\n                bool moreValuesToPublish = _queue?.ItemsInQueue > 0;\n\n                // update flags\n                _readyToPublish = moreValuesToPublish;\n                _readyToTrigger = moreValuesToPublish;\n                _resendData = false;\n\n                return moreValuesToPublish;\n            }\n        }\n\n        /// <summary>\n        /// Publishes a value.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"error\"></param>\n        /// <param name=\"notifications\"></param>\n        /// <param name=\"diagnostics\"></param>\n        private void Publish(\n            OperationContext context,\n            DataValue value,\n            ServiceResult error,\n            Queue<MonitoredItemNotification> notifications,\n            Queue<DiagnosticInfo> diagnostics)\n        {\n            // set semantics changed bit.\n            if (_semanticsChanged)\n            {\n                if (value != null)\n                {\n                    value.StatusCode = value.StatusCode.SetSemanticsChanged(true);\n                }\n\n                if (error != null)\n                {\n                    error = new ServiceResult(\n                        error.StatusCode.SetSemanticsChanged(true),\n                        error.SymbolicId,\n                        error.NamespaceUri,\n                        error.LocalizedText,\n                        error.AdditionalInfo,\n                        error.InnerResult);\n                }\n\n                _semanticsChanged = false;\n            }\n\n            // set structure changed bit.\n            if (_structureChanged)\n            {\n                if (value != null)\n                {\n                    value.StatusCode = value.StatusCode.SetStructureChanged(true);\n                }\n\n                if (error != null)\n                {\n                    _ = new ServiceResult(\n                        error.StatusCode.SetStructureChanged(true),\n                        error.SymbolicId,\n                        error.NamespaceUri,\n                        error.LocalizedText,\n                        error.AdditionalInfo,\n                        error.InnerResult);\n                }\n\n                _structureChanged = false;\n            }\n\n            // copy data value.\n            var item = new MonitoredItemNotification { ClientHandle = ClientHandle, Value = value };\n\n            // apply timestamp filter.\n            if (_timestampsToReturn is not TimestampsToReturn.Server and not TimestampsToReturn.Both)\n            {\n                item.Value.ServerTimestamp = DateTime.MinValue;\n            }\n\n            if (_timestampsToReturn is not TimestampsToReturn.Source and not TimestampsToReturn.Both)\n            {\n                item.Value.SourceTimestamp = DateTime.MinValue;\n            }\n\n            notifications.Enqueue(item);\n\n            // update diagnostic info.\n            DiagnosticInfo diagnosticInfo = null;\n\n            if (_lastError != null && (_diagnosticsMasks & DiagnosticsMasks.OperationAll) != 0)\n            {\n                diagnosticInfo = ServerUtils.CreateDiagnosticInfo(\n                    _source.Server,\n                    context,\n                    _lastError);\n            }\n\n            diagnostics.Enqueue(diagnosticInfo);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            //only durable queues need to be disposed\n        }\n\n        private readonly Lock _lock = new();\n        private readonly IMonitoredItemQueueFactory _monitoredItemQueueFactory;\n        private readonly MonitoredNode _source;\n        private DataValue _lastValue;\n        private ServiceResult _lastError;\n        private NumericRange _indexRange;\n        private TimestampsToReturn _timestampsToReturn;\n        private DiagnosticsMasks _diagnosticsMasks;\n        private double _samplingInterval;\n        private DataChangeQueueHandler _queue;\n        private uint _queueSize;\n        private double _range;\n        private long _nextSampleTime;\n        private bool _readyToPublish;\n        private bool _readyToTrigger;\n        private bool _semanticsChanged;\n        private bool _structureChanged;\n        private bool _resendData;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Common/FolderConfiguration.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\n#nullable enable\n\nnamespace Opc.Ua\n{\n    using System.IO;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Access to a folder to use for the instance of the server.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.OpcUa)]\n    public class FolderConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public FolderConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            CurrentDirectory = Directory.GetCurrentDirectory();\n        }\n\n        /// <summary>\n        /// Which folder is the current directory\n        /// </summary>\n        [DataMember(Order = 1)]\n        public string? CurrentDirectory { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Common/MonitoredNode.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing System.Collections.Generic;\nusing Opc.Ua.Server;\n\nnamespace Opc.Ua.Sample\n{\n    /// <summary>\n    /// Keeps track of the monitored items for a single node.\n    /// </summary>\n    public class MonitoredNode\n    {\n        /// <summary>\n        /// Initializes the instance with the context for the node being monitored.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"nodeManager\"></param>\n        /// <param name=\"node\"></param>\n        public MonitoredNode(IServerInternal server, INodeManager nodeManager, NodeState node)\n        {\n            Server = server;\n            NodeManager = nodeManager;\n            Node = node;\n        }\n\n        /// <summary>\n        /// The server that the node belongs to.\n        /// </summary>\n        public IServerInternal Server { get; }\n\n        /// <summary>\n        /// The node manager that the node belongs to.\n        /// </summary>\n        public INodeManager NodeManager { get; }\n\n        /// <summary>\n        /// The node being monitored.\n        /// </summary>\n        public NodeState Node { get; }\n\n        /// <summary>\n        /// Whether the node has any active monitored items for the specified attribute.\n        /// </summary>\n        /// <param name=\"attributeId\"></param>\n        public bool IsMonitoringRequired(uint attributeId)\n        {\n            if (m_monitoredItems != null)\n            {\n                for (int ii = 0; ii < m_monitoredItems.Count; ii++)\n                {\n                    DataChangeMonitoredItem monitoredItem = m_monitoredItems[ii];\n\n                    if (monitoredItem.AttributeId == attributeId &&\n                        monitoredItem.MonitoringMode != MonitoringMode.Disabled)\n                    {\n                        return true;\n                    }\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Creates a new data change monitored item.\n        /// </summary>\n        /// <param name=\"context\">The system context.</param>\n        /// <param name=\"monitoredItemId\">The unique identifier for the monitiored item.</param>\n        /// <param name=\"attributeId\">The attribute to monitor.</param>\n        /// <param name=\"indexRange\">The index range to use for array values.</param>\n        /// <param name=\"dataEncoding\">The data encoding to return for structured values.</param>\n        /// <param name=\"diagnosticsMasks\">The diagnostics masks to use.</param>\n        /// <param name=\"timestampsToReturn\">The timestamps to return.</param>\n        /// <param name=\"monitoringMode\">The initial monitoring mode.</param>\n        /// <param name=\"clientHandle\">The handle assigned by the client.</param>\n        /// <param name=\"samplingInterval\">The sampling interval.</param>\n        /// <param name=\"queueSize\">The queue size.</param>\n        /// <param name=\"discardOldest\">Whether to discard the oldest values when the queue overflows.</param>\n        /// <param name=\"filter\">The data change filter to use.</param>\n        /// <param name=\"range\">The range to use when evaluating a percentage deadband filter.</param>\n        /// <param name=\"alwaysReportUpdates\">Whether the monitored item should skip the check for a change in value.</param>\n        /// <returns>The new monitored item.</returns>\n        public DataChangeMonitoredItem CreateDataChangeItem(\n            ISystemContext context,\n            uint monitoredItemId,\n            uint attributeId,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            MonitoringMode monitoringMode,\n            uint clientHandle,\n            double samplingInterval,\n            uint queueSize,\n            bool discardOldest,\n            DataChangeFilter filter,\n            Range range,\n            bool alwaysReportUpdates)\n        {\n            var monitoredItem = new DataChangeMonitoredItem(\n                Server.MonitoredItemQueueFactory,\n                this,\n                monitoredItemId,\n                attributeId,\n                indexRange,\n                dataEncoding,\n                diagnosticsMasks,\n                timestampsToReturn,\n                monitoringMode,\n                clientHandle,\n                samplingInterval,\n                queueSize,\n                discardOldest,\n                filter,\n                range,\n                alwaysReportUpdates);\n\n            if (m_monitoredItems == null)\n            {\n                m_monitoredItems = [];\n                Node.OnStateChanged = OnNodeChange;\n            }\n\n            m_monitoredItems.Add(monitoredItem);\n\n            return monitoredItem;\n        }\n\n        /// <summary>\n        /// Creates a new data change monitored item.\n        /// </summary>\n        /// <param name=\"context\">The system context.</param>\n        /// <param name=\"monitoredItemId\">The unique identifier for the monitiored item.</param>\n        /// <param name=\"attributeId\">The attribute to monitor.</param>\n        /// <param name=\"indexRange\">The index range to use for array values.</param>\n        /// <param name=\"dataEncoding\">The data encoding to return for structured values.</param>\n        /// <param name=\"diagnosticsMasks\">The diagnostics masks to use.</param>\n        /// <param name=\"timestampsToReturn\">The timestamps to return.</param>\n        /// <param name=\"monitoringMode\">The initial monitoring mode.</param>\n        /// <param name=\"clientHandle\">The handle assigned by the client.</param>\n        /// <param name=\"samplingInterval\">The sampling interval.</param>\n        /// <param name=\"alwaysReportUpdates\">Whether the monitored item should skip the check for a change in value.</param>\n        /// <returns>The new monitored item.</returns>\n        public DataChangeMonitoredItem CreateDataChangeItem(\n            ISystemContext context,\n            uint monitoredItemId,\n            uint attributeId,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            MonitoringMode monitoringMode,\n            uint clientHandle,\n            double samplingInterval,\n            bool alwaysReportUpdates)\n        {\n            return CreateDataChangeItem(\n                context,\n                monitoredItemId,\n                attributeId,\n                indexRange,\n                dataEncoding,\n                diagnosticsMasks,\n                timestampsToReturn,\n                monitoringMode,\n                clientHandle,\n                samplingInterval,\n                0,\n                false,\n                null,\n                null,\n                alwaysReportUpdates);\n        }\n\n        /// <summary>\n        /// Restore a data change item after a server restart\n        /// </summary>\n        /// <param name=\"storedMonitoredItem\"></param>\n        /// <returns>The new monitored item.</returns>\n        public DataChangeMonitoredItem RestoreDataChangeItem(\n            IStoredMonitoredItem storedMonitoredItem)\n        {\n            var monitoredItem = new DataChangeMonitoredItem(\n                Server.SubscriptionStore,\n                Server.MonitoredItemQueueFactory,\n                this,\n                storedMonitoredItem);\n\n            if (m_monitoredItems == null)\n            {\n                m_monitoredItems = [];\n                Node.OnStateChanged = OnNodeChange;\n            }\n\n            m_monitoredItems.Add(monitoredItem);\n\n            return monitoredItem;\n        }\n\n        /// <summary>\n        /// Deletes the monitored item.\n        /// </summary>\n        /// <param name=\"monitoredItem\"></param>\n        public void DeleteItem(IMonitoredItem monitoredItem)\n        {\n            if (m_monitoredItems != null)\n            {\n                for (int ii = 0; ii < m_monitoredItems.Count; ii++)\n                {\n                    if (ReferenceEquals(monitoredItem, m_monitoredItems[ii]))\n                    {\n                        m_monitoredItems.RemoveAt(ii);\n                        break;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handles change events raised by the node.\n        /// </summary>\n        /// <param name=\"context\">The system context.</param>\n        /// <param name=\"state\">The node that raised the event.</param>\n        /// <param name=\"masks\">What caused the event to be raised</param>\n        public void OnNodeChange(\n            ISystemContext context,\n            NodeState state,\n            NodeStateChangeMasks masks)\n        {\n            if (m_monitoredItems != null)\n            {\n                for (int ii = 0; ii < m_monitoredItems.Count; ii++)\n                {\n                    DataChangeMonitoredItem monitoredItem = m_monitoredItems[ii];\n\n                    // check if the node has been deleted.\n                    if ((masks & NodeStateChangeMasks.Deleted) != 0)\n                    {\n                        monitoredItem.QueueValue(null, StatusCodes.BadNodeIdUnknown, false);\n                        continue;\n                    }\n\n                    if (monitoredItem.AttributeId == Attributes.Value)\n                    {\n                        if ((masks & NodeStateChangeMasks.Value) != 0)\n                        {\n                            monitoredItem.ValueChanged(context);\n                        }\n                    }\n                    else if ((masks & NodeStateChangeMasks.NonValue) != 0)\n                    {\n                        monitoredItem.ValueChanged(context);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Subscribes to events produced by the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"eventSubscription\"></param>\n        public void SubscribeToEvents(ISystemContext context, IEventMonitoredItem eventSubscription)\n        {\n            m_eventSubscriptions ??= [];\n\n            if (m_eventSubscriptions.Count == 0)\n            {\n                Node.OnReportEvent = OnReportEvent;\n                Node.SetAreEventsMonitored(context, true, true);\n            }\n\n            for (int ii = 0; ii < m_eventSubscriptions.Count; ii++)\n            {\n                if (ReferenceEquals(eventSubscription, m_eventSubscriptions[ii]))\n                {\n                    return;\n                }\n            }\n\n            m_eventSubscriptions.Add(eventSubscription);\n        }\n\n        /// <summary>\n        /// Unsubscribes to events produced by the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"eventSubscription\"></param>\n        public void UnsubscribeToEvents(\n            ISystemContext context,\n            IEventMonitoredItem eventSubscription)\n        {\n            if (m_eventSubscriptions != null)\n            {\n                for (int ii = 0; ii < m_eventSubscriptions.Count; ii++)\n                {\n                    if (ReferenceEquals(eventSubscription, m_eventSubscriptions[ii]))\n                    {\n                        m_eventSubscriptions.RemoveAt(ii);\n\n                        if (m_eventSubscriptions.Count == 0)\n                        {\n                            Node.SetAreEventsMonitored(context, false, true);\n                            Node.OnReportEvent = null;\n                        }\n\n                        break;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handles events reported by the node.\n        /// </summary>\n        /// <param name=\"context\">The system context.</param>\n        /// <param name=\"state\">The node that raised the event.</param>\n        /// <param name=\"e\">The event to report.</param>\n        public void OnReportEvent(ISystemContext context, NodeState state, IFilterTarget e)\n        {\n            if (m_eventSubscriptions != null)\n            {\n                for (int ii = 0; ii < m_eventSubscriptions.Count; ii++)\n                {\n                    m_eventSubscriptions[ii].QueueEvent(e);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Resends the events for any conditions belonging to the node or its children.\n        /// </summary>\n        /// <param name=\"context\">The system context.</param>\n        /// <param name=\"monitoredItem\">The item to refresh.</param>\n        public void ConditionRefresh(ISystemContext context, IEventMonitoredItem monitoredItem)\n        {\n            if (m_eventSubscriptions != null)\n            {\n                for (int ii = 0; ii < m_eventSubscriptions.Count; ii++)\n                {\n                    // only process items monitoring this node.\n                    if (!ReferenceEquals(monitoredItem, m_eventSubscriptions[ii]))\n                    {\n                        continue;\n                    }\n\n                    // get the set of condition events for the node and its children.\n                    var events = new List<IFilterTarget>();\n                    Node.ConditionRefresh(context, events, true);\n\n                    // report the events to the monitored item.\n                    for (int jj = 0; jj < events.Count; jj++)\n                    {\n                        monitoredItem.QueueEvent(events[jj]);\n                    }\n                }\n            }\n        }\n\n        private List<IEventMonitoredItem> m_eventSubscriptions;\n        private List<DataChangeMonitoredItem> m_monitoredItems;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Common/SampleNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2022 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading;\nusing Opc.Ua.Server;\n\nnamespace Opc.Ua.Sample\n{\n    /// <summary>\n    /// A node manager for a variety of test data.\n    /// </summary>\n    public class SampleNodeManager : INodeManager, INodeIdFactory, IDisposable\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        public SampleNodeManager(IServerInternal server)\n        {\n            // save a reference to the server that owns the node manager.\n            Server = server;\n\n            // create the default context.\n            SystemContext = Server.DefaultSystemContext.Copy();\n\n            SystemContext.SystemHandle = null;\n            SystemContext.NodeIdFactory = this;\n\n            // create the table of nodes.\n            PredefinedNodes = [];\n            RootNotifiers = [];\n            _sampledItems = [];\n            _minimumSamplingInterval = 100;\n        }\n\n        /// <summary>\n        /// Frees any unmanaged resources.\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                lock (Lock)\n                {\n                    Utils.SilentDispose(_samplingTimer);\n                    _samplingTimer = null;\n\n                    foreach (NodeState node in PredefinedNodes.Values)\n                    {\n                        Utils.SilentDispose(node);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The node.</param>\n        /// <returns>The new NodeId.</returns>\n        public virtual NodeId New(ISystemContext context, NodeState node)\n        {\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Acquires the lock on the node manager.\n        /// </summary>\n        public object Lock { get; } = new object();\n\n        /// <summary>\n        /// The server that the node manager belongs to.\n        /// </summary>\n        protected IServerInternal Server { get; }\n\n        /// <summary>\n        /// The default context to use.\n        /// </summary>\n        protected ServerSystemContext SystemContext { get; }\n\n        /// <summary>\n        /// The predefined nodes managed by the node manager.\n        /// </summary>\n        protected NodeIdDictionary<NodeState> PredefinedNodes { get; }\n\n        /// <summary>\n        /// The root notifiers for the node manager.\n        /// </summary>\n        protected List<NodeState> RootNotifiers { get; }\n\n        /// <summary>\n        /// Returns true if the namespace for the node id is one of the namespaces managed by the node manager.\n        /// </summary>\n        /// <param name=\"nodeId\">The node id to check.</param>\n        /// <returns>True if the namespace is one of the nodes.</returns>\n        protected virtual bool IsNodeIdInNamespace(NodeId nodeId)\n        {\n            if (NodeId.IsNull(nodeId))\n            {\n                return false;\n            }\n\n            // quickly exclude nodes that not in the namespace.\n            for (int ii = 0; ii < _namespaceIndexes.Length; ii++)\n            {\n                if (nodeId.NamespaceIndex == _namespaceIndexes[ii])\n                {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Returns the node if the handle refers to a node managed by this manager.\n        /// </summary>\n        /// <param name=\"managerHandle\">The handle to check.</param>\n        /// <returns>Non-null if the handle belongs to the node manager.</returns>\n        protected virtual NodeState IsHandleInNamespace(object managerHandle)\n        {\n            if (managerHandle is not NodeState source)\n            {\n                return null;\n            }\n\n            if (!IsNodeIdInNamespace(source.NodeId))\n            {\n                return null;\n            }\n\n            return source;\n        }\n\n        /// <summary>\n        /// Returns the state object for the specified node if it exists.\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        public NodeState Find(NodeId nodeId)\n        {\n            lock (Lock)\n            {\n                if (!PredefinedNodes.TryGetValue(nodeId, out NodeState node))\n                {\n                    return null;\n                }\n\n                return node;\n            }\n        }\n\n        /// <summary>\n        /// Creates a new instance and assigns unique identifiers to all children.\n        /// </summary>\n        /// <param name=\"context\">The operation context.</param>\n        /// <param name=\"parentId\">An optional parent identifier.</param>\n        /// <param name=\"referenceTypeId\">The reference type from the parent.</param>\n        /// <param name=\"browseName\">The browse name.</param>\n        /// <param name=\"instance\">The instance to create.</param>\n        /// <returns>The new node id.</returns>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        public NodeId CreateNode(\n            ServerSystemContext context,\n            NodeId parentId,\n            NodeId referenceTypeId,\n            QualifiedName browseName,\n            BaseInstanceState instance)\n        {\n            ServerSystemContext contextToUse = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                instance.ReferenceTypeId = referenceTypeId;\n\n                NodeState parent = null;\n\n                if (parentId != null)\n                {\n                    if (!PredefinedNodes.TryGetValue(parentId, out parent))\n                    {\n                        throw ServiceResultException.Create(\n                            StatusCodes.BadNodeIdUnknown,\n                            \"Cannot find parent with id: {0}\",\n                            parentId);\n                    }\n\n                    parent.AddChild(instance);\n                }\n\n                instance.Create(contextToUse, null, browseName, null, true);\n                AddPredefinedNode(contextToUse, instance);\n\n                return instance.NodeId;\n            }\n        }\n\n        /// <summary>\n        /// Deletes a node and all of its children.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        public bool DeleteNode(ServerSystemContext context, NodeId nodeId)\n        {\n            ServerSystemContext contextToUse = SystemContext.Copy(context);\n\n            bool found = false;\n            var referencesToRemove = new List<LocalReference>();\n\n            lock (Lock)\n            {\n                if (PredefinedNodes.TryGetValue(nodeId, out NodeState node))\n                {\n                    RemovePredefinedNode(contextToUse, node, referencesToRemove);\n                    found = true;\n                }\n\n                RemoveRootNotifier(node);\n            }\n\n            // must release the lock before removing cross references to other node managers.\n            if (referencesToRemove.Count > 0)\n            {\n                Server.NodeManager.RemoveReferences(referencesToRemove);\n            }\n\n            return found;\n        }\n\n        /// <summary>\n        /// Adds all encodeable types defined in a node manager to the server factory.\n        /// </summary>\n        /// <param name=\"assembly\">The assembly which contains the encodeable types.</param>\n        /// <param name=\"filter\">A filter with which the FullName of the type must start.</param>\n        protected void AddEncodeableNodeManagerTypes(Assembly assembly, string filter)\n        {\n            Server.Factory.AddEncodeableTypes(\n                assembly.GetExportedTypes().Where(t => t.FullName.StartsWith(filter, StringComparison.Ordinal)));\n        }\n\n        /// <summary>\n        /// Returns the namespaces used by the node manager.\n        /// </summary>\n        /// <remarks>\n        /// All NodeIds exposed by the node manager must be qualified by a namespace URI. This property\n        /// returns the URIs used by the node manager. In this example all NodeIds use a single URI.\n        /// </remarks>\n        public virtual IEnumerable<string> NamespaceUris\n        {\n            get => _namespaceUris;\n            protected set\n            {\n                if (value != null)\n                {\n                    _namespaceUris = [.. value];\n                }\n                else\n                {\n                    _namespaceUris = [];\n                }\n\n                _namespaceIndexes = new ushort[_namespaceUris.Count];\n            }\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public virtual void CreateAddressSpace(\n            IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                // add the uris to the server's namespace table and cache the indexes.\n                for (int ii = 0; ii < _namespaceUris.Count; ii++)\n                {\n                    _namespaceIndexes[ii] = Server.NamespaceUris\n                        .GetIndexOrAppend(_namespaceUris[ii]);\n                }\n\n                LoadPredefinedNodes(SystemContext, externalReferences);\n            }\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and adds them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"assembly\"></param>\n        /// <param name=\"resourcePath\"></param>\n        /// <param name=\"externalReferences\"></param>\n        public virtual void LoadPredefinedNodes(\n            ISystemContext context,\n            Assembly assembly,\n            string resourcePath,\n            IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            // load the predefined nodes from an XML document.\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromResource(context, resourcePath, assembly, true);\n\n            // add the predefined nodes to the node manager.\n            for (int ii = 0; ii < predefinedNodes.Count; ii++)\n            {\n                AddPredefinedNode(context, predefinedNodes[ii]);\n            }\n\n            // ensure the reverse references exist.\n            AddReverseReferences(externalReferences);\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and adds them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected virtual NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            return [];\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and adds them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"externalReferences\"></param>\n        protected virtual void LoadPredefinedNodes(\n            ISystemContext context,\n            IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            // load the predefined nodes from an XML document.\n            NodeStateCollection predefinedNodes = LoadPredefinedNodes(context);\n\n            // add the predefined nodes to the node manager.\n            for (int ii = 0; ii < predefinedNodes.Count; ii++)\n            {\n                AddPredefinedNode(context, predefinedNodes[ii]);\n            }\n\n            // ensure the reverse references exist.\n            AddReverseReferences(externalReferences);\n        }\n\n        /// <summary>\n        /// Replaces the generic node with a node specific to the model.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"predefinedNode\"></param>\n        protected virtual NodeState AddBehaviourToPredefinedNode(\n            ISystemContext context,\n            NodeState predefinedNode)\n        {\n            if (predefinedNode is not BaseObjectState)\n            {\n                return predefinedNode;\n            }\n\n            return predefinedNode;\n        }\n\n        /// <summary>\n        /// Recursively indexes the node and its children.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected virtual void AddPredefinedNode(ISystemContext context, NodeState node)\n        {\n            NodeState activeNode = AddBehaviourToPredefinedNode(context, node);\n            PredefinedNodes[activeNode.NodeId] = activeNode;\n\n            if (activeNode is BaseTypeState type)\n            {\n                AddTypesToTypeTree(type);\n            }\n\n            var children = new List<BaseInstanceState>();\n            activeNode.GetChildren(context, children);\n\n            for (int ii = 0; ii < children.Count; ii++)\n            {\n                AddPredefinedNode(context, children[ii]);\n            }\n        }\n\n        /// <summary>\n        /// Recursively indexes the node and its children.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        /// <param name=\"referencesToRemove\"></param>\n        protected virtual void RemovePredefinedNode(\n            ISystemContext context,\n            NodeState node,\n            List<LocalReference> referencesToRemove)\n        {\n            PredefinedNodes.Remove(node.NodeId);\n            node.UpdateChangeMasks(NodeStateChangeMasks.Deleted);\n            node.ClearChangeMasks(context, false);\n            OnNodeRemoved(node);\n\n            // remove from the parent.\n\n            if (node is BaseInstanceState instance && instance.Parent != null)\n            {\n                instance.Parent.RemoveChild(instance);\n            }\n\n            // remove children.\n            var children = new List<BaseInstanceState>();\n            node.GetChildren(context, children);\n\n            for (int ii = 0; ii < children.Count; ii++)\n            {\n                node.RemoveChild(children[ii]);\n            }\n\n            for (int ii = 0; ii < children.Count; ii++)\n            {\n                RemovePredefinedNode(context, children[ii], referencesToRemove);\n            }\n\n            // remove from type table.\n\n            if (node is BaseTypeState type)\n            {\n                Server.TypeTree.Remove(type.NodeId);\n            }\n\n            // remove inverse references.\n            var references = new List<IReference>();\n            node.GetReferences(context, references);\n\n            for (int ii = 0; ii < references.Count; ii++)\n            {\n                IReference reference = references[ii];\n\n                if (reference.TargetId.IsAbsolute)\n                {\n                    continue;\n                }\n\n                var referenceToRemove = new LocalReference(\n                    (NodeId)reference.TargetId,\n                    reference.ReferenceTypeId,\n                    !reference.IsInverse,\n                    node.NodeId);\n\n                referencesToRemove.Add(referenceToRemove);\n            }\n        }\n\n        /// <summary>\n        /// Called after a node has been deleted.\n        /// </summary>\n        /// <param name=\"node\"></param>\n        protected virtual void OnNodeRemoved(NodeState node)\n        {\n            // overridden by the sub-class.\n        }\n\n        /// <summary>\n        /// Add the node to the set of root notifiers.\n        /// </summary>\n        /// <param name=\"notifier\"></param>\n        protected virtual void AddRootNotifier(NodeState notifier)\n        {\n            for (int ii = 0; ii < RootNotifiers.Count; ii++)\n            {\n                if (ReferenceEquals(notifier, RootNotifiers[ii]))\n                {\n                    return;\n                }\n            }\n\n            RootNotifiers.Add(notifier);\n\n            // subscribe to existing events.\n            if (Server.EventManager != null)\n            {\n                IList<IEventMonitoredItem> monitoredItems = Server.EventManager.GetMonitoredItems();\n\n                for (int ii = 0; ii < monitoredItems.Count; ii++)\n                {\n                    if (monitoredItems[ii].MonitoringAllEvents)\n                    {\n                        SubscribeToAllEvents(SystemContext, monitoredItems[ii], true, notifier);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Remove the node from the set of root notifiers.\n        /// </summary>\n        /// <param name=\"notifier\"></param>\n        protected virtual void RemoveRootNotifier(NodeState notifier)\n        {\n            for (int ii = 0; ii < RootNotifiers.Count; ii++)\n            {\n                if (ReferenceEquals(notifier, RootNotifiers[ii]))\n                {\n                    RootNotifiers.RemoveAt(ii);\n                    break;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Ensures that all reverse references exist.\n        /// </summary>\n        /// <param name=\"externalReferences\">A list of references to add to external targets.</param>\n        protected virtual void AddReverseReferences(\n            IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            foreach (NodeState source in PredefinedNodes.Values)\n            {\n                // assign a default value to any variable value.\n\n                if (source is BaseVariableState variable && variable.Value == null)\n                {\n                    variable.Value = TypeInfo.GetDefaultValue(\n                        variable.DataType,\n                        variable.ValueRank,\n                        Server.TypeTree);\n                }\n\n                // add reference from supertype for type nodes.\n                /*\n                BaseTypeState type = source as BaseTypeState;\n\n                if (type != null && !NodeId.IsNull(type.SuperTypeId))\n                {\n                    if (!IsNodeIdInNamespace(type.SuperTypeId))\n                    {\n                        AddExternalReference(\n                            type.SuperTypeId,\n                            ReferenceTypeIds.HasSubtype,\n                            false,\n                            type.NodeId,\n                            externalReferences);\n                    }\n                }\n                */\n\n                IList<IReference> references = [];\n                source.GetReferences(SystemContext, references);\n\n                for (int ii = 0; ii < references.Count; ii++)\n                {\n                    IReference reference = references[ii];\n\n                    // nothing to do with external nodes.\n                    if (reference.TargetId?.IsAbsolute != false)\n                    {\n                        continue;\n                    }\n\n                    var targetId = (NodeId)reference.TargetId;\n\n                    // add inverse reference to internal targets.\n                    if (PredefinedNodes.TryGetValue(targetId, out NodeState target))\n                    {\n                        if (!target.ReferenceExists(\n                            reference.ReferenceTypeId,\n                            !reference.IsInverse,\n                            source.NodeId))\n                        {\n                            target.AddReference(\n                                reference.ReferenceTypeId,\n                                !reference.IsInverse,\n                                source.NodeId);\n                        }\n\n                        continue;\n                    }\n\n                    // check for inverse references to external notifiers.\n                    if (reference.IsInverse &&\n                        reference.ReferenceTypeId == ReferenceTypeIds.HasNotifier)\n                    {\n                        AddRootNotifier(source);\n                    }\n\n                    // nothing more to do for references to nodes managed by this manager.\n                    if (IsNodeIdInNamespace(targetId))\n                    {\n                        continue;\n                    }\n\n                    // add external reference.\n                    AddExternalReference(\n                        targetId,\n                        reference.ReferenceTypeId,\n                        !reference.IsInverse,\n                        source.NodeId,\n                        externalReferences);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Adds an external reference to the dictionary.\n        /// </summary>\n        /// <param name=\"sourceId\"></param>\n        /// <param name=\"referenceTypeId\"></param>\n        /// <param name=\"isInverse\"></param>\n        /// <param name=\"targetId\"></param>\n        /// <param name=\"externalReferences\"></param>\n        protected void AddExternalReference(\n            NodeId sourceId,\n            NodeId referenceTypeId,\n            bool isInverse,\n            NodeId targetId,\n            IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            // get list of references to external nodes.\n            if (!externalReferences.TryGetValue(sourceId, out IList<IReference> referencesToAdd))\n            {\n                externalReferences[sourceId] = referencesToAdd = [];\n            }\n\n            // add reserve reference from external node.\n            var referenceToAdd = new ReferenceNode\n            {\n                ReferenceTypeId = referenceTypeId,\n                IsInverse = isInverse,\n                TargetId = targetId\n            };\n\n            referencesToAdd.Add(referenceToAdd);\n        }\n\n        /// <summary>\n        /// Recursively adds the types to the type tree.\n        /// </summary>\n        /// <param name=\"type\"></param>\n        protected void AddTypesToTypeTree(BaseTypeState type)\n        {\n            if (!NodeId.IsNull(type.SuperTypeId) && !Server.TypeTree.IsKnown(type.SuperTypeId))\n            {\n                AddTypesToTypeTree(type.SuperTypeId);\n            }\n\n            if (type.NodeClass != NodeClass.ReferenceType)\n            {\n                Server.TypeTree.AddSubtype(type.NodeId, type.SuperTypeId);\n            }\n            else\n            {\n                Server.TypeTree.AddReferenceSubtype(type.NodeId, type.SuperTypeId, type.BrowseName);\n            }\n        }\n\n        /// <summary>\n        /// Recursively adds the types to the type tree.\n        /// </summary>\n        /// <param name=\"typeId\"></param>\n        protected void AddTypesToTypeTree(NodeId typeId)\n        {\n            if (Find(typeId) is not BaseTypeState type)\n            {\n                return;\n            }\n\n            AddTypesToTypeTree(type);\n        }\n\n        /// <summary>\n        /// Finds the specified node and checks if it is of the expected type.\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"expectedType\"></param>\n        /// <returns>Returns null if not found or not of the correct type.</returns>\n        public NodeState FindPredefinedNode(NodeId nodeId, Type expectedType)\n        {\n            if (nodeId == null)\n            {\n                return null;\n            }\n\n            if (!PredefinedNodes.TryGetValue(nodeId, out NodeState node))\n            {\n                return null;\n            }\n\n            if (expectedType?.IsInstanceOfType(node) == false)\n            {\n                return null;\n            }\n\n            return node;\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public virtual void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                PredefinedNodes.Clear();\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <remarks>\n        /// This must efficiently determine whether the node belongs to the node manager. If it does belong to\n        /// NodeManager it should return a handle that does not require the NodeId to be validated again when\n        /// the handle is passed into other methods such as 'Read' or 'Write'.\n        /// </remarks>\n        public virtual object GetManagerHandle(NodeId nodeId)\n        {\n            lock (Lock)\n            {\n                return GetManagerHandle(SystemContext, nodeId, null);\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        /// <remarks>\n        /// This must efficiently determine whether the node belongs to the node manager. If it does belong to\n        /// NodeManager it should return a handle that does not require the NodeId to be validated again when\n        /// the handle is passed into other methods such as 'Read' or 'Write'.\n        /// </remarks>\n        protected virtual object GetManagerHandle(\n            ISystemContext context,\n            NodeId nodeId,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // lookup the node.\n\n                if (!PredefinedNodes.TryGetValue(nodeId, out NodeState node))\n                {\n                    return null;\n                }\n\n                return node;\n            }\n        }\n\n        /// <summary>\n        /// This method is used to add bi-directional references to nodes from other node managers.\n        /// </summary>\n        /// <param name=\"references\"></param>\n        /// <remarks>\n        /// The additional references are optional, however, the NodeManager should support them.\n        /// </remarks>\n        public virtual void AddReferences(IDictionary<NodeId, IList<IReference>> references)\n        {\n            lock (Lock)\n            {\n                foreach (KeyValuePair<NodeId, IList<IReference>> current in references)\n                {\n                    // check for valid handle.\n                    if (GetManagerHandle(SystemContext, current.Key, null) is not NodeState source)\n                    {\n                        continue;\n                    }\n\n                    // add reference to external target.\n                    foreach (IReference reference in current.Value)\n                    {\n                        source.AddReference(\n                            reference.ReferenceTypeId,\n                            reference.IsInverse,\n                            reference.TargetId);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// This method is used to delete bi-directional references to nodes from other node managers.\n        /// </summary>\n        /// <param name=\"sourceHandle\"></param>\n        /// <param name=\"referenceTypeId\"></param>\n        /// <param name=\"isInverse\"></param>\n        /// <param name=\"targetId\"></param>\n        /// <param name=\"deleteBidirectional\"></param>\n        public virtual ServiceResult DeleteReference(\n            object sourceHandle,\n            NodeId referenceTypeId,\n            bool isInverse,\n            ExpandedNodeId targetId,\n            bool deleteBidirectional)\n        {\n            lock (Lock)\n            {\n                // check for valid handle.\n                NodeState source = IsHandleInNamespace(sourceHandle);\n\n                if (source == null)\n                {\n                    return StatusCodes.BadNodeIdUnknown;\n                }\n\n                source.RemoveReference(referenceTypeId, isInverse, targetId);\n\n                if (deleteBidirectional)\n                {\n                    // check if the target is also managed by the node manager.\n                    if (!targetId.IsAbsolute)\n                    {\n                        var target = GetManagerHandle(\n                            SystemContext,\n                            (NodeId)targetId,\n                            null) as NodeState;\n\n                        target?.RemoveReference(referenceTypeId, !isInverse, source.NodeId);\n                    }\n                }\n\n                return ServiceResult.Good;\n            }\n        }\n\n        /// <summary>\n        /// Returns the basic metadata for the node. Returns null if the node does not exist.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"targetHandle\"></param>\n        /// <param name=\"resultMask\"></param>\n        /// <remarks>\n        /// This method validates any placeholder handle.\n        /// </remarks>\n        public virtual NodeMetadata GetNodeMetadata(\n            OperationContext context,\n            object targetHandle,\n            BrowseResultMask resultMask)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                // check for valid handle.\n                NodeState target = IsHandleInNamespace(targetHandle);\n\n                if (target == null)\n                {\n                    return null;\n                }\n\n                // validate node.\n                if (!ValidateNode(systemContext, target))\n                {\n                    return null;\n                }\n\n                // read the attributes.\n                List<object> values = target.ReadAttributes(\n                    systemContext,\n                    Attributes.WriteMask,\n                    Attributes.UserWriteMask,\n                    Attributes.DataType,\n                    Attributes.ValueRank,\n                    Attributes.ArrayDimensions,\n                    Attributes.AccessLevel,\n                    Attributes.UserAccessLevel,\n                    Attributes.EventNotifier,\n                    Attributes.Executable,\n                    Attributes.UserExecutable);\n\n                // construct the metadata object.\n\n                var metadata = new NodeMetadata(target, target.NodeId)\n                {\n                    NodeClass = target.NodeClass,\n                    BrowseName = target.BrowseName,\n                    DisplayName = target.DisplayName\n                };\n\n                if (values[0] != null && values[1] != null)\n                {\n                    metadata.WriteMask = (AttributeWriteMask)(((uint)values[0]) &\n                        ((uint)values[1]));\n                }\n\n                metadata.DataType = (NodeId)values[2];\n\n                if (values[3] != null)\n                {\n                    metadata.ValueRank = (int)values[3];\n                }\n\n                metadata.ArrayDimensions = (IList<uint>)values[4];\n\n                if (values[5] != null && values[6] != null)\n                {\n                    metadata.AccessLevel = (byte)(((byte)values[5]) & ((byte)values[6]));\n                }\n\n                if (values[7] != null)\n                {\n                    metadata.EventNotifier = (byte)values[7];\n                }\n\n                if (values[8] != null && values[9] != null)\n                {\n                    metadata.Executable = ((bool)values[8]) && ((bool)values[9]);\n                }\n\n                // get instance references.\n\n                if (target is BaseInstanceState instance)\n                {\n                    metadata.TypeDefinition = instance.TypeDefinitionId;\n                    metadata.ModellingRule = instance.ModellingRuleId;\n                }\n\n                // fill in the common attributes.\n                return metadata;\n            }\n        }\n\n        /// <summary>\n        /// Browses the references from a node managed by the node manager.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        /// <param name=\"references\"></param>\n        /// <remarks>\n        /// The continuation point is created for every browse operation and contains the browse parameters.\n        /// The node manager can store its state information in the Data and Index properties.\n        /// </remarks>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"continuationPoint\"/> is <c>null</c>.</exception>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        public virtual void Browse(\n            OperationContext context,\n            ref ContinuationPoint continuationPoint,\n            IList<ReferenceDescription> references)\n        {\n            ArgumentNullException.ThrowIfNull(continuationPoint);\n            ArgumentNullException.ThrowIfNull(references);\n\n            // check for view.\n            if (!ViewDescription.IsDefault(continuationPoint.View))\n            {\n                throw new ServiceResultException(StatusCodes.BadViewIdUnknown);\n            }\n\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                // verify that the node exists.\n                NodeState source =\n                    IsHandleInNamespace(continuationPoint.NodeToBrowse)\n                    ?? throw new ServiceResultException(StatusCodes.BadNodeIdUnknown);\n\n                // validate node.\n                if (!ValidateNode(systemContext, source))\n                {\n                    throw new ServiceResultException(StatusCodes.BadNodeIdUnknown);\n                }\n\n                // check for previous continuation point.\n                INodeBrowser browser =\n                    continuationPoint.Data as INodeBrowser\n                    ?? source.CreateBrowser(\n                        systemContext,\n                        continuationPoint.View,\n                        continuationPoint.ReferenceTypeId,\n                        continuationPoint.IncludeSubtypes,\n                        continuationPoint.BrowseDirection,\n                        null,\n                        null,\n                        false);\n\n                // apply filters to references.\n                for (IReference reference = browser.Next();\n                    reference != null;\n                    reference = browser.Next())\n                {\n                    // create the type definition reference.\n                    ReferenceDescription description = GetReferenceDescription(\n                        context,\n                        reference,\n                        continuationPoint);\n\n                    if (description == null)\n                    {\n                        continue;\n                    }\n\n                    // check if limit reached.\n                    if (continuationPoint.MaxResultsToReturn != 0 &&\n                        references.Count >= continuationPoint.MaxResultsToReturn)\n                    {\n                        browser.Push(reference);\n                        continuationPoint.Data = browser;\n                        return;\n                    }\n\n                    references.Add(description);\n                }\n\n                // release the continuation point if all done.\n                continuationPoint.Dispose();\n                continuationPoint = null;\n            }\n        }\n\n        /// <summary>\n        /// Returns the references for the node that meets the criteria specified.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"reference\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        private ReferenceDescription GetReferenceDescription(\n            OperationContext context,\n            IReference reference,\n            ContinuationPoint continuationPoint)\n        {\n            // create the type definition reference.\n            var description = new ReferenceDescription { NodeId = reference.TargetId };\n            description.SetReferenceType(\n                continuationPoint.ResultMask,\n                reference.ReferenceTypeId,\n                !reference.IsInverse);\n\n            // do not cache target parameters for remote nodes.\n            if (reference.TargetId.IsAbsolute)\n            {\n                // only return remote references if no node class filter is specified.\n                if (continuationPoint.NodeClassMask != 0)\n                {\n                    return null;\n                }\n\n                return description;\n            }\n\n            NodeState target = null;\n\n            // check for local reference.\n\n            if (reference is NodeStateReference referenceInfo)\n            {\n                target = referenceInfo.Target;\n            }\n\n            // check for internal reference.\n            if (target == null)\n            {\n                var targetId = (NodeId)reference.TargetId;\n\n                if (IsNodeIdInNamespace(targetId) &&\n                    !PredefinedNodes.TryGetValue(targetId, out target))\n                {\n                    target = null;\n                }\n            }\n\n            // the target may be a reference to a node in another node manager. In these cases\n            // the target attributes must be fetched by the caller. The Unfiltered flag tells the\n            // caller to do that.\n            if (target == null)\n            {\n                description.Unfiltered = true;\n                return description;\n            }\n\n            // apply node class filter.\n            if (continuationPoint.NodeClassMask != 0 &&\n                ((continuationPoint.NodeClassMask & (uint)target.NodeClass) == 0))\n            {\n                return null;\n            }\n\n            NodeId typeDefinition = null;\n\n            if (target is BaseInstanceState instance)\n            {\n                typeDefinition = instance.TypeDefinitionId;\n            }\n\n            // set target attributes.\n            description.SetTargetAttributes(\n                continuationPoint.ResultMask,\n                target.NodeClass,\n                target.BrowseName,\n                target.DisplayName,\n                typeDefinition);\n\n            return description;\n        }\n\n        /// <summary>\n        /// Returns the target of the specified browse path fragment(s).\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"sourceHandle\"></param>\n        /// <param name=\"relativePath\"></param>\n        /// <param name=\"targetIds\"></param>\n        /// <param name=\"unresolvedTargetIds\"></param>\n        /// <remarks>\n        /// If reference exists but the node manager does not know the browse name it must\n        /// return the NodeId as an unresolvedTargetIds. The caller will try to check the\n        /// browse name.\n        /// </remarks>\n        public virtual void TranslateBrowsePath(\n            OperationContext context,\n            object sourceHandle,\n            RelativePathElement relativePath,\n            IList<ExpandedNodeId> targetIds,\n            IList<NodeId> unresolvedTargetIds)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n\n            lock (Lock)\n            {\n                // verify that the node exists.\n                NodeState source = IsHandleInNamespace(sourceHandle);\n\n                if (source == null)\n                {\n                    return;\n                }\n\n                // validate node.\n                if (!ValidateNode(systemContext, source))\n                {\n                    return;\n                }\n\n                // get list of references that relative path.\n                INodeBrowser browser = source.CreateBrowser(\n                    systemContext,\n                    null,\n                    relativePath.ReferenceTypeId,\n                    relativePath.IncludeSubtypes,\n                    relativePath.IsInverse ? BrowseDirection.Inverse : BrowseDirection.Forward,\n                    relativePath.TargetName,\n                    null,\n                    false);\n\n                // check the browse names.\n                try\n                {\n                    for (IReference reference = browser.Next();\n                        reference != null;\n                        reference = browser.Next())\n                    {\n                        // ignore unknown external references.\n                        if (reference.TargetId.IsAbsolute)\n                        {\n                            continue;\n                        }\n\n                        NodeState target = null;\n\n                        // check for local reference.\n\n                        if (reference is NodeStateReference referenceInfo)\n                        {\n                            target = referenceInfo.Target;\n                        }\n\n                        if (target == null)\n                        {\n                            var targetId = (NodeId)reference.TargetId;\n\n                            // the target may be a reference to a node in another node manager.\n                            if (!IsNodeIdInNamespace(targetId))\n                            {\n                                unresolvedTargetIds.Add((NodeId)reference.TargetId);\n                                continue;\n                            }\n\n                            // look up the target manually.\n                            target = GetManagerHandle(\n                                systemContext,\n                                targetId,\n                                operationCache) as NodeState;\n\n                            if (target == null)\n                            {\n                                continue;\n                            }\n                        }\n\n                        // check browse name.\n                        if (target.BrowseName == relativePath.TargetName)\n                        {\n                            // ensure duplicate node ids are not added.\n                            if (!targetIds.Contains(reference.TargetId))\n                            {\n                                targetIds.Add(reference.TargetId);\n                            }\n                        }\n                    }\n                }\n                finally\n                {\n                    browser.Dispose();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Reads the value for the specified attribute.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"maxAge\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"values\"></param>\n        /// <param name=\"errors\"></param>\n        public virtual void Read(\n            OperationContext context,\n            double maxAge,\n            IList<ReadValueId> nodesToRead,\n            IList<DataValue> values,\n            IList<ServiceResult> errors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n            var nodesToValidate = new List<ReadWriteOperationState>();\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < nodesToRead.Count; ii++)\n                {\n                    ReadValueId nodeToRead = nodesToRead[ii];\n\n                    // skip items that have already been processed.\n                    if (nodeToRead.Processed)\n                    {\n                        continue;\n                    }\n\n                    // check for valid handle.\n                    if (GetManagerHandle(\n                        systemContext,\n                        nodeToRead.NodeId,\n                        operationCache) is not NodeState source)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    nodeToRead.Processed = true;\n\n                    // create an initial value.\n                    DataValue value = values[ii] = new DataValue();\n\n                    value.Value = null;\n                    value.ServerTimestamp = DateTime.UtcNow;\n                    value.SourceTimestamp = DateTime.MinValue;\n                    value.StatusCode = StatusCodes.Good;\n\n                    // check if the node is ready for reading.\n                    if (source.ValidationRequired)\n                    {\n                        errors[ii] = StatusCodes.BadNodeIdUnknown;\n\n                        // must validate node in a separate operation.\n                        var operation = new ReadWriteOperationState { Source = source, Index = ii };\n\n                        nodesToValidate.Add(operation);\n\n                        continue;\n                    }\n\n                    // read the attribute value.\n                    errors[ii] = source.ReadAttribute(\n                        systemContext,\n                        nodeToRead.AttributeId,\n                        nodeToRead.ParsedIndexRange,\n                        nodeToRead.DataEncoding,\n                        value);\n                }\n\n                // check for nothing to do.\n                if (nodesToValidate.Count == 0)\n                {\n                    return;\n                }\n\n                // validates the nodes (reads values from the underlying data source if required).\n                for (int ii = 0; ii < nodesToValidate.Count; ii++)\n                {\n                    ReadWriteOperationState operation = nodesToValidate[ii];\n\n                    if (!ValidateNode(systemContext, operation.Source))\n                    {\n                        continue;\n                    }\n\n                    ReadValueId nodeToRead = nodesToRead[operation.Index];\n                    DataValue value = values[operation.Index];\n\n                    // update the attribute value.\n                    errors[operation.Index] = operation.Source.ReadAttribute(\n                        systemContext,\n                        nodeToRead.AttributeId,\n                        nodeToRead.ParsedIndexRange,\n                        nodeToRead.DataEncoding,\n                        value);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Stores the state of a call method operation.\n        /// </summary>\n        private struct ReadWriteOperationState\n        {\n            public NodeState Source;\n            public int Index;\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected virtual bool ValidateNode(ServerSystemContext context, NodeState node)\n        {\n            // validate node only if required.\n            if (node.ValidationRequired)\n            {\n                return node.Validate(context);\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Reads the history for the specified nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"releaseContinuationPoints\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        public virtual void HistoryRead(\n            OperationContext context,\n            HistoryReadDetails details,\n            TimestampsToReturn timestampsToReturn,\n            bool releaseContinuationPoints,\n            IList<HistoryReadValueId> nodesToRead,\n            IList<HistoryReadResult> results,\n            IList<ServiceResult> errors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n            var nodesToValidate = new List<ReadWriteOperationState>();\n            var readsToComplete = new List<ReadWriteOperationState>();\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < nodesToRead.Count; ii++)\n                {\n                    HistoryReadValueId nodeToRead = nodesToRead[ii];\n\n                    // skip items that have already been processed.\n                    if (nodeToRead.Processed)\n                    {\n                        continue;\n                    }\n\n                    // check for valid handle.\n                    if (GetManagerHandle(\n                        systemContext,\n                        nodeToRead.NodeId,\n                        operationCache) is not NodeState source)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    nodeToRead.Processed = true;\n\n                    // only variables supported.\n\n                    if (source is not BaseVariableState variable)\n                    {\n                        errors[ii] = StatusCodes.BadHistoryOperationUnsupported;\n                        continue;\n                    }\n\n                    results[ii] = new HistoryReadResult();\n\n                    var operation = new ReadWriteOperationState { Source = source, Index = ii };\n\n                    // check if the node is ready for reading.\n                    if (source.ValidationRequired)\n                    {\n                        // must validate node in a separate operation.\n                        errors[ii] = StatusCodes.BadNodeIdUnknown;\n                        nodesToValidate.Add(operation);\n                        continue;\n                    }\n\n                    // read the data.\n                    readsToComplete.Add(operation);\n                }\n\n                // validates the nodes (reads values from the underlying data source if required).\n                for (int ii = 0; ii < nodesToValidate.Count; ii++)\n                {\n                    ReadWriteOperationState operation = nodesToValidate[ii];\n\n                    if (!ValidateNode(systemContext, operation.Source))\n                    {\n                        continue;\n                    }\n\n                    readsToComplete.Add(operation);\n                }\n            }\n\n            // reads the data without holding onto the lock.\n            for (int ii = 0; ii < readsToComplete.Count; ii++)\n            {\n                ReadWriteOperationState operation = readsToComplete[ii];\n\n                errors[operation.Index] = HistoryRead(\n                    systemContext,\n                    operation.Source,\n                    details,\n                    timestampsToReturn,\n                    releaseContinuationPoints,\n                    nodesToRead[operation.Index],\n                    results[operation.Index]);\n            }\n        }\n\n        /// <summary>\n        /// Reads the history for a single node which has already been validated.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"releaseContinuationPoints\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"result\"></param>\n        protected virtual ServiceResult HistoryRead(\n            ISystemContext context,\n            NodeState source,\n            HistoryReadDetails details,\n            TimestampsToReturn timestampsToReturn,\n            bool releaseContinuationPoints,\n            HistoryReadValueId nodesToRead,\n            HistoryReadResult result)\n        {\n            // check for variable.\n            if (source is not BaseVariableState variable)\n            {\n                return StatusCodes.BadHistoryOperationUnsupported;\n            }\n\n            // check for access.\n            lock (Lock)\n            {\n                if ((variable.AccessLevel & AccessLevels.HistoryRead) == 0)\n                {\n                    return StatusCodes.BadNotReadable;\n                }\n            }\n\n            // handle read raw.\n\n            if (details is ReadRawModifiedDetails readRawDetails)\n            {\n                return HistoryReadRaw(\n                    context,\n                    variable,\n                    readRawDetails,\n                    timestampsToReturn,\n                    releaseContinuationPoints,\n                    nodesToRead,\n                    result);\n            }\n\n            // handle read processed.\n            if (details is ReadProcessedDetails readProcessedDetails)\n            {\n                return HistoryReadProcessed(\n                    context,\n                    variable,\n                    readProcessedDetails,\n                    timestampsToReturn,\n                    releaseContinuationPoints,\n                    nodesToRead,\n                    result);\n            }\n\n            // handle read processed.\n            if (details is ReadAtTimeDetails readAtTimeDetails)\n            {\n                return HistoryReadAtTime(\n                    context,\n                    variable,\n                    readAtTimeDetails,\n                    timestampsToReturn,\n                    releaseContinuationPoints,\n                    nodesToRead,\n                    result);\n            }\n\n            return StatusCodes.BadHistoryOperationUnsupported;\n        }\n\n        /// <summary>\n        /// Reads the raw history for the variable value.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"releaseContinuationPoints\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        /// <param name=\"result\"></param>\n        protected virtual ServiceResult HistoryReadRaw(\n            ISystemContext context,\n            BaseVariableState source,\n            ReadRawModifiedDetails details,\n            TimestampsToReturn timestampsToReturn,\n            bool releaseContinuationPoints,\n            HistoryReadValueId nodeToRead,\n            HistoryReadResult result)\n        {\n            return StatusCodes.BadHistoryOperationUnsupported;\n        }\n\n        /// <summary>\n        /// Reads the processed history for the variable value.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"releaseContinuationPoints\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        /// <param name=\"result\"></param>\n        protected virtual ServiceResult HistoryReadProcessed(\n            ISystemContext context,\n            BaseVariableState source,\n            ReadProcessedDetails details,\n            TimestampsToReturn timestampsToReturn,\n            bool releaseContinuationPoints,\n            HistoryReadValueId nodeToRead,\n            HistoryReadResult result)\n        {\n            return StatusCodes.BadHistoryOperationUnsupported;\n        }\n\n        /// <summary>\n        /// Reads the history for the variable value.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"releaseContinuationPoints\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        /// <param name=\"result\"></param>\n        protected virtual ServiceResult HistoryReadAtTime(\n            ISystemContext context,\n            BaseVariableState source,\n            ReadAtTimeDetails details,\n            TimestampsToReturn timestampsToReturn,\n            bool releaseContinuationPoints,\n            HistoryReadValueId nodeToRead,\n            HistoryReadResult result)\n        {\n            return StatusCodes.BadHistoryOperationUnsupported;\n        }\n\n        /// <summary>\n        /// Writes the value for the specified attributes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToWrite\"></param>\n        /// <param name=\"errors\"></param>\n        public virtual void Write(\n            OperationContext context,\n            IList<WriteValue> nodesToWrite,\n            IList<ServiceResult> errors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n            var nodesToValidate = new List<ReadWriteOperationState>();\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < nodesToWrite.Count; ii++)\n                {\n                    WriteValue nodeToWrite = nodesToWrite[ii];\n\n                    // skip items that have already been processed.\n                    if (nodeToWrite.Processed)\n                    {\n                        continue;\n                    }\n\n                    // check for valid handle.\n                    if (GetManagerHandle(\n                        systemContext,\n                        nodeToWrite.NodeId,\n                        operationCache) is not NodeState source)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    nodeToWrite.Processed = true;\n\n                    // index range is not supported.\n                    if (!string.IsNullOrEmpty(nodeToWrite.IndexRange))\n                    {\n                        errors[ii] = StatusCodes.BadWriteNotSupported;\n                        continue;\n                    }\n\n                    // check if the node is ready for reading.\n                    if (source.ValidationRequired)\n                    {\n                        errors[ii] = StatusCodes.BadNodeIdUnknown;\n\n                        // must validate node in a separate operation.\n                        var operation = new ReadWriteOperationState { Source = source, Index = ii };\n\n                        nodesToValidate.Add(operation);\n\n                        continue;\n                    }\n\n                    // write the attribute value.\n                    errors[ii] = source.WriteAttribute(\n                        systemContext,\n                        nodeToWrite.AttributeId,\n                        nodeToWrite.ParsedIndexRange,\n                        nodeToWrite.Value);\n\n                    // updates to source finished - report changes to monitored items.\n                    source.ClearChangeMasks(systemContext, false);\n                }\n\n                // check for nothing to do.\n                if (nodesToValidate.Count == 0)\n                {\n                    return;\n                }\n\n                // validates the nodes (reads values from the underlying data source if required).\n                for (int ii = 0; ii < nodesToValidate.Count; ii++)\n                {\n                    ReadWriteOperationState operation = nodesToValidate[ii];\n\n                    if (!ValidateNode(systemContext, operation.Source))\n                    {\n                        continue;\n                    }\n\n                    WriteValue nodeToWrite = nodesToWrite[operation.Index];\n\n                    // write the attribute value.\n                    errors[operation.Index] = operation.Source.WriteAttribute(\n                        systemContext,\n                        nodeToWrite.AttributeId,\n                        nodeToWrite.ParsedIndexRange,\n                        nodeToWrite.Value);\n\n                    // updates to source finished - report changes to monitored items.\n                    operation.Source.ClearChangeMasks(systemContext, false);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates the history for the specified nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"detailsType\"></param>\n        /// <param name=\"nodesToUpdate\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        public virtual void HistoryUpdate(\n            OperationContext context,\n            Type detailsType,\n            IList<HistoryUpdateDetails> nodesToUpdate,\n            IList<HistoryUpdateResult> results,\n            IList<ServiceResult> errors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n            var nodesToValidate = new List<ReadWriteOperationState>();\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < nodesToUpdate.Count; ii++)\n                {\n                    HistoryUpdateDetails nodeToUpdate = nodesToUpdate[ii];\n\n                    // skip items that have already been processed.\n                    if (nodeToUpdate.Processed)\n                    {\n                        continue;\n                    }\n\n                    // check for valid handle.\n                    if (GetManagerHandle(\n                        systemContext,\n                        nodeToUpdate.NodeId,\n                        operationCache) is not NodeState source)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    nodeToUpdate.Processed = true;\n\n                    // check if the node is ready for reading.\n                    if (source.ValidationRequired)\n                    {\n                        errors[ii] = StatusCodes.BadNodeIdUnknown;\n\n                        // must validate node in a separate operation.\n                        var operation = new ReadWriteOperationState { Source = source, Index = ii };\n\n                        nodesToValidate.Add(operation);\n\n                        continue;\n                    }\n\n                    // historical data not available.\n                    errors[ii] = StatusCodes.BadHistoryOperationUnsupported;\n                }\n\n                // check for nothing to do.\n                if (nodesToValidate.Count == 0)\n                {\n                    return;\n                }\n\n                // validates the nodes (reads values from the underlying data source if required).\n                for (int ii = 0; ii < nodesToValidate.Count; ii++)\n                {\n                    ReadWriteOperationState operation = nodesToValidate[ii];\n\n                    if (!ValidateNode(systemContext, operation.Source))\n                    {\n                        continue;\n                    }\n\n                    // historical data not available.\n                    errors[ii] = StatusCodes.BadHistoryOperationUnsupported;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Calls a method on the specified nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"methodsToCall\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        public virtual void Call(\n            OperationContext context,\n            IList<CallMethodRequest> methodsToCall,\n            IList<CallMethodResult> results,\n            IList<ServiceResult> errors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n            var nodesToValidate = new List<CallOperationState>();\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < methodsToCall.Count; ii++)\n                {\n                    CallMethodRequest methodToCall = methodsToCall[ii];\n\n                    // skip items that have already been processed.\n                    if (methodToCall.Processed)\n                    {\n                        continue;\n                    }\n\n                    // check for valid handle.\n                    if (GetManagerHandle(\n                        systemContext,\n                        methodToCall.ObjectId,\n                        operationCache) is not NodeState source)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    methodToCall.Processed = true;\n\n                    // find the method.\n                    MethodState method = source.FindMethod(systemContext, methodToCall.MethodId);\n\n                    if (method == null)\n                    {\n                        // check for loose coupling.\n                        if (source.ReferenceExists(\n                            ReferenceTypeIds.HasComponent,\n                            false,\n                            methodToCall.MethodId))\n                        {\n                            method = (MethodState)FindPredefinedNode(\n                                methodToCall.MethodId,\n                                typeof(MethodState));\n                        }\n\n                        if (method == null)\n                        {\n                            errors[ii] = StatusCodes.BadMethodInvalid;\n                            continue;\n                        }\n                    }\n\n                    CallMethodResult result = results[ii] = new CallMethodResult();\n\n                    // check if the node is ready for reading.\n                    if (source.ValidationRequired)\n                    {\n                        errors[ii] = StatusCodes.BadNodeIdUnknown;\n\n                        // must validate node in a separate operation.\n                        var operation = new CallOperationState\n                        {\n                            Source = source,\n                            Method = method,\n                            Index = ii\n                        };\n\n                        nodesToValidate.Add(operation);\n\n                        continue;\n                    }\n\n                    // call the method.\n                    errors[ii] = Call(systemContext, methodToCall, source, method, result);\n                }\n\n                // check for nothing to do.\n                if (nodesToValidate.Count == 0)\n                {\n                    return;\n                }\n\n                // validates the nodes (reads values from the underlying data source if required).\n                for (int ii = 0; ii < nodesToValidate.Count; ii++)\n                {\n                    CallOperationState operation = nodesToValidate[ii];\n\n                    // validate the object.\n                    if (!ValidateNode(systemContext, operation.Source))\n                    {\n                        continue;\n                    }\n\n                    // call the method.\n                    CallMethodResult result = results[operation.Index];\n\n                    errors[operation.Index] = Call(\n                        systemContext,\n                        methodsToCall[operation.Index],\n                        operation.Source,\n                        operation.Method,\n                        result);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Stores the state of a call method operation.\n        /// </summary>\n        private struct CallOperationState\n        {\n            public NodeState Source;\n            public MethodState Method;\n            public int Index;\n        }\n\n        /// <summary>\n        /// Calls a method on an object.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"methodToCall\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"result\"></param>\n        protected virtual ServiceResult Call(\n            ISystemContext context,\n            CallMethodRequest methodToCall,\n            NodeState source,\n            MethodState method,\n            CallMethodResult result)\n        {\n            var systemContext = context as ServerSystemContext;\n            var argumentErrors = new List<ServiceResult>();\n            var outputArguments = new VariantCollection();\n\n            ServiceResult error = method.Call(\n                context,\n                methodToCall.ObjectId,\n                methodToCall.InputArguments,\n                argumentErrors,\n                outputArguments);\n\n            if (ServiceResult.IsBad(error))\n            {\n                return error;\n            }\n\n            // check for argument errors.\n            bool argumentsValid = true;\n\n            for (int jj = 0; jj < argumentErrors.Count; jj++)\n            {\n                ServiceResult argumentError = argumentErrors[jj];\n\n                if (argumentError != null)\n                {\n                    result.InputArgumentResults.Add(argumentError.StatusCode);\n\n                    if (ServiceResult.IsBad(argumentError))\n                    {\n                        argumentsValid = false;\n                    }\n                }\n                else\n                {\n                    result.InputArgumentResults.Add(StatusCodes.Good);\n                }\n\n                // only fill in diagnostic info if it is requested.\n                if ((systemContext.OperationContext.DiagnosticsMask &\n                    DiagnosticsMasks.OperationAll) != 0)\n                {\n                    if (ServiceResult.IsBad(argumentError))\n                    {\n                        argumentsValid = false;\n                        result.InputArgumentDiagnosticInfos.Add(\n                            new DiagnosticInfo(\n                                argumentError,\n                                systemContext.OperationContext.DiagnosticsMask,\n                                false,\n                                systemContext.OperationContext.StringTable));\n                    }\n                    else\n                    {\n                        result.InputArgumentDiagnosticInfos.Add(null);\n                    }\n                }\n            }\n\n            // check for validation errors.\n            if (!argumentsValid)\n            {\n                result.StatusCode = StatusCodes.BadInvalidArgument;\n                return result.StatusCode;\n            }\n\n            // do not return diagnostics if there are no errors.\n            result.InputArgumentDiagnosticInfos.Clear();\n\n            // return output arguments.\n            result.OutputArguments = outputArguments;\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Subscribes or unsubscribes to events produced by the specified source.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"sourceId\"></param>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"unsubscribe\"></param>\n        /// <remarks>\n        /// This method is called when a event subscription is created or deletes. The node manager\n        /// must  start/stop reporting events for the specified object and all objects below it in\n        /// the notifier hierarchy.\n        /// </remarks>\n        public virtual ServiceResult SubscribeToEvents(\n            OperationContext context,\n            object sourceId,\n            uint subscriptionId,\n            IEventMonitoredItem monitoredItem,\n            bool unsubscribe)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                // check for valid handle.\n                NodeState source = IsHandleInNamespace(sourceId);\n\n                if (source == null)\n                {\n                    return StatusCodes.BadNodeIdInvalid;\n                }\n\n                // check if the object supports subscritions.\n\n                if (sourceId is not BaseObjectState instance ||\n                    instance.EventNotifier != EventNotifiers.SubscribeToEvents)\n                {\n                    return StatusCodes.BadNotSupported;\n                }\n\n                var monitoredNode = instance.Handle as MonitoredNode;\n\n                // handle unsubscribe.\n                if (unsubscribe)\n                {\n                    if (monitoredNode != null)\n                    {\n                        monitoredNode.UnsubscribeToEvents(systemContext, monitoredItem);\n\n                        // do any post processing.\n                        OnUnsubscribeToEvents(systemContext, monitoredNode, monitoredItem);\n                    }\n\n                    return ServiceResult.Good;\n                }\n\n                // subscribe to events.\n                if (monitoredNode == null)\n                {\n                    instance.Handle = monitoredNode = new MonitoredNode(Server, this, source);\n                }\n\n                monitoredNode.SubscribeToEvents(systemContext, monitoredItem);\n\n                // do any post processing.\n                OnSubscribeToEvents(systemContext, monitoredNode, monitoredItem);\n\n                return ServiceResult.Good;\n            }\n        }\n\n        /// <summary>\n        /// Subscribes or unsubscribes to events produced by all event sources.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"unsubscribe\"></param>\n        /// <remarks>\n        /// This method is called when a event subscription is created or deleted. The node\n        /// manager must start/stop reporting events for all objects that it manages.\n        /// </remarks>\n        public virtual ServiceResult SubscribeToAllEvents(\n            OperationContext context,\n            uint subscriptionId,\n            IEventMonitoredItem monitoredItem,\n            bool unsubscribe)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                // update root notifiers.\n                for (int ii = 0; ii < RootNotifiers.Count; ii++)\n                {\n                    SubscribeToAllEvents(\n                        systemContext,\n                        monitoredItem,\n                        unsubscribe,\n                        RootNotifiers[ii]);\n                }\n\n                return ServiceResult.Good;\n            }\n        }\n\n        /// <summary>\n        /// Subscribes/unsubscribes to all events produced by the specified node.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"unsubscribe\"></param>\n        /// <param name=\"source\"></param>\n        protected void SubscribeToAllEvents(\n            ISystemContext systemContext,\n            IEventMonitoredItem monitoredItem,\n            bool unsubscribe,\n            NodeState source)\n        {\n            var monitoredNode = source.Handle as MonitoredNode;\n\n            // handle unsubscribe.\n            if (unsubscribe)\n            {\n                if (monitoredNode != null)\n                {\n                    monitoredNode.UnsubscribeToEvents(systemContext, monitoredItem);\n\n                    // do any post processing.\n                    OnUnsubscribeToEvents(systemContext, monitoredNode, monitoredItem);\n                }\n\n                return;\n            }\n\n            // subscribe to events.\n            if (monitoredNode == null)\n            {\n                source.Handle = monitoredNode = new MonitoredNode(Server, this, source);\n            }\n\n            monitoredNode.SubscribeToEvents(systemContext, monitoredItem);\n\n            // do any post processing.\n            OnSubscribeToEvents(systemContext, monitoredNode, monitoredItem);\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is subscribed to.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        protected virtual void OnSubscribeToEvents(\n            ISystemContext systemContext,\n            MonitoredNode monitoredNode,\n            IEventMonitoredItem monitoredItem)\n        {\n            // does nothing.\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is subscribed to.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        protected virtual void OnUnsubscribeToEvents(\n            ISystemContext systemContext,\n            MonitoredNode monitoredNode,\n            IEventMonitoredItem monitoredItem)\n        {\n            // does nothing.\n        }\n\n        /// <summary>\n        /// Tells the node manager to refresh any conditions associated with the specified monitored items.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"monitoredItems\"></param>\n        /// <remarks>\n        /// This method is called when the condition refresh method is called for a subscription.\n        /// The node manager must create a refresh event for each condition monitored by the subscription.\n        /// </remarks>\n        public virtual ServiceResult ConditionRefresh(\n            OperationContext context,\n            IList<IEventMonitoredItem> monitoredItems)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < monitoredItems.Count; ii++)\n                {\n                    IEventMonitoredItem monitoredItem = monitoredItems[ii];\n\n                    if (monitoredItem == null)\n                    {\n                        continue;\n                    }\n\n                    // check for global subscription.\n                    if (monitoredItem.MonitoringAllEvents)\n                    {\n                        for (int jj = 0; jj < RootNotifiers.Count; jj++)\n                        {\n                            if (RootNotifiers[jj].Handle is not MonitoredNode monitoredNode)\n                            {\n                                continue;\n                            }\n\n                            monitoredNode.ConditionRefresh(systemContext, monitoredItem);\n                        }\n                    }\n                    // check for subscription to local node.\n                    else\n                    {\n                        NodeState source = IsHandleInNamespace(monitoredItem.ManagerHandle);\n\n                        if (source == null)\n                        {\n                            continue;\n                        }\n\n                        if (source.Handle is not MonitoredNode monitoredNode)\n                        {\n                            continue;\n                        }\n\n                        monitoredNode.ConditionRefresh(systemContext, monitoredItem);\n                    }\n                }\n            }\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Creates a new set of monitored items for a set of variables.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"publishingInterval\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"itemsToCreate\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"filterErrors\"></param>\n        /// <param name=\"monitoredItems\"></param>\n        /// <param name=\"createDurable\"></param>\n        /// <param name=\"globalIdCounter\"></param>\n        /// <remarks>\n        /// This method only handles data change subscriptions. Event subscriptions are created by the SDK.\n        /// </remarks>\n        public virtual void CreateMonitoredItems(\n            OperationContext context,\n            uint subscriptionId,\n            double publishingInterval,\n            TimestampsToReturn timestampsToReturn,\n            IList<MonitoredItemCreateRequest> itemsToCreate,\n            IList<ServiceResult> errors,\n            IList<MonitoringFilterResult> filterErrors,\n            IList<IMonitoredItem> monitoredItems,\n            bool createDurable,\n            ref long globalIdCounter)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n            var nodesToValidate = new List<ReadWriteOperationState>();\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < itemsToCreate.Count; ii++)\n                {\n                    MonitoredItemCreateRequest itemToCreate = itemsToCreate[ii];\n\n                    // skip items that have already been processed.\n                    if (itemToCreate.Processed)\n                    {\n                        continue;\n                    }\n\n                    ReadValueId itemToMonitor = itemToCreate.ItemToMonitor;\n\n                    // check for valid handle.\n                    if (GetManagerHandle(\n                        systemContext,\n                        itemToMonitor.NodeId,\n                        operationCache) is not NodeState source)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    itemToCreate.Processed = true;\n\n                    // check if the node is ready for reading.\n                    if (source.ValidationRequired)\n                    {\n                        errors[ii] = StatusCodes.BadNodeIdUnknown;\n\n                        // must validate node in a separate operation.\n                        var operation = new ReadWriteOperationState { Source = source, Index = ii };\n\n                        nodesToValidate.Add(operation);\n\n                        continue;\n                    }\n\n                    errors[ii] = CreateMonitoredItem(\n                        systemContext,\n                        source,\n                        subscriptionId,\n                        publishingInterval,\n                        context.DiagnosticsMask,\n                        timestampsToReturn,\n                        itemToCreate,\n                        createDurable,\n                        ref globalIdCounter,\n                        out MonitoringFilterResult filterError,\n                        out IMonitoredItem monitoredItem);\n\n                    // save any filter error details.\n                    filterErrors[ii] = filterError;\n\n                    if (ServiceResult.IsBad(errors[ii]))\n                    {\n                        continue;\n                    }\n\n                    // save the monitored item.\n                    monitoredItems[ii] = monitoredItem;\n                }\n\n                // check for nothing to do.\n                if (nodesToValidate.Count == 0)\n                {\n                    return;\n                }\n\n                // validates the nodes (reads values from the underlying data source if required).\n                for (int ii = 0; ii < nodesToValidate.Count; ii++)\n                {\n                    ReadWriteOperationState operation = nodesToValidate[ii];\n\n                    // validate the object.\n                    if (!ValidateNode(systemContext, operation.Source))\n                    {\n                        continue;\n                    }\n\n                    MonitoredItemCreateRequest itemToCreate = itemsToCreate[operation.Index];\n\n                    errors[operation.Index] = CreateMonitoredItem(\n                        systemContext,\n                        operation.Source,\n                        subscriptionId,\n                        publishingInterval,\n                        context.DiagnosticsMask,\n                        timestampsToReturn,\n                        itemToCreate,\n                        createDurable,\n                        ref globalIdCounter,\n                        out MonitoringFilterResult filterError,\n                        out IMonitoredItem monitoredItem);\n\n                    // save any filter error details.\n                    filterErrors[operation.Index] = filterError;\n\n                    if (ServiceResult.IsBad(errors[operation.Index]))\n                    {\n                        continue;\n                    }\n\n                    // save the monitored item.\n                    monitoredItems[operation.Index] = monitoredItem;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Restore a set of monitored items after a restart.\n        /// </summary>\n        /// <param name=\"itemsToRestore\"></param>\n        /// <param name=\"monitoredItems\"></param>\n        /// <param name=\"savedOwnerIdentity\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"itemsToRestore\"/> is <c>null</c>.</exception>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public virtual void RestoreMonitoredItems(\n            IList<IStoredMonitoredItem> itemsToRestore,\n            IList<IMonitoredItem> monitoredItems,\n            IUserIdentity savedOwnerIdentity)\n        {\n            ArgumentNullException.ThrowIfNull(itemsToRestore);\n\n            ArgumentNullException.ThrowIfNull(monitoredItems);\n\n            if (Server.IsRunning)\n            {\n                throw new InvalidOperationException(\n                    \"Subscription restore can only occur on startup\");\n            }\n\n            ServerSystemContext systemContext = SystemContext.Copy();\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n            var nodesToValidate = new List<ReadWriteOperationState>();\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < itemsToRestore.Count; ii++)\n                {\n                    IStoredMonitoredItem itemToCreate = itemsToRestore[ii];\n\n                    // skip items that have already been processed.\n                    if (itemToCreate.IsRestored)\n                    {\n                        continue;\n                    }\n\n                    // check for valid handle.\n                    if (GetManagerHandle(\n                        systemContext,\n                        itemToCreate.NodeId,\n                        operationCache) is not NodeState source)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    itemToCreate.IsRestored = true;\n\n                    // check if the node is ready for reading.\n                    if (source.ValidationRequired)\n                    {\n                        // must validate node in a separate operation.\n                        var operation = new ReadWriteOperationState { Source = source, Index = ii };\n\n                        nodesToValidate.Add(operation);\n\n                        continue;\n                    }\n\n                    bool success = RestoreMonitoredItem(\n                        systemContext,\n                        source,\n                        itemToCreate,\n                        out IMonitoredItem monitoredItem);\n\n                    if (!success)\n                    {\n                        continue;\n                    }\n\n                    // save the monitored item.\n                    monitoredItems[ii] = monitoredItem;\n                }\n\n                // check for nothing to do.\n                if (nodesToValidate.Count == 0)\n                {\n                    return;\n                }\n\n                // validates the nodes (reads values from the underlying data source if required).\n                for (int ii = 0; ii < nodesToValidate.Count; ii++)\n                {\n                    ReadWriteOperationState operation = nodesToValidate[ii];\n\n                    // validate the object.\n                    if (!ValidateNode(systemContext, operation.Source))\n                    {\n                        continue;\n                    }\n\n                    IStoredMonitoredItem itemToCreate = itemsToRestore[operation.Index];\n\n                    bool success = RestoreMonitoredItem(\n                        systemContext,\n                        operation.Source,\n                        itemToCreate,\n                        out IMonitoredItem monitoredItem);\n\n                    if (!success)\n                    {\n                        continue;\n                    }\n\n                    // save the monitored item.\n                    monitoredItems[operation.Index] = monitoredItem;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Reads the initial value for a monitored item.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The monitored node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        /// <param name=\"ignoreFilters\">If the filters should be ignored.</param>\n        protected virtual ServiceResult ReadInitialValue(\n            ISystemContext context,\n            MonitoredNode node,\n            IDataChangeMonitoredItem2 monitoredItem,\n            bool ignoreFilters)\n        {\n            var initialValue = new DataValue\n            {\n                Value = null,\n                ServerTimestamp = DateTime.UtcNow,\n                SourceTimestamp = DateTime.MinValue,\n                StatusCode = StatusCodes.BadWaitingForInitialData\n            };\n\n            ServiceResult error = node.Node.ReadAttribute(\n                context,\n                monitoredItem.AttributeId,\n                monitoredItem.IndexRange,\n                monitoredItem.DataEncoding,\n                initialValue);\n\n            monitoredItem.QueueValue(initialValue, error, ignoreFilters);\n\n            return error;\n        }\n\n        /// <summary>\n        /// Validates a data change filter provided by the client.\n        /// </summary>\n        /// <param name=\"context\">The system context.</param>\n        /// <param name=\"source\">The node being monitored.</param>\n        /// <param name=\"attributeId\">The attribute being monitored.</param>\n        /// <param name=\"requestedFilter\">The requested monitoring filter.</param>\n        /// <param name=\"filter\">The validated data change filter.</param>\n        /// <param name=\"range\">The EU range associated with the value if required by the filter.</param>\n        /// <returns>Any error condition. Good if no errors occurred.</returns>\n        protected ServiceResult ValidateDataChangeFilter(\n            ISystemContext context,\n            NodeState source,\n            uint attributeId,\n            ExtensionObject requestedFilter,\n            out DataChangeFilter filter,\n            out Range range)\n        {\n            range = null;\n\n            // check for valid filter type.\n            filter = requestedFilter.Body as DataChangeFilter;\n\n            if (filter == null)\n            {\n                return StatusCodes.BadMonitoredItemFilterUnsupported;\n            }\n\n            // only supported for value attributes.\n            if (attributeId != Attributes.Value)\n            {\n                return StatusCodes.BadMonitoredItemFilterUnsupported;\n            }\n\n            // only supported for variables.\n            if (source is not BaseVariableState variable)\n            {\n                return StatusCodes.BadMonitoredItemFilterUnsupported;\n            }\n\n            // check the datatype.\n            if (filter.DeadbandType != (uint)DeadbandType.None)\n            {\n                BuiltInType builtInType = TypeInfo.GetBuiltInType(\n                    variable.DataType,\n                    Server.TypeTree);\n\n                if (!TypeInfo.IsNumericType(builtInType))\n                {\n                    return StatusCodes.BadMonitoredItemFilterUnsupported;\n                }\n            }\n\n            // validate filter.\n            ServiceResult error = filter.Validate();\n\n            if (ServiceResult.IsBad(error))\n            {\n                return error;\n            }\n\n            if (filter.DeadbandType == (uint)DeadbandType.Percent)\n            {\n                if (variable.FindChild(\n                    context,\n                    BrowseNames.EURange) is not BaseVariableState euRange)\n                {\n                    return StatusCodes.BadMonitoredItemFilterUnsupported;\n                }\n\n                range = euRange.Value as Range;\n\n                if (range == null)\n                {\n                    return StatusCodes.BadMonitoredItemFilterUnsupported;\n                }\n            }\n\n            // all good.\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Restore a single monitored Item after a restart\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"storedMonitoredItem\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <returns>true if sucesfully restored</returns>\n        protected virtual bool RestoreMonitoredItem(\n            ServerSystemContext context,\n            NodeState source,\n            IStoredMonitoredItem storedMonitoredItem,\n            out IMonitoredItem monitoredItem)\n        {\n            // create monitored node.\n\n            if (source.Handle is not MonitoredNode monitoredNode)\n            {\n                source.Handle = monitoredNode = new MonitoredNode(Server, this, source);\n            }\n\n            // check if the variable needs to be sampled.\n            bool samplingRequired = false;\n\n            if (storedMonitoredItem.AttributeId == Attributes.Value)\n            {\n                var variable = source as BaseVariableState;\n\n                if (variable.MinimumSamplingInterval > 0)\n                {\n                    storedMonitoredItem.SamplingInterval = CalculateSamplingInterval(\n                        variable,\n                        storedMonitoredItem.SamplingInterval);\n                    samplingRequired = true;\n                }\n            }\n\n            // create the item.\n            DataChangeMonitoredItem datachangeItem = monitoredNode.RestoreDataChangeItem(\n                storedMonitoredItem);\n\n            if (samplingRequired)\n            {\n                CreateSampledItem(storedMonitoredItem.SamplingInterval, datachangeItem);\n            }\n\n            // update monitored item list.\n            monitoredItem = datachangeItem;\n\n            return true;\n        }\n\n        /// <summary>\n        /// Creates a new set of monitored items for a set of variables.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"publishingInterval\"></param>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"itemToCreate\"></param>\n        /// <param name=\"createDurable\"></param>\n        /// <param name=\"globalIdCounter\"></param>\n        /// <param name=\"filterError\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <remarks>\n        /// This method only handles data change subscriptions. Event subscriptions are created by the SDK.\n        /// </remarks>\n        protected virtual ServiceResult CreateMonitoredItem(\n            ISystemContext context,\n            NodeState source,\n            uint subscriptionId,\n            double publishingInterval,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            MonitoredItemCreateRequest itemToCreate,\n            bool createDurable,\n            ref long globalIdCounter,\n            out MonitoringFilterResult filterError,\n            out IMonitoredItem monitoredItem)\n        {\n            filterError = null;\n            monitoredItem = null;\n\n            // read initial value.\n            var initialValue = new DataValue\n            {\n                Value = null,\n                ServerTimestamp = DateTime.UtcNow,\n                SourceTimestamp = DateTime.MinValue,\n                StatusCode = StatusCodes.BadWaitingForInitialData\n            };\n\n            ServiceResult error = source.ReadAttribute(\n                context,\n                itemToCreate.ItemToMonitor.AttributeId,\n                itemToCreate.ItemToMonitor.ParsedIndexRange,\n                itemToCreate.ItemToMonitor.DataEncoding,\n                initialValue);\n\n            if (ServiceResult.IsBad(error))\n            {\n                if (error.StatusCode.Code\n                    is StatusCodes.BadAttributeIdInvalid\n                    or StatusCodes.BadDataEncodingInvalid\n                    or StatusCodes.BadDataEncodingUnsupported)\n                {\n                    return error;\n                }\n\n                initialValue.StatusCode = error.StatusCode;\n                _ = ServiceResult.Good;\n            }\n\n            // validate parameters.\n            MonitoringParameters parameters = itemToCreate.RequestedParameters;\n\n            // validate the data change filter.\n            DataChangeFilter filter = null;\n            Range range = null;\n\n            if (!ExtensionObject.IsNull(parameters.Filter))\n            {\n                error = ValidateDataChangeFilter(\n                    context,\n                    source,\n                    itemToCreate.ItemToMonitor.AttributeId,\n                    parameters.Filter,\n                    out filter,\n                    out range);\n\n                if (ServiceResult.IsBad(error))\n                {\n                    return error;\n                }\n            }\n\n            // create monitored node.\n\n            if (source.Handle is not MonitoredNode monitoredNode)\n            {\n                source.Handle = monitoredNode = new MonitoredNode(Server, this, source);\n            }\n\n            // create a globally unique identifier.\n            uint monitoredItemId = Utils.IncrementIdentifier(ref globalIdCounter);\n\n            // determine the sampling interval.\n            double samplingInterval = itemToCreate.RequestedParameters.SamplingInterval;\n\n            if (samplingInterval < 0)\n            {\n                samplingInterval = publishingInterval;\n            }\n\n            // check if the variable needs to be sampled.\n            bool samplingRequired = false;\n\n            if (itemToCreate.ItemToMonitor.AttributeId == Attributes.Value)\n            {\n                var variable = source as BaseVariableState;\n\n                if (variable.MinimumSamplingInterval > 0)\n                {\n                    samplingInterval = CalculateSamplingInterval(variable, samplingInterval);\n                    samplingRequired = true;\n                }\n            }\n\n            // create the item.\n            DataChangeMonitoredItem datachangeItem = monitoredNode.CreateDataChangeItem(\n                context,\n                monitoredItemId,\n                itemToCreate.ItemToMonitor.AttributeId,\n                itemToCreate.ItemToMonitor.ParsedIndexRange,\n                itemToCreate.ItemToMonitor.DataEncoding,\n                diagnosticsMasks,\n                timestampsToReturn,\n                itemToCreate.MonitoringMode,\n                itemToCreate.RequestedParameters.ClientHandle,\n                samplingInterval,\n                itemToCreate.RequestedParameters.QueueSize,\n                itemToCreate.RequestedParameters.DiscardOldest,\n                filter,\n                range,\n                false);\n\n            if (samplingRequired)\n            {\n                CreateSampledItem(samplingInterval, datachangeItem);\n            }\n\n            // report the initial value.\n            datachangeItem.QueueValue(initialValue, null, true);\n\n            // do any post processing.\n            OnCreateMonitoredItem(context, itemToCreate, monitoredNode, datachangeItem);\n\n            // update monitored item list.\n            monitoredItem = datachangeItem;\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Calculates the sampling interval.\n        /// </summary>\n        /// <param name=\"variable\"></param>\n        /// <param name=\"samplingInterval\"></param>\n        private double CalculateSamplingInterval(\n            BaseVariableState variable,\n            double samplingInterval)\n        {\n            if (samplingInterval < variable.MinimumSamplingInterval)\n            {\n                samplingInterval = variable.MinimumSamplingInterval;\n            }\n\n            if ((samplingInterval % _minimumSamplingInterval) != 0)\n            {\n                samplingInterval = Math.Truncate(samplingInterval / _minimumSamplingInterval);\n                samplingInterval++;\n                samplingInterval *= _minimumSamplingInterval;\n            }\n\n            return samplingInterval;\n        }\n\n        /// <summary>\n        /// Creates a new sampled item.\n        /// </summary>\n        /// <param name=\"samplingInterval\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        private void CreateSampledItem(\n            double samplingInterval,\n            DataChangeMonitoredItem monitoredItem)\n        {\n            _sampledItems.Add(monitoredItem);\n\n            _samplingTimer ??= new Timer(\n                DoSample,\n                null,\n                (int)_minimumSamplingInterval,\n                (int)_minimumSamplingInterval);\n        }\n\n        /// <summary>\n        /// Deletes a sampled item.\n        /// </summary>\n        /// <param name=\"monitoredItem\"></param>\n        private void DeleteSampledItem(DataChangeMonitoredItem monitoredItem)\n        {\n            for (int ii = 0; ii < _sampledItems.Count; ii++)\n            {\n                if (ReferenceEquals(monitoredItem, _sampledItems[ii]))\n                {\n                    _sampledItems.RemoveAt(ii);\n                    break;\n                }\n            }\n\n            if (_sampledItems.Count == 0 && _samplingTimer != null)\n            {\n                _samplingTimer.Dispose();\n                _samplingTimer = null;\n            }\n        }\n\n        /// <summary>\n        /// Polls each monitored item which requires sample.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void DoSample(object state)\n        {\n            try\n            {\n                lock (Lock)\n                {\n                    for (int ii = 0; ii < _sampledItems.Count; ii++)\n                    {\n                        DataChangeMonitoredItem monitoredItem = _sampledItems[ii];\n\n                        if (monitoredItem.TimeToNextSample < _minimumSamplingInterval)\n                        {\n                            monitoredItem.ValueChanged(SystemContext);\n                        }\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Utils.LogError(e, \"Unexpected error during diagnostics scan.\");\n            }\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is created.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"itemToCreate\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        protected virtual void OnCreateMonitoredItem(\n            ISystemContext systemContext,\n            MonitoredItemCreateRequest itemToCreate,\n            MonitoredNode monitoredNode,\n            DataChangeMonitoredItem monitoredItem)\n        {\n            // does nothing.\n        }\n\n        /// <summary>\n        /// Modifies the parameters for a set of monitored items.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"monitoredItems\"></param>\n        /// <param name=\"itemsToModify\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"filterErrors\"></param>\n        public virtual void ModifyMonitoredItems(\n            OperationContext context,\n            TimestampsToReturn timestampsToReturn,\n            IList<IMonitoredItem> monitoredItems,\n            IList<MonitoredItemModifyRequest> itemsToModify,\n            IList<ServiceResult> errors,\n            IList<MonitoringFilterResult> filterErrors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < monitoredItems.Count; ii++)\n                {\n                    MonitoredItemModifyRequest itemToModify = itemsToModify[ii];\n\n                    // skip items that have already been processed.\n                    if (itemToModify.Processed)\n                    {\n                        continue;\n                    }\n\n                    // modify the monitored item.\n\n                    errors[ii] = ModifyMonitoredItem(\n                        systemContext,\n                        context.DiagnosticsMask,\n                        timestampsToReturn,\n                        monitoredItems[ii],\n                        itemToModify,\n                        out MonitoringFilterResult filterError);\n\n                    // save any filter error details.\n                    filterErrors[ii] = filterError;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Modifies the parameters for a monitored item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"itemToModify\"></param>\n        /// <param name=\"filterError\"></param>\n        protected virtual ServiceResult ModifyMonitoredItem(\n            ISystemContext context,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            IMonitoredItem monitoredItem,\n            MonitoredItemModifyRequest itemToModify,\n            out MonitoringFilterResult filterError)\n        {\n            filterError = null;\n\n            // check for valid handle.\n            if (monitoredItem.ManagerHandle is not MonitoredNode monitoredNode)\n            {\n                return ServiceResult.Good;\n            }\n\n            if (IsHandleInNamespace(monitoredNode.Node) == null)\n            {\n                return ServiceResult.Good;\n            }\n\n            // owned by this node manager.\n            itemToModify.Processed = true;\n\n            // check for valid monitored item.\n            var datachangeItem = monitoredItem as DataChangeMonitoredItem;\n\n            // validate parameters.\n            MonitoringParameters parameters = itemToModify.RequestedParameters;\n\n            // validate the data change filter.\n            DataChangeFilter filter = null;\n            Range range = null;\n\n            ServiceResult error;\n            if (!ExtensionObject.IsNull(parameters.Filter))\n            {\n                error = ValidateDataChangeFilter(\n                    context,\n                    monitoredNode.Node,\n                    datachangeItem.AttributeId,\n                    parameters.Filter,\n                    out filter,\n                    out range);\n\n                if (ServiceResult.IsBad(error))\n                {\n                    return error;\n                }\n            }\n\n            double previousSamplingInterval = datachangeItem.SamplingInterval;\n\n            // check if the variable needs to be sampled.\n            double samplingInterval = itemToModify.RequestedParameters.SamplingInterval;\n\n            if (datachangeItem.AttributeId == Attributes.Value)\n            {\n                var variable = monitoredNode.Node as BaseVariableState;\n\n                if (variable.MinimumSamplingInterval > 0)\n                {\n                    samplingInterval = CalculateSamplingInterval(variable, samplingInterval);\n                }\n            }\n\n            // modify the monitored item parameters.\n            _ = datachangeItem.Modify(\n                diagnosticsMasks,\n                timestampsToReturn,\n                itemToModify.RequestedParameters.ClientHandle,\n                samplingInterval,\n                itemToModify.RequestedParameters.QueueSize,\n                itemToModify.RequestedParameters.DiscardOldest,\n                filter,\n                range);\n\n            // do any post processing.\n            OnModifyMonitoredItem(\n                context,\n                itemToModify,\n                monitoredNode,\n                datachangeItem,\n                previousSamplingInterval);\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is created.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"itemToModify\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"previousSamplingInterval\"></param>\n        protected virtual void OnModifyMonitoredItem(\n            ISystemContext systemContext,\n            MonitoredItemModifyRequest itemToModify,\n            MonitoredNode monitoredNode,\n            DataChangeMonitoredItem monitoredItem,\n            double previousSamplingInterval)\n        {\n            // does nothing.\n        }\n\n        /// <summary>\n        /// Deletes a set of monitored items.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"monitoredItems\"></param>\n        /// <param name=\"processedItems\"></param>\n        /// <param name=\"errors\"></param>\n        public virtual void DeleteMonitoredItems(\n            OperationContext context,\n            IList<IMonitoredItem> monitoredItems,\n            IList<bool> processedItems,\n            IList<ServiceResult> errors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < monitoredItems.Count; ii++)\n                {\n                    // skip items that have already been processed.\n                    if (processedItems[ii])\n                    {\n                        continue;\n                    }\n\n                    // delete the monitored item.\n\n                    errors[ii] = DeleteMonitoredItem(\n                        systemContext,\n                        monitoredItems[ii],\n                        out bool processed);\n\n                    // indicate whether it was processed or not.\n                    processedItems[ii] = processed;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Deletes a monitored item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"processed\"></param>\n        protected virtual ServiceResult DeleteMonitoredItem(\n            ISystemContext context,\n            IMonitoredItem monitoredItem,\n            out bool processed)\n        {\n            processed = false;\n\n            // check for valid handle.\n            if (monitoredItem.ManagerHandle is not MonitoredNode monitoredNode)\n            {\n                return ServiceResult.Good;\n            }\n\n            if (IsHandleInNamespace(monitoredNode.Node) == null)\n            {\n                return ServiceResult.Good;\n            }\n\n            // owned by this node manager.\n            processed = true;\n\n            // check for valid monitored item.\n            var datachangeItem = monitoredItem as DataChangeMonitoredItem;\n\n            // check if the variable needs to be sampled.\n            if (datachangeItem.AttributeId == Attributes.Value)\n            {\n                var variable = monitoredNode.Node as BaseVariableState;\n\n                if (variable.MinimumSamplingInterval > 0)\n                {\n                    DeleteSampledItem(datachangeItem);\n                }\n            }\n\n            // remove item.\n            monitoredNode.DeleteItem(datachangeItem);\n\n            // do any post processing.\n            OnDeleteMonitoredItem(context, monitoredNode, datachangeItem);\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is deleted.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        protected virtual void OnDeleteMonitoredItem(\n            ISystemContext systemContext,\n            MonitoredNode monitoredNode,\n            DataChangeMonitoredItem monitoredItem)\n        {\n            // does nothing.\n        }\n\n        /// <summary>\n        /// Transfers a set of monitored items.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"sendInitialValues\">Whether the subscription should send initial values after transfer.</param>\n        /// <param name=\"monitoredItems\">The set of monitoring items to update.</param>\n        /// <param name=\"processedItems\">The list of bool with items that were already processed.</param>\n        /// <param name=\"errors\">Any errors.</param>\n        public virtual void TransferMonitoredItems(\n            OperationContext context,\n            bool sendInitialValues,\n            IList<IMonitoredItem> monitoredItems,\n            IList<bool> processedItems,\n            IList<ServiceResult> errors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n            IList<IMonitoredItem> transferredItems = [];\n            lock (Lock)\n            {\n                for (int ii = 0; ii < monitoredItems.Count; ii++)\n                {\n                    // skip items that have already been processed.\n                    if (processedItems[ii] || monitoredItems[ii] == null)\n                    {\n                        continue;\n                    }\n\n                    // check handle.\n                    // check for valid handle.\n                    if (monitoredItems[ii].ManagerHandle is not MonitoredNode monitoredNode)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    processedItems[ii] = true;\n                    transferredItems.Add(monitoredItems[ii]);\n\n                    if (sendInitialValues)\n                    {\n                        monitoredItems[ii].SetupResendDataTrigger();\n                    }\n                    errors[ii] = StatusCodes.Good;\n                }\n            }\n\n            // do any post processing.\n            OnMonitoredItemsTransferred(systemContext, transferredItems);\n        }\n\n        /// <summary>\n        /// Called after transfer of MonitoredItems.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"monitoredItems\">The transferred monitored items.</param>\n        protected virtual void OnMonitoredItemsTransferred(\n            ServerSystemContext context,\n            IList<IMonitoredItem> monitoredItems)\n        {\n            // overridden by the sub-class.\n        }\n\n        /// <summary>\n        /// Changes the monitoring mode for a set of monitored items.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"monitoringMode\"></param>\n        /// <param name=\"monitoredItems\"></param>\n        /// <param name=\"processedItems\"></param>\n        /// <param name=\"errors\"></param>\n        public virtual void SetMonitoringMode(\n            OperationContext context,\n            MonitoringMode monitoringMode,\n            IList<IMonitoredItem> monitoredItems,\n            IList<bool> processedItems,\n            IList<ServiceResult> errors)\n        {\n            ServerSystemContext systemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                for (int ii = 0; ii < monitoredItems.Count; ii++)\n                {\n                    // skip items that have already been processed.\n                    if (processedItems[ii])\n                    {\n                        continue;\n                    }\n\n                    // update monitoring mode.\n\n                    errors[ii] = SetMonitoringMode(\n                        systemContext,\n                        monitoredItems[ii],\n                        monitoringMode,\n                        out bool processed);\n\n                    // indicate whether it was processed or not.\n                    processedItems[ii] = processed;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Changes the monitoring mode for an item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"monitoringMode\"></param>\n        /// <param name=\"processed\"></param>\n        protected virtual ServiceResult SetMonitoringMode(\n            ISystemContext context,\n            IMonitoredItem monitoredItem,\n            MonitoringMode monitoringMode,\n            out bool processed)\n        {\n            processed = false;\n\n            // check for valid handle.\n            if (monitoredItem.ManagerHandle is not MonitoredNode monitoredNode)\n            {\n                return ServiceResult.Good;\n            }\n\n            if (IsHandleInNamespace(monitoredNode.Node) == null)\n            {\n                return ServiceResult.Good;\n            }\n\n            // owned by this node manager.\n            processed = true;\n\n            // check for valid monitored item.\n            var datachangeItem = monitoredItem as DataChangeMonitoredItem;\n\n            // update monitoring mode.\n            MonitoringMode previousMode = datachangeItem.SetMonitoringMode(monitoringMode);\n\n            // need to provide an immediate update after enabling.\n            if (previousMode == MonitoringMode.Disabled &&\n                monitoringMode != MonitoringMode.Disabled)\n            {\n                ReadInitialValue(context, monitoredNode, datachangeItem, false);\n            }\n\n            // do any post processing.\n            OnSetMonitoringMode(\n                context,\n                monitoredNode,\n                datachangeItem,\n                previousMode,\n                monitoringMode);\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Does any processing after a monitored item is created.\n        /// </summary>\n        /// <param name=\"systemContext\"></param>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"previousMode\"></param>\n        /// <param name=\"currentMode\"></param>\n        protected virtual void OnSetMonitoringMode(\n            ISystemContext systemContext,\n            MonitoredNode monitoredNode,\n            DataChangeMonitoredItem monitoredItem,\n            MonitoringMode previousMode,\n            MonitoringMode currentMode)\n        {\n            // does nothing.\n        }\n\n        private IList<string> _namespaceUris;\n        private ushort[] _namespaceIndexes;\n\n        private Timer _samplingTimer;\n        private readonly List<DataChangeMonitoredItem> _sampledItems;\n        private readonly double _minimumSamplingInterval;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/BlockState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// A object which maps a block to a UA object.\n    /// </summary>\n    public class BlockState : BaseObjectState\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BlockState\"/> class.\n        /// </summary>\n        /// <param name=\"nodeManager\">The context.</param>\n        /// <param name=\"nodeId\">The node id.</param>\n        /// <param name=\"block\">The block.</param>\n        public BlockState(\n            DataAccessNodeManager nodeManager,\n            NodeId nodeId,\n            UnderlyingSystemBlock block) : base(null)\n        {\n            _blockId = block.Id;\n            _nodeManager = nodeManager;\n\n            SymbolicName = block.Name;\n            NodeId = nodeId;\n            BrowseName = new QualifiedName(block.Name, nodeId.NamespaceIndex);\n            DisplayName = new LocalizedText(block.Name);\n            Description = null;\n            WriteMask = 0;\n            UserWriteMask = 0;\n            EventNotifier = EventNotifiers.None;\n\n            if (nodeManager.SystemContext.SystemHandle is UnderlyingSystem system)\n            {\n                var tags = block.GetTags();\n\n                for (var ii = 0; ii < tags.Count; ii++)\n                {\n                    var variable = CreateVariable(nodeManager.SystemContext, tags[ii]);\n                    AddChild(variable);\n                    variable.OnSimpleWriteValue = OnWriteTagValue;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Starts the monitoring the block.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        public void StartMonitoring(ServerSystemContext context)\n        {\n            if (_monitoringCount == 0 && context.SystemHandle is UnderlyingSystem system)\n            {\n                var block = system.FindBlock(_blockId);\n\n                block?.StartMonitoring(OnTagsChanged);\n            }\n\n            _monitoringCount++;\n        }\n\n        /// <summary>\n        /// Stop the monitoring the block.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        public bool StopMonitoring(ServerSystemContext context)\n        {\n            _monitoringCount--;\n\n            if (_monitoringCount == 0 && context.SystemHandle is UnderlyingSystem system)\n            {\n                var block = system.FindBlock(_blockId);\n\n                block?.StopMonitoring();\n            }\n\n            return _monitoringCount != 0;\n        }\n\n        /// <summary>\n        /// Used to receive notifications when the value attribute is read or written.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        /// <param name=\"value\"></param>\n        public ServiceResult OnWriteTagValue(\n            ISystemContext context,\n            NodeState node,\n            ref object value)\n        {\n            if (context.SystemHandle is not UnderlyingSystem system)\n            {\n                return StatusCodes.BadCommunicationError;\n            }\n\n            var block = system.FindBlock(_blockId);\n\n            if (block == null)\n            {\n                return StatusCodes.BadNodeIdUnknown;\n            }\n\n            var error = block.WriteTagValue(node.SymbolicName, value);\n\n            if (error != 0)\n            {\n                // the simulator uses UA status codes so there is no need for a mapping table.\n                return error;\n            }\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Called when one or more tags changes.\n        /// </summary>\n        /// <param name=\"tags\">The tags.</param>\n        private void OnTagsChanged(IList<UnderlyingSystemTag> tags)\n        {\n            lock (_nodeManager.Lock)\n            {\n                for (var ii = 0; ii < tags.Count; ii++)\n                {\n                    if (FindChildBySymbolicName(_nodeManager.SystemContext, tags[ii].Name) is BaseVariableState variable)\n                    {\n                        UpdateVariable(_nodeManager.SystemContext, tags[ii], variable);\n                    }\n                }\n\n                ClearChangeMasks(_nodeManager.SystemContext, true);\n            }\n        }\n\n        /// <summary>\n        /// Populates the browser with references that meet the criteria.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"browser\">The browser to populate.</param>\n        protected override void PopulateBrowser(ISystemContext context, NodeBrowser browser)\n        {\n            base.PopulateBrowser(context, browser);\n\n            // check if the parent segments need to be returned.\n            if (browser.IsRequired(ReferenceTypeIds.Organizes, true))\n            {\n                if (context.SystemHandle is not UnderlyingSystem system)\n                {\n                    return;\n                }\n\n                // add reference for each segment.\n                var segments = system.FindSegmentsForBlock(_blockId);\n\n                for (var ii = 0; ii < segments.Count; ii++)\n                {\n                    browser.Add(ReferenceTypeIds.Organizes, true, ModelUtils.ConstructIdForSegment(segments[ii].Id, NodeId.NamespaceIndex));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates a variable from a tag.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"tag\">The tag.</param>\n        /// <returns>The variable that represents the tag.</returns>\n        private BaseDataVariableState CreateVariable(ISystemContext context, UnderlyingSystemTag tag)\n        {\n            // create the variable type based on the tag type.\n            BaseDataVariableState variable;\n            switch (tag.TagType)\n            {\n                case UnderlyingSystemTagType.Analog:\n                    {\n                        var node = new AnalogItemState(this);\n\n                        if (tag.EngineeringUnits != null)\n                        {\n                            node.EngineeringUnits = new PropertyState<EUInformation>(node);\n                        }\n\n                        if (tag.EuRange.Length >= 4)\n                        {\n                            node.InstrumentRange = new PropertyState<Range>(node);\n                        }\n\n                        variable = node;\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Digital:\n                    {\n                        variable = new TwoStateDiscreteState(this);\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Enumerated:\n                    {\n                        var node = new MultiStateDiscreteState(this);\n\n                        if (tag.Labels != null)\n                        {\n                            node.EnumStrings = new PropertyState<LocalizedText[]>(node);\n                        }\n\n                        variable = node;\n                        break;\n                    }\n\n                default:\n                    {\n                        variable = new DataItemState(this);\n                        break;\n                    }\n            }\n\n            // set the symbolic name and reference types.\n            variable.SymbolicName = tag.Name;\n            variable.ReferenceTypeId = ReferenceTypeIds.HasComponent;\n\n            // initialize the variable from the type model.\n            variable.Create(\n                context,\n                null,\n                new QualifiedName(tag.Name, BrowseName.NamespaceIndex),\n                null,\n                true);\n\n            // update the variable values.\n            UpdateVariable(context, tag, variable);\n\n            return variable;\n        }\n\n        /// <summary>\n        /// Updates a variable from a tag.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"tag\">The tag.</param>\n        /// <param name=\"variable\">The variable to update.</param>\n        private void UpdateVariable(ISystemContext context, UnderlyingSystemTag tag, BaseVariableState variable)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context != null);\n            variable.Description = tag.Description;\n            variable.Value = tag.Value;\n            variable.Timestamp = tag.Timestamp;\n\n            switch (tag.DataType)\n            {\n                case UnderlyingSystemDataType.Integer1: { variable.DataType = DataTypes.SByte; break; }\n                case UnderlyingSystemDataType.Integer2: { variable.DataType = DataTypes.Int16; break; }\n                case UnderlyingSystemDataType.Integer4: { variable.DataType = DataTypes.Int32; break; }\n                case UnderlyingSystemDataType.Real4: { variable.DataType = DataTypes.Float; break; }\n                case UnderlyingSystemDataType.String: { variable.DataType = DataTypes.String; break; }\n            }\n\n            variable.ValueRank = ValueRanks.Scalar;\n            variable.ArrayDimensions = null;\n\n            if (tag.IsWriteable)\n            {\n                variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n                variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            }\n            else\n            {\n                variable.AccessLevel = AccessLevels.CurrentRead;\n                variable.UserAccessLevel = AccessLevels.CurrentRead;\n            }\n\n            variable.MinimumSamplingInterval = MinimumSamplingIntervals.Continuous;\n            variable.Historizing = false;\n\n            switch (tag.TagType)\n            {\n                case UnderlyingSystemTagType.Analog:\n                    {\n                        var node = variable as AnalogItemState;\n\n                        if (tag.EuRange != null)\n                        {\n                            if (tag.EuRange.Length >= 2 && node.EURange != null)\n                            {\n                                node.EURange.Value = new Range(tag.EuRange[0], tag.EuRange[1]);\n                                node.EURange.Timestamp = tag.Block.Timestamp;\n                            }\n\n                            if (tag.EuRange.Length >= 4 && node.InstrumentRange != null)\n                            {\n                                node.InstrumentRange.Value = new Range(tag.EuRange[2], tag.EuRange[3]);\n                                node.InstrumentRange.Timestamp = tag.Block.Timestamp;\n                            }\n                        }\n\n                        if (!string.IsNullOrEmpty(tag.EngineeringUnits) && node.EngineeringUnits != null)\n                        {\n                            node.EngineeringUnits.Value = new EUInformation\n                            {\n                                DisplayName = tag.EngineeringUnits,\n                                NamespaceUri = Namespaces.DataAccess\n                            };\n                            node.EngineeringUnits.Timestamp = tag.Block.Timestamp;\n                        }\n\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Digital:\n                    {\n                        var node = variable as TwoStateDiscreteState;\n\n                        if (tag.Labels != null && node.TrueState != null && node.FalseState != null && tag.Labels.Length >= 2)\n                        {\n                            node.TrueState.Value = new LocalizedText(tag.Labels[0]);\n                            node.TrueState.Timestamp = tag.Block.Timestamp;\n                            node.FalseState.Value = new LocalizedText(tag.Labels[1]);\n                            node.FalseState.Timestamp = tag.Block.Timestamp;\n                        }\n\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Enumerated:\n                    {\n                        var node = variable as MultiStateDiscreteState;\n\n                        if (tag.Labels != null)\n                        {\n                            var strings = new LocalizedText[tag.Labels.Length];\n\n                            for (var ii = 0; ii < tag.Labels.Length; ii++)\n                            {\n                                strings[ii] = new LocalizedText(tag.Labels[ii]);\n                            }\n\n                            node.EnumStrings.Value = strings;\n                            node.EnumStrings.Timestamp = tag.Block.Timestamp;\n                        }\n\n                        break;\n                    }\n            }\n        }\n\n        private readonly string _blockId;\n        private readonly CustomNodeManager2 _nodeManager;\n        private int _monitoringCount;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/DataAccessNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class DataAccessNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public DataAccessNodeManager(IServerInternal server, ApplicationConfiguration configuration) :\n            base(server, configuration, Namespaces.DataAccess)\n        {\n            AliasRoot = \"DA\";\n\n            SystemContext.SystemHandle = _system = new UnderlyingSystem();\n            SystemContext.NodeIdFactory = this;\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<DataAccessServerConfiguration>() ??\n                new DataAccessServerConfiguration();\n\n            // create the table to store the cached blocks.\n            _blocks = [];\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                _system.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The node.</param>\n        /// <returns>The new NodeId.</returns>\n        /// <remarks>\n        /// This method is called by the NodeState.Create() method which initializes a Node from\n        /// the type model. During initialization a number of child nodes are created and need to\n        /// have NodeIds assigned to them. This implementation constructs NodeIds by constructing\n        /// strings. Other implementations could assign unique integers or Guids and save the new\n        /// Node in a dictionary for later lookup.\n        /// </remarks>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            return ModelUtils.ConstructIdForComponent(node, NamespaceIndex);\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                // find the top level segments and link them to the ObjectsFolder.\n                var segments = _system.FindSegments(null);\n\n                for (var ii = 0; ii < segments.Count; ii++)\n                {\n                    // Top level areas need a reference from the Server object.\n                    // These references are added to a list that is returned to the caller.\n                    // The caller will update the Objects folder node.\n\n                    if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out var references))\n                    {\n                        externalReferences[ObjectIds.ObjectsFolder] = references = [];\n                    }\n\n                    // construct the NodeId of a segment.\n                    var segmentId = ModelUtils.ConstructIdForSegment(segments[ii].Id, NamespaceIndex);\n\n                    // add an organizes reference from the ObjectsFolder to the area.\n                    references.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, segmentId));\n                }\n\n                // start the simulation.\n                _system.StartSimulation();\n            }\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                _system.StopSimulation();\n                _blocks.Clear();\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // check for check for nodes that are being currently monitored.\n\n                if (MonitoredNodes.TryGetValue(nodeId, out var monitoredNode))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = true,\n                        Node = monitoredNode.Node\n                    };\n                }\n\n                if (nodeId.IdType != IdType.String && PredefinedNodes.TryGetValue(nodeId, out var node))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Node = node,\n                        Validated = true\n                    };\n                }\n\n                // parse the identifier.\n                var parsedNodeId = ParsedNodeId.Parse(nodeId);\n\n                if (parsedNodeId != null)\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = false,\n                        Node = null,\n                        ParsedNodeId = parsedNodeId\n                    };\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            NodeState target = null;\n\n            // check if already in the cache.\n            if (cache != null)\n            {\n                if (cache.TryGetValue(handle.NodeId, out target))\n                {\n                    // nulls mean a NodeId which was previously found to be invalid has been referenced again.\n                    if (target == null)\n                    {\n                        return null;\n                    }\n\n                    handle.Node = target;\n                    handle.Validated = true;\n                    return handle.Node;\n                }\n\n                target = null;\n            }\n\n            try\n            {\n                // check if the node id has been parsed.\n                if (handle.ParsedNodeId is not ParsedNodeId parsedNodeId)\n                {\n                    return null;\n                }\n\n                NodeState root = null;\n\n                // validate a segment.\n                if (parsedNodeId.RootType == ModelUtils.Segment)\n                {\n                    var segment = _system.FindSegment(parsedNodeId.RootId);\n\n                    // segment does not exist.\n                    if (segment == null)\n                    {\n                        return null;\n                    }\n\n                    var rootId = ModelUtils.ConstructIdForSegment(segment.Id, NamespaceIndex);\n\n                    // create a temporary object to use for the operation.\n                    root = new SegmentState(context, rootId, segment);\n                }\n\n                // validate segment.\n                else if (parsedNodeId.RootType == ModelUtils.Block)\n                {\n                    // validate the block.\n                    var block = _system.FindBlock(parsedNodeId.RootId);\n\n                    // block does not exist.\n                    if (block == null)\n                    {\n                        return null;\n                    }\n\n                    var rootId = ModelUtils.ConstructIdForBlock(block.Id, NamespaceIndex);\n\n                    // check for check for blocks that are being currently monitored.\n\n                    if (_blocks.TryGetValue(rootId, out var node))\n                    {\n                        root = node;\n                    }\n\n                    // create a temporary object to use for the operation.\n                    else\n                    {\n                        root = new BlockState(this, rootId, block);\n                    }\n                }\n\n                // unknown root type.\n                else\n                {\n                    return null;\n                }\n\n                // all done if no components to validate.\n                if (string.IsNullOrEmpty(parsedNodeId.ComponentPath))\n                {\n                    handle.Validated = true;\n                    handle.Node = target = root;\n                    return handle.Node;\n                }\n\n                // validate component.\n                NodeState component = root.FindChildBySymbolicName(context, parsedNodeId.ComponentPath);\n\n                // component does not exist.\n                if (component == null)\n                {\n                    return null;\n                }\n\n                // found a valid component.\n                handle.Validated = true;\n                handle.Node = target = component;\n                return handle.Node;\n            }\n            finally\n            {\n                // store the node in the cache to optimize subsequent lookups.\n                cache?.Add(handle.NodeId, target);\n            }\n        }\n\n        /// <summary>\n        /// Called after creating a MonitoredItem.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override void OnMonitoredItemCreated(ServerSystemContext context, NodeHandle handle, ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            if (handle.Node.GetHierarchyRoot() is BlockState block)\n            {\n                block.StartMonitoring(context);\n\n                // need to save the block to ensure that multiple monitored items use the same instance.\n                _blocks[block.NodeId] = block;\n            }\n        }\n\n        /// <summary>\n        /// Called after deleting a MonitoredItem.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override void OnMonitoredItemDeleted(ServerSystemContext context, NodeHandle handle, ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            if (handle.Node.GetHierarchyRoot() is BlockState block && !block.StopMonitoring(context))\n            {\n                // can remove the block since all monitored items for the block are gone.\n                _blocks.Remove(block.NodeId);\n            }\n        }\n\n        private readonly UnderlyingSystem _system;\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly DataAccessServerConfiguration _configuration;\n#pragma warning restore IDE0052 // Remove unread private members\n        private readonly Dictionary<NodeId, BlockState> _blocks;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/DataAccessServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class DataAccessServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.DataAccess\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new DataAccessNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/DataAccessServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.DataAccess)]\n    public class DataAccessServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public DataAccessServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/ModelUtils.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.Text;\n\n    /// <summary>\n    /// A class that builds NodeIds used by the DataAccess NodeManager\n    /// </summary>\n    public static class ModelUtils\n    {\n        /// <summary>\n        /// The RootType for a Segment node identfier.\n        /// </summary>\n        public const int Segment = 0;\n\n        /// <summary>\n        /// The RootType for a Block node identfier.\n        /// </summary>\n        public const int Block = 1;\n\n        /// <summary>\n        /// Constructs a node identifier for a segment.\n        /// </summary>\n        /// <param name=\"segmentPath\">The segment path.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace that qualifies the identifier.</param>\n        /// <returns>The new node identifier.</returns>\n        public static NodeId ConstructIdForSegment(string segmentPath, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = segmentPath,\n                NamespaceIndex = namespaceIndex,\n                RootType = 0\n            };\n            return parsedNodeId.Construct();\n        }\n\n        /// <summary>\n        /// Constructs a NodeId for a block.\n        /// </summary>\n        /// <param name=\"blockId\">The block id.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace.</param>\n        /// <returns>The new NodeId.</returns>\n        public static NodeId ConstructIdForBlock(string blockId, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = blockId,\n                NamespaceIndex = namespaceIndex,\n                RootType = 1\n            };\n            return parsedNodeId.Construct();\n        }\n\n        /// <summary>\n        /// Constructs the node identifier for a component.\n        /// </summary>\n        /// <param name=\"component\">The component.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace.</param>\n        /// <returns>The node identifier for a component.</returns>\n        public static NodeId ConstructIdForComponent(NodeState component, ushort namespaceIndex)\n        {\n            if (component == null)\n            {\n                return null;\n            }\n\n            // components must be instances with a parent.\n\n            if (component is not BaseInstanceState instance || instance.Parent == null)\n            {\n                return component.NodeId;\n            }\n\n            // parent must have a string identifier.\n\n            if (instance.Parent.NodeId.Identifier is not string parentId)\n            {\n                return null;\n            }\n\n            var buffer = new StringBuilder();\n            buffer.Append(parentId);\n\n            // check if the parent is another component.\n            var index = parentId.IndexOf('?');\n\n            if (index < 0)\n            {\n                buffer.Append('?');\n            }\n            else\n            {\n                buffer.Append('/');\n            }\n\n            buffer.Append(component.SymbolicName);\n\n            // return the node identifier.\n            return new NodeId(buffer.ToString(), namespaceIndex);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/Namespaces.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the server.\n        /// </summary>\n        public const string DataAccess = \"DataAccess\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/SegmentBrowser.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Browses the children of a segment.\n    /// </summary>\n    public class SegmentBrowser : NodeBrowser\n    {\n        /// <summary>\n        /// Creates a new browser object with a set of filters.\n        /// </summary>\n        /// <param name=\"context\">The system context to use.</param>\n        /// <param name=\"view\">The view which may restrict the set of references/nodes found.</param>\n        /// <param name=\"referenceType\">The type of references being followed.</param>\n        /// <param name=\"includeSubtypes\">Whether subtypes of the reference type are followed.</param>\n        /// <param name=\"browseDirection\">Which way the references are being followed.</param>\n        /// <param name=\"browseName\">The browse name of a specific target (used when translating browse paths).</param>\n        /// <param name=\"additionalReferences\">Any additional references that should be included.</param>\n        /// <param name=\"internalOnly\">If true the browser should not making blocking calls to external systems.</param>\n        /// <param name=\"source\">The segment being accessed.</param>\n        public SegmentBrowser(\n            ISystemContext context,\n            ViewDescription view,\n            NodeId referenceType,\n            bool includeSubtypes,\n            BrowseDirection browseDirection,\n            QualifiedName browseName,\n            IEnumerable<IReference> additionalReferences,\n            bool internalOnly,\n            SegmentState source)\n        :\n            base(\n                context,\n                view,\n                referenceType,\n                includeSubtypes,\n                browseDirection,\n                browseName,\n                additionalReferences,\n                internalOnly)\n        {\n            _source = source;\n            _stage = Stage.Begin;\n        }\n\n        /// <summary>\n        /// Returns the next reference.\n        /// </summary>\n        /// <returns>The next reference that meets the browse criteria.</returns>\n        public override IReference Next()\n        {\n            var system = (UnderlyingSystem)SystemContext.SystemHandle;\n\n            lock (DataLock)\n            {\n                // enumerate pre-defined references.\n                // always call first to ensure any pushed-back references are returned first.\n                var reference = base.Next();\n\n                if (reference != null)\n                {\n                    return reference;\n                }\n\n                if (_stage == Stage.Begin)\n                {\n                    _segments = system.FindSegments(_source.SegmentPath);\n                    _stage = Stage.Segments;\n                    _position = 0;\n                }\n\n                // don't start browsing huge number of references when only internal references are requested.\n                if (InternalOnly)\n                {\n                    return null;\n                }\n\n                // enumerate segments.\n                if (_stage == Stage.Segments)\n                {\n                    if (IsRequired(ReferenceTypeIds.Organizes, false))\n                    {\n                        reference = NextChild();\n\n                        if (reference != null)\n                        {\n                            return reference;\n                        }\n                    }\n\n                    _blocks = system.FindBlocks(_source.SegmentPath);\n                    _stage = Stage.Blocks;\n                    _position = 0;\n                }\n\n                // enumerate blocks.\n                if (_stage == Stage.Blocks && IsRequired(ReferenceTypeIds.Organizes, false))\n                {\n                    reference = NextChild();\n\n                    if (reference != null)\n                    {\n                        return reference;\n                    }\n\n                    _stage = Stage.Done;\n                    _position = 0;\n                }\n\n                // all done.\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Returns the next child.\n        /// </summary>\n        private NodeStateReference NextChild()\n        {\n            var system = (UnderlyingSystem)SystemContext.SystemHandle;\n\n            NodeId targetId = null;\n\n            // check if a specific browse name is requested.\n            if (!QualifiedName.IsNull(BrowseName))\n            {\n                // check if match found previously.\n                if (_position == int.MaxValue)\n                {\n                    return null;\n                }\n\n                // browse name must be qualified by the correct namespace.\n                if (_source.BrowseName.NamespaceIndex != BrowseName.NamespaceIndex)\n                {\n                    return null;\n                }\n\n                // look for matching segment.\n                if (_stage == Stage.Segments && _segments != null)\n                {\n                    for (var ii = 0; ii < _segments.Count; ii++)\n                    {\n                        if (BrowseName.Name == _segments[ii].Name)\n                        {\n                            targetId = ModelUtils.ConstructIdForSegment(_segments[ii].Id, _source.NodeId.NamespaceIndex);\n                            break;\n                        }\n                    }\n                }\n\n                // look for matching block.\n                if (_stage == Stage.Blocks && _blocks != null)\n                {\n                    for (var ii = 0; ii < _blocks.Count; ii++)\n                    {\n                        var block = system.FindBlock(_blocks[ii]);\n\n                        if (block != null && BrowseName.Name == block.Name)\n                        {\n                            targetId = ModelUtils.ConstructIdForBlock(_blocks[ii], _source.NodeId.NamespaceIndex);\n                            break;\n                        }\n                    }\n                }\n\n                _position = int.MaxValue;\n            }\n\n            // return the child at the next position.\n            else\n            {\n                // look for next segment.\n                if (_stage == Stage.Segments && _segments != null)\n                {\n                    if (_position >= _segments.Count)\n                    {\n                        return null;\n                    }\n\n                    targetId = ModelUtils.ConstructIdForSegment(_segments[_position++].Id, _source.NodeId.NamespaceIndex);\n                }\n\n                // look for next block.\n                else if (_stage == Stage.Blocks && _blocks != null)\n                {\n                    if (_position >= _blocks.Count)\n                    {\n                        return null;\n                    }\n\n                    targetId = ModelUtils.ConstructIdForBlock(_blocks[_position++], _source.NodeId.NamespaceIndex);\n                }\n            }\n\n            // create reference.\n            if (targetId != null)\n            {\n                return new NodeStateReference(ReferenceTypeIds.Organizes, false, targetId);\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// The stages available in a browse operation.\n        /// </summary>\n        private enum Stage\n        {\n            Begin,\n            Segments,\n            Blocks,\n            Done\n        }\n\n        private Stage _stage;\n        private int _position;\n        private readonly SegmentState _source;\n        private IList<UnderlyingSystemSegment> _segments;\n        private IList<string> _blocks;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/SegmentState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// A object which maps a segment to a UA object.\n    /// </summary>\n    public class SegmentState : FolderState\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SegmentState\"/> class.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"nodeId\">The node id.</param>\n        /// <param name=\"segment\">The segment.</param>\n        public SegmentState(ISystemContext context, NodeId nodeId, UnderlyingSystemSegment segment) : base(null)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context != null);\n            SegmentPath = segment.Id;\n\n            TypeDefinitionId = ObjectTypeIds.FolderType;\n            SymbolicName = segment.Name;\n            NodeId = nodeId;\n            BrowseName = new QualifiedName(segment.Name, nodeId.NamespaceIndex);\n            DisplayName = new LocalizedText(segment.Name);\n            Description = null;\n            WriteMask = 0;\n            UserWriteMask = 0;\n            EventNotifier = EventNotifiers.None;\n        }\n\n        /// <summary>\n        /// Gets the segment path.\n        /// </summary>\n        /// <value>The segment path.</value>\n        public string SegmentPath { get; }\n\n        /// <summary>\n        /// Creates a browser that explores the structure of the block.\n        /// </summary>\n        /// <param name=\"context\">The system context to use.</param>\n        /// <param name=\"view\">The view which may restrict the set of references/nodes found.</param>\n        /// <param name=\"referenceType\">The type of references being followed.</param>\n        /// <param name=\"includeSubtypes\">Whether subtypes of the reference type are followed.</param>\n        /// <param name=\"browseDirection\">Which way the references are being followed.</param>\n        /// <param name=\"browseName\">The browse name of a specific target (used when translating browse paths).</param>\n        /// <param name=\"additionalReferences\">Any additional references that should be included.</param>\n        /// <param name=\"internalOnly\">If true the browser should not making blocking calls to external systems.</param>\n        /// <returns>The browse object (must be disposed).</returns>\n        public override INodeBrowser CreateBrowser(\n            ISystemContext context,\n            ViewDescription view,\n            NodeId referenceType,\n            bool includeSubtypes,\n            BrowseDirection browseDirection,\n            QualifiedName browseName,\n            IEnumerable<IReference> additionalReferences,\n            bool internalOnly)\n        {\n            NodeBrowser browser = new SegmentBrowser(\n                context,\n                view,\n                referenceType,\n                includeSubtypes,\n                browseDirection,\n                browseName,\n                additionalReferences,\n                internalOnly,\n                this);\n\n            PopulateBrowser(context, browser);\n\n            return browser;\n        }\n\n        /// <summary>\n        /// Populates the browser with references that meet the criteria.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"browser\">The browser to populate.</param>\n        protected override void PopulateBrowser(ISystemContext context, NodeBrowser browser)\n        {\n            base.PopulateBrowser(context, browser);\n\n            // check if the parent segments need to be returned.\n            if (browser.IsRequired(ReferenceTypeIds.Organizes, true))\n            {\n                if (context.SystemHandle is not UnderlyingSystem system)\n                {\n                    return;\n                }\n\n                // add reference for parent segment.\n                var segment = system.FindParentForSegment(SegmentPath);\n\n                if (segment != null)\n                {\n                    browser.Add(ReferenceTypeIds.Organizes, true, ModelUtils.ConstructIdForSegment(segment.Id, NodeId.NamespaceIndex));\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/UnderlyingSystem.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    /// <summary>\n    /// An object that provides access to the underlying system.\n    /// </summary>\n    public class UnderlyingSystem : IDisposable\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UnderlyingSystem\"/> class.\n        /// </summary>\n        public UnderlyingSystem()\n        {\n            _blocks = [];\n        }\n\n        /// <summary>\n        /// The finializer implementation.\n        /// </summary>\n        ~UnderlyingSystem()\n        {\n            Dispose(false);\n        }\n\n        /// <summary>\n        /// Frees any unmanaged reblocks.\n        /// </summary>\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (disposing && _simulationTimer != null)\n            {\n                _simulationTimer.Dispose();\n                _simulationTimer = null;\n            }\n        }\n\n        /// <summary>\n        /// A database which stores all known block paths.\n        /// </summary>\n        /// <remarks>\n        /// These are hardcoded for an example but the real data could come from a DB,\n        /// a file or any other system accessed with a non-UA API.\n        /// The name of the block is the final path element.\n        /// The same block can have many paths.\n        /// Each preceding element is a segment.\n        /// </remarks>\n        private readonly string[] s_BlockPathDatabase = [\n            \"Factory/East/Boiler1/Pipe1001\",\n            \"Factory/East/Boiler1/Drum1002\",\n            \"Factory/East/Boiler1/Pipe1002\",\n            \"Factory/East/Boiler1/FC1001\",\n            \"Factory/East/Boiler1/LC1001\",\n            \"Factory/East/Boiler1/CC1001\",\n            \"Factory/West/Boiler2/Pipe2001\",\n            \"Factory/West/Boiler2/Drum2002\",\n            \"Factory/West/Boiler2/Pipe2002\",\n            \"Factory/West/Boiler2/FC2001\",\n            \"Factory/West/Boiler2/LC2001\",\n            \"Factory/West/Boiler2/CC2001\",\n            \"Assets/Sensors/Flow/Pipe1001\",\n            \"Assets/Sensors/Level/Drum1002\",\n            \"Assets/Sensors/Flow/Pipe1002\",\n            \"Assets/Controllers/Flow/FC1001\",\n            \"Assets/Controllers/Level/LC1001\",\n            \"Assets/Controllers/Custom/CC1001\",\n            \"Assets/Sensors/Flow/Pipe2001\",\n            \"Assets/Sensors/Level/Drum2002\",\n            \"Assets/Sensors/Flow/Pipe2002\",\n            \"Assets/Controllers/Flow/FC2001\",\n            \"Assets/Controllers/Level/LC2001\",\n            \"Assets/Controllers/Custom/CC2001\",\n            \"TestData/Static/FC1001\",\n            \"TestData/Static/LC1001\",\n            \"TestData/Static/CC1001\",\n            \"TestData/Static/FC2001\",\n            \"TestData/Static/LC2001\",\n            \"TestData/Static/CC2001\"\n        ];\n\n        /// <summary>\n        /// A database which stores all known blocks.\n        /// </summary>\n        /// <remarks>\n        /// <para>\n        /// These are hardcoded for an example but the real data could come from a DB,\n        /// a file or any other system accessed with a non-UA API.\n        /// </para>\n        /// <para>\n        /// The name of the block is the first element.\n        /// The type of block is the second element.\n        /// </para>\n        /// </remarks>\n        private readonly string[] s_BlockDatabase = [\n            \"Pipe1001/FlowSensor\",\n            \"Drum1002/LevelSensor\",\n            \"Pipe1002/FlowSensor\",\n            \"Pipe2001/FlowSensor\",\n            \"Drum2002/LevelSensor\",\n            \"Pipe2002/FlowSensor\",\n            \"FC1001/Controller\",\n            \"LC1001/Controller\",\n            \"CC1001/CustomController\",\n            \"FC2001/Controller\",\n            \"LC2001/Controller\",\n            \"CC2001/CustomController\"\n        ];\n\n        /// <summary>\n        /// Returns the segment\n        /// </summary>\n        /// <param name=\"segmentPath\">The path to the segment.</param>\n        /// <returns>The segment. Null if the segment path does not exist.</returns>\n        public UnderlyingSystemSegment FindSegment(string segmentPath)\n        {\n            lock (_lock)\n            {\n                // check for invalid path.\n                if (string.IsNullOrEmpty(segmentPath))\n                {\n                    return null;\n                }\n\n                // extract the seqment name from the path.\n                var segmentName = segmentPath;\n\n                var index = segmentPath.LastIndexOf('/');\n\n                if (index != -1)\n                {\n                    segmentName = segmentName[(index + 1)..];\n                }\n\n                if (string.IsNullOrEmpty(segmentName))\n                {\n                    return null;\n                }\n\n                // see if there is a block path that includes the segment.\n                index = segmentPath.Length;\n\n                for (var ii = 0; ii < s_BlockPathDatabase.Length; ii++)\n                {\n                    var blockPath = s_BlockPathDatabase[ii];\n\n                    if (index >= blockPath.Length || blockPath[index] != '/')\n                    {\n                        continue;\n                    }\n\n                    // segment found - return the info.\n                    if (blockPath.StartsWith(segmentPath, StringComparison.Ordinal))\n                    {\n                        return new UnderlyingSystemSegment\n                        {\n                            Id = segmentPath,\n                            Name = segmentName,\n                            SegmentType = null\n                        };\n                    }\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Finds the segments belonging to the specified segment.\n        /// </summary>\n        /// <param name=\"segmentPath\">The path to the segment to search.</param>\n        /// <returns>The list of segments found. Null if the segment path does not exist.</returns>\n        public IList<UnderlyingSystemSegment> FindSegments(string segmentPath)\n        {\n            lock (_lock)\n            {\n                // check for invalid path.\n                if (string.IsNullOrEmpty(segmentPath))\n                {\n                    segmentPath = string.Empty;\n                }\n\n                var segments = new Dictionary<string, UnderlyingSystemSegment>();\n\n                // find all block paths that start with the specified segment.\n                var length = segmentPath.Length;\n\n                for (var ii = 0; ii < s_BlockPathDatabase.Length; ii++)\n                {\n                    var blockPath = s_BlockPathDatabase[ii];\n\n                    // check for segment path prefix in block path.\n                    if (length > 0)\n                    {\n                        if (length >= blockPath.Length || blockPath[length] != '/')\n                        {\n                            continue;\n                        }\n\n                        if (!blockPath.StartsWith(segmentPath, StringComparison.Ordinal))\n                        {\n                            continue;\n                        }\n\n                        blockPath = blockPath[(length + 1)..];\n                    }\n\n                    // extract segment name.\n                    var index = blockPath.IndexOf('/');\n\n                    if (index != -1)\n                    {\n                        var segmentName = blockPath[..index];\n\n                        if (!segments.ContainsKey(segmentName))\n                        {\n                            var segmentId = segmentName;\n\n                            if (!string.IsNullOrEmpty(segmentPath))\n                            {\n                                segmentId = segmentPath;\n                                segmentId += \"/\";\n                                segmentId += segmentName;\n                            }\n\n                            var segment = new UnderlyingSystemSegment\n                            {\n                                Id = segmentId,\n                                Name = segmentName,\n                                SegmentType = null\n                            };\n\n                            segments.Add(segmentName, segment);\n                        }\n                    }\n                }\n\n                // return list.\n                return [.. segments.Values];\n            }\n        }\n\n        /// <summary>\n        /// Finds the blocks belonging to the specified segment.\n        /// </summary>\n        /// <param name=\"segmentPath\">The path to the segment to search.</param>\n        /// <returns>The list of blocks found. Null if the segment path does not exist.</returns>\n        public IList<string> FindBlocks(string segmentPath)\n        {\n            lock (_lock)\n            {\n                // check for invalid path.\n                if (string.IsNullOrEmpty(segmentPath))\n                {\n                    segmentPath = string.Empty;\n                }\n\n                var blocks = new List<string>();\n\n                // look up the segment in the \"DB\".\n                var length = segmentPath.Length;\n\n                for (var ii = 0; ii < s_BlockPathDatabase.Length; ii++)\n                {\n                    var blockPath = s_BlockPathDatabase[ii];\n\n                    // check for segment path prefix in block path.\n                    if (length > 0)\n                    {\n                        if (length >= blockPath.Length || blockPath[length] != '/')\n                        {\n                            continue;\n                        }\n\n                        if (!blockPath.StartsWith(segmentPath, StringComparison.Ordinal))\n                        {\n                            continue;\n                        }\n\n                        blockPath = blockPath[(length + 1)..];\n                    }\n\n                    // check if there are no more segments in the path.\n                    var index = blockPath.IndexOf('/');\n\n                    if (index == -1)\n                    {\n                        blockPath = blockPath[(index + 1)..];\n\n                        if (!blocks.Contains(blockPath))\n                        {\n                            blocks.Add(blockPath);\n                        }\n                    }\n                }\n\n                return blocks;\n            }\n        }\n\n        /// <summary>\n        /// Finds the parent segment for the specified segment.\n        /// </summary>\n        /// <param name=\"segmentPath\">The segment path.</param>\n        /// <returns>The segment path for the parent.</returns>\n        public UnderlyingSystemSegment FindParentForSegment(string segmentPath)\n        {\n            lock (_lock)\n            {\n                // check for invalid segment.\n                var segment = FindSegment(segmentPath);\n\n                if (segment == null)\n                {\n                    return null;\n                }\n\n                // check for root segment.\n                var index = segmentPath.LastIndexOf('/');\n\n                if (index == -1)\n                {\n                    return null;\n                }\n\n                // construct the parent.\n                var parent = new UnderlyingSystemSegment\n                {\n                    Id = segmentPath[..index],\n                    SegmentType = null\n                };\n\n                index = parent.Id.LastIndexOf('/');\n\n                if (index == -1)\n                {\n                    parent.Name = parent.Id;\n                }\n                else\n                {\n                    parent.Name = parent.Id[..index];\n                }\n\n                return parent;\n            }\n        }\n\n        /// <summary>\n        /// Finds a block.\n        /// </summary>\n        /// <param name=\"blockId\">The block identifier.</param>\n        /// <returns>The block.</returns>\n        public UnderlyingSystemBlock FindBlock(string blockId)\n        {\n            UnderlyingSystemBlock block = null;\n\n            lock (_lock)\n            {\n                // check for invalid name.\n                if (string.IsNullOrEmpty(blockId))\n                {\n                    return null;\n                }\n\n                // look for cached block.\n                if (_blocks.TryGetValue(blockId, out block))\n                {\n                    return block;\n                }\n\n                // lookup block in database.\n                string blockType = null;\n                var length = blockId.Length;\n\n                for (var ii = 0; ii < s_BlockDatabase.Length; ii++)\n                {\n                    blockType = s_BlockDatabase[ii];\n\n                    if (length >= blockType.Length || blockType[length] != '/')\n                    {\n                        continue;\n                    }\n\n                    if (blockType.StartsWith(blockId, StringComparison.Ordinal))\n                    {\n                        blockType = blockType[(length + 1)..];\n                        break;\n                    }\n\n                    blockType = null;\n                }\n\n                // block not found.\n                if (blockType == null)\n                {\n                    return null;\n                }\n\n                // create a new block.\n                block = new UnderlyingSystemBlock\n                {\n                    // create the block.\n                    Id = blockId,\n                    Name = blockId,\n                    BlockType = blockType\n                };\n\n                _blocks.Add(blockId, block);\n\n                // add the tags based on the block type.\n                // note that the block and tag types used here are types defined by the underlying system.\n                // the node manager will need to map these types to UA defined types.\n                switch (block.BlockType)\n                {\n                    case \"FlowSensor\":\n                        {\n                            block.CreateTag(\"Measurement\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Analog, \"liters/sec\", false);\n                            block.CreateTag(\"Online\", UnderlyingSystemDataType.Integer1, UnderlyingSystemTagType.Digital, null, false);\n                            break;\n                        }\n\n                    case \"LevelSensor\":\n                        {\n                            block.CreateTag(\"Measurement\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Analog, \"liters\", false);\n                            block.CreateTag(\"Online\", UnderlyingSystemDataType.Integer1, UnderlyingSystemTagType.Digital, null, false);\n                            break;\n                        }\n\n                    case \"Controller\":\n                        {\n                            block.CreateTag(\"SetPoint\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Normal, null, true);\n                            block.CreateTag(\"Measurement\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Normal, null, false);\n                            block.CreateTag(\"Output\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Normal, null, false);\n                            block.CreateTag(\"Status\", UnderlyingSystemDataType.Integer4, UnderlyingSystemTagType.Enumerated, null, false);\n                            break;\n                        }\n\n                    case \"CustomController\":\n                        {\n                            block.CreateTag(\"Input1\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Normal, null, true);\n                            block.CreateTag(\"Input2\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Normal, null, true);\n                            block.CreateTag(\"Input3\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Normal, null, true);\n                            block.CreateTag(\"Output\", UnderlyingSystemDataType.Real4, UnderlyingSystemTagType.Normal, null, false);\n                            break;\n                        }\n                }\n            }\n\n            // return the new block.\n            return block;\n        }\n\n        /// <summary>\n        /// Finds the segments for block.\n        /// </summary>\n        /// <param name=\"blockId\">The block id.</param>\n        /// <returns>The list of segments.</returns>\n        public IList<UnderlyingSystemSegment> FindSegmentsForBlock(string blockId)\n        {\n            lock (_lock)\n            {\n                // check for invalid path.\n                if (string.IsNullOrEmpty(blockId))\n                {\n                    return null;\n                }\n\n                var segments = new List<UnderlyingSystemSegment>();\n\n                // look up the segment in the block path database.\n                var length = blockId.Length;\n\n                for (var ii = 0; ii < s_BlockPathDatabase.Length; ii++)\n                {\n                    var blockPath = s_BlockPathDatabase[ii];\n\n                    if (length >= blockPath.Length || blockPath[^length] != '/')\n                    {\n                        continue;\n                    }\n\n                    if (!blockPath.EndsWith(blockId, StringComparison.Ordinal))\n                    {\n                        continue;\n                    }\n\n                    var segmentPath = blockPath[..(blockPath.Length - length - 1)];\n\n                    // construct segment.\n                    var segment = new UnderlyingSystemSegment\n                    {\n                        Id = segmentPath,\n                        SegmentType = null\n                    };\n\n                    var index = segmentPath.LastIndexOf('/');\n\n                    if (index == -1)\n                    {\n                        segment.Name = segmentPath;\n                    }\n                    else\n                    {\n                        segment.Name = segmentPath[..index];\n                    }\n\n                    segments.Add(segment);\n                }\n\n                return segments;\n            }\n        }\n\n        /// <summary>\n        /// Starts a simulation which causes the tag states to change.\n        /// </summary>\n        /// <remarks>\n        /// This simulation randomly activates the tags that belong to the blocks.\n        /// Once an tag is active it has to be acknowledged and confirmed.\n        /// Once an tag is confirmed it go to the inactive state.\n        /// If the tag stays active the severity will be gradually increased.\n        /// </remarks>\n        public void StartSimulation()\n        {\n            lock (_lock)\n            {\n                if (_simulationTimer != null)\n                {\n                    _simulationTimer.Dispose();\n                    _simulationTimer = null;\n                }\n\n                _generator = new Opc.Ua.Test.TestDataGenerator();\n                _simulationTimer = new Timer(DoSimulation, null, 1000, 1000);\n            }\n        }\n\n        /// <summary>\n        /// Stops the simulation.\n        /// </summary>\n        public void StopSimulation()\n        {\n            lock (_lock)\n            {\n                if (_simulationTimer != null)\n                {\n                    _simulationTimer.Dispose();\n                    _simulationTimer = null;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Simulates a block by updating the state of the tags belonging to the condition.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void DoSimulation(object state)\n        {\n            try\n            {\n                // get the list of blocks.\n                List<UnderlyingSystemBlock> blocks = null;\n\n                lock (_lock)\n                {\n                    _simulationCounter++;\n                    blocks = [.. _blocks.Values];\n                }\n\n                // run simulation for each block.\n                for (var ii = 0; ii < blocks.Count; ii++)\n                {\n                    blocks[ii].DoSimulation(_simulationCounter, ii, _generator);\n                }\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error running simulation for system\");\n            }\n        }\n\n        private readonly Lock _lock = new();\n        private readonly Dictionary<string, UnderlyingSystemBlock> _blocks;\n        private Timer _simulationTimer;\n        private long _simulationCounter;\n        private Opc.Ua.Test.TestDataGenerator _generator;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/UnderlyingSystemBlock.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// This class simulates a block in the system.\n    /// </summary>\n    public class UnderlyingSystemBlock\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UnderlyingSystemBlock\"/> class.\n        /// </summary>\n        public UnderlyingSystemBlock()\n        {\n            _tags = [];\n        }\n\n        /// <summary>\n        /// Gets or sets the unique identifier for the block.\n        /// </summary>\n        /// <value>The unique identifier for the block.</value>\n        public string Id { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the block.\n        /// </summary>\n        /// <value>The name.</value>\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the type of the block.\n        /// </summary>\n        /// <value>The type of the block.</value>\n        public string BlockType { get; set; }\n\n        /// <summary>\n        /// Gets or sets the time when the block structure last changed.\n        /// </summary>\n        /// <value>When the block structure last changed.</value>\n        public DateTime Timestamp { get; set; }\n\n        /// <summary>\n        /// Creates the tag.\n        /// </summary>\n        /// <param name=\"tagName\">Name of the tag.</param>\n        /// <param name=\"dataType\">Type of the data.</param>\n        /// <param name=\"tagType\">Type of the tag.</param>\n        /// <param name=\"engineeringUnits\">The engineering units.</param>\n        /// <param name=\"writeable\">if set to <c>true</c> the tag is writeable.</param>\n        public void CreateTag(\n            string tagName,\n            UnderlyingSystemDataType dataType,\n            UnderlyingSystemTagType tagType,\n            string engineeringUnits,\n            bool writeable)\n        {\n            // create tag.\n            var tag = new UnderlyingSystemTag\n            {\n                Block = this,\n                Name = tagName,\n                Description = null,\n                EngineeringUnits = engineeringUnits,\n                DataType = dataType,\n                TagType = tagType,\n                IsWriteable = writeable,\n                Labels = null,\n                EuRange = null\n            };\n\n            switch (tagType)\n            {\n                case UnderlyingSystemTagType.Analog:\n                    {\n                        tag.Description = \"An analog value.\";\n                        tag.TagType = UnderlyingSystemTagType.Analog;\n                        tag.EuRange = [100, 0];\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Digital:\n                    {\n                        tag.Description = \"A digital value.\";\n                        tag.TagType = UnderlyingSystemTagType.Digital;\n                        tag.Labels = [\"Online\", \"Offline\"];\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Enumerated:\n                    {\n                        tag.Description = \"An enumerated value.\";\n                        tag.TagType = UnderlyingSystemTagType.Enumerated;\n                        tag.Labels = [\"Red\", \"Yellow\", \"Green\"];\n                        break;\n                    }\n\n                default:\n                    {\n                        tag.Description = \"A generic value.\";\n                        break;\n                    }\n            }\n\n            // set an initial value.\n            switch (tag.DataType)\n            {\n                case UnderlyingSystemDataType.Integer1: { tag.Value = (sbyte)0; break; }\n                case UnderlyingSystemDataType.Integer2: { tag.Value = (short)0; break; }\n                case UnderlyingSystemDataType.Integer4: { tag.Value = 0; break; }\n                case UnderlyingSystemDataType.Real4: { tag.Value = (float)0; break; }\n                case UnderlyingSystemDataType.String: { tag.Value = string.Empty; break; }\n            }\n\n            lock (_tags)\n            {\n                _tags.Add(tag);\n                Timestamp = DateTime.UtcNow;\n            }\n        }\n\n        /// <summary>\n        /// Returns a snapshot of the tags belonging to the block.\n        /// </summary>\n        /// <returns>The list of tags. Null if the block does not exist.</returns>\n        public IList<UnderlyingSystemTag> GetTags()\n        {\n            lock (_tags)\n            {\n                // create snapshots of the tags.\n                var tags = new UnderlyingSystemTag[_tags.Count];\n\n                for (var ii = 0; ii < _tags.Count; ii++)\n                {\n                    tags[ii] = _tags[ii].CreateSnapshot();\n                }\n\n                return tags;\n            }\n        }\n\n        /// <summary>\n        /// Starts the monitoring.\n        /// </summary>\n        /// <param name=\"callback\">The callback to use when reporting changes.</param>\n        public void StartMonitoring(TagsChangedEventHandler callback)\n        {\n            lock (_tags)\n            {\n                _onTagsChanged = callback;\n            }\n        }\n\n        /// <summary>\n        /// Writes the tag value.\n        /// </summary>\n        /// <param name=\"tagName\">Name of the tag.</param>\n        /// <param name=\"value\">The value.</param>\n        /// <returns>The status code for the operation.</returns>\n        public uint WriteTagValue(string tagName, object value)\n        {\n            UnderlyingSystemTag tag = null;\n            TagsChangedEventHandler onTagsChanged = null;\n\n            lock (_tags)\n            {\n                onTagsChanged = _onTagsChanged;\n\n                // find the tag.\n                tag = FindTag(tagName);\n\n                if (tag == null)\n                {\n                    return StatusCodes.BadNodeIdUnknown;\n                }\n\n                // cast value to correct type.\n                try\n                {\n                    switch (tag.DataType)\n                    {\n                        case UnderlyingSystemDataType.Integer1:\n                            {\n                                tag.Value = (sbyte)value;\n                                break;\n                            }\n\n                        case UnderlyingSystemDataType.Integer2:\n                            {\n                                tag.Value = (short)value;\n                                break;\n                            }\n\n                        case UnderlyingSystemDataType.Integer4:\n                            {\n                                tag.Value = (int)value;\n                                break;\n                            }\n\n                        case UnderlyingSystemDataType.Real4:\n                            {\n                                tag.Value = (float)value;\n                                break;\n                            }\n\n                        case UnderlyingSystemDataType.String:\n                            {\n                                tag.Value = (string)value;\n                                break;\n                            }\n                    }\n                }\n                catch\n                {\n                    return StatusCodes.BadTypeMismatch;\n                }\n\n                // updated the timestamp.\n                tag.Timestamp = DateTime.UtcNow;\n            }\n\n            // raise notification.\n            if (tag != null && onTagsChanged != null)\n            {\n                onTagsChanged(new UnderlyingSystemTag[] { tag });\n            }\n\n            return StatusCodes.Good;\n        }\n\n        /// <summary>\n        /// Stops monitoring.\n        /// </summary>\n        public void StopMonitoring()\n        {\n            lock (_tags)\n            {\n                _onTagsChanged = null;\n            }\n        }\n\n        /// <summary>\n        /// Simulates a block by updating the state of the tags belonging to the condition.\n        /// </summary>\n        /// <param name=\"counter\">The number of simulation cycles that have elapsed.</param>\n        /// <param name=\"index\">The index of the block within the system.</param>\n        /// <param name=\"generator\">An object which generates random data.</param>\n        public void DoSimulation(long counter, int index, Opc.Ua.Test.TestDataGenerator generator)\n        {\n            try\n            {\n                TagsChangedEventHandler onTagsChanged = null;\n                var snapshots = new List<UnderlyingSystemTag>();\n\n                // update the tags.\n                lock (_tags)\n                {\n                    onTagsChanged = _onTagsChanged;\n\n                    // do nothing if not monitored.\n                    if (onTagsChanged == null)\n                    {\n                        return;\n                    }\n\n                    for (var ii = 0; ii < _tags.Count; ii++)\n                    {\n                        var tag = _tags[ii];\n                        UpdateTagValue(tag, generator);\n\n                        var value = new DataValue\n                        {\n                            Value = tag.Value,\n                            StatusCode = StatusCodes.Good,\n                            SourceTimestamp = tag.Timestamp\n                        };\n\n                        if (counter % (8 + (index % 4)) == 0)\n                        {\n                            UpdateTagMetadata(tag, generator);\n                        }\n\n                        snapshots.Add(tag.CreateSnapshot());\n                    }\n                }\n\n                // report any tag changes after releasing the lock.\n                onTagsChanged?.Invoke(snapshots);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error running simulation for block {0}\", Name);\n            }\n        }\n\n        /// <summary>\n        /// Finds the tag identified by the name.\n        /// </summary>\n        /// <param name=\"tagName\">Name of the tag.</param>\n        /// <returns>The tag if null; otherwise null.</returns>\n        private UnderlyingSystemTag FindTag(string tagName)\n        {\n            lock (_tags)\n            {\n                // look up tag.\n                for (var ii = 0; ii < _tags.Count; ii++)\n                {\n                    var tag = _tags[ii];\n\n                    if (tag.Name == tagName)\n                    {\n                        return tag;\n                    }\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Updates the value of an tag.\n        /// </summary>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"generator\"></param>\n        private bool UpdateTagValue(\n            UnderlyingSystemTag tag,\n            Opc.Ua.Test.TestDataGenerator generator)\n        {\n            // don't update writeable tags.\n            if (tag.IsWriteable)\n            {\n                return false;\n            }\n\n            // check if a range applies to the value.\n            var high = 0;\n            var low = 0;\n\n            switch (tag.TagType)\n            {\n                case UnderlyingSystemTagType.Analog:\n                    {\n                        if (tag.EuRange?.Length >= 2)\n                        {\n                            high = (int)tag.EuRange[0];\n                            low = (int)tag.EuRange[1];\n                        }\n\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Digital:\n                    {\n                        high = 1;\n                        low = 0;\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Enumerated:\n                    {\n                        if (tag.Labels?.Length > 0)\n                        {\n                            high = tag.Labels.Length - 1;\n                            low = 0;\n                        }\n\n                        break;\n                    }\n            }\n\n            // select a value in the range.\n            var value = -1;\n\n            if (high > low)\n            {\n                value = (generator.GetRandomUInt16() % (high - low + 1)) + low;\n            }\n\n            // cast value to correct type or generate a random value.\n            switch (tag.DataType)\n            {\n                case UnderlyingSystemDataType.Integer1:\n                    {\n                        if (value == -1)\n                        {\n                            tag.Value = generator.GetRandomSByte();\n                        }\n                        else\n                        {\n                            tag.Value = (sbyte)value;\n                        }\n\n                        break;\n                    }\n\n                case UnderlyingSystemDataType.Integer2:\n                    {\n                        if (value == -1)\n                        {\n                            tag.Value = generator.GetRandomInt16();\n                        }\n                        else\n                        {\n                            tag.Value = (short)value;\n                        }\n\n                        break;\n                    }\n\n                case UnderlyingSystemDataType.Integer4:\n                    {\n                        if (value == -1)\n                        {\n                            tag.Value = generator.GetRandomInt32();\n                        }\n                        else\n                        {\n                            tag.Value = value;\n                        }\n\n                        break;\n                    }\n\n                case UnderlyingSystemDataType.Real4:\n                    {\n                        if (value == -1)\n                        {\n                            tag.Value = generator.GetRandomFloat();\n                        }\n                        else\n                        {\n                            tag.Value = (float)value;\n                        }\n\n                        break;\n                    }\n\n                case UnderlyingSystemDataType.String:\n                    {\n                        tag.Value = generator.GetRandomString();\n                        break;\n                    }\n            }\n\n            tag.Timestamp = DateTime.UtcNow;\n            return true;\n        }\n\n        /// <summary>\n        /// Updates the metadata for a tag.\n        /// </summary>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"generator\"></param>\n        private bool UpdateTagMetadata(\n            UnderlyingSystemTag tag,\n            Opc.Ua.Test.TestDataGenerator generator)\n        {\n            switch (tag.TagType)\n            {\n                case UnderlyingSystemTagType.Analog:\n                    {\n                        if (tag.EuRange != null)\n                        {\n                            var range = new double[tag.EuRange.Length];\n\n                            for (var ii = 0; ii < tag.EuRange.Length; ii++)\n                            {\n                                range[ii] = tag.EuRange[ii] + 1;\n                            }\n\n                            tag.EuRange = range;\n                        }\n\n                        break;\n                    }\n\n                case UnderlyingSystemTagType.Digital:\n                case UnderlyingSystemTagType.Enumerated:\n                    {\n                        if (tag.Labels != null)\n                        {\n                            var labels = new string[tag.Labels.Length];\n\n                            for (var ii = 0; ii < tag.Labels.Length; ii++)\n                            {\n                                labels[ii] = generator.GetRandomString();\n                            }\n\n                            tag.Labels = labels;\n                        }\n\n                        break;\n                    }\n                default:\n                    {\n                        return false;\n                    }\n            }\n            return true;\n        }\n\n        private readonly List<UnderlyingSystemTag> _tags;\n        private TagsChangedEventHandler _onTagsChanged;\n    }\n\n    /// <summary>\n    /// Used to receive events when the state of an tag changes.\n    /// </summary>\n    /// <param name=\"tags\"></param>\n    public delegate void TagsChangedEventHandler(IList<UnderlyingSystemTag> tags);\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/UnderlyingSystemDataType.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    /// <summary>\n    /// Defines the possible tag data types\n    /// </summary>\n    public enum UnderlyingSystemDataType\n    {\n        /// <summary>\n        /// A 1-byte integer value.\n        /// </summary>\n        Integer1 = 0,\n\n        /// <summary>\n        /// A 2-byte integer value.\n        /// </summary>\n        Integer2 = 1,\n\n        /// <summary>\n        /// A 4-byte integer value.\n        /// </summary>\n        Integer4 = 2,\n\n        /// <summary>\n        /// A 4-byte floating point value.\n        /// </summary>\n        Real4 = 3,\n\n        /// <summary>\n        /// A string value.\n        /// </summary>\n        String = 4\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/UnderlyingSystemSegment.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    /// <summary>\n    /// Stores information about a segment in the system.\n    /// </summary>\n    public class UnderlyingSystemSegment\n    {\n        /// <summary>\n        /// Gets or sets the unique id for the segment.\n        /// </summary>\n        /// <value>The unique id for the segment</value>\n        public string Id { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the segment.\n        /// </summary>\n        /// <value>The name of the segment.</value>\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the type of the segment.\n        /// </summary>\n        /// <value>The type of the segment.</value>\n        public string SegmentType { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/UnderlyingSystemTag.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    using System;\n\n    /// <summary>\n    /// This class stores the state of a tag known to the system.\n    /// </summary>\n    /// <remarks>\n    /// This class only stores the information about an tag that a system has. The\n    /// system has no concept of the UA information model and the NodeManager must\n    /// convert the information stored in this class into the UA equivalent.\n    /// </remarks>\n    public class UnderlyingSystemTag\n    {\n        /// <summary>\n        /// The block that the tag belongs to\n        /// </summary>\n        /// <value>The block.</value>\n        public UnderlyingSystemBlock Block { get; set; }\n\n        /// <summary>\n        /// Gets or sets the name of the tag.\n        /// </summary>\n        /// <value>The name of the tag.</value>\n        public string Name { get; set; }\n\n        /// <summary>\n        /// Gets or sets the description of the tag.\n        /// </summary>\n        /// <value>The description of the tag.</value>\n        public string Description { get; set; }\n\n        /// <summary>\n        /// Gets or sets the engineering units for the tag.\n        /// </summary>\n        /// <value>The engineering units for the tag.</value>\n        public string EngineeringUnits { get; set; }\n\n        /// <summary>\n        /// Gets or sets the data type for the tag.\n        /// </summary>\n        /// <value>The data type for the tag.</value>\n        public UnderlyingSystemDataType DataType { get; set; }\n\n        /// <summary>\n        /// Gets or sets the type of the tag.\n        /// </summary>\n        /// <value>The type of the tag.</value>\n        public UnderlyingSystemTagType TagType { get; set; }\n\n        /// <summary>\n        /// Gets or sets the value of the tag.\n        /// </summary>\n        /// <value>The tag value.</value>\n        public object Value { get; set; }\n\n        /// <summary>\n        /// Gets or sets the timestamp for the value.\n        /// </summary>\n        /// <value>The timestamp for the value.</value>\n        public DateTime Timestamp { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the value is writeable.\n        /// </summary>\n        /// <value>\n        /// \t<c>true</c> if the vaklue is writeable; otherwise, <c>false</c>.\n        /// </value>\n        public bool IsWriteable { get; set; }\n\n        /// <summary>\n        /// Gets or sets the EU ranges for the tag.\n        /// </summary>\n        /// <value>The EU ranges for the tag.</value>\n        /// <remarks>\n        /// 2 values: HighEU, LowEU\n        /// 4 values: HighEU, LowEU, HighIR, LowIR\n        /// </remarks>\n        public double[] EuRange { get; set; }\n\n        /// <summary>\n        /// Gets or sets the labels for the tag values.\n        /// </summary>\n        /// <value>The labels for the tag values.</value>\n        /// <remarks>\n        /// Digital Tags: TrueState, FalseState\n        /// Enumerated Tags: Lookup table for Value.\n        /// </remarks>\n        public string[] Labels { get; set; }\n\n        /// <summary>\n        /// Creates a snapshot of the tag.\n        /// </summary>\n        /// <returns>The snapshot.</returns>\n        public UnderlyingSystemTag CreateSnapshot()\n        {\n            return (UnderlyingSystemTag)MemberwiseClone();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DataAccess/UnderlyingSystemTagType.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DataAccess\n{\n    /// <summary>\n    /// Defines the possible tag types\n    /// </summary>\n    public enum UnderlyingSystemTagType\n    {\n        /// <summary>\n        /// The tag has no special characteristics.\n        /// </summary>\n        Normal = 0,\n\n        /// <summary>\n        /// The tag is an analog value with a high and low range.\n        /// </summary>\n        Analog = 1,\n\n        /// <summary>\n        /// The tag is a digital value with a true and false state.\n        /// </summary>\n        Digital = 2,\n\n        /// <summary>\n        /// The tag is a enumerated value with set of names states.\n        /// </summary>\n        Enumerated = 3\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/Alarm.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    public class Alarm\n    {\n        public AlarmObjectStates ObjectType { get; set; }\n\n        public string Name { get; set; }\n\n        public string Id { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/AlarmObjectStates.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    public enum AlarmObjectStates\n    {\n        TripAlarmType,\n        OffNormalAlarmType,\n        AlarmConditionType,\n        LimitAlarmType,\n        ConditionType\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/AlarmsConfiguration.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    using System.Text.Json;\n    using System.Text.Json.Serialization;\n\n    public class AlarmsConfiguration\n    {\n        public Folder[] Folders { get; set; }\n\n        public Script Script { get; set; }\n\n        public static AlarmsConfiguration FromJson(string json)\n        {\n            return JsonSerializer.Deserialize<AlarmsConfiguration>(\n                json, kSerializerOptions);\n        }\n\n        private static readonly JsonSerializerOptions kSerializerOptions = new()\n        {\n            ReadCommentHandling = JsonCommentHandling.Skip,\n            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,\n            PropertyNameCaseInsensitive = true,\n            Converters =\n            {\n                new JsonStringEnumConverter()\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/ConditionStates.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    public enum ConditionStates\n    {\n        Enabled,\n        Activated\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/Event.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    using Opc.Ua;\n\n    public class Event\n    {\n        public string AlarmId { get; set; }\n\n        public string Reason { get; set; }\n\n        public EventSeverity Severity { get; set; }\n\n        public string EventId { get; set; }\n\n        public StateChange[] StateChanges { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/Folder.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    public class Folder\n    {\n        public string Name { get; set; }\n\n        public Source[] Sources { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/Script.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    public class Script\n    {\n        public int WaitUntilStartInSeconds { get; set; }\n\n        public bool IsScriptInRepeatingLoop { get; set; }\n\n        public int RunningForSeconds { get; set; }\n\n        public Step[] Steps { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/ScriptException.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    using System;\n\n    public class ScriptException : Exception\n    {\n        public ScriptException(string message) : base(message)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/Source.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    public class Source\n    {\n        public string Name { get; set; }\n\n        public Alarm[] Alarms { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/StateChange.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    public class StateChange\n    {\n        public ConditionStates StateType { get; set; }\n\n        public bool State { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Configuration/Step.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Configuration\n{\n    public class Step\n    {\n        public @Event Event { get; set; }\n\n        public int SleepInSeconds { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/DeterministicAlarmsNodeManager.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms\n{\n    using DeterministicAlarms.Configuration;\n    using DeterministicAlarms.Model;\n    using DeterministicAlarms.SimBackend;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    public class DeterministicAlarmsNodeManager : CustomNodeManager2\n    {\n        private readonly SimBackendService _system;\n        private readonly List<SimFolderState> _folders = [];\n        private uint _nodeIdCounter;\n        private List<NodeState> _rootNotifiers;\n        private readonly IServerInternal _server;\n        private readonly ServerSystemContext _defaultSystemContext;\n        private readonly Dictionary<string, SimSourceNodeState> _sourceNodes = [];\n        private readonly AlarmsConfiguration _scriptconfiguration;\n        private readonly TimeService _timeService;\n        private Dictionary<string, string> _scriptAlarmToSources;\n        private readonly string _configurationJson;\n        private readonly ILogger _logger;\n\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"timeService\"></param>\n        /// <param name=\"configurationJson\"></param>\n        /// <param name=\"logger\"></param>\n        public DeterministicAlarmsNodeManager(IServerInternal server,\n            ApplicationConfiguration configuration, TimeService timeService,\n            string configurationJson, ILogger logger) : base(server, configuration)\n        {\n            _server = server;\n            _defaultSystemContext = _server.DefaultSystemContext.Copy();\n            SystemContext.NodeIdFactory = this;\n            SystemContext.SystemHandle = _system = new SimBackendService();\n            _configurationJson = configurationJson;\n            _logger = logger;\n            _timeService = timeService;\n\n            // set one namespace for the type model and one names for dynamically created nodes.\n            var namespaceUrls = new string[1];\n            namespaceUrls[0] = Namespaces.DeterministicAlarmsInstance;\n            SetNamespaces(namespaceUrls);\n\n            // read script configuration file\n            try\n            {\n                _scriptconfiguration = AlarmsConfiguration.FromJson(_configurationJson);\n            }\n            catch (Exception ex)\n            {\n                _logger.ConfigurationError(ex);\n                _logger.PrintConfiguration(_configurationJson);\n            }\n        }\n\n        /// <summary>\n        /// Verifies the script configuration file\n        /// </summary>\n        /// <param name=\"scriptConfiguration\"></param>\n        /// <exception cref=\"ScriptException\"></exception>\n        private void VerifyScriptConfiguration(AlarmsConfiguration scriptConfiguration)\n        {\n            _scriptAlarmToSources = [];\n            foreach (var folder in scriptConfiguration.Folders)\n            {\n                foreach (var source in folder.Sources)\n                {\n                    if (!_sourceNodes.ContainsKey(source.Name))\n                    {\n                        throw new ScriptException($\"Source Name: {source.Name} doesn't exist\");\n                    }\n\n                    foreach (var alarm in source.Alarms)\n                    {\n                        if (_scriptAlarmToSources.ContainsKey(alarm.Id))\n                        {\n                            throw new ScriptException($\"AlarmId: {alarm.Id} already exist\");\n                        }\n\n                        _scriptAlarmToSources[alarm.Id] = source.Name;\n                    }\n                }\n            }\n\n            var uniqueEventIds = new HashSet<string>();\n            foreach (var step in scriptConfiguration.Script.Steps)\n            {\n                if (step.Event != null)\n                {\n                    if (!uniqueEventIds.Add(step.Event.EventId))\n                    {\n                        throw new ScriptException($\"EventId: {step.Event.EventId} already exist\");\n                    }\n\n                    if (!_scriptAlarmToSources.ContainsKey(step.Event.AlarmId))\n                    {\n                        throw new ScriptException($\"AlarmId: {step.Event.AlarmId} is not defined\");\n                    }\n\n                    if (step.Event.StateChanges == null || step.Event.StateChanges.Length == 0)\n                    {\n                        throw new ScriptException($\"{step.Event.EventId} doesn't have any StateChanges\");\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Starts the script replay\n        /// </summary>\n        /// <param name=\"scriptConfiguration\"></param>\n        private void ReplayScriptStart(AlarmsConfiguration scriptConfiguration)\n        {\n            try\n            {\n                VerifyScriptConfiguration(scriptConfiguration);\n                _logger.ScriptStarting();\n                var scriptEngine = new ScriptEngine(scriptConfiguration.Script, OnScriptStepAvailable, _timeService);\n            }\n            catch (ScriptException ex)\n            {\n                _logger.ScriptEngineError(ex);\n                throw;\n            }\n        }\n\n        /// <summary>\n        /// Called when a new script step are available\n        /// </summary>\n        /// <param name=\"step\"></param>\n        /// <param name=\"loopNumber\"></param>\n        private void OnScriptStepAvailable(Step step, long loopNumber)\n        {\n            if (step == null)\n            {\n                _logger.ScriptEnded();\n            }\n            else\n            {\n                if (step.Event != null)\n                {\n                    var alarm = GetAlarm(step);\n                    UpdateAlarm(alarm, step.Event);\n                    var sourceNodeId = _scriptAlarmToSources[step.Event.AlarmId];\n                    _sourceNodes[sourceNodeId].UpdateAlarmInSource(alarm, $\"{step.Event.EventId} ({loopNumber})\");\n                }\n\n                PrintScriptStep(step, loopNumber);\n            }\n        }\n\n        /// <summary>\n        /// Update Alarm information\n        /// </summary>\n        /// <param name=\"alarm\"></param>\n        /// <param name=\"scriptEvent\"></param>\n        private static void UpdateAlarm(SimAlarmStateBackend alarm, Event scriptEvent)\n        {\n            alarm.Reason = scriptEvent.Reason;\n            alarm.Severity = scriptEvent.Severity;\n            alarm.Time = DateTime.UtcNow;\n\n            foreach (var stateChange in scriptEvent.StateChanges)\n            {\n                switch (stateChange.StateType)\n                {\n                    case ConditionStates.Enabled:\n                        alarm.SetStateBits(SimConditionStatesEnum.Enabled, stateChange.State);\n                        alarm.EnableTime = DateTime.UtcNow;\n                        break;\n                    case ConditionStates.Activated:\n                        alarm.SetStateBits(SimConditionStatesEnum.Active, stateChange.State);\n                        alarm.ActiveTime = DateTime.UtcNow;\n                        break;\n                    default:\n                        break;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get Alarm information\n        /// </summary>\n        /// <param name=\"step\"></param>\n        /// <returns></returns>\n        private SimAlarmStateBackend GetAlarm(Step step)\n        {\n            var sourceNodeId = _scriptAlarmToSources[step.Event.AlarmId];\n            return _system.SourceNodes[sourceNodeId].Alarms[step.Event.AlarmId];\n        }\n\n        /// <summary>\n        /// Print script current step\n        /// </summary>\n        /// <param name=\"step\"></param>\n        /// <param name=\"loopNumber\"></param>\n        private void PrintScriptStep(Step step, long loopNumber)\n        {\n            if (step.Event != null)\n            {\n                _logger.AlarmEvent(loopNumber, step.Event.AlarmId, step.Event.Reason);\n                foreach (var sc in step.Event.StateChanges)\n                {\n                    _logger.StateChange(sc.StateType, sc.State);\n                }\n            }\n\n            if (step.SleepInSeconds > 0)\n            {\n                _logger.SleepEvent(loopNumber, step.SleepInSeconds);\n            }\n        }\n\n        // CustomNodeManager2 overrides\n\n        /// <summary>\n        /// Creates a new set of monitored items for a set of variables.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"publishingInterval\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"itemsToCreate\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"filterErrors\"></param>\n        /// <param name=\"monitoredItems\"></param>\n        /// <param name=\"createDurable\"></param>\n        /// <param name=\"globalIdCounter\"></param>\n        /// <remarks>\n        /// This method only handles data change subscriptions. Event subscriptions are created by the SDK.\n        /// </remarks>\n        public override void CreateMonitoredItems(\n            OperationContext context,\n            uint subscriptionId,\n            double publishingInterval,\n            TimestampsToReturn timestampsToReturn,\n            IList<MonitoredItemCreateRequest> itemsToCreate,\n            IList<ServiceResult> errors,\n            IList<MonitoringFilterResult> filterErrors,\n            IList<IMonitoredItem> monitoredItems,\n            bool createDurable,\n            ref long globalIdCounter)\n        {\n            var systemContext = _defaultSystemContext.Copy(context);\n            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();\n            var nodesToValidate = new List<NodeHandle>();\n            var createdItems = new List<IMonitoredItem>();\n\n            lock (Lock)\n            {\n                for (var ii = 0; ii < itemsToCreate.Count; ii++)\n                {\n                    var monitoredItemCreateRequest = itemsToCreate[ii];\n\n                    // skip items that have already been processed.\n                    if (monitoredItemCreateRequest.Processed)\n                    {\n                        continue;\n                    }\n\n                    var itemToMonitor = monitoredItemCreateRequest.ItemToMonitor;\n\n                    // check for valid handle.\n                    var handle = GetManagerHandle(systemContext, itemToMonitor.NodeId, operationCache);\n\n                    if (handle == null)\n                    {\n                        continue;\n                    }\n\n                    // owned by this node manager.\n                    monitoredItemCreateRequest.Processed = true;\n\n                    // must validate node in a seperate operation.\n                    errors[ii] = StatusCodes.BadNodeIdUnknown;\n\n                    handle.Index = ii;\n                    nodesToValidate.Add(handle);\n                }\n\n                // check for nothing to do.\n                if (nodesToValidate.Count == 0)\n                {\n                    return;\n                }\n            }\n\n            // validates the nodes (reads values from the underlying data source if required).\n            for (var ii = 0; ii < nodesToValidate.Count; ii++)\n            {\n                var handle = nodesToValidate[ii];\n\n                MonitoringFilterResult filterResult = null;\n                IMonitoredItem monitoredItem = null;\n\n                lock (Lock)\n                {\n                    // validate node.\n                    var source = ValidateNode(systemContext, handle, operationCache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    var itemToCreate = itemsToCreate[handle.Index];\n\n                    // create monitored item.\n                    errors[handle.Index] = CreateMonitoredItem(\n                        systemContext,\n                        handle,\n                        subscriptionId,\n                        publishingInterval,\n                        context.DiagnosticsMask,\n                        timestampsToReturn,\n                        itemToCreate,\n                        createDurable,\n                        ref globalIdCounter,\n                        out filterResult,\n                        out monitoredItem);\n                }\n\n                // save any filter error details.\n                filterErrors[handle.Index] = filterResult;\n\n                if (ServiceResult.IsBad(errors[handle.Index]))\n                {\n                    continue;\n                }\n\n                // save the monitored item.\n                monitoredItems[handle.Index] = monitoredItem;\n                createdItems.Add(monitoredItem);\n            }\n\n            // do any post processing.\n            OnCreateMonitoredItemsComplete(systemContext, createdItems);\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // lookup in cache.\n            var target = FindNodeInCache(context, handle, cache);\n\n            if (target != null)\n            {\n                handle.Node = target;\n                handle.Validated = true;\n                return handle.Node;\n            }\n\n            // return default.\n            return handle.Node;\n        }\n\n        /// <summary>\n        /// Subscribes or unsubscribes to events produced by all event sources.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"unsubscribe\"></param>\n        /// <remarks>\n        /// This method is called when a event subscription is created or deleted. The node\n        /// manager must start/stop reporting events for all objects that it manages.\n        /// </remarks>\n        public override ServiceResult SubscribeToAllEvents(\n            OperationContext context,\n            uint subscriptionId,\n            IEventMonitoredItem monitoredItem,\n            bool unsubscribe)\n        {\n            var serverSystemContext = SystemContext.Copy(context);\n\n            lock (Lock)\n            {\n                // A client has subscribed to the Server object which means all events produced\n                // by this manager must be reported. This is done by incrementing the monitoring\n                // reference count for all root notifiers.\n                if (_rootNotifiers != null)\n                {\n                    for (var ii = 0; ii < _rootNotifiers.Count; ii++)\n                    {\n                        SubscribeToEvents(serverSystemContext, _rootNotifiers[ii], monitoredItem, unsubscribe);\n                    }\n                }\n\n                return ServiceResult.Good;\n            }\n        }\n\n        /// <summary>\n        /// Subscribes to events.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"source\">The source.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        /// <param name=\"unsubscribe\">if set to <c>true</c> [unsubscribe].</param>\n        /// <returns>Any error code.</returns>\n        protected override ServiceResult SubscribeToEvents(\n            ServerSystemContext context,\n            NodeState source,\n            IEventMonitoredItem monitoredItem,\n            bool unsubscribe)\n        {\n            // handle unsubscribe.\n            if (unsubscribe)\n            {\n                // check for existing monitored node.\n                if (!MonitoredNodes.TryGetValue(source.NodeId, out var monitoredNode2))\n                {\n                    return StatusCodes.BadNodeIdUnknown;\n                }\n\n                monitoredNode2.Remove(monitoredItem);\n\n                // check if node is no longer being monitored.\n                if (!monitoredNode2.HasMonitoredItems)\n                {\n                    MonitoredNodes.Remove(source.NodeId);\n                }\n\n                // update flag.\n                source.SetAreEventsMonitored(context, !unsubscribe, true);\n\n                // call subclass.\n                OnSubscribeToEvents(context, monitoredNode2, unsubscribe);\n\n                // all done.\n                return ServiceResult.Good;\n            }\n\n            // only objects or views can be subscribed to.\n\n            if (source is not BaseObjectState instance || (instance.EventNotifier & EventNotifiers.SubscribeToEvents) == 0)\n            {\n                if (source is not ViewState view || (view.EventNotifier & EventNotifiers.SubscribeToEvents) == 0)\n                {\n                    return StatusCodes.BadNotSupported;\n                }\n            }\n\n            // check for existing monitored node.\n            if (!MonitoredNodes.TryGetValue(source.NodeId, out var monitoredNode))\n            {\n                MonitoredNodes[source.NodeId] = monitoredNode = new MonitoredNode2(this, source);\n            }\n\n            // this links the node to specified monitored item and ensures all events\n            // reported by the node are added to the monitored item's queue.\n            monitoredNode.Add(monitoredItem);\n\n            // This call recursively updates a reference count all nodes in the notifier\n            // hierarchy below the area. Sources with a reference count of 0 do not have\n            // any active subscriptions so they do not need to report events.\n            source.SetAreEventsMonitored(context, !unsubscribe, true);\n\n            // signal update.\n            OnSubscribeToEvents(context, monitoredNode, unsubscribe);\n\n            // all done.\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                if (!externalReferences.TryGetValue(ObjectIds.Server, out var references))\n                {\n                    externalReferences[ObjectIds.Server] = references = [];\n                }\n\n                // Folders Nodes\n                foreach (var folder in _scriptconfiguration.Folders)\n                {\n                    var simFolderState = new SimFolderState(SystemContext, null, new NodeId(folder.Name, NamespaceIndex), folder.Name);\n                    simFolderState.AddReference(ReferenceTypeIds.HasNotifier, true, ObjectIds.Server);\n                    AddRootNotifier(simFolderState);\n                    _folders.Add(simFolderState);\n\n                    // Source Nodes\n                    foreach (var source in folder.Sources)\n                    {\n                        SimSourceNodeState simSourceNodeState;\n                        _sourceNodes[source.Name] = simSourceNodeState =\n                            new SimSourceNodeState(this, new NodeId(source.Name, NamespaceIndex), source.Name, source.Alarms);\n\n                        simFolderState.AddChild(simSourceNodeState);\n\n                        simSourceNodeState.AddNotifier(SystemContext, ReferenceTypeIds.HasEventSource, true, simFolderState);\n                        simFolderState.AddNotifier(SystemContext, ReferenceTypeIds.HasEventSource, false, simSourceNodeState);\n                    }\n\n                    references.Add(new NodeStateReference(ReferenceTypeIds.HasNotifier, false, simFolderState.NodeId));\n\n                    AddPredefinedNode(SystemContext, simFolderState);\n                }\n            }\n\n            ReplayScriptStart(_scriptconfiguration);\n        }\n\n        /// <summary>\n        /// Tells the node manager to refresh any conditions associated with the specified monitored items.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"monitoredItems\"></param>\n        /// <remarks>\n        /// This method is called when the condition refresh method is called for a subscription.\n        /// The node manager must create a refresh event for each condition monitored by the subscription.\n        /// </remarks>\n        public override ServiceResult ConditionRefresh(\n            OperationContext context,\n            IList<IEventMonitoredItem> monitoredItems)\n        {\n            foreach (var monitoredItem in monitoredItems.Cast<MonitoredItem>())\n            {\n                if (monitoredItem == null)\n                {\n                    continue;\n                }\n\n                var events = new List<IFilterTarget>();\n                var nodesToRefresh = new List<NodeState>();\n\n                lock (Lock)\n                {\n                    // check for server subscription.\n                    if (monitoredItem.NodeId == ObjectIds.Server)\n                    {\n                        if (_rootNotifiers != null)\n                        {\n                            nodesToRefresh.AddRange(_rootNotifiers);\n                        }\n                    }\n                    else\n                    {\n                        if (!MonitoredNodes.TryGetValue(monitoredItem.NodeId, out var monitoredNode))\n                        {\n                            continue;\n                        }\n\n                        // get the refresh events.\n                        nodesToRefresh.Add(monitoredNode.Node);\n                    }\n                }\n\n                foreach (var node in nodesToRefresh)\n                {\n                    node.ConditionRefresh(SystemContext, events, true);\n                }\n\n                foreach (var @event in events)\n                {\n                    monitoredItem.QueueEvent(@event);\n                }\n            }\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Adds a root notifier.\n        /// </summary>\n        /// <param name=\"notifier\">The notifier.</param>\n        /// <remarks>\n        /// A root notifier is a notifier owned by the NodeManager that is not the target of a\n        /// HasNotifier reference. These nodes need to be linked directly to the Server object.\n        /// </remarks>\n        protected override void AddRootNotifier(NodeState notifier)\n        {\n            _rootNotifiers ??= [];\n\n            for (var ii = 0; ii < _rootNotifiers.Count; ii++)\n            {\n                if (ReferenceEquals(notifier, _rootNotifiers[ii]))\n                {\n                    return;\n                }\n            }\n\n            _rootNotifiers.Add(notifier);\n\n            // need to prevent recursion with the server object.\n            if (notifier.NodeId != ObjectIds.Server)\n            {\n                notifier.OnReportEvent = OnReportEvent;\n\n                if (!notifier.ReferenceExists(ReferenceTypeIds.HasNotifier, true, ObjectIds.Server))\n                {\n                    notifier.AddReference(ReferenceTypeIds.HasNotifier, true, ObjectIds.Server);\n                }\n            }\n\n            // subscribe to existing events.\n            if (_server.EventManager != null)\n            {\n                var monitoredItems = _server.EventManager.GetMonitoredItems();\n\n                for (var ii = 0; ii < monitoredItems.Count; ii++)\n                {\n                    if (monitoredItems[ii].MonitoringAllEvents)\n                    {\n                        SubscribeToEvents(\n                            SystemContext,\n                            notifier,\n                            monitoredItems[ii],\n                            true);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The node.</param>\n        /// <returns>The new NodeId.</returns>\n        /// <remarks>\n        /// This method is called by the NodeState.Create() method which initializes a Node from\n        /// the type model. During initialization a number of child nodes are created and need to\n        /// have NodeIds assigned to them. This implementation constructs NodeIds by constructing\n        /// strings. Other implementations could assign unique integers or Guids and save the new\n        /// Node in a dictionary for later lookup.\n        /// </remarks>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            return new NodeId(++_nodeIdCounter, NamespaceIndex);\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            return [];\n        }\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for DeterministicAlarmsNodeManager\n    /// </summary>\n    internal static partial class DeterministicAlarmsNodeManagerLogging\n    {\n        private const int EventClass = 30;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Can't read or decode configuration.\")]\n        public static partial void ConfigurationError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"{Configuration}\")]\n        public static partial void PrintConfiguration(this ILogger logger, string configuration);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Script starts executing\")]\n        public static partial void ScriptStarting(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"Script Engine Exception\\nSCRIPT WILL NOT START\")]\n        public static partial void ScriptEngineError(this ILogger logger, Exception ex);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"SCRIPT ENDED\")]\n        public static partial void ScriptEnded(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"({LoopNumber}) -\\t{AlarmId}\\t{Reason}\")]\n        public static partial void AlarmEvent(this ILogger logger, long loopNumber, string alarmId, string reason);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"\\t\\t{StateType} - {State}\")]\n        public static partial void StateChange(this ILogger logger, ConditionStates stateType, bool state);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"({LoopNumber}) -\\tSleep: {SleepInSeconds}\")]\n        public static partial void SleepEvent(this ILogger logger, long loopNumber, double sleepInSeconds);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/DeterministicAlarmsServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n\n    /// <inheritdoc/>\n    public class DeterministicAlarmsServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.DeterministicAlarmsInstance\n                ];\n            }\n        }\n\n        public DeterministicAlarmsServer(TimeService timeservice,\n            string configurationJson, ILogger logger)\n        {\n            _timeservice = timeservice;\n            _configurationJson = configurationJson;\n            _logger = logger;\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new DeterministicAlarmsNodeManager(server, configuration,\n                _timeservice, _configurationJson, _logger);\n        }\n\n        private readonly TimeService _timeservice;\n        private readonly string _configurationJson;\n        private readonly ILogger _logger;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Model/SimConditionStatesEnum.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Model\n{\n    using System;\n\n    [Flags]\n    public enum SimConditionStatesEnum\n    {\n        /// <summary>\n        /// The condition state is unknown.\n        /// </summary>\n        None = 0x0,\n\n        /// <summary>\n        /// The condition is enabled and will produce events.\n        /// </summary>\n        Enabled = 0x1,\n\n        /// <summary>\n        /// The condition requires acknowledgement by the user.\n        /// </summary>\n        Acknowledged = 0x2,\n\n        /// <summary>\n        /// The condition requires that the used confirm that action was taken.\n        /// </summary>\n        Confirmed = 0x4,\n\n        /// <summary>\n        /// The condition is active.\n        /// </summary>\n        Active = 0x8,\n\n        /// <summary>\n        /// The condition has been suppressed by the system.\n        /// </summary>\n        Suppressed = 0x10,\n\n        /// <summary>\n        /// The condition has been shelved by the user.\n        /// </summary>\n        Shelved = 0x20,\n\n        ///// <summary>\n        ///// The condition has exceeed the high-high limit.\n        ///// </summary>\n        //HighHigh = 0x40,\n\n        ///// <summary>\n        ///// The condition has exceeed the high limit.\n        ///// </summary>\n        //High = 0x80,\n\n        ///// <summary>\n        ///// The condition has exceeed the low limit.\n        ///// </summary>\n        //Low = 0x100,\n\n        ///// <summary>\n        ///// The condition has exceeed the low-low limit.\n        ///// </summary>\n        //LowLow = 0x200,\n\n        ///// <summary>\n        ///// A mask used to clear all limit bits.\n        ///// </summary>\n        //Limits = 0x3C0,\n\n        /// <summary>\n        /// The condition has deleted.\n        /// </summary>\n        Deleted = 0x400\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Model/SimFolderState.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Model\n{\n    using Opc.Ua;\n\n    public class SimFolderState : FolderState\n    {\n        public SimFolderState(ISystemContext context, NodeState parent, NodeId nodeId, string name) : base(parent)\n        {\n            Initialize(context);\n\n            // initialize the area with the fixed metadata.\n            SymbolicName = name;\n            NodeId = nodeId;\n            BrowseName = new QualifiedName(name, nodeId.NamespaceIndex);\n            DisplayName = BrowseName.Name;\n            Description = null;\n            ReferenceTypeId = ReferenceTypeIds.HasNotifier;\n            TypeDefinitionId = ObjectTypeIds.FolderType;\n            EventNotifier = EventNotifiers.SubscribeToEvents;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Model/SimSourceNodeState.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.Model\n{\n    using DeterministicAlarms.Configuration;\n    using DeterministicAlarms.SimBackend;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Text;\n\n    public class SimSourceNodeState : BaseObjectState\n    {\n        private readonly DeterministicAlarmsNodeManager _nodeManager;\n        private readonly SimSourceNodeBackend _simSourceNodeBackend;\n        private readonly Dictionary<string, ConditionState> _alarmNodes = [];\n        private readonly Dictionary<string, ConditionState> _events = [];\n\n        public SimSourceNodeState(DeterministicAlarmsNodeManager nodeManager, NodeId nodeId, string name, IList<Alarm> alarms) : base(null)\n        {\n            _nodeManager = nodeManager;\n\n            Initialize(_nodeManager.SystemContext);\n\n            // Creates the whole backend object model for one source\n            _simSourceNodeBackend = ((SimBackendService)_nodeManager.SystemContext.SystemHandle)\n                .CreateSourceNodeBackend(name, alarms, OnAlarmChanged);\n\n            // initialize the area with the fixed metadata.\n            SymbolicName = name;\n            NodeId = nodeId;\n            BrowseName = new QualifiedName(name, nodeId.NamespaceIndex);\n            DisplayName = BrowseName.Name;\n            Description = null;\n            ReferenceTypeId = null;\n            TypeDefinitionId = ObjectTypeIds.BaseObjectType;\n            EventNotifier = EventNotifiers.None;\n\n            // This is to create all alarms\n            _simSourceNodeBackend.Refresh();\n        }\n\n        public override void ConditionRefresh(ISystemContext context, List<IFilterTarget> events, bool includeChildren)\n        {\n            foreach (var @event in events)\n            {\n                if (@event is InstanceStateSnapshot instanceSnapShotForExistingEvent &&\n                    ReferenceEquals(instanceSnapShotForExistingEvent.Handle, this))\n                {\n                    return;\n                }\n            }\n\n            foreach (var alarm in _alarmNodes.Values)\n            {\n                if (!alarm.Retain.Value)\n                {\n                    continue;\n                }\n\n                var instanceStateSnapshotNewAlarm = new InstanceStateSnapshot();\n                instanceStateSnapshotNewAlarm.Initialize(context, alarm);\n                instanceStateSnapshotNewAlarm.Handle = this;\n                events.Add(instanceStateSnapshotNewAlarm);\n            }\n        }\n\n        private void OnAlarmChanged(object sender, SimAlarmStateBackendEventArgs alarm)\n        {\n            UpdateAlarmInSource(alarm.SnapshotAlarm);\n        }\n\n        public void UpdateAlarmInSource(SimAlarmStateBackend alarm, string eventId = null)\n        {\n            lock (_nodeManager.Lock)\n            {\n                if (!_alarmNodes.TryGetValue(alarm.Name, out var node))\n                {\n                    _alarmNodes[alarm.Name] = node = CreateAlarmOrCondition(alarm, null);\n                }\n\n                UpdateAlarm(node, alarm, eventId);\n                ReportChanges(node);\n            }\n        }\n\n        private ConditionState CreateAlarmOrCondition(SimAlarmStateBackend alarm, NodeId branchId)\n        {\n            ISystemContext context = _nodeManager.SystemContext;\n\n            ConditionState node;\n\n            // Condition\n            if (alarm.AlarmType == AlarmObjectStates.ConditionType)\n            {\n                node = new ConditionState(this);\n            }\n            // All alarms inherent from AlarmConditionState\n            else\n            {\n                switch (alarm.AlarmType)\n                {\n                    case AlarmObjectStates.TripAlarmType:\n                        node = new TripAlarmState(this);\n                        break;\n                    case AlarmObjectStates.LimitAlarmType:\n                        node = new LimitAlarmState(this);\n                        break;\n                    case AlarmObjectStates.OffNormalAlarmType:\n                        node = new OffNormalAlarmState(this);\n                        break;\n                    default:\n                        node = new AlarmConditionState(this);\n                        break;\n                }\n\n                // create elements that conditiontype doesn't have\n                CreateAlarmSpecificElements(context, (AlarmConditionState)node, branchId);\n            }\n\n            CreateCommonFieldsForAlarmAndCondition(context, node, alarm);\n\n            // This call initializes the condition from the type model (i.e. creates all of the objects\n            // and variables requried to store its state). The information about the type model was\n            // incorporated into the class when the class was created.\n            //\n            // This method also assigns new NodeIds to all of the components by calling the INodeIdFactory.New\n            // method on the INodeIdFactory object which is part of the system context. The NodeManager provides\n            // the INodeIdFactory implementation used here.\n            node.Create(\n                context,\n                null,\n                new QualifiedName(alarm.Name, BrowseName.NamespaceIndex),\n                null,\n                true);\n\n            // initialize event information.node\n            node.EventType.Value = node.TypeDefinitionId;\n            node.SourceNode.Value = NodeId;\n            node.SourceName.Value = SymbolicName;\n            node.ConditionName.Value = node.SymbolicName;\n            node.Time.Value = DateTime.UtcNow;\n            node.ReceiveTime.Value = node.Time.Value;\n            node.BranchId.Value = branchId;\n\n            // don't add branches to the address space.\n            if (NodeId.IsNull(branchId))\n            {\n                AddChild(node);\n            }\n\n            return node;\n        }\n\n        private static void CreateAlarmSpecificElements(ISystemContext context, AlarmConditionState node, NodeId branchId)\n        {\n            node.ConfirmedState = new TwoStateVariableState(node);\n            node.Confirm = new AddCommentMethodState(node);\n\n            if (NodeId.IsNull(branchId))\n            {\n                node.SuppressedState = new TwoStateVariableState(node);\n                node.ShelvingState = new ShelvedStateMachineState(node);\n            }\n\n            node.ActiveState = new TwoStateVariableState(node);\n            node.ActiveState.TransitionTime = new PropertyState<DateTime>(node.ActiveState);\n            node.ActiveState.EffectiveDisplayName = new PropertyState<LocalizedText>(node.ActiveState);\n            node.ActiveState.Create(context, null, BrowseNames.ActiveState, null, false);\n        }\n\n        private static void CreateCommonFieldsForAlarmAndCondition(ISystemContext context,\n            ConditionState node, SimAlarmStateBackend alarm)\n        {\n            node.SymbolicName = alarm.Name;\n\n            // add optional components.\n            node.Comment = new ConditionVariableState<LocalizedText>(node);\n            node.ClientUserId = new PropertyState<string>(node);\n            node.AddComment = new AddCommentMethodState(node);\n\n            // adding optional components to children is a little more complicated since the\n            // necessary initilization strings defined by the class that represents the child.\n            // in this case we pre-create the child, add the optional components\n            // and call create without assigning NodeIds. The NodeIds will be assigned when the\n            // parent object is created.\n            node.EnabledState = new TwoStateVariableState(node);\n            node.EnabledState.TransitionTime = new PropertyState<DateTime>(node.EnabledState);\n            node.EnabledState.EffectiveDisplayName = new PropertyState<LocalizedText>(node.EnabledState);\n            node.EnabledState.Create(context, null, BrowseNames.EnabledState, null, false);\n\n            // specify reference type between the source and the alarm.\n            node.ReferenceTypeId = ReferenceTypeIds.HasComponent;\n        }\n\n        private void UpdateAlarm(ConditionState node, SimAlarmStateBackend alarm, string eventId = null)\n        {\n            ISystemContext context = _nodeManager.SystemContext;\n\n            // remove old event.\n            if (node.EventId.Value != null)\n            {\n                _events.Remove(Utils.ToHexString(node.EventId.Value));\n            }\n\n            node.EventId.Value = eventId != null ? Encoding.UTF8.GetBytes(eventId) : Guid.NewGuid().ToByteArray();\n            node.Time.Value = DateTime.UtcNow;\n            node.ReceiveTime.Value = node.Time.Value;\n\n            // save the event for later lookup.\n            _events[Utils.ToHexString(node.EventId.Value)] = node;\n\n            // determine the retain state.\n            node.Retain.Value = true;\n\n            if (alarm != null)\n            {\n                node.Time.Value = alarm.Time;\n                node.Message.Value = new LocalizedText(alarm.Reason);\n                node.SetComment(context, alarm.Comment, alarm.UserName);\n                node.SetSeverity(context, alarm.Severity);\n                node.EnabledState.TransitionTime.Value = alarm.EnableTime;\n                node.SetEnableState(context, (alarm.State & SimConditionStatesEnum.Enabled) != 0);\n\n                if (node is AlarmConditionState nodeAlarm)\n                {\n                    nodeAlarm.SetAcknowledgedState(context, (alarm.State & SimConditionStatesEnum.Acknowledged) != 0);\n                    nodeAlarm.SetConfirmedState(context, (alarm.State & SimConditionStatesEnum.Confirmed) != 0);\n                    nodeAlarm.SetActiveState(context, (alarm.State & SimConditionStatesEnum.Active) != 0);\n                    nodeAlarm.SetSuppressedState(context, (alarm.State & SimConditionStatesEnum.Suppressed) != 0);\n                    nodeAlarm.ActiveState.TransitionTime.Value = alarm.ActiveTime;\n                    // not interested in inactive alarms\n                    if (!nodeAlarm.ActiveState.Id.Value)\n                    {\n                        nodeAlarm.Retain.Value = false;\n                    }\n                }\n            }\n\n            // check for deleted items.\n            if ((alarm.State & SimConditionStatesEnum.Deleted) != 0)\n            {\n                node.Retain.Value = false;\n            }\n\n            // not interested in disabled alarms.\n            if (!node.EnabledState.Id.Value)\n            {\n                node.Retain.Value = false;\n            }\n        }\n\n        private void ReportChanges(ConditionState alarm)\n        {\n            // report changes to node attributes.\n            alarm.ClearChangeMasks(_nodeManager.SystemContext, true);\n\n            // check if events are being monitored for the source.\n            if (AreEventsMonitored)\n            {\n                // create a snapshot.\n                var e = new InstanceStateSnapshot();\n                e.Initialize(_nodeManager.SystemContext, alarm);\n\n                // report the event.\n                alarm.ReportEvent(_nodeManager.SystemContext, e);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/Namespaces.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the plc server for alarm instance.\n        /// </summary>\n        public const string DeterministicAlarmsInstance = \"http://opcfoundation.org/UA/DetermAlarmsInstance\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/ScriptEngine.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms\n{\n    using DeterministicAlarms.Configuration;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Timers;\n\n    public class ScriptEngine\n    {\n        public delegate void NextScriptStepAvailable(Step step, long numberOfLoops);\n\n        private LinkedList<Step> _steps;\n        private LinkedListNode<Step> _currentStep;\n        private ITimer _stepsTimer;\n        private readonly Script _script;\n        private long _numberOfLoops = 1;\n        private DateTime _scriptStopTime;\n        private readonly TimeService _timeService;\n\n        public NextScriptStepAvailable OnNextScriptStepAvailable { get; set; }\n\n        /// <summary>\n        /// Initialize ScriptEngine\n        /// </summary>\n        /// <param name=\"script\"></param>\n        /// <param name=\"scriptCallback\"></param>\n        /// <param name=\"timeService\"></param>\n        public ScriptEngine(Script script, NextScriptStepAvailable scriptCallback, TimeService timeService)\n        {\n            OnNextScriptStepAvailable += scriptCallback ?? throw new ScriptException(\"Script Callback is not defined\");\n\n            _script = script;\n            _timeService = timeService;\n\n            CreateLinkedList(script.Steps);\n\n            StartScript();\n        }\n\n        private void StartScript()\n        {\n            _stepsTimer = _timeService.NewTimer(OnStepTimedEvent, Convert.ToUInt32(_script.WaitUntilStartInSeconds * 1000));\n            _scriptStopTime = _timeService.Now.AddSeconds(_script.RunningForSeconds + _script.WaitUntilStartInSeconds);\n        }\n\n        private void StopScript()\n        {\n            _stepsTimer.Close();\n            _stepsTimer = null;\n        }\n\n        /// <summary>\n        /// Create the Linked List that will be used internally to go through the steps\n        /// </summary>\n        /// <param name=\"steps\"></param>\n        private void CreateLinkedList(IList<Step> steps)\n        {\n            _steps = new LinkedList<Step>();\n            foreach (var step in steps)\n            {\n                _steps.AddLast(step);\n            }\n        }\n\n        /// <summary>\n        /// Active a new step\n        /// </summary>\n        /// <param name=\"step\"></param>\n        private void ActivateCurrentStep(LinkedListNode<Step> step)\n        {\n            _currentStep = step;\n            OnNextScriptStepAvailable?.Invoke(step?.Value, _numberOfLoops);\n            if (_stepsTimer != null)\n            {\n                _stepsTimer.Interval = Math.Max(1, step.Value.SleepInSeconds * 1000);\n            }\n        }\n\n        /// <summary>\n        /// Get the next step\n        /// </summary>\n        /// <param name=\"step\"></param>\n        /// <returns></returns>\n        private LinkedListNode<Step> GetNextValue(LinkedListNode<Step> step)\n        {\n            // Script should end because it has been executed as long as expected in the parameter\n            // RunningForSeconds\n            if (_scriptStopTime < _timeService.Now)\n            {\n                StopScript();\n                return null;\n            }\n\n            // Is it the first step?\n            if (step == null)\n            {\n                return _steps.First;\n            }\n\n            // Do we have a next step?\n            if (step.Next != null)\n            {\n                return step.Next;\n            }\n\n            // We don't have a next step, now we should see if we should repeat\n            // and start on first step again or terminate.\n            if (_script.IsScriptInRepeatingLoop)\n            {\n                _numberOfLoops++;\n                return _steps.First;\n            }\n\n            StopScript();\n            return null;\n        }\n\n        /// <summary>\n        /// Trigger when next step should be executed\n        /// </summary>\n        /// <param name=\"source\"></param>\n        /// <param name=\"e\"></param>\n        private void OnStepTimedEvent(object source, ElapsedEventArgs e)\n        {\n            ActivateCurrentStep(GetNextValue(_currentStep));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/SimBackend/SimAlarmStateBackend.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.SimBackend\n{\n    using DeterministicAlarms.Configuration;\n    using DeterministicAlarms.Model;\n    using Opc.Ua;\n    using System;\n\n    public class SimAlarmStateBackend\n    {\n        public string Name { get; internal set; }\n\n        public AlarmObjectStates AlarmType { get; set; }\n\n        public DateTime Time { get; internal set; }\n\n        public string Reason { get; internal set; }\n\n        public SimConditionStatesEnum State { get; internal set; }\n\n        public LocalizedText Comment { get; internal set; }\n\n        public string UserName { get; internal set; }\n\n        public EventSeverity Severity { get; internal set; }\n\n        public DateTime EnableTime { get; internal set; }\n\n        public DateTime ActiveTime { get; internal set; }\n\n        public SimSourceNodeBackend Source { get; internal set; }\n\n        public string Id { get; internal set; }\n\n        internal SimAlarmStateBackend CreateSnapshot()\n        {\n            return (SimAlarmStateBackend)MemberwiseClone();\n        }\n\n        internal bool SetStateBits(SimConditionStatesEnum bits, bool isSet)\n        {\n            if (isSet)\n            {\n                var currentlySet = (State & bits) == bits;\n                State |= bits;\n                return !currentlySet;\n            }\n\n            var currentlyCleared = (State & ~bits) == State;\n            State &= ~bits;\n            return !currentlyCleared;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/SimBackend/SimBackendService.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.SimBackend\n{\n    using DeterministicAlarms.Configuration;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    public class SimBackendService\n    {\n        private readonly Lock _lock = new();\n        public Dictionary<string, SimSourceNodeBackend> SourceNodes { get; } = [];\n\n        public SimSourceNodeBackend CreateSourceNodeBackend(string name,\n            IList<Alarm> alarms, EventHandler<SimAlarmStateBackendEventArgs> alarmChangeCallback)\n        {\n            SimSourceNodeBackend simSourceNodeBackend;\n\n            lock (_lock)\n            {\n                simSourceNodeBackend = new SimSourceNodeBackend\n                {\n                    Name = name\n                };\n\n                simSourceNodeBackend.OnAlarmChanged += alarmChangeCallback;\n                simSourceNodeBackend.CreateAlarms(alarms);\n\n                SourceNodes[name] = simSourceNodeBackend;\n            }\n\n            return simSourceNodeBackend;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/SimBackend/SimSourceNodeBackend.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace DeterministicAlarms.SimBackend\n{\n    using DeterministicAlarms.Configuration;\n    using System;\n    using System.Collections.Generic;\n\n    public class SimAlarmStateBackendEventArgs : EventArgs\n    {\n        public SimAlarmStateBackend SnapshotAlarm { get; set; }\n    }\n\n    public class SimSourceNodeBackend\n    {\n        public Dictionary<string, SimAlarmStateBackend> Alarms { get; } = [];\n\n        public string Name { get; internal set; }\n\n        public event EventHandler<SimAlarmStateBackendEventArgs> OnAlarmChanged;\n\n        public void CreateAlarms(IList<Alarm> alarmsFromConfiguration)\n        {\n            foreach (var alarmConfiguration in alarmsFromConfiguration)\n            {\n                var alarmStateBackend = new SimAlarmStateBackend\n                {\n                    Source = this,\n                    Id = alarmConfiguration.Id,\n                    Name = alarmConfiguration.Name,\n                    Time = DateTime.UtcNow,\n                    AlarmType = alarmConfiguration.ObjectType\n                };\n\n                lock (Alarms)\n                {\n                    Alarms.Add(alarmConfiguration.Id, alarmStateBackend);\n                }\n            }\n        }\n\n        internal void Refresh()\n        {\n            var snapshots = new List<SimAlarmStateBackend>();\n\n            lock (Alarms)\n            {\n                foreach (var alarm in Alarms.Values)\n                {\n                    snapshots.Add(alarm.CreateSnapshot());\n                }\n            }\n\n            foreach (var snapshotAlarm in snapshots)\n            {\n                OnAlarmChanged!.Invoke(this, new SimAlarmStateBackendEventArgs { SnapshotAlarm = snapshotAlarm });\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/DeterministicAlarms/readme.md",
    "content": "# OPC UA Deterministic Alarm Replayer\n\n## Introduction\nThis makes it possible to create more deterministic tests of Alarms.\n\nThis is done by using a script that defines Alarms and execute them.\n\n## Script\nThe script has two sections.\n* Definition of the Folders, Sources of alarms, and the Alarms themselves.\n* The replay steps \n```\n{\n  // These folders will be children to the Server Object\n  \"folders\": [\n    {\n      \"name\": \"VendingMachines\",\n      \"sources\": [\n        {\n          // We only support BaseObjectState\n          \"objectType\": \"BaseObjectState\",\n          // The name needs to be unique\n          \"name\": \"VendingMachine1\",\n          \"alarms\": [\n            {\n              // We support a subset of current AlarmTypes\n              \"objectType\": \"TripAlarmType\",\n              // This is the name of the Alarm and will be visible in the Address Space\n              \"name\": \"VendingMachine1_DoorOpen\",\n              // This is the Id that will be used later in the script to identify the Alarm\n              // This needs to be unique\n              \"id\": \"V1_DoorOpen\"\n            },\n            {\n              \"objectType\": \"LimitAlarmType\",\n              \"name\": \"VendingMachine1_TemperatureHigh\",\n              \"id\": \"V1_TemperatureHigh\"\n            }\n          ]\n        },\n        {\n          \"objectType\": \"BaseObjectState\",\n          \"name\": \"VendingMachine2\",\n          \"alarms\": [\n            {\n              \"objectType\": \"TripAlarmType\",\n              \"name\": \"VendingMachine2_DoorOpen\",\n              \"id\": \"V2_DoorOpen\"\n            },\n            {\n              \"objectType\": \"OffNormalAlarmType\",\n              \"name\": \"VendingMachine2_LightOff\",\n              \"id\": \"V2_LightOff\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  // This is the start of the replay part\n  \"script\": {\n    // This enable to have a waiting period before the replay starts\n    \"waitUntilStartInSeconds\": 10,\n    // Enable if the script should be executed in a loop\n    \"isScriptInRepeatingLoop\": true,\n    // How long the test should execute\n    \"runningForSeconds\": 6000,\n    // The steps\n    // Two types of steps exist:\n    // 1) Event - where a state is changed for an Alarm\n    // 2) Sleep - insert a waiting time\n    // For each step both of these values above can be set, but the recommendation are\n    // to only set one of these in each step\n    \"steps\": [\n      {\n        \"event\": {\n          // The Alarm id that was defined above\n          \"alarmId\": \"V1_DoorOpen\",\n          // This is a message that will be shown\n          \"reason\": \"Door Open\",\n          // Severity. Can be one of following values: Min, Low, MediumLow, Medium, MediumHigh,\n          // High, Max (From Opc.Ua EventSeverity enum)\n          \"severity\": \"High\",\n          // This is the eventId. This needs to be unique\n          // This is, when executed, combined with the number of the current loop\n          // Example: \"V1_DoorOpen-1 (1)\" is the complete EventId for the first loop\n          \"eventId\": \"V1_DoorOpen-1\",\n          // This is a list of State changes that should be triggered in the event\n          \"stateChanges\": [\n            {\n              // Type of State Change\n              // Currently only Enabled and Activated is supported\n              \"stateType\": \"Enabled\",\n              // True or False\n              \"state\": true\n            },\n            {\n              \"stateType\": \"Activated\",\n              \"state\": true\n            }\n          ]\n        }\n      },\n      {\n        \"sleepInSeconds\": 5\n      },\n      {\n        \"event\": {\n          \"alarmId\": \"V2_LightOff\",\n          \"reason\": \"Light Off in machine\",\n          \"severity\": \"Medium\",\n          \"eventId\": \"V2_LightOff-1\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Enabled\",\n              \"state\": true\n            },\n            {\n              \"stateType\": \"Activated\",\n              \"state\": true\n            }\n          ]\n        }\n      },\n      {\n        \"sleepInSeconds\": 7\n      },\n      {\n        \"event\": {\n          \"alarmId\": \"V1_DoorOpen\",\n          \"reason\": \"Door Closed\",\n          \"severity\": \"Medium\",\n          \"eventId\": \"V1_DoorOpen-2\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Activated\",\n              \"state\": false\n            }\n          ]\n        }\n      },\n      {\n        \"sleepInSeconds\": 4\n      },\n      {\n        \"event\": {\n          \"alarmId\": \"V1_TemperatureHigh\",\n          \"reason\": \"Temperature is HIGH\",\n          \"severity\": \"High\",\n          \"eventId\": \"V1_TemperatureHigh-1\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Activated\",\n              \"state\": true\n            },\n            {\n              \"stateType\": \"Enabled\",\n              \"state\": true\n            }\n          ]\n        }\n      }\n    ]\n  }\n}\n```\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/DirectoryBrowser.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using Opc.Ua;\n    using System.Collections.Generic;\n    using System.IO;\n\n    /// <summary>\n    /// Browses the file system folder and files\n    /// </summary>\n    public class DirectoryBrowser : NodeBrowser\n    {\n        /// <summary>\n        /// Create browser\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"referenceType\"></param>\n        /// <param name=\"includeSubtypes\"></param>\n        /// <param name=\"browseDirection\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"additionalReferences\"></param>\n        /// <param name=\"internalOnly\"></param>\n        /// <param name=\"source\"></param>\n        public DirectoryBrowser(ISystemContext context, ViewDescription view,\n            NodeId referenceType, bool includeSubtypes, BrowseDirection browseDirection,\n            QualifiedName browseName, IEnumerable<IReference> additionalReferences,\n            bool internalOnly, DirectoryObjectState source)\n            : base(context, view, referenceType, includeSubtypes, browseDirection,\n                browseName, additionalReferences, internalOnly)\n        {\n            _source = source;\n            _stage = Stage.Begin;\n        }\n\n        /// <summary>\n        /// Returns the next reference.\n        /// </summary>\n        /// <returns>The next reference that meets the browse criteria.</returns>\n        public override IReference Next()\n        {\n            lock (DataLock)\n            {\n                // enumerate pre-defined references.\n                // always call first to ensure any pushed-back references are returned first.\n                var reference = base.Next();\n\n                if (reference != null)\n                {\n                    return reference;\n                }\n\n                // don't start browsing huge number of references when only internal references are requested.\n                if (InternalOnly)\n                {\n                    return null;\n                }\n\n                if (!IsRequired(ReferenceTypeIds.HasComponent, false))\n                {\n                    return null;\n                }\n\n                if (_stage == Stage.Begin)\n                {\n                    _directories = [.. Directory.GetDirectories(_source.FullPath)];\n                    _stage = Stage.Directories;\n                }\n\n                // enumerate segments.\n                if (_stage == Stage.Directories)\n                {\n                    reference = NextChild();\n\n                    if (reference != null)\n                    {\n                        return reference;\n                    }\n\n                    _files = [.. Directory.GetFiles(_source.FullPath)];\n                    _stage = Stage.Files;\n                }\n\n                // enumerate files.\n                if (_stage == Stage.Files)\n                {\n                    reference = NextChild();\n\n                    if (reference != null)\n                    {\n                        return reference;\n                    }\n\n                    _stage = Stage.Done;\n                }\n\n                // all done.\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Returns the next child.\n        /// </summary>\n        private NodeStateReference NextChild()\n        {\n            NodeId targetId = null;\n\n            // check if a specific browse name is requested.\n            if (!QualifiedName.IsNull(BrowseName))\n            {\n                // browse name must be qualified by the correct namespace.\n                if (_source.BrowseName.NamespaceIndex != BrowseName.NamespaceIndex)\n                {\n                    return null;\n                }\n\n                // look for matching directory.\n                if (_stage == Stage.Directories && _directories != null)\n                {\n                    foreach (var name in _directories)\n                    {\n                        if (BrowseName.Name == Path.GetFileName(name))\n                        {\n                            targetId = ModelUtils.ConstructIdForDirectory(name, _source.NodeId.NamespaceIndex);\n                            _directories = null;\n                            break;\n                        }\n                    }\n                    _directories = null;\n                }\n\n                // look for matching file.\n                if (_stage == Stage.Files && _files != null)\n                {\n                    foreach (var name in _files)\n                    {\n                        if (BrowseName.Name == Path.GetFileName(name))\n                        {\n                            targetId = ModelUtils.ConstructIdForFile(name, _source.NodeId.NamespaceIndex);\n                            _files = null;\n                            break;\n                        }\n                    }\n                    _files = null;\n                }\n            }\n            // return the child at the next position.\n            else\n            {\n                // look for next directory.\n                if (_stage == Stage.Directories && _directories?.Count > 0)\n                {\n                    var name = _directories[0];\n                    _directories = _directories[1..];\n                    targetId = ModelUtils.ConstructIdForDirectory(name, _source.NodeId.NamespaceIndex);\n                }\n\n                // look for next file.\n                else if (_stage == Stage.Files && _files?.Count > 0)\n                {\n                    var name = _files[0];\n                    _files = _files[1..];\n                    targetId = ModelUtils.ConstructIdForFile(name, _source.NodeId.NamespaceIndex);\n                }\n            }\n\n            // create reference.\n            if (targetId != null)\n            {\n                return new NodeStateReference(ReferenceTypeIds.HasComponent, false, targetId);\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// The stages available in a browse operation.\n        /// </summary>\n        private enum Stage\n        {\n            Begin,\n            Directories,\n            Files,\n            Done\n        }\n\n        private Stage _stage;\n        private readonly DirectoryObjectState _source;\n        private List<string> _files;\n        private List<string> _directories;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/DirectoryObjectState.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n\n    /// <summary>\n    /// A object which maps a segment to directory\n    /// </summary>\n    public class DirectoryObjectState : FileDirectoryState\n    {\n        /// <summary>\n        /// Gets the full path\n        /// </summary>\n        /// <value>The segment path.</value>\n        public string FullPath { get; }\n\n        /// <summary>\n        /// Is volume\n        /// </summary>\n        public bool IsVolume { get; }\n\n        /// <summary>\n        /// Create directory object\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"isVolume\"></param>\n        public DirectoryObjectState(ISystemContext context, NodeId nodeId,\n            string path, bool isVolume) : base(null)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context != null);\n            FullPath = path;\n            IsVolume = isVolume;\n            TypeDefinitionId = ObjectTypeIds.FileDirectoryType;\n            SymbolicName = path;\n            NodeId = nodeId;\n            BrowseName = new QualifiedName(isVolume ? path : ModelUtils.GetName(path),\n                nodeId.NamespaceIndex);\n            DisplayName = new LocalizedText(isVolume ? path : ModelUtils.GetName(path));\n            Description = null;\n            WriteMask = 0;\n            UserWriteMask = 0;\n            EventNotifier = EventNotifiers.None;\n\n            DeleteFileSystemObject = new DeleteFileMethodState(this)\n            {\n                OnCall = new DeleteFileMethodStateMethodCallHandler(OnDeleteFileSystemObject),\n                Executable = true,\n                UserExecutable = true\n            };\n            DeleteFileSystemObject.Create(context, MethodIds.FileDirectoryType_DeleteFileSystemObject,\n                BrowseNames.DeleteFileSystemObject, BrowseNames.DeleteFileSystemObject, false);\n\n            CreateFile = new CreateFileMethodState(this)\n            {\n                OnCall = new CreateFileMethodStateMethodCallHandler(OnCreateFile),\n                Executable = true,\n                UserExecutable = true\n            };\n            CreateFile.Create(context, MethodIds.FileDirectoryType_CreateFile,\n                BrowseNames.CreateFile, BrowseNames.CreateFile, false);\n\n            CreateDirectory = new CreateDirectoryMethodState(this)\n            {\n                OnCall = new CreateDirectoryMethodStateMethodCallHandler(OnCreateDirectory),\n                Executable = true,\n                UserExecutable = true\n            };\n            CreateDirectory.Create(context, MethodIds.FileDirectoryType_CreateDirectory,\n                BrowseNames.CreateDirectory, BrowseNames.CreateDirectory, false);\n\n            MoveOrCopy = new MoveOrCopyMethodState(this)\n            {\n                OnCall = new MoveOrCopyMethodStateMethodCallHandler(OnMoveOrCopy),\n                Executable = true,\n                UserExecutable = true\n            };\n            MoveOrCopy.Create(context, MethodIds.FileDirectoryType_MoveOrCopy,\n                BrowseNames.MoveOrCopy, BrowseNames.MoveOrCopy, false);\n        }\n\n        private ServiceResult OnMoveOrCopy(ISystemContext _context, MethodState _method,\n            NodeId _objectId, NodeId objectToMoveOrCopy, NodeId targetDirectory, bool createCopy,\n            string newName, ref NodeId newNodeId)\n        {\n            var objectToMoveOrCopy2 = ParsedNodeId.Parse(objectToMoveOrCopy);\n            if (objectToMoveOrCopy2.RootType == ModelUtils.Volume)\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                    \"Source is not a directory or file\");\n            }\n            var targetDirectory2 = ParsedNodeId.Parse(targetDirectory);\n            if (targetDirectory2.RootType != ModelUtils.Directory)\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                    \"Target is not a directory\");\n            }\n            var path = objectToMoveOrCopy2.RootId;\n            var dst = Path.Combine(targetDirectory2.RootId, newName ?? Path.GetFileName(path));\n            try\n            {\n                if (File.Exists(path))\n                {\n                    if (createCopy)\n                    {\n                        File.Copy(path, dst);\n                    }\n                    else\n                    {\n                        File.Move(path, dst);\n                    }\n                    newNodeId = ModelUtils.ConstructIdForFile(dst,\n                        NodeId.NamespaceIndex);\n                }\n                else if (Directory.Exists(path))\n                {\n                    if (createCopy)\n                    {\n                        CopyDirectory(path, dst);\n                    }\n                    else\n                    {\n                        Directory.Move(path, dst);\n                    }\n                    newNodeId = ModelUtils.ConstructIdForDirectory(dst,\n                        NodeId.NamespaceIndex);\n                }\n                else\n                {\n                    return ServiceResult.Create(StatusCodes.BadNotFound,\n                        $\"File sytem object {path} not found\");\n                }\n                return ServiceResult.Good;\n            }\n            catch (Exception ex)\n            {\n                return ServiceResult.Create(ex, StatusCodes.BadUserAccessDenied,\n                    \"Failed to move or copy\");\n            }\n        }\n\n        private ServiceResult OnCreateDirectory(ISystemContext _context, MethodState _method,\n            NodeId _objectId, string directoryName, ref NodeId directoryNodeId)\n        {\n            var name = Path.Combine(FullPath, directoryName);\n            if (Path.Exists(name))\n            {\n                return ServiceResult.Create(StatusCodes.BadBrowseNameDuplicated,\n                    \"Directory or file with same name exists\");\n            }\n            Directory.CreateDirectory(name);\n            directoryNodeId = ModelUtils.ConstructIdForDirectory(name, NodeId.NamespaceIndex);\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnCreateFile(ISystemContext _context, MethodState _method,\n            NodeId _objectId, string fileName, bool requestFileOpen, ref NodeId fileNodeId,\n            ref uint fileHandle)\n        {\n            var name = Path.Combine(FullPath, fileName);\n            if (Path.Exists(name))\n            {\n                return ServiceResult.Create(StatusCodes.BadBrowseNameDuplicated,\n                    \"Directory or file with same name exists\");\n            }\n            fileNodeId = ModelUtils.ConstructIdForFile(name, NodeId.NamespaceIndex);\n            if (requestFileOpen)\n            {\n                if (_context.SystemHandle is not FileSystem system ||\n                    system.GetHandle(fileNodeId) is not FileHandle handle)\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidState,\n                        \"Failed to get handle\");\n                }\n\n                return handle.Open(0x2, out fileHandle); // open for writing\n            }\n            try\n            {\n                using var f = File.Create(name);\n            }\n            catch (Exception ex)\n            {\n                return ServiceResult.Create(ex, null,\n                    StatusCodes.BadUserAccessDenied);\n            }\n            fileHandle = 0;\n            return StatusCodes.Good;\n        }\n\n        private ServiceResult OnDeleteFileSystemObject(ISystemContext _context,\n            MethodState _method, NodeId _objectId, NodeId objectToDelete)\n        {\n            var objectToDelete2 = ParsedNodeId.Parse(objectToDelete);\n            var path = objectToDelete2.RootId;\n            try\n            {\n                switch (objectToDelete2.RootType)\n                {\n                    case ModelUtils.File:\n                        if (File.Exists(path))\n                        {\n                            File.Delete(path);\n                            break;\n                        }\n                        return ServiceResult.Create(StatusCodes.BadNotFound,\n                            $\"File sytem object {path} not found\");\n                    case ModelUtils.Directory:\n                        if (Directory.Exists(path))\n                        {\n                            Directory.Delete(path, true);\n                            break;\n                        }\n                        return ServiceResult.Create(StatusCodes.BadNotFound,\n                            $\"File sytem object {path} not found\");\n                    case ModelUtils.Volume:\n                        return ServiceResult.Create(StatusCodes.BadUserAccessDenied,\n                            \"Cannot delete root of filesystem\");\n                    default:\n                        return ServiceResult.Create(StatusCodes.BadInvalidState,\n                            \"Not a fileSystem object.\");\n                }\n            }\n            catch (Exception ex)\n            {\n                return ServiceResult.Create(ex, StatusCodes.BadUserAccessDenied,\n                    \"Failed to delete file system object.\");\n            }\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Create browser on directory\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"referenceType\"></param>\n        /// <param name=\"includeSubtypes\"></param>\n        /// <param name=\"browseDirection\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"additionalReferences\"></param>\n        /// <param name=\"internalOnly\"></param>\n        /// <returns></returns>\n        public override INodeBrowser CreateBrowser(\n            ISystemContext context, ViewDescription view, NodeId referenceType,\n            bool includeSubtypes, BrowseDirection browseDirection,\n            QualifiedName browseName, IEnumerable<IReference> additionalReferences,\n            bool internalOnly)\n        {\n            NodeBrowser browser = new DirectoryBrowser(\n                context, view, referenceType, includeSubtypes,\n                browseDirection, browseName, additionalReferences,\n                internalOnly, this);\n\n            PopulateBrowser(context, browser);\n            return browser;\n        }\n\n        /// <summary>\n        /// Populates the browser with references that meet the criteria.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"browser\">The browser to populate.</param>\n        protected override void PopulateBrowser(ISystemContext context, NodeBrowser browser)\n        {\n            base.PopulateBrowser(context, browser);\n\n            // check if the parent segments need to be returned.\n            if (browser.IsRequired(ReferenceTypeIds.Organizes, true) && IsVolume)\n            {\n                // add reference to server\n                browser.Add(ReferenceTypeIds.Organizes, true, ObjectIds.Server);\n            }\n            else if (browser.IsRequired(ReferenceTypeIds.HasComponent, true) && !IsVolume)\n            {\n                var parent = Path.GetDirectoryName(FullPath);\n                if (Path.GetPathRoot(FullPath) == parent)\n                {\n                    // add reference for parent volume.\n                    browser.Add(ReferenceTypeIds.HasComponent, true,\n                        ModelUtils.ConstructIdForVolume(parent, NodeId.NamespaceIndex));\n                }\n                else\n                {\n                    // add reference to parent directory\n                    browser.Add(ReferenceTypeIds.HasComponent, true,\n                        ModelUtils.ConstructIdForDirectory(parent, NodeId.NamespaceIndex));\n                }\n            }\n        }\n\n        private static void CopyDirectory(string sourcePath, string targetPath)\n        {\n            foreach (var dirPath in Directory.GetDirectories(sourcePath, \"*\", SearchOption.AllDirectories))\n            {\n                Directory.CreateDirectory(dirPath.Replace(sourcePath, targetPath, StringComparison.InvariantCulture));\n            }\n            foreach (var newPath in Directory.GetFiles(sourcePath, \"*\", SearchOption.AllDirectories))\n            {\n                File.Copy(newPath, newPath.Replace(sourcePath, targetPath, StringComparison.InvariantCulture), true);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/FileHandle.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Threading;\n\n    /// <summary>\n    /// File handle\n    /// </summary>\n    /// <param name=\"NodeId\"></param>\n    public sealed record FileHandle(ParsedNodeId NodeId) : IDisposable\n    {\n        private bool IsOpenForWrite => _write != null;\n\n        private bool IsOpenForRead => _reads.Count > 0;\n\n        /// <summary>\n        /// Length\n        /// </summary>\n        public long Length => new FileInfo(NodeId.RootId).Length;\n\n        /// <summary>\n        /// Can be written to\n        /// </summary>\n        public bool IsWriteable => !IsOpenForRead && !IsOpenForWrite\n            && !new FileInfo(NodeId.RootId).IsReadOnly;\n\n        /// <summary>\n        /// Last modification\n        /// </summary>\n        public DateTime LastModifiedTime => File.GetLastWriteTimeUtc(NodeId.RootId);\n\n        /// <summary>\n        /// How many file handles are open\n        /// </summary>\n        public ushort OpenCount => (ushort)(_reads.Count + (IsOpenForWrite ? 1 : 0));\n\n        /// <summary>\n        /// Mime type\n        /// </summary>\n        public string MimeType { get; } = \"text/plain\"; // TODO\n\n        /// <summary>\n        /// Max byte string length\n        /// </summary>\n        public uint MaxByteStringLength { get; } = 4 * 1024; // TODO\n\n        /// <summary>\n        /// Get stream\n        /// </summary>\n        /// <param name=\"fileHandle\"></param>\n        /// <returns></returns>\n        public Stream GetStream(uint fileHandle)\n        {\n            lock (_lock)\n            {\n                if (_write != null && fileHandle == 1)\n                {\n                    return _write;\n                }\n                else if (_reads.TryGetValue(fileHandle, out var stream))\n                {\n                    return stream;\n                }\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Open\n        /// </summary>\n        /// <param name=\"mode\"></param>\n        /// <param name=\"fileHandle\"></param>\n        /// <returns></returns>\n        public ServiceResult Open(byte mode, out uint fileHandle)\n        {\n            lock (_lock)\n            {\n                fileHandle = 0u;\n                try\n                {\n                    if (mode == 0x1)\n                    {\n                        if (_write != null)\n                        {\n                            return ServiceResult.Create(StatusCodes.BadInvalidState,\n                                \"File already open for write\");\n                        }\n                        // read\n                        var stream = new FileStream(NodeId.RootId,\n                            FileMode.Open, FileAccess.Read);\n                        fileHandle = ++_handles;\n                        _reads.Add(fileHandle, stream);\n                    }\n                    else if ((mode & 0x2) != 0)\n                    {\n                        if (_reads.Count != 0 || _write != null)\n                        {\n                            return ServiceResult.Create(StatusCodes.BadInvalidState,\n                                \"File already open for read or write\");\n                        }\n                        if ((mode & 0x4) != 0)\n                        {\n                            // Erase = OpenOrCreate + Truncate\n                            _write = new FileStream(NodeId.RootId,\n                                FileMode.Create, FileAccess.Write);\n                        }\n                        else if ((mode & 0x8) != 0)\n                        {\n                            // Append\n                            _write = new FileStream(NodeId.RootId,\n                                FileMode.Append, FileAccess.Write);\n                        }\n                        else\n                        {\n                            // Open or create\n                            _write = new FileStream(NodeId.RootId,\n                                FileMode.OpenOrCreate, FileAccess.Write);\n                        }\n                        fileHandle = 1u;\n                    }\n                    else\n                    {\n                        return ServiceResult.Create(StatusCodes.BadInvalidArgument,\n                            \"Unknown mode value.\");\n                    }\n                }\n                catch (Exception ex)\n                {\n                    return ServiceResult.Create(ex, StatusCodes.BadUserAccessDenied,\n                        \"Failed to open file\");\n                }\n            }\n            return ServiceResult.Good;\n        }\n\n        public bool Close(uint fileHandle)\n        {\n            lock (_lock)\n            {\n                if (_write != null && fileHandle == 1)\n                {\n                    _write.Dispose();\n                    _write = null;\n                    return true;\n                }\n                if (_reads.TryGetValue(fileHandle, out var stream))\n                {\n                    stream.Dispose();\n                    _reads.Remove(fileHandle);\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        public void Dispose()\n        {\n            _write?.Dispose();\n            foreach (var stream in _reads.Values)\n            {\n                stream.Dispose();\n            }\n            _reads.Clear();\n        }\n\n        private uint _handles = 1;\n        private readonly Dictionary<uint, Stream> _reads = [];\n        private readonly Lock _lock = new();\n        private Stream _write;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/FileObjectState.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using Opc.Ua;\n    using System;\n    using System.IO;\n\n    /// <summary>\n    /// A object which maps a segment to a UA object.\n    /// </summary>\n    public class FileObjectState : FileState\n    {\n        /// <summary>\n        /// Gets the path to the file\n        /// </summary>\n        /// <value>The segment path.</value>\n        public string FullPath { get; }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DirectoryObjectState\"/> class.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"nodeId\">The node id.</param>\n        /// <param name=\"path\">The segment.</param>\n        public FileObjectState(ISystemContext context, NodeId nodeId, string path)\n            : base(null)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context != null);\n            FullPath = path;\n\n            TypeDefinitionId = ObjectTypeIds.FileType;\n            SymbolicName = path;\n            NodeId = nodeId;\n            BrowseName = new QualifiedName(Path.GetFileName(path),\n                nodeId.NamespaceIndex);\n            DisplayName = new LocalizedText(Path.GetFileName(path));\n            Description = null;\n            WriteMask = 0;\n            UserWriteMask = 0;\n            EventNotifier = EventNotifiers.None;\n\n            OpenCount = new PropertyState<ushort>(this);\n            OpenCount.OnReadValue += OnOpenCount;\n            OpenCount.AccessLevel = AccessLevels.CurrentRead;\n            OpenCount.UserAccessLevel = AccessLevels.CurrentRead;\n            OpenCount.Create(context, VariableIds.FileType_OpenCount,\n                BrowseNames.OpenCount, BrowseNames.OpenCount, true);\n\n            Writable = new PropertyState<bool>(this);\n            Writable.OnReadValue += OnWritable;\n            Writable.AccessLevel = AccessLevels.CurrentRead;\n            Writable.UserAccessLevel = AccessLevels.CurrentRead;\n            Writable.Create(context, VariableIds.FileType_Writable,\n                BrowseNames.Writable, BrowseNames.Writable, true);\n\n            UserWritable = new PropertyState<bool>(this);\n            UserWritable.OnReadValue += OnWritable;\n            UserWritable.AccessLevel = AccessLevels.CurrentRead;\n            UserWritable.UserAccessLevel = AccessLevels.CurrentRead;\n            UserWritable.Create(context, VariableIds.FileType_UserWritable,\n                BrowseNames.UserWritable, BrowseNames.UserWritable, true);\n\n            Size = new PropertyState<ulong>(this);\n            Size.OnReadValue += OnSize;\n            Size.AccessLevel = AccessLevels.CurrentRead;\n            Size.UserAccessLevel = AccessLevels.CurrentRead;\n            Size.Create(context, VariableIds.FileType_Size,\n                BrowseNames.Size, BrowseNames.Size, true);\n\n            MimeType = new PropertyState<string>(this);\n            MimeType.OnReadValue += OnMimeType;\n            MimeType.AccessLevel = AccessLevels.CurrentRead;\n            MimeType.UserAccessLevel = AccessLevels.CurrentRead;\n            MimeType.Create(context, VariableIds.FileType_MimeType,\n                BrowseNames.MimeType, BrowseNames.MimeType, true);\n\n#if OPTIONAL_MAX_BYTE_STRING\n            MaxByteStringLength = new PropertyState<uint>(this);\n            MaxByteStringLength.OnReadValue += OnMaxByteStringLength;\n            MaxByteStringLength.AccessLevel = AccessLevels.CurrentRead;\n            MaxByteStringLength.UserAccessLevel = AccessLevels.CurrentRead;\n            MaxByteStringLength.Create(context, VariableIds.FileType_MaxByteStringLength,\n                BrowseNames.MaxByteStringLength, BrowseNames.MaxByteStringLength, true);\n#endif\n\n            LastModifiedTime = new PropertyState<DateTime>(this);\n            LastModifiedTime.OnReadValue += OnLastModifiedTime;\n            LastModifiedTime.AccessLevel = AccessLevels.CurrentRead;\n            LastModifiedTime.UserAccessLevel = AccessLevels.CurrentRead;\n            LastModifiedTime.Create(context, VariableIds.FileType_LastModifiedTime,\n                BrowseNames.LastModifiedTime, BrowseNames.LastModifiedTime, true);\n\n            Open = new OpenMethodState(this)\n            {\n                OnCall = new OpenMethodStateMethodCallHandler(OnOpen),\n                Executable = true,\n                UserExecutable = true\n            };\n            Open.Create(context, MethodIds.FileType_Open,\n                BrowseNames.Open, BrowseNames.Open, false);\n\n            Write = new WriteMethodState(this)\n            {\n                OnCall = new WriteMethodStateMethodCallHandler(OnWrite),\n                Executable = true,\n                UserExecutable = true\n            };\n            Write.Create(context, MethodIds.FileType_Write,\n                BrowseNames.Write, BrowseNames.Write, false);\n\n            Read = new ReadMethodState(this)\n            {\n                OnCall = new ReadMethodStateMethodCallHandler(OnRead),\n                Executable = true,\n                UserExecutable = true\n            };\n            Read.Create(context, MethodIds.FileType_Read,\n                BrowseNames.Read, BrowseNames.Read, false);\n\n            Close = new CloseMethodState(this)\n            {\n                OnCall = new CloseMethodStateMethodCallHandler(OnClose),\n                Executable = true,\n                UserExecutable = true\n            };\n            Close.Create(context, MethodIds.FileType_Close,\n                BrowseNames.Close, BrowseNames.Close, false);\n\n            GetPosition = new GetPositionMethodState(this)\n            {\n                OnCall = new GetPositionMethodStateMethodCallHandler(OnGetPosition),\n                Executable = true,\n                UserExecutable = true\n            };\n            GetPosition.Create(context, MethodIds.FileType_GetPosition,\n                BrowseNames.GetPosition, BrowseNames.GetPosition, false);\n\n            SetPosition = new SetPositionMethodState(this)\n            {\n                OnCall = new SetPositionMethodStateMethodCallHandler(OnSetPosition),\n                Executable = true,\n                UserExecutable = true\n            };\n            SetPosition.Create(context, MethodIds.FileType_SetPosition,\n                BrowseNames.SetPosition, BrowseNames.SetPosition, false);\n        }\n\n#if OPTIONAL_MAX_BYTE_STRING\n        private ServiceResult OnMaxByteStringLength(ISystemContext context,\n            NodeState node, NumericRange indexRange, QualifiedName dataEncoding,\n            ref object value, ref StatusCode statusCode, ref DateTime timestamp)\n        {\n            if (GetFileHandle(context, NodeId, out var handle, out var result))\n            {\n                value = handle.MaxByteStringLength;\n                timestamp = DateTime.UtcNow;\n                statusCode = StatusCodes.Good;\n            }\n            return result;\n        }\n#endif\n        private ServiceResult OnMimeType(ISystemContext context, NodeState node,\n            NumericRange indexRange, QualifiedName dataEncoding, ref object value,\n            ref StatusCode statusCode, ref DateTime timestamp)\n        {\n            if (GetFileHandle(context, NodeId, out var handle, out var result))\n            {\n                value = handle.MimeType;\n                timestamp = DateTime.UtcNow;\n                statusCode = StatusCodes.Uncertain;\n            }\n            return result;\n        }\n\n        private ServiceResult OnLastModifiedTime(ISystemContext context,\n            NodeState node, NumericRange indexRange, QualifiedName dataEncoding,\n            ref object value, ref StatusCode statusCode, ref DateTime timestamp)\n        {\n            if (GetFileHandle(context, NodeId, out var handle, out var result))\n            {\n                value = handle.LastModifiedTime;\n                timestamp = DateTime.UtcNow;\n                statusCode = StatusCodes.Good;\n            }\n            return result;\n        }\n\n        private ServiceResult OnWritable(ISystemContext context, NodeState node,\n            NumericRange indexRange, QualifiedName dataEncoding, ref object value,\n            ref StatusCode statusCode, ref DateTime timestamp)\n        {\n            if (GetFileHandle(context, NodeId, out var handle, out var result))\n            {\n                value = handle.IsWriteable;\n                timestamp = DateTime.UtcNow;\n                statusCode = StatusCodes.Good;\n            }\n            return result;\n        }\n\n        private ServiceResult OnSize(ISystemContext context, NodeState node,\n            NumericRange indexRange, QualifiedName dataEncoding, ref object value,\n            ref StatusCode statusCode, ref DateTime timestamp)\n        {\n            if (GetFileHandle(context, NodeId, out var handle, out var result))\n            {\n                value = handle.Length;\n                timestamp = DateTime.UtcNow;\n                statusCode = StatusCodes.Good;\n            }\n            return result;\n        }\n\n        private ServiceResult OnOpenCount(ISystemContext context, NodeState node,\n            NumericRange indexRange, QualifiedName dataEncoding, ref object value,\n            ref StatusCode statusCode, ref DateTime timestamp)\n        {\n            if (GetFileHandle(context, NodeId, out var handle, out var result))\n            {\n                value = handle.OpenCount;\n                timestamp = DateTime.UtcNow;\n                statusCode = StatusCodes.Good;\n            }\n            return result;\n        }\n\n        private ServiceResult OnOpen(ISystemContext _context, MethodState _method,\n            NodeId _objectId, byte mode, ref uint fileHandle)\n        {\n            if (GetFileHandle(_context, _objectId, out var handle, out var result))\n            {\n                result = handle.Open(mode, out fileHandle);\n            }\n            return result;\n        }\n\n        private ServiceResult OnClose(ISystemContext _context, MethodState _method,\n            NodeId _objectId, uint fileHandle)\n        {\n            if (GetFileHandle(_context, _objectId, out var handle, out var result)\n                && !handle.Close(fileHandle))\n            {\n                return ServiceResult.Create(StatusCodes.BadInvalidState,\n                   \"File handle could not be closed.\");\n            }\n            return result;\n        }\n\n        private ServiceResult OnSetPosition(ISystemContext _context, MethodState _method,\n            NodeId _objectId, uint fileHandle, ulong position)\n        {\n            if (GetFileHandle(_context, _objectId, out var handle, out var result))\n            {\n                var stream = handle.GetStream(fileHandle);\n                if (stream == null)\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidState,\n                       \"File handle not open.\");\n                }\n                stream.Position = (long)position;\n            }\n            return result;\n        }\n\n        private ServiceResult OnGetPosition(ISystemContext _context,\n            MethodState _method, NodeId _objectId, uint fileHandle, ref ulong position)\n        {\n            if (GetFileHandle(_context, _objectId, out var handle, out var result))\n            {\n                var stream = handle.GetStream(fileHandle);\n                if (stream == null)\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidState,\n                       \"File handle not open.\");\n                }\n                position = (ulong)stream.Position;\n            }\n            return result;\n        }\n\n        private ServiceResult OnRead(ISystemContext _context, MethodState _method,\n            NodeId _objectId, uint fileHandle, int length, ref byte[] data)\n        {\n            if (GetFileHandle(_context, _objectId, out var handle, out var result))\n            {\n                var stream = handle.GetStream(fileHandle);\n                if (stream == null)\n                {\n                    return ServiceResult.Create(StatusCodes.BadInvalidState,\n                       \"File handle not open.\");\n                }\n                var buffer = new Span<byte>(new byte[length]);\n                var read = stream.Read(buffer);\n                data = buffer[..read].ToArray();\n            }\n            return result;\n        }\n\n        private ServiceResult OnWrite(ISystemContext _context, MethodState _method,\n            NodeId _objectId, uint fileHandle, byte[] data)\n        {\n            if (GetFileHandle(_context, _objectId, out var handle, out var result))\n            {\n                var stream = handle.GetStream(fileHandle);\n                if (stream == null)\n                {\n                    return StatusCodes.BadInvalidState;\n                }\n                stream.Write(data.AsSpan());\n            }\n            return result;\n        }\n\n        /// <summary>\n        /// Populates the browser with references that meet the criteria.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"browser\">The browser to populate.</param>\n        protected override void PopulateBrowser(ISystemContext context, NodeBrowser browser)\n        {\n            base.PopulateBrowser(context, browser);\n\n            // check if the parent segments need to be returned.\n            if (browser.IsRequired(ReferenceTypeIds.HasComponent, true))\n            {\n                var directory = Path.GetDirectoryName(FullPath);\n                if (Path.GetPathRoot(FullPath) == directory)\n                {\n                    browser.Add(ReferenceTypeIds.HasComponent, true,\n                        ModelUtils.ConstructIdForVolume(directory, NodeId.NamespaceIndex));\n                }\n                else\n                {\n                    browser.Add(ReferenceTypeIds.HasComponent, true,\n                        ModelUtils.ConstructIdForDirectory(directory, NodeId.NamespaceIndex));\n                }\n            }\n        }\n\n        private static bool GetFileHandle(ISystemContext context, NodeId nodeId,\n            out FileHandle handle, out ServiceResult result)\n        {\n            if (context.SystemHandle is not FileSystem system ||\n               system.GetHandle(nodeId) is not FileHandle h)\n            {\n                result = ServiceResult.Create(StatusCodes.BadInvalidState,\n                    \"Object is not a file.\");\n                handle = default;\n                return false;\n            }\n            handle = h;\n            result = ServiceResult.Good;\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/FileSystem.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    /// <summary>\n    /// File system and handle management\n    /// </summary>\n    public sealed class FileSystem : IDisposable\n    {\n        public void Dispose()\n        {\n            lock (_syncRoot)\n            {\n                foreach (var handle in _handles.Values)\n                {\n                    handle.Dispose();\n                }\n                _handles.Clear();\n            }\n        }\n\n        public FileHandle GetHandle(NodeId nodeId)\n        {\n            lock (_syncRoot)\n            {\n                if (_handles.TryGetValue(nodeId, out var handle))\n                {\n                    return handle;\n                }\n                var parsed = ParsedNodeId.Parse(nodeId);\n                if (parsed == null || parsed.RootType != ModelUtils.File)\n                {\n                    return null;\n                }\n                handle = new FileHandle(parsed);\n                _handles.Add(nodeId, handle);\n                return handle;\n            }\n        }\n\n        private readonly Lock _syncRoot = new();\n        private readonly Dictionary<NodeId, FileHandle> _handles = [];\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/FileSystemNodeManager.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class FileSystemNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public FileSystemNodeManager(IServerInternal server, ApplicationConfiguration configuration) :\n            base(server, configuration, Namespaces.FileSystem)\n        {\n            SystemContext.SystemHandle = _system = new FileSystem();\n            SystemContext.NodeIdFactory = this;\n\n            var namespaceUris = new List<string> {\n                Namespaces.FileSystem\n            };\n            NamespaceUris = namespaceUris;\n\n            _namespaceIndex = Server.NamespaceUris.GetIndexOrAppend(namespaceUris[0]);\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<FileSystemServerConfiguration>() ??\n                new FileSystemServerConfiguration();\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                _system.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The node.</param>\n        /// <returns>The new NodeId.</returns>\n        /// <remarks>\n        /// This method is called by the NodeState.Create() method which initializes a Node from\n        /// the type model. During initialization a number of child nodes are created and need to\n        /// have NodeIds assigned to them. This implementation constructs NodeIds by constructing\n        /// strings. Other implementations could assign unique integers or Guids and save the new\n        /// Node in a dictionary for later lookup.\n        /// </remarks>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            return ModelUtils.ConstructIdForComponent(node, NamespaceIndex);\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                // find the top level segments and link them to the Server folder.\n                foreach (var fs in DriveInfo.GetDrives())\n                {\n                    if (!externalReferences.TryGetValue(ObjectIds.Server, out var references))\n                    {\n                        externalReferences[ObjectIds.Server] = references = [];\n                    }\n\n                    // construct the NodeId of a segment.\n                    var fsId = ModelUtils.ConstructIdForVolume(fs.Name, _namespaceIndex);\n\n                    // add an organizes reference from the server to the volume.\n                    references.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, fsId));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                if (nodeId.IdType != IdType.String && PredefinedNodes.TryGetValue(nodeId, out var node))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Node = node,\n                        Validated = true\n                    };\n                }\n\n                // parse the identifier.\n                var parsedNodeId = ParsedNodeId.Parse(nodeId);\n\n                if (parsedNodeId != null)\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = false,\n                        Node = null,\n                        ParsedNodeId = parsedNodeId\n                    };\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(ServerSystemContext context,\n            NodeHandle handle, IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            NodeState target = null;\n\n            // check if already in the cache.\n            if (cache != null)\n            {\n                if (cache.TryGetValue(handle.NodeId, out target))\n                {\n                    // nulls mean a NodeId which was previously found to be invalid has been referenced again.\n                    if (target == null)\n                    {\n                        return null;\n                    }\n\n                    handle.Node = target;\n                    handle.Validated = true;\n                    return handle.Node;\n                }\n\n                target = null;\n            }\n\n            try\n            {\n                // check if the node id has been parsed.\n                if (handle.ParsedNodeId is not ParsedNodeId parsedNodeId)\n                {\n                    return null;\n                }\n\n                NodeState root = null;\n\n                // Validate drive\n                if (parsedNodeId.RootType == ModelUtils.Volume)\n                {\n                    var volume = DriveInfo.GetDrives().FirstOrDefault(d => d.Name == parsedNodeId.RootId);\n\n                    // volume does not exist.\n                    if (volume == null)\n                    {\n                        return null;\n                    }\n\n                    var rootId = ModelUtils.ConstructIdForVolume(volume.Name, _namespaceIndex);\n\n                    // create a temporary object to use for the operation.\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                    root = new DirectoryObjectState(context, rootId, volume.Name, true);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                }\n\n                // Validate directory\n                else if (parsedNodeId.RootType == ModelUtils.Directory)\n                {\n                    // block does not exist.\n                    if (!Path.Exists(parsedNodeId.RootId))\n                    {\n                        return null;\n                    }\n\n                    var rootId = ModelUtils.ConstructIdForDirectory(parsedNodeId.RootId, _namespaceIndex);\n\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                    root = new DirectoryObjectState(context, rootId, parsedNodeId.RootId, false);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                }\n\n                // Validate file\n                else if (parsedNodeId.RootType == ModelUtils.File)\n                {\n                    // block does not exist.\n                    if (!Path.Exists(parsedNodeId.RootId))\n                    {\n                        return null;\n                    }\n\n                    var rootId = ModelUtils.ConstructIdForFile(parsedNodeId.RootId, _namespaceIndex);\n\n#pragma warning disable CA2000 // Dispose objects before losing scope\n                    root = new FileObjectState(context, rootId, parsedNodeId.RootId);\n#pragma warning restore CA2000 // Dispose objects before losing scope\n                }\n\n                // unknown root type.\n                else\n                {\n                    return null;\n                }\n\n                // all done if no components to validate.\n                if (string.IsNullOrEmpty(parsedNodeId.ComponentPath))\n                {\n                    handle.Validated = true;\n                    handle.Node = target = root;\n                    return handle.Node;\n                }\n\n                // validate component.\n                NodeState component = root.FindChildBySymbolicName(context, parsedNodeId.ComponentPath);\n\n                // component does not exist.\n                if (component == null)\n                {\n                    return null;\n                }\n\n                // found a valid component.\n                handle.Validated = true;\n                handle.Node = target = component;\n                return handle.Node;\n            }\n            finally\n            {\n                // store the node in the cache to optimize subsequent lookups.\n                cache?.Add(handle.NodeId, target);\n            }\n        }\n\n        private readonly ushort _namespaceIndex;\n\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly FileSystemServerConfiguration _configuration;\n        private readonly FileSystem _system;\n#pragma warning restore IDE0052 // Remove unread private members\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/FileSystemServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class FileSystemServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.FileSystem\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new FileSystemNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/FileSystemServerConfiguration.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the file system node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.FileSystem)]\n    public class FileSystemServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public FileSystemServerConfiguration()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/ModelUtils.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// A class that builds NodeIds used by the FileSystem NodeManager\n    /// </summary>\n    public static class ModelUtils\n    {\n        /// <summary>\n        /// The RootType for a Volume node identfier.\n        /// </summary>\n        public const int Volume = 0;\n\n        /// <summary>\n        /// The RootType for a Directory node identfier.\n        /// </summary>\n        public const int Directory = 1;\n\n        /// <summary>\n        /// The RootType for a File node identfier.\n        /// </summary>\n        public const int File = 2;\n\n        /// <summary>\n        /// Create id for drive\n        /// </summary>\n        /// <param name=\"path\"></param>\n        /// <param name=\"namespaceIndex\"></param>\n        /// <returns></returns>\n        public static NodeId ConstructIdForVolume(string path, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = path,\n                NamespaceIndex = namespaceIndex,\n                RootType = 0\n            };\n            return parsedNodeId.Construct();\n        }\n\n        /// <summary>\n        /// Constructs a NodeId a file or directory.\n        /// </summary>\n        /// <param name=\"path\">The directory.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace.</param>\n        /// <returns>The new NodeId.</returns>\n        public static NodeId ConstructIdForDirectory(string path, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = path,\n                NamespaceIndex = namespaceIndex,\n                RootType = 1\n            };\n            return parsedNodeId.Construct();\n        }\n\n        /// <summary>\n        /// Constructs a NodeId a file or directory.\n        /// </summary>\n        /// <param name=\"path\">The file.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace.</param>\n        /// <returns>The new NodeId.</returns>\n        public static NodeId ConstructIdForFile(string path, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = path,\n                NamespaceIndex = namespaceIndex,\n                RootType = 2\n            };\n            return parsedNodeId.Construct();\n        }\n\n        public static string GetName(string path)\n        {\n            var name = Path.GetFileName(path);\n            if (string.IsNullOrEmpty(name))\n            {\n                return path;\n            }\n            return name;\n        }\n\n        /// <summary>\n        /// Constructs the node identifier for a component.\n        /// </summary>\n        /// <param name=\"component\">The component.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace.</param>\n        /// <returns>The node identifier for a component.</returns>\n        public static NodeId ConstructIdForComponent(NodeState component, ushort namespaceIndex)\n        {\n            if (component == null)\n            {\n                return null;\n            }\n\n            // components must be instances with a parent.\n\n            if (component is not BaseInstanceState instance || instance.Parent == null)\n            {\n                return component.NodeId;\n            }\n\n            // parent must have a string identifier.\n\n            if (instance.Parent.NodeId.Identifier is not string parentId)\n            {\n                return null;\n            }\n\n            var buffer = new StringBuilder();\n            buffer.Append(parentId);\n\n            // check if the parent is another component.\n            var index = parentId.IndexOf('?', System.StringComparison.InvariantCulture);\n\n            if (index < 0)\n            {\n                buffer.Append('?');\n            }\n            else\n            {\n                buffer.Append('/');\n            }\n\n            buffer.Append(component.SymbolicName);\n\n            // return the node identifier.\n            return new NodeId(buffer.ToString(), namespaceIndex);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/FileSystem/Namespaces.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace FileSystem\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the server.\n        /// </summary>\n        public const string FileSystem = \"FileSystem\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Asset/Design/Asset.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2024 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\n\nnamespace Asset\n{\n    #region WoTAssetConnectionManagementTypeState Class\n#if (!OPCUA_EXCLUDE_WoTAssetConnectionManagementTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class WoTAssetConnectionManagementTypeState : BaseObjectState\n    {\n        #region Constructors\n        /// <remarks />\n        public WoTAssetConnectionManagementTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Asset.ObjectTypes.WoTAssetConnectionManagementType, Asset.Namespaces.WoT_Con, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACQAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvV29ULUNvbi//////BGCAAgEAAAABACgA\" +\n           \"AABXb1RBc3NldENvbm5lY3Rpb25NYW5hZ2VtZW50VHlwZUluc3RhbmNlAQEBAAEBAQABAAAA/////wIA\" +\n           \"AAAEYYIKBAAAAAEACwAAAENyZWF0ZUFzc2V0AQEaAAAvAQEaABoAAAABAf////8CAAAAF2CpCgIAAAAA\" +\n           \"AA4AAABJbnB1dEFyZ3VtZW50cwEBGwAALgBEGwAAAJYBAAAAAQAqAQEYAAAACQAAAEFzc2V0TmFtZQAM\" +\n           \"/////wAAAAAAAQAoAQEAAAABAAAAAQAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3Vt\" +\n           \"ZW50cwEBHAAALgBEHAAAAJYBAAAAAQAqAQEWAAAABwAAAEFzc2V0SWQAEf////8AAAAAAAEAKAEBAAAA\" +\n           \"AQAAAAEAAAABAf////8AAAAABGGCCgQAAAABAAsAAABEZWxldGVBc3NldAEBHQAALwEBHQAdAAAAAQH/\" +\n           \"////AQAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAR4AAC4ARB4AAACWAQAAAAEAKgEBFgAA\" +\n           \"AAcAAABBc3NldElkABH/////AAAAAAABACgBAQAAAAEAAAABAAAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public CreateAssetMethodState CreateAsset\n        {\n            get\n            {\n                return m_createAssetMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_createAssetMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_createAssetMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public DeleteAssetMethodState DeleteAsset\n        {\n            get\n            {\n                return m_deleteAssetMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_deleteAssetMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_deleteAssetMethod = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_createAssetMethod != null)\n            {\n                children.Add(m_createAssetMethod);\n            }\n\n            if (m_deleteAssetMethod != null)\n            {\n                children.Add(m_deleteAssetMethod);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Asset.BrowseNames.CreateAsset:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (CreateAsset == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    CreateAsset = new CreateAssetMethodState(this);\n                                }\n                                else\n                                {\n                                    CreateAsset = (CreateAssetMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = CreateAsset;\n                        break;\n                    }\n\n                case Asset.BrowseNames.DeleteAsset:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (DeleteAsset == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    DeleteAsset = new DeleteAssetMethodState(this);\n                                }\n                                else\n                                {\n                                    DeleteAsset = (DeleteAssetMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = DeleteAsset;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private CreateAssetMethodState m_createAssetMethod;\n        private DeleteAssetMethodState m_deleteAssetMethod;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region IWoTAssetTypeState Class\n#if (!OPCUA_EXCLUDE_IWoTAssetTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class IWoTAssetTypeState : BaseInterfaceState\n    {\n        #region Constructors\n        /// <remarks />\n        public IWoTAssetTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Asset.ObjectTypes.IWoTAssetType, Asset.Namespaces.WoT_Con, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACQAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvV29ULUNvbi//////BGCAAgEAAAABABUA\" +\n           \"AABJV29UQXNzZXRUeXBlSW5zdGFuY2UBASoAAQEqACoAAAD/////AQAAAARggAoBAAAAAQAHAAAAV29U\" +\n           \"RmlsZQEBKwAALwEBbgArAAAA/////wsAAAAVYIkKAgAAAAAABAAAAFNpemUBASwAAC4ARCwAAAAACf//\" +\n           \"//8BAf////8AAAAAFWCJCgIAAAAAAAgAAABXcml0YWJsZQEBLQAALgBELQAAAAAB/////wEB/////wAA\" +\n           \"AAAVYIkKAgAAAAAADAAAAFVzZXJXcml0YWJsZQEBLgAALgBELgAAAAAB/////wEB/////wAAAAAVYIkK\" +\n           \"AgAAAAAACQAAAE9wZW5Db3VudAEBLwAALgBELwAAAAAF/////wEB/////wAAAAAEYYIKBAAAAAAABAAA\" +\n           \"AE9wZW4BATMAAC8BADwtMwAAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQE0\" +\n           \"AAAuAEQ0AAAAlgEAAAABACoBARMAAAAEAAAATW9kZQAD/////wAAAAAAAQAoAQEAAAABAAAAAQAAAAEB\" +\n           \"/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEBNQAALgBENQAAAJYBAAAAAQAqAQEZ\" +\n           \"AAAACgAAAEZpbGVIYW5kbGUAB/////8AAAAAAAEAKAEBAAAAAQAAAAEAAAABAf////8AAAAABGGCCgQA\" +\n           \"AAAAAAUAAABDbG9zZQEBNgAALwEAPy02AAAAAQH/////AQAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1\" +\n           \"bWVudHMBATcAAC4ARDcAAACWAQAAAAEAKgEBGQAAAAoAAABGaWxlSGFuZGxlAAf/////AAAAAAABACgB\" +\n           \"AQAAAAEAAAABAAAAAQH/////AAAAAARhggoEAAAAAAAEAAAAUmVhZAEBOAAALwEAQS04AAAAAQH/////\" +\n           \"AgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBATkAAC4ARDkAAACWAgAAAAEAKgEBGQAAAAoA\" +\n           \"AABGaWxlSGFuZGxlAAf/////AAAAAAABACoBARUAAAAGAAAATGVuZ3RoAAb/////AAAAAAABACgBAQAA\" +\n           \"AAEAAAACAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQE6AAAuAEQ6AAAA\" +\n           \"lgEAAAABACoBARMAAAAEAAAARGF0YQAP/////wAAAAAAAQAoAQEAAAABAAAAAQAAAAEB/////wAAAAAE\" +\n           \"YYIKBAAAAAAABQAAAFdyaXRlAQE7AAAvAQBELTsAAAABAf////8BAAAAF2CpCgIAAAAAAA4AAABJbnB1\" +\n           \"dEFyZ3VtZW50cwEBPAAALgBEPAAAAJYCAAAAAQAqAQEZAAAACgAAAEZpbGVIYW5kbGUAB/////8AAAAA\" +\n           \"AAEAKgEBEwAAAAQAAABEYXRhAA//////AAAAAAABACgBAQAAAAEAAAACAAAAAQH/////AAAAAARhggoE\" +\n           \"AAAAAAALAAAAR2V0UG9zaXRpb24BAT0AAC8BAEYtPQAAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElu\" +\n           \"cHV0QXJndW1lbnRzAQE+AAAuAEQ+AAAAlgEAAAABACoBARkAAAAKAAAARmlsZUhhbmRsZQAH/////wAA\" +\n           \"AAAAAQAoAQEAAAABAAAAAQAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEB\" +\n           \"PwAALgBEPwAAAJYBAAAAAQAqAQEXAAAACAAAAFBvc2l0aW9uAAn/////AAAAAAABACgBAQAAAAEAAAAB\" +\n           \"AAAAAQH/////AAAAAARhggoEAAAAAAALAAAAU2V0UG9zaXRpb24BAUAAAC8BAEktQAAAAAEB/////wEA\" +\n           \"AAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQFBAAAuAERBAAAAlgIAAAABACoBARkAAAAKAAAA\" +\n           \"RmlsZUhhbmRsZQAH/////wAAAAAAAQAqAQEXAAAACAAAAFBvc2l0aW9uAAn/////AAAAAAABACgBAQAA\" +\n           \"AAEAAAACAAAAAQH/////AAAAAARhggoEAAAAAQAOAAAAQ2xvc2VBbmRVcGRhdGUBAWoAAC8BAW8AagAA\" +\n           \"AAEB/////wEAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQFrAAAuAERrAAAAlgEAAAABACoB\" +\n           \"ARkAAAAKAAAARmlsZUhhbmRsZQAH/////wAAAAAAAQAoAQEAAAABAAAAAQAAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public WoTAssetFileTypeState WoTFile\n        {\n            get\n            {\n                return m_woTFile;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_woTFile, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_woTFile = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_woTFile != null)\n            {\n                children.Add(m_woTFile);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Asset.BrowseNames.WoTFile:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (WoTFile == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    WoTFile = new WoTAssetFileTypeState(this);\n                                }\n                                else\n                                {\n                                    WoTFile = (WoTAssetFileTypeState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = WoTFile;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private WoTAssetFileTypeState m_woTFile;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region WoTAssetTypeState Class\n#if (!OPCUA_EXCLUDE_WoTAssetTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class WoTAssetTypeState : BaseObjectState\n    {\n        #region Constructors\n        /// <remarks />\n        public WoTAssetTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Asset.ObjectTypes.WoTAssetType, Asset.Namespaces.WoT_Con, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACQAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvV29ULUNvbi//////BGCAAgEAAAABABQA\" +\n           \"AABXb1RBc3NldFR5cGVJbnN0YW5jZQEBcwABAXMAcwAAAAEAAAABAMNEAAEBKgABAAAABGCACgEAAAAB\" +\n           \"AAcAAABXb1RGaWxlAQF0AAAvAQFuAHQAAAD/////CwAAABVgiQoCAAAAAAAEAAAAU2l6ZQEBdQAALgBE\" +\n           \"dQAAAAAJ/////wEB/////wAAAAAVYIkKAgAAAAAACAAAAFdyaXRhYmxlAQF2AAAuAER2AAAAAAH/////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAAMAAAAVXNlcldyaXRhYmxlAQF3AAAuAER3AAAAAAH/////AQH/////\" +\n           \"AAAAABVgiQoCAAAAAAAJAAAAT3BlbkNvdW50AQF4AAAuAER4AAAAAAX/////AQH/////AAAAAARhggoE\" +\n           \"AAAAAAAEAAAAT3BlbgEBfAAALwEAPC18AAAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1\" +\n           \"bWVudHMBAX0AAC4ARH0AAACWAQAAAAEAKgEBEwAAAAQAAABNb2RlAAP/////AAAAAAABACgBAQAAAAEA\" +\n           \"AAABAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQF+AAAuAER+AAAAlgEA\" +\n           \"AAABACoBARkAAAAKAAAARmlsZUhhbmRsZQAH/////wAAAAAAAQAoAQEAAAABAAAAAQAAAAEB/////wAA\" +\n           \"AAAEYYIKBAAAAAAABQAAAENsb3NlAQF/AAAvAQA/LX8AAAABAf////8BAAAAF2CpCgIAAAAAAA4AAABJ\" +\n           \"bnB1dEFyZ3VtZW50cwEBgAAALgBEgAAAAJYBAAAAAQAqAQEZAAAACgAAAEZpbGVIYW5kbGUAB/////8A\" +\n           \"AAAAAAEAKAEBAAAAAQAAAAEAAAABAf////8AAAAABGGCCgQAAAAAAAQAAABSZWFkAQGBAAAvAQBBLYEA\" +\n           \"AAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBggAALgBEggAAAJYCAAAAAQAq\" +\n           \"AQEZAAAACgAAAEZpbGVIYW5kbGUAB/////8AAAAAAAEAKgEBFQAAAAYAAABMZW5ndGgABv////8AAAAA\" +\n           \"AAEAKAEBAAAAAQAAAAIAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVudHMBAYMA\" +\n           \"AC4ARIMAAACWAQAAAAEAKgEBEwAAAAQAAABEYXRhAA//////AAAAAAABACgBAQAAAAEAAAABAAAAAQH/\" +\n           \"////AAAAAARhggoEAAAAAAAFAAAAV3JpdGUBAYQAAC8BAEQthAAAAAEB/////wEAAAAXYKkKAgAAAAAA\" +\n           \"DgAAAElucHV0QXJndW1lbnRzAQGFAAAuAESFAAAAlgIAAAABACoBARkAAAAKAAAARmlsZUhhbmRsZQAH\" +\n           \"/////wAAAAAAAQAqAQETAAAABAAAAERhdGEAD/////8AAAAAAAEAKAEBAAAAAQAAAAIAAAABAf////8A\" +\n           \"AAAABGGCCgQAAAAAAAsAAABHZXRQb3NpdGlvbgEBhgAALwEARi2GAAAAAQH/////AgAAABdgqQoCAAAA\" +\n           \"AAAOAAAASW5wdXRBcmd1bWVudHMBAYcAAC4ARIcAAACWAQAAAAEAKgEBGQAAAAoAAABGaWxlSGFuZGxl\" +\n           \"AAf/////AAAAAAABACgBAQAAAAEAAAABAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJn\" +\n           \"dW1lbnRzAQGIAAAuAESIAAAAlgEAAAABACoBARcAAAAIAAAAUG9zaXRpb24ACf////8AAAAAAAEAKAEB\" +\n           \"AAAAAQAAAAEAAAABAf////8AAAAABGGCCgQAAAAAAAsAAABTZXRQb3NpdGlvbgEBiQAALwEASS2JAAAA\" +\n           \"AQH/////AQAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAYoAAC4ARIoAAACWAgAAAAEAKgEB\" +\n           \"GQAAAAoAAABGaWxlSGFuZGxlAAf/////AAAAAAABACoBARcAAAAIAAAAUG9zaXRpb24ACf////8AAAAA\" +\n           \"AAEAKAEBAAAAAQAAAAIAAAABAf////8AAAAABGGCCgQAAAABAA4AAABDbG9zZUFuZFVwZGF0ZQEBiwAA\" +\n           \"LwEBbwCLAAAAAQH/////AQAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAYwAAC4ARIwAAACW\" +\n           \"AQAAAAEAKgEBGQAAAAoAAABGaWxlSGFuZGxlAAf/////AAAAAAABACgBAQAAAAEAAAABAAAAAQH/////\" +\n           \"AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public WoTAssetFileTypeState WoTFile\n        {\n            get\n            {\n                return m_woTFile;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_woTFile, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_woTFile = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_woTFile != null)\n            {\n                children.Add(m_woTFile);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Asset.BrowseNames.WoTFile:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (WoTFile == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    WoTFile = new WoTAssetFileTypeState(this);\n                                }\n                                else\n                                {\n                                    WoTFile = (WoTAssetFileTypeState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = WoTFile;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private WoTAssetFileTypeState m_woTFile;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region WoTAssetFileTypeState Class\n#if (!OPCUA_EXCLUDE_WoTAssetFileTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class WoTAssetFileTypeState : FileState\n    {\n        #region Constructors\n        /// <remarks />\n        public WoTAssetFileTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Asset.ObjectTypes.WoTAssetFileType, Asset.Namespaces.WoT_Con, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACQAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvV29ULUNvbi//////BGCAAgEAAAABABgA\" +\n           \"AABXb1RBc3NldEZpbGVUeXBlSW5zdGFuY2UBAW4AAQFuAG4AAAD/////CwAAABVgiQgCAAAAAAAEAAAA\" +\n           \"U2l6ZQEBAAAALgBEAAn/////AQH/////AAAAABVgiQgCAAAAAAAIAAAAV3JpdGFibGUBAQAAAC4ARAAB\" +\n           \"/////wEB/////wAAAAAVYIkIAgAAAAAADAAAAFVzZXJXcml0YWJsZQEBAAAALgBEAAH/////AQH/////\" +\n           \"AAAAABVgiQgCAAAAAAAJAAAAT3BlbkNvdW50AQEAAAAuAEQABf////8BAf////8AAAAABGGCCAQAAAAA\" +\n           \"AAQAAABPcGVuAQEAAAAvAQA8LQEB/////wIAAAAXYKkIAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQEA\" +\n           \"AAAuAESWAQAAAAEAKgEBEwAAAAQAAABNb2RlAAP/////AAAAAAABACgBAQAAAAEAAAABAAAAAQH/////\" +\n           \"AAAAABdgqQgCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQEAAAAuAESWAQAAAAEAKgEBGQAAAAoAAABG\" +\n           \"aWxlSGFuZGxlAAf/////AAAAAAABACgBAQAAAAEAAAABAAAAAQH/////AAAAAARhgggEAAAAAAAFAAAA\" +\n           \"Q2xvc2UBAQAAAC8BAD8tAQH/////AQAAABdgqQgCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAQAAAC4A\" +\n           \"RJYBAAAAAQAqAQEZAAAACgAAAEZpbGVIYW5kbGUAB/////8AAAAAAAEAKAEBAAAAAQAAAAEAAAABAf//\" +\n           \"//8AAAAABGGCCAQAAAAAAAQAAABSZWFkAQEAAAAvAQBBLQEB/////wIAAAAXYKkIAgAAAAAADgAAAElu\" +\n           \"cHV0QXJndW1lbnRzAQEAAAAuAESWAgAAAAEAKgEBGQAAAAoAAABGaWxlSGFuZGxlAAf/////AAAAAAAB\" +\n           \"ACoBARUAAAAGAAAATGVuZ3RoAAb/////AAAAAAABACgBAQAAAAEAAAACAAAAAQH/////AAAAABdgqQgC\" +\n           \"AAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQEAAAAuAESWAQAAAAEAKgEBEwAAAAQAAABEYXRhAA//////\" +\n           \"AAAAAAABACgBAQAAAAEAAAABAAAAAQH/////AAAAAARhgggEAAAAAAAFAAAAV3JpdGUBAQAAAC8BAEQt\" +\n           \"AQH/////AQAAABdgqQgCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAQAAAC4ARJYCAAAAAQAqAQEZAAAA\" +\n           \"CgAAAEZpbGVIYW5kbGUAB/////8AAAAAAAEAKgEBEwAAAAQAAABEYXRhAA//////AAAAAAABACgBAQAA\" +\n           \"AAEAAAACAAAAAQH/////AAAAAARhgggEAAAAAAALAAAAR2V0UG9zaXRpb24BAQAAAC8BAEYtAQH/////\" +\n           \"AgAAABdgqQgCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAQAAAC4ARJYBAAAAAQAqAQEZAAAACgAAAEZp\" +\n           \"bGVIYW5kbGUAB/////8AAAAAAAEAKAEBAAAAAQAAAAEAAAABAf////8AAAAAF2CpCAIAAAAAAA8AAABP\" +\n           \"dXRwdXRBcmd1bWVudHMBAQAAAC4ARJYBAAAAAQAqAQEXAAAACAAAAFBvc2l0aW9uAAn/////AAAAAAAB\" +\n           \"ACgBAQAAAAEAAAABAAAAAQH/////AAAAAARhgggEAAAAAAALAAAAU2V0UG9zaXRpb24BAQAAAC8BAEkt\" +\n           \"AQH/////AQAAABdgqQgCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAQAAAC4ARJYCAAAAAQAqAQEZAAAA\" +\n           \"CgAAAEZpbGVIYW5kbGUAB/////8AAAAAAAEAKgEBFwAAAAgAAABQb3NpdGlvbgAJ/////wAAAAAAAQAo\" +\n           \"AQEAAAABAAAAAgAAAAEB/////wAAAAAEYYIKBAAAAAEADgAAAENsb3NlQW5kVXBkYXRlAQFvAAAvAQFv\" +\n           \"AG8AAAABAf////8BAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBcAAALgBEcAAAAJYBAAAA\" +\n           \"AQAqAQEZAAAACgAAAEZpbGVIYW5kbGUAB/////8AAAAAAAEAKAEBAAAAAQAAAAEAAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public CloseAndUpdateMethodState CloseAndUpdate\n        {\n            get\n            {\n                return m_closeAndUpdateMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_closeAndUpdateMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_closeAndUpdateMethod = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_closeAndUpdateMethod != null)\n            {\n                children.Add(m_closeAndUpdateMethod);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Asset.BrowseNames.CloseAndUpdate:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (CloseAndUpdate == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    CloseAndUpdate = new CloseAndUpdateMethodState(this);\n                                }\n                                else\n                                {\n                                    CloseAndUpdate = (CloseAndUpdateMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = CloseAndUpdate;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private CloseAndUpdateMethodState m_closeAndUpdateMethod;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region CreateAssetMethodState Class\n#if (!OPCUA_EXCLUDE_CreateAssetMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class CreateAssetMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public CreateAssetMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new CreateAssetMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACQAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvV29ULUNvbi//////BGGCAAQAAAABABUA\" +\n           \"AABDcmVhdGVBc3NldE1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public CreateAssetMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string assetName = (string)_inputArguments[0];\n\n            NodeId assetId = (NodeId)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    assetName,\n                    ref assetId);\n            }\n\n            _outputArguments[0] = assetId;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    public delegate ServiceResult CreateAssetMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string assetName,\n        ref NodeId assetId);\n#endif\n    #endregion\n\n    #region DeleteAssetMethodState Class\n#if (!OPCUA_EXCLUDE_DeleteAssetMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class DeleteAssetMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public DeleteAssetMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new DeleteAssetMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACQAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvV29ULUNvbi//////BGGCAAQAAAABABUA\" +\n           \"AABEZWxldGVBc3NldE1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public DeleteAssetMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            NodeId assetId = (NodeId)_inputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    assetId);\n            }\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    public delegate ServiceResult DeleteAssetMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        NodeId assetId);\n#endif\n    #endregion\n\n    #region CloseAndUpdateMethodState Class\n#if (!OPCUA_EXCLUDE_CloseAndUpdateMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class CloseAndUpdateMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public CloseAndUpdateMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new CloseAndUpdateMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACQAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvV29ULUNvbi//////BGGCAAQAAAABABgA\" +\n           \"AABDbG9zZUFuZFVwZGF0ZU1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public CloseAndUpdateMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            uint fileHandle = (uint)_inputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    fileHandle);\n            }\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    public delegate ServiceResult CloseAndUpdateMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        uint fileHandle);\n#endif\n    #endregion\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Asset/Design/Asset.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2024 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace Asset\n{\n    #region Method Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Methods\n    {\n        /// <remarks />\n        public const uint WoTAssetConnectionManagementType_CreateAsset = 26;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagementType_DeleteAsset = 29;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagement_CreateAsset = 32;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagement_DeleteAsset = 35;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Open = 51;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Close = 54;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Read = 56;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Write = 59;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_GetPosition = 61;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_SetPosition = 64;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_CloseAndUpdate = 106;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Open = 124;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Close = 127;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Read = 129;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Write = 132;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_GetPosition = 134;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_SetPosition = 137;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_CloseAndUpdate = 139;\n\n        /// <remarks />\n        public const uint WoTAssetFileType_CloseAndUpdate = 111;\n\n        /// <remarks />\n        public const string WoTAssetConnectionManagementType_CreateAssetMethodType = \"\";\n\n        /// <remarks />\n        public const string WoTAssetConnectionManagementType_DeleteAssetMethodType = \"\";\n\n        /// <remarks />\n        public const string WoTAssetFileType_CloseAndUpdateMethodType = \"\";\n    }\n    #endregion\n\n    #region Object Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <remarks />\n        public const uint WoTAssetConnectionManagementType_WoTAssetName_Placeholder = 2;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagement = 31;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile = 43;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile = 116;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <remarks />\n        public const uint WoTAssetConnectionManagementType = 1;\n\n        /// <remarks />\n        public const uint IWoTAssetType = 42;\n\n        /// <remarks />\n        public const uint WoTAssetType = 115;\n\n        /// <remarks />\n        public const uint WoTAssetFileType = 110;\n    }\n    #endregion\n\n    #region ReferenceType Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ReferenceTypes\n    {\n        /// <remarks />\n        public const uint HasWoTComponent = 142;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <remarks />\n        public const uint WoTAssetConnectionManagementType_CreateAsset_InputArguments = 27;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagementType_CreateAsset_OutputArguments = 28;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagementType_DeleteAsset_InputArguments = 30;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagement_CreateAsset_InputArguments = 33;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagement_CreateAsset_OutputArguments = 34;\n\n        /// <remarks />\n        public const uint WoTAssetConnectionManagement_DeleteAsset_InputArguments = 36;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Size = 44;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Writable = 45;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_UserWritable = 46;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_OpenCount = 47;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Open_InputArguments = 52;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Open_OutputArguments = 53;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Close_InputArguments = 55;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Read_InputArguments = 57;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Read_OutputArguments = 58;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_Write_InputArguments = 60;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_GetPosition_InputArguments = 62;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_GetPosition_OutputArguments = 63;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_SetPosition_InputArguments = 65;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTFile_CloseAndUpdate_InputArguments = 107;\n\n        /// <remarks />\n        public const uint IWoTAssetType_WoTPropertyName_Placeholder = 66;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Size = 117;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Writable = 118;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_UserWritable = 119;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_OpenCount = 120;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Open_InputArguments = 125;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Open_OutputArguments = 126;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Close_InputArguments = 128;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Read_InputArguments = 130;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Read_OutputArguments = 131;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_Write_InputArguments = 133;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_GetPosition_InputArguments = 135;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_GetPosition_OutputArguments = 136;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_SetPosition_InputArguments = 138;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTFile_CloseAndUpdate_InputArguments = 140;\n\n        /// <remarks />\n        public const uint WoTAssetType_WoTPropertyName_Placeholder = 141;\n\n        /// <remarks />\n        public const uint WoTAssetFileType_CloseAndUpdate_InputArguments = 112;\n    }\n    #endregion\n\n    #region Method Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class MethodIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType_CreateAsset = new ExpandedNodeId(Asset.Methods.WoTAssetConnectionManagementType_CreateAsset, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType_DeleteAsset = new ExpandedNodeId(Asset.Methods.WoTAssetConnectionManagementType_DeleteAsset, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagement_CreateAsset = new ExpandedNodeId(Asset.Methods.WoTAssetConnectionManagement_CreateAsset, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagement_DeleteAsset = new ExpandedNodeId(Asset.Methods.WoTAssetConnectionManagement_DeleteAsset, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Open = new ExpandedNodeId(Asset.Methods.IWoTAssetType_WoTFile_Open, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Close = new ExpandedNodeId(Asset.Methods.IWoTAssetType_WoTFile_Close, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Read = new ExpandedNodeId(Asset.Methods.IWoTAssetType_WoTFile_Read, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Write = new ExpandedNodeId(Asset.Methods.IWoTAssetType_WoTFile_Write, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_GetPosition = new ExpandedNodeId(Asset.Methods.IWoTAssetType_WoTFile_GetPosition, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_SetPosition = new ExpandedNodeId(Asset.Methods.IWoTAssetType_WoTFile_SetPosition, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_CloseAndUpdate = new ExpandedNodeId(Asset.Methods.IWoTAssetType_WoTFile_CloseAndUpdate, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Open = new ExpandedNodeId(Asset.Methods.WoTAssetType_WoTFile_Open, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Close = new ExpandedNodeId(Asset.Methods.WoTAssetType_WoTFile_Close, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Read = new ExpandedNodeId(Asset.Methods.WoTAssetType_WoTFile_Read, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Write = new ExpandedNodeId(Asset.Methods.WoTAssetType_WoTFile_Write, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_GetPosition = new ExpandedNodeId(Asset.Methods.WoTAssetType_WoTFile_GetPosition, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_SetPosition = new ExpandedNodeId(Asset.Methods.WoTAssetType_WoTFile_SetPosition, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_CloseAndUpdate = new ExpandedNodeId(Asset.Methods.WoTAssetType_WoTFile_CloseAndUpdate, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetFileType_CloseAndUpdate = new ExpandedNodeId(Asset.Methods.WoTAssetFileType_CloseAndUpdate, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType_CreateAssetMethodType = new ExpandedNodeId(Asset.Methods.WoTAssetConnectionManagementType_CreateAssetMethodType, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType_DeleteAssetMethodType = new ExpandedNodeId(Asset.Methods.WoTAssetConnectionManagementType_DeleteAssetMethodType, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetFileType_CloseAndUpdateMethodType = new ExpandedNodeId(Asset.Methods.WoTAssetFileType_CloseAndUpdateMethodType, Asset.Namespaces.WoT_Con);\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType_WoTAssetName_Placeholder = new ExpandedNodeId(Asset.Objects.WoTAssetConnectionManagementType_WoTAssetName_Placeholder, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagement = new ExpandedNodeId(Asset.Objects.WoTAssetConnectionManagement, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile = new ExpandedNodeId(Asset.Objects.IWoTAssetType_WoTFile, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile = new ExpandedNodeId(Asset.Objects.WoTAssetType_WoTFile, Asset.Namespaces.WoT_Con);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType = new ExpandedNodeId(Asset.ObjectTypes.WoTAssetConnectionManagementType, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType = new ExpandedNodeId(Asset.ObjectTypes.IWoTAssetType, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType = new ExpandedNodeId(Asset.ObjectTypes.WoTAssetType, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetFileType = new ExpandedNodeId(Asset.ObjectTypes.WoTAssetFileType, Asset.Namespaces.WoT_Con);\n    }\n    #endregion\n\n    #region ReferenceType Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ReferenceTypeIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId HasWoTComponent = new ExpandedNodeId(Asset.ReferenceTypes.HasWoTComponent, Asset.Namespaces.WoT_Con);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType_CreateAsset_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetConnectionManagementType_CreateAsset_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType_CreateAsset_OutputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetConnectionManagementType_CreateAsset_OutputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagementType_DeleteAsset_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetConnectionManagementType_DeleteAsset_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagement_CreateAsset_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetConnectionManagement_CreateAsset_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagement_CreateAsset_OutputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetConnectionManagement_CreateAsset_OutputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetConnectionManagement_DeleteAsset_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetConnectionManagement_DeleteAsset_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Size = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_Size, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Writable = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_Writable, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_UserWritable = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_UserWritable, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_OpenCount = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_OpenCount, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Open_InputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_Open_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Open_OutputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_Open_OutputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Close_InputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_Close_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Read_InputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_Read_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Read_OutputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_Read_OutputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_Write_InputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_Write_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_GetPosition_InputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_GetPosition_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_GetPosition_OutputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_GetPosition_OutputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_SetPosition_InputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_SetPosition_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTFile_CloseAndUpdate_InputArguments = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTFile_CloseAndUpdate_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId IWoTAssetType_WoTPropertyName_Placeholder = new ExpandedNodeId(Asset.Variables.IWoTAssetType_WoTPropertyName_Placeholder, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Size = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_Size, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Writable = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_Writable, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_UserWritable = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_UserWritable, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_OpenCount = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_OpenCount, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Open_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_Open_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Open_OutputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_Open_OutputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Close_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_Close_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Read_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_Read_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Read_OutputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_Read_OutputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_Write_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_Write_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_GetPosition_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_GetPosition_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_GetPosition_OutputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_GetPosition_OutputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_SetPosition_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_SetPosition_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTFile_CloseAndUpdate_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTFile_CloseAndUpdate_InputArguments, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetType_WoTPropertyName_Placeholder = new ExpandedNodeId(Asset.Variables.WoTAssetType_WoTPropertyName_Placeholder, Asset.Namespaces.WoT_Con);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId WoTAssetFileType_CloseAndUpdate_InputArguments = new ExpandedNodeId(Asset.Variables.WoTAssetFileType_CloseAndUpdate_InputArguments, Asset.Namespaces.WoT_Con);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <remarks />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <remarks />\n        public const string CloseAndUpdate = \"CloseAndUpdate\";\n\n        /// <remarks />\n        public const string CloseAndUpdateMethodType = \"CloseAndUpdateMethodType\";\n\n        /// <remarks />\n        public const string CreateAsset = \"CreateAsset\";\n\n        /// <remarks />\n        public const string CreateAssetMethodType = \"CreateAssetMethodType\";\n\n        /// <remarks />\n        public const string DeleteAsset = \"DeleteAsset\";\n\n        /// <remarks />\n        public const string DeleteAssetMethodType = \"DeleteAssetMethodType\";\n\n        /// <remarks />\n        public const string HasWoTComponent = \"HasWoTComponent\";\n\n        /// <remarks />\n        public const string IWoTAssetType = \"IWoTAssetType\";\n\n        /// <remarks />\n        public const string WoTAssetConnectionManagement = \"WoTAssetConnectionManagement\";\n\n        /// <remarks />\n        public const string WoTAssetConnectionManagementType = \"WoTAssetConnectionManagementType\";\n\n        /// <remarks />\n        public const string WoTAssetFileType = \"WoTAssetFileType\";\n\n        /// <remarks />\n        public const string WoTAssetName_Placeholder = \"<WoTAssetName>\";\n\n        /// <remarks />\n        public const string WoTAssetType = \"WoTAssetType\";\n\n        /// <remarks />\n        public const string WoTFile = \"WoTFile\";\n\n        /// <remarks />\n        public const string WoTPropertyName_Placeholder = \"<WoTPropertyName>\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <remarks />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the WoT_Con namespace (.NET code namespace is 'UAModel.WoT_Con').\n        /// </summary>\n        public const string WoT_Con = \"http://opcfoundation.org/UA/WoT-Con/\";\n\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n    }\n    #endregion\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Asset/Design/Asset.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n * Copyright (c) 2005-2024 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n-->\n\n<UANodeSet xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" LastModified=\"2024-04-20T00:00:00Z\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/WoT-Con/</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/WoT-Con/\" Version=\"1.00.0\" PublicationDate=\"2024-04-20T00:00:00Z\" ModelVersion=\"1.0.0\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" XmlSchemaUri=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" Version=\"1.05.02\" PublicationDate=\"2022-06-28T00:00:00Z\" ModelVersion=\"1.5.2\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n    <Alias Alias=\"HasCause\">i=53</Alias>\n    <Alias Alias=\"ToState\">i=52</Alias>\n    <Alias Alias=\"FromState\">i=51</Alias>\n    <Alias Alias=\"HasEffect\">i=54</Alias>\n    <Alias Alias=\"HasTrueSubState\">i=9004</Alias>\n    <Alias Alias=\"HasFalseSubState\">i=9005</Alias>\n    <Alias Alias=\"HasDictionaryEntry\">i=17597</Alias>\n    <Alias Alias=\"HasCondition\">i=9006</Alias>\n    <Alias Alias=\"HasGuard\">i=15112</Alias>\n    <Alias Alias=\"HasAddIn\">i=17604</Alias>\n    <Alias Alias=\"HasInterface\">i=17603</Alias>\n  </Aliases>\n  <UAObject NodeId=\"ns=1;i=67\" BrowseName=\"1:http://opcfoundation.org/UA/WoT-Con/\" SymbolicName=\"WotConNamespaceMetadata\">\n    <DisplayName>http://opcfoundation.org/UA/WoT-Con/</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/8.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=69</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=70</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=71</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=72</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=73</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=74</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=99</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=100</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=101</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=11715</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=11616</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=68\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=67\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/WoT-Con/</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=69\" BrowseName=\"NamespaceVersion\" ParentNodeId=\"ns=1;i=67\" DataType=\"String\">\n    <DisplayName>NamespaceVersion</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1.00.0</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=70\" BrowseName=\"NamespacePublicationDate\" ParentNodeId=\"ns=1;i=67\" DataType=\"DateTime\">\n    <DisplayName>NamespacePublicationDate</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n    <Value>\n      <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2024-04-20T00:00:00Z</DateTime>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=71\" BrowseName=\"IsNamespaceSubset\" ParentNodeId=\"ns=1;i=67\" DataType=\"Boolean\">\n    <DisplayName>IsNamespaceSubset</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=72\" BrowseName=\"StaticNodeIdTypes\" ParentNodeId=\"ns=1;i=67\" DataType=\"i=256\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StaticNodeIdTypes</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n    <Value>\n      <ListOfInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <Int32>0</Int32>\n      </ListOfInt32>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=73\" BrowseName=\"StaticNumericNodeIdRange\" ParentNodeId=\"ns=1;i=67\" DataType=\"i=291\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StaticNumericNodeIdRange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n    <Value>\n      <ListOfString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <String>1:2147483647</String>\n      </ListOfString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=74\" BrowseName=\"StaticStringNodeIdPattern\" ParentNodeId=\"ns=1;i=67\" DataType=\"String\">\n    <DisplayName>StaticStringNodeIdPattern</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=99\" BrowseName=\"DefaultRolePermissions\" ParentNodeId=\"ns=1;i=67\" DataType=\"i=96\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DefaultRolePermissions</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=100\" BrowseName=\"DefaultUserRolePermissions\" ParentNodeId=\"ns=1;i=67\" DataType=\"i=96\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DefaultUserRolePermissions</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=101\" BrowseName=\"DefaultAccessRestrictions\" ParentNodeId=\"ns=1;i=67\" DataType=\"i=95\">\n    <DisplayName>DefaultAccessRestrictions</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=67</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1\" BrowseName=\"1:WoTAssetConnectionManagementType\">\n    <DisplayName>WoTAssetConnectionManagementType</DisplayName>\n    <Category>WoT Connectivity Base Functionality</Category>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.3.1/#6.3.1.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"Organizes\">ns=1;i=2</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=26</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=29</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=2\" BrowseName=\"1:&lt;WoTAssetName&gt;\" SymbolicName=\"WoTAssetName_Placeholder\" ParentNodeId=\"ns=1;i=1\">\n    <DisplayName>&lt;WoTAssetName&gt;</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasInterface\">ns=1;i=42</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=58</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=11508</Reference>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">ns=1;i=1</Reference>\n    </References>\n  </UAObject>\n  <UAMethod NodeId=\"ns=1;i=26\" BrowseName=\"1:CreateAsset\" ParentNodeId=\"ns=1;i=1\">\n    <DisplayName>CreateAsset</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.3.1/#6.3.1.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=27</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=28</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=27\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=26\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=26</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>AssetName</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=28\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=26\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=26</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>AssetId</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=29\" BrowseName=\"1:DeleteAsset\" ParentNodeId=\"ns=1;i=1\">\n    <DisplayName>DeleteAsset</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.3.1/#6.3.1.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=30</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=30\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=29\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=29</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>AssetId</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=31\" BrowseName=\"1:WoTAssetConnectionManagement\">\n    <DisplayName>WoTAssetConnectionManagement</DisplayName>\n    <Category>WoT Connectivity Base Functionality</Category>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=32</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=35</Reference>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=2253</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1</Reference>\n    </References>\n  </UAObject>\n  <UAMethod NodeId=\"ns=1;i=32\" BrowseName=\"1:CreateAsset\" ParentNodeId=\"ns=1;i=31\" MethodDeclarationId=\"ns=1;i=26\">\n    <DisplayName>CreateAsset</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=33</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=34</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=31</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=33\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=32\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=32</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>AssetName</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=34\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=32\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=32</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>AssetId</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=35\" BrowseName=\"1:DeleteAsset\" ParentNodeId=\"ns=1;i=31\" MethodDeclarationId=\"ns=1;i=29\">\n    <DisplayName>DeleteAsset</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=36</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=31</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=36\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=35\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=35</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>AssetId</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=42\" BrowseName=\"1:IWoTAssetType\" IsAbstract=\"true\">\n    <DisplayName>IWoTAssetType</DisplayName>\n    <Category>WoT Connectivity Base Functionality</Category>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.3.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=43</Reference>\n      <Reference ReferenceType=\"ns=1;i=142\">ns=1;i=66</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=17602</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=43\" BrowseName=\"1:WoTFile\" ParentNodeId=\"ns=1;i=42\">\n    <DisplayName>WoTFile</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=44</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=45</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=46</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=47</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=51</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=54</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=56</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=59</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=61</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=64</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=106</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=110</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=42</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=44\" BrowseName=\"Size\" ParentNodeId=\"ns=1;i=43\" DataType=\"UInt64\">\n    <DisplayName>Size</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=45\" BrowseName=\"Writable\" ParentNodeId=\"ns=1;i=43\" DataType=\"Boolean\">\n    <DisplayName>Writable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=46\" BrowseName=\"UserWritable\" ParentNodeId=\"ns=1;i=43\" DataType=\"Boolean\">\n    <DisplayName>UserWritable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=47\" BrowseName=\"OpenCount\" ParentNodeId=\"ns=1;i=43\" DataType=\"UInt16\">\n    <DisplayName>OpenCount</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=51\" BrowseName=\"Open\" ParentNodeId=\"ns=1;i=43\" MethodDeclarationId=\"i=11580\">\n    <DisplayName>Open</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=52</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=53</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=52\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=51\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=51</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Mode</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=53\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=51\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=51</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=54\" BrowseName=\"Close\" ParentNodeId=\"ns=1;i=43\" MethodDeclarationId=\"i=11583\">\n    <DisplayName>Close</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=55</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=55\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=54\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=54</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=56\" BrowseName=\"Read\" ParentNodeId=\"ns=1;i=43\" MethodDeclarationId=\"i=11585\">\n    <DisplayName>Read</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=57</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=58</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=57\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=56\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=56</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Length</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=58\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=56\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=56</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Data</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=59\" BrowseName=\"Write\" ParentNodeId=\"ns=1;i=43\" MethodDeclarationId=\"i=11588\">\n    <DisplayName>Write</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=60</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=60\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=59\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=59</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Data</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=61\" BrowseName=\"GetPosition\" ParentNodeId=\"ns=1;i=43\" MethodDeclarationId=\"i=11590\">\n    <DisplayName>GetPosition</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=62</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=62\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=61\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=61</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=63\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=61\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=61</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Position</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=64\" BrowseName=\"SetPosition\" ParentNodeId=\"ns=1;i=43\" MethodDeclarationId=\"i=11593\">\n    <DisplayName>SetPosition</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=65</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=65\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=64\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=64</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Position</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=106\" BrowseName=\"1:CloseAndUpdate\" ParentNodeId=\"ns=1;i=43\" MethodDeclarationId=\"ns=1;i=111\">\n    <DisplayName>CloseAndUpdate</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=107</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=43</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=107\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=106\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=106</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=66\" BrowseName=\"1:&lt;WoTPropertyName&gt;\" SymbolicName=\"WoTPropertyName_Placeholder\" ParentNodeId=\"ns=1;i=42\">\n    <DisplayName>&lt;WoTPropertyName&gt;</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=11508</Reference>\n      <Reference ReferenceType=\"ns=1;i=142\" IsForward=\"false\">ns=1;i=42</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=115\" BrowseName=\"1:WoTAssetType\">\n    <DisplayName>WoTAssetType</DisplayName>\n    <Category>WoT Connectivity Base Functionality</Category>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.3.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=116</Reference>\n      <Reference ReferenceType=\"ns=1;i=142\">ns=1;i=141</Reference>\n      <Reference ReferenceType=\"HasInterface\">ns=1;i=42</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=116\" BrowseName=\"1:WoTFile\" ParentNodeId=\"ns=1;i=115\">\n    <DisplayName>WoTFile</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=117</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=118</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=119</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=120</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=124</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=127</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=129</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=132</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=134</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=137</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=139</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=110</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=115</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=117\" BrowseName=\"Size\" ParentNodeId=\"ns=1;i=116\" DataType=\"UInt64\">\n    <DisplayName>Size</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=118\" BrowseName=\"Writable\" ParentNodeId=\"ns=1;i=116\" DataType=\"Boolean\">\n    <DisplayName>Writable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=119\" BrowseName=\"UserWritable\" ParentNodeId=\"ns=1;i=116\" DataType=\"Boolean\">\n    <DisplayName>UserWritable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=120\" BrowseName=\"OpenCount\" ParentNodeId=\"ns=1;i=116\" DataType=\"UInt16\">\n    <DisplayName>OpenCount</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=124\" BrowseName=\"Open\" ParentNodeId=\"ns=1;i=116\" MethodDeclarationId=\"i=11580\">\n    <DisplayName>Open</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=125</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=126</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=125\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=124\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=124</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Mode</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=126\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=124\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=124</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=127\" BrowseName=\"Close\" ParentNodeId=\"ns=1;i=116\" MethodDeclarationId=\"i=11583\">\n    <DisplayName>Close</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=128</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=128\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=127\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=127</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=129\" BrowseName=\"Read\" ParentNodeId=\"ns=1;i=116\" MethodDeclarationId=\"i=11585\">\n    <DisplayName>Read</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=130</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=131</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=130\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=129\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=129</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Length</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=131\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=129\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=129</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Data</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=132\" BrowseName=\"Write\" ParentNodeId=\"ns=1;i=116\" MethodDeclarationId=\"i=11588\">\n    <DisplayName>Write</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=133</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=133\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=132\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=132</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Data</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=134\" BrowseName=\"GetPosition\" ParentNodeId=\"ns=1;i=116\" MethodDeclarationId=\"i=11590\">\n    <DisplayName>GetPosition</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=135</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=136</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=135\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=134\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=134</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=136\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=134\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=134</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Position</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=137\" BrowseName=\"SetPosition\" ParentNodeId=\"ns=1;i=116\" MethodDeclarationId=\"i=11593\">\n    <DisplayName>SetPosition</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=138</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=138\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=137\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=137</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Position</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=139\" BrowseName=\"1:CloseAndUpdate\" ParentNodeId=\"ns=1;i=116\" MethodDeclarationId=\"ns=1;i=111\">\n    <DisplayName>CloseAndUpdate</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=140</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=116</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=140\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=139\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=139</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=141\" BrowseName=\"1:&lt;WoTPropertyName&gt;\" SymbolicName=\"WoTPropertyName_Placeholder\" ParentNodeId=\"ns=1;i=115\">\n    <DisplayName>&lt;WoTPropertyName&gt;</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=11508</Reference>\n      <Reference ReferenceType=\"ns=1;i=142\" IsForward=\"false\">ns=1;i=115</Reference>\n    </References>\n  </UAVariable>\n  <UAReferenceType NodeId=\"ns=1;i=142\" BrowseName=\"1:HasWoTComponent\">\n    <DisplayName>HasWoTComponent</DisplayName>\n    <Category>WoT Connectivity Base Functionality</Category>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.3.4</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=47</Reference>\n    </References>\n    <InverseName>WoTComponentOf</InverseName>\n  </UAReferenceType>\n  <UAObjectType NodeId=\"ns=1;i=110\" BrowseName=\"1:WoTAssetFileType\">\n    <DisplayName>WoTAssetFileType</DisplayName>\n    <Category>WoT Connectivity Base Functionality</Category>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.3.3/#6.3.3.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=111</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=11575</Reference>\n    </References>\n  </UAObjectType>\n  <UAMethod NodeId=\"ns=1;i=111\" BrowseName=\"1:CloseAndUpdate\" ParentNodeId=\"ns=1;i=110\">\n    <DisplayName>CloseAndUpdate</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/WoT/v100/docs/6.3.3/#6.3.3.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=112</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=110</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=112\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=111\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=111</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FileHandle</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/Boiler.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\n\nnamespace Boiler\n{\n    #region GenericControllerState Class\n#if !OPCUA_EXCLUDE_GenericControllerState\n    /// <summary>\n    /// Stores an instance of the GenericControllerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class GenericControllerState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public GenericControllerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.GenericControllerType, Namespaces.Boiler, namespaceUris);\n        }\n\n#if !OPCUA_EXCLUDE_InitializationStrings\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAHQAA\" +\n           \"AEdlbmVyaWNDb250cm9sbGVyVHlwZUluc3RhbmNlAQHSAAEB0gDSAAAA/////wMAAAAVYIkKAgAAAAEA\" +\n           \"CwAAAE1lYXN1cmVtZW50AQHcAwAuAETcAwAAAAv/////AQH/////AAAAABVgiQoCAAAAAQAIAAAAU2V0\" +\n           \"UG9pbnQBAd0DAC4ARN0DAAAAC/////8DA/////8AAAAAFWCJCgIAAAABAAoAAABDb250cm9sT3V0AQHe\" +\n           \"AwAuAETeAwAAAAv/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<double> Measurement\n        {\n            get\n            {\n                return m_measurement;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_measurement, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_measurement = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<double> SetPoint\n        {\n            get\n            {\n                return m_setPoint;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_setPoint, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_setPoint = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<double> ControlOut\n        {\n            get\n            {\n                return m_controlOut;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_controlOut, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_controlOut = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_measurement != null)\n            {\n                children.Add(m_measurement);\n            }\n\n            if (m_setPoint != null)\n            {\n                children.Add(m_setPoint);\n            }\n\n            if (m_controlOut != null)\n            {\n                children.Add(m_controlOut);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.Measurement:\n                    {\n                        if (createOrReplace && Measurement == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Measurement = new PropertyState<double>(this);\n                            }\n                            else\n                            {\n                                Measurement = (PropertyState<double>)replacement;\n                            }\n                        }\n\n                        instance = Measurement;\n                        break;\n                    }\n\n                case BrowseNames.SetPoint:\n                    {\n                        if (createOrReplace && SetPoint == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SetPoint = new PropertyState<double>(this);\n                            }\n                            else\n                            {\n                                SetPoint = (PropertyState<double>)replacement;\n                            }\n                        }\n\n                        instance = SetPoint;\n                        break;\n                    }\n\n                case BrowseNames.ControlOut:\n                    {\n                        if (createOrReplace && ControlOut == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ControlOut = new PropertyState<double>(this);\n                            }\n                            else\n                            {\n                                ControlOut = (PropertyState<double>)replacement;\n                            }\n                        }\n\n                        instance = ControlOut;\n                        break;\n                    }\n            }\n\n            return instance ?? base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<double> m_measurement;\n        private PropertyState<double> m_setPoint;\n        private PropertyState<double> m_controlOut;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region GenericSensorState Class\n#if (!OPCUA_EXCLUDE_GenericSensorState)\n    /// <summary>\n    /// Stores an instance of the GenericSensorType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class GenericSensorState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public GenericSensorState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.GenericSensorType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAGQAA\" +\n           \"AEdlbmVyaWNTZW5zb3JUeXBlSW5zdGFuY2UBAd8DAQHfA98DAAD/////AQAAABVgiQoCAAAAAQAGAAAA\" +\n           \"T3V0cHV0AQHgAwAvAQBACeADAAAAC/////8BAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQHj\" +\n           \"AwAuAETjAwAAAQB0A/////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public AnalogItemState<double> Output\n        {\n            get\n            {\n                return m_output;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_output, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_output = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_output != null)\n            {\n                children.Add(m_output);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Boiler.BrowseNames.Output:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Output == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Output = new AnalogItemState<double>(this);\n                                }\n                                else\n                                {\n                                    Output = (AnalogItemState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Output;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private AnalogItemState<double> m_output;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region GenericActuatorState Class\n#if (!OPCUA_EXCLUDE_GenericActuatorState)\n    /// <summary>\n    /// Stores an instance of the GenericActuatorType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class GenericActuatorState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public GenericActuatorState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.GenericActuatorType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAGwAA\" +\n           \"AEdlbmVyaWNBY3R1YXRvclR5cGVJbnN0YW5jZQEB5gMBAeYD5gMAAP////8BAAAAFWCJCgIAAAABAAUA\" +\n           \"AABJbnB1dAEB5wMALwEAQAnnAwAAAAv/////AgL/////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEB\" +\n           \"6gMALgBE6gMAAAEAdAP/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public AnalogItemState<double> Input\n        {\n            get\n            {\n                return m_input;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_input, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_input = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_input != null)\n            {\n                children.Add(m_input);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Boiler.BrowseNames.Input:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Input == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Input = new AnalogItemState<double>(this);\n                                }\n                                else\n                                {\n                                    Input = (AnalogItemState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Input;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private AnalogItemState<double> m_input;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region CustomControllerState Class\n#if (!OPCUA_EXCLUDE_CustomControllerState)\n    /// <summary>\n    /// Stores an instance of the CustomControllerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class CustomControllerState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public CustomControllerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.CustomControllerType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAHAAA\" +\n           \"AEN1c3RvbUNvbnRyb2xsZXJUeXBlSW5zdGFuY2UBAQECAQEBAgECAAD/////BQAAABVgiQoCAAAAAQAG\" +\n           \"AAAASW5wdXQxAQHtAwAuAETtAwAAAAv/////AgL/////AAAAABVgiQoCAAAAAQAGAAAASW5wdXQyAQHu\" +\n           \"AwAuAETuAwAAAAv/////AgL/////AAAAABVgiQoCAAAAAQAGAAAASW5wdXQzAQHvAwAuAETvAwAAAAv/\" +\n           \"////AgL/////AAAAABVgiQoCAAAAAQAKAAAAQ29udHJvbE91dAEB8AMALgBE8AMAAAAL/////wEB////\" +\n           \"/wAAAAAVYMkKAgAAAAwAAABEZXNjcmlwdGlvblgBAAsAAABEZXNjcmlwdGlvbgEB8QMALgBE8QMAAAAV\" +\n           \"/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<double> Input1\n        {\n            get\n            {\n                return m_input1;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_input1, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_input1 = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<double> Input2\n        {\n            get\n            {\n                return m_input2;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_input2, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_input2 = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<double> Input3\n        {\n            get\n            {\n                return m_input3;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_input3, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_input3 = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<double> ControlOut\n        {\n            get\n            {\n                return m_controlOut;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_controlOut, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_controlOut = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<LocalizedText> DescriptionX\n        {\n            get\n            {\n                return m_descriptionX;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_descriptionX, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_descriptionX = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_input1 != null)\n            {\n                children.Add(m_input1);\n            }\n\n            if (m_input2 != null)\n            {\n                children.Add(m_input2);\n            }\n\n            if (m_input3 != null)\n            {\n                children.Add(m_input3);\n            }\n\n            if (m_controlOut != null)\n            {\n                children.Add(m_controlOut);\n            }\n\n            if (m_descriptionX != null)\n            {\n                children.Add(m_descriptionX);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Boiler.BrowseNames.Input1:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Input1 == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Input1 = new PropertyState<double>(this);\n                                }\n                                else\n                                {\n                                    Input1 = (PropertyState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Input1;\n                        break;\n                    }\n\n                case Boiler.BrowseNames.Input2:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Input2 == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Input2 = new PropertyState<double>(this);\n                                }\n                                else\n                                {\n                                    Input2 = (PropertyState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Input2;\n                        break;\n                    }\n\n                case Boiler.BrowseNames.Input3:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Input3 == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Input3 = new PropertyState<double>(this);\n                                }\n                                else\n                                {\n                                    Input3 = (PropertyState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Input3;\n                        break;\n                    }\n\n                case Boiler.BrowseNames.ControlOut:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (ControlOut == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    ControlOut = new PropertyState<double>(this);\n                                }\n                                else\n                                {\n                                    ControlOut = (PropertyState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = ControlOut;\n                        break;\n                    }\n\n                case Boiler.BrowseNames.DescriptionX:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (DescriptionX == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    DescriptionX = new PropertyState<LocalizedText>(this);\n                                }\n                                else\n                                {\n                                    DescriptionX = (PropertyState<LocalizedText>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = DescriptionX;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<double> m_input1;\n        private PropertyState<double> m_input2;\n        private PropertyState<double> m_input3;\n        private PropertyState<double> m_controlOut;\n        private PropertyState<LocalizedText> m_descriptionX;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ValveState Class\n#if (!OPCUA_EXCLUDE_ValveState)\n    /// <summary>\n    /// Stores an instance of the ValveType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ValveState : GenericActuatorState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public ValveState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.ValveType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAEQAA\" +\n           \"AFZhbHZlVHlwZUluc3RhbmNlAQHyAwEB8gPyAwAA/////wEAAAAVYIkKAgAAAAEABQAAAElucHV0AQHz\" +\n           \"AwAvAQBACfMDAAAAC/////8CAv////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQH2AwAuAET2AwAA\" +\n           \"AQB0A/////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region LevelControllerState Class\n#if (!OPCUA_EXCLUDE_LevelControllerState)\n    /// <summary>\n    /// Stores an instance of the LevelControllerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class LevelControllerState : GenericControllerState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public LevelControllerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.LevelControllerType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAGwAA\" +\n           \"AExldmVsQ29udHJvbGxlclR5cGVJbnN0YW5jZQEB+QMBAfkD+QMAAP////8DAAAAFWCJCgIAAAABAAsA\" +\n           \"AABNZWFzdXJlbWVudAEB+gMALgBE+gMAAAAL/////wEB/////wAAAAAVYIkKAgAAAAEACAAAAFNldFBv\" +\n           \"aW50AQH7AwAuAET7AwAAAAv/////AwP/////AAAAABVgiQoCAAAAAQAKAAAAQ29udHJvbE91dAEB/AMA\" +\n           \"LgBE/AMAAAAL/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region FlowControllerState Class\n#if (!OPCUA_EXCLUDE_FlowControllerState)\n    /// <summary>\n    /// Stores an instance of the FlowControllerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class FlowControllerState : GenericControllerState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public FlowControllerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.FlowControllerType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAGgAA\" +\n           \"AEZsb3dDb250cm9sbGVyVHlwZUluc3RhbmNlAQH9AwEB/QP9AwAA/////wMAAAAVYIkKAgAAAAEACwAA\" +\n           \"AE1lYXN1cmVtZW50AQH+AwAuAET+AwAAAAv/////AQH/////AAAAABVgiQoCAAAAAQAIAAAAU2V0UG9p\" +\n           \"bnQBAf8DAC4ARP8DAAAAC/////8DA/////8AAAAAFWCJCgIAAAABAAoAAABDb250cm9sT3V0AQEABAAu\" +\n           \"AEQABAAAAAv/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region LevelIndicatorState Class\n#if (!OPCUA_EXCLUDE_LevelIndicatorState)\n    /// <summary>\n    /// Stores an instance of the LevelIndicatorType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class LevelIndicatorState : GenericSensorState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public LevelIndicatorState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.LevelIndicatorType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAGgAA\" +\n           \"AExldmVsSW5kaWNhdG9yVHlwZUluc3RhbmNlAQEBBAEBAQQBBAAA/////wEAAAAVYIkKAgAAAAEABgAA\" +\n           \"AE91dHB1dAEBAgQALwEAQAkCBAAAAAv/////AQH/////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEB\" +\n           \"BQQALgBEBQQAAAEAdAP/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region FlowTransmitterState Class\n#if (!OPCUA_EXCLUDE_FlowTransmitterState)\n    /// <summary>\n    /// Stores an instance of the FlowTransmitterType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class FlowTransmitterState : GenericSensorState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public FlowTransmitterState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.FlowTransmitterType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAGwAA\" +\n           \"AEZsb3dUcmFuc21pdHRlclR5cGVJbnN0YW5jZQEBCAQBAQgECAQAAP////8BAAAAFWCJCgIAAAABAAYA\" +\n           \"AABPdXRwdXQBAQkEAC8BAEAJCQQAAAAL/////wEB/////wEAAAAVYIkKAgAAAAAABwAAAEVVUmFuZ2UB\" +\n           \"AQwEAC4ARAwEAAABAHQD/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region BoilerStateMachineState Class\n#if !OPCUA_EXCLUDE_BoilerStateMachineState\n    /// <summary>\n    /// Stores an instance of the BoilerStateMachineType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class BoilerStateMachineState : ProgramStateMachineState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public BoilerStateMachineState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.BoilerStateMachineType, Namespaces.Boiler, namespaceUris);\n        }\n\n#if !OPCUA_EXCLUDE_InitializationStrings\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAHgAA\" +\n           \"AEJvaWxlclN0YXRlTWFjaGluZVR5cGVJbnN0YW5jZQEBDwQBAQ8EDwQAAP////8LAAAAFWCJCgIAAAAA\" +\n           \"AAwAAABDdXJyZW50U3RhdGUBARAEAC8BAMgKEAQAAAAV/////wEB/////wIAAAAVYIkKAgAAAAAAAgAA\" +\n           \"AElkAQERBAAuAEQRBAAAABH/////AQH/////AAAAABVgiQoCAAAAAAAGAAAATnVtYmVyAQETBAAuAEQT\" +\n           \"BAAAAAf/////AQH/////AAAAABVgiQoCAAAAAAAOAAAATGFzdFRyYW5zaXRpb24BARUEAC8BAM8KFQQA\" +\n           \"AAAV/////wEB/////wMAAAAVYIkKAgAAAAAAAgAAAElkAQEWBAAuAEQWBAAAABH/////AQH/////AAAA\" +\n           \"ABVgiQoCAAAAAAAGAAAATnVtYmVyAQEYBAAuAEQYBAAAAAf/////AQH/////AAAAABVgiQoCAAAAAAAO\" +\n           \"AAAAVHJhbnNpdGlvblRpbWUBARkEAC4ARBkEAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAACQAA\" +\n           \"AERlbGV0YWJsZQEBGwQALgBEGwQAAAAB/////wEB/////wAAAAAVYIkKAgAAAAAACgAAAEF1dG9EZWxl\" +\n           \"dGUBARwEAC4ARBwEAAAAAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABSZWN5Y2xlQ291bnQBAR0E\" +\n           \"AC4ARB0EAAAABv////8BAf////8AAAAAJGGCCgQAAAABAAUAAABTdGFydAEBRwQDAAAAAEsAAABDYXVz\" +\n           \"ZXMgdGhlIFByb2dyYW0gdG8gdHJhbnNpdGlvbiBmcm9tIHRoZSBSZWFkeSBzdGF0ZSB0byB0aGUgUnVu\" +\n           \"bmluZyBzdGF0ZS4ALwEAeglHBAAAAQEBAAAAADUBAQE3BAAAAAAkYYIKBAAAAAEABwAAAFN1c3BlbmQB\" +\n           \"AUgEAwAAAABPAAAAQ2F1c2VzIHRoZSBQcm9ncmFtIHRvIHRyYW5zaXRpb24gZnJvbSB0aGUgUnVubmlu\" +\n           \"ZyBzdGF0ZSB0byB0aGUgU3VzcGVuZGVkIHN0YXRlLgAvAQB7CUgEAAABAQEAAAAANQEBAT0EAAAAACRh\" +\n           \"ggoEAAAAAQAGAAAAUmVzdW1lAQFJBAMAAAAATwAAAENhdXNlcyB0aGUgUHJvZ3JhbSB0byB0cmFuc2l0\" +\n           \"aW9uIGZyb20gdGhlIFN1c3BlbmRlZCBzdGF0ZSB0byB0aGUgUnVubmluZyBzdGF0ZS4ALwEAfAlJBAAA\" +\n           \"AQEBAAAAADUBAQE/BAAAAAAkYYIKBAAAAAEABAAAAEhhbHQBAUoEAwAAAABgAAAAQ2F1c2VzIHRoZSBQ\" +\n           \"cm9ncmFtIHRvIHRyYW5zaXRpb24gZnJvbSB0aGUgUmVhZHksIFJ1bm5pbmcgb3IgU3VzcGVuZGVkIHN0\" +\n           \"YXRlIHRvIHRoZSBIYWx0ZWQgc3RhdGUuAC8BAH0JSgQAAAEBAwAAAAA1AQEBOQQANQEBAUEEADUBAQFF\" +\n           \"BAAAAAAkYYIKBAAAAAEABQAAAFJlc2V0AQFLBAMAAAAASgAAAENhdXNlcyB0aGUgUHJvZ3JhbSB0byB0\" +\n           \"cmFuc2l0aW9uIGZyb20gdGhlIEhhbHRlZCBzdGF0ZSB0byB0aGUgUmVhZHkgc3RhdGUuAC8BAH4JSwQA\" +\n           \"AAEBAQAAAAA1AQEBNQQAAAAANWCJCgIAAAABAAoAAABVcGRhdGVSYXRlAQFMBAMAAAAAJgAAAFRoZSBy\" +\n           \"YXRlIGF0IHdoaWNoIHRoZSBzaW11bGF0aW9uIHJ1bnMuAC4AREwEAAAAB/////8DA/////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<uint> UpdateRate\n        {\n            get\n            {\n                return m_updateRate;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_updateRate, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_updateRate = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public MethodState Start\n        {\n            get\n            {\n                return m_startMethod;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_startMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_startMethod = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public MethodState Suspend\n        {\n            get\n            {\n                return m_suspendMethod;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_suspendMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_suspendMethod = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public MethodState Resume\n        {\n            get\n            {\n                return m_resumeMethod;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_resumeMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_resumeMethod = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public MethodState Halt\n        {\n            get\n            {\n                return m_haltMethod;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_haltMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_haltMethod = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public MethodState Reset\n        {\n            get\n            {\n                return m_resetMethod;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_resetMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_resetMethod = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_updateRate != null)\n            {\n                children.Add(m_updateRate);\n            }\n\n            if (m_startMethod != null)\n            {\n                children.Add(m_startMethod);\n            }\n\n            if (m_suspendMethod != null)\n            {\n                children.Add(m_suspendMethod);\n            }\n\n            if (m_resumeMethod != null)\n            {\n                children.Add(m_resumeMethod);\n            }\n\n            if (m_haltMethod != null)\n            {\n                children.Add(m_haltMethod);\n            }\n\n            if (m_resetMethod != null)\n            {\n                children.Add(m_resetMethod);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.UpdateRate:\n                    {\n                        if (createOrReplace && UpdateRate == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UpdateRate = new PropertyState<uint>(this);\n                            }\n                            else\n                            {\n                                UpdateRate = (PropertyState<uint>)replacement;\n                            }\n                        }\n\n                        instance = UpdateRate;\n                        break;\n                    }\n\n                case BrowseNames.Start:\n                    {\n                        if (createOrReplace && Start == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Start = new MethodState(this);\n                            }\n                            else\n                            {\n                                Start = (MethodState)replacement;\n                            }\n                        }\n\n                        instance = Start;\n                        break;\n                    }\n\n                case BrowseNames.Suspend:\n                    {\n                        if (createOrReplace && Suspend == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Suspend = new MethodState(this);\n                            }\n                            else\n                            {\n                                Suspend = (MethodState)replacement;\n                            }\n                        }\n\n                        instance = Suspend;\n                        break;\n                    }\n\n                case BrowseNames.Resume:\n                    {\n                        if (createOrReplace && Resume == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Resume = new MethodState(this);\n                            }\n                            else\n                            {\n                                Resume = (MethodState)replacement;\n                            }\n                        }\n\n                        instance = Resume;\n                        break;\n                    }\n\n                case BrowseNames.Halt:\n                    {\n                        if (createOrReplace && Halt == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Halt = new MethodState(this);\n                            }\n                            else\n                            {\n                                Halt = (MethodState)replacement;\n                            }\n                        }\n\n                        instance = Halt;\n                        break;\n                    }\n\n                case BrowseNames.Reset:\n                    {\n                        if (createOrReplace && Reset == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Reset = new MethodState(this);\n                            }\n                            else\n                            {\n                                Reset = (MethodState)replacement;\n                            }\n                        }\n\n                        instance = Reset;\n                        break;\n                    }\n            }\n\n            return instance ?? base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<uint> m_updateRate;\n        private MethodState m_startMethod;\n        private MethodState m_suspendMethod;\n        private MethodState m_resumeMethod;\n        private MethodState m_haltMethod;\n        private MethodState m_resetMethod;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region BoilerInputPipeState Class\n#if (!OPCUA_EXCLUDE_BoilerInputPipeState)\n    /// <summary>\n    /// Stores an instance of the BoilerInputPipeType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class BoilerInputPipeState : FolderState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public BoilerInputPipeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.BoilerInputPipeType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAGwAA\" +\n           \"AEJvaWxlcklucHV0UGlwZVR5cGVJbnN0YW5jZQEBTQQBAU0ETQQAAAEAAAAAMAABAU4EAgAAAIRgwAoB\" +\n           \"AAAAEAAAAEZsb3dUcmFuc21pdHRlcjEBAAYAAABGVFgwMDEBAU4EAC8BAQgETgQAAAEBAAAAADABAQFN\" +\n           \"BAEAAAAVYIkKAgAAAAEABgAAAE91dHB1dAEBTwQALwEAQAlPBAAAAAv/////AQH/////AQAAABVgiQoC\" +\n           \"AAAAAAAHAAAARVVSYW5nZQEBUgQALgBEUgQAAAEAdAP/////AQH/////AAAAAIRgwAoBAAAABQAAAFZh\" +\n           \"bHZlAQAJAAAAVmFsdmVYMDAxAQFVBAAvAQHyA1UEAAAB/////wEAAAAVYIkKAgAAAAEABQAAAElucHV0\" +\n           \"AQFWBAAvAQBACVYEAAAAC/////8CAv////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQFZBAAuAERZ\" +\n           \"BAAAAQB0A/////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public FlowTransmitterState FlowTransmitter1\n        {\n            get\n            {\n                return m_flowTransmitter1;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_flowTransmitter1, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_flowTransmitter1 = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public ValveState Valve\n        {\n            get\n            {\n                return m_valve;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_valve, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_valve = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_flowTransmitter1 != null)\n            {\n                children.Add(m_flowTransmitter1);\n            }\n\n            if (m_valve != null)\n            {\n                children.Add(m_valve);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Boiler.BrowseNames.FlowTransmitter1:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (FlowTransmitter1 == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    FlowTransmitter1 = new FlowTransmitterState(this);\n                                }\n                                else\n                                {\n                                    FlowTransmitter1 = (FlowTransmitterState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = FlowTransmitter1;\n                        break;\n                    }\n\n                case Boiler.BrowseNames.Valve:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Valve == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Valve = new ValveState(this);\n                                }\n                                else\n                                {\n                                    Valve = (ValveState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Valve;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private FlowTransmitterState m_flowTransmitter1;\n        private ValveState m_valve;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region BoilerDrumState Class\n#if (!OPCUA_EXCLUDE_BoilerDrumState)\n    /// <summary>\n    /// Stores an instance of the BoilerDrumType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class BoilerDrumState : FolderState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public BoilerDrumState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.BoilerDrumType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAFgAA\" +\n           \"AEJvaWxlckRydW1UeXBlSW5zdGFuY2UBAVwEAQFcBFwEAAABAAAAADAAAQFdBAEAAACEYMAKAQAAAA4A\" +\n           \"AABMZXZlbEluZGljYXRvcgEABgAAAExJWDAwMQEBXQQALwEBAQRdBAAAAQEAAAAAMAEBAVwEAQAAABVg\" +\n           \"iQoCAAAAAQAGAAAAT3V0cHV0AQFeBAAvAQBACV4EAAAAC/////8BAf////8BAAAAFWCJCgIAAAAAAAcA\" +\n           \"AABFVVJhbmdlAQFhBAAuAERhBAAAAQB0A/////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public LevelIndicatorState LevelIndicator\n        {\n            get\n            {\n                return m_levelIndicator;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_levelIndicator, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_levelIndicator = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_levelIndicator != null)\n            {\n                children.Add(m_levelIndicator);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Boiler.BrowseNames.LevelIndicator:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (LevelIndicator == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    LevelIndicator = new LevelIndicatorState(this);\n                                }\n                                else\n                                {\n                                    LevelIndicator = (LevelIndicatorState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = LevelIndicator;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private LevelIndicatorState m_levelIndicator;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region BoilerOutputPipeState Class\n#if (!OPCUA_EXCLUDE_BoilerOutputPipeState)\n    /// <summary>\n    /// Stores an instance of the BoilerOutputPipeType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class BoilerOutputPipeState : FolderState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public BoilerOutputPipeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Boiler.ObjectTypes.BoilerOutputPipeType, Boiler.Namespaces.Boiler, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////8EYIACAQAAAAEAHAAA\" +\n           \"AEJvaWxlck91dHB1dFBpcGVUeXBlSW5zdGFuY2UBAWQEAQFkBGQEAAABAAAAADAAAQFlBAEAAACEYMAK\" +\n           \"AQAAABAAAABGbG93VHJhbnNtaXR0ZXIyAQAGAAAARlRYMDAyAQFlBAAvAQEIBGUEAAABAQAAAAAwAQEB\" +\n           \"ZAQBAAAAFWCJCgIAAAABAAYAAABPdXRwdXQBAWYEAC8BAEAJZgQAAAAL/////wEB/////wEAAAAVYIkK\" +\n           \"AgAAAAAABwAAAEVVUmFuZ2UBAWkEAC4ARGkEAAABAHQD/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public FlowTransmitterState FlowTransmitter2\n        {\n            get\n            {\n                return m_flowTransmitter2;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_flowTransmitter2, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_flowTransmitter2 = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_flowTransmitter2 != null)\n            {\n                children.Add(m_flowTransmitter2);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Boiler.BrowseNames.FlowTransmitter2:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (FlowTransmitter2 == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    FlowTransmitter2 = new FlowTransmitterState(this);\n                                }\n                                else\n                                {\n                                    FlowTransmitter2 = (FlowTransmitterState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = FlowTransmitter2;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private FlowTransmitterState m_flowTransmitter2;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region BoilerState Class\n#if !OPCUA_EXCLUDE_BoilerState\n    /// <summary>\n    /// Stores an instance of the BoilerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class BoilerState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public BoilerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.BoilerType, Namespaces.Boiler, namespaceUris);\n        }\n\n#if !OPCUA_EXCLUDE_InitializationStrings\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACMAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvQm9pbGVyL/////+EYIACAQAAAAEAEgAA\" +\n           \"AEJvaWxlclR5cGVJbnN0YW5jZQEBbAQBAWwEbAQAAAEEAAAAADAAAQFtBAAwAAEBfAQAMAABAYQEACQA\" +\n           \"AQGaBAcAAACEYMAKAQAAAAkAAABJbnB1dFBpcGUBAAgAAABQaXBlWDAwMQEBbQQALwEBTQRtBAAAAQMA\" +\n           \"AAAAMAEBAWwEADAAAQFuBAEB2QMAAQF8BAIAAACEYMAKAQAAABAAAABGbG93VHJhbnNtaXR0ZXIxAQAG\" +\n           \"AAAARlRYMDAxAQFuBAAvAQEIBG4EAAABAQAAAAAwAQEBbQQBAAAAFWCJCgIAAAABAAYAAABPdXRwdXQB\" +\n           \"AW8EAC8BAEAJbwQAAAAL/////wEBAgAAAAEB2wMAAQGNBAEB2wMAAQGWBAEAAAAVYIkKAgAAAAAABwAA\" +\n           \"AEVVUmFuZ2UBAXIEAC4ARHIEAAABAHQD/////wEB/////wAAAACEYMAKAQAAAAUAAABWYWx2ZQEACQAA\" +\n           \"AFZhbHZlWDAwMQEBdQQALwEB8gN1BAAAAf////8BAAAAFWCJCgIAAAABAAUAAABJbnB1dAEBdgQALwEA\" +\n           \"QAl2BAAAAAv/////AgIBAAAAAQHbAwEBAY8EAQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBeQQALgBE\" +\n           \"eQQAAAEAdAP/////AQH/////AAAAAIRgwAoBAAAABAAAAERydW0BAAgAAABEcnVtWDAwMQEBfAQALwEB\" +\n           \"XAR8BAAAAQQAAAAAMAEBAWwEAQHZAwEBAW0EADAAAQF9BAEB2gMAAQGEBAEAAACEYMAKAQAAAA4AAABM\" +\n           \"ZXZlbEluZGljYXRvcgEABgAAAExJWDAwMQEBfQQALwEBAQR9BAAAAQEAAAAAMAEBAXwEAQAAABVgiQoC\" +\n           \"AAAAAQAGAAAAT3V0cHV0AQF+BAAvAQBACX4EAAAAGv////8BAQEAAAABAdsDAAEBkQQBAAAAFWCJCgIA\" +\n           \"AAAAAAcAAABFVVJhbmdlAQGBBAAuAESBBAAAAQB0A/////8BAf////8AAAAAhGDACgEAAAAKAAAAT3V0\" +\n           \"cHV0UGlwZQEACAAAAFBpcGVYMDAyAQGEBAAvAQFkBIQEAAABAwAAAAAwAQEBbAQBAdoDAQEBfAQAMAAB\" +\n           \"AYUEAQAAAIRgwAoBAAAAEAAAAEZsb3dUcmFuc21pdHRlcjIBAAYAAABGVFgwMDIBAYUEAC8BAQgEhQQA\" +\n           \"AAEBAAAAADABAQGEBAEAAAAVYIkKAgAAAAEABgAAAE91dHB1dAEBhgQALwEAQAmGBAAAAAv/////AQEB\" +\n           \"AAAAAQHbAwABAZcEAQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBiQQALgBEiQQAAAEAdAP/////AQH/\" +\n           \"////AAAAAARgwAoBAAAADgAAAEZsb3dDb250cm9sbGVyAQAGAAAARkNYMDAxAQGMBAAvAQH9A4wEAAD/\" +\n           \"////AwAAABVgiQoCAAAAAQALAAAATWVhc3VyZW1lbnQBAY0EAC4ARI0EAAAAC/////8BAQEAAAABAdsD\" +\n           \"AQEBbwQAAAAAFWCJCgIAAAABAAgAAABTZXRQb2ludAEBjgQALgBEjgQAAAAL/////wMDAQAAAAEB2wMB\" +\n           \"AQGYBAAAAAAVYIkKAgAAAAEACgAAAENvbnRyb2xPdXQBAY8EAC4ARI8EAAAAC/////8BAQEAAAABAdsD\" +\n           \"AAEBdgQAAAAABGDACgEAAAAPAAAATGV2ZWxDb250cm9sbGVyAQAGAAAATENYMDAxAQGQBAAvAQH5A5AE\" +\n           \"AAD/////AwAAABVgiQoCAAAAAQALAAAATWVhc3VyZW1lbnQBAZEEAC4ARJEEAAAAC/////8BAQEAAAAB\" +\n           \"AdsDAQEBfgQAAAAAFWCJCgIAAAABAAgAAABTZXRQb2ludAEBkgQALgBEkgQAAAAL/////wMD/////wAA\" +\n           \"AAAVYIkKAgAAAAEACgAAAENvbnRyb2xPdXQBAZMEAC4ARJMEAAAAC/////8BAQEAAAABAdsDAAEBlQQA\" +\n           \"AAAABGDACgEAAAAQAAAAQ3VzdG9tQ29udHJvbGxlcgEABgAAAENDWDAwMQEBlAQALwEBAQKUBAAA////\" +\n           \"/wUAAAAVYIkKAgAAAAEABgAAAElucHV0MQEBlQQALgBElQQAAAAL/////wICAQAAAAEB2wMBAQGTBAAA\" +\n           \"AAAVYIkKAgAAAAEABgAAAElucHV0MgEBlgQALgBElgQAAAAL/////wICAQAAAAEB2wMBAQFvBAAAAAAV\" +\n           \"YIkKAgAAAAEABgAAAElucHV0MwEBlwQALgBElwQAAAAL/////wICAQAAAAEB2wMBAQGGBAAAAAAVYIkK\" +\n           \"AgAAAAEACgAAAENvbnRyb2xPdXQBAZgEAC4ARJgEAAAAC/////8BAQEAAAABAdsDAAEBjgQAAAAAFWDJ\" +\n           \"CgIAAAAMAAAARGVzY3JpcHRpb25YAQALAAAARGVzY3JpcHRpb24BAZkEAC4ARJkEAAAAFf////8BAf//\" +\n           \"//8AAAAAhGCACgEAAAABAAoAAABTaW11bGF0aW9uAQGaBAAvAQEPBJoEAAABAQAAAAAkAQEBbAQLAAAA\" +\n           \"FWCJCgIAAAAAAAwAAABDdXJyZW50U3RhdGUBAZsEAC8BAMgKmwQAAAAV/////wEB/////wIAAAAVYIkK\" +\n           \"AgAAAAAAAgAAAElkAQGcBAAuAEScBAAAABH/////AQH/////AAAAABVgiQoCAAAAAAAGAAAATnVtYmVy\" +\n           \"AQGeBAAuAESeBAAAAAf/////AQH/////AAAAABVgiQoCAAAAAAAOAAAATGFzdFRyYW5zaXRpb24BAaAE\" +\n           \"AC8BAM8KoAQAAAAV/////wEB/////wMAAAAVYIkKAgAAAAAAAgAAAElkAQGhBAAuAEShBAAAABH/////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAAGAAAATnVtYmVyAQGjBAAuAESjBAAAAAf/////AQH/////AAAAABVg\" +\n           \"iQoCAAAAAAAOAAAAVHJhbnNpdGlvblRpbWUBAaQEAC4ARKQEAAABACYB/////wEB/////wAAAAAVYIkK\" +\n           \"AgAAAAAACQAAAERlbGV0YWJsZQEBpgQALgBEpgQAAAAB/////wEB/////wAAAAAVYIkKAgAAAAAACgAA\" +\n           \"AEF1dG9EZWxldGUBAacEAC4ARKcEAAAAAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABSZWN5Y2xl\" +\n           \"Q291bnQBAagEAC4ARKgEAAAABv////8BAf////8AAAAANWCJCgIAAAABAAoAAABVcGRhdGVSYXRlAQHX\" +\n           \"BAMAAAAAJgAAAFRoZSByYXRlIGF0IHdoaWNoIHRoZSBzaW11bGF0aW9uIHJ1bnMuAC4ARNcEAAAAB///\" +\n           \"//8DA/////8AAAAAJGGCCgQAAAABAAUAAABTdGFydAEBpToDAAAAAEsAAABDYXVzZXMgdGhlIFByb2dy\" +\n           \"YW0gdG8gdHJhbnNpdGlvbiBmcm9tIHRoZSBSZWFkeSBzdGF0ZSB0byB0aGUgUnVubmluZyBzdGF0ZS4A\" +\n           \"LwEBRwSlOgAAAQH/////AAAAACRhggoEAAAAAQAHAAAAU3VzcGVuZAEBpjoDAAAAAE8AAABDYXVzZXMg\" +\n           \"dGhlIFByb2dyYW0gdG8gdHJhbnNpdGlvbiBmcm9tIHRoZSBSdW5uaW5nIHN0YXRlIHRvIHRoZSBTdXNw\" +\n           \"ZW5kZWQgc3RhdGUuAC8BAUgEpjoAAAEB/////wAAAAAkYYIKBAAAAAEABgAAAFJlc3VtZQEBpzoDAAAA\" +\n           \"AE8AAABDYXVzZXMgdGhlIFByb2dyYW0gdG8gdHJhbnNpdGlvbiBmcm9tIHRoZSBTdXNwZW5kZWQgc3Rh\" +\n           \"dGUgdG8gdGhlIFJ1bm5pbmcgc3RhdGUuAC8BAUkEpzoAAAEB/////wAAAAAkYYIKBAAAAAEABAAAAEhh\" +\n           \"bHQBAag6AwAAAABgAAAAQ2F1c2VzIHRoZSBQcm9ncmFtIHRvIHRyYW5zaXRpb24gZnJvbSB0aGUgUmVh\" +\n           \"ZHksIFJ1bm5pbmcgb3IgU3VzcGVuZGVkIHN0YXRlIHRvIHRoZSBIYWx0ZWQgc3RhdGUuAC8BAUoEqDoA\" +\n           \"AAEB/////wAAAAAkYYIKBAAAAAEABQAAAFJlc2V0AQGpOgMAAAAASgAAAENhdXNlcyB0aGUgUHJvZ3Jh\" +\n           \"bSB0byB0cmFuc2l0aW9uIGZyb20gdGhlIEhhbHRlZCBzdGF0ZSB0byB0aGUgUmVhZHkgc3RhdGUuAC8B\" +\n           \"AUsEqToAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public BoilerInputPipeState InputPipe\n        {\n            get\n            {\n                return m_inputPipe;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_inputPipe, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_inputPipe = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public BoilerDrumState Drum\n        {\n            get\n            {\n                return m_drum;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_drum, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_drum = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public BoilerOutputPipeState OutputPipe\n        {\n            get\n            {\n                return m_outputPipe;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_outputPipe, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_outputPipe = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public FlowControllerState FlowController\n        {\n            get\n            {\n                return m_flowController;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_flowController, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_flowController = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public LevelControllerState LevelController\n        {\n            get\n            {\n                return m_levelController;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_levelController, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_levelController = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public CustomControllerState CustomController\n        {\n            get\n            {\n                return m_customController;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_customController, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_customController = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public BoilerStateMachineState Simulation\n        {\n            get\n            {\n                return m_simulation;\n            }\n\n            set\n            {\n                if (!ReferenceEquals(m_simulation, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_simulation = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_inputPipe != null)\n            {\n                children.Add(m_inputPipe);\n            }\n\n            if (m_drum != null)\n            {\n                children.Add(m_drum);\n            }\n\n            if (m_outputPipe != null)\n            {\n                children.Add(m_outputPipe);\n            }\n\n            if (m_flowController != null)\n            {\n                children.Add(m_flowController);\n            }\n\n            if (m_levelController != null)\n            {\n                children.Add(m_levelController);\n            }\n\n            if (m_customController != null)\n            {\n                children.Add(m_customController);\n            }\n\n            if (m_simulation != null)\n            {\n                children.Add(m_simulation);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.InputPipe:\n                    {\n                        if (createOrReplace && InputPipe == null)\n                        {\n                            if (replacement == null)\n                            {\n                                InputPipe = new BoilerInputPipeState(this);\n                            }\n                            else\n                            {\n                                InputPipe = (BoilerInputPipeState)replacement;\n                            }\n                        }\n\n                        instance = InputPipe;\n                        break;\n                    }\n\n                case BrowseNames.Drum:\n                    {\n                        if (createOrReplace && Drum == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Drum = new BoilerDrumState(this);\n                            }\n                            else\n                            {\n                                Drum = (BoilerDrumState)replacement;\n                            }\n                        }\n\n                        instance = Drum;\n                        break;\n                    }\n\n                case BrowseNames.OutputPipe:\n                    {\n                        if (createOrReplace && OutputPipe == null)\n                        {\n                            if (replacement == null)\n                            {\n                                OutputPipe = new BoilerOutputPipeState(this);\n                            }\n                            else\n                            {\n                                OutputPipe = (BoilerOutputPipeState)replacement;\n                            }\n                        }\n\n                        instance = OutputPipe;\n                        break;\n                    }\n\n                case BrowseNames.FlowController:\n                    {\n                        if (createOrReplace && FlowController == null)\n                        {\n                            if (replacement == null)\n                            {\n                                FlowController = new FlowControllerState(this);\n                            }\n                            else\n                            {\n                                FlowController = (FlowControllerState)replacement;\n                            }\n                        }\n\n                        instance = FlowController;\n                        break;\n                    }\n\n                case BrowseNames.LevelController:\n                    {\n                        if (createOrReplace && LevelController == null)\n                        {\n                            if (replacement == null)\n                            {\n                                LevelController = new LevelControllerState(this);\n                            }\n                            else\n                            {\n                                LevelController = (LevelControllerState)replacement;\n                            }\n                        }\n\n                        instance = LevelController;\n                        break;\n                    }\n\n                case BrowseNames.CustomController:\n                    {\n                        if (createOrReplace && CustomController == null)\n                        {\n                            if (replacement == null)\n                            {\n                                CustomController = new CustomControllerState(this);\n                            }\n                            else\n                            {\n                                CustomController = (CustomControllerState)replacement;\n                            }\n                        }\n\n                        instance = CustomController;\n                        break;\n                    }\n\n                case BrowseNames.Simulation:\n                    {\n                        if (createOrReplace && Simulation == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Simulation = new BoilerStateMachineState(this);\n                            }\n                            else\n                            {\n                                Simulation = (BoilerStateMachineState)replacement;\n                            }\n                        }\n\n                        instance = Simulation;\n                        break;\n                    }\n            }\n\n            return instance ?? base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private BoilerInputPipeState m_inputPipe;\n        private BoilerDrumState m_drum;\n        private BoilerOutputPipeState m_outputPipe;\n        private FlowControllerState m_flowController;\n        private LevelControllerState m_levelController;\n        private CustomControllerState m_customController;\n        private BoilerStateMachineState m_simulation;\n        #endregion\n    }\n#endif\n    #endregion\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/Boiler.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace Boiler\n{\n    #region Method Identifiers\n    /// <summary>\n    /// A class that declares constants for all Methods in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Methods\n    {\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Start Method.\n        /// </summary>\n        public const uint BoilerStateMachineType_Start = 1095;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Suspend Method.\n        /// </summary>\n        public const uint BoilerStateMachineType_Suspend = 1096;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Resume Method.\n        /// </summary>\n        public const uint BoilerStateMachineType_Resume = 1097;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Halt Method.\n        /// </summary>\n        public const uint BoilerStateMachineType_Halt = 1098;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Reset Method.\n        /// </summary>\n        public const uint BoilerStateMachineType_Reset = 1099;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Start Method.\n        /// </summary>\n        public const uint BoilerType_Simulation_Start = 15013;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Suspend Method.\n        /// </summary>\n        public const uint BoilerType_Simulation_Suspend = 15014;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Resume Method.\n        /// </summary>\n        public const uint BoilerType_Simulation_Resume = 15015;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Halt Method.\n        /// </summary>\n        public const uint BoilerType_Simulation_Halt = 15016;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Reset Method.\n        /// </summary>\n        public const uint BoilerType_Simulation_Reset = 15017;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Start Method.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_Start = 15018;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Suspend Method.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_Suspend = 15019;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Resume Method.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_Resume = 15020;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Halt Method.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_Halt = 15021;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Reset Method.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_Reset = 15022;\n    }\n    #endregion\n\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_FlowTransmitter1 Object.\n        /// </summary>\n        public const uint BoilerInputPipeType_FlowTransmitter1 = 1102;\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_Valve Object.\n        /// </summary>\n        public const uint BoilerInputPipeType_Valve = 1109;\n\n        /// <summary>\n        /// The identifier for the BoilerDrumType_LevelIndicator Object.\n        /// </summary>\n        public const uint BoilerDrumType_LevelIndicator = 1117;\n\n        /// <summary>\n        /// The identifier for the BoilerOutputPipeType_FlowTransmitter2 Object.\n        /// </summary>\n        public const uint BoilerOutputPipeType_FlowTransmitter2 = 1125;\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe Object.\n        /// </summary>\n        public const uint BoilerType_InputPipe = 1133;\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_FlowTransmitter1 Object.\n        /// </summary>\n        public const uint BoilerType_InputPipe_FlowTransmitter1 = 1134;\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_Valve Object.\n        /// </summary>\n        public const uint BoilerType_InputPipe_Valve = 1141;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum Object.\n        /// </summary>\n        public const uint BoilerType_Drum = 1148;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_LevelIndicator Object.\n        /// </summary>\n        public const uint BoilerType_Drum_LevelIndicator = 1149;\n\n        /// <summary>\n        /// The identifier for the BoilerType_OutputPipe Object.\n        /// </summary>\n        public const uint BoilerType_OutputPipe = 1156;\n\n        /// <summary>\n        /// The identifier for the BoilerType_OutputPipe_FlowTransmitter2 Object.\n        /// </summary>\n        public const uint BoilerType_OutputPipe_FlowTransmitter2 = 1157;\n\n        /// <summary>\n        /// The identifier for the BoilerType_FlowController Object.\n        /// </summary>\n        public const uint BoilerType_FlowController = 1164;\n\n        /// <summary>\n        /// The identifier for the BoilerType_LevelController Object.\n        /// </summary>\n        public const uint BoilerType_LevelController = 1168;\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController Object.\n        /// </summary>\n        public const uint BoilerType_CustomController = 1172;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation Object.\n        /// </summary>\n        public const uint BoilerType_Simulation = 1178;\n\n        /// <summary>\n        /// The identifier for the Boilers Object.\n        /// </summary>\n        public const uint Boilers = 1240;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1 Object.\n        /// </summary>\n        public const uint Boilers_Boiler1 = 1241;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_InputPipe = 1242;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_FlowTransmitter1 Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_InputPipe_FlowTransmitter1 = 1243;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_Valve Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_InputPipe_Valve = 1250;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Drum Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_Drum = 1257;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Drum_LevelIndicator Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_Drum_LevelIndicator = 1258;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_OutputPipe Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_OutputPipe = 1265;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_OutputPipe_FlowTransmitter2 Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_OutputPipe_FlowTransmitter2 = 1266;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_FlowController Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_FlowController = 1273;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_LevelController Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_LevelController = 1277;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_CustomController = 1281;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation Object.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation = 1287;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <summary>\n        /// The identifier for the GenericControllerType ObjectType.\n        /// </summary>\n        public const uint GenericControllerType = 210;\n\n        /// <summary>\n        /// The identifier for the GenericSensorType ObjectType.\n        /// </summary>\n        public const uint GenericSensorType = 991;\n\n        /// <summary>\n        /// The identifier for the GenericActuatorType ObjectType.\n        /// </summary>\n        public const uint GenericActuatorType = 998;\n\n        /// <summary>\n        /// The identifier for the CustomControllerType ObjectType.\n        /// </summary>\n        public const uint CustomControllerType = 513;\n\n        /// <summary>\n        /// The identifier for the ValveType ObjectType.\n        /// </summary>\n        public const uint ValveType = 1010;\n\n        /// <summary>\n        /// The identifier for the LevelControllerType ObjectType.\n        /// </summary>\n        public const uint LevelControllerType = 1017;\n\n        /// <summary>\n        /// The identifier for the FlowControllerType ObjectType.\n        /// </summary>\n        public const uint FlowControllerType = 1021;\n\n        /// <summary>\n        /// The identifier for the LevelIndicatorType ObjectType.\n        /// </summary>\n        public const uint LevelIndicatorType = 1025;\n\n        /// <summary>\n        /// The identifier for the FlowTransmitterType ObjectType.\n        /// </summary>\n        public const uint FlowTransmitterType = 1032;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType ObjectType.\n        /// </summary>\n        public const uint BoilerStateMachineType = 1039;\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType ObjectType.\n        /// </summary>\n        public const uint BoilerInputPipeType = 1101;\n\n        /// <summary>\n        /// The identifier for the BoilerDrumType ObjectType.\n        /// </summary>\n        public const uint BoilerDrumType = 1116;\n\n        /// <summary>\n        /// The identifier for the BoilerOutputPipeType ObjectType.\n        /// </summary>\n        public const uint BoilerOutputPipeType = 1124;\n\n        /// <summary>\n        /// The identifier for the BoilerType ObjectType.\n        /// </summary>\n        public const uint BoilerType = 1132;\n    }\n    #endregion\n\n    #region ReferenceType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ReferenceTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ReferenceTypes\n    {\n        /// <summary>\n        /// The identifier for the FlowTo ReferenceType.\n        /// </summary>\n        public const uint FlowTo = 985;\n\n        /// <summary>\n        /// The identifier for the HotFlowTo ReferenceType.\n        /// </summary>\n        public const uint HotFlowTo = 986;\n\n        /// <summary>\n        /// The identifier for the SignalTo ReferenceType.\n        /// </summary>\n        public const uint SignalTo = 987;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the GenericControllerType_Measurement Variable.\n        /// </summary>\n        public const uint GenericControllerType_Measurement = 988;\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_SetPoint Variable.\n        /// </summary>\n        public const uint GenericControllerType_SetPoint = 989;\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_ControlOut Variable.\n        /// </summary>\n        public const uint GenericControllerType_ControlOut = 990;\n\n        /// <summary>\n        /// The identifier for the GenericSensorType_Output Variable.\n        /// </summary>\n        public const uint GenericSensorType_Output = 992;\n\n        /// <summary>\n        /// The identifier for the GenericSensorType_Output_EURange Variable.\n        /// </summary>\n        public const uint GenericSensorType_Output_EURange = 995;\n\n        /// <summary>\n        /// The identifier for the GenericActuatorType_Input Variable.\n        /// </summary>\n        public const uint GenericActuatorType_Input = 999;\n\n        /// <summary>\n        /// The identifier for the GenericActuatorType_Input_EURange Variable.\n        /// </summary>\n        public const uint GenericActuatorType_Input_EURange = 1002;\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_Input1 Variable.\n        /// </summary>\n        public const uint CustomControllerType_Input1 = 1005;\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_Input2 Variable.\n        /// </summary>\n        public const uint CustomControllerType_Input2 = 1006;\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_Input3 Variable.\n        /// </summary>\n        public const uint CustomControllerType_Input3 = 1007;\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_ControlOut Variable.\n        /// </summary>\n        public const uint CustomControllerType_ControlOut = 1008;\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_DescriptionX Variable.\n        /// </summary>\n        public const uint CustomControllerType_DescriptionX = 1009;\n\n        /// <summary>\n        /// The identifier for the ValveType_Input_EURange Variable.\n        /// </summary>\n        public const uint ValveType_Input_EURange = 1014;\n\n        /// <summary>\n        /// The identifier for the LevelIndicatorType_Output_EURange Variable.\n        /// </summary>\n        public const uint LevelIndicatorType_Output_EURange = 1029;\n\n        /// <summary>\n        /// The identifier for the FlowTransmitterType_Output_EURange Variable.\n        /// </summary>\n        public const uint FlowTransmitterType_Output_EURange = 1036;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_CurrentState_Id Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_CurrentState_Id = 1041;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_CurrentState_Number Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_CurrentState_Number = 1043;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_LastTransition_Id Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_LastTransition_Id = 1046;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_LastTransition_Number Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_LastTransition_Number = 1048;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_LastTransition_TransitionTime Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_LastTransition_TransitionTime = 1049;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_CreateSessionId Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_CreateSessionId = 15024;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_CreateClientName Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_CreateClientName = 15025;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_InvocationCreationTime Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_InvocationCreationTime = 15026;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastTransitionTime Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastTransitionTime = 15027;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodCall Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastMethodCall = 15028;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodSessionId Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastMethodSessionId = 15029;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodInputArguments Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastMethodInputArguments = 15030;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputArguments Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputArguments = 15031;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodInputValues Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastMethodInputValues = 15032;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputValues Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputValues = 15033;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodCallTime Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastMethodCallTime = 15034;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodReturnStatus Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ProgramDiagnostic_LastMethodReturnStatus = 15035;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Halted_StateNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_Halted_StateNumber = 1076;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Ready_StateNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_Ready_StateNumber = 1070;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Running_StateNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_Running_StateNumber = 1072;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Suspended_StateNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_Suspended_StateNumber = 1074;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_HaltedToReady_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_HaltedToReady_TransitionNumber = 1078;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ReadyToRunning_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ReadyToRunning_TransitionNumber = 1080;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_RunningToHalted_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_RunningToHalted_TransitionNumber = 1082;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_RunningToReady_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_RunningToReady_TransitionNumber = 1084;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_RunningToSuspended_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_RunningToSuspended_TransitionNumber = 1086;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_SuspendedToRunning_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_SuspendedToRunning_TransitionNumber = 1088;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_SuspendedToHalted_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_SuspendedToHalted_TransitionNumber = 1090;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_SuspendedToReady_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_SuspendedToReady_TransitionNumber = 1092;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ReadyToHalted_TransitionNumber Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_ReadyToHalted_TransitionNumber = 1094;\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_UpdateRate Variable.\n        /// </summary>\n        public const uint BoilerStateMachineType_UpdateRate = 1100;\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_FlowTransmitter1_Output Variable.\n        /// </summary>\n        public const uint BoilerInputPipeType_FlowTransmitter1_Output = 1103;\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_FlowTransmitter1_Output_EURange Variable.\n        /// </summary>\n        public const uint BoilerInputPipeType_FlowTransmitter1_Output_EURange = 1106;\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_Valve_Input Variable.\n        /// </summary>\n        public const uint BoilerInputPipeType_Valve_Input = 1110;\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_Valve_Input_EURange Variable.\n        /// </summary>\n        public const uint BoilerInputPipeType_Valve_Input_EURange = 1113;\n\n        /// <summary>\n        /// The identifier for the BoilerDrumType_LevelIndicator_Output Variable.\n        /// </summary>\n        public const uint BoilerDrumType_LevelIndicator_Output = 1118;\n\n        /// <summary>\n        /// The identifier for the BoilerDrumType_LevelIndicator_Output_EURange Variable.\n        /// </summary>\n        public const uint BoilerDrumType_LevelIndicator_Output_EURange = 1121;\n\n        /// <summary>\n        /// The identifier for the BoilerOutputPipeType_FlowTransmitter2_Output Variable.\n        /// </summary>\n        public const uint BoilerOutputPipeType_FlowTransmitter2_Output = 1126;\n\n        /// <summary>\n        /// The identifier for the BoilerOutputPipeType_FlowTransmitter2_Output_EURange Variable.\n        /// </summary>\n        public const uint BoilerOutputPipeType_FlowTransmitter2_Output_EURange = 1129;\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_FlowTransmitter1_Output Variable.\n        /// </summary>\n        public const uint BoilerType_InputPipe_FlowTransmitter1_Output = 1135;\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_FlowTransmitter1_Output_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_InputPipe_FlowTransmitter1_Output_EURange = 1138;\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_Valve_Input Variable.\n        /// </summary>\n        public const uint BoilerType_InputPipe_Valve_Input = 1142;\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_Valve_Input_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_InputPipe_Valve_Input_EURange = 1145;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_LevelIndicator_Output Variable.\n        /// </summary>\n        public const uint BoilerType_Drum_LevelIndicator_Output = 1150;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_LevelIndicator_Output_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_Drum_LevelIndicator_Output_EURange = 1153;\n\n        /// <summary>\n        /// The identifier for the BoilerType_OutputPipe_FlowTransmitter2_Output Variable.\n        /// </summary>\n        public const uint BoilerType_OutputPipe_FlowTransmitter2_Output = 1158;\n\n        /// <summary>\n        /// The identifier for the BoilerType_OutputPipe_FlowTransmitter2_Output_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_OutputPipe_FlowTransmitter2_Output_EURange = 1161;\n\n        /// <summary>\n        /// The identifier for the BoilerType_FlowController_Measurement Variable.\n        /// </summary>\n        public const uint BoilerType_FlowController_Measurement = 1165;\n\n        /// <summary>\n        /// The identifier for the BoilerType_FlowController_SetPoint Variable.\n        /// </summary>\n        public const uint BoilerType_FlowController_SetPoint = 1166;\n\n        /// <summary>\n        /// The identifier for the BoilerType_FlowController_ControlOut Variable.\n        /// </summary>\n        public const uint BoilerType_FlowController_ControlOut = 1167;\n\n        /// <summary>\n        /// The identifier for the BoilerType_LevelController_Measurement Variable.\n        /// </summary>\n        public const uint BoilerType_LevelController_Measurement = 1169;\n\n        /// <summary>\n        /// The identifier for the BoilerType_LevelController_SetPoint Variable.\n        /// </summary>\n        public const uint BoilerType_LevelController_SetPoint = 1170;\n\n        /// <summary>\n        /// The identifier for the BoilerType_LevelController_ControlOut Variable.\n        /// </summary>\n        public const uint BoilerType_LevelController_ControlOut = 1171;\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_Input1 Variable.\n        /// </summary>\n        public const uint BoilerType_CustomController_Input1 = 1173;\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_Input2 Variable.\n        /// </summary>\n        public const uint BoilerType_CustomController_Input2 = 1174;\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_Input3 Variable.\n        /// </summary>\n        public const uint BoilerType_CustomController_Input3 = 1175;\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_ControlOut Variable.\n        /// </summary>\n        public const uint BoilerType_CustomController_ControlOut = 1176;\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_DescriptionX Variable.\n        /// </summary>\n        public const uint BoilerType_CustomController_DescriptionX = 1177;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_CurrentState Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_CurrentState = 1179;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_CurrentState_Id Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_CurrentState_Id = 1180;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_CurrentState_Number Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_CurrentState_Number = 1182;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_LastTransition Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_LastTransition = 1184;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_LastTransition_Id Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_LastTransition_Id = 1185;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_LastTransition_Number Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_LastTransition_Number = 1187;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_LastTransition_TransitionTime Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_LastTransition_TransitionTime = 1188;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Deletable Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_Deletable = 1190;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_AutoDelete Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_AutoDelete = 1191;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_RecycleCount Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_RecycleCount = 1192;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_CreateSessionId Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_CreateSessionId = 15037;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_CreateClientName Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_CreateClientName = 15038;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_InvocationCreationTime Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_InvocationCreationTime = 15039;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastTransitionTime Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastTransitionTime = 15040;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodCall Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastMethodCall = 15041;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodSessionId Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastMethodSessionId = 15042;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodInputArguments Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastMethodInputArguments = 15043;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputArguments Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputArguments = 15044;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodInputValues Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastMethodInputValues = 15045;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputValues Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputValues = 15046;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodCallTime Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastMethodCallTime = 15047;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodReturnStatus Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_ProgramDiagnostic_LastMethodReturnStatus = 15048;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_UpdateRate Variable.\n        /// </summary>\n        public const uint BoilerType_Simulation_UpdateRate = 1239;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_FlowTransmitter1_Output Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_InputPipe_FlowTransmitter1_Output = 1244;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_FlowTransmitter1_Output_EURange Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_InputPipe_FlowTransmitter1_Output_EURange = 1247;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_Valve_Input Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_InputPipe_Valve_Input = 1251;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_Valve_Input_EURange Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_InputPipe_Valve_Input_EURange = 1254;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Drum_LevelIndicator_Output Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Drum_LevelIndicator_Output = 1259;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Drum_LevelIndicator_Output_EURange Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Drum_LevelIndicator_Output_EURange = 1262;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output = 1267;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output_EURange Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output_EURange = 1270;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_FlowController_Measurement Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_FlowController_Measurement = 1274;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_FlowController_SetPoint Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_FlowController_SetPoint = 1275;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_FlowController_ControlOut Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_FlowController_ControlOut = 1276;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_LevelController_Measurement Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_LevelController_Measurement = 1278;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_LevelController_SetPoint Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_LevelController_SetPoint = 1279;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_LevelController_ControlOut Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_LevelController_ControlOut = 1280;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_Input1 Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_CustomController_Input1 = 1282;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_Input2 Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_CustomController_Input2 = 1283;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_Input3 Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_CustomController_Input3 = 1284;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_ControlOut Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_CustomController_ControlOut = 1285;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_DescriptionX Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_CustomController_DescriptionX = 1286;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_CurrentState Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_CurrentState = 1288;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_CurrentState_Id Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_CurrentState_Id = 1289;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_CurrentState_Number Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_CurrentState_Number = 1291;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_LastTransition Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_LastTransition = 1293;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_LastTransition_Id Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_LastTransition_Id = 1294;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_LastTransition_Number Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_LastTransition_Number = 1296;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_LastTransition_TransitionTime Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_LastTransition_TransitionTime = 1297;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Deletable Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_Deletable = 1299;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_AutoDelete Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_AutoDelete = 1300;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_RecycleCount Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_RecycleCount = 1301;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateSessionId Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateSessionId = 15050;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateClientName Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateClientName = 15051;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_InvocationCreationTime Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_InvocationCreationTime = 15052;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastTransitionTime Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastTransitionTime = 15053;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCall Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCall = 15054;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodSessionId Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodSessionId = 15055;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputArguments Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputArguments = 15056;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputArguments Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputArguments = 15057;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputValues Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputValues = 15058;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputValues Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputValues = 15059;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCallTime Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCallTime = 15060;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodReturnStatus Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodReturnStatus = 15061;\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_UpdateRate Variable.\n        /// </summary>\n        public const uint Boilers_Boiler1_Simulation_UpdateRate = 1348;\n    }\n    #endregion\n\n    #region Method Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Methods in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class MethodIds\n    {\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Start Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Start = new ExpandedNodeId(Boiler.Methods.BoilerStateMachineType_Start, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Suspend Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Suspend = new ExpandedNodeId(Boiler.Methods.BoilerStateMachineType_Suspend, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Resume Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Resume = new ExpandedNodeId(Boiler.Methods.BoilerStateMachineType_Resume, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Halt Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Halt = new ExpandedNodeId(Boiler.Methods.BoilerStateMachineType_Halt, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Reset Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Reset = new ExpandedNodeId(Boiler.Methods.BoilerStateMachineType_Reset, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Start Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_Start = new ExpandedNodeId(Boiler.Methods.BoilerType_Simulation_Start, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Suspend Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_Suspend = new ExpandedNodeId(Boiler.Methods.BoilerType_Simulation_Suspend, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Resume Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_Resume = new ExpandedNodeId(Boiler.Methods.BoilerType_Simulation_Resume, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Halt Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_Halt = new ExpandedNodeId(Boiler.Methods.BoilerType_Simulation_Halt, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Reset Method.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_Reset = new ExpandedNodeId(Boiler.Methods.BoilerType_Simulation_Reset, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Start Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_Start = new ExpandedNodeId(Boiler.Methods.Boilers_Boiler1_Simulation_Start, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Suspend Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_Suspend = new ExpandedNodeId(Boiler.Methods.Boilers_Boiler1_Simulation_Suspend, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Resume Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_Resume = new ExpandedNodeId(Boiler.Methods.Boilers_Boiler1_Simulation_Resume, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Halt Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_Halt = new ExpandedNodeId(Boiler.Methods.Boilers_Boiler1_Simulation_Halt, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Reset Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_Reset = new ExpandedNodeId(Boiler.Methods.Boilers_Boiler1_Simulation_Reset, Boiler.Namespaces.Boiler);\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_FlowTransmitter1 Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerInputPipeType_FlowTransmitter1 = new ExpandedNodeId(Boiler.Objects.BoilerInputPipeType_FlowTransmitter1, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_Valve Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerInputPipeType_Valve = new ExpandedNodeId(Boiler.Objects.BoilerInputPipeType_Valve, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerDrumType_LevelIndicator Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerDrumType_LevelIndicator = new ExpandedNodeId(Boiler.Objects.BoilerDrumType_LevelIndicator, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerOutputPipeType_FlowTransmitter2 Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerOutputPipeType_FlowTransmitter2 = new ExpandedNodeId(Boiler.Objects.BoilerOutputPipeType_FlowTransmitter2, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_InputPipe = new ExpandedNodeId(Boiler.Objects.BoilerType_InputPipe, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_FlowTransmitter1 Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_InputPipe_FlowTransmitter1 = new ExpandedNodeId(Boiler.Objects.BoilerType_InputPipe_FlowTransmitter1, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_Valve Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_InputPipe_Valve = new ExpandedNodeId(Boiler.Objects.BoilerType_InputPipe_Valve, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum = new ExpandedNodeId(Boiler.Objects.BoilerType_Drum, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_LevelIndicator Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_LevelIndicator = new ExpandedNodeId(Boiler.Objects.BoilerType_Drum_LevelIndicator, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_OutputPipe Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_OutputPipe = new ExpandedNodeId(Boiler.Objects.BoilerType_OutputPipe, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_OutputPipe_FlowTransmitter2 Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_OutputPipe_FlowTransmitter2 = new ExpandedNodeId(Boiler.Objects.BoilerType_OutputPipe_FlowTransmitter2, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_FlowController Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_FlowController = new ExpandedNodeId(Boiler.Objects.BoilerType_FlowController, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_LevelController Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_LevelController = new ExpandedNodeId(Boiler.Objects.BoilerType_LevelController, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_CustomController = new ExpandedNodeId(Boiler.Objects.BoilerType_CustomController, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation = new ExpandedNodeId(Boiler.Objects.BoilerType_Simulation, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers = new ExpandedNodeId(Boiler.Objects.Boilers, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1 Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1 = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_InputPipe = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_InputPipe, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_FlowTransmitter1 Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_InputPipe_FlowTransmitter1 = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_InputPipe_FlowTransmitter1, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_Valve Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_InputPipe_Valve = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_InputPipe_Valve, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Drum Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Drum = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_Drum, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Drum_LevelIndicator Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Drum_LevelIndicator = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_Drum_LevelIndicator, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_OutputPipe Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_OutputPipe = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_OutputPipe, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_OutputPipe_FlowTransmitter2 Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_OutputPipe_FlowTransmitter2 = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_OutputPipe_FlowTransmitter2, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_FlowController Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_FlowController = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_FlowController, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_LevelController Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_LevelController = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_LevelController, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_CustomController = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_CustomController, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation = new ExpandedNodeId(Boiler.Objects.Boilers_Boiler1_Simulation, Boiler.Namespaces.Boiler);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <summary>\n        /// The identifier for the GenericControllerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType = new ExpandedNodeId(Boiler.ObjectTypes.GenericControllerType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the GenericSensorType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericSensorType = new ExpandedNodeId(Boiler.ObjectTypes.GenericSensorType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the GenericActuatorType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericActuatorType = new ExpandedNodeId(Boiler.ObjectTypes.GenericActuatorType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the CustomControllerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId CustomControllerType = new ExpandedNodeId(Boiler.ObjectTypes.CustomControllerType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the ValveType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId ValveType = new ExpandedNodeId(Boiler.ObjectTypes.ValveType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the LevelControllerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId LevelControllerType = new ExpandedNodeId(Boiler.ObjectTypes.LevelControllerType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the FlowControllerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId FlowControllerType = new ExpandedNodeId(Boiler.ObjectTypes.FlowControllerType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the LevelIndicatorType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId LevelIndicatorType = new ExpandedNodeId(Boiler.ObjectTypes.LevelIndicatorType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the FlowTransmitterType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId FlowTransmitterType = new ExpandedNodeId(Boiler.ObjectTypes.FlowTransmitterType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType = new ExpandedNodeId(Boiler.ObjectTypes.BoilerStateMachineType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerInputPipeType = new ExpandedNodeId(Boiler.ObjectTypes.BoilerInputPipeType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerDrumType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerDrumType = new ExpandedNodeId(Boiler.ObjectTypes.BoilerDrumType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerOutputPipeType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerOutputPipeType = new ExpandedNodeId(Boiler.ObjectTypes.BoilerOutputPipeType, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType = new ExpandedNodeId(Boiler.ObjectTypes.BoilerType, Boiler.Namespaces.Boiler);\n    }\n    #endregion\n\n    #region ReferenceType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ReferenceTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ReferenceTypeIds\n    {\n        /// <summary>\n        /// The identifier for the FlowTo ReferenceType.\n        /// </summary>\n        public static readonly ExpandedNodeId FlowTo = new ExpandedNodeId(Boiler.ReferenceTypes.FlowTo, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the HotFlowTo ReferenceType.\n        /// </summary>\n        public static readonly ExpandedNodeId HotFlowTo = new ExpandedNodeId(Boiler.ReferenceTypes.HotFlowTo, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the SignalTo ReferenceType.\n        /// </summary>\n        public static readonly ExpandedNodeId SignalTo = new ExpandedNodeId(Boiler.ReferenceTypes.SignalTo, Boiler.Namespaces.Boiler);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the GenericControllerType_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_Measurement = new ExpandedNodeId(Boiler.Variables.GenericControllerType_Measurement, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_SetPoint = new ExpandedNodeId(Boiler.Variables.GenericControllerType_SetPoint, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_ControlOut Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_ControlOut = new ExpandedNodeId(Boiler.Variables.GenericControllerType_ControlOut, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the GenericSensorType_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericSensorType_Output = new ExpandedNodeId(Boiler.Variables.GenericSensorType_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the GenericSensorType_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericSensorType_Output_EURange = new ExpandedNodeId(Boiler.Variables.GenericSensorType_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the GenericActuatorType_Input Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericActuatorType_Input = new ExpandedNodeId(Boiler.Variables.GenericActuatorType_Input, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the GenericActuatorType_Input_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericActuatorType_Input_EURange = new ExpandedNodeId(Boiler.Variables.GenericActuatorType_Input_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_Input1 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId CustomControllerType_Input1 = new ExpandedNodeId(Boiler.Variables.CustomControllerType_Input1, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_Input2 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId CustomControllerType_Input2 = new ExpandedNodeId(Boiler.Variables.CustomControllerType_Input2, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_Input3 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId CustomControllerType_Input3 = new ExpandedNodeId(Boiler.Variables.CustomControllerType_Input3, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_ControlOut Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId CustomControllerType_ControlOut = new ExpandedNodeId(Boiler.Variables.CustomControllerType_ControlOut, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the CustomControllerType_DescriptionX Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId CustomControllerType_DescriptionX = new ExpandedNodeId(Boiler.Variables.CustomControllerType_DescriptionX, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the ValveType_Input_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ValveType_Input_EURange = new ExpandedNodeId(Boiler.Variables.ValveType_Input_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the LevelIndicatorType_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId LevelIndicatorType_Output_EURange = new ExpandedNodeId(Boiler.Variables.LevelIndicatorType_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the FlowTransmitterType_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId FlowTransmitterType_Output_EURange = new ExpandedNodeId(Boiler.Variables.FlowTransmitterType_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_CurrentState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_CurrentState_Id = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_CurrentState_Id, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_CurrentState_Number Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_CurrentState_Number = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_CurrentState_Number, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_LastTransition_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_LastTransition_Id = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_LastTransition_Id, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_LastTransition_Number Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_LastTransition_Number = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_LastTransition_Number, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_LastTransition_TransitionTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_LastTransition_TransitionTime = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_LastTransition_TransitionTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_CreateSessionId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_CreateSessionId = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_CreateSessionId, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_CreateClientName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_CreateClientName = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_CreateClientName, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_InvocationCreationTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_InvocationCreationTime = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_InvocationCreationTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastTransitionTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastTransitionTime = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastTransitionTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodCall Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastMethodCall = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastMethodCall, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodSessionId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastMethodSessionId = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastMethodSessionId, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodInputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastMethodInputArguments = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastMethodInputArguments, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputArguments = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputArguments, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodInputValues Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastMethodInputValues = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastMethodInputValues, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputValues Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputValues = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastMethodOutputValues, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodCallTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastMethodCallTime = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastMethodCallTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ProgramDiagnostic_LastMethodReturnStatus Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ProgramDiagnostic_LastMethodReturnStatus = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ProgramDiagnostic_LastMethodReturnStatus, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Halted_StateNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Halted_StateNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_Halted_StateNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Ready_StateNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Ready_StateNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_Ready_StateNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Running_StateNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Running_StateNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_Running_StateNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_Suspended_StateNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_Suspended_StateNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_Suspended_StateNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_HaltedToReady_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_HaltedToReady_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_HaltedToReady_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ReadyToRunning_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ReadyToRunning_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ReadyToRunning_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_RunningToHalted_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_RunningToHalted_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_RunningToHalted_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_RunningToReady_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_RunningToReady_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_RunningToReady_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_RunningToSuspended_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_RunningToSuspended_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_RunningToSuspended_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_SuspendedToRunning_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_SuspendedToRunning_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_SuspendedToRunning_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_SuspendedToHalted_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_SuspendedToHalted_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_SuspendedToHalted_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_SuspendedToReady_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_SuspendedToReady_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_SuspendedToReady_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_ReadyToHalted_TransitionNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_ReadyToHalted_TransitionNumber = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_ReadyToHalted_TransitionNumber, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerStateMachineType_UpdateRate Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerStateMachineType_UpdateRate = new ExpandedNodeId(Boiler.Variables.BoilerStateMachineType_UpdateRate, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_FlowTransmitter1_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerInputPipeType_FlowTransmitter1_Output = new ExpandedNodeId(Boiler.Variables.BoilerInputPipeType_FlowTransmitter1_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_FlowTransmitter1_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerInputPipeType_FlowTransmitter1_Output_EURange = new ExpandedNodeId(Boiler.Variables.BoilerInputPipeType_FlowTransmitter1_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_Valve_Input Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerInputPipeType_Valve_Input = new ExpandedNodeId(Boiler.Variables.BoilerInputPipeType_Valve_Input, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerInputPipeType_Valve_Input_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerInputPipeType_Valve_Input_EURange = new ExpandedNodeId(Boiler.Variables.BoilerInputPipeType_Valve_Input_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerDrumType_LevelIndicator_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerDrumType_LevelIndicator_Output = new ExpandedNodeId(Boiler.Variables.BoilerDrumType_LevelIndicator_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerDrumType_LevelIndicator_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerDrumType_LevelIndicator_Output_EURange = new ExpandedNodeId(Boiler.Variables.BoilerDrumType_LevelIndicator_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerOutputPipeType_FlowTransmitter2_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerOutputPipeType_FlowTransmitter2_Output = new ExpandedNodeId(Boiler.Variables.BoilerOutputPipeType_FlowTransmitter2_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerOutputPipeType_FlowTransmitter2_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerOutputPipeType_FlowTransmitter2_Output_EURange = new ExpandedNodeId(Boiler.Variables.BoilerOutputPipeType_FlowTransmitter2_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_FlowTransmitter1_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_InputPipe_FlowTransmitter1_Output = new ExpandedNodeId(Boiler.Variables.BoilerType_InputPipe_FlowTransmitter1_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_FlowTransmitter1_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_InputPipe_FlowTransmitter1_Output_EURange = new ExpandedNodeId(Boiler.Variables.BoilerType_InputPipe_FlowTransmitter1_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_Valve_Input Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_InputPipe_Valve_Input = new ExpandedNodeId(Boiler.Variables.BoilerType_InputPipe_Valve_Input, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_InputPipe_Valve_Input_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_InputPipe_Valve_Input_EURange = new ExpandedNodeId(Boiler.Variables.BoilerType_InputPipe_Valve_Input_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_LevelIndicator_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_LevelIndicator_Output = new ExpandedNodeId(Boiler.Variables.BoilerType_Drum_LevelIndicator_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_LevelIndicator_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_LevelIndicator_Output_EURange = new ExpandedNodeId(Boiler.Variables.BoilerType_Drum_LevelIndicator_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_OutputPipe_FlowTransmitter2_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_OutputPipe_FlowTransmitter2_Output = new ExpandedNodeId(Boiler.Variables.BoilerType_OutputPipe_FlowTransmitter2_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_OutputPipe_FlowTransmitter2_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_OutputPipe_FlowTransmitter2_Output_EURange = new ExpandedNodeId(Boiler.Variables.BoilerType_OutputPipe_FlowTransmitter2_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_FlowController_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_FlowController_Measurement = new ExpandedNodeId(Boiler.Variables.BoilerType_FlowController_Measurement, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_FlowController_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_FlowController_SetPoint = new ExpandedNodeId(Boiler.Variables.BoilerType_FlowController_SetPoint, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_FlowController_ControlOut Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_FlowController_ControlOut = new ExpandedNodeId(Boiler.Variables.BoilerType_FlowController_ControlOut, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_LevelController_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_LevelController_Measurement = new ExpandedNodeId(Boiler.Variables.BoilerType_LevelController_Measurement, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_LevelController_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_LevelController_SetPoint = new ExpandedNodeId(Boiler.Variables.BoilerType_LevelController_SetPoint, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_LevelController_ControlOut Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_LevelController_ControlOut = new ExpandedNodeId(Boiler.Variables.BoilerType_LevelController_ControlOut, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_Input1 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_CustomController_Input1 = new ExpandedNodeId(Boiler.Variables.BoilerType_CustomController_Input1, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_Input2 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_CustomController_Input2 = new ExpandedNodeId(Boiler.Variables.BoilerType_CustomController_Input2, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_Input3 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_CustomController_Input3 = new ExpandedNodeId(Boiler.Variables.BoilerType_CustomController_Input3, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_ControlOut Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_CustomController_ControlOut = new ExpandedNodeId(Boiler.Variables.BoilerType_CustomController_ControlOut, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_CustomController_DescriptionX Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_CustomController_DescriptionX = new ExpandedNodeId(Boiler.Variables.BoilerType_CustomController_DescriptionX, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_CurrentState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_CurrentState = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_CurrentState, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_CurrentState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_CurrentState_Id = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_CurrentState_Id, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_CurrentState_Number Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_CurrentState_Number = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_CurrentState_Number, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_LastTransition Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_LastTransition = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_LastTransition, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_LastTransition_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_LastTransition_Id = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_LastTransition_Id, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_LastTransition_Number Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_LastTransition_Number = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_LastTransition_Number, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_LastTransition_TransitionTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_LastTransition_TransitionTime = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_LastTransition_TransitionTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_Deletable Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_Deletable = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_Deletable, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_AutoDelete Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_AutoDelete = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_AutoDelete, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_RecycleCount Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_RecycleCount = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_RecycleCount, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_CreateSessionId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_CreateSessionId = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_CreateSessionId, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_CreateClientName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_CreateClientName = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_CreateClientName, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_InvocationCreationTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_InvocationCreationTime = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_InvocationCreationTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastTransitionTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastTransitionTime = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastTransitionTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodCall Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastMethodCall = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastMethodCall, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodSessionId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastMethodSessionId = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastMethodSessionId, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodInputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastMethodInputArguments = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastMethodInputArguments, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputArguments = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputArguments, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodInputValues Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastMethodInputValues = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastMethodInputValues, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputValues Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputValues = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastMethodOutputValues, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodCallTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastMethodCallTime = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastMethodCallTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_ProgramDiagnostic_LastMethodReturnStatus Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_ProgramDiagnostic_LastMethodReturnStatus = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_ProgramDiagnostic_LastMethodReturnStatus, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Simulation_UpdateRate Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Simulation_UpdateRate = new ExpandedNodeId(Boiler.Variables.BoilerType_Simulation_UpdateRate, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_FlowTransmitter1_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_InputPipe_FlowTransmitter1_Output = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_InputPipe_FlowTransmitter1_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_FlowTransmitter1_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_InputPipe_FlowTransmitter1_Output_EURange = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_InputPipe_FlowTransmitter1_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_Valve_Input Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_InputPipe_Valve_Input = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_InputPipe_Valve_Input, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_InputPipe_Valve_Input_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_InputPipe_Valve_Input_EURange = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_InputPipe_Valve_Input_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Drum_LevelIndicator_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Drum_LevelIndicator_Output = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Drum_LevelIndicator_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Drum_LevelIndicator_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Drum_LevelIndicator_Output_EURange = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Drum_LevelIndicator_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output_EURange = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_OutputPipe_FlowTransmitter2_Output_EURange, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_FlowController_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_FlowController_Measurement = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_FlowController_Measurement, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_FlowController_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_FlowController_SetPoint = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_FlowController_SetPoint, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_FlowController_ControlOut Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_FlowController_ControlOut = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_FlowController_ControlOut, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_LevelController_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_LevelController_Measurement = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_LevelController_Measurement, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_LevelController_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_LevelController_SetPoint = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_LevelController_SetPoint, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_LevelController_ControlOut Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_LevelController_ControlOut = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_LevelController_ControlOut, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_Input1 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_CustomController_Input1 = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_CustomController_Input1, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_Input2 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_CustomController_Input2 = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_CustomController_Input2, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_Input3 Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_CustomController_Input3 = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_CustomController_Input3, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_ControlOut Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_CustomController_ControlOut = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_CustomController_ControlOut, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_CustomController_DescriptionX Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_CustomController_DescriptionX = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_CustomController_DescriptionX, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_CurrentState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_CurrentState = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_CurrentState, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_CurrentState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_CurrentState_Id = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_CurrentState_Id, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_CurrentState_Number Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_CurrentState_Number = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_CurrentState_Number, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_LastTransition Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_LastTransition = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_LastTransition, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_LastTransition_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_LastTransition_Id = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_LastTransition_Id, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_LastTransition_Number Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_LastTransition_Number = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_LastTransition_Number, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_LastTransition_TransitionTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_LastTransition_TransitionTime = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_LastTransition_TransitionTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_Deletable Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_Deletable = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_Deletable, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_AutoDelete Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_AutoDelete = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_AutoDelete, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_RecycleCount Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_RecycleCount = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_RecycleCount, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateSessionId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateSessionId = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateSessionId, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateClientName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateClientName = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_CreateClientName, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_InvocationCreationTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_InvocationCreationTime = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_InvocationCreationTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastTransitionTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastTransitionTime = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastTransitionTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCall Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCall = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCall, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodSessionId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodSessionId = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodSessionId, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputArguments = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputArguments, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputArguments = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputArguments, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputValues Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputValues = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputValues, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputValues Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputValues = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputValues, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCallTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCallTime = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCallTime, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodReturnStatus Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodReturnStatus = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodReturnStatus, Boiler.Namespaces.Boiler);\n\n        /// <summary>\n        /// The identifier for the Boilers_Boiler1_Simulation_UpdateRate Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Boilers_Boiler1_Simulation_UpdateRate = new ExpandedNodeId(Boiler.Variables.Boilers_Boiler1_Simulation_UpdateRate, Boiler.Namespaces.Boiler);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the Boiler1 component.\n        /// </summary>\n        public const string Boiler1 = \"Boiler #1\";\n\n        /// <summary>\n        /// The BrowseName for the BoilerDrumType component.\n        /// </summary>\n        public const string BoilerDrumType = \"BoilerDrumType\";\n\n        /// <summary>\n        /// The BrowseName for the BoilerInputPipeType component.\n        /// </summary>\n        public const string BoilerInputPipeType = \"BoilerInputPipeType\";\n\n        /// <summary>\n        /// The BrowseName for the BoilerOutputPipeType component.\n        /// </summary>\n        public const string BoilerOutputPipeType = \"BoilerOutputPipeType\";\n\n        /// <summary>\n        /// The BrowseName for the Boilers component.\n        /// </summary>\n        public const string Boilers = \"Boilers\";\n\n        /// <summary>\n        /// The BrowseName for the BoilerStateMachineType component.\n        /// </summary>\n        public const string BoilerStateMachineType = \"BoilerStateMachineType\";\n\n        /// <summary>\n        /// The BrowseName for the BoilerType component.\n        /// </summary>\n        public const string BoilerType = \"BoilerType\";\n\n        /// <summary>\n        /// The BrowseName for the ControlOut component.\n        /// </summary>\n        public const string ControlOut = \"ControlOut\";\n\n        /// <summary>\n        /// The BrowseName for the CustomController component.\n        /// </summary>\n        public const string CustomController = \"CCX001\";\n\n        /// <summary>\n        /// The BrowseName for the CustomControllerType component.\n        /// </summary>\n        public const string CustomControllerType = \"CustomControllerType\";\n\n        /// <summary>\n        /// The BrowseName for the DescriptionX component.\n        /// </summary>\n        public const string DescriptionX = \"Description\";\n\n        /// <summary>\n        /// The BrowseName for the Drum component.\n        /// </summary>\n        public const string Drum = \"DrumX001\";\n\n        /// <summary>\n        /// The BrowseName for the FlowController component.\n        /// </summary>\n        public const string FlowController = \"FCX001\";\n\n        /// <summary>\n        /// The BrowseName for the FlowControllerType component.\n        /// </summary>\n        public const string FlowControllerType = \"FlowControllerType\";\n\n        /// <summary>\n        /// The BrowseName for the FlowTo component.\n        /// </summary>\n        public const string FlowTo = \"FlowTo\";\n\n        /// <summary>\n        /// The BrowseName for the FlowTransmitter1 component.\n        /// </summary>\n        public const string FlowTransmitter1 = \"FTX001\";\n\n        /// <summary>\n        /// The BrowseName for the FlowTransmitter2 component.\n        /// </summary>\n        public const string FlowTransmitter2 = \"FTX002\";\n\n        /// <summary>\n        /// The BrowseName for the FlowTransmitterType component.\n        /// </summary>\n        public const string FlowTransmitterType = \"FlowTransmitterType\";\n\n        /// <summary>\n        /// The BrowseName for the GenericActuatorType component.\n        /// </summary>\n        public const string GenericActuatorType = \"GenericActuatorType\";\n\n        /// <summary>\n        /// The BrowseName for the GenericControllerType component.\n        /// </summary>\n        public const string GenericControllerType = \"GenericControllerType\";\n\n        /// <summary>\n        /// The BrowseName for the GenericSensorType component.\n        /// </summary>\n        public const string GenericSensorType = \"GenericSensorType\";\n\n        /// <summary>\n        /// The BrowseName for the Halt component.\n        /// </summary>\n        public const string Halt = \"Halt\";\n\n        /// <summary>\n        /// The BrowseName for the HotFlowTo component.\n        /// </summary>\n        public const string HotFlowTo = \"HotFlowTo\";\n\n        /// <summary>\n        /// The BrowseName for the Input component.\n        /// </summary>\n        public const string Input = \"Input\";\n\n        /// <summary>\n        /// The BrowseName for the Input1 component.\n        /// </summary>\n        public const string Input1 = \"Input1\";\n\n        /// <summary>\n        /// The BrowseName for the Input2 component.\n        /// </summary>\n        public const string Input2 = \"Input2\";\n\n        /// <summary>\n        /// The BrowseName for the Input3 component.\n        /// </summary>\n        public const string Input3 = \"Input3\";\n\n        /// <summary>\n        /// The BrowseName for the InputPipe component.\n        /// </summary>\n        public const string InputPipe = \"PipeX001\";\n\n        /// <summary>\n        /// The BrowseName for the LevelController component.\n        /// </summary>\n        public const string LevelController = \"LCX001\";\n\n        /// <summary>\n        /// The BrowseName for the LevelControllerType component.\n        /// </summary>\n        public const string LevelControllerType = \"LevelControllerType\";\n\n        /// <summary>\n        /// The BrowseName for the LevelIndicator component.\n        /// </summary>\n        public const string LevelIndicator = \"LIX001\";\n\n        /// <summary>\n        /// The BrowseName for the LevelIndicatorType component.\n        /// </summary>\n        public const string LevelIndicatorType = \"LevelIndicatorType\";\n\n        /// <summary>\n        /// The BrowseName for the Measurement component.\n        /// </summary>\n        public const string Measurement = \"Measurement\";\n\n        /// <summary>\n        /// The BrowseName for the Output component.\n        /// </summary>\n        public const string Output = \"Output\";\n\n        /// <summary>\n        /// The BrowseName for the OutputPipe component.\n        /// </summary>\n        public const string OutputPipe = \"PipeX002\";\n\n        /// <summary>\n        /// The BrowseName for the Reset component.\n        /// </summary>\n        public const string Reset = \"Reset\";\n\n        /// <summary>\n        /// The BrowseName for the Resume component.\n        /// </summary>\n        public const string Resume = \"Resume\";\n\n        /// <summary>\n        /// The BrowseName for the SetPoint component.\n        /// </summary>\n        public const string SetPoint = \"SetPoint\";\n\n        /// <summary>\n        /// The BrowseName for the SignalTo component.\n        /// </summary>\n        public const string SignalTo = \"SignalTo\";\n\n        /// <summary>\n        /// The BrowseName for the Simulation component.\n        /// </summary>\n        public const string Simulation = \"Simulation\";\n\n        /// <summary>\n        /// The BrowseName for the Start component.\n        /// </summary>\n        public const string Start = \"Start\";\n\n        /// <summary>\n        /// The BrowseName for the Suspend component.\n        /// </summary>\n        public const string Suspend = \"Suspend\";\n\n        /// <summary>\n        /// The BrowseName for the UpdateRate component.\n        /// </summary>\n        public const string UpdateRate = \"UpdateRate\";\n\n        /// <summary>\n        /// The BrowseName for the Valve component.\n        /// </summary>\n        public const string Valve = \"ValveX001\";\n\n        /// <summary>\n        /// The BrowseName for the ValveType component.\n        /// </summary>\n        public const string ValveType = \"ValveType\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the Boiler namespace (.NET code namespace is 'Boiler').\n        /// </summary>\n        public const string Boiler = \"http://opcfoundation.org/UA/Boiler/\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/Boiler.NodeIds.csv",
    "content": "BoilerDrumType,1116,ObjectType\nBoilerInputPipeType,1101,ObjectType\nBoilerOutputPipeType,1124,ObjectType\nBoilers,1240,Object\nBoilerStateMachineType,1039,ObjectType\nBoilerType,1132,ObjectType\nCustomControllerType,513,ObjectType\nFlowControllerType,1021,ObjectType\nFlowTo,985,ReferenceType\nFlowTransmitterType,1032,ObjectType\nGenericActuatorType,998,ObjectType\nGenericControllerType,210,ObjectType\nGenericSensorType,991,ObjectType\nHotFlowTo,986,ReferenceType\nLevelControllerType,1017,ObjectType\nLevelIndicatorType,1025,ObjectType\nSignalTo,987,ReferenceType\nValveType,1010,ObjectType\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/Boiler.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/UA/Boiler/</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=210</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenericControllerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenericControllerType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A generic PID controller</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=988</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=989</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=990</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1017</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1021</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=513</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CustomControllerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CustomControllerType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A custom PID controller with 3 inputs</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ReferenceTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=985</Identifier>\n      </NodeId>\n      <NodeClass>ReferenceType_32</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FlowTo</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FlowTo</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A reference that indicates a flow between two objects.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=32</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=986</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <Symmetric>false</Symmetric>\n      <InverseName>\n        <Locale></Locale>\n        <Text>FlowFrom</Text>\n      </InverseName>\n    </Node>\n    <Node i:type=\"ReferenceTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=986</Identifier>\n      </NodeId>\n      <NodeClass>ReferenceType_32</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>HotFlowTo</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>HotFlowTo</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A reference that indicates a high temperature flow between two objects.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=985</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <Symmetric>false</Symmetric>\n      <InverseName>\n        <Locale></Locale>\n        <Text>HotFlowFrom</Text>\n      </InverseName>\n    </Node>\n    <Node i:type=\"ReferenceTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=987</Identifier>\n      </NodeId>\n      <NodeClass>ReferenceType_32</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SignalTo</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SignalTo</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A reference that indicates an electrical signal between two variables.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=32</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <Symmetric>false</Symmetric>\n      <InverseName>\n        <Locale></Locale>\n        <Text>SignalFrom</Text>\n      </InverseName>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=988</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=210</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=989</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=210</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=990</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ControlOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ControlOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=210</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=991</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenericSensorType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenericSensorType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A generic sensor that read a process value.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=992</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1025</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=992</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=991</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=995</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=992</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=998</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenericActuatorType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenericActuatorType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Represents a piece of equipment that causes some action to occur.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=999</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=999</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=998</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1002</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=999</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1005</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1006</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1007</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input3</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input3</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1008</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ControlOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ControlOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1009</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Description</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Description</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1010</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ValveType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ValveType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>An actuator that controls the flow through a pipe.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=998</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1017</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LevelControllerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LevelControllerType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A controller for the level of a fluid in a drum.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=210</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1021</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FlowControllerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FlowControllerType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A controller for the flow of a fluid through a pipe.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=210</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1025</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LevelIndicatorType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LevelIndicatorType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A sensor that reports the level of a liquid in a tank.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=991</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1032</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FlowTransmitterType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FlowTransmitterType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A sensor that reports the flow of a liquid through a pipe.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=991</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1039</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BoilerStateMachineType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BoilerStateMachineType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A program that produces simulated values for a running boiler.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2391</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1095</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1097</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1098</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1099</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1100</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1095</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Start</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Start</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Ready state to the Running state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2426</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1096</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Suspend</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Suspend</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Running state to the Suspended state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2427</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1097</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Resume</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Resume</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Suspended state to the Running state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2428</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1098</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Halt</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Halt</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2429</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1099</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Reset</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Reset</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Halted state to the Ready state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2430</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1100</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UpdateRate</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UpdateRate</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The rate at which the simulation runs.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1101</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BoilerInputPipeType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BoilerInputPipeType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1102</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1102</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1109</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1102</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FTX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FTX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1101</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1103</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1103</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1102</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1106</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1106</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1103</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1109</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ValveX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ValveX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1101</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1110</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1110</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1109</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1113</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1110</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1116</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BoilerDrumType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BoilerDrumType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1117</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LIX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LIX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1116</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1025</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1118</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1118</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1121</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1121</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1118</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1124</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BoilerOutputPipeType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BoilerOutputPipeType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1125</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1125</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1125</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FTX002</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FTX002</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1124</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1126</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1126</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1125</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1129</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1129</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1126</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1132</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BoilerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BoilerType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A boiler used to produce steam for a turbine.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1133</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1148</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1156</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1133</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1148</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1156</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1164</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1168</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1172</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1133</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PipeX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PipeX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1101</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1134</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=985</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1148</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1134</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1141</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1134</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FTX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FTX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1133</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1133</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1135</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1135</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1134</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1165</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1174</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1138</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1138</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1135</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1141</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ValveX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ValveX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1133</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1142</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1142</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1141</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1167</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1145</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1145</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1142</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1148</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DrumX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DrumX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1116</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=985</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1133</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1149</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=986</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1156</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1149</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1149</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LIX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LIX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1148</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1025</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1148</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1150</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1150</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1149</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1169</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1153</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1153</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1150</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1156</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PipeX002</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PipeX002</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1124</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=986</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1148</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1157</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1157</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1157</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FTX002</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FTX002</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1156</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1156</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1158</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1157</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1175</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1161</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1161</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1164</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FCX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FCX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1021</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1165</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1166</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1167</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1165</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1164</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1135</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1166</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1164</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1176</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1167</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ControlOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ControlOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1164</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1142</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1168</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LCX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LCX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1017</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1169</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1170</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1171</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1169</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1168</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1150</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1170</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1168</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1171</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ControlOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ControlOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1168</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1173</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1172</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CCX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CCX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1173</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1174</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1175</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1176</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1177</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1173</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1172</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1171</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1174</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1172</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1135</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1175</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input3</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input3</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1172</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1176</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ControlOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ControlOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1172</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1166</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1177</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Description</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Description</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1172</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1178</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Simulation</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Simulation</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1179</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1184</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1190</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1191</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1192</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1239</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15014</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15016</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15017</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1179</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>CurrentState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CurrentState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2760</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1180</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1182</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1180</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1179</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1182</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Number</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Number</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1179</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1184</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastTransition</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastTransition</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2767</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1185</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1187</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1188</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1185</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1184</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1187</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Number</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Number</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1184</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1188</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1184</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1190</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deletable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deletable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1191</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AutoDelete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AutoDelete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1192</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>RecycleCount</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>RecycleCount</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1239</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UpdateRate</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UpdateRate</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The rate at which the simulation runs.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1240</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Boilers</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Boilers</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=85</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2253</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1241</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Boiler #1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Boiler #1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1240</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1240</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1257</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1257</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1273</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1277</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1242</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PipeX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Pipe1001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1101</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=985</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1257</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1250</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1243</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FTX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FTX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1244</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1244</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1274</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1283</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1247</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1244</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1250</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ValveX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ValveX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1251</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1250</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1276</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1254</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1254</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1257</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DrumX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Drum1001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1116</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=985</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1258</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=986</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1258</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1258</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LIX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LIX001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1257</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1025</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1257</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1259</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1259</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1258</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1278</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1262</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1262</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1259</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1265</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PipeX002</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Pipe1002</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1124</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=986</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1257</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1266</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1266</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1266</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FTX002</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FTX002</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1267</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1267</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Output</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Output</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1266</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1284</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1270</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1270</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1267</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1273</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FCX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FC1001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1021</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1274</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1275</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1276</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1274</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1273</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1244</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1275</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1273</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1285</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1276</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ControlOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ControlOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1273</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1277</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LCX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LC1001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1017</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1278</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1279</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1280</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1278</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1277</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1259</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1279</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1277</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1280</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ControlOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ControlOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1277</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1282</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1281</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CCX001</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CC1001</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1282</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1283</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1284</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1285</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1286</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1282</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1280</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1283</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1244</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1284</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Input3</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Input3</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1267</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>2</AccessLevel>\n      <UserAccessLevel>2</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1285</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ControlOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ControlOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>ns=1;i=987</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1275</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1286</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Description</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Description</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1287</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Simulation</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Simulation</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1288</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1293</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1299</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1300</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1301</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1348</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15018</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15019</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15020</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15021</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15022</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1288</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>CurrentState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CurrentState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2760</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1289</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1291</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1289</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1288</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1291</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Number</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Number</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1288</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1293</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastTransition</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastTransition</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2767</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1294</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1296</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1297</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1294</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1293</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1296</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Number</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Number</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1293</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1297</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1293</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1299</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deletable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deletable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1300</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AutoDelete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AutoDelete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1301</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>RecycleCount</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>RecycleCount</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1348</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UpdateRate</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UpdateRate</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The rate at which the simulation runs.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15013</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Start</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Start</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Ready state to the Running state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1095</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15014</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Suspend</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Suspend</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Running state to the Suspended state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15015</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Resume</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Resume</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Suspended state to the Running state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1097</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15016</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Halt</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Halt</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1098</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15017</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Reset</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Reset</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Halted state to the Ready state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1178</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1099</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15018</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Start</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Start</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Ready state to the Running state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1095</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15019</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Suspend</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Suspend</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Running state to the Suspended state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15020</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Resume</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Resume</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Suspended state to the Running state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1097</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15021</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Halt</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Halt</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1098</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15022</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Reset</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Reset</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Causes the Program to transition from the Halted state to the Ready state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1099</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/Boiler.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/Boiler/</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/Boiler/\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UAReferenceType NodeId=\"ns=1;i=985\" BrowseName=\"1:FlowTo\">\n    <DisplayName>FlowTo</DisplayName>\n    <Description>A reference that indicates a flow between two objects.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=32</Reference>\n    </References>\n    <InverseName>FlowFrom</InverseName>\n  </UAReferenceType>\n  <UAReferenceType NodeId=\"ns=1;i=986\" BrowseName=\"1:HotFlowTo\">\n    <DisplayName>HotFlowTo</DisplayName>\n    <Description>A reference that indicates a high temperature flow between two objects.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=985</Reference>\n    </References>\n    <InverseName>HotFlowFrom</InverseName>\n  </UAReferenceType>\n  <UAReferenceType NodeId=\"ns=1;i=987\" BrowseName=\"1:SignalTo\">\n    <DisplayName>SignalTo</DisplayName>\n    <Description>A reference that indicates an electrical signal between two variables.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=32</Reference>\n    </References>\n    <InverseName>SignalFrom</InverseName>\n  </UAReferenceType>\n  <UAObjectType NodeId=\"ns=1;i=210\" BrowseName=\"1:GenericControllerType\">\n    <DisplayName>GenericControllerType</DisplayName>\n    <Description>A generic PID controller</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=988</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=989</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=990</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=988\" BrowseName=\"1:Measurement\" ParentNodeId=\"ns=1;i=210\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=210</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=989\" BrowseName=\"1:SetPoint\" ParentNodeId=\"ns=1;i=210\" DataType=\"Double\" AccessLevel=\"3\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=210</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=990\" BrowseName=\"1:ControlOut\" ParentNodeId=\"ns=1;i=210\" DataType=\"Double\">\n    <DisplayName>ControlOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=210</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=991\" BrowseName=\"1:GenericSensorType\">\n    <DisplayName>GenericSensorType</DisplayName>\n    <Description>A generic sensor that read a process value.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=992</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=992\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=991\" DataType=\"Double\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=995</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=991</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=995\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=992\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=992</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=998\" BrowseName=\"1:GenericActuatorType\">\n    <DisplayName>GenericActuatorType</DisplayName>\n    <Description>Represents a piece of equipment that causes some action to occur.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=999</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=999\" BrowseName=\"1:Input\" ParentNodeId=\"ns=1;i=998\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=998</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1002\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=999\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=999</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=513\" BrowseName=\"1:CustomControllerType\">\n    <DisplayName>CustomControllerType</DisplayName>\n    <Description>A custom PID controller with 3 inputs</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1007</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1009</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=1005\" BrowseName=\"1:Input1\" ParentNodeId=\"ns=1;i=513\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=513</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1006\" BrowseName=\"1:Input2\" ParentNodeId=\"ns=1;i=513\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=513</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1007\" BrowseName=\"1:Input3\" ParentNodeId=\"ns=1;i=513\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input3</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=513</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1008\" BrowseName=\"1:ControlOut\" ParentNodeId=\"ns=1;i=513\" DataType=\"Double\">\n    <DisplayName>ControlOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=513</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1009\" BrowseName=\"1:Description\" SymbolicName=\"DescriptionX\" ParentNodeId=\"ns=1;i=513\" DataType=\"LocalizedText\">\n    <DisplayName>Description</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=513</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1010\" BrowseName=\"1:ValveType\">\n    <DisplayName>ValveType</DisplayName>\n    <Description>An actuator that controls the flow through a pipe.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=998</Reference>\n    </References>\n  </UAObjectType>\n  <UAObjectType NodeId=\"ns=1;i=1017\" BrowseName=\"1:LevelControllerType\">\n    <DisplayName>LevelControllerType</DisplayName>\n    <Description>A controller for the level of a fluid in a drum.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=210</Reference>\n    </References>\n  </UAObjectType>\n  <UAObjectType NodeId=\"ns=1;i=1021\" BrowseName=\"1:FlowControllerType\">\n    <DisplayName>FlowControllerType</DisplayName>\n    <Description>A controller for the flow of a fluid through a pipe.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=210</Reference>\n    </References>\n  </UAObjectType>\n  <UAObjectType NodeId=\"ns=1;i=1025\" BrowseName=\"1:LevelIndicatorType\">\n    <DisplayName>LevelIndicatorType</DisplayName>\n    <Description>A sensor that reports the level of a liquid in a tank.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=991</Reference>\n    </References>\n  </UAObjectType>\n  <UAObjectType NodeId=\"ns=1;i=1032\" BrowseName=\"1:FlowTransmitterType\">\n    <DisplayName>FlowTransmitterType</DisplayName>\n    <Description>A sensor that reports the flow of a liquid through a pipe.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=991</Reference>\n    </References>\n  </UAObjectType>\n  <UAObjectType NodeId=\"ns=1;i=1039\" BrowseName=\"1:BoilerStateMachineType\">\n    <DisplayName>BoilerStateMachineType</DisplayName>\n    <Description>A program that produces simulated values for a running boiler.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1095</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1096</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1097</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1098</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1099</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1100</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2391</Reference>\n    </References>\n  </UAObjectType>\n  <UAMethod NodeId=\"ns=1;i=1095\" BrowseName=\"1:Start\" ParentNodeId=\"ns=1;i=1039\" MethodDeclarationId=\"i=2426\">\n    <DisplayName>Start</DisplayName>\n    <Description>Causes the Program to transition from the Ready state to the Running state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1039</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=1096\" BrowseName=\"1:Suspend\" ParentNodeId=\"ns=1;i=1039\" MethodDeclarationId=\"i=2427\">\n    <DisplayName>Suspend</DisplayName>\n    <Description>Causes the Program to transition from the Running state to the Suspended state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1039</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=1097\" BrowseName=\"1:Resume\" ParentNodeId=\"ns=1;i=1039\" MethodDeclarationId=\"i=2428\">\n    <DisplayName>Resume</DisplayName>\n    <Description>Causes the Program to transition from the Suspended state to the Running state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1039</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=1098\" BrowseName=\"1:Halt\" ParentNodeId=\"ns=1;i=1039\" MethodDeclarationId=\"i=2429\">\n    <DisplayName>Halt</DisplayName>\n    <Description>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1039</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=1099\" BrowseName=\"1:Reset\" ParentNodeId=\"ns=1;i=1039\" MethodDeclarationId=\"i=2430\">\n    <DisplayName>Reset</DisplayName>\n    <Description>Causes the Program to transition from the Halted state to the Ready state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1039</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=1100\" BrowseName=\"1:UpdateRate\" ParentNodeId=\"ns=1;i=1039\" DataType=\"UInt32\" AccessLevel=\"3\">\n    <DisplayName>UpdateRate</DisplayName>\n    <Description>The rate at which the simulation runs.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1039</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1101\" BrowseName=\"1:BoilerInputPipeType\">\n    <DisplayName>BoilerInputPipeType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1102</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1109</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1102</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=61</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=1102\" BrowseName=\"1:FTX001\" SymbolicName=\"FlowTransmitter1\" ParentNodeId=\"ns=1;i=1101\" EventNotifier=\"1\">\n    <DisplayName>FTX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1103</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1032</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1101</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1103\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1102\" DataType=\"Double\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1106</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1102</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1106\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1103\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1103</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1109\" BrowseName=\"1:ValveX001\" SymbolicName=\"Valve\" ParentNodeId=\"ns=1;i=1101\" EventNotifier=\"1\">\n    <DisplayName>ValveX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1110</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1010</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1101</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1110\" BrowseName=\"1:Input\" ParentNodeId=\"ns=1;i=1109\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1113</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1109</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1113\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1110\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1110</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1116\" BrowseName=\"1:BoilerDrumType\">\n    <DisplayName>BoilerDrumType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1117</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1117</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=61</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=1117\" BrowseName=\"1:LIX001\" SymbolicName=\"LevelIndicator\" ParentNodeId=\"ns=1;i=1116\" EventNotifier=\"1\">\n    <DisplayName>LIX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1118</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1025</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1116</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1118\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1117\" DataType=\"Double\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1121</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1121\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1118\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1118</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1124\" BrowseName=\"1:BoilerOutputPipeType\">\n    <DisplayName>BoilerOutputPipeType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1125</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1125</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=61</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=1125\" BrowseName=\"1:FTX002\" SymbolicName=\"FlowTransmitter2\" ParentNodeId=\"ns=1;i=1124\" EventNotifier=\"1\">\n    <DisplayName>FTX002</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1126</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1032</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1124</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1126\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1125\" DataType=\"Double\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1129</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1125</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1129\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1126\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1126</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1132\" BrowseName=\"1:BoilerType\">\n    <DisplayName>BoilerType</DisplayName>\n    <Description>A boiler used to produce steam for a turbine.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1133</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1148</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1156</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1164</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1168</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1172</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1178</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1133</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1148</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1156</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=1178</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=1133\" BrowseName=\"1:PipeX001\" SymbolicName=\"InputPipe\" ParentNodeId=\"ns=1;i=1132\" EventNotifier=\"1\">\n    <DisplayName>PipeX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1134</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1141</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1134</Reference>\n      <Reference ReferenceType=\"ns=1;i=985\">ns=1;i=1148</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1101</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1132</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1134\" BrowseName=\"1:FTX001\" SymbolicName=\"FlowTransmitter1\" ParentNodeId=\"ns=1;i=1133\" EventNotifier=\"1\">\n    <DisplayName>FTX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1135</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1133</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1032</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1133</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1135\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1134\" DataType=\"Double\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1138</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1165</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1174</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1134</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1138\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1135\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1135</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1141\" BrowseName=\"1:ValveX001\" SymbolicName=\"Valve\" ParentNodeId=\"ns=1;i=1133\" EventNotifier=\"1\">\n    <DisplayName>ValveX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1142</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1010</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1133</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1142\" BrowseName=\"1:Input\" ParentNodeId=\"ns=1;i=1141\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1145</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1167</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1141</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1145\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1142\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1142</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1148\" BrowseName=\"1:DrumX001\" SymbolicName=\"Drum\" ParentNodeId=\"ns=1;i=1132\" EventNotifier=\"1\">\n    <DisplayName>DrumX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1149</Reference>\n      <Reference ReferenceType=\"ns=1;i=985\" IsForward=\"false\">ns=1;i=1133</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1149</Reference>\n      <Reference ReferenceType=\"ns=1;i=986\">ns=1;i=1156</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1116</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1132</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1149\" BrowseName=\"1:LIX001\" SymbolicName=\"LevelIndicator\" ParentNodeId=\"ns=1;i=1148\" EventNotifier=\"1\">\n    <DisplayName>LIX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1150</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1148</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1025</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1148</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1150\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1149\" DataType=\"Number\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1153</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1169</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1149</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1153\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1150\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1150</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1156\" BrowseName=\"1:PipeX002\" SymbolicName=\"OutputPipe\" ParentNodeId=\"ns=1;i=1132\" EventNotifier=\"1\">\n    <DisplayName>PipeX002</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1157</Reference>\n      <Reference ReferenceType=\"ns=1;i=986\" IsForward=\"false\">ns=1;i=1148</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1157</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1124</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1132</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1157\" BrowseName=\"1:FTX002\" SymbolicName=\"FlowTransmitter2\" ParentNodeId=\"ns=1;i=1156\" EventNotifier=\"1\">\n    <DisplayName>FTX002</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1158</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1156</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1032</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1156</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1158\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1157\" DataType=\"Double\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1161</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1175</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1157</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1161\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1158\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1158</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1164\" BrowseName=\"1:FCX001\" SymbolicName=\"FlowController\" ParentNodeId=\"ns=1;i=1132\">\n    <DisplayName>FCX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1165</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1166</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1167</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1021</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1132</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1165\" BrowseName=\"1:Measurement\" ParentNodeId=\"ns=1;i=1164\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1135</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1164</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1166\" BrowseName=\"1:SetPoint\" ParentNodeId=\"ns=1;i=1164\" DataType=\"Double\" AccessLevel=\"3\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1176</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1164</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1167\" BrowseName=\"1:ControlOut\" ParentNodeId=\"ns=1;i=1164\" DataType=\"Double\">\n    <DisplayName>ControlOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1142</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1164</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1168\" BrowseName=\"1:LCX001\" SymbolicName=\"LevelController\" ParentNodeId=\"ns=1;i=1132\">\n    <DisplayName>LCX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1169</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1170</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1171</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1017</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1132</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1169\" BrowseName=\"1:Measurement\" ParentNodeId=\"ns=1;i=1168\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1150</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1168</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1170\" BrowseName=\"1:SetPoint\" ParentNodeId=\"ns=1;i=1168\" DataType=\"Double\" AccessLevel=\"3\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1168</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1171\" BrowseName=\"1:ControlOut\" ParentNodeId=\"ns=1;i=1168\" DataType=\"Double\">\n    <DisplayName>ControlOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1173</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1168</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1172\" BrowseName=\"1:CCX001\" SymbolicName=\"CustomController\" ParentNodeId=\"ns=1;i=1132\">\n    <DisplayName>CCX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1173</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1174</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1175</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1176</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1177</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=513</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1132</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1173\" BrowseName=\"1:Input1\" ParentNodeId=\"ns=1;i=1172\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1171</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1172</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1174\" BrowseName=\"1:Input2\" ParentNodeId=\"ns=1;i=1172\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1135</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1172</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1175\" BrowseName=\"1:Input3\" ParentNodeId=\"ns=1;i=1172\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input3</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1158</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1172</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1176\" BrowseName=\"1:ControlOut\" ParentNodeId=\"ns=1;i=1172\" DataType=\"Double\">\n    <DisplayName>ControlOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1166</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1172</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1177\" BrowseName=\"1:Description\" SymbolicName=\"DescriptionX\" ParentNodeId=\"ns=1;i=1172\" DataType=\"LocalizedText\">\n    <DisplayName>Description</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1172</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1178\" BrowseName=\"1:Simulation\" ParentNodeId=\"ns=1;i=1132\" EventNotifier=\"1\">\n    <DisplayName>Simulation</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1179</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1184</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1190</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1191</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1192</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1239</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15013</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15014</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15015</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15016</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15017</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1039</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1132</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1179\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=1178\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1180</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1182</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1180\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=1179\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1179</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1182\" BrowseName=\"Number\" ParentNodeId=\"ns=1;i=1179\" DataType=\"UInt32\">\n    <DisplayName>Number</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1179</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1184\" BrowseName=\"LastTransition\" ParentNodeId=\"ns=1;i=1178\" DataType=\"LocalizedText\">\n    <DisplayName>LastTransition</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1185</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1187</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1188</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2767</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1185\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=1184\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1184</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1187\" BrowseName=\"Number\" ParentNodeId=\"ns=1;i=1184\" DataType=\"UInt32\">\n    <DisplayName>Number</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1184</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1188\" BrowseName=\"TransitionTime\" ParentNodeId=\"ns=1;i=1184\" DataType=\"i=294\">\n    <DisplayName>TransitionTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1184</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1190\" BrowseName=\"Deletable\" ParentNodeId=\"ns=1;i=1178\" DataType=\"Boolean\">\n    <DisplayName>Deletable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1191\" BrowseName=\"AutoDelete\" ParentNodeId=\"ns=1;i=1178\" DataType=\"Boolean\">\n    <DisplayName>AutoDelete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1192\" BrowseName=\"RecycleCount\" ParentNodeId=\"ns=1;i=1178\" DataType=\"Int32\">\n    <DisplayName>RecycleCount</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1239\" BrowseName=\"1:UpdateRate\" ParentNodeId=\"ns=1;i=1178\" DataType=\"UInt32\" AccessLevel=\"3\">\n    <DisplayName>UpdateRate</DisplayName>\n    <Description>The rate at which the simulation runs.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=15013\" BrowseName=\"1:Start\" ParentNodeId=\"ns=1;i=1178\" MethodDeclarationId=\"ns=1;i=1095\">\n    <DisplayName>Start</DisplayName>\n    <Description>Causes the Program to transition from the Ready state to the Running state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=15014\" BrowseName=\"1:Suspend\" ParentNodeId=\"ns=1;i=1178\" MethodDeclarationId=\"ns=1;i=1096\">\n    <DisplayName>Suspend</DisplayName>\n    <Description>Causes the Program to transition from the Running state to the Suspended state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=15015\" BrowseName=\"1:Resume\" ParentNodeId=\"ns=1;i=1178\" MethodDeclarationId=\"ns=1;i=1097\">\n    <DisplayName>Resume</DisplayName>\n    <Description>Causes the Program to transition from the Suspended state to the Running state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=15016\" BrowseName=\"1:Halt\" ParentNodeId=\"ns=1;i=1178\" MethodDeclarationId=\"ns=1;i=1098\">\n    <DisplayName>Halt</DisplayName>\n    <Description>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=15017\" BrowseName=\"1:Reset\" ParentNodeId=\"ns=1;i=1178\" MethodDeclarationId=\"ns=1;i=1099\">\n    <DisplayName>Reset</DisplayName>\n    <Description>Causes the Program to transition from the Halted state to the Ready state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1178</Reference>\n    </References>\n  </UAMethod>\n  <UAObject NodeId=\"ns=1;i=1240\" BrowseName=\"1:Boilers\" EventNotifier=\"1\">\n    <DisplayName>Boilers</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1241</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1241</Reference>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=85</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">i=2253</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=61</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1241\" BrowseName=\"1:Boiler #1\" SymbolicName=\"Boiler1\" ParentNodeId=\"ns=1;i=1240\">\n    <DisplayName>Boiler #1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1242</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1257</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1265</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1273</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1277</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1281</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1287</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1240</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1242</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1257</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1265</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=1287</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1132</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1240</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1242\" BrowseName=\"1:PipeX001\" SymbolicName=\"InputPipe\" ParentNodeId=\"ns=1;i=1241\" EventNotifier=\"1\">\n    <DisplayName>Pipe1001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1243</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1250</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1241</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1243</Reference>\n      <Reference ReferenceType=\"ns=1;i=985\">ns=1;i=1257</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1101</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1241</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1243\" BrowseName=\"1:FTX001\" SymbolicName=\"FlowTransmitter1\" ParentNodeId=\"ns=1;i=1242\" EventNotifier=\"1\">\n    <DisplayName>FTX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1244</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1242</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1032</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1242</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1244\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1243\" DataType=\"Double\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1247</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1274</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1283</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1247\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1244\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1244</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1250\" BrowseName=\"1:ValveX001\" SymbolicName=\"Valve\" ParentNodeId=\"ns=1;i=1242\" EventNotifier=\"1\">\n    <DisplayName>ValveX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1251</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1010</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1242</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1251\" BrowseName=\"1:Input\" ParentNodeId=\"ns=1;i=1250\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1254</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1276</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1250</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1254\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1251\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1251</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1257\" BrowseName=\"1:DrumX001\" SymbolicName=\"Drum\" ParentNodeId=\"ns=1;i=1241\" EventNotifier=\"1\">\n    <DisplayName>Drum1001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1258</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1241</Reference>\n      <Reference ReferenceType=\"ns=1;i=985\" IsForward=\"false\">ns=1;i=1242</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1258</Reference>\n      <Reference ReferenceType=\"ns=1;i=986\">ns=1;i=1265</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1116</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1241</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1258\" BrowseName=\"1:LIX001\" SymbolicName=\"LevelIndicator\" ParentNodeId=\"ns=1;i=1257\" EventNotifier=\"1\">\n    <DisplayName>LIX001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1259</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1257</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1025</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1257</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1259\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1258\" DataType=\"Number\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1262</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1278</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1258</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1262\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1259\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1259</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1265\" BrowseName=\"1:PipeX002\" SymbolicName=\"OutputPipe\" ParentNodeId=\"ns=1;i=1241\" EventNotifier=\"1\">\n    <DisplayName>Pipe1002</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1266</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1241</Reference>\n      <Reference ReferenceType=\"ns=1;i=986\" IsForward=\"false\">ns=1;i=1257</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=1266</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1124</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1241</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1266\" BrowseName=\"1:FTX002\" SymbolicName=\"FlowTransmitter2\" ParentNodeId=\"ns=1;i=1265\" EventNotifier=\"1\">\n    <DisplayName>FTX002</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1267</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=1265</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1032</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1265</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1267\" BrowseName=\"1:Output\" ParentNodeId=\"ns=1;i=1266\" DataType=\"Double\">\n    <DisplayName>Output</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1270</Reference>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1284</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1266</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1270\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=1267\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1267</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1273\" BrowseName=\"1:FCX001\" SymbolicName=\"FlowController\" ParentNodeId=\"ns=1;i=1241\">\n    <DisplayName>FC1001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1274</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1275</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1276</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1021</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1241</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1274\" BrowseName=\"1:Measurement\" ParentNodeId=\"ns=1;i=1273\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1244</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1273</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1275\" BrowseName=\"1:SetPoint\" ParentNodeId=\"ns=1;i=1273\" DataType=\"Double\" AccessLevel=\"3\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1285</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1273</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1276\" BrowseName=\"1:ControlOut\" ParentNodeId=\"ns=1;i=1273\" DataType=\"Double\">\n    <DisplayName>ControlOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1251</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1273</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1277\" BrowseName=\"1:LCX001\" SymbolicName=\"LevelController\" ParentNodeId=\"ns=1;i=1241\">\n    <DisplayName>LC1001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1278</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1279</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1280</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1017</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1241</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1278\" BrowseName=\"1:Measurement\" ParentNodeId=\"ns=1;i=1277\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1259</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1277</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1279\" BrowseName=\"1:SetPoint\" ParentNodeId=\"ns=1;i=1277\" DataType=\"Double\" AccessLevel=\"3\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1277</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1280\" BrowseName=\"1:ControlOut\" ParentNodeId=\"ns=1;i=1277\" DataType=\"Double\">\n    <DisplayName>ControlOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1282</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1277</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1281\" BrowseName=\"1:CCX001\" SymbolicName=\"CustomController\" ParentNodeId=\"ns=1;i=1241\">\n    <DisplayName>CC1001</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1282</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1283</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1284</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1285</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1286</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=513</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1241</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1282\" BrowseName=\"1:Input1\" ParentNodeId=\"ns=1;i=1281\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1280</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1281</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1283\" BrowseName=\"1:Input2\" ParentNodeId=\"ns=1;i=1281\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1244</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1281</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1284\" BrowseName=\"1:Input3\" ParentNodeId=\"ns=1;i=1281\" DataType=\"Double\" AccessLevel=\"2\">\n    <DisplayName>Input3</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\" IsForward=\"false\">ns=1;i=1267</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1281</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1285\" BrowseName=\"1:ControlOut\" ParentNodeId=\"ns=1;i=1281\" DataType=\"Double\">\n    <DisplayName>ControlOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"ns=1;i=987\">ns=1;i=1275</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1281</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1286\" BrowseName=\"1:Description\" SymbolicName=\"DescriptionX\" ParentNodeId=\"ns=1;i=1281\" DataType=\"LocalizedText\">\n    <DisplayName>Description</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1281</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1287\" BrowseName=\"1:Simulation\" ParentNodeId=\"ns=1;i=1241\" EventNotifier=\"1\">\n    <DisplayName>Simulation</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1288</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1293</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1299</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1300</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1301</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1348</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15018</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15019</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15020</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15021</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15022</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=1241</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1039</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1241</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=1288\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=1287\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1289</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1291</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1289\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=1288\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1288</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1291\" BrowseName=\"Number\" ParentNodeId=\"ns=1;i=1288\" DataType=\"UInt32\">\n    <DisplayName>Number</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1288</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1293\" BrowseName=\"LastTransition\" ParentNodeId=\"ns=1;i=1287\" DataType=\"LocalizedText\">\n    <DisplayName>LastTransition</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1294</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1296</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1297</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2767</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1294\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=1293\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1293</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1296\" BrowseName=\"Number\" ParentNodeId=\"ns=1;i=1293\" DataType=\"UInt32\">\n    <DisplayName>Number</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1293</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1297\" BrowseName=\"TransitionTime\" ParentNodeId=\"ns=1;i=1293\" DataType=\"i=294\">\n    <DisplayName>TransitionTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1293</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1299\" BrowseName=\"Deletable\" ParentNodeId=\"ns=1;i=1287\" DataType=\"Boolean\">\n    <DisplayName>Deletable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1300\" BrowseName=\"AutoDelete\" ParentNodeId=\"ns=1;i=1287\" DataType=\"Boolean\">\n    <DisplayName>AutoDelete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1301\" BrowseName=\"RecycleCount\" ParentNodeId=\"ns=1;i=1287\" DataType=\"Int32\">\n    <DisplayName>RecycleCount</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1348\" BrowseName=\"1:UpdateRate\" ParentNodeId=\"ns=1;i=1287\" DataType=\"UInt32\" AccessLevel=\"3\">\n    <DisplayName>UpdateRate</DisplayName>\n    <Description>The rate at which the simulation runs.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=15018\" BrowseName=\"1:Start\" ParentNodeId=\"ns=1;i=1287\" MethodDeclarationId=\"ns=1;i=1095\">\n    <DisplayName>Start</DisplayName>\n    <Description>Causes the Program to transition from the Ready state to the Running state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=15019\" BrowseName=\"1:Suspend\" ParentNodeId=\"ns=1;i=1287\" MethodDeclarationId=\"ns=1;i=1096\">\n    <DisplayName>Suspend</DisplayName>\n    <Description>Causes the Program to transition from the Running state to the Suspended state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=15020\" BrowseName=\"1:Resume\" ParentNodeId=\"ns=1;i=1287\" MethodDeclarationId=\"ns=1;i=1097\">\n    <DisplayName>Resume</DisplayName>\n    <Description>Causes the Program to transition from the Suspended state to the Running state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=15021\" BrowseName=\"1:Halt\" ParentNodeId=\"ns=1;i=1287\" MethodDeclarationId=\"ns=1;i=1098\">\n    <DisplayName>Halt</DisplayName>\n    <Description>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=15022\" BrowseName=\"1:Reset\" ParentNodeId=\"ns=1;i=1287\" MethodDeclarationId=\"ns=1;i=1099\">\n    <DisplayName>Reset</DisplayName>\n    <Description>Causes the Program to transition from the Halted state to the Ready state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1287</Reference>\n    </References>\n  </UAMethod>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/Boiler.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Boiler/</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <FlowTo xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ReferenceType_32</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=985</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>FlowTo</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A reference that indicates a flow between two objects.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=32</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:InverseName>\n      <uax:Locale></uax:Locale>\n      <uax:Text>FlowFrom</uax:Text>\n    </uax:InverseName>\n  </FlowTo>\n  <HotFlowTo xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ReferenceType_32</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=986</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>HotFlowTo</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A reference that indicates a high temperature flow between two objects.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=985</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:InverseName>\n      <uax:Locale></uax:Locale>\n      <uax:Text>HotFlowFrom</uax:Text>\n    </uax:InverseName>\n  </HotFlowTo>\n  <SignalTo xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ReferenceType_32</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=987</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SignalTo</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A reference that indicates an electrical signal between two variables.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=32</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:InverseName>\n      <uax:Locale></uax:Locale>\n      <uax:Text>SignalFrom</uax:Text>\n    </uax:InverseName>\n  </SignalTo>\n  <GenericControllerType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=210</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>GenericControllerType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A generic PID controller</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <Measurement>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=988</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Measurement</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>988</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Measurement>\n    <SetPoint>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=989</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SetPoint</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>989</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </SetPoint>\n    <ControlOut>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=990</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ControlOut</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>990</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ControlOut>\n  </GenericControllerType>\n  <GenericSensorType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=991</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>GenericSensorType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A generic sensor that read a process value.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <Output>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=992</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Output</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>992</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=995</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>995</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Output>\n  </GenericSensorType>\n  <GenericActuatorType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=998</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>GenericActuatorType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>Represents a piece of equipment that causes some action to occur.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <Input>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=999</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Input</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>999</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>2</uax:AccessLevel>\n      <uax:UserAccessLevel>2</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1002</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1002</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Input>\n  </GenericActuatorType>\n  <CustomControllerType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=513</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>CustomControllerType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A custom PID controller with 3 inputs</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <Input1>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1005</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Input1</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1005</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>2</uax:AccessLevel>\n      <uax:UserAccessLevel>2</uax:UserAccessLevel>\n    </Input1>\n    <Input2>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1006</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Input2</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1006</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>2</uax:AccessLevel>\n      <uax:UserAccessLevel>2</uax:UserAccessLevel>\n    </Input2>\n    <Input3>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1007</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Input3</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1007</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>2</uax:AccessLevel>\n      <uax:UserAccessLevel>2</uax:UserAccessLevel>\n    </Input3>\n    <ControlOut>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1008</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ControlOut</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1008</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ControlOut>\n    <DescriptionX>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1009</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Description</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1009</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=21</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DescriptionX>\n  </CustomControllerType>\n  <ValveType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1010</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ValveType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>An actuator that controls the flow through a pipe.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=998</uax:Identifier>\n    </uax:SuperTypeId>\n  </ValveType>\n  <LevelControllerType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1017</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>LevelControllerType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A controller for the level of a fluid in a drum.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=210</uax:Identifier>\n    </uax:SuperTypeId>\n  </LevelControllerType>\n  <FlowControllerType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1021</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>FlowControllerType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A controller for the flow of a fluid through a pipe.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=210</uax:Identifier>\n    </uax:SuperTypeId>\n  </FlowControllerType>\n  <LevelIndicatorType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1025</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>LevelIndicatorType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A sensor that reports the level of a liquid in a tank.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=991</uax:Identifier>\n    </uax:SuperTypeId>\n  </LevelIndicatorType>\n  <FlowTransmitterType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1032</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>FlowTransmitterType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A sensor that reports the flow of a liquid through a pipe.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=991</uax:Identifier>\n    </uax:SuperTypeId>\n  </FlowTransmitterType>\n  <BoilerStateMachineType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1039</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>BoilerStateMachineType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A program that produces simulated values for a running boiler.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2391</uax:Identifier>\n    </uax:SuperTypeId>\n    <Start>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1095</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Start</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>Causes the Program to transition from the Ready state to the Running state.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2426</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1095</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n    </Start>\n    <Suspend>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1096</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Suspend</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>Causes the Program to transition from the Running state to the Suspended state.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2427</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1096</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n    </Suspend>\n    <Resume>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1097</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Resume</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>Causes the Program to transition from the Suspended state to the Running state.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2428</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1097</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n    </Resume>\n    <Halt>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1098</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Halt</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2429</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1098</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n    </Halt>\n    <Reset>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1099</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Reset</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>Causes the Program to transition from the Halted state to the Ready state.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2430</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1099</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n    </Reset>\n    <UpdateRate>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1100</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UpdateRate</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>The rate at which the simulation runs.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1100</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </UpdateRate>\n  </BoilerStateMachineType>\n  <BoilerInputPipeType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1101</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>BoilerInputPipeType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1102</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <FlowTransmitter1>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1102</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FTX001</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1032</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1102</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <Output>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1103</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Output</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2368</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1103</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <EURange xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1106</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>EURange</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1106</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=884</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EURange>\n      </Output>\n    </FlowTransmitter1>\n    <Valve>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1109</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ValveX001</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1010</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1109</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <Input>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1110</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Input</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2368</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1110</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>2</uax:AccessLevel>\n        <uax:UserAccessLevel>2</uax:UserAccessLevel>\n        <EURange xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1113</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>EURange</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1113</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=884</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EURange>\n      </Input>\n    </Valve>\n  </BoilerInputPipeType>\n  <BoilerDrumType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1116</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>BoilerDrumType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1117</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <LevelIndicator>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1117</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>LIX001</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1025</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1117</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <Output>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1118</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Output</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2368</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1118</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <EURange xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1121</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>EURange</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1121</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=884</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EURange>\n      </Output>\n    </LevelIndicator>\n  </BoilerDrumType>\n  <BoilerOutputPipeType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1124</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>BoilerOutputPipeType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1125</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <FlowTransmitter2>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1125</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FTX002</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1032</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1125</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <Output>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1126</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Output</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2368</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1126</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <EURange xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1129</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>EURange</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1129</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=884</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EURange>\n      </Output>\n    </FlowTransmitter2>\n  </BoilerOutputPipeType>\n  <BoilerType xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1132</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>BoilerType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A boiler used to produce steam for a turbine.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1133</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1148</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1156</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=36</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1178</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <InputPipe>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1133</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PipeX001</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1101</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1133</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1134</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>ns=1;i=985</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1148</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <FlowTransmitter1>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1134</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>FTX001</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1032</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1134</uax:NumericId>\n        <uax:EventNotifier>1</uax:EventNotifier>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1133</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <Output>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1135</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Output</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1135</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1165</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1174</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1138</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>1138</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Output>\n      </FlowTransmitter1>\n      <Valve>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1141</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>ValveX001</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1010</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1141</uax:NumericId>\n        <uax:EventNotifier>1</uax:EventNotifier>\n        <Input>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1142</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Input</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1142</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>2</uax:AccessLevel>\n          <uax:UserAccessLevel>2</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1167</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1145</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>1145</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Input>\n      </Valve>\n    </InputPipe>\n    <Drum>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1148</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DrumX001</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1116</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1148</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>ns=1;i=985</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1133</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1149</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>ns=1;i=986</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1156</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <LevelIndicator>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1149</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>LIX001</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1025</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1149</uax:NumericId>\n        <uax:EventNotifier>1</uax:EventNotifier>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1148</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <Output>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1150</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Output</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1150</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1169</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1153</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>1153</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Output>\n      </LevelIndicator>\n    </Drum>\n    <OutputPipe>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1156</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PipeX002</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1124</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1156</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>ns=1;i=986</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1148</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1157</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <FlowTransmitter2>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1157</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>FTX002</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1032</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1157</uax:NumericId>\n        <uax:EventNotifier>1</uax:EventNotifier>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1156</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <Output>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1158</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Output</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1158</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1175</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1161</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>1161</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Output>\n      </FlowTransmitter2>\n    </OutputPipe>\n    <FlowController>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1164</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FCX001</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1021</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1164</uax:NumericId>\n      <Measurement>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1165</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Measurement</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1165</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1135</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </Measurement>\n      <SetPoint>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1166</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>SetPoint</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1166</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>3</uax:AccessLevel>\n        <uax:UserAccessLevel>3</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1176</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </SetPoint>\n      <ControlOut>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1167</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>ControlOut</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1167</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1142</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </ControlOut>\n    </FlowController>\n    <LevelController>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1168</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>LCX001</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1017</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1168</uax:NumericId>\n      <Measurement>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1169</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Measurement</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1169</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1150</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </Measurement>\n      <SetPoint>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1170</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>SetPoint</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1170</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>3</uax:AccessLevel>\n        <uax:UserAccessLevel>3</uax:UserAccessLevel>\n      </SetPoint>\n      <ControlOut>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1171</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>ControlOut</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1171</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1173</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </ControlOut>\n    </LevelController>\n    <CustomController>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1172</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>CCX001</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=513</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1172</uax:NumericId>\n      <Input1>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1173</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Input1</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1173</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>2</uax:AccessLevel>\n        <uax:UserAccessLevel>2</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1171</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </Input1>\n      <Input2>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1174</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Input2</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1174</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>2</uax:AccessLevel>\n        <uax:UserAccessLevel>2</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1135</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </Input2>\n      <Input3>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1175</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Input3</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1175</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>2</uax:AccessLevel>\n        <uax:UserAccessLevel>2</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1158</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </Input3>\n      <ControlOut>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1176</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>ControlOut</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1176</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=11</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=987</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1166</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </ControlOut>\n      <DescriptionX>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1177</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Description</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1177</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </DescriptionX>\n    </CustomController>\n    <Simulation>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1178</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Simulation</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1039</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1178</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <CurrentState xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1179</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>CurrentState</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2760</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1179</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <Id>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1180</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Id</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1180</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Id>\n        <Number>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1182</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Number</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1182</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Number>\n      </CurrentState>\n      <LastTransition xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1184</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>LastTransition</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2767</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1184</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <Id>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1185</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Id</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1185</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Id>\n        <Number>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1187</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Number</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1187</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Number>\n        <TransitionTime>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1188</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>TransitionTime</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>1188</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=294</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </TransitionTime>\n      </LastTransition>\n      <Deletable xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1190</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Deletable</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1190</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=1</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </Deletable>\n      <AutoDelete xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1191</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>AutoDelete</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1191</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=1</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </AutoDelete>\n      <RecycleCount xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1192</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>RecycleCount</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1192</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=6</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </RecycleCount>\n      <UpdateRate>\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1239</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>UpdateRate</uax:Name>\n        </uax:BrowseName>\n        <uax:Description>\n          <uax:Locale></uax:Locale>\n          <uax:Text>The rate at which the simulation runs.</uax:Text>\n        </uax:Description>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>1239</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>3</uax:AccessLevel>\n        <uax:UserAccessLevel>3</uax:UserAccessLevel>\n      </UpdateRate>\n      <Start>\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=15013</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Start</uax:Name>\n        </uax:BrowseName>\n        <uax:Description>\n          <uax:Locale></uax:Locale>\n          <uax:Text>Causes the Program to transition from the Ready state to the Running state.</uax:Text>\n        </uax:Description>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1095</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>15013</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n      </Start>\n      <Suspend>\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=15014</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Suspend</uax:Name>\n        </uax:BrowseName>\n        <uax:Description>\n          <uax:Locale></uax:Locale>\n          <uax:Text>Causes the Program to transition from the Running state to the Suspended state.</uax:Text>\n        </uax:Description>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1096</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>15014</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n      </Suspend>\n      <Resume>\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=15015</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Resume</uax:Name>\n        </uax:BrowseName>\n        <uax:Description>\n          <uax:Locale></uax:Locale>\n          <uax:Text>Causes the Program to transition from the Suspended state to the Running state.</uax:Text>\n        </uax:Description>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1097</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>15015</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n      </Resume>\n      <Halt>\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=15016</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Halt</uax:Name>\n        </uax:BrowseName>\n        <uax:Description>\n          <uax:Locale></uax:Locale>\n          <uax:Text>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</uax:Text>\n        </uax:Description>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1098</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>15016</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n      </Halt>\n      <Reset>\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=15017</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Reset</uax:Name>\n        </uax:BrowseName>\n        <uax:Description>\n          <uax:Locale></uax:Locale>\n          <uax:Text>Causes the Program to transition from the Halted state to the Ready state.</uax:Text>\n        </uax:Description>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1099</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>15017</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n      </Reset>\n    </Simulation>\n  </BoilerType>\n  <Boilers xmlns=\"http://opcfoundation.org/UA/Boiler/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1240</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Boilers</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>1240</uax:NumericId>\n    <uax:EventNotifier>1</uax:EventNotifier>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1241</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=85</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=2253</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <Boiler1>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1241</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Boiler #1</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1132</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>1241</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1240</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1242</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1257</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1265</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=36</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1287</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <InputPipe>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1242</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>PipeX001</uax:Name>\n        </uax:BrowseName>\n        <uax:DisplayName>\n          <uax:Locale></uax:Locale>\n          <uax:Text>Pipe1001</uax:Text>\n        </uax:DisplayName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1101</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>1242</uax:NumericId>\n        <uax:EventNotifier>1</uax:EventNotifier>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1241</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1243</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=985</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1257</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <FlowTransmitter1>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1243</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FTX001</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1032</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1243</uax:NumericId>\n          <uax:EventNotifier>1</uax:EventNotifier>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=48</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1242</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <Output>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1244</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>1</uax:NamespaceIndex>\n              <uax:Name>Output</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=2368</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1244</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=11</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>ns=1;i=987</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=1274</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>ns=1;i=987</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=1283</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <EURange xmlns=\"http://opcfoundation.org/UA/\">\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=1247</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>EURange</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>1247</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=884</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </EURange>\n          </Output>\n        </FlowTransmitter1>\n        <Valve>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1250</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ValveX001</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1010</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1250</uax:NumericId>\n          <uax:EventNotifier>1</uax:EventNotifier>\n          <Input>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1251</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>1</uax:NamespaceIndex>\n              <uax:Name>Input</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=2368</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1251</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=11</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>2</uax:AccessLevel>\n            <uax:UserAccessLevel>2</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>ns=1;i=987</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=1276</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <EURange xmlns=\"http://opcfoundation.org/UA/\">\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=1254</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>EURange</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>1254</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=884</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </EURange>\n          </Input>\n        </Valve>\n      </InputPipe>\n      <Drum>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1257</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>DrumX001</uax:Name>\n        </uax:BrowseName>\n        <uax:DisplayName>\n          <uax:Locale></uax:Locale>\n          <uax:Text>Drum1001</uax:Text>\n        </uax:DisplayName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1116</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>1257</uax:NumericId>\n        <uax:EventNotifier>1</uax:EventNotifier>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1241</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=985</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1242</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1258</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=986</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1265</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <LevelIndicator>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1258</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LIX001</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1025</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1258</uax:NumericId>\n          <uax:EventNotifier>1</uax:EventNotifier>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=48</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1257</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <Output>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1259</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>1</uax:NamespaceIndex>\n              <uax:Name>Output</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=2368</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1259</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=26</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>ns=1;i=987</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=1278</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <EURange xmlns=\"http://opcfoundation.org/UA/\">\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=1262</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>EURange</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>1262</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=884</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </EURange>\n          </Output>\n        </LevelIndicator>\n      </Drum>\n      <OutputPipe>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1265</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>PipeX002</uax:Name>\n        </uax:BrowseName>\n        <uax:DisplayName>\n          <uax:Locale></uax:Locale>\n          <uax:Text>Pipe1002</uax:Text>\n        </uax:DisplayName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1124</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>1265</uax:NumericId>\n        <uax:EventNotifier>1</uax:EventNotifier>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1241</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>ns=1;i=986</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1257</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=48</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1266</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <FlowTransmitter2>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1266</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FTX002</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1032</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1266</uax:NumericId>\n          <uax:EventNotifier>1</uax:EventNotifier>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=48</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1265</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <Output>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1267</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>1</uax:NamespaceIndex>\n              <uax:Name>Output</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=2368</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1267</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=11</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>ns=1;i=987</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=1284</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <EURange xmlns=\"http://opcfoundation.org/UA/\">\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=1270</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>EURange</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>1270</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=884</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </EURange>\n          </Output>\n        </FlowTransmitter2>\n      </OutputPipe>\n      <FlowController>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1273</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>FCX001</uax:Name>\n        </uax:BrowseName>\n        <uax:DisplayName>\n          <uax:Locale></uax:Locale>\n          <uax:Text>FC1001</uax:Text>\n        </uax:DisplayName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1021</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>1273</uax:NumericId>\n        <Measurement>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1274</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Measurement</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1274</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1244</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </Measurement>\n        <SetPoint>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1275</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SetPoint</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1275</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>3</uax:AccessLevel>\n          <uax:UserAccessLevel>3</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1285</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </SetPoint>\n        <ControlOut>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1276</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ControlOut</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1276</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1251</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </ControlOut>\n      </FlowController>\n      <LevelController>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1277</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>LCX001</uax:Name>\n        </uax:BrowseName>\n        <uax:DisplayName>\n          <uax:Locale></uax:Locale>\n          <uax:Text>LC1001</uax:Text>\n        </uax:DisplayName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1017</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>1277</uax:NumericId>\n        <Measurement>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1278</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Measurement</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1278</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1259</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </Measurement>\n        <SetPoint>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1279</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SetPoint</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1279</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>3</uax:AccessLevel>\n          <uax:UserAccessLevel>3</uax:UserAccessLevel>\n        </SetPoint>\n        <ControlOut>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1280</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ControlOut</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1280</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1282</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </ControlOut>\n      </LevelController>\n      <CustomController>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1281</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>CCX001</uax:Name>\n        </uax:BrowseName>\n        <uax:DisplayName>\n          <uax:Locale></uax:Locale>\n          <uax:Text>CC1001</uax:Text>\n        </uax:DisplayName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=513</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>1281</uax:NumericId>\n        <Input1>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1282</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Input1</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1282</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>2</uax:AccessLevel>\n          <uax:UserAccessLevel>2</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1280</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </Input1>\n        <Input2>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1283</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Input2</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1283</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>2</uax:AccessLevel>\n          <uax:UserAccessLevel>2</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1244</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </Input2>\n        <Input3>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1284</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Input3</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1284</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>2</uax:AccessLevel>\n          <uax:UserAccessLevel>2</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1267</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </Input3>\n        <ControlOut>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1285</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ControlOut</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1285</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>ns=1;i=987</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=1275</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </ControlOut>\n        <DescriptionX>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1286</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Description</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1286</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DescriptionX>\n      </CustomController>\n      <Simulation>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=1287</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Simulation</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=1039</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>1287</uax:NumericId>\n        <uax:EventNotifier>1</uax:EventNotifier>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=1241</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <CurrentState xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1288</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>CurrentState</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2760</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1288</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <Id>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1289</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Id</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1289</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Id>\n          <Number>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1291</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Number</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1291</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=7</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Number>\n        </CurrentState>\n        <LastTransition xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1293</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>LastTransition</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2767</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1293</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <Id>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1294</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Id</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1294</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Id>\n          <Number>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1296</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Number</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1296</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=7</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Number>\n          <TransitionTime>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=1297</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>TransitionTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>1297</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </TransitionTime>\n        </LastTransition>\n        <Deletable xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1299</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Deletable</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1299</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Deletable>\n        <AutoDelete xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1300</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>AutoDelete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1300</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </AutoDelete>\n        <RecycleCount xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1301</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>RecycleCount</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1301</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </RecycleCount>\n        <UpdateRate>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=1348</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UpdateRate</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Locale></uax:Locale>\n            <uax:Text>The rate at which the simulation runs.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>1348</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>3</uax:AccessLevel>\n          <uax:UserAccessLevel>3</uax:UserAccessLevel>\n        </UpdateRate>\n        <Start>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=15018</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Start</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Locale></uax:Locale>\n            <uax:Text>Causes the Program to transition from the Ready state to the Running state.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1095</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>15018</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n        </Start>\n        <Suspend>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=15019</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Suspend</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Locale></uax:Locale>\n            <uax:Text>Causes the Program to transition from the Running state to the Suspended state.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1096</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>15019</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n        </Suspend>\n        <Resume>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=15020</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Resume</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Locale></uax:Locale>\n            <uax:Text>Causes the Program to transition from the Suspended state to the Running state.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1097</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>15020</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n        </Resume>\n        <Halt>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=15021</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Halt</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Locale></uax:Locale>\n            <uax:Text>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1098</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>15021</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n        </Halt>\n        <Reset>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=15022</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Reset</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Locale></uax:Locale>\n            <uax:Text>Causes the Program to transition from the Halted state to the Ready state.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=1099</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>15022</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n        </Reset>\n      </Simulation>\n    </Boiler1>\n  </Boilers>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/Boiler.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Boiler/\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Boiler/\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/Boiler.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Boiler/\"\n  targetNamespace=\"http://opcfoundation.org/UA/Boiler/\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/BoilerDesign.csv",
    "content": "GenericControllerType,210,ObjectType\nCustomControllerType,513,ObjectType\nFlowTo,985,ReferenceType\nHotFlowTo,986,ReferenceType\nSignalTo,987,ReferenceType\nGenericControllerType_Measurement,988,Variable\nGenericControllerType_SetPoint,989,Variable\nGenericControllerType_ControlOut,990,Variable\nGenericSensorType,991,ObjectType\nGenericSensorType_Output,992,Variable\nGenericSensorType_Output_Definition,993,Variable\nGenericSensorType_Output_ValuePrecision,994,Variable\nGenericSensorType_Output_EURange,995,Variable\nGenericSensorType_Output_InstrumentRange,996,Variable\nGenericSensorType_Output_EngineeringUnits,997,Variable\nGenericActuatorType,998,ObjectType\nGenericActuatorType_Input,999,Variable\nGenericActuatorType_Input_Definition,1000,Variable\nGenericActuatorType_Input_ValuePrecision,1001,Variable\nGenericActuatorType_Input_EURange,1002,Variable\nGenericActuatorType_Input_InstrumentRange,1003,Variable\nGenericActuatorType_Input_EngineeringUnits,1004,Variable\nCustomControllerType_Input1,1005,Variable\nCustomControllerType_Input2,1006,Variable\nCustomControllerType_Input3,1007,Variable\nCustomControllerType_ControlOut,1008,Variable\nCustomControllerType_DescriptionX,1009,Variable\nValveType,1010,ObjectType\nValveType_Input,1011,Variable\nValveType_Input_Definition,1012,Variable\nValveType_Input_ValuePrecision,1013,Variable\nValveType_Input_EURange,1014,Variable\nValveType_Input_InstrumentRange,1015,Variable\nValveType_Input_EngineeringUnits,1016,Variable\nLevelControllerType,1017,ObjectType\nLevelControllerType_Measurement,1018,Variable\nLevelControllerType_SetPoint,1019,Variable\nLevelControllerType_ControlOut,1020,Variable\nFlowControllerType,1021,ObjectType\nFlowControllerType_Measurement,1022,Variable\nFlowControllerType_SetPoint,1023,Variable\nFlowControllerType_ControlOut,1024,Variable\nLevelIndicatorType,1025,ObjectType\nLevelIndicatorType_Output,1026,Variable\nLevelIndicatorType_Output_Definition,1027,Variable\nLevelIndicatorType_Output_ValuePrecision,1028,Variable\nLevelIndicatorType_Output_EURange,1029,Variable\nLevelIndicatorType_Output_InstrumentRange,1030,Variable\nLevelIndicatorType_Output_EngineeringUnits,1031,Variable\nFlowTransmitterType,1032,ObjectType\nFlowTransmitterType_Output,1033,Variable\nFlowTransmitterType_Output_Definition,1034,Variable\nFlowTransmitterType_Output_ValuePrecision,1035,Variable\nFlowTransmitterType_Output_EURange,1036,Variable\nFlowTransmitterType_Output_InstrumentRange,1037,Variable\nFlowTransmitterType_Output_EngineeringUnits,1038,Variable\nBoilerStateMachineType,1039,ObjectType\nBoilerStateMachineType_CurrentState,1040,Variable\nBoilerStateMachineType_CurrentState_Id,1041,Variable\nBoilerStateMachineType_CurrentState_Name,1042,Variable\nBoilerStateMachineType_CurrentState_Number,1043,Variable\nBoilerStateMachineType_CurrentState_EffectiveDisplayName,1044,Variable\nBoilerStateMachineType_LastTransition,1045,Variable\nBoilerStateMachineType_LastTransition_Id,1046,Variable\nBoilerStateMachineType_LastTransition_Name,1047,Variable\nBoilerStateMachineType_LastTransition_Number,1048,Variable\nBoilerStateMachineType_LastTransition_TransitionTime,1049,Variable\nBoilerStateMachineType_Creatable,1050,Variable\nBoilerStateMachineType_Deletable,1051,Variable\nBoilerStateMachineType_AutoDelete,1052,Variable\nBoilerStateMachineType_RecycleCount,1053,Variable\nBoilerStateMachineType_InstanceCount,1054,Variable\nBoilerStateMachineType_MaxInstanceCount,1055,Variable\nBoilerStateMachineType_MaxRecycleCount,1056,Variable\nBoilerStateMachineType_FinalResultData,1068,Object\nBoilerStateMachineType_Ready,1069,Object\nBoilerStateMachineType_Ready_StateNumber,1070,Variable\nBoilerStateMachineType_Running,1071,Object\nBoilerStateMachineType_Running_StateNumber,1072,Variable\nBoilerStateMachineType_Suspended,1073,Object\nBoilerStateMachineType_Suspended_StateNumber,1074,Variable\nBoilerStateMachineType_Halted,1075,Object\nBoilerStateMachineType_Halted_StateNumber,1076,Variable\nBoilerStateMachineType_HaltedToReady,1077,Object\nBoilerStateMachineType_HaltedToReady_TransitionNumber,1078,Variable\nBoilerStateMachineType_ReadyToRunning,1079,Object\nBoilerStateMachineType_ReadyToRunning_TransitionNumber,1080,Variable\nBoilerStateMachineType_RunningToHalted,1081,Object\nBoilerStateMachineType_RunningToHalted_TransitionNumber,1082,Variable\nBoilerStateMachineType_RunningToReady,1083,Object\nBoilerStateMachineType_RunningToReady_TransitionNumber,1084,Variable\nBoilerStateMachineType_RunningToSuspended,1085,Object\nBoilerStateMachineType_RunningToSuspended_TransitionNumber,1086,Variable\nBoilerStateMachineType_SuspendedToRunning,1087,Object\nBoilerStateMachineType_SuspendedToRunning_TransitionNumber,1088,Variable\nBoilerStateMachineType_SuspendedToHalted,1089,Object\nBoilerStateMachineType_SuspendedToHalted_TransitionNumber,1090,Variable\nBoilerStateMachineType_SuspendedToReady,1091,Object\nBoilerStateMachineType_SuspendedToReady_TransitionNumber,1092,Variable\nBoilerStateMachineType_ReadyToHalted,1093,Object\nBoilerStateMachineType_ReadyToHalted_TransitionNumber,1094,Variable\nBoilerStateMachineType_Start,1095,Method\nBoilerStateMachineType_Suspend,1096,Method\nBoilerStateMachineType_Resume,1097,Method\nBoilerStateMachineType_Halt,1098,Method\nBoilerStateMachineType_Reset,1099,Method\nBoilerStateMachineType_UpdateRate,1100,Variable\nBoilerInputPipeType,1101,ObjectType\nBoilerInputPipeType_FlowTransmitter1,1102,Object\nBoilerInputPipeType_FlowTransmitter1_Output,1103,Variable\nBoilerInputPipeType_FlowTransmitter1_Output_Definition,1104,Variable\nBoilerInputPipeType_FlowTransmitter1_Output_ValuePrecision,1105,Variable\nBoilerInputPipeType_FlowTransmitter1_Output_EURange,1106,Variable\nBoilerInputPipeType_FlowTransmitter1_Output_InstrumentRange,1107,Variable\nBoilerInputPipeType_FlowTransmitter1_Output_EngineeringUnits,1108,Variable\nBoilerInputPipeType_Valve,1109,Object\nBoilerInputPipeType_Valve_Input,1110,Variable\nBoilerInputPipeType_Valve_Input_Definition,1111,Variable\nBoilerInputPipeType_Valve_Input_ValuePrecision,1112,Variable\nBoilerInputPipeType_Valve_Input_EURange,1113,Variable\nBoilerInputPipeType_Valve_Input_InstrumentRange,1114,Variable\nBoilerInputPipeType_Valve_Input_EngineeringUnits,1115,Variable\nBoilerDrumType,1116,ObjectType\nBoilerDrumType_LevelIndicator,1117,Object\nBoilerDrumType_LevelIndicator_Output,1118,Variable\nBoilerDrumType_LevelIndicator_Output_Definition,1119,Variable\nBoilerDrumType_LevelIndicator_Output_ValuePrecision,1120,Variable\nBoilerDrumType_LevelIndicator_Output_EURange,1121,Variable\nBoilerDrumType_LevelIndicator_Output_InstrumentRange,1122,Variable\nBoilerDrumType_LevelIndicator_Output_EngineeringUnits,1123,Variable\nBoilerOutputPipeType,1124,ObjectType\nBoilerOutputPipeType_FlowTransmitter2,1125,Object\nBoilerOutputPipeType_FlowTransmitter2_Output,1126,Variable\nBoilerOutputPipeType_FlowTransmitter2_Output_Definition,1127,Variable\nBoilerOutputPipeType_FlowTransmitter2_Output_ValuePrecision,1128,Variable\nBoilerOutputPipeType_FlowTransmitter2_Output_EURange,1129,Variable\nBoilerOutputPipeType_FlowTransmitter2_Output_InstrumentRange,1130,Variable\nBoilerOutputPipeType_FlowTransmitter2_Output_EngineeringUnits,1131,Variable\nBoilerType,1132,ObjectType\nBoilerType_InputPipe,1133,Object\nBoilerType_InputPipe_FlowTransmitter1,1134,Object\nBoilerType_InputPipe_FlowTransmitter1_Output,1135,Variable\nBoilerType_InputPipe_FlowTransmitter1_Output_Definition,1136,Variable\nBoilerType_InputPipe_FlowTransmitter1_Output_ValuePrecision,1137,Variable\nBoilerType_InputPipe_FlowTransmitter1_Output_EURange,1138,Variable\nBoilerType_InputPipe_FlowTransmitter1_Output_InstrumentRange,1139,Variable\nBoilerType_InputPipe_FlowTransmitter1_Output_EngineeringUnits,1140,Variable\nBoilerType_InputPipe_Valve,1141,Object\nBoilerType_InputPipe_Valve_Input,1142,Variable\nBoilerType_InputPipe_Valve_Input_Definition,1143,Variable\nBoilerType_InputPipe_Valve_Input_ValuePrecision,1144,Variable\nBoilerType_InputPipe_Valve_Input_EURange,1145,Variable\nBoilerType_InputPipe_Valve_Input_InstrumentRange,1146,Variable\nBoilerType_InputPipe_Valve_Input_EngineeringUnits,1147,Variable\nBoilerType_Drum,1148,Object\nBoilerType_Drum_LevelIndicator,1149,Object\nBoilerType_Drum_LevelIndicator_Output,1150,Variable\nBoilerType_Drum_LevelIndicator_Output_Definition,1151,Variable\nBoilerType_Drum_LevelIndicator_Output_ValuePrecision,1152,Variable\nBoilerType_Drum_LevelIndicator_Output_EURange,1153,Variable\nBoilerType_Drum_LevelIndicator_Output_InstrumentRange,1154,Variable\nBoilerType_Drum_LevelIndicator_Output_EngineeringUnits,1155,Variable\nBoilerType_OutputPipe,1156,Object\nBoilerType_OutputPipe_FlowTransmitter2,1157,Object\nBoilerType_OutputPipe_FlowTransmitter2_Output,1158,Variable\nBoilerType_OutputPipe_FlowTransmitter2_Output_Definition,1159,Variable\nBoilerType_OutputPipe_FlowTransmitter2_Output_ValuePrecision,1160,Variable\nBoilerType_OutputPipe_FlowTransmitter2_Output_EURange,1161,Variable\nBoilerType_OutputPipe_FlowTransmitter2_Output_InstrumentRange,1162,Variable\nBoilerType_OutputPipe_FlowTransmitter2_Output_EngineeringUnits,1163,Variable\nBoilerType_FlowController,1164,Object\nBoilerType_FlowController_Measurement,1165,Variable\nBoilerType_FlowController_SetPoint,1166,Variable\nBoilerType_FlowController_ControlOut,1167,Variable\nBoilerType_LevelController,1168,Object\nBoilerType_LevelController_Measurement,1169,Variable\nBoilerType_LevelController_SetPoint,1170,Variable\nBoilerType_LevelController_ControlOut,1171,Variable\nBoilerType_CustomController,1172,Object\nBoilerType_CustomController_Input1,1173,Variable\nBoilerType_CustomController_Input2,1174,Variable\nBoilerType_CustomController_Input3,1175,Variable\nBoilerType_CustomController_ControlOut,1176,Variable\nBoilerType_CustomController_DescriptionX,1177,Variable\nBoilerType_Simulation,1178,Object\nBoilerType_Simulation_CurrentState,1179,Variable\nBoilerType_Simulation_CurrentState_Id,1180,Variable\nBoilerType_Simulation_CurrentState_Name,1181,Variable\nBoilerType_Simulation_CurrentState_Number,1182,Variable\nBoilerType_Simulation_CurrentState_EffectiveDisplayName,1183,Variable\nBoilerType_Simulation_LastTransition,1184,Variable\nBoilerType_Simulation_LastTransition_Id,1185,Variable\nBoilerType_Simulation_LastTransition_Name,1186,Variable\nBoilerType_Simulation_LastTransition_Number,1187,Variable\nBoilerType_Simulation_LastTransition_TransitionTime,1188,Variable\nBoilerType_Simulation_Deletable,1190,Variable\nBoilerType_Simulation_AutoDelete,1191,Variable\nBoilerType_Simulation_RecycleCount,1192,Variable\nBoilerType_Simulation_FinalResultData,1207,Object\nBoilerType_Simulation_UpdateRate,1239,Variable\nBoilers,1240,Object\nBoilers_Boiler1,1241,Object\nBoilers_Boiler1_InputPipe,1242,Object\nBoilers_Boiler1_InputPipe_FlowTransmitter1,1243,Object\nBoilers_Boiler1_InputPipe_FlowTransmitter1_Output,1244,Variable\nBoilers_Boiler1_InputPipe_FlowTransmitter1_Output_Definition,1245,Variable\nBoilers_Boiler1_InputPipe_FlowTransmitter1_Output_ValuePrecision,1246,Variable\nBoilers_Boiler1_InputPipe_FlowTransmitter1_Output_EURange,1247,Variable\nBoilers_Boiler1_InputPipe_FlowTransmitter1_Output_InstrumentRange,1248,Variable\nBoilers_Boiler1_InputPipe_FlowTransmitter1_Output_EngineeringUnits,1249,Variable\nBoilers_Boiler1_InputPipe_Valve,1250,Object\nBoilers_Boiler1_InputPipe_Valve_Input,1251,Variable\nBoilers_Boiler1_InputPipe_Valve_Input_Definition,1252,Variable\nBoilers_Boiler1_InputPipe_Valve_Input_ValuePrecision,1253,Variable\nBoilers_Boiler1_InputPipe_Valve_Input_EURange,1254,Variable\nBoilers_Boiler1_InputPipe_Valve_Input_InstrumentRange,1255,Variable\nBoilers_Boiler1_InputPipe_Valve_Input_EngineeringUnits,1256,Variable\nBoilers_Boiler1_Drum,1257,Object\nBoilers_Boiler1_Drum_LevelIndicator,1258,Object\nBoilers_Boiler1_Drum_LevelIndicator_Output,1259,Variable\nBoilers_Boiler1_Drum_LevelIndicator_Output_Definition,1260,Variable\nBoilers_Boiler1_Drum_LevelIndicator_Output_ValuePrecision,1261,Variable\nBoilers_Boiler1_Drum_LevelIndicator_Output_EURange,1262,Variable\nBoilers_Boiler1_Drum_LevelIndicator_Output_InstrumentRange,1263,Variable\nBoilers_Boiler1_Drum_LevelIndicator_Output_EngineeringUnits,1264,Variable\nBoilers_Boiler1_OutputPipe,1265,Object\nBoilers_Boiler1_OutputPipe_FlowTransmitter2,1266,Object\nBoilers_Boiler1_OutputPipe_FlowTransmitter2_Output,1267,Variable\nBoilers_Boiler1_OutputPipe_FlowTransmitter2_Output_Definition,1268,Variable\nBoilers_Boiler1_OutputPipe_FlowTransmitter2_Output_ValuePrecision,1269,Variable\nBoilers_Boiler1_OutputPipe_FlowTransmitter2_Output_EURange,1270,Variable\nBoilers_Boiler1_OutputPipe_FlowTransmitter2_Output_InstrumentRange,1271,Variable\nBoilers_Boiler1_OutputPipe_FlowTransmitter2_Output_EngineeringUnits,1272,Variable\nBoilers_Boiler1_FlowController,1273,Object\nBoilers_Boiler1_FlowController_Measurement,1274,Variable\nBoilers_Boiler1_FlowController_SetPoint,1275,Variable\nBoilers_Boiler1_FlowController_ControlOut,1276,Variable\nBoilers_Boiler1_LevelController,1277,Object\nBoilers_Boiler1_LevelController_Measurement,1278,Variable\nBoilers_Boiler1_LevelController_SetPoint,1279,Variable\nBoilers_Boiler1_LevelController_ControlOut,1280,Variable\nBoilers_Boiler1_CustomController,1281,Object\nBoilers_Boiler1_CustomController_Input1,1282,Variable\nBoilers_Boiler1_CustomController_Input2,1283,Variable\nBoilers_Boiler1_CustomController_Input3,1284,Variable\nBoilers_Boiler1_CustomController_ControlOut,1285,Variable\nBoilers_Boiler1_CustomController_DescriptionX,1286,Variable\nBoilers_Boiler1_Simulation,1287,Object\nBoilers_Boiler1_Simulation_CurrentState,1288,Variable\nBoilers_Boiler1_Simulation_CurrentState_Id,1289,Variable\nBoilers_Boiler1_Simulation_CurrentState_Name,1290,Variable\nBoilers_Boiler1_Simulation_CurrentState_Number,1291,Variable\nBoilers_Boiler1_Simulation_CurrentState_EffectiveDisplayName,1292,Variable\nBoilers_Boiler1_Simulation_LastTransition,1293,Variable\nBoilers_Boiler1_Simulation_LastTransition_Id,1294,Variable\nBoilers_Boiler1_Simulation_LastTransition_Name,1295,Variable\nBoilers_Boiler1_Simulation_LastTransition_Number,1296,Variable\nBoilers_Boiler1_Simulation_LastTransition_TransitionTime,1297,Variable\nBoilers_Boiler1_Simulation_Deletable,1299,Variable\nBoilers_Boiler1_Simulation_AutoDelete,1300,Variable\nBoilers_Boiler1_Simulation_RecycleCount,1301,Variable\nBoilers_Boiler1_Simulation_FinalResultData,1316,Object\nBoilers_Boiler1_Simulation_UpdateRate,1348,Variable\nBoilerStateMachineType_LastTransition_EffectiveTransitionTime,1349,Variable\nBoilerType_Simulation_LastTransition_EffectiveTransitionTime,1350,Variable\nBoilers_Boiler1_Simulation_LastTransition_EffectiveTransitionTime,1351,Variable\nBoilerStateMachineType_AvailableStates,15001,Variable\nBoilerStateMachineType_AvailableTransitions,15002,Variable\nBoilerType_Simulation_AvailableStates,15005,Variable\nBoilerType_Simulation_AvailableTransitions,15006,Variable\nBoilers_Boiler1_Simulation_AvailableStates,15009,Variable\nBoilers_Boiler1_Simulation_AvailableTransitions,15010,Variable\nBoilerType_Simulation_Start,15013,Method\nBoilerType_Simulation_Suspend,15014,Method\nBoilerType_Simulation_Resume,15015,Method\nBoilerType_Simulation_Halt,15016,Method\nBoilerType_Simulation_Reset,15017,Method\nBoilers_Boiler1_Simulation_Start,15018,Method\nBoilers_Boiler1_Simulation_Suspend,15019,Method\nBoilers_Boiler1_Simulation_Resume,15020,Method\nBoilers_Boiler1_Simulation_Halt,15021,Method\nBoilers_Boiler1_Simulation_Reset,15022,Method\nBoilerStateMachineType_ProgramDiagnostic,15023,Variable\nBoilerStateMachineType_ProgramDiagnostic_CreateSessionId,15024,Variable\nBoilerStateMachineType_ProgramDiagnostic_CreateClientName,15025,Variable\nBoilerStateMachineType_ProgramDiagnostic_InvocationCreationTime,15026,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastTransitionTime,15027,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastMethodCall,15028,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastMethodSessionId,15029,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastMethodInputArguments,15030,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastMethodOutputArguments,15031,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastMethodInputValues,15032,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastMethodOutputValues,15033,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastMethodCallTime,15034,Variable\nBoilerStateMachineType_ProgramDiagnostic_LastMethodReturnStatus,15035,Variable\nBoilerType_Simulation_ProgramDiagnostic,15036,Variable\nBoilerType_Simulation_ProgramDiagnostic_CreateSessionId,15037,Variable\nBoilerType_Simulation_ProgramDiagnostic_CreateClientName,15038,Variable\nBoilerType_Simulation_ProgramDiagnostic_InvocationCreationTime,15039,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastTransitionTime,15040,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastMethodCall,15041,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastMethodSessionId,15042,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastMethodInputArguments,15043,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastMethodOutputArguments,15044,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastMethodInputValues,15045,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastMethodOutputValues,15046,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastMethodCallTime,15047,Variable\nBoilerType_Simulation_ProgramDiagnostic_LastMethodReturnStatus,15048,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic,15049,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_CreateSessionId,15050,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_CreateClientName,15051,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_InvocationCreationTime,15052,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastTransitionTime,15053,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCall,15054,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodSessionId,15055,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputArguments,15056,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputArguments,15057,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodInputValues,15058,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodOutputValues,15059,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodCallTime,15060,Variable\nBoilers_Boiler1_Simulation_ProgramDiagnostic_LastMethodReturnStatus,15061,Variable\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Boiler/Design/BoilerDesign.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns=\"http://opcfoundation.org/UA/Boiler/\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Boiler/\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" InternalPrefix=\"Opc.Ua.Server\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"Boiler\" Prefix=\"Boiler\">http://opcfoundation.org/UA/Boiler/</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:ReferenceType SymbolicName=\"FlowTo\" BaseType=\"ua:NonHierarchicalReferences\">\n    <opc:Description>A reference that indicates a flow between two objects.</opc:Description>\n    <opc:InverseName>FlowFrom</opc:InverseName>\n  </opc:ReferenceType>\n\n  <opc:ReferenceType SymbolicName=\"HotFlowTo\" BaseType=\"FlowTo\">\n    <opc:Description>A reference that indicates a high temperature flow between two objects.</opc:Description>\n    <opc:InverseName>HotFlowFrom</opc:InverseName>\n  </opc:ReferenceType>\n\n  <opc:ReferenceType SymbolicName=\"SignalTo\" BaseType=\"ua:NonHierarchicalReferences\">\n    <opc:Description>A reference that indicates an electrical signal between two variables.</opc:Description>\n    <opc:InverseName>SignalFrom</opc:InverseName>\n  </opc:ReferenceType>\n\n  <opc:ObjectType SymbolicName=\"GenericControllerType\" BaseType=\"ua:BaseObjectType\">\n    <opc:Description>A generic PID controller</opc:Description>\n    <opc:Children>\n      <opc:Property SymbolicName=\"Measurement\" DataType=\"ua:Double\" ValueRank=\"Scalar\" />\n      <opc:Property SymbolicName=\"SetPoint\" DataType=\"ua:Double\" ValueRank=\"Scalar\" AccessLevel=\"ReadWrite\" />\n      <opc:Property SymbolicName=\"ControlOut\" DataType=\"ua:Double\" ValueRank=\"Scalar\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"GenericSensorType\" BaseType=\"ua:BaseObjectType\">\n    <opc:Description>A generic sensor that read a process value.</opc:Description>\n    <opc:Children>\n      <opc:Variable SymbolicName=\"Output\" DataType=\"ua:Double\" ValueRank=\"Scalar\" TypeDefinition=\"ua:AnalogItemType\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"GenericActuatorType\" BaseType=\"ua:BaseObjectType\">\n    <opc:Description>Represents a piece of equipment that causes some action to occur.</opc:Description>\n    <opc:Children>\n      <opc:Variable SymbolicName=\"Input\" DataType=\"ua:Double\" ValueRank=\"Scalar\" TypeDefinition=\"ua:AnalogItemType\" AccessLevel=\"Write\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"CustomControllerType\" BaseType=\"ua:BaseObjectType\">\n    <opc:Description>A custom PID controller with 3 inputs</opc:Description>\n    <opc:Children>\n      <opc:Property SymbolicName=\"Input1\" DataType=\"ua:Double\" ValueRank=\"Scalar\" AccessLevel=\"Write\" />\n      <opc:Property SymbolicName=\"Input2\" DataType=\"ua:Double\" ValueRank=\"Scalar\" AccessLevel=\"Write\" />\n      <opc:Property SymbolicName=\"Input3\" DataType=\"ua:Double\" ValueRank=\"Scalar\" AccessLevel=\"Write\" />\n      <opc:Property SymbolicName=\"ControlOut\" DataType=\"ua:Double\" />\n      <opc:Property SymbolicName=\"DescriptionX\" DataType=\"ua:LocalizedText\">\n        <opc:BrowseName>Description</opc:BrowseName>\n      </opc:Property>\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"ValveType\" BaseType=\"GenericActuatorType\">\n    <opc:Description>An actuator that controls the flow through a pipe.</opc:Description>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"LevelControllerType\" BaseType=\"GenericControllerType\">\n    <opc:Description>A controller for the level of a fluid in a drum.</opc:Description>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"FlowControllerType\" BaseType=\"GenericControllerType\">\n    <opc:Description>A controller for the flow of a fluid through a pipe.</opc:Description>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"LevelIndicatorType\" BaseType=\"GenericSensorType\">\n    <opc:Description>A sensor that reports the level of a liquid in a tank.</opc:Description>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"FlowTransmitterType\" BaseType=\"GenericSensorType\">\n    <opc:Description>A sensor that reports the flow of a liquid through a pipe.</opc:Description>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"BoilerStateMachineType\" BaseType=\"ua:ProgramStateMachineType\">\n    <opc:Description>A program that produces simulated values for a running boiler.</opc:Description>\n    <opc:Children>\n      <opc:Property SymbolicName=\"UpdateRate\" DataType=\"ua:UInt32\" ValueRank=\"Scalar\" AccessLevel=\"ReadWrite\">\n        <opc:Description>The rate at which the simulation runs.</opc:Description>\n      </opc:Property>\n      <opc:Method SymbolicName=\"Start\" ModellingRule=\"Mandatory\">\n        <opc:Description>Causes the Program to transition from the Ready state to the Running state.</opc:Description>\n      </opc:Method>\n      <opc:Method SymbolicName=\"Suspend\" ModellingRule=\"Mandatory\">\n        <opc:Description>Causes the Program to transition from the Running state to the Suspended state.</opc:Description>\n      </opc:Method>\n      <opc:Method SymbolicName=\"Resume\" ModellingRule=\"Mandatory\">\n        <opc:Description>Causes the Program to transition from the Suspended state to the Running state.</opc:Description>\n      </opc:Method>\n      <opc:Method SymbolicName=\"Halt\" ModellingRule=\"Mandatory\">\n        <opc:Description>Causes the Program to transition from the Ready, Running or Suspended state to the Halted state.</opc:Description>\n      </opc:Method>\n      <opc:Method SymbolicName=\"Reset\" ModellingRule=\"Mandatory\">\n        <opc:Description>Causes the Program to transition from the Halted state to the Ready state.</opc:Description>\n      </opc:Method>\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"BoilerInputPipeType\" BaseType=\"ua:FolderType\">\n    <opc:Children>\n      <opc:Object SymbolicName=\"FlowTransmitter1\" TypeDefinition=\"FlowTransmitterType\" SupportsEvents=\"true\">\n        <opc:BrowseName>FTX001</opc:BrowseName>\n      </opc:Object>\n      <opc:Object SymbolicName=\"Valve\" TypeDefinition=\"ValveType\" SupportsEvents=\"true\">\n        <opc:BrowseName>ValveX001</opc:BrowseName>\n      </opc:Object>\n    </opc:Children>\n    <opc:References>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>BoilerInputPipeType_FlowTransmitter1</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"BoilerDrumType\" BaseType=\"ua:FolderType\">\n    <opc:Children>\n      <opc:Object SymbolicName=\"LevelIndicator\" TypeDefinition=\"LevelIndicatorType\" SupportsEvents=\"true\">\n        <opc:BrowseName>LIX001</opc:BrowseName>\n      </opc:Object>\n    </opc:Children>\n    <opc:References>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>BoilerDrumType_LevelIndicator</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"BoilerOutputPipeType\" BaseType=\"ua:FolderType\">\n    <opc:Children>\n      <opc:Object SymbolicName=\"FlowTransmitter2\" TypeDefinition=\"FlowTransmitterType\" SupportsEvents=\"true\">\n        <opc:BrowseName>FTX002</opc:BrowseName>\n      </opc:Object>\n    </opc:Children>\n    <opc:References>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>BoilerOutputPipeType_FlowTransmitter2</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"BoilerType\" BaseType=\"ua:BaseObjectType\" SupportsEvents=\"true\">\n    <opc:Description>A boiler used to produce steam for a turbine.</opc:Description>\n    <opc:Children>\n      <opc:Object SymbolicName=\"InputPipe\" TypeDefinition=\"BoilerInputPipeType\" SupportsEvents=\"true\">\n        <opc:BrowseName>PipeX001</opc:BrowseName>\n        <opc:Children>\n          <opc:Object SymbolicName=\"FlowTransmitter1\">\n            <opc:BrowseName>FTX001</opc:BrowseName>\n            <opc:Children>\n              <opc:Variable SymbolicName=\"Output\" />\n            </opc:Children>\n          </opc:Object>\n          <opc:Object SymbolicName=\"Valve\">\n            <opc:BrowseName>ValveX001</opc:BrowseName>\n            <opc:Children>\n              <opc:Variable SymbolicName=\"Input\" />\n            </opc:Children>\n          </opc:Object>\n        </opc:Children>\n        <opc:References>\n          <opc:Reference>\n            <opc:ReferenceType>FlowTo</opc:ReferenceType>\n            <opc:TargetId>BoilerType_Drum</opc:TargetId>\n          </opc:Reference>\n        </opc:References>\n      </opc:Object>\n      <opc:Object SymbolicName=\"Drum\" TypeDefinition=\"BoilerDrumType\" SupportsEvents=\"true\">\n        <opc:BrowseName>DrumX001</opc:BrowseName>\n        <opc:Children>\n          <opc:Object SymbolicName=\"LevelIndicator\">\n            <opc:BrowseName>LIX001</opc:BrowseName>\n            <opc:Children>\n              <opc:Variable Declaration=\"GenericSensorType_Output\" />\n            </opc:Children>\n          </opc:Object>\n        </opc:Children>\n        <opc:References>\n          <opc:Reference>\n            <opc:ReferenceType>HotFlowTo</opc:ReferenceType>\n            <opc:TargetId>BoilerType_OutputPipe</opc:TargetId>\n          </opc:Reference>\n        </opc:References>\n      </opc:Object>\n      <opc:Object SymbolicName=\"OutputPipe\" TypeDefinition=\"BoilerOutputPipeType\" SupportsEvents=\"true\">\n        <opc:BrowseName>PipeX002</opc:BrowseName>\n        <opc:Children>\n          <opc:Object SymbolicName=\"FlowTransmitter2\">\n            <opc:BrowseName>FTX002</opc:BrowseName>\n            <opc:Children>\n              <opc:Variable SymbolicName=\"Output\" />\n            </opc:Children>\n          </opc:Object>\n        </opc:Children>\n      </opc:Object>\n      <opc:Object SymbolicName=\"FlowController\" TypeDefinition=\"FlowControllerType\">\n        <opc:BrowseName>FCX001</opc:BrowseName>\n        <opc:Children>\n          <opc:Property SymbolicName=\"Measurement\">\n            <opc:References>\n              <opc:Reference IsInverse=\"true\">\n                <opc:ReferenceType>SignalTo</opc:ReferenceType>\n                <opc:TargetId>BoilerType_InputPipe_FlowTransmitter1_Output</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n          <opc:Property SymbolicName=\"SetPoint\" />\n          <opc:Property SymbolicName=\"ControlOut\">\n            <opc:References>\n              <opc:Reference>\n                <opc:ReferenceType>SignalTo</opc:ReferenceType>\n                <opc:TargetId>BoilerType_InputPipe_Valve_Input</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n        </opc:Children>\n      </opc:Object>\n      <opc:Object SymbolicName=\"LevelController\" TypeDefinition=\"LevelControllerType\">\n        <opc:BrowseName>LCX001</opc:BrowseName>\n        <opc:Children>\n          <opc:Property SymbolicName=\"Measurement\">\n            <opc:References>\n              <opc:Reference IsInverse=\"true\">\n                <opc:ReferenceType>SignalTo</opc:ReferenceType>\n                <opc:TargetId>BoilerType_Drum_LevelIndicator_Output</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n          <opc:Property SymbolicName=\"SetPoint\" />\n          <opc:Property SymbolicName=\"ControlOut\">\n            <opc:References>\n              <opc:Reference>\n                <opc:ReferenceType>SignalTo</opc:ReferenceType>\n                <opc:TargetId>BoilerType_CustomController_Input1</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n        </opc:Children>\n      </opc:Object>\n      <opc:Object SymbolicName=\"CustomController\" TypeDefinition=\"CustomControllerType\">\n        <opc:BrowseName>CCX001</opc:BrowseName>\n        <opc:Children>\n          <opc:Property SymbolicName=\"Input1\" />\n          <opc:Property SymbolicName=\"Input2\">\n            <opc:References>\n              <opc:Reference IsInverse=\"true\">\n                <opc:ReferenceType>SignalTo</opc:ReferenceType>\n                <opc:TargetId>BoilerType_InputPipe_FlowTransmitter1_Output</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n          <opc:Property SymbolicName=\"Input3\">\n            <opc:References>\n              <opc:Reference IsInverse=\"true\">\n                <opc:ReferenceType>SignalTo</opc:ReferenceType>\n                <opc:TargetId>BoilerType_OutputPipe_FlowTransmitter2_Output</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n          <opc:Property SymbolicName=\"ControlOut\">\n            <opc:References>\n              <opc:Reference>\n                <opc:ReferenceType>SignalTo</opc:ReferenceType>\n                <opc:TargetId>BoilerType_FlowController_SetPoint</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n        </opc:Children>\n      </opc:Object>\n      <opc:Object SymbolicName=\"Simulation\" TypeDefinition=\"BoilerStateMachineType\" SupportsEvents=\"true\" />\n    </opc:Children>\n    <opc:References>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>BoilerType_InputPipe</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>BoilerType_Drum</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>BoilerType_OutputPipe</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasEventSource</opc:ReferenceType>\n        <opc:TargetId>BoilerType_Simulation</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:ObjectType>\n\n  <opc:Object SymbolicName=\"Boilers\" TypeDefinition=\"ua:FolderType\" SupportsEvents=\"true\">\n    <opc:Children>\n      <opc:Object SymbolicName=\"Boiler1\" TypeDefinition=\"BoilerType\">\n        <opc:BrowseName>Boiler #1</opc:BrowseName>\n        <opc:Children>\n          <opc:Object SymbolicName=\"InputPipe\">\n            <opc:DisplayName>Pipe1001</opc:DisplayName>\n          </opc:Object>\n          <opc:Object SymbolicName=\"Drum\">\n            <opc:DisplayName>Drum1001</opc:DisplayName>\n          </opc:Object>\n          <opc:Object SymbolicName=\"OutputPipe\">\n            <opc:DisplayName>Pipe1002</opc:DisplayName>\n          </opc:Object>\n          <opc:Object SymbolicName=\"FlowController\">\n            <opc:DisplayName>FC1001</opc:DisplayName>\n          </opc:Object>\n          <opc:Object SymbolicName=\"LevelController\">\n            <opc:DisplayName>LC1001</opc:DisplayName>\n          </opc:Object>\n          <opc:Object SymbolicName=\"CustomController\">\n            <opc:DisplayName>CC1001</opc:DisplayName>\n          </opc:Object>\n        </opc:Children>\n      </opc:Object>\n    </opc:Children>\n    <opc:References>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>Boilers_Boiler1</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ObjectsFolder</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>ua:Server</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:Object>\n  \n</opc:ModelDesign>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/BuildDesigns.bat",
    "content": "@echo off\nsetlocal\n\npushd Boiler\\Design\nset design=BoilerDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd HistoricalEvents\\Design\nset design=ModelDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd MemoryBuffer\\Design\nset design=MemoryBufferDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd SimpleEvents\\Design\nset design=ModelDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd TestData\\Design\nset design=TestDataDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd Views\\Design\nset design=ModelDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd Views\\Design\nset design=OperationsDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd Views\\Design\nset design=EngineeringDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd Vehicles\\Design\nset design=ModelDesign1\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd Vehicles\\Design\nset design=ModelDesign2\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n\npushd Plc\\Design\nset design=ModelDesign\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile -version v104 -d2 \"%design%.xml\" -cg \"%design%.csv\" -o2 \".\"\npopd\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/BuildNodesets.bat",
    "content": "@echo off\nsetlocal\n\npushd Isa95Jobs\necho Building %design%\nOpc.Ua.ModelCompiler.exe compile-nodesets -input \"Nodesets\" -o2 \"Design\" -uri http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\npopd\n\n\n\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/HistoricalEvents.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\n\nnamespace HistoricalEvents\n{\n    #region WellTestReportState Class\n#if (!OPCUA_EXCLUDE_WellTestReportState)\n    /// <summary>\n    /// Stores an instance of the WellTestReportType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class WellTestReportState : BaseEventState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public WellTestReportState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(HistoricalEvents.ObjectTypes.WellTestReportType, HistoricalEvents.Namespaces.HistoricalEvents, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACkAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvSGlzdG9yaWNhbEV2ZW50c/////8EYIACAQAA\" +\n           \"AAEAGgAAAFdlbGxUZXN0UmVwb3J0VHlwZUluc3RhbmNlAQH7AAEB+wD7AAAA/////wwAAAAVYIkKAgAA\" +\n           \"AAAABwAAAEV2ZW50SWQBAfwAAC4ARPwAAAAAD/////8BAf////8AAAAAFWCJCgIAAAAAAAkAAABFdmVu\" +\n           \"dFR5cGUBAf0AAC4ARP0AAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VOb2RlAQH+\" +\n           \"AAAuAET+AAAAABH/////AQH/////AAAAABVgiQoCAAAAAAAKAAAAU291cmNlTmFtZQEB/wAALgBE/wAA\" +\n           \"AAAM/////wEB/////wAAAAAVYIkKAgAAAAAABAAAAFRpbWUBAQABAC4ARAABAAABACYB/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAACwAAAFJlY2VpdmVUaW1lAQEBAQAuAEQBAQAAAQAmAf////8BAf////8AAAAA\" +\n           \"FWCJCgIAAAAAAAcAAABNZXNzYWdlAQEDAQAuAEQDAQAAABX/////AQH/////AAAAABVgiQoCAAAAAAAI\" +\n           \"AAAAU2V2ZXJpdHkBAQQBAC4ARAQBAAAABf////8BAf////8AAAAANWCJCgIAAAABAAgAAABOYW1lV2Vs\" +\n           \"bAEBBQEDAAAAAEQAAABIdW1hbiByZWNvZ25pemFibGUgY29udGV4dCBmb3IgdGhlIHdlbGwgdGhhdCBj\" +\n           \"b250YWlucyB0aGUgd2VsbCB0ZXN0LgAuAEQFAQAAAAz/////AQH/////AAAAADVgiQoCAAAAAQAHAAAA\" +\n           \"VWlkV2VsbAEBBgEDAAAAAHMAAABVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHdlbGwuIFRoaXMgdW5p\" +\n           \"cXVlbHkgcmVwcmVzZW50cyB0aGUgd2VsbCByZWZlcmVuY2VkIGJ5IHRoZSAocG9zc2libHkgbm9uLXVu\" +\n           \"aXF1ZSkgTmFtZVdlbGwuAC4ARAYBAAAADP////8BAf////8AAAAANWCJCgIAAAABAAgAAABUZXN0RGF0\" +\n           \"ZQEBBwEDAAAAABsAAABUaGUgZGF0ZS10aW1lIG9mIHdlbGwgdGVzdC4ALgBEBwEAAAAN/////wEB////\" +\n           \"/wAAAAA1YIkKAgAAAAEACgAAAFRlc3RSZWFzb24BAQgBAwAAAAA6AAAAVGhlIHJlYXNvbiBmb3IgdGhl\" +\n           \"IHdlbGwgdGVzdDogaW5pdGlhbCwgcGVyaW9kaWMsIHJldmlzaW9uLgAuAEQIAQAAAAz/////AQH/////\" +\n           \"AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<string> NameWell\n        {\n            get\n            {\n                return m_nameWell;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_nameWell, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_nameWell = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<string> UidWell\n        {\n            get\n            {\n                return m_uidWell;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_uidWell, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uidWell = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<DateTime> TestDate\n        {\n            get\n            {\n                return m_testDate;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_testDate, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_testDate = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<string> TestReason\n        {\n            get\n            {\n                return m_testReason;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_testReason, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_testReason = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_nameWell != null)\n            {\n                children.Add(m_nameWell);\n            }\n\n            if (m_uidWell != null)\n            {\n                children.Add(m_uidWell);\n            }\n\n            if (m_testDate != null)\n            {\n                children.Add(m_testDate);\n            }\n\n            if (m_testReason != null)\n            {\n                children.Add(m_testReason);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case HistoricalEvents.BrowseNames.NameWell:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (NameWell == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    NameWell = new PropertyState<string>(this);\n                                }\n                                else\n                                {\n                                    NameWell = (PropertyState<string>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = NameWell;\n                        break;\n                    }\n\n                case HistoricalEvents.BrowseNames.UidWell:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (UidWell == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    UidWell = new PropertyState<string>(this);\n                                }\n                                else\n                                {\n                                    UidWell = (PropertyState<string>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = UidWell;\n                        break;\n                    }\n\n                case HistoricalEvents.BrowseNames.TestDate:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (TestDate == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    TestDate = new PropertyState<DateTime>(this);\n                                }\n                                else\n                                {\n                                    TestDate = (PropertyState<DateTime>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = TestDate;\n                        break;\n                    }\n\n                case HistoricalEvents.BrowseNames.TestReason:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (TestReason == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    TestReason = new PropertyState<string>(this);\n                                }\n                                else\n                                {\n                                    TestReason = (PropertyState<string>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = TestReason;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<string> m_nameWell;\n        private PropertyState<string> m_uidWell;\n        private PropertyState<DateTime> m_testDate;\n        private PropertyState<string> m_testReason;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region FluidLevelTestReportState Class\n#if (!OPCUA_EXCLUDE_FluidLevelTestReportState)\n    /// <summary>\n    /// Stores an instance of the FluidLevelTestReportType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class FluidLevelTestReportState : WellTestReportState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public FluidLevelTestReportState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(HistoricalEvents.ObjectTypes.FluidLevelTestReportType, HistoricalEvents.Namespaces.HistoricalEvents, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACkAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvSGlzdG9yaWNhbEV2ZW50c/////8EYIACAQAA\" +\n           \"AAEAIAAAAEZsdWlkTGV2ZWxUZXN0UmVwb3J0VHlwZUluc3RhbmNlAQEJAQEBCQEJAQAA/////w4AAAAV\" +\n           \"YIkKAgAAAAAABwAAAEV2ZW50SWQBAQoBAC4ARAoBAAAAD/////8BAf////8AAAAAFWCJCgIAAAAAAAkA\" +\n           \"AABFdmVudFR5cGUBAQsBAC4ARAsBAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VO\" +\n           \"b2RlAQEMAQAuAEQMAQAAABH/////AQH/////AAAAABVgiQoCAAAAAAAKAAAAU291cmNlTmFtZQEBDQEA\" +\n           \"LgBEDQEAAAAM/////wEB/////wAAAAAVYIkKAgAAAAAABAAAAFRpbWUBAQ4BAC4ARA4BAAABACYB////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAAACwAAAFJlY2VpdmVUaW1lAQEPAQAuAEQPAQAAAQAmAf////8BAf//\" +\n           \"//8AAAAAFWCJCgIAAAAAAAcAAABNZXNzYWdlAQERAQAuAEQRAQAAABX/////AQH/////AAAAABVgiQoC\" +\n           \"AAAAAAAIAAAAU2V2ZXJpdHkBARIBAC4ARBIBAAAABf////8BAf////8AAAAANWCJCgIAAAABAAgAAABO\" +\n           \"YW1lV2VsbAEBEwEDAAAAAEQAAABIdW1hbiByZWNvZ25pemFibGUgY29udGV4dCBmb3IgdGhlIHdlbGwg\" +\n           \"dGhhdCBjb250YWlucyB0aGUgd2VsbCB0ZXN0LgAuAEQTAQAAAAz/////AQH/////AAAAADVgiQoCAAAA\" +\n           \"AQAHAAAAVWlkV2VsbAEBFAEDAAAAAHMAAABVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHdlbGwuIFRo\" +\n           \"aXMgdW5pcXVlbHkgcmVwcmVzZW50cyB0aGUgd2VsbCByZWZlcmVuY2VkIGJ5IHRoZSAocG9zc2libHkg\" +\n           \"bm9uLXVuaXF1ZSkgTmFtZVdlbGwuAC4ARBQBAAAADP////8BAf////8AAAAANWCJCgIAAAABAAgAAABU\" +\n           \"ZXN0RGF0ZQEBFQEDAAAAABsAAABUaGUgZGF0ZS10aW1lIG9mIHdlbGwgdGVzdC4ALgBEFQEAAAAN////\" +\n           \"/wEB/////wAAAAA1YIkKAgAAAAEACgAAAFRlc3RSZWFzb24BARYBAwAAAAA6AAAAVGhlIHJlYXNvbiBm\" +\n           \"b3IgdGhlIHdlbGwgdGVzdDogaW5pdGlhbCwgcGVyaW9kaWMsIHJldmlzaW9uLgAuAEQWAQAAAAz/////\" +\n           \"AQH/////AAAAADVgiQoCAAAAAQAKAAAARmx1aWRMZXZlbAEBFwEDAAAAAGIAAABUaGUgZmx1aWQgbGV2\" +\n           \"ZWwgYWNoaWV2ZWQgaW4gdGhlIHdlbGwuIFRoZSB2YWx1ZSBpcyBnaXZlbiBhcyBsZW5ndGggdW5pdHMg\" +\n           \"ZnJvbSB0aGUgdG9wIG9mIHRoZSB3ZWxsLgAvAQBACRcBAAAAC/////8BAf////8CAAAAFWCJCgIAAAAA\" +\n           \"AAcAAABFVVJhbmdlAQEwAQAuAEQwAQAAAQB0A/////8BAf////8AAAAAFWCJCgIAAAAAABAAAABFbmdp\" +\n           \"bmVlcmluZ1VuaXRzAQEaAQAuAEQaAQAAAQB3A/////8BAf////8AAAAANWCJCgIAAAABAAgAAABUZXN0\" +\n           \"ZWRCeQEBGwEDAAAAAEsAAABUaGUgYnVzaW5lc3MgYXNzb2NpYXRlIHRoYXQgY29uZHVjdGVkIHRoZSB0\" +\n           \"ZXN0LiBUaGlzIGlzIGdlbmVyYWxseSBhIHBlcnNvbi4ALgBEGwEAAAAM/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public AnalogItemState<double> FluidLevel\n        {\n            get\n            {\n                return m_fluidLevel;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_fluidLevel, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_fluidLevel = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<string> TestedBy\n        {\n            get\n            {\n                return m_testedBy;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_testedBy, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_testedBy = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_fluidLevel != null)\n            {\n                children.Add(m_fluidLevel);\n            }\n\n            if (m_testedBy != null)\n            {\n                children.Add(m_testedBy);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case HistoricalEvents.BrowseNames.FluidLevel:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (FluidLevel == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    FluidLevel = new AnalogItemState<double>(this);\n                                }\n                                else\n                                {\n                                    FluidLevel = (AnalogItemState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = FluidLevel;\n                        break;\n                    }\n\n                case HistoricalEvents.BrowseNames.TestedBy:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (TestedBy == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    TestedBy = new PropertyState<string>(this);\n                                }\n                                else\n                                {\n                                    TestedBy = (PropertyState<string>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = TestedBy;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private AnalogItemState<double> m_fluidLevel;\n        private PropertyState<string> m_testedBy;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region InjectionTestReportState Class\n#if (!OPCUA_EXCLUDE_InjectionTestReportState)\n    /// <summary>\n    /// Stores an instance of the InjectionTestReportType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class InjectionTestReportState : WellTestReportState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public InjectionTestReportState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(HistoricalEvents.ObjectTypes.InjectionTestReportType, HistoricalEvents.Namespaces.HistoricalEvents, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACkAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvSGlzdG9yaWNhbEV2ZW50c/////8EYIACAQAA\" +\n           \"AAEAHwAAAEluamVjdGlvblRlc3RSZXBvcnRUeXBlSW5zdGFuY2UBARwBAQEcARwBAAD/////DgAAABVg\" +\n           \"iQoCAAAAAAAHAAAARXZlbnRJZAEBHQEALgBEHQEAAAAP/////wEB/////wAAAAAVYIkKAgAAAAAACQAA\" +\n           \"AEV2ZW50VHlwZQEBHgEALgBEHgEAAAAR/////wEB/////wAAAAAVYIkKAgAAAAAACgAAAFNvdXJjZU5v\" +\n           \"ZGUBAR8BAC4ARB8BAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VOYW1lAQEgAQAu\" +\n           \"AEQgAQAAAAz/////AQH/////AAAAABVgiQoCAAAAAAAEAAAAVGltZQEBIQEALgBEIQEAAAEAJgH/////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAALAAAAUmVjZWl2ZVRpbWUBASIBAC4ARCIBAAABACYB/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAABwAAAE1lc3NhZ2UBASQBAC4ARCQBAAAAFf////8BAf////8AAAAAFWCJCgIA\" +\n           \"AAAAAAgAAABTZXZlcml0eQEBJQEALgBEJQEAAAAF/////wEB/////wAAAAA1YIkKAgAAAAEACAAAAE5h\" +\n           \"bWVXZWxsAQEmAQMAAAAARAAAAEh1bWFuIHJlY29nbml6YWJsZSBjb250ZXh0IGZvciB0aGUgd2VsbCB0\" +\n           \"aGF0IGNvbnRhaW5zIHRoZSB3ZWxsIHRlc3QuAC4ARCYBAAAADP////8BAf////8AAAAANWCJCgIAAAAB\" +\n           \"AAcAAABVaWRXZWxsAQEnAQMAAAAAcwAAAFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgd2VsbC4gVGhp\" +\n           \"cyB1bmlxdWVseSByZXByZXNlbnRzIHRoZSB3ZWxsIHJlZmVyZW5jZWQgYnkgdGhlIChwb3NzaWJseSBu\" +\n           \"b24tdW5pcXVlKSBOYW1lV2VsbC4ALgBEJwEAAAAM/////wEB/////wAAAAA1YIkKAgAAAAEACAAAAFRl\" +\n           \"c3REYXRlAQEoAQMAAAAAGwAAAFRoZSBkYXRlLXRpbWUgb2Ygd2VsbCB0ZXN0LgAuAEQoAQAAAA3/////\" +\n           \"AQH/////AAAAADVgiQoCAAAAAQAKAAAAVGVzdFJlYXNvbgEBKQEDAAAAADoAAABUaGUgcmVhc29uIGZv\" +\n           \"ciB0aGUgd2VsbCB0ZXN0OiBpbml0aWFsLCBwZXJpb2RpYywgcmV2aXNpb24uAC4ARCkBAAAADP////8B\" +\n           \"Af////8AAAAANWCJCgIAAAABAAwAAABUZXN0RHVyYXRpb24BASoBAwAAAAAsAAAAVGhlIHRpbWUgbGVu\" +\n           \"Z3RoICh3aXRoIHVvbSkgb2YgdGhlIHdlbGwgdGVzdC4ALwEAQAkqAQAAAAv/////AQH/////AgAAABVg\" +\n           \"iQoCAAAAAAAHAAAARVVSYW5nZQEBMgEALgBEMgEAAAEAdAP/////AQH/////AAAAABVgiQoCAAAAAAAQ\" +\n           \"AAAARW5naW5lZXJpbmdVbml0cwEBLQEALgBELQEAAAEAdwP/////AQH/////AAAAADVgiQoCAAAAAQAN\" +\n           \"AAAASW5qZWN0ZWRGbHVpZAEBLgEDAAAAACMAAABUaGUgZmx1aWQgdGhhdCBpcyBiZWluZyBpbmplY3Rl\" +\n           \"ZC4gLgAuAEQuAQAAAAz/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public AnalogItemState<double> TestDuration\n        {\n            get\n            {\n                return m_testDuration;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_testDuration, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_testDuration = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<string> InjectedFluid\n        {\n            get\n            {\n                return m_injectedFluid;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_injectedFluid, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_injectedFluid = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_testDuration != null)\n            {\n                children.Add(m_testDuration);\n            }\n\n            if (m_injectedFluid != null)\n            {\n                children.Add(m_injectedFluid);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case HistoricalEvents.BrowseNames.TestDuration:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (TestDuration == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    TestDuration = new AnalogItemState<double>(this);\n                                }\n                                else\n                                {\n                                    TestDuration = (AnalogItemState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = TestDuration;\n                        break;\n                    }\n\n                case HistoricalEvents.BrowseNames.InjectedFluid:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (InjectedFluid == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    InjectedFluid = new PropertyState<string>(this);\n                                }\n                                else\n                                {\n                                    InjectedFluid = (PropertyState<string>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = InjectedFluid;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private AnalogItemState<double> m_testDuration;\n        private PropertyState<string> m_injectedFluid;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region WellState Class\n#if (!OPCUA_EXCLUDE_WellState)\n    /// <summary>\n    /// Stores an instance of the WellType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class WellState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public WellState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(HistoricalEvents.ObjectTypes.WellType, HistoricalEvents.Namespaces.HistoricalEvents, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACkAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvSGlzdG9yaWNhbEV2ZW50c/////8EYIACAQAA\" +\n           \"AAEAEAAAAFdlbGxUeXBlSW5zdGFuY2UBATQBAQE0ATQBAAD/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/HistoricalEvents.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace HistoricalEvents\n{\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the Plaforms Object.\n        /// </summary>\n        public const uint Plaforms = 303;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <summary>\n        /// The identifier for the WellTestReportType ObjectType.\n        /// </summary>\n        public const uint WellTestReportType = 251;\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType ObjectType.\n        /// </summary>\n        public const uint FluidLevelTestReportType = 265;\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType ObjectType.\n        /// </summary>\n        public const uint InjectionTestReportType = 284;\n\n        /// <summary>\n        /// The identifier for the WellType ObjectType.\n        /// </summary>\n        public const uint WellType = 308;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the WellTestReportType_NameWell Variable.\n        /// </summary>\n        public const uint WellTestReportType_NameWell = 261;\n\n        /// <summary>\n        /// The identifier for the WellTestReportType_UidWell Variable.\n        /// </summary>\n        public const uint WellTestReportType_UidWell = 262;\n\n        /// <summary>\n        /// The identifier for the WellTestReportType_TestDate Variable.\n        /// </summary>\n        public const uint WellTestReportType_TestDate = 263;\n\n        /// <summary>\n        /// The identifier for the WellTestReportType_TestReason Variable.\n        /// </summary>\n        public const uint WellTestReportType_TestReason = 264;\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType_FluidLevel Variable.\n        /// </summary>\n        public const uint FluidLevelTestReportType_FluidLevel = 279;\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType_FluidLevel_EURange Variable.\n        /// </summary>\n        public const uint FluidLevelTestReportType_FluidLevel_EURange = 304;\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType_FluidLevel_EngineeringUnits Variable.\n        /// </summary>\n        public const uint FluidLevelTestReportType_FluidLevel_EngineeringUnits = 282;\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType_TestedBy Variable.\n        /// </summary>\n        public const uint FluidLevelTestReportType_TestedBy = 283;\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType_TestDuration Variable.\n        /// </summary>\n        public const uint InjectionTestReportType_TestDuration = 298;\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType_TestDuration_EURange Variable.\n        /// </summary>\n        public const uint InjectionTestReportType_TestDuration_EURange = 306;\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType_TestDuration_EngineeringUnits Variable.\n        /// </summary>\n        public const uint InjectionTestReportType_TestDuration_EngineeringUnits = 301;\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType_InjectedFluid Variable.\n        /// </summary>\n        public const uint InjectionTestReportType_InjectedFluid = 302;\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the Plaforms Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Plaforms = new ExpandedNodeId(HistoricalEvents.Objects.Plaforms, HistoricalEvents.Namespaces.HistoricalEvents);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <summary>\n        /// The identifier for the WellTestReportType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId WellTestReportType = new ExpandedNodeId(HistoricalEvents.ObjectTypes.WellTestReportType, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId FluidLevelTestReportType = new ExpandedNodeId(HistoricalEvents.ObjectTypes.FluidLevelTestReportType, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId InjectionTestReportType = new ExpandedNodeId(HistoricalEvents.ObjectTypes.InjectionTestReportType, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the WellType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId WellType = new ExpandedNodeId(HistoricalEvents.ObjectTypes.WellType, HistoricalEvents.Namespaces.HistoricalEvents);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the WellTestReportType_NameWell Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId WellTestReportType_NameWell = new ExpandedNodeId(HistoricalEvents.Variables.WellTestReportType_NameWell, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the WellTestReportType_UidWell Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId WellTestReportType_UidWell = new ExpandedNodeId(HistoricalEvents.Variables.WellTestReportType_UidWell, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the WellTestReportType_TestDate Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId WellTestReportType_TestDate = new ExpandedNodeId(HistoricalEvents.Variables.WellTestReportType_TestDate, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the WellTestReportType_TestReason Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId WellTestReportType_TestReason = new ExpandedNodeId(HistoricalEvents.Variables.WellTestReportType_TestReason, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType_FluidLevel Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId FluidLevelTestReportType_FluidLevel = new ExpandedNodeId(HistoricalEvents.Variables.FluidLevelTestReportType_FluidLevel, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType_FluidLevel_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId FluidLevelTestReportType_FluidLevel_EURange = new ExpandedNodeId(HistoricalEvents.Variables.FluidLevelTestReportType_FluidLevel_EURange, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType_FluidLevel_EngineeringUnits Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId FluidLevelTestReportType_FluidLevel_EngineeringUnits = new ExpandedNodeId(HistoricalEvents.Variables.FluidLevelTestReportType_FluidLevel_EngineeringUnits, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the FluidLevelTestReportType_TestedBy Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId FluidLevelTestReportType_TestedBy = new ExpandedNodeId(HistoricalEvents.Variables.FluidLevelTestReportType_TestedBy, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType_TestDuration Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId InjectionTestReportType_TestDuration = new ExpandedNodeId(HistoricalEvents.Variables.InjectionTestReportType_TestDuration, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType_TestDuration_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId InjectionTestReportType_TestDuration_EURange = new ExpandedNodeId(HistoricalEvents.Variables.InjectionTestReportType_TestDuration_EURange, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType_TestDuration_EngineeringUnits Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId InjectionTestReportType_TestDuration_EngineeringUnits = new ExpandedNodeId(HistoricalEvents.Variables.InjectionTestReportType_TestDuration_EngineeringUnits, HistoricalEvents.Namespaces.HistoricalEvents);\n\n        /// <summary>\n        /// The identifier for the InjectionTestReportType_InjectedFluid Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId InjectionTestReportType_InjectedFluid = new ExpandedNodeId(HistoricalEvents.Variables.InjectionTestReportType_InjectedFluid, HistoricalEvents.Namespaces.HistoricalEvents);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the FluidLevel component.\n        /// </summary>\n        public const string FluidLevel = \"FluidLevel\";\n\n        /// <summary>\n        /// The BrowseName for the FluidLevelTestReportType component.\n        /// </summary>\n        public const string FluidLevelTestReportType = \"FluidLevelTestReportType\";\n\n        /// <summary>\n        /// The BrowseName for the InjectedFluid component.\n        /// </summary>\n        public const string InjectedFluid = \"InjectedFluid\";\n\n        /// <summary>\n        /// The BrowseName for the InjectionTestReportType component.\n        /// </summary>\n        public const string InjectionTestReportType = \"InjectionTestReportType\";\n\n        /// <summary>\n        /// The BrowseName for the NameWell component.\n        /// </summary>\n        public const string NameWell = \"NameWell\";\n\n        /// <summary>\n        /// The BrowseName for the Plaforms component.\n        /// </summary>\n        public const string Plaforms = \"Plaforms\";\n\n        /// <summary>\n        /// The BrowseName for the TestDate component.\n        /// </summary>\n        public const string TestDate = \"TestDate\";\n\n        /// <summary>\n        /// The BrowseName for the TestDuration component.\n        /// </summary>\n        public const string TestDuration = \"TestDuration\";\n\n        /// <summary>\n        /// The BrowseName for the TestedBy component.\n        /// </summary>\n        public const string TestedBy = \"TestedBy\";\n\n        /// <summary>\n        /// The BrowseName for the TestReason component.\n        /// </summary>\n        public const string TestReason = \"TestReason\";\n\n        /// <summary>\n        /// The BrowseName for the UidWell component.\n        /// </summary>\n        public const string UidWell = \"UidWell\";\n\n        /// <summary>\n        /// The BrowseName for the WellTestReportType component.\n        /// </summary>\n        public const string WellTestReportType = \"WellTestReportType\";\n\n        /// <summary>\n        /// The BrowseName for the WellType component.\n        /// </summary>\n        public const string WellType = \"WellType\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the HistoricalEvents namespace (.NET code namespace is 'HistoricalEvents').\n        /// </summary>\n        public const string HistoricalEvents = \"http://opcfoundation.org/HistoricalEvents\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/HistoricalEvents.NodeIds.csv",
    "content": "FluidLevelTestReportType,265,ObjectType\nInjectionTestReportType,284,ObjectType\nPlaforms,303,Object\nWellTestReportType,251,ObjectType\nWellType,308,ObjectType\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/HistoricalEvents.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/HistoricalEvents</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=251</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WellTestReportType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WellTestReportType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A report containing the results of a well test.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=261</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=262</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=263</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=264</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=284</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=261</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NameWell</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NameWell</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Human recognizable context for the well that contains the well test.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=262</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UidWell</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UidWell</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Unique identifier for the well. This uniquely represents the well referenced by the (possibly non-unique) NameWell.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=263</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TestDate</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TestDate</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The date-time of well test.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=13</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=264</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TestReason</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TestReason</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The reason for the well test: initial, periodic, revision.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=265</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FluidLevelTestReportType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FluidLevelTestReportType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A report for a fluid level test.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=279</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=283</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=279</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FluidLevel</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FluidLevel</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The fluid level achieved in the well. The value is given as length units from the top of the well.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=304</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=282</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=282</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EngineeringUnits</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EngineeringUnits</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=279</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=887</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=283</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TestedBy</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TestedBy</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The business associate that conducted the test. This is generally a person.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=284</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>InjectionTestReportType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InjectionTestReportType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A report for a fluid level test.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=298</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=302</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=298</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TestDuration</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TestDuration</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The time length (with uom) of the well test.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=284</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=306</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=301</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=301</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EngineeringUnits</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EngineeringUnits</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=298</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=887</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=302</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>InjectedFluid</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InjectedFluid</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The fluid that is being injected. .</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=284</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=303</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Plaforms</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Plaforms</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=85</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2253</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=304</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=279</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=306</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=298</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=308</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WellType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WellType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A physical well.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/HistoricalEvents.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/HistoricalEvents</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/HistoricalEvents\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UAObjectType NodeId=\"ns=1;i=251\" BrowseName=\"1:WellTestReportType\">\n    <DisplayName>WellTestReportType</DisplayName>\n    <Description>A report containing the results of a well test.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=261</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=262</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=263</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=264</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2041</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=261\" BrowseName=\"1:NameWell\" ParentNodeId=\"ns=1;i=251\" DataType=\"String\">\n    <DisplayName>NameWell</DisplayName>\n    <Description>Human recognizable context for the well that contains the well test.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=251</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=262\" BrowseName=\"1:UidWell\" ParentNodeId=\"ns=1;i=251\" DataType=\"String\">\n    <DisplayName>UidWell</DisplayName>\n    <Description>Unique identifier for the well. This uniquely represents the well referenced by the (possibly non-unique) NameWell.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=251</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=263\" BrowseName=\"1:TestDate\" ParentNodeId=\"ns=1;i=251\" DataType=\"DateTime\">\n    <DisplayName>TestDate</DisplayName>\n    <Description>The date-time of well test.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=251</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=264\" BrowseName=\"1:TestReason\" ParentNodeId=\"ns=1;i=251\" DataType=\"String\">\n    <DisplayName>TestReason</DisplayName>\n    <Description>The reason for the well test: initial, periodic, revision.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=251</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=265\" BrowseName=\"1:FluidLevelTestReportType\">\n    <DisplayName>FluidLevelTestReportType</DisplayName>\n    <Description>A report for a fluid level test.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=279</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=283</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=251</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=279\" BrowseName=\"1:FluidLevel\" ParentNodeId=\"ns=1;i=265\" DataType=\"Double\">\n    <DisplayName>FluidLevel</DisplayName>\n    <Description>The fluid level achieved in the well. The value is given as length units from the top of the well.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=304</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=282</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=265</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=304\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=279\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=279</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=282\" BrowseName=\"EngineeringUnits\" ParentNodeId=\"ns=1;i=279\" DataType=\"i=887\">\n    <DisplayName>EngineeringUnits</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=279</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=283\" BrowseName=\"1:TestedBy\" ParentNodeId=\"ns=1;i=265\" DataType=\"String\">\n    <DisplayName>TestedBy</DisplayName>\n    <Description>The business associate that conducted the test. This is generally a person.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=265</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=284\" BrowseName=\"1:InjectionTestReportType\">\n    <DisplayName>InjectionTestReportType</DisplayName>\n    <Description>A report for a fluid level test.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=298</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=302</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=251</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=298\" BrowseName=\"1:TestDuration\" ParentNodeId=\"ns=1;i=284\" DataType=\"Double\">\n    <DisplayName>TestDuration</DisplayName>\n    <Description>The time length (with uom) of the well test.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=306</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=301</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=284</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=306\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=298\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=298</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=301\" BrowseName=\"EngineeringUnits\" ParentNodeId=\"ns=1;i=298\" DataType=\"i=887\">\n    <DisplayName>EngineeringUnits</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=298</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=302\" BrowseName=\"1:InjectedFluid\" ParentNodeId=\"ns=1;i=284\" DataType=\"String\">\n    <DisplayName>InjectedFluid</DisplayName>\n    <Description>The fluid that is being injected. .</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=284</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=308\" BrowseName=\"1:WellType\">\n    <DisplayName>WellType</DisplayName>\n    <Description>A physical well.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=303\" BrowseName=\"1:Plaforms\" EventNotifier=\"1\">\n    <DisplayName>Plaforms</DisplayName>\n    <References>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=85</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">i=2253</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=61</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/HistoricalEvents.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/HistoricalEvents</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <WellTestReportType xmlns=\"http://opcfoundation.org/HistoricalEvents\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=251</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>WellTestReportType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A report containing the results of a well test.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2041</uax:Identifier>\n    </uax:SuperTypeId>\n    <NameWell>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=261</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NameWell</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>Human recognizable context for the well that contains the well test.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>261</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NameWell>\n    <UidWell>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=262</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UidWell</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>Unique identifier for the well. This uniquely represents the well referenced by the (possibly non-unique) NameWell.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>262</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UidWell>\n    <TestDate>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=263</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>TestDate</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>The date-time of well test.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>263</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=13</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </TestDate>\n    <TestReason>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=264</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>TestReason</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>The reason for the well test: initial, periodic, revision.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>264</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </TestReason>\n  </WellTestReportType>\n  <FluidLevelTestReportType xmlns=\"http://opcfoundation.org/HistoricalEvents\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=265</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>FluidLevelTestReportType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A report for a fluid level test.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=251</uax:Identifier>\n    </uax:SuperTypeId>\n    <FluidLevel>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=279</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FluidLevel</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>The fluid level achieved in the well. The value is given as length units from the top of the well.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>279</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=304</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>304</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n      <EngineeringUnits xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=282</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EngineeringUnits</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=80</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>282</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=887</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EngineeringUnits>\n    </FluidLevel>\n    <TestedBy>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=283</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>TestedBy</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>The business associate that conducted the test. This is generally a person.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>283</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </TestedBy>\n  </FluidLevelTestReportType>\n  <InjectionTestReportType xmlns=\"http://opcfoundation.org/HistoricalEvents\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=284</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>InjectionTestReportType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A report for a fluid level test.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=251</uax:Identifier>\n    </uax:SuperTypeId>\n    <TestDuration>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=298</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>TestDuration</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>The time length (with uom) of the well test.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>298</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=306</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>306</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n      <EngineeringUnits xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=301</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EngineeringUnits</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=80</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>301</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=887</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EngineeringUnits>\n    </TestDuration>\n    <InjectedFluid>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=302</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>InjectedFluid</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Locale></uax:Locale>\n        <uax:Text>The fluid that is being injected. .</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>302</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </InjectedFluid>\n  </InjectionTestReportType>\n  <WellType xmlns=\"http://opcfoundation.org/HistoricalEvents\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=308</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>WellType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>A physical well.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n  </WellType>\n  <Plaforms xmlns=\"http://opcfoundation.org/HistoricalEvents\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=303</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Plaforms</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>303</uax:NumericId>\n    <uax:EventNotifier>1</uax:EventNotifier>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=85</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=2253</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </Plaforms>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/HistoricalEvents.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/HistoricalEvents\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/HistoricalEvents\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/HistoricalEvents.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/HistoricalEvents\"\n  targetNamespace=\"http://opcfoundation.org/HistoricalEvents\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/ModelDesign.csv",
    "content": "WellTestReportType,251,ObjectType\nWellTestReportType_EventId,252,Variable\nWellTestReportType_EventType,253,Variable\nWellTestReportType_SourceNode,254,Variable\nWellTestReportType_SourceName,255,Variable\nWellTestReportType_Time,256,Variable\nWellTestReportType_ReceiveTime,257,Variable\nWellTestReportType_LocalTime,258,Variable\nWellTestReportType_Message,259,Variable\nWellTestReportType_Severity,260,Variable\nWellTestReportType_NameWell,261,Variable\nWellTestReportType_UidWell,262,Variable\nWellTestReportType_TestDate,263,Variable\nWellTestReportType_TestReason,264,Variable\nFluidLevelTestReportType,265,ObjectType\nFluidLevelTestReportType_EventId,266,Variable\nFluidLevelTestReportType_EventType,267,Variable\nFluidLevelTestReportType_SourceNode,268,Variable\nFluidLevelTestReportType_SourceName,269,Variable\nFluidLevelTestReportType_Time,270,Variable\nFluidLevelTestReportType_ReceiveTime,271,Variable\nFluidLevelTestReportType_LocalTime,272,Variable\nFluidLevelTestReportType_Message,273,Variable\nFluidLevelTestReportType_Severity,274,Variable\nFluidLevelTestReportType_NameWell,275,Variable\nFluidLevelTestReportType_UidWell,276,Variable\nFluidLevelTestReportType_TestDate,277,Variable\nFluidLevelTestReportType_TestReason,278,Variable\nFluidLevelTestReportType_FluidLevel,279,Variable\nFluidLevelTestReportType_FluidLevel_Definition,280,Variable\nFluidLevelTestReportType_FluidLevel_ValuePrecision,281,Variable\nFluidLevelTestReportType_FluidLevel_EngineeringUnits,282,Variable\nFluidLevelTestReportType_TestedBy,283,Variable\nInjectionTestReportType,284,ObjectType\nInjectionTestReportType_EventId,285,Variable\nInjectionTestReportType_EventType,286,Variable\nInjectionTestReportType_SourceNode,287,Variable\nInjectionTestReportType_SourceName,288,Variable\nInjectionTestReportType_Time,289,Variable\nInjectionTestReportType_ReceiveTime,290,Variable\nInjectionTestReportType_LocalTime,291,Variable\nInjectionTestReportType_Message,292,Variable\nInjectionTestReportType_Severity,293,Variable\nInjectionTestReportType_NameWell,294,Variable\nInjectionTestReportType_UidWell,295,Variable\nInjectionTestReportType_TestDate,296,Variable\nInjectionTestReportType_TestReason,297,Variable\nInjectionTestReportType_TestDuration,298,Variable\nInjectionTestReportType_TestDuration_Definition,299,Variable\nInjectionTestReportType_TestDuration_ValuePrecision,300,Variable\nInjectionTestReportType_TestDuration_EngineeringUnits,301,Variable\nInjectionTestReportType_InjectedFluid,302,Variable\nPlaforms,303,Object\nFluidLevelTestReportType_FluidLevel_EURange,304,Variable\nFluidLevelTestReportType_FluidLevel_InstrumentRange,305,Variable\nInjectionTestReportType_TestDuration_EURange,306,Variable\nInjectionTestReportType_TestDuration_InstrumentRange,307,Variable\nWellType,308,ObjectType\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/HistoricalEvents/Design/ModelDesign.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns=\"http://opcfoundation.org/HistoricalEvents\"\n  TargetNamespace=\"http://opcfoundation.org/HistoricalEvents\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"HistoricalEvents\" Prefix=\"HistoricalEvents\" InternalPrefix=\"HistoricalEvents\">http://opcfoundation.org/HistoricalEvents</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:ObjectType SymbolicName=\"WellTestReportType\" BaseType=\"ua:BaseEventType\">\n    <opc:Description>A report containing the results of a well test.</opc:Description>\n    <opc:Children>\n      <opc:Property SymbolicName=\"NameWell\" DataType=\"ua:String\" ValueRank=\"Scalar\">\n        <opc:Description>Human recognizable context for the well that contains the well test. </opc:Description>\n      </opc:Property>\n      <opc:Property SymbolicName=\"UidWell\" DataType=\"ua:String\" ValueRank=\"Scalar\">\n        <opc:Description>Unique identifier for the well. This uniquely represents the well referenced by the (possibly non-unique) NameWell.</opc:Description>\n      </opc:Property>\n      <opc:Property SymbolicName=\"TestDate\" DataType=\"ua:DateTime\" ValueRank=\"Scalar\">\n        <opc:Description>The date-time of well test.</opc:Description>\n      </opc:Property>\n      <opc:Property SymbolicName=\"TestReason\" DataType=\"ua:String\" ValueRank=\"Scalar\">\n        <opc:Description>The reason for the well test: initial, periodic, revision.</opc:Description>\n      </opc:Property>\n    </opc:Children>\n  </opc:ObjectType>\n  \n  <opc:ObjectType SymbolicName=\"FluidLevelTestReportType\" BaseType=\"WellTestReportType\">\n    <opc:Description>A report for a fluid level test.</opc:Description>\n    <opc:Children>\n      <opc:Variable SymbolicName=\"FluidLevel\" DataType=\"ua:Double\" ValueRank=\"Scalar\" TypeDefinition=\"ua:AnalogItemType\">\n        <opc:Description>The fluid level achieved in the well. The value is given as length units from the top of the well.</opc:Description>\n        <opc:Children>\n          <opc:Property SymbolicName=\"ua:EngineeringUnits\">\n            <opc:Description>The unit of measure for length.</opc:Description>\n          </opc:Property>\n        </opc:Children>\n      </opc:Variable>\n      <opc:Property SymbolicName=\"TestedBy\" DataType=\"ua:String\" ValueRank=\"Scalar\">\n        <opc:Description>The business associate that conducted the test. This is generally a person.</opc:Description>\n      </opc:Property>\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"InjectionTestReportType\" BaseType=\"WellTestReportType\">\n    <opc:Description>A report for a fluid level test.</opc:Description>\n    <opc:Children>\n      <opc:Variable SymbolicName=\"TestDuration\" DataType=\"ua:Double\" ValueRank=\"Scalar\" TypeDefinition=\"ua:AnalogItemType\">\n        <opc:Description>The time length (with uom) of the well test.</opc:Description>\n        <opc:Children>\n          <opc:Property SymbolicName=\"ua:EngineeringUnits\">\n            <opc:Description>The unit of measure for time.</opc:Description>\n          </opc:Property>\n        </opc:Children>\n      </opc:Variable>\n      <opc:Property SymbolicName=\"InjectedFluid\" DataType=\"ua:String\" ValueRank=\"Scalar\">\n        <opc:Description>The fluid that is being injected. .</opc:Description>\n      </opc:Property>\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"WellType\" BaseType=\"ua:BaseObjectType\">\n    <opc:Description>A physical well.</opc:Description>\n  </opc:ObjectType>\n\n  <opc:Object SymbolicName=\"Plaforms\" TypeDefinition=\"ua:FolderType\" SupportsEvents=\"true\">\n    <opc:References>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ObjectsFolder</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>ua:Server</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:Object>\n\n</opc:ModelDesign>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2024 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\n\nnamespace UAModel.ISA95_JOBCONTROL_V2\n{\n    #region ISA95JobOrderStatusEventTypeState Class\n#if (!OPCUA_EXCLUDE_ISA95JobOrderStatusEventTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ISA95JobOrderStatusEventTypeState : BaseEventState\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobOrderStatusEventTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobOrderStatusEventType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGCAAgEAAAABACQAAABJU0E5NUpvYk9yZGVyU3RhdHVzRXZlbnRUeXBlSW5zdGFuY2UBAe4DAQHuA+4D\" +\n           \"AAAbAAAAACkBAQHrAwA2AQEBsRMANgEBAbITADYBAQGzEwA2AQEBtBMANgEBAbUTADYBAQG2EwA2AQEB\" +\n           \"txMANgEBAbgTADYBAQG5EwA2AQEBuhMANgEBAbsTADYBAQHNEwA2AQEBzhMANgEBAc8TADYBAQHQEwA2\" +\n           \"AQEB0RMANgEBAdITADYBAQHTEwA2AQEB1BMANgEBAdUTADYBAQHWEwA2AQEB1xMANgEBAdwTADYBAQHd\" +\n           \"EwA2AQEB3hMANgEBAd8TCwAAABVgiQgCAAAAAAAHAAAARXZlbnRJZAEBAAAALgBEAA//////AQH/////\" +\n           \"AAAAABVgiQgCAAAAAAAJAAAARXZlbnRUeXBlAQEAAAAuAEQAEf////8BAf////8AAAAAFWCJCAIAAAAA\" +\n           \"AAoAAABTb3VyY2VOb2RlAQEAAAAuAEQAEf////8BAf////8AAAAAFWCJCAIAAAAAAAoAAABTb3VyY2VO\" +\n           \"YW1lAQEAAAAuAEQADP////8BAf////8AAAAAFWCJCAIAAAAAAAQAAABUaW1lAQEAAAAuAEQBACYB////\" +\n           \"/wEB/////wAAAAAVYIkIAgAAAAAACwAAAFJlY2VpdmVUaW1lAQEAAAAuAEQBACYB/////wEB/////wAA\" +\n           \"AAAVYIkIAgAAAAAABwAAAE1lc3NhZ2UBAQAAAC4ARAAV/////wEB/////wAAAAAVYIkIAgAAAAAACAAA\" +\n           \"AFNldmVyaXR5AQEAAAAuAEQABf////8BAf////8AAAAAFWCJCgIAAAABAAgAAABKb2JPcmRlcgEBnxcA\" +\n           \"LgBEnxcAAAEBwAv/////AwP/////AAAAABVgiQoCAAAAAQALAAAASm9iUmVzcG9uc2UBAaEXAC4ARKEX\" +\n           \"AAABAcUL/////wMD/////wAAAAAXYIkKAgAAAAEACAAAAEpvYlN0YXRlAQGgFwAuAESgFwAAAQG+CwEA\" +\n           \"AAABAAAAAAAAAAMD/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public PropertyState<ISA95JobOrderDataType> JobOrder\n        {\n            get\n            {\n                return m_jobOrder;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_jobOrder, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_jobOrder = value;\n            }\n        }\n\n        /// <remarks />\n        public PropertyState<ISA95JobResponseDataType> JobResponse\n        {\n            get\n            {\n                return m_jobResponse;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_jobResponse, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_jobResponse = value;\n            }\n        }\n\n        /// <remarks />\n        public PropertyState<ISA95StateDataType[]> JobState\n        {\n            get\n            {\n                return m_jobState;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_jobState, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_jobState = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_jobOrder != null)\n            {\n                children.Add(m_jobOrder);\n            }\n\n            if (m_jobResponse != null)\n            {\n                children.Add(m_jobResponse);\n            }\n\n            if (m_jobState != null)\n            {\n                children.Add(m_jobState);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.JobOrder:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (JobOrder == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    JobOrder = new PropertyState<ISA95JobOrderDataType>(this);\n                                }\n                                else\n                                {\n                                    JobOrder = (PropertyState<ISA95JobOrderDataType>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = JobOrder;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.JobResponse:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (JobResponse == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    JobResponse = new PropertyState<ISA95JobResponseDataType>(this);\n                                }\n                                else\n                                {\n                                    JobResponse = (PropertyState<ISA95JobResponseDataType>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = JobResponse;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.JobState:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (JobState == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    JobState = new PropertyState<ISA95StateDataType[]>(this);\n                                }\n                                else\n                                {\n                                    JobState = (PropertyState<ISA95StateDataType[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = JobState;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<ISA95JobOrderDataType> m_jobOrder;\n        private PropertyState<ISA95JobResponseDataType> m_jobResponse;\n        private PropertyState<ISA95StateDataType[]> m_jobState;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ISA95JobResponseProviderObjectTypeState Class\n#if (!OPCUA_EXCLUDE_ISA95JobResponseProviderObjectTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ISA95JobResponseProviderObjectTypeState : BaseObjectState\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobResponseProviderObjectTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobResponseProviderObjectType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n\n            if (JobOrderResponseList != null)\n            {\n                JobOrderResponseList.Initialize(context, JobOrderResponseList_InitializationString);\n            }\n        }\n\n        #region Initialization String\n        private const string JobOrderResponseList_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"F2CJCgIAAAABABQAAABKb2JPcmRlclJlc3BvbnNlTGlzdAEBohcALwA/ohcAAAEBxQsBAAAAAQAAAAAA\" +\n           \"AAADA/////8AAAAA\";\n\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGCAAgEAAAABACoAAABJU0E5NUpvYlJlc3BvbnNlUHJvdmlkZXJPYmplY3RUeXBlSW5zdGFuY2UBAesD\" +\n           \"AQHrA+sDAAABAAAAACkAAQHuAwMAAAAXYIkKAgAAAAEAFAAAAEpvYk9yZGVyUmVzcG9uc2VMaXN0AQGi\" +\n           \"FwAvAD+iFwAAAQHFCwEAAAABAAAAAAAAAAMD/////wAAAAAEYYIKBAAAAAEAHgAAAFJlcXVlc3RKb2JS\" +\n           \"ZXNwb25zZUJ5Sm9iT3JkZXJJRAEBWhsALwEBWhtaGwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5w\" +\n           \"dXRBcmd1bWVudHMBAZoXAC4ARJoXAACWAQAAAAEAKgEBYAAAAAoAAABKb2JPcmRlcklEAAz/////AAAA\" +\n           \"AAJDAAAAQ29udGFpbnMgYW4gSUQgb2YgdGhlIGpvYiBvcmRlciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBt\" +\n           \"ZXRob2QgY2FsbGVyLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRB\" +\n           \"cmd1bWVudHMBAZsXAC4ARJsXAACWAgAAAAEAKgEB4QAAAAsAAABKb2JSZXNwb25zZQEBxQv/////AAAA\" +\n           \"AALBAAAAQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4ZWN1dGlvbiBvZiBhIGpvYiBvcmRl\" +\n           \"ciwgc3VjaCBhcyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGpvYiwgYWN0dWFsIG1hdGVyaWFsIGNv\" +\n           \"bnN1bWVkLCBhY3R1YWwgbWF0ZXJpYWwgcHJvZHVjZWQsIGFjdHVhbCBlcXVpcG1lbnQgdXNlZCwgYW5k\" +\n           \"IGpvYiBzcGVjaWZpYyBkYXRhLgEAKgEBSgAAAAwAAABSZXR1cm5TdGF0dXMACf////8AAAAAAisAAABS\" +\n           \"ZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIG1ldGhvZCBleGVjdXRpb24uAQAoAQEAAAABAAAAAgAAAAEB\" +\n           \"/////wAAAAAEYYIKBAAAAAEAIQAAAFJlcXVlc3RKb2JSZXNwb25zZUJ5Sm9iT3JkZXJTdGF0ZQEBZhsA\" +\n           \"LwEBZhtmGwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAYAXAC4ARIAXAACW\" +\n           \"AQAAAAEAKgEBYQEAAA0AAABKb2JPcmRlclN0YXRlAQG+CwEAAAABAAAAAAAAAAI7AQAAQ29udGFpbnMg\" +\n           \"YSBqb2Igc3RhdHVzIG9mIHRoZSBKb2JSZXNwb25zZSB0byBiZSByZXR1cm5lZC4gVGhlIGFycmF5IHNo\" +\n           \"YWxsIHByb3ZpZGUgYXQgbGVhc3Qgb25lIGVudHJ5IHJlcHJlc2VudGluZyB0aGUgdG9wIGxldmVsIHN0\" +\n           \"YXRlIGFuZCBwb3RlbnRpYWxseSBhZGRpdGlvbmFsIGVudHJpZXMgcmVwcmVzZW50aW5nIHN1YnN0YXRl\" +\n           \"cy4gVGhlIGZpcnN0IGVudHJ5IHNoYWxsIGJlIHRoZSB0b3AgbGV2ZWwgZW50cnksIGhhdmluZyB0aGUg\" +\n           \"QnJvd3NlUGF0aCBzZXQgdG8gbnVsbC4gVGhlIG9yZGVyIG9mIHRoZSBzdWJzdGF0ZXMgaXMgbm90IGRl\" +\n           \"ZmluZWQuAQAoAQEAAAABAAAAAQAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50\" +\n           \"cwEBgRcALgBEgRcAAJYCAAAAAQAqAQHwAAAADAAAAEpvYlJlc3BvbnNlcwEBxQsBAAAAAQAAAAAAAAAC\" +\n           \"ywAAAENvbnRhaW5zIGEgbGlzdCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIGEg\" +\n           \"am9iIG9yZGVyLCBzdWNoIGFzIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgam9iLCBhY3R1YWwgbWF0\" +\n           \"ZXJpYWwgY29uc3VtZWQsIGFjdHVhbCBtYXRlcmlhbCBwcm9kdWNlZCwgYWN0dWFsIGVxdWlwbWVudCB1\" +\n           \"c2VkLCBhbmQgam9iIHNwZWNpZmljIGRhdGEuAQAqAQFKAAAADAAAAFJldHVyblN0YXR1cwAJ/////wAA\" +\n           \"AAACKwAAAFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbWV0aG9kIGV4ZWN1dGlvbi4BACgBAQAAAAEA\" +\n           \"AAACAAAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public BaseDataVariableState<ISA95JobResponseDataType[]> JobOrderResponseList\n        {\n            get\n            {\n                return m_jobOrderResponseList;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_jobOrderResponseList, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_jobOrderResponseList = value;\n            }\n        }\n\n        /// <remarks />\n        public RequestJobResponseByJobOrderIDMethodState RequestJobResponseByJobOrderID\n        {\n            get\n            {\n                return m_requestJobResponseByJobOrderIDMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_requestJobResponseByJobOrderIDMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_requestJobResponseByJobOrderIDMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public RequestJobResponseByJobOrderStateMethodState RequestJobResponseByJobOrderState\n        {\n            get\n            {\n                return m_requestJobResponseByJobOrderStateMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_requestJobResponseByJobOrderStateMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_requestJobResponseByJobOrderStateMethod = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_jobOrderResponseList != null)\n            {\n                children.Add(m_jobOrderResponseList);\n            }\n\n            if (m_requestJobResponseByJobOrderIDMethod != null)\n            {\n                children.Add(m_requestJobResponseByJobOrderIDMethod);\n            }\n\n            if (m_requestJobResponseByJobOrderStateMethod != null)\n            {\n                children.Add(m_requestJobResponseByJobOrderStateMethod);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.JobOrderResponseList:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (JobOrderResponseList == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    JobOrderResponseList = new BaseDataVariableState<ISA95JobResponseDataType[]>(this);\n                                }\n                                else\n                                {\n                                    JobOrderResponseList = (BaseDataVariableState<ISA95JobResponseDataType[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = JobOrderResponseList;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.RequestJobResponseByJobOrderID:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (RequestJobResponseByJobOrderID == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    RequestJobResponseByJobOrderID = new RequestJobResponseByJobOrderIDMethodState(this);\n                                }\n                                else\n                                {\n                                    RequestJobResponseByJobOrderID = (RequestJobResponseByJobOrderIDMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = RequestJobResponseByJobOrderID;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.RequestJobResponseByJobOrderState:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (RequestJobResponseByJobOrderState == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    RequestJobResponseByJobOrderState = new RequestJobResponseByJobOrderStateMethodState(this);\n                                }\n                                else\n                                {\n                                    RequestJobResponseByJobOrderState = (RequestJobResponseByJobOrderStateMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = RequestJobResponseByJobOrderState;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private BaseDataVariableState<ISA95JobResponseDataType[]> m_jobOrderResponseList;\n        private RequestJobResponseByJobOrderIDMethodState m_requestJobResponseByJobOrderIDMethod;\n        private RequestJobResponseByJobOrderStateMethodState m_requestJobResponseByJobOrderStateMethod;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ISA95JobResponseReceiverObjectTypeState Class\n#if (!OPCUA_EXCLUDE_ISA95JobResponseReceiverObjectTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ISA95JobResponseReceiverObjectTypeState : BaseObjectState\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobResponseReceiverObjectTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobResponseReceiverObjectType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGCAAgEAAAABACoAAABJU0E5NUpvYlJlc3BvbnNlUmVjZWl2ZXJPYmplY3RUeXBlSW5zdGFuY2UBAewD\" +\n           \"AQHsA+wDAAD/////AQAAAARhggoEAAAAAQASAAAAUmVjZWl2ZUpvYlJlc3BvbnNlAQFbGwAvAQFbG1sb\" +\n           \"AAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBnBcALgBEnBcAAJYBAAAAAQAq\" +\n           \"AQHCAAAACwAAAEpvYlJlc3BvbnNlAQHFC/////8AAAAAAqIAAABDb250YWlucyBpbmZvcm1hdGlvbiBh\" +\n           \"Ym91dCB0aGUgZXhlY3V0aW9uIG9mIGEgam9iIG9yZGVyLCBzdWNoIGFzIGFjdHVhbCBtYXRlcmlhbCBj\" +\n           \"b25zdW1lZCwgYWN0dWFsIG1hdGVyaWFsIHByb2R1Y2VkLCBhY3R1YWwgZXF1aXBtZW50IHVzZWQsIGFu\" +\n           \"ZCBqb2Igc3BlY2lmaWMgZGF0YS4BACgBAQAAAAEAAAABAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAA\" +\n           \"T3V0cHV0QXJndW1lbnRzAQGdFwAuAESdFwAAlgEAAAABACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/\" +\n           \"////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEB\" +\n           \"AAAAAQAAAAEAAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public ReceiveJobResponseMethodState ReceiveJobResponse\n        {\n            get\n            {\n                return m_receiveJobResponseMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_receiveJobResponseMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_receiveJobResponseMethod = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_receiveJobResponseMethod != null)\n            {\n                children.Add(m_receiveJobResponseMethod);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.ReceiveJobResponse:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (ReceiveJobResponse == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    ReceiveJobResponse = new ReceiveJobResponseMethodState(this);\n                                }\n                                else\n                                {\n                                    ReceiveJobResponse = (ReceiveJobResponseMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = ReceiveJobResponse;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private ReceiveJobResponseMethodState m_receiveJobResponseMethod;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ISA95EndedStateMachineTypeState Class\n#if (!OPCUA_EXCLUDE_ISA95EndedStateMachineTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ISA95EndedStateMachineTypeState : FiniteStateMachineState\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95EndedStateMachineTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95EndedStateMachineType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGCAAgEAAAABACIAAABJU0E5NUVuZGVkU3RhdGVNYWNoaW5lVHlwZUluc3RhbmNlAQHtAwEB7QPtAwAA\" +\n           \"/////wEAAAAVYIkIAgAAAAAADAAAAEN1cnJlbnRTdGF0ZQEBAAAALwEAyAoAFf////8BAf////8BAAAA\" +\n           \"FWCJCAIAAAAAAAIAAABJZAEBAAAALgBEABH/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ISA95InterruptedStateMachineTypeState Class\n#if (!OPCUA_EXCLUDE_ISA95InterruptedStateMachineTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ISA95InterruptedStateMachineTypeState : FiniteStateMachineState\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95InterruptedStateMachineTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95InterruptedStateMachineType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGCAAgEAAAABACgAAABJU0E5NUludGVycnVwdGVkU3RhdGVNYWNoaW5lVHlwZUluc3RhbmNlAQHvAwEB\" +\n           \"7wPvAwAA/////wEAAAAVYIkIAgAAAAAADAAAAEN1cnJlbnRTdGF0ZQEBAAAALwEAyAoAFf////8BAf//\" +\n           \"//8BAAAAFWCJCAIAAAAAAAIAAABJZAEBAAAALgBEABH/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ISA95JobOrderReceiverObjectTypeState Class\n#if (!OPCUA_EXCLUDE_ISA95JobOrderReceiverObjectTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ISA95JobOrderReceiverObjectTypeState : FiniteStateMachineState\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobOrderReceiverObjectTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobOrderReceiverObjectType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n\n            if (Abort != null)\n            {\n                Abort.Initialize(context, Abort_InitializationString);\n            }\n\n            if (Cancel != null)\n            {\n                Cancel.Initialize(context, Cancel_InitializationString);\n            }\n\n            if (Clear != null)\n            {\n                Clear.Initialize(context, Clear_InitializationString);\n            }\n\n            if (Pause != null)\n            {\n                Pause.Initialize(context, Pause_InitializationString);\n            }\n\n            if (Resume != null)\n            {\n                Resume.Initialize(context, Resume_InitializationString);\n            }\n\n            if (RevokeStart != null)\n            {\n                RevokeStart.Initialize(context, RevokeStart_InitializationString);\n            }\n\n            if (Start != null)\n            {\n                Start.Initialize(context, Start_InitializationString);\n            }\n\n            if (Stop != null)\n            {\n                Stop.Initialize(context, Stop_InitializationString);\n            }\n\n            if (Store != null)\n            {\n                Store.Initialize(context, Store_InitializationString);\n            }\n\n            if (StoreAndStart != null)\n            {\n                StoreAndStart.Initialize(context, StoreAndStart_InitializationString);\n            }\n\n            if (Update != null)\n            {\n                Update.Initialize(context, Update_InitializationString);\n            }\n        }\n\n        #region Initialization String\n        private const string Abort_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAUAAABBYm9ydAEBYhsALwEBYhtiGwAAAQEIAAAAADUBAQG4EwA1AQEBuRMANQEBAdQT\" +\n           \"ADUBAQHVEwA1AQEB3BMANQEBAd0TADUBAQHeEwA1AQEB3xMCAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFy\" +\n           \"Z3VtZW50cwEBrxcALgBErxcAAJYCAAAAAQAqAQGzAAAACgAAAEpvYk9yZGVySUQADP////8AAAAAApYA\" +\n           \"AABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9yZGVyIHdpdGggYWxsIHBhcmFt\" +\n           \"ZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlzaWNhbCBhc3NldCByZXF1aXJl\" +\n           \"bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAHAAAAQ29tbWVudAAVAQAAAAEA\" +\n           \"AAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgbWV0\" +\n           \"aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNvbW1lbnQgaW4gc2V2ZXJhbCBs\" +\n           \"YW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQuIFRoZSBhcnJheSBtYXkgYmUg\" +\n           \"ZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAAAAEAAAACAAAAAQH/////AAAA\" +\n           \"ABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQGwFwAuAESwFwAAlgEAAAABACoBAUoAAAAMAAAA\" +\n           \"UmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBtZXRob2Qg\" +\n           \"ZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAA\";\n\n        private const string Cancel_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAYAAABDYW5jZWwBAWMbAC8BAWMbYxsAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElu\" +\n           \"cHV0QXJndW1lbnRzAQGxFwAuAESxFwAAlgIAAAABACoBAbMAAAAKAAAASm9iT3JkZXJJRAAM/////wAA\" +\n           \"AAAClgAAAENvbnRhaW5zIGluZm9ybWF0aW9uIGRlZmluaW5nIHRoZSBqb2Igb3JkZXIgd2l0aCBhbGwg\" +\n           \"cGFyYW1ldGVycyBhbmQgYW55IG1hdGVyaWFsLCBlcXVpcG1lbnQsIG9yIHBoeXNpY2FsIGFzc2V0IHJl\" +\n           \"cXVpcmVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIG9yZGVyLgEAKgEB6gAAAAcAAABDb21tZW50ABUB\" +\n           \"AAAAAQAAAAAAAAACzAAAAFRoZSBjb21tZW50IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gb2Ygd2h5IHRo\" +\n           \"ZSBtZXRob2Qgd2FzIGNhbGxlZC4gSW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgY29tbWVudCBpbiBzZXZl\" +\n           \"cmFsIGxhbmd1YWdlcywgaXQgaXMgYW4gYXJyYXkgb2YgTG9jYWxpemVkVGV4dC4gVGhlIGFycmF5IG1h\" +\n           \"eSBiZSBlbXB0eSwgd2hlbiBubyBjb21tZW50IGlzIHByb3ZpZGVkLgEAKAEBAAAAAQAAAAIAAAABAf//\" +\n           \"//8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVudHMBAbIXAC4ARLIXAACWAQAAAAEAKgEBSgAA\" +\n           \"AAwAAABSZXR1cm5TdGF0dXMACf////8AAAAAAisAAABSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIG1l\" +\n           \"dGhvZCBleGVjdXRpb24uAQAoAQEAAAABAAAAAQAAAAEB/////wAAAAA=\";\n\n        private const string Clear_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAUAAABDbGVhcgEBZBsALwEBZBtkGwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5w\" +\n           \"dXRBcmd1bWVudHMBAbMXAC4ARLMXAACWAgAAAAEAKgEBswAAAAoAAABKb2JPcmRlcklEAAz/////AAAA\" +\n           \"AAKWAAAAQ29udGFpbnMgaW5mb3JtYXRpb24gZGVmaW5pbmcgdGhlIGpvYiBvcmRlciB3aXRoIGFsbCBw\" +\n           \"YXJhbWV0ZXJzIGFuZCBhbnkgbWF0ZXJpYWwsIGVxdWlwbWVudCwgb3IgcGh5c2ljYWwgYXNzZXQgcmVx\" +\n           \"dWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JkZXIuAQAqAQHqAAAABwAAAENvbW1lbnQAFQEA\" +\n           \"AAABAAAAAAAAAALMAAAAVGhlIGNvbW1lbnQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhl\" +\n           \"IG1ldGhvZCB3YXMgY2FsbGVkLiBJbiBvcmRlciB0byBwcm92aWRlIHRoZSBjb21tZW50IGluIHNldmVy\" +\n           \"YWwgbGFuZ3VhZ2VzLCBpdCBpcyBhbiBhcnJheSBvZiBMb2NhbGl6ZWRUZXh0LiBUaGUgYXJyYXkgbWF5\" +\n           \"IGJlIGVtcHR5LCB3aGVuIG5vIGNvbW1lbnQgaXMgcHJvdmlkZWQuAQAoAQEAAAABAAAAAgAAAAEB////\" +\n           \"/wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEBtBcALgBEtBcAAJYBAAAAAQAqAQFKAAAA\" +\n           \"DAAAAFJldHVyblN0YXR1cwAJ/////wAAAAACKwAAAFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbWV0\" +\n           \"aG9kIGV4ZWN1dGlvbi4BACgBAQAAAAEAAAABAAAAAQH/////AAAAAA==\";\n\n        private const string Pause_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAUAAABQYXVzZQEBXxsALwEBXxtfGwAAAQECAAAAADUBAQG2EwA1AQEB0hMCAAAAF2Cp\" +\n           \"CgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBqRcALgBEqRcAAJYCAAAAAQAqAQGzAAAACgAAAEpvYk9y\" +\n           \"ZGVySUQADP////8AAAAAApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9y\" +\n           \"ZGVyIHdpdGggYWxsIHBhcmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlz\" +\n           \"aWNhbCBhc3NldCByZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAH\" +\n           \"AAAAQ29tbWVudAAVAQAAAAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0\" +\n           \"aW9uIG9mIHdoeSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNv\" +\n           \"bW1lbnQgaW4gc2V2ZXJhbCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQu\" +\n           \"IFRoZSBhcnJheSBtYXkgYmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAA\" +\n           \"AAEAAAACAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQGqFwAuAESqFwAA\" +\n           \"lgEAAAABACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3Rh\" +\n           \"dHVzIG9mIHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAA\";\n\n        private const string Resume_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAYAAABSZXN1bWUBAWAbAC8BAWAbYBsAAAEBAgAAAAA1AQEBuhMANQEBAdYTAgAAABdg\" +\n           \"qQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAasXAC4ARKsXAACWAgAAAAEAKgEBswAAAAoAAABKb2JP\" +\n           \"cmRlcklEAAz/////AAAAAAKWAAAAQ29udGFpbnMgaW5mb3JtYXRpb24gZGVmaW5pbmcgdGhlIGpvYiBv\" +\n           \"cmRlciB3aXRoIGFsbCBwYXJhbWV0ZXJzIGFuZCBhbnkgbWF0ZXJpYWwsIGVxdWlwbWVudCwgb3IgcGh5\" +\n           \"c2ljYWwgYXNzZXQgcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JkZXIuAQAqAQHqAAAA\" +\n           \"BwAAAENvbW1lbnQAFQEAAAABAAAAAAAAAALMAAAAVGhlIGNvbW1lbnQgcHJvdmlkZXMgYSBkZXNjcmlw\" +\n           \"dGlvbiBvZiB3aHkgdGhlIG1ldGhvZCB3YXMgY2FsbGVkLiBJbiBvcmRlciB0byBwcm92aWRlIHRoZSBj\" +\n           \"b21tZW50IGluIHNldmVyYWwgbGFuZ3VhZ2VzLCBpdCBpcyBhbiBhcnJheSBvZiBMb2NhbGl6ZWRUZXh0\" +\n           \"LiBUaGUgYXJyYXkgbWF5IGJlIGVtcHR5LCB3aGVuIG5vIGNvbW1lbnQgaXMgcHJvdmlkZWQuAQAoAQEA\" +\n           \"AAABAAAAAgAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEBrBcALgBErBcA\" +\n           \"AJYBAAAAAQAqAQFKAAAADAAAAFJldHVyblN0YXR1cwAJ/////wAAAAACKwAAAFJldHVybnMgdGhlIHN0\" +\n           \"YXR1cyBvZiB0aGUgbWV0aG9kIGV4ZWN1dGlvbi4BACgBAQAAAAEAAAABAAAAAQH/////AAAAAA==\";\n\n        private const string RevokeStart_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAsAAABSZXZva2VTdGFydAEBZRsALwEBZRtlGwAAAQECAAAAADUBAQGzEwA1AQEBzxMC\" +\n           \"AAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBtRcALgBEtRcAAJYCAAAAAQAqAQGzAAAACgAA\" +\n           \"AEpvYk9yZGVySUQADP////8AAAAAApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUg\" +\n           \"am9iIG9yZGVyIHdpdGggYWxsIHBhcmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBv\" +\n           \"ciBwaHlzaWNhbCBhc3NldCByZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoB\" +\n           \"AeoAAAAHAAAAQ29tbWVudAAVAQAAAAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRl\" +\n           \"c2NyaXB0aW9uIG9mIHdoeSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUg\" +\n           \"dGhlIGNvbW1lbnQgaW4gc2V2ZXJhbCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXpl\" +\n           \"ZFRleHQuIFRoZSBhcnJheSBtYXkgYmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4B\" +\n           \"ACgBAQAAAAEAAAACAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQG2FwAu\" +\n           \"AES2FwAAlgEAAAABACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0\" +\n           \"aGUgc3RhdHVzIG9mIHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAA\";\n\n        private const string Start_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAUAAABTdGFydAEBXRsALwEBXRtdGwAAAQECAAAAADUBAQGyEwA1AQEBzhMCAAAAF2Cp\" +\n           \"CgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBpRcALgBEpRcAAJYCAAAAAQAqAQGzAAAACgAAAEpvYk9y\" +\n           \"ZGVySUQADP////8AAAAAApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9y\" +\n           \"ZGVyIHdpdGggYWxsIHBhcmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlz\" +\n           \"aWNhbCBhc3NldCByZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAH\" +\n           \"AAAAQ29tbWVudAAVAQAAAAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0\" +\n           \"aW9uIG9mIHdoeSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNv\" +\n           \"bW1lbnQgaW4gc2V2ZXJhbCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQu\" +\n           \"IFRoZSBhcnJheSBtYXkgYmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAA\" +\n           \"AAEAAAACAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQGmFwAuAESmFwAA\" +\n           \"lgEAAAABACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3Rh\" +\n           \"dHVzIG9mIHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAA\";\n\n        private const string Stop_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAQAAABTdG9wAQFeGwAvAQFeG14bAAABAQQAAAAANQEBAbsTADUBAQG3EwA1AQEB0xMA\" +\n           \"NQEBAdcTAgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAacXAC4ARKcXAACWAgAAAAEAKgEB\" +\n           \"swAAAAoAAABKb2JPcmRlcklEAAz/////AAAAAAKWAAAAQ29udGFpbnMgaW5mb3JtYXRpb24gZGVmaW5p\" +\n           \"bmcgdGhlIGpvYiBvcmRlciB3aXRoIGFsbCBwYXJhbWV0ZXJzIGFuZCBhbnkgbWF0ZXJpYWwsIGVxdWlw\" +\n           \"bWVudCwgb3IgcGh5c2ljYWwgYXNzZXQgcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3Jk\" +\n           \"ZXIuAQAqAQHqAAAABwAAAENvbW1lbnQAFQEAAAABAAAAAAAAAALMAAAAVGhlIGNvbW1lbnQgcHJvdmlk\" +\n           \"ZXMgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIG1ldGhvZCB3YXMgY2FsbGVkLiBJbiBvcmRlciB0byBw\" +\n           \"cm92aWRlIHRoZSBjb21tZW50IGluIHNldmVyYWwgbGFuZ3VhZ2VzLCBpdCBpcyBhbiBhcnJheSBvZiBM\" +\n           \"b2NhbGl6ZWRUZXh0LiBUaGUgYXJyYXkgbWF5IGJlIGVtcHR5LCB3aGVuIG5vIGNvbW1lbnQgaXMgcHJv\" +\n           \"dmlkZWQuAQAoAQEAAAABAAAAAgAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50\" +\n           \"cwEBqBcALgBEqBcAAJYBAAAAAQAqAQFKAAAADAAAAFJldHVyblN0YXR1cwAJ/////wAAAAACKwAAAFJl\" +\n           \"dHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbWV0aG9kIGV4ZWN1dGlvbi4BACgBAQAAAAEAAAABAAAAAQH/\" +\n           \"////AAAAAA==\";\n\n        private const string Store_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAUAAABTdG9yZQEBWRsALwEBWRtZGwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5w\" +\n           \"dXRBcmd1bWVudHMBAZgXAC4ARJgXAACWAgAAAAEAKgEBswAAAAgAAABKb2JPcmRlcgEBwAv/////AAAA\" +\n           \"AAKWAAAAQ29udGFpbnMgaW5mb3JtYXRpb24gZGVmaW5pbmcgdGhlIGpvYiBvcmRlciB3aXRoIGFsbCBw\" +\n           \"YXJhbWV0ZXJzIGFuZCBhbnkgbWF0ZXJpYWwsIGVxdWlwbWVudCwgb3IgcGh5c2ljYWwgYXNzZXQgcmVx\" +\n           \"dWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JkZXIuAQAqAQHqAAAABwAAAENvbW1lbnQAFQEA\" +\n           \"AAABAAAAAAAAAALMAAAAVGhlIGNvbW1lbnQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhl\" +\n           \"IG1ldGhvZCB3YXMgY2FsbGVkLiBJbiBvcmRlciB0byBwcm92aWRlIHRoZSBjb21tZW50IGluIHNldmVy\" +\n           \"YWwgbGFuZ3VhZ2VzLCBpdCBpcyBhbiBhcnJheSBvZiBMb2NhbGl6ZWRUZXh0LiBUaGUgYXJyYXkgbWF5\" +\n           \"IGJlIGVtcHR5LCB3aGVuIG5vIGNvbW1lbnQgaXMgcHJvdmlkZWQuAQAoAQEAAAABAAAAAgAAAAEB////\" +\n           \"/wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEBmRcALgBEmRcAAJYBAAAAAQAqAQFKAAAA\" +\n           \"DAAAAFJldHVyblN0YXR1cwAJ/////wAAAAACKwAAAFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbWV0\" +\n           \"aG9kIGV4ZWN1dGlvbi4BACgBAQAAAAEAAAABAAAAAQH/////AAAAAA==\";\n\n        private const string StoreAndStart_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAA0AAABTdG9yZUFuZFN0YXJ0AQFcGwAvAQFcG1wbAAABAf////8CAAAAF2CpCgIAAAAA\" +\n           \"AA4AAABJbnB1dEFyZ3VtZW50cwEBoxcALgBEoxcAAJYCAAAAAQAqAQGzAAAACAAAAEpvYk9yZGVyAQHA\" +\n           \"C/////8AAAAAApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9yZGVyIHdp\" +\n           \"dGggYWxsIHBhcmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlzaWNhbCBh\" +\n           \"c3NldCByZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAHAAAAQ29t\" +\n           \"bWVudAAVAQAAAAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9m\" +\n           \"IHdoeSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNvbW1lbnQg\" +\n           \"aW4gc2V2ZXJhbCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQuIFRoZSBh\" +\n           \"cnJheSBtYXkgYmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAAAAEAAAAC\" +\n           \"AAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQGkFwAuAESkFwAAlgEAAAAB\" +\n           \"ACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3RhdHVzIG9m\" +\n           \"IHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAA\";\n\n        private const string Update_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCCgQAAAABAAYAAABVcGRhdGUBAWEbAC8BAWEbYRsAAAEBBAAAAAA1AQEBtBMANQEBAbETADUBAQHN\" +\n           \"EwA1AQEB0BMCAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBrRcALgBErRcAAJYCAAAAAQAq\" +\n           \"AQGzAAAACAAAAEpvYk9yZGVyAQHAC/////8AAAAAApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZp\" +\n           \"bmluZyB0aGUgam9iIG9yZGVyIHdpdGggYWxsIHBhcmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1\" +\n           \"aXBtZW50LCBvciBwaHlzaWNhbCBhc3NldCByZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBv\" +\n           \"cmRlci4BACoBAeoAAAAHAAAAQ29tbWVudAAVAQAAAAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92\" +\n           \"aWRlcyBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRv\" +\n           \"IHByb3ZpZGUgdGhlIGNvbW1lbnQgaW4gc2V2ZXJhbCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9m\" +\n           \"IExvY2FsaXplZFRleHQuIFRoZSBhcnJheSBtYXkgYmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBw\" +\n           \"cm92aWRlZC4BACgBAQAAAAEAAAACAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1l\" +\n           \"bnRzAQGuFwAuAESuFwAAlgEAAAABACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAA\" +\n           \"UmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAAB\" +\n           \"Af////8AAAAA\";\n\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGCAAgEAAAABACcAAABJU0E5NUpvYk9yZGVyUmVjZWl2ZXJPYmplY3RUeXBlSW5zdGFuY2UBAeoDAQHq\" +\n           \"A+oDAAD/////FAAAABVgiQgCAAAAAAAMAAAAQ3VycmVudFN0YXRlAQEAAAAvAQDICgAV/////wEB////\" +\n           \"/wEAAAAVYIkIAgAAAAAAAgAAAElkAQEAAAAuAEQAEf////8BAf////8AAAAABGGCCgQAAAABAAUAAABB\" +\n           \"Ym9ydAEBYhsALwEBYhtiGwAAAQEIAAAAADUBAQG4EwA1AQEBuRMANQEBAdQTADUBAQHVEwA1AQEB3BMA\" +\n           \"NQEBAd0TADUBAQHeEwA1AQEB3xMCAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBrxcALgBE\" +\n           \"rxcAAJYCAAAAAQAqAQGzAAAACgAAAEpvYk9yZGVySUQADP////8AAAAAApYAAABDb250YWlucyBpbmZv\" +\n           \"cm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9yZGVyIHdpdGggYWxsIHBhcmFtZXRlcnMgYW5kIGFueSBt\" +\n           \"YXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlzaWNhbCBhc3NldCByZXF1aXJlbWVudHMgYXNzb2NpYXRl\" +\n           \"ZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAHAAAAQ29tbWVudAAVAQAAAAEAAAAAAAAAAswAAABUaGUg\" +\n           \"Y29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQu\" +\n           \"IEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNvbW1lbnQgaW4gc2V2ZXJhbCBsYW5ndWFnZXMsIGl0IGlz\" +\n           \"IGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQuIFRoZSBhcnJheSBtYXkgYmUgZW1wdHksIHdoZW4gbm8g\" +\n           \"Y29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAAAAEAAAACAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAA\" +\n           \"T3V0cHV0QXJndW1lbnRzAQGwFwAuAESwFwAAlgEAAAABACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/\" +\n           \"////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEB\" +\n           \"AAAAAQAAAAEAAAABAf////8AAAAABGGCCgQAAAABAAYAAABDYW5jZWwBAWMbAC8BAWMbYxsAAAEB////\" +\n           \"/wIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQGxFwAuAESxFwAAlgIAAAABACoBAbMAAAAK\" +\n           \"AAAASm9iT3JkZXJJRAAM/////wAAAAAClgAAAENvbnRhaW5zIGluZm9ybWF0aW9uIGRlZmluaW5nIHRo\" +\n           \"ZSBqb2Igb3JkZXIgd2l0aCBhbGwgcGFyYW1ldGVycyBhbmQgYW55IG1hdGVyaWFsLCBlcXVpcG1lbnQs\" +\n           \"IG9yIHBoeXNpY2FsIGFzc2V0IHJlcXVpcmVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIG9yZGVyLgEA\" +\n           \"KgEB6gAAAAcAAABDb21tZW50ABUBAAAAAQAAAAAAAAACzAAAAFRoZSBjb21tZW50IHByb3ZpZGVzIGEg\" +\n           \"ZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSBtZXRob2Qgd2FzIGNhbGxlZC4gSW4gb3JkZXIgdG8gcHJvdmlk\" +\n           \"ZSB0aGUgY29tbWVudCBpbiBzZXZlcmFsIGxhbmd1YWdlcywgaXQgaXMgYW4gYXJyYXkgb2YgTG9jYWxp\" +\n           \"emVkVGV4dC4gVGhlIGFycmF5IG1heSBiZSBlbXB0eSwgd2hlbiBubyBjb21tZW50IGlzIHByb3ZpZGVk\" +\n           \"LgEAKAEBAAAAAQAAAAIAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVudHMBAbIX\" +\n           \"AC4ARLIXAACWAQAAAAEAKgEBSgAAAAwAAABSZXR1cm5TdGF0dXMACf////8AAAAAAisAAABSZXR1cm5z\" +\n           \"IHRoZSBzdGF0dXMgb2YgdGhlIG1ldGhvZCBleGVjdXRpb24uAQAoAQEAAAABAAAAAQAAAAEB/////wAA\" +\n           \"AAAEYYIKBAAAAAEABQAAAENsZWFyAQFkGwAvAQFkG2QbAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJ\" +\n           \"bnB1dEFyZ3VtZW50cwEBsxcALgBEsxcAAJYCAAAAAQAqAQGzAAAACgAAAEpvYk9yZGVySUQADP////8A\" +\n           \"AAAAApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9yZGVyIHdpdGggYWxs\" +\n           \"IHBhcmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlzaWNhbCBhc3NldCBy\" +\n           \"ZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAHAAAAQ29tbWVudAAV\" +\n           \"AQAAAAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0\" +\n           \"aGUgbWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNvbW1lbnQgaW4gc2V2\" +\n           \"ZXJhbCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQuIFRoZSBhcnJheSBt\" +\n           \"YXkgYmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAAAAEAAAACAAAAAQH/\" +\n           \"////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQG0FwAuAES0FwAAlgEAAAABACoBAUoA\" +\n           \"AAAMAAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBt\" +\n           \"ZXRob2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAAN2CJCgIAAAABAAsAAABFcXVp\" +\n           \"cG1lbnRJRAEBlRcDAAAAAGYAAABEZWZpbmVzIGEgcmVhZC1vbmx5IHNldCBvZiBFcXVpcG1lbnQgQ2xh\" +\n           \"c3MgSURzIGFuZCBFcXVpcG1lbnQgSURzIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBpbiBhIGpvYiBvcmRl\" +\n           \"ci4ALwA/lRcAAAAMAQAAAAEAAAAAAAAAAQH/////AAAAADdgiQoCAAAAAQAMAAAASm9iT3JkZXJMaXN0\" +\n           \"AQGRFwMAAAAATAAAAERlZmluZXMgYSByZWFkLW9ubHkgbGlzdCBvZiBqb2Igb3JkZXIgaW5mb3JtYXRp\" +\n           \"b24gYXZhaWxhYmxlIGZyb20gdGhlIHNlcnZlci4ALwA/kRcAAAEBxwsBAAAAAQAAAAAAAAABAf////8A\" +\n           \"AAAAN2CJCgIAAAABAA8AAABNYXRlcmlhbENsYXNzSUQBAZMXAwAAAABVAAAARGVmaW5lcyBhIHJlYWQt\" +\n           \"b25seSBzZXQgb2YgTWF0ZXJpYWwgQ2xhc3NlcyBJRHMgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGluIGEg\" +\n           \"am9iIG9yZGVyLgAvAD+TFwAAAAwBAAAAAQAAAAAAAAABAf////8AAAAAN2CJCgIAAAABABQAAABNYXRl\" +\n           \"cmlhbERlZmluaXRpb25JRAEBlBcDAAAAAFUAAABEZWZpbmVzIGEgcmVhZC1vbmx5IHNldCBvZiBNYXRl\" +\n           \"cmlhbCBDbGFzc2VzIElEcyB0aGF0IG1heSBiZSBzcGVjaWZpZWQgaW4gYSBqb2Igb3JkZXIuAC8AP5QX\" +\n           \"AAAADAEAAAABAAAAAAAAAAEB/////wAAAAAVYIkKAgAAAAEAGAAAAE1heERvd25sb2FkYWJsZUpvYk9y\" +\n           \"ZGVycwEByBcALgBEyBcAAAAF/////wEB/////wAAAAAEYYIKBAAAAAEABQAAAFBhdXNlAQFfGwAvAQFf\" +\n           \"G18bAAABAQIAAAAANQEBAbYTADUBAQHSEwIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQGp\" +\n           \"FwAuAESpFwAAlgIAAAABACoBAbMAAAAKAAAASm9iT3JkZXJJRAAM/////wAAAAAClgAAAENvbnRhaW5z\" +\n           \"IGluZm9ybWF0aW9uIGRlZmluaW5nIHRoZSBqb2Igb3JkZXIgd2l0aCBhbGwgcGFyYW1ldGVycyBhbmQg\" +\n           \"YW55IG1hdGVyaWFsLCBlcXVpcG1lbnQsIG9yIHBoeXNpY2FsIGFzc2V0IHJlcXVpcmVtZW50cyBhc3Nv\" +\n           \"Y2lhdGVkIHdpdGggdGhlIG9yZGVyLgEAKgEB6gAAAAcAAABDb21tZW50ABUBAAAAAQAAAAAAAAACzAAA\" +\n           \"AFRoZSBjb21tZW50IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSBtZXRob2Qgd2FzIGNh\" +\n           \"bGxlZC4gSW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgY29tbWVudCBpbiBzZXZlcmFsIGxhbmd1YWdlcywg\" +\n           \"aXQgaXMgYW4gYXJyYXkgb2YgTG9jYWxpemVkVGV4dC4gVGhlIGFycmF5IG1heSBiZSBlbXB0eSwgd2hl\" +\n           \"biBubyBjb21tZW50IGlzIHByb3ZpZGVkLgEAKAEBAAAAAQAAAAIAAAABAf////8AAAAAF2CpCgIAAAAA\" +\n           \"AA8AAABPdXRwdXRBcmd1bWVudHMBAaoXAC4ARKoXAACWAQAAAAEAKgEBSgAAAAwAAABSZXR1cm5TdGF0\" +\n           \"dXMACf////8AAAAAAisAAABSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIG1ldGhvZCBleGVjdXRpb24u\" +\n           \"AQAoAQEAAAABAAAAAQAAAAEB/////wAAAAA3YIkKAgAAAAEACwAAAFBlcnNvbm5lbElEAQGXFwMAAAAA\" +\n           \"XQAAAERlZmluZXMgYSByZWFkLW9ubHkgc2V0IG9mIFBlcnNvbm5lbCBJRHMgYW5kIFBlcnNvbiBJRHMg\" +\n           \"dGhhdCBtYXkgYmUgc3BlY2lmaWVkIGluIGEgam9iIG9yZGVyLgAvAD+XFwAAAAwBAAAAAQAAAAAAAAAB\" +\n           \"Af////8AAAAAN2CJCgIAAAABAA8AAABQaHlzaWNhbEFzc2V0SUQBAZYXAwAAAABwAAAARGVmaW5lcyBh\" +\n           \"IHJlYWQtb25seSBzZXQgb2YgUGh5c2ljYWwgQXNzZXQgQ2xhc3MgSURzIGFuZCBQaHlzaWNhbCBBc3Nl\" +\n           \"dCBJRHMgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGluIGEgam9iIG9yZGVyLgAvAD+WFwAAAAwBAAAAAQAA\" +\n           \"AAAAAAABAf////8AAAAABGGCCgQAAAABAAYAAABSZXN1bWUBAWAbAC8BAWAbYBsAAAEBAgAAAAA1AQEB\" +\n           \"uhMANQEBAdYTAgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAasXAC4ARKsXAACWAgAAAAEA\" +\n           \"KgEBswAAAAoAAABKb2JPcmRlcklEAAz/////AAAAAAKWAAAAQ29udGFpbnMgaW5mb3JtYXRpb24gZGVm\" +\n           \"aW5pbmcgdGhlIGpvYiBvcmRlciB3aXRoIGFsbCBwYXJhbWV0ZXJzIGFuZCBhbnkgbWF0ZXJpYWwsIGVx\" +\n           \"dWlwbWVudCwgb3IgcGh5c2ljYWwgYXNzZXQgcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUg\" +\n           \"b3JkZXIuAQAqAQHqAAAABwAAAENvbW1lbnQAFQEAAAABAAAAAAAAAALMAAAAVGhlIGNvbW1lbnQgcHJv\" +\n           \"dmlkZXMgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIG1ldGhvZCB3YXMgY2FsbGVkLiBJbiBvcmRlciB0\" +\n           \"byBwcm92aWRlIHRoZSBjb21tZW50IGluIHNldmVyYWwgbGFuZ3VhZ2VzLCBpdCBpcyBhbiBhcnJheSBv\" +\n           \"ZiBMb2NhbGl6ZWRUZXh0LiBUaGUgYXJyYXkgbWF5IGJlIGVtcHR5LCB3aGVuIG5vIGNvbW1lbnQgaXMg\" +\n           \"cHJvdmlkZWQuAQAoAQEAAAABAAAAAgAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3Vt\" +\n           \"ZW50cwEBrBcALgBErBcAAJYBAAAAAQAqAQFKAAAADAAAAFJldHVyblN0YXR1cwAJ/////wAAAAACKwAA\" +\n           \"AFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbWV0aG9kIGV4ZWN1dGlvbi4BACgBAQAAAAEAAAABAAAA\" +\n           \"AQH/////AAAAAARhggoEAAAAAQALAAAAUmV2b2tlU3RhcnQBAWUbAC8BAWUbZRsAAAEBAgAAAAA1AQEB\" +\n           \"sxMANQEBAc8TAgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAbUXAC4ARLUXAACWAgAAAAEA\" +\n           \"KgEBswAAAAoAAABKb2JPcmRlcklEAAz/////AAAAAAKWAAAAQ29udGFpbnMgaW5mb3JtYXRpb24gZGVm\" +\n           \"aW5pbmcgdGhlIGpvYiBvcmRlciB3aXRoIGFsbCBwYXJhbWV0ZXJzIGFuZCBhbnkgbWF0ZXJpYWwsIGVx\" +\n           \"dWlwbWVudCwgb3IgcGh5c2ljYWwgYXNzZXQgcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUg\" +\n           \"b3JkZXIuAQAqAQHqAAAABwAAAENvbW1lbnQAFQEAAAABAAAAAAAAAALMAAAAVGhlIGNvbW1lbnQgcHJv\" +\n           \"dmlkZXMgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIG1ldGhvZCB3YXMgY2FsbGVkLiBJbiBvcmRlciB0\" +\n           \"byBwcm92aWRlIHRoZSBjb21tZW50IGluIHNldmVyYWwgbGFuZ3VhZ2VzLCBpdCBpcyBhbiBhcnJheSBv\" +\n           \"ZiBMb2NhbGl6ZWRUZXh0LiBUaGUgYXJyYXkgbWF5IGJlIGVtcHR5LCB3aGVuIG5vIGNvbW1lbnQgaXMg\" +\n           \"cHJvdmlkZWQuAQAoAQEAAAABAAAAAgAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3Vt\" +\n           \"ZW50cwEBthcALgBEthcAAJYBAAAAAQAqAQFKAAAADAAAAFJldHVyblN0YXR1cwAJ/////wAAAAACKwAA\" +\n           \"AFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbWV0aG9kIGV4ZWN1dGlvbi4BACgBAQAAAAEAAAABAAAA\" +\n           \"AQH/////AAAAAARhggoEAAAAAQAFAAAAU3RhcnQBAV0bAC8BAV0bXRsAAAEBAgAAAAA1AQEBshMANQEB\" +\n           \"Ac4TAgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAaUXAC4ARKUXAACWAgAAAAEAKgEBswAA\" +\n           \"AAoAAABKb2JPcmRlcklEAAz/////AAAAAAKWAAAAQ29udGFpbnMgaW5mb3JtYXRpb24gZGVmaW5pbmcg\" +\n           \"dGhlIGpvYiBvcmRlciB3aXRoIGFsbCBwYXJhbWV0ZXJzIGFuZCBhbnkgbWF0ZXJpYWwsIGVxdWlwbWVu\" +\n           \"dCwgb3IgcGh5c2ljYWwgYXNzZXQgcmVxdWlyZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JkZXIu\" +\n           \"AQAqAQHqAAAABwAAAENvbW1lbnQAFQEAAAABAAAAAAAAAALMAAAAVGhlIGNvbW1lbnQgcHJvdmlkZXMg\" +\n           \"YSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIG1ldGhvZCB3YXMgY2FsbGVkLiBJbiBvcmRlciB0byBwcm92\" +\n           \"aWRlIHRoZSBjb21tZW50IGluIHNldmVyYWwgbGFuZ3VhZ2VzLCBpdCBpcyBhbiBhcnJheSBvZiBMb2Nh\" +\n           \"bGl6ZWRUZXh0LiBUaGUgYXJyYXkgbWF5IGJlIGVtcHR5LCB3aGVuIG5vIGNvbW1lbnQgaXMgcHJvdmlk\" +\n           \"ZWQuAQAoAQEAAAABAAAAAgAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEB\" +\n           \"phcALgBEphcAAJYBAAAAAQAqAQFKAAAADAAAAFJldHVyblN0YXR1cwAJ/////wAAAAACKwAAAFJldHVy\" +\n           \"bnMgdGhlIHN0YXR1cyBvZiB0aGUgbWV0aG9kIGV4ZWN1dGlvbi4BACgBAQAAAAEAAAABAAAAAQH/////\" +\n           \"AAAAAARhggoEAAAAAQAEAAAAU3RvcAEBXhsALwEBXhteGwAAAQEEAAAAADUBAQG7EwA1AQEBtxMANQEB\" +\n           \"AdMTADUBAQHXEwIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQGnFwAuAESnFwAAlgIAAAAB\" +\n           \"ACoBAbMAAAAKAAAASm9iT3JkZXJJRAAM/////wAAAAAClgAAAENvbnRhaW5zIGluZm9ybWF0aW9uIGRl\" +\n           \"ZmluaW5nIHRoZSBqb2Igb3JkZXIgd2l0aCBhbGwgcGFyYW1ldGVycyBhbmQgYW55IG1hdGVyaWFsLCBl\" +\n           \"cXVpcG1lbnQsIG9yIHBoeXNpY2FsIGFzc2V0IHJlcXVpcmVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhl\" +\n           \"IG9yZGVyLgEAKgEB6gAAAAcAAABDb21tZW50ABUBAAAAAQAAAAAAAAACzAAAAFRoZSBjb21tZW50IHBy\" +\n           \"b3ZpZGVzIGEgZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSBtZXRob2Qgd2FzIGNhbGxlZC4gSW4gb3JkZXIg\" +\n           \"dG8gcHJvdmlkZSB0aGUgY29tbWVudCBpbiBzZXZlcmFsIGxhbmd1YWdlcywgaXQgaXMgYW4gYXJyYXkg\" +\n           \"b2YgTG9jYWxpemVkVGV4dC4gVGhlIGFycmF5IG1heSBiZSBlbXB0eSwgd2hlbiBubyBjb21tZW50IGlz\" +\n           \"IHByb3ZpZGVkLgEAKAEBAAAAAQAAAAIAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1\" +\n           \"bWVudHMBAagXAC4ARKgXAACWAQAAAAEAKgEBSgAAAAwAAABSZXR1cm5TdGF0dXMACf////8AAAAAAisA\" +\n           \"AABSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIG1ldGhvZCBleGVjdXRpb24uAQAoAQEAAAABAAAAAQAA\" +\n           \"AAEB/////wAAAAAEYYIKBAAAAAEABQAAAFN0b3JlAQFZGwAvAQFZG1kbAAABAf////8CAAAAF2CpCgIA\" +\n           \"AAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBmBcALgBEmBcAAJYCAAAAAQAqAQGzAAAACAAAAEpvYk9yZGVy\" +\n           \"AQHAC/////8AAAAAApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9yZGVy\" +\n           \"IHdpdGggYWxsIHBhcmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlzaWNh\" +\n           \"bCBhc3NldCByZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAHAAAA\" +\n           \"Q29tbWVudAAVAQAAAAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0aW9u\" +\n           \"IG9mIHdoeSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNvbW1l\" +\n           \"bnQgaW4gc2V2ZXJhbCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQuIFRo\" +\n           \"ZSBhcnJheSBtYXkgYmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAAAAEA\" +\n           \"AAACAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQGZFwAuAESZFwAAlgEA\" +\n           \"AAABACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3RhdHVz\" +\n           \"IG9mIHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAABGGCCgQAAAAB\" +\n           \"AA0AAABTdG9yZUFuZFN0YXJ0AQFcGwAvAQFcG1wbAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1\" +\n           \"dEFyZ3VtZW50cwEBoxcALgBEoxcAAJYCAAAAAQAqAQGzAAAACAAAAEpvYk9yZGVyAQHAC/////8AAAAA\" +\n           \"ApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9yZGVyIHdpdGggYWxsIHBh\" +\n           \"cmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlzaWNhbCBhc3NldCByZXF1\" +\n           \"aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAHAAAAQ29tbWVudAAVAQAA\" +\n           \"AAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUg\" +\n           \"bWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNvbW1lbnQgaW4gc2V2ZXJh\" +\n           \"bCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQuIFRoZSBhcnJheSBtYXkg\" +\n           \"YmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAAAAEAAAACAAAAAQH/////\" +\n           \"AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQGkFwAuAESkFwAAlgEAAAABACoBAUoAAAAM\" +\n           \"AAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBtZXRo\" +\n           \"b2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAABGGCCgQAAAABAAYAAABVcGRhdGUB\" +\n           \"AWEbAC8BAWEbYRsAAAEBBAAAAAA1AQEBtBMANQEBAbETADUBAQHNEwA1AQEB0BMCAAAAF2CpCgIAAAAA\" +\n           \"AA4AAABJbnB1dEFyZ3VtZW50cwEBrRcALgBErRcAAJYCAAAAAQAqAQGzAAAACAAAAEpvYk9yZGVyAQHA\" +\n           \"C/////8AAAAAApYAAABDb250YWlucyBpbmZvcm1hdGlvbiBkZWZpbmluZyB0aGUgam9iIG9yZGVyIHdp\" +\n           \"dGggYWxsIHBhcmFtZXRlcnMgYW5kIGFueSBtYXRlcmlhbCwgZXF1aXBtZW50LCBvciBwaHlzaWNhbCBh\" +\n           \"c3NldCByZXF1aXJlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmRlci4BACoBAeoAAAAHAAAAQ29t\" +\n           \"bWVudAAVAQAAAAEAAAAAAAAAAswAAABUaGUgY29tbWVudCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9m\" +\n           \"IHdoeSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQuIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGNvbW1lbnQg\" +\n           \"aW4gc2V2ZXJhbCBsYW5ndWFnZXMsIGl0IGlzIGFuIGFycmF5IG9mIExvY2FsaXplZFRleHQuIFRoZSBh\" +\n           \"cnJheSBtYXkgYmUgZW1wdHksIHdoZW4gbm8gY29tbWVudCBpcyBwcm92aWRlZC4BACgBAQAAAAEAAAAC\" +\n           \"AAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQGuFwAuAESuFwAAlgEAAAAB\" +\n           \"ACoBAUoAAAAMAAAAUmV0dXJuU3RhdHVzAAn/////AAAAAAIrAAAAUmV0dXJucyB0aGUgc3RhdHVzIG9m\" +\n           \"IHRoZSBtZXRob2QgZXhlY3V0aW9uLgEAKAEBAAAAAQAAAAEAAAABAf////8AAAAAN2CJCgIAAAABAAoA\" +\n           \"AABXb3JrTWFzdGVyAQGSFwMAAAAApgAAAERlZmluZXMgYSByZWFkLW9ubHkgc2V0IG9mIHdvcmsgbWFz\" +\n           \"dGVyIElEcyB0aGF0IG1heSBiZSBzcGVjaWZpZWQgaW4gYSBqb2Igb3JkZXIsIGFuZCB0aGUgcmVhZC1v\" +\n           \"bmx5IHNldCBvZiBwYXJhbWV0ZXJzIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBmb3IgYSBzcGVjaWZpYyB3\" +\n           \"b3JrIG1hc3Rlci4ALwA/khcAAAEBvwsBAAAAAQAAAAAAAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public AbortMethodState Abort\n        {\n            get\n            {\n                return m_abortMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_abortMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_abortMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public CancelMethodState Cancel\n        {\n            get\n            {\n                return m_cancelMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_cancelMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_cancelMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public ClearMethodState Clear\n        {\n            get\n            {\n                return m_clearMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_clearMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_clearMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string[]> EquipmentID\n        {\n            get\n            {\n                return m_equipmentID;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_equipmentID, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_equipmentID = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ISA95JobOrderAndStateDataType[]> JobOrderList\n        {\n            get\n            {\n                return m_jobOrderList;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_jobOrderList, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_jobOrderList = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string[]> MaterialClassID\n        {\n            get\n            {\n                return m_materialClassID;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_materialClassID, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_materialClassID = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string[]> MaterialDefinitionID\n        {\n            get\n            {\n                return m_materialDefinitionID;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_materialDefinitionID, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_materialDefinitionID = value;\n            }\n        }\n\n        /// <remarks />\n        public PropertyState<ushort> MaxDownloadableJobOrders\n        {\n            get\n            {\n                return m_maxDownloadableJobOrders;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_maxDownloadableJobOrders, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_maxDownloadableJobOrders = value;\n            }\n        }\n\n        /// <remarks />\n        public PauseMethodState Pause\n        {\n            get\n            {\n                return m_pauseMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_pauseMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_pauseMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string[]> PersonnelID\n        {\n            get\n            {\n                return m_personnelID;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_personnelID, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_personnelID = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string[]> PhysicalAssetID\n        {\n            get\n            {\n                return m_physicalAssetID;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_physicalAssetID, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_physicalAssetID = value;\n            }\n        }\n\n        /// <remarks />\n        public ResumeMethodState Resume\n        {\n            get\n            {\n                return m_resumeMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_resumeMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_resumeMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public RevokeStartMethodState RevokeStart\n        {\n            get\n            {\n                return m_revokeStartMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_revokeStartMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_revokeStartMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public StartMethodState Start\n        {\n            get\n            {\n                return m_startMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_startMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_startMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public StopMethodState Stop\n        {\n            get\n            {\n                return m_stopMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_stopMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_stopMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public StoreMethodState Store\n        {\n            get\n            {\n                return m_storeMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_storeMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_storeMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public StoreAndStartMethodState StoreAndStart\n        {\n            get\n            {\n                return m_storeAndStartMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_storeAndStartMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_storeAndStartMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public new UpdateMethodState Update\n        {\n            get\n            {\n                return m_updateMethod;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_updateMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_updateMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ISA95WorkMasterDataType[]> WorkMaster\n        {\n            get\n            {\n                return m_workMaster;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_workMaster, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_workMaster = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_abortMethod != null)\n            {\n                children.Add(m_abortMethod);\n            }\n\n            if (m_cancelMethod != null)\n            {\n                children.Add(m_cancelMethod);\n            }\n\n            if (m_clearMethod != null)\n            {\n                children.Add(m_clearMethod);\n            }\n\n            if (m_equipmentID != null)\n            {\n                children.Add(m_equipmentID);\n            }\n\n            if (m_jobOrderList != null)\n            {\n                children.Add(m_jobOrderList);\n            }\n\n            if (m_materialClassID != null)\n            {\n                children.Add(m_materialClassID);\n            }\n\n            if (m_materialDefinitionID != null)\n            {\n                children.Add(m_materialDefinitionID);\n            }\n\n            if (m_maxDownloadableJobOrders != null)\n            {\n                children.Add(m_maxDownloadableJobOrders);\n            }\n\n            if (m_pauseMethod != null)\n            {\n                children.Add(m_pauseMethod);\n            }\n\n            if (m_personnelID != null)\n            {\n                children.Add(m_personnelID);\n            }\n\n            if (m_physicalAssetID != null)\n            {\n                children.Add(m_physicalAssetID);\n            }\n\n            if (m_resumeMethod != null)\n            {\n                children.Add(m_resumeMethod);\n            }\n\n            if (m_revokeStartMethod != null)\n            {\n                children.Add(m_revokeStartMethod);\n            }\n\n            if (m_startMethod != null)\n            {\n                children.Add(m_startMethod);\n            }\n\n            if (m_stopMethod != null)\n            {\n                children.Add(m_stopMethod);\n            }\n\n            if (m_storeMethod != null)\n            {\n                children.Add(m_storeMethod);\n            }\n\n            if (m_storeAndStartMethod != null)\n            {\n                children.Add(m_storeAndStartMethod);\n            }\n\n            if (m_updateMethod != null)\n            {\n                children.Add(m_updateMethod);\n            }\n\n            if (m_workMaster != null)\n            {\n                children.Add(m_workMaster);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Abort:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Abort == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Abort = new AbortMethodState(this);\n                                }\n                                else\n                                {\n                                    Abort = (AbortMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Abort;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Cancel:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Cancel == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Cancel = new CancelMethodState(this);\n                                }\n                                else\n                                {\n                                    Cancel = (CancelMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Cancel;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Clear:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Clear == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Clear = new ClearMethodState(this);\n                                }\n                                else\n                                {\n                                    Clear = (ClearMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Clear;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.EquipmentID:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (EquipmentID == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    EquipmentID = new BaseDataVariableState<string[]>(this);\n                                }\n                                else\n                                {\n                                    EquipmentID = (BaseDataVariableState<string[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = EquipmentID;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.JobOrderList:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (JobOrderList == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    JobOrderList = new BaseDataVariableState<ISA95JobOrderAndStateDataType[]>(this);\n                                }\n                                else\n                                {\n                                    JobOrderList = (BaseDataVariableState<ISA95JobOrderAndStateDataType[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = JobOrderList;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.MaterialClassID:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (MaterialClassID == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    MaterialClassID = new BaseDataVariableState<string[]>(this);\n                                }\n                                else\n                                {\n                                    MaterialClassID = (BaseDataVariableState<string[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = MaterialClassID;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.MaterialDefinitionID:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (MaterialDefinitionID == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    MaterialDefinitionID = new BaseDataVariableState<string[]>(this);\n                                }\n                                else\n                                {\n                                    MaterialDefinitionID = (BaseDataVariableState<string[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = MaterialDefinitionID;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.MaxDownloadableJobOrders:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (MaxDownloadableJobOrders == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    MaxDownloadableJobOrders = new PropertyState<ushort>(this);\n                                }\n                                else\n                                {\n                                    MaxDownloadableJobOrders = (PropertyState<ushort>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = MaxDownloadableJobOrders;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Pause:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Pause == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Pause = new PauseMethodState(this);\n                                }\n                                else\n                                {\n                                    Pause = (PauseMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Pause;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.PersonnelID:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (PersonnelID == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    PersonnelID = new BaseDataVariableState<string[]>(this);\n                                }\n                                else\n                                {\n                                    PersonnelID = (BaseDataVariableState<string[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = PersonnelID;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.PhysicalAssetID:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (PhysicalAssetID == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    PhysicalAssetID = new BaseDataVariableState<string[]>(this);\n                                }\n                                else\n                                {\n                                    PhysicalAssetID = (BaseDataVariableState<string[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = PhysicalAssetID;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Resume:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Resume == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Resume = new ResumeMethodState(this);\n                                }\n                                else\n                                {\n                                    Resume = (ResumeMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Resume;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.RevokeStart:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (RevokeStart == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    RevokeStart = new RevokeStartMethodState(this);\n                                }\n                                else\n                                {\n                                    RevokeStart = (RevokeStartMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = RevokeStart;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Start:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Start == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Start = new StartMethodState(this);\n                                }\n                                else\n                                {\n                                    Start = (StartMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Start;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Stop:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Stop == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Stop = new StopMethodState(this);\n                                }\n                                else\n                                {\n                                    Stop = (StopMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Stop;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Store:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Store == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Store = new StoreMethodState(this);\n                                }\n                                else\n                                {\n                                    Store = (StoreMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Store;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.StoreAndStart:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (StoreAndStart == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    StoreAndStart = new StoreAndStartMethodState(this);\n                                }\n                                else\n                                {\n                                    StoreAndStart = (StoreAndStartMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = StoreAndStart;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.Update:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Update == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Update = new UpdateMethodState(this);\n                                }\n                                else\n                                {\n                                    Update = (UpdateMethodState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Update;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.WorkMaster:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (WorkMaster == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    WorkMaster = new BaseDataVariableState<ISA95WorkMasterDataType[]>(this);\n                                }\n                                else\n                                {\n                                    WorkMaster = (BaseDataVariableState<ISA95WorkMasterDataType[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = WorkMaster;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private AbortMethodState m_abortMethod;\n        private CancelMethodState m_cancelMethod;\n        private ClearMethodState m_clearMethod;\n        private BaseDataVariableState<string[]> m_equipmentID;\n        private BaseDataVariableState<ISA95JobOrderAndStateDataType[]> m_jobOrderList;\n        private BaseDataVariableState<string[]> m_materialClassID;\n        private BaseDataVariableState<string[]> m_materialDefinitionID;\n        private PropertyState<ushort> m_maxDownloadableJobOrders;\n        private PauseMethodState m_pauseMethod;\n        private BaseDataVariableState<string[]> m_personnelID;\n        private BaseDataVariableState<string[]> m_physicalAssetID;\n        private ResumeMethodState m_resumeMethod;\n        private RevokeStartMethodState m_revokeStartMethod;\n        private StartMethodState m_startMethod;\n        private StopMethodState m_stopMethod;\n        private StoreMethodState m_storeMethod;\n        private StoreAndStartMethodState m_storeAndStartMethod;\n        private UpdateMethodState m_updateMethod;\n        private BaseDataVariableState<ISA95WorkMasterDataType[]> m_workMaster;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ISA95JobOrderReceiverSubStatesTypeState Class\n#if (!OPCUA_EXCLUDE_ISA95JobOrderReceiverSubStatesTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ISA95JobOrderReceiverSubStatesTypeState : ISA95JobOrderReceiverObjectTypeState\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobOrderReceiverSubStatesTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobOrderReceiverSubStatesType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n\n            if (AllowedToStartSubstates != null)\n            {\n                AllowedToStartSubstates.Initialize(context, AllowedToStartSubstates_InitializationString);\n            }\n\n            if (EndedSubstates != null)\n            {\n                EndedSubstates.Initialize(context, EndedSubstates_InitializationString);\n            }\n\n            if (InterruptedSubstates != null)\n            {\n                InterruptedSubstates.Initialize(context, InterruptedSubstates_InitializationString);\n            }\n\n            if (NotAllowedToStartSubstates != null)\n            {\n                NotAllowedToStartSubstates.Initialize(context, NotAllowedToStartSubstates_InitializationString);\n            }\n        }\n\n        #region Initialization String\n        private const string AllowedToStartSubstates_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"JGCACgEAAAABABcAAABBbGxvd2VkVG9TdGFydFN1YnN0YXRlcwEB2RMDAAAAABsAAABTdWJzdGF0ZXMg\" +\n           \"b2YgQWxsb3dlZFRvU3RhcnQALwEB6QPZEwAAAQAAAAB1AQEByBMBAAAAFWCJCgIAAAAAAAwAAABDdXJy\" +\n           \"ZW50U3RhdGUBAXMXAC8BAMgKcxcAAAAV/////wEB/////wEAAAAVYIkKAgAAAAAAAgAAAElkAQF0FwAu\" +\n           \"AER0FwAAABH/////AQH/////AAAAAA==\";\n\n        private const string EndedSubstates_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"JGCACgEAAAABAA4AAABFbmRlZFN1YnN0YXRlcwEB2hMDAAAAABIAAABTdWJzdGF0ZXMgb2YgRW5kZWQA\" +\n           \"LwEB7QPaEwAAAQAAAAB1AQEByxMBAAAAFWCJCgIAAAAAAAwAAABDdXJyZW50U3RhdGUBAXUXAC8BAMgK\" +\n           \"dRcAAAAV/////wEB/////wEAAAAVYIkKAgAAAAAAAgAAAElkAQF2FwAuAER2FwAAABH/////AQH/////\" +\n           \"AAAAAA==\";\n\n        private const string InterruptedSubstates_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"JGCACgEAAAABABQAAABJbnRlcnJ1cHRlZFN1YnN0YXRlcwEB2xMDAAAAABgAAABTdWJzdGF0ZXMgb2Yg\" +\n           \"SW50ZXJydXB0ZWQALwEB7wPbEwAAAQAAAAB1AQEByhMBAAAAFWCJCgIAAAAAAAwAAABDdXJyZW50U3Rh\" +\n           \"dGUBAXcXAC8BAMgKdxcAAAAV/////wEB/////wEAAAAVYIkKAgAAAAAAAgAAAElkAQF4FwAuAER4FwAA\" +\n           \"ABH/////AQH/////AAAAAA==\";\n\n        private const string NotAllowedToStartSubstates_InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"JGCACgEAAAABABoAAABOb3RBbGxvd2VkVG9TdGFydFN1YnN0YXRlcwEB2BMDAAAAAB4AAABTdWJzdGF0\" +\n           \"ZXMgb2YgTm90QWxsb3dlZFRvU3RhcnQALwEB6QPYEwAAAQAAAAB1AQEBxxMBAAAAFWCJCgIAAAAAAAwA\" +\n           \"AABDdXJyZW50U3RhdGUBAXEXAC8BAMgKcRcAAAAV/////wEB/////wEAAAAVYIkKAgAAAAAAAgAAAElk\" +\n           \"AQFyFwAuAERyFwAAABH/////AQH/////AAAAAA==\";\n\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGCAAgEAAAABACoAAABJU0E5NUpvYk9yZGVyUmVjZWl2ZXJTdWJTdGF0ZXNUeXBlSW5zdGFuY2UBAfAD\" +\n           \"AQHwA/ADAAD/////DQAAABVgiQgCAAAAAAAMAAAAQ3VycmVudFN0YXRlAQEAAAAvAQDICgAV/////wEB\" +\n           \"/////wEAAAAVYIkIAgAAAAAAAgAAAElkAQEAAAAuAEQAEf////8BAf////8AAAAAN2CJCgIAAAABAAsA\" +\n           \"AABFcXVpcG1lbnRJRAEBlRcDAAAAAGYAAABEZWZpbmVzIGEgcmVhZC1vbmx5IHNldCBvZiBFcXVpcG1l\" +\n           \"bnQgQ2xhc3MgSURzIGFuZCBFcXVpcG1lbnQgSURzIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBpbiBhIGpv\" +\n           \"YiBvcmRlci4ALwA/lRcAAAAMAQAAAAEAAAAAAAAAAQH/////AAAAADdgiQoCAAAAAQAMAAAASm9iT3Jk\" +\n           \"ZXJMaXN0AQGRFwMAAAAATAAAAERlZmluZXMgYSByZWFkLW9ubHkgbGlzdCBvZiBqb2Igb3JkZXIgaW5m\" +\n           \"b3JtYXRpb24gYXZhaWxhYmxlIGZyb20gdGhlIHNlcnZlci4ALwA/kRcAAAEBxwsBAAAAAQAAAAAAAAAB\" +\n           \"Af////8AAAAAN2CJCgIAAAABAA8AAABNYXRlcmlhbENsYXNzSUQBAZMXAwAAAABVAAAARGVmaW5lcyBh\" +\n           \"IHJlYWQtb25seSBzZXQgb2YgTWF0ZXJpYWwgQ2xhc3NlcyBJRHMgdGhhdCBtYXkgYmUgc3BlY2lmaWVk\" +\n           \"IGluIGEgam9iIG9yZGVyLgAvAD+TFwAAAAwBAAAAAQAAAAAAAAABAf////8AAAAAN2CJCgIAAAABABQA\" +\n           \"AABNYXRlcmlhbERlZmluaXRpb25JRAEBlBcDAAAAAFUAAABEZWZpbmVzIGEgcmVhZC1vbmx5IHNldCBv\" +\n           \"ZiBNYXRlcmlhbCBDbGFzc2VzIElEcyB0aGF0IG1heSBiZSBzcGVjaWZpZWQgaW4gYSBqb2Igb3JkZXIu\" +\n           \"AC8AP5QXAAAADAEAAAABAAAAAAAAAAEB/////wAAAAAVYIkKAgAAAAEAGAAAAE1heERvd25sb2FkYWJs\" +\n           \"ZUpvYk9yZGVycwEByBcALgBEyBcAAAAF/////wEB/////wAAAAA3YIkKAgAAAAEACwAAAFBlcnNvbm5l\" +\n           \"bElEAQGXFwMAAAAAXQAAAERlZmluZXMgYSByZWFkLW9ubHkgc2V0IG9mIFBlcnNvbm5lbCBJRHMgYW5k\" +\n           \"IFBlcnNvbiBJRHMgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGluIGEgam9iIG9yZGVyLgAvAD+XFwAAAAwB\" +\n           \"AAAAAQAAAAAAAAABAf////8AAAAAN2CJCgIAAAABAA8AAABQaHlzaWNhbEFzc2V0SUQBAZYXAwAAAABw\" +\n           \"AAAARGVmaW5lcyBhIHJlYWQtb25seSBzZXQgb2YgUGh5c2ljYWwgQXNzZXQgQ2xhc3MgSURzIGFuZCBQ\" +\n           \"aHlzaWNhbCBBc3NldCBJRHMgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGluIGEgam9iIG9yZGVyLgAvAD+W\" +\n           \"FwAAAAwBAAAAAQAAAAAAAAABAf////8AAAAAN2CJCgIAAAABAAoAAABXb3JrTWFzdGVyAQGSFwMAAAAA\" +\n           \"pgAAAERlZmluZXMgYSByZWFkLW9ubHkgc2V0IG9mIHdvcmsgbWFzdGVyIElEcyB0aGF0IG1heSBiZSBz\" +\n           \"cGVjaWZpZWQgaW4gYSBqb2Igb3JkZXIsIGFuZCB0aGUgcmVhZC1vbmx5IHNldCBvZiBwYXJhbWV0ZXJz\" +\n           \"IHRoYXQgbWF5IGJlIHNwZWNpZmllZCBmb3IgYSBzcGVjaWZpYyB3b3JrIG1hc3Rlci4ALwA/khcAAAEB\" +\n           \"vwsBAAAAAQAAAAAAAAABAf////8AAAAAJGCACgEAAAABABcAAABBbGxvd2VkVG9TdGFydFN1YnN0YXRl\" +\n           \"cwEB2RMDAAAAABsAAABTdWJzdGF0ZXMgb2YgQWxsb3dlZFRvU3RhcnQALwEB6QPZEwAAAQAAAAB1AQEB\" +\n           \"yBMBAAAAFWCJCgIAAAAAAAwAAABDdXJyZW50U3RhdGUBAXMXAC8BAMgKcxcAAAAV/////wEB/////wEA\" +\n           \"AAAVYIkKAgAAAAAAAgAAAElkAQF0FwAuAER0FwAAABH/////AQH/////AAAAACRggAoBAAAAAQAOAAAA\" +\n           \"RW5kZWRTdWJzdGF0ZXMBAdoTAwAAAAASAAAAU3Vic3RhdGVzIG9mIEVuZGVkAC8BAe0D2hMAAAEAAAAA\" +\n           \"dQEBAcsTAQAAABVgiQoCAAAAAAAMAAAAQ3VycmVudFN0YXRlAQF1FwAvAQDICnUXAAAAFf////8BAf//\" +\n           \"//8BAAAAFWCJCgIAAAAAAAIAAABJZAEBdhcALgBEdhcAAAAR/////wEB/////wAAAAAkYIAKAQAAAAEA\" +\n           \"FAAAAEludGVycnVwdGVkU3Vic3RhdGVzAQHbEwMAAAAAGAAAAFN1YnN0YXRlcyBvZiBJbnRlcnJ1cHRl\" +\n           \"ZAAvAQHvA9sTAAABAAAAAHUBAQHKEwEAAAAVYIkKAgAAAAAADAAAAEN1cnJlbnRTdGF0ZQEBdxcALwEA\" +\n           \"yAp3FwAAABX/////AQH/////AQAAABVgiQoCAAAAAAACAAAASWQBAXgXAC4ARHgXAAAAEf////8BAf//\" +\n           \"//8AAAAAJGCACgEAAAABABoAAABOb3RBbGxvd2VkVG9TdGFydFN1YnN0YXRlcwEB2BMDAAAAAB4AAABT\" +\n           \"dWJzdGF0ZXMgb2YgTm90QWxsb3dlZFRvU3RhcnQALwEB6QPYEwAAAQAAAAB1AQEBxxMBAAAAFWCJCgIA\" +\n           \"AAAAAAwAAABDdXJyZW50U3RhdGUBAXEXAC8BAMgKcRcAAAAV/////wEB/////wEAAAAVYIkKAgAAAAAA\" +\n           \"AgAAAElkAQFyFwAuAERyFwAAABH/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public ISA95PrepareStateMachineTypeState AllowedToStartSubstates\n        {\n            get\n            {\n                return m_allowedToStartSubstates;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_allowedToStartSubstates, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_allowedToStartSubstates = value;\n            }\n        }\n\n        /// <remarks />\n        public ISA95EndedStateMachineTypeState EndedSubstates\n        {\n            get\n            {\n                return m_endedSubstates;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_endedSubstates, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_endedSubstates = value;\n            }\n        }\n\n        /// <remarks />\n        public ISA95InterruptedStateMachineTypeState InterruptedSubstates\n        {\n            get\n            {\n                return m_interruptedSubstates;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_interruptedSubstates, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_interruptedSubstates = value;\n            }\n        }\n\n        /// <remarks />\n        public ISA95PrepareStateMachineTypeState NotAllowedToStartSubstates\n        {\n            get\n            {\n                return m_notAllowedToStartSubstates;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_notAllowedToStartSubstates, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_notAllowedToStartSubstates = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_allowedToStartSubstates != null)\n            {\n                children.Add(m_allowedToStartSubstates);\n            }\n\n            if (m_endedSubstates != null)\n            {\n                children.Add(m_endedSubstates);\n            }\n\n            if (m_interruptedSubstates != null)\n            {\n                children.Add(m_interruptedSubstates);\n            }\n\n            if (m_notAllowedToStartSubstates != null)\n            {\n                children.Add(m_notAllowedToStartSubstates);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <remarks />\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.AllowedToStartSubstates:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (AllowedToStartSubstates == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    AllowedToStartSubstates = new ISA95PrepareStateMachineTypeState(this);\n                                }\n                                else\n                                {\n                                    AllowedToStartSubstates = (ISA95PrepareStateMachineTypeState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = AllowedToStartSubstates;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.EndedSubstates:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (EndedSubstates == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    EndedSubstates = new ISA95EndedStateMachineTypeState(this);\n                                }\n                                else\n                                {\n                                    EndedSubstates = (ISA95EndedStateMachineTypeState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = EndedSubstates;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.InterruptedSubstates:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (InterruptedSubstates == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    InterruptedSubstates = new ISA95InterruptedStateMachineTypeState(this);\n                                }\n                                else\n                                {\n                                    InterruptedSubstates = (ISA95InterruptedStateMachineTypeState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = InterruptedSubstates;\n                        break;\n                    }\n\n                case UAModel.ISA95_JOBCONTROL_V2.BrowseNames.NotAllowedToStartSubstates:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (NotAllowedToStartSubstates == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    NotAllowedToStartSubstates = new ISA95PrepareStateMachineTypeState(this);\n                                }\n                                else\n                                {\n                                    NotAllowedToStartSubstates = (ISA95PrepareStateMachineTypeState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = NotAllowedToStartSubstates;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private ISA95PrepareStateMachineTypeState m_allowedToStartSubstates;\n        private ISA95EndedStateMachineTypeState m_endedSubstates;\n        private ISA95InterruptedStateMachineTypeState m_interruptedSubstates;\n        private ISA95PrepareStateMachineTypeState m_notAllowedToStartSubstates;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ISA95PrepareStateMachineTypeState Class\n#if (!OPCUA_EXCLUDE_ISA95PrepareStateMachineTypeState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ISA95PrepareStateMachineTypeState : FiniteStateMachineState\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95PrepareStateMachineTypeState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95PrepareStateMachineType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGCAAgEAAAABACQAAABJU0E5NVByZXBhcmVTdGF0ZU1hY2hpbmVUeXBlSW5zdGFuY2UBAekDAQHpA+kD\" +\n           \"AAD/////AQAAABVgiQgCAAAAAAAMAAAAQ3VycmVudFN0YXRlAQEAAAAvAQDICgAV/////wEB/////wEA\" +\n           \"AAAVYIkIAgAAAAAAAgAAAElkAQEAAAAuAEQAEf////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region RequestJobResponseByJobOrderIDMethodState Class\n#if (!OPCUA_EXCLUDE_RequestJobResponseByJobOrderIDMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class RequestJobResponseByJobOrderIDMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public RequestJobResponseByJobOrderIDMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new RequestJobResponseByJobOrderIDMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABACgAAABSZXF1ZXN0Sm9iUmVzcG9uc2VCeUpvYk9yZGVySURNZXRob2RUeXBlAQEAAAEB\" +\n           \"AAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public RequestJobResponseByJobOrderIDMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n\n            ISA95JobResponseDataType jobResponse = (ISA95JobResponseDataType)_outputArguments[0];\n            ulong returnStatus = (ulong)_outputArguments[1];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    ref jobResponse,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = jobResponse;\n            _outputArguments[1] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult RequestJobResponseByJobOrderIDMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        ref ISA95JobResponseDataType jobResponse,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region RequestJobResponseByJobOrderStateMethodState Class\n#if (!OPCUA_EXCLUDE_RequestJobResponseByJobOrderStateMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class RequestJobResponseByJobOrderStateMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public RequestJobResponseByJobOrderStateMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new RequestJobResponseByJobOrderStateMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABACsAAABSZXF1ZXN0Sm9iUmVzcG9uc2VCeUpvYk9yZGVyU3RhdGVNZXRob2RUeXBlAQEA\" +\n           \"AAEBAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public RequestJobResponseByJobOrderStateMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            ISA95StateDataType[] jobOrderState = (ISA95StateDataType[])ExtensionObject.ToArray(_inputArguments[0], typeof(ISA95StateDataType));\n\n            ISA95JobResponseDataType[] jobResponses = (ISA95JobResponseDataType[])_outputArguments[0];\n            ulong returnStatus = (ulong)_outputArguments[1];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderState,\n                    ref jobResponses,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = jobResponses;\n            _outputArguments[1] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult RequestJobResponseByJobOrderStateMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        ISA95StateDataType[] jobOrderState,\n        ref ISA95JobResponseDataType[] jobResponses,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region ReceiveJobResponseMethodState Class\n#if (!OPCUA_EXCLUDE_ReceiveJobResponseMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ReceiveJobResponseMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public ReceiveJobResponseMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ReceiveJobResponseMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABABwAAABSZWNlaXZlSm9iUmVzcG9uc2VNZXRob2RUeXBlAQEAAAEBAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public ReceiveJobResponseMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            ISA95JobResponseDataType jobResponse = (ISA95JobResponseDataType)ExtensionObject.ToEncodeable((ExtensionObject)_inputArguments[0]);\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobResponse,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult ReceiveJobResponseMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        ISA95JobResponseDataType jobResponse,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region AbortMethodState Class\n#if (!OPCUA_EXCLUDE_AbortMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class AbortMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public AbortMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new AbortMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABAA8AAABBYm9ydE1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public AbortMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult AbortMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region CancelMethodState Class\n#if (!OPCUA_EXCLUDE_CancelMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class CancelMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public CancelMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new CancelMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABABAAAABDYW5jZWxNZXRob2RUeXBlAQEAAAEBAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public CancelMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult CancelMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region ClearMethodState Class\n#if (!OPCUA_EXCLUDE_ClearMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ClearMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public ClearMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ClearMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABAA8AAABDbGVhck1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public ClearMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult ClearMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region PauseMethodState Class\n#if (!OPCUA_EXCLUDE_PauseMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class PauseMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public PauseMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new PauseMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABAA8AAABQYXVzZU1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public PauseMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult PauseMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region ResumeMethodState Class\n#if (!OPCUA_EXCLUDE_ResumeMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ResumeMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public ResumeMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ResumeMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABABAAAABSZXN1bWVNZXRob2RUeXBlAQEAAAEBAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public ResumeMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult ResumeMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region RevokeStartMethodState Class\n#if (!OPCUA_EXCLUDE_RevokeStartMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class RevokeStartMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public RevokeStartMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new RevokeStartMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABABUAAABSZXZva2VTdGFydE1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public RevokeStartMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult RevokeStartMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region StartMethodState Class\n#if (!OPCUA_EXCLUDE_StartMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class StartMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public StartMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new StartMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABAA8AAABTdGFydE1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public StartMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult StartMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region StopMethodState Class\n#if (!OPCUA_EXCLUDE_StopMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class StopMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public StopMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new StopMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABAA4AAABTdG9wTWV0aG9kVHlwZQEBAAABAQAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public StopMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            string jobOrderID = (string)_inputArguments[0];\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrderID,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult StopMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string jobOrderID,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region StoreMethodState Class\n#if (!OPCUA_EXCLUDE_StoreMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class StoreMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public StoreMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new StoreMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABAA8AAABTdG9yZU1ldGhvZFR5cGUBAQAAAQEAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public StoreMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            ISA95JobOrderDataType jobOrder = (ISA95JobOrderDataType)ExtensionObject.ToEncodeable((ExtensionObject)_inputArguments[0]);\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrder,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult StoreMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        ISA95JobOrderDataType jobOrder,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region StoreAndStartMethodState Class\n#if (!OPCUA_EXCLUDE_StoreAndStartMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class StoreAndStartMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public StoreAndStartMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new StoreAndStartMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABABcAAABTdG9yZUFuZFN0YXJ0TWV0aG9kVHlwZQEBAAABAQAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public StoreAndStartMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            ISA95JobOrderDataType jobOrder = (ISA95JobOrderDataType)ExtensionObject.ToEncodeable((ExtensionObject)_inputArguments[0]);\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrder,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult StoreAndStartMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        ISA95JobOrderDataType jobOrder,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n\n    #region UpdateMethodState Class\n#if (!OPCUA_EXCLUDE_UpdateMethodState)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class UpdateMethodState : MethodState\n    {\n        #region Constructors\n        /// <remarks />\n        public UpdateMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <remarks />\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new UpdateMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <remarks />\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <remarks />\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAADAAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi//////\" +\n           \"BGGCAAQAAAABABAAAABVcGRhdGVNZXRob2RUeXBlAQEAAAEBAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <remarks />\n        public UpdateMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <remarks />\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult _result = null;\n\n            ISA95JobOrderDataType jobOrder = (ISA95JobOrderDataType)ExtensionObject.ToEncodeable((ExtensionObject)_inputArguments[0]);\n            LocalizedText[] comment = (LocalizedText[])_inputArguments[1];\n\n            ulong returnStatus = (ulong)_outputArguments[0];\n\n            if (OnCall != null)\n            {\n                _result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    jobOrder,\n                    comment,\n                    ref returnStatus);\n            }\n\n            _outputArguments[0] = returnStatus;\n\n            return _result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <remarks />\n    /// <exclude />\n    public delegate ServiceResult UpdateMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        ISA95JobOrderDataType jobOrder,\n        LocalizedText[] comment,\n        ref ulong returnStatus);\n#endif\n    #endregion\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2024 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace UAModel.ISA95_JOBCONTROL_V2\n{\n    #region DataType Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypes\n    {\n        /// <remarks />\n        public const uint ISA95EquipmentDataType = 3005;\n\n        /// <remarks />\n        public const uint ISA95JobOrderAndStateDataType = 3015;\n\n        /// <remarks />\n        public const uint ISA95JobOrderDataType = 3008;\n\n        /// <remarks />\n        public const uint ISA95JobResponseDataType = 3013;\n\n        /// <remarks />\n        public const uint ISA95MaterialDataType = 3010;\n\n        /// <remarks />\n        public const uint ISA95ParameterDataType = 3003;\n\n        /// <remarks />\n        public const uint ISA95PersonnelDataType = 3011;\n\n        /// <remarks />\n        public const uint ISA95PhysicalAssetDataType = 3012;\n\n        /// <remarks />\n        public const uint ISA95PropertyDataType = 3002;\n\n        /// <remarks />\n        public const uint ISA95StateDataType = 3006;\n\n        /// <remarks />\n        public const uint ISA95WorkMasterDataType = 3007;\n    }\n    #endregion\n\n    #region Method Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Methods\n    {\n        /// <remarks />\n        public const uint ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID = 7002;\n\n        /// <remarks />\n        public const uint ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState = 7014;\n\n        /// <remarks />\n        public const uint ISA95JobResponseReceiverObjectType_ReceiveJobResponse = 7003;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Abort = 7010;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Cancel = 7011;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Clear = 7012;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Pause = 7007;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Resume = 7008;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_RevokeStart = 7013;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Start = 7005;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Stop = 7006;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Store = 7001;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_StoreAndStart = 7004;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Update = 7009;\n\n        /// <remarks />\n        public const string ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderIDMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderStateMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobResponseReceiverObjectType_ReceiveJobResponseMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_AbortMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_CancelMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_ClearMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_PauseMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_ResumeMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_RevokeStartMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_StartMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_StopMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_StoreMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_StoreAndStartMethodType = \"\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType_UpdateMethodType = \"\";\n    }\n    #endregion\n\n    #region Object Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <remarks />\n        public const uint ISA95EndedStateMachineType_Closed = 5057;\n\n        /// <remarks />\n        public const uint ISA95EndedStateMachineType_Completed = 5056;\n\n        /// <remarks />\n        public const uint ISA95EndedStateMachineType_FromCompletedToClosed = 5058;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType_FromHeldToSuspended = 5061;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType_FromSuspendedToHeld = 5062;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType_Held = 5059;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType_Suspended = 5060;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Aborted = 5040;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_AllowedToStart = 5036;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Ended = 5039;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted = 5085;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart = 5044;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart = 5043;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning = 5045;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromInterruptedToAborted = 5049;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromInterruptedToEnded = 5051;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromInterruptedToRunning = 5050;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted = 5084;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart = 5042;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart = 5041;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromRunningToAborted = 5048;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromRunningToEnded = 5047;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromRunningToInterrupted = 5046;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Interrupted = 5038;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_NotAllowedToStart = 5035;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Running = 5037;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Aborted = 5068;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_AllowedToStart = 5064;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Ended = 5067;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted = 5086;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart = 5072;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart = 5071;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning = 5073;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted = 5077;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded = 5079;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning = 5078;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted = 5087;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart = 5070;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart = 5069;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromRunningToAborted = 5076;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromRunningToEnded = 5075;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted = 5074;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Interrupted = 5066;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_NotAllowedToStart = 5063;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Running = 5065;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates = 5081;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_EndedSubstates = 5082;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_InterruptedSubstates = 5083;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates = 5080;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromLoadedToReady = 5089;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromLoadedToWaiting = 5090;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromReadyToLoaded = 5055;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromReadyToWaiting = 5088;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromWaitingToReady = 5054;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_Loaded = 5053;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_Ready = 5052;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_Waiting = 5000;\n\n        /// <remarks />\n        public const uint http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_ = 5001;\n\n        /// <remarks />\n        public const uint ISA95PropertyDataType_Encoding_DefaultBinary = 5002;\n\n        /// <remarks />\n        public const uint ISA95PropertyDataType_Encoding_DefaultXml = 5003;\n\n        /// <remarks />\n        public const uint ISA95PropertyDataType_Encoding_DefaultJson = 5004;\n\n        /// <remarks />\n        public const uint ISA95ParameterDataType_Encoding_DefaultBinary = 5005;\n\n        /// <remarks />\n        public const uint ISA95ParameterDataType_Encoding_DefaultXml = 5006;\n\n        /// <remarks />\n        public const uint ISA95ParameterDataType_Encoding_DefaultJson = 5007;\n\n        /// <remarks />\n        public const uint ISA95EquipmentDataType_Encoding_DefaultBinary = 5008;\n\n        /// <remarks />\n        public const uint ISA95EquipmentDataType_Encoding_DefaultXml = 5009;\n\n        /// <remarks />\n        public const uint ISA95EquipmentDataType_Encoding_DefaultJson = 5010;\n\n        /// <remarks />\n        public const uint ISA95WorkMasterDataType_Encoding_DefaultBinary = 5011;\n\n        /// <remarks />\n        public const uint ISA95WorkMasterDataType_Encoding_DefaultXml = 5012;\n\n        /// <remarks />\n        public const uint ISA95WorkMasterDataType_Encoding_DefaultJson = 5013;\n\n        /// <remarks />\n        public const uint ISA95JobOrderDataType_Encoding_DefaultBinary = 5014;\n\n        /// <remarks />\n        public const uint ISA95JobOrderDataType_Encoding_DefaultXml = 5015;\n\n        /// <remarks />\n        public const uint ISA95JobOrderDataType_Encoding_DefaultJson = 5016;\n\n        /// <remarks />\n        public const uint ISA95MaterialDataType_Encoding_DefaultBinary = 5017;\n\n        /// <remarks />\n        public const uint ISA95MaterialDataType_Encoding_DefaultXml = 5018;\n\n        /// <remarks />\n        public const uint ISA95MaterialDataType_Encoding_DefaultJson = 5019;\n\n        /// <remarks />\n        public const uint ISA95PersonnelDataType_Encoding_DefaultBinary = 5020;\n\n        /// <remarks />\n        public const uint ISA95PersonnelDataType_Encoding_DefaultXml = 5021;\n\n        /// <remarks />\n        public const uint ISA95PersonnelDataType_Encoding_DefaultJson = 5022;\n\n        /// <remarks />\n        public const uint ISA95PhysicalAssetDataType_Encoding_DefaultBinary = 5023;\n\n        /// <remarks />\n        public const uint ISA95PhysicalAssetDataType_Encoding_DefaultXml = 5024;\n\n        /// <remarks />\n        public const uint ISA95PhysicalAssetDataType_Encoding_DefaultJson = 5025;\n\n        /// <remarks />\n        public const uint ISA95JobResponseDataType_Encoding_DefaultBinary = 5026;\n\n        /// <remarks />\n        public const uint ISA95JobResponseDataType_Encoding_DefaultXml = 5027;\n\n        /// <remarks />\n        public const uint ISA95JobResponseDataType_Encoding_DefaultJson = 5028;\n\n        /// <remarks />\n        public const uint ISA95StateDataType_Encoding_DefaultBinary = 5029;\n\n        /// <remarks />\n        public const uint ISA95StateDataType_Encoding_DefaultXml = 5030;\n\n        /// <remarks />\n        public const uint ISA95StateDataType_Encoding_DefaultJson = 5031;\n\n        /// <remarks />\n        public const uint ISA95JobOrderAndStateDataType_Encoding_DefaultBinary = 5032;\n\n        /// <remarks />\n        public const uint ISA95JobOrderAndStateDataType_Encoding_DefaultXml = 5033;\n\n        /// <remarks />\n        public const uint ISA95JobOrderAndStateDataType_Encoding_DefaultJson = 5034;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <remarks />\n        public const uint ISA95JobOrderStatusEventType = 1006;\n\n        /// <remarks />\n        public const uint ISA95JobResponseProviderObjectType = 1003;\n\n        /// <remarks />\n        public const uint ISA95JobResponseReceiverObjectType = 1004;\n\n        /// <remarks />\n        public const uint ISA95EndedStateMachineType = 1005;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType = 1007;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType = 1002;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType = 1008;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType = 1001;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <remarks />\n        public const uint ISA95JobOrderStatusEventType_JobOrder = 6047;\n\n        /// <remarks />\n        public const uint ISA95JobOrderStatusEventType_JobResponse = 6049;\n\n        /// <remarks />\n        public const uint ISA95JobOrderStatusEventType_JobState = 6048;\n\n        /// <remarks />\n        public const uint ISA95JobResponseProviderObjectType_JobOrderResponseList = 6050;\n\n        /// <remarks />\n        public const uint ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_InputArguments = 6042;\n\n        /// <remarks />\n        public const uint ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_OutputArguments = 6043;\n\n        /// <remarks />\n        public const uint ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_InputArguments = 6016;\n\n        /// <remarks />\n        public const uint ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_OutputArguments = 6017;\n\n        /// <remarks />\n        public const uint ISA95JobResponseReceiverObjectType_ReceiveJobResponse_InputArguments = 6044;\n\n        /// <remarks />\n        public const uint ISA95JobResponseReceiverObjectType_ReceiveJobResponse_OutputArguments = 6045;\n\n        /// <remarks />\n        public const uint ISA95EndedStateMachineType_Closed_StateNumber = 6094;\n\n        /// <remarks />\n        public const uint ISA95EndedStateMachineType_Completed_StateNumber = 6093;\n\n        /// <remarks />\n        public const uint ISA95EndedStateMachineType_FromCompletedToClosed_TransitionNumber = 6095;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType_FromHeldToSuspended_TransitionNumber = 6098;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType_FromSuspendedToHeld_TransitionNumber = 6099;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType_Held_StateNumber = 6096;\n\n        /// <remarks />\n        public const uint ISA95InterruptedStateMachineType_Suspended_StateNumber = 6097;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Abort_InputArguments = 6063;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Abort_OutputArguments = 6064;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Aborted_StateNumber = 6076;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_AllowedToStart_StateNumber = 6072;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Cancel_InputArguments = 6065;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Cancel_OutputArguments = 6066;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Clear_InputArguments = 6067;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Clear_OutputArguments = 6068;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Ended_StateNumber = 6075;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_EquipmentID = 6037;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted_TransitionNumber = 6010;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart_TransitionNumber = 6080;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart_TransitionNumber = 6079;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning_TransitionNumber = 6081;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromInterruptedToAborted_TransitionNumber = 6085;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromInterruptedToEnded_TransitionNumber = 6087;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromInterruptedToRunning_TransitionNumber = 6086;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted_TransitionNumber = 6009;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart_TransitionNumber = 6078;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber = 6077;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromRunningToAborted_TransitionNumber = 6084;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromRunningToEnded_TransitionNumber = 6083;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_FromRunningToInterrupted_TransitionNumber = 6082;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Interrupted_StateNumber = 6074;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_JobOrderList = 6033;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_MaterialClassID = 6035;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_MaterialDefinitionID = 6036;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_MaxDownloadableJobOrders = 6088;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_NotAllowedToStart_StateNumber = 6071;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Pause_InputArguments = 6057;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Pause_OutputArguments = 6058;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_PersonnelID = 6039;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_PhysicalAssetID = 6038;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Resume_InputArguments = 6059;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Resume_OutputArguments = 6060;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_RevokeStart_InputArguments = 6069;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_RevokeStart_OutputArguments = 6070;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Running_StateNumber = 6073;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Start_InputArguments = 6053;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Start_OutputArguments = 6054;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Stop_InputArguments = 6055;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Stop_OutputArguments = 6056;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Store_InputArguments = 6040;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Store_OutputArguments = 6041;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_StoreAndStart_InputArguments = 6051;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_StoreAndStart_OutputArguments = 6052;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Update_InputArguments = 6061;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_Update_OutputArguments = 6062;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverObjectType_WorkMaster = 6034;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Abort_InputArguments = 6063;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Abort_OutputArguments = 6064;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Aborted_StateNumber = 6105;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_AllowedToStart_StateNumber = 6101;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Cancel_InputArguments = 6065;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Cancel_OutputArguments = 6066;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Clear_InputArguments = 6067;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Clear_OutputArguments = 6068;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Ended_StateNumber = 6104;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted_TransitionNumber = 6011;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart_TransitionNumber = 6109;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart_TransitionNumber = 6108;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning_TransitionNumber = 6110;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted_TransitionNumber = 6114;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded_TransitionNumber = 6116;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning_TransitionNumber = 6115;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted_TransitionNumber = 6012;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart_TransitionNumber = 6107;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber = 6106;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromRunningToAborted_TransitionNumber = 6113;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromRunningToEnded_TransitionNumber = 6112;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted_TransitionNumber = 6111;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Interrupted_StateNumber = 6103;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_NotAllowedToStart_StateNumber = 6100;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Pause_InputArguments = 6057;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Pause_OutputArguments = 6058;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Resume_InputArguments = 6059;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Resume_OutputArguments = 6060;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_RevokeStart_InputArguments = 6069;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_RevokeStart_OutputArguments = 6070;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Running_StateNumber = 6102;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Start_InputArguments = 6053;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Start_OutputArguments = 6054;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Stop_InputArguments = 6055;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Stop_OutputArguments = 6056;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Store_InputArguments = 6040;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Store_OutputArguments = 6041;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_StoreAndStart_InputArguments = 6051;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_StoreAndStart_OutputArguments = 6052;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Update_InputArguments = 6061;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_Update_OutputArguments = 6062;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState = 6003;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState_Id = 6004;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState = 6005;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState_Id = 6006;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState = 6007;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState_Id = 6008;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState = 6001;\n\n        /// <remarks />\n        public const uint ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState_Id = 6002;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromLoadedToReady_TransitionNumber = 6014;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromLoadedToWaiting_TransitionNumber = 6015;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromReadyToLoaded_TransitionNumber = 6092;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromReadyToWaiting_TransitionNumber = 6013;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_FromWaitingToReady_TransitionNumber = 6091;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_Loaded_StateNumber = 6090;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_Ready_StateNumber = 6089;\n\n        /// <remarks />\n        public const uint ISA95PrepareStateMachineType_Waiting_StateNumber = 6000;\n\n        /// <remarks />\n        public const uint http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceUri = 6025;\n\n        /// <remarks />\n        public const uint http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceVersion = 6026;\n\n        /// <remarks />\n        public const uint http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespacePublicationDate = 6024;\n\n        /// <remarks />\n        public const uint http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__IsNamespaceSubset = 6023;\n\n        /// <remarks />\n        public const uint http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNodeIdTypes = 6027;\n\n        /// <remarks />\n        public const uint http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNumericNodeIdRange = 6028;\n\n        /// <remarks />\n        public const uint http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticStringNodeIdPattern = 6029;\n    }\n    #endregion\n\n    #region DataType Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypeIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EquipmentDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95EquipmentDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderAndStateDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95JobOrderAndStateDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95JobOrderDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95JobResponseDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95MaterialDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95MaterialDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95ParameterDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95ParameterDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PersonnelDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95PersonnelDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PhysicalAssetDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95PhysicalAssetDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PropertyDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95PropertyDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95StateDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95StateDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95WorkMasterDataType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.DataTypes.ISA95WorkMasterDataType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n    }\n    #endregion\n\n    #region Method Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class MethodIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseReceiverObjectType_ReceiveJobResponse = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobResponseReceiverObjectType_ReceiveJobResponse, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Abort = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Abort, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Cancel = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Cancel, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Clear = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Clear, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Pause = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Pause, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Resume = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Resume, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_RevokeStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_RevokeStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Start = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Start, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Stop = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Stop, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Store = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Store, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_StoreAndStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_StoreAndStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Update = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_Update, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderIDMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderIDMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderStateMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderStateMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseReceiverObjectType_ReceiveJobResponseMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobResponseReceiverObjectType_ReceiveJobResponseMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_AbortMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_AbortMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_CancelMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_CancelMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_ClearMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_ClearMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_PauseMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_PauseMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_ResumeMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_ResumeMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_RevokeStartMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_RevokeStartMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_StartMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_StartMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_StopMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_StopMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_StoreMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_StoreMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_StoreAndStartMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_StoreAndStartMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_UpdateMethodType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Methods.ISA95JobOrderReceiverObjectType_UpdateMethodType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EndedStateMachineType_Closed = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95EndedStateMachineType_Closed, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EndedStateMachineType_Completed = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95EndedStateMachineType_Completed, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EndedStateMachineType_FromCompletedToClosed = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95EndedStateMachineType_FromCompletedToClosed, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType_FromHeldToSuspended = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95InterruptedStateMachineType_FromHeldToSuspended, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType_FromSuspendedToHeld = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95InterruptedStateMachineType_FromSuspendedToHeld, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType_Held = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95InterruptedStateMachineType_Held, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType_Suspended = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95InterruptedStateMachineType_Suspended, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Aborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_Aborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_AllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_AllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Ended = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_Ended, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromInterruptedToAborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromInterruptedToAborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromInterruptedToEnded = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromInterruptedToEnded, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromInterruptedToRunning = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromInterruptedToRunning, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromRunningToAborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromRunningToAborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromRunningToEnded = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromRunningToEnded, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromRunningToInterrupted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_FromRunningToInterrupted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Interrupted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_Interrupted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_NotAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_NotAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Running = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverObjectType_Running, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Aborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_Aborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_AllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_AllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Ended = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_Ended, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromRunningToAborted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromRunningToAborted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromRunningToEnded = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromRunningToEnded, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Interrupted = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_Interrupted, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_NotAllowedToStart = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_NotAllowedToStart, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Running = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_Running, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_EndedSubstates = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_EndedSubstates, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_InterruptedSubstates = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_InterruptedSubstates, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromLoadedToReady = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PrepareStateMachineType_FromLoadedToReady, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromLoadedToWaiting = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PrepareStateMachineType_FromLoadedToWaiting, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromReadyToLoaded = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PrepareStateMachineType_FromReadyToLoaded, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromReadyToWaiting = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PrepareStateMachineType_FromReadyToWaiting, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromWaitingToReady = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PrepareStateMachineType_FromWaitingToReady, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_Loaded = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PrepareStateMachineType_Loaded, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_Ready = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PrepareStateMachineType_Ready, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_Waiting = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PrepareStateMachineType_Waiting, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_ = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PropertyDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PropertyDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PropertyDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PropertyDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PropertyDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PropertyDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95ParameterDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95ParameterDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95ParameterDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95ParameterDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95ParameterDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95ParameterDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EquipmentDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95EquipmentDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EquipmentDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95EquipmentDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EquipmentDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95EquipmentDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95WorkMasterDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95WorkMasterDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95WorkMasterDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95WorkMasterDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95WorkMasterDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95WorkMasterDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95MaterialDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95MaterialDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95MaterialDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95MaterialDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95MaterialDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95MaterialDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PersonnelDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PersonnelDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PersonnelDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PersonnelDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PersonnelDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PersonnelDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PhysicalAssetDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PhysicalAssetDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PhysicalAssetDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PhysicalAssetDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PhysicalAssetDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95PhysicalAssetDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobResponseDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobResponseDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobResponseDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95StateDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95StateDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95StateDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95StateDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95StateDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95StateDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderAndStateDataType_Encoding_DefaultBinary = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderAndStateDataType_Encoding_DefaultBinary, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderAndStateDataType_Encoding_DefaultXml = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderAndStateDataType_Encoding_DefaultXml, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderAndStateDataType_Encoding_DefaultJson = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Objects.ISA95JobOrderAndStateDataType_Encoding_DefaultJson, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderStatusEventType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobOrderStatusEventType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobResponseProviderObjectType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseReceiverObjectType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobResponseReceiverObjectType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EndedStateMachineType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95EndedStateMachineType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95InterruptedStateMachineType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobOrderReceiverObjectType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95JobOrderReceiverSubStatesType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.ObjectTypes.ISA95PrepareStateMachineType, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderStatusEventType_JobOrder = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderStatusEventType_JobOrder, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderStatusEventType_JobResponse = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderStatusEventType_JobResponse, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderStatusEventType_JobState = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderStatusEventType_JobState, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_JobOrderResponseList = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobResponseProviderObjectType_JobOrderResponseList, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseReceiverObjectType_ReceiveJobResponse_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobResponseReceiverObjectType_ReceiveJobResponse_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobResponseReceiverObjectType_ReceiveJobResponse_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobResponseReceiverObjectType_ReceiveJobResponse_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EndedStateMachineType_Closed_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95EndedStateMachineType_Closed_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EndedStateMachineType_Completed_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95EndedStateMachineType_Completed_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95EndedStateMachineType_FromCompletedToClosed_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95EndedStateMachineType_FromCompletedToClosed_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType_FromHeldToSuspended_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95InterruptedStateMachineType_FromHeldToSuspended_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType_FromSuspendedToHeld_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95InterruptedStateMachineType_FromSuspendedToHeld_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType_Held_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95InterruptedStateMachineType_Held_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95InterruptedStateMachineType_Suspended_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95InterruptedStateMachineType_Suspended_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Abort_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Abort_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Abort_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Abort_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Aborted_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Aborted_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_AllowedToStart_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_AllowedToStart_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Cancel_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Cancel_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Cancel_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Cancel_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Clear_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Clear_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Clear_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Clear_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Ended_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Ended_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_EquipmentID = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_EquipmentID, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromInterruptedToAborted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromInterruptedToAborted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromInterruptedToEnded_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromInterruptedToEnded_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromInterruptedToRunning_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromInterruptedToRunning_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromRunningToAborted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromRunningToAborted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromRunningToEnded_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromRunningToEnded_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_FromRunningToInterrupted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_FromRunningToInterrupted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Interrupted_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Interrupted_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_JobOrderList = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_JobOrderList, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_MaterialClassID = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_MaterialClassID, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_MaterialDefinitionID = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_MaterialDefinitionID, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_MaxDownloadableJobOrders = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_MaxDownloadableJobOrders, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_NotAllowedToStart_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_NotAllowedToStart_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Pause_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Pause_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Pause_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Pause_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_PersonnelID = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_PersonnelID, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_PhysicalAssetID = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_PhysicalAssetID, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Resume_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Resume_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Resume_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Resume_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_RevokeStart_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_RevokeStart_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_RevokeStart_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_RevokeStart_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Running_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Running_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Start_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Start_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Start_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Start_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Stop_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Stop_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Stop_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Stop_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Store_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Store_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Store_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Store_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_StoreAndStart_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_StoreAndStart_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_StoreAndStart_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_StoreAndStart_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Update_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Update_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_Update_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_Update_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverObjectType_WorkMaster = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverObjectType_WorkMaster, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Abort_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Abort_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Abort_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Abort_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Aborted_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Aborted_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_AllowedToStart_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_AllowedToStart_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Cancel_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Cancel_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Cancel_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Cancel_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Clear_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Clear_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Clear_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Clear_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Ended_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Ended_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromRunningToAborted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromRunningToAborted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromRunningToEnded_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromRunningToEnded_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Interrupted_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Interrupted_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_NotAllowedToStart_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_NotAllowedToStart_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Pause_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Pause_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Pause_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Pause_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Resume_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Resume_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Resume_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Resume_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_RevokeStart_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_RevokeStart_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_RevokeStart_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_RevokeStart_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Running_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Running_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Start_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Start_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Start_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Start_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Stop_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Stop_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Stop_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Stop_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Store_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Store_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Store_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Store_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_StoreAndStart_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_StoreAndStart_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_StoreAndStart_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_StoreAndStart_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Update_InputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Update_InputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_Update_OutputArguments = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_Update_OutputArguments, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState_Id = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState_Id, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState_Id = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState_Id, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState_Id = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState_Id, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState_Id = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState_Id, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromLoadedToReady_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95PrepareStateMachineType_FromLoadedToReady_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromLoadedToWaiting_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95PrepareStateMachineType_FromLoadedToWaiting_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromReadyToLoaded_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95PrepareStateMachineType_FromReadyToLoaded_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromReadyToWaiting_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95PrepareStateMachineType_FromReadyToWaiting_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_FromWaitingToReady_TransitionNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95PrepareStateMachineType_FromWaitingToReady_TransitionNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_Loaded_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95PrepareStateMachineType_Loaded_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_Ready_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95PrepareStateMachineType_Ready_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId ISA95PrepareStateMachineType_Waiting_StateNumber = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.ISA95PrepareStateMachineType_Waiting_StateNumber, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceUri = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceUri, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceVersion = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceVersion, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespacePublicationDate = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespacePublicationDate, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__IsNamespaceSubset = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__IsNamespaceSubset, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNodeIdTypes = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNodeIdTypes, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNumericNodeIdRange = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNumericNodeIdRange, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n        /// <remarks />\n        public static readonly ExpandedNodeId http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticStringNodeIdPattern = new ExpandedNodeId(UAModel.ISA95_JOBCONTROL_V2.Variables.http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticStringNodeIdPattern, UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <remarks />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <remarks />\n        public const string Abort = \"Abort\";\n\n        /// <remarks />\n        public const string Aborted = \"Aborted\";\n\n        /// <remarks />\n        public const string AbortMethodType = \"AbortMethodType\";\n\n        /// <remarks />\n        public const string AllowedToStart = \"AllowedToStart\";\n\n        /// <remarks />\n        public const string AllowedToStartSubstates = \"AllowedToStartSubstates\";\n\n        /// <remarks />\n        public const string Cancel = \"Cancel\";\n\n        /// <remarks />\n        public const string CancelMethodType = \"CancelMethodType\";\n\n        /// <remarks />\n        public const string Clear = \"Clear\";\n\n        /// <remarks />\n        public const string ClearMethodType = \"ClearMethodType\";\n\n        /// <remarks />\n        public const string Closed = \"Closed\";\n\n        /// <remarks />\n        public const string Completed = \"Completed\";\n\n        /// <remarks />\n        public const string Ended = \"Ended\";\n\n        /// <remarks />\n        public const string EndedSubstates = \"EndedSubstates\";\n\n        /// <remarks />\n        public const string EquipmentID = \"EquipmentID\";\n\n        /// <remarks />\n        public const string FromAllowedToStartToAborted = \"FromAllowedToStartToAborted\";\n\n        /// <remarks />\n        public const string FromAllowedToStartToAllowedToStart = \"FromAllowedToStartToAllowedToStart\";\n\n        /// <remarks />\n        public const string FromAllowedToStartToNotAllowedToStart = \"FromAllowedToStartToNotAllowedToStart\";\n\n        /// <remarks />\n        public const string FromAllowedToStartToRunning = \"FromAllowedToStartToRunning\";\n\n        /// <remarks />\n        public const string FromCompletedToClosed = \"FromCompletedToClosed\";\n\n        /// <remarks />\n        public const string FromHeldToSuspended = \"FromHeldToSuspended\";\n\n        /// <remarks />\n        public const string FromInterruptedToAborted = \"FromInterruptedToAborted\";\n\n        /// <remarks />\n        public const string FromInterruptedToEnded = \"FromInterruptedToEnded\";\n\n        /// <remarks />\n        public const string FromInterruptedToRunning = \"FromInterruptedToRunning\";\n\n        /// <remarks />\n        public const string FromLoadedToReady = \"FromLoadedToReady\";\n\n        /// <remarks />\n        public const string FromLoadedToWaiting = \"FromLoadedToWaiting\";\n\n        /// <remarks />\n        public const string FromNotAllowedToStartToAborted = \"FromNotAllowedToStartToAborted\";\n\n        /// <remarks />\n        public const string FromNotAllowedToStartToAllowedToStart = \"FromNotAllowedToStartToAllowedToStart\";\n\n        /// <remarks />\n        public const string FromNotAllowedToStartToNotAllowedToStart = \"FromNotAllowedToStartToNotAllowedToStart\";\n\n        /// <remarks />\n        public const string FromReadyToLoaded = \"FromReadyToLoaded\";\n\n        /// <remarks />\n        public const string FromReadyToWaiting = \"FromReadyToWaiting\";\n\n        /// <remarks />\n        public const string FromRunningToAborted = \"FromRunningToAborted\";\n\n        /// <remarks />\n        public const string FromRunningToEnded = \"FromRunningToEnded\";\n\n        /// <remarks />\n        public const string FromRunningToInterrupted = \"FromRunningToInterrupted\";\n\n        /// <remarks />\n        public const string FromSuspendedToHeld = \"FromSuspendedToHeld\";\n\n        /// <remarks />\n        public const string FromWaitingToReady = \"FromWaitingToReady\";\n\n        /// <remarks />\n        public const string Held = \"Held\";\n\n        /// <remarks />\n        public const string http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_ = \"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\";\n\n        /// <remarks />\n        public const string Interrupted = \"Interrupted\";\n\n        /// <remarks />\n        public const string InterruptedSubstates = \"InterruptedSubstates\";\n\n        /// <remarks />\n        public const string ISA95EndedStateMachineType = \"ISA95EndedStateMachineType\";\n\n        /// <remarks />\n        public const string ISA95EquipmentDataType = \"ISA95EquipmentDataType\";\n\n        /// <remarks />\n        public const string ISA95InterruptedStateMachineType = \"ISA95InterruptedStateMachineType\";\n\n        /// <remarks />\n        public const string ISA95JobOrderAndStateDataType = \"ISA95JobOrderAndStateDataType\";\n\n        /// <remarks />\n        public const string ISA95JobOrderDataType = \"ISA95JobOrderDataType\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverObjectType = \"ISA95JobOrderReceiverObjectType\";\n\n        /// <remarks />\n        public const string ISA95JobOrderReceiverSubStatesType = \"ISA95JobOrderReceiverSubStatesType\";\n\n        /// <remarks />\n        public const string ISA95JobOrderStatusEventType = \"ISA95JobOrderStatusEventType\";\n\n        /// <remarks />\n        public const string ISA95JobResponseDataType = \"ISA95JobResponseDataType\";\n\n        /// <remarks />\n        public const string ISA95JobResponseProviderObjectType = \"ISA95JobResponseProviderObjectType\";\n\n        /// <remarks />\n        public const string ISA95JobResponseReceiverObjectType = \"ISA95JobResponseReceiverObjectType\";\n\n        /// <remarks />\n        public const string ISA95MaterialDataType = \"ISA95MaterialDataType\";\n\n        /// <remarks />\n        public const string ISA95ParameterDataType = \"ISA95ParameterDataType\";\n\n        /// <remarks />\n        public const string ISA95PersonnelDataType = \"ISA95PersonnelDataType\";\n\n        /// <remarks />\n        public const string ISA95PhysicalAssetDataType = \"ISA95PhysicalAssetDataType\";\n\n        /// <remarks />\n        public const string ISA95PrepareStateMachineType = \"ISA95PrepareStateMachineType\";\n\n        /// <remarks />\n        public const string ISA95PropertyDataType = \"ISA95PropertyDataType\";\n\n        /// <remarks />\n        public const string ISA95StateDataType = \"ISA95StateDataType\";\n\n        /// <remarks />\n        public const string ISA95WorkMasterDataType = \"ISA95WorkMasterDataType\";\n\n        /// <remarks />\n        public const string JobOrder = \"JobOrder\";\n\n        /// <remarks />\n        public const string JobOrderList = \"JobOrderList\";\n\n        /// <remarks />\n        public const string JobOrderResponseList = \"JobOrderResponseList\";\n\n        /// <remarks />\n        public const string JobResponse = \"JobResponse\";\n\n        /// <remarks />\n        public const string JobState = \"JobState\";\n\n        /// <remarks />\n        public const string Loaded = \"Loaded\";\n\n        /// <remarks />\n        public const string MaterialClassID = \"MaterialClassID\";\n\n        /// <remarks />\n        public const string MaterialDefinitionID = \"MaterialDefinitionID\";\n\n        /// <remarks />\n        public const string MaxDownloadableJobOrders = \"MaxDownloadableJobOrders\";\n\n        /// <remarks />\n        public const string NotAllowedToStart = \"NotAllowedToStart\";\n\n        /// <remarks />\n        public const string NotAllowedToStartSubstates = \"NotAllowedToStartSubstates\";\n\n        /// <remarks />\n        public const string Pause = \"Pause\";\n\n        /// <remarks />\n        public const string PauseMethodType = \"PauseMethodType\";\n\n        /// <remarks />\n        public const string PersonnelID = \"PersonnelID\";\n\n        /// <remarks />\n        public const string PhysicalAssetID = \"PhysicalAssetID\";\n\n        /// <remarks />\n        public const string Ready = \"Ready\";\n\n        /// <remarks />\n        public const string ReceiveJobResponse = \"ReceiveJobResponse\";\n\n        /// <remarks />\n        public const string ReceiveJobResponseMethodType = \"ReceiveJobResponseMethodType\";\n\n        /// <remarks />\n        public const string RequestJobResponseByJobOrderID = \"RequestJobResponseByJobOrderID\";\n\n        /// <remarks />\n        public const string RequestJobResponseByJobOrderIDMethodType = \"RequestJobResponseByJobOrderIDMethodType\";\n\n        /// <remarks />\n        public const string RequestJobResponseByJobOrderState = \"RequestJobResponseByJobOrderState\";\n\n        /// <remarks />\n        public const string RequestJobResponseByJobOrderStateMethodType = \"RequestJobResponseByJobOrderStateMethodType\";\n\n        /// <remarks />\n        public const string Resume = \"Resume\";\n\n        /// <remarks />\n        public const string ResumeMethodType = \"ResumeMethodType\";\n\n        /// <remarks />\n        public const string RevokeStart = \"RevokeStart\";\n\n        /// <remarks />\n        public const string RevokeStartMethodType = \"RevokeStartMethodType\";\n\n        /// <remarks />\n        public const string Running = \"Running\";\n\n        /// <remarks />\n        public const string Start = \"Start\";\n\n        /// <remarks />\n        public const string StartMethodType = \"StartMethodType\";\n\n        /// <remarks />\n        public const string Stop = \"Stop\";\n\n        /// <remarks />\n        public const string StopMethodType = \"StopMethodType\";\n\n        /// <remarks />\n        public const string Store = \"Store\";\n\n        /// <remarks />\n        public const string StoreAndStart = \"StoreAndStart\";\n\n        /// <remarks />\n        public const string StoreAndStartMethodType = \"StoreAndStartMethodType\";\n\n        /// <remarks />\n        public const string StoreMethodType = \"StoreMethodType\";\n\n        /// <remarks />\n        public const string Suspended = \"Suspended\";\n\n        /// <remarks />\n        public const string Update = \"Update\";\n\n        /// <remarks />\n        public const string UpdateMethodType = \"UpdateMethodType\";\n\n        /// <remarks />\n        public const string Waiting = \"Waiting\";\n\n        /// <remarks />\n        public const string WorkMaster = \"WorkMaster\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <remarks />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the ISA95_JOBCONTROL_V2 namespace (.NET code namespace is 'UAModel.ISA95_JOBCONTROL_V2').\n        /// </summary>\n        public const string ISA95_JOBCONTROL_V2 = \"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\";\n\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.DataTypes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2024 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace UAModel.ISA95_JOBCONTROL_V2\n{\n    #region ISA95EquipmentDataType Class\n#if (!OPCUA_EXCLUDE_ISA95EquipmentDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95EquipmentDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        Description = 0x1,\n        /// <remarks />\n        EquipmentUse = 0x2,\n        /// <remarks />\n        Quantity = 0x4,\n        /// <remarks />\n        EngineeringUnits = 0x8,\n        /// <remarks />\n        Properties = 0x10\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95EquipmentDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95EquipmentDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95EquipmentDataTypeFields.None;\n            m_iD = null;\n            m_description = new LocalizedTextCollection();\n            m_equipmentUse = null;\n            m_quantity = null;\n            m_engineeringUnits = new Opc.Ua.EUInformation();\n            m_properties = new ISA95PropertyDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95EquipmentDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"ID\", IsRequired = false, Order = 1)]\n        public string ID\n        {\n            get { return m_iD; }\n            set { m_iD = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 2)]\n        public LocalizedTextCollection Description\n        {\n            get\n            {\n                return m_description;\n            }\n\n            set\n            {\n                m_description = value;\n\n                if (value == null)\n                {\n                    m_description = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EquipmentUse\", IsRequired = false, Order = 3)]\n        public string EquipmentUse\n        {\n            get { return m_equipmentUse; }\n            set { m_equipmentUse = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Quantity\", IsRequired = false, Order = 4)]\n        public string Quantity\n        {\n            get { return m_quantity; }\n            set { m_quantity = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EngineeringUnits\", IsRequired = false, Order = 5)]\n        public Opc.Ua.EUInformation EngineeringUnits\n        {\n            get\n            {\n                return m_engineeringUnits;\n            }\n\n            set\n            {\n                m_engineeringUnits = value;\n\n                if (value == null)\n                {\n                    m_engineeringUnits = new Opc.Ua.EUInformation();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Properties\", IsRequired = false, Order = 6)]\n        public ISA95PropertyDataTypeCollection Properties\n        {\n            get\n            {\n                return m_properties;\n            }\n\n            set\n            {\n                m_properties = value;\n\n                if (value == null)\n                {\n                    m_properties = new ISA95PropertyDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95EquipmentDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95EquipmentDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95EquipmentDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95EquipmentDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            encoder.WriteString(\"ID\", ID);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Description) != 0) encoder.WriteLocalizedTextArray(\"Description\", Description);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.EquipmentUse) != 0) encoder.WriteString(\"EquipmentUse\", EquipmentUse);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Quantity) != 0) encoder.WriteString(\"Quantity\", Quantity);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.EngineeringUnits) != 0) encoder.WriteEncodeable(\"EngineeringUnits\", EngineeringUnits, typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Properties) != 0) encoder.WriteEncodeableArray(\"Properties\", Properties.ToArray(), typeof(ISA95PropertyDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95EquipmentDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            ID = decoder.ReadString(\"ID\");\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedTextArray(\"Description\");\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.EquipmentUse) != 0) EquipmentUse = decoder.ReadString(\"EquipmentUse\");\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Quantity) != 0) Quantity = decoder.ReadString(\"Quantity\");\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.EngineeringUnits) != 0) EngineeringUnits = (Opc.Ua.EUInformation)decoder.ReadEncodeable(\"EngineeringUnits\", typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Properties) != 0) Properties = (ISA95PropertyDataTypeCollection)decoder.ReadEncodeableArray(\"Properties\", typeof(ISA95PropertyDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95EquipmentDataType value = encodeable as ISA95EquipmentDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if (!Utils.IsEqual(m_iD, value.m_iD)) return false;\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.EquipmentUse) != 0) if (!Utils.IsEqual(m_equipmentUse, value.m_equipmentUse)) return false;\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Quantity) != 0) if (!Utils.IsEqual(m_quantity, value.m_quantity)) return false;\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.EngineeringUnits) != 0) if (!Utils.IsEqual(m_engineeringUnits, value.m_engineeringUnits)) return false;\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Properties) != 0) if (!Utils.IsEqual(m_properties, value.m_properties)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95EquipmentDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95EquipmentDataType clone = (ISA95EquipmentDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            clone.m_iD = (string)Utils.Clone(this.m_iD);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Description) != 0) clone.m_description = (LocalizedTextCollection)Utils.Clone(this.m_description);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.EquipmentUse) != 0) clone.m_equipmentUse = (string)Utils.Clone(this.m_equipmentUse);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Quantity) != 0) clone.m_quantity = (string)Utils.Clone(this.m_quantity);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.EngineeringUnits) != 0) clone.m_engineeringUnits = (Opc.Ua.EUInformation)Utils.Clone(this.m_engineeringUnits);\n            if ((EncodingMask & ISA95EquipmentDataTypeFields.Properties) != 0) clone.m_properties = (ISA95PropertyDataTypeCollection)Utils.Clone(this.m_properties);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_iD;\n        private LocalizedTextCollection m_description;\n        private string m_equipmentUse;\n        private string m_quantity;\n        private Opc.Ua.EUInformation m_engineeringUnits;\n        private ISA95PropertyDataTypeCollection m_properties;\n        #endregion\n    }\n\n    #region ISA95EquipmentDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95EquipmentDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95EquipmentDataType\")]\n    public partial class ISA95EquipmentDataTypeCollection : List<ISA95EquipmentDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95EquipmentDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95EquipmentDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95EquipmentDataTypeCollection(IEnumerable<ISA95EquipmentDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95EquipmentDataTypeCollection(ISA95EquipmentDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95EquipmentDataTypeCollection(values);\n            }\n\n            return new ISA95EquipmentDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95EquipmentDataType[](ISA95EquipmentDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95EquipmentDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95EquipmentDataTypeCollection clone = new ISA95EquipmentDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95EquipmentDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95JobOrderAndStateDataType Class\n#if (!OPCUA_EXCLUDE_ISA95JobOrderAndStateDataType)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95JobOrderAndStateDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobOrderAndStateDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            m_jobOrder = new ISA95JobOrderDataType();\n            m_state = new ISA95StateDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        [DataMember(Name = \"JobOrder\", IsRequired = false, Order = 1)]\n        public ISA95JobOrderDataType JobOrder\n        {\n            get\n            {\n                return m_jobOrder;\n            }\n\n            set\n            {\n                m_jobOrder = value;\n\n                if (value == null)\n                {\n                    m_jobOrder = new ISA95JobOrderDataType();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"State\", IsRequired = false, Order = 2)]\n        public ISA95StateDataTypeCollection State\n        {\n            get\n            {\n                return m_state;\n            }\n\n            set\n            {\n                m_state = value;\n\n                if (value == null)\n                {\n                    m_state = new ISA95StateDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95JobOrderAndStateDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95JobOrderAndStateDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95JobOrderAndStateDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95JobOrderAndStateDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            encoder.WriteEncodeable(\"JobOrder\", JobOrder, typeof(ISA95JobOrderDataType));\n            encoder.WriteEncodeableArray(\"State\", State.ToArray(), typeof(ISA95StateDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            JobOrder = (ISA95JobOrderDataType)decoder.ReadEncodeable(\"JobOrder\", typeof(ISA95JobOrderDataType));\n            State = (ISA95StateDataTypeCollection)decoder.ReadEncodeableArray(\"State\", typeof(ISA95StateDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95JobOrderAndStateDataType value = encodeable as ISA95JobOrderAndStateDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_jobOrder, value.m_jobOrder)) return false;\n            if (!Utils.IsEqual(m_state, value.m_state)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95JobOrderAndStateDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95JobOrderAndStateDataType clone = (ISA95JobOrderAndStateDataType)base.MemberwiseClone();\n\n            clone.m_jobOrder = (ISA95JobOrderDataType)Utils.Clone(this.m_jobOrder);\n            clone.m_state = (ISA95StateDataTypeCollection)Utils.Clone(this.m_state);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private ISA95JobOrderDataType m_jobOrder;\n        private ISA95StateDataTypeCollection m_state;\n        #endregion\n    }\n\n    #region ISA95JobOrderAndStateDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95JobOrderAndStateDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95JobOrderAndStateDataType\")]\n    public partial class ISA95JobOrderAndStateDataTypeCollection : List<ISA95JobOrderAndStateDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobOrderAndStateDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95JobOrderAndStateDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95JobOrderAndStateDataTypeCollection(IEnumerable<ISA95JobOrderAndStateDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95JobOrderAndStateDataTypeCollection(ISA95JobOrderAndStateDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95JobOrderAndStateDataTypeCollection(values);\n            }\n\n            return new ISA95JobOrderAndStateDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95JobOrderAndStateDataType[](ISA95JobOrderAndStateDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95JobOrderAndStateDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95JobOrderAndStateDataTypeCollection clone = new ISA95JobOrderAndStateDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95JobOrderAndStateDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95JobOrderDataType Class\n#if (!OPCUA_EXCLUDE_ISA95JobOrderDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95JobOrderDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        Description = 0x1,\n        /// <remarks />\n        WorkMasterID = 0x2,\n        /// <remarks />\n        StartTime = 0x4,\n        /// <remarks />\n        EndTime = 0x8,\n        /// <remarks />\n        Priority = 0x10,\n        /// <remarks />\n        JobOrderParameters = 0x20,\n        /// <remarks />\n        PersonnelRequirements = 0x40,\n        /// <remarks />\n        EquipmentRequirements = 0x80,\n        /// <remarks />\n        PhysicalAssetRequirements = 0x100,\n        /// <remarks />\n        MaterialRequirements = 0x200\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95JobOrderDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobOrderDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95JobOrderDataTypeFields.None;\n            m_jobOrderID = null;\n            m_description = new LocalizedTextCollection();\n            m_workMasterID = new ISA95WorkMasterDataTypeCollection();\n            m_startTime = DateTime.MinValue;\n            m_endTime = DateTime.MinValue;\n            m_priority = (short)0;\n            m_jobOrderParameters = new ISA95ParameterDataTypeCollection();\n            m_personnelRequirements = new ISA95PersonnelDataTypeCollection();\n            m_equipmentRequirements = new ISA95EquipmentDataTypeCollection();\n            m_physicalAssetRequirements = new ISA95PhysicalAssetDataTypeCollection();\n            m_materialRequirements = new ISA95MaterialDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95JobOrderDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"JobOrderID\", IsRequired = false, Order = 1)]\n        public string JobOrderID\n        {\n            get { return m_jobOrderID; }\n            set { m_jobOrderID = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 2)]\n        public LocalizedTextCollection Description\n        {\n            get\n            {\n                return m_description;\n            }\n\n            set\n            {\n                m_description = value;\n\n                if (value == null)\n                {\n                    m_description = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"WorkMasterID\", IsRequired = false, Order = 3)]\n        public ISA95WorkMasterDataTypeCollection WorkMasterID\n        {\n            get\n            {\n                return m_workMasterID;\n            }\n\n            set\n            {\n                m_workMasterID = value;\n\n                if (value == null)\n                {\n                    m_workMasterID = new ISA95WorkMasterDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StartTime\", IsRequired = false, Order = 4)]\n        public DateTime StartTime\n        {\n            get { return m_startTime; }\n            set { m_startTime = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EndTime\", IsRequired = false, Order = 5)]\n        public DateTime EndTime\n        {\n            get { return m_endTime; }\n            set { m_endTime = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Priority\", IsRequired = false, Order = 6)]\n        public short Priority\n        {\n            get { return m_priority; }\n            set { m_priority = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"JobOrderParameters\", IsRequired = false, Order = 7)]\n        public ISA95ParameterDataTypeCollection JobOrderParameters\n        {\n            get\n            {\n                return m_jobOrderParameters;\n            }\n\n            set\n            {\n                m_jobOrderParameters = value;\n\n                if (value == null)\n                {\n                    m_jobOrderParameters = new ISA95ParameterDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"PersonnelRequirements\", IsRequired = false, Order = 8)]\n        public ISA95PersonnelDataTypeCollection PersonnelRequirements\n        {\n            get\n            {\n                return m_personnelRequirements;\n            }\n\n            set\n            {\n                m_personnelRequirements = value;\n\n                if (value == null)\n                {\n                    m_personnelRequirements = new ISA95PersonnelDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EquipmentRequirements\", IsRequired = false, Order = 9)]\n        public ISA95EquipmentDataTypeCollection EquipmentRequirements\n        {\n            get\n            {\n                return m_equipmentRequirements;\n            }\n\n            set\n            {\n                m_equipmentRequirements = value;\n\n                if (value == null)\n                {\n                    m_equipmentRequirements = new ISA95EquipmentDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"PhysicalAssetRequirements\", IsRequired = false, Order = 10)]\n        public ISA95PhysicalAssetDataTypeCollection PhysicalAssetRequirements\n        {\n            get\n            {\n                return m_physicalAssetRequirements;\n            }\n\n            set\n            {\n                m_physicalAssetRequirements = value;\n\n                if (value == null)\n                {\n                    m_physicalAssetRequirements = new ISA95PhysicalAssetDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"MaterialRequirements\", IsRequired = false, Order = 11)]\n        public ISA95MaterialDataTypeCollection MaterialRequirements\n        {\n            get\n            {\n                return m_materialRequirements;\n            }\n\n            set\n            {\n                m_materialRequirements = value;\n\n                if (value == null)\n                {\n                    m_materialRequirements = new ISA95MaterialDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95JobOrderDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95JobOrderDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95JobOrderDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95JobOrderDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            encoder.WriteString(\"JobOrderID\", JobOrderID);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.Description) != 0) encoder.WriteLocalizedTextArray(\"Description\", Description);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.WorkMasterID) != 0) encoder.WriteEncodeableArray(\"WorkMasterID\", WorkMasterID.ToArray(), typeof(ISA95WorkMasterDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.StartTime) != 0) encoder.WriteDateTime(\"StartTime\", StartTime);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.EndTime) != 0) encoder.WriteDateTime(\"EndTime\", EndTime);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.Priority) != 0) encoder.WriteInt16(\"Priority\", Priority);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.JobOrderParameters) != 0) encoder.WriteEncodeableArray(\"JobOrderParameters\", JobOrderParameters.ToArray(), typeof(ISA95ParameterDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.PersonnelRequirements) != 0) encoder.WriteEncodeableArray(\"PersonnelRequirements\", PersonnelRequirements.ToArray(), typeof(ISA95PersonnelDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.EquipmentRequirements) != 0) encoder.WriteEncodeableArray(\"EquipmentRequirements\", EquipmentRequirements.ToArray(), typeof(ISA95EquipmentDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.PhysicalAssetRequirements) != 0) encoder.WriteEncodeableArray(\"PhysicalAssetRequirements\", PhysicalAssetRequirements.ToArray(), typeof(ISA95PhysicalAssetDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.MaterialRequirements) != 0) encoder.WriteEncodeableArray(\"MaterialRequirements\", MaterialRequirements.ToArray(), typeof(ISA95MaterialDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95JobOrderDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            JobOrderID = decoder.ReadString(\"JobOrderID\");\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedTextArray(\"Description\");\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.WorkMasterID) != 0) WorkMasterID = (ISA95WorkMasterDataTypeCollection)decoder.ReadEncodeableArray(\"WorkMasterID\", typeof(ISA95WorkMasterDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.StartTime) != 0) StartTime = decoder.ReadDateTime(\"StartTime\");\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.EndTime) != 0) EndTime = decoder.ReadDateTime(\"EndTime\");\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.Priority) != 0) Priority = decoder.ReadInt16(\"Priority\");\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.JobOrderParameters) != 0) JobOrderParameters = (ISA95ParameterDataTypeCollection)decoder.ReadEncodeableArray(\"JobOrderParameters\", typeof(ISA95ParameterDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.PersonnelRequirements) != 0) PersonnelRequirements = (ISA95PersonnelDataTypeCollection)decoder.ReadEncodeableArray(\"PersonnelRequirements\", typeof(ISA95PersonnelDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.EquipmentRequirements) != 0) EquipmentRequirements = (ISA95EquipmentDataTypeCollection)decoder.ReadEncodeableArray(\"EquipmentRequirements\", typeof(ISA95EquipmentDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.PhysicalAssetRequirements) != 0) PhysicalAssetRequirements = (ISA95PhysicalAssetDataTypeCollection)decoder.ReadEncodeableArray(\"PhysicalAssetRequirements\", typeof(ISA95PhysicalAssetDataType));\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.MaterialRequirements) != 0) MaterialRequirements = (ISA95MaterialDataTypeCollection)decoder.ReadEncodeableArray(\"MaterialRequirements\", typeof(ISA95MaterialDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95JobOrderDataType value = encodeable as ISA95JobOrderDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if (!Utils.IsEqual(m_jobOrderID, value.m_jobOrderID)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.WorkMasterID) != 0) if (!Utils.IsEqual(m_workMasterID, value.m_workMasterID)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.StartTime) != 0) if (!Utils.IsEqual(m_startTime, value.m_startTime)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.EndTime) != 0) if (!Utils.IsEqual(m_endTime, value.m_endTime)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.Priority) != 0) if (!Utils.IsEqual(m_priority, value.m_priority)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.JobOrderParameters) != 0) if (!Utils.IsEqual(m_jobOrderParameters, value.m_jobOrderParameters)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.PersonnelRequirements) != 0) if (!Utils.IsEqual(m_personnelRequirements, value.m_personnelRequirements)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.EquipmentRequirements) != 0) if (!Utils.IsEqual(m_equipmentRequirements, value.m_equipmentRequirements)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.PhysicalAssetRequirements) != 0) if (!Utils.IsEqual(m_physicalAssetRequirements, value.m_physicalAssetRequirements)) return false;\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.MaterialRequirements) != 0) if (!Utils.IsEqual(m_materialRequirements, value.m_materialRequirements)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95JobOrderDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95JobOrderDataType clone = (ISA95JobOrderDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            clone.m_jobOrderID = (string)Utils.Clone(this.m_jobOrderID);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.Description) != 0) clone.m_description = (LocalizedTextCollection)Utils.Clone(this.m_description);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.WorkMasterID) != 0) clone.m_workMasterID = (ISA95WorkMasterDataTypeCollection)Utils.Clone(this.m_workMasterID);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.StartTime) != 0) clone.m_startTime = (DateTime)Utils.Clone(this.m_startTime);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.EndTime) != 0) clone.m_endTime = (DateTime)Utils.Clone(this.m_endTime);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.Priority) != 0) clone.m_priority = (short)Utils.Clone(this.m_priority);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.JobOrderParameters) != 0) clone.m_jobOrderParameters = (ISA95ParameterDataTypeCollection)Utils.Clone(this.m_jobOrderParameters);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.PersonnelRequirements) != 0) clone.m_personnelRequirements = (ISA95PersonnelDataTypeCollection)Utils.Clone(this.m_personnelRequirements);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.EquipmentRequirements) != 0) clone.m_equipmentRequirements = (ISA95EquipmentDataTypeCollection)Utils.Clone(this.m_equipmentRequirements);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.PhysicalAssetRequirements) != 0) clone.m_physicalAssetRequirements = (ISA95PhysicalAssetDataTypeCollection)Utils.Clone(this.m_physicalAssetRequirements);\n            if ((EncodingMask & ISA95JobOrderDataTypeFields.MaterialRequirements) != 0) clone.m_materialRequirements = (ISA95MaterialDataTypeCollection)Utils.Clone(this.m_materialRequirements);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_jobOrderID;\n        private LocalizedTextCollection m_description;\n        private ISA95WorkMasterDataTypeCollection m_workMasterID;\n        private DateTime m_startTime;\n        private DateTime m_endTime;\n        private short m_priority;\n        private ISA95ParameterDataTypeCollection m_jobOrderParameters;\n        private ISA95PersonnelDataTypeCollection m_personnelRequirements;\n        private ISA95EquipmentDataTypeCollection m_equipmentRequirements;\n        private ISA95PhysicalAssetDataTypeCollection m_physicalAssetRequirements;\n        private ISA95MaterialDataTypeCollection m_materialRequirements;\n        #endregion\n    }\n\n    #region ISA95JobOrderDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95JobOrderDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95JobOrderDataType\")]\n    public partial class ISA95JobOrderDataTypeCollection : List<ISA95JobOrderDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobOrderDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95JobOrderDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95JobOrderDataTypeCollection(IEnumerable<ISA95JobOrderDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95JobOrderDataTypeCollection(ISA95JobOrderDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95JobOrderDataTypeCollection(values);\n            }\n\n            return new ISA95JobOrderDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95JobOrderDataType[](ISA95JobOrderDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95JobOrderDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95JobOrderDataTypeCollection clone = new ISA95JobOrderDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95JobOrderDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95JobResponseDataType Class\n#if (!OPCUA_EXCLUDE_ISA95JobResponseDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95JobResponseDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        Description = 0x1,\n        /// <remarks />\n        StartTime = 0x2,\n        /// <remarks />\n        EndTime = 0x4,\n        /// <remarks />\n        JobResponseData = 0x8,\n        /// <remarks />\n        PersonnelActuals = 0x10,\n        /// <remarks />\n        EquipmentActuals = 0x20,\n        /// <remarks />\n        PhysicalAssetActuals = 0x40,\n        /// <remarks />\n        MaterialActuals = 0x80\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95JobResponseDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobResponseDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95JobResponseDataTypeFields.None;\n            m_jobResponseID = null;\n            m_description = null;\n            m_jobOrderID = null;\n            m_startTime = DateTime.MinValue;\n            m_endTime = DateTime.MinValue;\n            m_jobState = new ISA95StateDataTypeCollection();\n            m_jobResponseData = new ISA95ParameterDataTypeCollection();\n            m_personnelActuals = new ISA95PersonnelDataTypeCollection();\n            m_equipmentActuals = new ISA95EquipmentDataTypeCollection();\n            m_physicalAssetActuals = new ISA95PhysicalAssetDataTypeCollection();\n            m_materialActuals = new ISA95MaterialDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95JobResponseDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"JobResponseID\", IsRequired = false, Order = 1)]\n        public string JobResponseID\n        {\n            get { return m_jobResponseID; }\n            set { m_jobResponseID = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 2)]\n        public LocalizedText Description\n        {\n            get { return m_description; }\n            set { m_description = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"JobOrderID\", IsRequired = false, Order = 3)]\n        public string JobOrderID\n        {\n            get { return m_jobOrderID; }\n            set { m_jobOrderID = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StartTime\", IsRequired = false, Order = 4)]\n        public DateTime StartTime\n        {\n            get { return m_startTime; }\n            set { m_startTime = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EndTime\", IsRequired = false, Order = 5)]\n        public DateTime EndTime\n        {\n            get { return m_endTime; }\n            set { m_endTime = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"JobState\", IsRequired = false, Order = 6)]\n        public ISA95StateDataTypeCollection JobState\n        {\n            get\n            {\n                return m_jobState;\n            }\n\n            set\n            {\n                m_jobState = value;\n\n                if (value == null)\n                {\n                    m_jobState = new ISA95StateDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"JobResponseData\", IsRequired = false, Order = 7)]\n        public ISA95ParameterDataTypeCollection JobResponseData\n        {\n            get\n            {\n                return m_jobResponseData;\n            }\n\n            set\n            {\n                m_jobResponseData = value;\n\n                if (value == null)\n                {\n                    m_jobResponseData = new ISA95ParameterDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"PersonnelActuals\", IsRequired = false, Order = 8)]\n        public ISA95PersonnelDataTypeCollection PersonnelActuals\n        {\n            get\n            {\n                return m_personnelActuals;\n            }\n\n            set\n            {\n                m_personnelActuals = value;\n\n                if (value == null)\n                {\n                    m_personnelActuals = new ISA95PersonnelDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EquipmentActuals\", IsRequired = false, Order = 9)]\n        public ISA95EquipmentDataTypeCollection EquipmentActuals\n        {\n            get\n            {\n                return m_equipmentActuals;\n            }\n\n            set\n            {\n                m_equipmentActuals = value;\n\n                if (value == null)\n                {\n                    m_equipmentActuals = new ISA95EquipmentDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"PhysicalAssetActuals\", IsRequired = false, Order = 10)]\n        public ISA95PhysicalAssetDataTypeCollection PhysicalAssetActuals\n        {\n            get\n            {\n                return m_physicalAssetActuals;\n            }\n\n            set\n            {\n                m_physicalAssetActuals = value;\n\n                if (value == null)\n                {\n                    m_physicalAssetActuals = new ISA95PhysicalAssetDataTypeCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"MaterialActuals\", IsRequired = false, Order = 11)]\n        public ISA95MaterialDataTypeCollection MaterialActuals\n        {\n            get\n            {\n                return m_materialActuals;\n            }\n\n            set\n            {\n                m_materialActuals = value;\n\n                if (value == null)\n                {\n                    m_materialActuals = new ISA95MaterialDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95JobResponseDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95JobResponseDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95JobResponseDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95JobResponseDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            encoder.WriteString(\"JobResponseID\", JobResponseID);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.Description) != 0) encoder.WriteLocalizedText(\"Description\", Description);\n            encoder.WriteString(\"JobOrderID\", JobOrderID);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.StartTime) != 0) encoder.WriteDateTime(\"StartTime\", StartTime);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.EndTime) != 0) encoder.WriteDateTime(\"EndTime\", EndTime);\n            encoder.WriteEncodeableArray(\"JobState\", JobState.ToArray(), typeof(ISA95StateDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.JobResponseData) != 0) encoder.WriteEncodeableArray(\"JobResponseData\", JobResponseData.ToArray(), typeof(ISA95ParameterDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.PersonnelActuals) != 0) encoder.WriteEncodeableArray(\"PersonnelActuals\", PersonnelActuals.ToArray(), typeof(ISA95PersonnelDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.EquipmentActuals) != 0) encoder.WriteEncodeableArray(\"EquipmentActuals\", EquipmentActuals.ToArray(), typeof(ISA95EquipmentDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.PhysicalAssetActuals) != 0) encoder.WriteEncodeableArray(\"PhysicalAssetActuals\", PhysicalAssetActuals.ToArray(), typeof(ISA95PhysicalAssetDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.MaterialActuals) != 0) encoder.WriteEncodeableArray(\"MaterialActuals\", MaterialActuals.ToArray(), typeof(ISA95MaterialDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95JobResponseDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            JobResponseID = decoder.ReadString(\"JobResponseID\");\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedText(\"Description\");\n            JobOrderID = decoder.ReadString(\"JobOrderID\");\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.StartTime) != 0) StartTime = decoder.ReadDateTime(\"StartTime\");\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.EndTime) != 0) EndTime = decoder.ReadDateTime(\"EndTime\");\n            JobState = (ISA95StateDataTypeCollection)decoder.ReadEncodeableArray(\"JobState\", typeof(ISA95StateDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.JobResponseData) != 0) JobResponseData = (ISA95ParameterDataTypeCollection)decoder.ReadEncodeableArray(\"JobResponseData\", typeof(ISA95ParameterDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.PersonnelActuals) != 0) PersonnelActuals = (ISA95PersonnelDataTypeCollection)decoder.ReadEncodeableArray(\"PersonnelActuals\", typeof(ISA95PersonnelDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.EquipmentActuals) != 0) EquipmentActuals = (ISA95EquipmentDataTypeCollection)decoder.ReadEncodeableArray(\"EquipmentActuals\", typeof(ISA95EquipmentDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.PhysicalAssetActuals) != 0) PhysicalAssetActuals = (ISA95PhysicalAssetDataTypeCollection)decoder.ReadEncodeableArray(\"PhysicalAssetActuals\", typeof(ISA95PhysicalAssetDataType));\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.MaterialActuals) != 0) MaterialActuals = (ISA95MaterialDataTypeCollection)decoder.ReadEncodeableArray(\"MaterialActuals\", typeof(ISA95MaterialDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95JobResponseDataType value = encodeable as ISA95JobResponseDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if (!Utils.IsEqual(m_jobResponseID, value.m_jobResponseID)) return false;\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if (!Utils.IsEqual(m_jobOrderID, value.m_jobOrderID)) return false;\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.StartTime) != 0) if (!Utils.IsEqual(m_startTime, value.m_startTime)) return false;\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.EndTime) != 0) if (!Utils.IsEqual(m_endTime, value.m_endTime)) return false;\n            if (!Utils.IsEqual(m_jobState, value.m_jobState)) return false;\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.JobResponseData) != 0) if (!Utils.IsEqual(m_jobResponseData, value.m_jobResponseData)) return false;\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.PersonnelActuals) != 0) if (!Utils.IsEqual(m_personnelActuals, value.m_personnelActuals)) return false;\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.EquipmentActuals) != 0) if (!Utils.IsEqual(m_equipmentActuals, value.m_equipmentActuals)) return false;\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.PhysicalAssetActuals) != 0) if (!Utils.IsEqual(m_physicalAssetActuals, value.m_physicalAssetActuals)) return false;\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.MaterialActuals) != 0) if (!Utils.IsEqual(m_materialActuals, value.m_materialActuals)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95JobResponseDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95JobResponseDataType clone = (ISA95JobResponseDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            clone.m_jobResponseID = (string)Utils.Clone(this.m_jobResponseID);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.Description) != 0) clone.m_description = (LocalizedText)Utils.Clone(this.m_description);\n            clone.m_jobOrderID = (string)Utils.Clone(this.m_jobOrderID);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.StartTime) != 0) clone.m_startTime = (DateTime)Utils.Clone(this.m_startTime);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.EndTime) != 0) clone.m_endTime = (DateTime)Utils.Clone(this.m_endTime);\n            clone.m_jobState = (ISA95StateDataTypeCollection)Utils.Clone(this.m_jobState);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.JobResponseData) != 0) clone.m_jobResponseData = (ISA95ParameterDataTypeCollection)Utils.Clone(this.m_jobResponseData);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.PersonnelActuals) != 0) clone.m_personnelActuals = (ISA95PersonnelDataTypeCollection)Utils.Clone(this.m_personnelActuals);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.EquipmentActuals) != 0) clone.m_equipmentActuals = (ISA95EquipmentDataTypeCollection)Utils.Clone(this.m_equipmentActuals);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.PhysicalAssetActuals) != 0) clone.m_physicalAssetActuals = (ISA95PhysicalAssetDataTypeCollection)Utils.Clone(this.m_physicalAssetActuals);\n            if ((EncodingMask & ISA95JobResponseDataTypeFields.MaterialActuals) != 0) clone.m_materialActuals = (ISA95MaterialDataTypeCollection)Utils.Clone(this.m_materialActuals);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_jobResponseID;\n        private LocalizedText m_description;\n        private string m_jobOrderID;\n        private DateTime m_startTime;\n        private DateTime m_endTime;\n        private ISA95StateDataTypeCollection m_jobState;\n        private ISA95ParameterDataTypeCollection m_jobResponseData;\n        private ISA95PersonnelDataTypeCollection m_personnelActuals;\n        private ISA95EquipmentDataTypeCollection m_equipmentActuals;\n        private ISA95PhysicalAssetDataTypeCollection m_physicalAssetActuals;\n        private ISA95MaterialDataTypeCollection m_materialActuals;\n        #endregion\n    }\n\n    #region ISA95JobResponseDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95JobResponseDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95JobResponseDataType\")]\n    public partial class ISA95JobResponseDataTypeCollection : List<ISA95JobResponseDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95JobResponseDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95JobResponseDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95JobResponseDataTypeCollection(IEnumerable<ISA95JobResponseDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95JobResponseDataTypeCollection(ISA95JobResponseDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95JobResponseDataTypeCollection(values);\n            }\n\n            return new ISA95JobResponseDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95JobResponseDataType[](ISA95JobResponseDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95JobResponseDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95JobResponseDataTypeCollection clone = new ISA95JobResponseDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95JobResponseDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95MaterialDataType Class\n#if (!OPCUA_EXCLUDE_ISA95MaterialDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95MaterialDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        MaterialClassID = 0x1,\n        /// <remarks />\n        MaterialDefinitionID = 0x2,\n        /// <remarks />\n        MaterialLotID = 0x4,\n        /// <remarks />\n        MaterialSublotID = 0x8,\n        /// <remarks />\n        Description = 0x10,\n        /// <remarks />\n        MaterialUse = 0x20,\n        /// <remarks />\n        Quantity = 0x40,\n        /// <remarks />\n        EngineeringUnits = 0x80,\n        /// <remarks />\n        Properties = 0x100\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95MaterialDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95MaterialDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95MaterialDataTypeFields.None;\n            m_materialClassID = null;\n            m_materialDefinitionID = null;\n            m_materialLotID = null;\n            m_materialSublotID = null;\n            m_description = new LocalizedTextCollection();\n            m_materialUse = null;\n            m_quantity = null;\n            m_engineeringUnits = new Opc.Ua.EUInformation();\n            m_properties = new ISA95PropertyDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95MaterialDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"MaterialClassID\", IsRequired = false, Order = 1)]\n        public string MaterialClassID\n        {\n            get { return m_materialClassID; }\n            set { m_materialClassID = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"MaterialDefinitionID\", IsRequired = false, Order = 2)]\n        public string MaterialDefinitionID\n        {\n            get { return m_materialDefinitionID; }\n            set { m_materialDefinitionID = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"MaterialLotID\", IsRequired = false, Order = 3)]\n        public string MaterialLotID\n        {\n            get { return m_materialLotID; }\n            set { m_materialLotID = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"MaterialSublotID\", IsRequired = false, Order = 4)]\n        public string MaterialSublotID\n        {\n            get { return m_materialSublotID; }\n            set { m_materialSublotID = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 5)]\n        public LocalizedTextCollection Description\n        {\n            get\n            {\n                return m_description;\n            }\n\n            set\n            {\n                m_description = value;\n\n                if (value == null)\n                {\n                    m_description = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"MaterialUse\", IsRequired = false, Order = 6)]\n        public string MaterialUse\n        {\n            get { return m_materialUse; }\n            set { m_materialUse = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Quantity\", IsRequired = false, Order = 7)]\n        public string Quantity\n        {\n            get { return m_quantity; }\n            set { m_quantity = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EngineeringUnits\", IsRequired = false, Order = 8)]\n        public Opc.Ua.EUInformation EngineeringUnits\n        {\n            get\n            {\n                return m_engineeringUnits;\n            }\n\n            set\n            {\n                m_engineeringUnits = value;\n\n                if (value == null)\n                {\n                    m_engineeringUnits = new Opc.Ua.EUInformation();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Properties\", IsRequired = false, Order = 9)]\n        public ISA95PropertyDataTypeCollection Properties\n        {\n            get\n            {\n                return m_properties;\n            }\n\n            set\n            {\n                m_properties = value;\n\n                if (value == null)\n                {\n                    m_properties = new ISA95PropertyDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95MaterialDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95MaterialDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95MaterialDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95MaterialDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialClassID) != 0) encoder.WriteString(\"MaterialClassID\", MaterialClassID);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialDefinitionID) != 0) encoder.WriteString(\"MaterialDefinitionID\", MaterialDefinitionID);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialLotID) != 0) encoder.WriteString(\"MaterialLotID\", MaterialLotID);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialSublotID) != 0) encoder.WriteString(\"MaterialSublotID\", MaterialSublotID);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Description) != 0) encoder.WriteLocalizedTextArray(\"Description\", Description);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialUse) != 0) encoder.WriteString(\"MaterialUse\", MaterialUse);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Quantity) != 0) encoder.WriteString(\"Quantity\", Quantity);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.EngineeringUnits) != 0) encoder.WriteEncodeable(\"EngineeringUnits\", EngineeringUnits, typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Properties) != 0) encoder.WriteEncodeableArray(\"Properties\", Properties.ToArray(), typeof(ISA95PropertyDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95MaterialDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialClassID) != 0) MaterialClassID = decoder.ReadString(\"MaterialClassID\");\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialDefinitionID) != 0) MaterialDefinitionID = decoder.ReadString(\"MaterialDefinitionID\");\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialLotID) != 0) MaterialLotID = decoder.ReadString(\"MaterialLotID\");\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialSublotID) != 0) MaterialSublotID = decoder.ReadString(\"MaterialSublotID\");\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedTextArray(\"Description\");\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialUse) != 0) MaterialUse = decoder.ReadString(\"MaterialUse\");\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Quantity) != 0) Quantity = decoder.ReadString(\"Quantity\");\n            if ((EncodingMask & ISA95MaterialDataTypeFields.EngineeringUnits) != 0) EngineeringUnits = (Opc.Ua.EUInformation)decoder.ReadEncodeable(\"EngineeringUnits\", typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Properties) != 0) Properties = (ISA95PropertyDataTypeCollection)decoder.ReadEncodeableArray(\"Properties\", typeof(ISA95PropertyDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95MaterialDataType value = encodeable as ISA95MaterialDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialClassID) != 0) if (!Utils.IsEqual(m_materialClassID, value.m_materialClassID)) return false;\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialDefinitionID) != 0) if (!Utils.IsEqual(m_materialDefinitionID, value.m_materialDefinitionID)) return false;\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialLotID) != 0) if (!Utils.IsEqual(m_materialLotID, value.m_materialLotID)) return false;\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialSublotID) != 0) if (!Utils.IsEqual(m_materialSublotID, value.m_materialSublotID)) return false;\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialUse) != 0) if (!Utils.IsEqual(m_materialUse, value.m_materialUse)) return false;\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Quantity) != 0) if (!Utils.IsEqual(m_quantity, value.m_quantity)) return false;\n            if ((EncodingMask & ISA95MaterialDataTypeFields.EngineeringUnits) != 0) if (!Utils.IsEqual(m_engineeringUnits, value.m_engineeringUnits)) return false;\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Properties) != 0) if (!Utils.IsEqual(m_properties, value.m_properties)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95MaterialDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95MaterialDataType clone = (ISA95MaterialDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialClassID) != 0) clone.m_materialClassID = (string)Utils.Clone(this.m_materialClassID);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialDefinitionID) != 0) clone.m_materialDefinitionID = (string)Utils.Clone(this.m_materialDefinitionID);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialLotID) != 0) clone.m_materialLotID = (string)Utils.Clone(this.m_materialLotID);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialSublotID) != 0) clone.m_materialSublotID = (string)Utils.Clone(this.m_materialSublotID);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Description) != 0) clone.m_description = (LocalizedTextCollection)Utils.Clone(this.m_description);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.MaterialUse) != 0) clone.m_materialUse = (string)Utils.Clone(this.m_materialUse);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Quantity) != 0) clone.m_quantity = (string)Utils.Clone(this.m_quantity);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.EngineeringUnits) != 0) clone.m_engineeringUnits = (Opc.Ua.EUInformation)Utils.Clone(this.m_engineeringUnits);\n            if ((EncodingMask & ISA95MaterialDataTypeFields.Properties) != 0) clone.m_properties = (ISA95PropertyDataTypeCollection)Utils.Clone(this.m_properties);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_materialClassID;\n        private string m_materialDefinitionID;\n        private string m_materialLotID;\n        private string m_materialSublotID;\n        private LocalizedTextCollection m_description;\n        private string m_materialUse;\n        private string m_quantity;\n        private Opc.Ua.EUInformation m_engineeringUnits;\n        private ISA95PropertyDataTypeCollection m_properties;\n        #endregion\n    }\n\n    #region ISA95MaterialDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95MaterialDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95MaterialDataType\")]\n    public partial class ISA95MaterialDataTypeCollection : List<ISA95MaterialDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95MaterialDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95MaterialDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95MaterialDataTypeCollection(IEnumerable<ISA95MaterialDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95MaterialDataTypeCollection(ISA95MaterialDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95MaterialDataTypeCollection(values);\n            }\n\n            return new ISA95MaterialDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95MaterialDataType[](ISA95MaterialDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95MaterialDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95MaterialDataTypeCollection clone = new ISA95MaterialDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95MaterialDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95ParameterDataType Class\n#if (!OPCUA_EXCLUDE_ISA95ParameterDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95ParameterDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        Description = 0x1,\n        /// <remarks />\n        EngineeringUnits = 0x2,\n        /// <remarks />\n        Subparameters = 0x4\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95ParameterDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95ParameterDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95ParameterDataTypeFields.None;\n            m_iD = null;\n            m_value = Variant.Null;\n            m_description = new LocalizedTextCollection();\n            m_engineeringUnits = new Opc.Ua.EUInformation();\n            m_subparameters = new ISA95ParameterDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95ParameterDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"ID\", IsRequired = false, Order = 1)]\n        public string ID\n        {\n            get { return m_iD; }\n            set { m_iD = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Value\", IsRequired = false, Order = 2)]\n        public Variant Value\n        {\n            get { return m_value; }\n            set { m_value = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 3)]\n        public LocalizedTextCollection Description\n        {\n            get\n            {\n                return m_description;\n            }\n\n            set\n            {\n                m_description = value;\n\n                if (value == null)\n                {\n                    m_description = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EngineeringUnits\", IsRequired = false, Order = 4)]\n        public Opc.Ua.EUInformation EngineeringUnits\n        {\n            get\n            {\n                return m_engineeringUnits;\n            }\n\n            set\n            {\n                m_engineeringUnits = value;\n\n                if (value == null)\n                {\n                    m_engineeringUnits = new Opc.Ua.EUInformation();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Subparameters\", IsRequired = false, Order = 5)]\n        public ISA95ParameterDataTypeCollection Subparameters\n        {\n            get\n            {\n                return m_subparameters;\n            }\n\n            set\n            {\n                m_subparameters = value;\n\n                if (value == null)\n                {\n                    m_subparameters = new ISA95ParameterDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95ParameterDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95ParameterDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95ParameterDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95ParameterDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            encoder.WriteString(\"ID\", ID);\n            encoder.WriteVariant(\"Value\", Value);\n            if ((EncodingMask & ISA95ParameterDataTypeFields.Description) != 0) encoder.WriteLocalizedTextArray(\"Description\", Description);\n            if ((EncodingMask & ISA95ParameterDataTypeFields.EngineeringUnits) != 0) encoder.WriteEncodeable(\"EngineeringUnits\", EngineeringUnits, typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95ParameterDataTypeFields.Subparameters) != 0) encoder.WriteEncodeableArray(\"Subparameters\", Subparameters.ToArray(), typeof(ISA95ParameterDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95ParameterDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            ID = decoder.ReadString(\"ID\");\n            Value = decoder.ReadVariant(\"Value\");\n            if ((EncodingMask & ISA95ParameterDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedTextArray(\"Description\");\n            if ((EncodingMask & ISA95ParameterDataTypeFields.EngineeringUnits) != 0) EngineeringUnits = (Opc.Ua.EUInformation)decoder.ReadEncodeable(\"EngineeringUnits\", typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95ParameterDataTypeFields.Subparameters) != 0) Subparameters = (ISA95ParameterDataTypeCollection)decoder.ReadEncodeableArray(\"Subparameters\", typeof(ISA95ParameterDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95ParameterDataType value = encodeable as ISA95ParameterDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if (!Utils.IsEqual(m_iD, value.m_iD)) return false;\n            if (!Utils.IsEqual(m_value, value.m_value)) return false;\n            if ((EncodingMask & ISA95ParameterDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if ((EncodingMask & ISA95ParameterDataTypeFields.EngineeringUnits) != 0) if (!Utils.IsEqual(m_engineeringUnits, value.m_engineeringUnits)) return false;\n            if ((EncodingMask & ISA95ParameterDataTypeFields.Subparameters) != 0) if (!Utils.IsEqual(m_subparameters, value.m_subparameters)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95ParameterDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95ParameterDataType clone = (ISA95ParameterDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            clone.m_iD = (string)Utils.Clone(this.m_iD);\n            clone.m_value = (Variant)Utils.Clone(this.m_value);\n            if ((EncodingMask & ISA95ParameterDataTypeFields.Description) != 0) clone.m_description = (LocalizedTextCollection)Utils.Clone(this.m_description);\n            if ((EncodingMask & ISA95ParameterDataTypeFields.EngineeringUnits) != 0) clone.m_engineeringUnits = (Opc.Ua.EUInformation)Utils.Clone(this.m_engineeringUnits);\n            if ((EncodingMask & ISA95ParameterDataTypeFields.Subparameters) != 0) clone.m_subparameters = (ISA95ParameterDataTypeCollection)Utils.Clone(this.m_subparameters);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_iD;\n        private Variant m_value;\n        private LocalizedTextCollection m_description;\n        private Opc.Ua.EUInformation m_engineeringUnits;\n        private ISA95ParameterDataTypeCollection m_subparameters;\n        #endregion\n    }\n\n    #region ISA95ParameterDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95ParameterDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95ParameterDataType\")]\n    public partial class ISA95ParameterDataTypeCollection : List<ISA95ParameterDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95ParameterDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95ParameterDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95ParameterDataTypeCollection(IEnumerable<ISA95ParameterDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95ParameterDataTypeCollection(ISA95ParameterDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95ParameterDataTypeCollection(values);\n            }\n\n            return new ISA95ParameterDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95ParameterDataType[](ISA95ParameterDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95ParameterDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95ParameterDataTypeCollection clone = new ISA95ParameterDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95ParameterDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95PersonnelDataType Class\n#if (!OPCUA_EXCLUDE_ISA95PersonnelDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95PersonnelDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        Description = 0x1,\n        /// <remarks />\n        PersonnelUse = 0x2,\n        /// <remarks />\n        Quantity = 0x4,\n        /// <remarks />\n        EngineeringUnits = 0x8,\n        /// <remarks />\n        Properties = 0x10\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95PersonnelDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95PersonnelDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95PersonnelDataTypeFields.None;\n            m_iD = null;\n            m_description = new LocalizedTextCollection();\n            m_personnelUse = null;\n            m_quantity = null;\n            m_engineeringUnits = new Opc.Ua.EUInformation();\n            m_properties = new ISA95PropertyDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95PersonnelDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"ID\", IsRequired = false, Order = 1)]\n        public string ID\n        {\n            get { return m_iD; }\n            set { m_iD = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 2)]\n        public LocalizedTextCollection Description\n        {\n            get\n            {\n                return m_description;\n            }\n\n            set\n            {\n                m_description = value;\n\n                if (value == null)\n                {\n                    m_description = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"PersonnelUse\", IsRequired = false, Order = 3)]\n        public string PersonnelUse\n        {\n            get { return m_personnelUse; }\n            set { m_personnelUse = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Quantity\", IsRequired = false, Order = 4)]\n        public string Quantity\n        {\n            get { return m_quantity; }\n            set { m_quantity = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EngineeringUnits\", IsRequired = false, Order = 5)]\n        public Opc.Ua.EUInformation EngineeringUnits\n        {\n            get\n            {\n                return m_engineeringUnits;\n            }\n\n            set\n            {\n                m_engineeringUnits = value;\n\n                if (value == null)\n                {\n                    m_engineeringUnits = new Opc.Ua.EUInformation();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Properties\", IsRequired = false, Order = 6)]\n        public ISA95PropertyDataTypeCollection Properties\n        {\n            get\n            {\n                return m_properties;\n            }\n\n            set\n            {\n                m_properties = value;\n\n                if (value == null)\n                {\n                    m_properties = new ISA95PropertyDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95PersonnelDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95PersonnelDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95PersonnelDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95PersonnelDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            encoder.WriteString(\"ID\", ID);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Description) != 0) encoder.WriteLocalizedTextArray(\"Description\", Description);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.PersonnelUse) != 0) encoder.WriteString(\"PersonnelUse\", PersonnelUse);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Quantity) != 0) encoder.WriteString(\"Quantity\", Quantity);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.EngineeringUnits) != 0) encoder.WriteEncodeable(\"EngineeringUnits\", EngineeringUnits, typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Properties) != 0) encoder.WriteEncodeableArray(\"Properties\", Properties.ToArray(), typeof(ISA95PropertyDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95PersonnelDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            ID = decoder.ReadString(\"ID\");\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedTextArray(\"Description\");\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.PersonnelUse) != 0) PersonnelUse = decoder.ReadString(\"PersonnelUse\");\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Quantity) != 0) Quantity = decoder.ReadString(\"Quantity\");\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.EngineeringUnits) != 0) EngineeringUnits = (Opc.Ua.EUInformation)decoder.ReadEncodeable(\"EngineeringUnits\", typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Properties) != 0) Properties = (ISA95PropertyDataTypeCollection)decoder.ReadEncodeableArray(\"Properties\", typeof(ISA95PropertyDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95PersonnelDataType value = encodeable as ISA95PersonnelDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if (!Utils.IsEqual(m_iD, value.m_iD)) return false;\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.PersonnelUse) != 0) if (!Utils.IsEqual(m_personnelUse, value.m_personnelUse)) return false;\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Quantity) != 0) if (!Utils.IsEqual(m_quantity, value.m_quantity)) return false;\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.EngineeringUnits) != 0) if (!Utils.IsEqual(m_engineeringUnits, value.m_engineeringUnits)) return false;\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Properties) != 0) if (!Utils.IsEqual(m_properties, value.m_properties)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95PersonnelDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95PersonnelDataType clone = (ISA95PersonnelDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            clone.m_iD = (string)Utils.Clone(this.m_iD);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Description) != 0) clone.m_description = (LocalizedTextCollection)Utils.Clone(this.m_description);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.PersonnelUse) != 0) clone.m_personnelUse = (string)Utils.Clone(this.m_personnelUse);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Quantity) != 0) clone.m_quantity = (string)Utils.Clone(this.m_quantity);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.EngineeringUnits) != 0) clone.m_engineeringUnits = (Opc.Ua.EUInformation)Utils.Clone(this.m_engineeringUnits);\n            if ((EncodingMask & ISA95PersonnelDataTypeFields.Properties) != 0) clone.m_properties = (ISA95PropertyDataTypeCollection)Utils.Clone(this.m_properties);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_iD;\n        private LocalizedTextCollection m_description;\n        private string m_personnelUse;\n        private string m_quantity;\n        private Opc.Ua.EUInformation m_engineeringUnits;\n        private ISA95PropertyDataTypeCollection m_properties;\n        #endregion\n    }\n\n    #region ISA95PersonnelDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95PersonnelDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95PersonnelDataType\")]\n    public partial class ISA95PersonnelDataTypeCollection : List<ISA95PersonnelDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95PersonnelDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95PersonnelDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95PersonnelDataTypeCollection(IEnumerable<ISA95PersonnelDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95PersonnelDataTypeCollection(ISA95PersonnelDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95PersonnelDataTypeCollection(values);\n            }\n\n            return new ISA95PersonnelDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95PersonnelDataType[](ISA95PersonnelDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95PersonnelDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95PersonnelDataTypeCollection clone = new ISA95PersonnelDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95PersonnelDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95PhysicalAssetDataType Class\n#if (!OPCUA_EXCLUDE_ISA95PhysicalAssetDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95PhysicalAssetDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        Description = 0x1,\n        /// <remarks />\n        PhysicalAssetUse = 0x2,\n        /// <remarks />\n        Quantity = 0x4,\n        /// <remarks />\n        EngineeringUnits = 0x8,\n        /// <remarks />\n        Properties = 0x10\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95PhysicalAssetDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95PhysicalAssetDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95PhysicalAssetDataTypeFields.None;\n            m_iD = null;\n            m_description = new LocalizedTextCollection();\n            m_physicalAssetUse = null;\n            m_quantity = null;\n            m_engineeringUnits = new Opc.Ua.EUInformation();\n            m_properties = new ISA95PropertyDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95PhysicalAssetDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"ID\", IsRequired = false, Order = 1)]\n        public string ID\n        {\n            get { return m_iD; }\n            set { m_iD = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 2)]\n        public LocalizedTextCollection Description\n        {\n            get\n            {\n                return m_description;\n            }\n\n            set\n            {\n                m_description = value;\n\n                if (value == null)\n                {\n                    m_description = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"PhysicalAssetUse\", IsRequired = false, Order = 3)]\n        public string PhysicalAssetUse\n        {\n            get { return m_physicalAssetUse; }\n            set { m_physicalAssetUse = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Quantity\", IsRequired = false, Order = 4)]\n        public string Quantity\n        {\n            get { return m_quantity; }\n            set { m_quantity = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EngineeringUnits\", IsRequired = false, Order = 5)]\n        public Opc.Ua.EUInformation EngineeringUnits\n        {\n            get\n            {\n                return m_engineeringUnits;\n            }\n\n            set\n            {\n                m_engineeringUnits = value;\n\n                if (value == null)\n                {\n                    m_engineeringUnits = new Opc.Ua.EUInformation();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Properties\", IsRequired = false, Order = 6)]\n        public ISA95PropertyDataTypeCollection Properties\n        {\n            get\n            {\n                return m_properties;\n            }\n\n            set\n            {\n                m_properties = value;\n\n                if (value == null)\n                {\n                    m_properties = new ISA95PropertyDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95PhysicalAssetDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95PhysicalAssetDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95PhysicalAssetDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95PhysicalAssetDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            encoder.WriteString(\"ID\", ID);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Description) != 0) encoder.WriteLocalizedTextArray(\"Description\", Description);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.PhysicalAssetUse) != 0) encoder.WriteString(\"PhysicalAssetUse\", PhysicalAssetUse);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Quantity) != 0) encoder.WriteString(\"Quantity\", Quantity);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.EngineeringUnits) != 0) encoder.WriteEncodeable(\"EngineeringUnits\", EngineeringUnits, typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Properties) != 0) encoder.WriteEncodeableArray(\"Properties\", Properties.ToArray(), typeof(ISA95PropertyDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95PhysicalAssetDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            ID = decoder.ReadString(\"ID\");\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedTextArray(\"Description\");\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.PhysicalAssetUse) != 0) PhysicalAssetUse = decoder.ReadString(\"PhysicalAssetUse\");\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Quantity) != 0) Quantity = decoder.ReadString(\"Quantity\");\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.EngineeringUnits) != 0) EngineeringUnits = (Opc.Ua.EUInformation)decoder.ReadEncodeable(\"EngineeringUnits\", typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Properties) != 0) Properties = (ISA95PropertyDataTypeCollection)decoder.ReadEncodeableArray(\"Properties\", typeof(ISA95PropertyDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95PhysicalAssetDataType value = encodeable as ISA95PhysicalAssetDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if (!Utils.IsEqual(m_iD, value.m_iD)) return false;\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.PhysicalAssetUse) != 0) if (!Utils.IsEqual(m_physicalAssetUse, value.m_physicalAssetUse)) return false;\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Quantity) != 0) if (!Utils.IsEqual(m_quantity, value.m_quantity)) return false;\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.EngineeringUnits) != 0) if (!Utils.IsEqual(m_engineeringUnits, value.m_engineeringUnits)) return false;\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Properties) != 0) if (!Utils.IsEqual(m_properties, value.m_properties)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95PhysicalAssetDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95PhysicalAssetDataType clone = (ISA95PhysicalAssetDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            clone.m_iD = (string)Utils.Clone(this.m_iD);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Description) != 0) clone.m_description = (LocalizedTextCollection)Utils.Clone(this.m_description);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.PhysicalAssetUse) != 0) clone.m_physicalAssetUse = (string)Utils.Clone(this.m_physicalAssetUse);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Quantity) != 0) clone.m_quantity = (string)Utils.Clone(this.m_quantity);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.EngineeringUnits) != 0) clone.m_engineeringUnits = (Opc.Ua.EUInformation)Utils.Clone(this.m_engineeringUnits);\n            if ((EncodingMask & ISA95PhysicalAssetDataTypeFields.Properties) != 0) clone.m_properties = (ISA95PropertyDataTypeCollection)Utils.Clone(this.m_properties);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_iD;\n        private LocalizedTextCollection m_description;\n        private string m_physicalAssetUse;\n        private string m_quantity;\n        private Opc.Ua.EUInformation m_engineeringUnits;\n        private ISA95PropertyDataTypeCollection m_properties;\n        #endregion\n    }\n\n    #region ISA95PhysicalAssetDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95PhysicalAssetDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95PhysicalAssetDataType\")]\n    public partial class ISA95PhysicalAssetDataTypeCollection : List<ISA95PhysicalAssetDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95PhysicalAssetDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95PhysicalAssetDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95PhysicalAssetDataTypeCollection(IEnumerable<ISA95PhysicalAssetDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95PhysicalAssetDataTypeCollection(ISA95PhysicalAssetDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95PhysicalAssetDataTypeCollection(values);\n            }\n\n            return new ISA95PhysicalAssetDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95PhysicalAssetDataType[](ISA95PhysicalAssetDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95PhysicalAssetDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95PhysicalAssetDataTypeCollection clone = new ISA95PhysicalAssetDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95PhysicalAssetDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95PropertyDataType Class\n#if (!OPCUA_EXCLUDE_ISA95PropertyDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95PropertyDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        Description = 0x1,\n        /// <remarks />\n        EngineeringUnits = 0x2,\n        /// <remarks />\n        Subproperties = 0x4\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95PropertyDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95PropertyDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95PropertyDataTypeFields.None;\n            m_iD = null;\n            m_value = Variant.Null;\n            m_description = new LocalizedTextCollection();\n            m_engineeringUnits = new Opc.Ua.EUInformation();\n            m_subproperties = new ISA95PropertyDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95PropertyDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"ID\", IsRequired = false, Order = 1)]\n        public string ID\n        {\n            get { return m_iD; }\n            set { m_iD = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Value\", IsRequired = false, Order = 2)]\n        public Variant Value\n        {\n            get { return m_value; }\n            set { m_value = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 3)]\n        public LocalizedTextCollection Description\n        {\n            get\n            {\n                return m_description;\n            }\n\n            set\n            {\n                m_description = value;\n\n                if (value == null)\n                {\n                    m_description = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EngineeringUnits\", IsRequired = false, Order = 4)]\n        public Opc.Ua.EUInformation EngineeringUnits\n        {\n            get\n            {\n                return m_engineeringUnits;\n            }\n\n            set\n            {\n                m_engineeringUnits = value;\n\n                if (value == null)\n                {\n                    m_engineeringUnits = new Opc.Ua.EUInformation();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Subproperties\", IsRequired = false, Order = 5)]\n        public ISA95PropertyDataTypeCollection Subproperties\n        {\n            get\n            {\n                return m_subproperties;\n            }\n\n            set\n            {\n                m_subproperties = value;\n\n                if (value == null)\n                {\n                    m_subproperties = new ISA95PropertyDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95PropertyDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95PropertyDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95PropertyDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95PropertyDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            encoder.WriteString(\"ID\", ID);\n            encoder.WriteVariant(\"Value\", Value);\n            if ((EncodingMask & ISA95PropertyDataTypeFields.Description) != 0) encoder.WriteLocalizedTextArray(\"Description\", Description);\n            if ((EncodingMask & ISA95PropertyDataTypeFields.EngineeringUnits) != 0) encoder.WriteEncodeable(\"EngineeringUnits\", EngineeringUnits, typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95PropertyDataTypeFields.Subproperties) != 0) encoder.WriteEncodeableArray(\"Subproperties\", Subproperties.ToArray(), typeof(ISA95PropertyDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95PropertyDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            ID = decoder.ReadString(\"ID\");\n            Value = decoder.ReadVariant(\"Value\");\n            if ((EncodingMask & ISA95PropertyDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedTextArray(\"Description\");\n            if ((EncodingMask & ISA95PropertyDataTypeFields.EngineeringUnits) != 0) EngineeringUnits = (Opc.Ua.EUInformation)decoder.ReadEncodeable(\"EngineeringUnits\", typeof(Opc.Ua.EUInformation));\n            if ((EncodingMask & ISA95PropertyDataTypeFields.Subproperties) != 0) Subproperties = (ISA95PropertyDataTypeCollection)decoder.ReadEncodeableArray(\"Subproperties\", typeof(ISA95PropertyDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95PropertyDataType value = encodeable as ISA95PropertyDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if (!Utils.IsEqual(m_iD, value.m_iD)) return false;\n            if (!Utils.IsEqual(m_value, value.m_value)) return false;\n            if ((EncodingMask & ISA95PropertyDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if ((EncodingMask & ISA95PropertyDataTypeFields.EngineeringUnits) != 0) if (!Utils.IsEqual(m_engineeringUnits, value.m_engineeringUnits)) return false;\n            if ((EncodingMask & ISA95PropertyDataTypeFields.Subproperties) != 0) if (!Utils.IsEqual(m_subproperties, value.m_subproperties)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95PropertyDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95PropertyDataType clone = (ISA95PropertyDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            clone.m_iD = (string)Utils.Clone(this.m_iD);\n            clone.m_value = (Variant)Utils.Clone(this.m_value);\n            if ((EncodingMask & ISA95PropertyDataTypeFields.Description) != 0) clone.m_description = (LocalizedTextCollection)Utils.Clone(this.m_description);\n            if ((EncodingMask & ISA95PropertyDataTypeFields.EngineeringUnits) != 0) clone.m_engineeringUnits = (Opc.Ua.EUInformation)Utils.Clone(this.m_engineeringUnits);\n            if ((EncodingMask & ISA95PropertyDataTypeFields.Subproperties) != 0) clone.m_subproperties = (ISA95PropertyDataTypeCollection)Utils.Clone(this.m_subproperties);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_iD;\n        private Variant m_value;\n        private LocalizedTextCollection m_description;\n        private Opc.Ua.EUInformation m_engineeringUnits;\n        private ISA95PropertyDataTypeCollection m_subproperties;\n        #endregion\n    }\n\n    #region ISA95PropertyDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95PropertyDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95PropertyDataType\")]\n    public partial class ISA95PropertyDataTypeCollection : List<ISA95PropertyDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95PropertyDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95PropertyDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95PropertyDataTypeCollection(IEnumerable<ISA95PropertyDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95PropertyDataTypeCollection(ISA95PropertyDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95PropertyDataTypeCollection(values);\n            }\n\n            return new ISA95PropertyDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95PropertyDataType[](ISA95PropertyDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95PropertyDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95PropertyDataTypeCollection clone = new ISA95PropertyDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95PropertyDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95StateDataType Class\n#if (!OPCUA_EXCLUDE_ISA95StateDataType)\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95StateDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95StateDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            m_browsePath = new Opc.Ua.RelativePath();\n            m_stateText = null;\n            m_stateNumber = (uint)0;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        [DataMember(Name = \"BrowsePath\", IsRequired = false, Order = 1)]\n        public Opc.Ua.RelativePath BrowsePath\n        {\n            get\n            {\n                return m_browsePath;\n            }\n\n            set\n            {\n                m_browsePath = value;\n\n                if (value == null)\n                {\n                    m_browsePath = new Opc.Ua.RelativePath();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StateText\", IsRequired = false, Order = 2)]\n        public LocalizedText StateText\n        {\n            get { return m_stateText; }\n            set { m_stateText = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StateNumber\", IsRequired = false, Order = 3)]\n        public uint StateNumber\n        {\n            get { return m_stateNumber; }\n            set { m_stateNumber = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95StateDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95StateDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95StateDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95StateDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            encoder.WriteEncodeable(\"BrowsePath\", BrowsePath, typeof(Opc.Ua.RelativePath));\n            encoder.WriteLocalizedText(\"StateText\", StateText);\n            encoder.WriteUInt32(\"StateNumber\", StateNumber);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            BrowsePath = (Opc.Ua.RelativePath)decoder.ReadEncodeable(\"BrowsePath\", typeof(Opc.Ua.RelativePath));\n            StateText = decoder.ReadLocalizedText(\"StateText\");\n            StateNumber = decoder.ReadUInt32(\"StateNumber\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95StateDataType value = encodeable as ISA95StateDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_browsePath, value.m_browsePath)) return false;\n            if (!Utils.IsEqual(m_stateText, value.m_stateText)) return false;\n            if (!Utils.IsEqual(m_stateNumber, value.m_stateNumber)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95StateDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95StateDataType clone = (ISA95StateDataType)base.MemberwiseClone();\n\n            clone.m_browsePath = (Opc.Ua.RelativePath)Utils.Clone(this.m_browsePath);\n            clone.m_stateText = (LocalizedText)Utils.Clone(this.m_stateText);\n            clone.m_stateNumber = (uint)Utils.Clone(this.m_stateNumber);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private Opc.Ua.RelativePath m_browsePath;\n        private LocalizedText m_stateText;\n        private uint m_stateNumber;\n        #endregion\n    }\n\n    #region ISA95StateDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95StateDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95StateDataType\")]\n    public partial class ISA95StateDataTypeCollection : List<ISA95StateDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95StateDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95StateDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95StateDataTypeCollection(IEnumerable<ISA95StateDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95StateDataTypeCollection(ISA95StateDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95StateDataTypeCollection(values);\n            }\n\n            return new ISA95StateDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95StateDataType[](ISA95StateDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95StateDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95StateDataTypeCollection clone = new ISA95StateDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95StateDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ISA95WorkMasterDataType Class\n#if (!OPCUA_EXCLUDE_ISA95WorkMasterDataType)\n    /// <remarks />\n    /// <exclude />\n    public enum ISA95WorkMasterDataTypeFields : uint\n    {\n        None = 0,\n        /// <remarks />\n        Description = 0x1,\n        /// <remarks />\n        Parameters = 0x2\n    }\n\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2)]\n    public partial class ISA95WorkMasterDataType : IEncodeable, IJsonEncodeable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95WorkMasterDataType()\n        {\n            Initialize();\n        }\n\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        private void Initialize()\n        {\n            EncodingMask = ISA95WorkMasterDataTypeFields.None;\n            m_iD = null;\n            m_description = null;\n            m_parameters = new ISA95ParameterDataTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        // <remarks />\n        [DataMember(Name = \"EncodingMask\", IsRequired = true, Order = 0)]\n        public ISA95WorkMasterDataTypeFields EncodingMask { get; set; }\n\n        /// <remarks />\n        [DataMember(Name = \"ID\", IsRequired = false, Order = 1)]\n        public string ID\n        {\n            get { return m_iD; }\n            set { m_iD = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Description\", IsRequired = false, Order = 2)]\n        public LocalizedText Description\n        {\n            get { return m_description; }\n            set { m_description = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Parameters\", IsRequired = false, Order = 3)]\n        public ISA95ParameterDataTypeCollection Parameters\n        {\n            get\n            {\n                return m_parameters;\n            }\n\n            set\n            {\n                m_parameters = value;\n\n                if (value == null)\n                {\n                    m_parameters = new ISA95ParameterDataTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId => DataTypeIds.ISA95WorkMasterDataType;\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId => ObjectIds.ISA95WorkMasterDataType_Encoding_DefaultBinary;\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId => ObjectIds.ISA95WorkMasterDataType_Encoding_DefaultXml;\n\n        /// <summary cref=\"IJsonEncodeable.JsonEncodingId\" />\n        public virtual ExpandedNodeId JsonEncodingId => ObjectIds.ISA95WorkMasterDataType_Encoding_DefaultJson;\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n            encoder.WriteUInt32(nameof(EncodingMask), (uint)EncodingMask);\n\n            encoder.WriteString(\"ID\", ID);\n            if ((EncodingMask & ISA95WorkMasterDataTypeFields.Description) != 0) encoder.WriteLocalizedText(\"Description\", Description);\n            if ((EncodingMask & ISA95WorkMasterDataTypeFields.Parameters) != 0) encoder.WriteEncodeableArray(\"Parameters\", Parameters.ToArray(), typeof(ISA95ParameterDataType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2);\n\n            EncodingMask = (ISA95WorkMasterDataTypeFields)decoder.ReadUInt32(nameof(EncodingMask));\n\n            ID = decoder.ReadString(\"ID\");\n            if ((EncodingMask & ISA95WorkMasterDataTypeFields.Description) != 0) Description = decoder.ReadLocalizedText(\"Description\");\n            if ((EncodingMask & ISA95WorkMasterDataTypeFields.Parameters) != 0) Parameters = (ISA95ParameterDataTypeCollection)decoder.ReadEncodeableArray(\"Parameters\", typeof(ISA95ParameterDataType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ISA95WorkMasterDataType value = encodeable as ISA95WorkMasterDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (value.EncodingMask != this.EncodingMask) return false;\n\n            if (!Utils.IsEqual(m_iD, value.m_iD)) return false;\n            if ((EncodingMask & ISA95WorkMasterDataTypeFields.Description) != 0) if (!Utils.IsEqual(m_description, value.m_description)) return false;\n            if ((EncodingMask & ISA95WorkMasterDataTypeFields.Parameters) != 0) if (!Utils.IsEqual(m_parameters, value.m_parameters)) return false;\n\n            return true;\n        }\n\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ISA95WorkMasterDataType)this.MemberwiseClone();\n        }\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95WorkMasterDataType clone = (ISA95WorkMasterDataType)base.MemberwiseClone();\n\n            clone.EncodingMask = this.EncodingMask;\n\n            clone.m_iD = (string)Utils.Clone(this.m_iD);\n            if ((EncodingMask & ISA95WorkMasterDataTypeFields.Description) != 0) clone.m_description = (LocalizedText)Utils.Clone(this.m_description);\n            if ((EncodingMask & ISA95WorkMasterDataTypeFields.Parameters) != 0) clone.m_parameters = (ISA95ParameterDataTypeCollection)Utils.Clone(this.m_parameters);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_iD;\n        private LocalizedText m_description;\n        private ISA95ParameterDataTypeCollection m_parameters;\n        #endregion\n    }\n\n    #region ISA95WorkMasterDataTypeCollection Class\n    /// <remarks />\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfISA95WorkMasterDataType\", Namespace = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2, ItemName = \"ISA95WorkMasterDataType\")]\n    public partial class ISA95WorkMasterDataTypeCollection : List<ISA95WorkMasterDataType>, ICloneable\n    {\n        #region Constructors\n        /// <remarks />\n        public ISA95WorkMasterDataTypeCollection() { }\n\n        /// <remarks />\n        public ISA95WorkMasterDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <remarks />\n        public ISA95WorkMasterDataTypeCollection(IEnumerable<ISA95WorkMasterDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <remarks />\n        public static implicit operator ISA95WorkMasterDataTypeCollection(ISA95WorkMasterDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ISA95WorkMasterDataTypeCollection(values);\n            }\n\n            return new ISA95WorkMasterDataTypeCollection();\n        }\n\n        /// <remarks />\n        public static explicit operator ISA95WorkMasterDataType[](ISA95WorkMasterDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n        #region ICloneable Methods\n        /// <remarks />\n        public object Clone()\n        {\n            return (ISA95WorkMasterDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ISA95WorkMasterDataTypeCollection clone = new ISA95WorkMasterDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ISA95WorkMasterDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.NodeIds.csv",
    "content": "ISA95PrepareStateMachineType,1001,ObjectType\nISA95JobOrderReceiverObjectType,1002,ObjectType\nISA95JobResponseProviderObjectType,1003,ObjectType\nISA95JobResponseReceiverObjectType,1004,ObjectType\nISA95EndedStateMachineType,1005,ObjectType\nISA95JobOrderStatusEventType,1006,ObjectType\nISA95InterruptedStateMachineType,1007,ObjectType\nISA95JobOrderReceiverSubStatesType,1008,ObjectType\nISA95PropertyDataType,3002,DataType\nISA95ParameterDataType,3003,DataType\nISA95EquipmentDataType,3005,DataType\nISA95StateDataType,3006,DataType\nISA95WorkMasterDataType,3007,DataType\nISA95JobOrderDataType,3008,DataType\nISA95MaterialDataType,3010,DataType\nISA95PersonnelDataType,3011,DataType\nISA95PhysicalAssetDataType,3012,DataType\nISA95JobResponseDataType,3013,DataType\nISA95JobOrderAndStateDataType,3015,DataType\nISA95PrepareStateMachineType_Waiting,5000,Object\nhttp___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_,5001,Object\nISA95PropertyDataType_Encoding_DefaultBinary,5002,Object\nISA95PropertyDataType_Encoding_DefaultXml,5003,Object\nISA95PropertyDataType_Encoding_DefaultJson,5004,Object\nISA95ParameterDataType_Encoding_DefaultBinary,5005,Object\nISA95ParameterDataType_Encoding_DefaultXml,5006,Object\nISA95ParameterDataType_Encoding_DefaultJson,5007,Object\nISA95EquipmentDataType_Encoding_DefaultBinary,5008,Object\nISA95EquipmentDataType_Encoding_DefaultXml,5009,Object\nISA95EquipmentDataType_Encoding_DefaultJson,5010,Object\nISA95WorkMasterDataType_Encoding_DefaultBinary,5011,Object\nISA95WorkMasterDataType_Encoding_DefaultXml,5012,Object\nISA95WorkMasterDataType_Encoding_DefaultJson,5013,Object\nISA95JobOrderDataType_Encoding_DefaultBinary,5014,Object\nISA95JobOrderDataType_Encoding_DefaultXml,5015,Object\nISA95JobOrderDataType_Encoding_DefaultJson,5016,Object\nISA95MaterialDataType_Encoding_DefaultBinary,5017,Object\nISA95MaterialDataType_Encoding_DefaultXml,5018,Object\nISA95MaterialDataType_Encoding_DefaultJson,5019,Object\nISA95PersonnelDataType_Encoding_DefaultBinary,5020,Object\nISA95PersonnelDataType_Encoding_DefaultXml,5021,Object\nISA95PersonnelDataType_Encoding_DefaultJson,5022,Object\nISA95PhysicalAssetDataType_Encoding_DefaultBinary,5023,Object\nISA95PhysicalAssetDataType_Encoding_DefaultXml,5024,Object\nISA95PhysicalAssetDataType_Encoding_DefaultJson,5025,Object\nISA95JobResponseDataType_Encoding_DefaultBinary,5026,Object\nISA95JobResponseDataType_Encoding_DefaultXml,5027,Object\nISA95JobResponseDataType_Encoding_DefaultJson,5028,Object\nISA95StateDataType_Encoding_DefaultBinary,5029,Object\nISA95StateDataType_Encoding_DefaultXml,5030,Object\nISA95StateDataType_Encoding_DefaultJson,5031,Object\nISA95JobOrderAndStateDataType_Encoding_DefaultBinary,5032,Object\nISA95JobOrderAndStateDataType_Encoding_DefaultXml,5033,Object\nISA95JobOrderAndStateDataType_Encoding_DefaultJson,5034,Object\nISA95JobOrderReceiverObjectType_NotAllowedToStart,5035,Object\nISA95JobOrderReceiverObjectType_AllowedToStart,5036,Object\nISA95JobOrderReceiverObjectType_Running,5037,Object\nISA95JobOrderReceiverObjectType_Interrupted,5038,Object\nISA95JobOrderReceiverObjectType_Ended,5039,Object\nISA95JobOrderReceiverObjectType_Aborted,5040,Object\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart,5041,Object\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart,5042,Object\nISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart,5043,Object\nISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart,5044,Object\nISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning,5045,Object\nISA95JobOrderReceiverObjectType_FromRunningToInterrupted,5046,Object\nISA95JobOrderReceiverObjectType_FromRunningToEnded,5047,Object\nISA95JobOrderReceiverObjectType_FromRunningToAborted,5048,Object\nISA95JobOrderReceiverObjectType_FromInterruptedToAborted,5049,Object\nISA95JobOrderReceiverObjectType_FromInterruptedToRunning,5050,Object\nISA95JobOrderReceiverObjectType_FromInterruptedToEnded,5051,Object\nISA95PrepareStateMachineType_Ready,5052,Object\nISA95PrepareStateMachineType_Loaded,5053,Object\nISA95PrepareStateMachineType_FromWaitingToReady,5054,Object\nISA95PrepareStateMachineType_FromReadyToLoaded,5055,Object\nISA95EndedStateMachineType_Completed,5056,Object\nISA95EndedStateMachineType_Closed,5057,Object\nISA95EndedStateMachineType_FromCompletedToClosed,5058,Object\nISA95InterruptedStateMachineType_Held,5059,Object\nISA95InterruptedStateMachineType_Suspended,5060,Object\nISA95InterruptedStateMachineType_FromHeldToSuspended,5061,Object\nISA95InterruptedStateMachineType_FromSuspendedToHeld,5062,Object\nISA95JobOrderReceiverSubStatesType_NotAllowedToStart,5063,Object\nISA95JobOrderReceiverSubStatesType_AllowedToStart,5064,Object\nISA95JobOrderReceiverSubStatesType_Running,5065,Object\nISA95JobOrderReceiverSubStatesType_Interrupted,5066,Object\nISA95JobOrderReceiverSubStatesType_Ended,5067,Object\nISA95JobOrderReceiverSubStatesType_Aborted,5068,Object\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart,5069,Object\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart,5070,Object\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart,5071,Object\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart,5072,Object\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning,5073,Object\nISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted,5074,Object\nISA95JobOrderReceiverSubStatesType_FromRunningToEnded,5075,Object\nISA95JobOrderReceiverSubStatesType_FromRunningToAborted,5076,Object\nISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted,5077,Object\nISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning,5078,Object\nISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded,5079,Object\nISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates,5080,Object\nISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates,5081,Object\nISA95JobOrderReceiverSubStatesType_EndedSubstates,5082,Object\nISA95JobOrderReceiverSubStatesType_InterruptedSubstates,5083,Object\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted,5084,Object\nISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted,5085,Object\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted,5086,Object\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted,5087,Object\nISA95PrepareStateMachineType_FromReadyToWaiting,5088,Object\nISA95PrepareStateMachineType_FromLoadedToReady,5089,Object\nISA95PrepareStateMachineType_FromLoadedToWaiting,5090,Object\nISA95PrepareStateMachineType_Waiting_StateNumber,6000,Variable\nISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState,6001,Variable\nISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState_Id,6002,Variable\nISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState,6003,Variable\nISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState_Id,6004,Variable\nISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState,6005,Variable\nISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState_Id,6006,Variable\nISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState,6007,Variable\nISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState_Id,6008,Variable\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted_TransitionNumber,6009,Variable\nISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted_TransitionNumber,6010,Variable\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted_TransitionNumber,6011,Variable\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted_TransitionNumber,6012,Variable\nISA95PrepareStateMachineType_FromReadyToWaiting_TransitionNumber,6013,Variable\nISA95PrepareStateMachineType_FromLoadedToReady_TransitionNumber,6014,Variable\nISA95PrepareStateMachineType_FromLoadedToWaiting_TransitionNumber,6015,Variable\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_InputArguments,6016,Variable\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_OutputArguments,6017,Variable\nhttp___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__IsNamespaceSubset,6023,Variable\nhttp___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespacePublicationDate,6024,Variable\nhttp___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceUri,6025,Variable\nhttp___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceVersion,6026,Variable\nhttp___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNodeIdTypes,6027,Variable\nhttp___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNumericNodeIdRange,6028,Variable\nhttp___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticStringNodeIdPattern,6029,Variable\nISA95JobOrderReceiverObjectType_JobOrderList,6033,Variable\nISA95JobOrderReceiverObjectType_WorkMaster,6034,Variable\nISA95JobOrderReceiverObjectType_MaterialClassID,6035,Variable\nISA95JobOrderReceiverObjectType_MaterialDefinitionID,6036,Variable\nISA95JobOrderReceiverObjectType_EquipmentID,6037,Variable\nISA95JobOrderReceiverObjectType_PhysicalAssetID,6038,Variable\nISA95JobOrderReceiverObjectType_PersonnelID,6039,Variable\nISA95JobOrderReceiverObjectType_Store_InputArguments,6040,Variable\nISA95JobOrderReceiverObjectType_Store_OutputArguments,6041,Variable\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_InputArguments,6042,Variable\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_OutputArguments,6043,Variable\nISA95JobResponseReceiverObjectType_ReceiveJobResponse_InputArguments,6044,Variable\nISA95JobResponseReceiverObjectType_ReceiveJobResponse_OutputArguments,6045,Variable\nISA95JobOrderStatusEventType_JobOrder,6047,Variable\nISA95JobOrderStatusEventType_JobState,6048,Variable\nISA95JobOrderStatusEventType_JobResponse,6049,Variable\nISA95JobResponseProviderObjectType_JobOrderResponseList,6050,Variable\nISA95JobOrderReceiverObjectType_StoreAndStart_InputArguments,6051,Variable\nISA95JobOrderReceiverObjectType_StoreAndStart_OutputArguments,6052,Variable\nISA95JobOrderReceiverObjectType_Start_InputArguments,6053,Variable\nISA95JobOrderReceiverObjectType_Start_OutputArguments,6054,Variable\nISA95JobOrderReceiverObjectType_Stop_InputArguments,6055,Variable\nISA95JobOrderReceiverObjectType_Stop_OutputArguments,6056,Variable\nISA95JobOrderReceiverObjectType_Pause_InputArguments,6057,Variable\nISA95JobOrderReceiverObjectType_Pause_OutputArguments,6058,Variable\nISA95JobOrderReceiverObjectType_Resume_InputArguments,6059,Variable\nISA95JobOrderReceiverObjectType_Resume_OutputArguments,6060,Variable\nISA95JobOrderReceiverObjectType_Update_InputArguments,6061,Variable\nISA95JobOrderReceiverObjectType_Update_OutputArguments,6062,Variable\nISA95JobOrderReceiverObjectType_Abort_InputArguments,6063,Variable\nISA95JobOrderReceiverObjectType_Abort_OutputArguments,6064,Variable\nISA95JobOrderReceiverObjectType_Cancel_InputArguments,6065,Variable\nISA95JobOrderReceiverObjectType_Cancel_OutputArguments,6066,Variable\nISA95JobOrderReceiverObjectType_Clear_InputArguments,6067,Variable\nISA95JobOrderReceiverObjectType_Clear_OutputArguments,6068,Variable\nISA95JobOrderReceiverObjectType_RevokeStart_InputArguments,6069,Variable\nISA95JobOrderReceiverObjectType_RevokeStart_OutputArguments,6070,Variable\nISA95JobOrderReceiverObjectType_NotAllowedToStart_StateNumber,6071,Variable\nISA95JobOrderReceiverObjectType_AllowedToStart_StateNumber,6072,Variable\nISA95JobOrderReceiverObjectType_Running_StateNumber,6073,Variable\nISA95JobOrderReceiverObjectType_Interrupted_StateNumber,6074,Variable\nISA95JobOrderReceiverObjectType_Ended_StateNumber,6075,Variable\nISA95JobOrderReceiverObjectType_Aborted_StateNumber,6076,Variable\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber,6077,Variable\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart_TransitionNumber,6078,Variable\nISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart_TransitionNumber,6079,Variable\nISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart_TransitionNumber,6080,Variable\nISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning_TransitionNumber,6081,Variable\nISA95JobOrderReceiverObjectType_FromRunningToInterrupted_TransitionNumber,6082,Variable\nISA95JobOrderReceiverObjectType_FromRunningToEnded_TransitionNumber,6083,Variable\nISA95JobOrderReceiverObjectType_FromRunningToAborted_TransitionNumber,6084,Variable\nISA95JobOrderReceiverObjectType_FromInterruptedToAborted_TransitionNumber,6085,Variable\nISA95JobOrderReceiverObjectType_FromInterruptedToRunning_TransitionNumber,6086,Variable\nISA95JobOrderReceiverObjectType_FromInterruptedToEnded_TransitionNumber,6087,Variable\nISA95JobOrderReceiverObjectType_MaxDownloadableJobOrders,6088,Variable\nISA95PrepareStateMachineType_Ready_StateNumber,6089,Variable\nISA95PrepareStateMachineType_Loaded_StateNumber,6090,Variable\nISA95PrepareStateMachineType_FromWaitingToReady_TransitionNumber,6091,Variable\nISA95PrepareStateMachineType_FromReadyToLoaded_TransitionNumber,6092,Variable\nISA95EndedStateMachineType_Completed_StateNumber,6093,Variable\nISA95EndedStateMachineType_Closed_StateNumber,6094,Variable\nISA95EndedStateMachineType_FromCompletedToClosed_TransitionNumber,6095,Variable\nISA95InterruptedStateMachineType_Held_StateNumber,6096,Variable\nISA95InterruptedStateMachineType_Suspended_StateNumber,6097,Variable\nISA95InterruptedStateMachineType_FromHeldToSuspended_TransitionNumber,6098,Variable\nISA95InterruptedStateMachineType_FromSuspendedToHeld_TransitionNumber,6099,Variable\nISA95JobOrderReceiverSubStatesType_NotAllowedToStart_StateNumber,6100,Variable\nISA95JobOrderReceiverSubStatesType_AllowedToStart_StateNumber,6101,Variable\nISA95JobOrderReceiverSubStatesType_Running_StateNumber,6102,Variable\nISA95JobOrderReceiverSubStatesType_Interrupted_StateNumber,6103,Variable\nISA95JobOrderReceiverSubStatesType_Ended_StateNumber,6104,Variable\nISA95JobOrderReceiverSubStatesType_Aborted_StateNumber,6105,Variable\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber,6106,Variable\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart_TransitionNumber,6107,Variable\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart_TransitionNumber,6108,Variable\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart_TransitionNumber,6109,Variable\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning_TransitionNumber,6110,Variable\nISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted_TransitionNumber,6111,Variable\nISA95JobOrderReceiverSubStatesType_FromRunningToEnded_TransitionNumber,6112,Variable\nISA95JobOrderReceiverSubStatesType_FromRunningToAborted_TransitionNumber,6113,Variable\nISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted_TransitionNumber,6114,Variable\nISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning_TransitionNumber,6115,Variable\nISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded_TransitionNumber,6116,Variable\nISA95JobOrderReceiverObjectType_Store,7001,Method\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID,7002,Method\nISA95JobResponseReceiverObjectType_ReceiveJobResponse,7003,Method\nISA95JobOrderReceiverObjectType_StoreAndStart,7004,Method\nISA95JobOrderReceiverObjectType_Start,7005,Method\nISA95JobOrderReceiverObjectType_Stop,7006,Method\nISA95JobOrderReceiverObjectType_Pause,7007,Method\nISA95JobOrderReceiverObjectType_Resume,7008,Method\nISA95JobOrderReceiverObjectType_Update,7009,Method\nISA95JobOrderReceiverObjectType_Abort,7010,Method\nISA95JobOrderReceiverObjectType_Cancel,7011,Method\nISA95JobOrderReceiverObjectType_Clear,7012,Method\nISA95JobOrderReceiverObjectType_RevokeStart,7013,Method\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState,7014,Method\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.NodeIds.permissions.csv",
    "content": ""
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1001</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95PrepareStateMachineType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95PrepareStateMachineType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2771</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5089</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5090</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5055</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5088</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5054</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5053</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5052</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1002</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95JobOrderReceiverObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95JobOrderReceiverObjectType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The OPENSCSJobOrderReciverObjectType contains a method to receive job order commands and optional definitions of allowable job order information</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2771</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5040</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5085</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5044</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5043</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5045</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5051</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5042</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6033</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6088</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1003</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95JobResponseProviderObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95JobResponseProviderObjectType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The OPENSCSJobResponseProviderObjectType contains a method to receive unsolicited job response requests.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=41</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7014</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1004</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95JobResponseReceiverObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95JobResponseReceiverObjectType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A Job Response Receiver receives unsolicited Job Responses, usually as the result of completion of a job, or at intermediate points within the job.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1005</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95EndedStateMachineType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95EndedStateMachineType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2771</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5057</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5056</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5058</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1006</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95JobOrderStatusEventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95JobOrderStatusEventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=41</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5042</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5043</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5044</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5045</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5051</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5069</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5073</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5075</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5085</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>true</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1007</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95InterruptedStateMachineType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95InterruptedStateMachineType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2771</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5061</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5062</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5059</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5060</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1008</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95JobOrderReceiverSubStatesType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95JobOrderReceiverSubStatesType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5073</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5069</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5075</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5081</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5082</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5083</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5080</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3002</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95PropertyDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95PropertyDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A subtype of OPC UA Structure that defines two linked data items: an ID, which is a unique identifier for a property within the scope of the associated resource, and the value, which is the data for the property.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3003</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95ParameterDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95ParameterDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A subtype of OPC UA Structure that defines three linked data items: the ID, which is a unique identifier for a property, the value, which is the data that is identified, and an optional description of the parameter.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3005</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95EquipmentDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95EquipmentDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines an equipment resource or a piece of equipment, a quantity, an optional description, and an optional collection of properties.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3006</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95StateDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95StateDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines the information needed to schedule and execute a job.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5029</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5031</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5030</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3007</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95WorkMasterDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95WorkMasterDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a Work Master ID and the defined parameters for the Work Master.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3008</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95JobOrderDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95JobOrderDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines the information needed to schedule and execute a job.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5014</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5016</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3010</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95MaterialDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95MaterialDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a material resource, a quantity, an optional description, and an optional collection of properties.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5017</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5019</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5018</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3011</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95PersonnelDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95PersonnelDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a personnel resource or a person, a quantity, an optional description, and an optional collection of properties.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5020</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5022</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5021</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3012</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95PhysicalAssetDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95PhysicalAssetDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a physical asset, a quantity, an optional description, and an optional collection of properties.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5023</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5025</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5024</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3013</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95JobResponseDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95JobResponseDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines the information needed to schedule and execute a job.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5026</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5028</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5027</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=3015</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ISA95JobOrderAndStateDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ISA95JobOrderAndStateDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines the information needed to schedule and execute a job.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5033</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5000</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Waiting</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Waiting</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The necessary pre-conditions have not been met and the job order is not ready to run.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5090</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5088</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5054</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5001</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=11616</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=11715</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6025</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6026</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6024</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6023</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6027</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6028</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6029</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5002</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6128</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5003</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6129</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5004</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5005</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6122</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5006</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6123</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5007</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5008</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6022</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5009</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6030</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5010</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5011</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6132</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5012</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6133</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5013</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5014</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5015</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5016</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5017</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6120</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5018</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6121</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5019</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5020</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6124</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5021</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6125</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5022</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5023</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6126</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5024</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6127</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5025</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5026</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6118</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5027</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6119</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5028</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5029</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6130</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5030</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6131</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5031</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5032</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6031</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5033</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5034</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=3015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5035</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NotAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NotAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order is stored but may not be executed.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5043</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5042</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5036</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order is stored and may be executed.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5042</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5043</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5044</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5044</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5045</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5085</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5037</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Running</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Running</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order is executing.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5045</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6073</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5038</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Interrupted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Interrupted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order has been temporarily stopped.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5051</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5039</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Ended</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Ended</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order has been completed and is no longer in execution.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5051</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6075</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5040</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Aborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Aborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order is aborted.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5085</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5041</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromNotAllowedToStartToNotAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromNotAllowedToStartToNotAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the Update Method is called and the job order is modified.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5042</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromNotAllowedToStartToAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromNotAllowedToStartToAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the Start Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5043</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromAllowedToStartToNotAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromAllowedToStartToNotAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the RevokeStart Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5044</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromAllowedToStartToAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromAllowedToStartToAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the Update Method is called and the job order is modified.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6080</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5045</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromAllowedToStartToRunning</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromAllowedToStartToRunning</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when a job order is started to be executed.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6081</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5046</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromRunningToInterrupted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromRunningToInterrupted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when an executing job order gets interrupted, either internally or by the Pause Method.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6082</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5047</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromRunningToEnded</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromRunningToEnded</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the execution of a job order has finished, either internally or by the Stop Method.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6083</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5048</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromRunningToAborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromRunningToAborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Abort Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5040</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5049</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromInterruptedToAborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromInterruptedToAborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Abort Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5040</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6085</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5050</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromInterruptedToRunning</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromInterruptedToRunning</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Resume Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5051</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromInterruptedToEnded</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromInterruptedToEnded</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Stop Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5052</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Ready</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Ready</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The necessary pre-conditions have been met and the job order is ready to run, awaiting a Start command.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5089</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5055</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5088</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5054</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6089</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5053</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Loaded</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Loaded</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>In situations where only one job may be in active memory and is able to be run, then the job is loaded in active memory, the necessary pre-conditions have been met, and the job order is ready to run, awaiting a Start command.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5089</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5090</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5055</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6090</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5054</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromWaitingToReady</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromWaitingToReady</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the system is ready to start the execution of the job order.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5052</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6091</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5055</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromReadyToLoaded</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromReadyToLoaded</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the program or configuration to execute the job order is loaded.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5053</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5052</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5056</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Completed</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Completed</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order has been completed and is no longer in execution.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5058</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6093</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5057</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Closed</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Closed</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order has been completed and no further post processing is performed.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5058</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6094</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5058</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromCompletedToClosed</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromCompletedToClosed</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the system has finalized post processing of a ended job order.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5057</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5056</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6095</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5059</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Held</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Held</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order has been temporarily stopped due to a constraint of some form.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5061</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5062</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5060</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Suspended</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Suspended</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order has been temporarily stopped due to a deliberate decision within the execution system.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5061</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5062</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6097</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5061</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromHeldToSuspended</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromHeldToSuspended</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the system has switched the job order from internally held to externally suspended, for example by a call of the Pause Method.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5059</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5060</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6098</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5062</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromSuspendedToHeld</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromSuspendedToHeld</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the system has switched the job order from externally suspended to an internal held, for example by a call of the Resume Method.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5059</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5060</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6099</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5063</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NotAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NotAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order is stored but may not be executed.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5069</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5069</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=117</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5080</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6100</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5064</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order is stored and may be executed.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5073</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=117</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5081</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6101</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5065</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Running</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Running</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order is executing.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5073</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5075</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6102</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5066</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Interrupted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Interrupted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order has been temporarily stopped.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=117</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5083</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6103</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5067</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Ended</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Ended</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order has been completed and is no longer in execution.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5075</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=117</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5082</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6104</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5068</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Aborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Aborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>The job order is aborted.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6105</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5069</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromNotAllowedToStartToNotAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromNotAllowedToStartToNotAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the Update Method is called and the job order is modified.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6106</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5070</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromNotAllowedToStartToAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromNotAllowedToStartToAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the Start Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6107</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5071</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromAllowedToStartToNotAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromAllowedToStartToNotAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the RevokeStart Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6108</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5072</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromAllowedToStartToAllowedToStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromAllowedToStartToAllowedToStart</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the Update Method is called and the job order is modified.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6109</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5073</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromAllowedToStartToRunning</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromAllowedToStartToRunning</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when a job order is started to be executed.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6110</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5074</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromRunningToInterrupted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromRunningToInterrupted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when an executing job order gets interrupted, either internally or by the Pause Method.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6111</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5075</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromRunningToEnded</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromRunningToEnded</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the execution of a job order has finished, either internally or by the Stop Method.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6112</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5076</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromRunningToAborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromRunningToAborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Abort Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5077</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromInterruptedToAborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromInterruptedToAborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Abort Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6114</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5078</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromInterruptedToRunning</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromInterruptedToRunning</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Resume Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6115</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5079</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromInterruptedToEnded</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromInterruptedToEnded</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Stop Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6116</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5080</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NotAllowedToStartSubstates</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NotAllowedToStartSubstates</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Substates of NotAllowedToStart</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=117</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5081</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AllowedToStartSubstates</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AllowedToStartSubstates</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Substates of AllowedToStart</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=117</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5082</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>EndedSubstates</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EndedSubstates</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Substates of Ended</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=117</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5083</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>InterruptedSubstates</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InterruptedSubstates</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Substates of Interrupted</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=117</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5084</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromNotAllowedToStartToAborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromNotAllowedToStartToAborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Abort Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5040</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5085</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromAllowedToStartToAborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromAllowedToStartToAborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Abort Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5040</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5086</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromAllowedToStartToAborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromAllowedToStartToAborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Abort Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5087</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromNotAllowedToStartToAborted</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromNotAllowedToStartToAborted</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when Abort Method is called.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=54</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5088</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromReadyToWaiting</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromReadyToWaiting</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the system is not ready to start the execution of the job order anymore.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5052</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5089</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromLoadedToReady</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromLoadedToReady</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the program or configuration to execute the job order is unloaded.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5053</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5052</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6014</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=5090</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FromLoadedToWaiting</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FromLoadedToWaiting</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>This transition is triggered when the system is not ready to start the execution of the job order anymore.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=51</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5053</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=52</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6000</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6001</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>CurrentState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CurrentState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5080</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2760</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6002</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6003</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>CurrentState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CurrentState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5081</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2760</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6004</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6005</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>CurrentState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CurrentState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5082</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2760</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6006</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6007</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>CurrentState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CurrentState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5083</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2760</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6008</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6009</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">12</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6010</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5085</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">13</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6011</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">13</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6012</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">12</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6013</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5088</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6014</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5089</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6015</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5090</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6016</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7014</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderState</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=3006</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>Contains a job status of the JobResponse to be returned. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to null. The order of the substates is not defined.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6017</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7014</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobResponses</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=3013</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>Contains a list of information about the execution of a job order, such as the current status of the job, actual material consumed, actual material produced, actual equipment used, and job specific data.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6023</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>IsNamespaceSubset</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IsNamespaceSubset</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6024</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespacePublicationDate</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespacePublicationDate</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2024-01-31T00:00:00Z</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=13</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6025</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6026</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceVersion</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceVersion</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2.0.0</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6027</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StaticNodeIdTypes</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StaticNodeIdTypes</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Int32>0</Int32>\n          </ListOfInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=256</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6028</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StaticNumericNodeIdRange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StaticNumericNodeIdRange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <String>1:2147483647</String>\n          </ListOfString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=291</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6029</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StaticStringNodeIdPattern</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StaticStringNodeIdPattern</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6033</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>JobOrderList</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>JobOrderList</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a read-only list of job order information available from the server.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=3015</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6034</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WorkMaster</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WorkMaster</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a read-only set of work master IDs that may be specified in a job order, and the read-only set of parameters that may be specified for a specific work master.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=3007</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6035</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MaterialClassID</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MaterialClassID</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a read-only set of Material Classes IDs that may be specified in a job order.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6036</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MaterialDefinitionID</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MaterialDefinitionID</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a read-only set of Material Classes IDs that may be specified in a job order.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6037</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>EquipmentID</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EquipmentID</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a read-only set of Equipment Class IDs and Equipment IDs that may be specified in a job order.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6038</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PhysicalAssetID</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PhysicalAssetID</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a read-only set of Physical Asset Class IDs and Physical Asset IDs that may be specified in a job order.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6039</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PersonnelID</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PersonnelID</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Defines a read-only set of Personnel IDs and Person IDs that may be specified in a job order.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6040</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrder</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=3008</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6041</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6042</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains an ID of the job order, as specified by the method caller.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6043</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobResponse</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=3013</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information about the execution of a job order, such as the current status of the job, actual material consumed, actual material produced, actual equipment used, and job specific data.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6044</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobResponse</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=3013</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information about the execution of a job order, such as actual material consumed, actual material produced, actual equipment used, and job specific data.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6045</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6047</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>JobOrder</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>JobOrder</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=3008</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6048</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>JobState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>JobState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=3006</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6049</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>JobResponse</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>JobResponse</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=3013</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6050</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>JobOrderResponseList</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>JobOrderResponseList</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=3013</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6051</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrder</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=3008</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6052</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6053</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6054</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6055</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6056</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6057</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6058</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6059</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6060</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6061</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrder</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=3008</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6062</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6063</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6064</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7010</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6065</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6066</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6067</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6068</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6069</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>JobOrderID</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                  <Description>\n                    <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>2</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6070</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=7013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ReturnStatus</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>Returns the status of the method execution.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>1</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6071</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6072</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6073</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6074</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6075</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6076</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5040</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6077</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6078</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5042</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6079</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5043</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6080</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5044</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6081</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5045</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6082</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6083</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">7</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6084</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">8</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6085</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">9</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6086</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">10</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6087</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5051</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">11</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6088</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MaxDownloadableJobOrders</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MaxDownloadableJobOrders</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6089</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5052</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6090</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5053</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6091</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5054</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6092</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5055</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6093</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5056</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6094</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5057</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6095</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5058</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6096</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5059</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6097</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5060</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6098</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5061</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6099</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5062</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6100</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6101</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6102</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6103</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6104</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6105</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>StateNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StateNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6106</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5069</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6107</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6108</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6109</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6110</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5073</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6111</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6112</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5075</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">7</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6113</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">8</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6114</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">9</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6115</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">10</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=6116</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>TransitionNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TransitionNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">11</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7001</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Store</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Store</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6040</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7002</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>RequestJobResponseByJobOrderID</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>RequestJobResponseByJobOrderID</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6042</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6043</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7003</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ReceiveJobResponse</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveJobResponse</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6044</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6045</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7004</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StoreAndStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StoreAndStart</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6051</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6052</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7005</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Start</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Start</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5042</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6053</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6054</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7006</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Stop</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Stop</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5051</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5075</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6055</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6056</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7007</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Pause</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Pause</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6057</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6058</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7008</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Resume</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Resume</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6059</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6060</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7009</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Update</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Update</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5044</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5069</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6061</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6062</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7010</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Abort</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Abort</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5085</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7011</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Cancel</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Cancel</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7012</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Clear</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Clear</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7013</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>RevokeStart</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>RevokeStart</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=80</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5043</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=53</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=5071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6069</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=7014</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>RequestJobResponseByJobOrderState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>RequestJobResponseByJobOrderState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6016</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=6017</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.NodeSet2.documentation.csv",
    "content": "Id,Name,Link,ConformanceUnits\n1001,ISA95PrepareStateMachineType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.3\",\"ISA-95 Job Control Job Order Receiver SubStates;\"\n1002,ISA95JobOrderReceiverObjectType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.2\",\"ISA-95 Job Order Receiver V2;\"\n1003,ISA95JobResponseProviderObjectType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.1\",\"ISA-95 Job Response Provider V2;\"\n1004,ISA95JobResponseReceiverObjectType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.8/#7.2.8.1\",\"ISA-95 Job Response Receiver V2;\"\n1005,ISA95EndedStateMachineType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.4\",\"ISA-95 Job Control Job Order Receiver SubStates;\"\n1006,ISA95JobOrderStatusEventType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.6\",\"ISA-95 Job Control Job Response Provider Job Order Status Events;\"\n1007,ISA95InterruptedStateMachineType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.5\",\"ISA-95 Job Control Job Order Receiver SubStates;\"\n1008,ISA95JobOrderReceiverSubStatesType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.2/#7.2.2.2\",\"ISA-95 Job Control Job Order Receiver SubStates;\"\n3002,ISA95PropertyDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.9\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3003,ISA95ParameterDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.10\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3005,ISA95EquipmentDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.1\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3006,ISA95StateDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.2\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3007,ISA95WorkMasterDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.11\",\"ISA-95 Job Order Receiver V2;\"\n3008,ISA95JobOrderDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.4\",\"ISA-95 Job Order Receiver V2;\"\n3010,ISA95MaterialDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.6\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3011,ISA95PersonnelDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.7\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3012,ISA95PhysicalAssetDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.8\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3013,ISA95JobResponseDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.5\",\"ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3015,ISA95JobOrderAndStateDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.3\",\"ISA-95 Job Order Receiver V2;\"\n5001,http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/9.1\",\"\"\n7001,Store,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.3\",\"\"\n7002,RequestJobResponseByJobOrderID,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.2\",\"\"\n7003,ReceiveJobResponse,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.8/#7.2.8.2\",\"\"\n7004,StoreAndStart,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.4\",\"\"\n7005,Start,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.5\",\"\"\n7006,Stop,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.11\",\"\"\n7007,Pause,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.7\",\"\"\n7008,Resume,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.8\",\"\"\n7009,Update,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.9\",\"\"\n7010,Abort,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.10\",\"\"\n7011,Cancel,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.12\",\"\"\n7012,Clear,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.13\",\"\"\n7013,RevokeStart,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.6\",\"\"\n7014,RequestJobResponseByJobOrderState,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.3\",\"\"\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" LastModified=\"2024-01-31T00:00:00Z\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\" Version=\"2.0.0\" PublicationDate=\"2024-01-31T00:00:00Z\" ModelVersion=\"2.0.0\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.11\" PublicationDate=\"2022-03-29T00:00:00Z\" ModelVersion=\"1.4.11\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n    <Alias Alias=\"HasCause\">i=53</Alias>\n    <Alias Alias=\"ToState\">i=52</Alias>\n    <Alias Alias=\"FromState\">i=51</Alias>\n    <Alias Alias=\"HasEffect\">i=54</Alias>\n    <Alias Alias=\"HasTrueSubState\">i=9004</Alias>\n    <Alias Alias=\"HasFalseSubState\">i=9005</Alias>\n    <Alias Alias=\"HasDictionaryEntry\">i=17597</Alias>\n    <Alias Alias=\"HasCondition\">i=9006</Alias>\n    <Alias Alias=\"HasGuard\">i=15112</Alias>\n    <Alias Alias=\"HasAddIn\">i=17604</Alias>\n    <Alias Alias=\"HasInterface\">i=17603</Alias>\n  </Aliases>\n  <UADataType NodeId=\"ns=1;i=3005\" BrowseName=\"1:ISA95EquipmentDataType\">\n    <DisplayName>ISA95EquipmentDataType</DisplayName>\n    <Description>Defines an equipment resource or a piece of equipment, a quantity, an optional description, and an optional collection of properties.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5008</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5010</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5009</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95EquipmentDataType\">\n      <Field Name=\"ID\" DataType=\"i=12\">\n        <Description>An identification of an EquipmentClass or Equipment.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Additional information and description about the resource.</Description>\n      </Field>\n      <Field Name=\"EquipmentUse\" DataType=\"i=12\" IsOptional=\"true\">\n        <Description>Information about the expected use of the equipment, see the ISA 95 Part 2 standard for defined values.</Description>\n      </Field>\n      <Field Name=\"Quantity\" DataType=\"i=12878\" IsOptional=\"true\">\n        <Description>The quantity of the resource</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"i=887\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the quantity</Description>\n      </Field>\n      <Field Name=\"Properties\" DataType=\"ns=1;i=3002\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Any associated properties, or empty if there are no properties defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3015\" BrowseName=\"1:ISA95JobOrderAndStateDataType\">\n    <DisplayName>ISA95JobOrderAndStateDataType</DisplayName>\n    <Description>Defines the information needed to schedule and execute a job.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5032</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5034</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5033</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95JobOrderAndStateDataType\">\n      <Field Name=\"JobOrder\" DataType=\"ns=1;i=3008\">\n        <Description>The job order</Description>\n      </Field>\n      <Field Name=\"State\" DataType=\"ns=1;i=3006\" ValueRank=\"1\">\n        <Description>The State of the job order. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to Null. The order of the subtstates is not defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3008\" BrowseName=\"1:ISA95JobOrderDataType\">\n    <DisplayName>ISA95JobOrderDataType</DisplayName>\n    <Description>Defines the information needed to schedule and execute a job.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.4</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5014</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5016</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5015</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95JobOrderDataType\">\n      <Field Name=\"JobOrderID\" DataType=\"i=12\">\n        <Description>An identification of the Job Order.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Addition information about the Job Order The array allows to provide descriptions in different languages.</Description>\n      </Field>\n      <Field Name=\"WorkMasterID\" DataType=\"ns=1;i=3007\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Work Master associated with the job order. If multiple work masters are defined, then the execution system can select the work master based on the availability of resources.</Description>\n      </Field>\n      <Field Name=\"StartTime\" DataType=\"i=13\" IsOptional=\"true\">\n        <Description>The proposed start time for the order, may be empty if not specified</Description>\n      </Field>\n      <Field Name=\"EndTime\" DataType=\"i=13\" IsOptional=\"true\">\n        <Description>The proposed end time for the order, may be empty if not specified</Description>\n      </Field>\n      <Field Name=\"Priority\" DataType=\"i=4\" IsOptional=\"true\">\n        <Description>The priority of the job order, may be empty of not specified. Higher numbers have higher priority.  This type allows the Job Order clients to pick their own ranges, and the Job Order server only has to pick the highest number.</Description>\n      </Field>\n      <Field Name=\"JobOrderParameters\" DataType=\"ns=1;i=3003\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Key value pair with values, not associated with a resource that is provided as part of the job order, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"PersonnelRequirements\" DataType=\"ns=1;i=3011\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>A specification of any personnel requirements associated with the job order, may be empty if not specified</Description>\n      </Field>\n      <Field Name=\"EquipmentRequirements\" DataType=\"ns=1;i=3005\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>A specification of any equipment requirements associated with the job order, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"PhysicalAssetRequirements\" DataType=\"ns=1;i=3012\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>A specification of any physical asset requirements associated with the job order, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"MaterialRequirements\" DataType=\"ns=1;i=3010\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>A specification of any material requirements associated with the job order, may be empty if not specified.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3013\" BrowseName=\"1:ISA95JobResponseDataType\">\n    <DisplayName>ISA95JobResponseDataType</DisplayName>\n    <Description>Defines the information needed to schedule and execute a job.</Description>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.5</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5026</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5028</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5027</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95JobResponseDataType\">\n      <Field Name=\"JobResponseID\" DataType=\"i=12\">\n        <Description>An identification of the Job Response</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" IsOptional=\"true\">\n        <Description>Additional information about the Job Response</Description>\n      </Field>\n      <Field Name=\"JobOrderID\" DataType=\"i=12\">\n        <Description>An identification of the job order associated with the job response.</Description>\n      </Field>\n      <Field Name=\"StartTime\" DataType=\"i=13\" IsOptional=\"true\">\n        <Description>The actual start time for the order.</Description>\n      </Field>\n      <Field Name=\"EndTime\" DataType=\"i=13\" IsOptional=\"true\">\n        <Description>The actual end time for the order.</Description>\n      </Field>\n      <Field Name=\"JobState\" DataType=\"ns=1;i=3006\" ValueRank=\"1\">\n        <Description>The current state of the job. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to Null. The order of the subtstates is not defined.</Description>\n      </Field>\n      <Field Name=\"JobResponseData\" DataType=\"ns=1;i=3003\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Key value pair with values, not associated with a resource that is provided as part of the job response, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"PersonnelActuals\" DataType=\"ns=1;i=3011\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>A specification of any personnel requirements associated with the job response, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"EquipmentActuals\" DataType=\"ns=1;i=3005\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>A specification of any equipment requirements associated with the job response, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"PhysicalAssetActuals\" DataType=\"ns=1;i=3012\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>A specification of any physical asset requirements associated with the job response, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"MaterialActuals\" DataType=\"ns=1;i=3010\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>A specification of any material requirements associated with the job response, may be empty if not specified.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3010\" BrowseName=\"1:ISA95MaterialDataType\">\n    <DisplayName>ISA95MaterialDataType</DisplayName>\n    <Description>Defines a material resource, a quantity, an optional description, and an optional collection of properties.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.6</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5017</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5019</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5018</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95MaterialDataType\">\n      <Field Name=\"MaterialClassID\" DataType=\"i=12\" IsOptional=\"true\">\n        <Description>An identification of the resource, or null if the Material Class is not used to identify the material.</Description>\n      </Field>\n      <Field Name=\"MaterialDefinitionID\" DataType=\"i=12\" IsOptional=\"true\">\n        <Description>An identification of the resource, or null if the Material Definition is not used to identify the material.</Description>\n      </Field>\n      <Field Name=\"MaterialLotID\" DataType=\"i=12\" IsOptional=\"true\">\n        <Description>An identification of the resource, or null if the Material Lot is not used to identify the material.</Description>\n      </Field>\n      <Field Name=\"MaterialSublotID\" DataType=\"i=12\" IsOptional=\"true\">\n        <Description>An identification of the resource, or null if the Material Sublot is not used to identify the material.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Additional information and description about the resource.</Description>\n      </Field>\n      <Field Name=\"MaterialUse\" DataType=\"i=12\" IsOptional=\"true\">\n        <Description>Information about the expected use of the material, see the ISA 95 Part 2 standard for defined values.</Description>\n      </Field>\n      <Field Name=\"Quantity\" DataType=\"i=12878\" IsOptional=\"true\">\n        <Description>The quantity of the resource</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"i=887\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the quantity</Description>\n      </Field>\n      <Field Name=\"Properties\" DataType=\"ns=1;i=3002\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Any associated properties, or empty if there are no properties defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3003\" BrowseName=\"1:ISA95ParameterDataType\">\n    <DisplayName>ISA95ParameterDataType</DisplayName>\n    <Description>A subtype of OPC UA Structure that defines three linked data items: the ID, which is a unique identifier for a property, the value, which is the data that is identified, and an optional description of the parameter.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.10</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5005</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5007</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5006</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95ParameterDataType\">\n      <Field Name=\"ID\" DataType=\"i=12\">\n        <Description>A unique identifier for a parameter</Description>\n      </Field>\n      <Field Name=\"Value\">\n        <Description>Value of the parameter.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>An optional description of the parameter. The array allows to provide descriptions in different languages when writing. When accessing, the server shall only provide one entry in the array.</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"i=887\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the value</Description>\n      </Field>\n      <Field Name=\"Subparameters\" DataType=\"ns=1;i=3003\" ValueRank=\"1\" IsOptional=\"true\" />\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3011\" BrowseName=\"1:ISA95PersonnelDataType\">\n    <DisplayName>ISA95PersonnelDataType</DisplayName>\n    <Description>Defines a personnel resource or a person, a quantity, an optional description, and an optional collection of properties.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.7</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5020</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5022</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5021</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95PersonnelDataType\">\n      <Field Name=\"ID\" DataType=\"i=12\">\n        <Description>An identification of a Personnel Class or Person.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Additional information and description about the resource.</Description>\n      </Field>\n      <Field Name=\"PersonnelUse\" DataType=\"i=12\" IsOptional=\"true\">\n        <Description>Information about the expected use of the personnel, see the ISA 95 Part 2 standard for defined values.</Description>\n      </Field>\n      <Field Name=\"Quantity\" DataType=\"i=12878\" IsOptional=\"true\">\n        <Description>The quantity of the resource</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"i=887\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the quantity</Description>\n      </Field>\n      <Field Name=\"Properties\" DataType=\"ns=1;i=3002\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Any associated properties, or empty if there are no properties defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3012\" BrowseName=\"1:ISA95PhysicalAssetDataType\">\n    <DisplayName>ISA95PhysicalAssetDataType</DisplayName>\n    <Description>Defines a physical asset, a quantity, an optional description, and an optional collection of properties.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.8</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5023</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5025</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5024</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95PhysicalAssetDataType\">\n      <Field Name=\"ID\" DataType=\"i=12\">\n        <Description>An identification of a Physical Asset Class or Physical Asset.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Additional information and description about the resource.</Description>\n      </Field>\n      <Field Name=\"PhysicalAssetUse\" DataType=\"i=12\" IsOptional=\"true\">\n        <Description>Information about the expected use of the physical asset, see the ISA 95 Part 2 standard for defined values.</Description>\n      </Field>\n      <Field Name=\"Quantity\" DataType=\"i=12878\" IsOptional=\"true\">\n        <Description>The quantity of the resource</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"i=887\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the quantity</Description>\n      </Field>\n      <Field Name=\"Properties\" DataType=\"ns=1;i=3002\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Any associated properties, or empty if there are no properties defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3002\" BrowseName=\"1:ISA95PropertyDataType\">\n    <DisplayName>ISA95PropertyDataType</DisplayName>\n    <Description>A subtype of OPC UA Structure that defines two linked data items: an ID, which is a unique identifier for a property within the scope of the associated resource, and the value, which is the data for the property.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.9</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5002</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5004</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5003</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95PropertyDataType\">\n      <Field Name=\"ID\" DataType=\"i=12\">\n        <Description>Unique identifier for a property within the scope of the associated resource</Description>\n      </Field>\n      <Field Name=\"Value\">\n        <Description>Value for the property</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>An optional description of the parameter.</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"i=887\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the value</Description>\n      </Field>\n      <Field Name=\"Subproperties\" DataType=\"ns=1;i=3002\" ValueRank=\"1\" IsOptional=\"true\" />\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3006\" BrowseName=\"1:ISA95StateDataType\">\n    <DisplayName>ISA95StateDataType</DisplayName>\n    <Description>Defines the information needed to schedule and execute a job.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5029</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5031</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5030</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95StateDataType\">\n      <Field Name=\"BrowsePath\" DataType=\"i=540\">\n        <Description>The browse path of substates. Shall be null when the top-level state is represented.</Description>\n      </Field>\n      <Field Name=\"StateText\" DataType=\"i=21\">\n        <Description>The state represented as human readable text. Shall represent the same text as the CurrentState Variable of a StateMachine would.</Description>\n      </Field>\n      <Field Name=\"StateNumber\" DataType=\"i=7\">\n        <Description>The state represented as number. Shall represent the same number as the Number subvariable of the CurrentState Variable of a StateMachine would.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=3007\" BrowseName=\"1:ISA95WorkMasterDataType\">\n    <DisplayName>ISA95WorkMasterDataType</DisplayName>\n    <Description>Defines a Work Master ID and the defined parameters for the Work Master.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.11</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5011</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5013</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5012</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95WorkMasterDataType\">\n      <Field Name=\"ID\" DataType=\"i=12\">\n        <Description>An identification of the Work Master.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"i=21\" IsOptional=\"true\">\n        <Description>Additional information and description about the Work Master.</Description>\n      </Field>\n      <Field Name=\"Parameters\" DataType=\"ns=1;i=3003\" ValueRank=\"1\" IsOptional=\"true\">\n        <Description>Defined parameters for the Work Master.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAObjectType NodeId=\"ns=1;i=1006\" BrowseName=\"1:ISA95JobOrderStatusEventType\" IsAbstract=\"true\">\n    <DisplayName>ISA95JobOrderStatusEventType</DisplayName>\n    <Category>ISA-95 Job Control Job Response Provider Job Order Status Events</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.6</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6047</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6049</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6048</Reference>\n      <Reference ReferenceType=\"i=41\" IsForward=\"false\">ns=1;i=1003</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5045</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5051</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5073</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5078</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5079</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5085</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5087</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2041</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=6047\" BrowseName=\"1:JobOrder\" ParentNodeId=\"ns=1;i=1006\" DataType=\"ns=1;i=3008\" AccessLevel=\"3\">\n    <DisplayName>JobOrder</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1006</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6049\" BrowseName=\"1:JobResponse\" ParentNodeId=\"ns=1;i=1006\" DataType=\"ns=1;i=3013\" AccessLevel=\"3\">\n    <DisplayName>JobResponse</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1006</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6048\" BrowseName=\"1:JobState\" ParentNodeId=\"ns=1;i=1006\" DataType=\"ns=1;i=3006\" ValueRank=\"1\" ArrayDimensions=\"0\" AccessLevel=\"3\">\n    <DisplayName>JobState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1006</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1003\" BrowseName=\"1:ISA95JobResponseProviderObjectType\">\n    <DisplayName>ISA95JobResponseProviderObjectType</DisplayName>\n    <Description>The OPENSCSJobResponseProviderObjectType contains a method to receive unsolicited job response requests.</Description>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6050</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7002</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7014</Reference>\n      <Reference ReferenceType=\"i=41\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=6050\" BrowseName=\"1:JobOrderResponseList\" ParentNodeId=\"ns=1;i=1003\" DataType=\"ns=1;i=3013\" ValueRank=\"1\" ArrayDimensions=\"0\" AccessLevel=\"3\">\n    <DisplayName>JobOrderResponseList</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1003</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7002\" BrowseName=\"1:RequestJobResponseByJobOrderID\" ParentNodeId=\"ns=1;i=1003\">\n    <DisplayName>RequestJobResponseByJobOrderID</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6042</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6043</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1003</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6042\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7002\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7002</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains an ID of the job order, as specified by the method caller.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6043\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7002\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7002</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobResponse</Name>\n              <DataType>\n                <Identifier>ns=1;i=3013</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information about the execution of a job order, such as the current status of the job, actual material consumed, actual material produced, actual equipment used, and job specific data.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7014\" BrowseName=\"1:RequestJobResponseByJobOrderState\" ParentNodeId=\"ns=1;i=1003\">\n    <DisplayName>RequestJobResponseByJobOrderState</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6016</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6017</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1003</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6016\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7014\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7014</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderState</Name>\n              <DataType>\n                <Identifier>ns=1;i=3006</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>Contains a job status of the JobResponse to be returned. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to null. The order of the substates is not defined.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6017\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7014\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7014</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobResponses</Name>\n              <DataType>\n                <Identifier>ns=1;i=3013</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>Contains a list of information about the execution of a job order, such as the current status of the job, actual material consumed, actual material produced, actual equipment used, and job specific data.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1004\" BrowseName=\"1:ISA95JobResponseReceiverObjectType\">\n    <DisplayName>ISA95JobResponseReceiverObjectType</DisplayName>\n    <Description>A Job Response Receiver receives unsolicited Job Responses, usually as the result of completion of a job, or at intermediate points within the job.</Description>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.8/#7.2.8.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7003</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAMethod NodeId=\"ns=1;i=7003\" BrowseName=\"1:ReceiveJobResponse\" ParentNodeId=\"ns=1;i=1004\">\n    <DisplayName>ReceiveJobResponse</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.8/#7.2.8.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6044</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6045</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1004</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6044\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7003\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7003</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobResponse</Name>\n              <DataType>\n                <Identifier>ns=1;i=3013</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information about the execution of a job order, such as actual material consumed, actual material produced, actual equipment used, and job specific data.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6045\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7003\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7003</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1005\" BrowseName=\"1:ISA95EndedStateMachineType\">\n    <DisplayName>ISA95EndedStateMachineType</DisplayName>\n    <Category>ISA-95 Job Control Job Order Receiver SubStates</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.4</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5057</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5056</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5058</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2771</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=5057\" BrowseName=\"1:Closed\" ParentNodeId=\"ns=1;i=1005\">\n    <DisplayName>Closed</DisplayName>\n    <Description>The job order has been completed and no further post processing is performed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6094</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5058</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1005</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6094\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5057\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5057</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5056\" BrowseName=\"1:Completed\" ParentNodeId=\"ns=1;i=1005\">\n    <DisplayName>Completed</DisplayName>\n    <Description>The job order has been completed and is no longer in execution.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6093</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5058</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1005</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6093\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5056\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5056</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5058\" BrowseName=\"1:FromCompletedToClosed\" ParentNodeId=\"ns=1;i=1005\">\n    <DisplayName>FromCompletedToClosed</DisplayName>\n    <Description>This transition is triggered when the system has finalized post processing of a ended job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6095</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5057</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5056</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1005</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6095\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5058\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5058</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1007\" BrowseName=\"1:ISA95InterruptedStateMachineType\">\n    <DisplayName>ISA95InterruptedStateMachineType</DisplayName>\n    <Category>ISA-95 Job Control Job Order Receiver SubStates</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.5</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5061</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5062</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5059</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5060</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2771</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=5061\" BrowseName=\"1:FromHeldToSuspended\" ParentNodeId=\"ns=1;i=1007\">\n    <DisplayName>FromHeldToSuspended</DisplayName>\n    <Description>This transition is triggered when the system has switched the job order from internally held to externally suspended, for example by a call of the Pause Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6098</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5059</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5060</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1007</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6098\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5061\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5061</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5062\" BrowseName=\"1:FromSuspendedToHeld\" ParentNodeId=\"ns=1;i=1007\">\n    <DisplayName>FromSuspendedToHeld</DisplayName>\n    <Description>This transition is triggered when the system has switched the job order from externally suspended to an internal held, for example by a call of the Resume Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6099</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5059</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5060</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1007</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6099\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5062\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5062</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5059\" BrowseName=\"1:Held\" ParentNodeId=\"ns=1;i=1007\">\n    <DisplayName>Held</DisplayName>\n    <Description>The job order has been temporarily stopped due to a constraint of some form.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6096</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5061</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5062</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1007</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6096\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5059\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5059</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5060\" BrowseName=\"1:Suspended\" ParentNodeId=\"ns=1;i=1007\">\n    <DisplayName>Suspended</DisplayName>\n    <Description>The job order has been temporarily stopped due to a deliberate decision within the execution system.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6097</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5061</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5062</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1007</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6097\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5060\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5060</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1002\" BrowseName=\"1:ISA95JobOrderReceiverObjectType\">\n    <DisplayName>ISA95JobOrderReceiverObjectType</DisplayName>\n    <Description>The OPENSCSJobOrderReciverObjectType contains a method to receive job order commands and optional definitions of allowable job order information</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7011</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7012</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5039</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6037</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5085</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5045</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5051</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6033</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6035</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6036</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6088</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7007</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6039</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6038</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7008</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7013</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7005</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7001</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7004</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7009</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6034</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2771</Reference>\n    </References>\n  </UAObjectType>\n  <UAMethod NodeId=\"ns=1;i=7010\" BrowseName=\"1:Abort\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Abort</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.10</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6063</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6064</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5085</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5087</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6063\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7010\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7010</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6064\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7010\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7010</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5040\" BrowseName=\"1:Aborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Aborted</DisplayName>\n    <Description>The job order is aborted.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6076</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5085</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6076\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5040\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5040</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5036\" BrowseName=\"1:AllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>AllowedToStart</DisplayName>\n    <Description>The job order is stored and may be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6072</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5045</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5085</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6072\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5036\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5036</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7011\" BrowseName=\"1:Cancel\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Cancel</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.12</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6065</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6066</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6065\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7011\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7011</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6066\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7011\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7011</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7012\" BrowseName=\"1:Clear\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Clear</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.13</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6067</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6068</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6067\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7012\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7012</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6068\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7012\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7012</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5039\" BrowseName=\"1:Ended\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Ended</DisplayName>\n    <Description>The job order has been completed and is no longer in execution.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6075</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5051</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6075\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5039\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5039</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6037\" BrowseName=\"1:EquipmentID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>EquipmentID</DisplayName>\n    <Description>Defines a read-only set of Equipment Class IDs and Equipment IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5085\" BrowseName=\"1:FromAllowedToStartToAborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromAllowedToStartToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6010</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6010\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5085\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5085</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">13</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5044\" BrowseName=\"1:FromAllowedToStartToAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromAllowedToStartToAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Update Method is called and the job order is modified.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6080</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7009</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6080\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5044\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5044</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5043\" BrowseName=\"1:FromAllowedToStartToNotAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromAllowedToStartToNotAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the RevokeStart Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6079</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7013</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6079\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5043\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5043</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5045\" BrowseName=\"1:FromAllowedToStartToRunning\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromAllowedToStartToRunning</DisplayName>\n    <Description>This transition is triggered when a job order is started to be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6081</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6081\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5045\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5045</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5049\" BrowseName=\"1:FromInterruptedToAborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromInterruptedToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6085</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6085\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5049\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5049</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">9</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5051\" BrowseName=\"1:FromInterruptedToEnded\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromInterruptedToEnded</DisplayName>\n    <Description>This transition is triggered when Stop Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6087</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5039</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6087\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5051\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5051</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">11</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5050\" BrowseName=\"1:FromInterruptedToRunning\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromInterruptedToRunning</DisplayName>\n    <Description>This transition is triggered when Resume Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6086</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7008</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6086\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5050\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5050</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">10</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5084\" BrowseName=\"1:FromNotAllowedToStartToAborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromNotAllowedToStartToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6009</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6009\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5084\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5084</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">12</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5042\" BrowseName=\"1:FromNotAllowedToStartToAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromNotAllowedToStartToAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Start Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6078</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7005</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6078\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5042\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5042</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5041\" BrowseName=\"1:FromNotAllowedToStartToNotAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromNotAllowedToStartToNotAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Update Method is called and the job order is modified.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6077</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7009</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6077\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5041\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5041</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5048\" BrowseName=\"1:FromRunningToAborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromRunningToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6084</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6084\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5048\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5048</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">8</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5047\" BrowseName=\"1:FromRunningToEnded\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromRunningToEnded</DisplayName>\n    <Description>This transition is triggered when the execution of a job order has finished, either internally or by the Stop Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6083</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5039</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6083\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5047\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5047</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">7</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5046\" BrowseName=\"1:FromRunningToInterrupted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromRunningToInterrupted</DisplayName>\n    <Description>This transition is triggered when an executing job order gets interrupted, either internally or by the Pause Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6082</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7007</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6082\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5046\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5046</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5038\" BrowseName=\"1:Interrupted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Interrupted</DisplayName>\n    <Description>The job order has been temporarily stopped.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6074</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5051</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6074\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5038\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5038</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6033\" BrowseName=\"1:JobOrderList\" ParentNodeId=\"ns=1;i=1002\" DataType=\"ns=1;i=3015\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>JobOrderList</DisplayName>\n    <Description>Defines a read-only list of job order information available from the server.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6035\" BrowseName=\"1:MaterialClassID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>MaterialClassID</DisplayName>\n    <Description>Defines a read-only set of Material Classes IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6036\" BrowseName=\"1:MaterialDefinitionID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>MaterialDefinitionID</DisplayName>\n    <Description>Defines a read-only set of Material Classes IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6088\" BrowseName=\"1:MaxDownloadableJobOrders\" ParentNodeId=\"ns=1;i=1002\" DataType=\"UInt16\">\n    <DisplayName>MaxDownloadableJobOrders</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5035\" BrowseName=\"1:NotAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>NotAllowedToStart</DisplayName>\n    <Description>The job order is stored but may not be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6071</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6071\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5035\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5035</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7007\" BrowseName=\"1:Pause\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Pause</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.7</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6057</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6058</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6057\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7007\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7007</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6058\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7007\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7007</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6039\" BrowseName=\"1:PersonnelID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>PersonnelID</DisplayName>\n    <Description>Defines a read-only set of Personnel IDs and Person IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6038\" BrowseName=\"1:PhysicalAssetID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>PhysicalAssetID</DisplayName>\n    <Description>Defines a read-only set of Physical Asset Class IDs and Physical Asset IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7008\" BrowseName=\"1:Resume\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Resume</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.8</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6059</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6060</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5078</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6059\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7008\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7008</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6060\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7008\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7008</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7013\" BrowseName=\"1:RevokeStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>RevokeStart</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.6</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6069</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6070</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6069\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7013\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7013</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6070\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7013\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7013</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5037\" BrowseName=\"1:Running\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Running</DisplayName>\n    <Description>The job order is executing.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6073</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5045</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6073\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5037\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5037</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7005\" BrowseName=\"1:Start\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Start</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.5</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6053</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6054</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6053\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7005\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7005</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6054\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7005\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7005</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7006\" BrowseName=\"1:Stop\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Stop</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.11</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6055</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6056</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5051</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5079</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6055\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7006\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7006</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrderID</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6056\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7006\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7006</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7001\" BrowseName=\"1:Store\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Store</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6040</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6041</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6040\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7001\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7001</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrder</Name>\n              <DataType>\n                <Identifier>ns=1;i=3008</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6041\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7001\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7001</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7004\" BrowseName=\"1:StoreAndStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>StoreAndStart</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.4</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6051</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6052</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6051\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7004\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7004</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrder</Name>\n              <DataType>\n                <Identifier>ns=1;i=3008</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6052\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7004\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7004</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7009\" BrowseName=\"1:Update\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Update</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.9</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6061</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6062</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6061\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7009\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7009</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>JobOrder</Name>\n              <DataType>\n                <Identifier>ns=1;i=3008</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n              <Description>\n                <Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6062\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7009\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7009</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ReturnStatus</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>Returns the status of the method execution.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6034\" BrowseName=\"1:WorkMaster\" ParentNodeId=\"ns=1;i=1002\" DataType=\"ns=1;i=3007\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>WorkMaster</DisplayName>\n    <Description>Defines a read-only set of work master IDs that may be specified in a job order, and the read-only set of parameters that may be specified for a specific work master.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1008\" BrowseName=\"1:ISA95JobOrderReceiverSubStatesType\">\n    <DisplayName>ISA95JobOrderReceiverSubStatesType</DisplayName>\n    <Category>ISA-95 Job Control Job Order Receiver SubStates</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.2/#7.2.2.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5067</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5073</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5079</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5078</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5087</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5081</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5082</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5083</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5080</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=5068\" BrowseName=\"1:Aborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>Aborted</DisplayName>\n    <Description>The job order is aborted.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6105</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5087</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6105\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5068\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5068</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5064\" BrowseName=\"1:AllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>AllowedToStart</DisplayName>\n    <Description>The job order is stored and may be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6101</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5073</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"i=117\">ns=1;i=5081</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6101\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5064\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5064</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5067\" BrowseName=\"1:Ended\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>Ended</DisplayName>\n    <Description>The job order has been completed and is no longer in execution.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6104</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5079</Reference>\n      <Reference ReferenceType=\"i=117\">ns=1;i=5082</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6104\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5067\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5067</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5086\" BrowseName=\"1:FromAllowedToStartToAborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromAllowedToStartToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6011</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6011\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5086\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5086</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">13</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5072\" BrowseName=\"1:FromAllowedToStartToAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromAllowedToStartToAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Update Method is called and the job order is modified.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6109</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7009</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6109\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5072\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5072</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5071\" BrowseName=\"1:FromAllowedToStartToNotAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromAllowedToStartToNotAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the RevokeStart Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6108</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7013</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6108\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5071\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5071</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5073\" BrowseName=\"1:FromAllowedToStartToRunning\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromAllowedToStartToRunning</DisplayName>\n    <Description>This transition is triggered when a job order is started to be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6110</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6110\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5073\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5073</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5077\" BrowseName=\"1:FromInterruptedToAborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromInterruptedToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6114</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6114\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5077\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5077</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">9</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5079\" BrowseName=\"1:FromInterruptedToEnded\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromInterruptedToEnded</DisplayName>\n    <Description>This transition is triggered when Stop Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6116</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5067</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6116\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5079\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5079</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">11</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5078\" BrowseName=\"1:FromInterruptedToRunning\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromInterruptedToRunning</DisplayName>\n    <Description>This transition is triggered when Resume Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6115</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7008</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6115\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5078\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5078</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">10</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5087\" BrowseName=\"1:FromNotAllowedToStartToAborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromNotAllowedToStartToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6012</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6012\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5087\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5087</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">12</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5070\" BrowseName=\"1:FromNotAllowedToStartToAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromNotAllowedToStartToAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Start Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6107</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7005</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6107\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5070\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5070</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5069\" BrowseName=\"1:FromNotAllowedToStartToNotAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromNotAllowedToStartToNotAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Update Method is called and the job order is modified.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6106</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7009</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6106\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5069\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5069</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5076\" BrowseName=\"1:FromRunningToAborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromRunningToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6113</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6113\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5076\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5076</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">8</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5075\" BrowseName=\"1:FromRunningToEnded\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromRunningToEnded</DisplayName>\n    <Description>This transition is triggered when the execution of a job order has finished, either internally or by the Stop Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6112</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5067</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6112\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5075\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5075</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">7</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5074\" BrowseName=\"1:FromRunningToInterrupted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromRunningToInterrupted</DisplayName>\n    <Description>This transition is triggered when an executing job order gets interrupted, either internally or by the Pause Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6111</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7007</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6111\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5074\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5074</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5066\" BrowseName=\"1:Interrupted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>Interrupted</DisplayName>\n    <Description>The job order has been temporarily stopped.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6103</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5079</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5078</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"i=117\">ns=1;i=5083</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6103\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5066\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5066</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5063\" BrowseName=\"1:NotAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>NotAllowedToStart</DisplayName>\n    <Description>The job order is stored but may not be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6100</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5087</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"i=117\">ns=1;i=5080</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6100\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5063\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5063</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5065\" BrowseName=\"1:Running\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>Running</DisplayName>\n    <Description>The job order is executing.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6102</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5073</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5078</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6102\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5065\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5065</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5081\" BrowseName=\"1:AllowedToStartSubstates\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>AllowedToStartSubstates</DisplayName>\n    <Description>Substates of AllowedToStart</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6003</Reference>\n      <Reference ReferenceType=\"i=117\" IsForward=\"false\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6003\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=5081\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6004</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=5081</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6004\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=6003\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6003</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5082\" BrowseName=\"1:EndedSubstates\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>EndedSubstates</DisplayName>\n    <Description>Substates of Ended</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6005</Reference>\n      <Reference ReferenceType=\"i=117\" IsForward=\"false\">ns=1;i=5067</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6005\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=5082\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=5082</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6006\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=6005\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6005</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5083\" BrowseName=\"1:InterruptedSubstates\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>InterruptedSubstates</DisplayName>\n    <Description>Substates of Interrupted</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6007</Reference>\n      <Reference ReferenceType=\"i=117\" IsForward=\"false\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1007</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6007\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=5083\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6008</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=5083</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6008\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=6007\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6007</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5080\" BrowseName=\"1:NotAllowedToStartSubstates\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>NotAllowedToStartSubstates</DisplayName>\n    <Description>Substates of NotAllowedToStart</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6001</Reference>\n      <Reference ReferenceType=\"i=117\" IsForward=\"false\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6001\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=5080\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6002</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=5080</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6002\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=6001\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6001</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1001\" BrowseName=\"1:ISA95PrepareStateMachineType\">\n    <DisplayName>ISA95PrepareStateMachineType</DisplayName>\n    <Category>ISA-95 Job Control Job Order Receiver SubStates</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5089</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5090</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5055</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5088</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5054</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5053</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5000</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2771</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=5089\" BrowseName=\"1:FromLoadedToReady\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromLoadedToReady</DisplayName>\n    <Description>This transition is triggered when the program or configuration to execute the job order is unloaded.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6014</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5053</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6014\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5089\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5089</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5090\" BrowseName=\"1:FromLoadedToWaiting\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromLoadedToWaiting</DisplayName>\n    <Description>This transition is triggered when the system is not ready to start the execution of the job order anymore.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6015</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5053</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5000</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6015\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5090\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5090</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5055\" BrowseName=\"1:FromReadyToLoaded\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromReadyToLoaded</DisplayName>\n    <Description>This transition is triggered when the program or configuration to execute the job order is loaded.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6092</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5053</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6092\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5055\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5055</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5088\" BrowseName=\"1:FromReadyToWaiting\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromReadyToWaiting</DisplayName>\n    <Description>This transition is triggered when the system is not ready to start the execution of the job order anymore.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6013</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5000</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6013\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5088\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5088</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5054\" BrowseName=\"1:FromWaitingToReady\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromWaitingToReady</DisplayName>\n    <Description>This transition is triggered when the system is ready to start the execution of the job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6091</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5000</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6091\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5054\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5054</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5053\" BrowseName=\"1:Loaded\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>Loaded</DisplayName>\n    <Description>In situations where only one job may be in active memory and is able to be run, then the job is loaded in active memory, the necessary pre-conditions have been met, and the job order is ready to run, awaiting a Start command.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6090</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5089</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5090</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5055</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6090\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5053\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5053</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5052\" BrowseName=\"1:Ready\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>Ready</DisplayName>\n    <Description>The necessary pre-conditions have been met and the job order is ready to run, awaiting a Start command.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6089</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5089</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5055</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5088</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5054</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6089\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5052\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5052</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5000\" BrowseName=\"1:Waiting\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>Waiting</DisplayName>\n    <Description>The necessary pre-conditions have not been met and the job order is not ready to run.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6000</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5090</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5088</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5054</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6000\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5000\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5000</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5001\" BrowseName=\"1:http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\" SymbolicName=\"http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_\">\n    <DisplayName>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/9.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6025</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6026</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6024</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6023</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6027</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6028</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6029</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=11715</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=11616</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6025\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=5001\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6026\" BrowseName=\"NamespaceVersion\" ParentNodeId=\"ns=1;i=5001\" DataType=\"String\">\n    <DisplayName>NamespaceVersion</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2.0.0</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6024\" BrowseName=\"NamespacePublicationDate\" ParentNodeId=\"ns=1;i=5001\" DataType=\"DateTime\">\n    <DisplayName>NamespacePublicationDate</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2024-01-31T00:00:00Z</DateTime>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6023\" BrowseName=\"IsNamespaceSubset\" ParentNodeId=\"ns=1;i=5001\" DataType=\"Boolean\">\n    <DisplayName>IsNamespaceSubset</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6027\" BrowseName=\"StaticNodeIdTypes\" ParentNodeId=\"ns=1;i=5001\" DataType=\"i=256\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StaticNodeIdTypes</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <ListOfInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <Int32>0</Int32>\n      </ListOfInt32>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6028\" BrowseName=\"StaticNumericNodeIdRange\" ParentNodeId=\"ns=1;i=5001\" DataType=\"i=291\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StaticNumericNodeIdRange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <ListOfString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <String>1:2147483647</String>\n      </ListOfString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6029\" BrowseName=\"StaticStringNodeIdPattern\" ParentNodeId=\"ns=1;i=5001\" DataType=\"String\">\n    <DisplayName>StaticStringNodeIdPattern</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5002\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3002</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6128</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5003\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3002</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6129</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5004\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3002</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5005\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3003</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6122</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5006\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3003</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6123</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5007\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3003</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5008\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3005</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6022</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5009\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3005</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6030</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5010\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3005</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5011\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3007</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6132</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5012\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3007</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6133</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5013\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3007</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5014\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3008</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6046</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5015\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3008</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6117</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5016\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3008</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5017\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3010</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6120</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5018\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3010</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6121</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5019\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3010</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5020\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3011</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6124</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5021\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3011</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6125</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5022\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3011</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5023\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3012</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6126</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5024\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3012</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6127</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5025\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3012</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5026\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3013</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6118</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5027\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3013</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6119</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5028\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3013</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5029\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3006</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6130</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5030\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3006</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6131</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5031\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5032\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3015</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6031</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5033\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3015</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6032</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5034\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3015</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <ISA95EquipmentDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3005</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95EquipmentDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines an equipment resource or a piece of equipment, a quantity, an optional description, and an optional collection of properties.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>ID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of an EquipmentClass or Equipment.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>Additional information and description about the resource.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EquipmentUse</uax:Name>\n              <uax:Description>\n                <uax:Text>Information about the expected use of the equipment, see the ISA 95 Part 2 standard for defined values.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Quantity</uax:Name>\n              <uax:Description>\n                <uax:Text>The quantity of the resource</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12878</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EngineeringUnits</uax:Name>\n              <uax:Description>\n                <uax:Text>The Unit Of Measure of the quantity</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=887</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Properties</uax:Name>\n              <uax:Description>\n                <uax:Text>Any associated properties, or empty if there are no properties defined.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3002</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5008</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5010</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5009</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95EquipmentDataType>\n  <ISA95JobOrderAndStateDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3015</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95JobOrderAndStateDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines the information needed to schedule and execute a job.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>JobOrder</uax:Name>\n              <uax:Description>\n                <uax:Text>The job order</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3008</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>State</uax:Name>\n              <uax:Description>\n                <uax:Text>The State of the job order. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to Null. The order of the subtstates is not defined.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3006</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5032</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5034</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5033</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95JobOrderAndStateDataType>\n  <ISA95JobOrderDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3008</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95JobOrderDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines the information needed to schedule and execute a job.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>JobOrderID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of the Job Order.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>Addition information about the Job Order The array allows to provide descriptions in different languages.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>WorkMasterID</uax:Name>\n              <uax:Description>\n                <uax:Text>Work Master associated with the job order. If multiple work masters are defined, then the execution system can select the work master based on the availability of resources.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3007</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StartTime</uax:Name>\n              <uax:Description>\n                <uax:Text>The proposed start time for the order, may be empty if not specified</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=13</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EndTime</uax:Name>\n              <uax:Description>\n                <uax:Text>The proposed end time for the order, may be empty if not specified</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=13</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Priority</uax:Name>\n              <uax:Description>\n                <uax:Text>The priority of the job order, may be empty of not specified. Higher numbers have higher priority.  This type allows the Job Order clients to pick their own ranges, and the Job Order server only has to pick the highest number.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=4</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>JobOrderParameters</uax:Name>\n              <uax:Description>\n                <uax:Text>Key value pair with values, not associated with a resource that is provided as part of the job order, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3003</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>PersonnelRequirements</uax:Name>\n              <uax:Description>\n                <uax:Text>A specification of any personnel requirements associated with the job order, may be empty if not specified</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3011</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EquipmentRequirements</uax:Name>\n              <uax:Description>\n                <uax:Text>A specification of any equipment requirements associated with the job order, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3005</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>PhysicalAssetRequirements</uax:Name>\n              <uax:Description>\n                <uax:Text>A specification of any physical asset requirements associated with the job order, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3012</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>MaterialRequirements</uax:Name>\n              <uax:Description>\n                <uax:Text>A specification of any material requirements associated with the job order, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3010</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5014</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5016</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5015</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95JobOrderDataType>\n  <ISA95JobResponseDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3013</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95JobResponseDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines the information needed to schedule and execute a job.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>JobResponseID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of the Job Response</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>Additional information about the Job Response</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>JobOrderID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of the job order associated with the job response.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StartTime</uax:Name>\n              <uax:Description>\n                <uax:Text>The actual start time for the order.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=13</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EndTime</uax:Name>\n              <uax:Description>\n                <uax:Text>The actual end time for the order.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=13</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>JobState</uax:Name>\n              <uax:Description>\n                <uax:Text>The current state of the job. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to Null. The order of the subtstates is not defined.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3006</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>JobResponseData</uax:Name>\n              <uax:Description>\n                <uax:Text>Key value pair with values, not associated with a resource that is provided as part of the job response, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3003</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>PersonnelActuals</uax:Name>\n              <uax:Description>\n                <uax:Text>A specification of any personnel requirements associated with the job response, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3011</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EquipmentActuals</uax:Name>\n              <uax:Description>\n                <uax:Text>A specification of any equipment requirements associated with the job response, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3005</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>PhysicalAssetActuals</uax:Name>\n              <uax:Description>\n                <uax:Text>A specification of any physical asset requirements associated with the job response, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3012</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>MaterialActuals</uax:Name>\n              <uax:Description>\n                <uax:Text>A specification of any material requirements associated with the job response, may be empty if not specified.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3010</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5026</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5028</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5027</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95JobResponseDataType>\n  <ISA95MaterialDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3010</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95MaterialDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines a material resource, a quantity, an optional description, and an optional collection of properties.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>MaterialClassID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of the resource, or null if the Material Class is not used to identify the material.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>MaterialDefinitionID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of the resource, or null if the Material Definition is not used to identify the material.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>MaterialLotID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of the resource, or null if the Material Lot is not used to identify the material.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>MaterialSublotID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of the resource, or null if the Material Sublot is not used to identify the material.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>Additional information and description about the resource.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>MaterialUse</uax:Name>\n              <uax:Description>\n                <uax:Text>Information about the expected use of the material, see the ISA 95 Part 2 standard for defined values.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Quantity</uax:Name>\n              <uax:Description>\n                <uax:Text>The quantity of the resource</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12878</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EngineeringUnits</uax:Name>\n              <uax:Description>\n                <uax:Text>The Unit Of Measure of the quantity</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=887</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Properties</uax:Name>\n              <uax:Description>\n                <uax:Text>Any associated properties, or empty if there are no properties defined.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3002</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5017</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5019</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5018</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95MaterialDataType>\n  <ISA95ParameterDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3003</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95ParameterDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>A subtype of OPC UA Structure that defines three linked data items: the ID, which is a unique identifier for a property, the value, which is the data that is identified, and an optional description of the parameter.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>ID</uax:Name>\n              <uax:Description>\n                <uax:Text>A unique identifier for a parameter</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Value</uax:Name>\n              <uax:Description>\n                <uax:Text>Value of the parameter.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=24</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>An optional description of the parameter. The array allows to provide descriptions in different languages when writing. When accessing, the server shall only provide one entry in the array.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EngineeringUnits</uax:Name>\n              <uax:Description>\n                <uax:Text>The Unit Of Measure of the value</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=887</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Subparameters</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3003</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5005</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5007</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5006</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95ParameterDataType>\n  <ISA95PersonnelDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3011</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95PersonnelDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines a personnel resource or a person, a quantity, an optional description, and an optional collection of properties.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>ID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of a Personnel Class or Person.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>Additional information and description about the resource.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>PersonnelUse</uax:Name>\n              <uax:Description>\n                <uax:Text>Information about the expected use of the personnel, see the ISA 95 Part 2 standard for defined values.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Quantity</uax:Name>\n              <uax:Description>\n                <uax:Text>The quantity of the resource</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12878</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EngineeringUnits</uax:Name>\n              <uax:Description>\n                <uax:Text>The Unit Of Measure of the quantity</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=887</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Properties</uax:Name>\n              <uax:Description>\n                <uax:Text>Any associated properties, or empty if there are no properties defined.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3002</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5020</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5022</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5021</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95PersonnelDataType>\n  <ISA95PhysicalAssetDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3012</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95PhysicalAssetDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines a physical asset, a quantity, an optional description, and an optional collection of properties.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>ID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of a Physical Asset Class or Physical Asset.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>Additional information and description about the resource.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>PhysicalAssetUse</uax:Name>\n              <uax:Description>\n                <uax:Text>Information about the expected use of the physical asset, see the ISA 95 Part 2 standard for defined values.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Quantity</uax:Name>\n              <uax:Description>\n                <uax:Text>The quantity of the resource</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12878</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EngineeringUnits</uax:Name>\n              <uax:Description>\n                <uax:Text>The Unit Of Measure of the quantity</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=887</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Properties</uax:Name>\n              <uax:Description>\n                <uax:Text>Any associated properties, or empty if there are no properties defined.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3002</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5023</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5025</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5024</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95PhysicalAssetDataType>\n  <ISA95PropertyDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3002</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95PropertyDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>A subtype of OPC UA Structure that defines two linked data items: an ID, which is a unique identifier for a property within the scope of the associated resource, and the value, which is the data for the property.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>ID</uax:Name>\n              <uax:Description>\n                <uax:Text>Unique identifier for a property within the scope of the associated resource</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Value</uax:Name>\n              <uax:Description>\n                <uax:Text>Value for the property</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=24</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>An optional description of the parameter.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EngineeringUnits</uax:Name>\n              <uax:Description>\n                <uax:Text>The Unit Of Measure of the value</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=887</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Subproperties</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3002</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5002</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5004</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5003</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95PropertyDataType>\n  <ISA95StateDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3006</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95StateDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines the information needed to schedule and execute a job.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>BrowsePath</uax:Name>\n              <uax:Description>\n                <uax:Text>The browse path of substates. Shall be null when the top-level state is represented.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=540</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StateText</uax:Name>\n              <uax:Description>\n                <uax:Text>The state represented as human readable text. Shall represent the same text as the CurrentState Variable of a StateMachine would.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StateNumber</uax:Name>\n              <uax:Description>\n                <uax:Text>The state represented as number. Shall represent the same number as the Number subvariable of the CurrentState Variable of a StateMachine would.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=7</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5029</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5031</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5030</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95StateDataType>\n  <ISA95WorkMasterDataType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=3007</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95WorkMasterDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Defines a Work Master ID and the defined parameters for the Work Master.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>StructureWithOptionalFields_1</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>ID</uax:Name>\n              <uax:Description>\n                <uax:Text>An identification of the Work Master.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Description</uax:Name>\n              <uax:Description>\n                <uax:Text>Additional information and description about the Work Master.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Parameters</uax:Name>\n              <uax:Description>\n                <uax:Text>Defined parameters for the Work Master.</uax:Text>\n              </uax:Description>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=3003</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>true</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5011</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5013</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5012</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </ISA95WorkMasterDataType>\n  <ISA95JobOrderStatusEventType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1006</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95JobOrderStatusEventType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2041</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:IsAbstract>true</uax:IsAbstract>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=41</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1003</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5041</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5042</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5043</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5044</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5045</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5046</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5047</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5048</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5049</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5050</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5051</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5069</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5070</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5071</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5072</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5073</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5074</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5075</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5076</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5077</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5078</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5079</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5084</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5085</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5086</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=54</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=5087</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <JobOrder>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6047</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>JobOrder</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6047</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=3008</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </JobOrder>\n    <JobResponse>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6049</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>JobResponse</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6049</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=3013</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </JobResponse>\n    <JobState>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6048</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>JobState</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6048</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=3006</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </JobState>\n  </ISA95JobOrderStatusEventType>\n  <ISA95JobResponseProviderObjectType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1003</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95JobResponseProviderObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>The OPENSCSJobResponseProviderObjectType contains a method to receive unsolicited job response requests.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=41</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1006</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <JobOrderResponseList>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6050</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>JobOrderResponseList</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6050</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=3013</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </JobOrderResponseList>\n    <RequestJobResponseByJobOrderID>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7002</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>RequestJobResponseByJobOrderID</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7002</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7002</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6042</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6042</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains an ID of the job order, as specified by the method caller.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6043</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6043</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobResponse</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=3013</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information about the execution of a job order, such as the current status of the job, actual material consumed, actual material produced, actual equipment used, and job specific data.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </RequestJobResponseByJobOrderID>\n    <RequestJobResponseByJobOrderState>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7014</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>RequestJobResponseByJobOrderState</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7014</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7014</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6016</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6016</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderState</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=3006</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>Contains a job status of the JobResponse to be returned. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to null. The order of the substates is not defined.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6017</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6017</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobResponses</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=3013</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>Contains a list of information about the execution of a job order, such as the current status of the job, actual material consumed, actual material produced, actual equipment used, and job specific data.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </RequestJobResponseByJobOrderState>\n  </ISA95JobResponseProviderObjectType>\n  <ISA95JobResponseReceiverObjectType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1004</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95JobResponseReceiverObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>A Job Response Receiver receives unsolicited Job Responses, usually as the result of completion of a job, or at intermediate points within the job.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <ReceiveJobResponse>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7003</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ReceiveJobResponse</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7003</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7003</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6044</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6044</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobResponse</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=3013</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information about the execution of a job order, such as actual material consumed, actual material produced, actual equipment used, and job specific data.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6045</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6045</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </ReceiveJobResponse>\n  </ISA95JobResponseReceiverObjectType>\n  <ISA95EndedStateMachineType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1005</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95EndedStateMachineType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2771</uax:Identifier>\n    </uax:SuperTypeId>\n    <Closed>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5057</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Closed</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order has been completed and no further post processing is performed.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5057</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5058</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6094</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6094</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Closed>\n    <Completed>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5056</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Completed</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order has been completed and is no longer in execution.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5056</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5058</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6093</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6093</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Completed>\n    <FromCompletedToClosed>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5058</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromCompletedToClosed</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the system has finalized post processing of a ended job order.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5058</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5057</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5056</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6095</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6095</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromCompletedToClosed>\n  </ISA95EndedStateMachineType>\n  <ISA95InterruptedStateMachineType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1007</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95InterruptedStateMachineType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2771</uax:Identifier>\n    </uax:SuperTypeId>\n    <FromHeldToSuspended>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5061</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromHeldToSuspended</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the system has switched the job order from internally held to externally suspended, for example by a call of the Pause Method.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5061</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5059</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5060</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6098</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6098</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromHeldToSuspended>\n    <FromSuspendedToHeld>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5062</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromSuspendedToHeld</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the system has switched the job order from externally suspended to an internal held, for example by a call of the Resume Method.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5062</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5059</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5060</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6099</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6099</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromSuspendedToHeld>\n    <Held>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5059</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Held</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order has been temporarily stopped due to a constraint of some form.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5059</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5061</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5062</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6096</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6096</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Held>\n    <Suspended>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5060</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Suspended</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order has been temporarily stopped due to a deliberate decision within the execution system.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5060</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5061</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5062</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6097</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6097</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Suspended>\n  </ISA95InterruptedStateMachineType>\n  <ISA95JobOrderReceiverObjectType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1002</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95JobOrderReceiverObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>The OPENSCSJobOrderReciverObjectType contains a method to receive job order commands and optional definitions of allowable job order information</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2771</uax:Identifier>\n    </uax:SuperTypeId>\n    <Abort>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7010</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Abort</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7010</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7010</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5048</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5049</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5076</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5077</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5084</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5085</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5086</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5087</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6063</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6063</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6064</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6064</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Abort>\n    <Aborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5040</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Aborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order is aborted.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5040</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5048</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5049</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5084</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5085</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6076</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6076</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>6</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Aborted>\n    <AllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5036</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>AllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order is stored and may be executed.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5036</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5042</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5043</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5044</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5044</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5045</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5085</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6072</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6072</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </AllowedToStart>\n    <Cancel>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7011</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Cancel</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7011</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7011</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6065</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6065</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6066</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6066</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Cancel>\n    <Clear>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7012</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Clear</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7012</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7012</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6067</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6067</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6068</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6068</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Clear>\n    <Ended>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5039</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Ended</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order has been completed and is no longer in execution.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5039</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5047</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5051</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6075</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6075</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>5</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Ended>\n    <EquipmentID>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6037</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>EquipmentID</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Defines a read-only set of Equipment Class IDs and Equipment IDs that may be specified in a job order.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6037</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </EquipmentID>\n    <FromAllowedToStartToAborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5085</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromAllowedToStartToAborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Abort Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5085</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7010</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5040</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5036</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6010</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6010</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>13</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromAllowedToStartToAborted>\n    <FromAllowedToStartToAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5044</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromAllowedToStartToAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the Update Method is called and the job order is modified.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5044</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5036</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5036</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7009</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6080</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6080</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>4</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromAllowedToStartToAllowedToStart>\n    <FromAllowedToStartToNotAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5043</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromAllowedToStartToNotAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the RevokeStart Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5043</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5036</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5035</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7013</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6079</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6079</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>3</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromAllowedToStartToNotAllowedToStart>\n    <FromAllowedToStartToRunning>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5045</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromAllowedToStartToRunning</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when a job order is started to be executed.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5045</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5036</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5037</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6081</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6081</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>5</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromAllowedToStartToRunning>\n    <FromInterruptedToAborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5049</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromInterruptedToAborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Abort Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5049</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7010</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5040</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5038</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6085</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6085</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>9</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromInterruptedToAborted>\n    <FromInterruptedToEnded>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5051</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromInterruptedToEnded</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Stop Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5051</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5039</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5038</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6087</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6087</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>11</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromInterruptedToEnded>\n    <FromInterruptedToRunning>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5050</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromInterruptedToRunning</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Resume Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5050</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5038</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7008</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5037</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6086</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6086</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>10</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromInterruptedToRunning>\n    <FromNotAllowedToStartToAborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5084</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromNotAllowedToStartToAborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Abort Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5084</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7010</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5040</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5035</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6009</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6009</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>12</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromNotAllowedToStartToAborted>\n    <FromNotAllowedToStartToAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5042</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromNotAllowedToStartToAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the Start Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5042</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5036</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5035</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7005</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6078</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6078</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromNotAllowedToStartToAllowedToStart>\n    <FromNotAllowedToStartToNotAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5041</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromNotAllowedToStartToNotAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the Update Method is called and the job order is modified.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5041</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5035</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5035</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7009</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6077</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6077</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromNotAllowedToStartToNotAllowedToStart>\n    <FromRunningToAborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5048</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromRunningToAborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Abort Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5048</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7010</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5040</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5037</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6084</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6084</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>8</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromRunningToAborted>\n    <FromRunningToEnded>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5047</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromRunningToEnded</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the execution of a job order has finished, either internally or by the Stop Method.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5047</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5039</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5037</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6083</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6083</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>7</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromRunningToEnded>\n    <FromRunningToInterrupted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5046</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromRunningToInterrupted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when an executing job order gets interrupted, either internally or by the Pause Method.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5046</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5038</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7007</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5037</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6082</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6082</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>6</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromRunningToInterrupted>\n    <Interrupted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5038</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Interrupted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order has been temporarily stopped.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5038</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5049</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5051</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5050</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5046</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6074</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6074</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>4</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Interrupted>\n    <JobOrderList>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6033</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>JobOrderList</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Defines a read-only list of job order information available from the server.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6033</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=3015</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </JobOrderList>\n    <MaterialClassID>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6035</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>MaterialClassID</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Defines a read-only set of Material Classes IDs that may be specified in a job order.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6035</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </MaterialClassID>\n    <MaterialDefinitionID>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6036</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>MaterialDefinitionID</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Defines a read-only set of Material Classes IDs that may be specified in a job order.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6036</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </MaterialDefinitionID>\n    <MaxDownloadableJobOrders>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6088</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>MaxDownloadableJobOrders</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6088</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=5</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </MaxDownloadableJobOrders>\n    <NotAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5035</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NotAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order is stored but may not be executed.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5035</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5043</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5084</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5042</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5041</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5041</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6071</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6071</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </NotAllowedToStart>\n    <Pause>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7007</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Pause</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7007</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7007</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5046</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5074</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6057</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6057</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6058</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6058</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Pause>\n    <PersonnelID>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6039</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PersonnelID</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Defines a read-only set of Personnel IDs and Person IDs that may be specified in a job order.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6039</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </PersonnelID>\n    <PhysicalAssetID>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6038</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PhysicalAssetID</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Defines a read-only set of Physical Asset Class IDs and Physical Asset IDs that may be specified in a job order.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6038</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </PhysicalAssetID>\n    <Resume>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7008</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Resume</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7008</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7008</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5050</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5078</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6059</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6059</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6060</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6060</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Resume>\n    <RevokeStart>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7013</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>RevokeStart</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7013</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7013</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5043</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5071</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6069</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6069</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6070</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6070</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </RevokeStart>\n    <Running>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5037</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Running</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order is executing.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5037</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5045</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5050</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5048</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5047</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5046</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6073</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6073</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>3</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Running>\n    <Start>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7005</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Start</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7005</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7005</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5042</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5070</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6053</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6053</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6054</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6054</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Start>\n    <Stop>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7006</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Stop</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7006</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7006</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5051</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5047</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5075</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5079</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6055</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6055</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrderID</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6056</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6056</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Stop>\n    <Store>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7001</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Store</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7001</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7001</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6040</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6040</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrder</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=3008</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6041</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6041</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Store>\n    <StoreAndStart>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7004</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StoreAndStart</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7004</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7004</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6051</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6051</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrder</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=3008</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6052</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6052</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </StoreAndStart>\n    <Update>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=7009</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Update</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=7009</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>7009</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5044</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5041</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5069</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5072</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6061</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6061</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>JobOrder</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=3008</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Comment</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                    <uax:Description>\n                      <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>2</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6062</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6062</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ReturnStatus</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>Returns the status of the method execution.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>1</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </Update>\n    <WorkMaster>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6034</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>WorkMaster</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Defines a read-only set of work master IDs that may be specified in a job order, and the read-only set of parameters that may be specified for a specific work master.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>6034</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=3007</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </WorkMaster>\n  </ISA95JobOrderReceiverObjectType>\n  <ISA95JobOrderReceiverSubStatesType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1008</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95JobOrderReceiverSubStatesType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=1002</uax:Identifier>\n    </uax:SuperTypeId>\n    <Aborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5068</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Aborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order is aborted.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5068</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5076</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5077</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5087</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5086</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6105</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6105</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>6</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Aborted>\n    <AllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5064</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>AllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order is stored and may be executed.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5064</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5070</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5071</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5072</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5072</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5073</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5086</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=117</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5081</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6101</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6101</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </AllowedToStart>\n    <Ended>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5067</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Ended</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order has been completed and is no longer in execution.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5067</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5075</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5079</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=117</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5082</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6104</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6104</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>5</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Ended>\n    <FromAllowedToStartToAborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5086</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromAllowedToStartToAborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Abort Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5086</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5068</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5064</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7010</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6011</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6011</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>13</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromAllowedToStartToAborted>\n    <FromAllowedToStartToAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5072</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromAllowedToStartToAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the Update Method is called and the job order is modified.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5072</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5064</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5064</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7009</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6109</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6109</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>4</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromAllowedToStartToAllowedToStart>\n    <FromAllowedToStartToNotAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5071</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromAllowedToStartToNotAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the RevokeStart Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5071</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5064</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5063</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7013</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6108</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6108</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>3</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromAllowedToStartToNotAllowedToStart>\n    <FromAllowedToStartToRunning>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5073</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromAllowedToStartToRunning</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when a job order is started to be executed.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5073</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5064</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5065</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6110</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6110</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>5</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromAllowedToStartToRunning>\n    <FromInterruptedToAborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5077</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromInterruptedToAborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Abort Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5077</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5068</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5066</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7010</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6114</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6114</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>9</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromInterruptedToAborted>\n    <FromInterruptedToEnded>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5079</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromInterruptedToEnded</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Stop Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5079</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5067</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5066</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6116</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6116</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>11</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromInterruptedToEnded>\n    <FromInterruptedToRunning>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5078</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromInterruptedToRunning</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Resume Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5078</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5066</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5065</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7008</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6115</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6115</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>10</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromInterruptedToRunning>\n    <FromNotAllowedToStartToAborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5087</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromNotAllowedToStartToAborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Abort Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5087</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5068</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5063</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7010</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6012</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6012</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>12</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromNotAllowedToStartToAborted>\n    <FromNotAllowedToStartToAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5070</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromNotAllowedToStartToAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the Start Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5070</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5064</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5063</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7005</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6107</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6107</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromNotAllowedToStartToAllowedToStart>\n    <FromNotAllowedToStartToNotAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5069</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromNotAllowedToStartToNotAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the Update Method is called and the job order is modified.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5069</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5063</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5063</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7009</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6106</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6106</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromNotAllowedToStartToNotAllowedToStart>\n    <FromRunningToAborted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5076</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromRunningToAborted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when Abort Method is called.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5076</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5068</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5065</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7010</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6113</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6113</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>8</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromRunningToAborted>\n    <FromRunningToEnded>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5075</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromRunningToEnded</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the execution of a job order has finished, either internally or by the Stop Method.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5075</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5067</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5065</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6112</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6112</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>7</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromRunningToEnded>\n    <FromRunningToInterrupted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5074</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromRunningToInterrupted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when an executing job order gets interrupted, either internally or by the Pause Method.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5074</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5066</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=54</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=1006</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5065</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=53</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=7007</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6111</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6111</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>6</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromRunningToInterrupted>\n    <Interrupted>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5066</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Interrupted</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order has been temporarily stopped.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5066</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5077</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5079</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5078</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5074</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=117</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5083</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6103</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6103</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>4</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Interrupted>\n    <NotAllowedToStart>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5063</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NotAllowedToStart</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order is stored but may not be executed.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5063</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5071</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5087</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5070</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5069</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5069</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=117</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5080</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6100</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6100</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </NotAllowedToStart>\n    <Running>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5065</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Running</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The job order is executing.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5065</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5073</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5078</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5076</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5075</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5074</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6102</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6102</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>3</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Running>\n    <AllowedToStartSubstates>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5081</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>AllowedToStartSubstates</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Substates of AllowedToStart</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1001</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>5081</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=117</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5064</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <CurrentState xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6003</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>CurrentState</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2760</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6003</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <Id>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=6004</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Id</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>6004</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Id>\n      </CurrentState>\n    </AllowedToStartSubstates>\n    <EndedSubstates>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5082</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>EndedSubstates</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Substates of Ended</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1005</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>5082</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=117</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5067</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <CurrentState xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6005</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>CurrentState</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2760</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6005</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <Id>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=6006</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Id</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>6006</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Id>\n      </CurrentState>\n    </EndedSubstates>\n    <InterruptedSubstates>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5083</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>InterruptedSubstates</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Substates of Interrupted</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1007</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>5083</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=117</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5066</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <CurrentState xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6007</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>CurrentState</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2760</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6007</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <Id>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=6008</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Id</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>6008</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Id>\n      </CurrentState>\n    </InterruptedSubstates>\n    <NotAllowedToStartSubstates>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5080</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NotAllowedToStartSubstates</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>Substates of NotAllowedToStart</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=1001</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=80</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>5080</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=117</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5063</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <CurrentState xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6001</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>CurrentState</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=2760</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6001</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <Id>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=6002</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Id</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>6002</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Id>\n      </CurrentState>\n    </NotAllowedToStartSubstates>\n  </ISA95JobOrderReceiverSubStatesType>\n  <ISA95PrepareStateMachineType xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1001</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ISA95PrepareStateMachineType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2771</uax:Identifier>\n    </uax:SuperTypeId>\n    <FromLoadedToReady>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5089</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromLoadedToReady</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the program or configuration to execute the job order is unloaded.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5089</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5053</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5052</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6014</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6014</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>4</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromLoadedToReady>\n    <FromLoadedToWaiting>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5090</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromLoadedToWaiting</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the system is not ready to start the execution of the job order anymore.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5090</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5053</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5000</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6015</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6015</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>5</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromLoadedToWaiting>\n    <FromReadyToLoaded>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5055</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromReadyToLoaded</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the program or configuration to execute the job order is loaded.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5055</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5053</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5052</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6092</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6092</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromReadyToLoaded>\n    <FromReadyToWaiting>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5088</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromReadyToWaiting</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the system is not ready to start the execution of the job order anymore.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5088</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5052</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5000</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6013</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6013</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>3</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromReadyToWaiting>\n    <FromWaitingToReady>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5054</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FromWaitingToReady</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>This transition is triggered when the system is ready to start the execution of the job order.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2310</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5054</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5052</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5000</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <TransitionNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6091</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>TransitionNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6091</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </TransitionNumber>\n    </FromWaitingToReady>\n    <Loaded>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5053</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Loaded</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>In situations where only one job may be in active memory and is able to be run, then the job is loaded in active memory, the necessary pre-conditions have been met, and the job order is ready to run, awaiting a Start command.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5053</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5089</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5090</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5055</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6090</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6090</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>3</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Loaded>\n    <Ready>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5052</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Ready</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The necessary pre-conditions have been met and the job order is ready to run, awaiting a Start command.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5052</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5089</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5055</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5088</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5054</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6089</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6089</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>2</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Ready>\n    <Waiting>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=5000</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Waiting</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>The necessary pre-conditions have not been met and the job order is not ready to run.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2307</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>5000</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5090</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=52</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5088</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=51</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=5054</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <StateNumber xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=6000</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>StateNumber</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>6000</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:UInt32>1</uax:UInt32>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=7</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </StateNumber>\n    </Waiting>\n  </ISA95PrepareStateMachineType>\n  <http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_ xmlns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5001</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=11616</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5001</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=11715</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6025</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>6025</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <NamespaceVersion xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6026</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceVersion</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>6026</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>2.0.0</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceVersion>\n    <NamespacePublicationDate xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6024</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespacePublicationDate</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>6024</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:DateTime>2024-01-31T00:00:00Z</uax:DateTime>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=13</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespacePublicationDate>\n    <IsNamespaceSubset xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6023</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>IsNamespaceSubset</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>6023</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>false</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </IsNamespaceSubset>\n    <StaticNodeIdTypes xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6027</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>StaticNodeIdTypes</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>6027</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:ListOfInt32>\n            <uax:Int32>0</uax:Int32>\n          </uax:ListOfInt32>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=256</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StaticNodeIdTypes>\n    <StaticNumericNodeIdRange xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6028</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>StaticNumericNodeIdRange</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>6028</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:ListOfString>\n            <uax:String>1:2147483647</uax:String>\n          </uax:ListOfString>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=291</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StaticNumericNodeIdRange>\n    <StaticStringNodeIdPattern xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=6029</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>StaticStringNodeIdPattern</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>6029</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>0</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StaticStringNodeIdPattern>\n  </http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5002</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5002</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3002</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6128</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5003</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5003</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3002</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6129</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5004</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5004</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3002</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5005</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5005</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3003</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6122</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5006</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5006</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3003</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6123</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5007</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5007</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3003</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5008</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5008</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3005</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6022</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5009</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5009</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3005</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6030</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5010</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5010</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3005</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5011</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5011</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3007</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6132</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5012</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5012</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3007</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6133</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5013</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5013</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3007</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5014</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5014</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3008</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6046</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5015</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5015</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3008</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6117</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5016</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5016</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3008</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5017</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5017</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3010</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6120</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5018</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5018</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3010</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6121</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5019</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5019</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3010</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5020</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5020</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3011</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6124</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5021</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5021</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3011</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6125</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5022</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5022</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3011</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5023</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5023</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3012</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6126</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5024</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5024</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3012</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6127</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5025</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5025</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3012</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5026</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5026</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3013</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6118</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5027</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5027</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3013</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6119</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5028</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5028</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3013</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5029</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5029</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3006</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6130</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5030</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5030</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3006</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6131</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5031</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5031</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3006</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5032</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5032</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3015</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6031</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5033</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5033</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3015</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=6032</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=5034</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>5034</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=3015</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n  <opc:StructuredType Name=\"ISA95EquipmentDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines an equipment resource or a piece of equipment, a quantity, an optional description, and an optional collection of properties.</opc:Documentation>\n    <opc:Field Name=\"ID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"NoOfDescription\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfDescription\" />\n    <opc:Field Name=\"EquipmentUse\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Quantity\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"EngineeringUnits\" TypeName=\"ua:EUInformation\" />\n    <opc:Field Name=\"NoOfProperties\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Properties\" TypeName=\"tns:ISA95PropertyDataType\" LengthField=\"NoOfProperties\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95JobOrderAndStateDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines the information needed to schedule and execute a job.</opc:Documentation>\n    <opc:Field Name=\"JobOrder\" TypeName=\"tns:ISA95JobOrderDataType\" />\n    <opc:Field Name=\"NoOfState\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"State\" TypeName=\"tns:ISA95StateDataType\" LengthField=\"NoOfState\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95JobOrderDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines the information needed to schedule and execute a job.</opc:Documentation>\n    <opc:Field Name=\"JobOrderID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"NoOfDescription\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfDescription\" />\n    <opc:Field Name=\"NoOfWorkMasterID\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"WorkMasterID\" TypeName=\"tns:ISA95WorkMasterDataType\" LengthField=\"NoOfWorkMasterID\" />\n    <opc:Field Name=\"StartTime\" TypeName=\"opc:DateTime\" />\n    <opc:Field Name=\"EndTime\" TypeName=\"opc:DateTime\" />\n    <opc:Field Name=\"Priority\" TypeName=\"opc:Int16\" />\n    <opc:Field Name=\"NoOfJobOrderParameters\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"JobOrderParameters\" TypeName=\"tns:ISA95ParameterDataType\" LengthField=\"NoOfJobOrderParameters\" />\n    <opc:Field Name=\"NoOfPersonnelRequirements\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"PersonnelRequirements\" TypeName=\"tns:ISA95PersonnelDataType\" LengthField=\"NoOfPersonnelRequirements\" />\n    <opc:Field Name=\"NoOfEquipmentRequirements\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"EquipmentRequirements\" TypeName=\"tns:ISA95EquipmentDataType\" LengthField=\"NoOfEquipmentRequirements\" />\n    <opc:Field Name=\"NoOfPhysicalAssetRequirements\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"PhysicalAssetRequirements\" TypeName=\"tns:ISA95PhysicalAssetDataType\" LengthField=\"NoOfPhysicalAssetRequirements\" />\n    <opc:Field Name=\"NoOfMaterialRequirements\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"MaterialRequirements\" TypeName=\"tns:ISA95MaterialDataType\" LengthField=\"NoOfMaterialRequirements\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95JobResponseDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines the information needed to schedule and execute a job.</opc:Documentation>\n    <opc:Field Name=\"JobResponseID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" />\n    <opc:Field Name=\"JobOrderID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"StartTime\" TypeName=\"opc:DateTime\" />\n    <opc:Field Name=\"EndTime\" TypeName=\"opc:DateTime\" />\n    <opc:Field Name=\"NoOfJobState\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"JobState\" TypeName=\"tns:ISA95StateDataType\" LengthField=\"NoOfJobState\" />\n    <opc:Field Name=\"NoOfJobResponseData\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"JobResponseData\" TypeName=\"tns:ISA95ParameterDataType\" LengthField=\"NoOfJobResponseData\" />\n    <opc:Field Name=\"NoOfPersonnelActuals\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"PersonnelActuals\" TypeName=\"tns:ISA95PersonnelDataType\" LengthField=\"NoOfPersonnelActuals\" />\n    <opc:Field Name=\"NoOfEquipmentActuals\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"EquipmentActuals\" TypeName=\"tns:ISA95EquipmentDataType\" LengthField=\"NoOfEquipmentActuals\" />\n    <opc:Field Name=\"NoOfPhysicalAssetActuals\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"PhysicalAssetActuals\" TypeName=\"tns:ISA95PhysicalAssetDataType\" LengthField=\"NoOfPhysicalAssetActuals\" />\n    <opc:Field Name=\"NoOfMaterialActuals\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"MaterialActuals\" TypeName=\"tns:ISA95MaterialDataType\" LengthField=\"NoOfMaterialActuals\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95MaterialDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines a material resource, a quantity, an optional description, and an optional collection of properties.</opc:Documentation>\n    <opc:Field Name=\"MaterialClassID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"MaterialDefinitionID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"MaterialLotID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"MaterialSublotID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"NoOfDescription\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfDescription\" />\n    <opc:Field Name=\"MaterialUse\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Quantity\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"EngineeringUnits\" TypeName=\"ua:EUInformation\" />\n    <opc:Field Name=\"NoOfProperties\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Properties\" TypeName=\"tns:ISA95PropertyDataType\" LengthField=\"NoOfProperties\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95ParameterDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>A subtype of OPC UA Structure that defines three linked data items: the ID, which is a unique identifier for a property, the value, which is the data that is identified, and an optional description of the parameter.</opc:Documentation>\n    <opc:Field Name=\"ID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Value\" TypeName=\"ua:Variant\" />\n    <opc:Field Name=\"NoOfDescription\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfDescription\" />\n    <opc:Field Name=\"EngineeringUnits\" TypeName=\"ua:EUInformation\" />\n    <opc:Field Name=\"NoOfSubparameters\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Subparameters\" TypeName=\"tns:ISA95ParameterDataType\" LengthField=\"NoOfSubparameters\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95PersonnelDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines a personnel resource or a person, a quantity, an optional description, and an optional collection of properties.</opc:Documentation>\n    <opc:Field Name=\"ID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"NoOfDescription\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfDescription\" />\n    <opc:Field Name=\"PersonnelUse\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Quantity\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"EngineeringUnits\" TypeName=\"ua:EUInformation\" />\n    <opc:Field Name=\"NoOfProperties\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Properties\" TypeName=\"tns:ISA95PropertyDataType\" LengthField=\"NoOfProperties\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95PhysicalAssetDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines a physical asset, a quantity, an optional description, and an optional collection of properties.</opc:Documentation>\n    <opc:Field Name=\"ID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"NoOfDescription\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfDescription\" />\n    <opc:Field Name=\"PhysicalAssetUse\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Quantity\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"EngineeringUnits\" TypeName=\"ua:EUInformation\" />\n    <opc:Field Name=\"NoOfProperties\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Properties\" TypeName=\"tns:ISA95PropertyDataType\" LengthField=\"NoOfProperties\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95PropertyDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>A subtype of OPC UA Structure that defines two linked data items: an ID, which is a unique identifier for a property within the scope of the associated resource, and the value, which is the data for the property.</opc:Documentation>\n    <opc:Field Name=\"ID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Value\" TypeName=\"ua:Variant\" />\n    <opc:Field Name=\"NoOfDescription\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfDescription\" />\n    <opc:Field Name=\"EngineeringUnits\" TypeName=\"ua:EUInformation\" />\n    <opc:Field Name=\"NoOfSubproperties\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Subproperties\" TypeName=\"tns:ISA95PropertyDataType\" LengthField=\"NoOfSubproperties\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95StateDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines the information needed to schedule and execute a job.</opc:Documentation>\n    <opc:Field Name=\"BrowsePath\" TypeName=\"ua:RelativePath\" />\n    <opc:Field Name=\"StateText\" TypeName=\"ua:LocalizedText\" />\n    <opc:Field Name=\"StateNumber\" TypeName=\"opc:UInt32\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ISA95WorkMasterDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Defines a Work Master ID and the defined parameters for the Work Master.</opc:Documentation>\n    <opc:Field Name=\"ID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Description\" TypeName=\"ua:LocalizedText\" />\n    <opc:Field Name=\"NoOfParameters\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Parameters\" TypeName=\"tns:ISA95ParameterDataType\" LengthField=\"NoOfParameters\" />\n  </opc:StructuredType>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Design/UAModel.ISA95_JOBCONTROL_V2.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\"\n  targetNamespace=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:annotation>\n    <xs:appinfo>\n      <ua:Model ModelUri=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\" Version=\"2.0.0\" PublicationDate=\"2024-01-31T00:00:00Z\" />\n    </xs:appinfo>\n  </xs:annotation>\n  \n  <xs:import namespace=\"http://opcfoundation.org/UA/\" />\n\n  <xs:complexType name=\"ISA95EquipmentDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines an equipment resource or a piece of equipment, a quantity, an optional description, and an optional collection of properties.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"ID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Description\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EquipmentUse\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Quantity\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EngineeringUnits\" type=\"ua:EUInformation\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Properties\" type=\"tns:ListOfISA95PropertyDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95EquipmentDataType\" type=\"tns:ISA95EquipmentDataType\" />\n\n  <xs:complexType name=\"ListOfISA95EquipmentDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95EquipmentDataType\" type=\"tns:ISA95EquipmentDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95EquipmentDataType\" type=\"tns:ListOfISA95EquipmentDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95JobOrderAndStateDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines the information needed to schedule and execute a job.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"JobOrder\" type=\"tns:ISA95JobOrderDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"State\" type=\"tns:ListOfISA95StateDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95JobOrderAndStateDataType\" type=\"tns:ISA95JobOrderAndStateDataType\" />\n\n  <xs:complexType name=\"ListOfISA95JobOrderAndStateDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95JobOrderAndStateDataType\" type=\"tns:ISA95JobOrderAndStateDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95JobOrderAndStateDataType\" type=\"tns:ListOfISA95JobOrderAndStateDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95JobOrderDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines the information needed to schedule and execute a job.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"JobOrderID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Description\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"WorkMasterID\" type=\"tns:ListOfISA95WorkMasterDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StartTime\" type=\"xs:dateTime\" minOccurs=\"0\" />\n      <xs:element name=\"EndTime\" type=\"xs:dateTime\" minOccurs=\"0\" />\n      <xs:element name=\"Priority\" type=\"xs:short\" minOccurs=\"0\" />\n      <xs:element name=\"JobOrderParameters\" type=\"tns:ListOfISA95ParameterDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"PersonnelRequirements\" type=\"tns:ListOfISA95PersonnelDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EquipmentRequirements\" type=\"tns:ListOfISA95EquipmentDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"PhysicalAssetRequirements\" type=\"tns:ListOfISA95PhysicalAssetDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"MaterialRequirements\" type=\"tns:ListOfISA95MaterialDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95JobOrderDataType\" type=\"tns:ISA95JobOrderDataType\" />\n\n  <xs:complexType name=\"ListOfISA95JobOrderDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95JobOrderDataType\" type=\"tns:ISA95JobOrderDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95JobOrderDataType\" type=\"tns:ListOfISA95JobOrderDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95JobResponseDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines the information needed to schedule and execute a job.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"JobResponseID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Description\" type=\"ua:LocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"JobOrderID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StartTime\" type=\"xs:dateTime\" minOccurs=\"0\" />\n      <xs:element name=\"EndTime\" type=\"xs:dateTime\" minOccurs=\"0\" />\n      <xs:element name=\"JobState\" type=\"tns:ListOfISA95StateDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"JobResponseData\" type=\"tns:ListOfISA95ParameterDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"PersonnelActuals\" type=\"tns:ListOfISA95PersonnelDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EquipmentActuals\" type=\"tns:ListOfISA95EquipmentDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"PhysicalAssetActuals\" type=\"tns:ListOfISA95PhysicalAssetDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"MaterialActuals\" type=\"tns:ListOfISA95MaterialDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95JobResponseDataType\" type=\"tns:ISA95JobResponseDataType\" />\n\n  <xs:complexType name=\"ListOfISA95JobResponseDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95JobResponseDataType\" type=\"tns:ISA95JobResponseDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95JobResponseDataType\" type=\"tns:ListOfISA95JobResponseDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95MaterialDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines a material resource, a quantity, an optional description, and an optional collection of properties.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"MaterialClassID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"MaterialDefinitionID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"MaterialLotID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"MaterialSublotID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Description\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"MaterialUse\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Quantity\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EngineeringUnits\" type=\"ua:EUInformation\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Properties\" type=\"tns:ListOfISA95PropertyDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95MaterialDataType\" type=\"tns:ISA95MaterialDataType\" />\n\n  <xs:complexType name=\"ListOfISA95MaterialDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95MaterialDataType\" type=\"tns:ISA95MaterialDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95MaterialDataType\" type=\"tns:ListOfISA95MaterialDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95ParameterDataType\">\n    <xs:annotation>\n      <xs:documentation>A subtype of OPC UA Structure that defines three linked data items: the ID, which is a unique identifier for a property, the value, which is the data that is identified, and an optional description of the parameter.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"ID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Value\" type=\"ua:Variant\" minOccurs=\"0\" />\n      <xs:element name=\"Description\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EngineeringUnits\" type=\"ua:EUInformation\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Subparameters\" type=\"tns:ListOfISA95ParameterDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95ParameterDataType\" type=\"tns:ISA95ParameterDataType\" />\n\n  <xs:complexType name=\"ListOfISA95ParameterDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95ParameterDataType\" type=\"tns:ISA95ParameterDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95ParameterDataType\" type=\"tns:ListOfISA95ParameterDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95PersonnelDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines a personnel resource or a person, a quantity, an optional description, and an optional collection of properties.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"ID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Description\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"PersonnelUse\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Quantity\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EngineeringUnits\" type=\"ua:EUInformation\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Properties\" type=\"tns:ListOfISA95PropertyDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95PersonnelDataType\" type=\"tns:ISA95PersonnelDataType\" />\n\n  <xs:complexType name=\"ListOfISA95PersonnelDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95PersonnelDataType\" type=\"tns:ISA95PersonnelDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95PersonnelDataType\" type=\"tns:ListOfISA95PersonnelDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95PhysicalAssetDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines a physical asset, a quantity, an optional description, and an optional collection of properties.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"ID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Description\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"PhysicalAssetUse\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Quantity\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EngineeringUnits\" type=\"ua:EUInformation\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Properties\" type=\"tns:ListOfISA95PropertyDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95PhysicalAssetDataType\" type=\"tns:ISA95PhysicalAssetDataType\" />\n\n  <xs:complexType name=\"ListOfISA95PhysicalAssetDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95PhysicalAssetDataType\" type=\"tns:ISA95PhysicalAssetDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95PhysicalAssetDataType\" type=\"tns:ListOfISA95PhysicalAssetDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95PropertyDataType\">\n    <xs:annotation>\n      <xs:documentation>A subtype of OPC UA Structure that defines two linked data items: an ID, which is a unique identifier for a property within the scope of the associated resource, and the value, which is the data for the property.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"ID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Value\" type=\"ua:Variant\" minOccurs=\"0\" />\n      <xs:element name=\"Description\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EngineeringUnits\" type=\"ua:EUInformation\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Subproperties\" type=\"tns:ListOfISA95PropertyDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95PropertyDataType\" type=\"tns:ISA95PropertyDataType\" />\n\n  <xs:complexType name=\"ListOfISA95PropertyDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95PropertyDataType\" type=\"tns:ISA95PropertyDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95PropertyDataType\" type=\"tns:ListOfISA95PropertyDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95StateDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines the information needed to schedule and execute a job.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"BrowsePath\" type=\"ua:RelativePath\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StateText\" type=\"ua:LocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StateNumber\" type=\"xs:unsignedInt\" minOccurs=\"0\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95StateDataType\" type=\"tns:ISA95StateDataType\" />\n\n  <xs:complexType name=\"ListOfISA95StateDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95StateDataType\" type=\"tns:ISA95StateDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95StateDataType\" type=\"tns:ListOfISA95StateDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ISA95WorkMasterDataType\">\n    <xs:annotation>\n      <xs:documentation>Defines a Work Master ID and the defined parameters for the Work Master.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"ID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Description\" type=\"ua:LocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Parameters\" type=\"tns:ListOfISA95ParameterDataType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ISA95WorkMasterDataType\" type=\"tns:ISA95WorkMasterDataType\" />\n\n  <xs:complexType name=\"ListOfISA95WorkMasterDataType\">\n    <xs:sequence>\n      <xs:element name=\"ISA95WorkMasterDataType\" type=\"tns:ISA95WorkMasterDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfISA95WorkMasterDataType\" type=\"tns:ListOfISA95WorkMasterDataType\" nillable=\"true\"></xs:element>\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Nodesets/opc.ua.isa95-jobcontrol.nodeids.csv",
    "content": "ISA95PrepareStateMachineType,1001,ObjectType\nISA95JobOrderReceiverObjectType,1002,ObjectType\nISA95JobResponseProviderObjectType,1003,ObjectType\nISA95JobResponseReceiverObjectType,1004,ObjectType\nISA95EndedStateMachineType,1005,ObjectType\nISA95JobOrderStatusEventType,1006,ObjectType\nISA95InterruptedStateMachineType,1007,ObjectType\nISA95JobOrderReceiverSubStatesType,1008,ObjectType\nISA95PropertyDataType,3002,DataType\nISA95ParameterDataType,3003,DataType\nISA95EquipmentDataType,3005,DataType\nISA95StateDataType,3006,DataType\nISA95WorkMasterDataType,3007,DataType\nISA95JobOrderDataType,3008,DataType\nISA95MaterialDataType,3010,DataType\nISA95PersonnelDataType,3011,DataType\nISA95PhysicalAssetDataType,3012,DataType\nISA95JobResponseDataType,3013,DataType\nISA95JobOrderAndStateDataType,3015,DataType\nISA95PrepareStateMachineType_Waiting,5000,Object\nServer_Namespaces_http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_,5001,Object\nISA95PropertyDataType_Encoding_DefaultBinary,5002,Object\nISA95PropertyDataType_Encoding_DefaultXml,5003,Object\nISA95PropertyDataType_Encoding_DefaultJson,5004,Object\nISA95ParameterDataType_Encoding_DefaultBinary,5005,Object\nISA95ParameterDataType_Encoding_DefaultXml,5006,Object\nISA95ParameterDataType_Encoding_DefaultJson,5007,Object\nISA95EquipmentDataType_Encoding_DefaultBinary,5008,Object\nISA95EquipmentDataType_Encoding_DefaultXml,5009,Object\nISA95EquipmentDataType_Encoding_DefaultJson,5010,Object\nISA95WorkMasterDataType_Encoding_DefaultBinary,5011,Object\nISA95WorkMasterDataType_Encoding_DefaultXml,5012,Object\nISA95WorkMasterDataType_Encoding_DefaultJson,5013,Object\nISA95JobOrderDataType_Encoding_DefaultBinary,5014,Object\nISA95JobOrderDataType_Encoding_DefaultXml,5015,Object\nISA95JobOrderDataType_Encoding_DefaultJson,5016,Object\nISA95MaterialDataType_Encoding_DefaultBinary,5017,Object\nISA95MaterialDataType_Encoding_DefaultXml,5018,Object\nISA95MaterialDataType_Encoding_DefaultJson,5019,Object\nISA95PersonnelDataType_Encoding_DefaultBinary,5020,Object\nISA95PersonnelDataType_Encoding_DefaultXml,5021,Object\nISA95PersonnelDataType_Encoding_DefaultJson,5022,Object\nISA95PhysicalAssetDataType_Encoding_DefaultBinary,5023,Object\nISA95PhysicalAssetDataType_Encoding_DefaultXml,5024,Object\nISA95PhysicalAssetDataType_Encoding_DefaultJson,5025,Object\nISA95JobResponseDataType_Encoding_DefaultBinary,5026,Object\nISA95JobResponseDataType_Encoding_DefaultXml,5027,Object\nISA95JobResponseDataType_Encoding_DefaultJson,5028,Object\nISA95StateDataType_Encoding_DefaultBinary,5029,Object\nISA95StateDataType_Encoding_DefaultXml,5030,Object\nISA95StateDataType_Encoding_DefaultJson,5031,Object\nISA95JobOrderAndStateDataType_Encoding_DefaultBinary,5032,Object\nISA95JobOrderAndStateDataType_Encoding_DefaultXml,5033,Object\nISA95JobOrderAndStateDataType_Encoding_DefaultJson,5034,Object\nISA95JobOrderReceiverObjectType_NotAllowedToStart,5035,Object\nISA95JobOrderReceiverObjectType_AllowedToStart,5036,Object\nISA95JobOrderReceiverObjectType_Running,5037,Object\nISA95JobOrderReceiverObjectType_Interrupted,5038,Object\nISA95JobOrderReceiverObjectType_Ended,5039,Object\nISA95JobOrderReceiverObjectType_Aborted,5040,Object\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart,5041,Object\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart,5042,Object\nISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart,5043,Object\nISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart,5044,Object\nISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning,5045,Object\nISA95JobOrderReceiverObjectType_FromRunningToInterrupted,5046,Object\nISA95JobOrderReceiverObjectType_FromRunningToEnded,5047,Object\nISA95JobOrderReceiverObjectType_FromRunningToAborted,5048,Object\nISA95JobOrderReceiverObjectType_FromInterruptedToAborted,5049,Object\nISA95JobOrderReceiverObjectType_FromInterruptedToRunning,5050,Object\nISA95JobOrderReceiverObjectType_FromInterruptedToEnded,5051,Object\nISA95PrepareStateMachineType_Ready,5052,Object\nISA95PrepareStateMachineType_Loaded,5053,Object\nISA95PrepareStateMachineType_FromWaitingToReady,5054,Object\nISA95PrepareStateMachineType_FromReadyToLoaded,5055,Object\nISA95EndedStateMachineType_Completed,5056,Object\nISA95EndedStateMachineType_Closed,5057,Object\nISA95EndedStateMachineType_FromCompletedToClosed,5058,Object\nISA95InterruptedStateMachineType_Held,5059,Object\nISA95InterruptedStateMachineType_Suspended,5060,Object\nISA95InterruptedStateMachineType_FromHeldToSuspended,5061,Object\nISA95InterruptedStateMachineType_FromSuspendedToHeld,5062,Object\nISA95JobOrderReceiverSubStatesType_NotAllowedToStart,5063,Object\nISA95JobOrderReceiverSubStatesType_AllowedToStart,5064,Object\nISA95JobOrderReceiverSubStatesType_Running,5065,Object\nISA95JobOrderReceiverSubStatesType_Interrupted,5066,Object\nISA95JobOrderReceiverSubStatesType_Ended,5067,Object\nISA95JobOrderReceiverSubStatesType_Aborted,5068,Object\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart,5069,Object\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart,5070,Object\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart,5071,Object\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart,5072,Object\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning,5073,Object\nISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted,5074,Object\nISA95JobOrderReceiverSubStatesType_FromRunningToEnded,5075,Object\nISA95JobOrderReceiverSubStatesType_FromRunningToAborted,5076,Object\nISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted,5077,Object\nISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning,5078,Object\nISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded,5079,Object\nISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates,5080,Object\nISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates,5081,Object\nISA95JobOrderReceiverSubStatesType_EndedSubstates,5082,Object\nISA95JobOrderReceiverSubStatesType_InterruptedSubstates,5083,Object\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted,5084,Object\nISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted,5085,Object\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted,5086,Object\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted,5087,Object\nISA95PrepareStateMachineType_FromReadyToWaiting,5088,Object\nISA95PrepareStateMachineType_FromLoadedToReady,5089,Object\nISA95PrepareStateMachineType_FromLoadedToWaiting,5090,Object\nISA95PrepareStateMachineType_Waiting_StateNumber,6000,Variable\nISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState,6001,Variable\nISA95JobOrderReceiverSubStatesType_NotAllowedToStartSubstates_CurrentState_Id,6002,Variable\nISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState,6003,Variable\nISA95JobOrderReceiverSubStatesType_AllowedToStartSubstates_CurrentState_Id,6004,Variable\nISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState,6005,Variable\nISA95JobOrderReceiverSubStatesType_EndedSubstates_CurrentState_Id,6006,Variable\nISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState,6007,Variable\nISA95JobOrderReceiverSubStatesType_InterruptedSubstates_CurrentState_Id,6008,Variable\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAborted_TransitionNumber,6009,Variable\nISA95JobOrderReceiverObjectType_FromAllowedToStartToAborted_TransitionNumber,6010,Variable\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAborted_TransitionNumber,6011,Variable\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAborted_TransitionNumber,6012,Variable\nISA95PrepareStateMachineType_FromReadyToWaiting_TransitionNumber,6013,Variable\nISA95PrepareStateMachineType_FromLoadedToReady_TransitionNumber,6014,Variable\nISA95PrepareStateMachineType_FromLoadedToWaiting_TransitionNumber,6015,Variable\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_InputArguments,6016,Variable\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState_OutputArguments,6017,Variable\nTypeDictionary_BinarySchema,6018,Variable\nTypeDictionary_BinarySchema_NamespaceUri,6019,Variable\nTypeDictionary_XmlSchema,6020,Variable\nTypeDictionary_XmlSchema_NamespaceUri,6021,Variable\nTypeDictionary_BinarySchema_ISA95EquipmentDataType,6022,Variable\nServer_Namespaces_http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__IsNamespaceSubset,6023,Variable\nServer_Namespaces_http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespacePublicationDate,6024,Variable\nServer_Namespaces_http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceUri,6025,Variable\nServer_Namespaces_http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__NamespaceVersion,6026,Variable\nServer_Namespaces_http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNodeIdTypes,6027,Variable\nServer_Namespaces_http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticNumericNodeIdRange,6028,Variable\nServer_Namespaces_http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2__StaticStringNodeIdPattern,6029,Variable\nTypeDictionary_XmlSchema_ISA95EquipmentDataType,6030,Variable\nTypeDictionary_BinarySchema_ISA95JobOrderAndStateDataType,6031,Variable\nTypeDictionary_XmlSchema_ISA95JobOrderAndStateDataType,6032,Variable\nISA95JobOrderReceiverObjectType_JobOrderList,6033,Variable\nISA95JobOrderReceiverObjectType_WorkMaster,6034,Variable\nISA95JobOrderReceiverObjectType_MaterialClassID,6035,Variable\nISA95JobOrderReceiverObjectType_MaterialDefinitionID,6036,Variable\nISA95JobOrderReceiverObjectType_EquipmentID,6037,Variable\nISA95JobOrderReceiverObjectType_PhysicalAssetID,6038,Variable\nISA95JobOrderReceiverObjectType_PersonnelID,6039,Variable\nISA95JobOrderReceiverObjectType_Store_InputArguments,6040,Variable\nISA95JobOrderReceiverObjectType_Store_OutputArguments,6041,Variable\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_InputArguments,6042,Variable\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID_OutputArguments,6043,Variable\nISA95JobResponseReceiverObjectType_ReceiveJobResponse_InputArguments,6044,Variable\nISA95JobResponseReceiverObjectType_ReceiveJobResponse_OutputArguments,6045,Variable\nTypeDictionary_BinarySchema_ISA95JobOrderDataType,6046,Variable\nISA95JobOrderStatusEventType_JobOrder,6047,Variable\nISA95JobOrderStatusEventType_JobState,6048,Variable\nISA95JobOrderStatusEventType_JobResponse,6049,Variable\nISA95JobResponseProviderObjectType_JobOrderResponseList,6050,Variable\nISA95JobOrderReceiverObjectType_StoreAndStart_InputArguments,6051,Variable\nISA95JobOrderReceiverObjectType_StoreAndStart_OutputArguments,6052,Variable\nISA95JobOrderReceiverObjectType_Start_InputArguments,6053,Variable\nISA95JobOrderReceiverObjectType_Start_OutputArguments,6054,Variable\nISA95JobOrderReceiverObjectType_Stop_InputArguments,6055,Variable\nISA95JobOrderReceiverObjectType_Stop_OutputArguments,6056,Variable\nISA95JobOrderReceiverObjectType_Pause_InputArguments,6057,Variable\nISA95JobOrderReceiverObjectType_Pause_OutputArguments,6058,Variable\nISA95JobOrderReceiverObjectType_Resume_InputArguments,6059,Variable\nISA95JobOrderReceiverObjectType_Resume_OutputArguments,6060,Variable\nISA95JobOrderReceiverObjectType_Update_InputArguments,6061,Variable\nISA95JobOrderReceiverObjectType_Update_OutputArguments,6062,Variable\nISA95JobOrderReceiverObjectType_Abort_InputArguments,6063,Variable\nISA95JobOrderReceiverObjectType_Abort_OutputArguments,6064,Variable\nISA95JobOrderReceiverObjectType_Cancel_InputArguments,6065,Variable\nISA95JobOrderReceiverObjectType_Cancel_OutputArguments,6066,Variable\nISA95JobOrderReceiverObjectType_Clear_InputArguments,6067,Variable\nISA95JobOrderReceiverObjectType_Clear_OutputArguments,6068,Variable\nISA95JobOrderReceiverObjectType_RevokeStart_InputArguments,6069,Variable\nISA95JobOrderReceiverObjectType_RevokeStart_OutputArguments,6070,Variable\nISA95JobOrderReceiverObjectType_NotAllowedToStart_StateNumber,6071,Variable\nISA95JobOrderReceiverObjectType_AllowedToStart_StateNumber,6072,Variable\nISA95JobOrderReceiverObjectType_Running_StateNumber,6073,Variable\nISA95JobOrderReceiverObjectType_Interrupted_StateNumber,6074,Variable\nISA95JobOrderReceiverObjectType_Ended_StateNumber,6075,Variable\nISA95JobOrderReceiverObjectType_Aborted_StateNumber,6076,Variable\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber,6077,Variable\nISA95JobOrderReceiverObjectType_FromNotAllowedToStartToAllowedToStart_TransitionNumber,6078,Variable\nISA95JobOrderReceiverObjectType_FromAllowedToStartToNotAllowedToStart_TransitionNumber,6079,Variable\nISA95JobOrderReceiverObjectType_FromAllowedToStartToAllowedToStart_TransitionNumber,6080,Variable\nISA95JobOrderReceiverObjectType_FromAllowedToStartToRunning_TransitionNumber,6081,Variable\nISA95JobOrderReceiverObjectType_FromRunningToInterrupted_TransitionNumber,6082,Variable\nISA95JobOrderReceiverObjectType_FromRunningToEnded_TransitionNumber,6083,Variable\nISA95JobOrderReceiverObjectType_FromRunningToAborted_TransitionNumber,6084,Variable\nISA95JobOrderReceiverObjectType_FromInterruptedToAborted_TransitionNumber,6085,Variable\nISA95JobOrderReceiverObjectType_FromInterruptedToRunning_TransitionNumber,6086,Variable\nISA95JobOrderReceiverObjectType_FromInterruptedToEnded_TransitionNumber,6087,Variable\nISA95JobOrderReceiverObjectType_MaxDownloadableJobOrders,6088,Variable\nISA95PrepareStateMachineType_Ready_StateNumber,6089,Variable\nISA95PrepareStateMachineType_Loaded_StateNumber,6090,Variable\nISA95PrepareStateMachineType_FromWaitingToReady_TransitionNumber,6091,Variable\nISA95PrepareStateMachineType_FromReadyToLoaded_TransitionNumber,6092,Variable\nISA95EndedStateMachineType_Completed_StateNumber,6093,Variable\nISA95EndedStateMachineType_Closed_StateNumber,6094,Variable\nISA95EndedStateMachineType_FromCompletedToClosed_TransitionNumber,6095,Variable\nISA95InterruptedStateMachineType_Held_StateNumber,6096,Variable\nISA95InterruptedStateMachineType_Suspended_StateNumber,6097,Variable\nISA95InterruptedStateMachineType_FromHeldToSuspended_TransitionNumber,6098,Variable\nISA95InterruptedStateMachineType_FromSuspendedToHeld_TransitionNumber,6099,Variable\nISA95JobOrderReceiverSubStatesType_NotAllowedToStart_StateNumber,6100,Variable\nISA95JobOrderReceiverSubStatesType_AllowedToStart_StateNumber,6101,Variable\nISA95JobOrderReceiverSubStatesType_Running_StateNumber,6102,Variable\nISA95JobOrderReceiverSubStatesType_Interrupted_StateNumber,6103,Variable\nISA95JobOrderReceiverSubStatesType_Ended_StateNumber,6104,Variable\nISA95JobOrderReceiverSubStatesType_Aborted_StateNumber,6105,Variable\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToNotAllowedToStart_TransitionNumber,6106,Variable\nISA95JobOrderReceiverSubStatesType_FromNotAllowedToStartToAllowedToStart_TransitionNumber,6107,Variable\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToNotAllowedToStart_TransitionNumber,6108,Variable\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToAllowedToStart_TransitionNumber,6109,Variable\nISA95JobOrderReceiverSubStatesType_FromAllowedToStartToRunning_TransitionNumber,6110,Variable\nISA95JobOrderReceiverSubStatesType_FromRunningToInterrupted_TransitionNumber,6111,Variable\nISA95JobOrderReceiverSubStatesType_FromRunningToEnded_TransitionNumber,6112,Variable\nISA95JobOrderReceiverSubStatesType_FromRunningToAborted_TransitionNumber,6113,Variable\nISA95JobOrderReceiverSubStatesType_FromInterruptedToAborted_TransitionNumber,6114,Variable\nISA95JobOrderReceiverSubStatesType_FromInterruptedToRunning_TransitionNumber,6115,Variable\nISA95JobOrderReceiverSubStatesType_FromInterruptedToEnded_TransitionNumber,6116,Variable\nTypeDictionary_XmlSchema_ISA95JobOrderDataType,6117,Variable\nTypeDictionary_BinarySchema_ISA95JobResponseDataType,6118,Variable\nTypeDictionary_XmlSchema_ISA95JobResponseDataType,6119,Variable\nTypeDictionary_BinarySchema_ISA95MaterialDataType,6120,Variable\nTypeDictionary_XmlSchema_ISA95MaterialDataType,6121,Variable\nTypeDictionary_BinarySchema_ISA95ParameterDataType,6122,Variable\nTypeDictionary_XmlSchema_ISA95ParameterDataType,6123,Variable\nTypeDictionary_BinarySchema_ISA95PersonnelDataType,6124,Variable\nTypeDictionary_XmlSchema_ISA95PersonnelDataType,6125,Variable\nTypeDictionary_BinarySchema_ISA95PhysicalAssetDataType,6126,Variable\nTypeDictionary_XmlSchema_ISA95PhysicalAssetDataType,6127,Variable\nTypeDictionary_BinarySchema_ISA95PropertyDataType,6128,Variable\nTypeDictionary_XmlSchema_ISA95PropertyDataType,6129,Variable\nTypeDictionary_BinarySchema_ISA95StateDataType,6130,Variable\nTypeDictionary_XmlSchema_ISA95StateDataType,6131,Variable\nTypeDictionary_BinarySchema_ISA95WorkMasterDataType,6132,Variable\nTypeDictionary_XmlSchema_ISA95WorkMasterDataType,6133,Variable\nISA95JobOrderReceiverObjectType_Store,7001,Method\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderID,7002,Method\nISA95JobResponseReceiverObjectType_ReceiveJobResponse,7003,Method\nISA95JobOrderReceiverObjectType_StoreAndStart,7004,Method\nISA95JobOrderReceiverObjectType_Start,7005,Method\nISA95JobOrderReceiverObjectType_Stop,7006,Method\nISA95JobOrderReceiverObjectType_Pause,7007,Method\nISA95JobOrderReceiverObjectType_Resume,7008,Method\nISA95JobOrderReceiverObjectType_Update,7009,Method\nISA95JobOrderReceiverObjectType_Abort,7010,Method\nISA95JobOrderReceiverObjectType_Cancel,7011,Method\nISA95JobOrderReceiverObjectType_Clear,7012,Method\nISA95JobOrderReceiverObjectType_RevokeStart,7013,Method\nISA95JobResponseProviderObjectType_RequestJobResponseByJobOrderState,7014,Method\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Nodesets/opc.ua.isa95-jobcontrol.nodeset2.documentation.csv",
    "content": "Id,Name,Link,ConformanceUnits\n1001,ISA95PrepareStateMachineType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.3\",\"ISA-95 Job Control Job Order Receiver SubStates;\"\n1002,ISA95JobOrderReceiverObjectType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.2\",\"ISA-95 Job Order Receiver V2;\"\n1003,ISA95JobResponseProviderObjectType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.1\",\"ISA-95 Job Response Provider V2;\"\n1004,ISA95JobResponseReceiverObjectType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.8/#7.2.8.1\",\"ISA-95 Job Response Receiver V2;\"\n1005,ISA95EndedStateMachineType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.4\",\"ISA-95 Job Control Job Order Receiver SubStates;\"\n1006,ISA95JobOrderStatusEventType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.6\",\"ISA-95 Job Control Job Response Provider Job Order Status Events;\"\n1007,ISA95InterruptedStateMachineType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.5\",\"ISA-95 Job Control Job Order Receiver SubStates;\"\n1008,ISA95JobOrderReceiverSubStatesType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.2/#7.2.2.2\",\"ISA-95 Job Control Job Order Receiver SubStates;\"\n3002,ISA95PropertyDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.9\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3003,ISA95ParameterDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.10\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3005,ISA95EquipmentDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.1\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3006,ISA95StateDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.2\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3007,ISA95WorkMasterDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.11\",\"ISA-95 Job Order Receiver V2;\"\n3008,ISA95JobOrderDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.4\",\"ISA-95 Job Order Receiver V2;\"\n3010,ISA95MaterialDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.6\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3011,ISA95PersonnelDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.7\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3012,ISA95PhysicalAssetDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.8\",\"ISA-95 Job Order Receiver V2;ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3013,ISA95JobResponseDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.5\",\"ISA-95 Job Response Provider V2;ISA-95 Job Response Receiver V2;\"\n3015,ISA95JobOrderAndStateDataType,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.3\",\"ISA-95 Job Order Receiver V2;\"\n5001,http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/9.1\",\"\"\n7001,Store,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.3\",\"\"\n7002,RequestJobResponseByJobOrderID,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.2\",\"\"\n7003,ReceiveJobResponse,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.8/#7.2.8.2\",\"\"\n7004,StoreAndStart,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.4\",\"\"\n7005,Start,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.5\",\"\"\n7006,Stop,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.11\",\"\"\n7007,Pause,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.7\",\"\"\n7008,Resume,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.8\",\"\"\n7009,Update,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.9\",\"\"\n7010,Abort,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.10\",\"\"\n7011,Cancel,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.12\",\"\"\n7012,Clear,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.13\",\"\"\n7013,RevokeStart,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.6\",\"\"\n7014,RequestJobResponseByJobOrderState,\"https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.3\",\"\"\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Nodesets/opc.ua.isa95-jobcontrol.nodeset2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n * Copyright (c) 2005-2024 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n * \n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n-->\n\n<UANodeSet xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\" Version=\"2.0.0\" PublicationDate=\"2024-01-31T00:00:00Z\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.11\" PublicationDate=\"2022-03-29T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"GeneratesEvent\">i=41</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"FromState\">i=51</Alias>\n    <Alias Alias=\"ToState\">i=52</Alias>\n    <Alias Alias=\"HasCause\">i=53</Alias>\n    <Alias Alias=\"HasEffect\">i=54</Alias>\n    <Alias Alias=\"HasSubStateMachine\">i=117</Alias>\n    <Alias Alias=\"IdType\">i=256</Alias>\n    <Alias Alias=\"NumericRange\">i=291</Alias>\n    <Alias Alias=\"Argument\">i=296</Alias>\n    <Alias Alias=\"RelativePath\">i=540</Alias>\n    <Alias Alias=\"EUInformation\">i=887</Alias>\n    <Alias Alias=\"DecimalString\">i=12878</Alias>\n    <Alias Alias=\"ISA95PropertyDataType\">ns=1;i=3002</Alias>\n    <Alias Alias=\"ISA95ParameterDataType\">ns=1;i=3003</Alias>\n    <Alias Alias=\"ISA95EquipmentDataType\">ns=1;i=3005</Alias>\n    <Alias Alias=\"ISA95StateDataType\">ns=1;i=3006</Alias>\n    <Alias Alias=\"ISA95WorkMasterDataType\">ns=1;i=3007</Alias>\n    <Alias Alias=\"ISA95JobOrderDataType\">ns=1;i=3008</Alias>\n    <Alias Alias=\"ISA95MaterialDataType\">ns=1;i=3010</Alias>\n    <Alias Alias=\"ISA95PersonnelDataType\">ns=1;i=3011</Alias>\n    <Alias Alias=\"ISA95PhysicalAssetDataType\">ns=1;i=3012</Alias>\n    <Alias Alias=\"ISA95JobResponseDataType\">ns=1;i=3013</Alias>\n    <Alias Alias=\"ISA95JobOrderAndStateDataType\">ns=1;i=3015</Alias>\n  </Aliases>\n  <Extensions>\n    <Extension>\n      <ua:ModelInfo Tool=\"UaModeler\" Hash=\"jNdKpj0zZThg1RJpgLCkIg==\" Version=\"1.6.11\" xmlns:ua=\"http://unifiedautomation.com/Configuration/NodeSet.xsd\" />\n    </Extension>\n  </Extensions>\n  <UADataType NodeId=\"ns=1;i=3005\" BrowseName=\"1:ISA95EquipmentDataType\">\n    <DisplayName>ISA95EquipmentDataType</DisplayName>\n    <Description>Defines an equipment resource or a piece of equipment, a quantity, an optional description, and an optional collection of properties.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5008</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5010</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5009</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95EquipmentDataType\">\n      <Field Name=\"ID\" DataType=\"String\">\n        <Description>An identification of an EquipmentClass or Equipment.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Additional information and description about the resource.</Description>\n      </Field>\n      <Field Name=\"EquipmentUse\" DataType=\"String\" IsOptional=\"true\">\n        <Description>Information about the expected use of the equipment, see the ISA 95 Part 2 standard for defined values.</Description>\n      </Field>\n      <Field Name=\"Quantity\" DataType=\"DecimalString\" IsOptional=\"true\">\n        <Description>The quantity of the resource</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"EUInformation\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the quantity</Description>\n      </Field>\n      <Field Name=\"Properties\" DataType=\"ISA95PropertyDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Any associated properties, or empty if there are no properties defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6022\" BrowseName=\"1:ISA95EquipmentDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95EquipmentDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5008</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95EquipmentDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6030\" BrowseName=\"1:ISA95EquipmentDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95EquipmentDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5009</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95EquipmentDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3015\" BrowseName=\"1:ISA95JobOrderAndStateDataType\">\n    <DisplayName>ISA95JobOrderAndStateDataType</DisplayName>\n    <Description>Defines the information needed to schedule and execute a job.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5032</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5034</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5033</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95JobOrderAndStateDataType\">\n      <Field Name=\"JobOrder\" DataType=\"ISA95JobOrderDataType\">\n        <Description>The job order</Description>\n      </Field>\n      <Field Name=\"State\" DataType=\"ISA95StateDataType\" ValueRank=\"1\" ArrayDimensions=\"0\">\n        <Description>The State of the job order. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to Null. The order of the subtstates is not defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6031\" BrowseName=\"1:ISA95JobOrderAndStateDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95JobOrderAndStateDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5032</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95JobOrderAndStateDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6032\" BrowseName=\"1:ISA95JobOrderAndStateDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95JobOrderAndStateDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5033</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95JobOrderAndStateDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3008\" BrowseName=\"1:ISA95JobOrderDataType\">\n    <DisplayName>ISA95JobOrderDataType</DisplayName>\n    <Description>Defines the information needed to schedule and execute a job.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.4</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5014</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5016</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5015</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95JobOrderDataType\">\n      <Field Name=\"JobOrderID\" DataType=\"String\">\n        <Description>An identification of the Job Order.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Addition information about the Job Order The array allows to provide descriptions in different languages.</Description>\n      </Field>\n      <Field Name=\"WorkMasterID\" DataType=\"ISA95WorkMasterDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Work Master associated with the job order. If multiple work masters are defined, then the execution system can select the work master based on the availability of resources.</Description>\n      </Field>\n      <Field Name=\"StartTime\" DataType=\"DateTime\" IsOptional=\"true\">\n        <Description>The proposed start time for the order, may be empty if not specified</Description>\n      </Field>\n      <Field Name=\"EndTime\" DataType=\"DateTime\" IsOptional=\"true\">\n        <Description>The proposed end time for the order, may be empty if not specified</Description>\n      </Field>\n      <Field Name=\"Priority\" DataType=\"Int16\" IsOptional=\"true\">\n        <Description>The priority of the job order, may be empty of not specified. Higher numbers have higher priority.  This type allows the Job Order clients to pick their own ranges, and the Job Order server only has to pick the highest number.</Description>\n      </Field>\n      <Field Name=\"JobOrderParameters\" DataType=\"ISA95ParameterDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Key value pair with values, not associated with a resource that is provided as part of the job order, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"PersonnelRequirements\" DataType=\"ISA95PersonnelDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>A specification of any personnel requirements associated with the job order, may be empty if not specified</Description>\n      </Field>\n      <Field Name=\"EquipmentRequirements\" DataType=\"ISA95EquipmentDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>A specification of any equipment requirements associated with the job order, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"PhysicalAssetRequirements\" DataType=\"ISA95PhysicalAssetDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>A specification of any physical asset requirements associated with the job order, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"MaterialRequirements\" DataType=\"ISA95MaterialDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>A specification of any material requirements associated with the job order, may be empty if not specified.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6046\" BrowseName=\"1:ISA95JobOrderDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95JobOrderDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5014</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95JobOrderDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6117\" BrowseName=\"1:ISA95JobOrderDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95JobOrderDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5015</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95JobOrderDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3013\" BrowseName=\"1:ISA95JobResponseDataType\">\n    <DisplayName>ISA95JobResponseDataType</DisplayName>\n    <Description>Defines the information needed to schedule and execute a job.</Description>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.5</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5026</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5028</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5027</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95JobResponseDataType\">\n      <Field Name=\"JobResponseID\" DataType=\"String\">\n        <Description>An identification of the Job Response</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" IsOptional=\"true\">\n        <Description>Additional information about the Job Response</Description>\n      </Field>\n      <Field Name=\"JobOrderID\" DataType=\"String\">\n        <Description>An identification of the job order associated with the job response.</Description>\n      </Field>\n      <Field Name=\"StartTime\" DataType=\"DateTime\" IsOptional=\"true\">\n        <Description>The actual start time for the order.</Description>\n      </Field>\n      <Field Name=\"EndTime\" DataType=\"DateTime\" IsOptional=\"true\">\n        <Description>The actual end time for the order.</Description>\n      </Field>\n      <Field Name=\"JobState\" DataType=\"ISA95StateDataType\" ValueRank=\"1\" ArrayDimensions=\"0\">\n        <Description>The current state of the job. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to Null. The order of the subtstates is not defined.</Description>\n      </Field>\n      <Field Name=\"JobResponseData\" DataType=\"ISA95ParameterDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Key value pair with values, not associated with a resource that is provided as part of the job response, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"PersonnelActuals\" DataType=\"ISA95PersonnelDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>A specification of any personnel requirements associated with the job response, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"EquipmentActuals\" DataType=\"ISA95EquipmentDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>A specification of any equipment requirements associated with the job response, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"PhysicalAssetActuals\" DataType=\"ISA95PhysicalAssetDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>A specification of any physical asset requirements associated with the job response, may be empty if not specified.</Description>\n      </Field>\n      <Field Name=\"MaterialActuals\" DataType=\"ISA95MaterialDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>A specification of any material requirements associated with the job response, may be empty if not specified.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6118\" BrowseName=\"1:ISA95JobResponseDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95JobResponseDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5026</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95JobResponseDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6119\" BrowseName=\"1:ISA95JobResponseDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95JobResponseDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5027</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95JobResponseDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3010\" BrowseName=\"1:ISA95MaterialDataType\">\n    <DisplayName>ISA95MaterialDataType</DisplayName>\n    <Description>Defines a material resource, a quantity, an optional description, and an optional collection of properties.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.6</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5017</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5019</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5018</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95MaterialDataType\">\n      <Field Name=\"MaterialClassID\" DataType=\"String\" IsOptional=\"true\">\n        <Description>An identification of the resource, or null if the Material Class is not used to identify the material.</Description>\n      </Field>\n      <Field Name=\"MaterialDefinitionID\" DataType=\"String\" IsOptional=\"true\">\n        <Description>An identification of the resource, or null if the Material Definition is not used to identify the material.</Description>\n      </Field>\n      <Field Name=\"MaterialLotID\" DataType=\"String\" IsOptional=\"true\">\n        <Description>An identification of the resource, or null if the Material Lot is not used to identify the material.</Description>\n      </Field>\n      <Field Name=\"MaterialSublotID\" DataType=\"String\" IsOptional=\"true\">\n        <Description>An identification of the resource, or null if the Material Sublot is not used to identify the material.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Additional information and description about the resource.</Description>\n      </Field>\n      <Field Name=\"MaterialUse\" DataType=\"String\" IsOptional=\"true\">\n        <Description>Information about the expected use of the material, see the ISA 95 Part 2 standard for defined values.</Description>\n      </Field>\n      <Field Name=\"Quantity\" DataType=\"DecimalString\" IsOptional=\"true\">\n        <Description>The quantity of the resource</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"EUInformation\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the quantity</Description>\n      </Field>\n      <Field Name=\"Properties\" DataType=\"ISA95PropertyDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Any associated properties, or empty if there are no properties defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6120\" BrowseName=\"1:ISA95MaterialDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95MaterialDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5017</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95MaterialDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6121\" BrowseName=\"1:ISA95MaterialDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95MaterialDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5018</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95MaterialDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3003\" BrowseName=\"1:ISA95ParameterDataType\">\n    <DisplayName>ISA95ParameterDataType</DisplayName>\n    <Description>A subtype of OPC UA Structure that defines three linked data items: the ID, which is a unique identifier for a property, the value, which is the data that is identified, and an optional description of the parameter.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.10</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5005</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5007</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5006</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95ParameterDataType\">\n      <Field Name=\"ID\" DataType=\"String\">\n        <Description>A unique identifier for a parameter</Description>\n      </Field>\n      <Field Name=\"Value\">\n        <Description>Value of the parameter.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>An optional description of the parameter. The array allows to provide descriptions in different languages when writing. When accessing, the server shall only provide one entry in the array.</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"EUInformation\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the value</Description>\n      </Field>\n      <Field Name=\"Subparameters\" DataType=\"ISA95ParameterDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\" />\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6122\" BrowseName=\"1:ISA95ParameterDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95ParameterDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5005</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95ParameterDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6123\" BrowseName=\"1:ISA95ParameterDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95ParameterDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5006</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95ParameterDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3011\" BrowseName=\"1:ISA95PersonnelDataType\">\n    <DisplayName>ISA95PersonnelDataType</DisplayName>\n    <Description>Defines a personnel resource or a person, a quantity, an optional description, and an optional collection of properties.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.7</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5020</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5022</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5021</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95PersonnelDataType\">\n      <Field Name=\"ID\" DataType=\"String\">\n        <Description>An identification of a Personnel Class or Person.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Additional information and description about the resource.</Description>\n      </Field>\n      <Field Name=\"PersonnelUse\" DataType=\"String\" IsOptional=\"true\">\n        <Description>Information about the expected use of the personnel, see the ISA 95 Part 2 standard for defined values.</Description>\n      </Field>\n      <Field Name=\"Quantity\" DataType=\"DecimalString\" IsOptional=\"true\">\n        <Description>The quantity of the resource</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"EUInformation\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the quantity</Description>\n      </Field>\n      <Field Name=\"Properties\" DataType=\"ISA95PropertyDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Any associated properties, or empty if there are no properties defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6124\" BrowseName=\"1:ISA95PersonnelDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95PersonnelDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5020</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95PersonnelDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6125\" BrowseName=\"1:ISA95PersonnelDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95PersonnelDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5021</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95PersonnelDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3012\" BrowseName=\"1:ISA95PhysicalAssetDataType\">\n    <DisplayName>ISA95PhysicalAssetDataType</DisplayName>\n    <Description>Defines a physical asset, a quantity, an optional description, and an optional collection of properties.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.8</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5023</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5025</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5024</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95PhysicalAssetDataType\">\n      <Field Name=\"ID\" DataType=\"String\">\n        <Description>An identification of a Physical Asset Class or Physical Asset.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Additional information and description about the resource.</Description>\n      </Field>\n      <Field Name=\"PhysicalAssetUse\" DataType=\"String\" IsOptional=\"true\">\n        <Description>Information about the expected use of the physical asset, see the ISA 95 Part 2 standard for defined values.</Description>\n      </Field>\n      <Field Name=\"Quantity\" DataType=\"DecimalString\" IsOptional=\"true\">\n        <Description>The quantity of the resource</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"EUInformation\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the quantity</Description>\n      </Field>\n      <Field Name=\"Properties\" DataType=\"ISA95PropertyDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Any associated properties, or empty if there are no properties defined.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6126\" BrowseName=\"1:ISA95PhysicalAssetDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95PhysicalAssetDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5023</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95PhysicalAssetDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6127\" BrowseName=\"1:ISA95PhysicalAssetDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95PhysicalAssetDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5024</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95PhysicalAssetDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3002\" BrowseName=\"1:ISA95PropertyDataType\">\n    <DisplayName>ISA95PropertyDataType</DisplayName>\n    <Description>A subtype of OPC UA Structure that defines two linked data items: an ID, which is a unique identifier for a property within the scope of the associated resource, and the value, which is the data for the property.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.9</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5002</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5004</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5003</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95PropertyDataType\">\n      <Field Name=\"ID\" DataType=\"String\">\n        <Description>Unique identifier for a property within the scope of the associated resource</Description>\n      </Field>\n      <Field Name=\"Value\">\n        <Description>Value for the property</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>An optional description of the parameter.</Description>\n      </Field>\n      <Field Name=\"EngineeringUnits\" DataType=\"EUInformation\" IsOptional=\"true\">\n        <Description>The Unit Of Measure of the value</Description>\n      </Field>\n      <Field Name=\"Subproperties\" DataType=\"ISA95PropertyDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\" />\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6128\" BrowseName=\"1:ISA95PropertyDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95PropertyDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95PropertyDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6129\" BrowseName=\"1:ISA95PropertyDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95PropertyDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5003</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95PropertyDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3006\" BrowseName=\"1:ISA95StateDataType\">\n    <DisplayName>ISA95StateDataType</DisplayName>\n    <Description>Defines the information needed to schedule and execute a job.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5029</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5031</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5030</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95StateDataType\">\n      <Field Name=\"BrowsePath\" DataType=\"RelativePath\">\n        <Description>The browse path of substates. Shall be null when the top-level state is represented.</Description>\n      </Field>\n      <Field Name=\"StateText\" DataType=\"LocalizedText\">\n        <Description>The state represented as human readable text. Shall represent the same text as the CurrentState Variable of a StateMachine would.</Description>\n      </Field>\n      <Field Name=\"StateNumber\" DataType=\"UInt32\">\n        <Description>The state represented as number. Shall represent the same number as the Number subvariable of the CurrentState Variable of a StateMachine would.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6130\" BrowseName=\"1:ISA95StateDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95StateDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5029</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95StateDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6131\" BrowseName=\"1:ISA95StateDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95StateDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5030</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95StateDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=3007\" BrowseName=\"1:ISA95WorkMasterDataType\">\n    <DisplayName>ISA95WorkMasterDataType</DisplayName>\n    <Description>Defines a Work Master ID and the defined parameters for the Work Master.</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.3.11</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5011</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5013</Reference>\n      <Reference ReferenceType=\"HasEncoding\">ns=1;i=5012</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ISA95WorkMasterDataType\">\n      <Field Name=\"ID\" DataType=\"String\">\n        <Description>An identification of the Work Master.</Description>\n      </Field>\n      <Field Name=\"Description\" DataType=\"LocalizedText\" IsOptional=\"true\">\n        <Description>Additional information and description about the Work Master.</Description>\n      </Field>\n      <Field Name=\"Parameters\" DataType=\"ISA95ParameterDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" IsOptional=\"true\">\n        <Description>Defined parameters for the Work Master.</Description>\n      </Field>\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=6132\" BrowseName=\"1:ISA95WorkMasterDataType\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>ISA95WorkMasterDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5011</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ISA95WorkMasterDataType</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6133\" BrowseName=\"1:ISA95WorkMasterDataType\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>ISA95WorkMasterDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasDescription\" IsForward=\"false\">ns=1;i=5012</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ISA95WorkMasterDataType']</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6018\" BrowseName=\"1:TypeDictionary\" SymbolicName=\"TypeDictionary_BinarySchema\" DataType=\"ByteString\">\n    <DisplayName>TypeDictionary</DisplayName>\n    <Description>Collects the data type descriptions of http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6022</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6031</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6046</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6118</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6120</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6122</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6124</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6126</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6128</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6130</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6132</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6019</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=93</Reference>\n    </References>\n    <Value>\n      <uax:ByteString xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZ\n        W1hLWluc3RhbmNlIiB4bWxuczp0bnM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS9JU\n        0E5NS1KT0JDT05UUk9MX1YyLyIgRGVmYXVsdEJ5dGVPcmRlcj0iTGl0dGxlRW5kaWFuIiB4b\n        WxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9CaW5hcnlTY2hlbWEvIiB4bWxuc\n        zp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLyIgVGFyZ2V0TmFtZXNwYWNlPSJod\n        HRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi8iPgogPG9wY\n        zpJbXBvcnQgTmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIi8+CiA8b\n        3BjOlN0cnVjdHVyZWRUeXBlIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiIE5hbWU9I\n        klTQTk1RXF1aXBtZW50RGF0YVR5cGUiPgogIDxvcGM6RG9jdW1lbnRhdGlvbj5EZWZpbmVzI\n        GFuIGVxdWlwbWVudCByZXNvdXJjZSBvciBhIHBpZWNlIG9mIGVxdWlwbWVudCwgYSBxdWFud\n        Gl0eSwgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCBhbiBvcHRpb25hbCBjb2xsZWN0a\n        W9uIG9mIHByb3BlcnRpZXMuPC9vcGM6RG9jdW1lbnRhdGlvbj4KICA8b3BjOkZpZWxkIFR5c\n        GVOYW1lPSJvcGM6Qml0IiBOYW1lPSJEZXNjcmlwdGlvblNwZWNpZmllZCIvPgogIDxvcGM6R\n        mllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IkVxdWlwbWVudFVzZVNwZWNpZmllZCIvP\n        gogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlF1YW50aXR5U3BlY2lma\n        WVkIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iRW5naW5lZXJpb\n        mdVbml0c1NwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hb\n        WU9IlByb3BlcnRpZXNTcGVjaWZpZWQiLz4KICA8b3BjOkZpZWxkIExlbmd0aD0iMjciIFR5c\n        GVOYW1lPSJvcGM6Qml0IiBOYW1lPSJSZXNlcnZlZDEiLz4KICA8b3BjOkZpZWxkIFR5cGVOY\n        W1lPSJvcGM6Q2hhckFycmF5IiBOYW1lPSJJRCIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllb\n        GQ9IkRlc2NyaXB0aW9uU3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkludDMyIiBOYW1lPSJOb\n        09mRGVzY3JpcHRpb24iLz4KICA8b3BjOkZpZWxkIExlbmd0aEZpZWxkPSJOb09mRGVzY3Jpc\n        HRpb24iIFN3aXRjaEZpZWxkPSJEZXNjcmlwdGlvblNwZWNpZmllZCIgVHlwZU5hbWU9InVhO\n        kxvY2FsaXplZFRleHQiIE5hbWU9IkRlc2NyaXB0aW9uIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y\n        2hGaWVsZD0iRXF1aXBtZW50VXNlU3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkNoYXJBcnJhe\n        SIgTmFtZT0iRXF1aXBtZW50VXNlIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iUXVhb\n        nRpdHlTcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6Q2hhckFycmF5IiBOYW1lPSJRdWFudGl0e\n        SIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IkVuZ2luZWVyaW5nVW5pdHNTcGVjaWZpZ\n        WQiIFR5cGVOYW1lPSJ1YTpFVUluZm9ybWF0aW9uIiBOYW1lPSJFbmdpbmVlcmluZ1VuaXRzI\n        i8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iUHJvcGVydGllc1NwZWNpZmllZCIgVHlwZ\n        U5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iTm9PZlByb3BlcnRpZXMiLz4KICA8b3BjOkZpZWxkI\n        Exlbmd0aEZpZWxkPSJOb09mUHJvcGVydGllcyIgU3dpdGNoRmllbGQ9IlByb3BlcnRpZXNTc\n        GVjaWZpZWQiIFR5cGVOYW1lPSJ0bnM6SVNBOTVQcm9wZXJ0eURhdGFUeXBlIiBOYW1lPSJQc\n        m9wZXJ0aWVzIi8+CiA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4KIDxvcGM6U3RydWN0dXJlZFR5c\n        GUgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgTmFtZT0iSVNBOTVKb2JPcmRlckFuZ\n        FN0YXRlRGF0YVR5cGUiPgogIDxvcGM6RG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbmZvc\n        m1hdGlvbiBuZWVkZWQgdG8gc2NoZWR1bGUgYW5kIGV4ZWN1dGUgYSBqb2IuPC9vcGM6RG9jd\n        W1lbnRhdGlvbj4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJ0bnM6SVNBOTVKb2JPcmRlckRhd\n        GFUeXBlIiBOYW1lPSJKb2JPcmRlciIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpJb\n        nQzMiIgTmFtZT0iTm9PZlN0YXRlIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGhGaWVsZD0iTm9PZ\n        lN0YXRlIiBUeXBlTmFtZT0idG5zOklTQTk1U3RhdGVEYXRhVHlwZSIgTmFtZT0iU3RhdGUiL\n        z4KIDwvb3BjOlN0cnVjdHVyZWRUeXBlPgogPG9wYzpTdHJ1Y3R1cmVkVHlwZSBCYXNlVHlwZ\n        T0idWE6RXh0ZW5zaW9uT2JqZWN0IiBOYW1lPSJJU0E5NUpvYk9yZGVyRGF0YVR5cGUiPgogI\n        DxvcGM6RG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gc\n        2NoZWR1bGUgYW5kIGV4ZWN1dGUgYSBqb2IuPC9vcGM6RG9jdW1lbnRhdGlvbj4KICA8b3BjO\n        kZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJEZXNjcmlwdGlvblNwZWNpZmllZCIvP\n        gogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IldvcmtNYXN0ZXJJRFNwZ\n        WNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlN0YXJ0V\n        GltZVNwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9I\n        kVuZFRpbWVTcGVjaWZpZWQiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOY\n        W1lPSJQcmlvcml0eVNwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCa\n        XQiIE5hbWU9IkpvYk9yZGVyUGFyYW1ldGVyc1NwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgV\n        HlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlBlcnNvbm5lbFJlcXVpcmVtZW50c1NwZWNpZmllZ\n        CIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IkVxdWlwbWVudFJlc\n        XVpcmVtZW50c1NwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiI\n        E5hbWU9IlBoeXNpY2FsQXNzZXRSZXF1aXJlbWVudHNTcGVjaWZpZWQiLz4KICA8b3BjOkZpZ\n        WxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJNYXRlcmlhbFJlcXVpcmVtZW50c1NwZWNpZ\n        mllZCIvPgogIDxvcGM6RmllbGQgTGVuZ3RoPSIyMiIgVHlwZU5hbWU9Im9wYzpCaXQiIE5hb\n        WU9IlJlc2VydmVkMSIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpDaGFyQXJyYXkiI\n        E5hbWU9IkpvYk9yZGVySUQiLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJEZXNjcmlwd\n        GlvblNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iTm9PZkRlc2NyaXB0a\n        W9uIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGhGaWVsZD0iTm9PZkRlc2NyaXB0aW9uIiBTd2l0Y\n        2hGaWVsZD0iRGVzY3JpcHRpb25TcGVjaWZpZWQiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZ\n        Xh0IiBOYW1lPSJEZXNjcmlwdGlvbiIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9Ildvc\n        mtNYXN0ZXJJRFNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iTm9PZldvc\n        mtNYXN0ZXJJRCIvPgogIDxvcGM6RmllbGQgTGVuZ3RoRmllbGQ9Ik5vT2ZXb3JrTWFzdGVyS\n        UQiIFN3aXRjaEZpZWxkPSJXb3JrTWFzdGVySURTcGVjaWZpZWQiIFR5cGVOYW1lPSJ0bnM6S\n        VNBOTVXb3JrTWFzdGVyRGF0YVR5cGUiIE5hbWU9IldvcmtNYXN0ZXJJRCIvPgogIDxvcGM6R\n        mllbGQgU3dpdGNoRmllbGQ9IlN0YXJ0VGltZVNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpEY\n        XRlVGltZSIgTmFtZT0iU3RhcnRUaW1lIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iR\n        W5kVGltZVNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgTmFtZT0iRW5kVGltZ\n        SIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IlByaW9yaXR5U3BlY2lmaWVkIiBUeXBlT\n        mFtZT0ib3BjOkludDE2IiBOYW1lPSJQcmlvcml0eSIvPgogIDxvcGM6RmllbGQgU3dpdGNoR\n        mllbGQ9IkpvYk9yZGVyUGFyYW1ldGVyc1NwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpJbnQzM\n        iIgTmFtZT0iTm9PZkpvYk9yZGVyUGFyYW1ldGVycyIvPgogIDxvcGM6RmllbGQgTGVuZ3RoR\n        mllbGQ9Ik5vT2ZKb2JPcmRlclBhcmFtZXRlcnMiIFN3aXRjaEZpZWxkPSJKb2JPcmRlclBhc\n        mFtZXRlcnNTcGVjaWZpZWQiIFR5cGVOYW1lPSJ0bnM6SVNBOTVQYXJhbWV0ZXJEYXRhVHlwZ\n        SIgTmFtZT0iSm9iT3JkZXJQYXJhbWV0ZXJzIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZ\n        D0iUGVyc29ubmVsUmVxdWlyZW1lbnRzU3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkludDMyI\n        iBOYW1lPSJOb09mUGVyc29ubmVsUmVxdWlyZW1lbnRzIi8+CiAgPG9wYzpGaWVsZCBMZW5nd\n        GhGaWVsZD0iTm9PZlBlcnNvbm5lbFJlcXVpcmVtZW50cyIgU3dpdGNoRmllbGQ9IlBlcnNvb\n        m5lbFJlcXVpcmVtZW50c1NwZWNpZmllZCIgVHlwZU5hbWU9InRuczpJU0E5NVBlcnNvbm5lb\n        ERhdGFUeXBlIiBOYW1lPSJQZXJzb25uZWxSZXF1aXJlbWVudHMiLz4KICA8b3BjOkZpZWxkI\n        FN3aXRjaEZpZWxkPSJFcXVpcG1lbnRSZXF1aXJlbWVudHNTcGVjaWZpZWQiIFR5cGVOYW1lP\n        SJvcGM6SW50MzIiIE5hbWU9Ik5vT2ZFcXVpcG1lbnRSZXF1aXJlbWVudHMiLz4KICA8b3BjO\n        kZpZWxkIExlbmd0aEZpZWxkPSJOb09mRXF1aXBtZW50UmVxdWlyZW1lbnRzIiBTd2l0Y2hGa\n        WVsZD0iRXF1aXBtZW50UmVxdWlyZW1lbnRzU3BlY2lmaWVkIiBUeXBlTmFtZT0idG5zOklTQ\n        Tk1RXF1aXBtZW50RGF0YVR5cGUiIE5hbWU9IkVxdWlwbWVudFJlcXVpcmVtZW50cyIvPgogI\n        DxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IlBoeXNpY2FsQXNzZXRSZXF1aXJlbWVudHNTcGVja\n        WZpZWQiIFR5cGVOYW1lPSJvcGM6SW50MzIiIE5hbWU9Ik5vT2ZQaHlzaWNhbEFzc2V0UmVxd\n        WlyZW1lbnRzIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGhGaWVsZD0iTm9PZlBoeXNpY2FsQXNzZ\n        XRSZXF1aXJlbWVudHMiIFN3aXRjaEZpZWxkPSJQaHlzaWNhbEFzc2V0UmVxdWlyZW1lbnRzU\n        3BlY2lmaWVkIiBUeXBlTmFtZT0idG5zOklTQTk1UGh5c2ljYWxBc3NldERhdGFUeXBlIiBOY\n        W1lPSJQaHlzaWNhbEFzc2V0UmVxdWlyZW1lbnRzIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGa\n        WVsZD0iTWF0ZXJpYWxSZXF1aXJlbWVudHNTcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6SW50M\n        zIiIE5hbWU9Ik5vT2ZNYXRlcmlhbFJlcXVpcmVtZW50cyIvPgogIDxvcGM6RmllbGQgTGVuZ\n        3RoRmllbGQ9Ik5vT2ZNYXRlcmlhbFJlcXVpcmVtZW50cyIgU3dpdGNoRmllbGQ9Ik1hdGVya\n        WFsUmVxdWlyZW1lbnRzU3BlY2lmaWVkIiBUeXBlTmFtZT0idG5zOklTQTk1TWF0ZXJpYWxEY\n        XRhVHlwZSIgTmFtZT0iTWF0ZXJpYWxSZXF1aXJlbWVudHMiLz4KIDwvb3BjOlN0cnVjdHVyZ\n        WRUeXBlPgogPG9wYzpTdHJ1Y3R1cmVkVHlwZSBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZ\n        WN0IiBOYW1lPSJJU0E5NUpvYlJlc3BvbnNlRGF0YVR5cGUiPgogIDxvcGM6RG9jdW1lbnRhd\n        Glvbj5EZWZpbmVzIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gc2NoZWR1bGUgYW5kIGV4Z\n        WN1dGUgYSBqb2IuPC9vcGM6RG9jdW1lbnRhdGlvbj4KICA8b3BjOkZpZWxkIFR5cGVOYW1lP\n        SJvcGM6Qml0IiBOYW1lPSJEZXNjcmlwdGlvblNwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgV\n        HlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlN0YXJ0VGltZVNwZWNpZmllZCIvPgogIDxvcGM6R\n        mllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IkVuZFRpbWVTcGVjaWZpZWQiLz4KICA8b\n        3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJKb2JSZXNwb25zZURhdGFTcGVja\n        WZpZWQiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJQZXJzb25uZ\n        WxBY3R1YWxzU3BlY2lmaWVkIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgT\n        mFtZT0iRXF1aXBtZW50QWN0dWFsc1NwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hb\n        WU9Im9wYzpCaXQiIE5hbWU9IlBoeXNpY2FsQXNzZXRBY3R1YWxzU3BlY2lmaWVkIi8+CiAgP\n        G9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iTWF0ZXJpYWxBY3R1YWxzU3BlY\n        2lmaWVkIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGg9IjI0IiBUeXBlTmFtZT0ib3BjOkJpdCIgT\n        mFtZT0iUmVzZXJ2ZWQxIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkNoYXJBcnJhe\n        SIgTmFtZT0iSm9iUmVzcG9uc2VJRCIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IkRlc\n        2NyaXB0aW9uU3BlY2lmaWVkIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgTmFtZT0iR\n        GVzY3JpcHRpb24iLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Q2hhckFycmF5IiBOY\n        W1lPSJKb2JPcmRlcklEIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iU3RhcnRUaW1lU\n        3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiBOYW1lPSJTdGFydFRpbWUiLz4KI\n        CA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJFbmRUaW1lU3BlY2lmaWVkIiBUeXBlTmFtZT0ib\n        3BjOkRhdGVUaW1lIiBOYW1lPSJFbmRUaW1lIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib\n        3BjOkludDMyIiBOYW1lPSJOb09mSm9iU3RhdGUiLz4KICA8b3BjOkZpZWxkIExlbmd0aEZpZ\n        WxkPSJOb09mSm9iU3RhdGUiIFR5cGVOYW1lPSJ0bnM6SVNBOTVTdGF0ZURhdGFUeXBlIiBOY\n        W1lPSJKb2JTdGF0ZSIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IkpvYlJlc3BvbnNlR\n        GF0YVNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iTm9PZkpvYlJlc3Bvb\n        nNlRGF0YSIvPgogIDxvcGM6RmllbGQgTGVuZ3RoRmllbGQ9Ik5vT2ZKb2JSZXNwb25zZURhd\n        GEiIFN3aXRjaEZpZWxkPSJKb2JSZXNwb25zZURhdGFTcGVjaWZpZWQiIFR5cGVOYW1lPSJ0b\n        nM6SVNBOTVQYXJhbWV0ZXJEYXRhVHlwZSIgTmFtZT0iSm9iUmVzcG9uc2VEYXRhIi8+CiAgP\n        G9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iUGVyc29ubmVsQWN0dWFsc1NwZWNpZmllZCIgVHlwZ\n        U5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iTm9PZlBlcnNvbm5lbEFjdHVhbHMiLz4KICA8b3BjO\n        kZpZWxkIExlbmd0aEZpZWxkPSJOb09mUGVyc29ubmVsQWN0dWFscyIgU3dpdGNoRmllbGQ9I\n        lBlcnNvbm5lbEFjdHVhbHNTcGVjaWZpZWQiIFR5cGVOYW1lPSJ0bnM6SVNBOTVQZXJzb25uZ\n        WxEYXRhVHlwZSIgTmFtZT0iUGVyc29ubmVsQWN0dWFscyIvPgogIDxvcGM6RmllbGQgU3dpd\n        GNoRmllbGQ9IkVxdWlwbWVudEFjdHVhbHNTcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6SW50M\n        zIiIE5hbWU9Ik5vT2ZFcXVpcG1lbnRBY3R1YWxzIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGhGa\n        WVsZD0iTm9PZkVxdWlwbWVudEFjdHVhbHMiIFN3aXRjaEZpZWxkPSJFcXVpcG1lbnRBY3R1Y\n        WxzU3BlY2lmaWVkIiBUeXBlTmFtZT0idG5zOklTQTk1RXF1aXBtZW50RGF0YVR5cGUiIE5hb\n        WU9IkVxdWlwbWVudEFjdHVhbHMiLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJQaHlza\n        WNhbEFzc2V0QWN0dWFsc1NwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iT\n        m9PZlBoeXNpY2FsQXNzZXRBY3R1YWxzIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGhGaWVsZD0iT\n        m9PZlBoeXNpY2FsQXNzZXRBY3R1YWxzIiBTd2l0Y2hGaWVsZD0iUGh5c2ljYWxBc3NldEFjd\n        HVhbHNTcGVjaWZpZWQiIFR5cGVOYW1lPSJ0bnM6SVNBOTVQaHlzaWNhbEFzc2V0RGF0YVR5c\n        GUiIE5hbWU9IlBoeXNpY2FsQXNzZXRBY3R1YWxzIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGa\n        WVsZD0iTWF0ZXJpYWxBY3R1YWxzU3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkludDMyIiBOY\n        W1lPSJOb09mTWF0ZXJpYWxBY3R1YWxzIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGhGaWVsZD0iT\n        m9PZk1hdGVyaWFsQWN0dWFscyIgU3dpdGNoRmllbGQ9Ik1hdGVyaWFsQWN0dWFsc1NwZWNpZ\n        mllZCIgVHlwZU5hbWU9InRuczpJU0E5NU1hdGVyaWFsRGF0YVR5cGUiIE5hbWU9Ik1hdGVya\n        WFsQWN0dWFscyIvPgogPC9vcGM6U3RydWN0dXJlZFR5cGU+CiA8b3BjOlN0cnVjdHVyZWRUe\n        XBlIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiIE5hbWU9IklTQTk1TWF0ZXJpYWxEY\n        XRhVHlwZSI+CiAgPG9wYzpEb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXRlcmlhbCByZXNvd\n        XJjZSwgYSBxdWFudGl0eSwgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCBhbiBvcHRpb\n        25hbCBjb2xsZWN0aW9uIG9mIHByb3BlcnRpZXMuPC9vcGM6RG9jdW1lbnRhdGlvbj4KICA8b\n        3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJNYXRlcmlhbENsYXNzSURTcGVja\n        WZpZWQiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJNYXRlcmlhb\n        ERlZmluaXRpb25JRFNwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCa\n        XQiIE5hbWU9Ik1hdGVyaWFsTG90SURTcGVjaWZpZWQiLz4KICA8b3BjOkZpZWxkIFR5cGVOY\n        W1lPSJvcGM6Qml0IiBOYW1lPSJNYXRlcmlhbFN1YmxvdElEU3BlY2lmaWVkIi8+CiAgPG9wY\n        zpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iRGVzY3JpcHRpb25TcGVjaWZpZWQiL\n        z4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJNYXRlcmlhbFVzZVNwZ\n        WNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlF1YW50a\n        XR5U3BlY2lmaWVkIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iR\n        W5naW5lZXJpbmdVbml0c1NwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wY\n        zpCaXQiIE5hbWU9IlByb3BlcnRpZXNTcGVjaWZpZWQiLz4KICA8b3BjOkZpZWxkIExlbmd0a\n        D0iMjMiIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJSZXNlcnZlZDEiLz4KICA8b3BjOkZpZ\n        WxkIFN3aXRjaEZpZWxkPSJNYXRlcmlhbENsYXNzSURTcGVjaWZpZWQiIFR5cGVOYW1lPSJvc\n        GM6Q2hhckFycmF5IiBOYW1lPSJNYXRlcmlhbENsYXNzSUQiLz4KICA8b3BjOkZpZWxkIFN3a\n        XRjaEZpZWxkPSJNYXRlcmlhbERlZmluaXRpb25JRFNwZWNpZmllZCIgVHlwZU5hbWU9Im9wY\n        zpDaGFyQXJyYXkiIE5hbWU9Ik1hdGVyaWFsRGVmaW5pdGlvbklEIi8+CiAgPG9wYzpGaWVsZ\n        CBTd2l0Y2hGaWVsZD0iTWF0ZXJpYWxMb3RJRFNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpDa\n        GFyQXJyYXkiIE5hbWU9Ik1hdGVyaWFsTG90SUQiLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZ\n        WxkPSJNYXRlcmlhbFN1YmxvdElEU3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkNoYXJBcnJhe\n        SIgTmFtZT0iTWF0ZXJpYWxTdWJsb3RJRCIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9I\n        kRlc2NyaXB0aW9uU3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkludDMyIiBOYW1lPSJOb09mR\n        GVzY3JpcHRpb24iLz4KICA8b3BjOkZpZWxkIExlbmd0aEZpZWxkPSJOb09mRGVzY3JpcHRpb\n        24iIFN3aXRjaEZpZWxkPSJEZXNjcmlwdGlvblNwZWNpZmllZCIgVHlwZU5hbWU9InVhOkxvY\n        2FsaXplZFRleHQiIE5hbWU9IkRlc2NyaXB0aW9uIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGa\n        WVsZD0iTWF0ZXJpYWxVc2VTcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6Q2hhckFycmF5IiBOY\n        W1lPSJNYXRlcmlhbFVzZSIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IlF1YW50aXR5U\n        3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkNoYXJBcnJheSIgTmFtZT0iUXVhbnRpdHkiLz4KI\n        CA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJFbmdpbmVlcmluZ1VuaXRzU3BlY2lmaWVkIiBUe\n        XBlTmFtZT0idWE6RVVJbmZvcm1hdGlvbiIgTmFtZT0iRW5naW5lZXJpbmdVbml0cyIvPgogI\n        DxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IlByb3BlcnRpZXNTcGVjaWZpZWQiIFR5cGVOYW1lP\n        SJvcGM6SW50MzIiIE5hbWU9Ik5vT2ZQcm9wZXJ0aWVzIi8+CiAgPG9wYzpGaWVsZCBMZW5nd\n        GhGaWVsZD0iTm9PZlByb3BlcnRpZXMiIFN3aXRjaEZpZWxkPSJQcm9wZXJ0aWVzU3BlY2lma\n        WVkIiBUeXBlTmFtZT0idG5zOklTQTk1UHJvcGVydHlEYXRhVHlwZSIgTmFtZT0iUHJvcGVyd\n        GllcyIvPgogPC9vcGM6U3RydWN0dXJlZFR5cGU+CiA8b3BjOlN0cnVjdHVyZWRUeXBlIEJhc\n        2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiIE5hbWU9IklTQTk1UGFyYW1ldGVyRGF0YVR5c\n        GUiPgogIDxvcGM6RG9jdW1lbnRhdGlvbj5BIHN1YnR5cGUgb2YgT1BDIFVBIFN0cnVjdHVyZ\n        SB0aGF0IGRlZmluZXMgdGhyZWUgbGlua2VkIGRhdGEgaXRlbXM6IHRoZSBJRCwgd2hpY2gga\n        XMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBwcm9wZXJ0eSwgdGhlIHZhbHVlLCB3aGlja\n        CBpcyB0aGUgZGF0YSB0aGF0IGlzIGlkZW50aWZpZWQsIGFuZCBhbiBvcHRpb25hbCBkZXNjc\n        mlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyLjwvb3BjOkRvY3VtZW50YXRpb24+CiAgPG9wYzpGa\n        WVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iRGVzY3JpcHRpb25TcGVjaWZpZWQiLz4KI\n        CA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJFbmdpbmVlcmluZ1VuaXRzU\n        3BlY2lmaWVkIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iU3Vic\n        GFyYW1ldGVyc1NwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgTGVuZ3RoPSIyOSIgVHlwZU5hb\n        WU9Im9wYzpCaXQiIE5hbWU9IlJlc2VydmVkMSIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9I\n        m9wYzpDaGFyQXJyYXkiIE5hbWU9IklEIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0idWE6V\n        mFyaWFudCIgTmFtZT0iVmFsdWUiLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJEZXNjc\n        mlwdGlvblNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iTm9PZkRlc2Nya\n        XB0aW9uIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGhGaWVsZD0iTm9PZkRlc2NyaXB0aW9uIiBTd\n        2l0Y2hGaWVsZD0iRGVzY3JpcHRpb25TcGVjaWZpZWQiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6Z\n        WRUZXh0IiBOYW1lPSJEZXNjcmlwdGlvbiIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9I\n        kVuZ2luZWVyaW5nVW5pdHNTcGVjaWZpZWQiIFR5cGVOYW1lPSJ1YTpFVUluZm9ybWF0aW9uI\n        iBOYW1lPSJFbmdpbmVlcmluZ1VuaXRzIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iU\n        3VicGFyYW1ldGVyc1NwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iTm9PZ\n        lN1YnBhcmFtZXRlcnMiLz4KICA8b3BjOkZpZWxkIExlbmd0aEZpZWxkPSJOb09mU3VicGFyY\n        W1ldGVycyIgU3dpdGNoRmllbGQ9IlN1YnBhcmFtZXRlcnNTcGVjaWZpZWQiIFR5cGVOYW1lP\n        SJ0bnM6SVNBOTVQYXJhbWV0ZXJEYXRhVHlwZSIgTmFtZT0iU3VicGFyYW1ldGVycyIvPgogP\n        C9vcGM6U3RydWN0dXJlZFR5cGU+CiA8b3BjOlN0cnVjdHVyZWRUeXBlIEJhc2VUeXBlPSJ1Y\n        TpFeHRlbnNpb25PYmplY3QiIE5hbWU9IklTQTk1UGVyc29ubmVsRGF0YVR5cGUiPgogIDxvc\n        GM6RG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcGVyc29ubmVsIHJlc291cmNlIG9yIGEgcGVyc\n        29uLCBhIHF1YW50aXR5LCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIGFuIG9wdGlvb\n        mFsIGNvbGxlY3Rpb24gb2YgcHJvcGVydGllcy48L29wYzpEb2N1bWVudGF0aW9uPgogIDxvc\n        GM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IkRlc2NyaXB0aW9uU3BlY2lmaWVkI\n        i8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iUGVyc29ubmVsVXNlU\n        3BlY2lmaWVkIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iUXVhb\n        nRpdHlTcGVjaWZpZWQiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lP\n        SJFbmdpbmVlcmluZ1VuaXRzU3BlY2lmaWVkIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib\n        3BjOkJpdCIgTmFtZT0iUHJvcGVydGllc1NwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgTGVuZ\n        3RoPSIyNyIgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlJlc2VydmVkMSIvPgogIDxvcGM6R\n        mllbGQgVHlwZU5hbWU9Im9wYzpDaGFyQXJyYXkiIE5hbWU9IklEIi8+CiAgPG9wYzpGaWVsZ\n        CBTd2l0Y2hGaWVsZD0iRGVzY3JpcHRpb25TcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6SW50M\n        zIiIE5hbWU9Ik5vT2ZEZXNjcmlwdGlvbiIvPgogIDxvcGM6RmllbGQgTGVuZ3RoRmllbGQ9I\n        k5vT2ZEZXNjcmlwdGlvbiIgU3dpdGNoRmllbGQ9IkRlc2NyaXB0aW9uU3BlY2lmaWVkIiBUe\n        XBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgTmFtZT0iRGVzY3JpcHRpb24iLz4KICA8b3BjO\n        kZpZWxkIFN3aXRjaEZpZWxkPSJQZXJzb25uZWxVc2VTcGVjaWZpZWQiIFR5cGVOYW1lPSJvc\n        GM6Q2hhckFycmF5IiBOYW1lPSJQZXJzb25uZWxVc2UiLz4KICA8b3BjOkZpZWxkIFN3aXRja\n        EZpZWxkPSJRdWFudGl0eVNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpDaGFyQXJyYXkiIE5hb\n        WU9IlF1YW50aXR5Ii8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iRW5naW5lZXJpbmdVb\n        ml0c1NwZWNpZmllZCIgVHlwZU5hbWU9InVhOkVVSW5mb3JtYXRpb24iIE5hbWU9IkVuZ2luZ\n        WVyaW5nVW5pdHMiLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJQcm9wZXJ0aWVzU3BlY\n        2lmaWVkIiBUeXBlTmFtZT0ib3BjOkludDMyIiBOYW1lPSJOb09mUHJvcGVydGllcyIvPgogI\n        DxvcGM6RmllbGQgTGVuZ3RoRmllbGQ9Ik5vT2ZQcm9wZXJ0aWVzIiBTd2l0Y2hGaWVsZD0iU\n        HJvcGVydGllc1NwZWNpZmllZCIgVHlwZU5hbWU9InRuczpJU0E5NVByb3BlcnR5RGF0YVR5c\n        GUiIE5hbWU9IlByb3BlcnRpZXMiLz4KIDwvb3BjOlN0cnVjdHVyZWRUeXBlPgogPG9wYzpTd\n        HJ1Y3R1cmVkVHlwZSBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiBOYW1lPSJJU0E5N\n        VBoeXNpY2FsQXNzZXREYXRhVHlwZSI+CiAgPG9wYzpEb2N1bWVudGF0aW9uPkRlZmluZXMgY\n        SBwaHlzaWNhbCBhc3NldCwgYSBxdWFudGl0eSwgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sI\n        GFuZCBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIHByb3BlcnRpZXMuPC9vcGM6RG9jdW1lb\n        nRhdGlvbj4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJEZXNjcmlwd\n        GlvblNwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9I\n        lBoeXNpY2FsQXNzZXRVc2VTcGVjaWZpZWQiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvc\n        GM6Qml0IiBOYW1lPSJRdWFudGl0eVNwZWNpZmllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hb\n        WU9Im9wYzpCaXQiIE5hbWU9IkVuZ2luZWVyaW5nVW5pdHNTcGVjaWZpZWQiLz4KICA8b3BjO\n        kZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJQcm9wZXJ0aWVzU3BlY2lmaWVkIi8+C\n        iAgPG9wYzpGaWVsZCBMZW5ndGg9IjI3IiBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iUmVzZ\n        XJ2ZWQxIi8+CiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkNoYXJBcnJheSIgTmFtZT0iS\n        UQiLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJEZXNjcmlwdGlvblNwZWNpZmllZCIgV\n        HlwZU5hbWU9Im9wYzpJbnQzMiIgTmFtZT0iTm9PZkRlc2NyaXB0aW9uIi8+CiAgPG9wYzpGa\n        WVsZCBMZW5ndGhGaWVsZD0iTm9PZkRlc2NyaXB0aW9uIiBTd2l0Y2hGaWVsZD0iRGVzY3Jpc\n        HRpb25TcGVjaWZpZWQiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBOYW1lPSJEZXNjc\n        mlwdGlvbiIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IlBoeXNpY2FsQXNzZXRVc2VTc\n        GVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6Q2hhckFycmF5IiBOYW1lPSJQaHlzaWNhbEFzc2V0V\n        XNlIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iUXVhbnRpdHlTcGVjaWZpZWQiIFR5c\n        GVOYW1lPSJvcGM6Q2hhckFycmF5IiBOYW1lPSJRdWFudGl0eSIvPgogIDxvcGM6RmllbGQgU\n        3dpdGNoRmllbGQ9IkVuZ2luZWVyaW5nVW5pdHNTcGVjaWZpZWQiIFR5cGVOYW1lPSJ1YTpFV\n        UluZm9ybWF0aW9uIiBOYW1lPSJFbmdpbmVlcmluZ1VuaXRzIi8+CiAgPG9wYzpGaWVsZCBTd\n        2l0Y2hGaWVsZD0iUHJvcGVydGllc1NwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgT\n        mFtZT0iTm9PZlByb3BlcnRpZXMiLz4KICA8b3BjOkZpZWxkIExlbmd0aEZpZWxkPSJOb09mU\n        HJvcGVydGllcyIgU3dpdGNoRmllbGQ9IlByb3BlcnRpZXNTcGVjaWZpZWQiIFR5cGVOYW1lP\n        SJ0bnM6SVNBOTVQcm9wZXJ0eURhdGFUeXBlIiBOYW1lPSJQcm9wZXJ0aWVzIi8+CiA8L29wY\n        zpTdHJ1Y3R1cmVkVHlwZT4KIDxvcGM6U3RydWN0dXJlZFR5cGUgQmFzZVR5cGU9InVhOkV4d\n        GVuc2lvbk9iamVjdCIgTmFtZT0iSVNBOTVQcm9wZXJ0eURhdGFUeXBlIj4KICA8b3BjOkRvY\n        3VtZW50YXRpb24+QSBzdWJ0eXBlIG9mIE9QQyBVQSBTdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzI\n        HR3byBsaW5rZWQgZGF0YSBpdGVtczogYW4gSUQsIHdoaWNoIGlzIGEgdW5pcXVlIGlkZW50a\n        WZpZXIgZm9yIGEgcHJvcGVydHkgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYXNzb2NpYXRlZ\n        CByZXNvdXJjZSwgYW5kIHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIGRhdGEgZm9yIHRoZSBwc\n        m9wZXJ0eS48L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wY\n        zpCaXQiIE5hbWU9IkRlc2NyaXB0aW9uU3BlY2lmaWVkIi8+CiAgPG9wYzpGaWVsZCBUeXBlT\n        mFtZT0ib3BjOkJpdCIgTmFtZT0iRW5naW5lZXJpbmdVbml0c1NwZWNpZmllZCIvPgogIDxvc\n        GM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlN1YnByb3BlcnRpZXNTcGVjaWZpZ\n        WQiLz4KICA8b3BjOkZpZWxkIExlbmd0aD0iMjkiIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lP\n        SJSZXNlcnZlZDEiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Q2hhckFycmF5IiBOY\n        W1lPSJJRCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9InVhOlZhcmlhbnQiIE5hbWU9IlZhb\n        HVlIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iRGVzY3JpcHRpb25TcGVjaWZpZWQiI\n        FR5cGVOYW1lPSJvcGM6SW50MzIiIE5hbWU9Ik5vT2ZEZXNjcmlwdGlvbiIvPgogIDxvcGM6R\n        mllbGQgTGVuZ3RoRmllbGQ9Ik5vT2ZEZXNjcmlwdGlvbiIgU3dpdGNoRmllbGQ9IkRlc2Nya\n        XB0aW9uU3BlY2lmaWVkIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgTmFtZT0iRGVzY\n        3JpcHRpb24iLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJFbmdpbmVlcmluZ1VuaXRzU\n        3BlY2lmaWVkIiBUeXBlTmFtZT0idWE6RVVJbmZvcm1hdGlvbiIgTmFtZT0iRW5naW5lZXJpb\n        mdVbml0cyIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IlN1YnByb3BlcnRpZXNTcGVja\n        WZpZWQiIFR5cGVOYW1lPSJvcGM6SW50MzIiIE5hbWU9Ik5vT2ZTdWJwcm9wZXJ0aWVzIi8+C\n        iAgPG9wYzpGaWVsZCBMZW5ndGhGaWVsZD0iTm9PZlN1YnByb3BlcnRpZXMiIFN3aXRjaEZpZ\n        WxkPSJTdWJwcm9wZXJ0aWVzU3BlY2lmaWVkIiBUeXBlTmFtZT0idG5zOklTQTk1UHJvcGVyd\n        HlEYXRhVHlwZSIgTmFtZT0iU3VicHJvcGVydGllcyIvPgogPC9vcGM6U3RydWN0dXJlZFR5c\n        GU+CiA8b3BjOlN0cnVjdHVyZWRUeXBlIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiI\n        E5hbWU9IklTQTk1U3RhdGVEYXRhVHlwZSI+CiAgPG9wYzpEb2N1bWVudGF0aW9uPkRlZmluZ\n        XMgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBzY2hlZHVsZSBhbmQgZXhlY3V0ZSBhIGpvY\n        i48L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9InVhOlJlbGF0a\n        XZlUGF0aCIgTmFtZT0iQnJvd3NlUGF0aCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9InVhO\n        kxvY2FsaXplZFRleHQiIE5hbWU9IlN0YXRlVGV4dCIvPgogIDxvcGM6RmllbGQgVHlwZU5hb\n        WU9Im9wYzpVSW50MzIiIE5hbWU9IlN0YXRlTnVtYmVyIi8+CiA8L29wYzpTdHJ1Y3R1cmVkV\n        HlwZT4KIDxvcGM6U3RydWN0dXJlZFR5cGUgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjd\n        CIgTmFtZT0iSVNBOTVXb3JrTWFzdGVyRGF0YVR5cGUiPgogIDxvcGM6RG9jdW1lbnRhdGlvb\n        j5EZWZpbmVzIGEgV29yayBNYXN0ZXIgSUQgYW5kIHRoZSBkZWZpbmVkIHBhcmFtZXRlcnMgZ\n        m9yIHRoZSBXb3JrIE1hc3Rlci48L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6RmllbGQgV\n        HlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IkRlc2NyaXB0aW9uU3BlY2lmaWVkIi8+CiAgPG9wY\n        zpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iUGFyYW1ldGVyc1NwZWNpZmllZCIvP\n        gogIDxvcGM6RmllbGQgTGVuZ3RoPSIzMCIgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlJlc\n        2VydmVkMSIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpDaGFyQXJyYXkiIE5hbWU9I\n        klEIi8+CiAgPG9wYzpGaWVsZCBTd2l0Y2hGaWVsZD0iRGVzY3JpcHRpb25TcGVjaWZpZWQiI\n        FR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBOYW1lPSJEZXNjcmlwdGlvbiIvPgogIDxvc\n        GM6RmllbGQgU3dpdGNoRmllbGQ9IlBhcmFtZXRlcnNTcGVjaWZpZWQiIFR5cGVOYW1lPSJvc\n        GM6SW50MzIiIE5hbWU9Ik5vT2ZQYXJhbWV0ZXJzIi8+CiAgPG9wYzpGaWVsZCBMZW5ndGhGa\n        WVsZD0iTm9PZlBhcmFtZXRlcnMiIFN3aXRjaEZpZWxkPSJQYXJhbWV0ZXJzU3BlY2lmaWVkI\n        iBUeXBlTmFtZT0idG5zOklTQTk1UGFyYW1ldGVyRGF0YVR5cGUiIE5hbWU9IlBhcmFtZXRlc\n        nMiLz4KIDwvb3BjOlN0cnVjdHVyZWRUeXBlPgo8L29wYzpUeXBlRGljdGlvbmFyeT4K</uax:ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6019\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=6018\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6018</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6020\" BrowseName=\"1:TypeDictionary\" SymbolicName=\"TypeDictionary_XmlSchema\" DataType=\"ByteString\">\n    <DisplayName>TypeDictionary</DisplayName>\n    <Description>Collects the data type descriptions of http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6030</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6032</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6117</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6119</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6121</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6123</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6125</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6127</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6129</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6131</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6133</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6021</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=92</Reference>\n    </References>\n    <Value>\n      <uax:ByteString xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJod\n        HRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvSVNBOTUtSk9CQ09OVFJPTF9WMi9UeXBlcy54c\n        2QiIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL0lTQTk1LUpPQkNPT\n        lRST0xfVjIvVHlwZXMueHNkIiB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL\n        1VBLzIwMDgvMDIvVHlwZXMueHNkIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwM\n        S9YTUxTY2hlbWEiPgogPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0a\n        W9uLm9yZy9VQS8yMDA4LzAyL1R5cGVzLnhzZCIvPgogPHhzOmNvbXBsZXhUeXBlIG5hbWU9I\n        klTQTk1RXF1aXBtZW50RGF0YVR5cGUiPgogIDx4czphbm5vdGF0aW9uPgogICA8eHM6ZG9jd\n        W1lbnRhdGlvbj5EZWZpbmVzIGFuIGVxdWlwbWVudCByZXNvdXJjZSBvciBhIHBpZWNlIG9mI\n        GVxdWlwbWVudCwgYSBxdWFudGl0eSwgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCBhb\n        iBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIHByb3BlcnRpZXMuPC94czpkb2N1bWVudGF0aW9uP\n        gogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplbGVtZW50IG1pb\n        k9jY3Vycz0iMCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG5hbWU9IkVuY29kaW5nTWFzayIvP\n        gogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0ieHM6c\n        3RyaW5nIiBuYW1lPSJJRCIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY\n        3Vycz0iMSIgdHlwZT0idWE6TGlzdE9mTG9jYWxpemVkVGV4dCIgbmFtZT0iRGVzY3JpcHRpb\n        24iLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9I\n        nhzOnN0cmluZyIgbmFtZT0iRXF1aXBtZW50VXNlIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY\n        3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ4czpzdHJpbmciIG5hbWU9IlF1YW50aXR5I\n        i8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ1Y\n        TpFVUluZm9ybWF0aW9uIiBuYW1lPSJFbmdpbmVlcmluZ1VuaXRzIi8+CiAgIDx4czplbGVtZ\n        W50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVQc\n        m9wZXJ0eURhdGFUeXBlIiBuYW1lPSJQcm9wZXJ0aWVzIi8+CiAgPC94czpzZXF1ZW5jZT4KI\n        DwveHM6Y29tcGxleFR5cGU+CiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6SVNBOTVFcXVpcG1lb\n        nREYXRhVHlwZSIgbmFtZT0iSVNBOTVFcXVpcG1lbnREYXRhVHlwZSIvPgogPHhzOmNvbXBsZ\n        XhUeXBlIG5hbWU9Ikxpc3RPZklTQTk1RXF1aXBtZW50RGF0YVR5cGUiPgogIDx4czpzZXF1Z\n        W5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZ\n        CIgdHlwZT0idG5zOklTQTk1RXF1aXBtZW50RGF0YVR5cGUiIG5hbWU9IklTQTk1RXF1aXBtZ\n        W50RGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y\n        29tcGxleFR5cGU+CiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVFcXVpcG1lb\n        nREYXRhVHlwZSIgbmFtZT0iTGlzdE9mSVNBOTVFcXVpcG1lbnREYXRhVHlwZSIgbmlsbGFib\n        GU9InRydWUiLz4KIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJU0E5NUpvYk9yZGVyQW5kU3Rhd\n        GVEYXRhVHlwZSI+CiAgPHhzOmFubm90YXRpb24+CiAgIDx4czpkb2N1bWVudGF0aW9uPkRlZ\n        mluZXMgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBzY2hlZHVsZSBhbmQgZXhlY3V0ZSBhI\n        GpvYi48L3hzOmRvY3VtZW50YXRpb24+CiAgPC94czphbm5vdGF0aW9uPgogIDx4czpzZXF1Z\n        W5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9I\n        nRuczpJU0E5NUpvYk9yZGVyRGF0YVR5cGUiIG5hbWU9IkpvYk9yZGVyIi8+CiAgIDx4czplb\n        GVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ0bnM6TGlzdE9mSVNBO\n        TVTdGF0ZURhdGFUeXBlIiBuYW1lPSJTdGF0ZSIvPgogIDwveHM6c2VxdWVuY2U+CiA8L3hzO\n        mNvbXBsZXhUeXBlPgogPHhzOmVsZW1lbnQgdHlwZT0idG5zOklTQTk1Sm9iT3JkZXJBbmRTd\n        GF0ZURhdGFUeXBlIiBuYW1lPSJJU0E5NUpvYk9yZGVyQW5kU3RhdGVEYXRhVHlwZSIvPgogP\n        HhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklTQTk1Sm9iT3JkZXJBbmRTdGF0ZURhdGFUe\n        XBlIj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T\n        2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InRuczpJU0E5NUpvYk9yZGVyQW5kU3RhdGVEYXRhV\n        HlwZSIgbmFtZT0iSVNBOTVKb2JPcmRlckFuZFN0YXRlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0c\n        nVlIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU+CiA8eHM6ZWxlbWVud\n        CB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVKb2JPcmRlckFuZFN0YXRlRGF0YVR5cGUiIG5hbWU9I\n        kxpc3RPZklTQTk1Sm9iT3JkZXJBbmRTdGF0ZURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSIvP\n        gogPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklTQTk1Sm9iT3JkZXJEYXRhVHlwZSI+CiAgPHhzO\n        mFubm90YXRpb24+CiAgIDx4czpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGluZm9ybWF0a\n        W9uIG5lZWRlZCB0byBzY2hlZHVsZSBhbmQgZXhlY3V0ZSBhIGpvYi48L3hzOmRvY3VtZW50Y\n        XRpb24+CiAgPC94czphbm5vdGF0aW9uPgogIDx4czpzZXF1ZW5jZT4KICAgPHhzOmVsZW1lb\n        nQgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbmFtZT0iRW5jb2RpbmdNY\n        XNrIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlP\n        SJ4czpzdHJpbmciIG5hbWU9IkpvYk9yZGVySUQiLz4KICAgPHhzOmVsZW1lbnQgbWluT2Njd\n        XJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InVhOkxpc3RPZkxvY2FsaXplZFRleHQiIG5hb\n        WU9IkRlc2NyaXB0aW9uIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2Njd\n        XJzPSIxIiB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVXb3JrTWFzdGVyRGF0YVR5cGUiIG5hbWU9I\n        ldvcmtNYXN0ZXJJRCIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vyc\n        z0iMSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG5hbWU9IlN0YXJ0VGltZSIvPgogICA8eHM6ZWxlb\n        WVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG5hb\n        WU9IkVuZFRpbWUiLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9I\n        jEiIHR5cGU9InhzOnNob3J0IiBuYW1lPSJQcmlvcml0eSIvPgogICA8eHM6ZWxlbWVudCBta\n        W5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0idG5zOkxpc3RPZklTQTk1UGFyYW1ld\n        GVyRGF0YVR5cGUiIG5hbWU9IkpvYk9yZGVyUGFyYW1ldGVycyIvPgogICA8eHM6ZWxlbWVud\n        CBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0idG5zOkxpc3RPZklTQTk1UGVyc\n        29ubmVsRGF0YVR5cGUiIG5hbWU9IlBlcnNvbm5lbFJlcXVpcmVtZW50cyIvPgogICA8eHM6Z\n        WxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0idG5zOkxpc3RPZklTQ\n        Tk1RXF1aXBtZW50RGF0YVR5cGUiIG5hbWU9IkVxdWlwbWVudFJlcXVpcmVtZW50cyIvPgogI\n        CA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0idG5zOkxpc\n        3RPZklTQTk1UGh5c2ljYWxBc3NldERhdGFUeXBlIiBuYW1lPSJQaHlzaWNhbEFzc2V0UmVxd\n        WlyZW1lbnRzIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxI\n        iB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVNYXRlcmlhbERhdGFUeXBlIiBuYW1lPSJNYXRlcmlhb\n        FJlcXVpcmVtZW50cyIvPgogIDwveHM6c2VxdWVuY2U+CiA8L3hzOmNvbXBsZXhUeXBlPgogP\n        HhzOmVsZW1lbnQgdHlwZT0idG5zOklTQTk1Sm9iT3JkZXJEYXRhVHlwZSIgbmFtZT0iSVNBO\n        TVKb2JPcmRlckRhdGFUeXBlIi8+CiA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSVNBO\n        TVKb2JPcmRlckRhdGFUeXBlIj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplbGVtZW50IG1pb\n        k9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InRuczpJU0E5NUpvYk9yZ\n        GVyRGF0YVR5cGUiIG5hbWU9IklTQTk1Sm9iT3JkZXJEYXRhVHlwZSIgbmlsbGFibGU9InRyd\n        WUiLz4KICA8L3hzOnNlcXVlbmNlPgogPC94czpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50I\n        HR5cGU9InRuczpMaXN0T2ZJU0E5NUpvYk9yZGVyRGF0YVR5cGUiIG5hbWU9Ikxpc3RPZklTQ\n        Tk1Sm9iT3JkZXJEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiLz4KIDx4czpjb21wbGV4VHlwZ\n        SBuYW1lPSJJU0E5NUpvYlJlc3BvbnNlRGF0YVR5cGUiPgogIDx4czphbm5vdGF0aW9uPgogI\n        CA8eHM6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gc\n        2NoZWR1bGUgYW5kIGV4ZWN1dGUgYSBqb2IuPC94czpkb2N1bWVudGF0aW9uPgogIDwveHM6Y\n        W5ub3RhdGlvbj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iM\n        CIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG5hbWU9IkVuY29kaW5nTWFzayIvPgogICA8eHM6Z\n        WxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0ieHM6c3RyaW5nIiBuY\n        W1lPSJKb2JSZXNwb25zZUlEIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T\n        2NjdXJzPSIxIiB0eXBlPSJ1YTpMb2NhbGl6ZWRUZXh0IiBuYW1lPSJEZXNjcmlwdGlvbiIvP\n        gogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0ieHM6c\n        3RyaW5nIiBuYW1lPSJKb2JPcmRlcklEIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iM\n        CIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ4czpkYXRlVGltZSIgbmFtZT0iU3RhcnRUaW1lIi8+C\n        iAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ4czpkY\n        XRlVGltZSIgbmFtZT0iRW5kVGltZSIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiI\n        G1heE9jY3Vycz0iMSIgdHlwZT0idG5zOkxpc3RPZklTQTk1U3RhdGVEYXRhVHlwZSIgbmFtZ\n        T0iSm9iU3RhdGUiLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9I\n        jEiIHR5cGU9InRuczpMaXN0T2ZJU0E5NVBhcmFtZXRlckRhdGFUeXBlIiBuYW1lPSJKb2JSZ\n        XNwb25zZURhdGEiLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9I\n        jEiIHR5cGU9InRuczpMaXN0T2ZJU0E5NVBlcnNvbm5lbERhdGFUeXBlIiBuYW1lPSJQZXJzb\n        25uZWxBY3R1YWxzIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzP\n        SIxIiB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVFcXVpcG1lbnREYXRhVHlwZSIgbmFtZT0iRXF1a\n        XBtZW50QWN0dWFscyIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vyc\n        z0iMSIgdHlwZT0idG5zOkxpc3RPZklTQTk1UGh5c2ljYWxBc3NldERhdGFUeXBlIiBuYW1lP\n        SJQaHlzaWNhbEFzc2V0QWN0dWFscyIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiI\n        G1heE9jY3Vycz0iMSIgdHlwZT0idG5zOkxpc3RPZklTQTk1TWF0ZXJpYWxEYXRhVHlwZSIgb\n        mFtZT0iTWF0ZXJpYWxBY3R1YWxzIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxle\n        FR5cGU+CiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6SVNBOTVKb2JSZXNwb25zZURhdGFUeXBlI\n        iBuYW1lPSJJU0E5NUpvYlJlc3BvbnNlRGF0YVR5cGUiLz4KIDx4czpjb21wbGV4VHlwZSBuY\n        W1lPSJMaXN0T2ZJU0E5NUpvYlJlc3BvbnNlRGF0YVR5cGUiPgogIDx4czpzZXF1ZW5jZT4KI\n        CAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZ\n        T0idG5zOklTQTk1Sm9iUmVzcG9uc2VEYXRhVHlwZSIgbmFtZT0iSVNBOTVKb2JSZXNwb25zZ\n        URhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSIvPgogIDwveHM6c2VxdWVuY2U+CiA8L3hzOmNvb\n        XBsZXhUeXBlPgogPHhzOmVsZW1lbnQgdHlwZT0idG5zOkxpc3RPZklTQTk1Sm9iUmVzcG9uc\n        2VEYXRhVHlwZSIgbmFtZT0iTGlzdE9mSVNBOTVKb2JSZXNwb25zZURhdGFUeXBlIiBuaWxsY\n        WJsZT0idHJ1ZSIvPgogPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklTQTk1TWF0ZXJpYWxEYXRhV\n        HlwZSI+CiAgPHhzOmFubm90YXRpb24+CiAgIDx4czpkb2N1bWVudGF0aW9uPkRlZmluZXMgY\n        SBtYXRlcmlhbCByZXNvdXJjZSwgYSBxdWFudGl0eSwgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb\n        24sIGFuZCBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIHByb3BlcnRpZXMuPC94czpkb2N1b\n        WVudGF0aW9uPgogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplb\n        GVtZW50IG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG5hbWU9IkVuY29ka\n        W5nTWFzayIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgd\n        HlwZT0ieHM6c3RyaW5nIiBuYW1lPSJNYXRlcmlhbENsYXNzSUQiLz4KICAgPHhzOmVsZW1lb\n        nQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iT\n        WF0ZXJpYWxEZWZpbml0aW9uSUQiLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtY\n        XhPY2N1cnM9IjEiIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iTWF0ZXJpYWxMb3RJRCIvPgogI\n        CA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0ieHM6c3Rya\n        W5nIiBuYW1lPSJNYXRlcmlhbFN1YmxvdElEIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vyc\n        z0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ1YTpMaXN0T2ZMb2NhbGl6ZWRUZXh0IiBuYW1lP\n        SJEZXNjcmlwdGlvbiIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vyc\n        z0iMSIgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJNYXRlcmlhbFVzZSIvPgogICA8eHM6ZWxlb\n        WVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0ieHM6c3RyaW5nIiBuYW1lP\n        SJRdWFudGl0eSIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iM\n        SIgdHlwZT0idWE6RVVJbmZvcm1hdGlvbiIgbmFtZT0iRW5naW5lZXJpbmdVbml0cyIvPgogI\n        CA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0idG5zOkxpc\n        3RPZklTQTk1UHJvcGVydHlEYXRhVHlwZSIgbmFtZT0iUHJvcGVydGllcyIvPgogIDwveHM6c\n        2VxdWVuY2U+CiA8L3hzOmNvbXBsZXhUeXBlPgogPHhzOmVsZW1lbnQgdHlwZT0idG5zOklTQ\n        Tk1TWF0ZXJpYWxEYXRhVHlwZSIgbmFtZT0iSVNBOTVNYXRlcmlhbERhdGFUeXBlIi8+CiA8e\n        HM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSVNBOTVNYXRlcmlhbERhdGFUeXBlIj4KICA8e\n        HM6c2VxdWVuY2U+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1b\n        mJvdW5kZWQiIHR5cGU9InRuczpJU0E5NU1hdGVyaWFsRGF0YVR5cGUiIG5hbWU9IklTQTk1T\n        WF0ZXJpYWxEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiLz4KICA8L3hzOnNlcXVlbmNlPgogP\n        C94czpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50IHR5cGU9InRuczpMaXN0T2ZJU0E5NU1hd\n        GVyaWFsRGF0YVR5cGUiIG5hbWU9Ikxpc3RPZklTQTk1TWF0ZXJpYWxEYXRhVHlwZSIgbmlsb\n        GFibGU9InRydWUiLz4KIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJU0E5NVBhcmFtZXRlckRhd\n        GFUeXBlIj4KICA8eHM6YW5ub3RhdGlvbj4KICAgPHhzOmRvY3VtZW50YXRpb24+QSBzdWJ0e\n        XBlIG9mIE9QQyBVQSBTdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRocmVlIGxpbmtlZCBkYXRhI\n        Gl0ZW1zOiB0aGUgSUQsIHdoaWNoIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcHJvc\n        GVydHksIHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIGRhdGEgdGhhdCBpcyBpZGVudGlmaWVkL\n        CBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlci48L3hzOmRvY\n        3VtZW50YXRpb24+CiAgPC94czphbm5vdGF0aW9uPgogIDx4czpzZXF1ZW5jZT4KICAgPHhzO\n        mVsZW1lbnQgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbmFtZT0iRW5jb\n        2RpbmdNYXNrIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxI\n        iB0eXBlPSJ4czpzdHJpbmciIG5hbWU9IklEIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vyc\n        z0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ1YTpWYXJpYW50IiBuYW1lPSJWYWx1ZSIvPgogI\n        CA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0idWE6TGlzd\n        E9mTG9jYWxpemVkVGV4dCIgbmFtZT0iRGVzY3JpcHRpb24iLz4KICAgPHhzOmVsZW1lbnQgb\n        WluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InVhOkVVSW5mb3JtYXRpb24iIG5hb\n        WU9IkVuZ2luZWVyaW5nVW5pdHMiLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtY\n        XhPY2N1cnM9IjEiIHR5cGU9InRuczpMaXN0T2ZJU0E5NVBhcmFtZXRlckRhdGFUeXBlIiBuY\n        W1lPSJTdWJwYXJhbWV0ZXJzIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5c\n        GU+CiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6SVNBOTVQYXJhbWV0ZXJEYXRhVHlwZSIgbmFtZ\n        T0iSVNBOTVQYXJhbWV0ZXJEYXRhVHlwZSIvPgogPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc\n        3RPZklTQTk1UGFyYW1ldGVyRGF0YVR5cGUiPgogIDx4czpzZXF1ZW5jZT4KICAgPHhzOmVsZ\n        W1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zOklTQ\n        Tk1UGFyYW1ldGVyRGF0YVR5cGUiIG5hbWU9IklTQTk1UGFyYW1ldGVyRGF0YVR5cGUiIG5pb\n        GxhYmxlPSJ0cnVlIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU+CiA8e\n        HM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVQYXJhbWV0ZXJEYXRhVHlwZSIgbmFtZ\n        T0iTGlzdE9mSVNBOTVQYXJhbWV0ZXJEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiLz4KIDx4c\n        zpjb21wbGV4VHlwZSBuYW1lPSJJU0E5NVBlcnNvbm5lbERhdGFUeXBlIj4KICA8eHM6YW5ub\n        3RhdGlvbj4KICAgPHhzOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHBlcnNvbm5lbCByZXNvd\n        XJjZSBvciBhIHBlcnNvbiwgYSBxdWFudGl0eSwgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sI\n        GFuZCBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIHByb3BlcnRpZXMuPC94czpkb2N1bWVud\n        GF0aW9uPgogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplbGVtZ\n        W50IG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG5hbWU9IkVuY29kaW5nT\n        WFzayIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZ\n        T0ieHM6c3RyaW5nIiBuYW1lPSJJRCIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiI\n        G1heE9jY3Vycz0iMSIgdHlwZT0idWE6TGlzdE9mTG9jYWxpemVkVGV4dCIgbmFtZT0iRGVzY\n        3JpcHRpb24iLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiI\n        HR5cGU9InhzOnN0cmluZyIgbmFtZT0iUGVyc29ubmVsVXNlIi8+CiAgIDx4czplbGVtZW50I\n        G1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ4czpzdHJpbmciIG5hbWU9IlF1Y\n        W50aXR5Ii8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0e\n        XBlPSJ1YTpFVUluZm9ybWF0aW9uIiBuYW1lPSJFbmdpbmVlcmluZ1VuaXRzIi8+CiAgIDx4c\n        zplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ0bnM6TGlzdE9mS\n        VNBOTVQcm9wZXJ0eURhdGFUeXBlIiBuYW1lPSJQcm9wZXJ0aWVzIi8+CiAgPC94czpzZXF1Z\n        W5jZT4KIDwveHM6Y29tcGxleFR5cGU+CiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6SVNBOTVQZ\n        XJzb25uZWxEYXRhVHlwZSIgbmFtZT0iSVNBOTVQZXJzb25uZWxEYXRhVHlwZSIvPgogPHhzO\n        mNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklTQTk1UGVyc29ubmVsRGF0YVR5cGUiPgogIDx4c\n        zpzZXF1ZW5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuY\n        m91bmRlZCIgdHlwZT0idG5zOklTQTk1UGVyc29ubmVsRGF0YVR5cGUiIG5hbWU9IklTQTk1U\n        GVyc29ubmVsRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIi8+CiAgPC94czpzZXF1ZW5jZT4KI\n        DwveHM6Y29tcGxleFR5cGU+CiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVQZ\n        XJzb25uZWxEYXRhVHlwZSIgbmFtZT0iTGlzdE9mSVNBOTVQZXJzb25uZWxEYXRhVHlwZSIgb\n        mlsbGFibGU9InRydWUiLz4KIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJU0E5NVBoeXNpY2FsQ\n        XNzZXREYXRhVHlwZSI+CiAgPHhzOmFubm90YXRpb24+CiAgIDx4czpkb2N1bWVudGF0aW9uP\n        kRlZmluZXMgYSBwaHlzaWNhbCBhc3NldCwgYSBxdWFudGl0eSwgYW4gb3B0aW9uYWwgZGVzY\n        3JpcHRpb24sIGFuZCBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIHByb3BlcnRpZXMuPC94c\n        zpkb2N1bWVudGF0aW9uPgogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6c2VxdWVuY2U+CiAgI\n        Dx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG5hbWU9I\n        kVuY29kaW5nTWFzayIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vyc\n        z0iMSIgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJJRCIvPgogICA8eHM6ZWxlbWVudCBtaW5PY\n        2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0idWE6TGlzdE9mTG9jYWxpemVkVGV4dCIgb\n        mFtZT0iRGVzY3JpcHRpb24iLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY\n        2N1cnM9IjEiIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iUGh5c2ljYWxBc3NldFVzZSIvPgogI\n        CA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0ieHM6c3Rya\n        W5nIiBuYW1lPSJRdWFudGl0eSIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1he\n        E9jY3Vycz0iMSIgdHlwZT0idWE6RVVJbmZvcm1hdGlvbiIgbmFtZT0iRW5naW5lZXJpbmdVb\n        ml0cyIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZ\n        T0idG5zOkxpc3RPZklTQTk1UHJvcGVydHlEYXRhVHlwZSIgbmFtZT0iUHJvcGVydGllcyIvP\n        gogIDwveHM6c2VxdWVuY2U+CiA8L3hzOmNvbXBsZXhUeXBlPgogPHhzOmVsZW1lbnQgdHlwZ\n        T0idG5zOklTQTk1UGh5c2ljYWxBc3NldERhdGFUeXBlIiBuYW1lPSJJU0E5NVBoeXNpY2FsQ\n        XNzZXREYXRhVHlwZSIvPgogPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklTQTk1UGh5c\n        2ljYWxBc3NldERhdGFUeXBlIj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplbGVtZW50IG1pb\n        k9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InRuczpJU0E5NVBoeXNpY\n        2FsQXNzZXREYXRhVHlwZSIgbmFtZT0iSVNBOTVQaHlzaWNhbEFzc2V0RGF0YVR5cGUiIG5pb\n        GxhYmxlPSJ0cnVlIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU+CiA8e\n        HM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVQaHlzaWNhbEFzc2V0RGF0YVR5cGUiI\n        G5hbWU9Ikxpc3RPZklTQTk1UGh5c2ljYWxBc3NldERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1Z\n        SIvPgogPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklTQTk1UHJvcGVydHlEYXRhVHlwZSI+CiAgP\n        HhzOmFubm90YXRpb24+CiAgIDx4czpkb2N1bWVudGF0aW9uPkEgc3VidHlwZSBvZiBPUEMgV\n        UEgU3RydWN0dXJlIHRoYXQgZGVmaW5lcyB0d28gbGlua2VkIGRhdGEgaXRlbXM6IGFuIElEL\n        CB3aGljaCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHByb3BlcnR5IHdpdGhpbiB0a\n        GUgc2NvcGUgb2YgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UsIGFuZCB0aGUgdmFsdWUsIHdoa\n        WNoIGlzIHRoZSBkYXRhIGZvciB0aGUgcHJvcGVydHkuPC94czpkb2N1bWVudGF0aW9uPgogI\n        DwveHM6YW5ub3RhdGlvbj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplbGVtZW50IG1pbk9jY\n        3Vycz0iMCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG5hbWU9IkVuY29kaW5nTWFzayIvPgogI\n        CA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0ieHM6c3Rya\n        W5nIiBuYW1lPSJJRCIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vyc\n        z0iMSIgdHlwZT0idWE6VmFyaWFudCIgbmFtZT0iVmFsdWUiLz4KICAgPHhzOmVsZW1lbnQgb\n        WluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InVhOkxpc3RPZkxvY2FsaXplZFRle\n        HQiIG5hbWU9IkRlc2NyaXB0aW9uIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgb\n        WF4T2NjdXJzPSIxIiB0eXBlPSJ1YTpFVUluZm9ybWF0aW9uIiBuYW1lPSJFbmdpbmVlcmluZ\n        1VuaXRzIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0e\n        XBlPSJ0bnM6TGlzdE9mSVNBOTVQcm9wZXJ0eURhdGFUeXBlIiBuYW1lPSJTdWJwcm9wZXJ0a\n        WVzIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU+CiA8eHM6ZWxlbWVud\n        CB0eXBlPSJ0bnM6SVNBOTVQcm9wZXJ0eURhdGFUeXBlIiBuYW1lPSJJU0E5NVByb3BlcnR5R\n        GF0YVR5cGUiLz4KIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZJU0E5NVByb3BlcnR5R\n        GF0YVR5cGUiPgogIDx4czpzZXF1ZW5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwI\n        iBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zOklTQTk1UHJvcGVydHlEYXRhVHlwZ\n        SIgbmFtZT0iSVNBOTVQcm9wZXJ0eURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSIvPgogIDwve\n        HM6c2VxdWVuY2U+CiA8L3hzOmNvbXBsZXhUeXBlPgogPHhzOmVsZW1lbnQgdHlwZT0idG5zO\n        kxpc3RPZklTQTk1UHJvcGVydHlEYXRhVHlwZSIgbmFtZT0iTGlzdE9mSVNBOTVQcm9wZXJ0e\n        URhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSIvPgogPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklTQ\n        Tk1U3RhdGVEYXRhVHlwZSI+CiAgPHhzOmFubm90YXRpb24+CiAgIDx4czpkb2N1bWVudGF0a\n        W9uPkRlZmluZXMgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBzY2hlZHVsZSBhbmQgZXhlY\n        3V0ZSBhIGpvYi48L3hzOmRvY3VtZW50YXRpb24+CiAgPC94czphbm5vdGF0aW9uPgogIDx4c\n        zpzZXF1ZW5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiI\n        HR5cGU9InVhOlJlbGF0aXZlUGF0aCIgbmFtZT0iQnJvd3NlUGF0aCIvPgogICA8eHM6ZWxlb\n        WVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgdHlwZT0idWE6TG9jYWxpemVkVGV4d\n        CIgbmFtZT0iU3RhdGVUZXh0Ii8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T\n        2NjdXJzPSIxIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbmFtZT0iU3RhdGVOdW1iZXIiLz4KI\n        CA8L3hzOnNlcXVlbmNlPgogPC94czpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50IHR5cGU9I\n        nRuczpJU0E5NVN0YXRlRGF0YVR5cGUiIG5hbWU9IklTQTk1U3RhdGVEYXRhVHlwZSIvPgogP\n        HhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklTQTk1U3RhdGVEYXRhVHlwZSI+CiAgPHhzO\n        nNlcXVlbmNlPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib\n        3VuZGVkIiB0eXBlPSJ0bnM6SVNBOTVTdGF0ZURhdGFUeXBlIiBuYW1lPSJJU0E5NVN0YXRlR\n        GF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tc\n        GxleFR5cGU+CiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mSVNBOTVTdGF0ZURhdGFUe\n        XBlIiBuYW1lPSJMaXN0T2ZJU0E5NVN0YXRlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIi8+C\n        iA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSVNBOTVXb3JrTWFzdGVyRGF0YVR5cGUiPgogIDx4c\n        zphbm5vdGF0aW9uPgogICA8eHM6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgV29yayBNYXN0Z\n        XIgSUQgYW5kIHRoZSBkZWZpbmVkIHBhcmFtZXRlcnMgZm9yIHRoZSBXb3JrIE1hc3Rlci48L\n        3hzOmRvY3VtZW50YXRpb24+CiAgPC94czphbm5vdGF0aW9uPgogIDx4czpzZXF1ZW5jZT4KI\n        CAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbmFtZ\n        T0iRW5jb2RpbmdNYXNrIi8+CiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2Njd\n        XJzPSIxIiB0eXBlPSJ4czpzdHJpbmciIG5hbWU9IklEIi8+CiAgIDx4czplbGVtZW50IG1pb\n        k9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ1YTpMb2NhbGl6ZWRUZXh0IiBuYW1lP\n        SJEZXNjcmlwdGlvbiIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vyc\n        z0iMSIgdHlwZT0idG5zOkxpc3RPZklTQTk1UGFyYW1ldGVyRGF0YVR5cGUiIG5hbWU9IlBhc\n        mFtZXRlcnMiLz4KICA8L3hzOnNlcXVlbmNlPgogPC94czpjb21wbGV4VHlwZT4KIDx4czplb\n        GVtZW50IHR5cGU9InRuczpJU0E5NVdvcmtNYXN0ZXJEYXRhVHlwZSIgbmFtZT0iSVNBOTVXb\n        3JrTWFzdGVyRGF0YVR5cGUiLz4KIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZJU0E5N\n        VdvcmtNYXN0ZXJEYXRhVHlwZSI+CiAgPHhzOnNlcXVlbmNlPgogICA8eHM6ZWxlbWVudCBta\n        W5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ0bnM6SVNBOTVXb3JrT\n        WFzdGVyRGF0YVR5cGUiIG5hbWU9IklTQTk1V29ya01hc3RlckRhdGFUeXBlIiBuaWxsYWJsZ\n        T0idHJ1ZSIvPgogIDwveHM6c2VxdWVuY2U+CiA8L3hzOmNvbXBsZXhUeXBlPgogPHhzOmVsZ\n        W1lbnQgdHlwZT0idG5zOkxpc3RPZklTQTk1V29ya01hc3RlckRhdGFUeXBlIiBuYW1lPSJMa\n        XN0T2ZJU0E5NVdvcmtNYXN0ZXJEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiLz4KPC94czpzY\n        2hlbWE+Cg==</uax:ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6021\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=6020\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6020</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/Types.xsd</uax:String>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1006\" BrowseName=\"1:ISA95JobOrderStatusEventType\" IsAbstract=\"true\">\n    <DisplayName>ISA95JobOrderStatusEventType</DisplayName>\n    <Category>ISA-95 Job Control Job Response Provider Job Order Status Events</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.6</Documentation>\n    <References>\n      <Reference ReferenceType=\"GeneratesEvent\" IsForward=\"false\">ns=1;i=1003</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6047</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6049</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6048</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2041</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5045</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5051</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5073</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5078</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5079</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5085</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"HasEffect\" IsForward=\"false\">ns=1;i=5087</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=6047\" BrowseName=\"1:JobOrder\" ParentNodeId=\"ns=1;i=1006\" DataType=\"ISA95JobOrderDataType\" AccessLevel=\"3\">\n    <DisplayName>JobOrder</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1006</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6049\" BrowseName=\"1:JobResponse\" ParentNodeId=\"ns=1;i=1006\" DataType=\"ISA95JobResponseDataType\" AccessLevel=\"3\">\n    <DisplayName>JobResponse</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1006</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6048\" BrowseName=\"1:JobState\" ParentNodeId=\"ns=1;i=1006\" DataType=\"ISA95StateDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" AccessLevel=\"3\">\n    <DisplayName>JobState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1006</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1003\" BrowseName=\"1:ISA95JobResponseProviderObjectType\">\n    <DisplayName>ISA95JobResponseProviderObjectType</DisplayName>\n    <Description>The OPENSCSJobResponseProviderObjectType contains a method to receive unsolicited job response requests.</Description>\n    <Category>ISA-95 Job Response Provider V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"GeneratesEvent\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6050</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7002</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7014</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=6050\" BrowseName=\"1:JobOrderResponseList\" ParentNodeId=\"ns=1;i=1003\" DataType=\"ISA95JobResponseDataType\" ValueRank=\"1\" ArrayDimensions=\"0\" AccessLevel=\"3\">\n    <DisplayName>JobOrderResponseList</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1003</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7002\" BrowseName=\"1:RequestJobResponseByJobOrderID\" ParentNodeId=\"ns=1;i=1003\">\n    <DisplayName>RequestJobResponseByJobOrderID</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6042</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6043</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1003</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6042\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7002\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7002</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains an ID of the job order, as specified by the method caller.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6043\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7002\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7002</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobResponse</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>ns=1;i=3013</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information about the execution of a job order, such as the current status of the job, actual material consumed, actual material produced, actual equipment used, and job specific data.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7014\" BrowseName=\"1:RequestJobResponseByJobOrderState\" ParentNodeId=\"ns=1;i=1003\">\n    <DisplayName>RequestJobResponseByJobOrderState</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.7/#7.2.7.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6016</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6017</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1003</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6016\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7014\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7014</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderState</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>ns=1;i=3006</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>Contains a job status of the JobResponse to be returned. The array shall provide at least one entry representing the top level state and potentially additional entries representing substates. The first entry shall be the top level entry, having the BrowsePath set to null. The order of the substates is not defined.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6017\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7014\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7014</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobResponses</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>ns=1;i=3013</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>Contains a list of information about the execution of a job order, such as the current status of the job, actual material consumed, actual material produced, actual equipment used, and job specific data. </uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1004\" BrowseName=\"1:ISA95JobResponseReceiverObjectType\">\n    <DisplayName>ISA95JobResponseReceiverObjectType</DisplayName>\n    <Description>A Job Response Receiver receives unsolicited Job Responses, usually as the result of completion of a job, or at intermediate points within the job.</Description>\n    <Category>ISA-95 Job Response Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.8/#7.2.8.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7003</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAMethod NodeId=\"ns=1;i=7003\" BrowseName=\"1:ReceiveJobResponse\" ParentNodeId=\"ns=1;i=1004\">\n    <DisplayName>ReceiveJobResponse</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.8/#7.2.8.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6044</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6045</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1004</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6044\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7003\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7003</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobResponse</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>ns=1;i=3013</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information about the execution of a job order, such as actual material consumed, actual material produced, actual equipment used, and job specific data.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6045\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7003\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7003</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1005\" BrowseName=\"1:ISA95EndedStateMachineType\">\n    <DisplayName>ISA95EndedStateMachineType</DisplayName>\n    <Category>ISA-95 Job Control Job Order Receiver SubStates</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.4</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5057</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5056</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5058</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2771</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=5057\" BrowseName=\"1:Closed\" ParentNodeId=\"ns=1;i=1005\">\n    <DisplayName>Closed</DisplayName>\n    <Description>The job order has been completed and no further post processing is performed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6094</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5058</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6094\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5057\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5057</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5056\" BrowseName=\"1:Completed\" ParentNodeId=\"ns=1;i=1005\">\n    <DisplayName>Completed</DisplayName>\n    <Description>The job order has been completed and is no longer in execution.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6093</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5058</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6093\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5056\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5056</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5058\" BrowseName=\"1:FromCompletedToClosed\" ParentNodeId=\"ns=1;i=1005\">\n    <DisplayName>FromCompletedToClosed</DisplayName>\n    <Description>This transition is triggered when the system has finalized post processing of a ended job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5057</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5056</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6095</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6095\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5058\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5058</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1007\" BrowseName=\"1:ISA95InterruptedStateMachineType\">\n    <DisplayName>ISA95InterruptedStateMachineType</DisplayName>\n    <Category>ISA-95 Job Control Job Order Receiver SubStates</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.5</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5061</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5062</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5059</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5060</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2771</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=5061\" BrowseName=\"1:FromHeldToSuspended\" ParentNodeId=\"ns=1;i=1007\">\n    <DisplayName>FromHeldToSuspended</DisplayName>\n    <Description>This transition is triggered when the system has switched the job order from internally held to externally suspended, for example by a call of the Pause Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1007</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5059</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5060</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6098</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6098\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5061\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5061</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5062\" BrowseName=\"1:FromSuspendedToHeld\" ParentNodeId=\"ns=1;i=1007\">\n    <DisplayName>FromSuspendedToHeld</DisplayName>\n    <Description>This transition is triggered when the system has switched the job order from externally suspended to an internal held, for example by a call of the Resume Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1007</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5059</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5060</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6099</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6099\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5062\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5062</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5059\" BrowseName=\"1:Held\" ParentNodeId=\"ns=1;i=1007\">\n    <DisplayName>Held</DisplayName>\n    <Description>The job order has been temporarily stopped due to a constraint of some form.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1007</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6096</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5061</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5062</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6096\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5059\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5059</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5060\" BrowseName=\"1:Suspended\" ParentNodeId=\"ns=1;i=1007\">\n    <DisplayName>Suspended</DisplayName>\n    <Description>The job order has been temporarily stopped due to a deliberate decision within the execution system.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6097</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1007</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5061</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5062</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6097\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5060\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5060</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1002\" BrowseName=\"1:ISA95JobOrderReceiverObjectType\">\n    <DisplayName>ISA95JobOrderReceiverObjectType</DisplayName>\n    <Description>The OPENSCSJobOrderReciverObjectType contains a method to receive job order commands and optional definitions of allowable job order information</Description>\n    <Category>ISA-95 Job Order Receiver V2</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7011</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7012</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5039</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6037</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5085</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5045</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5051</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6033</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6035</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6036</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6088</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7007</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6039</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6038</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7008</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7013</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7005</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7001</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7004</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=7009</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6034</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2771</Reference>\n    </References>\n  </UAObjectType>\n  <UAMethod NodeId=\"ns=1;i=7010\" BrowseName=\"1:Abort\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Abort</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.10</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5085</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5087</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6063</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6064</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6063\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7010\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7010</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6064\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7010\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7010</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5040\" BrowseName=\"1:Aborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Aborted</DisplayName>\n    <Description>The job order is aborted.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6076</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5084</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5085</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6076\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5040\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5040</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5036\" BrowseName=\"1:AllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>AllowedToStart</DisplayName>\n    <Description>The job order is stored and may be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6072</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5045</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5085</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6072\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5036\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5036</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7011\" BrowseName=\"1:Cancel\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Cancel</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.12</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6065</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6066</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6065\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7011\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7011</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6066\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7011\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7011</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7012\" BrowseName=\"1:Clear\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Clear</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.13</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6067</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6068</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6067\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7012\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7012</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6068\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7012\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7012</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5039\" BrowseName=\"1:Ended\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Ended</DisplayName>\n    <Description>The job order has been completed and is no longer in execution.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6075</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5051</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6075\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5039\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5039</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6037\" BrowseName=\"1:EquipmentID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>EquipmentID</DisplayName>\n    <Description>Defines a read-only set of Equipment Class IDs and Equipment IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5085\" BrowseName=\"1:FromAllowedToStartToAborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromAllowedToStartToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6010</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6010\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5085\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5085</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">13</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5044\" BrowseName=\"1:FromAllowedToStartToAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromAllowedToStartToAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Update Method is called and the job order is modified.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6080</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7009</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6080\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5044\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5044</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5043\" BrowseName=\"1:FromAllowedToStartToNotAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromAllowedToStartToNotAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the RevokeStart Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7013</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6079</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6079\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5043\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5043</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5045\" BrowseName=\"1:FromAllowedToStartToRunning\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromAllowedToStartToRunning</DisplayName>\n    <Description>This transition is triggered when a job order is started to be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6081</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6081\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5045\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5045</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5049\" BrowseName=\"1:FromInterruptedToAborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromInterruptedToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6085</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6085\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5049\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5049</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">9</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5051\" BrowseName=\"1:FromInterruptedToEnded\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromInterruptedToEnded</DisplayName>\n    <Description>This transition is triggered when Stop Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5039</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6087</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6087\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5051\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5051</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">11</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5050\" BrowseName=\"1:FromInterruptedToRunning\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromInterruptedToRunning</DisplayName>\n    <Description>This transition is triggered when Resume Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7008</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6086</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6086\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5050\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5050</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">10</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5084\" BrowseName=\"1:FromNotAllowedToStartToAborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromNotAllowedToStartToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6009</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6009\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5084\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5084</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">12</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5042\" BrowseName=\"1:FromNotAllowedToStartToAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromNotAllowedToStartToAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Start Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5036</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7005</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6078</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6078\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5042\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5042</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5041\" BrowseName=\"1:FromNotAllowedToStartToNotAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromNotAllowedToStartToNotAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Update Method is called and the job order is modified.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5035</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6077</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7009</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6077\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5041\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5041</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5048\" BrowseName=\"1:FromRunningToAborted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromRunningToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5040</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6084</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6084\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5048\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5048</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">8</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5047\" BrowseName=\"1:FromRunningToEnded\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromRunningToEnded</DisplayName>\n    <Description>This transition is triggered when the execution of a job order has finished, either internally or by the Stop Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5039</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6083</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6083\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5047\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5047</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">7</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5046\" BrowseName=\"1:FromRunningToInterrupted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>FromRunningToInterrupted</DisplayName>\n    <Description>This transition is triggered when an executing job order gets interrupted, either internally or by the Pause Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5038</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7007</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5037</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6082</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6082\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5046\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5046</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5038\" BrowseName=\"1:Interrupted\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Interrupted</DisplayName>\n    <Description>The job order has been temporarily stopped.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6074</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5049</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5051</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6074\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5038\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5038</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6033\" BrowseName=\"1:JobOrderList\" ParentNodeId=\"ns=1;i=1002\" DataType=\"ISA95JobOrderAndStateDataType\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>JobOrderList</DisplayName>\n    <Description>Defines a read-only list of job order information available from the server.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6035\" BrowseName=\"1:MaterialClassID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>MaterialClassID</DisplayName>\n    <Description>Defines a read-only set of Material Classes IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6036\" BrowseName=\"1:MaterialDefinitionID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>MaterialDefinitionID</DisplayName>\n    <Description>Defines a read-only set of Material Classes IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6088\" BrowseName=\"1:MaxDownloadableJobOrders\" ParentNodeId=\"ns=1;i=1002\" DataType=\"UInt16\">\n    <DisplayName>MaxDownloadableJobOrders</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5035\" BrowseName=\"1:NotAllowedToStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>NotAllowedToStart</DisplayName>\n    <Description>The job order is stored but may not be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6071</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5084</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6071\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5035\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5035</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7007\" BrowseName=\"1:Pause\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Pause</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.7</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6057</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6058</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5074</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6057\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7007\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7007</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6058\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7007\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7007</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6039\" BrowseName=\"1:PersonnelID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>PersonnelID</DisplayName>\n    <Description>Defines a read-only set of Personnel IDs and Person IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6038\" BrowseName=\"1:PhysicalAssetID\" ParentNodeId=\"ns=1;i=1002\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>PhysicalAssetID</DisplayName>\n    <Description>Defines a read-only set of Physical Asset Class IDs and Physical Asset IDs that may be specified in a job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7008\" BrowseName=\"1:Resume\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Resume</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.8</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6059</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6060</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5050</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5078</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6059\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7008\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7008</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6060\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7008\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7008</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7013\" BrowseName=\"1:RevokeStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>RevokeStart</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.6</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6069</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6070</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5043</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5071</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6069\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7013\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7013</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6070\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7013\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7013</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5037\" BrowseName=\"1:Running\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Running</DisplayName>\n    <Description>The job order is executing.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6073</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5045</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5046</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5048</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5050</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6073\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5037\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5037</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7005\" BrowseName=\"1:Start\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Start</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.5</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6053</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6054</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5042</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5070</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6053\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7005\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7005</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6054\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7005\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7005</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7006\" BrowseName=\"1:Stop\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Stop</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.11</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6055</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6056</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5047</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5051</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5079</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6055\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7006\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7006</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrderID</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=12</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6056\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7006\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7006</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7001\" BrowseName=\"1:Store\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Store</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6040</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6041</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6040\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7001\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7001</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrder</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>ns=1;i=3008</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6041\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7001\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7001</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7004\" BrowseName=\"1:StoreAndStart\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>StoreAndStart</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.4</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6051</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6052</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6051\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7004\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7004</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrder</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>ns=1;i=3008</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6052\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7004\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7004</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=7009\" BrowseName=\"1:Update\" ParentNodeId=\"ns=1;i=1002\">\n    <DisplayName>Update</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.1/#7.2.1.9</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6061</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6062</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5041</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5044</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"HasCause\" IsForward=\"false\">ns=1;i=5072</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=6061\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=7009\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"2\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7009</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>JobOrder</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>ns=1;i=3008</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Contains information defining the job order with all parameters and any material, equipment, or physical asset requirements associated with the order.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>Comment</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=21</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>1</uax:ValueRank>\n                            <uax:ArrayDimensions>\n                                <uax:UInt32>0</uax:UInt32>\n                            </uax:ArrayDimensions>\n                            <uax:Description>\n                                <uax:Text>The comment provides a description of why the method was called. In order to provide the comment in several languages, it is an array of LocalizedText. The array may be empty, when no comment is provided.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6062\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=7009\" DataType=\"Argument\" ValueRank=\"1\" ArrayDimensions=\"1\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=7009</Reference>\n    </References>\n    <Value>\n      <uax:ListOfExtensionObject xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:ExtensionObject>\n                    <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                        <uax:Argument>\n                            <uax:Name>ReturnStatus</uax:Name>\n                            <uax:DataType>\n                                <uax:Identifier>i=9</uax:Identifier>\n                            </uax:DataType>\n                            <uax:ValueRank>-1</uax:ValueRank>\n                            <uax:ArrayDimensions />\n                            <uax:Description>\n                                <uax:Text>Returns the status of the method execution.</uax:Text>\n                            </uax:Description>\n                        </uax:Argument>\n                    </uax:Body>\n                </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6034\" BrowseName=\"1:WorkMaster\" ParentNodeId=\"ns=1;i=1002\" DataType=\"ISA95WorkMasterDataType\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>WorkMaster</DisplayName>\n    <Description>Defines a read-only set of work master IDs that may be specified in a job order, and the read-only set of parameters that may be specified for a specific work master.</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1002</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1008\" BrowseName=\"1:ISA95JobOrderReceiverSubStatesType\">\n    <DisplayName>ISA95JobOrderReceiverSubStatesType</DisplayName>\n    <Category>ISA-95 Job Control Job Order Receiver SubStates</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.2/#7.2.2.2</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5081</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5067</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5082</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5073</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5079</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5078</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5087</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5083</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=1002</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5080</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5065</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=5068\" BrowseName=\"1:Aborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>Aborted</DisplayName>\n    <Description>The job order is aborted.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6105</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5086</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5087</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6105\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5068\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5068</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5064\" BrowseName=\"1:AllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>AllowedToStart</DisplayName>\n    <Description>The job order is stored and may be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasSubStateMachine\">ns=1;i=5081</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6101</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5072</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5073</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5086</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6101\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5064\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5064</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5081\" BrowseName=\"1:AllowedToStartSubstates\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>AllowedToStartSubstates</DisplayName>\n    <Description>Substates of AllowedToStart</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasSubStateMachine\" IsForward=\"false\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6003</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6003\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=5081\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=5081</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6004</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6004\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=6003\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6003</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5067\" BrowseName=\"1:Ended\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>Ended</DisplayName>\n    <Description>The job order has been completed and is no longer in execution.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasSubStateMachine\">ns=1;i=5082</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6104</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5079</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6104\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5067\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5067</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5082\" BrowseName=\"1:EndedSubstates\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>EndedSubstates</DisplayName>\n    <Description>Substates of Ended</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6005</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasSubStateMachine\" IsForward=\"false\">ns=1;i=5067</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6005\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=5082\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=5082</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6006</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6006\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=6005\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6005</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5086\" BrowseName=\"1:FromAllowedToStartToAborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromAllowedToStartToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6011</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6011\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5086\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5086</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">13</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5072\" BrowseName=\"1:FromAllowedToStartToAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromAllowedToStartToAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Update Method is called and the job order is modified.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6109</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7009</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6109\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5072\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5072</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5071\" BrowseName=\"1:FromAllowedToStartToNotAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromAllowedToStartToNotAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the RevokeStart Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7013</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6108</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6108\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5071\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5071</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5073\" BrowseName=\"1:FromAllowedToStartToRunning\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromAllowedToStartToRunning</DisplayName>\n    <Description>This transition is triggered when a job order is started to be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6110</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6110\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5073\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5073</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5077\" BrowseName=\"1:FromInterruptedToAborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromInterruptedToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6114</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6114\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5077\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5077</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">9</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5079\" BrowseName=\"1:FromInterruptedToEnded\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromInterruptedToEnded</DisplayName>\n    <Description>This transition is triggered when Stop Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5067</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6116</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6116\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5079\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5079</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">11</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5078\" BrowseName=\"1:FromInterruptedToRunning\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromInterruptedToRunning</DisplayName>\n    <Description>This transition is triggered when Resume Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7008</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6115</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6115\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5078\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5078</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">10</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5087\" BrowseName=\"1:FromNotAllowedToStartToAborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromNotAllowedToStartToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6012</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6012\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5087\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5087</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">12</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5070\" BrowseName=\"1:FromNotAllowedToStartToAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromNotAllowedToStartToAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Start Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5064</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7005</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6107</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6107\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5070\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5070</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5069\" BrowseName=\"1:FromNotAllowedToStartToNotAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromNotAllowedToStartToNotAllowedToStart</DisplayName>\n    <Description>This transition is triggered when the Update Method is called and the job order is modified.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5063</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6106</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7009</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6106\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5069\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5069</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5076\" BrowseName=\"1:FromRunningToAborted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromRunningToAborted</DisplayName>\n    <Description>This transition is triggered when Abort Method is called.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7010</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5068</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6113</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6113\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5076\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5076</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">8</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5075\" BrowseName=\"1:FromRunningToEnded\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromRunningToEnded</DisplayName>\n    <Description>This transition is triggered when the execution of a job order has finished, either internally or by the Stop Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5067</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7006</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6112</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6112\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5075\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5075</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">7</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5074\" BrowseName=\"1:FromRunningToInterrupted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>FromRunningToInterrupted</DisplayName>\n    <Description>This transition is triggered when an executing job order gets interrupted, either internally or by the Pause Method.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5066</Reference>\n      <Reference ReferenceType=\"HasEffect\">ns=1;i=1006</Reference>\n      <Reference ReferenceType=\"HasCause\">ns=1;i=7007</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5065</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6111</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6111\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5074\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5074</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">6</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5066\" BrowseName=\"1:Interrupted\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>Interrupted</DisplayName>\n    <Description>The job order has been temporarily stopped.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasSubStateMachine\">ns=1;i=5083</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6103</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5077</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5078</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5079</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6103\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5066\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5066</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5083\" BrowseName=\"1:InterruptedSubstates\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>InterruptedSubstates</DisplayName>\n    <Description>Substates of Interrupted</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1007</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6007</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasSubStateMachine\" IsForward=\"false\">ns=1;i=5066</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6007\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=5083\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=5083</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6008</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6008\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=6007\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6007</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5063\" BrowseName=\"1:NotAllowedToStart\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>NotAllowedToStart</DisplayName>\n    <Description>The job order is stored but may not be executed.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasSubStateMachine\">ns=1;i=5080</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6100</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5069</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5070</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5071</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5087</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6100\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5063\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5063</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5080\" BrowseName=\"1:NotAllowedToStartSubstates\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>NotAllowedToStartSubstates</DisplayName>\n    <Description>Substates of NotAllowedToStart</Description>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=80</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=6001</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasSubStateMachine\" IsForward=\"false\">ns=1;i=5063</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6001\" BrowseName=\"CurrentState\" ParentNodeId=\"ns=1;i=5080\" DataType=\"LocalizedText\">\n    <DisplayName>CurrentState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2760</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=5080</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6002</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6002\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=6001\" DataType=\"NodeId\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=6001</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5065\" BrowseName=\"1:Running\" ParentNodeId=\"ns=1;i=1008\">\n    <DisplayName>Running</DisplayName>\n    <Description>The job order is executing.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1008</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6102</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5073</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5074</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5075</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5076</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5078</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6102\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5065\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5065</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=1001\" BrowseName=\"1:ISA95PrepareStateMachineType\">\n    <DisplayName>ISA95PrepareStateMachineType</DisplayName>\n    <Category>ISA-95 Job Control Job Order Receiver SubStates</Category>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/7.2.3</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5089</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5090</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5055</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5088</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5054</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5053</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=5000</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2771</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=5089\" BrowseName=\"1:FromLoadedToReady\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromLoadedToReady</DisplayName>\n    <Description>This transition is triggered when the program or configuration to execute the job order is unloaded.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5053</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6014</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6014\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5089\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5089</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5090\" BrowseName=\"1:FromLoadedToWaiting\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromLoadedToWaiting</DisplayName>\n    <Description>This transition is triggered when the system is not ready to start the execution of the job order anymore.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5053</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6015</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5000</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6015\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5090\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5090</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">5</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5055\" BrowseName=\"1:FromReadyToLoaded\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromReadyToLoaded</DisplayName>\n    <Description>This transition is triggered when the program or configuration to execute the job order is loaded.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5053</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6092</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6092\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5055\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5055</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5088\" BrowseName=\"1:FromReadyToWaiting\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromReadyToWaiting</DisplayName>\n    <Description>This transition is triggered when the system is not ready to start the execution of the job order anymore.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6013</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5000</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6013\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5088\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5088</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5054\" BrowseName=\"1:FromWaitingToReady\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>FromWaitingToReady</DisplayName>\n    <Description>This transition is triggered when the system is ready to start the execution of the job order.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2310</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"ToState\">ns=1;i=5052</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6091</Reference>\n      <Reference ReferenceType=\"FromState\">ns=1;i=5000</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6091\" BrowseName=\"TransitionNumber\" ParentNodeId=\"ns=1;i=5054\" DataType=\"UInt32\">\n    <DisplayName>TransitionNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5054</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5053\" BrowseName=\"1:Loaded\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>Loaded</DisplayName>\n    <Description>In situations where only one job may be in active memory and is able to be run, then the job is loaded in active memory, the necessary pre-conditions have been met, and the job order is ready to run, awaiting a Start command.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6090</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5055</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5089</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5090</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6090\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5053\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5053</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">3</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5052\" BrowseName=\"1:Ready\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>Ready</DisplayName>\n    <Description>The necessary pre-conditions have been met and the job order is ready to run, awaiting a Start command.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6089</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5054</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5055</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5088</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5089</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6089\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5052\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5052</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5000\" BrowseName=\"1:Waiting\" ParentNodeId=\"ns=1;i=1001\">\n    <DisplayName>Waiting</DisplayName>\n    <Description>The necessary pre-conditions have not been met and the job order is not ready to run.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2307</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6000</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=1001</Reference>\n      <Reference ReferenceType=\"FromState\" IsForward=\"false\">ns=1;i=5054</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5088</Reference>\n      <Reference ReferenceType=\"ToState\" IsForward=\"false\">ns=1;i=5090</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6000\" BrowseName=\"StateNumber\" ParentNodeId=\"ns=1;i=5000\" DataType=\"UInt32\">\n    <DisplayName>StateNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5000</Reference>\n    </References>\n    <Value>\n      <uax:UInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5001\" BrowseName=\"1:http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\" SymbolicName=\"http___opcfoundation_org_UA_ISA95_JOBCONTROL_V2_\" ParentNodeId=\"i=11715\">\n    <DisplayName>http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</DisplayName>\n    <Documentation>https://reference.opcfoundation.org/ISA95JOBCONTROL/v200/docs/9.1</Documentation>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=11616</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6023</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6024</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6025</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6026</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6027</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6028</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=6029</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=11715</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=6023\" BrowseName=\"IsNamespaceSubset\" ParentNodeId=\"ns=1;i=5001\" DataType=\"Boolean\">\n    <DisplayName>IsNamespaceSubset</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <uax:Boolean xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</uax:Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6024\" BrowseName=\"NamespacePublicationDate\" ParentNodeId=\"ns=1;i=5001\" DataType=\"DateTime\">\n    <DisplayName>NamespacePublicationDate</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <uax:DateTime xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2024-01-31T00:00:00Z</uax:DateTime>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6025\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=5001\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6026\" BrowseName=\"NamespaceVersion\" ParentNodeId=\"ns=1;i=5001\" DataType=\"String\">\n    <DisplayName>NamespaceVersion</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">2.0.0</uax:String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6027\" BrowseName=\"StaticNodeIdTypes\" ParentNodeId=\"ns=1;i=5001\" DataType=\"IdType\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StaticNodeIdTypes</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <uax:ListOfInt32 xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:Int32>0</uax:Int32>\n            </uax:ListOfInt32>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6028\" BrowseName=\"StaticNumericNodeIdRange\" ParentNodeId=\"ns=1;i=5001\" DataType=\"NumericRange\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StaticNumericNodeIdRange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <uax:ListOfString xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n                <uax:String>1:2147483647</uax:String>\n            </uax:ListOfString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=6029\" BrowseName=\"StaticStringNodeIdPattern\" ParentNodeId=\"ns=1;i=5001\" DataType=\"String\">\n    <DisplayName>StaticStringNodeIdPattern</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=5001</Reference>\n    </References>\n    <Value>\n      <uax:String xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</uax:String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=5002\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3002</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6128</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5003\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3002</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6129</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5004\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3002</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5005\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3003</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6122</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5006\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3003</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6123</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5007\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3003</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5008\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3005</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6022</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5009\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3005</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6030</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5010\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3005</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5011\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3007</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6132</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5012\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3007</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6133</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5013\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3007</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5014\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3008</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6046</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5015\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3008</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6117</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5016\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3008</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5017\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3010</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6120</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5018\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3010</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6121</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5019\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3010</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5020\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3011</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6124</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5021\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3011</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6125</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5022\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3011</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5023\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3012</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6126</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5024\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3012</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6127</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5025\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3012</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5026\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3013</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6118</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5027\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3013</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6119</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5028\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3013</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5029\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3006</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6130</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5030\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3006</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6131</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5031\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3006</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5032\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3015</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6031</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5033\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3015</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=6032</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=5034\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=3015</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Nodesets/opc.ua.isa95-jobcontrol.types.bsd",
    "content": "<opc:TypeDictionary xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\" DefaultByteOrder=\"LittleEndian\" xmlns:opc=\"http://opcfoundation.org/BinarySchema/\" xmlns:ua=\"http://opcfoundation.org/UA/\" TargetNamespace=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/\">\n    <opc:Import Namespace=\"http://opcfoundation.org/UA/\"/>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95EquipmentDataType\">\n        <opc:Documentation>Defines an equipment resource or a piece of equipment, a quantity, an optional description, and an optional collection of properties.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EquipmentUseSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"QuantitySpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EngineeringUnitsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PropertiesSpecified\"/>\n        <opc:Field Length=\"27\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"ID\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfDescription\"/>\n        <opc:Field LengthField=\"NoOfDescription\" SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field SwitchField=\"EquipmentUseSpecified\" TypeName=\"opc:CharArray\" Name=\"EquipmentUse\"/>\n        <opc:Field SwitchField=\"QuantitySpecified\" TypeName=\"opc:CharArray\" Name=\"Quantity\"/>\n        <opc:Field SwitchField=\"EngineeringUnitsSpecified\" TypeName=\"ua:EUInformation\" Name=\"EngineeringUnits\"/>\n        <opc:Field SwitchField=\"PropertiesSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfProperties\"/>\n        <opc:Field LengthField=\"NoOfProperties\" SwitchField=\"PropertiesSpecified\" TypeName=\"tns:ISA95PropertyDataType\" Name=\"Properties\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95JobOrderAndStateDataType\">\n        <opc:Documentation>Defines the information needed to schedule and execute a job.</opc:Documentation>\n        <opc:Field TypeName=\"tns:ISA95JobOrderDataType\" Name=\"JobOrder\"/>\n        <opc:Field TypeName=\"opc:Int32\" Name=\"NoOfState\"/>\n        <opc:Field LengthField=\"NoOfState\" TypeName=\"tns:ISA95StateDataType\" Name=\"State\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95JobOrderDataType\">\n        <opc:Documentation>Defines the information needed to schedule and execute a job.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"WorkMasterIDSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"StartTimeSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EndTimeSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PrioritySpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"JobOrderParametersSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PersonnelRequirementsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EquipmentRequirementsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PhysicalAssetRequirementsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"MaterialRequirementsSpecified\"/>\n        <opc:Field Length=\"22\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"JobOrderID\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfDescription\"/>\n        <opc:Field LengthField=\"NoOfDescription\" SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field SwitchField=\"WorkMasterIDSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfWorkMasterID\"/>\n        <opc:Field LengthField=\"NoOfWorkMasterID\" SwitchField=\"WorkMasterIDSpecified\" TypeName=\"tns:ISA95WorkMasterDataType\" Name=\"WorkMasterID\"/>\n        <opc:Field SwitchField=\"StartTimeSpecified\" TypeName=\"opc:DateTime\" Name=\"StartTime\"/>\n        <opc:Field SwitchField=\"EndTimeSpecified\" TypeName=\"opc:DateTime\" Name=\"EndTime\"/>\n        <opc:Field SwitchField=\"PrioritySpecified\" TypeName=\"opc:Int16\" Name=\"Priority\"/>\n        <opc:Field SwitchField=\"JobOrderParametersSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfJobOrderParameters\"/>\n        <opc:Field LengthField=\"NoOfJobOrderParameters\" SwitchField=\"JobOrderParametersSpecified\" TypeName=\"tns:ISA95ParameterDataType\" Name=\"JobOrderParameters\"/>\n        <opc:Field SwitchField=\"PersonnelRequirementsSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfPersonnelRequirements\"/>\n        <opc:Field LengthField=\"NoOfPersonnelRequirements\" SwitchField=\"PersonnelRequirementsSpecified\" TypeName=\"tns:ISA95PersonnelDataType\" Name=\"PersonnelRequirements\"/>\n        <opc:Field SwitchField=\"EquipmentRequirementsSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfEquipmentRequirements\"/>\n        <opc:Field LengthField=\"NoOfEquipmentRequirements\" SwitchField=\"EquipmentRequirementsSpecified\" TypeName=\"tns:ISA95EquipmentDataType\" Name=\"EquipmentRequirements\"/>\n        <opc:Field SwitchField=\"PhysicalAssetRequirementsSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfPhysicalAssetRequirements\"/>\n        <opc:Field LengthField=\"NoOfPhysicalAssetRequirements\" SwitchField=\"PhysicalAssetRequirementsSpecified\" TypeName=\"tns:ISA95PhysicalAssetDataType\" Name=\"PhysicalAssetRequirements\"/>\n        <opc:Field SwitchField=\"MaterialRequirementsSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfMaterialRequirements\"/>\n        <opc:Field LengthField=\"NoOfMaterialRequirements\" SwitchField=\"MaterialRequirementsSpecified\" TypeName=\"tns:ISA95MaterialDataType\" Name=\"MaterialRequirements\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95JobResponseDataType\">\n        <opc:Documentation>Defines the information needed to schedule and execute a job.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"StartTimeSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EndTimeSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"JobResponseDataSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PersonnelActualsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EquipmentActualsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PhysicalAssetActualsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"MaterialActualsSpecified\"/>\n        <opc:Field Length=\"24\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"JobResponseID\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"JobOrderID\"/>\n        <opc:Field SwitchField=\"StartTimeSpecified\" TypeName=\"opc:DateTime\" Name=\"StartTime\"/>\n        <opc:Field SwitchField=\"EndTimeSpecified\" TypeName=\"opc:DateTime\" Name=\"EndTime\"/>\n        <opc:Field TypeName=\"opc:Int32\" Name=\"NoOfJobState\"/>\n        <opc:Field LengthField=\"NoOfJobState\" TypeName=\"tns:ISA95StateDataType\" Name=\"JobState\"/>\n        <opc:Field SwitchField=\"JobResponseDataSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfJobResponseData\"/>\n        <opc:Field LengthField=\"NoOfJobResponseData\" SwitchField=\"JobResponseDataSpecified\" TypeName=\"tns:ISA95ParameterDataType\" Name=\"JobResponseData\"/>\n        <opc:Field SwitchField=\"PersonnelActualsSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfPersonnelActuals\"/>\n        <opc:Field LengthField=\"NoOfPersonnelActuals\" SwitchField=\"PersonnelActualsSpecified\" TypeName=\"tns:ISA95PersonnelDataType\" Name=\"PersonnelActuals\"/>\n        <opc:Field SwitchField=\"EquipmentActualsSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfEquipmentActuals\"/>\n        <opc:Field LengthField=\"NoOfEquipmentActuals\" SwitchField=\"EquipmentActualsSpecified\" TypeName=\"tns:ISA95EquipmentDataType\" Name=\"EquipmentActuals\"/>\n        <opc:Field SwitchField=\"PhysicalAssetActualsSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfPhysicalAssetActuals\"/>\n        <opc:Field LengthField=\"NoOfPhysicalAssetActuals\" SwitchField=\"PhysicalAssetActualsSpecified\" TypeName=\"tns:ISA95PhysicalAssetDataType\" Name=\"PhysicalAssetActuals\"/>\n        <opc:Field SwitchField=\"MaterialActualsSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfMaterialActuals\"/>\n        <opc:Field LengthField=\"NoOfMaterialActuals\" SwitchField=\"MaterialActualsSpecified\" TypeName=\"tns:ISA95MaterialDataType\" Name=\"MaterialActuals\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95MaterialDataType\">\n        <opc:Documentation>Defines a material resource, a quantity, an optional description, and an optional collection of properties.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"MaterialClassIDSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"MaterialDefinitionIDSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"MaterialLotIDSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"MaterialSublotIDSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"MaterialUseSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"QuantitySpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EngineeringUnitsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PropertiesSpecified\"/>\n        <opc:Field Length=\"23\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field SwitchField=\"MaterialClassIDSpecified\" TypeName=\"opc:CharArray\" Name=\"MaterialClassID\"/>\n        <opc:Field SwitchField=\"MaterialDefinitionIDSpecified\" TypeName=\"opc:CharArray\" Name=\"MaterialDefinitionID\"/>\n        <opc:Field SwitchField=\"MaterialLotIDSpecified\" TypeName=\"opc:CharArray\" Name=\"MaterialLotID\"/>\n        <opc:Field SwitchField=\"MaterialSublotIDSpecified\" TypeName=\"opc:CharArray\" Name=\"MaterialSublotID\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfDescription\"/>\n        <opc:Field LengthField=\"NoOfDescription\" SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field SwitchField=\"MaterialUseSpecified\" TypeName=\"opc:CharArray\" Name=\"MaterialUse\"/>\n        <opc:Field SwitchField=\"QuantitySpecified\" TypeName=\"opc:CharArray\" Name=\"Quantity\"/>\n        <opc:Field SwitchField=\"EngineeringUnitsSpecified\" TypeName=\"ua:EUInformation\" Name=\"EngineeringUnits\"/>\n        <opc:Field SwitchField=\"PropertiesSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfProperties\"/>\n        <opc:Field LengthField=\"NoOfProperties\" SwitchField=\"PropertiesSpecified\" TypeName=\"tns:ISA95PropertyDataType\" Name=\"Properties\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95ParameterDataType\">\n        <opc:Documentation>A subtype of OPC UA Structure that defines three linked data items: the ID, which is a unique identifier for a property, the value, which is the data that is identified, and an optional description of the parameter.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EngineeringUnitsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"SubparametersSpecified\"/>\n        <opc:Field Length=\"29\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"ID\"/>\n        <opc:Field TypeName=\"ua:Variant\" Name=\"Value\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfDescription\"/>\n        <opc:Field LengthField=\"NoOfDescription\" SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field SwitchField=\"EngineeringUnitsSpecified\" TypeName=\"ua:EUInformation\" Name=\"EngineeringUnits\"/>\n        <opc:Field SwitchField=\"SubparametersSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfSubparameters\"/>\n        <opc:Field LengthField=\"NoOfSubparameters\" SwitchField=\"SubparametersSpecified\" TypeName=\"tns:ISA95ParameterDataType\" Name=\"Subparameters\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95PersonnelDataType\">\n        <opc:Documentation>Defines a personnel resource or a person, a quantity, an optional description, and an optional collection of properties.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PersonnelUseSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"QuantitySpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EngineeringUnitsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PropertiesSpecified\"/>\n        <opc:Field Length=\"27\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"ID\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfDescription\"/>\n        <opc:Field LengthField=\"NoOfDescription\" SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field SwitchField=\"PersonnelUseSpecified\" TypeName=\"opc:CharArray\" Name=\"PersonnelUse\"/>\n        <opc:Field SwitchField=\"QuantitySpecified\" TypeName=\"opc:CharArray\" Name=\"Quantity\"/>\n        <opc:Field SwitchField=\"EngineeringUnitsSpecified\" TypeName=\"ua:EUInformation\" Name=\"EngineeringUnits\"/>\n        <opc:Field SwitchField=\"PropertiesSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfProperties\"/>\n        <opc:Field LengthField=\"NoOfProperties\" SwitchField=\"PropertiesSpecified\" TypeName=\"tns:ISA95PropertyDataType\" Name=\"Properties\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95PhysicalAssetDataType\">\n        <opc:Documentation>Defines a physical asset, a quantity, an optional description, and an optional collection of properties.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PhysicalAssetUseSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"QuantitySpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EngineeringUnitsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"PropertiesSpecified\"/>\n        <opc:Field Length=\"27\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"ID\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfDescription\"/>\n        <opc:Field LengthField=\"NoOfDescription\" SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field SwitchField=\"PhysicalAssetUseSpecified\" TypeName=\"opc:CharArray\" Name=\"PhysicalAssetUse\"/>\n        <opc:Field SwitchField=\"QuantitySpecified\" TypeName=\"opc:CharArray\" Name=\"Quantity\"/>\n        <opc:Field SwitchField=\"EngineeringUnitsSpecified\" TypeName=\"ua:EUInformation\" Name=\"EngineeringUnits\"/>\n        <opc:Field SwitchField=\"PropertiesSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfProperties\"/>\n        <opc:Field LengthField=\"NoOfProperties\" SwitchField=\"PropertiesSpecified\" TypeName=\"tns:ISA95PropertyDataType\" Name=\"Properties\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95PropertyDataType\">\n        <opc:Documentation>A subtype of OPC UA Structure that defines two linked data items: an ID, which is a unique identifier for a property within the scope of the associated resource, and the value, which is the data for the property.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"EngineeringUnitsSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"SubpropertiesSpecified\"/>\n        <opc:Field Length=\"29\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"ID\"/>\n        <opc:Field TypeName=\"ua:Variant\" Name=\"Value\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfDescription\"/>\n        <opc:Field LengthField=\"NoOfDescription\" SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field SwitchField=\"EngineeringUnitsSpecified\" TypeName=\"ua:EUInformation\" Name=\"EngineeringUnits\"/>\n        <opc:Field SwitchField=\"SubpropertiesSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfSubproperties\"/>\n        <opc:Field LengthField=\"NoOfSubproperties\" SwitchField=\"SubpropertiesSpecified\" TypeName=\"tns:ISA95PropertyDataType\" Name=\"Subproperties\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95StateDataType\">\n        <opc:Documentation>Defines the information needed to schedule and execute a job.</opc:Documentation>\n        <opc:Field TypeName=\"ua:RelativePath\" Name=\"BrowsePath\"/>\n        <opc:Field TypeName=\"ua:LocalizedText\" Name=\"StateText\"/>\n        <opc:Field TypeName=\"opc:UInt32\" Name=\"StateNumber\"/>\n    </opc:StructuredType>\n    <opc:StructuredType BaseType=\"ua:ExtensionObject\" Name=\"ISA95WorkMasterDataType\">\n        <opc:Documentation>Defines a Work Master ID and the defined parameters for the Work Master.</opc:Documentation>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"DescriptionSpecified\"/>\n        <opc:Field TypeName=\"opc:Bit\" Name=\"ParametersSpecified\"/>\n        <opc:Field Length=\"30\" TypeName=\"opc:Bit\" Name=\"Reserved1\"/>\n        <opc:Field TypeName=\"opc:CharArray\" Name=\"ID\"/>\n        <opc:Field SwitchField=\"DescriptionSpecified\" TypeName=\"ua:LocalizedText\" Name=\"Description\"/>\n        <opc:Field SwitchField=\"ParametersSpecified\" TypeName=\"opc:Int32\" Name=\"NoOfParameters\"/>\n        <opc:Field LengthField=\"NoOfParameters\" SwitchField=\"ParametersSpecified\" TypeName=\"tns:ISA95ParameterDataType\" Name=\"Parameters\"/>\n    </opc:StructuredType>\n</opc:TypeDictionary>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Isa95Jobs/Nodesets/opc.ua.isa95-jobcontrol.types.xsd",
    "content": "<xs:schema elementFormDefault=\"qualified\" targetNamespace=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/Types.xsd\" xmlns:tns=\"http://opcfoundation.org/UA/ISA95-JOBCONTROL_V2/Types.xsd\" xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n    <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"/>\n    <xs:complexType name=\"ISA95EquipmentDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines an equipment resource or a piece of equipment, a quantity, an optional description, and an optional collection of properties.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"ID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:ListOfLocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"EquipmentUse\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"Quantity\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:EUInformation\" name=\"EngineeringUnits\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PropertyDataType\" name=\"Properties\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95EquipmentDataType\" name=\"ISA95EquipmentDataType\"/>\n    <xs:complexType name=\"ListOfISA95EquipmentDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95EquipmentDataType\" name=\"ISA95EquipmentDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95EquipmentDataType\" name=\"ListOfISA95EquipmentDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95JobOrderAndStateDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines the information needed to schedule and execute a job.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ISA95JobOrderDataType\" name=\"JobOrder\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95StateDataType\" name=\"State\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95JobOrderAndStateDataType\" name=\"ISA95JobOrderAndStateDataType\"/>\n    <xs:complexType name=\"ListOfISA95JobOrderAndStateDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95JobOrderAndStateDataType\" name=\"ISA95JobOrderAndStateDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95JobOrderAndStateDataType\" name=\"ListOfISA95JobOrderAndStateDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95JobOrderDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines the information needed to schedule and execute a job.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"JobOrderID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:ListOfLocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95WorkMasterDataType\" name=\"WorkMasterID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:dateTime\" name=\"StartTime\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:dateTime\" name=\"EndTime\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:short\" name=\"Priority\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95ParameterDataType\" name=\"JobOrderParameters\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PersonnelDataType\" name=\"PersonnelRequirements\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95EquipmentDataType\" name=\"EquipmentRequirements\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PhysicalAssetDataType\" name=\"PhysicalAssetRequirements\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95MaterialDataType\" name=\"MaterialRequirements\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95JobOrderDataType\" name=\"ISA95JobOrderDataType\"/>\n    <xs:complexType name=\"ListOfISA95JobOrderDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95JobOrderDataType\" name=\"ISA95JobOrderDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95JobOrderDataType\" name=\"ListOfISA95JobOrderDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95JobResponseDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines the information needed to schedule and execute a job.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"JobResponseID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:LocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"JobOrderID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:dateTime\" name=\"StartTime\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:dateTime\" name=\"EndTime\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95StateDataType\" name=\"JobState\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95ParameterDataType\" name=\"JobResponseData\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PersonnelDataType\" name=\"PersonnelActuals\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95EquipmentDataType\" name=\"EquipmentActuals\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PhysicalAssetDataType\" name=\"PhysicalAssetActuals\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95MaterialDataType\" name=\"MaterialActuals\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95JobResponseDataType\" name=\"ISA95JobResponseDataType\"/>\n    <xs:complexType name=\"ListOfISA95JobResponseDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95JobResponseDataType\" name=\"ISA95JobResponseDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95JobResponseDataType\" name=\"ListOfISA95JobResponseDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95MaterialDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines a material resource, a quantity, an optional description, and an optional collection of properties.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"MaterialClassID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"MaterialDefinitionID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"MaterialLotID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"MaterialSublotID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:ListOfLocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"MaterialUse\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"Quantity\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:EUInformation\" name=\"EngineeringUnits\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PropertyDataType\" name=\"Properties\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95MaterialDataType\" name=\"ISA95MaterialDataType\"/>\n    <xs:complexType name=\"ListOfISA95MaterialDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95MaterialDataType\" name=\"ISA95MaterialDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95MaterialDataType\" name=\"ListOfISA95MaterialDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95ParameterDataType\">\n        <xs:annotation>\n            <xs:documentation>A subtype of OPC UA Structure that defines three linked data items: the ID, which is a unique identifier for a property, the value, which is the data that is identified, and an optional description of the parameter.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"ID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:Variant\" name=\"Value\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:ListOfLocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:EUInformation\" name=\"EngineeringUnits\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95ParameterDataType\" name=\"Subparameters\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95ParameterDataType\" name=\"ISA95ParameterDataType\"/>\n    <xs:complexType name=\"ListOfISA95ParameterDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95ParameterDataType\" name=\"ISA95ParameterDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95ParameterDataType\" name=\"ListOfISA95ParameterDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95PersonnelDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines a personnel resource or a person, a quantity, an optional description, and an optional collection of properties.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"ID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:ListOfLocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"PersonnelUse\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"Quantity\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:EUInformation\" name=\"EngineeringUnits\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PropertyDataType\" name=\"Properties\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95PersonnelDataType\" name=\"ISA95PersonnelDataType\"/>\n    <xs:complexType name=\"ListOfISA95PersonnelDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95PersonnelDataType\" name=\"ISA95PersonnelDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95PersonnelDataType\" name=\"ListOfISA95PersonnelDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95PhysicalAssetDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines a physical asset, a quantity, an optional description, and an optional collection of properties.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"ID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:ListOfLocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"PhysicalAssetUse\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"Quantity\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:EUInformation\" name=\"EngineeringUnits\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PropertyDataType\" name=\"Properties\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95PhysicalAssetDataType\" name=\"ISA95PhysicalAssetDataType\"/>\n    <xs:complexType name=\"ListOfISA95PhysicalAssetDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95PhysicalAssetDataType\" name=\"ISA95PhysicalAssetDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95PhysicalAssetDataType\" name=\"ListOfISA95PhysicalAssetDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95PropertyDataType\">\n        <xs:annotation>\n            <xs:documentation>A subtype of OPC UA Structure that defines two linked data items: an ID, which is a unique identifier for a property within the scope of the associated resource, and the value, which is the data for the property.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"ID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:Variant\" name=\"Value\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:ListOfLocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:EUInformation\" name=\"EngineeringUnits\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95PropertyDataType\" name=\"Subproperties\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95PropertyDataType\" name=\"ISA95PropertyDataType\"/>\n    <xs:complexType name=\"ListOfISA95PropertyDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95PropertyDataType\" name=\"ISA95PropertyDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95PropertyDataType\" name=\"ListOfISA95PropertyDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95StateDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines the information needed to schedule and execute a job.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:RelativePath\" name=\"BrowsePath\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:LocalizedText\" name=\"StateText\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:unsignedInt\" name=\"StateNumber\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95StateDataType\" name=\"ISA95StateDataType\"/>\n    <xs:complexType name=\"ListOfISA95StateDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95StateDataType\" name=\"ISA95StateDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95StateDataType\" name=\"ListOfISA95StateDataType\" nillable=\"true\"/>\n    <xs:complexType name=\"ISA95WorkMasterDataType\">\n        <xs:annotation>\n            <xs:documentation>Defines a Work Master ID and the defined parameters for the Work Master.</xs:documentation>\n        </xs:annotation>\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" type=\"xs:unsignedInt\" name=\"EncodingMask\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"xs:string\" name=\"ID\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"ua:LocalizedText\" name=\"Description\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"1\" type=\"tns:ListOfISA95ParameterDataType\" name=\"Parameters\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ISA95WorkMasterDataType\" name=\"ISA95WorkMasterDataType\"/>\n    <xs:complexType name=\"ListOfISA95WorkMasterDataType\">\n        <xs:sequence>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" type=\"tns:ISA95WorkMasterDataType\" name=\"ISA95WorkMasterDataType\" nillable=\"true\"/>\n        </xs:sequence>\n    </xs:complexType>\n    <xs:element type=\"tns:ListOfISA95WorkMasterDataType\" name=\"ListOfISA95WorkMasterDataType\" nillable=\"true\"/>\n</xs:schema>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBuffer.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System.Collections.Generic;\n\nnamespace MemoryBuffer\n{\n    #region MemoryTagState Class\n#if !OPCUA_EXCLUDE_MemoryTagState\n    /// <summary>\n    /// Stores an instance of the MemoryTagType VariableType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class MemoryTagState : BaseDataVariableState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public MemoryTagState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(VariableTypes.MemoryTagType, Namespaces.MemoryBuffer, namespaceUris);\n        }\n\n        /// <summary>\n        /// Returns the id of the default data type node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultDataTypeId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(DataTypes.BaseDataType, Opc.Ua.Namespaces.OpcUa, namespaceUris);\n        }\n\n        /// <summary>\n        /// Returns the id of the default value rank for the instance.\n        /// </summary>\n        protected override int GetDefaultValueRank()\n        {\n            return ValueRanks.Scalar;\n        }\n\n#if !OPCUA_EXCLUDE_InitializationStrings\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACIAAABodHRwOi8vc2FtcGxlcy5vcmcvVUEvbWVtb3J5YnVmZmVy/////xVgiQICAAAAAQAVAAAA\" +\n           \"TWVtb3J5VGFnVHlwZUluc3RhbmNlAQH6AwEB+gP6AwAAABj+////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n    }\n\n    #region MemoryTagState<T> Class\n    /// <summary>\n    /// A typed version of the MemoryTagType variable.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public class MemoryTagState<T> : MemoryTagState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the instance with its defalt attribute values.\n        /// </summary>\n        public MemoryTagState(NodeState parent) : base(parent)\n        {\n            Value = default(T);\n        }\n\n        /// <summary>\n        /// Initializes the instance with the default values.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n\n            Value = default(T);\n            DataType = TypeInfo.GetDataTypeId(typeof(T));\n            ValueRank = TypeInfo.GetValueRank(typeof(T));\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n        #endregion\n\n        #region Public Members\n        /// <summary>\n        /// The value of the variable.\n        /// </summary>\n        public new T Value\n        {\n            get\n            {\n                return CheckTypeBeforeCast<T>(base.Value, true);\n            }\n\n            set\n            {\n                base.Value = value;\n            }\n        }\n        #endregion\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region MemoryBufferState Class\n#if !OPCUA_EXCLUDE_MemoryBufferState\n    /// <summary>\n    /// Stores an instance of the MemoryBufferType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class MemoryBufferState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public MemoryBufferState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.MemoryBufferType, Namespaces.MemoryBuffer, namespaceUris);\n        }\n\n#if !OPCUA_EXCLUDE_InitializationStrings\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACIAAABodHRwOi8vc2FtcGxlcy5vcmcvVUEvbWVtb3J5YnVmZmVy/////wRggAIBAAAAAQAYAAAA\" +\n           \"TWVtb3J5QnVmZmVyVHlwZUluc3RhbmNlAQHoAwEB6APoAwAA/////wIAAAAVYKkKAgAAAAEADAAAAFN0\" +\n           \"YXJ0QWRkcmVzcwEB6wMALgBE6wMAAAcAAAAAAAf/////AQH/////AAAAABVgqQoCAAAAAQALAAAAU2l6\" +\n           \"ZUluQnl0ZXMBAewDAC4AROwDAAAHABAAAAAH/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<uint> StartAddress\n        {\n            get => m_startAddress;\n\n            set\n            {\n                if (!ReferenceEquals(m_startAddress, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_startAddress = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<uint> SizeInBytes\n        {\n            get => m_sizeInBytes;\n\n            set\n            {\n                if (!ReferenceEquals(m_sizeInBytes, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_sizeInBytes = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_startAddress != null)\n            {\n                children.Add(m_startAddress);\n            }\n\n            if (m_sizeInBytes != null)\n            {\n                children.Add(m_sizeInBytes);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.StartAddress:\n                    {\n                        if (createOrReplace && StartAddress == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StartAddress = new PropertyState<uint>(this);\n                            }\n                            else\n                            {\n                                StartAddress = (PropertyState<uint>)replacement;\n                            }\n                        }\n\n                        instance = StartAddress;\n                        break;\n                    }\n\n                case BrowseNames.SizeInBytes:\n                    {\n                        if (createOrReplace && SizeInBytes == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SizeInBytes = new PropertyState<uint>(this);\n                            }\n                            else\n                            {\n                                SizeInBytes = (PropertyState<uint>)replacement;\n                            }\n                        }\n\n                        instance = SizeInBytes;\n                        break;\n                    }\n            }\n\n            return instance ?? base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<uint> m_startAddress;\n        private PropertyState<uint> m_sizeInBytes;\n        #endregion\n    }\n#endif\n    #endregion\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBuffer.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace MemoryBuffer\n{\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the MemoryBuffers Object.\n        /// </summary>\n        public const uint MemoryBuffers = 1025;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <summary>\n        /// The identifier for the MemoryBufferType ObjectType.\n        /// </summary>\n        public const uint MemoryBufferType = 1000;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the MemoryBufferType_StartAddress Variable.\n        /// </summary>\n        public const uint MemoryBufferType_StartAddress = 1003;\n\n        /// <summary>\n        /// The identifier for the MemoryBufferType_SizeInBytes Variable.\n        /// </summary>\n        public const uint MemoryBufferType_SizeInBytes = 1004;\n    }\n    #endregion\n\n    #region VariableType Identifiers\n    /// <summary>\n    /// A class that declares constants for all VariableTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableTypes\n    {\n        /// <summary>\n        /// The identifier for the MemoryTagType VariableType.\n        /// </summary>\n        public const uint MemoryTagType = 1018;\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the MemoryBuffers Object.\n        /// </summary>\n        public static readonly ExpandedNodeId MemoryBuffers = new ExpandedNodeId(MemoryBuffer.Objects.MemoryBuffers, MemoryBuffer.Namespaces.MemoryBuffer);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <summary>\n        /// The identifier for the MemoryBufferType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId MemoryBufferType = new ExpandedNodeId(MemoryBuffer.ObjectTypes.MemoryBufferType, MemoryBuffer.Namespaces.MemoryBuffer);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the MemoryBufferType_StartAddress Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MemoryBufferType_StartAddress = new ExpandedNodeId(MemoryBuffer.Variables.MemoryBufferType_StartAddress, MemoryBuffer.Namespaces.MemoryBuffer);\n\n        /// <summary>\n        /// The identifier for the MemoryBufferType_SizeInBytes Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MemoryBufferType_SizeInBytes = new ExpandedNodeId(MemoryBuffer.Variables.MemoryBufferType_SizeInBytes, MemoryBuffer.Namespaces.MemoryBuffer);\n    }\n    #endregion\n\n    #region VariableType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all VariableTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableTypeIds\n    {\n        /// <summary>\n        /// The identifier for the MemoryTagType VariableType.\n        /// </summary>\n        public static readonly ExpandedNodeId MemoryTagType = new ExpandedNodeId(MemoryBuffer.VariableTypes.MemoryTagType, MemoryBuffer.Namespaces.MemoryBuffer);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the MemoryBuffers component.\n        /// </summary>\n        public const string MemoryBuffers = \"MemoryBuffers\";\n\n        /// <summary>\n        /// The BrowseName for the MemoryBufferType component.\n        /// </summary>\n        public const string MemoryBufferType = \"MemoryBufferType\";\n\n        /// <summary>\n        /// The BrowseName for the MemoryTagType component.\n        /// </summary>\n        public const string MemoryTagType = \"MemoryTagType\";\n\n        /// <summary>\n        /// The BrowseName for the SizeInBytes component.\n        /// </summary>\n        public const string SizeInBytes = \"SizeInBytes\";\n\n        /// <summary>\n        /// The BrowseName for the StartAddress component.\n        /// </summary>\n        public const string StartAddress = \"StartAddress\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the MemoryBuffer namespace (.NET code namespace is 'MemoryBuffer').\n        /// </summary>\n        public const string MemoryBuffer = \"http://samples.org/UA/memorybuffer\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBuffer.NodeIds.csv",
    "content": "MemoryBuffers,1025,Object\nMemoryBufferType,1000,ObjectType\nMemoryTagType,1018,VariableType\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBuffer.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://samples.org/UA/memorybuffer</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1000</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MemoryBufferType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MemoryBufferType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1003</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StartAddress</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StartAddress</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1004</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SizeInBytes</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SizeInBytes</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4096</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1018</Identifier>\n      </NodeId>\n      <NodeClass>VariableType_16</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MemoryTagType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MemoryTagType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=24</Identifier>\n      </DataType>\n      <ValueRank>-2</ValueRank>\n      <ArrayDimensions />\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1025</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MemoryBuffers</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MemoryBuffers</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=85</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBuffer.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://samples.org/UA/memorybuffer</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://samples.org/UA/memorybuffer\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UAVariableType NodeId=\"ns=1;i=1018\" BrowseName=\"1:MemoryTagType\" ValueRank=\"-2\">\n    <DisplayName>MemoryTagType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=63</Reference>\n    </References>\n  </UAVariableType>\n  <UAObjectType NodeId=\"ns=1;i=1000\" BrowseName=\"1:MemoryBufferType\">\n    <DisplayName>MemoryBufferType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1003</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=1004</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=1003\" BrowseName=\"1:StartAddress\" ParentNodeId=\"ns=1;i=1000\" DataType=\"UInt32\">\n    <DisplayName>StartAddress</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1000</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1004\" BrowseName=\"1:SizeInBytes\" ParentNodeId=\"ns=1;i=1000\" DataType=\"UInt32\">\n    <DisplayName>SizeInBytes</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=1000</Reference>\n    </References>\n    <Value>\n      <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">4096</UInt32>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=1025\" BrowseName=\"1:MemoryBuffers\">\n    <DisplayName>MemoryBuffers</DisplayName>\n    <References>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=85</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=61</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBuffer.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://samples.org/UA/memorybuffer</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <MemoryTagType xmlns=\"http://samples.org/UA/memorybuffer\">\n    <uax:NodeClass>VariableType_16</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1018</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>MemoryTagType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=63</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataType>\n      <uax:Identifier>i=24</uax:Identifier>\n    </uax:DataType>\n  </MemoryTagType>\n  <MemoryBufferType xmlns=\"http://samples.org/UA/memorybuffer\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1000</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>MemoryBufferType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <StartAddress>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1003</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StartAddress</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1003</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:UInt32>0</uax:UInt32>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StartAddress>\n    <SizeInBytes>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1004</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SizeInBytes</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>1004</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:UInt32>4096</uax:UInt32>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </SizeInBytes>\n  </MemoryBufferType>\n  <MemoryBuffers xmlns=\"http://samples.org/UA/memorybuffer\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1025</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>MemoryBuffers</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>1025</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=85</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </MemoryBuffers>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBuffer.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://samples.org/UA/memorybuffer\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://samples.org/UA/memorybuffer\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBuffer.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://samples.org/UA/memorybuffer\"\n  targetNamespace=\"http://samples.org/UA/memorybuffer\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBufferDesign.csv",
    "content": "MemoryBufferType,1000,ObjectType\nMemoryBufferType_StartAddress,1003,Variable\nMemoryBufferType_SizeInBytes,1004,Variable\nMemoryTagType,1018,VariableType\nMemoryBuffers,1025,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/MemoryBuffer/Design/MemoryBufferDesign.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n\txmlns:ua=\"http://opcfoundation.org/UA/\"\n\txmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns=\"http://samples.org/UA/memorybuffer\"\n\tTargetNamespace=\"http://samples.org/UA/memorybuffer\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"MemoryBuffer\" Prefix=\"MemoryBuffer\">http://samples.org/UA/memorybuffer</opc:Namespace>\n  </opc:Namespaces>\n\n\t<opc:VariableType SymbolicName=\"MemoryTagType\" BaseType=\"ua:BaseDataVariableType\">\n\t</opc:VariableType>\n\n\t<opc:ObjectType SymbolicName=\"MemoryBufferType\" BaseType=\"ua:BaseObjectType\">\n\t\t<opc:Children>\n\t\t\t<opc:Property SymbolicName=\"StartAddress\" DataType=\"ua:UInt32\">\n\t\t\t\t<opc:DefaultValue>\n\t\t\t\t\t<uax:UInt32>0</uax:UInt32>\n\t\t\t\t</opc:DefaultValue>\n\t\t\t</opc:Property>\n\t\t\t<opc:Property SymbolicName=\"SizeInBytes\" DataType=\"ua:UInt32\">\n\t\t\t\t<opc:DefaultValue>\n\t\t\t\t\t<uax:UInt32>4096</uax:UInt32>\n\t\t\t\t</opc:DefaultValue>\n\t\t\t</opc:Property>\n\t\t</opc:Children>\n\t</opc:ObjectType>\n\t\n\t<opc:Object SymbolicName=\"MemoryBuffers\" TypeDefinition=\"ua:FolderType\">\n\t\t<opc:References>\n\t\t\t<opc:Reference IsInverse=\"true\">\n\t\t\t\t<opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n\t\t\t\t<opc:TargetId>ua:ObjectsFolder</opc:TargetId>\n\t\t\t</opc:Reference>\n\t\t</opc:References>\n\t</opc:Object>\n\t\n</opc:ModelDesign>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/ModelDesign.csv",
    "content": "PlcTemperatureType,15001,DataType\nPlcType_PlcStatus,15003,Variable\nPlcTemperatureType_Encoding_DefaultBinary,15004,Object\nPlc_BinarySchema_PlcTemperatureType,15005,Variable\nPlc_BinarySchema_PlcTemperatureType_DataTypeVersion,15006,Variable\nPlc_BinarySchema_PlcTemperatureType_DictionaryFragment,15007,Variable\nPlcTemperatureType_Encoding_DefaultXml,15008,Object\nPlc_XmlSchema_PlcTemperatureType,15009,Variable\nPlc_XmlSchema_PlcTemperatureType_DataTypeVersion,15010,Variable\nPlc_XmlSchema_PlcTemperatureType_DictionaryFragment,15011,Variable\nPlcTemperatureType_Encoding_DefaultJson,15012,Object\nPlc1_PlcStatus,15013,Variable\nPlcHeaterStateType,15014,DataType\nPlcHeaterStateType_EnumStrings,15015,Variable\nPlcDataType,15032,DataType\nPlcType,15068,ObjectType\nPlc1,15070,Object\nPlcDataType_Encoding_DefaultBinary,15072,Object\nPlc_BinarySchema,15074,Variable\nPlc_BinarySchema_DataTypeVersion,15075,Variable\nPlc_BinarySchema_NamespaceUri,15076,Variable\nPlc_BinarySchema_Deprecated,15077,Variable\nPlc_BinarySchema_PlcDataType,15078,Variable\nPlc_BinarySchema_PlcDataType_DataTypeVersion,15079,Variable\nPlc_BinarySchema_PlcDataType_DictionaryFragment,15080,Variable\nPlcDataType_Encoding_DefaultXml,15084,Object\nPlc_XmlSchema,15086,Variable\nPlc_XmlSchema_DataTypeVersion,15087,Variable\nPlc_XmlSchema_NamespaceUri,15088,Variable\nPlc_XmlSchema_Deprecated,15089,Variable\nPlc_XmlSchema_PlcDataType,15090,Variable\nPlc_XmlSchema_PlcDataType_DataTypeVersion,15091,Variable\nPlc_XmlSchema_PlcDataType_DictionaryFragment,15092,Variable\nPlcDataType_Encoding_DefaultJson,15096,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/ModelDesign.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n  xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns=\"http://opcfoundation.org/UA/Plc\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Plc\"\n>\n  <!--\n  This element defines the mappings between the URIs used to identify namespaces and the symbols used in code.\n  User defined design files can include other user defined design files.\n  The location of included design files is specified with the FilePath attribute (absolute or relative path without the .xml suffix).\n  -->\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"Plc\" Prefix=\"PlcModel\">http://opcfoundation.org/UA/Plc</opc:Namespace>\n  </opc:Namespaces>\n\n  <!--DataTypes -->\n  <opc:DataType SymbolicName=\"PlcDataType\" BaseType=\"ua:Structure\">\n    <opc:Description>Temperature in °C, pressure in Pa and heater state.</opc:Description>\n\n    <opc:Fields>\n      <opc:Field Name=\"Temperature\" DataType=\"PlcTemperatureType\"/>\n      <opc:Field Name=\"Pressure\" DataType=\"ua:Int32\"/>\n      <opc:Field Name=\"HeaterState\" DataType=\"PlcHeaterStateType\"/>\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:DataType SymbolicName=\"PlcTemperatureType\" BaseType=\"ua:Structure\">\n    <opc:Description>Temperature in °C next to the heater at the bottom, and away from the heater at the top.</opc:Description>\n\n    <opc:Fields>\n      <opc:Field Name=\"Top\" DataType=\"ua:Int32\"/>\n      <opc:Field Name=\"Bottom\" DataType=\"ua:Int32\"/>\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:DataType SymbolicName=\"PlcHeaterStateType\" BaseType=\"ua:Enumeration\">\n    <opc:Description>Heater working state.</opc:Description>\n\n    <opc:Fields>\n      <opc:Field Name=\"Off\" Identifier=\"0\"/>\n      <opc:Field Name=\"On\" Identifier=\"1\"/>\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:ObjectType SymbolicName=\"PlcType\" BaseType=\"ua:BaseObjectType\" SupportsEvents=\"true\">\n    <opc:Children>\n      <opc:Variable SymbolicName=\"PlcStatus\" DataType=\"PlcDataType\">\n        <opc:DefaultValue>\n          <uax:ExtensionObject>\n            <uax:Body>\n              <PlcDataType>\n\n                <Temperature>\n                  <Top>20</Top>\n                  <Bottom>20</Bottom>\n                </Temperature>\n\n                <Pressure>100020</Pressure>\n\n                <HeaterState>On</HeaterState>\n\n              </PlcDataType>\n            </uax:Body>\n          </uax:ExtensionObject>\n        </opc:DefaultValue>\n      </opc:Variable>\n    </opc:Children>\n  </opc:ObjectType>\n\n  <!--\n  Declare an instance of a Plc.\n  Normally instances are created by program logic instead of being part of the model.\n  This is provided as an example of how to do it when there is a need for persistent instances.\n  -->\n  <opc:Object SymbolicName=\"Plc1\" TypeDefinition=\"PlcType\" SupportsEvents=\"true\">\n    <opc:BrowseName>Plc #1</opc:BrowseName>\n\n    <opc:Description>A simple plc.</opc:Description>\n\n    <!-- Link the instance back to the ObjectsFolder -->\n    <opc:References>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ObjectsFolder</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n\n  </opc:Object>\n\n</opc:ModelDesign>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\n\nnamespace PlcModel\n{\n    #region PlcState Class\n#if (!OPCUA_EXCLUDE_PlcState)\n    /// <summary>\n    /// Stores an instance of the PlcType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class PlcState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public PlcState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(PlcModel.ObjectTypes.PlcType, PlcModel.Namespaces.Plc, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAAB8AAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvUGxj/////4RggAIBAAAAAQAPAAAAUGxj\" +\n           \"VHlwZUluc3RhbmNlAQHcOgEB3DrcOgAAAf////8BAAAAFWCpCgIAAAABAAkAAABQbGNTdGF0dXMBAZs6\" +\n           \"AC8AP5s6AAAWAQHsOgK2AAAAPFBsY0RhdGFUeXBlIHhtbG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5v\" +\n           \"cmcvVUEvUGxjIj48VGVtcGVyYXR1cmU+PFRvcD4yMDwvVG9wPjxCb3R0b20+MjA8L0JvdHRvbT48L1Rl\" +\n           \"bXBlcmF0dXJlPjxQcmVzc3VyZT4xMDAwMjA8L1ByZXNzdXJlPjxIZWF0ZXJTdGF0ZT5PbjwvSGVhdGVy\" +\n           \"U3RhdGU+PC9QbGNEYXRhVHlwZT4BAbg6/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public BaseDataVariableState<PlcDataType> PlcStatus\n        {\n            get\n            {\n                return m_plcStatus;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_plcStatus, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_plcStatus = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_plcStatus != null)\n            {\n                children.Add(m_plcStatus);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case PlcModel.BrowseNames.PlcStatus:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (PlcStatus == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    PlcStatus = new BaseDataVariableState<PlcDataType>(this);\n                                }\n                                else\n                                {\n                                    PlcStatus = (BaseDataVariableState<PlcDataType>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = PlcStatus;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private BaseDataVariableState<PlcDataType> m_plcStatus;\n        #endregion\n    }\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace PlcModel\n{\n    #region DataType Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypes\n    {\n        /// <summary>\n        /// The identifier for the PlcDataType DataType.\n        /// </summary>\n        public const uint PlcDataType = 15032;\n\n        /// <summary>\n        /// The identifier for the PlcTemperatureType DataType.\n        /// </summary>\n        public const uint PlcTemperatureType = 15001;\n\n        /// <summary>\n        /// The identifier for the PlcHeaterStateType DataType.\n        /// </summary>\n        public const uint PlcHeaterStateType = 15014;\n    }\n    #endregion\n\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the Plc1 Object.\n        /// </summary>\n        public const uint Plc1 = 15070;\n\n        /// <summary>\n        /// The identifier for the PlcDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint PlcDataType_Encoding_DefaultBinary = 15072;\n\n        /// <summary>\n        /// The identifier for the PlcTemperatureType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint PlcTemperatureType_Encoding_DefaultBinary = 15004;\n\n        /// <summary>\n        /// The identifier for the PlcDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint PlcDataType_Encoding_DefaultXml = 15084;\n\n        /// <summary>\n        /// The identifier for the PlcTemperatureType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint PlcTemperatureType_Encoding_DefaultXml = 15008;\n\n        /// <summary>\n        /// The identifier for the PlcDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint PlcDataType_Encoding_DefaultJson = 15096;\n\n        /// <summary>\n        /// The identifier for the PlcTemperatureType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint PlcTemperatureType_Encoding_DefaultJson = 15012;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <summary>\n        /// The identifier for the PlcType ObjectType.\n        /// </summary>\n        public const uint PlcType = 15068;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the PlcHeaterStateType_EnumStrings Variable.\n        /// </summary>\n        public const uint PlcHeaterStateType_EnumStrings = 15015;\n\n        /// <summary>\n        /// The identifier for the PlcType_PlcStatus Variable.\n        /// </summary>\n        public const uint PlcType_PlcStatus = 15003;\n\n        /// <summary>\n        /// The identifier for the Plc1_PlcStatus Variable.\n        /// </summary>\n        public const uint Plc1_PlcStatus = 15013;\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema Variable.\n        /// </summary>\n        public const uint Plc_BinarySchema = 15074;\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint Plc_BinarySchema_NamespaceUri = 15076;\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public const uint Plc_BinarySchema_Deprecated = 15077;\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema_PlcDataType Variable.\n        /// </summary>\n        public const uint Plc_BinarySchema_PlcDataType = 15078;\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema_PlcTemperatureType Variable.\n        /// </summary>\n        public const uint Plc_BinarySchema_PlcTemperatureType = 15005;\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema Variable.\n        /// </summary>\n        public const uint Plc_XmlSchema = 15086;\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint Plc_XmlSchema_NamespaceUri = 15088;\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public const uint Plc_XmlSchema_Deprecated = 15089;\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema_PlcDataType Variable.\n        /// </summary>\n        public const uint Plc_XmlSchema_PlcDataType = 15090;\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema_PlcTemperatureType Variable.\n        /// </summary>\n        public const uint Plc_XmlSchema_PlcTemperatureType = 15009;\n    }\n    #endregion\n\n    #region DataType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypeIds\n    {\n        /// <summary>\n        /// The identifier for the PlcDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcDataType = new ExpandedNodeId(PlcModel.DataTypes.PlcDataType, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcTemperatureType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcTemperatureType = new ExpandedNodeId(PlcModel.DataTypes.PlcTemperatureType, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcHeaterStateType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcHeaterStateType = new ExpandedNodeId(PlcModel.DataTypes.PlcHeaterStateType, PlcModel.Namespaces.Plc);\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the Plc1 Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc1 = new ExpandedNodeId(PlcModel.Objects.Plc1, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcDataType_Encoding_DefaultBinary = new ExpandedNodeId(PlcModel.Objects.PlcDataType_Encoding_DefaultBinary, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcTemperatureType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcTemperatureType_Encoding_DefaultBinary = new ExpandedNodeId(PlcModel.Objects.PlcTemperatureType_Encoding_DefaultBinary, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcDataType_Encoding_DefaultXml = new ExpandedNodeId(PlcModel.Objects.PlcDataType_Encoding_DefaultXml, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcTemperatureType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcTemperatureType_Encoding_DefaultXml = new ExpandedNodeId(PlcModel.Objects.PlcTemperatureType_Encoding_DefaultXml, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcDataType_Encoding_DefaultJson = new ExpandedNodeId(PlcModel.Objects.PlcDataType_Encoding_DefaultJson, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcTemperatureType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcTemperatureType_Encoding_DefaultJson = new ExpandedNodeId(PlcModel.Objects.PlcTemperatureType_Encoding_DefaultJson, PlcModel.Namespaces.Plc);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <summary>\n        /// The identifier for the PlcType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcType = new ExpandedNodeId(PlcModel.ObjectTypes.PlcType, PlcModel.Namespaces.Plc);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the PlcHeaterStateType_EnumStrings Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcHeaterStateType_EnumStrings = new ExpandedNodeId(PlcModel.Variables.PlcHeaterStateType_EnumStrings, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the PlcType_PlcStatus Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId PlcType_PlcStatus = new ExpandedNodeId(PlcModel.Variables.PlcType_PlcStatus, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc1_PlcStatus Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc1_PlcStatus = new ExpandedNodeId(PlcModel.Variables.Plc1_PlcStatus, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_BinarySchema = new ExpandedNodeId(PlcModel.Variables.Plc_BinarySchema, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_BinarySchema_NamespaceUri = new ExpandedNodeId(PlcModel.Variables.Plc_BinarySchema_NamespaceUri, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_BinarySchema_Deprecated = new ExpandedNodeId(PlcModel.Variables.Plc_BinarySchema_Deprecated, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema_PlcDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_BinarySchema_PlcDataType = new ExpandedNodeId(PlcModel.Variables.Plc_BinarySchema_PlcDataType, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_BinarySchema_PlcTemperatureType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_BinarySchema_PlcTemperatureType = new ExpandedNodeId(PlcModel.Variables.Plc_BinarySchema_PlcTemperatureType, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_XmlSchema = new ExpandedNodeId(PlcModel.Variables.Plc_XmlSchema, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_XmlSchema_NamespaceUri = new ExpandedNodeId(PlcModel.Variables.Plc_XmlSchema_NamespaceUri, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_XmlSchema_Deprecated = new ExpandedNodeId(PlcModel.Variables.Plc_XmlSchema_Deprecated, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema_PlcDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_XmlSchema_PlcDataType = new ExpandedNodeId(PlcModel.Variables.Plc_XmlSchema_PlcDataType, PlcModel.Namespaces.Plc);\n\n        /// <summary>\n        /// The identifier for the Plc_XmlSchema_PlcTemperatureType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Plc_XmlSchema_PlcTemperatureType = new ExpandedNodeId(PlcModel.Variables.Plc_XmlSchema_PlcTemperatureType, PlcModel.Namespaces.Plc);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the Plc_BinarySchema component.\n        /// </summary>\n        public const string Plc_BinarySchema = \"PlcModel\";\n\n        /// <summary>\n        /// The BrowseName for the Plc_XmlSchema component.\n        /// </summary>\n        public const string Plc_XmlSchema = \"PlcModel\";\n\n        /// <summary>\n        /// The BrowseName for the Plc1 component.\n        /// </summary>\n        public const string Plc1 = \"Plc #1\";\n\n        /// <summary>\n        /// The BrowseName for the PlcDataType component.\n        /// </summary>\n        public const string PlcDataType = \"PlcDataType\";\n\n        /// <summary>\n        /// The BrowseName for the PlcHeaterStateType component.\n        /// </summary>\n        public const string PlcHeaterStateType = \"PlcHeaterStateType\";\n\n        /// <summary>\n        /// The BrowseName for the PlcStatus component.\n        /// </summary>\n        public const string PlcStatus = \"PlcStatus\";\n\n        /// <summary>\n        /// The BrowseName for the PlcTemperatureType component.\n        /// </summary>\n        public const string PlcTemperatureType = \"PlcTemperatureType\";\n\n        /// <summary>\n        /// The BrowseName for the PlcType component.\n        /// </summary>\n        public const string PlcType = \"PlcType\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the Plc namespace (.NET code namespace is 'PlcModel').\n        /// </summary>\n        public const string Plc = \"http://opcfoundation.org/UA/Plc\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.DataTypes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace PlcModel\n{\n    #region PlcDataType Class\n#if (!OPCUA_EXCLUDE_PlcDataType)\n    /// <summary>\n    /// Temperature in °C, pressure in Pa and heater state.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = PlcModel.Namespaces.Plc)]\n    public partial class PlcDataType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public PlcDataType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_temperature = new PlcTemperatureType();\n            m_pressure = (int)0;\n            m_heaterState = PlcHeaterStateType.Off;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Temperature\", IsRequired = false, Order = 1)]\n        public PlcTemperatureType Temperature\n        {\n            get\n            {\n                return m_temperature;\n            }\n\n            set\n            {\n                m_temperature = value;\n\n                if (value == null)\n                {\n                    m_temperature = new PlcTemperatureType();\n                }\n            }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Pressure\", IsRequired = false, Order = 2)]\n        public int Pressure\n        {\n            get { return m_pressure; }\n            set { m_pressure = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"HeaterState\", IsRequired = false, Order = 3)]\n        public PlcHeaterStateType HeaterState\n        {\n            get { return m_heaterState; }\n            set { m_heaterState = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.PlcDataType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.PlcDataType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.PlcDataType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(PlcModel.Namespaces.Plc);\n\n            encoder.WriteEncodeable(\"Temperature\", Temperature, typeof(PlcTemperatureType));\n            encoder.WriteInt32(\"Pressure\", Pressure);\n            encoder.WriteEnumerated(\"HeaterState\", HeaterState);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(PlcModel.Namespaces.Plc);\n\n            Temperature = (PlcTemperatureType)decoder.ReadEncodeable(\"Temperature\", typeof(PlcTemperatureType));\n            Pressure = decoder.ReadInt32(\"Pressure\");\n            HeaterState = (PlcHeaterStateType)decoder.ReadEnumerated(\"HeaterState\", typeof(PlcHeaterStateType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            PlcDataType value = encodeable as PlcDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_temperature, value.m_temperature)) return false;\n            if (!Utils.IsEqual(m_pressure, value.m_pressure)) return false;\n            if (!Utils.IsEqual(m_heaterState, value.m_heaterState)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (PlcDataType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            PlcDataType clone = (PlcDataType)base.MemberwiseClone();\n\n            clone.m_temperature = (PlcTemperatureType)Utils.Clone(this.m_temperature);\n            clone.m_pressure = (int)Utils.Clone(this.m_pressure);\n            clone.m_heaterState = (PlcHeaterStateType)Utils.Clone(this.m_heaterState);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private PlcTemperatureType m_temperature;\n        private int m_pressure;\n        private PlcHeaterStateType m_heaterState;\n        #endregion\n    }\n\n    #region PlcDataTypeCollection Class\n    /// <summary>\n    /// A collection of PlcDataType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfPlcDataType\", Namespace = PlcModel.Namespaces.Plc, ItemName = \"PlcDataType\")]\n#if !NET_STANDARD\n    public partial class PlcDataTypeCollection : List<PlcDataType>, ICloneable\n#else\n    public partial class PlcDataTypeCollection : List<PlcDataType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public PlcDataTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public PlcDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public PlcDataTypeCollection(IEnumerable<PlcDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator PlcDataTypeCollection(PlcDataType[] values)\n        {\n            if (values != null)\n            {\n                return new PlcDataTypeCollection(values);\n            }\n\n            return new PlcDataTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator PlcDataType[](PlcDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (PlcDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            PlcDataTypeCollection clone = new PlcDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((PlcDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region PlcTemperatureType Class\n#if (!OPCUA_EXCLUDE_PlcTemperatureType)\n    /// <summary>\n    /// Temperature in °C next to the heater at the bottom, and away from the heater at the top.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = PlcModel.Namespaces.Plc)]\n    public partial class PlcTemperatureType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public PlcTemperatureType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_top = (int)0;\n            m_bottom = (int)0;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        [DataMember(Name = \"Top\", IsRequired = false, Order = 1)]\n        public int Top\n        {\n            get { return m_top; }\n            set { m_top = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Bottom\", IsRequired = false, Order = 2)]\n        public int Bottom\n        {\n            get { return m_bottom; }\n            set { m_bottom = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.PlcTemperatureType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.PlcTemperatureType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.PlcTemperatureType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(PlcModel.Namespaces.Plc);\n\n            encoder.WriteInt32(\"Top\", Top);\n            encoder.WriteInt32(\"Bottom\", Bottom);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(PlcModel.Namespaces.Plc);\n\n            Top = decoder.ReadInt32(\"Top\");\n            Bottom = decoder.ReadInt32(\"Bottom\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            PlcTemperatureType value = encodeable as PlcTemperatureType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_top, value.m_top)) return false;\n            if (!Utils.IsEqual(m_bottom, value.m_bottom)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (PlcTemperatureType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            PlcTemperatureType clone = (PlcTemperatureType)base.MemberwiseClone();\n\n            clone.m_top = (int)Utils.Clone(this.m_top);\n            clone.m_bottom = (int)Utils.Clone(this.m_bottom);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private int m_top;\n        private int m_bottom;\n        #endregion\n    }\n\n    #region PlcTemperatureTypeCollection Class\n    /// <summary>\n    /// A collection of PlcTemperatureType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfPlcTemperatureType\", Namespace = PlcModel.Namespaces.Plc, ItemName = \"PlcTemperatureType\")]\n#if !NET_STANDARD\n    public partial class PlcTemperatureTypeCollection : List<PlcTemperatureType>, ICloneable\n#else\n    public partial class PlcTemperatureTypeCollection : List<PlcTemperatureType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public PlcTemperatureTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public PlcTemperatureTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public PlcTemperatureTypeCollection(IEnumerable<PlcTemperatureType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator PlcTemperatureTypeCollection(PlcTemperatureType[] values)\n        {\n            if (values != null)\n            {\n                return new PlcTemperatureTypeCollection(values);\n            }\n\n            return new PlcTemperatureTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator PlcTemperatureType[](PlcTemperatureTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (PlcTemperatureTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            PlcTemperatureTypeCollection clone = new PlcTemperatureTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((PlcTemperatureType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region PlcHeaterStateType Enumeration\n#if (!OPCUA_EXCLUDE_PlcHeaterStateType)\n    /// <summary>\n    /// Heater working state.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = PlcModel.Namespaces.Plc)]\n    public enum PlcHeaterStateType\n    {\n        /// <remarks />\n        [EnumMember(Value = \"Off_0\")]\n        Off = 0,\n\n        /// <remarks />\n        [EnumMember(Value = \"On_1\")]\n        On = 1,\n    }\n\n    #region PlcHeaterStateTypeCollection Class\n    /// <summary>\n    /// A collection of PlcHeaterStateType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfPlcHeaterStateType\", Namespace = PlcModel.Namespaces.Plc, ItemName = \"PlcHeaterStateType\")]\n#if !NET_STANDARD\n    public partial class PlcHeaterStateTypeCollection : List<PlcHeaterStateType>, ICloneable\n#else\n    public partial class PlcHeaterStateTypeCollection : List<PlcHeaterStateType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public PlcHeaterStateTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public PlcHeaterStateTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public PlcHeaterStateTypeCollection(IEnumerable<PlcHeaterStateType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator PlcHeaterStateTypeCollection(PlcHeaterStateType[] values)\n        {\n            if (values != null)\n            {\n                return new PlcHeaterStateTypeCollection(values);\n            }\n\n            return new PlcHeaterStateTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator PlcHeaterStateType[](PlcHeaterStateTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (PlcHeaterStateTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            PlcHeaterStateTypeCollection clone = new PlcHeaterStateTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((PlcHeaterStateType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.NodeIds.csv",
    "content": "Plc_BinarySchema,15074,Variable\nPlc_XmlSchema,15086,Variable\nPlc1,15070,Object\nPlcDataType,15032,DataType\nPlcDataType_Encoding_DefaultBinary,15072,Object\nPlcDataType_Encoding_DefaultJson,15096,Object\nPlcDataType_Encoding_DefaultXml,15084,Object\nPlcHeaterStateType,15014,DataType\nPlcTemperatureType,15001,DataType\nPlcTemperatureType_Encoding_DefaultBinary,15004,Object\nPlcTemperatureType_Encoding_DefaultJson,15012,Object\nPlcTemperatureType_Encoding_DefaultXml,15008,Object\nPlcType,15068,ObjectType\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/UA/Plc</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15001</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcTemperatureType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcTemperatureType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Temperature in °C next to the heater at the bottom, and away from the heater at the top.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15003</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcStatus</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcStatus</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <TypeId>\n              <Identifier>ns=1;i=15084</Identifier>\n            </TypeId>\n            <Body>\n              <PlcDataType xmlns=\"http://opcfoundation.org/UA/Plc\">\n                <Temperature>\n                  <Top>20</Top>\n                  <Bottom>20</Bottom>\n                </Temperature>\n                <Pressure>100020</Pressure>\n                <HeaterState>On</HeaterState>\n              </PlcDataType>\n            </Body>\n          </ExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=15032</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15004</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15005</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcTemperatureType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcTemperatureType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PlcTemperatureType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15008</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15009</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcTemperatureType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcTemperatureType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='PlcTemperatureType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15012</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15013</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcStatus</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcStatus</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <TypeId>\n              <Identifier>ns=1;i=15084</Identifier>\n            </TypeId>\n            <Body>\n              <PlcDataType xmlns=\"http://opcfoundation.org/UA/Plc\">\n                <Temperature>\n                  <Top>20</Top>\n                  <Bottom>20</Bottom>\n                </Temperature>\n                <Pressure>100020</Pressure>\n                <HeaterState>On</HeaterState>\n              </PlcDataType>\n            </Body>\n          </ExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=15032</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15014</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcHeaterStateType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcHeaterStateType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Heater working state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=29</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15015</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnumStrings</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnumStrings</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15014</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfLocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <LocalizedText>\n              <Text>Off</Text>\n            </LocalizedText>\n            <LocalizedText>\n              <Text>On</Text>\n            </LocalizedText>\n          </ListOfLocalizedText>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15032</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcDataType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>Temperature in °C, pressure in Pa and heater state.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15068</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15070</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Plc #1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Plc #1</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>A simple plc.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=85</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15072</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15074</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcModel</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcModel</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=93</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvUGxjIg0KICBEZWZh\ndWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29w\nY2ZvdW5kYXRpb24ub3JnL1VBL1BsYyINCj4NCiAgPG9wYzpJbXBvcnQgTmFtZXNwYWNlPSJodHRw\nOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBMb2NhdGlvbj0iT3BjLlVhLkJpbmFyeVNjaGVtYS5i\nc2QiLz4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlBsY0RhdGFUeXBlIiBCYXNlVHlw\nZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+VGVtcGVyYXR1\ncmUgaW4gwrBDLCBwcmVzc3VyZSBpbiBQYSBhbmQgaGVhdGVyIHN0YXRlLjwvb3BjOkRvY3VtZW50\nYXRpb24+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUZW1wZXJhdHVyZSIgVHlwZU5hbWU9InRuczpQ\nbGNUZW1wZXJhdHVyZVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQcmVzc3VyZSIgVHlw\nZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkhlYXRlclN0YXRlIiBU\neXBlTmFtZT0idG5zOlBsY0hlYXRlclN0YXRlVHlwZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5\ncGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiIEJh\nc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RG9jdW1lbnRhdGlvbj5UZW1w\nZXJhdHVyZSBpbiDCsEMgbmV4dCB0byB0aGUgaGVhdGVyIGF0IHRoZSBib3R0b20sIGFuZCBhd2F5\nIGZyb20gdGhlIGhlYXRlciBhdCB0aGUgdG9wLjwvb3BjOkRvY3VtZW50YXRpb24+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJUb3AiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJCb3R0b20iIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogIDwvb3BjOlN0cnVjdHVy\nZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iUGxjSGVhdGVyU3RhdGVUeXBl\nIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+SGVhdGVyIHdvcmtp\nbmcgc3RhdGUuPC9vcGM6RG9jdW1lbnRhdGlvbj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO\nYW1lPSJPZmYiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik9u\nIiBWYWx1ZT0iMSIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCjwvb3BjOlR5cGVEaWN0\naW9uYXJ5Pg==</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15076</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Plc</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15077</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15078</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PlcDataType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15084</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15090</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15086</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcModel</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcModel</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=92</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15088</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15089</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15090</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1BsYyINCiAgdGFy\nZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvUGxjIg0KICBlbGVtZW50\nRm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4NCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6\nLy9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4LzAyL1R5cGVzLnhzZCIgLz4NCg0KICA8eHM6Y29t\ncGxleFR5cGUgbmFtZT0iUGxjRGF0YVR5cGUiPg0KICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAg\nPHhzOmRvY3VtZW50YXRpb24+VGVtcGVyYXR1cmUgaW4gwrBDLCBwcmVzc3VyZSBpbiBQYSBhbmQg\naGVhdGVyIHN0YXRlLjwveHM6ZG9jdW1lbnRhdGlvbj4NCiAgICA8L3hzOmFubm90YXRpb24+DQog\nICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVtcGVyYXR1cmUiIHR5\ncGU9InRuczpQbGNUZW1wZXJhdHVyZVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQcmVzc3VyZSIgdHlwZT0ieHM6aW50IiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJIZWF0ZXJTdGF0ZSIgdHlwZT0i\ndG5zOlBsY0hlYXRlclN0YXRlVHlwZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVu\nY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBsY0RhdGFUeXBl\nIiB0eXBlPSJ0bnM6UGxjRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxp\nc3RPZlBsY0RhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJQbGNEYXRhVHlwZSIgdHlwZT0idG5zOlBsY0RhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1h\neE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNl\nPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQbGNEYXRh\nVHlwZSIgdHlwZT0idG5zOkxpc3RPZlBsY0RhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl\nbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiPg0K\nICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGVtcGVyYXR1cmUg\naW4gwrBDIG5leHQgdG8gdGhlIGhlYXRlciBhdCB0aGUgYm90dG9tLCBhbmQgYXdheSBmcm9tIHRo\nZSBoZWF0ZXIgYXQgdGhlIHRvcC48L3hzOmRvY3VtZW50YXRpb24+DQogICAgPC94czphbm5vdGF0\naW9uPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRvcCIgdHlw\nZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCb3R0\nb20iIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQog\nIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBsY1RlbXBlcmF0dXJlVHlw\nZSIgdHlwZT0idG5zOlBsY1RlbXBlcmF0dXJlVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUg\nbmFtZT0iTGlzdE9mUGxjVGVtcGVyYXR1cmVUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiIHR5cGU9InRuczpQbGNUZW1w\nZXJhdHVyZVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxl\nPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4\nczplbGVtZW50IG5hbWU9Ikxpc3RPZlBsY1RlbXBlcmF0dXJlVHlwZSIgdHlwZT0idG5zOkxpc3RP\nZlBsY1RlbXBlcmF0dXJlVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8\neHM6c2ltcGxlVHlwZSAgbmFtZT0iUGxjSGVhdGVyU3RhdGVUeXBlIj4NCiAgICA8eHM6YW5ub3Rh\ndGlvbj4NCiAgICAgIDx4czpkb2N1bWVudGF0aW9uPkhlYXRlciB3b3JraW5nIHN0YXRlLjwveHM6\nZG9jdW1lbnRhdGlvbj4NCiAgICA8L3hzOmFubm90YXRpb24+DQogICAgPHhzOnJlc3RyaWN0aW9u\nIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZl8wIiAv\nPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPbl8xIiAvPg0KICAgIDwveHM6cmVzdHJp\nY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUGxjSGVhdGVy\nU3RhdGVUeXBlIiB0eXBlPSJ0bnM6UGxjSGVhdGVyU3RhdGVUeXBlIiAvPg0KDQogIDx4czpjb21w\nbGV4VHlwZSBuYW1lPSJMaXN0T2ZQbGNIZWF0ZXJTdGF0ZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5j\nZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlBsY0hlYXRlclN0YXRlVHlwZSIgdHlwZT0idG5z\nOlBsY0hlYXRlclN0YXRlVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZQbGNIZWF0ZXJTdGF0ZVR5cGUiIHR5cGU9InRuczpMaXN0T2ZQbGNIZWF0\nZXJTdGF0ZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1h\nPg==</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15088</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Plc</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15089</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15090</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PlcDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PlcDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15086</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='PlcDataType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15096</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/Plc</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/Plc\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" XmlSchemaUri=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" Version=\"1.04.10\" PublicationDate=\"2021-09-15T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n    <Alias Alias=\"HasCause\">i=53</Alias>\n    <Alias Alias=\"ToState\">i=52</Alias>\n    <Alias Alias=\"FromState\">i=51</Alias>\n    <Alias Alias=\"HasEffect\">i=54</Alias>\n    <Alias Alias=\"HasTrueSubState\">i=9004</Alias>\n    <Alias Alias=\"HasFalseSubState\">i=9005</Alias>\n    <Alias Alias=\"HasDictionaryEntry\">i=17597</Alias>\n    <Alias Alias=\"HasCondition\">i=9006</Alias>\n    <Alias Alias=\"HasGuard\">i=15112</Alias>\n    <Alias Alias=\"HasAddIn\">i=17604</Alias>\n    <Alias Alias=\"HasInterface\">i=17603</Alias>\n  </Aliases>\n  <UADataType NodeId=\"ns=1;i=15032\" BrowseName=\"1:PlcDataType\">\n    <DisplayName>PlcDataType</DisplayName>\n    <Description>Temperature in °C, pressure in Pa and heater state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:PlcDataType\">\n      <Field Name=\"Temperature\" DataType=\"ns=1;i=15001\" />\n      <Field Name=\"Pressure\" DataType=\"i=6\" />\n      <Field Name=\"HeaterState\" DataType=\"ns=1;i=15014\" />\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=15001\" BrowseName=\"1:PlcTemperatureType\">\n    <DisplayName>PlcTemperatureType</DisplayName>\n    <Description>Temperature in °C next to the heater at the bottom, and away from the heater at the top.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:PlcTemperatureType\">\n      <Field Name=\"Top\" DataType=\"i=6\" />\n      <Field Name=\"Bottom\" DataType=\"i=6\" />\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=15014\" BrowseName=\"1:PlcHeaterStateType\">\n    <DisplayName>PlcHeaterStateType</DisplayName>\n    <Description>Heater working state.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15015</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=29</Reference>\n    </References>\n    <Definition Name=\"1:PlcHeaterStateType\">\n      <Field Name=\"Off\" Value=\"0\" />\n      <Field Name=\"On\" Value=\"1\" />\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=15015\" BrowseName=\"EnumStrings\" ParentNodeId=\"ns=1;i=15014\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>EnumStrings</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=15014</Reference>\n    </References>\n    <Value>\n      <ListOfLocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <LocalizedText>\n          <Text>Off</Text>\n        </LocalizedText>\n        <LocalizedText>\n          <Text>On</Text>\n        </LocalizedText>\n      </ListOfLocalizedText>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=15068\" BrowseName=\"1:PlcType\">\n    <DisplayName>PlcType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15003</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=15003\" BrowseName=\"1:PlcStatus\" ParentNodeId=\"ns=1;i=15068\" DataType=\"ns=1;i=15032\">\n    <DisplayName>PlcStatus</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=15068</Reference>\n    </References>\n    <Value>\n      <ExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <TypeId>\n          <Identifier>ns=1;i=15084</Identifier>\n        </TypeId>\n        <Body>\n          <PlcDataType xmlns=\"http://opcfoundation.org/UA/Plc\">\n            <Temperature>\n              <Top>20</Top>\n              <Bottom>20</Bottom>\n            </Temperature>\n            <Pressure>100020</Pressure>\n            <HeaterState>On</HeaterState>\n          </PlcDataType>\n        </Body>\n      </ExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=15070\" BrowseName=\"1:Plc #1\" SymbolicName=\"Plc1\" EventNotifier=\"1\">\n    <DisplayName>Plc #1</DisplayName>\n    <Description>A simple plc.</Description>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15013</Reference>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=85</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=15068</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=15013\" BrowseName=\"1:PlcStatus\" ParentNodeId=\"ns=1;i=15070\" DataType=\"ns=1;i=15032\">\n    <DisplayName>PlcStatus</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=15070</Reference>\n    </References>\n    <Value>\n      <ExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <TypeId>\n          <Identifier>ns=1;i=15084</Identifier>\n        </TypeId>\n        <Body>\n          <PlcDataType xmlns=\"http://opcfoundation.org/UA/Plc\">\n            <Temperature>\n              <Top>20</Top>\n              <Bottom>20</Bottom>\n            </Temperature>\n            <Pressure>100020</Pressure>\n            <HeaterState>On</HeaterState>\n          </PlcDataType>\n        </Body>\n      </ExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=15072\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=15032</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=15078</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=15004\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=15001</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=15005</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=15074\" BrowseName=\"1:PlcModel\" SymbolicName=\"Plc_BinarySchema\" ReleaseStatus=\"Deprecated\" DataType=\"ByteString\">\n    <DisplayName>PlcModel</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15076</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15077</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15078</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15005</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=93</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvUGxjIg0KICBEZWZh\ndWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29w\nY2ZvdW5kYXRpb24ub3JnL1VBL1BsYyINCj4NCiAgPG9wYzpJbXBvcnQgTmFtZXNwYWNlPSJodHRw\nOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBMb2NhdGlvbj0iT3BjLlVhLkJpbmFyeVNjaGVtYS5i\nc2QiLz4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlBsY0RhdGFUeXBlIiBCYXNlVHlw\nZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+VGVtcGVyYXR1\ncmUgaW4gwrBDLCBwcmVzc3VyZSBpbiBQYSBhbmQgaGVhdGVyIHN0YXRlLjwvb3BjOkRvY3VtZW50\nYXRpb24+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUZW1wZXJhdHVyZSIgVHlwZU5hbWU9InRuczpQ\nbGNUZW1wZXJhdHVyZVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQcmVzc3VyZSIgVHlw\nZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkhlYXRlclN0YXRlIiBU\neXBlTmFtZT0idG5zOlBsY0hlYXRlclN0YXRlVHlwZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5\ncGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiIEJh\nc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RG9jdW1lbnRhdGlvbj5UZW1w\nZXJhdHVyZSBpbiDCsEMgbmV4dCB0byB0aGUgaGVhdGVyIGF0IHRoZSBib3R0b20sIGFuZCBhd2F5\nIGZyb20gdGhlIGhlYXRlciBhdCB0aGUgdG9wLjwvb3BjOkRvY3VtZW50YXRpb24+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJUb3AiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJCb3R0b20iIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogIDwvb3BjOlN0cnVjdHVy\nZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iUGxjSGVhdGVyU3RhdGVUeXBl\nIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+SGVhdGVyIHdvcmtp\nbmcgc3RhdGUuPC9vcGM6RG9jdW1lbnRhdGlvbj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO\nYW1lPSJPZmYiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik9u\nIiBWYWx1ZT0iMSIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCjwvb3BjOlR5cGVEaWN0\naW9uYXJ5Pg==</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15076\" BrowseName=\"NamespaceUri\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=15074\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=15074</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Plc</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15077\" BrowseName=\"Deprecated\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=15074\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=15074</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15078\" BrowseName=\"1:PlcDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=15074\" DataType=\"String\">\n    <DisplayName>PlcDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=15074</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PlcDataType</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15005\" BrowseName=\"1:PlcTemperatureType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=15074\" DataType=\"String\">\n    <DisplayName>PlcTemperatureType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=15074</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PlcTemperatureType</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=15084\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=15032</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=15090</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=15008\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=15001</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=15009</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=15086\" BrowseName=\"1:PlcModel\" SymbolicName=\"Plc_XmlSchema\" ReleaseStatus=\"Deprecated\" DataType=\"ByteString\">\n    <DisplayName>PlcModel</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15088</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15089</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15090</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=15009</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=92</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1BsYyINCiAgdGFy\nZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvUGxjIg0KICBlbGVtZW50\nRm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4NCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6\nLy9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4LzAyL1R5cGVzLnhzZCIgLz4NCg0KICA8eHM6Y29t\ncGxleFR5cGUgbmFtZT0iUGxjRGF0YVR5cGUiPg0KICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAg\nPHhzOmRvY3VtZW50YXRpb24+VGVtcGVyYXR1cmUgaW4gwrBDLCBwcmVzc3VyZSBpbiBQYSBhbmQg\naGVhdGVyIHN0YXRlLjwveHM6ZG9jdW1lbnRhdGlvbj4NCiAgICA8L3hzOmFubm90YXRpb24+DQog\nICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVtcGVyYXR1cmUiIHR5\ncGU9InRuczpQbGNUZW1wZXJhdHVyZVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQcmVzc3VyZSIgdHlwZT0ieHM6aW50IiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJIZWF0ZXJTdGF0ZSIgdHlwZT0i\ndG5zOlBsY0hlYXRlclN0YXRlVHlwZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVu\nY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBsY0RhdGFUeXBl\nIiB0eXBlPSJ0bnM6UGxjRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxp\nc3RPZlBsY0RhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJQbGNEYXRhVHlwZSIgdHlwZT0idG5zOlBsY0RhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1h\neE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNl\nPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQbGNEYXRh\nVHlwZSIgdHlwZT0idG5zOkxpc3RPZlBsY0RhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl\nbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiPg0K\nICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGVtcGVyYXR1cmUg\naW4gwrBDIG5leHQgdG8gdGhlIGhlYXRlciBhdCB0aGUgYm90dG9tLCBhbmQgYXdheSBmcm9tIHRo\nZSBoZWF0ZXIgYXQgdGhlIHRvcC48L3hzOmRvY3VtZW50YXRpb24+DQogICAgPC94czphbm5vdGF0\naW9uPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRvcCIgdHlw\nZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCb3R0\nb20iIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQog\nIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBsY1RlbXBlcmF0dXJlVHlw\nZSIgdHlwZT0idG5zOlBsY1RlbXBlcmF0dXJlVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUg\nbmFtZT0iTGlzdE9mUGxjVGVtcGVyYXR1cmVUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiIHR5cGU9InRuczpQbGNUZW1w\nZXJhdHVyZVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxl\nPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4\nczplbGVtZW50IG5hbWU9Ikxpc3RPZlBsY1RlbXBlcmF0dXJlVHlwZSIgdHlwZT0idG5zOkxpc3RP\nZlBsY1RlbXBlcmF0dXJlVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8\neHM6c2ltcGxlVHlwZSAgbmFtZT0iUGxjSGVhdGVyU3RhdGVUeXBlIj4NCiAgICA8eHM6YW5ub3Rh\ndGlvbj4NCiAgICAgIDx4czpkb2N1bWVudGF0aW9uPkhlYXRlciB3b3JraW5nIHN0YXRlLjwveHM6\nZG9jdW1lbnRhdGlvbj4NCiAgICA8L3hzOmFubm90YXRpb24+DQogICAgPHhzOnJlc3RyaWN0aW9u\nIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZl8wIiAv\nPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPbl8xIiAvPg0KICAgIDwveHM6cmVzdHJp\nY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUGxjSGVhdGVy\nU3RhdGVUeXBlIiB0eXBlPSJ0bnM6UGxjSGVhdGVyU3RhdGVUeXBlIiAvPg0KDQogIDx4czpjb21w\nbGV4VHlwZSBuYW1lPSJMaXN0T2ZQbGNIZWF0ZXJTdGF0ZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5j\nZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlBsY0hlYXRlclN0YXRlVHlwZSIgdHlwZT0idG5z\nOlBsY0hlYXRlclN0YXRlVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZQbGNIZWF0ZXJTdGF0ZVR5cGUiIHR5cGU9InRuczpMaXN0T2ZQbGNIZWF0\nZXJTdGF0ZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1h\nPg==</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15088\" BrowseName=\"NamespaceUri\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=15086\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=15086</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Plc</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15089\" BrowseName=\"Deprecated\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=15086\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=15086</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15090\" BrowseName=\"1:PlcDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=15086\" DataType=\"String\">\n    <DisplayName>PlcDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=15086</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='PlcDataType']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15009\" BrowseName=\"1:PlcTemperatureType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=15086\" DataType=\"String\">\n    <DisplayName>PlcTemperatureType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=15086</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='PlcTemperatureType']</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=15096\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=15032</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=15012\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=15001</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Plc</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <PlcDataType xmlns=\"http://opcfoundation.org/UA/Plc\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15032</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>PlcDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Temperature in °C, pressure in Pa and heater state.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>Temperature</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=15001</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Pressure</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=6</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>HeaterState</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=15014</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </PlcDataType>\n  <PlcTemperatureType xmlns=\"http://opcfoundation.org/UA/Plc\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15001</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>PlcTemperatureType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Temperature in °C next to the heater at the bottom, and away from the heater at the top.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>Top</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=6</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Bottom</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=6</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </PlcTemperatureType>\n  <PlcHeaterStateType xmlns=\"http://opcfoundation.org/UA/Plc\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15014</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>PlcHeaterStateType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>Heater working state.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=29</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14799</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:EnumDefinition>\n          <uax:Fields>\n            <uax:EnumField>\n              <uax:Value>0</uax:Value>\n              <uax:DisplayName>\n                <uax:Text>Off</uax:Text>\n              </uax:DisplayName>\n              <uax:Name>Off</uax:Name>\n            </uax:EnumField>\n            <uax:EnumField>\n              <uax:Value>1</uax:Value>\n              <uax:DisplayName>\n                <uax:Text>On</uax:Text>\n              </uax:DisplayName>\n              <uax:Name>On</uax:Name>\n            </uax:EnumField>\n          </uax:Fields>\n        </uax:EnumDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <EnumStrings xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15015</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>EnumStrings</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15015</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:ListOfLocalizedText>\n            <uax:LocalizedText>\n              <uax:Text>Off</uax:Text>\n            </uax:LocalizedText>\n            <uax:LocalizedText>\n              <uax:Text>On</uax:Text>\n            </uax:LocalizedText>\n          </uax:ListOfLocalizedText>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=21</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </EnumStrings>\n  </PlcHeaterStateType>\n  <PlcType xmlns=\"http://opcfoundation.org/UA/Plc\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15068</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>PlcType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <PlcStatus>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15003</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PlcStatus</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>15003</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:ExtensionObject>\n            <uax:TypeId>\n              <uax:Identifier>ns=1;i=15084</uax:Identifier>\n            </uax:TypeId>\n            <uax:Body>\n              <PlcDataType xmlns=\"http://opcfoundation.org/UA/Plc\">\n                <Temperature>\n                  <Top>20</Top>\n                  <Bottom>20</Bottom>\n                </Temperature>\n                <Pressure>100020</Pressure>\n                <HeaterState>On</HeaterState>\n              </PlcDataType>\n            </uax:Body>\n          </uax:ExtensionObject>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=15032</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </PlcStatus>\n  </PlcType>\n  <Plc1 xmlns=\"http://opcfoundation.org/UA/Plc\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15070</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Plc #1</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Text>A simple plc.</uax:Text>\n    </uax:Description>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>ns=1;i=15068</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15070</uax:NumericId>\n    <uax:EventNotifier>1</uax:EventNotifier>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=85</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <PlcStatus>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15013</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PlcStatus</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15013</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:ExtensionObject>\n            <uax:TypeId>\n              <uax:Identifier>ns=1;i=15084</uax:Identifier>\n            </uax:TypeId>\n            <uax:Body>\n              <PlcDataType xmlns=\"http://opcfoundation.org/UA/Plc\">\n                <Temperature>\n                  <Top>20</Top>\n                  <Bottom>20</Bottom>\n                </Temperature>\n                <Pressure>100020</Pressure>\n                <HeaterState>On</HeaterState>\n              </PlcDataType>\n            </uax:Body>\n          </uax:ExtensionObject>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=15032</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </PlcStatus>\n  </Plc1>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15072</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15072</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15032</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15078</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15004</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15004</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15001</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15005</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <Plc_BinarySchema xmlns=\"http://opcfoundation.org/UA/Plc\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15074</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>PlcModel</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15074</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvUGxjIg0KICBEZWZh\ndWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29w\nY2ZvdW5kYXRpb24ub3JnL1VBL1BsYyINCj4NCiAgPG9wYzpJbXBvcnQgTmFtZXNwYWNlPSJodHRw\nOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBMb2NhdGlvbj0iT3BjLlVhLkJpbmFyeVNjaGVtYS5i\nc2QiLz4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlBsY0RhdGFUeXBlIiBCYXNlVHlw\nZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+VGVtcGVyYXR1\ncmUgaW4gwrBDLCBwcmVzc3VyZSBpbiBQYSBhbmQgaGVhdGVyIHN0YXRlLjwvb3BjOkRvY3VtZW50\nYXRpb24+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUZW1wZXJhdHVyZSIgVHlwZU5hbWU9InRuczpQ\nbGNUZW1wZXJhdHVyZVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQcmVzc3VyZSIgVHlw\nZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkhlYXRlclN0YXRlIiBU\neXBlTmFtZT0idG5zOlBsY0hlYXRlclN0YXRlVHlwZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5\ncGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiIEJh\nc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RG9jdW1lbnRhdGlvbj5UZW1w\nZXJhdHVyZSBpbiDCsEMgbmV4dCB0byB0aGUgaGVhdGVyIGF0IHRoZSBib3R0b20sIGFuZCBhd2F5\nIGZyb20gdGhlIGhlYXRlciBhdCB0aGUgdG9wLjwvb3BjOkRvY3VtZW50YXRpb24+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJUb3AiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJCb3R0b20iIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogIDwvb3BjOlN0cnVjdHVy\nZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iUGxjSGVhdGVyU3RhdGVUeXBl\nIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+SGVhdGVyIHdvcmtp\nbmcgc3RhdGUuPC9vcGM6RG9jdW1lbnRhdGlvbj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO\nYW1lPSJPZmYiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik9u\nIiBWYWx1ZT0iMSIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCjwvb3BjOlR5cGVEaWN0\naW9uYXJ5Pg==</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=93</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15076</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15076</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/UA/Plc</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15077</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15077</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <PlcDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15078</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PlcDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15078</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>PlcDataType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </PlcDataType>\n    <PlcTemperatureType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15005</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PlcTemperatureType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15005</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>PlcTemperatureType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </PlcTemperatureType>\n  </Plc_BinarySchema>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15084</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15084</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15032</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15090</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15008</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15008</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15001</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15009</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <Plc_XmlSchema xmlns=\"http://opcfoundation.org/UA/Plc\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15086</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>PlcModel</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15086</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1BsYyINCiAgdGFy\nZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvUGxjIg0KICBlbGVtZW50\nRm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4NCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6\nLy9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4LzAyL1R5cGVzLnhzZCIgLz4NCg0KICA8eHM6Y29t\ncGxleFR5cGUgbmFtZT0iUGxjRGF0YVR5cGUiPg0KICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAg\nPHhzOmRvY3VtZW50YXRpb24+VGVtcGVyYXR1cmUgaW4gwrBDLCBwcmVzc3VyZSBpbiBQYSBhbmQg\naGVhdGVyIHN0YXRlLjwveHM6ZG9jdW1lbnRhdGlvbj4NCiAgICA8L3hzOmFubm90YXRpb24+DQog\nICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVtcGVyYXR1cmUiIHR5\ncGU9InRuczpQbGNUZW1wZXJhdHVyZVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQcmVzc3VyZSIgdHlwZT0ieHM6aW50IiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJIZWF0ZXJTdGF0ZSIgdHlwZT0i\ndG5zOlBsY0hlYXRlclN0YXRlVHlwZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVu\nY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBsY0RhdGFUeXBl\nIiB0eXBlPSJ0bnM6UGxjRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxp\nc3RPZlBsY0RhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJQbGNEYXRhVHlwZSIgdHlwZT0idG5zOlBsY0RhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1h\neE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNl\nPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQbGNEYXRh\nVHlwZSIgdHlwZT0idG5zOkxpc3RPZlBsY0RhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl\nbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiPg0K\nICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGVtcGVyYXR1cmUg\naW4gwrBDIG5leHQgdG8gdGhlIGhlYXRlciBhdCB0aGUgYm90dG9tLCBhbmQgYXdheSBmcm9tIHRo\nZSBoZWF0ZXIgYXQgdGhlIHRvcC48L3hzOmRvY3VtZW50YXRpb24+DQogICAgPC94czphbm5vdGF0\naW9uPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRvcCIgdHlw\nZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCb3R0\nb20iIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQog\nIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBsY1RlbXBlcmF0dXJlVHlw\nZSIgdHlwZT0idG5zOlBsY1RlbXBlcmF0dXJlVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUg\nbmFtZT0iTGlzdE9mUGxjVGVtcGVyYXR1cmVUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJQbGNUZW1wZXJhdHVyZVR5cGUiIHR5cGU9InRuczpQbGNUZW1w\nZXJhdHVyZVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxl\nPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4\nczplbGVtZW50IG5hbWU9Ikxpc3RPZlBsY1RlbXBlcmF0dXJlVHlwZSIgdHlwZT0idG5zOkxpc3RP\nZlBsY1RlbXBlcmF0dXJlVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8\neHM6c2ltcGxlVHlwZSAgbmFtZT0iUGxjSGVhdGVyU3RhdGVUeXBlIj4NCiAgICA8eHM6YW5ub3Rh\ndGlvbj4NCiAgICAgIDx4czpkb2N1bWVudGF0aW9uPkhlYXRlciB3b3JraW5nIHN0YXRlLjwveHM6\nZG9jdW1lbnRhdGlvbj4NCiAgICA8L3hzOmFubm90YXRpb24+DQogICAgPHhzOnJlc3RyaWN0aW9u\nIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZl8wIiAv\nPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPbl8xIiAvPg0KICAgIDwveHM6cmVzdHJp\nY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUGxjSGVhdGVy\nU3RhdGVUeXBlIiB0eXBlPSJ0bnM6UGxjSGVhdGVyU3RhdGVUeXBlIiAvPg0KDQogIDx4czpjb21w\nbGV4VHlwZSBuYW1lPSJMaXN0T2ZQbGNIZWF0ZXJTdGF0ZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5j\nZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlBsY0hlYXRlclN0YXRlVHlwZSIgdHlwZT0idG5z\nOlBsY0hlYXRlclN0YXRlVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZQbGNIZWF0ZXJTdGF0ZVR5cGUiIHR5cGU9InRuczpMaXN0T2ZQbGNIZWF0\nZXJTdGF0ZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1h\nPg==</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=92</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15088</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15088</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/UA/Plc</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15089</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15089</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <PlcDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15090</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PlcDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15090</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='PlcDataType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </PlcDataType>\n    <PlcTemperatureType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15009</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PlcTemperatureType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15009</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='PlcTemperatureType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </PlcTemperatureType>\n  </Plc_XmlSchema>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15096</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15096</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15032</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15012</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15012</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=15001</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Plc\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Plc\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n  <opc:StructuredType Name=\"PlcDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Temperature in °C, pressure in Pa and heater state.</opc:Documentation>\n    <opc:Field Name=\"Temperature\" TypeName=\"tns:PlcTemperatureType\" />\n    <opc:Field Name=\"Pressure\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"HeaterState\" TypeName=\"tns:PlcHeaterStateType\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"PlcTemperatureType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Documentation>Temperature in °C next to the heater at the bottom, and away from the heater at the top.</opc:Documentation>\n    <opc:Field Name=\"Top\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Bottom\" TypeName=\"opc:Int32\" />\n  </opc:StructuredType>\n\n  <opc:EnumeratedType Name=\"PlcHeaterStateType\" LengthInBits=\"32\">\n    <opc:Documentation>Heater working state.</opc:Documentation>\n    <opc:EnumeratedValue Name=\"Off\" Value=\"0\" />\n    <opc:EnumeratedValue Name=\"On\" Value=\"1\" />\n  </opc:EnumeratedType>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Plc/Design/PlcModel.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Plc\"\n  targetNamespace=\"http://opcfoundation.org/UA/Plc\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n  <xs:complexType name=\"PlcDataType\">\n    <xs:annotation>\n      <xs:documentation>Temperature in °C, pressure in Pa and heater state.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"Temperature\" type=\"tns:PlcTemperatureType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Pressure\" type=\"xs:int\" minOccurs=\"0\" />\n      <xs:element name=\"HeaterState\" type=\"tns:PlcHeaterStateType\" minOccurs=\"0\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"PlcDataType\" type=\"tns:PlcDataType\" />\n\n  <xs:complexType name=\"ListOfPlcDataType\">\n    <xs:sequence>\n      <xs:element name=\"PlcDataType\" type=\"tns:PlcDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfPlcDataType\" type=\"tns:ListOfPlcDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"PlcTemperatureType\">\n    <xs:annotation>\n      <xs:documentation>Temperature in °C next to the heater at the bottom, and away from the heater at the top.</xs:documentation>\n    </xs:annotation>\n    <xs:sequence>\n      <xs:element name=\"Top\" type=\"xs:int\" minOccurs=\"0\" />\n      <xs:element name=\"Bottom\" type=\"xs:int\" minOccurs=\"0\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"PlcTemperatureType\" type=\"tns:PlcTemperatureType\" />\n\n  <xs:complexType name=\"ListOfPlcTemperatureType\">\n    <xs:sequence>\n      <xs:element name=\"PlcTemperatureType\" type=\"tns:PlcTemperatureType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfPlcTemperatureType\" type=\"tns:ListOfPlcTemperatureType\" nillable=\"true\"></xs:element>\n\n  <xs:simpleType  name=\"PlcHeaterStateType\">\n    <xs:annotation>\n      <xs:documentation>Heater working state.</xs:documentation>\n    </xs:annotation>\n    <xs:restriction base=\"xs:string\">\n      <xs:enumeration value=\"Off_0\" />\n      <xs:enumeration value=\"On_1\" />\n    </xs:restriction>\n  </xs:simpleType>\n  <xs:element name=\"PlcHeaterStateType\" type=\"tns:PlcHeaterStateType\" />\n\n  <xs:complexType name=\"ListOfPlcHeaterStateType\">\n    <xs:sequence>\n      <xs:element name=\"PlcHeaterStateType\" type=\"tns:PlcHeaterStateType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfPlcHeaterStateType\" type=\"tns:ListOfPlcHeaterStateType\" nillable=\"true\"></xs:element>\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/ModelDesign.csv",
    "content": "CycleStepDataType,183,DataType\nSystemCycleStartedEventType,184,ObjectType\nSystemCycleStartedEventType_EventId,185,Variable\nSystemCycleStartedEventType_EventType,186,Variable\nSystemCycleStartedEventType_SourceNode,187,Variable\nSystemCycleStartedEventType_SourceName,188,Variable\nSystemCycleStartedEventType_Time,189,Variable\nSystemCycleStartedEventType_ReceiveTime,190,Variable\nSystemCycleStartedEventType_LocalTime,191,Variable\nSystemCycleStartedEventType_Message,192,Variable\nSystemCycleStartedEventType_Severity,193,Variable\nSystemCycleStartedEventType_CycleId,194,Variable\nSystemCycleStartedEventType_Steps,196,Variable\nSystemCycleAbortedEventType,197,ObjectType\nSystemCycleAbortedEventType_EventId,198,Variable\nSystemCycleAbortedEventType_EventType,199,Variable\nSystemCycleAbortedEventType_SourceNode,200,Variable\nSystemCycleAbortedEventType_SourceName,201,Variable\nSystemCycleAbortedEventType_Time,202,Variable\nSystemCycleAbortedEventType_ReceiveTime,203,Variable\nSystemCycleAbortedEventType_LocalTime,204,Variable\nSystemCycleAbortedEventType_Message,205,Variable\nSystemCycleAbortedEventType_Severity,206,Variable\nSystemCycleAbortedEventType_CycleId,207,Variable\nSystemCycleFinishedEventType,210,ObjectType\nSystemCycleFinishedEventType_EventId,211,Variable\nSystemCycleFinishedEventType_EventType,212,Variable\nSystemCycleFinishedEventType_SourceNode,213,Variable\nSystemCycleFinishedEventType_SourceName,214,Variable\nSystemCycleFinishedEventType_Time,215,Variable\nSystemCycleFinishedEventType_ReceiveTime,216,Variable\nSystemCycleFinishedEventType_LocalTime,217,Variable\nSystemCycleFinishedEventType_Message,218,Variable\nSystemCycleFinishedEventType_Severity,219,Variable\nSystemCycleFinishedEventType_CycleId,220,Variable\nCycleStepDataType_Encoding_DefaultXml,221,Object\nSimpleEvents_BinarySchema,222,Variable\nSimpleEvents_BinarySchema_DataTypeVersion,223,Variable\nSimpleEvents_BinarySchema_NamespaceUri,224,Variable\nSimpleEvents_BinarySchema_CycleStepDataType,225,Variable\nSimpleEvents_BinarySchema_CycleStepDataType_DataTypeVersion,226,Variable\nSimpleEvents_BinarySchema_CycleStepDataType_DictionaryFragment,227,Variable\nCycleStepDataType_Encoding_DefaultBinary,228,Object\nSimpleEvents_XmlSchema,229,Variable\nSimpleEvents_XmlSchema_DataTypeVersion,230,Variable\nSimpleEvents_XmlSchema_NamespaceUri,231,Variable\nSimpleEvents_XmlSchema_CycleStepDataType,232,Variable\nSimpleEvents_XmlSchema_CycleStepDataType_DataTypeVersion,233,Variable\nSimpleEvents_XmlSchema_CycleStepDataType_DictionaryFragment,234,Variable\nSystemCycleStatusEventType,235,ObjectType\nSystemCycleStatusEventType_EventId,236,Variable\nSystemCycleStatusEventType_EventType,237,Variable\nSystemCycleStatusEventType_SourceNode,238,Variable\nSystemCycleStatusEventType_SourceName,239,Variable\nSystemCycleStatusEventType_Time,240,Variable\nSystemCycleStatusEventType_ReceiveTime,241,Variable\nSystemCycleStatusEventType_LocalTime,242,Variable\nSystemCycleStatusEventType_Message,243,Variable\nSystemCycleStatusEventType_Severity,244,Variable\nSystemCycleStatusEventType_CycleId,245,Variable\nSystemCycleStatusEventType_CurrentStep,246,Variable\nSystemCycleStartedEventType_CurrentStep,247,Variable\nSystemCycleAbortedEventType_CurrentStep,248,Variable\nSystemCycleAbortedEventType_Error,249,Variable\nSystemCycleFinishedEventType_CurrentStep,250,Variable\nSimpleEvents_BinarySchema_Deprecated,15001,Variable\nSimpleEvents_XmlSchema_Deprecated,15002,Variable\nCycleStepDataType_Encoding_DefaultJson,15003,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/ModelDesign.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns=\"http://opcfoundation.org/SimpleEvents\"\n  TargetNamespace=\"http://opcfoundation.org/SimpleEvents\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"SimpleEvents\" Prefix=\"SimpleEvents\" InternalPrefix=\"SimpleEvents\">http://opcfoundation.org/SimpleEvents</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:DataType SymbolicName=\"CycleStepDataType\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"Name\" DataType=\"ua:String\" ValueRank=\"Scalar\" />\n      <opc:Field Name=\"Duration\" DataType=\"ua:Double\" ValueRank=\"Scalar\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:ObjectType SymbolicName=\"SystemCycleStatusEventType\" BaseType=\"ua:SystemEventType\">\n    <opc:Description>An event raised when a system cycle starts.</opc:Description>\n    <opc:Children>\n      <opc:Property SymbolicName=\"CycleId\" DataType=\"ua:String\" ValueRank=\"Scalar\" />\n      <opc:Property SymbolicName=\"CurrentStep\" DataType=\"CycleStepDataType\" ValueRank=\"Scalar\" />\n    </opc:Children>\n  </opc:ObjectType>\n  \n  <opc:ObjectType SymbolicName=\"SystemCycleStartedEventType\" BaseType=\"SystemCycleStatusEventType\">\n    <opc:Description>An event raised when a system cycle starts.</opc:Description>\n    <opc:Children>\n      <opc:Property SymbolicName=\"Steps\" DataType=\"CycleStepDataType\" ValueRank=\"Array\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"SystemCycleAbortedEventType\" BaseType=\"SystemCycleStatusEventType\">\n    <opc:Description>An event raised when a system cycle is aborted.</opc:Description>\n    <opc:Children>\n      <opc:Property SymbolicName=\"Error\" DataType=\"ua:StatusCode\" ValueRank=\"Scalar\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"SystemCycleFinishedEventType\" BaseType=\"SystemCycleStatusEventType\">\n    <opc:Description>An event raised when a system cycle completes.</opc:Description>\n  </opc:ObjectType>\n\n\n</opc:ModelDesign>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\n\nnamespace SimpleEvents\n{\n    #region SystemCycleStatusEventState Class\n#if (!OPCUA_EXCLUDE_SystemCycleStatusEventState)\n    /// <summary>\n    /// Stores an instance of the SystemCycleStatusEventType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class SystemCycleStatusEventState : SystemEventState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public SystemCycleStatusEventState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(SimpleEvents.ObjectTypes.SystemCycleStatusEventType, SimpleEvents.Namespaces.SimpleEvents, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACUAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRz/////wRggAIBAAAAAQAi\" +\n           \"AAAAU3lzdGVtQ3ljbGVTdGF0dXNFdmVudFR5cGVJbnN0YW5jZQEB6wABAesA6wAAAP////8KAAAAFWCJ\" +\n           \"CgIAAAAAAAcAAABFdmVudElkAQHsAAAuAETsAAAAAA//////AQH/////AAAAABVgiQoCAAAAAAAJAAAA\" +\n           \"RXZlbnRUeXBlAQHtAAAuAETtAAAAABH/////AQH/////AAAAABVgiQoCAAAAAAAKAAAAU291cmNlTm9k\" +\n           \"ZQEB7gAALgBE7gAAAAAR/////wEB/////wAAAAAVYIkKAgAAAAAACgAAAFNvdXJjZU5hbWUBAe8AAC4A\" +\n           \"RO8AAAAADP////8BAf////8AAAAAFWCJCgIAAAAAAAQAAABUaW1lAQHwAAAuAETwAAAAAQAmAf////8B\" +\n           \"Af////8AAAAAFWCJCgIAAAAAAAsAAABSZWNlaXZlVGltZQEB8QAALgBE8QAAAAEAJgH/////AQH/////\" +\n           \"AAAAABVgiQoCAAAAAAAHAAAATWVzc2FnZQEB8wAALgBE8wAAAAAV/////wEB/////wAAAAAVYIkKAgAA\" +\n           \"AAAACAAAAFNldmVyaXR5AQH0AAAuAET0AAAAAAX/////AQH/////AAAAABVgiQoCAAAAAQAHAAAAQ3lj\" +\n           \"bGVJZAEB9QAALgBE9QAAAAAM/////wEB/////wAAAAAVYIkKAgAAAAEACwAAAEN1cnJlbnRTdGVwAQH2\" +\n           \"AAAuAET2AAAAAQG3AP////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<string> CycleId\n        {\n            get\n            {\n                return m_cycleId;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_cycleId, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_cycleId = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<CycleStepDataType> CurrentStep\n        {\n            get\n            {\n                return m_currentStep;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_currentStep, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_currentStep = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_cycleId != null)\n            {\n                children.Add(m_cycleId);\n            }\n\n            if (m_currentStep != null)\n            {\n                children.Add(m_currentStep);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case SimpleEvents.BrowseNames.CycleId:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (CycleId == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    CycleId = new PropertyState<string>(this);\n                                }\n                                else\n                                {\n                                    CycleId = (PropertyState<string>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = CycleId;\n                        break;\n                    }\n\n                case SimpleEvents.BrowseNames.CurrentStep:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (CurrentStep == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    CurrentStep = new PropertyState<CycleStepDataType>(this);\n                                }\n                                else\n                                {\n                                    CurrentStep = (PropertyState<CycleStepDataType>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = CurrentStep;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<string> m_cycleId;\n        private PropertyState<CycleStepDataType> m_currentStep;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region SystemCycleStartedEventState Class\n#if (!OPCUA_EXCLUDE_SystemCycleStartedEventState)\n    /// <summary>\n    /// Stores an instance of the SystemCycleStartedEventType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class SystemCycleStartedEventState : SystemCycleStatusEventState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public SystemCycleStartedEventState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(SimpleEvents.ObjectTypes.SystemCycleStartedEventType, SimpleEvents.Namespaces.SimpleEvents, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACUAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRz/////wRggAIBAAAAAQAj\" +\n           \"AAAAU3lzdGVtQ3ljbGVTdGFydGVkRXZlbnRUeXBlSW5zdGFuY2UBAbgAAQG4ALgAAAD/////CwAAABVg\" +\n           \"iQoCAAAAAAAHAAAARXZlbnRJZAEBuQAALgBEuQAAAAAP/////wEB/////wAAAAAVYIkKAgAAAAAACQAA\" +\n           \"AEV2ZW50VHlwZQEBugAALgBEugAAAAAR/////wEB/////wAAAAAVYIkKAgAAAAAACgAAAFNvdXJjZU5v\" +\n           \"ZGUBAbsAAC4ARLsAAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VOYW1lAQG8AAAu\" +\n           \"AES8AAAAAAz/////AQH/////AAAAABVgiQoCAAAAAAAEAAAAVGltZQEBvQAALgBEvQAAAAEAJgH/////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAALAAAAUmVjZWl2ZVRpbWUBAb4AAC4ARL4AAAABACYB/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAABwAAAE1lc3NhZ2UBAcAAAC4ARMAAAAAAFf////8BAf////8AAAAAFWCJCgIA\" +\n           \"AAAAAAgAAABTZXZlcml0eQEBwQAALgBEwQAAAAAF/////wEB/////wAAAAAVYIkKAgAAAAEABwAAAEN5\" +\n           \"Y2xlSWQBAcIAAC4ARMIAAAAADP////8BAf////8AAAAAFWCJCgIAAAABAAsAAABDdXJyZW50U3RlcAEB\" +\n           \"9wAALgBE9wAAAAEBtwD/////AQH/////AAAAABdgiQoCAAAAAQAFAAAAU3RlcHMBAcQAAC4ARMQAAAAB\" +\n           \"AbcAAQAAAAEAAAAAAAAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<CycleStepDataType[]> Steps\n        {\n            get\n            {\n                return m_steps;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_steps, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_steps = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_steps != null)\n            {\n                children.Add(m_steps);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case SimpleEvents.BrowseNames.Steps:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Steps == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Steps = new PropertyState<CycleStepDataType[]>(this);\n                                }\n                                else\n                                {\n                                    Steps = (PropertyState<CycleStepDataType[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Steps;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<CycleStepDataType[]> m_steps;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region SystemCycleAbortedEventState Class\n#if (!OPCUA_EXCLUDE_SystemCycleAbortedEventState)\n    /// <summary>\n    /// Stores an instance of the SystemCycleAbortedEventType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class SystemCycleAbortedEventState : SystemCycleStatusEventState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public SystemCycleAbortedEventState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(SimpleEvents.ObjectTypes.SystemCycleAbortedEventType, SimpleEvents.Namespaces.SimpleEvents, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACUAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRz/////wRggAIBAAAAAQAj\" +\n           \"AAAAU3lzdGVtQ3ljbGVBYm9ydGVkRXZlbnRUeXBlSW5zdGFuY2UBAcUAAQHFAMUAAAD/////CwAAABVg\" +\n           \"iQoCAAAAAAAHAAAARXZlbnRJZAEBxgAALgBExgAAAAAP/////wEB/////wAAAAAVYIkKAgAAAAAACQAA\" +\n           \"AEV2ZW50VHlwZQEBxwAALgBExwAAAAAR/////wEB/////wAAAAAVYIkKAgAAAAAACgAAAFNvdXJjZU5v\" +\n           \"ZGUBAcgAAC4ARMgAAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VOYW1lAQHJAAAu\" +\n           \"AETJAAAAAAz/////AQH/////AAAAABVgiQoCAAAAAAAEAAAAVGltZQEBygAALgBEygAAAAEAJgH/////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAALAAAAUmVjZWl2ZVRpbWUBAcsAAC4ARMsAAAABACYB/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAABwAAAE1lc3NhZ2UBAc0AAC4ARM0AAAAAFf////8BAf////8AAAAAFWCJCgIA\" +\n           \"AAAAAAgAAABTZXZlcml0eQEBzgAALgBEzgAAAAAF/////wEB/////wAAAAAVYIkKAgAAAAEABwAAAEN5\" +\n           \"Y2xlSWQBAc8AAC4ARM8AAAAADP////8BAf////8AAAAAFWCJCgIAAAABAAsAAABDdXJyZW50U3RlcAEB\" +\n           \"+AAALgBE+AAAAAEBtwD/////AQH/////AAAAABVgiQoCAAAAAQAFAAAARXJyb3IBAfkAAC4ARPkAAAAA\" +\n           \"E/////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<StatusCode> Error\n        {\n            get\n            {\n                return m_error;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_error, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_error = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_error != null)\n            {\n                children.Add(m_error);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case SimpleEvents.BrowseNames.Error:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Error == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Error = new PropertyState<StatusCode>(this);\n                                }\n                                else\n                                {\n                                    Error = (PropertyState<StatusCode>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Error;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<StatusCode> m_error;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region SystemCycleFinishedEventState Class\n#if (!OPCUA_EXCLUDE_SystemCycleFinishedEventState)\n    /// <summary>\n    /// Stores an instance of the SystemCycleFinishedEventType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class SystemCycleFinishedEventState : SystemCycleStatusEventState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public SystemCycleFinishedEventState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(SimpleEvents.ObjectTypes.SystemCycleFinishedEventType, SimpleEvents.Namespaces.SimpleEvents, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACUAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRz/////wRggAIBAAAAAQAk\" +\n           \"AAAAU3lzdGVtQ3ljbGVGaW5pc2hlZEV2ZW50VHlwZUluc3RhbmNlAQHSAAEB0gDSAAAA/////woAAAAV\" +\n           \"YIkKAgAAAAAABwAAAEV2ZW50SWQBAdMAAC4ARNMAAAAAD/////8BAf////8AAAAAFWCJCgIAAAAAAAkA\" +\n           \"AABFdmVudFR5cGUBAdQAAC4ARNQAAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VO\" +\n           \"b2RlAQHVAAAuAETVAAAAABH/////AQH/////AAAAABVgiQoCAAAAAAAKAAAAU291cmNlTmFtZQEB1gAA\" +\n           \"LgBE1gAAAAAM/////wEB/////wAAAAAVYIkKAgAAAAAABAAAAFRpbWUBAdcAAC4ARNcAAAABACYB////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAAACwAAAFJlY2VpdmVUaW1lAQHYAAAuAETYAAAAAQAmAf////8BAf//\" +\n           \"//8AAAAAFWCJCgIAAAAAAAcAAABNZXNzYWdlAQHaAAAuAETaAAAAABX/////AQH/////AAAAABVgiQoC\" +\n           \"AAAAAAAIAAAAU2V2ZXJpdHkBAdsAAC4ARNsAAAAABf////8BAf////8AAAAAFWCJCgIAAAABAAcAAABD\" +\n           \"eWNsZUlkAQHcAAAuAETcAAAAAAz/////AQH/////AAAAABVgiQoCAAAAAQALAAAAQ3VycmVudFN0ZXAB\" +\n           \"AfoAAC4ARPoAAAABAbcA/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace SimpleEvents\n{\n    #region DataType Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypes\n    {\n        /// <summary>\n        /// The identifier for the CycleStepDataType DataType.\n        /// </summary>\n        public const uint CycleStepDataType = 183;\n    }\n    #endregion\n\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the CycleStepDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint CycleStepDataType_Encoding_DefaultBinary = 228;\n\n        /// <summary>\n        /// The identifier for the CycleStepDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint CycleStepDataType_Encoding_DefaultXml = 221;\n\n        /// <summary>\n        /// The identifier for the CycleStepDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint CycleStepDataType_Encoding_DefaultJson = 15003;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <summary>\n        /// The identifier for the SystemCycleStatusEventType ObjectType.\n        /// </summary>\n        public const uint SystemCycleStatusEventType = 235;\n\n        /// <summary>\n        /// The identifier for the SystemCycleStartedEventType ObjectType.\n        /// </summary>\n        public const uint SystemCycleStartedEventType = 184;\n\n        /// <summary>\n        /// The identifier for the SystemCycleAbortedEventType ObjectType.\n        /// </summary>\n        public const uint SystemCycleAbortedEventType = 197;\n\n        /// <summary>\n        /// The identifier for the SystemCycleFinishedEventType ObjectType.\n        /// </summary>\n        public const uint SystemCycleFinishedEventType = 210;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the SystemCycleStatusEventType_CycleId Variable.\n        /// </summary>\n        public const uint SystemCycleStatusEventType_CycleId = 245;\n\n        /// <summary>\n        /// The identifier for the SystemCycleStatusEventType_CurrentStep Variable.\n        /// </summary>\n        public const uint SystemCycleStatusEventType_CurrentStep = 246;\n\n        /// <summary>\n        /// The identifier for the SystemCycleStartedEventType_Steps Variable.\n        /// </summary>\n        public const uint SystemCycleStartedEventType_Steps = 196;\n\n        /// <summary>\n        /// The identifier for the SystemCycleAbortedEventType_Error Variable.\n        /// </summary>\n        public const uint SystemCycleAbortedEventType_Error = 249;\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_BinarySchema Variable.\n        /// </summary>\n        public const uint SimpleEvents_BinarySchema = 222;\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint SimpleEvents_BinarySchema_NamespaceUri = 224;\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public const uint SimpleEvents_BinarySchema_Deprecated = 15001;\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_BinarySchema_CycleStepDataType Variable.\n        /// </summary>\n        public const uint SimpleEvents_BinarySchema_CycleStepDataType = 225;\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_XmlSchema Variable.\n        /// </summary>\n        public const uint SimpleEvents_XmlSchema = 229;\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint SimpleEvents_XmlSchema_NamespaceUri = 231;\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public const uint SimpleEvents_XmlSchema_Deprecated = 15002;\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_XmlSchema_CycleStepDataType Variable.\n        /// </summary>\n        public const uint SimpleEvents_XmlSchema_CycleStepDataType = 232;\n    }\n    #endregion\n\n    #region DataType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypeIds\n    {\n        /// <summary>\n        /// The identifier for the CycleStepDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId CycleStepDataType = new ExpandedNodeId(SimpleEvents.DataTypes.CycleStepDataType, SimpleEvents.Namespaces.SimpleEvents);\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the CycleStepDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId CycleStepDataType_Encoding_DefaultBinary = new ExpandedNodeId(SimpleEvents.Objects.CycleStepDataType_Encoding_DefaultBinary, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the CycleStepDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId CycleStepDataType_Encoding_DefaultXml = new ExpandedNodeId(SimpleEvents.Objects.CycleStepDataType_Encoding_DefaultXml, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the CycleStepDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId CycleStepDataType_Encoding_DefaultJson = new ExpandedNodeId(SimpleEvents.Objects.CycleStepDataType_Encoding_DefaultJson, SimpleEvents.Namespaces.SimpleEvents);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <summary>\n        /// The identifier for the SystemCycleStatusEventType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId SystemCycleStatusEventType = new ExpandedNodeId(SimpleEvents.ObjectTypes.SystemCycleStatusEventType, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SystemCycleStartedEventType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId SystemCycleStartedEventType = new ExpandedNodeId(SimpleEvents.ObjectTypes.SystemCycleStartedEventType, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SystemCycleAbortedEventType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId SystemCycleAbortedEventType = new ExpandedNodeId(SimpleEvents.ObjectTypes.SystemCycleAbortedEventType, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SystemCycleFinishedEventType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId SystemCycleFinishedEventType = new ExpandedNodeId(SimpleEvents.ObjectTypes.SystemCycleFinishedEventType, SimpleEvents.Namespaces.SimpleEvents);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the SystemCycleStatusEventType_CycleId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SystemCycleStatusEventType_CycleId = new ExpandedNodeId(SimpleEvents.Variables.SystemCycleStatusEventType_CycleId, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SystemCycleStatusEventType_CurrentStep Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SystemCycleStatusEventType_CurrentStep = new ExpandedNodeId(SimpleEvents.Variables.SystemCycleStatusEventType_CurrentStep, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SystemCycleStartedEventType_Steps Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SystemCycleStartedEventType_Steps = new ExpandedNodeId(SimpleEvents.Variables.SystemCycleStartedEventType_Steps, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SystemCycleAbortedEventType_Error Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SystemCycleAbortedEventType_Error = new ExpandedNodeId(SimpleEvents.Variables.SystemCycleAbortedEventType_Error, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_BinarySchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SimpleEvents_BinarySchema = new ExpandedNodeId(SimpleEvents.Variables.SimpleEvents_BinarySchema, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SimpleEvents_BinarySchema_NamespaceUri = new ExpandedNodeId(SimpleEvents.Variables.SimpleEvents_BinarySchema_NamespaceUri, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SimpleEvents_BinarySchema_Deprecated = new ExpandedNodeId(SimpleEvents.Variables.SimpleEvents_BinarySchema_Deprecated, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_BinarySchema_CycleStepDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SimpleEvents_BinarySchema_CycleStepDataType = new ExpandedNodeId(SimpleEvents.Variables.SimpleEvents_BinarySchema_CycleStepDataType, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_XmlSchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SimpleEvents_XmlSchema = new ExpandedNodeId(SimpleEvents.Variables.SimpleEvents_XmlSchema, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SimpleEvents_XmlSchema_NamespaceUri = new ExpandedNodeId(SimpleEvents.Variables.SimpleEvents_XmlSchema_NamespaceUri, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SimpleEvents_XmlSchema_Deprecated = new ExpandedNodeId(SimpleEvents.Variables.SimpleEvents_XmlSchema_Deprecated, SimpleEvents.Namespaces.SimpleEvents);\n\n        /// <summary>\n        /// The identifier for the SimpleEvents_XmlSchema_CycleStepDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SimpleEvents_XmlSchema_CycleStepDataType = new ExpandedNodeId(SimpleEvents.Variables.SimpleEvents_XmlSchema_CycleStepDataType, SimpleEvents.Namespaces.SimpleEvents);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the CurrentStep component.\n        /// </summary>\n        public const string CurrentStep = \"CurrentStep\";\n\n        /// <summary>\n        /// The BrowseName for the CycleId component.\n        /// </summary>\n        public const string CycleId = \"CycleId\";\n\n        /// <summary>\n        /// The BrowseName for the CycleStepDataType component.\n        /// </summary>\n        public const string CycleStepDataType = \"CycleStepDataType\";\n\n        /// <summary>\n        /// The BrowseName for the Error component.\n        /// </summary>\n        public const string Error = \"Error\";\n\n        /// <summary>\n        /// The BrowseName for the SimpleEvents_BinarySchema component.\n        /// </summary>\n        public const string SimpleEvents_BinarySchema = \"SimpleEvents\";\n\n        /// <summary>\n        /// The BrowseName for the SimpleEvents_XmlSchema component.\n        /// </summary>\n        public const string SimpleEvents_XmlSchema = \"SimpleEvents\";\n\n        /// <summary>\n        /// The BrowseName for the Steps component.\n        /// </summary>\n        public const string Steps = \"Steps\";\n\n        /// <summary>\n        /// The BrowseName for the SystemCycleAbortedEventType component.\n        /// </summary>\n        public const string SystemCycleAbortedEventType = \"SystemCycleAbortedEventType\";\n\n        /// <summary>\n        /// The BrowseName for the SystemCycleFinishedEventType component.\n        /// </summary>\n        public const string SystemCycleFinishedEventType = \"SystemCycleFinishedEventType\";\n\n        /// <summary>\n        /// The BrowseName for the SystemCycleStartedEventType component.\n        /// </summary>\n        public const string SystemCycleStartedEventType = \"SystemCycleStartedEventType\";\n\n        /// <summary>\n        /// The BrowseName for the SystemCycleStatusEventType component.\n        /// </summary>\n        public const string SystemCycleStatusEventType = \"SystemCycleStatusEventType\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the SimpleEvents namespace (.NET code namespace is 'SimpleEvents').\n        /// </summary>\n        public const string SimpleEvents = \"http://opcfoundation.org/SimpleEvents\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.DataTypes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace SimpleEvents\n{\n    #region CycleStepDataType Class\n#if (!OPCUA_EXCLUDE_CycleStepDataType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = SimpleEvents.Namespaces.SimpleEvents)]\n    public partial class CycleStepDataType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public CycleStepDataType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_name = null;\n            m_duration = (double)0;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        [DataMember(Name = \"Name\", IsRequired = false, Order = 1)]\n        public string Name\n        {\n            get { return m_name; }\n            set { m_name = value; }\n        }\n\n        /// <inheritdoc/>\n        [DataMember(Name = \"Duration\", IsRequired = false, Order = 2)]\n        public double Duration\n        {\n            get { return m_duration; }\n            set { m_duration = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.CycleStepDataType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.CycleStepDataType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.CycleStepDataType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(SimpleEvents.Namespaces.SimpleEvents);\n\n            encoder.WriteString(\"Name\", Name);\n            encoder.WriteDouble(\"Duration\", Duration);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(SimpleEvents.Namespaces.SimpleEvents);\n\n            Name = decoder.ReadString(\"Name\");\n            Duration = decoder.ReadDouble(\"Duration\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            CycleStepDataType value = encodeable as CycleStepDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_name, value.m_name)) return false;\n            if (!Utils.IsEqual(m_duration, value.m_duration)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (CycleStepDataType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            CycleStepDataType clone = (CycleStepDataType)base.MemberwiseClone();\n\n            clone.m_name = (string)Utils.Clone(this.m_name);\n            clone.m_duration = (double)Utils.Clone(this.m_duration);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_name;\n        private double m_duration;\n        #endregion\n    }\n\n    #region CycleStepDataTypeCollection Class\n    /// <summary>\n    /// A collection of CycleStepDataType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfCycleStepDataType\", Namespace = SimpleEvents.Namespaces.SimpleEvents, ItemName = \"CycleStepDataType\")]\n#if !NET_STANDARD\n    public partial class CycleStepDataTypeCollection : List<CycleStepDataType>, ICloneable\n#else\n    public partial class CycleStepDataTypeCollection : List<CycleStepDataType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public CycleStepDataTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public CycleStepDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public CycleStepDataTypeCollection(IEnumerable<CycleStepDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator CycleStepDataTypeCollection(CycleStepDataType[] values)\n        {\n            if (values != null)\n            {\n                return new CycleStepDataTypeCollection(values);\n            }\n\n            return new CycleStepDataTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator CycleStepDataType[](CycleStepDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (CycleStepDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            CycleStepDataTypeCollection clone = new CycleStepDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((CycleStepDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.NodeIds.csv",
    "content": "CycleStepDataType,183,DataType\nCycleStepDataType_Encoding_DefaultBinary,228,Object\nCycleStepDataType_Encoding_DefaultJson,15003,Object\nCycleStepDataType_Encoding_DefaultXml,221,Object\nSimpleEvents_BinarySchema,222,Variable\nSimpleEvents_XmlSchema,229,Variable\nSystemCycleAbortedEventType,197,ObjectType\nSystemCycleFinishedEventType,210,ObjectType\nSystemCycleStartedEventType,184,ObjectType\nSystemCycleStatusEventType,235,ObjectType\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/SimpleEvents</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=183</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleStepDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleStepDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=228</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=221</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=184</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SystemCycleStartedEventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SystemCycleStartedEventType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>An event raised when a system cycle starts.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=235</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=196</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=196</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Steps</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Steps</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=184</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=183</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=197</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SystemCycleAbortedEventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SystemCycleAbortedEventType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>An event raised when a system cycle is aborted.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=235</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=249</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=210</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SystemCycleFinishedEventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SystemCycleFinishedEventType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>An event raised when a system cycle completes.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=235</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=221</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=183</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=232</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=222</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimpleEvents</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimpleEvents</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=93</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=224</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=225</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRzIg0K\nICBEZWZhdWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVzcGFjZT0iaHR0\ncDovL29wY2ZvdW5kYXRpb24ub3JnL1NpbXBsZUV2ZW50cyINCj4NCiAgPG9wYzpJbXBvcnQgTmFt\nZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBMb2NhdGlvbj0iT3BjLlVhLkJp\nbmFyeVNjaGVtYS5ic2QiLz4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkN5Y2xlU3Rl\ncERhdGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iRHVyYXRpb24iIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk\nVHlwZT4NCg0KPC9vcGM6VHlwZURpY3Rpb25hcnk+</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=224</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=222</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/SimpleEvents</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=225</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleStepDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleStepDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=222</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">CycleStepDataType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=228</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=183</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=225</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=229</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimpleEvents</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimpleEvents</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=92</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=231</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=232</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1NpbXBsZUV2ZW50cyIN\nCiAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRz\nIg0KICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4NCiAgPHhzOmltcG9ydCBuYW1l\nc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4LzAyL1R5cGVzLnhzZCIgLz4N\nCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ3ljbGVTdGVwRGF0YVR5cGUiPg0KICAgIDx4czpz\nZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzOnN0cmluZyIg\nbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9\nIkR1cmF0aW9uIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNl\ncXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJDeWNsZVN0\nZXBEYXRhVHlwZSIgdHlwZT0idG5zOkN5Y2xlU3RlcERhdGFUeXBlIiAvPg0KDQogIDx4czpjb21w\nbGV4VHlwZSBuYW1lPSJMaXN0T2ZDeWNsZVN0ZXBEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ3ljbGVTdGVwRGF0YVR5cGUiIHR5cGU9InRuczpD\neWNsZVN0ZXBEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N\nCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ3ljbGVTdGVwRGF0YVR5cGUiIHR5cGU9InRuczpM\naXN0T2ZDeWNsZVN0ZXBEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0K\nPC94czpzY2hlbWE+</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=231</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=229</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/SimpleEvents</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=232</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleStepDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleStepDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=229</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='CycleStepDataType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=235</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SystemCycleStatusEventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SystemCycleStatusEventType</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>An event raised when a system cycle starts.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2130</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=245</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=246</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=184</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=197</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=210</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=245</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=235</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=246</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CurrentStep</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CurrentStep</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=235</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=183</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=249</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Error</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Error</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=197</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15001</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=222</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15002</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=229</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15003</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=183</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/SimpleEvents</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/SimpleEvents\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UADataType NodeId=\"ns=1;i=183\" BrowseName=\"1:CycleStepDataType\">\n    <DisplayName>CycleStepDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:CycleStepDataType\">\n      <Field Name=\"Name\" DataType=\"i=12\" />\n      <Field Name=\"Duration\" DataType=\"i=11\" />\n    </Definition>\n  </UADataType>\n  <UAObjectType NodeId=\"ns=1;i=235\" BrowseName=\"1:SystemCycleStatusEventType\">\n    <DisplayName>SystemCycleStatusEventType</DisplayName>\n    <Description>An event raised when a system cycle starts.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=245</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=246</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2130</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=245\" BrowseName=\"1:CycleId\" ParentNodeId=\"ns=1;i=235\" DataType=\"String\">\n    <DisplayName>CycleId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=235</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=246\" BrowseName=\"1:CurrentStep\" ParentNodeId=\"ns=1;i=235\" DataType=\"ns=1;i=183\">\n    <DisplayName>CurrentStep</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=235</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=184\" BrowseName=\"1:SystemCycleStartedEventType\">\n    <DisplayName>SystemCycleStartedEventType</DisplayName>\n    <Description>An event raised when a system cycle starts.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=196</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=235</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=196\" BrowseName=\"1:Steps\" ParentNodeId=\"ns=1;i=184\" DataType=\"ns=1;i=183\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Steps</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=184</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=197\" BrowseName=\"1:SystemCycleAbortedEventType\">\n    <DisplayName>SystemCycleAbortedEventType</DisplayName>\n    <Description>An event raised when a system cycle is aborted.</Description>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=249</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=235</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=249\" BrowseName=\"1:Error\" ParentNodeId=\"ns=1;i=197\" DataType=\"StatusCode\">\n    <DisplayName>Error</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=197</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=210\" BrowseName=\"1:SystemCycleFinishedEventType\">\n    <DisplayName>SystemCycleFinishedEventType</DisplayName>\n    <Description>An event raised when a system cycle completes.</Description>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=235</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=228\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=183</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=225</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=222\" BrowseName=\"1:SimpleEvents\" SymbolicName=\"SimpleEvents_BinarySchema\" DataType=\"ByteString\">\n    <DisplayName>SimpleEvents</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=224</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15001</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=225</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=93</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRzIg0K\nICBEZWZhdWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVzcGFjZT0iaHR0\ncDovL29wY2ZvdW5kYXRpb24ub3JnL1NpbXBsZUV2ZW50cyINCj4NCiAgPG9wYzpJbXBvcnQgTmFt\nZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBMb2NhdGlvbj0iT3BjLlVhLkJp\nbmFyeVNjaGVtYS5ic2QiLz4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkN5Y2xlU3Rl\ncERhdGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iRHVyYXRpb24iIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk\nVHlwZT4NCg0KPC9vcGM6VHlwZURpY3Rpb25hcnk+</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=224\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=222\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=222</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/SimpleEvents</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15001\" BrowseName=\"Deprecated\" ParentNodeId=\"ns=1;i=222\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=222</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=225\" BrowseName=\"1:CycleStepDataType\" ParentNodeId=\"ns=1;i=222\" DataType=\"String\">\n    <DisplayName>CycleStepDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=222</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">CycleStepDataType</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=221\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=183</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=232</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=229\" BrowseName=\"1:SimpleEvents\" SymbolicName=\"SimpleEvents_XmlSchema\" DataType=\"ByteString\">\n    <DisplayName>SimpleEvents</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=231</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15002</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=232</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=92</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1NpbXBsZUV2ZW50cyIN\nCiAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRz\nIg0KICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4NCiAgPHhzOmltcG9ydCBuYW1l\nc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4LzAyL1R5cGVzLnhzZCIgLz4N\nCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ3ljbGVTdGVwRGF0YVR5cGUiPg0KICAgIDx4czpz\nZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzOnN0cmluZyIg\nbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9\nIkR1cmF0aW9uIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNl\ncXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJDeWNsZVN0\nZXBEYXRhVHlwZSIgdHlwZT0idG5zOkN5Y2xlU3RlcERhdGFUeXBlIiAvPg0KDQogIDx4czpjb21w\nbGV4VHlwZSBuYW1lPSJMaXN0T2ZDeWNsZVN0ZXBEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ3ljbGVTdGVwRGF0YVR5cGUiIHR5cGU9InRuczpD\neWNsZVN0ZXBEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N\nCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ3ljbGVTdGVwRGF0YVR5cGUiIHR5cGU9InRuczpM\naXN0T2ZDeWNsZVN0ZXBEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0K\nPC94czpzY2hlbWE+</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=231\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=229\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=229</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/SimpleEvents</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15002\" BrowseName=\"Deprecated\" ParentNodeId=\"ns=1;i=229\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=229</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=232\" BrowseName=\"1:CycleStepDataType\" ParentNodeId=\"ns=1;i=229\" DataType=\"String\">\n    <DisplayName>CycleStepDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=229</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='CycleStepDataType']</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=15003\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=183</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/SimpleEvents</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <CycleStepDataType xmlns=\"http://opcfoundation.org/SimpleEvents\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=183</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>CycleStepDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>Name</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Duration</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=11</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </CycleStepDataType>\n  <SystemCycleStatusEventType xmlns=\"http://opcfoundation.org/SimpleEvents\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=235</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SystemCycleStatusEventType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>An event raised when a system cycle starts.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2130</uax:Identifier>\n    </uax:SuperTypeId>\n    <CycleId>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=245</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>CycleId</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>245</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </CycleId>\n    <CurrentStep>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=246</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>CurrentStep</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>246</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=183</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </CurrentStep>\n  </SystemCycleStatusEventType>\n  <SystemCycleStartedEventType xmlns=\"http://opcfoundation.org/SimpleEvents\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=184</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SystemCycleStartedEventType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>An event raised when a system cycle starts.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=235</uax:Identifier>\n    </uax:SuperTypeId>\n    <Steps>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=196</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Steps</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>196</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=183</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Steps>\n  </SystemCycleStartedEventType>\n  <SystemCycleAbortedEventType xmlns=\"http://opcfoundation.org/SimpleEvents\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=197</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SystemCycleAbortedEventType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>An event raised when a system cycle is aborted.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=235</uax:Identifier>\n    </uax:SuperTypeId>\n    <Error>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=249</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Error</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>249</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=19</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Error>\n  </SystemCycleAbortedEventType>\n  <SystemCycleFinishedEventType xmlns=\"http://opcfoundation.org/SimpleEvents\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=210</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SystemCycleFinishedEventType</uax:Name>\n    </uax:BrowseName>\n    <uax:Description>\n      <uax:Locale></uax:Locale>\n      <uax:Text>An event raised when a system cycle completes.</uax:Text>\n    </uax:Description>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=235</uax:Identifier>\n    </uax:SuperTypeId>\n  </SystemCycleFinishedEventType>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=228</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>228</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=183</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=225</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <SimpleEvents_BinarySchema xmlns=\"http://opcfoundation.org/SimpleEvents\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=222</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SimpleEvents</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>222</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRzIg0K\nICBEZWZhdWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVzcGFjZT0iaHR0\ncDovL29wY2ZvdW5kYXRpb24ub3JnL1NpbXBsZUV2ZW50cyINCj4NCiAgPG9wYzpJbXBvcnQgTmFt\nZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBMb2NhdGlvbj0iT3BjLlVhLkJp\nbmFyeVNjaGVtYS5ic2QiLz4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkN5Y2xlU3Rl\ncERhdGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iRHVyYXRpb24iIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk\nVHlwZT4NCg0KPC9vcGM6VHlwZURpY3Rpb25hcnk+</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=93</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=224</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>224</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/SimpleEvents</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15001</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15001</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <CycleStepDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=225</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>CycleStepDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>225</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>CycleStepDataType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </CycleStepDataType>\n  </SimpleEvents_BinarySchema>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=221</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>221</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=183</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=232</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <SimpleEvents_XmlSchema xmlns=\"http://opcfoundation.org/SimpleEvents\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=229</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SimpleEvents</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>229</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1NpbXBsZUV2ZW50cyIN\nCiAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvU2ltcGxlRXZlbnRz\nIg0KICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4NCiAgPHhzOmltcG9ydCBuYW1l\nc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4LzAyL1R5cGVzLnhzZCIgLz4N\nCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ3ljbGVTdGVwRGF0YVR5cGUiPg0KICAgIDx4czpz\nZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzOnN0cmluZyIg\nbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9\nIkR1cmF0aW9uIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNl\ncXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJDeWNsZVN0\nZXBEYXRhVHlwZSIgdHlwZT0idG5zOkN5Y2xlU3RlcERhdGFUeXBlIiAvPg0KDQogIDx4czpjb21w\nbGV4VHlwZSBuYW1lPSJMaXN0T2ZDeWNsZVN0ZXBEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ3ljbGVTdGVwRGF0YVR5cGUiIHR5cGU9InRuczpD\neWNsZVN0ZXBEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N\nCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ3ljbGVTdGVwRGF0YVR5cGUiIHR5cGU9InRuczpM\naXN0T2ZDeWNsZVN0ZXBEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0K\nPC94czpzY2hlbWE+</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=92</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=231</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>231</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/SimpleEvents</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15002</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15002</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <CycleStepDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=232</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>CycleStepDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>232</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='CycleStepDataType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </CycleStepDataType>\n  </SimpleEvents_XmlSchema>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15003</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15003</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=183</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/SimpleEvents\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/SimpleEvents\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n  <opc:StructuredType Name=\"CycleStepDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"Name\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Duration\" TypeName=\"opc:Double\" />\n  </opc:StructuredType>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/SimpleEvents/Design/SimpleEvents.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/SimpleEvents\"\n  targetNamespace=\"http://opcfoundation.org/SimpleEvents\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n  <xs:complexType name=\"CycleStepDataType\">\n    <xs:sequence>\n      <xs:element name=\"Name\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Duration\" type=\"xs:double\" minOccurs=\"0\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"CycleStepDataType\" type=\"tns:CycleStepDataType\" />\n\n  <xs:complexType name=\"ListOfCycleStepDataType\">\n    <xs:sequence>\n      <xs:element name=\"CycleStepDataType\" type=\"tns:CycleStepDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfCycleStepDataType\" type=\"tns:ListOfCycleStepDataType\" nillable=\"true\"></xs:element>\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\nusing System.Xml;\n\nnamespace TestData\n{\n    #region GenerateValuesMethodState Class\n#if (!OPCUA_EXCLUDE_GenerateValuesMethodState)\n    /// <summary>\n    /// Stores an instance of the GenerateValuesMethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class GenerateValuesMethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public GenerateValuesMethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new GenerateValuesMethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABgAAABHZW5lcmF0ZVZh\" +\n           \"bHVlc01ldGhvZFR5cGUBAZkkAC8BAZkkmSQAAAEB/////wEAAAAXYKkKAgAAAAAADgAAAElucHV0QXJn\" +\n           \"dW1lbnRzAQGaJAAuAESaJAAAlgEAAAABACoBAUYAAAAKAAAASXRlcmF0aW9ucwAH/////wAAAAADAAAA\" +\n           \"ACUAAABUaGUgbnVtYmVyIG9mIG5ldyB2YWx1ZXMgdG8gZ2VuZXJhdGUuAQAoAQEAAAABAAAAAAAAAAEB\" +\n           \"/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public GenerateValuesMethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            uint iterations = (uint)_inputArguments[0];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    iterations);\n            }\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"iterations\"></param>\n    /// <exclude />\n    public delegate ServiceResult GenerateValuesMethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        uint iterations);\n#endif\n    #endregion\n\n    #region GenerateValuesEventState Class\n#if (!OPCUA_EXCLUDE_GenerateValuesEventState)\n    /// <summary>\n    /// Stores an instance of the GenerateValuesEventType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class GenerateValuesEventState : BaseEventState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public GenerateValuesEventState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(TestData.ObjectTypes.GenerateValuesEventType, TestData.Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABAB8AAABHZW5lcmF0ZVZh\" +\n           \"bHVlc0V2ZW50VHlwZUluc3RhbmNlAQGbJAEBmySbJAAA/////woAAAAVYIkKAgAAAAAABwAAAEV2ZW50\" +\n           \"SWQBAZwkAC4ARJwkAAAAD/////8BAf////8AAAAAFWCJCgIAAAAAAAkAAABFdmVudFR5cGUBAZ0kAC4A\" +\n           \"RJ0kAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VOb2RlAQGeJAAuAESeJAAAABH/\" +\n           \"////AQH/////AAAAABVgiQoCAAAAAAAKAAAAU291cmNlTmFtZQEBnyQALgBEnyQAAAAM/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAABAAAAFRpbWUBAaAkAC4ARKAkAAABACYB/////wEB/////wAAAAAVYIkKAgAA\" +\n           \"AAAACwAAAFJlY2VpdmVUaW1lAQGhJAAuAEShJAAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAcA\" +\n           \"AABNZXNzYWdlAQGjJAAuAESjJAAAABX/////AQH/////AAAAABVgiQoCAAAAAAAIAAAAU2V2ZXJpdHkB\" +\n           \"AaQkAC4ARKQkAAAABf////8BAf////8AAAAAFWCJCgIAAAABAAoAAABJdGVyYXRpb25zAQGlJAAuAESl\" +\n           \"JAAAAAf/////AQH/////AAAAABVgiQoCAAAAAQANAAAATmV3VmFsdWVDb3VudAEBpiQALgBEpiQAAAAH\" +\n           \"/////wEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public PropertyState<uint> Iterations\n        {\n            get\n            {\n                return m_iterations;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_iterations, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_iterations = value;\n            }\n        }\n\n        /// <remarks />\n        public PropertyState<uint> NewValueCount\n        {\n            get\n            {\n                return m_newValueCount;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_newValueCount, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_newValueCount = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_iterations != null)\n            {\n                children.Add(m_iterations);\n            }\n\n            if (m_newValueCount != null)\n            {\n                children.Add(m_newValueCount);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case TestData.BrowseNames.Iterations:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Iterations == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Iterations = new PropertyState<uint>(this);\n                                }\n                                else\n                                {\n                                    Iterations = (PropertyState<uint>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Iterations;\n                        break;\n                    }\n\n                case TestData.BrowseNames.NewValueCount:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (NewValueCount == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    NewValueCount = new PropertyState<uint>(this);\n                                }\n                                else\n                                {\n                                    NewValueCount = (PropertyState<uint>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = NewValueCount;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<uint> m_iterations;\n        private PropertyState<uint> m_newValueCount;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region TestDataObjectState Class\n#if (!OPCUA_EXCLUDE_TestDataObjectState)\n    /// <summary>\n    /// Stores an instance of the TestDataObjectType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class TestDataObjectState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public TestDataObjectState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.TestDataObjectType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABABoAAABUZXN0RGF0YU9i\" +\n           \"amVjdFR5cGVJbnN0YW5jZQEBpyQBAackpyQAAAEAAAAAJAABAaskAwAAADVgiQoCAAAAAQAQAAAAU2lt\" +\n           \"dWxhdGlvbkFjdGl2ZQEBqCQDAAAAAEcAAABJZiB0cnVlIHRoZSBzZXJ2ZXIgd2lsbCBwcm9kdWNlIG5l\" +\n           \"dyB2YWx1ZXMgZm9yIGVhY2ggbW9uaXRvcmVkIHZhcmlhYmxlLgAuAESoJAAAAAH/////AQH/////AAAA\" +\n           \"AARhggoEAAAAAQAOAAAAR2VuZXJhdGVWYWx1ZXMBAakkAC8BAakkqSQAAAEB/////wEAAAAXYKkKAgAA\" +\n           \"AAAADgAAAElucHV0QXJndW1lbnRzAQGqJAAuAESqJAAAlgEAAAABACoBAUYAAAAKAAAASXRlcmF0aW9u\" +\n           \"cwAH/////wAAAAADAAAAACUAAABUaGUgbnVtYmVyIG9mIG5ldyB2YWx1ZXMgdG8gZ2VuZXJhdGUuAQAo\" +\n           \"AQEAAAABAAAAAAAAAAEB/////wAAAAAEYIAKAQAAAAEADQAAAEN5Y2xlQ29tcGxldGUBAaskAC8BAEEL\" +\n           \"qyQAAAEAAAAAJAEBAackFwAAABVgiQoCAAAAAAAHAAAARXZlbnRJZAEBrCQALgBErCQAAAAP/////wEB\" +\n           \"/////wAAAAAVYIkKAgAAAAAACQAAAEV2ZW50VHlwZQEBrSQALgBErSQAAAAR/////wEB/////wAAAAAV\" +\n           \"YIkKAgAAAAAACgAAAFNvdXJjZU5vZGUBAa4kAC4ARK4kAAAAEf////8BAf////8AAAAAFWCJCgIAAAAA\" +\n           \"AAoAAABTb3VyY2VOYW1lAQGvJAAuAESvJAAAAAz/////AQH/////AAAAABVgiQoCAAAAAAAEAAAAVGlt\" +\n           \"ZQEBsCQALgBEsCQAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAALAAAAUmVjZWl2ZVRpbWUBAbEk\" +\n           \"AC4ARLEkAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAABwAAAE1lc3NhZ2UBAbMkAC4ARLMkAAAA\" +\n           \"Ff////8BAf////8AAAAAFWCJCgIAAAAAAAgAAABTZXZlcml0eQEBtCQALgBEtCQAAAAF/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAAEAAAAENvbmRpdGlvbkNsYXNzSWQBATotAC4ARDotAAAAEf////8BAf////8A\" +\n           \"AAAAFWCJCgIAAAAAABIAAABDb25kaXRpb25DbGFzc05hbWUBATstAC4ARDstAAAAFf////8BAf////8A\" +\n           \"AAAAFWCJCgIAAAAAAA0AAABDb25kaXRpb25OYW1lAQElLQAuAEQlLQAAAAz/////AQH/////AAAAABVg\" +\n           \"iQoCAAAAAAAIAAAAQnJhbmNoSWQBAbUkAC4ARLUkAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAYA\" +\n           \"AABSZXRhaW4BAbYkAC4ARLYkAAAAAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABFbmFibGVkU3Rh\" +\n           \"dGUBAbckAC8BACMjtyQAAAAV/////wEBAgAAAAEALCMAAQHMJAEALCMAAQHUJAEAAAAVYIkKAgAAAAAA\" +\n           \"AgAAAElkAQG4JAAuAES4JAAAAAH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAAUXVhbGl0eQEBvSQA\" +\n           \"LwEAKiO9JAAAABP/////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1wAQG+JAAu\" +\n           \"AES+JAAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABMYXN0U2V2ZXJpdHkBAcEkAC8BACoj\" +\n           \"wSQAAAAF/////wEB/////wEAAAAVYIkKAgAAAAAADwAAAFNvdXJjZVRpbWVzdGFtcAEBwiQALgBEwiQA\" +\n           \"AAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAAQ29tbWVudAEBwyQALwEAKiPDJAAAABX/////\" +\n           \"AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1wAQHEJAAuAETEJAAAAQAmAf////8B\" +\n           \"Af////8AAAAAFWCJCgIAAAAAAAwAAABDbGllbnRVc2VySWQBAcUkAC4ARMUkAAAADP////8BAf////8A\" +\n           \"AAAABGGCCgQAAAAAAAcAAABEaXNhYmxlAQHHJAAvAQBEI8ckAAABAQEAAAABAPkLAAEA8woAAAAABGGC\" +\n           \"CgQAAAAAAAYAAABFbmFibGUBAcYkAC8BAEMjxiQAAAEBAQAAAAEA+QsAAQDzCgAAAAAEYYIKBAAAAAAA\" +\n           \"CgAAAEFkZENvbW1lbnQBAcgkAC8BAEUjyCQAAAEBAQAAAAEA+QsAAQANCwEAAAAXYKkKAgAAAAAADgAA\" +\n           \"AElucHV0QXJndW1lbnRzAQHJJAAuAETJJAAAlgIAAAABACoBAUYAAAAHAAAARXZlbnRJZAAP/////wAA\" +\n           \"AAADAAAAACgAAABUaGUgaWRlbnRpZmllciBmb3IgdGhlIGV2ZW50IHRvIGNvbW1lbnQuAQAqAQFCAAAA\" +\n           \"BwAAAENvbW1lbnQAFf////8AAAAAAwAAAAAkAAAAVGhlIGNvbW1lbnQgdG8gYWRkIHRvIHRoZSBjb25k\" +\n           \"aXRpb24uAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAVYIkKAgAAAAAACgAAAEFja2VkU3RhdGUBAcwk\" +\n           \"AC8BACMjzCQAAAAV/////wEBAQAAAAEALCMBAQG3JAEAAAAVYIkKAgAAAAAAAgAAAElkAQHNJAAuAETN\" +\n           \"JAAAAAH/////AQH/////AAAAAARhggoEAAAAAAALAAAAQWNrbm93bGVkZ2UBAdwkAC8BAJcj3CQAAAEB\" +\n           \"AQAAAAEA+QsAAQDwIgEAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQHdJAAuAETdJAAAlgIA\" +\n           \"AAABACoBAUYAAAAHAAAARXZlbnRJZAAP/////wAAAAADAAAAACgAAABUaGUgaWRlbnRpZmllciBmb3Ig\" +\n           \"dGhlIGV2ZW50IHRvIGNvbW1lbnQuAQAqAQFCAAAABwAAAENvbW1lbnQAFf////8AAAAAAwAAAAAkAAAA\" +\n           \"VGhlIGNvbW1lbnQgdG8gYWRkIHRvIHRoZSBjb25kaXRpb24uAQAoAQEAAAABAAAAAAAAAAEB/////wAA\" +\n           \"AAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public PropertyState<bool> SimulationActive\n        {\n            get => m_simulationActive;\n\n            set\n            {\n                if (!ReferenceEquals(m_simulationActive, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_simulationActive = value;\n            }\n        }\n\n        /// <remarks />\n        public GenerateValuesMethodState GenerateValues\n        {\n            get => m_generateValuesMethod;\n\n            set\n            {\n                if (!ReferenceEquals(m_generateValuesMethod, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_generateValuesMethod = value;\n            }\n        }\n\n        /// <remarks />\n        public AcknowledgeableConditionState CycleComplete\n        {\n            get => m_cycleComplete;\n\n            set\n            {\n                if (!ReferenceEquals(m_cycleComplete, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_cycleComplete = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_simulationActive != null)\n            {\n                children.Add(m_simulationActive);\n            }\n\n            if (m_generateValuesMethod != null)\n            {\n                children.Add(m_generateValuesMethod);\n            }\n\n            if (m_cycleComplete != null)\n            {\n                children.Add(m_cycleComplete);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.SimulationActive:\n                    {\n                        if (createOrReplace && SimulationActive == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SimulationActive = new PropertyState<bool>(this);\n                            }\n                            else\n                            {\n                                SimulationActive = (PropertyState<bool>)replacement;\n                            }\n                        }\n\n                        instance = SimulationActive;\n                        break;\n                    }\n\n                case BrowseNames.GenerateValues:\n                    {\n                        if (createOrReplace && GenerateValues == null)\n                        {\n                            if (replacement == null)\n                            {\n                                GenerateValues = new GenerateValuesMethodState(this);\n                            }\n                            else\n                            {\n                                GenerateValues = (GenerateValuesMethodState)replacement;\n                            }\n                        }\n\n                        instance = GenerateValues;\n                        break;\n                    }\n\n                case BrowseNames.CycleComplete:\n                    {\n                        if (createOrReplace && CycleComplete == null)\n                        {\n                            if (replacement == null)\n                            {\n                                CycleComplete = new AcknowledgeableConditionState(this);\n                            }\n                            else\n                            {\n                                CycleComplete = (AcknowledgeableConditionState)replacement;\n                            }\n                        }\n\n                        instance = CycleComplete;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<bool> m_simulationActive;\n        private GenerateValuesMethodState m_generateValuesMethod;\n        private AcknowledgeableConditionState m_cycleComplete;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ScalarValue1MethodState Class\n#if (!OPCUA_EXCLUDE_ScalarValue1MethodState)\n    /// <summary>\n    /// Stores an instance of the ScalarValue1MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ScalarValue1MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public ScalarValue1MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ScalarValue1MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABYAAABTY2FsYXJWYWx1\" +\n           \"ZTFNZXRob2RUeXBlAQHhJAAvAQHhJOEkAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3Vt\" +\n           \"ZW50cwEB4iQALgBE4iQAAJYLAAAAAQAqAQEYAAAACQAAAEJvb2xlYW5JbgAB/////wAAAAAAAQAqAQEW\" +\n           \"AAAABwAAAFNCeXRlSW4AAv////8AAAAAAAEAKgEBFQAAAAYAAABCeXRlSW4AA/////8AAAAAAAEAKgEB\" +\n           \"FgAAAAcAAABJbnQxNkluAAT/////AAAAAAABACoBARcAAAAIAAAAVUludDE2SW4ABf////8AAAAAAAEA\" +\n           \"KgEBFgAAAAcAAABJbnQzMkluAAb/////AAAAAAABACoBARcAAAAIAAAAVUludDMySW4AB/////8AAAAA\" +\n           \"AAEAKgEBFgAAAAcAAABJbnQ2NEluAAj/////AAAAAAABACoBARcAAAAIAAAAVUludDY0SW4ACf////8A\" +\n           \"AAAAAAEAKgEBFgAAAAcAAABGbG9hdEluAAr/////AAAAAAABACoBARcAAAAIAAAARG91YmxlSW4AC///\" +\n           \"//8AAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVu\" +\n           \"dHMBAeMkAC4AROMkAACWCwAAAAEAKgEBGQAAAAoAAABCb29sZWFuT3V0AAH/////AAAAAAABACoBARcA\" +\n           \"AAAIAAAAU0J5dGVPdXQAAv////8AAAAAAAEAKgEBFgAAAAcAAABCeXRlT3V0AAP/////AAAAAAABACoB\" +\n           \"ARcAAAAIAAAASW50MTZPdXQABP////8AAAAAAAEAKgEBGAAAAAkAAABVSW50MTZPdXQABf////8AAAAA\" +\n           \"AAEAKgEBFwAAAAgAAABJbnQzMk91dAAG/////wAAAAAAAQAqAQEYAAAACQAAAFVJbnQzMk91dAAH////\" +\n           \"/wAAAAAAAQAqAQEXAAAACAAAAEludDY0T3V0AAj/////AAAAAAABACoBARgAAAAJAAAAVUludDY0T3V0\" +\n           \"AAn/////AAAAAAABACoBARcAAAAIAAAARmxvYXRPdXQACv////8AAAAAAAEAKgEBGAAAAAkAAABEb3Vi\" +\n           \"bGVPdXQAC/////8AAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public ScalarValue1MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            bool booleanIn = (bool)_inputArguments[0];\n            sbyte sByteIn = (sbyte)_inputArguments[1];\n            byte byteIn = (byte)_inputArguments[2];\n            short int16In = (short)_inputArguments[3];\n            ushort uInt16In = (ushort)_inputArguments[4];\n            int int32In = (int)_inputArguments[5];\n            uint uInt32In = (uint)_inputArguments[6];\n            long int64In = (long)_inputArguments[7];\n            ulong uInt64In = (ulong)_inputArguments[8];\n            float floatIn = (float)_inputArguments[9];\n            double doubleIn = (double)_inputArguments[10];\n\n            bool booleanOut = (bool)_outputArguments[0];\n            sbyte sByteOut = (sbyte)_outputArguments[1];\n            byte byteOut = (byte)_outputArguments[2];\n            short int16Out = (short)_outputArguments[3];\n            ushort uInt16Out = (ushort)_outputArguments[4];\n            int int32Out = (int)_outputArguments[5];\n            uint uInt32Out = (uint)_outputArguments[6];\n            long int64Out = (long)_outputArguments[7];\n            ulong uInt64Out = (ulong)_outputArguments[8];\n            float floatOut = (float)_outputArguments[9];\n            double doubleOut = (double)_outputArguments[10];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    booleanIn,\n                    sByteIn,\n                    byteIn,\n                    int16In,\n                    uInt16In,\n                    int32In,\n                    uInt32In,\n                    int64In,\n                    uInt64In,\n                    floatIn,\n                    doubleIn,\n                    ref booleanOut,\n                    ref sByteOut,\n                    ref byteOut,\n                    ref int16Out,\n                    ref uInt16Out,\n                    ref int32Out,\n                    ref uInt32Out,\n                    ref int64Out,\n                    ref uInt64Out,\n                    ref floatOut,\n                    ref doubleOut);\n            }\n\n            _outputArguments[0] = booleanOut;\n            _outputArguments[1] = sByteOut;\n            _outputArguments[2] = byteOut;\n            _outputArguments[3] = int16Out;\n            _outputArguments[4] = uInt16Out;\n            _outputArguments[5] = int32Out;\n            _outputArguments[6] = uInt32Out;\n            _outputArguments[7] = int64Out;\n            _outputArguments[8] = uInt64Out;\n            _outputArguments[9] = floatOut;\n            _outputArguments[10] = doubleOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"booleanIn\"></param>\n    /// <param name=\"sByteIn\"></param>\n    /// <param name=\"byteIn\"></param>\n    /// <param name=\"int16In\"></param>\n    /// <param name=\"uInt16In\"></param>\n    /// <param name=\"int32In\"></param>\n    /// <param name=\"uInt32In\"></param>\n    /// <param name=\"int64In\"></param>\n    /// <param name=\"uInt64In\"></param>\n    /// <param name=\"floatIn\"></param>\n    /// <param name=\"doubleIn\"></param>\n    /// <param name=\"booleanOut\"></param>\n    /// <param name=\"sByteOut\"></param>\n    /// <param name=\"byteOut\"></param>\n    /// <param name=\"int16Out\"></param>\n    /// <param name=\"uInt16Out\"></param>\n    /// <param name=\"int32Out\"></param>\n    /// <param name=\"uInt32Out\"></param>\n    /// <param name=\"int64Out\"></param>\n    /// <param name=\"uInt64Out\"></param>\n    /// <param name=\"floatOut\"></param>\n    /// <param name=\"doubleOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult ScalarValue1MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        bool booleanIn,\n        sbyte sByteIn,\n        byte byteIn,\n        short int16In,\n        ushort uInt16In,\n        int int32In,\n        uint uInt32In,\n        long int64In,\n        ulong uInt64In,\n        float floatIn,\n        double doubleIn,\n        ref bool booleanOut,\n        ref sbyte sByteOut,\n        ref byte byteOut,\n        ref short int16Out,\n        ref ushort uInt16Out,\n        ref int int32Out,\n        ref uint uInt32Out,\n        ref long int64Out,\n        ref ulong uInt64Out,\n        ref float floatOut,\n        ref double doubleOut);\n#endif\n    #endregion\n\n    #region ScalarValue2MethodState Class\n#if (!OPCUA_EXCLUDE_ScalarValue2MethodState)\n    /// <summary>\n    /// Stores an instance of the ScalarValue2MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ScalarValue2MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public ScalarValue2MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ScalarValue2MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABYAAABTY2FsYXJWYWx1\" +\n           \"ZTJNZXRob2RUeXBlAQHkJAAvAQHkJOQkAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3Vt\" +\n           \"ZW50cwEB5SQALgBE5SQAAJYKAAAAAQAqAQEXAAAACAAAAFN0cmluZ0luAAz/////AAAAAAABACoBARkA\" +\n           \"AAAKAAAARGF0ZVRpbWVJbgAN/////wAAAAAAAQAqAQEVAAAABgAAAEd1aWRJbgAO/////wAAAAAAAQAq\" +\n           \"AQEbAAAADAAAAEJ5dGVTdHJpbmdJbgAP/////wAAAAAAAQAqAQEbAAAADAAAAFhtbEVsZW1lbnRJbgAQ\" +\n           \"/////wAAAAAAAQAqAQEXAAAACAAAAE5vZGVJZEluABH/////AAAAAAABACoBAR8AAAAQAAAARXhwYW5k\" +\n           \"ZWROb2RlSWRJbgAS/////wAAAAAAAQAqAQEeAAAADwAAAFF1YWxpZmllZE5hbWVJbgAU/////wAAAAAA\" +\n           \"AQAqAQEeAAAADwAAAExvY2FsaXplZFRleHRJbgAV/////wAAAAAAAQAqAQEbAAAADAAAAFN0YXR1c0Nv\" +\n           \"ZGVJbgAT/////wAAAAAAAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1\" +\n           \"dEFyZ3VtZW50cwEB5iQALgBE5iQAAJYKAAAAAQAqAQEYAAAACQAAAFN0cmluZ091dAAM/////wAAAAAA\" +\n           \"AQAqAQEaAAAACwAAAERhdGVUaW1lT3V0AA3/////AAAAAAABACoBARYAAAAHAAAAR3VpZE91dAAO////\" +\n           \"/wAAAAAAAQAqAQEcAAAADQAAAEJ5dGVTdHJpbmdPdXQAD/////8AAAAAAAEAKgEBHAAAAA0AAABYbWxF\" +\n           \"bGVtZW50T3V0ABD/////AAAAAAABACoBARgAAAAJAAAATm9kZUlkT3V0ABH/////AAAAAAABACoBASAA\" +\n           \"AAARAAAARXhwYW5kZWROb2RlSWRPdXQAEv////8AAAAAAAEAKgEBHwAAABAAAABRdWFsaWZpZWROYW1l\" +\n           \"T3V0ABT/////AAAAAAABACoBAR8AAAAQAAAATG9jYWxpemVkVGV4dE91dAAV/////wAAAAAAAQAqAQEc\" +\n           \"AAAADQAAAFN0YXR1c0NvZGVPdXQAE/////8AAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public ScalarValue2MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            string stringIn = (string)_inputArguments[0];\n            DateTime dateTimeIn = (DateTime)_inputArguments[1];\n            Uuid guidIn = (Uuid)_inputArguments[2];\n            byte[] byteStringIn = (byte[])_inputArguments[3];\n            XmlElement xmlElementIn = (XmlElement)_inputArguments[4];\n            NodeId nodeIdIn = (NodeId)_inputArguments[5];\n            ExpandedNodeId expandedNodeIdIn = (ExpandedNodeId)_inputArguments[6];\n            QualifiedName qualifiedNameIn = (QualifiedName)_inputArguments[7];\n            LocalizedText localizedTextIn = (LocalizedText)_inputArguments[8];\n            StatusCode statusCodeIn = (StatusCode)_inputArguments[9];\n\n            string stringOut = (string)_outputArguments[0];\n            DateTime dateTimeOut = (DateTime)_outputArguments[1];\n            Uuid guidOut = (Uuid)_outputArguments[2];\n            byte[] byteStringOut = (byte[])_outputArguments[3];\n            XmlElement xmlElementOut = (XmlElement)_outputArguments[4];\n            NodeId nodeIdOut = (NodeId)_outputArguments[5];\n            ExpandedNodeId expandedNodeIdOut = (ExpandedNodeId)_outputArguments[6];\n            QualifiedName qualifiedNameOut = (QualifiedName)_outputArguments[7];\n            LocalizedText localizedTextOut = (LocalizedText)_outputArguments[8];\n            StatusCode statusCodeOut = (StatusCode)_outputArguments[9];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    stringIn,\n                    dateTimeIn,\n                    guidIn,\n                    byteStringIn,\n                    xmlElementIn,\n                    nodeIdIn,\n                    expandedNodeIdIn,\n                    qualifiedNameIn,\n                    localizedTextIn,\n                    statusCodeIn,\n                    ref stringOut,\n                    ref dateTimeOut,\n                    ref guidOut,\n                    ref byteStringOut,\n                    ref xmlElementOut,\n                    ref nodeIdOut,\n                    ref expandedNodeIdOut,\n                    ref qualifiedNameOut,\n                    ref localizedTextOut,\n                    ref statusCodeOut);\n            }\n\n            _outputArguments[0] = stringOut;\n            _outputArguments[1] = dateTimeOut;\n            _outputArguments[2] = guidOut;\n            _outputArguments[3] = byteStringOut;\n            _outputArguments[4] = xmlElementOut;\n            _outputArguments[5] = nodeIdOut;\n            _outputArguments[6] = expandedNodeIdOut;\n            _outputArguments[7] = qualifiedNameOut;\n            _outputArguments[8] = localizedTextOut;\n            _outputArguments[9] = statusCodeOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"stringIn\"></param>\n    /// <param name=\"dateTimeIn\"></param>\n    /// <param name=\"guidIn\"></param>\n    /// <param name=\"byteStringIn\"></param>\n    /// <param name=\"xmlElementIn\"></param>\n    /// <param name=\"nodeIdIn\"></param>\n    /// <param name=\"expandedNodeIdIn\"></param>\n    /// <param name=\"qualifiedNameIn\"></param>\n    /// <param name=\"localizedTextIn\"></param>\n    /// <param name=\"statusCodeIn\"></param>\n    /// <param name=\"stringOut\"></param>\n    /// <param name=\"dateTimeOut\"></param>\n    /// <param name=\"guidOut\"></param>\n    /// <param name=\"byteStringOut\"></param>\n    /// <param name=\"xmlElementOut\"></param>\n    /// <param name=\"nodeIdOut\"></param>\n    /// <param name=\"expandedNodeIdOut\"></param>\n    /// <param name=\"qualifiedNameOut\"></param>\n    /// <param name=\"localizedTextOut\"></param>\n    /// <param name=\"statusCodeOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult ScalarValue2MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string stringIn,\n        DateTime dateTimeIn,\n        Uuid guidIn,\n        byte[] byteStringIn,\n        XmlElement xmlElementIn,\n        NodeId nodeIdIn,\n        ExpandedNodeId expandedNodeIdIn,\n        QualifiedName qualifiedNameIn,\n        LocalizedText localizedTextIn,\n        StatusCode statusCodeIn,\n        ref string stringOut,\n        ref DateTime dateTimeOut,\n        ref Uuid guidOut,\n        ref byte[] byteStringOut,\n        ref XmlElement xmlElementOut,\n        ref NodeId nodeIdOut,\n        ref ExpandedNodeId expandedNodeIdOut,\n        ref QualifiedName qualifiedNameOut,\n        ref LocalizedText localizedTextOut,\n        ref StatusCode statusCodeOut);\n#endif\n    #endregion\n\n    #region ScalarValue3MethodState Class\n#if (!OPCUA_EXCLUDE_ScalarValue3MethodState)\n    /// <summary>\n    /// Stores an instance of the ScalarValue3MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ScalarValue3MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public ScalarValue3MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ScalarValue3MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABYAAABTY2FsYXJWYWx1\" +\n           \"ZTNNZXRob2RUeXBlAQHnJAAvAQHnJOckAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3Vt\" +\n           \"ZW50cwEB6CQALgBE6CQAAJYDAAAAAQAqAQEYAAAACQAAAFZhcmlhbnRJbgAY/////wAAAAAAAQAqAQEc\" +\n           \"AAAADQAAAEVudW1lcmF0aW9uSW4AHf////8AAAAAAAEAKgEBGgAAAAsAAABTdHJ1Y3R1cmVJbgAW////\" +\n           \"/wAAAAAAAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50\" +\n           \"cwEB6SQALgBE6SQAAJYDAAAAAQAqAQEZAAAACgAAAFZhcmlhbnRPdXQAGP////8AAAAAAAEAKgEBHQAA\" +\n           \"AA4AAABFbnVtZXJhdGlvbk91dAAd/////wAAAAAAAQAqAQEbAAAADAAAAFN0cnVjdHVyZU91dAAW////\" +\n           \"/wAAAAAAAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public ScalarValue3MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            object variantIn = (object)_inputArguments[0];\n            int enumerationIn = (int)_inputArguments[1];\n            ExtensionObject structureIn = (ExtensionObject)_inputArguments[2];\n\n            object variantOut = (object)_outputArguments[0];\n            int enumerationOut = (int)_outputArguments[1];\n            ExtensionObject structureOut = (ExtensionObject)_outputArguments[2];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    variantIn,\n                    enumerationIn,\n                    structureIn,\n                    ref variantOut,\n                    ref enumerationOut,\n                    ref structureOut);\n            }\n\n            _outputArguments[0] = variantOut;\n            _outputArguments[1] = enumerationOut;\n            _outputArguments[2] = structureOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"variantIn\"></param>\n    /// <param name=\"enumerationIn\"></param>\n    /// <param name=\"structureIn\"></param>\n    /// <param name=\"variantOut\"></param>\n    /// <param name=\"enumerationOut\"></param>\n    /// <param name=\"structureOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult ScalarValue3MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        object variantIn,\n        int enumerationIn,\n        ExtensionObject structureIn,\n        ref object variantOut,\n        ref int enumerationOut,\n        ref ExtensionObject structureOut);\n#endif\n    #endregion\n\n    #region ScalarValueObjectState Class\n#if (!OPCUA_EXCLUDE_ScalarValueObjectState)\n    /// <summary>\n    /// Stores an instance of the ScalarValueObjectType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ScalarValueObjectState : TestDataObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public ScalarValueObjectState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.ScalarValueObjectType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABAB0AAABTY2FsYXJWYWx1\" +\n           \"ZU9iamVjdFR5cGVJbnN0YW5jZQEB6iQBAeok6iQAAAEAAAAAJAABAe4kHgAAADVgiQoCAAAAAQAQAAAA\" +\n           \"U2ltdWxhdGlvbkFjdGl2ZQEB6yQDAAAAAEcAAABJZiB0cnVlIHRoZSBzZXJ2ZXIgd2lsbCBwcm9kdWNl\" +\n           \"IG5ldyB2YWx1ZXMgZm9yIGVhY2ggbW9uaXRvcmVkIHZhcmlhYmxlLgAuAETrJAAAAAH/////AQH/////\" +\n           \"AAAAAARhggoEAAAAAQAOAAAAR2VuZXJhdGVWYWx1ZXMBAewkAC8BAakk7CQAAAEB/////wEAAAAXYKkK\" +\n           \"AgAAAAAADgAAAElucHV0QXJndW1lbnRzAQHtJAAuAETtJAAAlgEAAAABACoBAUYAAAAKAAAASXRlcmF0\" +\n           \"aW9ucwAH/////wAAAAADAAAAACUAAABUaGUgbnVtYmVyIG9mIG5ldyB2YWx1ZXMgdG8gZ2VuZXJhdGUu\" +\n           \"AQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAEYIAKAQAAAAEADQAAAEN5Y2xlQ29tcGxldGUBAe4kAC8B\" +\n           \"AEEL7iQAAAEAAAAAJAEBAeokFwAAABVgiQoCAAAAAAAHAAAARXZlbnRJZAEB7yQALgBE7yQAAAAP////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAAACQAAAEV2ZW50VHlwZQEB8CQALgBE8CQAAAAR/////wEB/////wAA\" +\n           \"AAAVYIkKAgAAAAAACgAAAFNvdXJjZU5vZGUBAfEkAC4ARPEkAAAAEf////8BAf////8AAAAAFWCJCgIA\" +\n           \"AAAAAAoAAABTb3VyY2VOYW1lAQHyJAAuAETyJAAAAAz/////AQH/////AAAAABVgiQoCAAAAAAAEAAAA\" +\n           \"VGltZQEB8yQALgBE8yQAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAALAAAAUmVjZWl2ZVRpbWUB\" +\n           \"AfQkAC4ARPQkAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAABwAAAE1lc3NhZ2UBAfYkAC4ARPYk\" +\n           \"AAAAFf////8BAf////8AAAAAFWCJCgIAAAAAAAgAAABTZXZlcml0eQEB9yQALgBE9yQAAAAF/////wEB\" +\n           \"/////wAAAAAVYIkKAgAAAAAAEAAAAENvbmRpdGlvbkNsYXNzSWQBATwtAC4ARDwtAAAAEf////8BAf//\" +\n           \"//8AAAAAFWCJCgIAAAAAABIAAABDb25kaXRpb25DbGFzc05hbWUBAT0tAC4ARD0tAAAAFf////8BAf//\" +\n           \"//8AAAAAFWCJCgIAAAAAAA0AAABDb25kaXRpb25OYW1lAQEmLQAuAEQmLQAAAAz/////AQH/////AAAA\" +\n           \"ABVgiQoCAAAAAAAIAAAAQnJhbmNoSWQBAfgkAC4ARPgkAAAAEf////8BAf////8AAAAAFWCJCgIAAAAA\" +\n           \"AAYAAABSZXRhaW4BAfkkAC4ARPkkAAAAAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABFbmFibGVk\" +\n           \"U3RhdGUBAfokAC8BACMj+iQAAAAV/////wEBAgAAAAEALCMAAQEPJQEALCMAAQEXJQEAAAAVYIkKAgAA\" +\n           \"AAAAAgAAAElkAQH7JAAuAET7JAAAAAH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAAUXVhbGl0eQEB\" +\n           \"ACUALwEAKiMAJQAAABP/////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1wAQEB\" +\n           \"JQAuAEQBJQAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABMYXN0U2V2ZXJpdHkBAQQlAC8B\" +\n           \"ACojBCUAAAAF/////wEB/////wEAAAAVYIkKAgAAAAAADwAAAFNvdXJjZVRpbWVzdGFtcAEBBSUALgBE\" +\n           \"BSUAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAAQ29tbWVudAEBBiUALwEAKiMGJQAAABX/\" +\n           \"////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1wAQEHJQAuAEQHJQAAAQAmAf//\" +\n           \"//8BAf////8AAAAAFWCJCgIAAAAAAAwAAABDbGllbnRVc2VySWQBAQglAC4ARAglAAAADP////8BAf//\" +\n           \"//8AAAAABGGCCgQAAAAAAAcAAABEaXNhYmxlAQEKJQAvAQBEIwolAAABAQEAAAABAPkLAAEA8woAAAAA\" +\n           \"BGGCCgQAAAAAAAYAAABFbmFibGUBAQklAC8BAEMjCSUAAAEBAQAAAAEA+QsAAQDzCgAAAAAEYYIKBAAA\" +\n           \"AAAACgAAAEFkZENvbW1lbnQBAQslAC8BAEUjCyUAAAEBAQAAAAEA+QsAAQANCwEAAAAXYKkKAgAAAAAA\" +\n           \"DgAAAElucHV0QXJndW1lbnRzAQEMJQAuAEQMJQAAlgIAAAABACoBAUYAAAAHAAAARXZlbnRJZAAP////\" +\n           \"/wAAAAADAAAAACgAAABUaGUgaWRlbnRpZmllciBmb3IgdGhlIGV2ZW50IHRvIGNvbW1lbnQuAQAqAQFC\" +\n           \"AAAABwAAAENvbW1lbnQAFf////8AAAAAAwAAAAAkAAAAVGhlIGNvbW1lbnQgdG8gYWRkIHRvIHRoZSBj\" +\n           \"b25kaXRpb24uAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAVYIkKAgAAAAAACgAAAEFja2VkU3RhdGUB\" +\n           \"AQ8lAC8BACMjDyUAAAAV/////wEBAQAAAAEALCMBAQH6JAEAAAAVYIkKAgAAAAAAAgAAAElkAQEQJQAu\" +\n           \"AEQQJQAAAAH/////AQH/////AAAAAARhggoEAAAAAAALAAAAQWNrbm93bGVkZ2UBAR8lAC8BAJcjHyUA\" +\n           \"AAEBAQAAAAEA+QsAAQDwIgEAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQEgJQAuAEQgJQAA\" +\n           \"lgIAAAABACoBAUYAAAAHAAAARXZlbnRJZAAP/////wAAAAADAAAAACgAAABUaGUgaWRlbnRpZmllciBm\" +\n           \"b3IgdGhlIGV2ZW50IHRvIGNvbW1lbnQuAQAqAQFCAAAABwAAAENvbW1lbnQAFf////8AAAAAAwAAAAAk\" +\n           \"AAAAVGhlIGNvbW1lbnQgdG8gYWRkIHRvIHRoZSBjb25kaXRpb24uAQAoAQEAAAABAAAAAAAAAAEB////\" +\n           \"/wAAAAAVYIkKAgAAAAEADAAAAEJvb2xlYW5WYWx1ZQEBIyUALwA/IyUAAAAB/////wEB/////wAAAAAV\" +\n           \"YIkKAgAAAAEACgAAAFNCeXRlVmFsdWUBASQlAC8APyQlAAAAAv////8BAf////8AAAAAFWCJCgIAAAAB\" +\n           \"AAkAAABCeXRlVmFsdWUBASUlAC8APyUlAAAAA/////8BAf////8AAAAAFWCJCgIAAAABAAoAAABJbnQx\" +\n           \"NlZhbHVlAQEmJQAvAD8mJQAAAAT/////AQH/////AAAAABVgiQoCAAAAAQALAAAAVUludDE2VmFsdWUB\" +\n           \"ASclAC8APyclAAAABf////8BAf////8AAAAAFWCJCgIAAAABAAoAAABJbnQzMlZhbHVlAQEoJQAvAD8o\" +\n           \"JQAAAAb/////AQH/////AAAAABVgiQoCAAAAAQALAAAAVUludDMyVmFsdWUBASklAC8APyklAAAAB///\" +\n           \"//8BAf////8AAAAAFWCJCgIAAAABAAoAAABJbnQ2NFZhbHVlAQEqJQAvAD8qJQAAAAj/////AQH/////\" +\n           \"AAAAABVgiQoCAAAAAQALAAAAVUludDY0VmFsdWUBASslAC8APyslAAAACf////8BAf////8AAAAAFWCJ\" +\n           \"CgIAAAABAAoAAABGbG9hdFZhbHVlAQEsJQAvAD8sJQAAAAr/////AQH/////AAAAABVgiQoCAAAAAQAL\" +\n           \"AAAARG91YmxlVmFsdWUBAS0lAC8APy0lAAAAC/////8BAf////8AAAAAFWCJCgIAAAABAAsAAABTdHJp\" +\n           \"bmdWYWx1ZQEBLiUALwA/LiUAAAAM/////wEB/////wAAAAAVYIkKAgAAAAEADQAAAERhdGVUaW1lVmFs\" +\n           \"dWUBAS8lAC8APy8lAAAADf////8BAf////8AAAAAFWCJCgIAAAABAAkAAABHdWlkVmFsdWUBATAlAC8A\" +\n           \"PzAlAAAADv////8BAf////8AAAAAFWCJCgIAAAABAA8AAABCeXRlU3RyaW5nVmFsdWUBATElAC8APzEl\" +\n           \"AAAAD/////8BAf////8AAAAAFWCJCgIAAAABAA8AAABYbWxFbGVtZW50VmFsdWUBATIlAC8APzIlAAAA\" +\n           \"EP////8BAf////8AAAAAFWCJCgIAAAABAAsAAABOb2RlSWRWYWx1ZQEBMyUALwA/MyUAAAAR/////wEB\" +\n           \"/////wAAAAAVYIkKAgAAAAEAEwAAAEV4cGFuZGVkTm9kZUlkVmFsdWUBATQlAC8APzQlAAAAEv////8B\" +\n           \"Af////8AAAAAFWCJCgIAAAABABIAAABRdWFsaWZpZWROYW1lVmFsdWUBATUlAC8APzUlAAAAFP////8B\" +\n           \"Af////8AAAAAFWCJCgIAAAABABIAAABMb2NhbGl6ZWRUZXh0VmFsdWUBATYlAC8APzYlAAAAFf////8B\" +\n           \"Af////8AAAAAFWCJCgIAAAABAA8AAABTdGF0dXNDb2RlVmFsdWUBATclAC8APzclAAAAE/////8BAf//\" +\n           \"//8AAAAAFWCJCgIAAAABAAwAAABWYXJpYW50VmFsdWUBATglAC8APzglAAAAGP////8BAf////8AAAAA\" +\n           \"FWCJCgIAAAABABAAAABFbnVtZXJhdGlvblZhbHVlAQE5JQAvAD85JQAAAB3/////AQH/////AAAAABVg\" +\n           \"iQoCAAAAAQAOAAAAU3RydWN0dXJlVmFsdWUBATolAC8APzolAAAAFv////8BAf////8AAAAAFWCJCgIA\" +\n           \"AAABAAsAAABOdW1iZXJWYWx1ZQEBOyUALwA/OyUAAAAa/////wEB/////wAAAAAVYIkKAgAAAAEADAAA\" +\n           \"AEludGVnZXJWYWx1ZQEBPCUALwA/PCUAAAAb/////wEB/////wAAAAAVYIkKAgAAAAEADQAAAFVJbnRl\" +\n           \"Z2VyVmFsdWUBAT0lAC8APz0lAAAAHP////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public BaseDataVariableState<bool> BooleanValue\n        {\n            get => m_booleanValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_booleanValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_booleanValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<sbyte> SByteValue\n        {\n            get => m_sByteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_sByteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_sByteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<byte> ByteValue\n        {\n            get => m_byteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<short> Int16Value\n        {\n            get => m_int16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ushort> UInt16Value\n        {\n            get => m_uInt16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<int> Int32Value\n        {\n            get => m_int32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<uint> UInt32Value\n        {\n            get => m_uInt32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<long> Int64Value\n        {\n            get => m_int64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ulong> UInt64Value\n        {\n            get => m_uInt64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<float> FloatValue\n        {\n            get => m_floatValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_floatValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_floatValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<double> DoubleValue\n        {\n            get => m_doubleValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_doubleValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_doubleValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string> StringValue\n        {\n            get => m_stringValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_stringValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_stringValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<DateTime> DateTimeValue\n        {\n            get => m_dateTimeValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_dateTimeValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_dateTimeValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<Guid> GuidValue\n        {\n            get => m_guidValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_guidValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_guidValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<byte[]> ByteStringValue\n        {\n            get => m_byteStringValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteStringValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteStringValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<XmlElement> XmlElementValue\n        {\n            get => m_xmlElementValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_xmlElementValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_xmlElementValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<NodeId> NodeIdValue\n        {\n            get => m_nodeIdValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_nodeIdValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_nodeIdValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ExpandedNodeId> ExpandedNodeIdValue\n        {\n            get => m_expandedNodeIdValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_expandedNodeIdValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_expandedNodeIdValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<QualifiedName> QualifiedNameValue\n        {\n            get => m_qualifiedNameValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_qualifiedNameValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_qualifiedNameValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<LocalizedText> LocalizedTextValue\n        {\n            get => m_localizedTextValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_localizedTextValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_localizedTextValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<StatusCode> StatusCodeValue\n        {\n            get => m_statusCodeValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_statusCodeValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_statusCodeValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState VariantValue\n        {\n            get => m_variantValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_variantValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_variantValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<int> EnumerationValue\n        {\n            get => m_enumerationValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_enumerationValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_enumerationValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ExtensionObject> StructureValue\n        {\n            get => m_structureValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_structureValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_structureValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState NumberValue\n        {\n            get => m_numberValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_numberValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_numberValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState IntegerValue\n        {\n            get => m_integerValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_integerValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_integerValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState UIntegerValue\n        {\n            get => m_uIntegerValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_uIntegerValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uIntegerValue = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_booleanValue != null)\n            {\n                children.Add(m_booleanValue);\n            }\n\n            if (m_sByteValue != null)\n            {\n                children.Add(m_sByteValue);\n            }\n\n            if (m_byteValue != null)\n            {\n                children.Add(m_byteValue);\n            }\n\n            if (m_int16Value != null)\n            {\n                children.Add(m_int16Value);\n            }\n\n            if (m_uInt16Value != null)\n            {\n                children.Add(m_uInt16Value);\n            }\n\n            if (m_int32Value != null)\n            {\n                children.Add(m_int32Value);\n            }\n\n            if (m_uInt32Value != null)\n            {\n                children.Add(m_uInt32Value);\n            }\n\n            if (m_int64Value != null)\n            {\n                children.Add(m_int64Value);\n            }\n\n            if (m_uInt64Value != null)\n            {\n                children.Add(m_uInt64Value);\n            }\n\n            if (m_floatValue != null)\n            {\n                children.Add(m_floatValue);\n            }\n\n            if (m_doubleValue != null)\n            {\n                children.Add(m_doubleValue);\n            }\n\n            if (m_stringValue != null)\n            {\n                children.Add(m_stringValue);\n            }\n\n            if (m_dateTimeValue != null)\n            {\n                children.Add(m_dateTimeValue);\n            }\n\n            if (m_guidValue != null)\n            {\n                children.Add(m_guidValue);\n            }\n\n            if (m_byteStringValue != null)\n            {\n                children.Add(m_byteStringValue);\n            }\n\n            if (m_xmlElementValue != null)\n            {\n                children.Add(m_xmlElementValue);\n            }\n\n            if (m_nodeIdValue != null)\n            {\n                children.Add(m_nodeIdValue);\n            }\n\n            if (m_expandedNodeIdValue != null)\n            {\n                children.Add(m_expandedNodeIdValue);\n            }\n\n            if (m_qualifiedNameValue != null)\n            {\n                children.Add(m_qualifiedNameValue);\n            }\n\n            if (m_localizedTextValue != null)\n            {\n                children.Add(m_localizedTextValue);\n            }\n\n            if (m_statusCodeValue != null)\n            {\n                children.Add(m_statusCodeValue);\n            }\n\n            if (m_variantValue != null)\n            {\n                children.Add(m_variantValue);\n            }\n\n            if (m_enumerationValue != null)\n            {\n                children.Add(m_enumerationValue);\n            }\n\n            if (m_structureValue != null)\n            {\n                children.Add(m_structureValue);\n            }\n\n            if (m_numberValue != null)\n            {\n                children.Add(m_numberValue);\n            }\n\n            if (m_integerValue != null)\n            {\n                children.Add(m_integerValue);\n            }\n\n            if (m_uIntegerValue != null)\n            {\n                children.Add(m_uIntegerValue);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.BooleanValue:\n                    {\n                        if (createOrReplace && BooleanValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                BooleanValue = new BaseDataVariableState<bool>(this);\n                            }\n                            else\n                            {\n                                BooleanValue = (BaseDataVariableState<bool>)replacement;\n                            }\n                        }\n\n                        instance = BooleanValue;\n                        break;\n                    }\n\n                case BrowseNames.SByteValue:\n                    {\n                        if (createOrReplace && SByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SByteValue = new BaseDataVariableState<sbyte>(this);\n                            }\n                            else\n                            {\n                                SByteValue = (BaseDataVariableState<sbyte>)replacement;\n                            }\n                        }\n\n                        instance = SByteValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteValue:\n                    {\n                        if (createOrReplace && ByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteValue = new BaseDataVariableState<byte>(this);\n                            }\n                            else\n                            {\n                                ByteValue = (BaseDataVariableState<byte>)replacement;\n                            }\n                        }\n\n                        instance = ByteValue;\n                        break;\n                    }\n\n                case BrowseNames.Int16Value:\n                    {\n                        if (createOrReplace && Int16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int16Value = new BaseDataVariableState<short>(this);\n                            }\n                            else\n                            {\n                                Int16Value = (BaseDataVariableState<short>)replacement;\n                            }\n                        }\n\n                        instance = Int16Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt16Value:\n                    {\n                        if (createOrReplace && UInt16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt16Value = new BaseDataVariableState<ushort>(this);\n                            }\n                            else\n                            {\n                                UInt16Value = (BaseDataVariableState<ushort>)replacement;\n                            }\n                        }\n\n                        instance = UInt16Value;\n                        break;\n                    }\n\n                case BrowseNames.Int32Value:\n                    {\n                        if (createOrReplace && Int32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int32Value = new BaseDataVariableState<int>(this);\n                            }\n                            else\n                            {\n                                Int32Value = (BaseDataVariableState<int>)replacement;\n                            }\n                        }\n\n                        instance = Int32Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt32Value:\n                    {\n                        if (createOrReplace && UInt32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt32Value = new BaseDataVariableState<uint>(this);\n                            }\n                            else\n                            {\n                                UInt32Value = (BaseDataVariableState<uint>)replacement;\n                            }\n                        }\n\n                        instance = UInt32Value;\n                        break;\n                    }\n\n                case BrowseNames.Int64Value:\n                    {\n                        if (createOrReplace && Int64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int64Value = new BaseDataVariableState<long>(this);\n                            }\n                            else\n                            {\n                                Int64Value = (BaseDataVariableState<long>)replacement;\n                            }\n                        }\n\n                        instance = Int64Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt64Value:\n                    {\n                        if (createOrReplace && UInt64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt64Value = new BaseDataVariableState<ulong>(this);\n                            }\n                            else\n                            {\n                                UInt64Value = (BaseDataVariableState<ulong>)replacement;\n                            }\n                        }\n\n                        instance = UInt64Value;\n                        break;\n                    }\n\n                case BrowseNames.FloatValue:\n                    {\n                        if (createOrReplace && FloatValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                FloatValue = new BaseDataVariableState<float>(this);\n                            }\n                            else\n                            {\n                                FloatValue = (BaseDataVariableState<float>)replacement;\n                            }\n                        }\n\n                        instance = FloatValue;\n                        break;\n                    }\n\n                case BrowseNames.DoubleValue:\n                    {\n                        if (createOrReplace && DoubleValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DoubleValue = new BaseDataVariableState<double>(this);\n                            }\n                            else\n                            {\n                                DoubleValue = (BaseDataVariableState<double>)replacement;\n                            }\n                        }\n\n                        instance = DoubleValue;\n                        break;\n                    }\n\n                case BrowseNames.StringValue:\n                    {\n                        if (createOrReplace && StringValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StringValue = new BaseDataVariableState<string>(this);\n                            }\n                            else\n                            {\n                                StringValue = (BaseDataVariableState<string>)replacement;\n                            }\n                        }\n\n                        instance = StringValue;\n                        break;\n                    }\n\n                case BrowseNames.DateTimeValue:\n                    {\n                        if (createOrReplace && DateTimeValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DateTimeValue = new BaseDataVariableState<DateTime>(this);\n                            }\n                            else\n                            {\n                                DateTimeValue = (BaseDataVariableState<DateTime>)replacement;\n                            }\n                        }\n\n                        instance = DateTimeValue;\n                        break;\n                    }\n\n                case BrowseNames.GuidValue:\n                    {\n                        if (createOrReplace && GuidValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                GuidValue = new BaseDataVariableState<Guid>(this);\n                            }\n                            else\n                            {\n                                GuidValue = (BaseDataVariableState<Guid>)replacement;\n                            }\n                        }\n\n                        instance = GuidValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteStringValue:\n                    {\n                        if (createOrReplace && ByteStringValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteStringValue = new BaseDataVariableState<byte[]>(this);\n                            }\n                            else\n                            {\n                                ByteStringValue = (BaseDataVariableState<byte[]>)replacement;\n                            }\n                        }\n\n                        instance = ByteStringValue;\n                        break;\n                    }\n\n                case BrowseNames.XmlElementValue:\n                    {\n                        if (createOrReplace && XmlElementValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                XmlElementValue = new BaseDataVariableState<XmlElement>(this);\n                            }\n                            else\n                            {\n                                XmlElementValue = (BaseDataVariableState<XmlElement>)replacement;\n                            }\n                        }\n\n                        instance = XmlElementValue;\n                        break;\n                    }\n\n                case BrowseNames.NodeIdValue:\n                    {\n                        if (createOrReplace && NodeIdValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                NodeIdValue = new BaseDataVariableState<NodeId>(this);\n                            }\n                            else\n                            {\n                                NodeIdValue = (BaseDataVariableState<NodeId>)replacement;\n                            }\n                        }\n\n                        instance = NodeIdValue;\n                        break;\n                    }\n\n                case BrowseNames.ExpandedNodeIdValue:\n                    {\n                        if (createOrReplace && ExpandedNodeIdValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ExpandedNodeIdValue = new BaseDataVariableState<ExpandedNodeId>(this);\n                            }\n                            else\n                            {\n                                ExpandedNodeIdValue = (BaseDataVariableState<ExpandedNodeId>)replacement;\n                            }\n                        }\n\n                        instance = ExpandedNodeIdValue;\n                        break;\n                    }\n\n                case BrowseNames.QualifiedNameValue:\n                    {\n                        if (createOrReplace && QualifiedNameValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                QualifiedNameValue = new BaseDataVariableState<QualifiedName>(this);\n                            }\n                            else\n                            {\n                                QualifiedNameValue = (BaseDataVariableState<QualifiedName>)replacement;\n                            }\n                        }\n\n                        instance = QualifiedNameValue;\n                        break;\n                    }\n\n                case BrowseNames.LocalizedTextValue:\n                    {\n                        if (createOrReplace && LocalizedTextValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                LocalizedTextValue = new BaseDataVariableState<LocalizedText>(this);\n                            }\n                            else\n                            {\n                                LocalizedTextValue = (BaseDataVariableState<LocalizedText>)replacement;\n                            }\n                        }\n\n                        instance = LocalizedTextValue;\n                        break;\n                    }\n\n                case BrowseNames.StatusCodeValue:\n                    {\n                        if (createOrReplace && StatusCodeValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StatusCodeValue = new BaseDataVariableState<StatusCode>(this);\n                            }\n                            else\n                            {\n                                StatusCodeValue = (BaseDataVariableState<StatusCode>)replacement;\n                            }\n                        }\n\n                        instance = StatusCodeValue;\n                        break;\n                    }\n\n                case BrowseNames.VariantValue:\n                    {\n                        if (createOrReplace && VariantValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                VariantValue = new BaseDataVariableState(this);\n                            }\n                            else\n                            {\n                                VariantValue = (BaseDataVariableState)replacement;\n                            }\n                        }\n\n                        instance = VariantValue;\n                        break;\n                    }\n\n                case BrowseNames.EnumerationValue:\n                    {\n                        if (createOrReplace && EnumerationValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                EnumerationValue = new BaseDataVariableState<int>(this);\n                            }\n                            else\n                            {\n                                EnumerationValue = (BaseDataVariableState<int>)replacement;\n                            }\n                        }\n\n                        instance = EnumerationValue;\n                        break;\n                    }\n\n                case BrowseNames.StructureValue:\n                    {\n                        if (createOrReplace && StructureValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StructureValue = new BaseDataVariableState<ExtensionObject>(this);\n                            }\n                            else\n                            {\n                                StructureValue = (BaseDataVariableState<ExtensionObject>)replacement;\n                            }\n                        }\n\n                        instance = StructureValue;\n                        break;\n                    }\n\n                case BrowseNames.NumberValue:\n                    {\n                        if (createOrReplace && NumberValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                NumberValue = new BaseDataVariableState(this);\n                            }\n                            else\n                            {\n                                NumberValue = (BaseDataVariableState)replacement;\n                            }\n                        }\n\n                        instance = NumberValue;\n                        break;\n                    }\n\n                case BrowseNames.IntegerValue:\n                    {\n                        if (createOrReplace && IntegerValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                IntegerValue = new BaseDataVariableState(this);\n                            }\n                            else\n                            {\n                                IntegerValue = (BaseDataVariableState)replacement;\n                            }\n                        }\n\n                        instance = IntegerValue;\n                        break;\n                    }\n\n                case BrowseNames.UIntegerValue:\n                    {\n                        if (createOrReplace && UIntegerValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UIntegerValue = new BaseDataVariableState(this);\n                            }\n                            else\n                            {\n                                UIntegerValue = (BaseDataVariableState)replacement;\n                            }\n                        }\n\n                        instance = UIntegerValue;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private BaseDataVariableState<bool> m_booleanValue;\n        private BaseDataVariableState<sbyte> m_sByteValue;\n        private BaseDataVariableState<byte> m_byteValue;\n        private BaseDataVariableState<short> m_int16Value;\n        private BaseDataVariableState<ushort> m_uInt16Value;\n        private BaseDataVariableState<int> m_int32Value;\n        private BaseDataVariableState<uint> m_uInt32Value;\n        private BaseDataVariableState<long> m_int64Value;\n        private BaseDataVariableState<ulong> m_uInt64Value;\n        private BaseDataVariableState<float> m_floatValue;\n        private BaseDataVariableState<double> m_doubleValue;\n        private BaseDataVariableState<string> m_stringValue;\n        private BaseDataVariableState<DateTime> m_dateTimeValue;\n        private BaseDataVariableState<Guid> m_guidValue;\n        private BaseDataVariableState<byte[]> m_byteStringValue;\n        private BaseDataVariableState<XmlElement> m_xmlElementValue;\n        private BaseDataVariableState<NodeId> m_nodeIdValue;\n        private BaseDataVariableState<ExpandedNodeId> m_expandedNodeIdValue;\n        private BaseDataVariableState<QualifiedName> m_qualifiedNameValue;\n        private BaseDataVariableState<LocalizedText> m_localizedTextValue;\n        private BaseDataVariableState<StatusCode> m_statusCodeValue;\n        private BaseDataVariableState m_variantValue;\n        private BaseDataVariableState<int> m_enumerationValue;\n        private BaseDataVariableState<ExtensionObject> m_structureValue;\n        private BaseDataVariableState m_numberValue;\n        private BaseDataVariableState m_integerValue;\n        private BaseDataVariableState m_uIntegerValue;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region AnalogScalarValueObjectState Class\n#if (!OPCUA_EXCLUDE_AnalogScalarValueObjectState)\n    /// <summary>\n    /// Stores an instance of the AnalogScalarValueObjectType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class AnalogScalarValueObjectState : TestDataObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public AnalogScalarValueObjectState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.AnalogScalarValueObjectType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABACMAAABBbmFsb2dTY2Fs\" +\n           \"YXJWYWx1ZU9iamVjdFR5cGVJbnN0YW5jZQEBPiUBAT4lPiUAAAEAAAAAJAABAUIlEAAAADVgiQoCAAAA\" +\n           \"AQAQAAAAU2ltdWxhdGlvbkFjdGl2ZQEBPyUDAAAAAEcAAABJZiB0cnVlIHRoZSBzZXJ2ZXIgd2lsbCBw\" +\n           \"cm9kdWNlIG5ldyB2YWx1ZXMgZm9yIGVhY2ggbW9uaXRvcmVkIHZhcmlhYmxlLgAuAEQ/JQAAAAH/////\" +\n           \"AQH/////AAAAAARhggoEAAAAAQAOAAAAR2VuZXJhdGVWYWx1ZXMBAUAlAC8BAakkQCUAAAEB/////wEA\" +\n           \"AAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQFBJQAuAERBJQAAlgEAAAABACoBAUYAAAAKAAAA\" +\n           \"SXRlcmF0aW9ucwAH/////wAAAAADAAAAACUAAABUaGUgbnVtYmVyIG9mIG5ldyB2YWx1ZXMgdG8gZ2Vu\" +\n           \"ZXJhdGUuAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAEYIAKAQAAAAEADQAAAEN5Y2xlQ29tcGxldGUB\" +\n           \"AUIlAC8BAEELQiUAAAEAAAAAJAEBAT4lFwAAABVgiQoCAAAAAAAHAAAARXZlbnRJZAEBQyUALgBEQyUA\" +\n           \"AAAP/////wEB/////wAAAAAVYIkKAgAAAAAACQAAAEV2ZW50VHlwZQEBRCUALgBERCUAAAAR/////wEB\" +\n           \"/////wAAAAAVYIkKAgAAAAAACgAAAFNvdXJjZU5vZGUBAUUlAC4AREUlAAAAEf////8BAf////8AAAAA\" +\n           \"FWCJCgIAAAAAAAoAAABTb3VyY2VOYW1lAQFGJQAuAERGJQAAAAz/////AQH/////AAAAABVgiQoCAAAA\" +\n           \"AAAEAAAAVGltZQEBRyUALgBERyUAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAALAAAAUmVjZWl2\" +\n           \"ZVRpbWUBAUglAC4AREglAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAABwAAAE1lc3NhZ2UBAUol\" +\n           \"AC4AREolAAAAFf////8BAf////8AAAAAFWCJCgIAAAAAAAgAAABTZXZlcml0eQEBSyUALgBESyUAAAAF\" +\n           \"/////wEB/////wAAAAAVYIkKAgAAAAAAEAAAAENvbmRpdGlvbkNsYXNzSWQBAT4tAC4ARD4tAAAAEf//\" +\n           \"//8BAf////8AAAAAFWCJCgIAAAAAABIAAABDb25kaXRpb25DbGFzc05hbWUBAT8tAC4ARD8tAAAAFf//\" +\n           \"//8BAf////8AAAAAFWCJCgIAAAAAAA0AAABDb25kaXRpb25OYW1lAQEnLQAuAEQnLQAAAAz/////AQH/\" +\n           \"////AAAAABVgiQoCAAAAAAAIAAAAQnJhbmNoSWQBAUwlAC4AREwlAAAAEf////8BAf////8AAAAAFWCJ\" +\n           \"CgIAAAAAAAYAAABSZXRhaW4BAU0lAC4ARE0lAAAAAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABF\" +\n           \"bmFibGVkU3RhdGUBAU4lAC8BACMjTiUAAAAV/////wEBAgAAAAEALCMAAQFjJQEALCMAAQFrJQEAAAAV\" +\n           \"YIkKAgAAAAAAAgAAAElkAQFPJQAuAERPJQAAAAH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAAUXVh\" +\n           \"bGl0eQEBVCUALwEAKiNUJQAAABP/////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0\" +\n           \"YW1wAQFVJQAuAERVJQAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABMYXN0U2V2ZXJpdHkB\" +\n           \"AVglAC8BACojWCUAAAAF/////wEB/////wEAAAAVYIkKAgAAAAAADwAAAFNvdXJjZVRpbWVzdGFtcAEB\" +\n           \"WSUALgBEWSUAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAAQ29tbWVudAEBWiUALwEAKiNa\" +\n           \"JQAAABX/////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1wAQFbJQAuAERbJQAA\" +\n           \"AQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABDbGllbnRVc2VySWQBAVwlAC4ARFwlAAAADP//\" +\n           \"//8BAf////8AAAAABGGCCgQAAAAAAAcAAABEaXNhYmxlAQFeJQAvAQBEI14lAAABAQEAAAABAPkLAAEA\" +\n           \"8woAAAAABGGCCgQAAAAAAAYAAABFbmFibGUBAV0lAC8BAEMjXSUAAAEBAQAAAAEA+QsAAQDzCgAAAAAE\" +\n           \"YYIKBAAAAAAACgAAAEFkZENvbW1lbnQBAV8lAC8BAEUjXyUAAAEBAQAAAAEA+QsAAQANCwEAAAAXYKkK\" +\n           \"AgAAAAAADgAAAElucHV0QXJndW1lbnRzAQFgJQAuAERgJQAAlgIAAAABACoBAUYAAAAHAAAARXZlbnRJ\" +\n           \"ZAAP/////wAAAAADAAAAACgAAABUaGUgaWRlbnRpZmllciBmb3IgdGhlIGV2ZW50IHRvIGNvbW1lbnQu\" +\n           \"AQAqAQFCAAAABwAAAENvbW1lbnQAFf////8AAAAAAwAAAAAkAAAAVGhlIGNvbW1lbnQgdG8gYWRkIHRv\" +\n           \"IHRoZSBjb25kaXRpb24uAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAVYIkKAgAAAAAACgAAAEFja2Vk\" +\n           \"U3RhdGUBAWMlAC8BACMjYyUAAAAV/////wEBAQAAAAEALCMBAQFOJQEAAAAVYIkKAgAAAAAAAgAAAElk\" +\n           \"AQFkJQAuAERkJQAAAAH/////AQH/////AAAAAARhggoEAAAAAAALAAAAQWNrbm93bGVkZ2UBAXMlAC8B\" +\n           \"AJcjcyUAAAEBAQAAAAEA+QsAAQDwIgEAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQF0JQAu\" +\n           \"AER0JQAAlgIAAAABACoBAUYAAAAHAAAARXZlbnRJZAAP/////wAAAAADAAAAACgAAABUaGUgaWRlbnRp\" +\n           \"ZmllciBmb3IgdGhlIGV2ZW50IHRvIGNvbW1lbnQuAQAqAQFCAAAABwAAAENvbW1lbnQAFf////8AAAAA\" +\n           \"AwAAAAAkAAAAVGhlIGNvbW1lbnQgdG8gYWRkIHRvIHRoZSBjb25kaXRpb24uAQAoAQEAAAABAAAAAAAA\" +\n           \"AAEB/////wAAAAAVYIkKAgAAAAEACgAAAFNCeXRlVmFsdWUBAXclAC8BAEAJdyUAAAAC/////wEB////\" +\n           \"/wEAAAAVYIkKAgAAAAAABwAAAEVVUmFuZ2UBAXolAC4ARHolAAABAHQD/////wEB/////wAAAAAVYIkK\" +\n           \"AgAAAAEACQAAAEJ5dGVWYWx1ZQEBfSUALwEAQAl9JQAAAAP/////AQH/////AQAAABVgiQoCAAAAAAAH\" +\n           \"AAAARVVSYW5nZQEBgCUALgBEgCUAAAEAdAP/////AQH/////AAAAABVgiQoCAAAAAQAKAAAASW50MTZW\" +\n           \"YWx1ZQEBgyUALwEAQAmDJQAAAAT/////AQH/////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBhiUA\" +\n           \"LgBEhiUAAAEAdAP/////AQH/////AAAAABVgiQoCAAAAAQALAAAAVUludDE2VmFsdWUBAYklAC8BAEAJ\" +\n           \"iSUAAAAF/////wEB/////wEAAAAVYIkKAgAAAAAABwAAAEVVUmFuZ2UBAYwlAC4ARIwlAAABAHQD////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAEACgAAAEludDMyVmFsdWUBAY8lAC8BAEAJjyUAAAAG/////wEB////\" +\n           \"/wEAAAAVYIkKAgAAAAAABwAAAEVVUmFuZ2UBAZIlAC4ARJIlAAABAHQD/////wEB/////wAAAAAVYIkK\" +\n           \"AgAAAAEACwAAAFVJbnQzMlZhbHVlAQGVJQAvAQBACZUlAAAAB/////8BAf////8BAAAAFWCJCgIAAAAA\" +\n           \"AAcAAABFVVJhbmdlAQGYJQAuAESYJQAAAQB0A/////8BAf////8AAAAAFWCJCgIAAAABAAoAAABJbnQ2\" +\n           \"NFZhbHVlAQGbJQAvAQBACZslAAAACP////8BAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQGe\" +\n           \"JQAuAESeJQAAAQB0A/////8BAf////8AAAAAFWCJCgIAAAABAAsAAABVSW50NjRWYWx1ZQEBoSUALwEA\" +\n           \"QAmhJQAAAAn/////AQH/////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBpCUALgBEpCUAAAEAdAP/\" +\n           \"////AQH/////AAAAABVgiQoCAAAAAQAKAAAARmxvYXRWYWx1ZQEBpyUALwEAQAmnJQAAAAr/////AQH/\" +\n           \"////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBqiUALgBEqiUAAAEAdAP/////AQH/////AAAAABVg\" +\n           \"iQoCAAAAAQALAAAARG91YmxlVmFsdWUBAa0lAC8BAEAJrSUAAAAL/////wEB/////wEAAAAVYIkKAgAA\" +\n           \"AAAABwAAAEVVUmFuZ2UBAbAlAC4ARLAlAAABAHQD/////wEB/////wAAAAAVYIkKAgAAAAEACwAAAE51\" +\n           \"bWJlclZhbHVlAQGzJQAvAQBACbMlAAAAGv////8BAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdl\" +\n           \"AQG2JQAuAES2JQAAAQB0A/////8BAf////8AAAAAFWCJCgIAAAABAAwAAABJbnRlZ2VyVmFsdWUBAbkl\" +\n           \"AC8BAEAJuSUAAAAb/////wEB/////wEAAAAVYIkKAgAAAAAABwAAAEVVUmFuZ2UBAbwlAC4ARLwlAAAB\" +\n           \"AHQD/////wEB/////wAAAAAVYIkKAgAAAAEADQAAAFVJbnRlZ2VyVmFsdWUBAb8lAC8BAEAJvyUAAAAc\" +\n           \"/////wEB/////wEAAAAVYIkKAgAAAAAABwAAAEVVUmFuZ2UBAcIlAC4ARMIlAAABAHQD/////wEB////\" +\n           \"/wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public AnalogItemState<sbyte> SByteValue\n        {\n            get => m_sByteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_sByteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_sByteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<byte> ByteValue\n        {\n            get => m_byteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<short> Int16Value\n        {\n            get => m_int16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<ushort> UInt16Value\n        {\n            get => m_uInt16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<int> Int32Value\n        {\n            get => m_int32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<uint> UInt32Value\n        {\n            get => m_uInt32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<long> Int64Value\n        {\n            get => m_int64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<ulong> UInt64Value\n        {\n            get => m_uInt64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<float> FloatValue\n        {\n            get => m_floatValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_floatValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_floatValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<double> DoubleValue\n        {\n            get => m_doubleValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_doubleValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_doubleValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState NumberValue\n        {\n            get => m_numberValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_numberValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_numberValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState IntegerValue\n        {\n            get => m_integerValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_integerValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_integerValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState UIntegerValue\n        {\n            get => m_uIntegerValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_uIntegerValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uIntegerValue = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_sByteValue != null)\n            {\n                children.Add(m_sByteValue);\n            }\n\n            if (m_byteValue != null)\n            {\n                children.Add(m_byteValue);\n            }\n\n            if (m_int16Value != null)\n            {\n                children.Add(m_int16Value);\n            }\n\n            if (m_uInt16Value != null)\n            {\n                children.Add(m_uInt16Value);\n            }\n\n            if (m_int32Value != null)\n            {\n                children.Add(m_int32Value);\n            }\n\n            if (m_uInt32Value != null)\n            {\n                children.Add(m_uInt32Value);\n            }\n\n            if (m_int64Value != null)\n            {\n                children.Add(m_int64Value);\n            }\n\n            if (m_uInt64Value != null)\n            {\n                children.Add(m_uInt64Value);\n            }\n\n            if (m_floatValue != null)\n            {\n                children.Add(m_floatValue);\n            }\n\n            if (m_doubleValue != null)\n            {\n                children.Add(m_doubleValue);\n            }\n\n            if (m_numberValue != null)\n            {\n                children.Add(m_numberValue);\n            }\n\n            if (m_integerValue != null)\n            {\n                children.Add(m_integerValue);\n            }\n\n            if (m_uIntegerValue != null)\n            {\n                children.Add(m_uIntegerValue);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.SByteValue:\n                    {\n                        if (createOrReplace && SByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SByteValue = new AnalogItemState<sbyte>(this);\n                            }\n                            else\n                            {\n                                SByteValue = (AnalogItemState<sbyte>)replacement;\n                            }\n                        }\n\n                        instance = SByteValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteValue:\n                    {\n                        if (createOrReplace && ByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteValue = new AnalogItemState<byte>(this);\n                            }\n                            else\n                            {\n                                ByteValue = (AnalogItemState<byte>)replacement;\n                            }\n                        }\n\n                        instance = ByteValue;\n                        break;\n                    }\n\n                case BrowseNames.Int16Value:\n                    {\n                        if (createOrReplace && Int16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int16Value = new AnalogItemState<short>(this);\n                            }\n                            else\n                            {\n                                Int16Value = (AnalogItemState<short>)replacement;\n                            }\n                        }\n\n                        instance = Int16Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt16Value:\n                    {\n                        if (createOrReplace && UInt16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt16Value = new AnalogItemState<ushort>(this);\n                            }\n                            else\n                            {\n                                UInt16Value = (AnalogItemState<ushort>)replacement;\n                            }\n                        }\n\n                        instance = UInt16Value;\n                        break;\n                    }\n\n                case BrowseNames.Int32Value:\n                    {\n                        if (createOrReplace && Int32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int32Value = new AnalogItemState<int>(this);\n                            }\n                            else\n                            {\n                                Int32Value = (AnalogItemState<int>)replacement;\n                            }\n                        }\n\n                        instance = Int32Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt32Value:\n                    {\n                        if (createOrReplace && UInt32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt32Value = new AnalogItemState<uint>(this);\n                            }\n                            else\n                            {\n                                UInt32Value = (AnalogItemState<uint>)replacement;\n                            }\n                        }\n\n                        instance = UInt32Value;\n                        break;\n                    }\n\n                case BrowseNames.Int64Value:\n                    {\n                        if (createOrReplace && Int64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int64Value = new AnalogItemState<long>(this);\n                            }\n                            else\n                            {\n                                Int64Value = (AnalogItemState<long>)replacement;\n                            }\n                        }\n\n                        instance = Int64Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt64Value:\n                    {\n                        if (createOrReplace && UInt64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt64Value = new AnalogItemState<ulong>(this);\n                            }\n                            else\n                            {\n                                UInt64Value = (AnalogItemState<ulong>)replacement;\n                            }\n                        }\n\n                        instance = UInt64Value;\n                        break;\n                    }\n\n                case BrowseNames.FloatValue:\n                    {\n                        if (createOrReplace && FloatValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                FloatValue = new AnalogItemState<float>(this);\n                            }\n                            else\n                            {\n                                FloatValue = (AnalogItemState<float>)replacement;\n                            }\n                        }\n\n                        instance = FloatValue;\n                        break;\n                    }\n\n                case BrowseNames.DoubleValue:\n                    {\n                        if (createOrReplace && DoubleValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DoubleValue = new AnalogItemState<double>(this);\n                            }\n                            else\n                            {\n                                DoubleValue = (AnalogItemState<double>)replacement;\n                            }\n                        }\n\n                        instance = DoubleValue;\n                        break;\n                    }\n\n                case BrowseNames.NumberValue:\n                    {\n                        if (createOrReplace && NumberValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                NumberValue = new AnalogItemState(this);\n                            }\n                            else\n                            {\n                                NumberValue = (AnalogItemState)replacement;\n                            }\n                        }\n\n                        instance = NumberValue;\n                        break;\n                    }\n\n                case BrowseNames.IntegerValue:\n                    {\n                        if (createOrReplace && IntegerValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                IntegerValue = new AnalogItemState(this);\n                            }\n                            else\n                            {\n                                IntegerValue = (AnalogItemState)replacement;\n                            }\n                        }\n\n                        instance = IntegerValue;\n                        break;\n                    }\n\n                case BrowseNames.UIntegerValue:\n                    {\n                        if (createOrReplace && UIntegerValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UIntegerValue = new AnalogItemState(this);\n                            }\n                            else\n                            {\n                                UIntegerValue = (AnalogItemState)replacement;\n                            }\n                        }\n\n                        instance = UIntegerValue;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private AnalogItemState<sbyte> m_sByteValue;\n        private AnalogItemState<byte> m_byteValue;\n        private AnalogItemState<short> m_int16Value;\n        private AnalogItemState<ushort> m_uInt16Value;\n        private AnalogItemState<int> m_int32Value;\n        private AnalogItemState<uint> m_uInt32Value;\n        private AnalogItemState<long> m_int64Value;\n        private AnalogItemState<ulong> m_uInt64Value;\n        private AnalogItemState<float> m_floatValue;\n        private AnalogItemState<double> m_doubleValue;\n        private AnalogItemState m_numberValue;\n        private AnalogItemState m_integerValue;\n        private AnalogItemState m_uIntegerValue;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region ArrayValue1MethodState Class\n#if (!OPCUA_EXCLUDE_ArrayValue1MethodState)\n    /// <summary>\n    /// Stores an instance of the ArrayValue1MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ArrayValue1MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public ArrayValue1MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ArrayValue1MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABUAAABBcnJheVZhbHVl\" +\n           \"MU1ldGhvZFR5cGUBAcYlAC8BAcYlxiUAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1l\" +\n           \"bnRzAQHHJQAuAETHJQAAlgsAAAABACoBARwAAAAJAAAAQm9vbGVhbkluAAEBAAAAAQAAAAAAAAAAAQAq\" +\n           \"AQEaAAAABwAAAFNCeXRlSW4AAgEAAAABAAAAAAAAAAABACoBARkAAAAGAAAAQnl0ZUluAAMBAAAAAQAA\" +\n           \"AAAAAAAAAQAqAQEaAAAABwAAAEludDE2SW4ABAEAAAABAAAAAAAAAAABACoBARsAAAAIAAAAVUludDE2\" +\n           \"SW4ABQEAAAABAAAAAAAAAAABACoBARoAAAAHAAAASW50MzJJbgAGAQAAAAEAAAAAAAAAAAEAKgEBGwAA\" +\n           \"AAgAAABVSW50MzJJbgAHAQAAAAEAAAAAAAAAAAEAKgEBGgAAAAcAAABJbnQ2NEluAAgBAAAAAQAAAAAA\" +\n           \"AAAAAQAqAQEbAAAACAAAAFVJbnQ2NEluAAkBAAAAAQAAAAAAAAAAAQAqAQEaAAAABwAAAEZsb2F0SW4A\" +\n           \"CgEAAAABAAAAAAAAAAABACoBARsAAAAIAAAARG91YmxlSW4ACwEAAAABAAAAAAAAAAABACgBAQAAAAEA\" +\n           \"AAAAAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQHIJQAuAETIJQAAlgsA\" +\n           \"AAABACoBAR0AAAAKAAAAQm9vbGVhbk91dAABAQAAAAEAAAAAAAAAAAEAKgEBGwAAAAgAAABTQnl0ZU91\" +\n           \"dAACAQAAAAEAAAAAAAAAAAEAKgEBGgAAAAcAAABCeXRlT3V0AAMBAAAAAQAAAAAAAAAAAQAqAQEbAAAA\" +\n           \"CAAAAEludDE2T3V0AAQBAAAAAQAAAAAAAAAAAQAqAQEcAAAACQAAAFVJbnQxNk91dAAFAQAAAAEAAAAA\" +\n           \"AAAAAAEAKgEBGwAAAAgAAABJbnQzMk91dAAGAQAAAAEAAAAAAAAAAAEAKgEBHAAAAAkAAABVSW50MzJP\" +\n           \"dXQABwEAAAABAAAAAAAAAAABACoBARsAAAAIAAAASW50NjRPdXQACAEAAAABAAAAAAAAAAABACoBARwA\" +\n           \"AAAJAAAAVUludDY0T3V0AAkBAAAAAQAAAAAAAAAAAQAqAQEbAAAACAAAAEZsb2F0T3V0AAoBAAAAAQAA\" +\n           \"AAAAAAAAAQAqAQEcAAAACQAAAERvdWJsZU91dAALAQAAAAEAAAAAAAAAAAEAKAEBAAAAAQAAAAAAAAAB\" +\n           \"Af////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public ArrayValue1MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            bool[] booleanIn = (bool[])_inputArguments[0];\n            sbyte[] sByteIn = (sbyte[])_inputArguments[1];\n            byte[] byteIn = (byte[])_inputArguments[2];\n            short[] int16In = (short[])_inputArguments[3];\n            ushort[] uInt16In = (ushort[])_inputArguments[4];\n            int[] int32In = (int[])_inputArguments[5];\n            uint[] uInt32In = (uint[])_inputArguments[6];\n            long[] int64In = (long[])_inputArguments[7];\n            ulong[] uInt64In = (ulong[])_inputArguments[8];\n            float[] floatIn = (float[])_inputArguments[9];\n            double[] doubleIn = (double[])_inputArguments[10];\n\n            bool[] booleanOut = (bool[])_outputArguments[0];\n            sbyte[] sByteOut = (sbyte[])_outputArguments[1];\n            byte[] byteOut = (byte[])_outputArguments[2];\n            short[] int16Out = (short[])_outputArguments[3];\n            ushort[] uInt16Out = (ushort[])_outputArguments[4];\n            int[] int32Out = (int[])_outputArguments[5];\n            uint[] uInt32Out = (uint[])_outputArguments[6];\n            long[] int64Out = (long[])_outputArguments[7];\n            ulong[] uInt64Out = (ulong[])_outputArguments[8];\n            float[] floatOut = (float[])_outputArguments[9];\n            double[] doubleOut = (double[])_outputArguments[10];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    booleanIn,\n                    sByteIn,\n                    byteIn,\n                    int16In,\n                    uInt16In,\n                    int32In,\n                    uInt32In,\n                    int64In,\n                    uInt64In,\n                    floatIn,\n                    doubleIn,\n                    ref booleanOut,\n                    ref sByteOut,\n                    ref byteOut,\n                    ref int16Out,\n                    ref uInt16Out,\n                    ref int32Out,\n                    ref uInt32Out,\n                    ref int64Out,\n                    ref uInt64Out,\n                    ref floatOut,\n                    ref doubleOut);\n            }\n\n            _outputArguments[0] = booleanOut;\n            _outputArguments[1] = sByteOut;\n            _outputArguments[2] = byteOut;\n            _outputArguments[3] = int16Out;\n            _outputArguments[4] = uInt16Out;\n            _outputArguments[5] = int32Out;\n            _outputArguments[6] = uInt32Out;\n            _outputArguments[7] = int64Out;\n            _outputArguments[8] = uInt64Out;\n            _outputArguments[9] = floatOut;\n            _outputArguments[10] = doubleOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"booleanIn\"></param>\n    /// <param name=\"sByteIn\"></param>\n    /// <param name=\"byteIn\"></param>\n    /// <param name=\"int16In\"></param>\n    /// <param name=\"uInt16In\"></param>\n    /// <param name=\"int32In\"></param>\n    /// <param name=\"uInt32In\"></param>\n    /// <param name=\"int64In\"></param>\n    /// <param name=\"uInt64In\"></param>\n    /// <param name=\"floatIn\"></param>\n    /// <param name=\"doubleIn\"></param>\n    /// <param name=\"booleanOut\"></param>\n    /// <param name=\"sByteOut\"></param>\n    /// <param name=\"byteOut\"></param>\n    /// <param name=\"int16Out\"></param>\n    /// <param name=\"uInt16Out\"></param>\n    /// <param name=\"int32Out\"></param>\n    /// <param name=\"uInt32Out\"></param>\n    /// <param name=\"int64Out\"></param>\n    /// <param name=\"uInt64Out\"></param>\n    /// <param name=\"floatOut\"></param>\n    /// <param name=\"doubleOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult ArrayValue1MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        bool[] booleanIn,\n        sbyte[] sByteIn,\n        byte[] byteIn,\n        short[] int16In,\n        ushort[] uInt16In,\n        int[] int32In,\n        uint[] uInt32In,\n        long[] int64In,\n        ulong[] uInt64In,\n        float[] floatIn,\n        double[] doubleIn,\n        ref bool[] booleanOut,\n        ref sbyte[] sByteOut,\n        ref byte[] byteOut,\n        ref short[] int16Out,\n        ref ushort[] uInt16Out,\n        ref int[] int32Out,\n        ref uint[] uInt32Out,\n        ref long[] int64Out,\n        ref ulong[] uInt64Out,\n        ref float[] floatOut,\n        ref double[] doubleOut);\n#endif\n    #endregion\n\n    #region ArrayValue2MethodState Class\n#if (!OPCUA_EXCLUDE_ArrayValue2MethodState)\n    /// <summary>\n    /// Stores an instance of the ArrayValue2MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ArrayValue2MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public ArrayValue2MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ArrayValue2MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABUAAABBcnJheVZhbHVl\" +\n           \"Mk1ldGhvZFR5cGUBAcklAC8BAcklySUAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1l\" +\n           \"bnRzAQHKJQAuAETKJQAAlgoAAAABACoBARsAAAAIAAAAU3RyaW5nSW4ADAEAAAABAAAAAAAAAAABACoB\" +\n           \"AR0AAAAKAAAARGF0ZVRpbWVJbgANAQAAAAEAAAAAAAAAAAEAKgEBGQAAAAYAAABHdWlkSW4ADgEAAAAB\" +\n           \"AAAAAAAAAAABACoBAR8AAAAMAAAAQnl0ZVN0cmluZ0luAA8BAAAAAQAAAAAAAAAAAQAqAQEfAAAADAAA\" +\n           \"AFhtbEVsZW1lbnRJbgAQAQAAAAEAAAAAAAAAAAEAKgEBGwAAAAgAAABOb2RlSWRJbgARAQAAAAEAAAAA\" +\n           \"AAAAAAEAKgEBIwAAABAAAABFeHBhbmRlZE5vZGVJZEluABIBAAAAAQAAAAAAAAAAAQAqAQEiAAAADwAA\" +\n           \"AFF1YWxpZmllZE5hbWVJbgAUAQAAAAEAAAAAAAAAAAEAKgEBIgAAAA8AAABMb2NhbGl6ZWRUZXh0SW4A\" +\n           \"FQEAAAABAAAAAAAAAAABACoBAR8AAAAMAAAAU3RhdHVzQ29kZUluABMBAAAAAQAAAAAAAAAAAQAoAQEA\" +\n           \"AAABAAAAAAAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEByyUALgBEyyUA\" +\n           \"AJYKAAAAAQAqAQEcAAAACQAAAFN0cmluZ091dAAMAQAAAAEAAAAAAAAAAAEAKgEBHgAAAAsAAABEYXRl\" +\n           \"VGltZU91dAANAQAAAAEAAAAAAAAAAAEAKgEBGgAAAAcAAABHdWlkT3V0AA4BAAAAAQAAAAAAAAAAAQAq\" +\n           \"AQEgAAAADQAAAEJ5dGVTdHJpbmdPdXQADwEAAAABAAAAAAAAAAABACoBASAAAAANAAAAWG1sRWxlbWVu\" +\n           \"dE91dAAQAQAAAAEAAAAAAAAAAAEAKgEBHAAAAAkAAABOb2RlSWRPdXQAEQEAAAABAAAAAAAAAAABACoB\" +\n           \"ASQAAAARAAAARXhwYW5kZWROb2RlSWRPdXQAEgEAAAABAAAAAAAAAAABACoBASMAAAAQAAAAUXVhbGlm\" +\n           \"aWVkTmFtZU91dAAUAQAAAAEAAAAAAAAAAAEAKgEBIwAAABAAAABMb2NhbGl6ZWRUZXh0T3V0ABUBAAAA\" +\n           \"AQAAAAAAAAAAAQAqAQEgAAAADQAAAFN0YXR1c0NvZGVPdXQAEwEAAAABAAAAAAAAAAABACgBAQAAAAEA\" +\n           \"AAAAAAAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public ArrayValue2MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            string[] stringIn = (string[])_inputArguments[0];\n            DateTime[] dateTimeIn = (DateTime[])_inputArguments[1];\n            Uuid[] guidIn = (Uuid[])_inputArguments[2];\n            byte[][] byteStringIn = (byte[][])_inputArguments[3];\n            XmlElement[] xmlElementIn = (XmlElement[])_inputArguments[4];\n            NodeId[] nodeIdIn = (NodeId[])_inputArguments[5];\n            ExpandedNodeId[] expandedNodeIdIn = (ExpandedNodeId[])_inputArguments[6];\n            QualifiedName[] qualifiedNameIn = (QualifiedName[])_inputArguments[7];\n            LocalizedText[] localizedTextIn = (LocalizedText[])_inputArguments[8];\n            StatusCode[] statusCodeIn = (StatusCode[])_inputArguments[9];\n\n            string[] stringOut = (string[])_outputArguments[0];\n            DateTime[] dateTimeOut = (DateTime[])_outputArguments[1];\n            Uuid[] guidOut = (Uuid[])_outputArguments[2];\n            byte[][] byteStringOut = (byte[][])_outputArguments[3];\n            XmlElement[] xmlElementOut = (XmlElement[])_outputArguments[4];\n            NodeId[] nodeIdOut = (NodeId[])_outputArguments[5];\n            ExpandedNodeId[] expandedNodeIdOut = (ExpandedNodeId[])_outputArguments[6];\n            QualifiedName[] qualifiedNameOut = (QualifiedName[])_outputArguments[7];\n            LocalizedText[] localizedTextOut = (LocalizedText[])_outputArguments[8];\n            StatusCode[] statusCodeOut = (StatusCode[])_outputArguments[9];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    stringIn,\n                    dateTimeIn,\n                    guidIn,\n                    byteStringIn,\n                    xmlElementIn,\n                    nodeIdIn,\n                    expandedNodeIdIn,\n                    qualifiedNameIn,\n                    localizedTextIn,\n                    statusCodeIn,\n                    ref stringOut,\n                    ref dateTimeOut,\n                    ref guidOut,\n                    ref byteStringOut,\n                    ref xmlElementOut,\n                    ref nodeIdOut,\n                    ref expandedNodeIdOut,\n                    ref qualifiedNameOut,\n                    ref localizedTextOut,\n                    ref statusCodeOut);\n            }\n\n            _outputArguments[0] = stringOut;\n            _outputArguments[1] = dateTimeOut;\n            _outputArguments[2] = guidOut;\n            _outputArguments[3] = byteStringOut;\n            _outputArguments[4] = xmlElementOut;\n            _outputArguments[5] = nodeIdOut;\n            _outputArguments[6] = expandedNodeIdOut;\n            _outputArguments[7] = qualifiedNameOut;\n            _outputArguments[8] = localizedTextOut;\n            _outputArguments[9] = statusCodeOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"stringIn\"></param>\n    /// <param name=\"dateTimeIn\"></param>\n    /// <param name=\"guidIn\"></param>\n    /// <param name=\"byteStringIn\"></param>\n    /// <param name=\"xmlElementIn\"></param>\n    /// <param name=\"nodeIdIn\"></param>\n    /// <param name=\"expandedNodeIdIn\"></param>\n    /// <param name=\"qualifiedNameIn\"></param>\n    /// <param name=\"localizedTextIn\"></param>\n    /// <param name=\"statusCodeIn\"></param>\n    /// <param name=\"stringOut\"></param>\n    /// <param name=\"dateTimeOut\"></param>\n    /// <param name=\"guidOut\"></param>\n    /// <param name=\"byteStringOut\"></param>\n    /// <param name=\"xmlElementOut\"></param>\n    /// <param name=\"nodeIdOut\"></param>\n    /// <param name=\"expandedNodeIdOut\"></param>\n    /// <param name=\"qualifiedNameOut\"></param>\n    /// <param name=\"localizedTextOut\"></param>\n    /// <param name=\"statusCodeOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult ArrayValue2MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        string[] stringIn,\n        DateTime[] dateTimeIn,\n        Uuid[] guidIn,\n        byte[][] byteStringIn,\n        XmlElement[] xmlElementIn,\n        NodeId[] nodeIdIn,\n        ExpandedNodeId[] expandedNodeIdIn,\n        QualifiedName[] qualifiedNameIn,\n        LocalizedText[] localizedTextIn,\n        StatusCode[] statusCodeIn,\n        ref string[] stringOut,\n        ref DateTime[] dateTimeOut,\n        ref Uuid[] guidOut,\n        ref byte[][] byteStringOut,\n        ref XmlElement[] xmlElementOut,\n        ref NodeId[] nodeIdOut,\n        ref ExpandedNodeId[] expandedNodeIdOut,\n        ref QualifiedName[] qualifiedNameOut,\n        ref LocalizedText[] localizedTextOut,\n        ref StatusCode[] statusCodeOut);\n#endif\n    #endregion\n\n    #region ArrayValue3MethodState Class\n#if (!OPCUA_EXCLUDE_ArrayValue3MethodState)\n    /// <summary>\n    /// Stores an instance of the ArrayValue3MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ArrayValue3MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public ArrayValue3MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new ArrayValue3MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABUAAABBcnJheVZhbHVl\" +\n           \"M01ldGhvZFR5cGUBAcwlAC8BAcwlzCUAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1l\" +\n           \"bnRzAQHNJQAuAETNJQAAlgMAAAABACoBARwAAAAJAAAAVmFyaWFudEluABgBAAAAAQAAAAAAAAAAAQAq\" +\n           \"AQEgAAAADQAAAEVudW1lcmF0aW9uSW4AHQEAAAABAAAAAAAAAAABACoBAR4AAAALAAAAU3RydWN0dXJl\" +\n           \"SW4AFgEAAAABAAAAAAAAAAABACgBAQAAAAEAAAAAAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0\" +\n           \"cHV0QXJndW1lbnRzAQHOJQAuAETOJQAAlgMAAAABACoBAR0AAAAKAAAAVmFyaWFudE91dAAYAQAAAAEA\" +\n           \"AAAAAAAAAAEAKgEBIQAAAA4AAABFbnVtZXJhdGlvbk91dAAdAQAAAAEAAAAAAAAAAAEAKgEBHwAAAAwA\" +\n           \"AABTdHJ1Y3R1cmVPdXQAFgEAAAABAAAAAAAAAAABACgBAQAAAAEAAAAAAAAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public ArrayValue3MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            Variant[] variantIn = (Variant[])_inputArguments[0];\n            int[] enumerationIn = (int[])_inputArguments[1];\n            ExtensionObject[] structureIn = (ExtensionObject[])_inputArguments[2];\n\n            Variant[] variantOut = (Variant[])_outputArguments[0];\n            int[] enumerationOut = (int[])_outputArguments[1];\n            ExtensionObject[] structureOut = (ExtensionObject[])_outputArguments[2];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    variantIn,\n                    enumerationIn,\n                    structureIn,\n                    ref variantOut,\n                    ref enumerationOut,\n                    ref structureOut);\n            }\n\n            _outputArguments[0] = variantOut;\n            _outputArguments[1] = enumerationOut;\n            _outputArguments[2] = structureOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"variantIn\"></param>\n    /// <param name=\"enumerationIn\"></param>\n    /// <param name=\"structureIn\"></param>\n    /// <param name=\"variantOut\"></param>\n    /// <param name=\"enumerationOut\"></param>\n    /// <param name=\"structureOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult ArrayValue3MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        Variant[] variantIn,\n        int[] enumerationIn,\n        ExtensionObject[] structureIn,\n        ref Variant[] variantOut,\n        ref int[] enumerationOut,\n        ref ExtensionObject[] structureOut);\n#endif\n    #endregion\n\n    #region ArrayValueObjectState Class\n#if (!OPCUA_EXCLUDE_ArrayValueObjectState)\n    /// <summary>\n    /// Stores an instance of the ArrayValueObjectType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class ArrayValueObjectState : TestDataObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public ArrayValueObjectState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.ArrayValueObjectType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABABwAAABBcnJheVZhbHVl\" +\n           \"T2JqZWN0VHlwZUluc3RhbmNlAQHPJQEBzyXPJQAAAQAAAAAkAAEB0yUeAAAANWCJCgIAAAABABAAAABT\" +\n           \"aW11bGF0aW9uQWN0aXZlAQHQJQMAAAAARwAAAElmIHRydWUgdGhlIHNlcnZlciB3aWxsIHByb2R1Y2Ug\" +\n           \"bmV3IHZhbHVlcyBmb3IgZWFjaCBtb25pdG9yZWQgdmFyaWFibGUuAC4ARNAlAAAAAf////8BAf////8A\" +\n           \"AAAABGGCCgQAAAABAA4AAABHZW5lcmF0ZVZhbHVlcwEB0SUALwEBqSTRJQAAAQH/////AQAAABdgqQoC\" +\n           \"AAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAdIlAC4ARNIlAACWAQAAAAEAKgEBRgAAAAoAAABJdGVyYXRp\" +\n           \"b25zAAf/////AAAAAAMAAAAAJQAAAFRoZSBudW1iZXIgb2YgbmV3IHZhbHVlcyB0byBnZW5lcmF0ZS4B\" +\n           \"ACgBAQAAAAEAAAAAAAAAAQH/////AAAAAARggAoBAAAAAQANAAAAQ3ljbGVDb21wbGV0ZQEB0yUALwEA\" +\n           \"QQvTJQAAAQAAAAAkAQEBzyUXAAAAFWCJCgIAAAAAAAcAAABFdmVudElkAQHUJQAuAETUJQAAAA//////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAAJAAAARXZlbnRUeXBlAQHVJQAuAETVJQAAABH/////AQH/////AAAA\" +\n           \"ABVgiQoCAAAAAAAKAAAAU291cmNlTm9kZQEB1iUALgBE1iUAAAAR/////wEB/////wAAAAAVYIkKAgAA\" +\n           \"AAAACgAAAFNvdXJjZU5hbWUBAdclAC4ARNclAAAADP////8BAf////8AAAAAFWCJCgIAAAAAAAQAAABU\" +\n           \"aW1lAQHYJQAuAETYJQAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAsAAABSZWNlaXZlVGltZQEB\" +\n           \"2SUALgBE2SUAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAATWVzc2FnZQEB2yUALgBE2yUA\" +\n           \"AAAV/////wEB/////wAAAAAVYIkKAgAAAAAACAAAAFNldmVyaXR5AQHcJQAuAETcJQAAAAX/////AQH/\" +\n           \"////AAAAABVgiQoCAAAAAAAQAAAAQ29uZGl0aW9uQ2xhc3NJZAEBQC0ALgBEQC0AAAAR/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAAEgAAAENvbmRpdGlvbkNsYXNzTmFtZQEBQS0ALgBEQS0AAAAV/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAADQAAAENvbmRpdGlvbk5hbWUBASgtAC4ARCgtAAAADP////8BAf////8AAAAA\" +\n           \"FWCJCgIAAAAAAAgAAABCcmFuY2hJZAEB3SUALgBE3SUAAAAR/////wEB/////wAAAAAVYIkKAgAAAAAA\" +\n           \"BgAAAFJldGFpbgEB3iUALgBE3iUAAAAB/////wEB/////wAAAAAVYIkKAgAAAAAADAAAAEVuYWJsZWRT\" +\n           \"dGF0ZQEB3yUALwEAIyPfJQAAABX/////AQECAAAAAQAsIwABAfQlAQAsIwABAfwlAQAAABVgiQoCAAAA\" +\n           \"AAACAAAASWQBAeAlAC4AROAlAAAAAf////8BAf////8AAAAAFWCJCgIAAAAAAAcAAABRdWFsaXR5AQHl\" +\n           \"JQAvAQAqI+UlAAAAE/////8BAf////8BAAAAFWCJCgIAAAAAAA8AAABTb3VyY2VUaW1lc3RhbXABAeYl\" +\n           \"AC4AROYlAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAADAAAAExhc3RTZXZlcml0eQEB6SUALwEA\" +\n           \"KiPpJQAAAAX/////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1wAQHqJQAuAETq\" +\n           \"JQAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAcAAABDb21tZW50AQHrJQAvAQAqI+slAAAAFf//\" +\n           \"//8BAf////8BAAAAFWCJCgIAAAAAAA8AAABTb3VyY2VUaW1lc3RhbXABAewlAC4AROwlAAABACYB////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAAADAAAAENsaWVudFVzZXJJZAEB7SUALgBE7SUAAAAM/////wEB////\" +\n           \"/wAAAAAEYYIKBAAAAAAABwAAAERpc2FibGUBAe8lAC8BAEQj7yUAAAEBAQAAAAEA+QsAAQDzCgAAAAAE\" +\n           \"YYIKBAAAAAAABgAAAEVuYWJsZQEB7iUALwEAQyPuJQAAAQEBAAAAAQD5CwABAPMKAAAAAARhggoEAAAA\" +\n           \"AAAKAAAAQWRkQ29tbWVudAEB8CUALwEARSPwJQAAAQEBAAAAAQD5CwABAA0LAQAAABdgqQoCAAAAAAAO\" +\n           \"AAAASW5wdXRBcmd1bWVudHMBAfElAC4ARPElAACWAgAAAAEAKgEBRgAAAAcAAABFdmVudElkAA//////\" +\n           \"AAAAAAMAAAAAKAAAAFRoZSBpZGVudGlmaWVyIGZvciB0aGUgZXZlbnQgdG8gY29tbWVudC4BACoBAUIA\" +\n           \"AAAHAAAAQ29tbWVudAAV/////wAAAAADAAAAACQAAABUaGUgY29tbWVudCB0byBhZGQgdG8gdGhlIGNv\" +\n           \"bmRpdGlvbi4BACgBAQAAAAEAAAAAAAAAAQH/////AAAAABVgiQoCAAAAAAAKAAAAQWNrZWRTdGF0ZQEB\" +\n           \"9CUALwEAIyP0JQAAABX/////AQEBAAAAAQAsIwEBAd8lAQAAABVgiQoCAAAAAAACAAAASWQBAfUlAC4A\" +\n           \"RPUlAAAAAf////8BAf////8AAAAABGGCCgQAAAAAAAsAAABBY2tub3dsZWRnZQEBBCYALwEAlyMEJgAA\" +\n           \"AQEBAAAAAQD5CwABAPAiAQAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAQUmAC4ARAUmAACW\" +\n           \"AgAAAAEAKgEBRgAAAAcAAABFdmVudElkAA//////AAAAAAMAAAAAKAAAAFRoZSBpZGVudGlmaWVyIGZv\" +\n           \"ciB0aGUgZXZlbnQgdG8gY29tbWVudC4BACoBAUIAAAAHAAAAQ29tbWVudAAV/////wAAAAADAAAAACQA\" +\n           \"AABUaGUgY29tbWVudCB0byBhZGQgdG8gdGhlIGNvbmRpdGlvbi4BACgBAQAAAAEAAAAAAAAAAQH/////\" +\n           \"AAAAABdgiQoCAAAAAQAMAAAAQm9vbGVhblZhbHVlAQEIJgAvAD8IJgAAAAEBAAAAAQAAAAAAAAABAf//\" +\n           \"//8AAAAAF2CJCgIAAAABAAoAAABTQnl0ZVZhbHVlAQEJJgAvAD8JJgAAAAIBAAAAAQAAAAAAAAABAf//\" +\n           \"//8AAAAAF2CJCgIAAAABAAkAAABCeXRlVmFsdWUBAQomAC8APwomAAAAAwEAAAABAAAAAAAAAAEB////\" +\n           \"/wAAAAAXYIkKAgAAAAEACgAAAEludDE2VmFsdWUBAQsmAC8APwsmAAAABAEAAAABAAAAAAAAAAEB////\" +\n           \"/wAAAAAXYIkKAgAAAAEACwAAAFVJbnQxNlZhbHVlAQEMJgAvAD8MJgAAAAUBAAAAAQAAAAAAAAABAf//\" +\n           \"//8AAAAAF2CJCgIAAAABAAoAAABJbnQzMlZhbHVlAQENJgAvAD8NJgAAAAYBAAAAAQAAAAAAAAABAf//\" +\n           \"//8AAAAAF2CJCgIAAAABAAsAAABVSW50MzJWYWx1ZQEBDiYALwA/DiYAAAAHAQAAAAEAAAAAAAAAAQH/\" +\n           \"////AAAAABdgiQoCAAAAAQAKAAAASW50NjRWYWx1ZQEBDyYALwA/DyYAAAAIAQAAAAEAAAAAAAAAAQH/\" +\n           \"////AAAAABdgiQoCAAAAAQALAAAAVUludDY0VmFsdWUBARAmAC8APxAmAAAACQEAAAABAAAAAAAAAAEB\" +\n           \"/////wAAAAAXYIkKAgAAAAEACgAAAEZsb2F0VmFsdWUBAREmAC8APxEmAAAACgEAAAABAAAAAAAAAAEB\" +\n           \"/////wAAAAAXYIkKAgAAAAEACwAAAERvdWJsZVZhbHVlAQESJgAvAD8SJgAAAAsBAAAAAQAAAAAAAAAB\" +\n           \"Af////8AAAAAF2CJCgIAAAABAAsAAABTdHJpbmdWYWx1ZQEBEyYALwA/EyYAAAAMAQAAAAEAAAAAAAAA\" +\n           \"AQH/////AAAAABdgiQoCAAAAAQANAAAARGF0ZVRpbWVWYWx1ZQEBFCYALwA/FCYAAAANAQAAAAEAAAAA\" +\n           \"AAAAAQH/////AAAAABdgiQoCAAAAAQAJAAAAR3VpZFZhbHVlAQEVJgAvAD8VJgAAAA4BAAAAAQAAAAAA\" +\n           \"AAABAf////8AAAAAF2CJCgIAAAABAA8AAABCeXRlU3RyaW5nVmFsdWUBARYmAC8APxYmAAAADwEAAAAB\" +\n           \"AAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEADwAAAFhtbEVsZW1lbnRWYWx1ZQEBFyYALwA/FyYAAAAQ\" +\n           \"AQAAAAEAAAAAAAAAAQH/////AAAAABdgiQoCAAAAAQALAAAATm9kZUlkVmFsdWUBARgmAC8APxgmAAAA\" +\n           \"EQEAAAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEAEwAAAEV4cGFuZGVkTm9kZUlkVmFsdWUBARkm\" +\n           \"AC8APxkmAAAAEgEAAAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEAEgAAAFF1YWxpZmllZE5hbWVW\" +\n           \"YWx1ZQEBGiYALwA/GiYAAAAUAQAAAAEAAAAAAAAAAQH/////AAAAABdgiQoCAAAAAQASAAAATG9jYWxp\" +\n           \"emVkVGV4dFZhbHVlAQEbJgAvAD8bJgAAABUBAAAAAQAAAAAAAAABAf////8AAAAAF2CJCgIAAAABAA8A\" +\n           \"AABTdGF0dXNDb2RlVmFsdWUBARwmAC8APxwmAAAAEwEAAAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAA\" +\n           \"AAEADAAAAFZhcmlhbnRWYWx1ZQEBHSYALwA/HSYAAAAYAQAAAAEAAAAAAAAAAQH/////AAAAABdgiQoC\" +\n           \"AAAAAQAQAAAARW51bWVyYXRpb25WYWx1ZQEBHiYALwA/HiYAAAAdAQAAAAEAAAAAAAAAAQH/////AAAA\" +\n           \"ABdgiQoCAAAAAQAOAAAAU3RydWN0dXJlVmFsdWUBAR8mAC8APx8mAAAAFgEAAAABAAAAAAAAAAEB////\" +\n           \"/wAAAAAXYIkKAgAAAAEACwAAAE51bWJlclZhbHVlAQEgJgAvAD8gJgAAABoBAAAAAQAAAAAAAAABAf//\" +\n           \"//8AAAAAF2CJCgIAAAABAAwAAABJbnRlZ2VyVmFsdWUBASEmAC8APyEmAAAAGwEAAAABAAAAAAAAAAEB\" +\n           \"/////wAAAAAXYIkKAgAAAAEADQAAAFVJbnRlZ2VyVmFsdWUBASImAC8APyImAAAAHAEAAAABAAAAAAAA\" +\n           \"AAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public BaseDataVariableState<bool[]> BooleanValue\n        {\n            get => m_booleanValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_booleanValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_booleanValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<sbyte[]> SByteValue\n        {\n            get => m_sByteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_sByteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_sByteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<byte[]> ByteValue\n        {\n            get => m_byteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<short[]> Int16Value\n        {\n            get => m_int16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ushort[]> UInt16Value\n        {\n            get => m_uInt16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<int[]> Int32Value\n        {\n            get => m_int32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<uint[]> UInt32Value\n        {\n            get => m_uInt32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<long[]> Int64Value\n        {\n            get => m_int64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ulong[]> UInt64Value\n        {\n            get => m_uInt64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<float[]> FloatValue\n        {\n            get => m_floatValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_floatValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_floatValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<double[]> DoubleValue\n        {\n            get => m_doubleValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_doubleValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_doubleValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string[]> StringValue\n        {\n            get => m_stringValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_stringValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_stringValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<DateTime[]> DateTimeValue\n        {\n            get => m_dateTimeValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_dateTimeValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_dateTimeValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<Guid[]> GuidValue\n        {\n            get => m_guidValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_guidValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_guidValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<byte[][]> ByteStringValue\n        {\n            get => m_byteStringValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteStringValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteStringValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<XmlElement[]> XmlElementValue\n        {\n            get => m_xmlElementValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_xmlElementValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_xmlElementValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<NodeId[]> NodeIdValue\n        {\n            get => m_nodeIdValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_nodeIdValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_nodeIdValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ExpandedNodeId[]> ExpandedNodeIdValue\n        {\n            get => m_expandedNodeIdValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_expandedNodeIdValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_expandedNodeIdValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<QualifiedName[]> QualifiedNameValue\n        {\n            get => m_qualifiedNameValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_qualifiedNameValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_qualifiedNameValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<LocalizedText[]> LocalizedTextValue\n        {\n            get => m_localizedTextValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_localizedTextValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_localizedTextValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<StatusCode[]> StatusCodeValue\n        {\n            get => m_statusCodeValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_statusCodeValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_statusCodeValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<object[]> VariantValue\n        {\n            get => m_variantValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_variantValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_variantValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<int[]> EnumerationValue\n        {\n            get => m_enumerationValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_enumerationValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_enumerationValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ExtensionObject[]> StructureValue\n        {\n            get => m_structureValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_structureValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_structureValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<object[]> NumberValue\n        {\n            get => m_numberValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_numberValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_numberValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<object[]> IntegerValue\n        {\n            get => m_integerValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_integerValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_integerValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<object[]> UIntegerValue\n        {\n            get => m_uIntegerValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_uIntegerValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uIntegerValue = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_booleanValue != null)\n            {\n                children.Add(m_booleanValue);\n            }\n\n            if (m_sByteValue != null)\n            {\n                children.Add(m_sByteValue);\n            }\n\n            if (m_byteValue != null)\n            {\n                children.Add(m_byteValue);\n            }\n\n            if (m_int16Value != null)\n            {\n                children.Add(m_int16Value);\n            }\n\n            if (m_uInt16Value != null)\n            {\n                children.Add(m_uInt16Value);\n            }\n\n            if (m_int32Value != null)\n            {\n                children.Add(m_int32Value);\n            }\n\n            if (m_uInt32Value != null)\n            {\n                children.Add(m_uInt32Value);\n            }\n\n            if (m_int64Value != null)\n            {\n                children.Add(m_int64Value);\n            }\n\n            if (m_uInt64Value != null)\n            {\n                children.Add(m_uInt64Value);\n            }\n\n            if (m_floatValue != null)\n            {\n                children.Add(m_floatValue);\n            }\n\n            if (m_doubleValue != null)\n            {\n                children.Add(m_doubleValue);\n            }\n\n            if (m_stringValue != null)\n            {\n                children.Add(m_stringValue);\n            }\n\n            if (m_dateTimeValue != null)\n            {\n                children.Add(m_dateTimeValue);\n            }\n\n            if (m_guidValue != null)\n            {\n                children.Add(m_guidValue);\n            }\n\n            if (m_byteStringValue != null)\n            {\n                children.Add(m_byteStringValue);\n            }\n\n            if (m_xmlElementValue != null)\n            {\n                children.Add(m_xmlElementValue);\n            }\n\n            if (m_nodeIdValue != null)\n            {\n                children.Add(m_nodeIdValue);\n            }\n\n            if (m_expandedNodeIdValue != null)\n            {\n                children.Add(m_expandedNodeIdValue);\n            }\n\n            if (m_qualifiedNameValue != null)\n            {\n                children.Add(m_qualifiedNameValue);\n            }\n\n            if (m_localizedTextValue != null)\n            {\n                children.Add(m_localizedTextValue);\n            }\n\n            if (m_statusCodeValue != null)\n            {\n                children.Add(m_statusCodeValue);\n            }\n\n            if (m_variantValue != null)\n            {\n                children.Add(m_variantValue);\n            }\n\n            if (m_enumerationValue != null)\n            {\n                children.Add(m_enumerationValue);\n            }\n\n            if (m_structureValue != null)\n            {\n                children.Add(m_structureValue);\n            }\n\n            if (m_numberValue != null)\n            {\n                children.Add(m_numberValue);\n            }\n\n            if (m_integerValue != null)\n            {\n                children.Add(m_integerValue);\n            }\n\n            if (m_uIntegerValue != null)\n            {\n                children.Add(m_uIntegerValue);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.BooleanValue:\n                    {\n                        if (createOrReplace && BooleanValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                BooleanValue = new BaseDataVariableState<bool[]>(this);\n                            }\n                            else\n                            {\n                                BooleanValue = (BaseDataVariableState<bool[]>)replacement;\n                            }\n                        }\n\n                        instance = BooleanValue;\n                        break;\n                    }\n\n                case BrowseNames.SByteValue:\n                    {\n                        if (createOrReplace && SByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SByteValue = new BaseDataVariableState<sbyte[]>(this);\n                            }\n                            else\n                            {\n                                SByteValue = (BaseDataVariableState<sbyte[]>)replacement;\n                            }\n                        }\n\n                        instance = SByteValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteValue:\n                    {\n                        if (createOrReplace && ByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteValue = new BaseDataVariableState<byte[]>(this);\n                            }\n                            else\n                            {\n                                ByteValue = (BaseDataVariableState<byte[]>)replacement;\n                            }\n                        }\n\n                        instance = ByteValue;\n                        break;\n                    }\n\n                case BrowseNames.Int16Value:\n                    {\n                        if (createOrReplace && Int16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int16Value = new BaseDataVariableState<short[]>(this);\n                            }\n                            else\n                            {\n                                Int16Value = (BaseDataVariableState<short[]>)replacement;\n                            }\n                        }\n\n                        instance = Int16Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt16Value:\n                    {\n                        if (createOrReplace && UInt16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt16Value = new BaseDataVariableState<ushort[]>(this);\n                            }\n                            else\n                            {\n                                UInt16Value = (BaseDataVariableState<ushort[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt16Value;\n                        break;\n                    }\n\n                case BrowseNames.Int32Value:\n                    {\n                        if (createOrReplace && Int32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int32Value = new BaseDataVariableState<int[]>(this);\n                            }\n                            else\n                            {\n                                Int32Value = (BaseDataVariableState<int[]>)replacement;\n                            }\n                        }\n\n                        instance = Int32Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt32Value:\n                    {\n                        if (createOrReplace && UInt32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt32Value = new BaseDataVariableState<uint[]>(this);\n                            }\n                            else\n                            {\n                                UInt32Value = (BaseDataVariableState<uint[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt32Value;\n                        break;\n                    }\n\n                case BrowseNames.Int64Value:\n                    {\n                        if (createOrReplace && Int64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int64Value = new BaseDataVariableState<long[]>(this);\n                            }\n                            else\n                            {\n                                Int64Value = (BaseDataVariableState<long[]>)replacement;\n                            }\n                        }\n\n                        instance = Int64Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt64Value:\n                    {\n                        if (createOrReplace && UInt64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt64Value = new BaseDataVariableState<ulong[]>(this);\n                            }\n                            else\n                            {\n                                UInt64Value = (BaseDataVariableState<ulong[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt64Value;\n                        break;\n                    }\n\n                case BrowseNames.FloatValue:\n                    {\n                        if (createOrReplace && FloatValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                FloatValue = new BaseDataVariableState<float[]>(this);\n                            }\n                            else\n                            {\n                                FloatValue = (BaseDataVariableState<float[]>)replacement;\n                            }\n                        }\n\n                        instance = FloatValue;\n                        break;\n                    }\n\n                case BrowseNames.DoubleValue:\n                    {\n                        if (createOrReplace && DoubleValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DoubleValue = new BaseDataVariableState<double[]>(this);\n                            }\n                            else\n                            {\n                                DoubleValue = (BaseDataVariableState<double[]>)replacement;\n                            }\n                        }\n\n                        instance = DoubleValue;\n                        break;\n                    }\n\n                case BrowseNames.StringValue:\n                    {\n                        if (createOrReplace && StringValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StringValue = new BaseDataVariableState<string[]>(this);\n                            }\n                            else\n                            {\n                                StringValue = (BaseDataVariableState<string[]>)replacement;\n                            }\n                        }\n\n                        instance = StringValue;\n                        break;\n                    }\n\n                case BrowseNames.DateTimeValue:\n                    {\n                        if (createOrReplace && DateTimeValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DateTimeValue = new BaseDataVariableState<DateTime[]>(this);\n                            }\n                            else\n                            {\n                                DateTimeValue = (BaseDataVariableState<DateTime[]>)replacement;\n                            }\n                        }\n\n                        instance = DateTimeValue;\n                        break;\n                    }\n\n                case BrowseNames.GuidValue:\n                    {\n                        if (createOrReplace && GuidValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                GuidValue = new BaseDataVariableState<Guid[]>(this);\n                            }\n                            else\n                            {\n                                GuidValue = (BaseDataVariableState<Guid[]>)replacement;\n                            }\n                        }\n\n                        instance = GuidValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteStringValue:\n                    {\n                        if (createOrReplace && ByteStringValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteStringValue = new BaseDataVariableState<byte[][]>(this);\n                            }\n                            else\n                            {\n                                ByteStringValue = (BaseDataVariableState<byte[][]>)replacement;\n                            }\n                        }\n\n                        instance = ByteStringValue;\n                        break;\n                    }\n\n                case BrowseNames.XmlElementValue:\n                    {\n                        if (createOrReplace && XmlElementValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                XmlElementValue = new BaseDataVariableState<XmlElement[]>(this);\n                            }\n                            else\n                            {\n                                XmlElementValue = (BaseDataVariableState<XmlElement[]>)replacement;\n                            }\n                        }\n\n                        instance = XmlElementValue;\n                        break;\n                    }\n\n                case BrowseNames.NodeIdValue:\n                    {\n                        if (createOrReplace && NodeIdValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                NodeIdValue = new BaseDataVariableState<NodeId[]>(this);\n                            }\n                            else\n                            {\n                                NodeIdValue = (BaseDataVariableState<NodeId[]>)replacement;\n                            }\n                        }\n\n                        instance = NodeIdValue;\n                        break;\n                    }\n\n                case BrowseNames.ExpandedNodeIdValue:\n                    {\n                        if (createOrReplace && ExpandedNodeIdValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ExpandedNodeIdValue = new BaseDataVariableState<ExpandedNodeId[]>(this);\n                            }\n                            else\n                            {\n                                ExpandedNodeIdValue = (BaseDataVariableState<ExpandedNodeId[]>)replacement;\n                            }\n                        }\n\n                        instance = ExpandedNodeIdValue;\n                        break;\n                    }\n\n                case BrowseNames.QualifiedNameValue:\n                    {\n                        if (createOrReplace && QualifiedNameValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                QualifiedNameValue = new BaseDataVariableState<QualifiedName[]>(this);\n                            }\n                            else\n                            {\n                                QualifiedNameValue = (BaseDataVariableState<QualifiedName[]>)replacement;\n                            }\n                        }\n\n                        instance = QualifiedNameValue;\n                        break;\n                    }\n\n                case BrowseNames.LocalizedTextValue:\n                    {\n                        if (createOrReplace && LocalizedTextValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                LocalizedTextValue = new BaseDataVariableState<LocalizedText[]>(this);\n                            }\n                            else\n                            {\n                                LocalizedTextValue = (BaseDataVariableState<LocalizedText[]>)replacement;\n                            }\n                        }\n\n                        instance = LocalizedTextValue;\n                        break;\n                    }\n\n                case BrowseNames.StatusCodeValue:\n                    {\n                        if (createOrReplace && StatusCodeValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StatusCodeValue = new BaseDataVariableState<StatusCode[]>(this);\n                            }\n                            else\n                            {\n                                StatusCodeValue = (BaseDataVariableState<StatusCode[]>)replacement;\n                            }\n                        }\n\n                        instance = StatusCodeValue;\n                        break;\n                    }\n\n                case BrowseNames.VariantValue:\n                    {\n                        if (createOrReplace && VariantValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                VariantValue = new BaseDataVariableState<object[]>(this);\n                            }\n                            else\n                            {\n                                VariantValue = (BaseDataVariableState<object[]>)replacement;\n                            }\n                        }\n\n                        instance = VariantValue;\n                        break;\n                    }\n\n                case BrowseNames.EnumerationValue:\n                    {\n                        if (createOrReplace && EnumerationValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                EnumerationValue = new BaseDataVariableState<int[]>(this);\n                            }\n                            else\n                            {\n                                EnumerationValue = (BaseDataVariableState<int[]>)replacement;\n                            }\n                        }\n\n                        instance = EnumerationValue;\n                        break;\n                    }\n\n                case BrowseNames.StructureValue:\n                    {\n                        if (createOrReplace && StructureValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StructureValue = new BaseDataVariableState<ExtensionObject[]>(this);\n                            }\n                            else\n                            {\n                                StructureValue = (BaseDataVariableState<ExtensionObject[]>)replacement;\n                            }\n                        }\n\n                        instance = StructureValue;\n                        break;\n                    }\n\n                case BrowseNames.NumberValue:\n                    {\n                        if (createOrReplace && NumberValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                NumberValue = new BaseDataVariableState<object[]>(this);\n                            }\n                            else\n                            {\n                                NumberValue = (BaseDataVariableState<object[]>)replacement;\n                            }\n                        }\n\n                        instance = NumberValue;\n                        break;\n                    }\n\n                case BrowseNames.IntegerValue:\n                    {\n                        if (createOrReplace && IntegerValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                IntegerValue = new BaseDataVariableState<object[]>(this);\n                            }\n                            else\n                            {\n                                IntegerValue = (BaseDataVariableState<object[]>)replacement;\n                            }\n                        }\n\n                        instance = IntegerValue;\n                        break;\n                    }\n\n                case BrowseNames.UIntegerValue:\n                    {\n                        if (createOrReplace && UIntegerValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UIntegerValue = new BaseDataVariableState<object[]>(this);\n                            }\n                            else\n                            {\n                                UIntegerValue = (BaseDataVariableState<object[]>)replacement;\n                            }\n                        }\n\n                        instance = UIntegerValue;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private BaseDataVariableState<bool[]> m_booleanValue;\n        private BaseDataVariableState<sbyte[]> m_sByteValue;\n        private BaseDataVariableState<byte[]> m_byteValue;\n        private BaseDataVariableState<short[]> m_int16Value;\n        private BaseDataVariableState<ushort[]> m_uInt16Value;\n        private BaseDataVariableState<int[]> m_int32Value;\n        private BaseDataVariableState<uint[]> m_uInt32Value;\n        private BaseDataVariableState<long[]> m_int64Value;\n        private BaseDataVariableState<ulong[]> m_uInt64Value;\n        private BaseDataVariableState<float[]> m_floatValue;\n        private BaseDataVariableState<double[]> m_doubleValue;\n        private BaseDataVariableState<string[]> m_stringValue;\n        private BaseDataVariableState<DateTime[]> m_dateTimeValue;\n        private BaseDataVariableState<Guid[]> m_guidValue;\n        private BaseDataVariableState<byte[][]> m_byteStringValue;\n        private BaseDataVariableState<XmlElement[]> m_xmlElementValue;\n        private BaseDataVariableState<NodeId[]> m_nodeIdValue;\n        private BaseDataVariableState<ExpandedNodeId[]> m_expandedNodeIdValue;\n        private BaseDataVariableState<QualifiedName[]> m_qualifiedNameValue;\n        private BaseDataVariableState<LocalizedText[]> m_localizedTextValue;\n        private BaseDataVariableState<StatusCode[]> m_statusCodeValue;\n        private BaseDataVariableState<object[]> m_variantValue;\n        private BaseDataVariableState<int[]> m_enumerationValue;\n        private BaseDataVariableState<ExtensionObject[]> m_structureValue;\n        private BaseDataVariableState<object[]> m_numberValue;\n        private BaseDataVariableState<object[]> m_integerValue;\n        private BaseDataVariableState<object[]> m_uIntegerValue;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region AnalogArrayValueObjectState Class\n#if (!OPCUA_EXCLUDE_AnalogArrayValueObjectState)\n    /// <summary>\n    /// Stores an instance of the AnalogArrayValueObjectType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class AnalogArrayValueObjectState : TestDataObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public AnalogArrayValueObjectState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.AnalogArrayValueObjectType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABACIAAABBbmFsb2dBcnJh\" +\n           \"eVZhbHVlT2JqZWN0VHlwZUluc3RhbmNlAQEjJgEBIyYjJgAAAQAAAAAkAAEBJyYQAAAANWCJCgIAAAAB\" +\n           \"ABAAAABTaW11bGF0aW9uQWN0aXZlAQEkJgMAAAAARwAAAElmIHRydWUgdGhlIHNlcnZlciB3aWxsIHBy\" +\n           \"b2R1Y2UgbmV3IHZhbHVlcyBmb3IgZWFjaCBtb25pdG9yZWQgdmFyaWFibGUuAC4ARCQmAAAAAf////8B\" +\n           \"Af////8AAAAABGGCCgQAAAABAA4AAABHZW5lcmF0ZVZhbHVlcwEBJSYALwEBqSQlJgAAAQH/////AQAA\" +\n           \"ABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBASYmAC4ARCYmAACWAQAAAAEAKgEBRgAAAAoAAABJ\" +\n           \"dGVyYXRpb25zAAf/////AAAAAAMAAAAAJQAAAFRoZSBudW1iZXIgb2YgbmV3IHZhbHVlcyB0byBnZW5l\" +\n           \"cmF0ZS4BACgBAQAAAAEAAAAAAAAAAQH/////AAAAAARggAoBAAAAAQANAAAAQ3ljbGVDb21wbGV0ZQEB\" +\n           \"JyYALwEAQQsnJgAAAQAAAAAkAQEBIyYXAAAAFWCJCgIAAAAAAAcAAABFdmVudElkAQEoJgAuAEQoJgAA\" +\n           \"AA//////AQH/////AAAAABVgiQoCAAAAAAAJAAAARXZlbnRUeXBlAQEpJgAuAEQpJgAAABH/////AQH/\" +\n           \"////AAAAABVgiQoCAAAAAAAKAAAAU291cmNlTm9kZQEBKiYALgBEKiYAAAAR/////wEB/////wAAAAAV\" +\n           \"YIkKAgAAAAAACgAAAFNvdXJjZU5hbWUBASsmAC4ARCsmAAAADP////8BAf////8AAAAAFWCJCgIAAAAA\" +\n           \"AAQAAABUaW1lAQEsJgAuAEQsJgAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAsAAABSZWNlaXZl\" +\n           \"VGltZQEBLSYALgBELSYAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAATWVzc2FnZQEBLyYA\" +\n           \"LgBELyYAAAAV/////wEB/////wAAAAAVYIkKAgAAAAAACAAAAFNldmVyaXR5AQEwJgAuAEQwJgAAAAX/\" +\n           \"////AQH/////AAAAABVgiQoCAAAAAAAQAAAAQ29uZGl0aW9uQ2xhc3NJZAEBQi0ALgBEQi0AAAAR////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAAAEgAAAENvbmRpdGlvbkNsYXNzTmFtZQEBQy0ALgBEQy0AAAAV////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAAADQAAAENvbmRpdGlvbk5hbWUBASktAC4ARCktAAAADP////8BAf//\" +\n           \"//8AAAAAFWCJCgIAAAAAAAgAAABCcmFuY2hJZAEBMSYALgBEMSYAAAAR/////wEB/////wAAAAAVYIkK\" +\n           \"AgAAAAAABgAAAFJldGFpbgEBMiYALgBEMiYAAAAB/////wEB/////wAAAAAVYIkKAgAAAAAADAAAAEVu\" +\n           \"YWJsZWRTdGF0ZQEBMyYALwEAIyMzJgAAABX/////AQECAAAAAQAsIwABAUgmAQAsIwABAVAmAQAAABVg\" +\n           \"iQoCAAAAAAACAAAASWQBATQmAC4ARDQmAAAAAf////8BAf////8AAAAAFWCJCgIAAAAAAAcAAABRdWFs\" +\n           \"aXR5AQE5JgAvAQAqIzkmAAAAE/////8BAf////8BAAAAFWCJCgIAAAAAAA8AAABTb3VyY2VUaW1lc3Rh\" +\n           \"bXABATomAC4ARDomAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAADAAAAExhc3RTZXZlcml0eQEB\" +\n           \"PSYALwEAKiM9JgAAAAX/////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1wAQE+\" +\n           \"JgAuAEQ+JgAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAcAAABDb21tZW50AQE/JgAvAQAqIz8m\" +\n           \"AAAAFf////8BAf////8BAAAAFWCJCgIAAAAAAA8AAABTb3VyY2VUaW1lc3RhbXABAUAmAC4AREAmAAAB\" +\n           \"ACYB/////wEB/////wAAAAAVYIkKAgAAAAAADAAAAENsaWVudFVzZXJJZAEBQSYALgBEQSYAAAAM////\" +\n           \"/wEB/////wAAAAAEYYIKBAAAAAAABwAAAERpc2FibGUBAUMmAC8BAEQjQyYAAAEBAQAAAAEA+QsAAQDz\" +\n           \"CgAAAAAEYYIKBAAAAAAABgAAAEVuYWJsZQEBQiYALwEAQyNCJgAAAQEBAAAAAQD5CwABAPMKAAAAAARh\" +\n           \"ggoEAAAAAAAKAAAAQWRkQ29tbWVudAEBRCYALwEARSNEJgAAAQEBAAAAAQD5CwABAA0LAQAAABdgqQoC\" +\n           \"AAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAUUmAC4AREUmAACWAgAAAAEAKgEBRgAAAAcAAABFdmVudElk\" +\n           \"AA//////AAAAAAMAAAAAKAAAAFRoZSBpZGVudGlmaWVyIGZvciB0aGUgZXZlbnQgdG8gY29tbWVudC4B\" +\n           \"ACoBAUIAAAAHAAAAQ29tbWVudAAV/////wAAAAADAAAAACQAAABUaGUgY29tbWVudCB0byBhZGQgdG8g\" +\n           \"dGhlIGNvbmRpdGlvbi4BACgBAQAAAAEAAAAAAAAAAQH/////AAAAABVgiQoCAAAAAAAKAAAAQWNrZWRT\" +\n           \"dGF0ZQEBSCYALwEAIyNIJgAAABX/////AQEBAAAAAQAsIwEBATMmAQAAABVgiQoCAAAAAAACAAAASWQB\" +\n           \"AUkmAC4AREkmAAAAAf////8BAf////8AAAAABGGCCgQAAAAAAAsAAABBY2tub3dsZWRnZQEBWCYALwEA\" +\n           \"lyNYJgAAAQEBAAAAAQD5CwABAPAiAQAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAVkmAC4A\" +\n           \"RFkmAACWAgAAAAEAKgEBRgAAAAcAAABFdmVudElkAA//////AAAAAAMAAAAAKAAAAFRoZSBpZGVudGlm\" +\n           \"aWVyIGZvciB0aGUgZXZlbnQgdG8gY29tbWVudC4BACoBAUIAAAAHAAAAQ29tbWVudAAV/////wAAAAAD\" +\n           \"AAAAACQAAABUaGUgY29tbWVudCB0byBhZGQgdG8gdGhlIGNvbmRpdGlvbi4BACgBAQAAAAEAAAAAAAAA\" +\n           \"AQH/////AAAAABdgiQoCAAAAAQAKAAAAU0J5dGVWYWx1ZQEBXCYALwEAQAlcJgAAAAIBAAAAAQAAAAAA\" +\n           \"AAABAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQFfJgAuAERfJgAAAQB0A/////8BAf////8A\" +\n           \"AAAAF2CJCgIAAAABAAkAAABCeXRlVmFsdWUBAWImAC8BAEAJYiYAAAADAQAAAAEAAAAAAAAAAQH/////\" +\n           \"AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBZSYALgBEZSYAAAEAdAP/////AQH/////AAAAABdgiQoC\" +\n           \"AAAAAQAKAAAASW50MTZWYWx1ZQEBaCYALwEAQAloJgAAAAQBAAAAAQAAAAAAAAABAf////8BAAAAFWCJ\" +\n           \"CgIAAAAAAAcAAABFVVJhbmdlAQFrJgAuAERrJgAAAQB0A/////8BAf////8AAAAAF2CJCgIAAAABAAsA\" +\n           \"AABVSW50MTZWYWx1ZQEBbiYALwEAQAluJgAAAAUBAAAAAQAAAAAAAAABAf////8BAAAAFWCJCgIAAAAA\" +\n           \"AAcAAABFVVJhbmdlAQFxJgAuAERxJgAAAQB0A/////8BAf////8AAAAAF2CJCgIAAAABAAoAAABJbnQz\" +\n           \"MlZhbHVlAQF0JgAvAQBACXQmAAAABgEAAAABAAAAAAAAAAEB/////wEAAAAVYIkKAgAAAAAABwAAAEVV\" +\n           \"UmFuZ2UBAXcmAC4ARHcmAAABAHQD/////wEB/////wAAAAAXYIkKAgAAAAEACwAAAFVJbnQzMlZhbHVl\" +\n           \"AQF6JgAvAQBACXomAAAABwEAAAABAAAAAAAAAAEB/////wEAAAAVYIkKAgAAAAAABwAAAEVVUmFuZ2UB\" +\n           \"AX0mAC4ARH0mAAABAHQD/////wEB/////wAAAAAXYIkKAgAAAAEACgAAAEludDY0VmFsdWUBAYAmAC8B\" +\n           \"AEAJgCYAAAAIAQAAAAEAAAAAAAAAAQH/////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBgyYALgBE\" +\n           \"gyYAAAEAdAP/////AQH/////AAAAABdgiQoCAAAAAQALAAAAVUludDY0VmFsdWUBAYYmAC8BAEAJhiYA\" +\n           \"AAAJAQAAAAEAAAAAAAAAAQH/////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBiSYALgBEiSYAAAEA\" +\n           \"dAP/////AQH/////AAAAABdgiQoCAAAAAQAKAAAARmxvYXRWYWx1ZQEBjCYALwEAQAmMJgAAAAoBAAAA\" +\n           \"AQAAAAAAAAABAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQGPJgAuAESPJgAAAQB0A/////8B\" +\n           \"Af////8AAAAAF2CJCgIAAAABAAsAAABEb3VibGVWYWx1ZQEBkiYALwEAQAmSJgAAAAsBAAAAAQAAAAAA\" +\n           \"AAABAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQGVJgAuAESVJgAAAQB0A/////8BAf////8A\" +\n           \"AAAAF2CJCgIAAAABAAsAAABOdW1iZXJWYWx1ZQEBmCYALwEAQAmYJgAAABoBAAAAAQAAAAAAAAABAf//\" +\n           \"//8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQGbJgAuAESbJgAAAQB0A/////8BAf////8AAAAAF2CJ\" +\n           \"CgIAAAABAAwAAABJbnRlZ2VyVmFsdWUBAZ4mAC8BAEAJniYAAAAbAQAAAAEAAAAAAAAAAQH/////AQAA\" +\n           \"ABVgiQoCAAAAAAAHAAAARVVSYW5nZQEBoSYALgBEoSYAAAEAdAP/////AQH/////AAAAABdgiQoCAAAA\" +\n           \"AQANAAAAVUludGVnZXJWYWx1ZQEBpCYALwEAQAmkJgAAABwBAAAAAQAAAAAAAAABAf////8BAAAAFWCJ\" +\n           \"CgIAAAAAAAcAAABFVVJhbmdlAQGnJgAuAESnJgAAAQB0A/////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public AnalogItemState<sbyte[]> SByteValue\n        {\n            get => m_sByteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_sByteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_sByteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<byte[]> ByteValue\n        {\n            get => m_byteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<short[]> Int16Value\n        {\n            get => m_int16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<ushort[]> UInt16Value\n        {\n            get => m_uInt16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<int[]> Int32Value\n        {\n            get => m_int32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<uint[]> UInt32Value\n        {\n            get => m_uInt32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<long[]> Int64Value\n        {\n            get => m_int64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<ulong[]> UInt64Value\n        {\n            get => m_uInt64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<float[]> FloatValue\n        {\n            get => m_floatValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_floatValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_floatValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<double[]> DoubleValue\n        {\n            get => m_doubleValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_doubleValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_doubleValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<object[]> NumberValue\n        {\n            get => m_numberValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_numberValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_numberValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<object[]> IntegerValue\n        {\n            get => m_integerValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_integerValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_integerValue = value;\n            }\n        }\n\n        /// <remarks />\n        public AnalogItemState<object[]> UIntegerValue\n        {\n            get => m_uIntegerValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_uIntegerValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uIntegerValue = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_sByteValue != null)\n            {\n                children.Add(m_sByteValue);\n            }\n\n            if (m_byteValue != null)\n            {\n                children.Add(m_byteValue);\n            }\n\n            if (m_int16Value != null)\n            {\n                children.Add(m_int16Value);\n            }\n\n            if (m_uInt16Value != null)\n            {\n                children.Add(m_uInt16Value);\n            }\n\n            if (m_int32Value != null)\n            {\n                children.Add(m_int32Value);\n            }\n\n            if (m_uInt32Value != null)\n            {\n                children.Add(m_uInt32Value);\n            }\n\n            if (m_int64Value != null)\n            {\n                children.Add(m_int64Value);\n            }\n\n            if (m_uInt64Value != null)\n            {\n                children.Add(m_uInt64Value);\n            }\n\n            if (m_floatValue != null)\n            {\n                children.Add(m_floatValue);\n            }\n\n            if (m_doubleValue != null)\n            {\n                children.Add(m_doubleValue);\n            }\n\n            if (m_numberValue != null)\n            {\n                children.Add(m_numberValue);\n            }\n\n            if (m_integerValue != null)\n            {\n                children.Add(m_integerValue);\n            }\n\n            if (m_uIntegerValue != null)\n            {\n                children.Add(m_uIntegerValue);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.SByteValue:\n                    {\n                        if (createOrReplace && SByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SByteValue = new AnalogItemState<sbyte[]>(this);\n                            }\n                            else\n                            {\n                                SByteValue = (AnalogItemState<sbyte[]>)replacement;\n                            }\n                        }\n\n                        instance = SByteValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteValue:\n                    {\n                        if (createOrReplace && ByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteValue = new AnalogItemState<byte[]>(this);\n                            }\n                            else\n                            {\n                                ByteValue = (AnalogItemState<byte[]>)replacement;\n                            }\n                        }\n\n                        instance = ByteValue;\n                        break;\n                    }\n\n                case BrowseNames.Int16Value:\n                    {\n                        if (createOrReplace && Int16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int16Value = new AnalogItemState<short[]>(this);\n                            }\n                            else\n                            {\n                                Int16Value = (AnalogItemState<short[]>)replacement;\n                            }\n                        }\n\n                        instance = Int16Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt16Value:\n                    {\n                        if (createOrReplace && UInt16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt16Value = new AnalogItemState<ushort[]>(this);\n                            }\n                            else\n                            {\n                                UInt16Value = (AnalogItemState<ushort[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt16Value;\n                        break;\n                    }\n\n                case BrowseNames.Int32Value:\n                    {\n                        if (createOrReplace && Int32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int32Value = new AnalogItemState<int[]>(this);\n                            }\n                            else\n                            {\n                                Int32Value = (AnalogItemState<int[]>)replacement;\n                            }\n                        }\n\n                        instance = Int32Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt32Value:\n                    {\n                        if (createOrReplace && UInt32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt32Value = new AnalogItemState<uint[]>(this);\n                            }\n                            else\n                            {\n                                UInt32Value = (AnalogItemState<uint[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt32Value;\n                        break;\n                    }\n\n                case BrowseNames.Int64Value:\n                    {\n                        if (createOrReplace && Int64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int64Value = new AnalogItemState<long[]>(this);\n                            }\n                            else\n                            {\n                                Int64Value = (AnalogItemState<long[]>)replacement;\n                            }\n                        }\n\n                        instance = Int64Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt64Value:\n                    {\n                        if (createOrReplace && UInt64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt64Value = new AnalogItemState<ulong[]>(this);\n                            }\n                            else\n                            {\n                                UInt64Value = (AnalogItemState<ulong[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt64Value;\n                        break;\n                    }\n\n                case BrowseNames.FloatValue:\n                    {\n                        if (createOrReplace && FloatValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                FloatValue = new AnalogItemState<float[]>(this);\n                            }\n                            else\n                            {\n                                FloatValue = (AnalogItemState<float[]>)replacement;\n                            }\n                        }\n\n                        instance = FloatValue;\n                        break;\n                    }\n\n                case BrowseNames.DoubleValue:\n                    {\n                        if (createOrReplace && DoubleValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DoubleValue = new AnalogItemState<double[]>(this);\n                            }\n                            else\n                            {\n                                DoubleValue = (AnalogItemState<double[]>)replacement;\n                            }\n                        }\n\n                        instance = DoubleValue;\n                        break;\n                    }\n\n                case BrowseNames.NumberValue:\n                    {\n                        if (createOrReplace && NumberValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                NumberValue = new AnalogItemState<object[]>(this);\n                            }\n                            else\n                            {\n                                NumberValue = (AnalogItemState<object[]>)replacement;\n                            }\n                        }\n\n                        instance = NumberValue;\n                        break;\n                    }\n\n                case BrowseNames.IntegerValue:\n                    {\n                        if (createOrReplace && IntegerValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                IntegerValue = new AnalogItemState<object[]>(this);\n                            }\n                            else\n                            {\n                                IntegerValue = (AnalogItemState<object[]>)replacement;\n                            }\n                        }\n\n                        instance = IntegerValue;\n                        break;\n                    }\n\n                case BrowseNames.UIntegerValue:\n                    {\n                        if (createOrReplace && UIntegerValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UIntegerValue = new AnalogItemState<object[]>(this);\n                            }\n                            else\n                            {\n                                UIntegerValue = (AnalogItemState<object[]>)replacement;\n                            }\n                        }\n\n                        instance = UIntegerValue;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private AnalogItemState<sbyte[]> m_sByteValue;\n        private AnalogItemState<byte[]> m_byteValue;\n        private AnalogItemState<short[]> m_int16Value;\n        private AnalogItemState<ushort[]> m_uInt16Value;\n        private AnalogItemState<int[]> m_int32Value;\n        private AnalogItemState<uint[]> m_uInt32Value;\n        private AnalogItemState<long[]> m_int64Value;\n        private AnalogItemState<ulong[]> m_uInt64Value;\n        private AnalogItemState<float[]> m_floatValue;\n        private AnalogItemState<double[]> m_doubleValue;\n        private AnalogItemState<object[]> m_numberValue;\n        private AnalogItemState<object[]> m_integerValue;\n        private AnalogItemState<object[]> m_uIntegerValue;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region UserScalarValueObjectState Class\n#if (!OPCUA_EXCLUDE_UserScalarValueObjectState)\n    /// <summary>\n    /// Stores an instance of the UserScalarValueObjectType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class UserScalarValueObjectState : TestDataObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public UserScalarValueObjectState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.UserScalarValueObjectType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABACEAAABVc2VyU2NhbGFy\" +\n           \"VmFsdWVPYmplY3RUeXBlSW5zdGFuY2UBAcEmAQHBJsEmAAABAAAAACQAAQHFJhkAAAA1YIkKAgAAAAEA\" +\n           \"EAAAAFNpbXVsYXRpb25BY3RpdmUBAcImAwAAAABHAAAASWYgdHJ1ZSB0aGUgc2VydmVyIHdpbGwgcHJv\" +\n           \"ZHVjZSBuZXcgdmFsdWVzIGZvciBlYWNoIG1vbml0b3JlZCB2YXJpYWJsZS4ALgBEwiYAAAAB/////wEB\" +\n           \"/////wAAAAAEYYIKBAAAAAEADgAAAEdlbmVyYXRlVmFsdWVzAQHDJgAvAQGpJMMmAAABAf////8BAAAA\" +\n           \"F2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBxCYALgBExCYAAJYBAAAAAQAqAQFGAAAACgAAAEl0\" +\n           \"ZXJhdGlvbnMAB/////8AAAAAAwAAAAAlAAAAVGhlIG51bWJlciBvZiBuZXcgdmFsdWVzIHRvIGdlbmVy\" +\n           \"YXRlLgEAKAEBAAAAAQAAAAAAAAABAf////8AAAAABGCACgEAAAABAA0AAABDeWNsZUNvbXBsZXRlAQHF\" +\n           \"JgAvAQBBC8UmAAABAAAAACQBAQHBJhcAAAAVYIkKAgAAAAAABwAAAEV2ZW50SWQBAcYmAC4ARMYmAAAA\" +\n           \"D/////8BAf////8AAAAAFWCJCgIAAAAAAAkAAABFdmVudFR5cGUBAccmAC4ARMcmAAAAEf////8BAf//\" +\n           \"//8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VOb2RlAQHIJgAuAETIJgAAABH/////AQH/////AAAAABVg\" +\n           \"iQoCAAAAAAAKAAAAU291cmNlTmFtZQEBySYALgBEySYAAAAM/////wEB/////wAAAAAVYIkKAgAAAAAA\" +\n           \"BAAAAFRpbWUBAcomAC4ARMomAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAACwAAAFJlY2VpdmVU\" +\n           \"aW1lAQHLJgAuAETLJgAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAcAAABNZXNzYWdlAQHNJgAu\" +\n           \"AETNJgAAABX/////AQH/////AAAAABVgiQoCAAAAAAAIAAAAU2V2ZXJpdHkBAc4mAC4ARM4mAAAABf//\" +\n           \"//8BAf////8AAAAAFWCJCgIAAAAAABAAAABDb25kaXRpb25DbGFzc0lkAQFELQAuAERELQAAABH/////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAASAAAAQ29uZGl0aW9uQ2xhc3NOYW1lAQFFLQAuAERFLQAAABX/////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAANAAAAQ29uZGl0aW9uTmFtZQEBKi0ALgBEKi0AAAAM/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAACAAAAEJyYW5jaElkAQHPJgAuAETPJgAAABH/////AQH/////AAAAABVgiQoC\" +\n           \"AAAAAAAGAAAAUmV0YWluAQHQJgAuAETQJgAAAAH/////AQH/////AAAAABVgiQoCAAAAAAAMAAAARW5h\" +\n           \"YmxlZFN0YXRlAQHRJgAvAQAjI9EmAAAAFf////8BAQIAAAABACwjAAEB5iYBACwjAAEB7iYBAAAAFWCJ\" +\n           \"CgIAAAAAAAIAAABJZAEB0iYALgBE0iYAAAAB/////wEB/////wAAAAAVYIkKAgAAAAAABwAAAFF1YWxp\" +\n           \"dHkBAdcmAC8BACoj1yYAAAAT/////wEB/////wEAAAAVYIkKAgAAAAAADwAAAFNvdXJjZVRpbWVzdGFt\" +\n           \"cAEB2CYALgBE2CYAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAAMAAAATGFzdFNldmVyaXR5AQHb\" +\n           \"JgAvAQAqI9smAAAABf////8BAf////8BAAAAFWCJCgIAAAAAAA8AAABTb3VyY2VUaW1lc3RhbXABAdwm\" +\n           \"AC4ARNwmAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAABwAAAENvbW1lbnQBAd0mAC8BACoj3SYA\" +\n           \"AAAV/////wEB/////wEAAAAVYIkKAgAAAAAADwAAAFNvdXJjZVRpbWVzdGFtcAEB3iYALgBE3iYAAAEA\" +\n           \"JgH/////AQH/////AAAAABVgiQoCAAAAAAAMAAAAQ2xpZW50VXNlcklkAQHfJgAuAETfJgAAAAz/////\" +\n           \"AQH/////AAAAAARhggoEAAAAAAAHAAAARGlzYWJsZQEB4SYALwEARCPhJgAAAQEBAAAAAQD5CwABAPMK\" +\n           \"AAAAAARhggoEAAAAAAAGAAAARW5hYmxlAQHgJgAvAQBDI+AmAAABAQEAAAABAPkLAAEA8woAAAAABGGC\" +\n           \"CgQAAAAAAAoAAABBZGRDb21tZW50AQHiJgAvAQBFI+ImAAABAQEAAAABAPkLAAEADQsBAAAAF2CpCgIA\" +\n           \"AAAAAA4AAABJbnB1dEFyZ3VtZW50cwEB4yYALgBE4yYAAJYCAAAAAQAqAQFGAAAABwAAAEV2ZW50SWQA\" +\n           \"D/////8AAAAAAwAAAAAoAAAAVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBldmVudCB0byBjb21tZW50LgEA\" +\n           \"KgEBQgAAAAcAAABDb21tZW50ABX/////AAAAAAMAAAAAJAAAAFRoZSBjb21tZW50IHRvIGFkZCB0byB0\" +\n           \"aGUgY29uZGl0aW9uLgEAKAEBAAAAAQAAAAAAAAABAf////8AAAAAFWCJCgIAAAAAAAoAAABBY2tlZFN0\" +\n           \"YXRlAQHmJgAvAQAjI+YmAAAAFf////8BAQEAAAABACwjAQEB0SYBAAAAFWCJCgIAAAAAAAIAAABJZAEB\" +\n           \"5yYALgBE5yYAAAAB/////wEB/////wAAAAAEYYIKBAAAAAAACwAAAEFja25vd2xlZGdlAQH2JgAvAQCX\" +\n           \"I/YmAAABAQEAAAABAPkLAAEA8CIBAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEB9yYALgBE\" +\n           \"9yYAAJYCAAAAAQAqAQFGAAAABwAAAEV2ZW50SWQAD/////8AAAAAAwAAAAAoAAAAVGhlIGlkZW50aWZp\" +\n           \"ZXIgZm9yIHRoZSBldmVudCB0byBjb21tZW50LgEAKgEBQgAAAAcAAABDb21tZW50ABX/////AAAAAAMA\" +\n           \"AAAAJAAAAFRoZSBjb21tZW50IHRvIGFkZCB0byB0aGUgY29uZGl0aW9uLgEAKAEBAAAAAQAAAAAAAAAB\" +\n           \"Af////8AAAAAFWCJCgIAAAABAAwAAABCb29sZWFuVmFsdWUBAfomAC8AP/omAAABAaom/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAEACgAAAFNCeXRlVmFsdWUBAfsmAC8AP/smAAABAasm/////wEB/////wAAAAAV\" +\n           \"YIkKAgAAAAEACQAAAEJ5dGVWYWx1ZQEB/CYALwA//CYAAAEBrCb/////AQH/////AAAAABVgiQoCAAAA\" +\n           \"AQAKAAAASW50MTZWYWx1ZQEB/SYALwA//SYAAAEBrSb/////AQH/////AAAAABVgiQoCAAAAAQALAAAA\" +\n           \"VUludDE2VmFsdWUBAf4mAC8AP/4mAAABAa4m/////wEB/////wAAAAAVYIkKAgAAAAEACgAAAEludDMy\" +\n           \"VmFsdWUBAf8mAC8AP/8mAAABAa8m/////wEB/////wAAAAAVYIkKAgAAAAEACwAAAFVJbnQzMlZhbHVl\" +\n           \"AQEAJwAvAD8AJwAAAQGwJv////8BAf////8AAAAAFWCJCgIAAAABAAoAAABJbnQ2NFZhbHVlAQEBJwAv\" +\n           \"AD8BJwAAAQGxJv////8BAf////8AAAAAFWCJCgIAAAABAAsAAABVSW50NjRWYWx1ZQEBAicALwA/AicA\" +\n           \"AAEBsib/////AQH/////AAAAABVgiQoCAAAAAQAKAAAARmxvYXRWYWx1ZQEBAycALwA/AycAAAEBsyb/\" +\n           \"////AQH/////AAAAABVgiQoCAAAAAQALAAAARG91YmxlVmFsdWUBAQQnAC8APwQnAAABAbQm/////wEB\" +\n           \"/////wAAAAAVYIkKAgAAAAEACwAAAFN0cmluZ1ZhbHVlAQEFJwAvAD8FJwAAAQG1Jv////8BAf////8A\" +\n           \"AAAAFWCJCgIAAAABAA0AAABEYXRlVGltZVZhbHVlAQEGJwAvAD8GJwAAAQG2Jv////8BAf////8AAAAA\" +\n           \"FWCJCgIAAAABAAkAAABHdWlkVmFsdWUBAQcnAC8APwcnAAABAbcm/////wEB/////wAAAAAVYIkKAgAA\" +\n           \"AAEADwAAAEJ5dGVTdHJpbmdWYWx1ZQEBCCcALwA/CCcAAAEBuCb/////AQH/////AAAAABVgiQoCAAAA\" +\n           \"AQAPAAAAWG1sRWxlbWVudFZhbHVlAQEJJwAvAD8JJwAAAQG5Jv////8BAf////8AAAAAFWCJCgIAAAAB\" +\n           \"AAsAAABOb2RlSWRWYWx1ZQEBCicALwA/CicAAAEBuib/////AQH/////AAAAABVgiQoCAAAAAQATAAAA\" +\n           \"RXhwYW5kZWROb2RlSWRWYWx1ZQEBCycALwA/CycAAAEBuyb/////AQH/////AAAAABVgiQoCAAAAAQAS\" +\n           \"AAAAUXVhbGlmaWVkTmFtZVZhbHVlAQEMJwAvAD8MJwAAAQG8Jv////8BAf////8AAAAAFWCJCgIAAAAB\" +\n           \"ABIAAABMb2NhbGl6ZWRUZXh0VmFsdWUBAQ0nAC8APw0nAAABAb0m/////wEB/////wAAAAAVYIkKAgAA\" +\n           \"AAEADwAAAFN0YXR1c0NvZGVWYWx1ZQEBDicALwA/DicAAAEBvib/////AQH/////AAAAABVgiQoCAAAA\" +\n           \"AQAMAAAAVmFyaWFudFZhbHVlAQEPJwAvAD8PJwAAAQG/Jv////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public BaseDataVariableState<bool> BooleanValue\n        {\n            get => m_booleanValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_booleanValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_booleanValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<sbyte> SByteValue\n        {\n            get => m_sByteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_sByteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_sByteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<byte> ByteValue\n        {\n            get => m_byteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<short> Int16Value\n        {\n            get => m_int16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ushort> UInt16Value\n        {\n            get => m_uInt16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<int> Int32Value\n        {\n            get => m_int32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<uint> UInt32Value\n        {\n            get => m_uInt32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<long> Int64Value\n        {\n            get => m_int64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ulong> UInt64Value\n        {\n            get => m_uInt64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<float> FloatValue\n        {\n            get => m_floatValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_floatValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_floatValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<double> DoubleValue\n        {\n            get => m_doubleValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_doubleValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_doubleValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string> StringValue\n        {\n            get => m_stringValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_stringValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_stringValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<DateTime> DateTimeValue\n        {\n            get => m_dateTimeValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_dateTimeValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_dateTimeValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<Guid> GuidValue\n        {\n            get => m_guidValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_guidValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_guidValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<byte[]> ByteStringValue\n        {\n            get => m_byteStringValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteStringValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteStringValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<XmlElement> XmlElementValue\n        {\n            get => m_xmlElementValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_xmlElementValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_xmlElementValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<NodeId> NodeIdValue\n        {\n            get => m_nodeIdValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_nodeIdValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_nodeIdValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ExpandedNodeId> ExpandedNodeIdValue\n        {\n            get => m_expandedNodeIdValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_expandedNodeIdValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_expandedNodeIdValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<QualifiedName> QualifiedNameValue\n        {\n            get => m_qualifiedNameValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_qualifiedNameValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_qualifiedNameValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<LocalizedText> LocalizedTextValue\n        {\n            get => m_localizedTextValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_localizedTextValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_localizedTextValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<StatusCode> StatusCodeValue\n        {\n            get => m_statusCodeValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_statusCodeValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_statusCodeValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState VariantValue\n        {\n            get => m_variantValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_variantValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_variantValue = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_booleanValue != null)\n            {\n                children.Add(m_booleanValue);\n            }\n\n            if (m_sByteValue != null)\n            {\n                children.Add(m_sByteValue);\n            }\n\n            if (m_byteValue != null)\n            {\n                children.Add(m_byteValue);\n            }\n\n            if (m_int16Value != null)\n            {\n                children.Add(m_int16Value);\n            }\n\n            if (m_uInt16Value != null)\n            {\n                children.Add(m_uInt16Value);\n            }\n\n            if (m_int32Value != null)\n            {\n                children.Add(m_int32Value);\n            }\n\n            if (m_uInt32Value != null)\n            {\n                children.Add(m_uInt32Value);\n            }\n\n            if (m_int64Value != null)\n            {\n                children.Add(m_int64Value);\n            }\n\n            if (m_uInt64Value != null)\n            {\n                children.Add(m_uInt64Value);\n            }\n\n            if (m_floatValue != null)\n            {\n                children.Add(m_floatValue);\n            }\n\n            if (m_doubleValue != null)\n            {\n                children.Add(m_doubleValue);\n            }\n\n            if (m_stringValue != null)\n            {\n                children.Add(m_stringValue);\n            }\n\n            if (m_dateTimeValue != null)\n            {\n                children.Add(m_dateTimeValue);\n            }\n\n            if (m_guidValue != null)\n            {\n                children.Add(m_guidValue);\n            }\n\n            if (m_byteStringValue != null)\n            {\n                children.Add(m_byteStringValue);\n            }\n\n            if (m_xmlElementValue != null)\n            {\n                children.Add(m_xmlElementValue);\n            }\n\n            if (m_nodeIdValue != null)\n            {\n                children.Add(m_nodeIdValue);\n            }\n\n            if (m_expandedNodeIdValue != null)\n            {\n                children.Add(m_expandedNodeIdValue);\n            }\n\n            if (m_qualifiedNameValue != null)\n            {\n                children.Add(m_qualifiedNameValue);\n            }\n\n            if (m_localizedTextValue != null)\n            {\n                children.Add(m_localizedTextValue);\n            }\n\n            if (m_statusCodeValue != null)\n            {\n                children.Add(m_statusCodeValue);\n            }\n\n            if (m_variantValue != null)\n            {\n                children.Add(m_variantValue);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.BooleanValue:\n                    {\n                        if (createOrReplace && BooleanValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                BooleanValue = new BaseDataVariableState<bool>(this);\n                            }\n                            else\n                            {\n                                BooleanValue = (BaseDataVariableState<bool>)replacement;\n                            }\n                        }\n\n                        instance = BooleanValue;\n                        break;\n                    }\n\n                case BrowseNames.SByteValue:\n                    {\n                        if (createOrReplace && SByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SByteValue = new BaseDataVariableState<sbyte>(this);\n                            }\n                            else\n                            {\n                                SByteValue = (BaseDataVariableState<sbyte>)replacement;\n                            }\n                        }\n\n                        instance = SByteValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteValue:\n                    {\n                        if (createOrReplace && ByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteValue = new BaseDataVariableState<byte>(this);\n                            }\n                            else\n                            {\n                                ByteValue = (BaseDataVariableState<byte>)replacement;\n                            }\n                        }\n\n                        instance = ByteValue;\n                        break;\n                    }\n\n                case BrowseNames.Int16Value:\n                    {\n                        if (createOrReplace && Int16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int16Value = new BaseDataVariableState<short>(this);\n                            }\n                            else\n                            {\n                                Int16Value = (BaseDataVariableState<short>)replacement;\n                            }\n                        }\n\n                        instance = Int16Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt16Value:\n                    {\n                        if (createOrReplace && UInt16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt16Value = new BaseDataVariableState<ushort>(this);\n                            }\n                            else\n                            {\n                                UInt16Value = (BaseDataVariableState<ushort>)replacement;\n                            }\n                        }\n\n                        instance = UInt16Value;\n                        break;\n                    }\n\n                case BrowseNames.Int32Value:\n                    {\n                        if (createOrReplace && Int32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int32Value = new BaseDataVariableState<int>(this);\n                            }\n                            else\n                            {\n                                Int32Value = (BaseDataVariableState<int>)replacement;\n                            }\n                        }\n\n                        instance = Int32Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt32Value:\n                    {\n                        if (createOrReplace && UInt32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt32Value = new BaseDataVariableState<uint>(this);\n                            }\n                            else\n                            {\n                                UInt32Value = (BaseDataVariableState<uint>)replacement;\n                            }\n                        }\n\n                        instance = UInt32Value;\n                        break;\n                    }\n\n                case BrowseNames.Int64Value:\n                    {\n                        if (createOrReplace && Int64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int64Value = new BaseDataVariableState<long>(this);\n                            }\n                            else\n                            {\n                                Int64Value = (BaseDataVariableState<long>)replacement;\n                            }\n                        }\n\n                        instance = Int64Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt64Value:\n                    {\n                        if (createOrReplace && UInt64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt64Value = new BaseDataVariableState<ulong>(this);\n                            }\n                            else\n                            {\n                                UInt64Value = (BaseDataVariableState<ulong>)replacement;\n                            }\n                        }\n\n                        instance = UInt64Value;\n                        break;\n                    }\n\n                case BrowseNames.FloatValue:\n                    {\n                        if (createOrReplace && FloatValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                FloatValue = new BaseDataVariableState<float>(this);\n                            }\n                            else\n                            {\n                                FloatValue = (BaseDataVariableState<float>)replacement;\n                            }\n                        }\n\n                        instance = FloatValue;\n                        break;\n                    }\n\n                case BrowseNames.DoubleValue:\n                    {\n                        if (createOrReplace && DoubleValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DoubleValue = new BaseDataVariableState<double>(this);\n                            }\n                            else\n                            {\n                                DoubleValue = (BaseDataVariableState<double>)replacement;\n                            }\n                        }\n\n                        instance = DoubleValue;\n                        break;\n                    }\n\n                case BrowseNames.StringValue:\n                    {\n                        if (createOrReplace && StringValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StringValue = new BaseDataVariableState<string>(this);\n                            }\n                            else\n                            {\n                                StringValue = (BaseDataVariableState<string>)replacement;\n                            }\n                        }\n\n                        instance = StringValue;\n                        break;\n                    }\n\n                case BrowseNames.DateTimeValue:\n                    {\n                        if (createOrReplace && DateTimeValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DateTimeValue = new BaseDataVariableState<DateTime>(this);\n                            }\n                            else\n                            {\n                                DateTimeValue = (BaseDataVariableState<DateTime>)replacement;\n                            }\n                        }\n\n                        instance = DateTimeValue;\n                        break;\n                    }\n\n                case BrowseNames.GuidValue:\n                    {\n                        if (createOrReplace && GuidValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                GuidValue = new BaseDataVariableState<Guid>(this);\n                            }\n                            else\n                            {\n                                GuidValue = (BaseDataVariableState<Guid>)replacement;\n                            }\n                        }\n\n                        instance = GuidValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteStringValue:\n                    {\n                        if (createOrReplace && ByteStringValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteStringValue = new BaseDataVariableState<byte[]>(this);\n                            }\n                            else\n                            {\n                                ByteStringValue = (BaseDataVariableState<byte[]>)replacement;\n                            }\n                        }\n\n                        instance = ByteStringValue;\n                        break;\n                    }\n\n                case BrowseNames.XmlElementValue:\n                    {\n                        if (createOrReplace && XmlElementValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                XmlElementValue = new BaseDataVariableState<XmlElement>(this);\n                            }\n                            else\n                            {\n                                XmlElementValue = (BaseDataVariableState<XmlElement>)replacement;\n                            }\n                        }\n\n                        instance = XmlElementValue;\n                        break;\n                    }\n\n                case BrowseNames.NodeIdValue:\n                    {\n                        if (createOrReplace && NodeIdValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                NodeIdValue = new BaseDataVariableState<NodeId>(this);\n                            }\n                            else\n                            {\n                                NodeIdValue = (BaseDataVariableState<NodeId>)replacement;\n                            }\n                        }\n\n                        instance = NodeIdValue;\n                        break;\n                    }\n\n                case BrowseNames.ExpandedNodeIdValue:\n                    {\n                        if (createOrReplace && ExpandedNodeIdValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ExpandedNodeIdValue = new BaseDataVariableState<ExpandedNodeId>(this);\n                            }\n                            else\n                            {\n                                ExpandedNodeIdValue = (BaseDataVariableState<ExpandedNodeId>)replacement;\n                            }\n                        }\n\n                        instance = ExpandedNodeIdValue;\n                        break;\n                    }\n\n                case BrowseNames.QualifiedNameValue:\n                    {\n                        if (createOrReplace && QualifiedNameValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                QualifiedNameValue = new BaseDataVariableState<QualifiedName>(this);\n                            }\n                            else\n                            {\n                                QualifiedNameValue = (BaseDataVariableState<QualifiedName>)replacement;\n                            }\n                        }\n\n                        instance = QualifiedNameValue;\n                        break;\n                    }\n\n                case BrowseNames.LocalizedTextValue:\n                    {\n                        if (createOrReplace && LocalizedTextValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                LocalizedTextValue = new BaseDataVariableState<LocalizedText>(this);\n                            }\n                            else\n                            {\n                                LocalizedTextValue = (BaseDataVariableState<LocalizedText>)replacement;\n                            }\n                        }\n\n                        instance = LocalizedTextValue;\n                        break;\n                    }\n\n                case BrowseNames.StatusCodeValue:\n                    {\n                        if (createOrReplace && StatusCodeValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StatusCodeValue = new BaseDataVariableState<StatusCode>(this);\n                            }\n                            else\n                            {\n                                StatusCodeValue = (BaseDataVariableState<StatusCode>)replacement;\n                            }\n                        }\n\n                        instance = StatusCodeValue;\n                        break;\n                    }\n\n                case BrowseNames.VariantValue:\n                    {\n                        if (createOrReplace && VariantValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                VariantValue = new BaseDataVariableState(this);\n                            }\n                            else\n                            {\n                                VariantValue = (BaseDataVariableState)replacement;\n                            }\n                        }\n\n                        instance = VariantValue;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private BaseDataVariableState<bool> m_booleanValue;\n        private BaseDataVariableState<sbyte> m_sByteValue;\n        private BaseDataVariableState<byte> m_byteValue;\n        private BaseDataVariableState<short> m_int16Value;\n        private BaseDataVariableState<ushort> m_uInt16Value;\n        private BaseDataVariableState<int> m_int32Value;\n        private BaseDataVariableState<uint> m_uInt32Value;\n        private BaseDataVariableState<long> m_int64Value;\n        private BaseDataVariableState<ulong> m_uInt64Value;\n        private BaseDataVariableState<float> m_floatValue;\n        private BaseDataVariableState<double> m_doubleValue;\n        private BaseDataVariableState<string> m_stringValue;\n        private BaseDataVariableState<DateTime> m_dateTimeValue;\n        private BaseDataVariableState<Guid> m_guidValue;\n        private BaseDataVariableState<byte[]> m_byteStringValue;\n        private BaseDataVariableState<XmlElement> m_xmlElementValue;\n        private BaseDataVariableState<NodeId> m_nodeIdValue;\n        private BaseDataVariableState<ExpandedNodeId> m_expandedNodeIdValue;\n        private BaseDataVariableState<QualifiedName> m_qualifiedNameValue;\n        private BaseDataVariableState<LocalizedText> m_localizedTextValue;\n        private BaseDataVariableState<StatusCode> m_statusCodeValue;\n        private BaseDataVariableState m_variantValue;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region UserScalarValue1MethodState Class\n#if (!OPCUA_EXCLUDE_UserScalarValue1MethodState)\n    /// <summary>\n    /// Stores an instance of the UserScalarValue1MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class UserScalarValue1MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public UserScalarValue1MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new UserScalarValue1MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABoAAABVc2VyU2NhbGFy\" +\n           \"VmFsdWUxTWV0aG9kVHlwZQEBECcALwEBECcQJwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5wdXRB\" +\n           \"cmd1bWVudHMBAREnAC4ARBEnAACWDAAAAAEAKgEBGgAAAAkAAABCb29sZWFuSW4BAaom/////wAAAAAA\" +\n           \"AQAqAQEYAAAABwAAAFNCeXRlSW4BAasm/////wAAAAAAAQAqAQEXAAAABgAAAEJ5dGVJbgEBrCb/////\" +\n           \"AAAAAAABACoBARgAAAAHAAAASW50MTZJbgEBrSb/////AAAAAAABACoBARkAAAAIAAAAVUludDE2SW4B\" +\n           \"Aa4m/////wAAAAAAAQAqAQEYAAAABwAAAEludDMySW4BAa8m/////wAAAAAAAQAqAQEZAAAACAAAAFVJ\" +\n           \"bnQzMkluAQGwJv////8AAAAAAAEAKgEBGAAAAAcAAABJbnQ2NEluAQGxJv////8AAAAAAAEAKgEBGQAA\" +\n           \"AAgAAABVSW50NjRJbgEBsib/////AAAAAAABACoBARgAAAAHAAAARmxvYXRJbgEBsyb/////AAAAAAAB\" +\n           \"ACoBARkAAAAIAAAARG91YmxlSW4BAbQm/////wAAAAAAAQAqAQEZAAAACAAAAFN0cmluZ0luAQG1Jv//\" +\n           \"//8AAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVu\" +\n           \"dHMBARInAC4ARBInAACWDAAAAAEAKgEBGwAAAAoAAABCb29sZWFuT3V0AQGqJv////8AAAAAAAEAKgEB\" +\n           \"GQAAAAgAAABTQnl0ZU91dAEBqyb/////AAAAAAABACoBARgAAAAHAAAAQnl0ZU91dAEBrCb/////AAAA\" +\n           \"AAABACoBARkAAAAIAAAASW50MTZPdXQBAa0m/////wAAAAAAAQAqAQEaAAAACQAAAFVJbnQxNk91dAEB\" +\n           \"rib/////AAAAAAABACoBARkAAAAIAAAASW50MzJPdXQBAa8m/////wAAAAAAAQAqAQEaAAAACQAAAFVJ\" +\n           \"bnQzMk91dAEBsCb/////AAAAAAABACoBARkAAAAIAAAASW50NjRPdXQBAbEm/////wAAAAAAAQAqAQEa\" +\n           \"AAAACQAAAFVJbnQ2NE91dAEBsib/////AAAAAAABACoBARkAAAAIAAAARmxvYXRPdXQBAbMm/////wAA\" +\n           \"AAAAAQAqAQEaAAAACQAAAERvdWJsZU91dAEBtCb/////AAAAAAABACoBARoAAAAJAAAAU3RyaW5nT3V0\" +\n           \"AQG1Jv////8AAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public UserScalarValue1MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            bool booleanIn = (bool)_inputArguments[0];\n            sbyte sByteIn = (sbyte)_inputArguments[1];\n            byte byteIn = (byte)_inputArguments[2];\n            short int16In = (short)_inputArguments[3];\n            ushort uInt16In = (ushort)_inputArguments[4];\n            int int32In = (int)_inputArguments[5];\n            uint uInt32In = (uint)_inputArguments[6];\n            long int64In = (long)_inputArguments[7];\n            ulong uInt64In = (ulong)_inputArguments[8];\n            float floatIn = (float)_inputArguments[9];\n            double doubleIn = (double)_inputArguments[10];\n            string stringIn = (string)_inputArguments[11];\n\n            bool booleanOut = (bool)_outputArguments[0];\n            sbyte sByteOut = (sbyte)_outputArguments[1];\n            byte byteOut = (byte)_outputArguments[2];\n            short int16Out = (short)_outputArguments[3];\n            ushort uInt16Out = (ushort)_outputArguments[4];\n            int int32Out = (int)_outputArguments[5];\n            uint uInt32Out = (uint)_outputArguments[6];\n            long int64Out = (long)_outputArguments[7];\n            ulong uInt64Out = (ulong)_outputArguments[8];\n            float floatOut = (float)_outputArguments[9];\n            double doubleOut = (double)_outputArguments[10];\n            string stringOut = (string)_outputArguments[11];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    booleanIn,\n                    sByteIn,\n                    byteIn,\n                    int16In,\n                    uInt16In,\n                    int32In,\n                    uInt32In,\n                    int64In,\n                    uInt64In,\n                    floatIn,\n                    doubleIn,\n                    stringIn,\n                    ref booleanOut,\n                    ref sByteOut,\n                    ref byteOut,\n                    ref int16Out,\n                    ref uInt16Out,\n                    ref int32Out,\n                    ref uInt32Out,\n                    ref int64Out,\n                    ref uInt64Out,\n                    ref floatOut,\n                    ref doubleOut,\n                    ref stringOut);\n            }\n\n            _outputArguments[0] = booleanOut;\n            _outputArguments[1] = sByteOut;\n            _outputArguments[2] = byteOut;\n            _outputArguments[3] = int16Out;\n            _outputArguments[4] = uInt16Out;\n            _outputArguments[5] = int32Out;\n            _outputArguments[6] = uInt32Out;\n            _outputArguments[7] = int64Out;\n            _outputArguments[8] = uInt64Out;\n            _outputArguments[9] = floatOut;\n            _outputArguments[10] = doubleOut;\n            _outputArguments[11] = stringOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"booleanIn\"></param>\n    /// <param name=\"sByteIn\"></param>\n    /// <param name=\"byteIn\"></param>\n    /// <param name=\"int16In\"></param>\n    /// <param name=\"uInt16In\"></param>\n    /// <param name=\"int32In\"></param>\n    /// <param name=\"uInt32In\"></param>\n    /// <param name=\"int64In\"></param>\n    /// <param name=\"uInt64In\"></param>\n    /// <param name=\"floatIn\"></param>\n    /// <param name=\"doubleIn\"></param>\n    /// <param name=\"stringIn\"></param>\n    /// <param name=\"booleanOut\"></param>\n    /// <param name=\"sByteOut\"></param>\n    /// <param name=\"byteOut\"></param>\n    /// <param name=\"int16Out\"></param>\n    /// <param name=\"uInt16Out\"></param>\n    /// <param name=\"int32Out\"></param>\n    /// <param name=\"uInt32Out\"></param>\n    /// <param name=\"int64Out\"></param>\n    /// <param name=\"uInt64Out\"></param>\n    /// <param name=\"floatOut\"></param>\n    /// <param name=\"doubleOut\"></param>\n    /// <param name=\"stringOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult UserScalarValue1MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        bool booleanIn,\n        sbyte sByteIn,\n        byte byteIn,\n        short int16In,\n        ushort uInt16In,\n        int int32In,\n        uint uInt32In,\n        long int64In,\n        ulong uInt64In,\n        float floatIn,\n        double doubleIn,\n        string stringIn,\n        ref bool booleanOut,\n        ref sbyte sByteOut,\n        ref byte byteOut,\n        ref short int16Out,\n        ref ushort uInt16Out,\n        ref int int32Out,\n        ref uint uInt32Out,\n        ref long int64Out,\n        ref ulong uInt64Out,\n        ref float floatOut,\n        ref double doubleOut,\n        ref string stringOut);\n#endif\n    #endregion\n\n    #region UserScalarValue2MethodState Class\n#if (!OPCUA_EXCLUDE_UserScalarValue2MethodState)\n    /// <summary>\n    /// Stores an instance of the UserScalarValue2MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class UserScalarValue2MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public UserScalarValue2MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new UserScalarValue2MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABoAAABVc2VyU2NhbGFy\" +\n           \"VmFsdWUyTWV0aG9kVHlwZQEBEycALwEBEycTJwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5wdXRB\" +\n           \"cmd1bWVudHMBARQnAC4ARBQnAACWCgAAAAEAKgEBGwAAAAoAAABEYXRlVGltZUluAQG2Jv////8AAAAA\" +\n           \"AAEAKgEBFwAAAAYAAABHdWlkSW4BAbcm/////wAAAAAAAQAqAQEdAAAADAAAAEJ5dGVTdHJpbmdJbgEB\" +\n           \"uCb/////AAAAAAABACoBAR0AAAAMAAAAWG1sRWxlbWVudEluAQG5Jv////8AAAAAAAEAKgEBGQAAAAgA\" +\n           \"AABOb2RlSWRJbgEBuib/////AAAAAAABACoBASEAAAAQAAAARXhwYW5kZWROb2RlSWRJbgEBuyb/////\" +\n           \"AAAAAAABACoBASAAAAAPAAAAUXVhbGlmaWVkTmFtZUluAQG8Jv////8AAAAAAAEAKgEBIAAAAA8AAABM\" +\n           \"b2NhbGl6ZWRUZXh0SW4BAb0m/////wAAAAAAAQAqAQEdAAAADAAAAFN0YXR1c0NvZGVJbgEBvib/////\" +\n           \"AAAAAAABACoBARoAAAAJAAAAVmFyaWFudEluAQG/Jv////8AAAAAAAEAKAEBAAAAAQAAAAAAAAABAf//\" +\n           \"//8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVudHMBARUnAC4ARBUnAACWCgAAAAEAKgEBHAAA\" +\n           \"AAsAAABEYXRlVGltZU91dAEBtib/////AAAAAAABACoBARgAAAAHAAAAR3VpZE91dAEBtyb/////AAAA\" +\n           \"AAABACoBAR4AAAANAAAAQnl0ZVN0cmluZ091dAEBuCb/////AAAAAAABACoBAR4AAAANAAAAWG1sRWxl\" +\n           \"bWVudE91dAEBuSb/////AAAAAAABACoBARoAAAAJAAAATm9kZUlkT3V0AQG6Jv////8AAAAAAAEAKgEB\" +\n           \"IgAAABEAAABFeHBhbmRlZE5vZGVJZE91dAEBuyb/////AAAAAAABACoBASEAAAAQAAAAUXVhbGlmaWVk\" +\n           \"TmFtZU91dAEBvCb/////AAAAAAABACoBASEAAAAQAAAATG9jYWxpemVkVGV4dE91dAEBvSb/////AAAA\" +\n           \"AAABACoBAR4AAAANAAAAU3RhdHVzQ29kZU91dAEBvib/////AAAAAAABACoBARsAAAAKAAAAVmFyaWFu\" +\n           \"dE91dAEBvyb/////AAAAAAABACgBAQAAAAEAAAAAAAAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public UserScalarValue2MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            DateTime dateTimeIn = (DateTime)_inputArguments[0];\n            Uuid guidIn = (Uuid)_inputArguments[1];\n            byte[] byteStringIn = (byte[])_inputArguments[2];\n            XmlElement xmlElementIn = (XmlElement)_inputArguments[3];\n            NodeId nodeIdIn = (NodeId)_inputArguments[4];\n            ExpandedNodeId expandedNodeIdIn = (ExpandedNodeId)_inputArguments[5];\n            QualifiedName qualifiedNameIn = (QualifiedName)_inputArguments[6];\n            LocalizedText localizedTextIn = (LocalizedText)_inputArguments[7];\n            StatusCode statusCodeIn = (StatusCode)_inputArguments[8];\n            object variantIn = (object)_inputArguments[9];\n\n            DateTime dateTimeOut = (DateTime)_outputArguments[0];\n            Uuid guidOut = (Uuid)_outputArguments[1];\n            byte[] byteStringOut = (byte[])_outputArguments[2];\n            XmlElement xmlElementOut = (XmlElement)_outputArguments[3];\n            NodeId nodeIdOut = (NodeId)_outputArguments[4];\n            ExpandedNodeId expandedNodeIdOut = (ExpandedNodeId)_outputArguments[5];\n            QualifiedName qualifiedNameOut = (QualifiedName)_outputArguments[6];\n            LocalizedText localizedTextOut = (LocalizedText)_outputArguments[7];\n            StatusCode statusCodeOut = (StatusCode)_outputArguments[8];\n            object variantOut = (object)_outputArguments[9];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    dateTimeIn,\n                    guidIn,\n                    byteStringIn,\n                    xmlElementIn,\n                    nodeIdIn,\n                    expandedNodeIdIn,\n                    qualifiedNameIn,\n                    localizedTextIn,\n                    statusCodeIn,\n                    variantIn,\n                    ref dateTimeOut,\n                    ref guidOut,\n                    ref byteStringOut,\n                    ref xmlElementOut,\n                    ref nodeIdOut,\n                    ref expandedNodeIdOut,\n                    ref qualifiedNameOut,\n                    ref localizedTextOut,\n                    ref statusCodeOut,\n                    ref variantOut);\n            }\n\n            _outputArguments[0] = dateTimeOut;\n            _outputArguments[1] = guidOut;\n            _outputArguments[2] = byteStringOut;\n            _outputArguments[3] = xmlElementOut;\n            _outputArguments[4] = nodeIdOut;\n            _outputArguments[5] = expandedNodeIdOut;\n            _outputArguments[6] = qualifiedNameOut;\n            _outputArguments[7] = localizedTextOut;\n            _outputArguments[8] = statusCodeOut;\n            _outputArguments[9] = variantOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"dateTimeIn\"></param>\n    /// <param name=\"guidIn\"></param>\n    /// <param name=\"byteStringIn\"></param>\n    /// <param name=\"xmlElementIn\"></param>\n    /// <param name=\"nodeIdIn\"></param>\n    /// <param name=\"expandedNodeIdIn\"></param>\n    /// <param name=\"qualifiedNameIn\"></param>\n    /// <param name=\"localizedTextIn\"></param>\n    /// <param name=\"statusCodeIn\"></param>\n    /// <param name=\"variantIn\"></param>\n    /// <param name=\"dateTimeOut\"></param>\n    /// <param name=\"guidOut\"></param>\n    /// <param name=\"byteStringOut\"></param>\n    /// <param name=\"xmlElementOut\"></param>\n    /// <param name=\"nodeIdOut\"></param>\n    /// <param name=\"expandedNodeIdOut\"></param>\n    /// <param name=\"qualifiedNameOut\"></param>\n    /// <param name=\"localizedTextOut\"></param>\n    /// <param name=\"statusCodeOut\"></param>\n    /// <param name=\"variantOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult UserScalarValue2MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        DateTime dateTimeIn,\n        Uuid guidIn,\n        byte[] byteStringIn,\n        XmlElement xmlElementIn,\n        NodeId nodeIdIn,\n        ExpandedNodeId expandedNodeIdIn,\n        QualifiedName qualifiedNameIn,\n        LocalizedText localizedTextIn,\n        StatusCode statusCodeIn,\n        object variantIn,\n        ref DateTime dateTimeOut,\n        ref Uuid guidOut,\n        ref byte[] byteStringOut,\n        ref XmlElement xmlElementOut,\n        ref NodeId nodeIdOut,\n        ref ExpandedNodeId expandedNodeIdOut,\n        ref QualifiedName qualifiedNameOut,\n        ref LocalizedText localizedTextOut,\n        ref StatusCode statusCodeOut,\n        ref object variantOut);\n#endif\n    #endregion\n\n    #region UserArrayValueObjectState Class\n#if (!OPCUA_EXCLUDE_UserArrayValueObjectState)\n    /// <summary>\n    /// Stores an instance of the UserArrayValueObjectType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class UserArrayValueObjectState : TestDataObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public UserArrayValueObjectState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.UserArrayValueObjectType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABACAAAABVc2VyQXJyYXlW\" +\n           \"YWx1ZU9iamVjdFR5cGVJbnN0YW5jZQEBFycBARcnFycAAAEAAAAAJAABARsnGQAAADVgiQoCAAAAAQAQ\" +\n           \"AAAAU2ltdWxhdGlvbkFjdGl2ZQEBGCcDAAAAAEcAAABJZiB0cnVlIHRoZSBzZXJ2ZXIgd2lsbCBwcm9k\" +\n           \"dWNlIG5ldyB2YWx1ZXMgZm9yIGVhY2ggbW9uaXRvcmVkIHZhcmlhYmxlLgAuAEQYJwAAAAH/////AQH/\" +\n           \"////AAAAAARhggoEAAAAAQAOAAAAR2VuZXJhdGVWYWx1ZXMBARknAC8BAakkGScAAAEB/////wEAAAAX\" +\n           \"YKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQEaJwAuAEQaJwAAlgEAAAABACoBAUYAAAAKAAAASXRl\" +\n           \"cmF0aW9ucwAH/////wAAAAADAAAAACUAAABUaGUgbnVtYmVyIG9mIG5ldyB2YWx1ZXMgdG8gZ2VuZXJh\" +\n           \"dGUuAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAEYIAKAQAAAAEADQAAAEN5Y2xlQ29tcGxldGUBARsn\" +\n           \"AC8BAEELGycAAAEAAAAAJAEBARcnFwAAABVgiQoCAAAAAAAHAAAARXZlbnRJZAEBHCcALgBEHCcAAAAP\" +\n           \"/////wEB/////wAAAAAVYIkKAgAAAAAACQAAAEV2ZW50VHlwZQEBHScALgBEHScAAAAR/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAACgAAAFNvdXJjZU5vZGUBAR4nAC4ARB4nAAAAEf////8BAf////8AAAAAFWCJ\" +\n           \"CgIAAAAAAAoAAABTb3VyY2VOYW1lAQEfJwAuAEQfJwAAAAz/////AQH/////AAAAABVgiQoCAAAAAAAE\" +\n           \"AAAAVGltZQEBICcALgBEICcAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAALAAAAUmVjZWl2ZVRp\" +\n           \"bWUBASEnAC4ARCEnAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAABwAAAE1lc3NhZ2UBASMnAC4A\" +\n           \"RCMnAAAAFf////8BAf////8AAAAAFWCJCgIAAAAAAAgAAABTZXZlcml0eQEBJCcALgBEJCcAAAAF////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAAAEAAAAENvbmRpdGlvbkNsYXNzSWQBAUYtAC4AREYtAAAAEf////8B\" +\n           \"Af////8AAAAAFWCJCgIAAAAAABIAAABDb25kaXRpb25DbGFzc05hbWUBAUctAC4AREctAAAAFf////8B\" +\n           \"Af////8AAAAAFWCJCgIAAAAAAA0AAABDb25kaXRpb25OYW1lAQErLQAuAEQrLQAAAAz/////AQH/////\" +\n           \"AAAAABVgiQoCAAAAAAAIAAAAQnJhbmNoSWQBASUnAC4ARCUnAAAAEf////8BAf////8AAAAAFWCJCgIA\" +\n           \"AAAAAAYAAABSZXRhaW4BASYnAC4ARCYnAAAAAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABFbmFi\" +\n           \"bGVkU3RhdGUBAScnAC8BACMjJycAAAAV/////wEBAgAAAAEALCMAAQE8JwEALCMAAQFEJwEAAAAVYIkK\" +\n           \"AgAAAAAAAgAAAElkAQEoJwAuAEQoJwAAAAH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAAUXVhbGl0\" +\n           \"eQEBLScALwEAKiMtJwAAABP/////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1w\" +\n           \"AQEuJwAuAEQuJwAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABMYXN0U2V2ZXJpdHkBATEn\" +\n           \"AC8BACojMScAAAAF/////wEB/////wEAAAAVYIkKAgAAAAAADwAAAFNvdXJjZVRpbWVzdGFtcAEBMicA\" +\n           \"LgBEMicAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAAHAAAAQ29tbWVudAEBMycALwEAKiMzJwAA\" +\n           \"ABX/////AQH/////AQAAABVgiQoCAAAAAAAPAAAAU291cmNlVGltZXN0YW1wAQE0JwAuAEQ0JwAAAQAm\" +\n           \"Af////8BAf////8AAAAAFWCJCgIAAAAAAAwAAABDbGllbnRVc2VySWQBATUnAC4ARDUnAAAADP////8B\" +\n           \"Af////8AAAAABGGCCgQAAAAAAAcAAABEaXNhYmxlAQE3JwAvAQBEIzcnAAABAQEAAAABAPkLAAEA8woA\" +\n           \"AAAABGGCCgQAAAAAAAYAAABFbmFibGUBATYnAC8BAEMjNicAAAEBAQAAAAEA+QsAAQDzCgAAAAAEYYIK\" +\n           \"BAAAAAAACgAAAEFkZENvbW1lbnQBATgnAC8BAEUjOCcAAAEBAQAAAAEA+QsAAQANCwEAAAAXYKkKAgAA\" +\n           \"AAAADgAAAElucHV0QXJndW1lbnRzAQE5JwAuAEQ5JwAAlgIAAAABACoBAUYAAAAHAAAARXZlbnRJZAAP\" +\n           \"/////wAAAAADAAAAACgAAABUaGUgaWRlbnRpZmllciBmb3IgdGhlIGV2ZW50IHRvIGNvbW1lbnQuAQAq\" +\n           \"AQFCAAAABwAAAENvbW1lbnQAFf////8AAAAAAwAAAAAkAAAAVGhlIGNvbW1lbnQgdG8gYWRkIHRvIHRo\" +\n           \"ZSBjb25kaXRpb24uAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAVYIkKAgAAAAAACgAAAEFja2VkU3Rh\" +\n           \"dGUBATwnAC8BACMjPCcAAAAV/////wEBAQAAAAEALCMBAQEnJwEAAAAVYIkKAgAAAAAAAgAAAElkAQE9\" +\n           \"JwAuAEQ9JwAAAAH/////AQH/////AAAAAARhggoEAAAAAAALAAAAQWNrbm93bGVkZ2UBAUwnAC8BAJcj\" +\n           \"TCcAAAEBAQAAAAEA+QsAAQDwIgEAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQFNJwAuAERN\" +\n           \"JwAAlgIAAAABACoBAUYAAAAHAAAARXZlbnRJZAAP/////wAAAAADAAAAACgAAABUaGUgaWRlbnRpZmll\" +\n           \"ciBmb3IgdGhlIGV2ZW50IHRvIGNvbW1lbnQuAQAqAQFCAAAABwAAAENvbW1lbnQAFf////8AAAAAAwAA\" +\n           \"AAAkAAAAVGhlIGNvbW1lbnQgdG8gYWRkIHRvIHRoZSBjb25kaXRpb24uAQAoAQEAAAABAAAAAAAAAAEB\" +\n           \"/////wAAAAAXYIkKAgAAAAEADAAAAEJvb2xlYW5WYWx1ZQEBUCcALwA/UCcAAAEBqiYBAAAAAQAAAAAA\" +\n           \"AAABAf////8AAAAAF2CJCgIAAAABAAoAAABTQnl0ZVZhbHVlAQFRJwAvAD9RJwAAAQGrJgEAAAABAAAA\" +\n           \"AAAAAAEB/////wAAAAAXYIkKAgAAAAEACQAAAEJ5dGVWYWx1ZQEBUicALwA/UicAAAEBrCYBAAAAAQAA\" +\n           \"AAAAAAABAf////8AAAAAF2CJCgIAAAABAAoAAABJbnQxNlZhbHVlAQFTJwAvAD9TJwAAAQGtJgEAAAAB\" +\n           \"AAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEACwAAAFVJbnQxNlZhbHVlAQFUJwAvAD9UJwAAAQGuJgEA\" +\n           \"AAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEACgAAAEludDMyVmFsdWUBAVUnAC8AP1UnAAABAa8m\" +\n           \"AQAAAAEAAAAAAAAAAQH/////AAAAABdgiQoCAAAAAQALAAAAVUludDMyVmFsdWUBAVYnAC8AP1YnAAAB\" +\n           \"AbAmAQAAAAEAAAAAAAAAAQH/////AAAAABdgiQoCAAAAAQAKAAAASW50NjRWYWx1ZQEBVycALwA/VycA\" +\n           \"AAEBsSYBAAAAAQAAAAAAAAABAf////8AAAAAF2CJCgIAAAABAAsAAABVSW50NjRWYWx1ZQEBWCcALwA/\" +\n           \"WCcAAAEBsiYBAAAAAQAAAAAAAAABAf////8AAAAAF2CJCgIAAAABAAoAAABGbG9hdFZhbHVlAQFZJwAv\" +\n           \"AD9ZJwAAAQGzJgEAAAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEACwAAAERvdWJsZVZhbHVlAQFa\" +\n           \"JwAvAD9aJwAAAQG0JgEAAAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEACwAAAFN0cmluZ1ZhbHVl\" +\n           \"AQFbJwAvAD9bJwAAAQG1JgEAAAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEADQAAAERhdGVUaW1l\" +\n           \"VmFsdWUBAVwnAC8AP1wnAAABAbYmAQAAAAEAAAAAAAAAAQH/////AAAAABdgiQoCAAAAAQAJAAAAR3Vp\" +\n           \"ZFZhbHVlAQFdJwAvAD9dJwAAAQG3JgEAAAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEADwAAAEJ5\" +\n           \"dGVTdHJpbmdWYWx1ZQEBXicALwA/XicAAAEBuCYBAAAAAQAAAAAAAAABAf////8AAAAAF2CJCgIAAAAB\" +\n           \"AA8AAABYbWxFbGVtZW50VmFsdWUBAV8nAC8AP18nAAABAbkmAQAAAAEAAAAAAAAAAQH/////AAAAABdg\" +\n           \"iQoCAAAAAQALAAAATm9kZUlkVmFsdWUBAWAnAC8AP2AnAAABAbomAQAAAAEAAAAAAAAAAQH/////AAAA\" +\n           \"ABdgiQoCAAAAAQATAAAARXhwYW5kZWROb2RlSWRWYWx1ZQEBYScALwA/YScAAAEBuyYBAAAAAQAAAAAA\" +\n           \"AAABAf////8AAAAAF2CJCgIAAAABABIAAABRdWFsaWZpZWROYW1lVmFsdWUBAWInAC8AP2InAAABAbwm\" +\n           \"AQAAAAEAAAAAAAAAAQH/////AAAAABdgiQoCAAAAAQASAAAATG9jYWxpemVkVGV4dFZhbHVlAQFjJwAv\" +\n           \"AD9jJwAAAQG9JgEAAAABAAAAAAAAAAEB/////wAAAAAXYIkKAgAAAAEADwAAAFN0YXR1c0NvZGVWYWx1\" +\n           \"ZQEBZCcALwA/ZCcAAAEBviYBAAAAAQAAAAAAAAABAf////8AAAAAF2CJCgIAAAABAAwAAABWYXJpYW50\" +\n           \"VmFsdWUBAWUnAC8AP2UnAAABAb8mAQAAAAEAAAAAAAAAAQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public BaseDataVariableState<bool[]> BooleanValue\n        {\n            get => m_booleanValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_booleanValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_booleanValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<sbyte[]> SByteValue\n        {\n            get => m_sByteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_sByteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_sByteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<byte[]> ByteValue\n        {\n            get => m_byteValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<short[]> Int16Value\n        {\n            get => m_int16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ushort[]> UInt16Value\n        {\n            get => m_uInt16Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt16Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt16Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<int[]> Int32Value\n        {\n            get => m_int32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<uint[]> UInt32Value\n        {\n            get => m_uInt32Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt32Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt32Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<long[]> Int64Value\n        {\n            get => m_int64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_int64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_int64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ulong[]> UInt64Value\n        {\n            get => m_uInt64Value;\n\n            set\n            {\n                if (!ReferenceEquals(m_uInt64Value, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_uInt64Value = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<float[]> FloatValue\n        {\n            get => m_floatValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_floatValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_floatValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<double[]> DoubleValue\n        {\n            get => m_doubleValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_doubleValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_doubleValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<string[]> StringValue\n        {\n            get => m_stringValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_stringValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_stringValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<DateTime[]> DateTimeValue\n        {\n            get => m_dateTimeValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_dateTimeValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_dateTimeValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<Guid[]> GuidValue\n        {\n            get => m_guidValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_guidValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_guidValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<byte[][]> ByteStringValue\n        {\n            get => m_byteStringValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_byteStringValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_byteStringValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<XmlElement[]> XmlElementValue\n        {\n            get => m_xmlElementValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_xmlElementValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_xmlElementValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<NodeId[]> NodeIdValue\n        {\n            get => m_nodeIdValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_nodeIdValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_nodeIdValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<ExpandedNodeId[]> ExpandedNodeIdValue\n        {\n            get => m_expandedNodeIdValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_expandedNodeIdValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_expandedNodeIdValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<QualifiedName[]> QualifiedNameValue\n        {\n            get => m_qualifiedNameValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_qualifiedNameValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_qualifiedNameValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<LocalizedText[]> LocalizedTextValue\n        {\n            get => m_localizedTextValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_localizedTextValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_localizedTextValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<StatusCode[]> StatusCodeValue\n        {\n            get => m_statusCodeValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_statusCodeValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_statusCodeValue = value;\n            }\n        }\n\n        /// <remarks />\n        public BaseDataVariableState<object[]> VariantValue\n        {\n            get => m_variantValue;\n\n            set\n            {\n                if (!ReferenceEquals(m_variantValue, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_variantValue = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_booleanValue != null)\n            {\n                children.Add(m_booleanValue);\n            }\n\n            if (m_sByteValue != null)\n            {\n                children.Add(m_sByteValue);\n            }\n\n            if (m_byteValue != null)\n            {\n                children.Add(m_byteValue);\n            }\n\n            if (m_int16Value != null)\n            {\n                children.Add(m_int16Value);\n            }\n\n            if (m_uInt16Value != null)\n            {\n                children.Add(m_uInt16Value);\n            }\n\n            if (m_int32Value != null)\n            {\n                children.Add(m_int32Value);\n            }\n\n            if (m_uInt32Value != null)\n            {\n                children.Add(m_uInt32Value);\n            }\n\n            if (m_int64Value != null)\n            {\n                children.Add(m_int64Value);\n            }\n\n            if (m_uInt64Value != null)\n            {\n                children.Add(m_uInt64Value);\n            }\n\n            if (m_floatValue != null)\n            {\n                children.Add(m_floatValue);\n            }\n\n            if (m_doubleValue != null)\n            {\n                children.Add(m_doubleValue);\n            }\n\n            if (m_stringValue != null)\n            {\n                children.Add(m_stringValue);\n            }\n\n            if (m_dateTimeValue != null)\n            {\n                children.Add(m_dateTimeValue);\n            }\n\n            if (m_guidValue != null)\n            {\n                children.Add(m_guidValue);\n            }\n\n            if (m_byteStringValue != null)\n            {\n                children.Add(m_byteStringValue);\n            }\n\n            if (m_xmlElementValue != null)\n            {\n                children.Add(m_xmlElementValue);\n            }\n\n            if (m_nodeIdValue != null)\n            {\n                children.Add(m_nodeIdValue);\n            }\n\n            if (m_expandedNodeIdValue != null)\n            {\n                children.Add(m_expandedNodeIdValue);\n            }\n\n            if (m_qualifiedNameValue != null)\n            {\n                children.Add(m_qualifiedNameValue);\n            }\n\n            if (m_localizedTextValue != null)\n            {\n                children.Add(m_localizedTextValue);\n            }\n\n            if (m_statusCodeValue != null)\n            {\n                children.Add(m_statusCodeValue);\n            }\n\n            if (m_variantValue != null)\n            {\n                children.Add(m_variantValue);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.BooleanValue:\n                    {\n                        if (createOrReplace && BooleanValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                BooleanValue = new BaseDataVariableState<bool[]>(this);\n                            }\n                            else\n                            {\n                                BooleanValue = (BaseDataVariableState<bool[]>)replacement;\n                            }\n                        }\n\n                        instance = BooleanValue;\n                        break;\n                    }\n\n                case BrowseNames.SByteValue:\n                    {\n                        if (createOrReplace && SByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                SByteValue = new BaseDataVariableState<sbyte[]>(this);\n                            }\n                            else\n                            {\n                                SByteValue = (BaseDataVariableState<sbyte[]>)replacement;\n                            }\n                        }\n\n                        instance = SByteValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteValue:\n                    {\n                        if (createOrReplace && ByteValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteValue = new BaseDataVariableState<byte[]>(this);\n                            }\n                            else\n                            {\n                                ByteValue = (BaseDataVariableState<byte[]>)replacement;\n                            }\n                        }\n\n                        instance = ByteValue;\n                        break;\n                    }\n\n                case BrowseNames.Int16Value:\n                    {\n                        if (createOrReplace && Int16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int16Value = new BaseDataVariableState<short[]>(this);\n                            }\n                            else\n                            {\n                                Int16Value = (BaseDataVariableState<short[]>)replacement;\n                            }\n                        }\n\n                        instance = Int16Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt16Value:\n                    {\n                        if (createOrReplace && UInt16Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt16Value = new BaseDataVariableState<ushort[]>(this);\n                            }\n                            else\n                            {\n                                UInt16Value = (BaseDataVariableState<ushort[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt16Value;\n                        break;\n                    }\n\n                case BrowseNames.Int32Value:\n                    {\n                        if (createOrReplace && Int32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int32Value = new BaseDataVariableState<int[]>(this);\n                            }\n                            else\n                            {\n                                Int32Value = (BaseDataVariableState<int[]>)replacement;\n                            }\n                        }\n\n                        instance = Int32Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt32Value:\n                    {\n                        if (createOrReplace && UInt32Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt32Value = new BaseDataVariableState<uint[]>(this);\n                            }\n                            else\n                            {\n                                UInt32Value = (BaseDataVariableState<uint[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt32Value;\n                        break;\n                    }\n\n                case BrowseNames.Int64Value:\n                    {\n                        if (createOrReplace && Int64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                Int64Value = new BaseDataVariableState<long[]>(this);\n                            }\n                            else\n                            {\n                                Int64Value = (BaseDataVariableState<long[]>)replacement;\n                            }\n                        }\n\n                        instance = Int64Value;\n                        break;\n                    }\n\n                case BrowseNames.UInt64Value:\n                    {\n                        if (createOrReplace && UInt64Value == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UInt64Value = new BaseDataVariableState<ulong[]>(this);\n                            }\n                            else\n                            {\n                                UInt64Value = (BaseDataVariableState<ulong[]>)replacement;\n                            }\n                        }\n\n                        instance = UInt64Value;\n                        break;\n                    }\n\n                case BrowseNames.FloatValue:\n                    {\n                        if (createOrReplace && FloatValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                FloatValue = new BaseDataVariableState<float[]>(this);\n                            }\n                            else\n                            {\n                                FloatValue = (BaseDataVariableState<float[]>)replacement;\n                            }\n                        }\n\n                        instance = FloatValue;\n                        break;\n                    }\n\n                case BrowseNames.DoubleValue:\n                    {\n                        if (createOrReplace && DoubleValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DoubleValue = new BaseDataVariableState<double[]>(this);\n                            }\n                            else\n                            {\n                                DoubleValue = (BaseDataVariableState<double[]>)replacement;\n                            }\n                        }\n\n                        instance = DoubleValue;\n                        break;\n                    }\n\n                case BrowseNames.StringValue:\n                    {\n                        if (createOrReplace && StringValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StringValue = new BaseDataVariableState<string[]>(this);\n                            }\n                            else\n                            {\n                                StringValue = (BaseDataVariableState<string[]>)replacement;\n                            }\n                        }\n\n                        instance = StringValue;\n                        break;\n                    }\n\n                case BrowseNames.DateTimeValue:\n                    {\n                        if (createOrReplace && DateTimeValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                DateTimeValue = new BaseDataVariableState<DateTime[]>(this);\n                            }\n                            else\n                            {\n                                DateTimeValue = (BaseDataVariableState<DateTime[]>)replacement;\n                            }\n                        }\n\n                        instance = DateTimeValue;\n                        break;\n                    }\n\n                case BrowseNames.GuidValue:\n                    {\n                        if (createOrReplace && GuidValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                GuidValue = new BaseDataVariableState<Guid[]>(this);\n                            }\n                            else\n                            {\n                                GuidValue = (BaseDataVariableState<Guid[]>)replacement;\n                            }\n                        }\n\n                        instance = GuidValue;\n                        break;\n                    }\n\n                case BrowseNames.ByteStringValue:\n                    {\n                        if (createOrReplace && ByteStringValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ByteStringValue = new BaseDataVariableState<byte[][]>(this);\n                            }\n                            else\n                            {\n                                ByteStringValue = (BaseDataVariableState<byte[][]>)replacement;\n                            }\n                        }\n\n                        instance = ByteStringValue;\n                        break;\n                    }\n\n                case BrowseNames.XmlElementValue:\n                    {\n                        if (createOrReplace && XmlElementValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                XmlElementValue = new BaseDataVariableState<XmlElement[]>(this);\n                            }\n                            else\n                            {\n                                XmlElementValue = (BaseDataVariableState<XmlElement[]>)replacement;\n                            }\n                        }\n\n                        instance = XmlElementValue;\n                        break;\n                    }\n\n                case BrowseNames.NodeIdValue:\n                    {\n                        if (createOrReplace && NodeIdValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                NodeIdValue = new BaseDataVariableState<NodeId[]>(this);\n                            }\n                            else\n                            {\n                                NodeIdValue = (BaseDataVariableState<NodeId[]>)replacement;\n                            }\n                        }\n\n                        instance = NodeIdValue;\n                        break;\n                    }\n\n                case BrowseNames.ExpandedNodeIdValue:\n                    {\n                        if (createOrReplace && ExpandedNodeIdValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ExpandedNodeIdValue = new BaseDataVariableState<ExpandedNodeId[]>(this);\n                            }\n                            else\n                            {\n                                ExpandedNodeIdValue = (BaseDataVariableState<ExpandedNodeId[]>)replacement;\n                            }\n                        }\n\n                        instance = ExpandedNodeIdValue;\n                        break;\n                    }\n\n                case BrowseNames.QualifiedNameValue:\n                    {\n                        if (createOrReplace && QualifiedNameValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                QualifiedNameValue = new BaseDataVariableState<QualifiedName[]>(this);\n                            }\n                            else\n                            {\n                                QualifiedNameValue = (BaseDataVariableState<QualifiedName[]>)replacement;\n                            }\n                        }\n\n                        instance = QualifiedNameValue;\n                        break;\n                    }\n\n                case BrowseNames.LocalizedTextValue:\n                    {\n                        if (createOrReplace && LocalizedTextValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                LocalizedTextValue = new BaseDataVariableState<LocalizedText[]>(this);\n                            }\n                            else\n                            {\n                                LocalizedTextValue = (BaseDataVariableState<LocalizedText[]>)replacement;\n                            }\n                        }\n\n                        instance = LocalizedTextValue;\n                        break;\n                    }\n\n                case BrowseNames.StatusCodeValue:\n                    {\n                        if (createOrReplace && StatusCodeValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                StatusCodeValue = new BaseDataVariableState<StatusCode[]>(this);\n                            }\n                            else\n                            {\n                                StatusCodeValue = (BaseDataVariableState<StatusCode[]>)replacement;\n                            }\n                        }\n\n                        instance = StatusCodeValue;\n                        break;\n                    }\n\n                case BrowseNames.VariantValue:\n                    {\n                        if (createOrReplace && VariantValue == null)\n                        {\n                            if (replacement == null)\n                            {\n                                VariantValue = new BaseDataVariableState<object[]>(this);\n                            }\n                            else\n                            {\n                                VariantValue = (BaseDataVariableState<object[]>)replacement;\n                            }\n                        }\n\n                        instance = VariantValue;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private BaseDataVariableState<bool[]> m_booleanValue;\n        private BaseDataVariableState<sbyte[]> m_sByteValue;\n        private BaseDataVariableState<byte[]> m_byteValue;\n        private BaseDataVariableState<short[]> m_int16Value;\n        private BaseDataVariableState<ushort[]> m_uInt16Value;\n        private BaseDataVariableState<int[]> m_int32Value;\n        private BaseDataVariableState<uint[]> m_uInt32Value;\n        private BaseDataVariableState<long[]> m_int64Value;\n        private BaseDataVariableState<ulong[]> m_uInt64Value;\n        private BaseDataVariableState<float[]> m_floatValue;\n        private BaseDataVariableState<double[]> m_doubleValue;\n        private BaseDataVariableState<string[]> m_stringValue;\n        private BaseDataVariableState<DateTime[]> m_dateTimeValue;\n        private BaseDataVariableState<Guid[]> m_guidValue;\n        private BaseDataVariableState<byte[][]> m_byteStringValue;\n        private BaseDataVariableState<XmlElement[]> m_xmlElementValue;\n        private BaseDataVariableState<NodeId[]> m_nodeIdValue;\n        private BaseDataVariableState<ExpandedNodeId[]> m_expandedNodeIdValue;\n        private BaseDataVariableState<QualifiedName[]> m_qualifiedNameValue;\n        private BaseDataVariableState<LocalizedText[]> m_localizedTextValue;\n        private BaseDataVariableState<StatusCode[]> m_statusCodeValue;\n        private BaseDataVariableState<object[]> m_variantValue;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region UserArrayValue1MethodState Class\n#if (!OPCUA_EXCLUDE_UserArrayValue1MethodState)\n    /// <summary>\n    /// Stores an instance of the UserArrayValue1MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class UserArrayValue1MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public UserArrayValue1MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new UserArrayValue1MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABkAAABVc2VyQXJyYXlW\" +\n           \"YWx1ZTFNZXRob2RUeXBlAQFmJwAvAQFmJ2YnAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFy\" +\n           \"Z3VtZW50cwEBZycALgBEZycAAJYMAAAAAQAqAQEeAAAACQAAAEJvb2xlYW5JbgEBqiYBAAAAAQAAAAAA\" +\n           \"AAAAAQAqAQEcAAAABwAAAFNCeXRlSW4BAasmAQAAAAEAAAAAAAAAAAEAKgEBGwAAAAYAAABCeXRlSW4B\" +\n           \"AawmAQAAAAEAAAAAAAAAAAEAKgEBHAAAAAcAAABJbnQxNkluAQGtJgEAAAABAAAAAAAAAAABACoBAR0A\" +\n           \"AAAIAAAAVUludDE2SW4BAa4mAQAAAAEAAAAAAAAAAAEAKgEBHAAAAAcAAABJbnQzMkluAQGvJgEAAAAB\" +\n           \"AAAAAAAAAAABACoBAR0AAAAIAAAAVUludDMySW4BAbAmAQAAAAEAAAAAAAAAAAEAKgEBHAAAAAcAAABJ\" +\n           \"bnQ2NEluAQGxJgEAAAABAAAAAAAAAAABACoBAR0AAAAIAAAAVUludDY0SW4BAbImAQAAAAEAAAAAAAAA\" +\n           \"AAEAKgEBHAAAAAcAAABGbG9hdEluAQGzJgEAAAABAAAAAAAAAAABACoBAR0AAAAIAAAARG91YmxlSW4B\" +\n           \"AbQmAQAAAAEAAAAAAAAAAAEAKgEBHQAAAAgAAABTdHJpbmdJbgEBtSYBAAAAAQAAAAAAAAAAAQAoAQEA\" +\n           \"AAABAAAAAAAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEBaCcALgBEaCcA\" +\n           \"AJYMAAAAAQAqAQEfAAAACgAAAEJvb2xlYW5PdXQBAaomAQAAAAEAAAAAAAAAAAEAKgEBHQAAAAgAAABT\" +\n           \"Qnl0ZU91dAEBqyYBAAAAAQAAAAAAAAAAAQAqAQEcAAAABwAAAEJ5dGVPdXQBAawmAQAAAAEAAAAAAAAA\" +\n           \"AAEAKgEBHQAAAAgAAABJbnQxNk91dAEBrSYBAAAAAQAAAAAAAAAAAQAqAQEeAAAACQAAAFVJbnQxNk91\" +\n           \"dAEBriYBAAAAAQAAAAAAAAAAAQAqAQEdAAAACAAAAEludDMyT3V0AQGvJgEAAAABAAAAAAAAAAABACoB\" +\n           \"AR4AAAAJAAAAVUludDMyT3V0AQGwJgEAAAABAAAAAAAAAAABACoBAR0AAAAIAAAASW50NjRPdXQBAbEm\" +\n           \"AQAAAAEAAAAAAAAAAAEAKgEBHgAAAAkAAABVSW50NjRPdXQBAbImAQAAAAEAAAAAAAAAAAEAKgEBHQAA\" +\n           \"AAgAAABGbG9hdE91dAEBsyYBAAAAAQAAAAAAAAAAAQAqAQEeAAAACQAAAERvdWJsZU91dAEBtCYBAAAA\" +\n           \"AQAAAAAAAAAAAQAqAQEeAAAACQAAAFN0cmluZ091dAEBtSYBAAAAAQAAAAAAAAAAAQAoAQEAAAABAAAA\" +\n           \"AAAAAAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public UserArrayValue1MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            bool[] booleanIn = (bool[])_inputArguments[0];\n            sbyte[] sByteIn = (sbyte[])_inputArguments[1];\n            byte[] byteIn = (byte[])_inputArguments[2];\n            short[] int16In = (short[])_inputArguments[3];\n            ushort[] uInt16In = (ushort[])_inputArguments[4];\n            int[] int32In = (int[])_inputArguments[5];\n            uint[] uInt32In = (uint[])_inputArguments[6];\n            long[] int64In = (long[])_inputArguments[7];\n            ulong[] uInt64In = (ulong[])_inputArguments[8];\n            float[] floatIn = (float[])_inputArguments[9];\n            double[] doubleIn = (double[])_inputArguments[10];\n            string[] stringIn = (string[])_inputArguments[11];\n\n            bool[] booleanOut = (bool[])_outputArguments[0];\n            sbyte[] sByteOut = (sbyte[])_outputArguments[1];\n            byte[] byteOut = (byte[])_outputArguments[2];\n            short[] int16Out = (short[])_outputArguments[3];\n            ushort[] uInt16Out = (ushort[])_outputArguments[4];\n            int[] int32Out = (int[])_outputArguments[5];\n            uint[] uInt32Out = (uint[])_outputArguments[6];\n            long[] int64Out = (long[])_outputArguments[7];\n            ulong[] uInt64Out = (ulong[])_outputArguments[8];\n            float[] floatOut = (float[])_outputArguments[9];\n            double[] doubleOut = (double[])_outputArguments[10];\n            string[] stringOut = (string[])_outputArguments[11];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    booleanIn,\n                    sByteIn,\n                    byteIn,\n                    int16In,\n                    uInt16In,\n                    int32In,\n                    uInt32In,\n                    int64In,\n                    uInt64In,\n                    floatIn,\n                    doubleIn,\n                    stringIn,\n                    ref booleanOut,\n                    ref sByteOut,\n                    ref byteOut,\n                    ref int16Out,\n                    ref uInt16Out,\n                    ref int32Out,\n                    ref uInt32Out,\n                    ref int64Out,\n                    ref uInt64Out,\n                    ref floatOut,\n                    ref doubleOut,\n                    ref stringOut);\n            }\n\n            _outputArguments[0] = booleanOut;\n            _outputArguments[1] = sByteOut;\n            _outputArguments[2] = byteOut;\n            _outputArguments[3] = int16Out;\n            _outputArguments[4] = uInt16Out;\n            _outputArguments[5] = int32Out;\n            _outputArguments[6] = uInt32Out;\n            _outputArguments[7] = int64Out;\n            _outputArguments[8] = uInt64Out;\n            _outputArguments[9] = floatOut;\n            _outputArguments[10] = doubleOut;\n            _outputArguments[11] = stringOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"booleanIn\"></param>\n    /// <param name=\"sByteIn\"></param>\n    /// <param name=\"byteIn\"></param>\n    /// <param name=\"int16In\"></param>\n    /// <param name=\"uInt16In\"></param>\n    /// <param name=\"int32In\"></param>\n    /// <param name=\"uInt32In\"></param>\n    /// <param name=\"int64In\"></param>\n    /// <param name=\"uInt64In\"></param>\n    /// <param name=\"floatIn\"></param>\n    /// <param name=\"doubleIn\"></param>\n    /// <param name=\"stringIn\"></param>\n    /// <param name=\"booleanOut\"></param>\n    /// <param name=\"sByteOut\"></param>\n    /// <param name=\"byteOut\"></param>\n    /// <param name=\"int16Out\"></param>\n    /// <param name=\"uInt16Out\"></param>\n    /// <param name=\"int32Out\"></param>\n    /// <param name=\"uInt32Out\"></param>\n    /// <param name=\"int64Out\"></param>\n    /// <param name=\"uInt64Out\"></param>\n    /// <param name=\"floatOut\"></param>\n    /// <param name=\"doubleOut\"></param>\n    /// <param name=\"stringOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult UserArrayValue1MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        bool[] booleanIn,\n        sbyte[] sByteIn,\n        byte[] byteIn,\n        short[] int16In,\n        ushort[] uInt16In,\n        int[] int32In,\n        uint[] uInt32In,\n        long[] int64In,\n        ulong[] uInt64In,\n        float[] floatIn,\n        double[] doubleIn,\n        string[] stringIn,\n        ref bool[] booleanOut,\n        ref sbyte[] sByteOut,\n        ref byte[] byteOut,\n        ref short[] int16Out,\n        ref ushort[] uInt16Out,\n        ref int[] int32Out,\n        ref uint[] uInt32Out,\n        ref long[] int64Out,\n        ref ulong[] uInt64Out,\n        ref float[] floatOut,\n        ref double[] doubleOut,\n        ref string[] stringOut);\n#endif\n    #endregion\n\n    #region UserArrayValue2MethodState Class\n#if (!OPCUA_EXCLUDE_UserArrayValue2MethodState)\n    /// <summary>\n    /// Stores an instance of the UserArrayValue2MethodType Method.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class UserArrayValue2MethodState : MethodState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public UserArrayValue2MethodState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Constructs an instance of a node.\n        /// </summary>\n        /// <param name=\"parent\">The parent.</param>\n        /// <returns>The new node.</returns>\n        public new static NodeState Construct(NodeState parent)\n        {\n            return new UserArrayValue2MethodState(parent);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGGCCgQAAAABABkAAABVc2VyQXJyYXlW\" +\n           \"YWx1ZTJNZXRob2RUeXBlAQFpJwAvAQFpJ2knAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFy\" +\n           \"Z3VtZW50cwEBaicALgBEaicAAJYKAAAAAQAqAQEfAAAACgAAAERhdGVUaW1lSW4BAbYmAQAAAAEAAAAA\" +\n           \"AAAAAAEAKgEBGwAAAAYAAABHdWlkSW4BAbcmAQAAAAEAAAAAAAAAAAEAKgEBIQAAAAwAAABCeXRlU3Ry\" +\n           \"aW5nSW4BAbgmAQAAAAEAAAAAAAAAAAEAKgEBIQAAAAwAAABYbWxFbGVtZW50SW4BAbkmAQAAAAEAAAAA\" +\n           \"AAAAAAEAKgEBHQAAAAgAAABOb2RlSWRJbgEBuiYBAAAAAQAAAAAAAAAAAQAqAQElAAAAEAAAAEV4cGFu\" +\n           \"ZGVkTm9kZUlkSW4BAbsmAQAAAAEAAAAAAAAAAAEAKgEBJAAAAA8AAABRdWFsaWZpZWROYW1lSW4BAbwm\" +\n           \"AQAAAAEAAAAAAAAAAAEAKgEBJAAAAA8AAABMb2NhbGl6ZWRUZXh0SW4BAb0mAQAAAAEAAAAAAAAAAAEA\" +\n           \"KgEBIQAAAAwAAABTdGF0dXNDb2RlSW4BAb4mAQAAAAEAAAAAAAAAAAEAKgEBHgAAAAkAAABWYXJpYW50\" +\n           \"SW4BAb8mAQAAAAEAAAAAAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABP\" +\n           \"dXRwdXRBcmd1bWVudHMBAWsnAC4ARGsnAACWCgAAAAEAKgEBIAAAAAsAAABEYXRlVGltZU91dAEBtiYB\" +\n           \"AAAAAQAAAAAAAAAAAQAqAQEcAAAABwAAAEd1aWRPdXQBAbcmAQAAAAEAAAAAAAAAAAEAKgEBIgAAAA0A\" +\n           \"AABCeXRlU3RyaW5nT3V0AQG4JgEAAAABAAAAAAAAAAABACoBASIAAAANAAAAWG1sRWxlbWVudE91dAEB\" +\n           \"uSYBAAAAAQAAAAAAAAAAAQAqAQEeAAAACQAAAE5vZGVJZE91dAEBuiYBAAAAAQAAAAAAAAAAAQAqAQEm\" +\n           \"AAAAEQAAAEV4cGFuZGVkTm9kZUlkT3V0AQG7JgEAAAABAAAAAAAAAAABACoBASUAAAAQAAAAUXVhbGlm\" +\n           \"aWVkTmFtZU91dAEBvCYBAAAAAQAAAAAAAAAAAQAqAQElAAAAEAAAAExvY2FsaXplZFRleHRPdXQBAb0m\" +\n           \"AQAAAAEAAAAAAAAAAAEAKgEBIgAAAA0AAABTdGF0dXNDb2RlT3V0AQG+JgEAAAABAAAAAAAAAAABACoB\" +\n           \"AR8AAAAKAAAAVmFyaWFudE91dAEBvyYBAAAAAQAAAAAAAAAAAQAoAQEAAAABAAAAAAAAAAEB/////wAA\" +\n           \"AAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Event Callbacks\n        /// <summary>\n        /// Raised when the the method is called.\n        /// </summary>\n        public UserArrayValue2MethodStateMethodCallHandler OnCall;\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Invokes the method, returns the result and output argument.\n        /// </summary>\n        protected override ServiceResult Call(\n            ISystemContext _context,\n            NodeId _objectId,\n            IList<object> _inputArguments,\n            IList<object> _outputArguments)\n        {\n            if (OnCall == null)\n            {\n                return base.Call(_context, _objectId, _inputArguments, _outputArguments);\n            }\n\n            ServiceResult result = null;\n\n            DateTime[] dateTimeIn = (DateTime[])_inputArguments[0];\n            Uuid[] guidIn = (Uuid[])_inputArguments[1];\n            byte[][] byteStringIn = (byte[][])_inputArguments[2];\n            XmlElement[] xmlElementIn = (XmlElement[])_inputArguments[3];\n            NodeId[] nodeIdIn = (NodeId[])_inputArguments[4];\n            ExpandedNodeId[] expandedNodeIdIn = (ExpandedNodeId[])_inputArguments[5];\n            QualifiedName[] qualifiedNameIn = (QualifiedName[])_inputArguments[6];\n            LocalizedText[] localizedTextIn = (LocalizedText[])_inputArguments[7];\n            StatusCode[] statusCodeIn = (StatusCode[])_inputArguments[8];\n            Variant[] variantIn = (Variant[])_inputArguments[9];\n\n            DateTime[] dateTimeOut = (DateTime[])_outputArguments[0];\n            Uuid[] guidOut = (Uuid[])_outputArguments[1];\n            byte[][] byteStringOut = (byte[][])_outputArguments[2];\n            XmlElement[] xmlElementOut = (XmlElement[])_outputArguments[3];\n            NodeId[] nodeIdOut = (NodeId[])_outputArguments[4];\n            ExpandedNodeId[] expandedNodeIdOut = (ExpandedNodeId[])_outputArguments[5];\n            QualifiedName[] qualifiedNameOut = (QualifiedName[])_outputArguments[6];\n            LocalizedText[] localizedTextOut = (LocalizedText[])_outputArguments[7];\n            StatusCode[] statusCodeOut = (StatusCode[])_outputArguments[8];\n            Variant[] variantOut = (Variant[])_outputArguments[9];\n\n            if (OnCall != null)\n            {\n                result = OnCall(\n                    _context,\n                    this,\n                    _objectId,\n                    dateTimeIn,\n                    guidIn,\n                    byteStringIn,\n                    xmlElementIn,\n                    nodeIdIn,\n                    expandedNodeIdIn,\n                    qualifiedNameIn,\n                    localizedTextIn,\n                    statusCodeIn,\n                    variantIn,\n                    ref dateTimeOut,\n                    ref guidOut,\n                    ref byteStringOut,\n                    ref xmlElementOut,\n                    ref nodeIdOut,\n                    ref expandedNodeIdOut,\n                    ref qualifiedNameOut,\n                    ref localizedTextOut,\n                    ref statusCodeOut,\n                    ref variantOut);\n            }\n\n            _outputArguments[0] = dateTimeOut;\n            _outputArguments[1] = guidOut;\n            _outputArguments[2] = byteStringOut;\n            _outputArguments[3] = xmlElementOut;\n            _outputArguments[4] = nodeIdOut;\n            _outputArguments[5] = expandedNodeIdOut;\n            _outputArguments[6] = qualifiedNameOut;\n            _outputArguments[7] = localizedTextOut;\n            _outputArguments[8] = statusCodeOut;\n            _outputArguments[9] = variantOut;\n\n            return result;\n        }\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n\n    /// <summary>\n    /// Used to receive notifications when the method is called.\n    /// </summary>\n    /// <param name=\"_context\"></param>\n    /// <param name=\"_method\"></param>\n    /// <param name=\"_objectId\"></param>\n    /// <param name=\"dateTimeIn\"></param>\n    /// <param name=\"guidIn\"></param>\n    /// <param name=\"byteStringIn\"></param>\n    /// <param name=\"xmlElementIn\"></param>\n    /// <param name=\"nodeIdIn\"></param>\n    /// <param name=\"expandedNodeIdIn\"></param>\n    /// <param name=\"qualifiedNameIn\"></param>\n    /// <param name=\"localizedTextIn\"></param>\n    /// <param name=\"statusCodeIn\"></param>\n    /// <param name=\"variantIn\"></param>\n    /// <param name=\"dateTimeOut\"></param>\n    /// <param name=\"guidOut\"></param>\n    /// <param name=\"byteStringOut\"></param>\n    /// <param name=\"xmlElementOut\"></param>\n    /// <param name=\"nodeIdOut\"></param>\n    /// <param name=\"expandedNodeIdOut\"></param>\n    /// <param name=\"qualifiedNameOut\"></param>\n    /// <param name=\"localizedTextOut\"></param>\n    /// <param name=\"statusCodeOut\"></param>\n    /// <param name=\"variantOut\"></param>\n    /// <exclude />\n    public delegate ServiceResult UserArrayValue2MethodStateMethodCallHandler(\n        ISystemContext _context,\n        MethodState _method,\n        NodeId _objectId,\n        DateTime[] dateTimeIn,\n        Uuid[] guidIn,\n        byte[][] byteStringIn,\n        XmlElement[] xmlElementIn,\n        NodeId[] nodeIdIn,\n        ExpandedNodeId[] expandedNodeIdIn,\n        QualifiedName[] qualifiedNameIn,\n        LocalizedText[] localizedTextIn,\n        StatusCode[] statusCodeIn,\n        Variant[] variantIn,\n        ref DateTime[] dateTimeOut,\n        ref Uuid[] guidOut,\n        ref byte[][] byteStringOut,\n        ref XmlElement[] xmlElementOut,\n        ref NodeId[] nodeIdOut,\n        ref ExpandedNodeId[] expandedNodeIdOut,\n        ref QualifiedName[] qualifiedNameOut,\n        ref LocalizedText[] localizedTextOut,\n        ref StatusCode[] statusCodeOut,\n        ref Variant[] variantOut);\n#endif\n    #endregion\n\n    #region MethodTestState Class\n#if (!OPCUA_EXCLUDE_MethodTestState)\n    /// <summary>\n    /// Stores an instance of the MethodTestType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class MethodTestState : FolderState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public MethodTestState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.MethodTestType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABABYAAABNZXRob2RUZXN0\" +\n           \"VHlwZUluc3RhbmNlAQFsJwEBbCdsJwAA/////woAAAAEYYIKBAAAAAEADQAAAFNjYWxhck1ldGhvZDEB\" +\n           \"AW0nAC8BAW0nbScAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQFuJwAuAERu\" +\n           \"JwAAlgsAAAABACoBARgAAAAJAAAAQm9vbGVhbkluAAH/////AAAAAAABACoBARYAAAAHAAAAU0J5dGVJ\" +\n           \"bgAC/////wAAAAAAAQAqAQEVAAAABgAAAEJ5dGVJbgAD/////wAAAAAAAQAqAQEWAAAABwAAAEludDE2\" +\n           \"SW4ABP////8AAAAAAAEAKgEBFwAAAAgAAABVSW50MTZJbgAF/////wAAAAAAAQAqAQEWAAAABwAAAElu\" +\n           \"dDMySW4ABv////8AAAAAAAEAKgEBFwAAAAgAAABVSW50MzJJbgAH/////wAAAAAAAQAqAQEWAAAABwAA\" +\n           \"AEludDY0SW4ACP////8AAAAAAAEAKgEBFwAAAAgAAABVSW50NjRJbgAJ/////wAAAAAAAQAqAQEWAAAA\" +\n           \"BwAAAEZsb2F0SW4ACv////8AAAAAAAEAKgEBFwAAAAgAAABEb3VibGVJbgAL/////wAAAAAAAQAoAQEA\" +\n           \"AAABAAAAAAAAAAEB/////wAAAAAXYKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEBbycALgBEbycA\" +\n           \"AJYLAAAAAQAqAQEZAAAACgAAAEJvb2xlYW5PdXQAAf////8AAAAAAAEAKgEBFwAAAAgAAABTQnl0ZU91\" +\n           \"dAAC/////wAAAAAAAQAqAQEWAAAABwAAAEJ5dGVPdXQAA/////8AAAAAAAEAKgEBFwAAAAgAAABJbnQx\" +\n           \"Nk91dAAE/////wAAAAAAAQAqAQEYAAAACQAAAFVJbnQxNk91dAAF/////wAAAAAAAQAqAQEXAAAACAAA\" +\n           \"AEludDMyT3V0AAb/////AAAAAAABACoBARgAAAAJAAAAVUludDMyT3V0AAf/////AAAAAAABACoBARcA\" +\n           \"AAAIAAAASW50NjRPdXQACP////8AAAAAAAEAKgEBGAAAAAkAAABVSW50NjRPdXQACf////8AAAAAAAEA\" +\n           \"KgEBFwAAAAgAAABGbG9hdE91dAAK/////wAAAAAAAQAqAQEYAAAACQAAAERvdWJsZU91dAAL/////wAA\" +\n           \"AAAAAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAEYYIKBAAAAAEADQAAAFNjYWxhck1ldGhvZDIBAXAn\" +\n           \"AC8BAXAncCcAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRzAQFxJwAuAERxJwAA\" +\n           \"lgoAAAABACoBARcAAAAIAAAAU3RyaW5nSW4ADP////8AAAAAAAEAKgEBGQAAAAoAAABEYXRlVGltZUlu\" +\n           \"AA3/////AAAAAAABACoBARUAAAAGAAAAR3VpZEluAA7/////AAAAAAABACoBARsAAAAMAAAAQnl0ZVN0\" +\n           \"cmluZ0luAA//////AAAAAAABACoBARsAAAAMAAAAWG1sRWxlbWVudEluABD/////AAAAAAABACoBARcA\" +\n           \"AAAIAAAATm9kZUlkSW4AEf////8AAAAAAAEAKgEBHwAAABAAAABFeHBhbmRlZE5vZGVJZEluABL/////\" +\n           \"AAAAAAABACoBAR4AAAAPAAAAUXVhbGlmaWVkTmFtZUluABT/////AAAAAAABACoBAR4AAAAPAAAATG9j\" +\n           \"YWxpemVkVGV4dEluABX/////AAAAAAABACoBARsAAAAMAAAAU3RhdHVzQ29kZUluABP/////AAAAAAAB\" +\n           \"ACgBAQAAAAEAAAAAAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQFyJwAu\" +\n           \"AERyJwAAlgoAAAABACoBARgAAAAJAAAAU3RyaW5nT3V0AAz/////AAAAAAABACoBARoAAAALAAAARGF0\" +\n           \"ZVRpbWVPdXQADf////8AAAAAAAEAKgEBFgAAAAcAAABHdWlkT3V0AA7/////AAAAAAABACoBARwAAAAN\" +\n           \"AAAAQnl0ZVN0cmluZ091dAAP/////wAAAAAAAQAqAQEcAAAADQAAAFhtbEVsZW1lbnRPdXQAEP////8A\" +\n           \"AAAAAAEAKgEBGAAAAAkAAABOb2RlSWRPdXQAEf////8AAAAAAAEAKgEBIAAAABEAAABFeHBhbmRlZE5v\" +\n           \"ZGVJZE91dAAS/////wAAAAAAAQAqAQEfAAAAEAAAAFF1YWxpZmllZE5hbWVPdXQAFP////8AAAAAAAEA\" +\n           \"KgEBHwAAABAAAABMb2NhbGl6ZWRUZXh0T3V0ABX/////AAAAAAABACoBARwAAAANAAAAU3RhdHVzQ29k\" +\n           \"ZU91dAAT/////wAAAAAAAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAEYYIKBAAAAAEADQAAAFNjYWxh\" +\n           \"ck1ldGhvZDMBAXMnAC8BAXMncycAAAEB/////wIAAAAXYKkKAgAAAAAADgAAAElucHV0QXJndW1lbnRz\" +\n           \"AQF0JwAuAER0JwAAlgMAAAABACoBARgAAAAJAAAAVmFyaWFudEluABj/////AAAAAAABACoBARwAAAAN\" +\n           \"AAAARW51bWVyYXRpb25JbgAd/////wAAAAAAAQAqAQEaAAAACwAAAFN0cnVjdHVyZUluABb/////AAAA\" +\n           \"AAABACgBAQAAAAEAAAAAAAAAAQH/////AAAAABdgqQoCAAAAAAAPAAAAT3V0cHV0QXJndW1lbnRzAQF1\" +\n           \"JwAuAER1JwAAlgMAAAABACoBARkAAAAKAAAAVmFyaWFudE91dAAY/////wAAAAAAAQAqAQEdAAAADgAA\" +\n           \"AEVudW1lcmF0aW9uT3V0AB3/////AAAAAAABACoBARsAAAAMAAAAU3RydWN0dXJlT3V0ABb/////AAAA\" +\n           \"AAABACgBAQAAAAEAAAAAAAAAAQH/////AAAAAARhggoEAAAAAQAMAAAAQXJyYXlNZXRob2QxAQF2JwAv\" +\n           \"AQF2J3YnAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1dEFyZ3VtZW50cwEBdycALgBEdycAAJYL\" +\n           \"AAAAAQAqAQEcAAAACQAAAEJvb2xlYW5JbgABAQAAAAEAAAAAAAAAAAEAKgEBGgAAAAcAAABTQnl0ZUlu\" +\n           \"AAIBAAAAAQAAAAAAAAAAAQAqAQEZAAAABgAAAEJ5dGVJbgADAQAAAAEAAAAAAAAAAAEAKgEBGgAAAAcA\" +\n           \"AABJbnQxNkluAAQBAAAAAQAAAAAAAAAAAQAqAQEbAAAACAAAAFVJbnQxNkluAAUBAAAAAQAAAAAAAAAA\" +\n           \"AQAqAQEaAAAABwAAAEludDMySW4ABgEAAAABAAAAAAAAAAABACoBARsAAAAIAAAAVUludDMySW4ABwEA\" +\n           \"AAABAAAAAAAAAAABACoBARoAAAAHAAAASW50NjRJbgAIAQAAAAEAAAAAAAAAAAEAKgEBGwAAAAgAAABV\" +\n           \"SW50NjRJbgAJAQAAAAEAAAAAAAAAAAEAKgEBGgAAAAcAAABGbG9hdEluAAoBAAAAAQAAAAAAAAAAAQAq\" +\n           \"AQEbAAAACAAAAERvdWJsZUluAAsBAAAAAQAAAAAAAAAAAQAoAQEAAAABAAAAAAAAAAEB/////wAAAAAX\" +\n           \"YKkKAgAAAAAADwAAAE91dHB1dEFyZ3VtZW50cwEBeCcALgBEeCcAAJYLAAAAAQAqAQEdAAAACgAAAEJv\" +\n           \"b2xlYW5PdXQAAQEAAAABAAAAAAAAAAABACoBARsAAAAIAAAAU0J5dGVPdXQAAgEAAAABAAAAAAAAAAAB\" +\n           \"ACoBARoAAAAHAAAAQnl0ZU91dAADAQAAAAEAAAAAAAAAAAEAKgEBGwAAAAgAAABJbnQxNk91dAAEAQAA\" +\n           \"AAEAAAAAAAAAAAEAKgEBHAAAAAkAAABVSW50MTZPdXQABQEAAAABAAAAAAAAAAABACoBARsAAAAIAAAA\" +\n           \"SW50MzJPdXQABgEAAAABAAAAAAAAAAABACoBARwAAAAJAAAAVUludDMyT3V0AAcBAAAAAQAAAAAAAAAA\" +\n           \"AQAqAQEbAAAACAAAAEludDY0T3V0AAgBAAAAAQAAAAAAAAAAAQAqAQEcAAAACQAAAFVJbnQ2NE91dAAJ\" +\n           \"AQAAAAEAAAAAAAAAAAEAKgEBGwAAAAgAAABGbG9hdE91dAAKAQAAAAEAAAAAAAAAAAEAKgEBHAAAAAkA\" +\n           \"AABEb3VibGVPdXQACwEAAAABAAAAAAAAAAABACgBAQAAAAEAAAAAAAAAAQH/////AAAAAARhggoEAAAA\" +\n           \"AQAMAAAAQXJyYXlNZXRob2QyAQF5JwAvAQF5J3knAAABAf////8CAAAAF2CpCgIAAAAAAA4AAABJbnB1\" +\n           \"dEFyZ3VtZW50cwEBeicALgBEeicAAJYKAAAAAQAqAQEbAAAACAAAAFN0cmluZ0luAAwBAAAAAQAAAAAA\" +\n           \"AAAAAQAqAQEdAAAACgAAAERhdGVUaW1lSW4ADQEAAAABAAAAAAAAAAABACoBARkAAAAGAAAAR3VpZElu\" +\n           \"AA4BAAAAAQAAAAAAAAAAAQAqAQEfAAAADAAAAEJ5dGVTdHJpbmdJbgAPAQAAAAEAAAAAAAAAAAEAKgEB\" +\n           \"HwAAAAwAAABYbWxFbGVtZW50SW4AEAEAAAABAAAAAAAAAAABACoBARsAAAAIAAAATm9kZUlkSW4AEQEA\" +\n           \"AAABAAAAAAAAAAABACoBASMAAAAQAAAARXhwYW5kZWROb2RlSWRJbgASAQAAAAEAAAAAAAAAAAEAKgEB\" +\n           \"IgAAAA8AAABRdWFsaWZpZWROYW1lSW4AFAEAAAABAAAAAAAAAAABACoBASIAAAAPAAAATG9jYWxpemVk\" +\n           \"VGV4dEluABUBAAAAAQAAAAAAAAAAAQAqAQEfAAAADAAAAFN0YXR1c0NvZGVJbgATAQAAAAEAAAAAAAAA\" +\n           \"AAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVudHMBAXsn\" +\n           \"AC4ARHsnAACWCgAAAAEAKgEBHAAAAAkAAABTdHJpbmdPdXQADAEAAAABAAAAAAAAAAABACoBAR4AAAAL\" +\n           \"AAAARGF0ZVRpbWVPdXQADQEAAAABAAAAAAAAAAABACoBARoAAAAHAAAAR3VpZE91dAAOAQAAAAEAAAAA\" +\n           \"AAAAAAEAKgEBIAAAAA0AAABCeXRlU3RyaW5nT3V0AA8BAAAAAQAAAAAAAAAAAQAqAQEgAAAADQAAAFht\" +\n           \"bEVsZW1lbnRPdXQAEAEAAAABAAAAAAAAAAABACoBARwAAAAJAAAATm9kZUlkT3V0ABEBAAAAAQAAAAAA\" +\n           \"AAAAAQAqAQEkAAAAEQAAAEV4cGFuZGVkTm9kZUlkT3V0ABIBAAAAAQAAAAAAAAAAAQAqAQEjAAAAEAAA\" +\n           \"AFF1YWxpZmllZE5hbWVPdXQAFAEAAAABAAAAAAAAAAABACoBASMAAAAQAAAATG9jYWxpemVkVGV4dE91\" +\n           \"dAAVAQAAAAEAAAAAAAAAAAEAKgEBIAAAAA0AAABTdGF0dXNDb2RlT3V0ABMBAAAAAQAAAAAAAAAAAQAo\" +\n           \"AQEAAAABAAAAAAAAAAEB/////wAAAAAEYYIKBAAAAAEADAAAAEFycmF5TWV0aG9kMwEBfCcALwEBfCd8\" +\n           \"JwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAX0nAC4ARH0nAACWAwAAAAEA\" +\n           \"KgEBHAAAAAkAAABWYXJpYW50SW4AGAEAAAABAAAAAAAAAAABACoBASAAAAANAAAARW51bWVyYXRpb25J\" +\n           \"bgAdAQAAAAEAAAAAAAAAAAEAKgEBHgAAAAsAAABTdHJ1Y3R1cmVJbgAWAQAAAAEAAAAAAAAAAAEAKAEB\" +\n           \"AAAAAQAAAAAAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVudHMBAX4nAC4ARH4n\" +\n           \"AACWAwAAAAEAKgEBHQAAAAoAAABWYXJpYW50T3V0ABgBAAAAAQAAAAAAAAAAAQAqAQEhAAAADgAAAEVu\" +\n           \"dW1lcmF0aW9uT3V0AB0BAAAAAQAAAAAAAAAAAQAqAQEfAAAADAAAAFN0cnVjdHVyZU91dAAWAQAAAAEA\" +\n           \"AAAAAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAABGGCCgQAAAABABEAAABVc2VyU2NhbGFyTWV0\" +\n           \"aG9kMQEBfycALwEBfyd/JwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAYAn\" +\n           \"AC4ARIAnAACWDAAAAAEAKgEBGgAAAAkAAABCb29sZWFuSW4BAaom/////wAAAAAAAQAqAQEYAAAABwAA\" +\n           \"AFNCeXRlSW4BAasm/////wAAAAAAAQAqAQEXAAAABgAAAEJ5dGVJbgEBrCb/////AAAAAAABACoBARgA\" +\n           \"AAAHAAAASW50MTZJbgEBrSb/////AAAAAAABACoBARkAAAAIAAAAVUludDE2SW4BAa4m/////wAAAAAA\" +\n           \"AQAqAQEYAAAABwAAAEludDMySW4BAa8m/////wAAAAAAAQAqAQEZAAAACAAAAFVJbnQzMkluAQGwJv//\" +\n           \"//8AAAAAAAEAKgEBGAAAAAcAAABJbnQ2NEluAQGxJv////8AAAAAAAEAKgEBGQAAAAgAAABVSW50NjRJ\" +\n           \"bgEBsib/////AAAAAAABACoBARgAAAAHAAAARmxvYXRJbgEBsyb/////AAAAAAABACoBARkAAAAIAAAA\" +\n           \"RG91YmxlSW4BAbQm/////wAAAAAAAQAqAQEZAAAACAAAAFN0cmluZ0luAQG1Jv////8AAAAAAAEAKAEB\" +\n           \"AAAAAQAAAAAAAAABAf////8AAAAAF2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVudHMBAYEnAC4ARIEn\" +\n           \"AACWDAAAAAEAKgEBGwAAAAoAAABCb29sZWFuT3V0AQGqJv////8AAAAAAAEAKgEBGQAAAAgAAABTQnl0\" +\n           \"ZU91dAEBqyb/////AAAAAAABACoBARgAAAAHAAAAQnl0ZU91dAEBrCb/////AAAAAAABACoBARkAAAAI\" +\n           \"AAAASW50MTZPdXQBAa0m/////wAAAAAAAQAqAQEaAAAACQAAAFVJbnQxNk91dAEBrib/////AAAAAAAB\" +\n           \"ACoBARkAAAAIAAAASW50MzJPdXQBAa8m/////wAAAAAAAQAqAQEaAAAACQAAAFVJbnQzMk91dAEBsCb/\" +\n           \"////AAAAAAABACoBARkAAAAIAAAASW50NjRPdXQBAbEm/////wAAAAAAAQAqAQEaAAAACQAAAFVJbnQ2\" +\n           \"NE91dAEBsib/////AAAAAAABACoBARkAAAAIAAAARmxvYXRPdXQBAbMm/////wAAAAAAAQAqAQEaAAAA\" +\n           \"CQAAAERvdWJsZU91dAEBtCb/////AAAAAAABACoBARoAAAAJAAAAU3RyaW5nT3V0AQG1Jv////8AAAAA\" +\n           \"AAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAABGGCCgQAAAABABEAAABVc2VyU2NhbGFyTWV0aG9kMgEB\" +\n           \"gicALwEBgieCJwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAYMnAC4ARIMn\" +\n           \"AACWCgAAAAEAKgEBGwAAAAoAAABEYXRlVGltZUluAQG2Jv////8AAAAAAAEAKgEBFwAAAAYAAABHdWlk\" +\n           \"SW4BAbcm/////wAAAAAAAQAqAQEdAAAADAAAAEJ5dGVTdHJpbmdJbgEBuCb/////AAAAAAABACoBAR0A\" +\n           \"AAAMAAAAWG1sRWxlbWVudEluAQG5Jv////8AAAAAAAEAKgEBGQAAAAgAAABOb2RlSWRJbgEBuib/////\" +\n           \"AAAAAAABACoBASEAAAAQAAAARXhwYW5kZWROb2RlSWRJbgEBuyb/////AAAAAAABACoBASAAAAAPAAAA\" +\n           \"UXVhbGlmaWVkTmFtZUluAQG8Jv////8AAAAAAAEAKgEBIAAAAA8AAABMb2NhbGl6ZWRUZXh0SW4BAb0m\" +\n           \"/////wAAAAAAAQAqAQEdAAAADAAAAFN0YXR1c0NvZGVJbgEBvib/////AAAAAAABACoBARoAAAAJAAAA\" +\n           \"VmFyaWFudEluAQG/Jv////8AAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAAF2CpCgIAAAAAAA8A\" +\n           \"AABPdXRwdXRBcmd1bWVudHMBAYQnAC4ARIQnAACWCgAAAAEAKgEBHAAAAAsAAABEYXRlVGltZU91dAEB\" +\n           \"tib/////AAAAAAABACoBARgAAAAHAAAAR3VpZE91dAEBtyb/////AAAAAAABACoBAR4AAAANAAAAQnl0\" +\n           \"ZVN0cmluZ091dAEBuCb/////AAAAAAABACoBAR4AAAANAAAAWG1sRWxlbWVudE91dAEBuSb/////AAAA\" +\n           \"AAABACoBARoAAAAJAAAATm9kZUlkT3V0AQG6Jv////8AAAAAAAEAKgEBIgAAABEAAABFeHBhbmRlZE5v\" +\n           \"ZGVJZE91dAEBuyb/////AAAAAAABACoBASEAAAAQAAAAUXVhbGlmaWVkTmFtZU91dAEBvCb/////AAAA\" +\n           \"AAABACoBASEAAAAQAAAATG9jYWxpemVkVGV4dE91dAEBvSb/////AAAAAAABACoBAR4AAAANAAAAU3Rh\" +\n           \"dHVzQ29kZU91dAEBvib/////AAAAAAABACoBARsAAAAKAAAAVmFyaWFudE91dAEBvyb/////AAAAAAAB\" +\n           \"ACgBAQAAAAEAAAAAAAAAAQH/////AAAAAARhggoEAAAAAQAQAAAAVXNlckFycmF5TWV0aG9kMQEBhScA\" +\n           \"LwEBhSeFJwAAAQH/////AgAAABdgqQoCAAAAAAAOAAAASW5wdXRBcmd1bWVudHMBAYYnAC4ARIYnAACW\" +\n           \"DAAAAAEAKgEBHgAAAAkAAABCb29sZWFuSW4BAaomAQAAAAEAAAAAAAAAAAEAKgEBHAAAAAcAAABTQnl0\" +\n           \"ZUluAQGrJgEAAAABAAAAAAAAAAABACoBARsAAAAGAAAAQnl0ZUluAQGsJgEAAAABAAAAAAAAAAABACoB\" +\n           \"ARwAAAAHAAAASW50MTZJbgEBrSYBAAAAAQAAAAAAAAAAAQAqAQEdAAAACAAAAFVJbnQxNkluAQGuJgEA\" +\n           \"AAABAAAAAAAAAAABACoBARwAAAAHAAAASW50MzJJbgEBryYBAAAAAQAAAAAAAAAAAQAqAQEdAAAACAAA\" +\n           \"AFVJbnQzMkluAQGwJgEAAAABAAAAAAAAAAABACoBARwAAAAHAAAASW50NjRJbgEBsSYBAAAAAQAAAAAA\" +\n           \"AAAAAQAqAQEdAAAACAAAAFVJbnQ2NEluAQGyJgEAAAABAAAAAAAAAAABACoBARwAAAAHAAAARmxvYXRJ\" +\n           \"bgEBsyYBAAAAAQAAAAAAAAAAAQAqAQEdAAAACAAAAERvdWJsZUluAQG0JgEAAAABAAAAAAAAAAABACoB\" +\n           \"AR0AAAAIAAAAU3RyaW5nSW4BAbUmAQAAAAEAAAAAAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAA\" +\n           \"F2CpCgIAAAAAAA8AAABPdXRwdXRBcmd1bWVudHMBAYcnAC4ARIcnAACWDAAAAAEAKgEBHwAAAAoAAABC\" +\n           \"b29sZWFuT3V0AQGqJgEAAAABAAAAAAAAAAABACoBAR0AAAAIAAAAU0J5dGVPdXQBAasmAQAAAAEAAAAA\" +\n           \"AAAAAAEAKgEBHAAAAAcAAABCeXRlT3V0AQGsJgEAAAABAAAAAAAAAAABACoBAR0AAAAIAAAASW50MTZP\" +\n           \"dXQBAa0mAQAAAAEAAAAAAAAAAAEAKgEBHgAAAAkAAABVSW50MTZPdXQBAa4mAQAAAAEAAAAAAAAAAAEA\" +\n           \"KgEBHQAAAAgAAABJbnQzMk91dAEBryYBAAAAAQAAAAAAAAAAAQAqAQEeAAAACQAAAFVJbnQzMk91dAEB\" +\n           \"sCYBAAAAAQAAAAAAAAAAAQAqAQEdAAAACAAAAEludDY0T3V0AQGxJgEAAAABAAAAAAAAAAABACoBAR4A\" +\n           \"AAAJAAAAVUludDY0T3V0AQGyJgEAAAABAAAAAAAAAAABACoBAR0AAAAIAAAARmxvYXRPdXQBAbMmAQAA\" +\n           \"AAEAAAAAAAAAAAEAKgEBHgAAAAkAAABEb3VibGVPdXQBAbQmAQAAAAEAAAAAAAAAAAEAKgEBHgAAAAkA\" +\n           \"AABTdHJpbmdPdXQBAbUmAQAAAAEAAAAAAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAABGGCCgQA\" +\n           \"AAABABAAAABVc2VyQXJyYXlNZXRob2QyAQGIJwAvAQGIJ4gnAAABAf////8CAAAAF2CpCgIAAAAAAA4A\" +\n           \"AABJbnB1dEFyZ3VtZW50cwEBiScALgBEiScAAJYKAAAAAQAqAQEfAAAACgAAAERhdGVUaW1lSW4BAbYm\" +\n           \"AQAAAAEAAAAAAAAAAAEAKgEBGwAAAAYAAABHdWlkSW4BAbcmAQAAAAEAAAAAAAAAAAEAKgEBIQAAAAwA\" +\n           \"AABCeXRlU3RyaW5nSW4BAbgmAQAAAAEAAAAAAAAAAAEAKgEBIQAAAAwAAABYbWxFbGVtZW50SW4BAbkm\" +\n           \"AQAAAAEAAAAAAAAAAAEAKgEBHQAAAAgAAABOb2RlSWRJbgEBuiYBAAAAAQAAAAAAAAAAAQAqAQElAAAA\" +\n           \"EAAAAEV4cGFuZGVkTm9kZUlkSW4BAbsmAQAAAAEAAAAAAAAAAAEAKgEBJAAAAA8AAABRdWFsaWZpZWRO\" +\n           \"YW1lSW4BAbwmAQAAAAEAAAAAAAAAAAEAKgEBJAAAAA8AAABMb2NhbGl6ZWRUZXh0SW4BAb0mAQAAAAEA\" +\n           \"AAAAAAAAAAEAKgEBIQAAAAwAAABTdGF0dXNDb2RlSW4BAb4mAQAAAAEAAAAAAAAAAAEAKgEBHgAAAAkA\" +\n           \"AABWYXJpYW50SW4BAb8mAQAAAAEAAAAAAAAAAAEAKAEBAAAAAQAAAAAAAAABAf////8AAAAAF2CpCgIA\" +\n           \"AAAAAA8AAABPdXRwdXRBcmd1bWVudHMBAYonAC4ARIonAACWCgAAAAEAKgEBIAAAAAsAAABEYXRlVGlt\" +\n           \"ZU91dAEBtiYBAAAAAQAAAAAAAAAAAQAqAQEcAAAABwAAAEd1aWRPdXQBAbcmAQAAAAEAAAAAAAAAAAEA\" +\n           \"KgEBIgAAAA0AAABCeXRlU3RyaW5nT3V0AQG4JgEAAAABAAAAAAAAAAABACoBASIAAAANAAAAWG1sRWxl\" +\n           \"bWVudE91dAEBuSYBAAAAAQAAAAAAAAAAAQAqAQEeAAAACQAAAE5vZGVJZE91dAEBuiYBAAAAAQAAAAAA\" +\n           \"AAAAAQAqAQEmAAAAEQAAAEV4cGFuZGVkTm9kZUlkT3V0AQG7JgEAAAABAAAAAAAAAAABACoBASUAAAAQ\" +\n           \"AAAAUXVhbGlmaWVkTmFtZU91dAEBvCYBAAAAAQAAAAAAAAAAAQAqAQElAAAAEAAAAExvY2FsaXplZFRl\" +\n           \"eHRPdXQBAb0mAQAAAAEAAAAAAAAAAAEAKgEBIgAAAA0AAABTdGF0dXNDb2RlT3V0AQG+JgEAAAABAAAA\" +\n           \"AAAAAAABACoBAR8AAAAKAAAAVmFyaWFudE91dAEBvyYBAAAAAQAAAAAAAAAAAQAoAQEAAAABAAAAAAAA\" +\n           \"AAEB/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public ScalarValue1MethodState ScalarMethod1\n        {\n            get => m_scalarMethod1Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_scalarMethod1Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_scalarMethod1Method = value;\n            }\n        }\n\n        /// <remarks />\n        public ScalarValue2MethodState ScalarMethod2\n        {\n            get => m_scalarMethod2Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_scalarMethod2Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_scalarMethod2Method = value;\n            }\n        }\n\n        /// <remarks />\n        public ScalarValue3MethodState ScalarMethod3\n        {\n            get => m_scalarMethod3Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_scalarMethod3Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_scalarMethod3Method = value;\n            }\n        }\n\n        /// <remarks />\n        public ArrayValue1MethodState ArrayMethod1\n        {\n            get => m_arrayMethod1Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_arrayMethod1Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_arrayMethod1Method = value;\n            }\n        }\n\n        /// <remarks />\n        public ArrayValue2MethodState ArrayMethod2\n        {\n            get => m_arrayMethod2Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_arrayMethod2Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_arrayMethod2Method = value;\n            }\n        }\n\n        /// <remarks />\n        public ArrayValue3MethodState ArrayMethod3\n        {\n            get => m_arrayMethod3Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_arrayMethod3Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_arrayMethod3Method = value;\n            }\n        }\n\n        /// <remarks />\n        public UserScalarValue1MethodState UserScalarMethod1\n        {\n            get => m_userScalarMethod1Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_userScalarMethod1Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_userScalarMethod1Method = value;\n            }\n        }\n\n        /// <remarks />\n        public UserScalarValue2MethodState UserScalarMethod2\n        {\n            get => m_userScalarMethod2Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_userScalarMethod2Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_userScalarMethod2Method = value;\n            }\n        }\n\n        /// <remarks />\n        public UserArrayValue1MethodState UserArrayMethod1\n        {\n            get => m_userArrayMethod1Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_userArrayMethod1Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_userArrayMethod1Method = value;\n            }\n        }\n\n        /// <remarks />\n        public UserArrayValue2MethodState UserArrayMethod2\n        {\n            get => m_userArrayMethod2Method;\n\n            set\n            {\n                if (!ReferenceEquals(m_userArrayMethod2Method, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_userArrayMethod2Method = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_scalarMethod1Method != null)\n            {\n                children.Add(m_scalarMethod1Method);\n            }\n\n            if (m_scalarMethod2Method != null)\n            {\n                children.Add(m_scalarMethod2Method);\n            }\n\n            if (m_scalarMethod3Method != null)\n            {\n                children.Add(m_scalarMethod3Method);\n            }\n\n            if (m_arrayMethod1Method != null)\n            {\n                children.Add(m_arrayMethod1Method);\n            }\n\n            if (m_arrayMethod2Method != null)\n            {\n                children.Add(m_arrayMethod2Method);\n            }\n\n            if (m_arrayMethod3Method != null)\n            {\n                children.Add(m_arrayMethod3Method);\n            }\n\n            if (m_userScalarMethod1Method != null)\n            {\n                children.Add(m_userScalarMethod1Method);\n            }\n\n            if (m_userScalarMethod2Method != null)\n            {\n                children.Add(m_userScalarMethod2Method);\n            }\n\n            if (m_userArrayMethod1Method != null)\n            {\n                children.Add(m_userArrayMethod1Method);\n            }\n\n            if (m_userArrayMethod2Method != null)\n            {\n                children.Add(m_userArrayMethod2Method);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.ScalarMethod1:\n                    {\n                        if (createOrReplace && ScalarMethod1 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ScalarMethod1 = new ScalarValue1MethodState(this);\n                            }\n                            else\n                            {\n                                ScalarMethod1 = (ScalarValue1MethodState)replacement;\n                            }\n                        }\n\n                        instance = ScalarMethod1;\n                        break;\n                    }\n\n                case BrowseNames.ScalarMethod2:\n                    {\n                        if (createOrReplace && ScalarMethod2 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ScalarMethod2 = new ScalarValue2MethodState(this);\n                            }\n                            else\n                            {\n                                ScalarMethod2 = (ScalarValue2MethodState)replacement;\n                            }\n                        }\n\n                        instance = ScalarMethod2;\n                        break;\n                    }\n\n                case BrowseNames.ScalarMethod3:\n                    {\n                        if (createOrReplace && ScalarMethod3 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ScalarMethod3 = new ScalarValue3MethodState(this);\n                            }\n                            else\n                            {\n                                ScalarMethod3 = (ScalarValue3MethodState)replacement;\n                            }\n                        }\n\n                        instance = ScalarMethod3;\n                        break;\n                    }\n\n                case BrowseNames.ArrayMethod1:\n                    {\n                        if (createOrReplace && ArrayMethod1 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ArrayMethod1 = new ArrayValue1MethodState(this);\n                            }\n                            else\n                            {\n                                ArrayMethod1 = (ArrayValue1MethodState)replacement;\n                            }\n                        }\n\n                        instance = ArrayMethod1;\n                        break;\n                    }\n\n                case BrowseNames.ArrayMethod2:\n                    {\n                        if (createOrReplace && ArrayMethod2 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ArrayMethod2 = new ArrayValue2MethodState(this);\n                            }\n                            else\n                            {\n                                ArrayMethod2 = (ArrayValue2MethodState)replacement;\n                            }\n                        }\n\n                        instance = ArrayMethod2;\n                        break;\n                    }\n\n                case BrowseNames.ArrayMethod3:\n                    {\n                        if (createOrReplace && ArrayMethod3 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                ArrayMethod3 = new ArrayValue3MethodState(this);\n                            }\n                            else\n                            {\n                                ArrayMethod3 = (ArrayValue3MethodState)replacement;\n                            }\n                        }\n\n                        instance = ArrayMethod3;\n                        break;\n                    }\n\n                case BrowseNames.UserScalarMethod1:\n                    {\n                        if (createOrReplace && UserScalarMethod1 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UserScalarMethod1 = new UserScalarValue1MethodState(this);\n                            }\n                            else\n                            {\n                                UserScalarMethod1 = (UserScalarValue1MethodState)replacement;\n                            }\n                        }\n\n                        instance = UserScalarMethod1;\n                        break;\n                    }\n\n                case BrowseNames.UserScalarMethod2:\n                    {\n                        if (createOrReplace && UserScalarMethod2 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UserScalarMethod2 = new UserScalarValue2MethodState(this);\n                            }\n                            else\n                            {\n                                UserScalarMethod2 = (UserScalarValue2MethodState)replacement;\n                            }\n                        }\n\n                        instance = UserScalarMethod2;\n                        break;\n                    }\n\n                case BrowseNames.UserArrayMethod1:\n                    {\n                        if (createOrReplace && UserArrayMethod1 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UserArrayMethod1 = new UserArrayValue1MethodState(this);\n                            }\n                            else\n                            {\n                                UserArrayMethod1 = (UserArrayValue1MethodState)replacement;\n                            }\n                        }\n\n                        instance = UserArrayMethod1;\n                        break;\n                    }\n\n                case BrowseNames.UserArrayMethod2:\n                    {\n                        if (createOrReplace && UserArrayMethod2 == null)\n                        {\n                            if (replacement == null)\n                            {\n                                UserArrayMethod2 = new UserArrayValue2MethodState(this);\n                            }\n                            else\n                            {\n                                UserArrayMethod2 = (UserArrayValue2MethodState)replacement;\n                            }\n                        }\n\n                        instance = UserArrayMethod2;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private ScalarValue1MethodState m_scalarMethod1Method;\n        private ScalarValue2MethodState m_scalarMethod2Method;\n        private ScalarValue3MethodState m_scalarMethod3Method;\n        private ArrayValue1MethodState m_arrayMethod1Method;\n        private ArrayValue2MethodState m_arrayMethod2Method;\n        private ArrayValue3MethodState m_arrayMethod3Method;\n        private UserScalarValue1MethodState m_userScalarMethod1Method;\n        private UserScalarValue2MethodState m_userScalarMethod2Method;\n        private UserArrayValue1MethodState m_userArrayMethod1Method;\n        private UserArrayValue2MethodState m_userArrayMethod2Method;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region TestSystemConditionState Class\n#if (!OPCUA_EXCLUDE_TestSystemConditionState)\n    /// <summary>\n    /// Stores an instance of the TestSystemConditionType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCode(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class TestSystemConditionState : ConditionState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        public TestSystemConditionState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        /// <param name=\"namespaceUris\"></param>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return NodeId.Create(ObjectTypes.TestSystemConditionType, Namespaces.TestData, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void Initialize(ISystemContext context)\n        {\n            base.Initialize(context);\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAABgAAABodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS//////BGCAAgEAAAABAB8AAABUZXN0U3lzdGVt\" +\n           \"Q29uZGl0aW9uVHlwZUluc3RhbmNlAQGLJwEBiyeLJwAA/////xYAAAAVYIkKAgAAAAAABwAAAEV2ZW50\" +\n           \"SWQBAYwnAC4ARIwnAAAAD/////8BAf////8AAAAAFWCJCgIAAAAAAAkAAABFdmVudFR5cGUBAY0nAC4A\" +\n           \"RI0nAAAAEf////8BAf////8AAAAAFWCJCgIAAAAAAAoAAABTb3VyY2VOb2RlAQGOJwAuAESOJwAAABH/\" +\n           \"////AQH/////AAAAABVgiQoCAAAAAAAKAAAAU291cmNlTmFtZQEBjycALgBEjycAAAAM/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAAABAAAAFRpbWUBAZAnAC4ARJAnAAABACYB/////wEB/////wAAAAAVYIkKAgAA\" +\n           \"AAAACwAAAFJlY2VpdmVUaW1lAQGRJwAuAESRJwAAAQAmAf////8BAf////8AAAAAFWCJCgIAAAAAAAcA\" +\n           \"AABNZXNzYWdlAQGTJwAuAESTJwAAABX/////AQH/////AAAAABVgiQoCAAAAAAAIAAAAU2V2ZXJpdHkB\" +\n           \"AZQnAC4ARJQnAAAABf////8BAf////8AAAAAFWCJCgIAAAAAABAAAABDb25kaXRpb25DbGFzc0lkAQFI\" +\n           \"LQAuAERILQAAABH/////AQH/////AAAAABVgiQoCAAAAAAASAAAAQ29uZGl0aW9uQ2xhc3NOYW1lAQFJ\" +\n           \"LQAuAERJLQAAABX/////AQH/////AAAAABVgiQoCAAAAAAANAAAAQ29uZGl0aW9uTmFtZQEBLC0ALgBE\" +\n           \"LC0AAAAM/////wEB/////wAAAAAVYIkKAgAAAAAACAAAAEJyYW5jaElkAQGVJwAuAESVJwAAABH/////\" +\n           \"AQH/////AAAAABVgiQoCAAAAAAAGAAAAUmV0YWluAQGWJwAuAESWJwAAAAH/////AQH/////AAAAABVg\" +\n           \"iQoCAAAAAAAMAAAARW5hYmxlZFN0YXRlAQGXJwAvAQAjI5cnAAAAFf////8BAf////8BAAAAFWCJCgIA\" +\n           \"AAAAAAIAAABJZAEBmCcALgBEmCcAAAAB/////wEB/////wAAAAAVYIkKAgAAAAAABwAAAFF1YWxpdHkB\" +\n           \"AZ0nAC8BACojnScAAAAT/////wEB/////wEAAAAVYIkKAgAAAAAADwAAAFNvdXJjZVRpbWVzdGFtcAEB\" +\n           \"nicALgBEnicAAAEAJgH/////AQH/////AAAAABVgiQoCAAAAAAAMAAAATGFzdFNldmVyaXR5AQGhJwAv\" +\n           \"AQAqI6EnAAAABf////8BAf////8BAAAAFWCJCgIAAAAAAA8AAABTb3VyY2VUaW1lc3RhbXABAaInAC4A\" +\n           \"RKInAAABACYB/////wEB/////wAAAAAVYIkKAgAAAAAABwAAAENvbW1lbnQBAaMnAC8BACojoycAAAAV\" +\n           \"/////wEB/////wEAAAAVYIkKAgAAAAAADwAAAFNvdXJjZVRpbWVzdGFtcAEBpCcALgBEpCcAAAEAJgH/\" +\n           \"////AQH/////AAAAABVgiQoCAAAAAAAMAAAAQ2xpZW50VXNlcklkAQGlJwAuAESlJwAAAAz/////AQH/\" +\n           \"////AAAAAARhggoEAAAAAAAHAAAARGlzYWJsZQEBpycALwEARCOnJwAAAQEBAAAAAQD5CwABAPMKAAAA\" +\n           \"AARhggoEAAAAAAAGAAAARW5hYmxlAQGmJwAvAQBDI6YnAAABAQEAAAABAPkLAAEA8woAAAAABGGCCgQA\" +\n           \"AAAAAAoAAABBZGRDb21tZW50AQGoJwAvAQBFI6gnAAABAQEAAAABAPkLAAEADQsBAAAAF2CpCgIAAAAA\" +\n           \"AA4AAABJbnB1dEFyZ3VtZW50cwEBqScALgBEqScAAJYCAAAAAQAqAQFGAAAABwAAAEV2ZW50SWQAD///\" +\n           \"//8AAAAAAwAAAAAoAAAAVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBldmVudCB0byBjb21tZW50LgEAKgEB\" +\n           \"QgAAAAcAAABDb21tZW50ABX/////AAAAAAMAAAAAJAAAAFRoZSBjb21tZW50IHRvIGFkZCB0byB0aGUg\" +\n           \"Y29uZGl0aW9uLgEAKAEBAAAAAQAAAAAAAAABAf////8AAAAAFWCJCgIAAAABABIAAABNb25pdG9yZWRO\" +\n           \"b2RlQ291bnQBAawnAC4ARKwnAAAABv////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        public PropertyState<int> MonitoredNodeCount\n        {\n            get => m_monitoredNodeCount;\n\n            set\n            {\n                if (!ReferenceEquals(m_monitoredNodeCount, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_monitoredNodeCount = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_monitoredNodeCount != null)\n            {\n                children.Add(m_monitoredNodeCount);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"createOrReplace\"></param>\n        /// <param name=\"replacement\"></param>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case BrowseNames.MonitoredNodeCount:\n                    {\n                        if (createOrReplace && MonitoredNodeCount == null)\n                        {\n                            if (replacement == null)\n                            {\n                                MonitoredNodeCount = new PropertyState<int>(this);\n                            }\n                            else\n                            {\n                                MonitoredNodeCount = (PropertyState<int>)replacement;\n                            }\n                        }\n\n                        instance = MonitoredNodeCount;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<int> m_monitoredNodeCount;\n        #endregion\n    }\n#endif\n    #endregion\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace TestData\n{\n    #region DataType Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypes\n    {\n        /// <summary>\n        /// The identifier for the ScalarValueDataType DataType.\n        /// </summary>\n        public const uint ScalarValueDataType = 9440;\n\n        /// <summary>\n        /// The identifier for the ArrayValueDataType DataType.\n        /// </summary>\n        public const uint ArrayValueDataType = 9669;\n\n        /// <summary>\n        /// The identifier for the BooleanDataType DataType.\n        /// </summary>\n        public const uint BooleanDataType = 9898;\n\n        /// <summary>\n        /// The identifier for the SByteDataType DataType.\n        /// </summary>\n        public const uint SByteDataType = 9899;\n\n        /// <summary>\n        /// The identifier for the ByteDataType DataType.\n        /// </summary>\n        public const uint ByteDataType = 9900;\n\n        /// <summary>\n        /// The identifier for the Int16DataType DataType.\n        /// </summary>\n        public const uint Int16DataType = 9901;\n\n        /// <summary>\n        /// The identifier for the UInt16DataType DataType.\n        /// </summary>\n        public const uint UInt16DataType = 9902;\n\n        /// <summary>\n        /// The identifier for the Int32DataType DataType.\n        /// </summary>\n        public const uint Int32DataType = 9903;\n\n        /// <summary>\n        /// The identifier for the UInt32DataType DataType.\n        /// </summary>\n        public const uint UInt32DataType = 9904;\n\n        /// <summary>\n        /// The identifier for the Int64DataType DataType.\n        /// </summary>\n        public const uint Int64DataType = 9905;\n\n        /// <summary>\n        /// The identifier for the UInt64DataType DataType.\n        /// </summary>\n        public const uint UInt64DataType = 9906;\n\n        /// <summary>\n        /// The identifier for the FloatDataType DataType.\n        /// </summary>\n        public const uint FloatDataType = 9907;\n\n        /// <summary>\n        /// The identifier for the DoubleDataType DataType.\n        /// </summary>\n        public const uint DoubleDataType = 9908;\n\n        /// <summary>\n        /// The identifier for the StringDataType DataType.\n        /// </summary>\n        public const uint StringDataType = 9909;\n\n        /// <summary>\n        /// The identifier for the DateTimeDataType DataType.\n        /// </summary>\n        public const uint DateTimeDataType = 9910;\n\n        /// <summary>\n        /// The identifier for the GuidDataType DataType.\n        /// </summary>\n        public const uint GuidDataType = 9911;\n\n        /// <summary>\n        /// The identifier for the ByteStringDataType DataType.\n        /// </summary>\n        public const uint ByteStringDataType = 9912;\n\n        /// <summary>\n        /// The identifier for the XmlElementDataType DataType.\n        /// </summary>\n        public const uint XmlElementDataType = 9913;\n\n        /// <summary>\n        /// The identifier for the NodeIdDataType DataType.\n        /// </summary>\n        public const uint NodeIdDataType = 9914;\n\n        /// <summary>\n        /// The identifier for the ExpandedNodeIdDataType DataType.\n        /// </summary>\n        public const uint ExpandedNodeIdDataType = 9915;\n\n        /// <summary>\n        /// The identifier for the QualifiedNameDataType DataType.\n        /// </summary>\n        public const uint QualifiedNameDataType = 9916;\n\n        /// <summary>\n        /// The identifier for the LocalizedTextDataType DataType.\n        /// </summary>\n        public const uint LocalizedTextDataType = 9917;\n\n        /// <summary>\n        /// The identifier for the StatusCodeDataType DataType.\n        /// </summary>\n        public const uint StatusCodeDataType = 9918;\n\n        /// <summary>\n        /// The identifier for the VariantDataType DataType.\n        /// </summary>\n        public const uint VariantDataType = 9919;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueDataType DataType.\n        /// </summary>\n        public const uint UserScalarValueDataType = 9920;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueDataType DataType.\n        /// </summary>\n        public const uint UserArrayValueDataType = 10006;\n\n        /// <summary>\n        /// The identifier for the Vector DataType.\n        /// </summary>\n        public const uint Vector = 1000;\n\n        /// <summary>\n        /// The identifier for the WorkOrderStatusType DataType.\n        /// </summary>\n        public const uint WorkOrderStatusType = 1004;\n\n        /// <summary>\n        /// The identifier for the WorkOrderType DataType.\n        /// </summary>\n        public const uint WorkOrderType = 1005;\n    }\n    #endregion\n\n    #region Method Identifiers\n    /// <summary>\n    /// A class that declares constants for all Methods in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Methods\n    {\n        /// <summary>\n        /// The identifier for the TestDataObjectType_GenerateValues Method.\n        /// </summary>\n        public const uint TestDataObjectType_GenerateValues = 9385;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Disable = 9415;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Enable = 9414;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_AddComment = 9416;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Acknowledge = 9436;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Disable = 9482;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Enable = 9481;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_AddComment = 9483;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Acknowledge = 9503;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Disable = 9566;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Enable = 9565;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_AddComment = 9567;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Acknowledge = 9587;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Disable = 9711;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Enable = 9710;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_AddComment = 9712;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Acknowledge = 9732;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Disable = 9795;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Enable = 9794;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_AddComment = 9796;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Acknowledge = 9816;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Disable = 9953;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Enable = 9952;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_AddComment = 9954;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Acknowledge = 9974;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Disable = 10039;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Enable = 10038;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_AddComment = 10040;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Acknowledge = 10060;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod1 Method.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod1 = 10093;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod2 Method.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod2 = 10096;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod3 Method.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod3 = 10099;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod1 Method.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod1 = 10102;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod2 Method.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod2 = 10105;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod3 Method.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod3 = 10108;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod1 Method.\n        /// </summary>\n        public const uint MethodTestType_UserScalarMethod1 = 10111;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod2 Method.\n        /// </summary>\n        public const uint MethodTestType_UserScalarMethod2 = 10114;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod1 Method.\n        /// </summary>\n        public const uint MethodTestType_UserArrayMethod1 = 10117;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod2 Method.\n        /// </summary>\n        public const uint MethodTestType_UserArrayMethod2 = 10120;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Static_Scalar_GenerateValues = 10161;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Disable = 10191;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Enable = 10190;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_AddComment = 10192;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Acknowledge = 10212;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Static_Array_GenerateValues = 10245;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Disable = 10275;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Enable = 10274;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_AddComment = 10276;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Acknowledge = 10296;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Static_UserScalar_GenerateValues = 10329;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Disable = 10359;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Enable = 10358;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_AddComment = 10360;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Acknowledge = 10380;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Static_UserArray_GenerateValues = 10408;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Disable = 10438;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Enable = 10437;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_AddComment = 10439;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Acknowledge = 10459;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_GenerateValues = 10487;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Disable = 10517;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Enable = 10516;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_AddComment = 10518;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Acknowledge = 10538;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_GenerateValues = 10622;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Disable = 10652;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Enable = 10651;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_AddComment = 10653;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Acknowledge = 10673;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod1 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod1 = 10756;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod2 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod2 = 10759;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod3 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod3 = 10762;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod1 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod1 = 10765;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod2 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod2 = 10768;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod3 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod3 = 10771;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod1 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserScalarMethod1 = 10774;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod2 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserScalarMethod2 = 10777;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod1 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserArrayMethod1 = 10780;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod2 Method.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserArrayMethod2 = 10783;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_GenerateValues = 10789;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Disable = 10819;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Enable = 10818;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_AddComment = 10820;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Acknowledge = 10840;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Dynamic_Array_GenerateValues = 10873;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Disable = 10903;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Enable = 10902;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_AddComment = 10904;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Acknowledge = 10924;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_GenerateValues = 10957;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Disable = 10987;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Enable = 10986;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_AddComment = 10988;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Acknowledge = 11008;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_GenerateValues = 11036;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Disable = 11066;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Enable = 11065;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_AddComment = 11067;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Acknowledge = 11087;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_GenerateValues = 11115;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Disable = 11145;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Enable = 11144;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_AddComment = 11146;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge = 11166;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_GenerateValues Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_GenerateValues = 11250;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Disable Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Disable = 11280;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Enable Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Enable = 11279;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_AddComment Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_AddComment = 11281;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Acknowledge = 11301;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Disable Method.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Disable = 11412;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Enable Method.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Enable = 11411;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_AddComment Method.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_AddComment = 11413;\n    }\n    #endregion\n\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete Object.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete = 9387;\n\n        /// <summary>\n        /// The identifier for the Data Object.\n        /// </summary>\n        public const uint Data = 10157;\n\n        /// <summary>\n        /// The identifier for the Data_Static Object.\n        /// </summary>\n        public const uint Data_Static = 10158;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar Object.\n        /// </summary>\n        public const uint Data_Static_Scalar = 10159;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete = 10163;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array Object.\n        /// </summary>\n        public const uint Data_Static_Array = 10243;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete = 10247;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar Object.\n        /// </summary>\n        public const uint Data_Static_UserScalar = 10327;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete = 10331;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray Object.\n        /// </summary>\n        public const uint Data_Static_UserArray = 10406;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete = 10410;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar Object.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar = 10485;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete = 10489;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray Object.\n        /// </summary>\n        public const uint Data_Static_AnalogArray = 10620;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete = 10624;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest Object.\n        /// </summary>\n        public const uint Data_Static_MethodTest = 10755;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic Object.\n        /// </summary>\n        public const uint Data_Dynamic = 10786;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar Object.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar = 10787;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete = 10791;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array Object.\n        /// </summary>\n        public const uint Data_Dynamic_Array = 10871;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete = 10875;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar Object.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar = 10955;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete = 10959;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray Object.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray = 11034;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete = 11038;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar Object.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar = 11113;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete = 11117;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray Object.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray = 11248;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete Object.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete = 11252;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions Object.\n        /// </summary>\n        public const uint Data_Conditions = 11383;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus Object.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus = 11384;\n\n        /// <summary>\n        /// The identifier for the ScalarValueDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint ScalarValueDataType_Encoding_DefaultBinary = 11437;\n\n        /// <summary>\n        /// The identifier for the ArrayValueDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint ArrayValueDataType_Encoding_DefaultBinary = 11438;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint UserScalarValueDataType_Encoding_DefaultBinary = 11439;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint UserArrayValueDataType_Encoding_DefaultBinary = 11440;\n\n        /// <summary>\n        /// The identifier for the Vector_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint Vector_Encoding_DefaultBinary = 1008;\n\n        /// <summary>\n        /// The identifier for the WorkOrderStatusType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint WorkOrderStatusType_Encoding_DefaultBinary = 1011;\n\n        /// <summary>\n        /// The identifier for the WorkOrderType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint WorkOrderType_Encoding_DefaultBinary = 1012;\n\n        /// <summary>\n        /// The identifier for the ScalarValueDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint ScalarValueDataType_Encoding_DefaultXml = 11418;\n\n        /// <summary>\n        /// The identifier for the ArrayValueDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint ArrayValueDataType_Encoding_DefaultXml = 11419;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint UserScalarValueDataType_Encoding_DefaultXml = 11420;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint UserArrayValueDataType_Encoding_DefaultXml = 11421;\n\n        /// <summary>\n        /// The identifier for the Vector_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint Vector_Encoding_DefaultXml = 36;\n\n        /// <summary>\n        /// The identifier for the WorkOrderStatusType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint WorkOrderStatusType_Encoding_DefaultXml = 39;\n\n        /// <summary>\n        /// The identifier for the WorkOrderType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint WorkOrderType_Encoding_DefaultXml = 40;\n\n        /// <summary>\n        /// The identifier for the ScalarValueDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint ScalarValueDataType_Encoding_DefaultJson = 15047;\n\n        /// <summary>\n        /// The identifier for the ArrayValueDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint ArrayValueDataType_Encoding_DefaultJson = 15048;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint UserScalarValueDataType_Encoding_DefaultJson = 15049;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint UserArrayValueDataType_Encoding_DefaultJson = 15050;\n\n        /// <summary>\n        /// The identifier for the Vector_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint Vector_Encoding_DefaultJson = 64;\n\n        /// <summary>\n        /// The identifier for the WorkOrderStatusType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint WorkOrderStatusType_Encoding_DefaultJson = 67;\n\n        /// <summary>\n        /// The identifier for the WorkOrderType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint WorkOrderType_Encoding_DefaultJson = 68;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <summary>\n        /// The identifier for the GenerateValuesEventType ObjectType.\n        /// </summary>\n        public const uint GenerateValuesEventType = 9371;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType ObjectType.\n        /// </summary>\n        public const uint TestDataObjectType = 9383;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType ObjectType.\n        /// </summary>\n        public const uint ScalarValueObjectType = 9450;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType ObjectType.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType = 9534;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType ObjectType.\n        /// </summary>\n        public const uint ArrayValueObjectType = 9679;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType ObjectType.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType = 9763;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType ObjectType.\n        /// </summary>\n        public const uint UserScalarValueObjectType = 9921;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType ObjectType.\n        /// </summary>\n        public const uint UserArrayValueObjectType = 10007;\n\n        /// <summary>\n        /// The identifier for the MethodTestType ObjectType.\n        /// </summary>\n        public const uint MethodTestType = 10092;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType ObjectType.\n        /// </summary>\n        public const uint TestSystemConditionType = 10123;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the GenerateValuesEventType_Iterations Variable.\n        /// </summary>\n        public const uint GenerateValuesEventType_Iterations = 9381;\n\n        /// <summary>\n        /// The identifier for the GenerateValuesEventType_NewValueCount Variable.\n        /// </summary>\n        public const uint GenerateValuesEventType_NewValueCount = 9382;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_SimulationActive Variable.\n        /// </summary>\n        public const uint TestDataObjectType_SimulationActive = 9384;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint TestDataObjectType_GenerateValues_InputArguments = 9386;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_EventId = 9388;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_EventType = 9389;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_SourceNode = 9390;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_SourceName = 9391;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Time = 9392;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_ReceiveTime = 9393;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Message = 9395;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Severity = 9396;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_ConditionClassId = 11578;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_ConditionClassName = 11579;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_ConditionName = 11557;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_BranchId = 9397;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Retain = 9398;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_EnabledState = 9399;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_EnabledState_Id = 9400;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Quality = 9405;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Quality_SourceTimestamp = 9406;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_LastSeverity = 9409;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_LastSeverity_SourceTimestamp = 9410;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Comment = 9411;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Comment_SourceTimestamp = 9412;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_ClientUserId = 9413;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_AddComment_InputArguments = 9417;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_AckedState = 9420;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_AckedState_Id = 9421;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_ConfirmedState_Id = 9429;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Acknowledge_InputArguments = 9437;\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint TestDataObjectType_CycleComplete_Confirm_InputArguments = 9439;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_GenerateValues_InputArguments = 9453;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_EventId = 9455;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_EventType = 9456;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_SourceNode = 9457;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_SourceName = 9458;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Time = 9459;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_ReceiveTime = 9460;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Message = 9462;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Severity = 9463;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_ConditionClassId = 11580;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_ConditionClassName = 11581;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_ConditionName = 11558;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_BranchId = 9464;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Retain = 9465;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_EnabledState = 9466;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_EnabledState_Id = 9467;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Quality = 9472;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Quality_SourceTimestamp = 9473;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_LastSeverity = 9476;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = 9477;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Comment = 9478;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Comment_SourceTimestamp = 9479;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_ClientUserId = 9480;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_AddComment_InputArguments = 9484;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_AckedState = 9487;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_AckedState_Id = 9488;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_ConfirmedState_Id = 9496;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Acknowledge_InputArguments = 9504;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_CycleComplete_Confirm_InputArguments = 9506;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_BooleanValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_BooleanValue = 9507;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_SByteValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_SByteValue = 9508;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_ByteValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_ByteValue = 9509;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_Int16Value Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_Int16Value = 9510;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_UInt16Value = 9511;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_Int32Value Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_Int32Value = 9512;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_UInt32Value = 9513;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_Int64Value Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_Int64Value = 9514;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_UInt64Value = 9515;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_FloatValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_FloatValue = 9516;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_DoubleValue = 9517;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_StringValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_StringValue = 9518;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_DateTimeValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_DateTimeValue = 9519;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_GuidValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_GuidValue = 9520;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_ByteStringValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_ByteStringValue = 9521;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_XmlElementValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_XmlElementValue = 9522;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_NodeIdValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_NodeIdValue = 9523;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_ExpandedNodeIdValue = 9524;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_QualifiedNameValue = 9525;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_LocalizedTextValue = 9526;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_StatusCodeValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_StatusCodeValue = 9527;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_VariantValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_VariantValue = 9528;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_EnumerationValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_EnumerationValue = 9529;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_StructureValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_StructureValue = 9530;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_NumberValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_NumberValue = 9531;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_IntegerValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_IntegerValue = 9532;\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_UIntegerValue Variable.\n        /// </summary>\n        public const uint ScalarValueObjectType_UIntegerValue = 9533;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_GenerateValues_InputArguments = 9537;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_EventId = 9539;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_EventType = 9540;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_SourceNode = 9541;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_SourceName = 9542;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Time = 9543;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_ReceiveTime = 9544;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Message = 9546;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Severity = 9547;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_ConditionClassId = 11582;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_ConditionClassName = 11583;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_ConditionName = 11559;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_BranchId = 9548;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Retain = 9549;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_EnabledState = 9550;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_EnabledState_Id = 9551;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Quality = 9556;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Quality_SourceTimestamp = 9557;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_LastSeverity = 9560;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = 9561;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Comment = 9562;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Comment_SourceTimestamp = 9563;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_ClientUserId = 9564;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_AddComment_InputArguments = 9568;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_AckedState = 9571;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_AckedState_Id = 9572;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_ConfirmedState_Id = 9580;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Acknowledge_InputArguments = 9588;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_CycleComplete_Confirm_InputArguments = 9590;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_SByteValue Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_SByteValue = 9591;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_SByteValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_SByteValue_EURange = 9594;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_ByteValue Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_ByteValue = 9597;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_ByteValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_ByteValue_EURange = 9600;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int16Value Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_Int16Value = 9603;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int16Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_Int16Value_EURange = 9606;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_UInt16Value = 9609;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt16Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_UInt16Value_EURange = 9612;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int32Value Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_Int32Value = 9615;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int32Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_Int32Value_EURange = 9618;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_UInt32Value = 9621;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt32Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_UInt32Value_EURange = 9624;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int64Value Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_Int64Value = 9627;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int64Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_Int64Value_EURange = 9630;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_UInt64Value = 9633;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt64Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_UInt64Value_EURange = 9636;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_FloatValue Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_FloatValue = 9639;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_FloatValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_FloatValue_EURange = 9642;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_DoubleValue = 9645;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_DoubleValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_DoubleValue_EURange = 9648;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_NumberValue Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_NumberValue = 9651;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_NumberValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_NumberValue_EURange = 9654;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_IntegerValue Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_IntegerValue = 9657;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_IntegerValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_IntegerValue_EURange = 9660;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UIntegerValue Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_UIntegerValue = 9663;\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UIntegerValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogScalarValueObjectType_UIntegerValue_EURange = 9666;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_GenerateValues_InputArguments = 9682;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_EventId = 9684;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_EventType = 9685;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_SourceNode = 9686;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_SourceName = 9687;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Time = 9688;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_ReceiveTime = 9689;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Message = 9691;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Severity = 9692;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_ConditionClassId = 11584;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_ConditionClassName = 11585;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_ConditionName = 11560;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_BranchId = 9693;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Retain = 9694;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_EnabledState = 9695;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_EnabledState_Id = 9696;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Quality = 9701;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Quality_SourceTimestamp = 9702;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_LastSeverity = 9705;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = 9706;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Comment = 9707;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Comment_SourceTimestamp = 9708;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_ClientUserId = 9709;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_AddComment_InputArguments = 9713;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_AckedState = 9716;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_AckedState_Id = 9717;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_ConfirmedState_Id = 9725;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Acknowledge_InputArguments = 9733;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_CycleComplete_Confirm_InputArguments = 9735;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_BooleanValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_BooleanValue = 9736;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_SByteValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_SByteValue = 9737;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_ByteValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_ByteValue = 9738;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_Int16Value Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_Int16Value = 9739;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_UInt16Value = 9740;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_Int32Value Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_Int32Value = 9741;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_UInt32Value = 9742;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_Int64Value Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_Int64Value = 9743;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_UInt64Value = 9744;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_FloatValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_FloatValue = 9745;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_DoubleValue = 9746;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_StringValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_StringValue = 9747;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_DateTimeValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_DateTimeValue = 9748;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_GuidValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_GuidValue = 9749;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_ByteStringValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_ByteStringValue = 9750;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_XmlElementValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_XmlElementValue = 9751;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_NodeIdValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_NodeIdValue = 9752;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_ExpandedNodeIdValue = 9753;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_QualifiedNameValue = 9754;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_LocalizedTextValue = 9755;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_StatusCodeValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_StatusCodeValue = 9756;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_VariantValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_VariantValue = 9757;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_EnumerationValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_EnumerationValue = 9758;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_StructureValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_StructureValue = 9759;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_NumberValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_NumberValue = 9760;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_IntegerValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_IntegerValue = 9761;\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_UIntegerValue Variable.\n        /// </summary>\n        public const uint ArrayValueObjectType_UIntegerValue = 9762;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_GenerateValues_InputArguments = 9766;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_EventId = 9768;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_EventType = 9769;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_SourceNode = 9770;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_SourceName = 9771;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Time = 9772;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_ReceiveTime = 9773;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Message = 9775;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Severity = 9776;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_ConditionClassId = 11586;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_ConditionClassName = 11587;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_ConditionName = 11561;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_BranchId = 9777;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Retain = 9778;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_EnabledState = 9779;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_EnabledState_Id = 9780;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Quality = 9785;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Quality_SourceTimestamp = 9786;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_LastSeverity = 9789;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = 9790;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Comment = 9791;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Comment_SourceTimestamp = 9792;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_ClientUserId = 9793;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_AddComment_InputArguments = 9797;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_AckedState = 9800;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_AckedState_Id = 9801;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_ConfirmedState_Id = 9809;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Acknowledge_InputArguments = 9817;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_CycleComplete_Confirm_InputArguments = 9819;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_SByteValue Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_SByteValue = 9820;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_SByteValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_SByteValue_EURange = 9823;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_ByteValue Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_ByteValue = 9826;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_ByteValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_ByteValue_EURange = 9829;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int16Value Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_Int16Value = 9832;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int16Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_Int16Value_EURange = 9835;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_UInt16Value = 9838;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt16Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_UInt16Value_EURange = 9841;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int32Value Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_Int32Value = 9844;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int32Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_Int32Value_EURange = 9847;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_UInt32Value = 9850;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt32Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_UInt32Value_EURange = 9853;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int64Value Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_Int64Value = 9856;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int64Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_Int64Value_EURange = 9859;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_UInt64Value = 9862;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt64Value_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_UInt64Value_EURange = 9865;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_FloatValue Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_FloatValue = 9868;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_FloatValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_FloatValue_EURange = 9871;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_DoubleValue = 9874;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_DoubleValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_DoubleValue_EURange = 9877;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_NumberValue Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_NumberValue = 9880;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_NumberValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_NumberValue_EURange = 9883;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_IntegerValue Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_IntegerValue = 9886;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_IntegerValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_IntegerValue_EURange = 9889;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UIntegerValue Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_UIntegerValue = 9892;\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UIntegerValue_EURange Variable.\n        /// </summary>\n        public const uint AnalogArrayValueObjectType_UIntegerValue_EURange = 9895;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_GenerateValues_InputArguments = 9924;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_EventId = 9926;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_EventType = 9927;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_SourceNode = 9928;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_SourceName = 9929;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Time = 9930;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_ReceiveTime = 9931;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Message = 9933;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Severity = 9934;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_ConditionClassId = 11588;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_ConditionClassName = 11589;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_ConditionName = 11562;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_BranchId = 9935;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Retain = 9936;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_EnabledState = 9937;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_EnabledState_Id = 9938;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Quality = 9943;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Quality_SourceTimestamp = 9944;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_LastSeverity = 9947;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = 9948;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Comment = 9949;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Comment_SourceTimestamp = 9950;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_ClientUserId = 9951;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_AddComment_InputArguments = 9955;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_AckedState = 9958;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_AckedState_Id = 9959;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_ConfirmedState_Id = 9967;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Acknowledge_InputArguments = 9975;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_CycleComplete_Confirm_InputArguments = 9977;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_BooleanValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_BooleanValue = 9978;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_SByteValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_SByteValue = 9979;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_ByteValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_ByteValue = 9980;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_Int16Value Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_Int16Value = 9981;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_UInt16Value = 9982;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_Int32Value Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_Int32Value = 9983;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_UInt32Value = 9984;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_Int64Value Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_Int64Value = 9985;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_UInt64Value = 9986;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_FloatValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_FloatValue = 9987;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_DoubleValue = 9988;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_StringValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_StringValue = 9989;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_DateTimeValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_DateTimeValue = 9990;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_GuidValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_GuidValue = 9991;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_ByteStringValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_ByteStringValue = 9992;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_XmlElementValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_XmlElementValue = 9993;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_NodeIdValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_NodeIdValue = 9994;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_ExpandedNodeIdValue = 9995;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_QualifiedNameValue = 9996;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_LocalizedTextValue = 9997;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_StatusCodeValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_StatusCodeValue = 9998;\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_VariantValue Variable.\n        /// </summary>\n        public const uint UserScalarValueObjectType_VariantValue = 9999;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_GenerateValues_InputArguments = 10010;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_EventId = 10012;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_EventType = 10013;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_SourceNode = 10014;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_SourceName = 10015;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Time = 10016;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_ReceiveTime = 10017;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Message = 10019;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Severity = 10020;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_ConditionClassId = 11590;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_ConditionClassName = 11591;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_ConditionName = 11563;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_BranchId = 10021;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Retain = 10022;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_EnabledState = 10023;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_EnabledState_Id = 10024;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Quality = 10029;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Quality_SourceTimestamp = 10030;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_LastSeverity = 10033;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = 10034;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Comment = 10035;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Comment_SourceTimestamp = 10036;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_ClientUserId = 10037;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_AddComment_InputArguments = 10041;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_AckedState = 10044;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_AckedState_Id = 10045;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_ConfirmedState_Id = 10053;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Acknowledge_InputArguments = 10061;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_CycleComplete_Confirm_InputArguments = 10063;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_BooleanValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_BooleanValue = 10064;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_SByteValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_SByteValue = 10065;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_ByteValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_ByteValue = 10066;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_Int16Value Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_Int16Value = 10067;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_UInt16Value = 10068;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_Int32Value Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_Int32Value = 10069;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_UInt32Value = 10070;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_Int64Value Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_Int64Value = 10071;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_UInt64Value = 10072;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_FloatValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_FloatValue = 10073;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_DoubleValue = 10074;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_StringValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_StringValue = 10075;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_DateTimeValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_DateTimeValue = 10076;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_GuidValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_GuidValue = 10077;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_ByteStringValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_ByteStringValue = 10078;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_XmlElementValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_XmlElementValue = 10079;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_NodeIdValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_NodeIdValue = 10080;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_ExpandedNodeIdValue = 10081;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_QualifiedNameValue = 10082;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_LocalizedTextValue = 10083;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_StatusCodeValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_StatusCodeValue = 10084;\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_VariantValue Variable.\n        /// </summary>\n        public const uint UserArrayValueObjectType_VariantValue = 10085;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod1_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod1_InputArguments = 10094;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod1_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod1_OutputArguments = 10095;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod2_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod2_InputArguments = 10097;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod2_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod2_OutputArguments = 10098;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod3_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod3_InputArguments = 10100;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod3_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ScalarMethod3_OutputArguments = 10101;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod1_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod1_InputArguments = 10103;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod1_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod1_OutputArguments = 10104;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod2_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod2_InputArguments = 10106;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod2_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod2_OutputArguments = 10107;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod3_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod3_InputArguments = 10109;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod3_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_ArrayMethod3_OutputArguments = 10110;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod1_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_UserScalarMethod1_InputArguments = 10112;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod1_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_UserScalarMethod1_OutputArguments = 10113;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod2_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_UserScalarMethod2_InputArguments = 10115;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod2_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_UserScalarMethod2_OutputArguments = 10116;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod1_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_UserArrayMethod1_InputArguments = 10118;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod1_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_UserArrayMethod1_OutputArguments = 10119;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod2_InputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_UserArrayMethod2_InputArguments = 10121;\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod2_OutputArguments Variable.\n        /// </summary>\n        public const uint MethodTestType_UserArrayMethod2_OutputArguments = 10122;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_EnabledState_Id Variable.\n        /// </summary>\n        public const uint TestSystemConditionType_EnabledState_Id = 10136;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint TestSystemConditionType_Quality_SourceTimestamp = 10142;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint TestSystemConditionType_LastSeverity_SourceTimestamp = 10146;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint TestSystemConditionType_Comment_SourceTimestamp = 10148;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint TestSystemConditionType_AddComment_InputArguments = 10153;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_ConditionRefresh_InputArguments Variable.\n        /// </summary>\n        public const uint TestSystemConditionType_ConditionRefresh_InputArguments = 10155;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_ConditionRefresh2_InputArguments Variable.\n        /// </summary>\n        public const uint TestSystemConditionType_ConditionRefresh2_InputArguments = 15018;\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_MonitoredNodeCount Variable.\n        /// </summary>\n        public const uint TestSystemConditionType_MonitoredNodeCount = 10156;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_SimulationActive = 10160;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_GenerateValues_InputArguments = 10162;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_EventId = 10164;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_EventType = 10165;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_SourceNode = 10166;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_SourceName = 10167;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Time = 10168;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_ReceiveTime = 10169;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Message = 10171;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Severity = 10172;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_ConditionClassId = 11594;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_ConditionClassName = 11595;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_ConditionName = 11565;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_BranchId = 10173;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Retain = 10174;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_EnabledState = 10175;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_EnabledState_Id = 10176;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Quality = 10181;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Quality_SourceTimestamp = 10182;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_LastSeverity = 10185;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_LastSeverity_SourceTimestamp = 10186;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Comment = 10187;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Comment_SourceTimestamp = 10188;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_ClientUserId = 10189;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_AddComment_InputArguments = 10193;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_AckedState = 10196;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_AckedState_Id = 10197;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_ConfirmedState_Id = 10205;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Acknowledge_InputArguments = 10213;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_CycleComplete_Confirm_InputArguments = 10215;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_BooleanValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_BooleanValue = 10216;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_SByteValue = 10217;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_ByteValue = 10218;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_Int16Value = 10219;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_UInt16Value = 10220;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_Int32Value = 10221;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_UInt32Value = 10222;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_Int64Value = 10223;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_UInt64Value = 10224;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_FloatValue = 10225;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_DoubleValue = 10226;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_StringValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_StringValue = 10227;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_DateTimeValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_DateTimeValue = 10228;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_GuidValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_GuidValue = 10229;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_ByteStringValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_ByteStringValue = 10230;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_XmlElementValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_XmlElementValue = 10231;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_NodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_NodeIdValue = 10232;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_ExpandedNodeIdValue = 10233;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_QualifiedNameValue = 10234;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_LocalizedTextValue = 10235;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_StatusCodeValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_StatusCodeValue = 10236;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_VariantValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_VariantValue = 10237;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_EnumerationValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_EnumerationValue = 10238;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_StructureValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_StructureValue = 10239;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_NumberValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_NumberValue = 10240;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_IntegerValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_IntegerValue = 10241;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_UIntegerValue Variable.\n        /// </summary>\n        public const uint Data_Static_Scalar_UIntegerValue = 10242;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Static_Array_SimulationActive = 10244;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_Array_GenerateValues_InputArguments = 10246;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_EventId = 10248;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_EventType = 10249;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_SourceNode = 10250;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_SourceName = 10251;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Time = 10252;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_ReceiveTime = 10253;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Message = 10255;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Severity = 10256;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_ConditionClassId = 11596;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_ConditionClassName = 11597;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_ConditionName = 11566;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_BranchId = 10257;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Retain = 10258;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_EnabledState = 10259;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_EnabledState_Id = 10260;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Quality = 10265;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Quality_SourceTimestamp = 10266;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_LastSeverity = 10269;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_LastSeverity_SourceTimestamp = 10270;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Comment = 10271;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Comment_SourceTimestamp = 10272;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_ClientUserId = 10273;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_AddComment_InputArguments = 10277;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_AckedState = 10280;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_AckedState_Id = 10281;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_ConfirmedState_Id = 10289;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Acknowledge_InputArguments = 10297;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_Array_CycleComplete_Confirm_InputArguments = 10299;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_BooleanValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_BooleanValue = 10300;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_SByteValue = 10301;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_ByteValue = 10302;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Static_Array_Int16Value = 10303;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Static_Array_UInt16Value = 10304;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Static_Array_Int32Value = 10305;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Static_Array_UInt32Value = 10306;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Static_Array_Int64Value = 10307;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Static_Array_UInt64Value = 10308;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_FloatValue = 10309;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_DoubleValue = 10310;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_StringValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_StringValue = 10311;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_DateTimeValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_DateTimeValue = 10312;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_GuidValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_GuidValue = 10313;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_ByteStringValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_ByteStringValue = 10314;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_XmlElementValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_XmlElementValue = 10315;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_NodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_NodeIdValue = 10316;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_ExpandedNodeIdValue = 10317;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_QualifiedNameValue = 10318;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_LocalizedTextValue = 10319;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_StatusCodeValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_StatusCodeValue = 10320;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_VariantValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_VariantValue = 10321;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_EnumerationValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_EnumerationValue = 10322;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_StructureValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_StructureValue = 10323;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_NumberValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_NumberValue = 10324;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_IntegerValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_IntegerValue = 10325;\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_UIntegerValue Variable.\n        /// </summary>\n        public const uint Data_Static_Array_UIntegerValue = 10326;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_SimulationActive = 10328;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_GenerateValues_InputArguments = 10330;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_EventId = 10332;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_EventType = 10333;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_SourceNode = 10334;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_SourceName = 10335;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Time = 10336;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_ReceiveTime = 10337;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Message = 10339;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Severity = 10340;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_ConditionClassId = 11598;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_ConditionClassName = 11599;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_ConditionName = 11567;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_BranchId = 10341;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Retain = 10342;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_EnabledState = 10343;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_EnabledState_Id = 10344;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Quality = 10349;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Quality_SourceTimestamp = 10350;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_LastSeverity = 10353;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_LastSeverity_SourceTimestamp = 10354;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Comment = 10355;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Comment_SourceTimestamp = 10356;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_ClientUserId = 10357;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_AddComment_InputArguments = 10361;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_AckedState = 10364;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_AckedState_Id = 10365;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_ConfirmedState_Id = 10373;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Acknowledge_InputArguments = 10381;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_CycleComplete_Confirm_InputArguments = 10383;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_BooleanValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_BooleanValue = 10384;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_SByteValue = 10385;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_ByteValue = 10386;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_Int16Value = 10387;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_UInt16Value = 10388;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_Int32Value = 10389;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_UInt32Value = 10390;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_Int64Value = 10391;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_UInt64Value = 10392;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_FloatValue = 10393;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_DoubleValue = 10394;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_StringValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_StringValue = 10395;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_DateTimeValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_DateTimeValue = 10396;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_GuidValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_GuidValue = 10397;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_ByteStringValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_ByteStringValue = 10398;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_XmlElementValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_XmlElementValue = 10399;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_NodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_NodeIdValue = 10400;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_ExpandedNodeIdValue = 10401;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_QualifiedNameValue = 10402;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_LocalizedTextValue = 10403;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_StatusCodeValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_StatusCodeValue = 10404;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_VariantValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserScalar_VariantValue = 10405;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_SimulationActive = 10407;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_GenerateValues_InputArguments = 10409;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_EventId = 10411;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_EventType = 10412;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_SourceNode = 10413;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_SourceName = 10414;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Time = 10415;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_ReceiveTime = 10416;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Message = 10418;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Severity = 10419;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_ConditionClassId = 11600;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_ConditionClassName = 11601;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_ConditionName = 11568;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_BranchId = 10420;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Retain = 10421;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_EnabledState = 10422;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_EnabledState_Id = 10423;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Quality = 10428;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Quality_SourceTimestamp = 10429;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_LastSeverity = 10432;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_LastSeverity_SourceTimestamp = 10433;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Comment = 10434;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Comment_SourceTimestamp = 10435;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_ClientUserId = 10436;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_AddComment_InputArguments = 10440;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_AckedState = 10443;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_AckedState_Id = 10444;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_ConfirmedState_Id = 10452;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Acknowledge_InputArguments = 10460;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_CycleComplete_Confirm_InputArguments = 10462;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_BooleanValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_BooleanValue = 10463;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_SByteValue = 10464;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_ByteValue = 10465;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_Int16Value = 10466;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_UInt16Value = 10467;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_Int32Value = 10468;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_UInt32Value = 10469;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_Int64Value = 10470;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_UInt64Value = 10471;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_FloatValue = 10472;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_DoubleValue = 10473;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_StringValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_StringValue = 10474;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_DateTimeValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_DateTimeValue = 10475;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_GuidValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_GuidValue = 10476;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_ByteStringValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_ByteStringValue = 10477;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_XmlElementValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_XmlElementValue = 10478;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_NodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_NodeIdValue = 10479;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_ExpandedNodeIdValue = 10480;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_QualifiedNameValue = 10481;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_LocalizedTextValue = 10482;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_StatusCodeValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_StatusCodeValue = 10483;\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_VariantValue Variable.\n        /// </summary>\n        public const uint Data_Static_UserArray_VariantValue = 10484;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_SimulationActive = 10486;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_GenerateValues_InputArguments = 10488;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_EventId = 10490;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_EventType = 10491;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_SourceNode = 10492;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_SourceName = 10493;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Time = 10494;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_ReceiveTime = 10495;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Message = 10497;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Severity = 10498;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_ConditionClassId = 11602;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_ConditionClassName = 11603;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_ConditionName = 11569;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_BranchId = 10499;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Retain = 10500;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_EnabledState = 10501;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_EnabledState_Id = 10502;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Quality = 10507;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Quality_SourceTimestamp = 10508;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_LastSeverity = 10511;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp = 10512;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Comment = 10513;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Comment_SourceTimestamp = 10514;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_ClientUserId = 10515;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_AddComment_InputArguments = 10519;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_AckedState = 10522;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_AckedState_Id = 10523;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_ConfirmedState_Id = 10531;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Acknowledge_InputArguments = 10539;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_CycleComplete_Confirm_InputArguments = 10541;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_SByteValue = 10542;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_SByteValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_SByteValue_EURange = 10545;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_ByteValue = 10548;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_ByteValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_ByteValue_EURange = 10551;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_Int16Value = 10554;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int16Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_Int16Value_EURange = 10557;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_UInt16Value = 10560;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt16Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_UInt16Value_EURange = 10563;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_Int32Value = 10566;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int32Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_Int32Value_EURange = 10569;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_UInt32Value = 10572;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt32Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_UInt32Value_EURange = 10575;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_Int64Value = 10578;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int64Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_Int64Value_EURange = 10581;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_UInt64Value = 10584;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt64Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_UInt64Value_EURange = 10587;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_FloatValue = 10590;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_FloatValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_FloatValue_EURange = 10593;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_DoubleValue = 10596;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_DoubleValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_DoubleValue_EURange = 10599;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_NumberValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_NumberValue = 10602;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_NumberValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_NumberValue_EURange = 10605;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_IntegerValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_IntegerValue = 10608;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_IntegerValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_IntegerValue_EURange = 10611;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UIntegerValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_UIntegerValue = 10614;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UIntegerValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogScalar_UIntegerValue_EURange = 10617;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_SimulationActive = 10621;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_GenerateValues_InputArguments = 10623;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_EventId = 10625;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_EventType = 10626;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_SourceNode = 10627;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_SourceName = 10628;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Time = 10629;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_ReceiveTime = 10630;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Message = 10632;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Severity = 10633;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_ConditionClassId = 11604;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_ConditionClassName = 11605;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_ConditionName = 11570;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_BranchId = 10634;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Retain = 10635;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_EnabledState = 10636;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_EnabledState_Id = 10637;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Quality = 10642;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Quality_SourceTimestamp = 10643;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_LastSeverity = 10646;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp = 10647;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Comment = 10648;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Comment_SourceTimestamp = 10649;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_ClientUserId = 10650;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_AddComment_InputArguments = 10654;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_AckedState = 10657;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_AckedState_Id = 10658;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_ConfirmedState_Id = 10666;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Acknowledge_InputArguments = 10674;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_CycleComplete_Confirm_InputArguments = 10676;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_SByteValue = 10677;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_SByteValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_SByteValue_EURange = 10680;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_ByteValue = 10683;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_ByteValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_ByteValue_EURange = 10686;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_Int16Value = 10689;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int16Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_Int16Value_EURange = 10692;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_UInt16Value = 10695;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt16Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_UInt16Value_EURange = 10698;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_Int32Value = 10701;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int32Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_Int32Value_EURange = 10704;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_UInt32Value = 10707;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt32Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_UInt32Value_EURange = 10710;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_Int64Value = 10713;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int64Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_Int64Value_EURange = 10716;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_UInt64Value = 10719;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt64Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_UInt64Value_EURange = 10722;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_FloatValue = 10725;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_FloatValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_FloatValue_EURange = 10728;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_DoubleValue = 10731;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_DoubleValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_DoubleValue_EURange = 10734;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_NumberValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_NumberValue = 10737;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_NumberValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_NumberValue_EURange = 10740;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_IntegerValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_IntegerValue = 10743;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_IntegerValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_IntegerValue_EURange = 10746;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UIntegerValue Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_UIntegerValue = 10749;\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UIntegerValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Static_AnalogArray_UIntegerValue_EURange = 10752;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod1_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod1_InputArguments = 10757;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod1_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod1_OutputArguments = 10758;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod2_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod2_InputArguments = 10760;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod2_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod2_OutputArguments = 10761;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod3_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod3_InputArguments = 10763;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod3_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ScalarMethod3_OutputArguments = 10764;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod1_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod1_InputArguments = 10766;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod1_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod1_OutputArguments = 10767;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod2_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod2_InputArguments = 10769;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod2_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod2_OutputArguments = 10770;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod3_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod3_InputArguments = 10772;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod3_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_ArrayMethod3_OutputArguments = 10773;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod1_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserScalarMethod1_InputArguments = 10775;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod1_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserScalarMethod1_OutputArguments = 10776;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod2_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserScalarMethod2_InputArguments = 10778;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod2_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserScalarMethod2_OutputArguments = 10779;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod1_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserArrayMethod1_InputArguments = 10781;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod1_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserArrayMethod1_OutputArguments = 10782;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod2_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserArrayMethod2_InputArguments = 10784;\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod2_OutputArguments Variable.\n        /// </summary>\n        public const uint Data_Static_MethodTest_UserArrayMethod2_OutputArguments = 10785;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_SimulationActive = 10788;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_GenerateValues_InputArguments = 10790;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_EventId = 10792;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_EventType = 10793;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_SourceNode = 10794;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_SourceName = 10795;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Time = 10796;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_ReceiveTime = 10797;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Message = 10799;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Severity = 10800;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_ConditionClassId = 11606;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_ConditionClassName = 11607;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_ConditionName = 11571;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_BranchId = 10801;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Retain = 10802;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_EnabledState = 10803;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_EnabledState_Id = 10804;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Quality = 10809;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Quality_SourceTimestamp = 10810;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_LastSeverity = 10813;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_LastSeverity_SourceTimestamp = 10814;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Comment = 10815;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Comment_SourceTimestamp = 10816;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_ClientUserId = 10817;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_AddComment_InputArguments = 10821;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_AckedState = 10824;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_AckedState_Id = 10825;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_ConfirmedState_Id = 10833;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Acknowledge_InputArguments = 10841;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_CycleComplete_Confirm_InputArguments = 10843;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_BooleanValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_BooleanValue = 10844;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_SByteValue = 10845;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_ByteValue = 10846;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_Int16Value = 10847;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_UInt16Value = 10848;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_Int32Value = 10849;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_UInt32Value = 10850;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_Int64Value = 10851;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_UInt64Value = 10852;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_FloatValue = 10853;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_DoubleValue = 10854;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_StringValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_StringValue = 10855;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_DateTimeValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_DateTimeValue = 10856;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_GuidValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_GuidValue = 10857;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_ByteStringValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_ByteStringValue = 10858;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_XmlElementValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_XmlElementValue = 10859;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_NodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_NodeIdValue = 10860;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_ExpandedNodeIdValue = 10861;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_QualifiedNameValue = 10862;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_LocalizedTextValue = 10863;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_StatusCodeValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_StatusCodeValue = 10864;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_VariantValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_VariantValue = 10865;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_EnumerationValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_EnumerationValue = 10866;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_StructureValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_StructureValue = 10867;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_NumberValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_NumberValue = 10868;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_IntegerValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_IntegerValue = 10869;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_UIntegerValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Scalar_UIntegerValue = 10870;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_SimulationActive = 10872;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_GenerateValues_InputArguments = 10874;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_EventId = 10876;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_EventType = 10877;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_SourceNode = 10878;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_SourceName = 10879;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Time = 10880;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_ReceiveTime = 10881;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Message = 10883;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Severity = 10884;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_ConditionClassId = 11608;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_ConditionClassName = 11609;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_ConditionName = 11572;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_BranchId = 10885;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Retain = 10886;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_EnabledState = 10887;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_EnabledState_Id = 10888;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Quality = 10893;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Quality_SourceTimestamp = 10894;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_LastSeverity = 10897;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_LastSeverity_SourceTimestamp = 10898;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Comment = 10899;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Comment_SourceTimestamp = 10900;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_ClientUserId = 10901;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_AddComment_InputArguments = 10905;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_AckedState = 10908;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_AckedState_Id = 10909;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_ConfirmedState_Id = 10917;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Acknowledge_InputArguments = 10925;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_CycleComplete_Confirm_InputArguments = 10927;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_BooleanValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_BooleanValue = 10928;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_SByteValue = 10929;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_ByteValue = 10930;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_Int16Value = 10931;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_UInt16Value = 10932;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_Int32Value = 10933;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_UInt32Value = 10934;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_Int64Value = 10935;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_UInt64Value = 10936;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_FloatValue = 10937;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_DoubleValue = 10938;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_StringValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_StringValue = 10939;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_DateTimeValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_DateTimeValue = 10940;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_GuidValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_GuidValue = 10941;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_ByteStringValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_ByteStringValue = 10942;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_XmlElementValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_XmlElementValue = 10943;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_NodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_NodeIdValue = 10944;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_ExpandedNodeIdValue = 10945;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_QualifiedNameValue = 10946;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_LocalizedTextValue = 10947;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_StatusCodeValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_StatusCodeValue = 10948;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_VariantValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_VariantValue = 10949;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_EnumerationValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_EnumerationValue = 10950;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_StructureValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_StructureValue = 10951;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_NumberValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_NumberValue = 10952;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_IntegerValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_IntegerValue = 10953;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_UIntegerValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_Array_UIntegerValue = 10954;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_SimulationActive = 10956;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_GenerateValues_InputArguments = 10958;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_EventId = 10960;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_EventType = 10961;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_SourceNode = 10962;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_SourceName = 10963;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Time = 10964;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_ReceiveTime = 10965;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Message = 10967;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Severity = 10968;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_ConditionClassId = 11610;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_ConditionClassName = 11611;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_ConditionName = 11573;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_BranchId = 10969;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Retain = 10970;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_EnabledState = 10971;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_EnabledState_Id = 10972;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Quality = 10977;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Quality_SourceTimestamp = 10978;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_LastSeverity = 10981;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_LastSeverity_SourceTimestamp = 10982;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Comment = 10983;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Comment_SourceTimestamp = 10984;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_ClientUserId = 10985;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_AddComment_InputArguments = 10989;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_AckedState = 10992;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_AckedState_Id = 10993;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_ConfirmedState_Id = 11001;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Acknowledge_InputArguments = 11009;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_CycleComplete_Confirm_InputArguments = 11011;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_BooleanValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_BooleanValue = 11012;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_SByteValue = 11013;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_ByteValue = 11014;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_Int16Value = 11015;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_UInt16Value = 11016;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_Int32Value = 11017;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_UInt32Value = 11018;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_Int64Value = 11019;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_UInt64Value = 11020;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_FloatValue = 11021;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_DoubleValue = 11022;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_StringValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_StringValue = 11023;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_DateTimeValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_DateTimeValue = 11024;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_GuidValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_GuidValue = 11025;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_ByteStringValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_ByteStringValue = 11026;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_XmlElementValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_XmlElementValue = 11027;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_NodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_NodeIdValue = 11028;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_ExpandedNodeIdValue = 11029;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_QualifiedNameValue = 11030;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_LocalizedTextValue = 11031;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_StatusCodeValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_StatusCodeValue = 11032;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_VariantValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserScalar_VariantValue = 11033;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_SimulationActive = 11035;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_GenerateValues_InputArguments = 11037;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_EventId = 11039;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_EventType = 11040;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_SourceNode = 11041;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_SourceName = 11042;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Time = 11043;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_ReceiveTime = 11044;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Message = 11046;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Severity = 11047;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_ConditionClassId = 11612;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_ConditionClassName = 11613;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_ConditionName = 11574;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_BranchId = 11048;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Retain = 11049;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_EnabledState = 11050;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_EnabledState_Id = 11051;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Quality = 11056;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Quality_SourceTimestamp = 11057;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_LastSeverity = 11060;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_LastSeverity_SourceTimestamp = 11061;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Comment = 11062;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Comment_SourceTimestamp = 11063;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_ClientUserId = 11064;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_AddComment_InputArguments = 11068;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_AckedState = 11071;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_AckedState_Id = 11072;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_ConfirmedState_Id = 11080;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Acknowledge_InputArguments = 11088;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_CycleComplete_Confirm_InputArguments = 11090;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_BooleanValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_BooleanValue = 11091;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_SByteValue = 11092;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_ByteValue = 11093;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_Int16Value = 11094;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_UInt16Value = 11095;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_Int32Value = 11096;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_UInt32Value = 11097;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_Int64Value = 11098;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_UInt64Value = 11099;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_FloatValue = 11100;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_DoubleValue = 11101;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_StringValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_StringValue = 11102;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_DateTimeValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_DateTimeValue = 11103;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_GuidValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_GuidValue = 11104;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_ByteStringValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_ByteStringValue = 11105;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_XmlElementValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_XmlElementValue = 11106;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_NodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_NodeIdValue = 11107;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_ExpandedNodeIdValue = 11108;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_QualifiedNameValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_QualifiedNameValue = 11109;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_LocalizedTextValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_LocalizedTextValue = 11110;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_StatusCodeValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_StatusCodeValue = 11111;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_VariantValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_UserArray_VariantValue = 11112;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_SimulationActive = 11114;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_GenerateValues_InputArguments = 11116;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_EventId = 11118;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_EventType = 11119;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_SourceNode = 11120;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_SourceName = 11121;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Time = 11122;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_ReceiveTime = 11123;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Message = 11125;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Severity = 11126;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassId = 11614;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassName = 11615;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_ConditionName = 11575;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_BranchId = 11127;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Retain = 11128;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_EnabledState = 11129;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_EnabledState_Id = 11130;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Quality = 11135;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Quality_SourceTimestamp = 11136;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity = 11139;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp = 11140;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Comment = 11141;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Comment_SourceTimestamp = 11142;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_ClientUserId = 11143;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_AddComment_InputArguments = 11147;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_AckedState = 11150;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_AckedState_Id = 11151;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_Id = 11159;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge_InputArguments = 11167;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_CycleComplete_Confirm_InputArguments = 11169;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_SByteValue = 11170;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_SByteValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_SByteValue_EURange = 11173;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_ByteValue = 11176;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_ByteValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_ByteValue_EURange = 11179;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_Int16Value = 11182;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int16Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_Int16Value_EURange = 11185;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_UInt16Value = 11188;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt16Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_UInt16Value_EURange = 11191;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_Int32Value = 11194;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int32Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_Int32Value_EURange = 11197;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_UInt32Value = 11200;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt32Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_UInt32Value_EURange = 11203;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_Int64Value = 11206;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int64Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_Int64Value_EURange = 11209;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_UInt64Value = 11212;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt64Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_UInt64Value_EURange = 11215;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_FloatValue = 11218;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_FloatValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_FloatValue_EURange = 11221;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_DoubleValue = 11224;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_DoubleValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_DoubleValue_EURange = 11227;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_NumberValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_NumberValue = 11230;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_NumberValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_NumberValue_EURange = 11233;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_IntegerValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_IntegerValue = 11236;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_IntegerValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_IntegerValue_EURange = 11239;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UIntegerValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_UIntegerValue = 11242;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UIntegerValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogScalar_UIntegerValue_EURange = 11245;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_SimulationActive Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_SimulationActive = 11249;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_GenerateValues_InputArguments = 11251;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_EventId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_EventId = 11253;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_EventType Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_EventType = 11254;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_SourceNode = 11255;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_SourceName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_SourceName = 11256;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Time Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Time = 11257;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_ReceiveTime = 11258;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Message Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Message = 11260;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Severity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Severity = 11261;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_ConditionClassId = 11616;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_ConditionClassName = 11617;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_ConditionName = 11576;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_BranchId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_BranchId = 11262;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Retain Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Retain = 11263;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_EnabledState = 11264;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_EnabledState_Id = 11265;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Quality Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Quality = 11270;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Quality_SourceTimestamp = 11271;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_LastSeverity = 11274;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp = 11275;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Comment Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Comment = 11276;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Comment_SourceTimestamp = 11277;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_ClientUserId = 11278;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_AddComment_InputArguments = 11282;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_AckedState Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_AckedState = 11285;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_AckedState_Id = 11286;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_ConfirmedState_Id = 11294;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Acknowledge_InputArguments = 11302;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_CycleComplete_Confirm_InputArguments = 11304;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_SByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_SByteValue = 11305;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_SByteValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_SByteValue_EURange = 11308;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_ByteValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_ByteValue = 11311;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_ByteValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_ByteValue_EURange = 11314;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_Int16Value = 11317;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int16Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_Int16Value_EURange = 11320;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt16Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_UInt16Value = 11323;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt16Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_UInt16Value_EURange = 11326;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_Int32Value = 11329;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int32Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_Int32Value_EURange = 11332;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt32Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_UInt32Value = 11335;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt32Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_UInt32Value_EURange = 11338;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_Int64Value = 11341;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int64Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_Int64Value_EURange = 11344;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt64Value Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_UInt64Value = 11347;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt64Value_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_UInt64Value_EURange = 11350;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_FloatValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_FloatValue = 11353;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_FloatValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_FloatValue_EURange = 11356;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_DoubleValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_DoubleValue = 11359;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_DoubleValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_DoubleValue_EURange = 11362;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_NumberValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_NumberValue = 11365;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_NumberValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_NumberValue_EURange = 11368;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_IntegerValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_IntegerValue = 11371;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_IntegerValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_IntegerValue_EURange = 11374;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UIntegerValue Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_UIntegerValue = 11377;\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UIntegerValue_EURange Variable.\n        /// </summary>\n        public const uint Data_Dynamic_AnalogArray_UIntegerValue_EURange = 11380;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_EventId Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_EventId = 11385;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_EventType Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_EventType = 11386;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_SourceNode Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_SourceNode = 11387;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_SourceName Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_SourceName = 11388;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Time Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Time = 11389;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ReceiveTime Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_ReceiveTime = 11390;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Message Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Message = 11392;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Severity Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Severity = 11393;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ConditionClassId Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_ConditionClassId = 11618;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ConditionClassName Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_ConditionClassName = 11619;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ConditionName Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_ConditionName = 11577;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_BranchId Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_BranchId = 11394;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Retain Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Retain = 11395;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_EnabledState Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_EnabledState = 11396;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_EnabledState_Id Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_EnabledState_Id = 11397;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Quality Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Quality = 11402;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Quality_SourceTimestamp = 11403;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_LastSeverity Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_LastSeverity = 11406;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_LastSeverity_SourceTimestamp = 11407;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Comment Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Comment = 11408;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_Comment_SourceTimestamp = 11409;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ClientUserId Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_ClientUserId = 11410;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_AddComment_InputArguments Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_AddComment_InputArguments = 11414;\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_MonitoredNodeCount Variable.\n        /// </summary>\n        public const uint Data_Conditions_SystemStatus_MonitoredNodeCount = 11417;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema = 11422;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_NamespaceUri = 11424;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_Deprecated = 15045;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_ScalarValueDataType Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_ScalarValueDataType = 11425;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_ArrayValueDataType Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_ArrayValueDataType = 11428;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_UserScalarValueDataType Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_UserScalarValueDataType = 11431;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_UserArrayValueDataType Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_UserArrayValueDataType = 11434;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_Vector Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_Vector = 1015;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_WorkOrderStatusType Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_WorkOrderStatusType = 24;\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_WorkOrderType Variable.\n        /// </summary>\n        public const uint TestData_BinarySchema_WorkOrderType = 27;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema = 11441;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_NamespaceUri = 11443;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_Deprecated = 15046;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_ScalarValueDataType Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_ScalarValueDataType = 11444;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_ArrayValueDataType Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_ArrayValueDataType = 11447;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_UserScalarValueDataType Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_UserScalarValueDataType = 11450;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_UserArrayValueDataType Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_UserArrayValueDataType = 11453;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_Vector Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_Vector = 43;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_WorkOrderStatusType Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_WorkOrderStatusType = 52;\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_WorkOrderType Variable.\n        /// </summary>\n        public const uint TestData_XmlSchema_WorkOrderType = 55;\n    }\n    #endregion\n\n    #region DataType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypeIds\n    {\n        /// <summary>\n        /// The identifier for the ScalarValueDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueDataType = new ExpandedNodeId(TestData.DataTypes.ScalarValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueDataType = new ExpandedNodeId(TestData.DataTypes.ArrayValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the BooleanDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId BooleanDataType = new ExpandedNodeId(TestData.DataTypes.BooleanDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the SByteDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId SByteDataType = new ExpandedNodeId(TestData.DataTypes.SByteDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ByteDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId ByteDataType = new ExpandedNodeId(TestData.DataTypes.ByteDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Int16DataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId Int16DataType = new ExpandedNodeId(TestData.DataTypes.Int16DataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UInt16DataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId UInt16DataType = new ExpandedNodeId(TestData.DataTypes.UInt16DataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Int32DataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId Int32DataType = new ExpandedNodeId(TestData.DataTypes.Int32DataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UInt32DataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId UInt32DataType = new ExpandedNodeId(TestData.DataTypes.UInt32DataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Int64DataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId Int64DataType = new ExpandedNodeId(TestData.DataTypes.Int64DataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UInt64DataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId UInt64DataType = new ExpandedNodeId(TestData.DataTypes.UInt64DataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the FloatDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId FloatDataType = new ExpandedNodeId(TestData.DataTypes.FloatDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the DoubleDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId DoubleDataType = new ExpandedNodeId(TestData.DataTypes.DoubleDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the StringDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId StringDataType = new ExpandedNodeId(TestData.DataTypes.StringDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the DateTimeDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId DateTimeDataType = new ExpandedNodeId(TestData.DataTypes.DateTimeDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the GuidDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId GuidDataType = new ExpandedNodeId(TestData.DataTypes.GuidDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ByteStringDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId ByteStringDataType = new ExpandedNodeId(TestData.DataTypes.ByteStringDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the XmlElementDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId XmlElementDataType = new ExpandedNodeId(TestData.DataTypes.XmlElementDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the NodeIdDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId NodeIdDataType = new ExpandedNodeId(TestData.DataTypes.NodeIdDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ExpandedNodeIdDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId ExpandedNodeIdDataType = new ExpandedNodeId(TestData.DataTypes.ExpandedNodeIdDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the QualifiedNameDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId QualifiedNameDataType = new ExpandedNodeId(TestData.DataTypes.QualifiedNameDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the LocalizedTextDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId LocalizedTextDataType = new ExpandedNodeId(TestData.DataTypes.LocalizedTextDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the StatusCodeDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId StatusCodeDataType = new ExpandedNodeId(TestData.DataTypes.StatusCodeDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the VariantDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId VariantDataType = new ExpandedNodeId(TestData.DataTypes.VariantDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueDataType = new ExpandedNodeId(TestData.DataTypes.UserScalarValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueDataType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueDataType = new ExpandedNodeId(TestData.DataTypes.UserArrayValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Vector DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId Vector = new ExpandedNodeId(TestData.DataTypes.Vector, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the WorkOrderStatusType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId WorkOrderStatusType = new ExpandedNodeId(TestData.DataTypes.WorkOrderStatusType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the WorkOrderType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId WorkOrderType = new ExpandedNodeId(TestData.DataTypes.WorkOrderType, TestData.Namespaces.TestData);\n    }\n    #endregion\n\n    #region Method Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Methods in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class MethodIds\n    {\n        /// <summary>\n        /// The identifier for the TestDataObjectType_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_GenerateValues = new ExpandedNodeId(TestData.Methods.TestDataObjectType_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.TestDataObjectType_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.TestDataObjectType_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.TestDataObjectType_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.TestDataObjectType_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.ScalarValueObjectType_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.ScalarValueObjectType_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.ScalarValueObjectType_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.ScalarValueObjectType_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.AnalogScalarValueObjectType_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.AnalogScalarValueObjectType_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.AnalogScalarValueObjectType_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.AnalogScalarValueObjectType_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.ArrayValueObjectType_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.ArrayValueObjectType_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.ArrayValueObjectType_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.ArrayValueObjectType_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.AnalogArrayValueObjectType_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.AnalogArrayValueObjectType_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.AnalogArrayValueObjectType_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.AnalogArrayValueObjectType_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.UserScalarValueObjectType_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.UserScalarValueObjectType_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.UserScalarValueObjectType_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.UserScalarValueObjectType_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.UserArrayValueObjectType_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.UserArrayValueObjectType_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.UserArrayValueObjectType_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.UserArrayValueObjectType_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod1 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod1 = new ExpandedNodeId(TestData.Methods.MethodTestType_ScalarMethod1, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod2 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod2 = new ExpandedNodeId(TestData.Methods.MethodTestType_ScalarMethod2, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod3 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod3 = new ExpandedNodeId(TestData.Methods.MethodTestType_ScalarMethod3, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod1 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod1 = new ExpandedNodeId(TestData.Methods.MethodTestType_ArrayMethod1, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod2 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod2 = new ExpandedNodeId(TestData.Methods.MethodTestType_ArrayMethod2, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod3 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod3 = new ExpandedNodeId(TestData.Methods.MethodTestType_ArrayMethod3, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod1 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserScalarMethod1 = new ExpandedNodeId(TestData.Methods.MethodTestType_UserScalarMethod1, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod2 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserScalarMethod2 = new ExpandedNodeId(TestData.Methods.MethodTestType_UserScalarMethod2, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod1 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserArrayMethod1 = new ExpandedNodeId(TestData.Methods.MethodTestType_UserArrayMethod1, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod2 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserArrayMethod2 = new ExpandedNodeId(TestData.Methods.MethodTestType_UserArrayMethod2, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Static_Scalar_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Static_Scalar_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Static_Scalar_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Static_Scalar_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Static_Scalar_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Static_Array_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Static_Array_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Static_Array_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Static_Array_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Static_Array_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Static_UserScalar_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Static_UserScalar_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Static_UserScalar_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Static_UserScalar_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Static_UserScalar_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Static_UserArray_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Static_UserArray_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Static_UserArray_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Static_UserArray_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Static_UserArray_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogScalar_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogScalar_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogScalar_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogScalar_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogScalar_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogArray_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogArray_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogArray_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogArray_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Static_AnalogArray_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod1 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod1 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_ScalarMethod1, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod2 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod2 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_ScalarMethod2, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod3 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod3 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_ScalarMethod3, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod1 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod1 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_ArrayMethod1, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod2 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod2 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_ArrayMethod2, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod3 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod3 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_ArrayMethod3, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod1 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserScalarMethod1 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_UserScalarMethod1, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod2 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserScalarMethod2 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_UserScalarMethod2, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod1 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserArrayMethod1 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_UserArrayMethod1, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod2 Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserArrayMethod2 = new ExpandedNodeId(TestData.Methods.Data_Static_MethodTest_UserArrayMethod2, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Scalar_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Scalar_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Scalar_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Scalar_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Scalar_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Array_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Array_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Array_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Array_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Dynamic_Array_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserScalar_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserScalar_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserScalar_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserScalar_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserScalar_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserArray_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserArray_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserArray_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserArray_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Dynamic_UserArray_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogScalar_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogScalar_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogScalar_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogScalar_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_GenerateValues Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_GenerateValues = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogArray_GenerateValues, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Disable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogArray_CycleComplete_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Enable = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogArray_CycleComplete_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_AddComment = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogArray_CycleComplete_AddComment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Acknowledge Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Acknowledge = new ExpandedNodeId(TestData.Methods.Data_Dynamic_AnalogArray_CycleComplete_Acknowledge, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Disable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Disable = new ExpandedNodeId(TestData.Methods.Data_Conditions_SystemStatus_Disable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Enable Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Enable = new ExpandedNodeId(TestData.Methods.Data_Conditions_SystemStatus_Enable, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_AddComment Method.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_AddComment = new ExpandedNodeId(TestData.Methods.Data_Conditions_SystemStatus_AddComment, TestData.Namespaces.TestData);\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete = new ExpandedNodeId(TestData.Objects.TestDataObjectType_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data = new ExpandedNodeId(TestData.Objects.Data, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static = new ExpandedNodeId(TestData.Objects.Data_Static, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar = new ExpandedNodeId(TestData.Objects.Data_Static_Scalar, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Static_Scalar_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array = new ExpandedNodeId(TestData.Objects.Data_Static_Array, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Static_Array_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar = new ExpandedNodeId(TestData.Objects.Data_Static_UserScalar, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Static_UserScalar_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray = new ExpandedNodeId(TestData.Objects.Data_Static_UserArray, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Static_UserArray_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar = new ExpandedNodeId(TestData.Objects.Data_Static_AnalogScalar, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Static_AnalogScalar_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray = new ExpandedNodeId(TestData.Objects.Data_Static_AnalogArray, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Static_AnalogArray_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest = new ExpandedNodeId(TestData.Objects.Data_Static_MethodTest, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic = new ExpandedNodeId(TestData.Objects.Data_Dynamic, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar = new ExpandedNodeId(TestData.Objects.Data_Dynamic_Scalar, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Dynamic_Scalar_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array = new ExpandedNodeId(TestData.Objects.Data_Dynamic_Array, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Dynamic_Array_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar = new ExpandedNodeId(TestData.Objects.Data_Dynamic_UserScalar, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Dynamic_UserScalar_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray = new ExpandedNodeId(TestData.Objects.Data_Dynamic_UserArray, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Dynamic_UserArray_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar = new ExpandedNodeId(TestData.Objects.Data_Dynamic_AnalogScalar, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Dynamic_AnalogScalar_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray = new ExpandedNodeId(TestData.Objects.Data_Dynamic_AnalogArray, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete = new ExpandedNodeId(TestData.Objects.Data_Dynamic_AnalogArray_CycleComplete, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions = new ExpandedNodeId(TestData.Objects.Data_Conditions, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus = new ExpandedNodeId(TestData.Objects.Data_Conditions_SystemStatus, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueDataType_Encoding_DefaultBinary = new ExpandedNodeId(TestData.Objects.ScalarValueDataType_Encoding_DefaultBinary, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueDataType_Encoding_DefaultBinary = new ExpandedNodeId(TestData.Objects.ArrayValueDataType_Encoding_DefaultBinary, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueDataType_Encoding_DefaultBinary = new ExpandedNodeId(TestData.Objects.UserScalarValueDataType_Encoding_DefaultBinary, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueDataType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueDataType_Encoding_DefaultBinary = new ExpandedNodeId(TestData.Objects.UserArrayValueDataType_Encoding_DefaultBinary, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Vector_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Vector_Encoding_DefaultBinary = new ExpandedNodeId(TestData.Objects.Vector_Encoding_DefaultBinary, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the WorkOrderStatusType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId WorkOrderStatusType_Encoding_DefaultBinary = new ExpandedNodeId(TestData.Objects.WorkOrderStatusType_Encoding_DefaultBinary, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the WorkOrderType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId WorkOrderType_Encoding_DefaultBinary = new ExpandedNodeId(TestData.Objects.WorkOrderType_Encoding_DefaultBinary, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueDataType_Encoding_DefaultXml = new ExpandedNodeId(TestData.Objects.ScalarValueDataType_Encoding_DefaultXml, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueDataType_Encoding_DefaultXml = new ExpandedNodeId(TestData.Objects.ArrayValueDataType_Encoding_DefaultXml, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueDataType_Encoding_DefaultXml = new ExpandedNodeId(TestData.Objects.UserScalarValueDataType_Encoding_DefaultXml, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueDataType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueDataType_Encoding_DefaultXml = new ExpandedNodeId(TestData.Objects.UserArrayValueDataType_Encoding_DefaultXml, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Vector_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Vector_Encoding_DefaultXml = new ExpandedNodeId(TestData.Objects.Vector_Encoding_DefaultXml, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the WorkOrderStatusType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId WorkOrderStatusType_Encoding_DefaultXml = new ExpandedNodeId(TestData.Objects.WorkOrderStatusType_Encoding_DefaultXml, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the WorkOrderType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId WorkOrderType_Encoding_DefaultXml = new ExpandedNodeId(TestData.Objects.WorkOrderType_Encoding_DefaultXml, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueDataType_Encoding_DefaultJson = new ExpandedNodeId(TestData.Objects.ScalarValueDataType_Encoding_DefaultJson, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueDataType_Encoding_DefaultJson = new ExpandedNodeId(TestData.Objects.ArrayValueDataType_Encoding_DefaultJson, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueDataType_Encoding_DefaultJson = new ExpandedNodeId(TestData.Objects.UserScalarValueDataType_Encoding_DefaultJson, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueDataType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueDataType_Encoding_DefaultJson = new ExpandedNodeId(TestData.Objects.UserArrayValueDataType_Encoding_DefaultJson, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Vector_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Vector_Encoding_DefaultJson = new ExpandedNodeId(TestData.Objects.Vector_Encoding_DefaultJson, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the WorkOrderStatusType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId WorkOrderStatusType_Encoding_DefaultJson = new ExpandedNodeId(TestData.Objects.WorkOrderStatusType_Encoding_DefaultJson, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the WorkOrderType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId WorkOrderType_Encoding_DefaultJson = new ExpandedNodeId(TestData.Objects.WorkOrderType_Encoding_DefaultJson, TestData.Namespaces.TestData);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <summary>\n        /// The identifier for the GenerateValuesEventType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId GenerateValuesEventType = new ExpandedNodeId(TestData.ObjectTypes.GenerateValuesEventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType = new ExpandedNodeId(TestData.ObjectTypes.TestDataObjectType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType = new ExpandedNodeId(TestData.ObjectTypes.ScalarValueObjectType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType = new ExpandedNodeId(TestData.ObjectTypes.AnalogScalarValueObjectType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType = new ExpandedNodeId(TestData.ObjectTypes.ArrayValueObjectType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType = new ExpandedNodeId(TestData.ObjectTypes.AnalogArrayValueObjectType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType = new ExpandedNodeId(TestData.ObjectTypes.UserScalarValueObjectType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType = new ExpandedNodeId(TestData.ObjectTypes.UserArrayValueObjectType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType = new ExpandedNodeId(TestData.ObjectTypes.MethodTestType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType = new ExpandedNodeId(TestData.ObjectTypes.TestSystemConditionType, TestData.Namespaces.TestData);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the GenerateValuesEventType_Iterations Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenerateValuesEventType_Iterations = new ExpandedNodeId(TestData.Variables.GenerateValuesEventType_Iterations, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the GenerateValuesEventType_NewValueCount Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenerateValuesEventType_NewValueCount = new ExpandedNodeId(TestData.Variables.GenerateValuesEventType_NewValueCount, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_SimulationActive = new ExpandedNodeId(TestData.Variables.TestDataObjectType_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.TestDataObjectType_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestDataObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestDataObjectType_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.TestDataObjectType_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_BooleanValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_SByteValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_ByteValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_Int16Value = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_UInt16Value = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_Int32Value = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_UInt32Value = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_Int64Value = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_UInt64Value = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_FloatValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_DoubleValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_StringValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_DateTimeValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_GuidValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_ByteStringValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_XmlElementValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_NodeIdValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_StatusCodeValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_VariantValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_EnumerationValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_EnumerationValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_EnumerationValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_StructureValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_StructureValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_StructureValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_NumberValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_IntegerValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ScalarValueObjectType_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ScalarValueObjectType_UIntegerValue = new ExpandedNodeId(TestData.Variables.ScalarValueObjectType_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_SByteValue = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_SByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_SByteValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_SByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_ByteValue = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_ByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_ByteValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_ByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_Int16Value = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_Int16Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_Int16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_UInt16Value = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_UInt16Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_UInt16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_Int32Value = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_Int32Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_Int32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_UInt32Value = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_UInt32Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_UInt32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_Int64Value = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_Int64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_Int64Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_Int64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_UInt64Value = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UInt64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_UInt64Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_UInt64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_FloatValue = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_FloatValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_FloatValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_FloatValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_DoubleValue = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_DoubleValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_DoubleValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_DoubleValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_NumberValue = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_NumberValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_NumberValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_NumberValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_IntegerValue = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_IntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_IntegerValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_IntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_UIntegerValue = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogScalarValueObjectType_UIntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogScalarValueObjectType_UIntegerValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogScalarValueObjectType_UIntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_BooleanValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_SByteValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_ByteValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_Int16Value = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_UInt16Value = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_Int32Value = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_UInt32Value = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_Int64Value = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_UInt64Value = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_FloatValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_DoubleValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_StringValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_DateTimeValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_GuidValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_ByteStringValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_XmlElementValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_NodeIdValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_StatusCodeValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_VariantValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_EnumerationValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_EnumerationValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_EnumerationValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_StructureValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_StructureValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_StructureValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_NumberValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_IntegerValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the ArrayValueObjectType_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ArrayValueObjectType_UIntegerValue = new ExpandedNodeId(TestData.Variables.ArrayValueObjectType_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_SByteValue = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_SByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_SByteValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_SByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_ByteValue = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_ByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_ByteValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_ByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_Int16Value = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_Int16Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_Int16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_UInt16Value = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_UInt16Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_UInt16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_Int32Value = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_Int32Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_Int32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_UInt32Value = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_UInt32Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_UInt32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_Int64Value = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_Int64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_Int64Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_Int64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_UInt64Value = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UInt64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_UInt64Value_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_UInt64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_FloatValue = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_FloatValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_FloatValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_FloatValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_DoubleValue = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_DoubleValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_DoubleValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_DoubleValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_NumberValue = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_NumberValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_NumberValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_NumberValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_IntegerValue = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_IntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_IntegerValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_IntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_UIntegerValue = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the AnalogArrayValueObjectType_UIntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId AnalogArrayValueObjectType_UIntegerValue_EURange = new ExpandedNodeId(TestData.Variables.AnalogArrayValueObjectType_UIntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_BooleanValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_SByteValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_ByteValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_Int16Value = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_UInt16Value = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_Int32Value = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_UInt32Value = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_Int64Value = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_UInt64Value = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_FloatValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_DoubleValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_StringValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_DateTimeValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_GuidValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_ByteStringValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_XmlElementValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_NodeIdValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_StatusCodeValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserScalarValueObjectType_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserScalarValueObjectType_VariantValue = new ExpandedNodeId(TestData.Variables.UserScalarValueObjectType_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_BooleanValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_SByteValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_ByteValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_Int16Value = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_UInt16Value = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_Int32Value = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_UInt32Value = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_Int64Value = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_UInt64Value = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_FloatValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_DoubleValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_StringValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_DateTimeValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_GuidValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_ByteStringValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_XmlElementValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_NodeIdValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_StatusCodeValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the UserArrayValueObjectType_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId UserArrayValueObjectType_VariantValue = new ExpandedNodeId(TestData.Variables.UserArrayValueObjectType_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod1_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod1_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ScalarMethod1_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod1_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod1_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ScalarMethod1_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod2_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ScalarMethod2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod2_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod2_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ScalarMethod2_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod3_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod3_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ScalarMethod3_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ScalarMethod3_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ScalarMethod3_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ScalarMethod3_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod1_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod1_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ArrayMethod1_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod1_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod1_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ArrayMethod1_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod2_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ArrayMethod2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod2_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod2_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ArrayMethod2_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod3_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod3_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ArrayMethod3_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_ArrayMethod3_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_ArrayMethod3_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_ArrayMethod3_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod1_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserScalarMethod1_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_UserScalarMethod1_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod1_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserScalarMethod1_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_UserScalarMethod1_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserScalarMethod2_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_UserScalarMethod2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserScalarMethod2_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserScalarMethod2_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_UserScalarMethod2_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod1_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserArrayMethod1_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_UserArrayMethod1_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod1_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserArrayMethod1_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_UserArrayMethod1_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserArrayMethod2_InputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_UserArrayMethod2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the MethodTestType_UserArrayMethod2_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId MethodTestType_UserArrayMethod2_OutputArguments = new ExpandedNodeId(TestData.Variables.MethodTestType_UserArrayMethod2_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType_EnabledState_Id = new ExpandedNodeId(TestData.Variables.TestSystemConditionType_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.TestSystemConditionType_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.TestSystemConditionType_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.TestSystemConditionType_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.TestSystemConditionType_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_ConditionRefresh_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType_ConditionRefresh_InputArguments = new ExpandedNodeId(TestData.Variables.TestSystemConditionType_ConditionRefresh_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_ConditionRefresh2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType_ConditionRefresh2_InputArguments = new ExpandedNodeId(TestData.Variables.TestSystemConditionType_ConditionRefresh2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestSystemConditionType_MonitoredNodeCount Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestSystemConditionType_MonitoredNodeCount = new ExpandedNodeId(TestData.Variables.TestSystemConditionType_MonitoredNodeCount, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_BooleanValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_StringValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_DateTimeValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_GuidValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_ByteStringValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_XmlElementValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_NodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_StatusCodeValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_VariantValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_EnumerationValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_EnumerationValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_EnumerationValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_StructureValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_StructureValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_StructureValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_NumberValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_IntegerValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Scalar_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Scalar_UIntegerValue = new ExpandedNodeId(TestData.Variables.Data_Static_Scalar_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Static_Array_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_Array_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_Array_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_BooleanValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Static_Array_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Static_Array_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Static_Array_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Static_Array_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Static_Array_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Static_Array_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_StringValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_DateTimeValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_GuidValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_ByteStringValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_XmlElementValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_NodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_StatusCodeValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_VariantValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_EnumerationValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_EnumerationValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_EnumerationValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_StructureValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_StructureValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_StructureValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_NumberValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_IntegerValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_Array_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_Array_UIntegerValue = new ExpandedNodeId(TestData.Variables.Data_Static_Array_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_BooleanValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_StringValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_DateTimeValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_GuidValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_ByteStringValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_XmlElementValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_NodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_StatusCodeValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserScalar_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserScalar_VariantValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserScalar_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_BooleanValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_StringValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_DateTimeValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_GuidValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_ByteStringValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_XmlElementValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_NodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_StatusCodeValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_UserArray_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_UserArray_VariantValue = new ExpandedNodeId(TestData.Variables.Data_Static_UserArray_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_SByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_SByteValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_SByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_ByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_ByteValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_ByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_Int16Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_Int16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_UInt16Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_UInt16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_Int32Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_Int32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_UInt32Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_UInt32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_Int64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_Int64Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_Int64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UInt64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_UInt64Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_UInt64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_FloatValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_FloatValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_FloatValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_DoubleValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_DoubleValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_DoubleValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_NumberValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_NumberValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_NumberValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_NumberValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_IntegerValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_IntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_IntegerValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_IntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_UIntegerValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogScalar_UIntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogScalar_UIntegerValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogScalar_UIntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_SByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_SByteValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_SByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_ByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_ByteValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_ByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_Int16Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_Int16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_UInt16Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_UInt16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_Int32Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_Int32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_UInt32Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_UInt32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_Int64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_Int64Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_Int64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UInt64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_UInt64Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_UInt64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_FloatValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_FloatValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_FloatValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_DoubleValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_DoubleValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_DoubleValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_NumberValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_NumberValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_NumberValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_NumberValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_IntegerValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_IntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_IntegerValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_IntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_UIntegerValue = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_AnalogArray_UIntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_AnalogArray_UIntegerValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Static_AnalogArray_UIntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod1_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod1_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ScalarMethod1_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod1_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod1_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ScalarMethod1_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod2_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ScalarMethod2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod2_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod2_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ScalarMethod2_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod3_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod3_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ScalarMethod3_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ScalarMethod3_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ScalarMethod3_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ScalarMethod3_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod1_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod1_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ArrayMethod1_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod1_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod1_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ArrayMethod1_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod2_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ArrayMethod2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod2_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod2_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ArrayMethod2_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod3_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod3_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ArrayMethod3_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_ArrayMethod3_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_ArrayMethod3_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_ArrayMethod3_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod1_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserScalarMethod1_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_UserScalarMethod1_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod1_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserScalarMethod1_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_UserScalarMethod1_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserScalarMethod2_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_UserScalarMethod2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserScalarMethod2_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserScalarMethod2_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_UserScalarMethod2_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod1_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserArrayMethod1_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_UserArrayMethod1_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod1_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserArrayMethod1_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_UserArrayMethod1_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod2_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserArrayMethod2_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_UserArrayMethod2_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Static_MethodTest_UserArrayMethod2_OutputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Static_MethodTest_UserArrayMethod2_OutputArguments = new ExpandedNodeId(TestData.Variables.Data_Static_MethodTest_UserArrayMethod2_OutputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_BooleanValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_StringValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_DateTimeValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_GuidValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_ByteStringValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_XmlElementValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_NodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_StatusCodeValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_VariantValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_EnumerationValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_EnumerationValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_EnumerationValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_StructureValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_StructureValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_StructureValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_NumberValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_IntegerValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Scalar_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Scalar_UIntegerValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Scalar_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_BooleanValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_StringValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_DateTimeValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_GuidValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_ByteStringValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_XmlElementValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_NodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_StatusCodeValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_VariantValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_EnumerationValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_EnumerationValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_EnumerationValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_StructureValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_StructureValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_StructureValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_NumberValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_IntegerValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_Array_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_Array_UIntegerValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_Array_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_BooleanValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_StringValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_DateTimeValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_GuidValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_ByteStringValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_XmlElementValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_NodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_StatusCodeValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserScalar_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserScalar_VariantValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserScalar_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_BooleanValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_BooleanValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_BooleanValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_StringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_StringValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_StringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_DateTimeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_DateTimeValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_DateTimeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_GuidValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_GuidValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_GuidValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_ByteStringValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_ByteStringValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_ByteStringValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_XmlElementValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_XmlElementValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_XmlElementValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_NodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_NodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_NodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_ExpandedNodeIdValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_ExpandedNodeIdValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_ExpandedNodeIdValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_QualifiedNameValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_QualifiedNameValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_QualifiedNameValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_LocalizedTextValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_LocalizedTextValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_LocalizedTextValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_StatusCodeValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_StatusCodeValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_StatusCodeValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_UserArray_VariantValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_UserArray_VariantValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_UserArray_VariantValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_SByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_SByteValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_SByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_ByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_ByteValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_ByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_Int16Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_Int16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_UInt16Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_UInt16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_Int32Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_Int32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_UInt32Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_UInt32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_Int64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_Int64Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_Int64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UInt64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_UInt64Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_UInt64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_FloatValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_FloatValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_FloatValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_DoubleValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_DoubleValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_DoubleValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_NumberValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_NumberValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_NumberValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_NumberValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_IntegerValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_IntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_IntegerValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_IntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_UIntegerValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogScalar_UIntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogScalar_UIntegerValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogScalar_UIntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_SimulationActive Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_SimulationActive = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_SimulationActive, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_GenerateValues_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_GenerateValues_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_GenerateValues_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_EventId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_EventType = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_SourceName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Time = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Message = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Severity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_BranchId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Retain = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Quality = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Comment = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_AckedState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_AckedState = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_AckedState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_AckedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_AckedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_AckedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_ConfirmedState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_ConfirmedState_Id = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_ConfirmedState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Acknowledge_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Acknowledge_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Acknowledge_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_CycleComplete_Confirm_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_CycleComplete_Confirm_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_CycleComplete_Confirm_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_SByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_SByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_SByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_SByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_SByteValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_SByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_ByteValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_ByteValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_ByteValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_ByteValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_ByteValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_ByteValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_Int16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_Int16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_Int16Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_Int16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt16Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_UInt16Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_UInt16Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt16Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_UInt16Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_UInt16Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_Int32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_Int32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_Int32Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_Int32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt32Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_UInt32Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_UInt32Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt32Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_UInt32Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_UInt32Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_Int64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_Int64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_Int64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_Int64Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_Int64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt64Value Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_UInt64Value = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_UInt64Value, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UInt64Value_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_UInt64Value_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_UInt64Value_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_FloatValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_FloatValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_FloatValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_FloatValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_FloatValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_FloatValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_DoubleValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_DoubleValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_DoubleValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_DoubleValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_DoubleValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_DoubleValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_NumberValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_NumberValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_NumberValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_NumberValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_NumberValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_NumberValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_IntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_IntegerValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_IntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_IntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_IntegerValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_IntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UIntegerValue Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_UIntegerValue = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_UIntegerValue, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Dynamic_AnalogArray_UIntegerValue_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Dynamic_AnalogArray_UIntegerValue_EURange = new ExpandedNodeId(TestData.Variables.Data_Dynamic_AnalogArray_UIntegerValue_EURange, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_EventId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_EventId = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_EventId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_EventType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_EventType = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_EventType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_SourceNode Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_SourceNode = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_SourceNode, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_SourceName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_SourceName = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_SourceName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Time Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Time = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_Time, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ReceiveTime Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_ReceiveTime = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_ReceiveTime, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Message Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Message = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_Message, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Severity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Severity = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_Severity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ConditionClassId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_ConditionClassId = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_ConditionClassId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ConditionClassName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_ConditionClassName = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_ConditionClassName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ConditionName Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_ConditionName = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_ConditionName, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_BranchId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_BranchId = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_BranchId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Retain Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Retain = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_Retain, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_EnabledState Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_EnabledState = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_EnabledState, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_EnabledState_Id Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_EnabledState_Id = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_EnabledState_Id, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Quality Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Quality = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_Quality, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Quality_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Quality_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_Quality_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_LastSeverity Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_LastSeverity = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_LastSeverity, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_LastSeverity_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_LastSeverity_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_LastSeverity_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Comment Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Comment = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_Comment, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_Comment_SourceTimestamp Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_Comment_SourceTimestamp = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_Comment_SourceTimestamp, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_ClientUserId Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_ClientUserId = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_ClientUserId, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_AddComment_InputArguments Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_AddComment_InputArguments = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_AddComment_InputArguments, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the Data_Conditions_SystemStatus_MonitoredNodeCount Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Data_Conditions_SystemStatus_MonitoredNodeCount = new ExpandedNodeId(TestData.Variables.Data_Conditions_SystemStatus_MonitoredNodeCount, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_NamespaceUri = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_NamespaceUri, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_Deprecated = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_Deprecated, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_ScalarValueDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_ScalarValueDataType = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_ScalarValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_ArrayValueDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_ArrayValueDataType = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_ArrayValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_UserScalarValueDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_UserScalarValueDataType = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_UserScalarValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_UserArrayValueDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_UserArrayValueDataType = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_UserArrayValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_Vector Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_Vector = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_Vector, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_WorkOrderStatusType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_WorkOrderStatusType = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_WorkOrderStatusType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_BinarySchema_WorkOrderType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_BinarySchema_WorkOrderType = new ExpandedNodeId(TestData.Variables.TestData_BinarySchema_WorkOrderType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_NamespaceUri = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_NamespaceUri, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_Deprecated = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_Deprecated, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_ScalarValueDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_ScalarValueDataType = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_ScalarValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_ArrayValueDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_ArrayValueDataType = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_ArrayValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_UserScalarValueDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_UserScalarValueDataType = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_UserScalarValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_UserArrayValueDataType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_UserArrayValueDataType = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_UserArrayValueDataType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_Vector Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_Vector = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_Vector, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_WorkOrderStatusType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_WorkOrderStatusType = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_WorkOrderStatusType, TestData.Namespaces.TestData);\n\n        /// <summary>\n        /// The identifier for the TestData_XmlSchema_WorkOrderType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId TestData_XmlSchema_WorkOrderType = new ExpandedNodeId(TestData.Variables.TestData_XmlSchema_WorkOrderType, TestData.Namespaces.TestData);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the AnalogArrayValueObjectType component.\n        /// </summary>\n        public const string AnalogArrayValueObjectType = \"AnalogArrayValueObjectType\";\n\n        /// <summary>\n        /// The BrowseName for the AnalogScalarValueObjectType component.\n        /// </summary>\n        public const string AnalogScalarValueObjectType = \"AnalogScalarValueObjectType\";\n\n        /// <summary>\n        /// The BrowseName for the ArrayMethod1 component.\n        /// </summary>\n        public const string ArrayMethod1 = \"ArrayMethod1\";\n\n        /// <summary>\n        /// The BrowseName for the ArrayMethod2 component.\n        /// </summary>\n        public const string ArrayMethod2 = \"ArrayMethod2\";\n\n        /// <summary>\n        /// The BrowseName for the ArrayMethod3 component.\n        /// </summary>\n        public const string ArrayMethod3 = \"ArrayMethod3\";\n\n        /// <summary>\n        /// The BrowseName for the ArrayValueDataType component.\n        /// </summary>\n        public const string ArrayValueDataType = \"ArrayValueDataType\";\n\n        /// <summary>\n        /// The BrowseName for the ArrayValueObjectType component.\n        /// </summary>\n        public const string ArrayValueObjectType = \"ArrayValueObjectType\";\n\n        /// <summary>\n        /// The BrowseName for the BooleanDataType component.\n        /// </summary>\n        public const string BooleanDataType = \"BooleanDataType\";\n\n        /// <summary>\n        /// The BrowseName for the BooleanValue component.\n        /// </summary>\n        public const string BooleanValue = \"BooleanValue\";\n\n        /// <summary>\n        /// The BrowseName for the ByteDataType component.\n        /// </summary>\n        public const string ByteDataType = \"ByteDataType\";\n\n        /// <summary>\n        /// The BrowseName for the ByteStringDataType component.\n        /// </summary>\n        public const string ByteStringDataType = \"ByteStringDataType\";\n\n        /// <summary>\n        /// The BrowseName for the ByteStringValue component.\n        /// </summary>\n        public const string ByteStringValue = \"ByteStringValue\";\n\n        /// <summary>\n        /// The BrowseName for the ByteValue component.\n        /// </summary>\n        public const string ByteValue = \"ByteValue\";\n\n        /// <summary>\n        /// The BrowseName for the Conditions component.\n        /// </summary>\n        public const string Conditions = \"Conditions\";\n\n        /// <summary>\n        /// The BrowseName for the CycleComplete component.\n        /// </summary>\n        public const string CycleComplete = \"CycleComplete\";\n\n        /// <summary>\n        /// The BrowseName for the Data component.\n        /// </summary>\n        public const string Data = \"Data\";\n\n        /// <summary>\n        /// The BrowseName for the DateTimeDataType component.\n        /// </summary>\n        public const string DateTimeDataType = \"DateTimeDataType\";\n\n        /// <summary>\n        /// The BrowseName for the DateTimeValue component.\n        /// </summary>\n        public const string DateTimeValue = \"DateTimeValue\";\n\n        /// <summary>\n        /// The BrowseName for the DoubleDataType component.\n        /// </summary>\n        public const string DoubleDataType = \"DoubleDataType\";\n\n        /// <summary>\n        /// The BrowseName for the DoubleValue component.\n        /// </summary>\n        public const string DoubleValue = \"DoubleValue\";\n\n        /// <summary>\n        /// The BrowseName for the Dynamic component.\n        /// </summary>\n        public const string Dynamic = \"Dynamic\";\n\n        /// <summary>\n        /// The BrowseName for the EnumerationValue component.\n        /// </summary>\n        public const string EnumerationValue = \"EnumerationValue\";\n\n        /// <summary>\n        /// The BrowseName for the ExpandedNodeIdDataType component.\n        /// </summary>\n        public const string ExpandedNodeIdDataType = \"ExpandedNodeIdDataType\";\n\n        /// <summary>\n        /// The BrowseName for the ExpandedNodeIdValue component.\n        /// </summary>\n        public const string ExpandedNodeIdValue = \"ExpandedNodeIdValue\";\n\n        /// <summary>\n        /// The BrowseName for the FloatDataType component.\n        /// </summary>\n        public const string FloatDataType = \"FloatDataType\";\n\n        /// <summary>\n        /// The BrowseName for the FloatValue component.\n        /// </summary>\n        public const string FloatValue = \"FloatValue\";\n\n        /// <summary>\n        /// The BrowseName for the GenerateValues component.\n        /// </summary>\n        public const string GenerateValues = \"GenerateValues\";\n\n        /// <summary>\n        /// The BrowseName for the GenerateValuesEventType component.\n        /// </summary>\n        public const string GenerateValuesEventType = \"GenerateValuesEventType\";\n\n        /// <summary>\n        /// The BrowseName for the GuidDataType component.\n        /// </summary>\n        public const string GuidDataType = \"GuidDataType\";\n\n        /// <summary>\n        /// The BrowseName for the GuidValue component.\n        /// </summary>\n        public const string GuidValue = \"GuidValue\";\n\n        /// <summary>\n        /// The BrowseName for the Int16DataType component.\n        /// </summary>\n        public const string Int16DataType = \"Int16DataType\";\n\n        /// <summary>\n        /// The BrowseName for the Int16Value component.\n        /// </summary>\n        public const string Int16Value = \"Int16Value\";\n\n        /// <summary>\n        /// The BrowseName for the Int32DataType component.\n        /// </summary>\n        public const string Int32DataType = \"Int32DataType\";\n\n        /// <summary>\n        /// The BrowseName for the Int32Value component.\n        /// </summary>\n        public const string Int32Value = \"Int32Value\";\n\n        /// <summary>\n        /// The BrowseName for the Int64DataType component.\n        /// </summary>\n        public const string Int64DataType = \"Int64DataType\";\n\n        /// <summary>\n        /// The BrowseName for the Int64Value component.\n        /// </summary>\n        public const string Int64Value = \"Int64Value\";\n\n        /// <summary>\n        /// The BrowseName for the IntegerValue component.\n        /// </summary>\n        public const string IntegerValue = \"IntegerValue\";\n\n        /// <summary>\n        /// The BrowseName for the Iterations component.\n        /// </summary>\n        public const string Iterations = \"Iterations\";\n\n        /// <summary>\n        /// The BrowseName for the LocalizedTextDataType component.\n        /// </summary>\n        public const string LocalizedTextDataType = \"LocalizedTextDataType\";\n\n        /// <summary>\n        /// The BrowseName for the LocalizedTextValue component.\n        /// </summary>\n        public const string LocalizedTextValue = \"LocalizedTextValue\";\n\n        /// <summary>\n        /// The BrowseName for the MethodTestType component.\n        /// </summary>\n        public const string MethodTestType = \"MethodTestType\";\n\n        /// <summary>\n        /// The BrowseName for the MonitoredNodeCount component.\n        /// </summary>\n        public const string MonitoredNodeCount = \"MonitoredNodeCount\";\n\n        /// <summary>\n        /// The BrowseName for the NewValueCount component.\n        /// </summary>\n        public const string NewValueCount = \"NewValueCount\";\n\n        /// <summary>\n        /// The BrowseName for the NodeIdDataType component.\n        /// </summary>\n        public const string NodeIdDataType = \"NodeIdDataType\";\n\n        /// <summary>\n        /// The BrowseName for the NodeIdValue component.\n        /// </summary>\n        public const string NodeIdValue = \"NodeIdValue\";\n\n        /// <summary>\n        /// The BrowseName for the NumberValue component.\n        /// </summary>\n        public const string NumberValue = \"NumberValue\";\n\n        /// <summary>\n        /// The BrowseName for the QualifiedNameDataType component.\n        /// </summary>\n        public const string QualifiedNameDataType = \"QualifiedNameDataType\";\n\n        /// <summary>\n        /// The BrowseName for the QualifiedNameValue component.\n        /// </summary>\n        public const string QualifiedNameValue = \"QualifiedNameValue\";\n\n        /// <summary>\n        /// The BrowseName for the SByteDataType component.\n        /// </summary>\n        public const string SByteDataType = \"SByteDataType\";\n\n        /// <summary>\n        /// The BrowseName for the SByteValue component.\n        /// </summary>\n        public const string SByteValue = \"SByteValue\";\n\n        /// <summary>\n        /// The BrowseName for the ScalarMethod1 component.\n        /// </summary>\n        public const string ScalarMethod1 = \"ScalarMethod1\";\n\n        /// <summary>\n        /// The BrowseName for the ScalarMethod2 component.\n        /// </summary>\n        public const string ScalarMethod2 = \"ScalarMethod2\";\n\n        /// <summary>\n        /// The BrowseName for the ScalarMethod3 component.\n        /// </summary>\n        public const string ScalarMethod3 = \"ScalarMethod3\";\n\n        /// <summary>\n        /// The BrowseName for the ScalarValueDataType component.\n        /// </summary>\n        public const string ScalarValueDataType = \"ScalarValueDataType\";\n\n        /// <summary>\n        /// The BrowseName for the ScalarValueObjectType component.\n        /// </summary>\n        public const string ScalarValueObjectType = \"ScalarValueObjectType\";\n\n        /// <summary>\n        /// The BrowseName for the SimulationActive component.\n        /// </summary>\n        public const string SimulationActive = \"SimulationActive\";\n\n        /// <summary>\n        /// The BrowseName for the Static component.\n        /// </summary>\n        public const string Static = \"Static\";\n\n        /// <summary>\n        /// The BrowseName for the StatusCodeDataType component.\n        /// </summary>\n        public const string StatusCodeDataType = \"StatusCodeDataType\";\n\n        /// <summary>\n        /// The BrowseName for the StatusCodeValue component.\n        /// </summary>\n        public const string StatusCodeValue = \"StatusCodeValue\";\n\n        /// <summary>\n        /// The BrowseName for the StringDataType component.\n        /// </summary>\n        public const string StringDataType = \"StringDataType\";\n\n        /// <summary>\n        /// The BrowseName for the StringValue component.\n        /// </summary>\n        public const string StringValue = \"StringValue\";\n\n        /// <summary>\n        /// The BrowseName for the StructureValue component.\n        /// </summary>\n        public const string StructureValue = \"StructureValue\";\n\n        /// <summary>\n        /// The BrowseName for the TestData_BinarySchema component.\n        /// </summary>\n        public const string TestData_BinarySchema = \"TestData\";\n\n        /// <summary>\n        /// The BrowseName for the TestData_XmlSchema component.\n        /// </summary>\n        public const string TestData_XmlSchema = \"TestData\";\n\n        /// <summary>\n        /// The BrowseName for the TestDataObjectType component.\n        /// </summary>\n        public const string TestDataObjectType = \"TestDataObjectType\";\n\n        /// <summary>\n        /// The BrowseName for the TestSystemConditionType component.\n        /// </summary>\n        public const string TestSystemConditionType = \"TestSystemConditionType\";\n\n        /// <summary>\n        /// The BrowseName for the UInt16DataType component.\n        /// </summary>\n        public const string UInt16DataType = \"UInt16DataType\";\n\n        /// <summary>\n        /// The BrowseName for the UInt16Value component.\n        /// </summary>\n        public const string UInt16Value = \"UInt16Value\";\n\n        /// <summary>\n        /// The BrowseName for the UInt32DataType component.\n        /// </summary>\n        public const string UInt32DataType = \"UInt32DataType\";\n\n        /// <summary>\n        /// The BrowseName for the UInt32Value component.\n        /// </summary>\n        public const string UInt32Value = \"UInt32Value\";\n\n        /// <summary>\n        /// The BrowseName for the UInt64DataType component.\n        /// </summary>\n        public const string UInt64DataType = \"UInt64DataType\";\n\n        /// <summary>\n        /// The BrowseName for the UInt64Value component.\n        /// </summary>\n        public const string UInt64Value = \"UInt64Value\";\n\n        /// <summary>\n        /// The BrowseName for the UIntegerValue component.\n        /// </summary>\n        public const string UIntegerValue = \"UIntegerValue\";\n\n        /// <summary>\n        /// The BrowseName for the UserArrayMethod1 component.\n        /// </summary>\n        public const string UserArrayMethod1 = \"UserArrayMethod1\";\n\n        /// <summary>\n        /// The BrowseName for the UserArrayMethod2 component.\n        /// </summary>\n        public const string UserArrayMethod2 = \"UserArrayMethod2\";\n\n        /// <summary>\n        /// The BrowseName for the UserArrayValueDataType component.\n        /// </summary>\n        public const string UserArrayValueDataType = \"UserArrayValueDataType\";\n\n        /// <summary>\n        /// The BrowseName for the UserArrayValueObjectType component.\n        /// </summary>\n        public const string UserArrayValueObjectType = \"UserArrayValueObjectType\";\n\n        /// <summary>\n        /// The BrowseName for the UserScalarMethod1 component.\n        /// </summary>\n        public const string UserScalarMethod1 = \"UserScalarMethod1\";\n\n        /// <summary>\n        /// The BrowseName for the UserScalarMethod2 component.\n        /// </summary>\n        public const string UserScalarMethod2 = \"UserScalarMethod2\";\n\n        /// <summary>\n        /// The BrowseName for the UserScalarValueDataType component.\n        /// </summary>\n        public const string UserScalarValueDataType = \"UserScalarValueDataType\";\n\n        /// <summary>\n        /// The BrowseName for the UserScalarValueObjectType component.\n        /// </summary>\n        public const string UserScalarValueObjectType = \"UserScalarValueObjectType\";\n\n        /// <summary>\n        /// The BrowseName for the VariantDataType component.\n        /// </summary>\n        public const string VariantDataType = \"VariantDataType\";\n\n        /// <summary>\n        /// The BrowseName for the VariantValue component.\n        /// </summary>\n        public const string VariantValue = \"VariantValue\";\n\n        /// <summary>\n        /// The BrowseName for the Vector component.\n        /// </summary>\n        public const string Vector = \"Vector\";\n\n        /// <summary>\n        /// The BrowseName for the WorkOrderStatusType component.\n        /// </summary>\n        public const string WorkOrderStatusType = \"WorkOrderStatusType\";\n\n        /// <summary>\n        /// The BrowseName for the WorkOrderType component.\n        /// </summary>\n        public const string WorkOrderType = \"WorkOrderType\";\n\n        /// <summary>\n        /// The BrowseName for the XmlElementDataType component.\n        /// </summary>\n        public const string XmlElementDataType = \"XmlElementDataType\";\n\n        /// <summary>\n        /// The BrowseName for the XmlElementValue component.\n        /// </summary>\n        public const string XmlElementValue = \"XmlElementValue\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the TestData namespace (.NET code namespace is 'TestData').\n        /// </summary>\n        public const string TestData = \"http://test.org/UA/Data/\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.DataTypes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\nusing System.Xml;\n\nnamespace TestData\n{\n    #region ScalarValueDataType Class\n#if (!OPCUA_EXCLUDE_ScalarValueDataType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = TestData.Namespaces.TestData)]\n    public partial class ScalarValueDataType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public ScalarValueDataType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_booleanValue = true;\n            m_sByteValue = (sbyte)0;\n            m_byteValue = (byte)0;\n            m_int16Value = (short)0;\n            m_uInt16Value = (ushort)0;\n            m_int32Value = (int)0;\n            m_uInt32Value = (uint)0;\n            m_int64Value = (long)0;\n            m_uInt64Value = (ulong)0;\n            m_floatValue = (float)0;\n            m_doubleValue = (double)0;\n            m_stringValue = null;\n            m_dateTimeValue = DateTime.MinValue;\n            m_guidValue = Uuid.Empty;\n            m_byteStringValue = null;\n            m_xmlElementValue = null;\n            m_nodeIdValue = null;\n            m_expandedNodeIdValue = null;\n            m_qualifiedNameValue = null;\n            m_localizedTextValue = null;\n            m_statusCodeValue = StatusCodes.Good;\n            m_variantValue = Variant.Null;\n            m_enumerationValue = 0;\n            m_structureValue = null;\n            m_number = (double)0;\n            m_integer = (long)0;\n            m_uInteger = (ulong)0;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        [DataMember(Name = \"BooleanValue\", IsRequired = false, Order = 1)]\n        public bool BooleanValue\n        {\n            get { return m_booleanValue; }\n            set { m_booleanValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"SByteValue\", IsRequired = false, Order = 2)]\n        public sbyte SByteValue\n        {\n            get { return m_sByteValue; }\n            set { m_sByteValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"ByteValue\", IsRequired = false, Order = 3)]\n        public byte ByteValue\n        {\n            get { return m_byteValue; }\n            set { m_byteValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Int16Value\", IsRequired = false, Order = 4)]\n        public short Int16Value\n        {\n            get { return m_int16Value; }\n            set { m_int16Value = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"UInt16Value\", IsRequired = false, Order = 5)]\n        public ushort UInt16Value\n        {\n            get { return m_uInt16Value; }\n            set { m_uInt16Value = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Int32Value\", IsRequired = false, Order = 6)]\n        public int Int32Value\n        {\n            get { return m_int32Value; }\n            set { m_int32Value = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"UInt32Value\", IsRequired = false, Order = 7)]\n        public uint UInt32Value\n        {\n            get { return m_uInt32Value; }\n            set { m_uInt32Value = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Int64Value\", IsRequired = false, Order = 8)]\n        public long Int64Value\n        {\n            get { return m_int64Value; }\n            set { m_int64Value = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"UInt64Value\", IsRequired = false, Order = 9)]\n        public ulong UInt64Value\n        {\n            get { return m_uInt64Value; }\n            set { m_uInt64Value = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"FloatValue\", IsRequired = false, Order = 10)]\n        public float FloatValue\n        {\n            get { return m_floatValue; }\n            set { m_floatValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"DoubleValue\", IsRequired = false, Order = 11)]\n        public double DoubleValue\n        {\n            get { return m_doubleValue; }\n            set { m_doubleValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StringValue\", IsRequired = false, Order = 12)]\n        public string StringValue\n        {\n            get { return m_stringValue; }\n            set { m_stringValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"DateTimeValue\", IsRequired = false, Order = 13)]\n        public DateTime DateTimeValue\n        {\n            get { return m_dateTimeValue; }\n            set { m_dateTimeValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"GuidValue\", IsRequired = false, Order = 14)]\n        public Uuid GuidValue\n        {\n            get { return m_guidValue; }\n            set { m_guidValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"ByteStringValue\", IsRequired = false, Order = 15)]\n        public byte[] ByteStringValue\n        {\n            get { return m_byteStringValue; }\n            set { m_byteStringValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"XmlElementValue\", IsRequired = false, Order = 16)]\n        public XmlElement XmlElementValue\n        {\n            get { return m_xmlElementValue; }\n            set { m_xmlElementValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"NodeIdValue\", IsRequired = false, Order = 17)]\n        public NodeId NodeIdValue\n        {\n            get { return m_nodeIdValue; }\n            set { m_nodeIdValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"ExpandedNodeIdValue\", IsRequired = false, Order = 18)]\n        public ExpandedNodeId ExpandedNodeIdValue\n        {\n            get { return m_expandedNodeIdValue; }\n            set { m_expandedNodeIdValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"QualifiedNameValue\", IsRequired = false, Order = 19)]\n        public QualifiedName QualifiedNameValue\n        {\n            get { return m_qualifiedNameValue; }\n            set { m_qualifiedNameValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"LocalizedTextValue\", IsRequired = false, Order = 20)]\n        public LocalizedText LocalizedTextValue\n        {\n            get { return m_localizedTextValue; }\n            set { m_localizedTextValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StatusCodeValue\", IsRequired = false, Order = 21)]\n        public StatusCode StatusCodeValue\n        {\n            get { return m_statusCodeValue; }\n            set { m_statusCodeValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"VariantValue\", IsRequired = false, Order = 22)]\n        public Variant VariantValue\n        {\n            get { return m_variantValue; }\n            set { m_variantValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"EnumerationValue\", IsRequired = false, Order = 23)]\n        public int EnumerationValue\n        {\n            get { return m_enumerationValue; }\n            set { m_enumerationValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StructureValue\", IsRequired = false, Order = 24)]\n        public ExtensionObject StructureValue\n        {\n            get { return m_structureValue; }\n            set { m_structureValue = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Number\", IsRequired = false, Order = 25)]\n        public Variant Number\n        {\n            get { return m_number; }\n            set { m_number = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Integer\", IsRequired = false, Order = 26)]\n        public Variant Integer\n        {\n            get { return m_integer; }\n            set { m_integer = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"UInteger\", IsRequired = false, Order = 27)]\n        public Variant UInteger\n        {\n            get { return m_uInteger; }\n            set { m_uInteger = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.ScalarValueDataType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.ScalarValueDataType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.ScalarValueDataType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(TestData.Namespaces.TestData);\n\n            encoder.WriteBoolean(\"BooleanValue\", BooleanValue);\n            encoder.WriteSByte(\"SByteValue\", SByteValue);\n            encoder.WriteByte(\"ByteValue\", ByteValue);\n            encoder.WriteInt16(\"Int16Value\", Int16Value);\n            encoder.WriteUInt16(\"UInt16Value\", UInt16Value);\n            encoder.WriteInt32(\"Int32Value\", Int32Value);\n            encoder.WriteUInt32(\"UInt32Value\", UInt32Value);\n            encoder.WriteInt64(\"Int64Value\", Int64Value);\n            encoder.WriteUInt64(\"UInt64Value\", UInt64Value);\n            encoder.WriteFloat(\"FloatValue\", FloatValue);\n            encoder.WriteDouble(\"DoubleValue\", DoubleValue);\n            encoder.WriteString(\"StringValue\", StringValue);\n            encoder.WriteDateTime(\"DateTimeValue\", DateTimeValue);\n            encoder.WriteGuid(\"GuidValue\", GuidValue);\n            encoder.WriteByteString(\"ByteStringValue\", ByteStringValue);\n            encoder.WriteXmlElement(\"XmlElementValue\", XmlElementValue);\n            encoder.WriteNodeId(\"NodeIdValue\", NodeIdValue);\n            encoder.WriteExpandedNodeId(\"ExpandedNodeIdValue\", ExpandedNodeIdValue);\n            encoder.WriteQualifiedName(\"QualifiedNameValue\", QualifiedNameValue);\n            encoder.WriteLocalizedText(\"LocalizedTextValue\", LocalizedTextValue);\n            encoder.WriteStatusCode(\"StatusCodeValue\", StatusCodeValue);\n            encoder.WriteVariant(\"VariantValue\", VariantValue);\n            encoder.WriteInt32(\"EnumerationValue\", EnumerationValue);\n            encoder.WriteExtensionObject(\"StructureValue\", StructureValue);\n            encoder.WriteVariant(\"Number\", Number);\n            encoder.WriteVariant(\"Integer\", Integer);\n            encoder.WriteVariant(\"UInteger\", UInteger);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(TestData.Namespaces.TestData);\n\n            BooleanValue = decoder.ReadBoolean(\"BooleanValue\");\n            SByteValue = decoder.ReadSByte(\"SByteValue\");\n            ByteValue = decoder.ReadByte(\"ByteValue\");\n            Int16Value = decoder.ReadInt16(\"Int16Value\");\n            UInt16Value = decoder.ReadUInt16(\"UInt16Value\");\n            Int32Value = decoder.ReadInt32(\"Int32Value\");\n            UInt32Value = decoder.ReadUInt32(\"UInt32Value\");\n            Int64Value = decoder.ReadInt64(\"Int64Value\");\n            UInt64Value = decoder.ReadUInt64(\"UInt64Value\");\n            FloatValue = decoder.ReadFloat(\"FloatValue\");\n            DoubleValue = decoder.ReadDouble(\"DoubleValue\");\n            StringValue = decoder.ReadString(\"StringValue\");\n            DateTimeValue = decoder.ReadDateTime(\"DateTimeValue\");\n            GuidValue = decoder.ReadGuid(\"GuidValue\");\n            ByteStringValue = decoder.ReadByteString(\"ByteStringValue\");\n            XmlElementValue = decoder.ReadXmlElement(\"XmlElementValue\");\n            NodeIdValue = decoder.ReadNodeId(\"NodeIdValue\");\n            ExpandedNodeIdValue = decoder.ReadExpandedNodeId(\"ExpandedNodeIdValue\");\n            QualifiedNameValue = decoder.ReadQualifiedName(\"QualifiedNameValue\");\n            LocalizedTextValue = decoder.ReadLocalizedText(\"LocalizedTextValue\");\n            StatusCodeValue = decoder.ReadStatusCode(\"StatusCodeValue\");\n            VariantValue = decoder.ReadVariant(\"VariantValue\");\n            EnumerationValue = decoder.ReadInt32(\"EnumerationValue\");\n            StructureValue = decoder.ReadExtensionObject(\"StructureValue\");\n            Number = decoder.ReadVariant(\"Number\");\n            Integer = decoder.ReadVariant(\"Integer\");\n            UInteger = decoder.ReadVariant(\"UInteger\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ScalarValueDataType value = encodeable as ScalarValueDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_booleanValue, value.m_booleanValue)) return false;\n            if (!Utils.IsEqual(m_sByteValue, value.m_sByteValue)) return false;\n            if (!Utils.IsEqual(m_byteValue, value.m_byteValue)) return false;\n            if (!Utils.IsEqual(m_int16Value, value.m_int16Value)) return false;\n            if (!Utils.IsEqual(m_uInt16Value, value.m_uInt16Value)) return false;\n            if (!Utils.IsEqual(m_int32Value, value.m_int32Value)) return false;\n            if (!Utils.IsEqual(m_uInt32Value, value.m_uInt32Value)) return false;\n            if (!Utils.IsEqual(m_int64Value, value.m_int64Value)) return false;\n            if (!Utils.IsEqual(m_uInt64Value, value.m_uInt64Value)) return false;\n            if (!Utils.IsEqual(m_floatValue, value.m_floatValue)) return false;\n            if (!Utils.IsEqual(m_doubleValue, value.m_doubleValue)) return false;\n            if (!Utils.IsEqual(m_stringValue, value.m_stringValue)) return false;\n            if (!Utils.IsEqual(m_dateTimeValue, value.m_dateTimeValue)) return false;\n            if (!Utils.IsEqual(m_guidValue, value.m_guidValue)) return false;\n            if (!Utils.IsEqual(m_byteStringValue, value.m_byteStringValue)) return false;\n            if (!Utils.IsEqual(m_xmlElementValue, value.m_xmlElementValue)) return false;\n            if (!Utils.IsEqual(m_nodeIdValue, value.m_nodeIdValue)) return false;\n            if (!Utils.IsEqual(m_expandedNodeIdValue, value.m_expandedNodeIdValue)) return false;\n            if (!Utils.IsEqual(m_qualifiedNameValue, value.m_qualifiedNameValue)) return false;\n            if (!Utils.IsEqual(m_localizedTextValue, value.m_localizedTextValue)) return false;\n            if (!Utils.IsEqual(m_statusCodeValue, value.m_statusCodeValue)) return false;\n            if (!Utils.IsEqual(m_variantValue, value.m_variantValue)) return false;\n            if (!Utils.IsEqual(m_enumerationValue, value.m_enumerationValue)) return false;\n            if (!Utils.IsEqual(m_structureValue, value.m_structureValue)) return false;\n            if (!Utils.IsEqual(m_number, value.m_number)) return false;\n            if (!Utils.IsEqual(m_integer, value.m_integer)) return false;\n            if (!Utils.IsEqual(m_uInteger, value.m_uInteger)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ScalarValueDataType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ScalarValueDataType clone = (ScalarValueDataType)base.MemberwiseClone();\n\n            clone.m_booleanValue = (bool)Utils.Clone(this.m_booleanValue);\n            clone.m_sByteValue = (sbyte)Utils.Clone(this.m_sByteValue);\n            clone.m_byteValue = (byte)Utils.Clone(this.m_byteValue);\n            clone.m_int16Value = (short)Utils.Clone(this.m_int16Value);\n            clone.m_uInt16Value = (ushort)Utils.Clone(this.m_uInt16Value);\n            clone.m_int32Value = (int)Utils.Clone(this.m_int32Value);\n            clone.m_uInt32Value = (uint)Utils.Clone(this.m_uInt32Value);\n            clone.m_int64Value = (long)Utils.Clone(this.m_int64Value);\n            clone.m_uInt64Value = (ulong)Utils.Clone(this.m_uInt64Value);\n            clone.m_floatValue = (float)Utils.Clone(this.m_floatValue);\n            clone.m_doubleValue = (double)Utils.Clone(this.m_doubleValue);\n            clone.m_stringValue = (string)Utils.Clone(this.m_stringValue);\n            clone.m_dateTimeValue = (DateTime)Utils.Clone(this.m_dateTimeValue);\n            clone.m_guidValue = (Uuid)Utils.Clone(this.m_guidValue);\n            clone.m_byteStringValue = (byte[])Utils.Clone(this.m_byteStringValue);\n            clone.m_xmlElementValue = (XmlElement)Utils.Clone(this.m_xmlElementValue);\n            clone.m_nodeIdValue = (NodeId)Utils.Clone(this.m_nodeIdValue);\n            clone.m_expandedNodeIdValue = (ExpandedNodeId)Utils.Clone(this.m_expandedNodeIdValue);\n            clone.m_qualifiedNameValue = (QualifiedName)Utils.Clone(this.m_qualifiedNameValue);\n            clone.m_localizedTextValue = (LocalizedText)Utils.Clone(this.m_localizedTextValue);\n            clone.m_statusCodeValue = (StatusCode)Utils.Clone(this.m_statusCodeValue);\n            clone.m_variantValue = (Variant)Utils.Clone(this.m_variantValue);\n            clone.m_enumerationValue = (int)Utils.Clone(this.m_enumerationValue);\n            clone.m_structureValue = (ExtensionObject)Utils.Clone(this.m_structureValue);\n            clone.m_number = (Variant)Utils.Clone(this.m_number);\n            clone.m_integer = (Variant)Utils.Clone(this.m_integer);\n            clone.m_uInteger = (Variant)Utils.Clone(this.m_uInteger);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private bool m_booleanValue;\n        private sbyte m_sByteValue;\n        private byte m_byteValue;\n        private short m_int16Value;\n        private ushort m_uInt16Value;\n        private int m_int32Value;\n        private uint m_uInt32Value;\n        private long m_int64Value;\n        private ulong m_uInt64Value;\n        private float m_floatValue;\n        private double m_doubleValue;\n        private string m_stringValue;\n        private DateTime m_dateTimeValue;\n        private Uuid m_guidValue;\n        private byte[] m_byteStringValue;\n        private XmlElement m_xmlElementValue;\n        private NodeId m_nodeIdValue;\n        private ExpandedNodeId m_expandedNodeIdValue;\n        private QualifiedName m_qualifiedNameValue;\n        private LocalizedText m_localizedTextValue;\n        private StatusCode m_statusCodeValue;\n        private Variant m_variantValue;\n        private int m_enumerationValue;\n        private ExtensionObject m_structureValue;\n        private Variant m_number;\n        private Variant m_integer;\n        private Variant m_uInteger;\n        #endregion\n    }\n\n    #region ScalarValueDataTypeCollection Class\n    /// <summary>\n    /// A collection of ScalarValueDataType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfScalarValueDataType\", Namespace = TestData.Namespaces.TestData, ItemName = \"ScalarValueDataType\")]\n#if !NET_STANDARD\n    public partial class ScalarValueDataTypeCollection : List<ScalarValueDataType>, ICloneable\n#else\n    public partial class ScalarValueDataTypeCollection : List<ScalarValueDataType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public ScalarValueDataTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public ScalarValueDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public ScalarValueDataTypeCollection(IEnumerable<ScalarValueDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator ScalarValueDataTypeCollection(ScalarValueDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ScalarValueDataTypeCollection(values);\n            }\n\n            return new ScalarValueDataTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator ScalarValueDataType[](ScalarValueDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (ScalarValueDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ScalarValueDataTypeCollection clone = new ScalarValueDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ScalarValueDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region ArrayValueDataType Class\n#if (!OPCUA_EXCLUDE_ArrayValueDataType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = TestData.Namespaces.TestData)]\n    public partial class ArrayValueDataType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public ArrayValueDataType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_booleanValue = new BooleanCollection();\n            m_sByteValue = new SByteCollection();\n            m_byteValue = new ByteCollection();\n            m_int16Value = new Int16Collection();\n            m_uInt16Value = new UInt16Collection();\n            m_int32Value = new Int32Collection();\n            m_uInt32Value = new UInt32Collection();\n            m_int64Value = new Int64Collection();\n            m_uInt64Value = new UInt64Collection();\n            m_floatValue = new FloatCollection();\n            m_doubleValue = new DoubleCollection();\n            m_stringValue = new StringCollection();\n            m_dateTimeValue = new DateTimeCollection();\n            m_guidValue = new UuidCollection();\n            m_byteStringValue = new ByteStringCollection();\n            m_xmlElementValue = new XmlElementCollection();\n            m_nodeIdValue = new NodeIdCollection();\n            m_expandedNodeIdValue = new ExpandedNodeIdCollection();\n            m_qualifiedNameValue = new QualifiedNameCollection();\n            m_localizedTextValue = new LocalizedTextCollection();\n            m_statusCodeValue = new StatusCodeCollection();\n            m_variantValue = new VariantCollection();\n            m_enumerationValue = new Int32Collection();\n            m_structureValue = new ExtensionObjectCollection();\n            m_number = new VariantCollection();\n            m_integer = new VariantCollection();\n            m_uInteger = new VariantCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"BooleanValue\", IsRequired = false, Order = 1)]\n        public BooleanCollection BooleanValue\n        {\n            get\n            {\n                return m_booleanValue;\n            }\n\n            set\n            {\n                m_booleanValue = value;\n\n                if (value == null)\n                {\n                    m_booleanValue = new BooleanCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"SByteValue\", IsRequired = false, Order = 2)]\n        public SByteCollection SByteValue\n        {\n            get\n            {\n                return m_sByteValue;\n            }\n\n            set\n            {\n                m_sByteValue = value;\n\n                if (value == null)\n                {\n                    m_sByteValue = new SByteCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"ByteValue\", IsRequired = false, Order = 3)]\n        public ByteCollection ByteValue\n        {\n            get\n            {\n                return m_byteValue;\n            }\n\n            set\n            {\n                m_byteValue = value;\n\n                if (value == null)\n                {\n                    m_byteValue = new ByteCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Int16Value\", IsRequired = false, Order = 4)]\n        public Int16Collection Int16Value\n        {\n            get\n            {\n                return m_int16Value;\n            }\n\n            set\n            {\n                m_int16Value = value;\n\n                if (value == null)\n                {\n                    m_int16Value = new Int16Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"UInt16Value\", IsRequired = false, Order = 5)]\n        public UInt16Collection UInt16Value\n        {\n            get\n            {\n                return m_uInt16Value;\n            }\n\n            set\n            {\n                m_uInt16Value = value;\n\n                if (value == null)\n                {\n                    m_uInt16Value = new UInt16Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Int32Value\", IsRequired = false, Order = 6)]\n        public Int32Collection Int32Value\n        {\n            get\n            {\n                return m_int32Value;\n            }\n\n            set\n            {\n                m_int32Value = value;\n\n                if (value == null)\n                {\n                    m_int32Value = new Int32Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"UInt32Value\", IsRequired = false, Order = 7)]\n        public UInt32Collection UInt32Value\n        {\n            get\n            {\n                return m_uInt32Value;\n            }\n\n            set\n            {\n                m_uInt32Value = value;\n\n                if (value == null)\n                {\n                    m_uInt32Value = new UInt32Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Int64Value\", IsRequired = false, Order = 8)]\n        public Int64Collection Int64Value\n        {\n            get\n            {\n                return m_int64Value;\n            }\n\n            set\n            {\n                m_int64Value = value;\n\n                if (value == null)\n                {\n                    m_int64Value = new Int64Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"UInt64Value\", IsRequired = false, Order = 9)]\n        public UInt64Collection UInt64Value\n        {\n            get\n            {\n                return m_uInt64Value;\n            }\n\n            set\n            {\n                m_uInt64Value = value;\n\n                if (value == null)\n                {\n                    m_uInt64Value = new UInt64Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"FloatValue\", IsRequired = false, Order = 10)]\n        public FloatCollection FloatValue\n        {\n            get\n            {\n                return m_floatValue;\n            }\n\n            set\n            {\n                m_floatValue = value;\n\n                if (value == null)\n                {\n                    m_floatValue = new FloatCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"DoubleValue\", IsRequired = false, Order = 11)]\n        public DoubleCollection DoubleValue\n        {\n            get\n            {\n                return m_doubleValue;\n            }\n\n            set\n            {\n                m_doubleValue = value;\n\n                if (value == null)\n                {\n                    m_doubleValue = new DoubleCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"StringValue\", IsRequired = false, Order = 12)]\n        public StringCollection StringValue\n        {\n            get\n            {\n                return m_stringValue;\n            }\n\n            set\n            {\n                m_stringValue = value;\n\n                if (value == null)\n                {\n                    m_stringValue = new StringCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"DateTimeValue\", IsRequired = false, Order = 13)]\n        public DateTimeCollection DateTimeValue\n        {\n            get\n            {\n                return m_dateTimeValue;\n            }\n\n            set\n            {\n                m_dateTimeValue = value;\n\n                if (value == null)\n                {\n                    m_dateTimeValue = new DateTimeCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"GuidValue\", IsRequired = false, Order = 14)]\n        public UuidCollection GuidValue\n        {\n            get\n            {\n                return m_guidValue;\n            }\n\n            set\n            {\n                m_guidValue = value;\n\n                if (value == null)\n                {\n                    m_guidValue = new UuidCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"ByteStringValue\", IsRequired = false, Order = 15)]\n        public ByteStringCollection ByteStringValue\n        {\n            get\n            {\n                return m_byteStringValue;\n            }\n\n            set\n            {\n                m_byteStringValue = value;\n\n                if (value == null)\n                {\n                    m_byteStringValue = new ByteStringCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"XmlElementValue\", IsRequired = false, Order = 16)]\n        public XmlElementCollection XmlElementValue\n        {\n            get\n            {\n                return m_xmlElementValue;\n            }\n\n            set\n            {\n                m_xmlElementValue = value;\n\n                if (value == null)\n                {\n                    m_xmlElementValue = new XmlElementCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"NodeIdValue\", IsRequired = false, Order = 17)]\n        public NodeIdCollection NodeIdValue\n        {\n            get\n            {\n                return m_nodeIdValue;\n            }\n\n            set\n            {\n                m_nodeIdValue = value;\n\n                if (value == null)\n                {\n                    m_nodeIdValue = new NodeIdCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"ExpandedNodeIdValue\", IsRequired = false, Order = 18)]\n        public ExpandedNodeIdCollection ExpandedNodeIdValue\n        {\n            get\n            {\n                return m_expandedNodeIdValue;\n            }\n\n            set\n            {\n                m_expandedNodeIdValue = value;\n\n                if (value == null)\n                {\n                    m_expandedNodeIdValue = new ExpandedNodeIdCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"QualifiedNameValue\", IsRequired = false, Order = 19)]\n        public QualifiedNameCollection QualifiedNameValue\n        {\n            get\n            {\n                return m_qualifiedNameValue;\n            }\n\n            set\n            {\n                m_qualifiedNameValue = value;\n\n                if (value == null)\n                {\n                    m_qualifiedNameValue = new QualifiedNameCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"LocalizedTextValue\", IsRequired = false, Order = 20)]\n        public LocalizedTextCollection LocalizedTextValue\n        {\n            get\n            {\n                return m_localizedTextValue;\n            }\n\n            set\n            {\n                m_localizedTextValue = value;\n\n                if (value == null)\n                {\n                    m_localizedTextValue = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"StatusCodeValue\", IsRequired = false, Order = 21)]\n        public StatusCodeCollection StatusCodeValue\n        {\n            get\n            {\n                return m_statusCodeValue;\n            }\n\n            set\n            {\n                m_statusCodeValue = value;\n\n                if (value == null)\n                {\n                    m_statusCodeValue = new StatusCodeCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"VariantValue\", IsRequired = false, Order = 22)]\n        public VariantCollection VariantValue\n        {\n            get\n            {\n                return m_variantValue;\n            }\n\n            set\n            {\n                m_variantValue = value;\n\n                if (value == null)\n                {\n                    m_variantValue = new VariantCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"EnumerationValue\", IsRequired = false, Order = 23)]\n        public Int32Collection EnumerationValue\n        {\n            get\n            {\n                return m_enumerationValue;\n            }\n\n            set\n            {\n                m_enumerationValue = value;\n\n                if (value == null)\n                {\n                    m_enumerationValue = new Int32Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"StructureValue\", IsRequired = false, Order = 24)]\n        public ExtensionObjectCollection StructureValue\n        {\n            get\n            {\n                return m_structureValue;\n            }\n\n            set\n            {\n                m_structureValue = value;\n\n                if (value == null)\n                {\n                    m_structureValue = new ExtensionObjectCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Number\", IsRequired = false, Order = 25)]\n        public VariantCollection Number\n        {\n            get\n            {\n                return m_number;\n            }\n\n            set\n            {\n                m_number = value;\n\n                if (value == null)\n                {\n                    m_number = new VariantCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Integer\", IsRequired = false, Order = 26)]\n        public VariantCollection Integer\n        {\n            get\n            {\n                return m_integer;\n            }\n\n            set\n            {\n                m_integer = value;\n\n                if (value == null)\n                {\n                    m_integer = new VariantCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"UInteger\", IsRequired = false, Order = 27)]\n        public VariantCollection UInteger\n        {\n            get\n            {\n                return m_uInteger;\n            }\n\n            set\n            {\n                m_uInteger = value;\n\n                if (value == null)\n                {\n                    m_uInteger = new VariantCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.ArrayValueDataType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.ArrayValueDataType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.ArrayValueDataType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(TestData.Namespaces.TestData);\n\n            encoder.WriteBooleanArray(\"BooleanValue\", BooleanValue);\n            encoder.WriteSByteArray(\"SByteValue\", SByteValue);\n            encoder.WriteByteArray(\"ByteValue\", ByteValue);\n            encoder.WriteInt16Array(\"Int16Value\", Int16Value);\n            encoder.WriteUInt16Array(\"UInt16Value\", UInt16Value);\n            encoder.WriteInt32Array(\"Int32Value\", Int32Value);\n            encoder.WriteUInt32Array(\"UInt32Value\", UInt32Value);\n            encoder.WriteInt64Array(\"Int64Value\", Int64Value);\n            encoder.WriteUInt64Array(\"UInt64Value\", UInt64Value);\n            encoder.WriteFloatArray(\"FloatValue\", FloatValue);\n            encoder.WriteDoubleArray(\"DoubleValue\", DoubleValue);\n            encoder.WriteStringArray(\"StringValue\", StringValue);\n            encoder.WriteDateTimeArray(\"DateTimeValue\", DateTimeValue);\n            encoder.WriteGuidArray(\"GuidValue\", GuidValue);\n            encoder.WriteByteStringArray(\"ByteStringValue\", ByteStringValue);\n            encoder.WriteXmlElementArray(\"XmlElementValue\", XmlElementValue);\n            encoder.WriteNodeIdArray(\"NodeIdValue\", NodeIdValue);\n            encoder.WriteExpandedNodeIdArray(\"ExpandedNodeIdValue\", ExpandedNodeIdValue);\n            encoder.WriteQualifiedNameArray(\"QualifiedNameValue\", QualifiedNameValue);\n            encoder.WriteLocalizedTextArray(\"LocalizedTextValue\", LocalizedTextValue);\n            encoder.WriteStatusCodeArray(\"StatusCodeValue\", StatusCodeValue);\n            encoder.WriteVariantArray(\"VariantValue\", VariantValue);\n            encoder.WriteInt32Array(\"EnumerationValue\", EnumerationValue);\n            encoder.WriteExtensionObjectArray(\"StructureValue\", StructureValue);\n            encoder.WriteVariantArray(\"Number\", Number);\n            encoder.WriteVariantArray(\"Integer\", Integer);\n            encoder.WriteVariantArray(\"UInteger\", UInteger);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(TestData.Namespaces.TestData);\n\n            BooleanValue = decoder.ReadBooleanArray(\"BooleanValue\");\n            SByteValue = decoder.ReadSByteArray(\"SByteValue\");\n            ByteValue = decoder.ReadByteArray(\"ByteValue\");\n            Int16Value = decoder.ReadInt16Array(\"Int16Value\");\n            UInt16Value = decoder.ReadUInt16Array(\"UInt16Value\");\n            Int32Value = decoder.ReadInt32Array(\"Int32Value\");\n            UInt32Value = decoder.ReadUInt32Array(\"UInt32Value\");\n            Int64Value = decoder.ReadInt64Array(\"Int64Value\");\n            UInt64Value = decoder.ReadUInt64Array(\"UInt64Value\");\n            FloatValue = decoder.ReadFloatArray(\"FloatValue\");\n            DoubleValue = decoder.ReadDoubleArray(\"DoubleValue\");\n            StringValue = decoder.ReadStringArray(\"StringValue\");\n            DateTimeValue = decoder.ReadDateTimeArray(\"DateTimeValue\");\n            GuidValue = decoder.ReadGuidArray(\"GuidValue\");\n            ByteStringValue = decoder.ReadByteStringArray(\"ByteStringValue\");\n            XmlElementValue = decoder.ReadXmlElementArray(\"XmlElementValue\");\n            NodeIdValue = decoder.ReadNodeIdArray(\"NodeIdValue\");\n            ExpandedNodeIdValue = decoder.ReadExpandedNodeIdArray(\"ExpandedNodeIdValue\");\n            QualifiedNameValue = decoder.ReadQualifiedNameArray(\"QualifiedNameValue\");\n            LocalizedTextValue = decoder.ReadLocalizedTextArray(\"LocalizedTextValue\");\n            StatusCodeValue = decoder.ReadStatusCodeArray(\"StatusCodeValue\");\n            VariantValue = decoder.ReadVariantArray(\"VariantValue\");\n            EnumerationValue = decoder.ReadInt32Array(\"EnumerationValue\");\n            StructureValue = decoder.ReadExtensionObjectArray(\"StructureValue\");\n            Number = decoder.ReadVariantArray(\"Number\");\n            Integer = decoder.ReadVariantArray(\"Integer\");\n            UInteger = decoder.ReadVariantArray(\"UInteger\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            ArrayValueDataType value = encodeable as ArrayValueDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_booleanValue, value.m_booleanValue)) return false;\n            if (!Utils.IsEqual(m_sByteValue, value.m_sByteValue)) return false;\n            if (!Utils.IsEqual(m_byteValue, value.m_byteValue)) return false;\n            if (!Utils.IsEqual(m_int16Value, value.m_int16Value)) return false;\n            if (!Utils.IsEqual(m_uInt16Value, value.m_uInt16Value)) return false;\n            if (!Utils.IsEqual(m_int32Value, value.m_int32Value)) return false;\n            if (!Utils.IsEqual(m_uInt32Value, value.m_uInt32Value)) return false;\n            if (!Utils.IsEqual(m_int64Value, value.m_int64Value)) return false;\n            if (!Utils.IsEqual(m_uInt64Value, value.m_uInt64Value)) return false;\n            if (!Utils.IsEqual(m_floatValue, value.m_floatValue)) return false;\n            if (!Utils.IsEqual(m_doubleValue, value.m_doubleValue)) return false;\n            if (!Utils.IsEqual(m_stringValue, value.m_stringValue)) return false;\n            if (!Utils.IsEqual(m_dateTimeValue, value.m_dateTimeValue)) return false;\n            if (!Utils.IsEqual(m_guidValue, value.m_guidValue)) return false;\n            if (!Utils.IsEqual(m_byteStringValue, value.m_byteStringValue)) return false;\n            if (!Utils.IsEqual(m_xmlElementValue, value.m_xmlElementValue)) return false;\n            if (!Utils.IsEqual(m_nodeIdValue, value.m_nodeIdValue)) return false;\n            if (!Utils.IsEqual(m_expandedNodeIdValue, value.m_expandedNodeIdValue)) return false;\n            if (!Utils.IsEqual(m_qualifiedNameValue, value.m_qualifiedNameValue)) return false;\n            if (!Utils.IsEqual(m_localizedTextValue, value.m_localizedTextValue)) return false;\n            if (!Utils.IsEqual(m_statusCodeValue, value.m_statusCodeValue)) return false;\n            if (!Utils.IsEqual(m_variantValue, value.m_variantValue)) return false;\n            if (!Utils.IsEqual(m_enumerationValue, value.m_enumerationValue)) return false;\n            if (!Utils.IsEqual(m_structureValue, value.m_structureValue)) return false;\n            if (!Utils.IsEqual(m_number, value.m_number)) return false;\n            if (!Utils.IsEqual(m_integer, value.m_integer)) return false;\n            if (!Utils.IsEqual(m_uInteger, value.m_uInteger)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (ArrayValueDataType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ArrayValueDataType clone = (ArrayValueDataType)base.MemberwiseClone();\n\n            clone.m_booleanValue = (BooleanCollection)Utils.Clone(this.m_booleanValue);\n            clone.m_sByteValue = (SByteCollection)Utils.Clone(this.m_sByteValue);\n            clone.m_byteValue = (ByteCollection)Utils.Clone(this.m_byteValue);\n            clone.m_int16Value = (Int16Collection)Utils.Clone(this.m_int16Value);\n            clone.m_uInt16Value = (UInt16Collection)Utils.Clone(this.m_uInt16Value);\n            clone.m_int32Value = (Int32Collection)Utils.Clone(this.m_int32Value);\n            clone.m_uInt32Value = (UInt32Collection)Utils.Clone(this.m_uInt32Value);\n            clone.m_int64Value = (Int64Collection)Utils.Clone(this.m_int64Value);\n            clone.m_uInt64Value = (UInt64Collection)Utils.Clone(this.m_uInt64Value);\n            clone.m_floatValue = (FloatCollection)Utils.Clone(this.m_floatValue);\n            clone.m_doubleValue = (DoubleCollection)Utils.Clone(this.m_doubleValue);\n            clone.m_stringValue = (StringCollection)Utils.Clone(this.m_stringValue);\n            clone.m_dateTimeValue = (DateTimeCollection)Utils.Clone(this.m_dateTimeValue);\n            clone.m_guidValue = (UuidCollection)Utils.Clone(this.m_guidValue);\n            clone.m_byteStringValue = (ByteStringCollection)Utils.Clone(this.m_byteStringValue);\n            clone.m_xmlElementValue = (XmlElementCollection)Utils.Clone(this.m_xmlElementValue);\n            clone.m_nodeIdValue = (NodeIdCollection)Utils.Clone(this.m_nodeIdValue);\n            clone.m_expandedNodeIdValue = (ExpandedNodeIdCollection)Utils.Clone(this.m_expandedNodeIdValue);\n            clone.m_qualifiedNameValue = (QualifiedNameCollection)Utils.Clone(this.m_qualifiedNameValue);\n            clone.m_localizedTextValue = (LocalizedTextCollection)Utils.Clone(this.m_localizedTextValue);\n            clone.m_statusCodeValue = (StatusCodeCollection)Utils.Clone(this.m_statusCodeValue);\n            clone.m_variantValue = (VariantCollection)Utils.Clone(this.m_variantValue);\n            clone.m_enumerationValue = (Int32Collection)Utils.Clone(this.m_enumerationValue);\n            clone.m_structureValue = (ExtensionObjectCollection)Utils.Clone(this.m_structureValue);\n            clone.m_number = (VariantCollection)Utils.Clone(this.m_number);\n            clone.m_integer = (VariantCollection)Utils.Clone(this.m_integer);\n            clone.m_uInteger = (VariantCollection)Utils.Clone(this.m_uInteger);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private BooleanCollection m_booleanValue;\n        private SByteCollection m_sByteValue;\n        private ByteCollection m_byteValue;\n        private Int16Collection m_int16Value;\n        private UInt16Collection m_uInt16Value;\n        private Int32Collection m_int32Value;\n        private UInt32Collection m_uInt32Value;\n        private Int64Collection m_int64Value;\n        private UInt64Collection m_uInt64Value;\n        private FloatCollection m_floatValue;\n        private DoubleCollection m_doubleValue;\n        private StringCollection m_stringValue;\n        private DateTimeCollection m_dateTimeValue;\n        private UuidCollection m_guidValue;\n        private ByteStringCollection m_byteStringValue;\n        private XmlElementCollection m_xmlElementValue;\n        private NodeIdCollection m_nodeIdValue;\n        private ExpandedNodeIdCollection m_expandedNodeIdValue;\n        private QualifiedNameCollection m_qualifiedNameValue;\n        private LocalizedTextCollection m_localizedTextValue;\n        private StatusCodeCollection m_statusCodeValue;\n        private VariantCollection m_variantValue;\n        private Int32Collection m_enumerationValue;\n        private ExtensionObjectCollection m_structureValue;\n        private VariantCollection m_number;\n        private VariantCollection m_integer;\n        private VariantCollection m_uInteger;\n        #endregion\n    }\n\n    #region ArrayValueDataTypeCollection Class\n    /// <summary>\n    /// A collection of ArrayValueDataType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfArrayValueDataType\", Namespace = TestData.Namespaces.TestData, ItemName = \"ArrayValueDataType\")]\n#if !NET_STANDARD\n    public partial class ArrayValueDataTypeCollection : List<ArrayValueDataType>, ICloneable\n#else\n    public partial class ArrayValueDataTypeCollection : List<ArrayValueDataType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public ArrayValueDataTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public ArrayValueDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public ArrayValueDataTypeCollection(IEnumerable<ArrayValueDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator ArrayValueDataTypeCollection(ArrayValueDataType[] values)\n        {\n            if (values != null)\n            {\n                return new ArrayValueDataTypeCollection(values);\n            }\n\n            return new ArrayValueDataTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator ArrayValueDataType[](ArrayValueDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (ArrayValueDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ArrayValueDataTypeCollection clone = new ArrayValueDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ArrayValueDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region UserScalarValueDataType Class\n#if (!OPCUA_EXCLUDE_UserScalarValueDataType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = TestData.Namespaces.TestData)]\n    public partial class UserScalarValueDataType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public UserScalarValueDataType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_booleanDataType = true;\n            m_sByteDataType = (sbyte)0;\n            m_byteDataType = (byte)0;\n            m_int16DataType = (short)0;\n            m_uInt16DataType = (ushort)0;\n            m_int32DataType = (int)0;\n            m_uInt32DataType = (uint)0;\n            m_int64DataType = (long)0;\n            m_uInt64DataType = (ulong)0;\n            m_floatDataType = (float)0;\n            m_doubleDataType = (double)0;\n            m_stringDataType = null;\n            m_dateTimeDataType = DateTime.MinValue;\n            m_guidDataType = Uuid.Empty;\n            m_byteStringDataType = null;\n            m_xmlElementDataType = null;\n            m_nodeIdDataType = null;\n            m_expandedNodeIdDataType = null;\n            m_qualifiedNameDataType = null;\n            m_localizedTextDataType = null;\n            m_statusCodeDataType = StatusCodes.Good;\n            m_variantDataType = Variant.Null;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        [DataMember(Name = \"BooleanDataType\", IsRequired = false, Order = 1)]\n        public bool BooleanDataType\n        {\n            get { return m_booleanDataType; }\n            set { m_booleanDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"SByteDataType\", IsRequired = false, Order = 2)]\n        public sbyte SByteDataType\n        {\n            get { return m_sByteDataType; }\n            set { m_sByteDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"ByteDataType\", IsRequired = false, Order = 3)]\n        public byte ByteDataType\n        {\n            get { return m_byteDataType; }\n            set { m_byteDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Int16DataType\", IsRequired = false, Order = 4)]\n        public short Int16DataType\n        {\n            get { return m_int16DataType; }\n            set { m_int16DataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"UInt16DataType\", IsRequired = false, Order = 5)]\n        public ushort UInt16DataType\n        {\n            get { return m_uInt16DataType; }\n            set { m_uInt16DataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Int32DataType\", IsRequired = false, Order = 6)]\n        public int Int32DataType\n        {\n            get { return m_int32DataType; }\n            set { m_int32DataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"UInt32DataType\", IsRequired = false, Order = 7)]\n        public uint UInt32DataType\n        {\n            get { return m_uInt32DataType; }\n            set { m_uInt32DataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Int64DataType\", IsRequired = false, Order = 8)]\n        public long Int64DataType\n        {\n            get { return m_int64DataType; }\n            set { m_int64DataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"UInt64DataType\", IsRequired = false, Order = 9)]\n        public ulong UInt64DataType\n        {\n            get { return m_uInt64DataType; }\n            set { m_uInt64DataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"FloatDataType\", IsRequired = false, Order = 10)]\n        public float FloatDataType\n        {\n            get { return m_floatDataType; }\n            set { m_floatDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"DoubleDataType\", IsRequired = false, Order = 11)]\n        public double DoubleDataType\n        {\n            get { return m_doubleDataType; }\n            set { m_doubleDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StringDataType\", IsRequired = false, Order = 12)]\n        public string StringDataType\n        {\n            get { return m_stringDataType; }\n            set { m_stringDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"DateTimeDataType\", IsRequired = false, Order = 13)]\n        public DateTime DateTimeDataType\n        {\n            get { return m_dateTimeDataType; }\n            set { m_dateTimeDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"GuidDataType\", IsRequired = false, Order = 14)]\n        public Uuid GuidDataType\n        {\n            get { return m_guidDataType; }\n            set { m_guidDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"ByteStringDataType\", IsRequired = false, Order = 15)]\n        public byte[] ByteStringDataType\n        {\n            get { return m_byteStringDataType; }\n            set { m_byteStringDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"XmlElementDataType\", IsRequired = false, Order = 16)]\n        public XmlElement XmlElementDataType\n        {\n            get { return m_xmlElementDataType; }\n            set { m_xmlElementDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"NodeIdDataType\", IsRequired = false, Order = 17)]\n        public NodeId NodeIdDataType\n        {\n            get { return m_nodeIdDataType; }\n            set { m_nodeIdDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"ExpandedNodeIdDataType\", IsRequired = false, Order = 18)]\n        public ExpandedNodeId ExpandedNodeIdDataType\n        {\n            get { return m_expandedNodeIdDataType; }\n            set { m_expandedNodeIdDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"QualifiedNameDataType\", IsRequired = false, Order = 19)]\n        public QualifiedName QualifiedNameDataType\n        {\n            get { return m_qualifiedNameDataType; }\n            set { m_qualifiedNameDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"LocalizedTextDataType\", IsRequired = false, Order = 20)]\n        public LocalizedText LocalizedTextDataType\n        {\n            get { return m_localizedTextDataType; }\n            set { m_localizedTextDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StatusCodeDataType\", IsRequired = false, Order = 21)]\n        public StatusCode StatusCodeDataType\n        {\n            get { return m_statusCodeDataType; }\n            set { m_statusCodeDataType = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"VariantDataType\", IsRequired = false, Order = 22)]\n        public Variant VariantDataType\n        {\n            get { return m_variantDataType; }\n            set { m_variantDataType = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.UserScalarValueDataType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.UserScalarValueDataType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.UserScalarValueDataType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(TestData.Namespaces.TestData);\n\n            encoder.WriteBoolean(\"BooleanDataType\", BooleanDataType);\n            encoder.WriteSByte(\"SByteDataType\", SByteDataType);\n            encoder.WriteByte(\"ByteDataType\", ByteDataType);\n            encoder.WriteInt16(\"Int16DataType\", Int16DataType);\n            encoder.WriteUInt16(\"UInt16DataType\", UInt16DataType);\n            encoder.WriteInt32(\"Int32DataType\", Int32DataType);\n            encoder.WriteUInt32(\"UInt32DataType\", UInt32DataType);\n            encoder.WriteInt64(\"Int64DataType\", Int64DataType);\n            encoder.WriteUInt64(\"UInt64DataType\", UInt64DataType);\n            encoder.WriteFloat(\"FloatDataType\", FloatDataType);\n            encoder.WriteDouble(\"DoubleDataType\", DoubleDataType);\n            encoder.WriteString(\"StringDataType\", StringDataType);\n            encoder.WriteDateTime(\"DateTimeDataType\", DateTimeDataType);\n            encoder.WriteGuid(\"GuidDataType\", GuidDataType);\n            encoder.WriteByteString(\"ByteStringDataType\", ByteStringDataType);\n            encoder.WriteXmlElement(\"XmlElementDataType\", XmlElementDataType);\n            encoder.WriteNodeId(\"NodeIdDataType\", NodeIdDataType);\n            encoder.WriteExpandedNodeId(\"ExpandedNodeIdDataType\", ExpandedNodeIdDataType);\n            encoder.WriteQualifiedName(\"QualifiedNameDataType\", QualifiedNameDataType);\n            encoder.WriteLocalizedText(\"LocalizedTextDataType\", LocalizedTextDataType);\n            encoder.WriteStatusCode(\"StatusCodeDataType\", StatusCodeDataType);\n            encoder.WriteVariant(\"VariantDataType\", VariantDataType);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(TestData.Namespaces.TestData);\n\n            BooleanDataType = decoder.ReadBoolean(\"BooleanDataType\");\n            SByteDataType = decoder.ReadSByte(\"SByteDataType\");\n            ByteDataType = decoder.ReadByte(\"ByteDataType\");\n            Int16DataType = decoder.ReadInt16(\"Int16DataType\");\n            UInt16DataType = decoder.ReadUInt16(\"UInt16DataType\");\n            Int32DataType = decoder.ReadInt32(\"Int32DataType\");\n            UInt32DataType = decoder.ReadUInt32(\"UInt32DataType\");\n            Int64DataType = decoder.ReadInt64(\"Int64DataType\");\n            UInt64DataType = decoder.ReadUInt64(\"UInt64DataType\");\n            FloatDataType = decoder.ReadFloat(\"FloatDataType\");\n            DoubleDataType = decoder.ReadDouble(\"DoubleDataType\");\n            StringDataType = decoder.ReadString(\"StringDataType\");\n            DateTimeDataType = decoder.ReadDateTime(\"DateTimeDataType\");\n            GuidDataType = decoder.ReadGuid(\"GuidDataType\");\n            ByteStringDataType = decoder.ReadByteString(\"ByteStringDataType\");\n            XmlElementDataType = decoder.ReadXmlElement(\"XmlElementDataType\");\n            NodeIdDataType = decoder.ReadNodeId(\"NodeIdDataType\");\n            ExpandedNodeIdDataType = decoder.ReadExpandedNodeId(\"ExpandedNodeIdDataType\");\n            QualifiedNameDataType = decoder.ReadQualifiedName(\"QualifiedNameDataType\");\n            LocalizedTextDataType = decoder.ReadLocalizedText(\"LocalizedTextDataType\");\n            StatusCodeDataType = decoder.ReadStatusCode(\"StatusCodeDataType\");\n            VariantDataType = decoder.ReadVariant(\"VariantDataType\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            UserScalarValueDataType value = encodeable as UserScalarValueDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_booleanDataType, value.m_booleanDataType)) return false;\n            if (!Utils.IsEqual(m_sByteDataType, value.m_sByteDataType)) return false;\n            if (!Utils.IsEqual(m_byteDataType, value.m_byteDataType)) return false;\n            if (!Utils.IsEqual(m_int16DataType, value.m_int16DataType)) return false;\n            if (!Utils.IsEqual(m_uInt16DataType, value.m_uInt16DataType)) return false;\n            if (!Utils.IsEqual(m_int32DataType, value.m_int32DataType)) return false;\n            if (!Utils.IsEqual(m_uInt32DataType, value.m_uInt32DataType)) return false;\n            if (!Utils.IsEqual(m_int64DataType, value.m_int64DataType)) return false;\n            if (!Utils.IsEqual(m_uInt64DataType, value.m_uInt64DataType)) return false;\n            if (!Utils.IsEqual(m_floatDataType, value.m_floatDataType)) return false;\n            if (!Utils.IsEqual(m_doubleDataType, value.m_doubleDataType)) return false;\n            if (!Utils.IsEqual(m_stringDataType, value.m_stringDataType)) return false;\n            if (!Utils.IsEqual(m_dateTimeDataType, value.m_dateTimeDataType)) return false;\n            if (!Utils.IsEqual(m_guidDataType, value.m_guidDataType)) return false;\n            if (!Utils.IsEqual(m_byteStringDataType, value.m_byteStringDataType)) return false;\n            if (!Utils.IsEqual(m_xmlElementDataType, value.m_xmlElementDataType)) return false;\n            if (!Utils.IsEqual(m_nodeIdDataType, value.m_nodeIdDataType)) return false;\n            if (!Utils.IsEqual(m_expandedNodeIdDataType, value.m_expandedNodeIdDataType)) return false;\n            if (!Utils.IsEqual(m_qualifiedNameDataType, value.m_qualifiedNameDataType)) return false;\n            if (!Utils.IsEqual(m_localizedTextDataType, value.m_localizedTextDataType)) return false;\n            if (!Utils.IsEqual(m_statusCodeDataType, value.m_statusCodeDataType)) return false;\n            if (!Utils.IsEqual(m_variantDataType, value.m_variantDataType)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (UserScalarValueDataType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            UserScalarValueDataType clone = (UserScalarValueDataType)base.MemberwiseClone();\n\n            clone.m_booleanDataType = (bool)Utils.Clone(this.m_booleanDataType);\n            clone.m_sByteDataType = (sbyte)Utils.Clone(this.m_sByteDataType);\n            clone.m_byteDataType = (byte)Utils.Clone(this.m_byteDataType);\n            clone.m_int16DataType = (short)Utils.Clone(this.m_int16DataType);\n            clone.m_uInt16DataType = (ushort)Utils.Clone(this.m_uInt16DataType);\n            clone.m_int32DataType = (int)Utils.Clone(this.m_int32DataType);\n            clone.m_uInt32DataType = (uint)Utils.Clone(this.m_uInt32DataType);\n            clone.m_int64DataType = (long)Utils.Clone(this.m_int64DataType);\n            clone.m_uInt64DataType = (ulong)Utils.Clone(this.m_uInt64DataType);\n            clone.m_floatDataType = (float)Utils.Clone(this.m_floatDataType);\n            clone.m_doubleDataType = (double)Utils.Clone(this.m_doubleDataType);\n            clone.m_stringDataType = (string)Utils.Clone(this.m_stringDataType);\n            clone.m_dateTimeDataType = (DateTime)Utils.Clone(this.m_dateTimeDataType);\n            clone.m_guidDataType = (Uuid)Utils.Clone(this.m_guidDataType);\n            clone.m_byteStringDataType = (byte[])Utils.Clone(this.m_byteStringDataType);\n            clone.m_xmlElementDataType = (XmlElement)Utils.Clone(this.m_xmlElementDataType);\n            clone.m_nodeIdDataType = (NodeId)Utils.Clone(this.m_nodeIdDataType);\n            clone.m_expandedNodeIdDataType = (ExpandedNodeId)Utils.Clone(this.m_expandedNodeIdDataType);\n            clone.m_qualifiedNameDataType = (QualifiedName)Utils.Clone(this.m_qualifiedNameDataType);\n            clone.m_localizedTextDataType = (LocalizedText)Utils.Clone(this.m_localizedTextDataType);\n            clone.m_statusCodeDataType = (StatusCode)Utils.Clone(this.m_statusCodeDataType);\n            clone.m_variantDataType = (Variant)Utils.Clone(this.m_variantDataType);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private bool m_booleanDataType;\n        private sbyte m_sByteDataType;\n        private byte m_byteDataType;\n        private short m_int16DataType;\n        private ushort m_uInt16DataType;\n        private int m_int32DataType;\n        private uint m_uInt32DataType;\n        private long m_int64DataType;\n        private ulong m_uInt64DataType;\n        private float m_floatDataType;\n        private double m_doubleDataType;\n        private string m_stringDataType;\n        private DateTime m_dateTimeDataType;\n        private Uuid m_guidDataType;\n        private byte[] m_byteStringDataType;\n        private XmlElement m_xmlElementDataType;\n        private NodeId m_nodeIdDataType;\n        private ExpandedNodeId m_expandedNodeIdDataType;\n        private QualifiedName m_qualifiedNameDataType;\n        private LocalizedText m_localizedTextDataType;\n        private StatusCode m_statusCodeDataType;\n        private Variant m_variantDataType;\n        #endregion\n    }\n\n    #region UserScalarValueDataTypeCollection Class\n    /// <summary>\n    /// A collection of UserScalarValueDataType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfUserScalarValueDataType\", Namespace = TestData.Namespaces.TestData, ItemName = \"UserScalarValueDataType\")]\n#if !NET_STANDARD\n    public partial class UserScalarValueDataTypeCollection : List<UserScalarValueDataType>, ICloneable\n#else\n    public partial class UserScalarValueDataTypeCollection : List<UserScalarValueDataType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public UserScalarValueDataTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public UserScalarValueDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public UserScalarValueDataTypeCollection(IEnumerable<UserScalarValueDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator UserScalarValueDataTypeCollection(UserScalarValueDataType[] values)\n        {\n            if (values != null)\n            {\n                return new UserScalarValueDataTypeCollection(values);\n            }\n\n            return new UserScalarValueDataTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator UserScalarValueDataType[](UserScalarValueDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (UserScalarValueDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            UserScalarValueDataTypeCollection clone = new UserScalarValueDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((UserScalarValueDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region UserArrayValueDataType Class\n#if (!OPCUA_EXCLUDE_UserArrayValueDataType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = TestData.Namespaces.TestData)]\n    public partial class UserArrayValueDataType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public UserArrayValueDataType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_booleanDataType = new BooleanCollection();\n            m_sByteDataType = new SByteCollection();\n            m_byteDataType = new ByteCollection();\n            m_int16DataType = new Int16Collection();\n            m_uInt16DataType = new UInt16Collection();\n            m_int32DataType = new Int32Collection();\n            m_uInt32DataType = new UInt32Collection();\n            m_int64DataType = new Int64Collection();\n            m_uInt64DataType = new UInt64Collection();\n            m_floatDataType = new FloatCollection();\n            m_doubleDataType = new DoubleCollection();\n            m_stringDataType = new StringCollection();\n            m_dateTimeDataType = new DateTimeCollection();\n            m_guidDataType = new UuidCollection();\n            m_byteStringDataType = new ByteStringCollection();\n            m_xmlElementDataType = new XmlElementCollection();\n            m_nodeIdDataType = new NodeIdCollection();\n            m_expandedNodeIdDataType = new ExpandedNodeIdCollection();\n            m_qualifiedNameDataType = new QualifiedNameCollection();\n            m_localizedTextDataType = new LocalizedTextCollection();\n            m_statusCodeDataType = new StatusCodeCollection();\n            m_variantDataType = new VariantCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"BooleanDataType\", IsRequired = false, Order = 1)]\n        public BooleanCollection BooleanDataType\n        {\n            get\n            {\n                return m_booleanDataType;\n            }\n\n            set\n            {\n                m_booleanDataType = value;\n\n                if (value == null)\n                {\n                    m_booleanDataType = new BooleanCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"SByteDataType\", IsRequired = false, Order = 2)]\n        public SByteCollection SByteDataType\n        {\n            get\n            {\n                return m_sByteDataType;\n            }\n\n            set\n            {\n                m_sByteDataType = value;\n\n                if (value == null)\n                {\n                    m_sByteDataType = new SByteCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"ByteDataType\", IsRequired = false, Order = 3)]\n        public ByteCollection ByteDataType\n        {\n            get\n            {\n                return m_byteDataType;\n            }\n\n            set\n            {\n                m_byteDataType = value;\n\n                if (value == null)\n                {\n                    m_byteDataType = new ByteCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Int16DataType\", IsRequired = false, Order = 4)]\n        public Int16Collection Int16DataType\n        {\n            get\n            {\n                return m_int16DataType;\n            }\n\n            set\n            {\n                m_int16DataType = value;\n\n                if (value == null)\n                {\n                    m_int16DataType = new Int16Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"UInt16DataType\", IsRequired = false, Order = 5)]\n        public UInt16Collection UInt16DataType\n        {\n            get\n            {\n                return m_uInt16DataType;\n            }\n\n            set\n            {\n                m_uInt16DataType = value;\n\n                if (value == null)\n                {\n                    m_uInt16DataType = new UInt16Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Int32DataType\", IsRequired = false, Order = 6)]\n        public Int32Collection Int32DataType\n        {\n            get\n            {\n                return m_int32DataType;\n            }\n\n            set\n            {\n                m_int32DataType = value;\n\n                if (value == null)\n                {\n                    m_int32DataType = new Int32Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"UInt32DataType\", IsRequired = false, Order = 7)]\n        public UInt32Collection UInt32DataType\n        {\n            get\n            {\n                return m_uInt32DataType;\n            }\n\n            set\n            {\n                m_uInt32DataType = value;\n\n                if (value == null)\n                {\n                    m_uInt32DataType = new UInt32Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"Int64DataType\", IsRequired = false, Order = 8)]\n        public Int64Collection Int64DataType\n        {\n            get\n            {\n                return m_int64DataType;\n            }\n\n            set\n            {\n                m_int64DataType = value;\n\n                if (value == null)\n                {\n                    m_int64DataType = new Int64Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"UInt64DataType\", IsRequired = false, Order = 9)]\n        public UInt64Collection UInt64DataType\n        {\n            get\n            {\n                return m_uInt64DataType;\n            }\n\n            set\n            {\n                m_uInt64DataType = value;\n\n                if (value == null)\n                {\n                    m_uInt64DataType = new UInt64Collection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"FloatDataType\", IsRequired = false, Order = 10)]\n        public FloatCollection FloatDataType\n        {\n            get\n            {\n                return m_floatDataType;\n            }\n\n            set\n            {\n                m_floatDataType = value;\n\n                if (value == null)\n                {\n                    m_floatDataType = new FloatCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"DoubleDataType\", IsRequired = false, Order = 11)]\n        public DoubleCollection DoubleDataType\n        {\n            get\n            {\n                return m_doubleDataType;\n            }\n\n            set\n            {\n                m_doubleDataType = value;\n\n                if (value == null)\n                {\n                    m_doubleDataType = new DoubleCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"StringDataType\", IsRequired = false, Order = 12)]\n        public StringCollection StringDataType\n        {\n            get\n            {\n                return m_stringDataType;\n            }\n\n            set\n            {\n                m_stringDataType = value;\n\n                if (value == null)\n                {\n                    m_stringDataType = new StringCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"DateTimeDataType\", IsRequired = false, Order = 13)]\n        public DateTimeCollection DateTimeDataType\n        {\n            get\n            {\n                return m_dateTimeDataType;\n            }\n\n            set\n            {\n                m_dateTimeDataType = value;\n\n                if (value == null)\n                {\n                    m_dateTimeDataType = new DateTimeCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"GuidDataType\", IsRequired = false, Order = 14)]\n        public UuidCollection GuidDataType\n        {\n            get\n            {\n                return m_guidDataType;\n            }\n\n            set\n            {\n                m_guidDataType = value;\n\n                if (value == null)\n                {\n                    m_guidDataType = new UuidCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"ByteStringDataType\", IsRequired = false, Order = 15)]\n        public ByteStringCollection ByteStringDataType\n        {\n            get\n            {\n                return m_byteStringDataType;\n            }\n\n            set\n            {\n                m_byteStringDataType = value;\n\n                if (value == null)\n                {\n                    m_byteStringDataType = new ByteStringCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"XmlElementDataType\", IsRequired = false, Order = 16)]\n        public XmlElementCollection XmlElementDataType\n        {\n            get\n            {\n                return m_xmlElementDataType;\n            }\n\n            set\n            {\n                m_xmlElementDataType = value;\n\n                if (value == null)\n                {\n                    m_xmlElementDataType = new XmlElementCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"NodeIdDataType\", IsRequired = false, Order = 17)]\n        public NodeIdCollection NodeIdDataType\n        {\n            get\n            {\n                return m_nodeIdDataType;\n            }\n\n            set\n            {\n                m_nodeIdDataType = value;\n\n                if (value == null)\n                {\n                    m_nodeIdDataType = new NodeIdCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"ExpandedNodeIdDataType\", IsRequired = false, Order = 18)]\n        public ExpandedNodeIdCollection ExpandedNodeIdDataType\n        {\n            get\n            {\n                return m_expandedNodeIdDataType;\n            }\n\n            set\n            {\n                m_expandedNodeIdDataType = value;\n\n                if (value == null)\n                {\n                    m_expandedNodeIdDataType = new ExpandedNodeIdCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"QualifiedNameDataType\", IsRequired = false, Order = 19)]\n        public QualifiedNameCollection QualifiedNameDataType\n        {\n            get\n            {\n                return m_qualifiedNameDataType;\n            }\n\n            set\n            {\n                m_qualifiedNameDataType = value;\n\n                if (value == null)\n                {\n                    m_qualifiedNameDataType = new QualifiedNameCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"LocalizedTextDataType\", IsRequired = false, Order = 20)]\n        public LocalizedTextCollection LocalizedTextDataType\n        {\n            get\n            {\n                return m_localizedTextDataType;\n            }\n\n            set\n            {\n                m_localizedTextDataType = value;\n\n                if (value == null)\n                {\n                    m_localizedTextDataType = new LocalizedTextCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"StatusCodeDataType\", IsRequired = false, Order = 21)]\n        public StatusCodeCollection StatusCodeDataType\n        {\n            get\n            {\n                return m_statusCodeDataType;\n            }\n\n            set\n            {\n                m_statusCodeDataType = value;\n\n                if (value == null)\n                {\n                    m_statusCodeDataType = new StatusCodeCollection();\n                }\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"VariantDataType\", IsRequired = false, Order = 22)]\n        public VariantCollection VariantDataType\n        {\n            get\n            {\n                return m_variantDataType;\n            }\n\n            set\n            {\n                m_variantDataType = value;\n\n                if (value == null)\n                {\n                    m_variantDataType = new VariantCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.UserArrayValueDataType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.UserArrayValueDataType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.UserArrayValueDataType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(TestData.Namespaces.TestData);\n\n            encoder.WriteBooleanArray(\"BooleanDataType\", BooleanDataType);\n            encoder.WriteSByteArray(\"SByteDataType\", SByteDataType);\n            encoder.WriteByteArray(\"ByteDataType\", ByteDataType);\n            encoder.WriteInt16Array(\"Int16DataType\", Int16DataType);\n            encoder.WriteUInt16Array(\"UInt16DataType\", UInt16DataType);\n            encoder.WriteInt32Array(\"Int32DataType\", Int32DataType);\n            encoder.WriteUInt32Array(\"UInt32DataType\", UInt32DataType);\n            encoder.WriteInt64Array(\"Int64DataType\", Int64DataType);\n            encoder.WriteUInt64Array(\"UInt64DataType\", UInt64DataType);\n            encoder.WriteFloatArray(\"FloatDataType\", FloatDataType);\n            encoder.WriteDoubleArray(\"DoubleDataType\", DoubleDataType);\n            encoder.WriteStringArray(\"StringDataType\", StringDataType);\n            encoder.WriteDateTimeArray(\"DateTimeDataType\", DateTimeDataType);\n            encoder.WriteGuidArray(\"GuidDataType\", GuidDataType);\n            encoder.WriteByteStringArray(\"ByteStringDataType\", ByteStringDataType);\n            encoder.WriteXmlElementArray(\"XmlElementDataType\", XmlElementDataType);\n            encoder.WriteNodeIdArray(\"NodeIdDataType\", NodeIdDataType);\n            encoder.WriteExpandedNodeIdArray(\"ExpandedNodeIdDataType\", ExpandedNodeIdDataType);\n            encoder.WriteQualifiedNameArray(\"QualifiedNameDataType\", QualifiedNameDataType);\n            encoder.WriteLocalizedTextArray(\"LocalizedTextDataType\", LocalizedTextDataType);\n            encoder.WriteStatusCodeArray(\"StatusCodeDataType\", StatusCodeDataType);\n            encoder.WriteVariantArray(\"VariantDataType\", VariantDataType);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(TestData.Namespaces.TestData);\n\n            BooleanDataType = decoder.ReadBooleanArray(\"BooleanDataType\");\n            SByteDataType = decoder.ReadSByteArray(\"SByteDataType\");\n            ByteDataType = decoder.ReadByteArray(\"ByteDataType\");\n            Int16DataType = decoder.ReadInt16Array(\"Int16DataType\");\n            UInt16DataType = decoder.ReadUInt16Array(\"UInt16DataType\");\n            Int32DataType = decoder.ReadInt32Array(\"Int32DataType\");\n            UInt32DataType = decoder.ReadUInt32Array(\"UInt32DataType\");\n            Int64DataType = decoder.ReadInt64Array(\"Int64DataType\");\n            UInt64DataType = decoder.ReadUInt64Array(\"UInt64DataType\");\n            FloatDataType = decoder.ReadFloatArray(\"FloatDataType\");\n            DoubleDataType = decoder.ReadDoubleArray(\"DoubleDataType\");\n            StringDataType = decoder.ReadStringArray(\"StringDataType\");\n            DateTimeDataType = decoder.ReadDateTimeArray(\"DateTimeDataType\");\n            GuidDataType = decoder.ReadGuidArray(\"GuidDataType\");\n            ByteStringDataType = decoder.ReadByteStringArray(\"ByteStringDataType\");\n            XmlElementDataType = decoder.ReadXmlElementArray(\"XmlElementDataType\");\n            NodeIdDataType = decoder.ReadNodeIdArray(\"NodeIdDataType\");\n            ExpandedNodeIdDataType = decoder.ReadExpandedNodeIdArray(\"ExpandedNodeIdDataType\");\n            QualifiedNameDataType = decoder.ReadQualifiedNameArray(\"QualifiedNameDataType\");\n            LocalizedTextDataType = decoder.ReadLocalizedTextArray(\"LocalizedTextDataType\");\n            StatusCodeDataType = decoder.ReadStatusCodeArray(\"StatusCodeDataType\");\n            VariantDataType = decoder.ReadVariantArray(\"VariantDataType\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            UserArrayValueDataType value = encodeable as UserArrayValueDataType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_booleanDataType, value.m_booleanDataType)) return false;\n            if (!Utils.IsEqual(m_sByteDataType, value.m_sByteDataType)) return false;\n            if (!Utils.IsEqual(m_byteDataType, value.m_byteDataType)) return false;\n            if (!Utils.IsEqual(m_int16DataType, value.m_int16DataType)) return false;\n            if (!Utils.IsEqual(m_uInt16DataType, value.m_uInt16DataType)) return false;\n            if (!Utils.IsEqual(m_int32DataType, value.m_int32DataType)) return false;\n            if (!Utils.IsEqual(m_uInt32DataType, value.m_uInt32DataType)) return false;\n            if (!Utils.IsEqual(m_int64DataType, value.m_int64DataType)) return false;\n            if (!Utils.IsEqual(m_uInt64DataType, value.m_uInt64DataType)) return false;\n            if (!Utils.IsEqual(m_floatDataType, value.m_floatDataType)) return false;\n            if (!Utils.IsEqual(m_doubleDataType, value.m_doubleDataType)) return false;\n            if (!Utils.IsEqual(m_stringDataType, value.m_stringDataType)) return false;\n            if (!Utils.IsEqual(m_dateTimeDataType, value.m_dateTimeDataType)) return false;\n            if (!Utils.IsEqual(m_guidDataType, value.m_guidDataType)) return false;\n            if (!Utils.IsEqual(m_byteStringDataType, value.m_byteStringDataType)) return false;\n            if (!Utils.IsEqual(m_xmlElementDataType, value.m_xmlElementDataType)) return false;\n            if (!Utils.IsEqual(m_nodeIdDataType, value.m_nodeIdDataType)) return false;\n            if (!Utils.IsEqual(m_expandedNodeIdDataType, value.m_expandedNodeIdDataType)) return false;\n            if (!Utils.IsEqual(m_qualifiedNameDataType, value.m_qualifiedNameDataType)) return false;\n            if (!Utils.IsEqual(m_localizedTextDataType, value.m_localizedTextDataType)) return false;\n            if (!Utils.IsEqual(m_statusCodeDataType, value.m_statusCodeDataType)) return false;\n            if (!Utils.IsEqual(m_variantDataType, value.m_variantDataType)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (UserArrayValueDataType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            UserArrayValueDataType clone = (UserArrayValueDataType)base.MemberwiseClone();\n\n            clone.m_booleanDataType = (BooleanCollection)Utils.Clone(this.m_booleanDataType);\n            clone.m_sByteDataType = (SByteCollection)Utils.Clone(this.m_sByteDataType);\n            clone.m_byteDataType = (ByteCollection)Utils.Clone(this.m_byteDataType);\n            clone.m_int16DataType = (Int16Collection)Utils.Clone(this.m_int16DataType);\n            clone.m_uInt16DataType = (UInt16Collection)Utils.Clone(this.m_uInt16DataType);\n            clone.m_int32DataType = (Int32Collection)Utils.Clone(this.m_int32DataType);\n            clone.m_uInt32DataType = (UInt32Collection)Utils.Clone(this.m_uInt32DataType);\n            clone.m_int64DataType = (Int64Collection)Utils.Clone(this.m_int64DataType);\n            clone.m_uInt64DataType = (UInt64Collection)Utils.Clone(this.m_uInt64DataType);\n            clone.m_floatDataType = (FloatCollection)Utils.Clone(this.m_floatDataType);\n            clone.m_doubleDataType = (DoubleCollection)Utils.Clone(this.m_doubleDataType);\n            clone.m_stringDataType = (StringCollection)Utils.Clone(this.m_stringDataType);\n            clone.m_dateTimeDataType = (DateTimeCollection)Utils.Clone(this.m_dateTimeDataType);\n            clone.m_guidDataType = (UuidCollection)Utils.Clone(this.m_guidDataType);\n            clone.m_byteStringDataType = (ByteStringCollection)Utils.Clone(this.m_byteStringDataType);\n            clone.m_xmlElementDataType = (XmlElementCollection)Utils.Clone(this.m_xmlElementDataType);\n            clone.m_nodeIdDataType = (NodeIdCollection)Utils.Clone(this.m_nodeIdDataType);\n            clone.m_expandedNodeIdDataType = (ExpandedNodeIdCollection)Utils.Clone(this.m_expandedNodeIdDataType);\n            clone.m_qualifiedNameDataType = (QualifiedNameCollection)Utils.Clone(this.m_qualifiedNameDataType);\n            clone.m_localizedTextDataType = (LocalizedTextCollection)Utils.Clone(this.m_localizedTextDataType);\n            clone.m_statusCodeDataType = (StatusCodeCollection)Utils.Clone(this.m_statusCodeDataType);\n            clone.m_variantDataType = (VariantCollection)Utils.Clone(this.m_variantDataType);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private BooleanCollection m_booleanDataType;\n        private SByteCollection m_sByteDataType;\n        private ByteCollection m_byteDataType;\n        private Int16Collection m_int16DataType;\n        private UInt16Collection m_uInt16DataType;\n        private Int32Collection m_int32DataType;\n        private UInt32Collection m_uInt32DataType;\n        private Int64Collection m_int64DataType;\n        private UInt64Collection m_uInt64DataType;\n        private FloatCollection m_floatDataType;\n        private DoubleCollection m_doubleDataType;\n        private StringCollection m_stringDataType;\n        private DateTimeCollection m_dateTimeDataType;\n        private UuidCollection m_guidDataType;\n        private ByteStringCollection m_byteStringDataType;\n        private XmlElementCollection m_xmlElementDataType;\n        private NodeIdCollection m_nodeIdDataType;\n        private ExpandedNodeIdCollection m_expandedNodeIdDataType;\n        private QualifiedNameCollection m_qualifiedNameDataType;\n        private LocalizedTextCollection m_localizedTextDataType;\n        private StatusCodeCollection m_statusCodeDataType;\n        private VariantCollection m_variantDataType;\n        #endregion\n    }\n\n    #region UserArrayValueDataTypeCollection Class\n    /// <summary>\n    /// A collection of UserArrayValueDataType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfUserArrayValueDataType\", Namespace = TestData.Namespaces.TestData, ItemName = \"UserArrayValueDataType\")]\n#if !NET_STANDARD\n    public partial class UserArrayValueDataTypeCollection : List<UserArrayValueDataType>, ICloneable\n#else\n    public partial class UserArrayValueDataTypeCollection : List<UserArrayValueDataType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public UserArrayValueDataTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public UserArrayValueDataTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public UserArrayValueDataTypeCollection(IEnumerable<UserArrayValueDataType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator UserArrayValueDataTypeCollection(UserArrayValueDataType[] values)\n        {\n            if (values != null)\n            {\n                return new UserArrayValueDataTypeCollection(values);\n            }\n\n            return new UserArrayValueDataTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator UserArrayValueDataType[](UserArrayValueDataTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (UserArrayValueDataTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            UserArrayValueDataTypeCollection clone = new UserArrayValueDataTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((UserArrayValueDataType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region Vector Class\n#if (!OPCUA_EXCLUDE_Vector)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = TestData.Namespaces.TestData)]\n    public partial class Vector : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public Vector()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_x = (double)0;\n            m_y = (double)0;\n            m_z = (double)0;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        [DataMember(Name = \"X\", IsRequired = false, Order = 1)]\n        public double X\n        {\n            get { return m_x; }\n            set { m_x = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Y\", IsRequired = false, Order = 2)]\n        public double Y\n        {\n            get { return m_y; }\n            set { m_y = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Z\", IsRequired = false, Order = 3)]\n        public double Z\n        {\n            get { return m_z; }\n            set { m_z = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.Vector; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.Vector_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.Vector_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(TestData.Namespaces.TestData);\n\n            encoder.WriteDouble(\"X\", X);\n            encoder.WriteDouble(\"Y\", Y);\n            encoder.WriteDouble(\"Z\", Z);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(TestData.Namespaces.TestData);\n\n            X = decoder.ReadDouble(\"X\");\n            Y = decoder.ReadDouble(\"Y\");\n            Z = decoder.ReadDouble(\"Z\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            Vector value = encodeable as Vector;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_x, value.m_x)) return false;\n            if (!Utils.IsEqual(m_y, value.m_y)) return false;\n            if (!Utils.IsEqual(m_z, value.m_z)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (Vector)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            Vector clone = (Vector)base.MemberwiseClone();\n\n            clone.m_x = (double)Utils.Clone(this.m_x);\n            clone.m_y = (double)Utils.Clone(this.m_y);\n            clone.m_z = (double)Utils.Clone(this.m_z);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private double m_x;\n        private double m_y;\n        private double m_z;\n        #endregion\n    }\n\n    #region VectorCollection Class\n    /// <summary>\n    /// A collection of Vector objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfVector\", Namespace = TestData.Namespaces.TestData, ItemName = \"Vector\")]\n#if !NET_STANDARD\n    public partial class VectorCollection : List<Vector>, ICloneable\n#else\n    public partial class VectorCollection : List<Vector>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public VectorCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public VectorCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public VectorCollection(IEnumerable<Vector> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator VectorCollection(Vector[] values)\n        {\n            if (values != null)\n            {\n                return new VectorCollection(values);\n            }\n\n            return new VectorCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator Vector[](VectorCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (VectorCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            VectorCollection clone = new VectorCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((Vector)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region WorkOrderStatusType Class\n#if (!OPCUA_EXCLUDE_WorkOrderStatusType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = TestData.Namespaces.TestData)]\n    public partial class WorkOrderStatusType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public WorkOrderStatusType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_actor = null;\n            m_timestamp = DateTime.MinValue;\n            m_comment = null;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        [DataMember(Name = \"Actor\", IsRequired = false, Order = 1)]\n        public string Actor\n        {\n            get { return m_actor; }\n            set { m_actor = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Timestamp\", IsRequired = false, Order = 2)]\n        public DateTime Timestamp\n        {\n            get { return m_timestamp; }\n            set { m_timestamp = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"Comment\", IsRequired = false, Order = 3)]\n        public LocalizedText Comment\n        {\n            get { return m_comment; }\n            set { m_comment = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.WorkOrderStatusType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.WorkOrderStatusType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.WorkOrderStatusType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(TestData.Namespaces.TestData);\n\n            encoder.WriteString(\"Actor\", Actor);\n            encoder.WriteDateTime(\"Timestamp\", Timestamp);\n            encoder.WriteLocalizedText(\"Comment\", Comment);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(TestData.Namespaces.TestData);\n\n            Actor = decoder.ReadString(\"Actor\");\n            Timestamp = decoder.ReadDateTime(\"Timestamp\");\n            Comment = decoder.ReadLocalizedText(\"Comment\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            WorkOrderStatusType value = encodeable as WorkOrderStatusType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_actor, value.m_actor)) return false;\n            if (!Utils.IsEqual(m_timestamp, value.m_timestamp)) return false;\n            if (!Utils.IsEqual(m_comment, value.m_comment)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (WorkOrderStatusType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            WorkOrderStatusType clone = (WorkOrderStatusType)base.MemberwiseClone();\n\n            clone.m_actor = (string)Utils.Clone(this.m_actor);\n            clone.m_timestamp = (DateTime)Utils.Clone(this.m_timestamp);\n            clone.m_comment = (LocalizedText)Utils.Clone(this.m_comment);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_actor;\n        private DateTime m_timestamp;\n        private LocalizedText m_comment;\n        #endregion\n    }\n\n    #region WorkOrderStatusTypeCollection Class\n    /// <summary>\n    /// A collection of WorkOrderStatusType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfWorkOrderStatusType\", Namespace = TestData.Namespaces.TestData, ItemName = \"WorkOrderStatusType\")]\n#if !NET_STANDARD\n    public partial class WorkOrderStatusTypeCollection : List<WorkOrderStatusType>, ICloneable\n#else\n    public partial class WorkOrderStatusTypeCollection : List<WorkOrderStatusType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public WorkOrderStatusTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public WorkOrderStatusTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public WorkOrderStatusTypeCollection(IEnumerable<WorkOrderStatusType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator WorkOrderStatusTypeCollection(WorkOrderStatusType[] values)\n        {\n            if (values != null)\n            {\n                return new WorkOrderStatusTypeCollection(values);\n            }\n\n            return new WorkOrderStatusTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator WorkOrderStatusType[](WorkOrderStatusTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (WorkOrderStatusTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            WorkOrderStatusTypeCollection clone = new WorkOrderStatusTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((WorkOrderStatusType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region WorkOrderType Class\n#if (!OPCUA_EXCLUDE_WorkOrderType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = TestData.Namespaces.TestData)]\n    public partial class WorkOrderType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public WorkOrderType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_iD = Uuid.Empty;\n            m_assetID = null;\n            m_startTime = DateTime.MinValue;\n            m_statusComments = new WorkOrderStatusTypeCollection();\n        }\n        #endregion\n\n        #region Public Properties\n        /// <remarks />\n        [DataMember(Name = \"ID\", IsRequired = false, Order = 1)]\n        public Uuid ID\n        {\n            get { return m_iD; }\n            set { m_iD = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"AssetID\", IsRequired = false, Order = 2)]\n        public string AssetID\n        {\n            get { return m_assetID; }\n            set { m_assetID = value; }\n        }\n\n        /// <remarks />\n        [DataMember(Name = \"StartTime\", IsRequired = false, Order = 3)]\n        public DateTime StartTime\n        {\n            get { return m_startTime; }\n            set { m_startTime = value; }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        [DataMember(Name = \"StatusComments\", IsRequired = false, Order = 4)]\n        public WorkOrderStatusTypeCollection StatusComments\n        {\n            get\n            {\n                return m_statusComments;\n            }\n\n            set\n            {\n                m_statusComments = value;\n\n                if (value == null)\n                {\n                    m_statusComments = new WorkOrderStatusTypeCollection();\n                }\n            }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.WorkOrderType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.WorkOrderType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.WorkOrderType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(TestData.Namespaces.TestData);\n\n            encoder.WriteGuid(\"ID\", ID);\n            encoder.WriteString(\"AssetID\", AssetID);\n            encoder.WriteDateTime(\"StartTime\", StartTime);\n            encoder.WriteEncodeableArray(\"StatusComments\", StatusComments.ToArray(), typeof(WorkOrderStatusType));\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(TestData.Namespaces.TestData);\n\n            ID = decoder.ReadGuid(\"ID\");\n            AssetID = decoder.ReadString(\"AssetID\");\n            StartTime = decoder.ReadDateTime(\"StartTime\");\n            StatusComments = (WorkOrderStatusTypeCollection)decoder.ReadEncodeableArray(\"StatusComments\", typeof(WorkOrderStatusType));\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            WorkOrderType value = encodeable as WorkOrderType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_iD, value.m_iD)) return false;\n            if (!Utils.IsEqual(m_assetID, value.m_assetID)) return false;\n            if (!Utils.IsEqual(m_startTime, value.m_startTime)) return false;\n            if (!Utils.IsEqual(m_statusComments, value.m_statusComments)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (WorkOrderType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            WorkOrderType clone = (WorkOrderType)base.MemberwiseClone();\n\n            clone.m_iD = (Uuid)Utils.Clone(this.m_iD);\n            clone.m_assetID = (string)Utils.Clone(this.m_assetID);\n            clone.m_startTime = (DateTime)Utils.Clone(this.m_startTime);\n            clone.m_statusComments = (WorkOrderStatusTypeCollection)Utils.Clone(this.m_statusComments);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private Uuid m_iD;\n        private string m_assetID;\n        private DateTime m_startTime;\n        private WorkOrderStatusTypeCollection m_statusComments;\n        #endregion\n    }\n\n    #region WorkOrderTypeCollection Class\n    /// <summary>\n    /// A collection of WorkOrderType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfWorkOrderType\", Namespace = TestData.Namespaces.TestData, ItemName = \"WorkOrderType\")]\n#if !NET_STANDARD\n    public partial class WorkOrderTypeCollection : List<WorkOrderType>, ICloneable\n#else\n    public partial class WorkOrderTypeCollection : List<WorkOrderType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public WorkOrderTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public WorkOrderTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public WorkOrderTypeCollection(IEnumerable<WorkOrderType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator WorkOrderTypeCollection(WorkOrderType[] values)\n        {\n            if (values != null)\n            {\n                return new WorkOrderTypeCollection(values);\n            }\n\n            return new WorkOrderTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator WorkOrderType[](WorkOrderTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (WorkOrderTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            WorkOrderTypeCollection clone = new WorkOrderTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((WorkOrderType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.NodeIds.csv",
    "content": "AnalogArrayValueObjectType,9763,ObjectType\nAnalogScalarValueObjectType,9534,ObjectType\nArrayValueDataType,9669,DataType\nArrayValueDataType_Encoding_DefaultBinary,11438,Object\nArrayValueDataType_Encoding_DefaultJson,15048,Object\nArrayValueDataType_Encoding_DefaultXml,11419,Object\nArrayValueObjectType,9679,ObjectType\nBooleanDataType,9898,DataType\nByteDataType,9900,DataType\nByteStringDataType,9912,DataType\nData,10157,Object\nDateTimeDataType,9910,DataType\nDoubleDataType,9908,DataType\nExpandedNodeIdDataType,9915,DataType\nFloatDataType,9907,DataType\nGenerateValuesEventType,9371,ObjectType\nGuidDataType,9911,DataType\nInt16DataType,9901,DataType\nInt32DataType,9903,DataType\nInt64DataType,9905,DataType\nLocalizedTextDataType,9917,DataType\nMethodTestType,10092,ObjectType\nNodeIdDataType,9914,DataType\nQualifiedNameDataType,9916,DataType\nSByteDataType,9899,DataType\nScalarValueDataType,9440,DataType\nScalarValueDataType_Encoding_DefaultBinary,11437,Object\nScalarValueDataType_Encoding_DefaultJson,15047,Object\nScalarValueDataType_Encoding_DefaultXml,11418,Object\nScalarValueObjectType,9450,ObjectType\nStatusCodeDataType,9918,DataType\nStringDataType,9909,DataType\nTestData_BinarySchema,11422,Variable\nTestData_XmlSchema,11441,Variable\nTestDataObjectType,9383,ObjectType\nTestSystemConditionType,10123,ObjectType\nUInt16DataType,9902,DataType\nUInt32DataType,9904,DataType\nUInt64DataType,9906,DataType\nUserArrayValueDataType,10006,DataType\nUserArrayValueDataType_Encoding_DefaultBinary,11440,Object\nUserArrayValueDataType_Encoding_DefaultJson,15050,Object\nUserArrayValueDataType_Encoding_DefaultXml,11421,Object\nUserArrayValueObjectType,10007,ObjectType\nUserScalarValueDataType,9920,DataType\nUserScalarValueDataType_Encoding_DefaultBinary,11439,Object\nUserScalarValueDataType_Encoding_DefaultJson,15049,Object\nUserScalarValueDataType_Encoding_DefaultXml,11420,Object\nUserScalarValueObjectType,9921,ObjectType\nVariantDataType,9919,DataType\nVector,1000,DataType\nVector_Encoding_DefaultBinary,1008,Object\nVector_Encoding_DefaultJson,64,Object\nVector_Encoding_DefaultXml,36,Object\nWorkOrderStatusType,1004,DataType\nWorkOrderStatusType_Encoding_DefaultBinary,1011,Object\nWorkOrderStatusType_Encoding_DefaultJson,67,Object\nWorkOrderStatusType_Encoding_DefaultXml,39,Object\nWorkOrderType,1005,DataType\nWorkOrderType_Encoding_DefaultBinary,1012,Object\nWorkOrderType_Encoding_DefaultJson,68,Object\nWorkOrderType_Encoding_DefaultXml,40,Object\nXmlElementDataType,9913,DataType\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://test.org/UA/Data/</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=24</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WorkOrderStatusType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WorkOrderStatusType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">WorkOrderStatusType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=27</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WorkOrderType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WorkOrderType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">WorkOrderType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=36</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=43</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=39</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=52</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=40</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=55</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=43</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Vector</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Vector</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='Vector']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=52</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WorkOrderStatusType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WorkOrderStatusType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='WorkOrderStatusType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=55</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WorkOrderType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WorkOrderType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='WorkOrderType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=64</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=67</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=68</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1000</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Vector</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Vector</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=36</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=64</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1004</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WorkOrderStatusType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WorkOrderStatusType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1011</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=39</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=67</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1005</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WorkOrderType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WorkOrderType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=40</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1008</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1011</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=24</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1012</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=27</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=1015</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Vector</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Vector</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">Vector</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9371</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValuesEventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValuesEventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9381</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9382</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9381</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Iterations</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Iterations</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9371</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9382</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NewValueCount</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NewValueCount</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9371</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9383</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TestDataObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TestDataObjectType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9385</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9384</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9385</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9386</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9386</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9385</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9387</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9388</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9389</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9390</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9391</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9392</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9393</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9395</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9396</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11578</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11579</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11557</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9397</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9398</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9399</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9405</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9409</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9411</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9413</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9415</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9414</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9416</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9420</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9436</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9388</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9389</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9390</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9391</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9392</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9393</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9395</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9396</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9397</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9398</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9399</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9400</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9400</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9399</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9405</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9406</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9405</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9409</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9410</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9409</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9411</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9412</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9412</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9411</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9413</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9414</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9415</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9416</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9417</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9417</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9416</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9420</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9421</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9421</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9420</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9436</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9437</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9437</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9436</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9440</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11437</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11418</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9450</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarValueObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarValueObjectType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9507</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9508</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9509</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9510</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9511</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9512</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9514</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9515</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9516</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9517</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9518</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9519</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9520</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9521</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9522</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9523</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9524</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9525</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9526</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9527</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9528</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9529</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9530</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9531</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9532</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9533</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9507</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9508</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <SByte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</SByte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9509</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Byte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Byte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9510</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9511</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9512</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9513</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9514</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9515</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9516</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Float xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Float>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9517</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9518</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9519</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=13</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9520</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Guid xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <String>00000000-0000-0000-0000-000000000000</String>\n          </Guid>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=14</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9521</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9522</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=16</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9523</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9524</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ExpandedNodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </ExpandedNodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=18</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9525</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <QualifiedName xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <NamespaceIndex>0</NamespaceIndex>\n          </QualifiedName>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=20</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9526</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9527</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9528</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=24</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9529</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>EnumerationValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnumerationValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=29</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9530</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StructureValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StructureValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=22</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9531</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9532</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9533</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9534</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AnalogScalarValueObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AnalogScalarValueObjectType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9591</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9597</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9603</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9609</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9615</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9621</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9627</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9633</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9639</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9645</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9651</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9657</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9663</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9591</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9594</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <SByte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</SByte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9594</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9591</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9597</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9600</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Byte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Byte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9600</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9597</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9603</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9606</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9606</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9603</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9609</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9612</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9612</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9609</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9615</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9618</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9618</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9615</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9621</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9624</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9621</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9627</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9630</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9630</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9627</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9633</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9636</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9636</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9633</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9639</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9642</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Float xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Float>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9642</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9639</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9645</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9648</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9648</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9645</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9651</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9654</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9654</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9651</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9657</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9660</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9660</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9657</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9663</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9666</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9666</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9663</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9669</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11438</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11419</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9679</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayValueObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayValueObjectType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9736</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9737</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9738</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9739</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9740</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9741</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9742</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9743</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9744</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9745</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9746</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9747</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9748</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9749</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9750</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9751</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9752</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9753</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9754</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9756</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9757</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9758</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9759</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9760</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9761</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9762</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9736</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9737</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9738</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9739</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9740</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9741</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9742</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9743</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9744</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9745</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9746</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9747</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9748</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=13</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9749</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=14</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9750</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9751</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=16</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9752</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9753</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=18</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9754</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=20</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9755</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9756</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9757</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=24</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9758</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>EnumerationValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnumerationValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=29</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9759</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StructureValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StructureValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=22</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9760</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9761</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9762</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9763</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AnalogArrayValueObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AnalogArrayValueObjectType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9820</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9826</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9832</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9838</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9844</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9850</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9856</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9862</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9868</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9874</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9880</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9886</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9892</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9820</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9823</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9823</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9820</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9826</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9829</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9826</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9832</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9835</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9835</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9832</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9838</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9841</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9841</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9838</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9844</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9847</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9847</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9844</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9850</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9853</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9853</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9850</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9856</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9859</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9859</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9856</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9862</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9865</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9865</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9862</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9868</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9871</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9868</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9874</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9877</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9877</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9874</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9880</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9883</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9883</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9880</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9886</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9889</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9889</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9886</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9892</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9895</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9895</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9892</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9898</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=1</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9899</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9900</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=3</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9901</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16DataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16DataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=4</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9902</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16DataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16DataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=5</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9903</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32DataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32DataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=6</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9904</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32DataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32DataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=7</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9905</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64DataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64DataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=8</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9906</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64DataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64DataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=9</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9907</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=10</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9908</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=11</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9909</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=12</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9910</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=13</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9911</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=14</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9912</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=15</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9913</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=16</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9914</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=17</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9915</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=18</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9916</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=20</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9917</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=21</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9918</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=19</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9919</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=24</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9920</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalarValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalarValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11439</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11420</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9921</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalarValueObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalarValueObjectType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9978</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9979</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9980</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9981</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9982</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9983</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9984</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9985</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9986</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9987</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9988</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9989</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9990</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9991</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9992</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9993</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9994</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9996</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9997</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9998</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9999</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9978</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9898</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9979</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9899</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9980</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9900</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9981</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9901</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9982</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9902</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9983</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9903</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9984</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9904</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9985</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9905</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9986</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9906</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9987</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9907</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9988</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9908</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9989</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9909</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9990</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9910</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9991</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9911</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9992</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9912</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9993</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9913</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9994</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9914</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9995</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9915</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9996</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9916</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9997</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9917</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9998</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9918</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=9999</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9919</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10006</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArrayValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArrayValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11440</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11421</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10007</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArrayValueObjectType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArrayValueObjectType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10069</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10070</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10073</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10074</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10075</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10076</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10077</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10078</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10080</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10081</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10082</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10083</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10084</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10085</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10064</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9898</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10065</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9899</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10066</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9900</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10067</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9901</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10068</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9902</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10069</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9903</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10070</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9904</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10071</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9905</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10072</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9906</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10073</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9907</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10074</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9908</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10075</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9909</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10076</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9910</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10077</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9911</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10078</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9912</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10079</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9913</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10080</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9914</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10081</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9915</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10082</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9916</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10083</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9917</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10084</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9918</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10085</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9919</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10092</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MethodTestType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MethodTestType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10093</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10099</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10102</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10105</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10108</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10111</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10114</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10120</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10093</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarMethod1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarMethod1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10094</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10095</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10094</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10093</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanIn</Name>\n                  <DataType>\n                    <Identifier>i=1</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteIn</Name>\n                  <DataType>\n                    <Identifier>i=2</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteIn</Name>\n                  <DataType>\n                    <Identifier>i=3</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16In</Name>\n                  <DataType>\n                    <Identifier>i=4</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16In</Name>\n                  <DataType>\n                    <Identifier>i=5</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32In</Name>\n                  <DataType>\n                    <Identifier>i=6</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32In</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64In</Name>\n                  <DataType>\n                    <Identifier>i=8</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64In</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatIn</Name>\n                  <DataType>\n                    <Identifier>i=10</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleIn</Name>\n                  <DataType>\n                    <Identifier>i=11</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10095</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10093</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanOut</Name>\n                  <DataType>\n                    <Identifier>i=1</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteOut</Name>\n                  <DataType>\n                    <Identifier>i=2</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteOut</Name>\n                  <DataType>\n                    <Identifier>i=3</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16Out</Name>\n                  <DataType>\n                    <Identifier>i=4</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16Out</Name>\n                  <DataType>\n                    <Identifier>i=5</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32Out</Name>\n                  <DataType>\n                    <Identifier>i=6</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32Out</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64Out</Name>\n                  <DataType>\n                    <Identifier>i=8</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64Out</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatOut</Name>\n                  <DataType>\n                    <Identifier>i=10</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleOut</Name>\n                  <DataType>\n                    <Identifier>i=11</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10096</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarMethod2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarMethod2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10097</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10098</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10097</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringIn</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeIn</Name>\n                  <DataType>\n                    <Identifier>i=13</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidIn</Name>\n                  <DataType>\n                    <Identifier>i=14</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringIn</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementIn</Name>\n                  <DataType>\n                    <Identifier>i=16</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdIn</Name>\n                  <DataType>\n                    <Identifier>i=17</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdIn</Name>\n                  <DataType>\n                    <Identifier>i=18</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameIn</Name>\n                  <DataType>\n                    <Identifier>i=20</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextIn</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeIn</Name>\n                  <DataType>\n                    <Identifier>i=19</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10098</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringOut</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeOut</Name>\n                  <DataType>\n                    <Identifier>i=13</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidOut</Name>\n                  <DataType>\n                    <Identifier>i=14</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringOut</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementOut</Name>\n                  <DataType>\n                    <Identifier>i=16</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdOut</Name>\n                  <DataType>\n                    <Identifier>i=17</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdOut</Name>\n                  <DataType>\n                    <Identifier>i=18</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameOut</Name>\n                  <DataType>\n                    <Identifier>i=20</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextOut</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeOut</Name>\n                  <DataType>\n                    <Identifier>i=19</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10099</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarMethod3</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarMethod3</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10100</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10101</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10100</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10099</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantIn</Name>\n                  <DataType>\n                    <Identifier>i=24</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EnumerationIn</Name>\n                  <DataType>\n                    <Identifier>i=29</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StructureIn</Name>\n                  <DataType>\n                    <Identifier>i=22</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10101</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10099</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantOut</Name>\n                  <DataType>\n                    <Identifier>i=24</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EnumerationOut</Name>\n                  <DataType>\n                    <Identifier>i=29</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StructureOut</Name>\n                  <DataType>\n                    <Identifier>i=22</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10102</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayMethod1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayMethod1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10103</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10104</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10103</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10102</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanIn</Name>\n                  <DataType>\n                    <Identifier>i=1</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteIn</Name>\n                  <DataType>\n                    <Identifier>i=2</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteIn</Name>\n                  <DataType>\n                    <Identifier>i=3</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16In</Name>\n                  <DataType>\n                    <Identifier>i=4</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16In</Name>\n                  <DataType>\n                    <Identifier>i=5</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32In</Name>\n                  <DataType>\n                    <Identifier>i=6</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32In</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64In</Name>\n                  <DataType>\n                    <Identifier>i=8</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64In</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatIn</Name>\n                  <DataType>\n                    <Identifier>i=10</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleIn</Name>\n                  <DataType>\n                    <Identifier>i=11</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10104</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10102</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanOut</Name>\n                  <DataType>\n                    <Identifier>i=1</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteOut</Name>\n                  <DataType>\n                    <Identifier>i=2</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteOut</Name>\n                  <DataType>\n                    <Identifier>i=3</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16Out</Name>\n                  <DataType>\n                    <Identifier>i=4</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16Out</Name>\n                  <DataType>\n                    <Identifier>i=5</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32Out</Name>\n                  <DataType>\n                    <Identifier>i=6</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32Out</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64Out</Name>\n                  <DataType>\n                    <Identifier>i=8</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64Out</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatOut</Name>\n                  <DataType>\n                    <Identifier>i=10</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleOut</Name>\n                  <DataType>\n                    <Identifier>i=11</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10105</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayMethod2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayMethod2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10106</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10107</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10106</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10105</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringIn</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeIn</Name>\n                  <DataType>\n                    <Identifier>i=13</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidIn</Name>\n                  <DataType>\n                    <Identifier>i=14</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringIn</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementIn</Name>\n                  <DataType>\n                    <Identifier>i=16</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdIn</Name>\n                  <DataType>\n                    <Identifier>i=17</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdIn</Name>\n                  <DataType>\n                    <Identifier>i=18</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameIn</Name>\n                  <DataType>\n                    <Identifier>i=20</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextIn</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeIn</Name>\n                  <DataType>\n                    <Identifier>i=19</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10107</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10105</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringOut</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeOut</Name>\n                  <DataType>\n                    <Identifier>i=13</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidOut</Name>\n                  <DataType>\n                    <Identifier>i=14</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringOut</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementOut</Name>\n                  <DataType>\n                    <Identifier>i=16</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdOut</Name>\n                  <DataType>\n                    <Identifier>i=17</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdOut</Name>\n                  <DataType>\n                    <Identifier>i=18</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameOut</Name>\n                  <DataType>\n                    <Identifier>i=20</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextOut</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeOut</Name>\n                  <DataType>\n                    <Identifier>i=19</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10108</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayMethod3</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayMethod3</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10109</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10110</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10109</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10108</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantIn</Name>\n                  <DataType>\n                    <Identifier>i=24</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EnumerationIn</Name>\n                  <DataType>\n                    <Identifier>i=29</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StructureIn</Name>\n                  <DataType>\n                    <Identifier>i=22</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10110</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10108</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantOut</Name>\n                  <DataType>\n                    <Identifier>i=24</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EnumerationOut</Name>\n                  <DataType>\n                    <Identifier>i=29</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StructureOut</Name>\n                  <DataType>\n                    <Identifier>i=22</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10111</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalarMethod1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalarMethod1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10112</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10112</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10111</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9898</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9899</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9900</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9901</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9902</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9903</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9904</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9905</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9906</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9907</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9908</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9909</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10113</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10111</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9898</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9899</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9900</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9901</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9902</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9903</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9904</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9905</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9906</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9907</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9908</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9909</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10114</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalarMethod2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalarMethod2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10115</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10116</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10115</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10114</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9910</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9911</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9912</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9913</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9914</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9915</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9916</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9917</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9918</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9919</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10116</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10114</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9910</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9911</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9912</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9913</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9914</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9915</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9916</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9917</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9918</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9919</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10117</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArrayMethod1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArrayMethod1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10118</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10119</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10118</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9898</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9899</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9900</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9901</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9902</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9903</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9904</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9905</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9906</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9907</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9908</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9909</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10119</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9898</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9899</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9900</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9901</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9902</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9903</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9904</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9905</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9906</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9907</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9908</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9909</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10120</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArrayMethod2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArrayMethod2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10121</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10122</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10121</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10120</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9910</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9911</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9912</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9913</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9914</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9915</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9916</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9917</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9918</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9919</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10122</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10120</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9910</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9911</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9912</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9913</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9914</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9915</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9916</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9917</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9918</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9919</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10123</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TestSystemConditionType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TestSystemConditionType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2782</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10156</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10156</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MonitoredNodeCount</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MonitoredNodeCount</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10123</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10157</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Data</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Data</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=85</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=2253</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10158</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Static</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Static</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10157</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10157</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10159</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Scalar</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Scalar</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10160</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10161</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10216</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10217</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10218</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10219</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10220</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10221</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10222</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10223</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10224</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10225</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10226</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10227</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10228</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10229</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10230</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10231</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10232</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10233</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10234</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10235</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10236</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10237</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10238</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10239</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10240</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10241</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10160</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10161</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10162</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10162</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10161</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10163</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10164</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10165</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10166</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10167</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10168</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10169</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10171</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10172</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11594</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11595</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11565</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10173</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10174</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10175</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10181</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10185</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10187</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10189</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10191</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10190</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10192</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10196</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10212</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10164</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10165</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10166</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10167</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10168</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10169</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10171</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10172</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10173</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10174</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10175</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10196</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10204</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10176</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10176</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10175</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10181</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10182</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10182</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10181</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10185</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10186</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10186</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10185</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10187</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10188</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10188</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10187</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10189</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10190</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10191</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10192</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10193</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10193</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10192</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10196</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10175</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10197</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10197</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10196</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10212</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10213</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10213</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10212</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10216</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10217</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <SByte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</SByte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10218</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Byte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Byte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10219</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10220</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10221</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10222</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10223</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10224</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10225</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Float xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Float>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10226</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10227</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10228</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=13</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10229</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Guid xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <String>00000000-0000-0000-0000-000000000000</String>\n          </Guid>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=14</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10230</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10231</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=16</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10232</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10233</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ExpandedNodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </ExpandedNodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=18</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10234</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <QualifiedName xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <NamespaceIndex>0</NamespaceIndex>\n          </QualifiedName>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=20</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10235</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10236</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10237</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=24</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10238</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>EnumerationValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnumerationValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=29</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10239</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StructureValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StructureValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=22</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10240</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10241</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10242</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10159</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10243</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Array</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Array</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10244</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10245</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10300</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10301</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10302</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10303</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10304</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10305</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10306</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10307</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10308</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10309</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10310</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10311</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10312</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10313</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10314</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10315</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10316</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10317</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10318</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10319</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10320</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10321</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10322</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10323</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10324</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10325</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10326</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10244</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10245</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10246</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10246</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10245</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10247</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10249</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10250</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10253</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10255</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10256</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11596</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11597</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11566</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10257</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10258</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10259</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10269</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10271</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10273</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10275</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10274</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10276</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10280</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10296</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10248</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10249</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10250</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10251</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10252</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10253</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10255</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10256</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10257</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10258</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10259</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10280</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10288</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10260</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10260</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10259</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10265</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10266</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10266</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10269</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10270</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10270</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10269</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10271</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10272</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10272</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10271</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10273</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10274</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10275</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10276</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10277</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10277</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10276</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10280</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10259</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10281</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10280</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10296</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10297</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10297</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10296</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10300</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10301</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10302</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10303</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10304</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10305</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10306</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10307</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10308</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10309</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10310</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10311</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10312</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=13</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10313</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=14</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10314</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10315</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=16</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10316</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10317</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=18</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10318</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=20</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10319</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10320</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10321</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=24</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10322</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>EnumerationValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnumerationValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=29</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10323</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StructureValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StructureValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=22</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10324</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10325</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10326</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10243</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10327</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalar</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalar</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10328</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10329</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10385</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10386</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10388</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10389</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10390</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10391</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10392</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10393</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10394</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10395</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10396</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10397</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10398</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10399</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10400</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10401</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10402</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10403</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10404</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10405</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10328</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10329</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10330</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10330</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10329</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10331</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10332</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10333</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10334</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10335</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10336</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10337</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10339</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10340</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11598</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11599</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11567</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10342</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10343</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10349</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10353</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10355</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10357</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10359</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10358</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10360</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10364</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10380</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10332</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10333</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10334</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10335</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10336</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10337</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10339</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10340</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10341</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10342</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10343</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10364</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10372</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10344</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10344</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10343</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10349</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10350</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10350</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10349</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10353</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10354</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10354</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10353</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10355</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10356</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10356</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10355</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10357</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10358</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10359</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10360</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10361</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10361</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10360</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10364</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10343</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10365</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10365</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10364</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10380</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10381</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10381</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10380</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10384</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9898</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10385</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9899</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10386</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9900</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10387</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9901</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10388</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9902</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10389</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9903</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10390</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9904</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10391</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9905</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10392</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9906</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10393</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9907</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10394</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9908</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10395</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9909</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10396</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9910</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10397</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9911</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10398</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9912</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10399</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9913</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10400</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9914</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10401</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9915</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10402</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9916</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10403</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9917</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10404</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9918</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10405</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10327</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9919</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10406</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArray</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArray</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10407</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10463</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10464</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10465</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10466</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10467</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10468</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10469</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10470</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10471</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10472</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10473</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10474</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10475</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10476</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10477</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10478</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10479</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10480</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10481</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10482</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10483</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10484</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10407</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10408</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10409</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10409</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10410</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10411</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10412</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10413</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10414</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10415</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10416</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10418</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10419</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11600</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11601</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11568</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10420</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10421</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10428</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10432</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10434</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10436</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10438</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10437</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10439</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10443</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10459</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10411</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10412</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10413</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10414</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10415</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10416</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10418</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10419</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10420</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10421</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10422</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10443</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10451</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10423</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10423</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10428</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10429</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10429</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10428</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10432</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10433</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10433</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10432</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10434</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10435</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10435</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10434</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10436</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10437</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10438</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10439</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10440</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10440</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10439</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10443</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10444</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10444</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10443</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10459</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10460</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10460</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10459</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10463</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9898</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10464</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9899</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10465</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9900</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10466</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9901</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10467</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9902</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10468</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9903</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10469</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9904</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10470</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9905</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10471</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9906</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10472</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9907</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10473</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9908</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10474</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9909</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10475</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9910</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10476</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9911</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10477</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9912</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10478</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9913</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10479</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9914</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10480</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9915</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10481</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9916</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10482</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9917</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10483</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9918</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10484</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9919</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10485</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AnalogScalar</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AnalogScalar</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10486</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10487</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10542</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10548</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10554</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10560</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10566</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10572</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10578</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10584</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10590</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10596</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10602</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10608</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10614</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10486</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10487</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10488</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10488</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10487</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10489</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10490</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10491</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10492</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10493</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10494</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10495</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10497</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10498</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11602</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11603</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11569</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10499</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10500</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10501</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10507</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10511</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10515</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10517</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10516</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10518</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10522</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10538</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10490</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10491</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10492</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10493</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10494</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10495</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10497</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10498</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10499</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10500</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10501</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10522</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10530</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10502</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10502</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10501</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10507</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10508</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10508</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10507</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10511</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10512</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10512</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10511</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10513</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10514</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10514</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10513</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10515</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10516</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10517</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10518</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10519</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10519</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10518</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10522</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10501</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10523</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10523</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10522</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10538</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10539</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10539</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10538</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10542</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10545</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <SByte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</SByte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10545</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10542</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10548</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10551</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Byte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Byte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10551</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10548</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10554</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10557</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10557</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10554</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10560</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10563</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10563</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10560</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10566</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10569</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10569</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10566</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10572</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10575</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10575</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10572</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10578</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10581</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10581</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10578</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10584</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10587</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10587</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10584</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10590</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10593</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Float xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Float>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10593</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10590</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10596</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10599</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10599</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10596</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10602</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10605</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10605</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10602</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10608</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10611</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10611</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10608</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10614</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10485</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10617</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10617</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10614</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10620</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AnalogArray</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AnalogArray</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10621</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10622</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10677</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10683</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10689</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10695</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10701</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10707</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10713</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10719</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10725</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10731</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10737</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10743</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10749</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10621</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10622</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10623</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10623</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10622</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10624</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10625</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10626</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10627</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10628</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10629</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10630</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10632</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10633</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11604</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11605</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11570</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10634</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10635</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10636</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10642</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10646</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10648</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10650</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10652</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10651</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10653</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10657</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10673</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10625</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10626</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10627</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10628</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10629</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10630</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10632</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10633</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10634</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10635</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10636</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10657</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10665</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10637</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10637</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10636</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10642</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10643</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10643</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10642</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10646</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10647</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10647</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10646</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10648</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10649</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10649</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10648</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10650</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10651</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10652</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10653</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10654</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10654</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10653</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10657</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10636</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10658</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10658</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10657</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10673</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10674</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10674</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10673</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10677</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10680</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10680</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10677</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10683</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10686</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10686</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10683</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10689</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10692</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10692</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10689</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10695</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10698</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10698</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10695</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10701</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10704</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10704</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10701</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10707</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10710</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10710</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10707</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10713</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10716</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10716</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10713</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10719</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10722</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10722</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10719</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10725</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10728</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10728</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10725</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10731</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10734</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10734</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10731</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10737</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10740</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10740</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10737</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10743</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10746</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10746</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10743</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10749</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10620</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10752</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10752</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10749</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10755</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MethodTest</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MethodTest</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10756</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10759</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10762</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10765</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10768</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10771</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10774</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10777</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10780</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10783</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10756</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarMethod1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarMethod1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10757</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10758</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10757</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10756</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanIn</Name>\n                  <DataType>\n                    <Identifier>i=1</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteIn</Name>\n                  <DataType>\n                    <Identifier>i=2</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteIn</Name>\n                  <DataType>\n                    <Identifier>i=3</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16In</Name>\n                  <DataType>\n                    <Identifier>i=4</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16In</Name>\n                  <DataType>\n                    <Identifier>i=5</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32In</Name>\n                  <DataType>\n                    <Identifier>i=6</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32In</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64In</Name>\n                  <DataType>\n                    <Identifier>i=8</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64In</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatIn</Name>\n                  <DataType>\n                    <Identifier>i=10</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleIn</Name>\n                  <DataType>\n                    <Identifier>i=11</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10758</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10756</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanOut</Name>\n                  <DataType>\n                    <Identifier>i=1</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteOut</Name>\n                  <DataType>\n                    <Identifier>i=2</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteOut</Name>\n                  <DataType>\n                    <Identifier>i=3</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16Out</Name>\n                  <DataType>\n                    <Identifier>i=4</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16Out</Name>\n                  <DataType>\n                    <Identifier>i=5</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32Out</Name>\n                  <DataType>\n                    <Identifier>i=6</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32Out</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64Out</Name>\n                  <DataType>\n                    <Identifier>i=8</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64Out</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatOut</Name>\n                  <DataType>\n                    <Identifier>i=10</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleOut</Name>\n                  <DataType>\n                    <Identifier>i=11</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10759</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarMethod2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarMethod2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10760</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10761</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10760</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10759</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringIn</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeIn</Name>\n                  <DataType>\n                    <Identifier>i=13</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidIn</Name>\n                  <DataType>\n                    <Identifier>i=14</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringIn</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementIn</Name>\n                  <DataType>\n                    <Identifier>i=16</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdIn</Name>\n                  <DataType>\n                    <Identifier>i=17</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdIn</Name>\n                  <DataType>\n                    <Identifier>i=18</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameIn</Name>\n                  <DataType>\n                    <Identifier>i=20</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextIn</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeIn</Name>\n                  <DataType>\n                    <Identifier>i=19</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10761</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10759</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringOut</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeOut</Name>\n                  <DataType>\n                    <Identifier>i=13</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidOut</Name>\n                  <DataType>\n                    <Identifier>i=14</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringOut</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementOut</Name>\n                  <DataType>\n                    <Identifier>i=16</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdOut</Name>\n                  <DataType>\n                    <Identifier>i=17</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdOut</Name>\n                  <DataType>\n                    <Identifier>i=18</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameOut</Name>\n                  <DataType>\n                    <Identifier>i=20</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextOut</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeOut</Name>\n                  <DataType>\n                    <Identifier>i=19</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10762</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarMethod3</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarMethod3</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10764</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10763</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10762</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantIn</Name>\n                  <DataType>\n                    <Identifier>i=24</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EnumerationIn</Name>\n                  <DataType>\n                    <Identifier>i=29</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StructureIn</Name>\n                  <DataType>\n                    <Identifier>i=22</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10764</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10762</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantOut</Name>\n                  <DataType>\n                    <Identifier>i=24</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EnumerationOut</Name>\n                  <DataType>\n                    <Identifier>i=29</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StructureOut</Name>\n                  <DataType>\n                    <Identifier>i=22</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10765</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayMethod1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayMethod1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10766</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10767</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10766</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10765</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanIn</Name>\n                  <DataType>\n                    <Identifier>i=1</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteIn</Name>\n                  <DataType>\n                    <Identifier>i=2</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteIn</Name>\n                  <DataType>\n                    <Identifier>i=3</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16In</Name>\n                  <DataType>\n                    <Identifier>i=4</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16In</Name>\n                  <DataType>\n                    <Identifier>i=5</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32In</Name>\n                  <DataType>\n                    <Identifier>i=6</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32In</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64In</Name>\n                  <DataType>\n                    <Identifier>i=8</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64In</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatIn</Name>\n                  <DataType>\n                    <Identifier>i=10</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleIn</Name>\n                  <DataType>\n                    <Identifier>i=11</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10767</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10765</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanOut</Name>\n                  <DataType>\n                    <Identifier>i=1</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteOut</Name>\n                  <DataType>\n                    <Identifier>i=2</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteOut</Name>\n                  <DataType>\n                    <Identifier>i=3</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16Out</Name>\n                  <DataType>\n                    <Identifier>i=4</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16Out</Name>\n                  <DataType>\n                    <Identifier>i=5</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32Out</Name>\n                  <DataType>\n                    <Identifier>i=6</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32Out</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64Out</Name>\n                  <DataType>\n                    <Identifier>i=8</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64Out</Name>\n                  <DataType>\n                    <Identifier>i=9</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatOut</Name>\n                  <DataType>\n                    <Identifier>i=10</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleOut</Name>\n                  <DataType>\n                    <Identifier>i=11</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10768</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayMethod2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayMethod2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10769</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10770</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10769</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10768</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringIn</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeIn</Name>\n                  <DataType>\n                    <Identifier>i=13</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidIn</Name>\n                  <DataType>\n                    <Identifier>i=14</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringIn</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementIn</Name>\n                  <DataType>\n                    <Identifier>i=16</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdIn</Name>\n                  <DataType>\n                    <Identifier>i=17</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdIn</Name>\n                  <DataType>\n                    <Identifier>i=18</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameIn</Name>\n                  <DataType>\n                    <Identifier>i=20</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextIn</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeIn</Name>\n                  <DataType>\n                    <Identifier>i=19</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10770</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10768</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringOut</Name>\n                  <DataType>\n                    <Identifier>i=12</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeOut</Name>\n                  <DataType>\n                    <Identifier>i=13</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidOut</Name>\n                  <DataType>\n                    <Identifier>i=14</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringOut</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementOut</Name>\n                  <DataType>\n                    <Identifier>i=16</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdOut</Name>\n                  <DataType>\n                    <Identifier>i=17</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdOut</Name>\n                  <DataType>\n                    <Identifier>i=18</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameOut</Name>\n                  <DataType>\n                    <Identifier>i=20</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextOut</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeOut</Name>\n                  <DataType>\n                    <Identifier>i=19</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10771</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayMethod3</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayMethod3</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10772</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10773</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10772</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10771</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantIn</Name>\n                  <DataType>\n                    <Identifier>i=24</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EnumerationIn</Name>\n                  <DataType>\n                    <Identifier>i=29</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StructureIn</Name>\n                  <DataType>\n                    <Identifier>i=22</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10773</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10771</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantOut</Name>\n                  <DataType>\n                    <Identifier>i=24</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EnumerationOut</Name>\n                  <DataType>\n                    <Identifier>i=29</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StructureOut</Name>\n                  <DataType>\n                    <Identifier>i=22</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10774</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalarMethod1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalarMethod1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10775</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10776</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10775</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10774</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9898</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9899</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9900</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9901</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9902</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9903</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9904</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9905</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9906</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9907</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9908</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9909</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10776</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10774</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9898</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9899</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9900</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9901</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9902</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9903</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9904</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9905</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9906</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9907</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9908</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9909</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10777</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalarMethod2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalarMethod2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10778</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10779</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10778</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10777</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9910</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9911</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9912</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9913</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9914</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9915</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9916</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9917</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9918</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9919</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10779</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10777</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9910</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9911</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9912</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9913</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9914</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9915</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9916</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9917</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9918</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9919</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10780</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArrayMethod1</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArrayMethod1</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10781</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10782</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10781</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10780</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9898</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9899</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9900</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9901</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9902</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9903</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9904</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9905</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64In</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9906</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9907</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9908</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9909</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10782</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10780</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>BooleanOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9898</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>SByteOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9899</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9900</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int16Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9901</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt16Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9902</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int32Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9903</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt32Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9904</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Int64Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9905</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>UInt64Out</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9906</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>FloatOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9907</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DoubleOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9908</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StringOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9909</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10783</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArrayMethod2</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArrayMethod2</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10755</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10784</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10785</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10784</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10783</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9910</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9911</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9912</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9913</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9914</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9915</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9916</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9917</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9918</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantIn</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9919</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10785</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>OutputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OutputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10783</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>DateTimeOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9910</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>GuidOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9911</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ByteStringOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9912</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>XmlElementOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9913</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>NodeIdOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9914</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>ExpandedNodeIdOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9915</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>QualifiedNameOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9916</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>LocalizedTextOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9917</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>StatusCodeOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9918</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>VariantOut</Name>\n                  <DataType>\n                    <Identifier>ns=1;i=9919</Identifier>\n                  </DataType>\n                  <ValueRank>1</ValueRank>\n                  <ArrayDimensions>\n                    <UInt32>0</UInt32>\n                  </ArrayDimensions>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10786</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Dynamic</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Dynamic</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10157</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=48</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10157</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10787</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Scalar</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Scalar</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10788</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10789</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10844</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10845</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10846</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10847</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10848</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10849</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10850</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10851</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10852</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10853</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10854</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10855</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10856</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10857</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10858</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10859</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10860</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10861</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10862</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10863</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10864</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10865</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10866</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10867</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10868</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10869</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10870</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10788</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10789</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10790</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10790</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10789</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10791</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10792</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10793</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10794</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10795</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10796</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10797</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10799</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10800</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11606</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11607</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11571</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10801</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10802</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10809</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10813</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10815</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10817</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10819</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10818</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10820</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10824</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10840</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10792</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10793</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10794</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10795</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10796</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10797</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10799</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10800</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10801</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10802</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10803</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10824</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10832</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10804</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10804</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10809</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10810</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10810</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10809</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10813</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10814</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10814</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10813</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10815</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10816</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10816</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10815</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10817</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10818</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10819</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10820</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10821</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10821</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10820</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10824</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10825</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10825</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10824</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10840</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10841</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10841</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10840</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10844</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10845</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <SByte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</SByte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10846</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Byte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Byte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10847</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10848</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10849</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10850</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10851</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10852</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10853</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Float xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Float>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10854</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10855</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10856</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=13</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10857</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Guid xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <String>00000000-0000-0000-0000-000000000000</String>\n          </Guid>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=14</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10858</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10859</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=16</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10860</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10861</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ExpandedNodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </ExpandedNodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=18</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10862</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <QualifiedName xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <NamespaceIndex>0</NamespaceIndex>\n          </QualifiedName>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=20</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10863</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10864</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10865</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=24</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10866</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>EnumerationValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnumerationValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=29</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10867</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StructureValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StructureValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=22</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10868</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10869</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10870</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10787</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10871</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Array</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Array</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9679</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10872</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10873</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10928</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10929</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10930</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10931</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10932</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10933</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10934</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10935</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10936</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10937</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10938</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10939</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10940</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10941</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10942</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10943</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10945</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10946</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10947</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10948</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10949</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10950</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10951</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10952</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10953</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10954</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10872</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10873</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10874</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10874</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10873</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10875</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10876</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10877</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10878</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10879</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10880</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10883</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10884</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11608</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11609</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11572</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10885</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10886</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10887</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10893</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10897</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10899</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10901</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10903</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10902</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10904</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10908</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10924</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10876</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10877</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10878</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10879</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10880</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10881</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10883</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10884</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10885</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10886</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10887</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10908</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10916</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10888</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10888</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10887</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10893</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10894</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10894</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10893</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10897</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10898</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10898</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10897</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10899</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10900</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10900</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10899</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10901</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10902</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10903</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10904</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10905</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10905</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10904</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10908</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10887</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10909</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10909</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10908</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10924</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10925</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10925</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10924</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10928</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10929</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10930</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10931</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10932</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10933</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10934</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10935</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10936</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10937</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10938</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10939</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10940</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=13</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10941</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=14</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10942</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10943</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=16</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10944</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10945</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=18</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10946</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=20</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10947</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10948</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10949</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=24</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10950</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>EnumerationValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnumerationValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=29</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10951</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StructureValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StructureValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=22</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10952</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10953</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10954</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10871</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10955</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalar</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalar</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9921</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10956</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10957</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11012</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11013</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11014</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11016</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11017</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11018</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11019</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11020</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11021</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11022</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11023</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11024</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11025</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11026</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11027</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11028</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11029</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11030</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11031</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11032</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11033</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10956</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10957</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10958</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10958</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10957</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10959</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10960</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10961</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10962</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10963</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10964</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10965</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10967</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10968</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11610</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11611</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11573</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10969</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10970</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10971</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10977</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10981</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10983</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10985</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10987</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10986</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10988</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10992</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10960</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10961</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10962</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10963</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10964</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10965</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10967</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10968</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10969</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10970</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10971</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10992</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11000</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10972</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10972</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10971</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10977</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10978</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10978</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10977</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10981</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10982</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10982</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10981</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10983</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10984</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10984</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10983</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10985</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10986</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10987</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10988</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10989</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10989</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10988</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10992</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10971</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10993</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=10993</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10992</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11008</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11009</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11009</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11008</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11012</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9898</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11013</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9899</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11014</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9900</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11015</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9901</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11016</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9902</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11017</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9903</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11018</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9904</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11019</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9905</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11020</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9906</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11021</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9907</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11022</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9908</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11023</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9909</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11024</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9910</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11025</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9911</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11026</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9912</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11027</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9913</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11028</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9914</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11029</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9915</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11030</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9916</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11031</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9917</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11032</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9918</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11033</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10955</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9919</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11034</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArray</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArray</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10007</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11035</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11091</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11092</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11093</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11094</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11095</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11096</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11097</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11098</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11099</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11100</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11101</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11102</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11103</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11104</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11105</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11106</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11107</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11108</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11109</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11110</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11111</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11112</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11035</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11036</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11037</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11037</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11036</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11038</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11039</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11040</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11041</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11042</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11043</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11044</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11047</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11612</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11613</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11574</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11048</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11049</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11056</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11060</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11062</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11064</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11066</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11065</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11039</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11040</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11041</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11042</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11043</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11044</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11046</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11047</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11048</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11049</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11050</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11079</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11051</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11051</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11056</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11057</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11057</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11056</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11060</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11061</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11061</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11060</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11062</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11063</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11063</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11062</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11064</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11065</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11066</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11067</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11068</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11068</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11067</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11071</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11050</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11072</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11072</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11071</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11087</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11088</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11088</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11087</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11091</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BooleanValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BooleanValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9898</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11092</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9899</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11093</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9900</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11094</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9901</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11095</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9902</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11096</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9903</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11097</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9904</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11098</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9905</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11099</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9906</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11100</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9907</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11101</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9908</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11102</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9909</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11103</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DateTimeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DateTimeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9910</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11104</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GuidValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GuidValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9911</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11105</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteStringValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteStringValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9912</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11106</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>XmlElementValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>XmlElementValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9913</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11107</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9914</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11108</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ExpandedNodeIdValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ExpandedNodeIdValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9915</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11109</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>QualifiedNameValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>QualifiedNameValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9916</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11110</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LocalizedTextValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LocalizedTextValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9917</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11111</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>StatusCodeValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>StatusCodeValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9918</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11112</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VariantValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VariantValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11034</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=9919</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11113</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AnalogScalar</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AnalogScalar</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9534</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11114</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11115</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11170</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11176</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11182</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11188</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11194</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11200</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11206</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11212</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11218</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11224</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11230</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11236</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11114</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11115</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11116</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11116</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11115</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11117</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11118</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11119</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11120</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11121</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11122</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11123</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11125</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11126</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11614</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11615</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11575</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11127</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11128</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11129</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11135</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11139</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11141</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11143</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11145</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11144</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11146</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11150</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11166</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11118</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11119</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11120</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11121</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11122</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11123</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11125</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11126</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11127</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11128</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11129</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11150</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11158</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11130</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11130</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11129</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11135</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11136</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11136</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11135</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11139</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11140</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11140</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11139</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11141</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11142</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11142</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11141</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11143</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11144</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11145</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11146</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11147</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11147</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11146</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11150</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11129</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11151</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11151</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11150</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11166</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11167</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11167</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11166</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11170</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11173</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <SByte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</SByte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11173</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11170</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11176</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11179</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Byte xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Byte>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11179</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11176</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11182</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11185</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11185</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11182</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11188</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11191</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11191</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11188</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11194</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11197</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11197</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11194</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11200</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11203</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11203</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11200</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11206</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11209</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11209</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11206</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11212</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11215</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11215</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11212</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11218</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11221</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Float xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Float>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11221</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11218</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11224</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11227</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11227</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11224</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11230</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11233</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11233</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11230</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11236</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11239</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11239</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11236</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11242</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11113</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11245</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt64 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt64>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11245</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11242</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11248</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>AnalogArray</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AnalogArray</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10786</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9763</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11249</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11250</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11305</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11311</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11317</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11323</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11329</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11335</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11347</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11353</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11359</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11365</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11371</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11377</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11249</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SimulationActive</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SimulationActive</Text>\n      </DisplayName>\n      <Description>\n        <Locale></Locale>\n        <Text>If true the server will produce new values for each monitored variable.</Text>\n      </Description>\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11250</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenerateValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenerateValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11251</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11251</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11250</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Iterations</Name>\n                  <DataType>\n                    <Identifier>i=7</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The number of new values to generate.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11252</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CycleComplete</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CycleComplete</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2881</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11253</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11254</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11255</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11256</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11257</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11258</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11260</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11261</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11616</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11617</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11576</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11262</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11263</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11264</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11270</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11274</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11276</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11278</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11280</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11279</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11285</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11301</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11253</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11254</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11255</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11256</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11257</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11258</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11260</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11261</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11262</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11263</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11264</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11285</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11293</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11265</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11265</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11264</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11270</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11271</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11271</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11270</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11274</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11275</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11275</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11274</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11276</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11277</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11277</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11276</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11278</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11279</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11280</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11281</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11282</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11282</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11285</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AckedState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AckedState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=9004</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11264</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11286</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11286</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11285</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11301</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Acknowledge</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Acknowledge</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8944</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11302</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11302</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11301</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11305</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11308</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=2</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11308</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11305</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11311</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ByteValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ByteValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11314</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=3</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11314</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11311</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11317</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11320</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=4</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11320</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11317</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11323</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt16Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt16Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11326</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11326</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11323</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11329</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11332</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11332</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11329</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11335</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt32Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt32Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11338</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11338</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11335</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11341</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Int64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Int64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11344</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=8</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11344</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11347</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UInt64Value</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UInt64Value</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11350</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=9</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11350</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11347</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11353</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FloatValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FloatValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11356</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=10</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11356</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11353</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11359</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DoubleValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DoubleValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11362</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11362</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11359</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11365</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>NumberValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NumberValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=26</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11368</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11365</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11371</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>IntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>IntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11374</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=27</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11374</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11371</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11377</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UIntegerValue</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UIntegerValue</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11248</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11380</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=28</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11380</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11377</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11383</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Conditions</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Conditions</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10157</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>1</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11384</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SystemStatus</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SystemStatus</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10123</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=36</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11383</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11385</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11386</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11388</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11389</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11390</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11392</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11393</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11618</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11619</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11577</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11394</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11395</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11396</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11402</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11412</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11411</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11413</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11417</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11385</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11386</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EventType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EventType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11387</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceNode</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceNode</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11388</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11389</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Time</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Time</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11390</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ReceiveTime</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ReceiveTime</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11392</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Message</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Message</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11393</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Severity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Severity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11394</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>BranchId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BranchId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11395</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Retain</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Retain</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11396</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnabledState</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnabledState</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=8995</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11397</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11397</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Id</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Id</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11396</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">false</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11402</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Quality</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Quality</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11403</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <StatusCode xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Code>0</Code>\n          </StatusCode>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=19</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11403</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11402</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11406</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>LastSeverity</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LastSeverity</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11407</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <UInt16 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</UInt16>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=5</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11407</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11406</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11408</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Comment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Comment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=9002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11409</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11409</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>SourceTimestamp</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SourceTimestamp</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <DateTime xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0001-01-01T00:00:00</DateTime>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=294</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11410</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ClientUserId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ClientUserId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11411</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Enable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Enable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11412</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Disable</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Disable</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2803</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"MethodNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11413</Identifier>\n      </NodeId>\n      <NodeClass>Method_4</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>AddComment</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>AddComment</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=3065</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2829</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11414</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Executable>true</Executable>\n      <UserExecutable>true</UserExecutable>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11414</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>InputArguments</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>InputArguments</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11413</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>EventId</Name>\n                  <DataType>\n                    <Identifier>i=15</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The identifier for the event to comment.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=297</Identifier>\n              </TypeId>\n              <Body>\n                <Argument>\n                  <Name>Comment</Name>\n                  <DataType>\n                    <Identifier>i=21</Identifier>\n                  </DataType>\n                  <ValueRank>-1</ValueRank>\n                  <ArrayDimensions />\n                  <Description>\n                    <Text>The comment to add to the condition.</Text>\n                  </Description>\n                </Argument>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=296</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11417</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>MonitoredNodeCount</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>MonitoredNodeCount</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Int32 xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Int32>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=6</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11418</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9440</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11444</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11419</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9669</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11447</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11420</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9920</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11421</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11453</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11422</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TestData</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TestData</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=93</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11424</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15045</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11425</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11428</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11431</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11434</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=1015</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=24</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=27</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS8iDQogIERlZmF1bHRCeXRl\nT3JkZXI9IkxpdHRsZUVuZGlhbiINCiAgVGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdC5vcmcv\nVUEvRGF0YS8iDQo+DQogIDxvcGM6SW1wb3J0IE5hbWVzcGFjZT0iaHR0cDovL29wY2ZvdW5kYXRp\nb24ub3JnL1VBLyIgTG9jYXRpb249Ik9wYy5VYS5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9w\nYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJTY2FsYXJWYWx1ZURhdGFUeXBlIiBCYXNlVHlwZT0idWE6\nRXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJvb2xlYW5WYWx1ZSIgVHlw\nZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpTQnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJ5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW50MTZWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVJbnQxNlZhbHVl\nIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDMyVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJW\nYWx1ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2\nNFZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUlu\ndDY0VmFsdWUiIFR5cGVOYW1lPSJvcGM6VUludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nRmxvYXRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpGbG9hdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIkRvdWJsZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlN0cmluZ1ZhbHVlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IkRhdGVUaW1lVmFsdWUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJHdWlkVmFsdWUiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAv\nPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudFZhbHVlIiBUeXBlTmFtZT0idWE6WG1s\nRWxlbWVudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZFZhbHVlIiBUeXBlTmFtZT0i\ndWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIg\nVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUXVh\nbGlmaWVkTmFtZVZhbHVlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkxvY2FsaXplZFRleHRWYWx1ZSIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRl\neHQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJ1\nYTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFudFZhbHVlIiBUeXBl\nTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkVudW1lcmF0aW9uVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdHJ1Y3R1\ncmVWYWx1ZSIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9iamVjdCIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik51bWJlciIgVHlwZU5hbWU9InVhOlZhcmlhbnQiIC8+DQogICAgPG9wYzpGaWVsZCBO\nYW1lPSJJbnRlZ2VyIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlVJbnRlZ2VyIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgPC9vcGM6U3RydWN0dXJl\nZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJBcnJheVZhbHVlRGF0YVR5cGUi\nIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P\nZkJvb2xlYW5WYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IkJvb2xlYW5WYWx1ZSIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiBMZW5ndGhGaWVsZD0iTm9P\nZkJvb2xlYW5WYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTQnl0ZVZhbHVlIiBU\neXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpTQnl0ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTQnl0ZVZhbHVlIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iTm9PZkJ5dGVWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4N\nCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJ5dGVWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlIiBMZW5n\ndGhGaWVsZD0iTm9PZkJ5dGVWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZJbnQx\nNlZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW50\nMTZWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQxNiIgTGVuZ3RoRmllbGQ9Ik5vT2ZJbnQxNlZhbHVl\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlVJbnQxNlZhbHVlIiBUeXBlTmFtZT0ib3Bj\nOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDE2VmFsdWUiIFR5cGVOYW1lPSJv\ncGM6VUludDE2IiBMZW5ndGhGaWVsZD0iTm9PZlVJbnQxNlZhbHVlIiAvPg0KICAgIDxvcGM6Rmll\nbGQgTmFtZT0iTm9PZkludDMyVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJJbnQzMlZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiBMZW5ndGhGaWVs\nZD0iTm9PZkludDMyVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludDMyVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJW\nYWx1ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIExlbmd0aEZpZWxkPSJOb09mVUludDMyVmFsdWUi\nIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mSW50NjRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJ\nbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDY0VmFsdWUiIFR5cGVOYW1lPSJvcGM6\nSW50NjQiIExlbmd0aEZpZWxkPSJOb09mSW50NjRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZVSW50NjRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZp\nZWxkIE5hbWU9IlVJbnQ2NFZhbHVlIiBUeXBlTmFtZT0ib3BjOlVJbnQ2NCIgTGVuZ3RoRmllbGQ9\nIk5vT2ZVSW50NjRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZGbG9hdFZhbHVl\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRmxvYXRWYWx1\nZSIgVHlwZU5hbWU9Im9wYzpGbG9hdCIgTGVuZ3RoRmllbGQ9Ik5vT2ZGbG9hdFZhbHVlIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRvdWJsZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMy\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRG91YmxlVmFsdWUiIFR5cGVOYW1lPSJvcGM6RG91\nYmxlIiBMZW5ndGhGaWVsZD0iTm9PZkRvdWJsZVZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iTm9PZlN0cmluZ1ZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6Rmll\nbGQgTmFtZT0iU3RyaW5nVmFsdWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5ndGhGaWVsZD0i\nTm9PZlN0cmluZ1ZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRhdGVUaW1lVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRlVGlt\nZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiBMZW5ndGhGaWVsZD0iTm9PZkRhdGVUaW1l\nVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mR3VpZFZhbHVlIiBUeXBlTmFtZT0i\nb3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iR3VpZFZhbHVlIiBUeXBlTmFtZT0i\nb3BjOkd1aWQiIExlbmd0aEZpZWxkPSJOb09mR3VpZFZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iTm9PZkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5n\nIiBMZW5ndGhGaWVsZD0iTm9PZkJ5dGVTdHJpbmdWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZYbWxFbGVtZW50VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJYbWxFbGVtZW50VmFsdWUiIFR5cGVOYW1lPSJ1YTpYbWxFbGVtZW50IiBM\nZW5ndGhGaWVsZD0iTm9PZlhtbEVsZW1lbnRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIk5vT2ZOb2RlSWRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5vZGVJZFZhbHVlIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBMZW5ndGhGaWVsZD0iTm9P\nZk5vZGVJZFZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkV4cGFuZGVkTm9kZUlk\nVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFeHBh\nbmRlZE5vZGVJZFZhbHVlIiBUeXBlTmFtZT0idWE6RXhwYW5kZWROb2RlSWQiIExlbmd0aEZpZWxk\nPSJOb09mRXhwYW5kZWROb2RlSWRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZR\ndWFsaWZpZWROYW1lVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJRdWFsaWZpZWROYW1lVmFsdWUiIFR5cGVOYW1lPSJ1YTpRdWFsaWZpZWROYW1lIiBM\nZW5ndGhGaWVsZD0iTm9PZlF1YWxpZmllZE5hbWVWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZMb2NhbGl6ZWRUZXh0VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJMb2NhbGl6ZWRUZXh0VmFsdWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6\nZWRUZXh0IiBMZW5ndGhGaWVsZD0iTm9PZkxvY2FsaXplZFRleHRWYWx1ZSIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9Ik5vT2ZTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJ1YTpTdGF0\ndXNDb2RlIiBMZW5ndGhGaWVsZD0iTm9PZlN0YXR1c0NvZGVWYWx1ZSIgLz4NCiAgICA8b3BjOkZp\nZWxkIE5hbWU9Ik5vT2ZWYXJpYW50VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJWYXJpYW50VmFsdWUiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5n\ndGhGaWVsZD0iTm9PZlZhcmlhbnRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZF\nbnVtZXJhdGlvblZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iRW51bWVyYXRpb25WYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTGVuZ3RoRmllbGQ9\nIk5vT2ZFbnVtZXJhdGlvblZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlN0cnVj\ndHVyZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nU3RydWN0dXJlVmFsdWUiIFR5cGVOYW1lPSJ1YTpFeHRlbnNpb25PYmplY3QiIExlbmd0aEZpZWxk\nPSJOb09mU3RydWN0dXJlVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTnVtYmVy\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTnVtYmVyIiBU\neXBlTmFtZT0idWE6VmFyaWFudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZOdW1iZXIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJOb09mSW50ZWdlciIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IkludGVnZXIiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5ndGhGaWVs\nZD0iTm9PZkludGVnZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludGVnZXIiIFR5\ncGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50ZWdlciIgVHlw\nZU5hbWU9InVhOlZhcmlhbnQiIExlbmd0aEZpZWxkPSJOb09mVUludGVnZXIiIC8+DQogIDwvb3Bj\nOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1lPSJCb29sZWFuRGF0YVR5\ncGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1lPSJTQnl0\nZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFt\nZT0iQnl0ZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5\ncGUgTmFtZT0iSW50MTZEYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpP\ncGFxdWVUeXBlIE5hbWU9IlVJbnQxNkRhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0K\nICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iSW50MzJEYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5\ncGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IlVJbnQzMkRhdGFUeXBlIj4NCiAgPC9vcGM6\nT3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iSW50NjREYXRhVHlwZSI+DQog\nIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IlVJbnQ2NERhdGFU\neXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iRmxv\nYXREYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5h\nbWU9IkRvdWJsZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1\nZVR5cGUgTmFtZT0iU3RyaW5nRGF0YVR5cGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxv\ncGM6T3BhcXVlVHlwZSBOYW1lPSJEYXRlVGltZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlw\nZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iR3VpZERhdGFUeXBlIj4NCiAgPC9vcGM6T3Bh\ncXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iQnl0ZVN0cmluZ0RhdGFUeXBlIj4N\nCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iWG1sRWxlbWVu\ndERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFt\nZT0iTm9kZUlkRGF0YVR5cGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVl\nVHlwZSBOYW1lPSJFeHBhbmRlZE5vZGVJZERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4N\nCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIj4NCiAgPC9v\ncGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iTG9jYWxpemVkVGV4dERh\ndGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0i\nU3RhdHVzQ29kZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1\nZVR5cGUgTmFtZT0iVmFyaWFudERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8\nb3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlVzZXJTY2FsYXJWYWx1ZURhdGFUeXBlIiBCYXNlVHlw\nZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJvb2xlYW5EYXRh\nVHlwZSIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5\ndGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpTQnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIkJ5dGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IlVJbnQxNkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkludDMyRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2NERhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDY0\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDY0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nVUludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRmxvYXREYXRhVHlwZSIgVHlwZU5hbWU9\nIm9wYzpGbG9hdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRvdWJsZURhdGFUeXBlIiBUeXBl\nTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0cmluZ0RhdGFUeXBl\nIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGVUaW1l\nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l\nPSJHdWlkRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IkJ5dGVTdHJpbmdEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudERhdGFUeXBlIiBUeXBlTmFtZT0idWE6WG1sRWxl\nbWVudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZERhdGFUeXBlIiBUeXBlTmFtZT0i\ndWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWREYXRhVHlw\nZSIgVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nUXVhbGlmaWVkTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgVHlwZU5hbWU9InVhOkxv\nY2FsaXplZFRleHQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlRGF0YVR5cGUi\nIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFu\ndERhdGFUeXBlIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5\ncGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJVc2VyQXJyYXlWYWx1ZURhdGFUeXBl\nIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZCb29sZWFuRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJCb29sZWFuRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgTGVuZ3RoRmll\nbGQ9Ik5vT2ZCb29sZWFuRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU0J5\ndGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIlNCeXRlRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6U0J5dGUiIExlbmd0aEZpZWxkPSJOb09mU0J5\ndGVEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZCeXRlRGF0YVR5cGUiIFR5\ncGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCeXRlRGF0YVR5cGUi\nIFR5cGVOYW1lPSJvcGM6Qnl0ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZCeXRlRGF0YVR5cGUiIC8+DQog\nICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQz\nMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDE2RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nSW50MTYiIExlbmd0aEZpZWxkPSJOb09mSW50MTZEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5vT2ZVSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IlVJbnQxNkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgTGVu\nZ3RoRmllbGQ9Ik5vT2ZVSW50MTZEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZJbnQzMkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iSW50MzJEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTGVuZ3RoRmllbGQ9Ik5v\nT2ZJbnQzMkRhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlVJbnQzMkRhdGFU\neXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDMy\nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiBMZW5ndGhGaWVsZD0iTm9PZlVJbnQzMkRh\ndGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkludDY0RGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2NERhdGFUeXBlIiBU\neXBlTmFtZT0ib3BjOkludDY0IiBMZW5ndGhGaWVsZD0iTm9PZkludDY0RGF0YVR5cGUiIC8+DQog\nICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludDY0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50\nMzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50NjREYXRhVHlwZSIgVHlwZU5hbWU9Im9w\nYzpVSW50NjQiIExlbmd0aEZpZWxkPSJOb09mVUludDY0RGF0YVR5cGUiIC8+DQogICAgPG9wYzpG\naWVsZCBOYW1lPSJOb09mRmxvYXREYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkZsb2F0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6RmxvYXQiIExl\nbmd0aEZpZWxkPSJOb09mRmxvYXREYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZEb3VibGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IkRvdWJsZURhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgTGVuZ3RoRmllbGQ9\nIk5vT2ZEb3VibGVEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTdHJpbmdE\nYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0\ncmluZ0RhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdHJp\nbmdEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEYXRlVGltZURhdGFUeXBl\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0ZVRpbWVE\nYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZEYXRlVGlt\nZURhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkd1aWREYXRhVHlwZSIgVHlw\nZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikd1aWREYXRhVHlwZSIg\nVHlwZU5hbWU9Im9wYzpHdWlkIiBMZW5ndGhGaWVsZD0iTm9PZkd1aWREYXRhVHlwZSIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZCeXRlU3RyaW5nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCeXRlU3RyaW5nRGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZCeXRlU3RyaW5nRGF0YVR5cGUi\nIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mWG1sRWxlbWVudERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudERhdGFUeXBl\nIiBUeXBlTmFtZT0idWE6WG1sRWxlbWVudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZYbWxFbGVtZW50RGF0\nYVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTm9kZUlkRGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb2RlSWREYXRhVHlwZSIg\nVHlwZU5hbWU9InVhOk5vZGVJZCIgTGVuZ3RoRmllbGQ9Ik5vT2ZOb2RlSWREYXRhVHlwZSIgLz4N\nCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZFeHBhbmRlZE5vZGVJZERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWREYXRh\nVHlwZSIgVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiBMZW5ndGhGaWVsZD0iTm9PZkV4cGFu\nZGVkTm9kZUlkRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUXVhbGlmaWVk\nTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgTGVu\nZ3RoRmllbGQ9Ik5vT2ZRdWFsaWZpZWROYW1lRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBO\nYW1lPSJOb09mTG9jYWxpemVkVGV4dERhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTG9jYWxpemVkVGV4dERhdGFUeXBlIiBUeXBlTmFtZT0idWE6\nTG9jYWxpemVkVGV4dCIgTGVuZ3RoRmllbGQ9Ik5vT2ZMb2NhbGl6ZWRUZXh0RGF0YVR5cGUiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU3RhdHVzQ29kZURhdGFUeXBlIiBUeXBlTmFtZT0i\nb3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhdHVzQ29kZURhdGFUeXBlIiBU\neXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdGF0dXNDb2RlRGF0YVR5\ncGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVmFyaWFudERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFudERhdGFUeXBlIiBU\neXBlTmFtZT0idWE6VmFyaWFudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZWYXJpYW50RGF0YVR5cGUiIC8+\nDQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i\nVmVjdG9yIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlgiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWSIg\nVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJaIiBUeXBlTmFt\nZT0ib3BjOkRvdWJsZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1\nY3R1cmVkVHlwZSBOYW1lPSJXb3JrT3JkZXJTdGF0dXNUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5z\naW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFjdG9yIiBUeXBlTmFtZT0ib3BjOlN0\ncmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRpbWVzdGFtcCIgVHlwZU5hbWU9Im9wYzpE\nYXRlVGltZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNvbW1lbnQiIFR5cGVOYW1lPSJ1YTpM\nb2NhbGl6ZWRUZXh0IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVj\ndHVyZWRUeXBlIE5hbWU9IldvcmtPcmRlclR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmpl\nY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSUQiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkFzc2V0SUQiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iU3RhcnRUaW1lIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlN0YXR1c0NvbW1lbnRzIiBUeXBlTmFtZT0ib3BjOklu\ndDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhdHVzQ29tbWVudHMiIFR5cGVOYW1lPSJ0\nbnM6V29ya09yZGVyU3RhdHVzVHlwZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdGF0dXNDb21tZW50cyIg\nLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCjwvb3BjOlR5cGVEaWN0aW9uYXJ5Pg==</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11424</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://test.org/UA/Data/</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11425</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ScalarValueDataType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11428</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ArrayValueDataType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11431</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalarValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalarValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">UserScalarValueDataType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11434</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArrayValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArrayValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">UserArrayValueDataType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11437</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9440</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11425</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11438</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9669</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11428</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11439</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9920</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11431</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11440</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11434</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11441</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TestData</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TestData</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=92</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11443</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15046</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11444</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11447</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11450</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11453</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=43</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=52</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=55</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL3Rlc3Qub3JnL1VBL0RhdGEvIg0KICB0YXJnZXROYW1l\nc3BhY2U9Imh0dHA6Ly90ZXN0Lm9yZy9VQS9EYXRhLyINCiAgZWxlbWVudEZvcm1EZWZhdWx0PSJx\ndWFsaWZpZWQiDQo+DQogIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlv\nbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54c2QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9\nIlNjYWxhclZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IkJvb2xlYW5WYWx1ZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAv\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU0J5dGVWYWx1ZSIgdHlwZT0ieHM6Ynl0ZSIgbWlu\nT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZVZhbHVlIiB0eXBlPSJ4\nczp1bnNpZ25lZEJ5dGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9\nIkludDE2VmFsdWUiIHR5cGU9InhzOnNob3J0IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJVSW50MTZWYWx1ZSIgdHlwZT0ieHM6dW5zaWduZWRTaG9ydCIgbWluT2Nj\ndXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MzJWYWx1ZSIgdHlwZT0ieHM6\naW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJWYWx1\nZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IkludDY0VmFsdWUiIHR5cGU9InhzOmxvbmciIG1pbk9jY3Vycz0iMCIgLz4NCiAg\nICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQ2NFZhbHVlIiB0eXBlPSJ4czp1bnNpZ25lZExvbmci\nIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkZsb2F0VmFsdWUiIHR5\ncGU9InhzOmZsb2F0IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJE\nb3VibGVWYWx1ZSIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTdHJpbmdWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAi\nIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0ZVRpbWVWYWx1\nZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9Ikd1aWRWYWx1ZSIgdHlwZT0idWE6R3VpZCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg\nPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZVN0cmluZ1ZhbHVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnki\nIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l\nPSJYbWxFbGVtZW50VmFsdWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiPg0KICAgICAg\nICA8eHM6Y29tcGxleFR5cGU+DQogICAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgICAg\nPHhzOmFueSBtaW5PY2N1cnM9IjAiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPg0KICAgICAgICAg\nIDwveHM6c2VxdWVuY2U+DQogICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQogICAgICA8L3hzOmVs\nZW1lbnQ+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2RlSWRWYWx1ZSIgdHlwZT0idWE6Tm9k\nZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg\nbmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIgdHlwZT0idWE6RXhwYW5kZWROb2RlSWQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWFs\naWZpZWROYW1lVmFsdWUiIHR5cGU9InVhOlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGl6ZWRUZXh0VmFs\ndWUiIHR5cGU9InVhOkxvY2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlVmFsdWUiIHR5cGU9InVhOlN0\nYXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlZhcmlh\nbnRWYWx1ZSIgdHlwZT0idWE6VmFyaWFudCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVs\nZW1lbnQgbmFtZT0iRW51bWVyYXRpb25WYWx1ZSIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJ1Y3R1cmVWYWx1ZSIgdHlwZT0idWE6RXh0\nZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iTnVtYmVyIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnRlZ2VyIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50ZWdlciIgdHlwZT0idWE6\nVmFyaWFudCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t\ncGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlNjYWxhclZhbHVlRGF0YVR5cGUiIHR5cGU9\nInRuczpTY2FsYXJWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJM\naXN0T2ZTY2FsYXJWYWx1ZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTY2FsYXJWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6U2NhbGFyVmFsdWVE\nYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRy\ndWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVs\nZW1lbnQgbmFtZT0iTGlzdE9mU2NhbGFyVmFsdWVEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZlNj\nYWxhclZhbHVlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhz\nOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5VmFsdWVEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQm9vbGVhblZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZC\nb29sZWFuIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iU0J5dGVWYWx1ZSIgdHlwZT0idWE6TGlzdE9mU0J5dGUiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlVmFsdWUiIHR5\ncGU9InVhOkxpc3RPZkJ5dGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQxNlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQxNiIgbWlu\nT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJ\nbnQxNlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MTYiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9\nInRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQzMlZhbHVlIiB0eXBlPSJ1YTpM\naXN0T2ZJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IlVJbnQzMlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MzIiIG1pbk9jY3Vy\ncz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQ2NFZh\nbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQ2NCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQ2NFZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZV\nSW50NjQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJGbG9hdFZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZGbG9hdCIgbWluT2NjdXJzPSIwIiBu\naWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRvdWJsZVZhbHVlIiB0\neXBlPSJ1YTpMaXN0T2ZEb3VibGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog\nICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJpbmdWYWx1ZSIgdHlwZT0idWE6TGlzdE9mU3RyaW5n\nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt\nZT0iRGF0ZVRpbWVWYWx1ZSIgdHlwZT0idWE6TGlzdE9mRGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJHdWlkVmFsdWUiIHR5\ncGU9InVhOkxpc3RPZkd1aWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlU3RyaW5nVmFsdWUiIHR5cGU9InVhOkxpc3RPZkJ5dGVT\ndHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJYbWxFbGVtZW50VmFsdWUiIHR5cGU9InVhOkxpc3RPZlhtbEVsZW1lbnQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2Rl\nSWRWYWx1ZSIgdHlwZT0idWE6TGlzdE9mTm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0\ncnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIgdHlw\nZT0idWE6TGlzdE9mRXhwYW5kZWROb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWFsaWZpZWROYW1lVmFsdWUiIHR5cGU9InVh\nOkxpc3RPZlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog\nICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGl6ZWRUZXh0VmFsdWUiIHR5cGU9InVhOkxpc3RP\nZkxvY2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8\neHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlVmFsdWUiIHR5cGU9InVhOkxpc3RPZlN0YXR1c0Nv\nZGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJWYXJpYW50VmFsdWUiIHR5cGU9InVhOkxpc3RPZlZhcmlhbnQiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbnVtZXJhdGlvblZh\nbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0cnVjdHVyZVZhbHVlIiB0eXBlPSJ1YTpMaXN0\nT2ZFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJOdW1iZXIiIHR5cGU9InVhOkxpc3RPZlZhcmlhbnQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnRl\nZ2VyIiB0eXBlPSJ1YTpMaXN0T2ZWYXJpYW50IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVUludGVnZXIiIHR5cGU9InVhOkxpc3RPZlZh\ncmlhbnQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5j\nZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQXJyYXlWYWx1ZURh\ndGFUeXBlIiB0eXBlPSJ0bnM6QXJyYXlWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4\nVHlwZSBuYW1lPSJMaXN0T2ZBcnJheVZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFycmF5VmFsdWVEYXRhVHlwZSIgdHlwZT0idG5zOkFy\ncmF5VmFsdWVEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N\nCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQXJyYXlWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6\nTGlzdE9mQXJyYXlWYWx1ZURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0K\nDQogIDx4czplbGVtZW50IG5hbWU9IkJvb2xlYW5EYXRhVHlwZSIgdHlwZT0ieHM6Ym9vbGVhbiIg\nLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJTQnl0ZURhdGFUeXBlIiB0eXBlPSJ4czpieXRlIiAv\nPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkJ5dGVEYXRhVHlwZSIgdHlwZT0ieHM6dW5zaWduZWRC\neXRlIiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkludDE2RGF0YVR5cGUiIHR5cGU9InhzOnNo\nb3J0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IlVJbnQxNkRhdGFUeXBlIiB0eXBlPSJ4czp1\nbnNpZ25lZFNob3J0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkludDMyRGF0YVR5cGUiIHR5\ncGU9InhzOmludCIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJEYXRhVHlwZSIgdHlw\nZT0ieHM6dW5zaWduZWRJbnQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iSW50NjREYXRhVHlw\nZSIgdHlwZT0ieHM6bG9uZyIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50NjREYXRhVHlw\nZSIgdHlwZT0ieHM6dW5zaWduZWRMb25nIiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkZsb2F0\nRGF0YVR5cGUiIHR5cGU9InhzOmZsb2F0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkRvdWJs\nZURhdGFUeXBlIiB0eXBlPSJ4czpkb3VibGUiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iU3Ry\naW5nRGF0YVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJE\nYXRlVGltZURhdGFUeXBlIiB0eXBlPSJ4czpkYXRlVGltZSIgLz4NCg0KICA8eHM6ZWxlbWVudCBu\nYW1lPSJHdWlkRGF0YVR5cGUiIHR5cGU9InVhOkd1aWQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFt\nZT0iQnl0ZVN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIC8+DQoNCiAgPHhz\nOmVsZW1lbnQgbmFtZT0iWG1sRWxlbWVudERhdGFUeXBlIiB0eXBlPSJ1YTpYbWxFbGVtZW50IiAv\nPg0KDQogIDx4czplbGVtZW50IG5hbWU9Ik5vZGVJZERhdGFUeXBlIiB0eXBlPSJ1YTpOb2RlSWQi\nIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWREYXRhVHlwZSIgdHlwZT0i\ndWE6RXhwYW5kZWROb2RlSWQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iUXVhbGlmaWVkTmFt\nZURhdGFUeXBlIiB0eXBlPSJ1YTpRdWFsaWZpZWROYW1lIiAvPg0KDQogIDx4czplbGVtZW50IG5h\nbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgLz4NCg0K\nICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlRGF0YVR5cGUiIHR5cGU9InVhOlN0YXR1c0Nv\nZGUiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudERhdGFUeXBlIiB0eXBlPSJ1YTpW\nYXJpYW50IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJVc2VyU2NhbGFyVmFsdWVEYXRh\nVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQm9vbGVh\nbkRhdGFUeXBlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTQnl0ZURhdGFUeXBlIiB0eXBlPSJ4czpieXRlIiBtaW5PY2N1cnM9IjAi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlRGF0YVR5cGUiIHR5cGU9InhzOnVuc2ln\nbmVkQnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MTZE\nYXRhVHlwZSIgdHlwZT0ieHM6c2hvcnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IlVJbnQxNkRhdGFUeXBlIiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1\ncnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQzMkRhdGFUeXBlIiB0eXBlPSJ4\nczppbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQzMkRh\ndGFUeXBlIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iSW50NjREYXRhVHlwZSIgdHlwZT0ieHM6bG9uZyIgbWluT2NjdXJzPSIw\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVUludDY0RGF0YVR5cGUiIHR5cGU9InhzOnVu\nc2lnbmVkTG9uZyIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmxv\nYXREYXRhVHlwZSIgdHlwZT0ieHM6ZmxvYXQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IkRvdWJsZURhdGFUeXBlIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0i\nMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ4czpz\ndHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJEYXRlVGltZURhdGFUeXBlIiB0eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJzPSIw\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iR3VpZERhdGFUeXBlIiB0eXBlPSJ1YTpHdWlk\nIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlU3RyaW5nRGF0\nYVR5cGUiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1\nZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlhtbEVsZW1lbnREYXRhVHlwZSIgbWluT2Nj\ndXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSI+DQogICAgICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAg\nICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgcHJv\nY2Vzc0NvbnRlbnRzPSJsYXgiIC8+DQogICAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgICAg\nPC94czpjb21wbGV4VHlwZT4NCiAgICAgIDwveHM6ZWxlbWVudD4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9Ik5vZGVJZERhdGFUeXBlIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFeHBhbmRlZE5vZGVJZERh\ndGFUeXBlIiB0eXBlPSJ1YTpFeHBhbmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i\ndHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlF1YWxpZmllZE5hbWVEYXRhVHlwZSIg\ndHlwZT0idWE6UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgdHlwZT0idWE6\nTG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4\nczplbGVtZW50IG5hbWU9IlN0YXR1c0NvZGVEYXRhVHlwZSIgdHlwZT0idWE6U3RhdHVzQ29kZSIg\nbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudERhdGFUeXBl\nIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N\nCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVXNlclNjYWxhclZhbHVl\nRGF0YVR5cGUiIHR5cGU9InRuczpVc2VyU2NhbGFyVmFsdWVEYXRhVHlwZSIgLz4NCg0KICA8eHM6\nY29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVXNlclNjYWxhclZhbHVlRGF0YVR5cGUiPg0KICAgIDx4\nczpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJTY2FsYXJWYWx1ZURhdGFU\neXBlIiB0eXBlPSJ0bnM6VXNlclNjYWxhclZhbHVlRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4\nT2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+\nDQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlVzZXJTY2Fs\nYXJWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mVXNlclNjYWxhclZhbHVlRGF0YVR5cGUi\nIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9\nIlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IkJvb2xlYW5EYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mQm9vbGVhbiIgbWlu\nT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNC\neXRlRGF0YVR5cGUiIHR5cGU9InVhOkxpc3RPZlNCeXRlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl\nPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZURhdGFUeXBlIiB0eXBlPSJ0\nbnM6TGlzdE9mQnl0ZURhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K\nICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MTZEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mSW50\nMTYiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJVSW50MTZEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mVUludDE2IiBtaW5PY2N1cnM9IjAi\nIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MzJEYXRhVHlw\nZSIgdHlwZT0idWE6TGlzdE9mSW50MzIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9m\nVUludDMyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iSW50NjREYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mSW50NjQiIG1pbk9jY3Vycz0i\nMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50NjREYXRh\nVHlwZSIgdHlwZT0idWE6TGlzdE9mVUludDY0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmxvYXREYXRhVHlwZSIgdHlwZT0idWE6TGlz\ndE9mRmxvYXQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl\nbWVudCBuYW1lPSJEb3VibGVEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mRG91YmxlIiBtaW5PY2N1\ncnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RyaW5n\nRGF0YVR5cGUiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i\ndHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGVUaW1lRGF0YVR5cGUiIHR5cGU9\nInVhOkxpc3RPZkRhdGVUaW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nICAgPHhzOmVsZW1lbnQgbmFtZT0iR3VpZERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZHdWlkIiBt\naW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i\nQnl0ZVN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZCeXRlU3RyaW5nIiBtaW5PY2N1cnM9\nIjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iWG1sRWxlbWVu\ndERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZYbWxFbGVtZW50IiBtaW5PY2N1cnM9IjAiIG5pbGxh\nYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZUlkRGF0YVR5cGUiIHR5\ncGU9InVhOkxpc3RPZk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg\nICAgIDx4czplbGVtZW50IG5hbWU9IkV4cGFuZGVkTm9kZUlkRGF0YVR5cGUiIHR5cGU9InVhOkxp\nc3RPZkV4cGFuZGVkTm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0\nT2ZRdWFsaWZpZWROYW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg\nPHhzOmVsZW1lbnQgbmFtZT0iTG9jYWxpemVkVGV4dERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZM\nb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iU3RhdHVzQ29kZURhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZTdGF0dXND\nb2RlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg\nbmFtZT0iVmFyaWFudERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZWYXJpYW50IiBtaW5PY2N1cnM9\nIjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl\neFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiIHR5cGU9\nInRuczpVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l\nPSJMaXN0T2ZVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6VXNl\nckFycmF5VmFsdWVEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw\nZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVXNlckFycmF5VmFsdWVEYXRhVHlwZSIgdHlw\nZT0idG5zOkxpc3RPZlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hz\nOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZlY3RvciI+DQogICAgPHhzOnNl\ncXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iWCIgdHlwZT0ieHM6ZG91YmxlIiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJZIiB0eXBlPSJ4czpkb3VibGUi\nIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IloiIHR5cGU9InhzOmRv\ndWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl\neFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlZlY3RvciIgdHlwZT0idG5zOlZlY3RvciIgLz4N\nCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVmVjdG9yIj4NCiAgICA8eHM6c2VxdWVu\nY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWZWN0b3IiIHR5cGU9InRuczpWZWN0b3IiIG1p\nbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9\nIkxpc3RPZlZlY3RvciIgdHlwZT0idG5zOkxpc3RPZlZlY3RvciIgbmlsbGFibGU9InRydWUiPjwv\neHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyU3RhdHVzVHlw\nZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWN0b3IiIHR5\ncGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4\nczplbGVtZW50IG5hbWU9IlRpbWVzdGFtcCIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0i\nMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNvbW1lbnQiIHR5cGU9InVhOkxvY2FsaXpl\nZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5j\nZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iV29ya09yZGVyU3Rh\ndHVzVHlwZSIgdHlwZT0idG5zOldvcmtPcmRlclN0YXR1c1R5cGUiIC8+DQoNCiAgPHhzOmNvbXBs\nZXhUeXBlIG5hbWU9Ikxpc3RPZldvcmtPcmRlclN0YXR1c1R5cGUiPg0KICAgIDx4czpzZXF1ZW5j\nZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IldvcmtPcmRlclN0YXR1c1R5cGUiIHR5cGU9InRu\nczpXb3JrT3JkZXJTdGF0dXNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVk\nIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU\neXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZXb3JrT3JkZXJTdGF0dXNUeXBlIiB0eXBl\nPSJ0bnM6TGlzdE9mV29ya09yZGVyU3RhdHVzVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxl\nbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+DQogICAgPHhz\nOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSUQiIHR5cGU9InVhOkd1aWQiIG1p\nbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFzc2V0SUQiIHR5cGU9Inhz\nOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IlN0YXJ0VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXR1c0NvbW1lbnRzIiB0eXBlPSJ0bnM6TGlzdE9m\nV29ya09yZGVyU3RhdHVzVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg\nICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l\nPSJXb3JrT3JkZXJUeXBlIiB0eXBlPSJ0bnM6V29ya09yZGVyVHlwZSIgLz4NCg0KICA8eHM6Y29t\ncGxleFR5cGUgbmFtZT0iTGlzdE9mV29ya09yZGVyVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0K\nICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iV29ya09yZGVyVHlwZSIgdHlwZT0idG5zOldvcmtPcmRl\nclR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt\nZW50IG5hbWU9Ikxpc3RPZldvcmtPcmRlclR5cGUiIHR5cGU9InRuczpMaXN0T2ZXb3JrT3JkZXJU\neXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQo8L3hzOnNjaGVtYT4=</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11443</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://test.org/UA/Data/</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11444</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ScalarValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ScalarValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ScalarValueDataType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11447</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ArrayValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ArrayValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ArrayValueDataType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11450</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserScalarValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserScalarValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='UserScalarValueDataType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11453</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>UserArrayValueDataType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>UserArrayValueDataType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='UserArrayValueDataType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11557</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11565</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11566</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11567</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11568</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11569</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11570</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11571</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11572</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11573</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11574</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11575</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11576</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11577</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11578</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11579</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9387</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11594</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11595</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10163</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11596</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11597</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10247</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11598</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11599</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11600</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11601</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11602</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11603</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10489</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11604</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11605</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10624</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11606</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11607</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10791</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11608</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11609</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10875</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11610</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11611</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10959</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11612</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11613</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11038</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11614</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11615</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11117</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11616</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11617</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11252</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11618</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassId</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassId</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <NodeId xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <Identifier>i=0</Identifier>\n          </NodeId>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=17</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=11619</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>ConditionClassName</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ConditionClassName</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11384</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <LocalizedText xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=21</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15045</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11422</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15046</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=11441</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15047</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9440</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15048</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9669</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15049</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=9920</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15050</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=10006</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://test.org/UA/Data/</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://test.org/UA/Data/\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" XmlSchemaUri=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" Version=\"1.04.10\" PublicationDate=\"2021-09-15T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n    <Alias Alias=\"HasCause\">i=53</Alias>\n    <Alias Alias=\"ToState\">i=52</Alias>\n    <Alias Alias=\"FromState\">i=51</Alias>\n    <Alias Alias=\"HasEffect\">i=54</Alias>\n    <Alias Alias=\"HasTrueSubState\">i=9004</Alias>\n    <Alias Alias=\"HasFalseSubState\">i=9005</Alias>\n    <Alias Alias=\"HasDictionaryEntry\">i=17597</Alias>\n    <Alias Alias=\"HasCondition\">i=9006</Alias>\n    <Alias Alias=\"HasGuard\">i=15112</Alias>\n    <Alias Alias=\"HasAddIn\">i=17604</Alias>\n    <Alias Alias=\"HasInterface\">i=17603</Alias>\n  </Aliases>\n  <UAObjectType NodeId=\"ns=1;i=9371\" BrowseName=\"1:GenerateValuesEventType\">\n    <DisplayName>GenerateValuesEventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9381</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9382</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2041</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=9381\" BrowseName=\"1:Iterations\" ParentNodeId=\"ns=1;i=9371\" DataType=\"UInt32\">\n    <DisplayName>Iterations</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9371</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9382\" BrowseName=\"1:NewValueCount\" ParentNodeId=\"ns=1;i=9371\" DataType=\"UInt32\">\n    <DisplayName>NewValueCount</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9371</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=9383\" BrowseName=\"1:TestDataObjectType\">\n    <DisplayName>TestDataObjectType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9384</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9385</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9387</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=9387</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=9384\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=9383\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=9385\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=9383\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9386</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=9386\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=9385\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9385</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=9387\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=9383\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9388</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9389</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9390</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9391</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9392</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9393</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9395</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9396</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11578</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11579</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11557</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9397</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9398</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9399</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9405</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9409</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9411</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9413</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9415</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9414</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9416</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9420</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9436</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=9383</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=9388\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=9387\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9389\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=9387\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9390\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=9387\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9391\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=9387\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9392\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=9387\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9393\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=9387\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9395\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=9387\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9396\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=9387\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11578\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=9387\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11579\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=9387\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11557\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=9387\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9397\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=9387\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9398\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=9387\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9399\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=9387\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9400</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9400\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=9399\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9399</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9405\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=9387\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9406</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9406\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=9405\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9405</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9409\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=9387\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9410</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9410\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=9409\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9409</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9411\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=9387\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9412</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9412\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=9411\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9411</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9413\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=9387\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=9415\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=9387\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=9414\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=9387\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=9416\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=9387\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9417</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=9417\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=9416\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9416</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9420\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=9387\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9421</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9421\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=9420\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9420</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=9436\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=9387\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9437</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9387</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=9437\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=9436\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9436</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=9440\" BrowseName=\"1:ScalarValueDataType\">\n    <DisplayName>ScalarValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ScalarValueDataType\">\n      <Field Name=\"BooleanValue\" DataType=\"i=1\" />\n      <Field Name=\"SByteValue\" DataType=\"i=2\" />\n      <Field Name=\"ByteValue\" DataType=\"i=3\" />\n      <Field Name=\"Int16Value\" DataType=\"i=4\" />\n      <Field Name=\"UInt16Value\" DataType=\"i=5\" />\n      <Field Name=\"Int32Value\" DataType=\"i=6\" />\n      <Field Name=\"UInt32Value\" DataType=\"i=7\" />\n      <Field Name=\"Int64Value\" DataType=\"i=8\" />\n      <Field Name=\"UInt64Value\" DataType=\"i=9\" />\n      <Field Name=\"FloatValue\" DataType=\"i=10\" />\n      <Field Name=\"DoubleValue\" DataType=\"i=11\" />\n      <Field Name=\"StringValue\" DataType=\"i=12\" />\n      <Field Name=\"DateTimeValue\" DataType=\"i=13\" />\n      <Field Name=\"GuidValue\" DataType=\"i=14\" />\n      <Field Name=\"ByteStringValue\" DataType=\"i=15\" />\n      <Field Name=\"XmlElementValue\" DataType=\"i=16\" />\n      <Field Name=\"NodeIdValue\" DataType=\"i=17\" />\n      <Field Name=\"ExpandedNodeIdValue\" DataType=\"i=18\" />\n      <Field Name=\"QualifiedNameValue\" DataType=\"i=20\" />\n      <Field Name=\"LocalizedTextValue\" DataType=\"i=21\" />\n      <Field Name=\"StatusCodeValue\" DataType=\"i=19\" />\n      <Field Name=\"VariantValue\" />\n      <Field Name=\"EnumerationValue\" DataType=\"i=29\" />\n      <Field Name=\"StructureValue\" DataType=\"i=22\" />\n      <Field Name=\"Number\" DataType=\"i=26\" />\n      <Field Name=\"Integer\" DataType=\"i=27\" />\n      <Field Name=\"UInteger\" DataType=\"i=28\" />\n    </Definition>\n  </UADataType>\n  <UAObjectType NodeId=\"ns=1;i=9450\" BrowseName=\"1:ScalarValueObjectType\">\n    <DisplayName>ScalarValueObjectType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9507</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9508</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9509</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9510</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9511</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9512</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9513</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9514</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9515</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9516</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9517</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9518</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9519</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9520</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9521</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9522</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9523</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9524</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9525</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9526</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9527</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9528</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9529</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9530</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9531</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9532</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9533</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=9507\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Boolean\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9508\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"SByte\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9509\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Byte\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9510\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Int16\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9511\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=9450\" DataType=\"UInt16\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9512\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Int32\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9513\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=9450\" DataType=\"UInt32\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9514\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Int64\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9515\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=9450\" DataType=\"UInt64\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9516\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Float\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9517\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Double\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9518\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"String\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9519\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"DateTime\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9520\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Guid\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9521\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"ByteString\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9522\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"XmlElement\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9523\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"NodeId\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9524\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"ExpandedNodeId\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9525\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"QualifiedName\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9526\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"LocalizedText\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9527\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"StatusCode\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9528\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=9450\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9529\" BrowseName=\"1:EnumerationValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"i=29\">\n    <DisplayName>EnumerationValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9530\" BrowseName=\"1:StructureValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Structure\">\n    <DisplayName>StructureValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9531\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Number\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9532\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"Integer\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9533\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=9450\" DataType=\"UInteger\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9450</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=9534\" BrowseName=\"1:AnalogScalarValueObjectType\">\n    <DisplayName>AnalogScalarValueObjectType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9591</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9597</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9603</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9609</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9615</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9621</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9627</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9633</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9639</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9645</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9651</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9657</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9663</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=9591\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=9534\" DataType=\"SByte\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9594</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9594\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9591\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9591</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9597\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=9534\" DataType=\"Byte\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9600</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9600\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9597\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9597</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9603\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=9534\" DataType=\"Int16\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9606</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9606\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9603\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9603</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9609\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=9534\" DataType=\"UInt16\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9612</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9612\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9609\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9609</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9615\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=9534\" DataType=\"Int32\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9618</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9618\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9615\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9615</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9621\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=9534\" DataType=\"UInt32\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9624</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9624\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9621\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9621</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9627\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=9534\" DataType=\"Int64\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9630</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9630\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9627\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9627</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9633\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=9534\" DataType=\"UInt64\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9636</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9636\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9633\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9633</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9639\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=9534\" DataType=\"Float\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9642</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9642\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9639\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9639</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9645\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=9534\" DataType=\"Double\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9648</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9648\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9645\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9645</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9651\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=9534\" DataType=\"Number\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9654</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9654\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9651\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9651</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9657\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=9534\" DataType=\"Integer\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9660</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9660\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9657\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9657</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9663\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=9534\" DataType=\"UInteger\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9666</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9534</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9666\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9663\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9663</Reference>\n    </References>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=9669\" BrowseName=\"1:ArrayValueDataType\">\n    <DisplayName>ArrayValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:ArrayValueDataType\">\n      <Field Name=\"BooleanValue\" DataType=\"i=1\" ValueRank=\"1\" />\n      <Field Name=\"SByteValue\" DataType=\"i=2\" ValueRank=\"1\" />\n      <Field Name=\"ByteValue\" DataType=\"i=3\" ValueRank=\"1\" />\n      <Field Name=\"Int16Value\" DataType=\"i=4\" ValueRank=\"1\" />\n      <Field Name=\"UInt16Value\" DataType=\"i=5\" ValueRank=\"1\" />\n      <Field Name=\"Int32Value\" DataType=\"i=6\" ValueRank=\"1\" />\n      <Field Name=\"UInt32Value\" DataType=\"i=7\" ValueRank=\"1\" />\n      <Field Name=\"Int64Value\" DataType=\"i=8\" ValueRank=\"1\" />\n      <Field Name=\"UInt64Value\" DataType=\"i=9\" ValueRank=\"1\" />\n      <Field Name=\"FloatValue\" DataType=\"i=10\" ValueRank=\"1\" />\n      <Field Name=\"DoubleValue\" DataType=\"i=11\" ValueRank=\"1\" />\n      <Field Name=\"StringValue\" DataType=\"i=12\" ValueRank=\"1\" />\n      <Field Name=\"DateTimeValue\" DataType=\"i=13\" ValueRank=\"1\" />\n      <Field Name=\"GuidValue\" DataType=\"i=14\" ValueRank=\"1\" />\n      <Field Name=\"ByteStringValue\" DataType=\"i=15\" ValueRank=\"1\" />\n      <Field Name=\"XmlElementValue\" DataType=\"i=16\" ValueRank=\"1\" />\n      <Field Name=\"NodeIdValue\" DataType=\"i=17\" ValueRank=\"1\" />\n      <Field Name=\"ExpandedNodeIdValue\" DataType=\"i=18\" ValueRank=\"1\" />\n      <Field Name=\"QualifiedNameValue\" DataType=\"i=20\" ValueRank=\"1\" />\n      <Field Name=\"LocalizedTextValue\" DataType=\"i=21\" ValueRank=\"1\" />\n      <Field Name=\"StatusCodeValue\" DataType=\"i=19\" ValueRank=\"1\" />\n      <Field Name=\"VariantValue\" ValueRank=\"1\" />\n      <Field Name=\"EnumerationValue\" DataType=\"i=29\" ValueRank=\"1\" />\n      <Field Name=\"StructureValue\" DataType=\"i=22\" ValueRank=\"1\" />\n      <Field Name=\"Number\" DataType=\"i=26\" ValueRank=\"1\" />\n      <Field Name=\"Integer\" DataType=\"i=27\" ValueRank=\"1\" />\n      <Field Name=\"UInteger\" DataType=\"i=28\" ValueRank=\"1\" />\n    </Definition>\n  </UADataType>\n  <UAObjectType NodeId=\"ns=1;i=9679\" BrowseName=\"1:ArrayValueObjectType\">\n    <DisplayName>ArrayValueObjectType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9736</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9737</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9738</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9739</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9740</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9741</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9742</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9743</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9744</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9745</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9746</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9747</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9748</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9749</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9750</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9751</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9752</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9753</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9754</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9755</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9756</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9757</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9758</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9759</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9760</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9761</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9762</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=9736\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Boolean\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9737\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"SByte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9738\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Byte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9739\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Int16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9740\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=9679\" DataType=\"UInt16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9741\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Int32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9742\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=9679\" DataType=\"UInt32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9743\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Int64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9744\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=9679\" DataType=\"UInt64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9745\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Float\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9746\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Double\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9747\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9748\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"DateTime\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9749\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Guid\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9750\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"ByteString\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9751\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"XmlElement\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9752\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"NodeId\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9753\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"ExpandedNodeId\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9754\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"QualifiedName\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9755\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9756\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"StatusCode\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9757\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=9679\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9758\" BrowseName=\"1:EnumerationValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"i=29\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>EnumerationValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9759\" BrowseName=\"1:StructureValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Structure\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StructureValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9760\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Number\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9761\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"Integer\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9762\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=9679\" DataType=\"UInteger\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9679</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=9763\" BrowseName=\"1:AnalogArrayValueObjectType\">\n    <DisplayName>AnalogArrayValueObjectType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9820</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9826</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9832</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9838</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9844</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9850</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9856</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9862</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9868</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9874</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9880</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9886</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9892</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=9820\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=9763\" DataType=\"SByte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9823</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9823\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9820\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9820</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9826\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=9763\" DataType=\"Byte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9829</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9829\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9826\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9826</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9832\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=9763\" DataType=\"Int16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9835</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9835\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9832\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9832</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9838\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=9763\" DataType=\"UInt16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9841</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9841\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9838\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9838</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9844\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=9763\" DataType=\"Int32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9847</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9847\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9844\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9844</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9850\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=9763\" DataType=\"UInt32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9853</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9853\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9850\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9850</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9856\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=9763\" DataType=\"Int64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9859</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9859\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9856\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9856</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9862\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=9763\" DataType=\"UInt64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9865</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9865\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9862\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9862</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9868\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=9763\" DataType=\"Float\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9871</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9871\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9868\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9868</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9874\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=9763\" DataType=\"Double\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9877</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9877\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9874\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9874</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9880\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=9763\" DataType=\"Number\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9883</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9883\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9880\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9880</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9886\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=9763\" DataType=\"Integer\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9889</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9889\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9886\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9886</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9892\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=9763\" DataType=\"UInteger\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=9895</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9763</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9895\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=9892\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=9892</Reference>\n    </References>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=9898\" BrowseName=\"1:BooleanDataType\">\n    <DisplayName>BooleanDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=1</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9899\" BrowseName=\"1:SByteDataType\">\n    <DisplayName>SByteDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9900\" BrowseName=\"1:ByteDataType\">\n    <DisplayName>ByteDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=3</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9901\" BrowseName=\"1:Int16DataType\">\n    <DisplayName>Int16DataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=4</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9902\" BrowseName=\"1:UInt16DataType\">\n    <DisplayName>UInt16DataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=5</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9903\" BrowseName=\"1:Int32DataType\">\n    <DisplayName>Int32DataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=6</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9904\" BrowseName=\"1:UInt32DataType\">\n    <DisplayName>UInt32DataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=7</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9905\" BrowseName=\"1:Int64DataType\">\n    <DisplayName>Int64DataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=8</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9906\" BrowseName=\"1:UInt64DataType\">\n    <DisplayName>UInt64DataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=9</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9907\" BrowseName=\"1:FloatDataType\">\n    <DisplayName>FloatDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=10</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9908\" BrowseName=\"1:DoubleDataType\">\n    <DisplayName>DoubleDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=11</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9909\" BrowseName=\"1:StringDataType\">\n    <DisplayName>StringDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=12</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9910\" BrowseName=\"1:DateTimeDataType\">\n    <DisplayName>DateTimeDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=13</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9911\" BrowseName=\"1:GuidDataType\">\n    <DisplayName>GuidDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=14</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9912\" BrowseName=\"1:ByteStringDataType\">\n    <DisplayName>ByteStringDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=15</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9913\" BrowseName=\"1:XmlElementDataType\">\n    <DisplayName>XmlElementDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=16</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9914\" BrowseName=\"1:NodeIdDataType\">\n    <DisplayName>NodeIdDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=17</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9915\" BrowseName=\"1:ExpandedNodeIdDataType\">\n    <DisplayName>ExpandedNodeIdDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=18</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9916\" BrowseName=\"1:QualifiedNameDataType\">\n    <DisplayName>QualifiedNameDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=20</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9917\" BrowseName=\"1:LocalizedTextDataType\">\n    <DisplayName>LocalizedTextDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=21</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9918\" BrowseName=\"1:StatusCodeDataType\">\n    <DisplayName>StatusCodeDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=19</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9919\" BrowseName=\"1:VariantDataType\">\n    <DisplayName>VariantDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=24</Reference>\n    </References>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=9920\" BrowseName=\"1:UserScalarValueDataType\">\n    <DisplayName>UserScalarValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:UserScalarValueDataType\">\n      <Field Name=\"BooleanDataType\" DataType=\"ns=1;i=9898\" />\n      <Field Name=\"SByteDataType\" DataType=\"ns=1;i=9899\" />\n      <Field Name=\"ByteDataType\" DataType=\"ns=1;i=9900\" />\n      <Field Name=\"Int16DataType\" DataType=\"ns=1;i=9901\" />\n      <Field Name=\"UInt16DataType\" DataType=\"ns=1;i=9902\" />\n      <Field Name=\"Int32DataType\" DataType=\"ns=1;i=9903\" />\n      <Field Name=\"UInt32DataType\" DataType=\"ns=1;i=9904\" />\n      <Field Name=\"Int64DataType\" DataType=\"ns=1;i=9905\" />\n      <Field Name=\"UInt64DataType\" DataType=\"ns=1;i=9906\" />\n      <Field Name=\"FloatDataType\" DataType=\"ns=1;i=9907\" />\n      <Field Name=\"DoubleDataType\" DataType=\"ns=1;i=9908\" />\n      <Field Name=\"StringDataType\" DataType=\"ns=1;i=9909\" />\n      <Field Name=\"DateTimeDataType\" DataType=\"ns=1;i=9910\" />\n      <Field Name=\"GuidDataType\" DataType=\"ns=1;i=9911\" />\n      <Field Name=\"ByteStringDataType\" DataType=\"ns=1;i=9912\" />\n      <Field Name=\"XmlElementDataType\" DataType=\"ns=1;i=9913\" />\n      <Field Name=\"NodeIdDataType\" DataType=\"ns=1;i=9914\" />\n      <Field Name=\"ExpandedNodeIdDataType\" DataType=\"ns=1;i=9915\" />\n      <Field Name=\"QualifiedNameDataType\" DataType=\"ns=1;i=9916\" />\n      <Field Name=\"LocalizedTextDataType\" DataType=\"ns=1;i=9917\" />\n      <Field Name=\"StatusCodeDataType\" DataType=\"ns=1;i=9918\" />\n      <Field Name=\"VariantDataType\" DataType=\"ns=1;i=9919\" />\n    </Definition>\n  </UADataType>\n  <UAObjectType NodeId=\"ns=1;i=9921\" BrowseName=\"1:UserScalarValueObjectType\">\n    <DisplayName>UserScalarValueObjectType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9978</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9979</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9980</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9981</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9982</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9983</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9984</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9985</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9986</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9987</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9988</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9989</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9990</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9991</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9992</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9993</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9994</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9995</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9996</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9997</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9998</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=9999</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=9978\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9898\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9979\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9899\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9980\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9900\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9981\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9901\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9982\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9902\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9983\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9903\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9984\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9904\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9985\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9905\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9986\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9906\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9987\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9907\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9988\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9908\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9989\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9909\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9990\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9910\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9991\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9911\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9992\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9912\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9993\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9913\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9994\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9914\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9995\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9915\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9996\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9916\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9997\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9917\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9998\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9918\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=9999\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=9921\" DataType=\"ns=1;i=9919\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=9921</Reference>\n    </References>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=10006\" BrowseName=\"1:UserArrayValueDataType\">\n    <DisplayName>UserArrayValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:UserArrayValueDataType\">\n      <Field Name=\"BooleanDataType\" DataType=\"ns=1;i=9898\" ValueRank=\"1\" />\n      <Field Name=\"SByteDataType\" DataType=\"ns=1;i=9899\" ValueRank=\"1\" />\n      <Field Name=\"ByteDataType\" DataType=\"ns=1;i=9900\" ValueRank=\"1\" />\n      <Field Name=\"Int16DataType\" DataType=\"ns=1;i=9901\" ValueRank=\"1\" />\n      <Field Name=\"UInt16DataType\" DataType=\"ns=1;i=9902\" ValueRank=\"1\" />\n      <Field Name=\"Int32DataType\" DataType=\"ns=1;i=9903\" ValueRank=\"1\" />\n      <Field Name=\"UInt32DataType\" DataType=\"ns=1;i=9904\" ValueRank=\"1\" />\n      <Field Name=\"Int64DataType\" DataType=\"ns=1;i=9905\" ValueRank=\"1\" />\n      <Field Name=\"UInt64DataType\" DataType=\"ns=1;i=9906\" ValueRank=\"1\" />\n      <Field Name=\"FloatDataType\" DataType=\"ns=1;i=9907\" ValueRank=\"1\" />\n      <Field Name=\"DoubleDataType\" DataType=\"ns=1;i=9908\" ValueRank=\"1\" />\n      <Field Name=\"StringDataType\" DataType=\"ns=1;i=9909\" ValueRank=\"1\" />\n      <Field Name=\"DateTimeDataType\" DataType=\"ns=1;i=9910\" ValueRank=\"1\" />\n      <Field Name=\"GuidDataType\" DataType=\"ns=1;i=9911\" ValueRank=\"1\" />\n      <Field Name=\"ByteStringDataType\" DataType=\"ns=1;i=9912\" ValueRank=\"1\" />\n      <Field Name=\"XmlElementDataType\" DataType=\"ns=1;i=9913\" ValueRank=\"1\" />\n      <Field Name=\"NodeIdDataType\" DataType=\"ns=1;i=9914\" ValueRank=\"1\" />\n      <Field Name=\"ExpandedNodeIdDataType\" DataType=\"ns=1;i=9915\" ValueRank=\"1\" />\n      <Field Name=\"QualifiedNameDataType\" DataType=\"ns=1;i=9916\" ValueRank=\"1\" />\n      <Field Name=\"LocalizedTextDataType\" DataType=\"ns=1;i=9917\" ValueRank=\"1\" />\n      <Field Name=\"StatusCodeDataType\" DataType=\"ns=1;i=9918\" ValueRank=\"1\" />\n      <Field Name=\"VariantDataType\" DataType=\"ns=1;i=9919\" ValueRank=\"1\" />\n    </Definition>\n  </UADataType>\n  <UAObjectType NodeId=\"ns=1;i=10007\" BrowseName=\"1:UserArrayValueObjectType\">\n    <DisplayName>UserArrayValueObjectType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10064</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10065</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10066</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10067</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10068</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10069</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10070</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10071</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10072</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10073</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10074</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10075</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10076</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10077</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10078</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10079</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10080</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10081</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10082</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10083</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10084</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10085</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=9383</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=10064\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9898\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10065\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9899\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10066\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9900\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10067\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9901\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10068\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9902\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10069\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9903\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10070\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9904\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10071\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9905\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10072\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9906\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10073\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9907\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10074\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9908\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10075\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9909\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10076\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9910\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10077\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9911\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10078\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9912\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10079\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9913\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10080\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9914\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10081\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9915\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10082\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9916\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10083\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9917\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10084\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9918\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10085\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=10007\" DataType=\"ns=1;i=9919\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10007</Reference>\n    </References>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=1000\" BrowseName=\"1:Vector\">\n    <DisplayName>Vector</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:Vector\">\n      <Field Name=\"X\" DataType=\"i=11\" />\n      <Field Name=\"Y\" DataType=\"i=11\" />\n      <Field Name=\"Z\" DataType=\"i=11\" />\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=1004\" BrowseName=\"1:WorkOrderStatusType\">\n    <DisplayName>WorkOrderStatusType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:WorkOrderStatusType\">\n      <Field Name=\"Actor\" DataType=\"i=12\" />\n      <Field Name=\"Timestamp\" DataType=\"i=13\" />\n      <Field Name=\"Comment\" DataType=\"i=21\" />\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=1005\" BrowseName=\"1:WorkOrderType\">\n    <DisplayName>WorkOrderType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:WorkOrderType\">\n      <Field Name=\"ID\" DataType=\"i=14\" />\n      <Field Name=\"AssetID\" DataType=\"i=12\" />\n      <Field Name=\"StartTime\" DataType=\"i=13\" />\n      <Field Name=\"StatusComments\" DataType=\"ns=1;i=1004\" ValueRank=\"1\" />\n    </Definition>\n  </UADataType>\n  <UAObjectType NodeId=\"ns=1;i=10092\" BrowseName=\"1:MethodTestType\">\n    <DisplayName>MethodTestType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10093</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10096</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10099</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10102</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10105</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10108</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10111</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10114</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10117</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10120</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=61</Reference>\n    </References>\n  </UAObjectType>\n  <UAMethod NodeId=\"ns=1;i=10093\" BrowseName=\"1:ScalarMethod1\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>ScalarMethod1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10094</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10095</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10094\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10093\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10093</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanIn</Name>\n              <DataType>\n                <Identifier>i=1</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteIn</Name>\n              <DataType>\n                <Identifier>i=2</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteIn</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16In</Name>\n              <DataType>\n                <Identifier>i=4</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16In</Name>\n              <DataType>\n                <Identifier>i=5</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32In</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32In</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64In</Name>\n              <DataType>\n                <Identifier>i=8</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64In</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatIn</Name>\n              <DataType>\n                <Identifier>i=10</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleIn</Name>\n              <DataType>\n                <Identifier>i=11</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10095\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10093\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10093</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanOut</Name>\n              <DataType>\n                <Identifier>i=1</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteOut</Name>\n              <DataType>\n                <Identifier>i=2</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteOut</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16Out</Name>\n              <DataType>\n                <Identifier>i=4</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16Out</Name>\n              <DataType>\n                <Identifier>i=5</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32Out</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32Out</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64Out</Name>\n              <DataType>\n                <Identifier>i=8</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64Out</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatOut</Name>\n              <DataType>\n                <Identifier>i=10</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleOut</Name>\n              <DataType>\n                <Identifier>i=11</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10096\" BrowseName=\"1:ScalarMethod2\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>ScalarMethod2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10097</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10098</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10097\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10096\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10096</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringIn</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeIn</Name>\n              <DataType>\n                <Identifier>i=13</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidIn</Name>\n              <DataType>\n                <Identifier>i=14</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringIn</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementIn</Name>\n              <DataType>\n                <Identifier>i=16</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdIn</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdIn</Name>\n              <DataType>\n                <Identifier>i=18</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameIn</Name>\n              <DataType>\n                <Identifier>i=20</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextIn</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeIn</Name>\n              <DataType>\n                <Identifier>i=19</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10098\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10096\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10096</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringOut</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeOut</Name>\n              <DataType>\n                <Identifier>i=13</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidOut</Name>\n              <DataType>\n                <Identifier>i=14</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringOut</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementOut</Name>\n              <DataType>\n                <Identifier>i=16</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdOut</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdOut</Name>\n              <DataType>\n                <Identifier>i=18</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameOut</Name>\n              <DataType>\n                <Identifier>i=20</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextOut</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeOut</Name>\n              <DataType>\n                <Identifier>i=19</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10099\" BrowseName=\"1:ScalarMethod3\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>ScalarMethod3</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10100</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10101</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10100\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10099\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10099</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantIn</Name>\n              <DataType>\n                <Identifier>i=24</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EnumerationIn</Name>\n              <DataType>\n                <Identifier>i=29</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StructureIn</Name>\n              <DataType>\n                <Identifier>i=22</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10101\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10099\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10099</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantOut</Name>\n              <DataType>\n                <Identifier>i=24</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EnumerationOut</Name>\n              <DataType>\n                <Identifier>i=29</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StructureOut</Name>\n              <DataType>\n                <Identifier>i=22</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10102\" BrowseName=\"1:ArrayMethod1\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>ArrayMethod1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10103</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10104</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10103\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10102\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10102</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanIn</Name>\n              <DataType>\n                <Identifier>i=1</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteIn</Name>\n              <DataType>\n                <Identifier>i=2</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteIn</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16In</Name>\n              <DataType>\n                <Identifier>i=4</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16In</Name>\n              <DataType>\n                <Identifier>i=5</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32In</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32In</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64In</Name>\n              <DataType>\n                <Identifier>i=8</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64In</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatIn</Name>\n              <DataType>\n                <Identifier>i=10</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleIn</Name>\n              <DataType>\n                <Identifier>i=11</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10104\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10102\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10102</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanOut</Name>\n              <DataType>\n                <Identifier>i=1</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteOut</Name>\n              <DataType>\n                <Identifier>i=2</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteOut</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16Out</Name>\n              <DataType>\n                <Identifier>i=4</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16Out</Name>\n              <DataType>\n                <Identifier>i=5</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32Out</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32Out</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64Out</Name>\n              <DataType>\n                <Identifier>i=8</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64Out</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatOut</Name>\n              <DataType>\n                <Identifier>i=10</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleOut</Name>\n              <DataType>\n                <Identifier>i=11</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10105\" BrowseName=\"1:ArrayMethod2\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>ArrayMethod2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10106</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10107</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10106\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10105\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10105</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringIn</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeIn</Name>\n              <DataType>\n                <Identifier>i=13</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidIn</Name>\n              <DataType>\n                <Identifier>i=14</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringIn</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementIn</Name>\n              <DataType>\n                <Identifier>i=16</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdIn</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdIn</Name>\n              <DataType>\n                <Identifier>i=18</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameIn</Name>\n              <DataType>\n                <Identifier>i=20</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextIn</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeIn</Name>\n              <DataType>\n                <Identifier>i=19</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10107\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10105\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10105</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringOut</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeOut</Name>\n              <DataType>\n                <Identifier>i=13</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidOut</Name>\n              <DataType>\n                <Identifier>i=14</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringOut</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementOut</Name>\n              <DataType>\n                <Identifier>i=16</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdOut</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdOut</Name>\n              <DataType>\n                <Identifier>i=18</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameOut</Name>\n              <DataType>\n                <Identifier>i=20</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextOut</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeOut</Name>\n              <DataType>\n                <Identifier>i=19</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10108\" BrowseName=\"1:ArrayMethod3\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>ArrayMethod3</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10109</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10110</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10109\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10108\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10108</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantIn</Name>\n              <DataType>\n                <Identifier>i=24</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EnumerationIn</Name>\n              <DataType>\n                <Identifier>i=29</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StructureIn</Name>\n              <DataType>\n                <Identifier>i=22</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10110\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10108\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10108</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantOut</Name>\n              <DataType>\n                <Identifier>i=24</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EnumerationOut</Name>\n              <DataType>\n                <Identifier>i=29</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StructureOut</Name>\n              <DataType>\n                <Identifier>i=22</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10111\" BrowseName=\"1:UserScalarMethod1\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>UserScalarMethod1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10112</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10113</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10112\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10111\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10111</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9898</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9899</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9900</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9901</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9902</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9903</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9904</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9905</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9906</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9907</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9908</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9909</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10113\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10111\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10111</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9898</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9899</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9900</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9901</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9902</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9903</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9904</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9905</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9906</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9907</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9908</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9909</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10114\" BrowseName=\"1:UserScalarMethod2\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>UserScalarMethod2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10115</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10116</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10115\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10114\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10114</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9910</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9911</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9912</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9913</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9914</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9915</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9916</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9917</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9918</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9919</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10116\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10114\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10114</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9910</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9911</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9912</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9913</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9914</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9915</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9916</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9917</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9918</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9919</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10117\" BrowseName=\"1:UserArrayMethod1\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>UserArrayMethod1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10118</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10119</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10118\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10117\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10117</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9898</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9899</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9900</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9901</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9902</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9903</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9904</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9905</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9906</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9907</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9908</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9909</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10119\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10117\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10117</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9898</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9899</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9900</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9901</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9902</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9903</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9904</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9905</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9906</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9907</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9908</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9909</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10120\" BrowseName=\"1:UserArrayMethod2\" ParentNodeId=\"ns=1;i=10092\">\n    <DisplayName>UserArrayMethod2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10121</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10122</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10092</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10121\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10120\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10120</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9910</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9911</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9912</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9913</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9914</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9915</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9916</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9917</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9918</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9919</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10122\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10120\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10120</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9910</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9911</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9912</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9913</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9914</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9915</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9916</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9917</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9918</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9919</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=10123\" BrowseName=\"1:TestSystemConditionType\">\n    <DisplayName>TestSystemConditionType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10156</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=2782</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=10156\" BrowseName=\"1:MonitoredNodeCount\" ParentNodeId=\"ns=1;i=10123\" DataType=\"Int32\">\n    <DisplayName>MonitoredNodeCount</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10123</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10157\" BrowseName=\"1:Data\" EventNotifier=\"1\">\n    <DisplayName>Data</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10158</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10786</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11383</Reference>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=85</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">i=2253</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=10158</Reference>\n      <Reference ReferenceType=\"HasNotifier\">ns=1;i=10786</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=61</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=10158\" BrowseName=\"1:Static\" ParentNodeId=\"ns=1;i=10157\" EventNotifier=\"1\">\n    <DisplayName>Static</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10159</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10243</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10327</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10406</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10485</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10620</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10755</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=10157</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10159</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10243</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=61</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10157</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=10159\" BrowseName=\"1:Scalar\" ParentNodeId=\"ns=1;i=10158\">\n    <DisplayName>Scalar</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10160</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10161</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10163</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10216</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10217</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10218</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10219</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10220</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10221</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10222</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10223</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10224</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10225</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10226</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10227</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10228</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10229</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10230</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10231</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10232</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10233</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10234</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10235</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10236</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10237</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10238</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10239</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10240</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10241</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10242</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10158</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10163</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9450</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10158</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10160\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10161\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10159\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10162</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10162\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10161\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10161</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10163\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10159\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10164</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10165</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10166</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10167</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10168</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10169</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10171</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10172</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11594</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11595</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11565</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10173</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10174</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10175</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10181</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10185</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10187</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10189</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10191</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10190</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10192</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10196</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10212</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10159</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10164\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10163\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10165\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10163\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10166\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10163\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10167\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10163\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10168\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10163\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10169\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10163\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10171\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10163\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10172\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10163\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11594\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10163\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11595\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10163\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11565\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10163\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10173\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10163\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10174\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10163\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10175\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10163\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10176</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10196</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10204</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10176\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10175\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10175</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10181\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10163\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10182</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10182\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10181\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10181</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10185\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10163\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10186</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10186\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10185\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10185</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10187\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10163\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10188</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10188\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10187\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10187</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10189\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10163\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10191\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10163\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10190\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10163\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10192\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10163\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10193</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10193\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10192\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10192</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10196\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10163\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10197</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10175</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10197\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10196\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10196</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10212\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10163\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10213</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10163</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10213\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10212\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10212</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10216\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Boolean\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10217\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"SByte\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10218\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Byte\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10219\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Int16\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10220\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10159\" DataType=\"UInt16\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10221\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Int32\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10222\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10159\" DataType=\"UInt32\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10223\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Int64\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10224\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10159\" DataType=\"UInt64\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10225\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Float\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10226\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Double\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10227\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"String\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10228\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"DateTime\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10229\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Guid\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10230\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"ByteString\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10231\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"XmlElement\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10232\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"NodeId\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10233\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"ExpandedNodeId\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10234\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"QualifiedName\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10235\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"LocalizedText\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10236\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"StatusCode\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10237\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=10159\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10238\" BrowseName=\"1:EnumerationValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"i=29\">\n    <DisplayName>EnumerationValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10239\" BrowseName=\"1:StructureValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Structure\">\n    <DisplayName>StructureValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10240\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Number\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10241\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"Integer\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10242\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=10159\" DataType=\"UInteger\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10159</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10243\" BrowseName=\"1:Array\" ParentNodeId=\"ns=1;i=10158\">\n    <DisplayName>Array</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10244</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10245</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10247</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10300</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10301</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10302</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10303</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10304</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10305</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10306</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10307</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10308</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10309</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10310</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10311</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10312</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10313</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10314</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10315</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10316</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10317</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10318</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10319</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10320</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10321</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10322</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10323</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10324</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10325</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10326</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10158</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10247</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9679</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10158</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10244\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10245\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10243\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10246</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10246\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10245\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10245</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10247\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10243\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10248</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10249</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10250</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10251</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10252</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10253</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10255</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10256</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11596</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11597</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11566</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10257</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10258</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10259</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10265</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10269</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10271</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10273</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10275</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10274</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10276</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10280</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10296</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10243</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10248\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10247\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10249\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10247\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10250\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10247\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10251\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10247\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10252\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10247\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10253\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10247\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10255\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10247\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10256\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10247\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11596\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10247\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11597\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10247\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11566\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10247\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10257\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10247\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10258\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10247\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10259\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10247\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10260</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10280</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10288</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10260\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10259\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10259</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10265\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10247\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10266</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10266\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10265\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10265</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10269\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10247\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10270</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10270\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10269\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10269</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10271\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10247\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10272</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10272\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10271\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10271</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10273\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10247\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10275\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10247\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10274\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10247\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10276\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10247\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10277</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10277\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10276\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10276</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10280\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10247\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10281</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10259</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10281\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10280\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10280</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10296\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10247\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10297</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10247</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10297\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10296\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10296</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10300\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Boolean\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10301\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"SByte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10302\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Byte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10303\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Int16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10304\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10243\" DataType=\"UInt16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10305\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Int32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10306\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10243\" DataType=\"UInt32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10307\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Int64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10308\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10243\" DataType=\"UInt64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10309\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Float\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10310\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Double\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10311\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10312\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"DateTime\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10313\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Guid\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10314\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"ByteString\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10315\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"XmlElement\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10316\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"NodeId\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10317\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"ExpandedNodeId\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10318\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"QualifiedName\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10319\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10320\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"StatusCode\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10321\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=10243\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10322\" BrowseName=\"1:EnumerationValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"i=29\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>EnumerationValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10323\" BrowseName=\"1:StructureValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Structure\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StructureValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10324\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Number\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10325\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"Integer\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10326\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=10243\" DataType=\"UInteger\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10243</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10327\" BrowseName=\"1:UserScalar\" ParentNodeId=\"ns=1;i=10158\">\n    <DisplayName>UserScalar</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10328</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10329</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10331</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10384</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10385</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10386</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10387</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10388</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10389</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10390</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10391</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10392</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10393</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10394</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10395</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10396</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10397</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10398</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10399</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10400</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10401</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10402</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10403</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10404</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10405</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10331</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9921</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10158</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10328\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10327\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10329\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10327\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10330</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10330\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10329\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10329</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10331\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10327\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10332</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10333</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10334</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10335</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10336</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10337</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10339</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10340</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11598</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11599</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11567</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10341</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10342</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10343</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10349</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10353</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10355</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10357</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10359</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10358</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10360</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10364</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10380</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10327</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10332\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10331\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10333\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10331\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10334\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10331\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10335\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10331\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10336\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10331\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10337\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10331\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10339\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10331\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10340\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10331\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11598\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10331\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11599\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10331\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11567\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10331\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10341\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10331\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10342\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10331\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10343\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10331\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10344</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10364</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10372</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10344\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10343\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10343</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10349\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10331\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10350</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10350\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10349\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10349</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10353\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10331\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10354</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10354\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10353\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10353</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10355\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10331\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10356</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10356\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10355\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10355</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10357\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10331\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10359\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10331\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10358\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10331\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10360\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10331\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10361</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10361\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10360\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10360</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10364\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10331\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10365</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10343</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10365\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10364\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10364</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10380\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10331\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10381</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10331</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10381\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10380\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10380</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10384\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9898\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10385\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9899\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10386\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9900\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10387\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9901\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10388\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9902\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10389\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9903\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10390\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9904\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10391\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9905\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10392\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9906\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10393\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9907\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10394\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9908\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10395\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9909\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10396\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9910\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10397\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9911\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10398\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9912\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10399\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9913\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10400\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9914\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10401\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9915\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10402\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9916\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10403\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9917\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10404\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9918\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10405\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=10327\" DataType=\"ns=1;i=9919\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10327</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10406\" BrowseName=\"1:UserArray\" ParentNodeId=\"ns=1;i=10158\">\n    <DisplayName>UserArray</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10407</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10408</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10410</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10463</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10464</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10465</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10466</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10467</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10468</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10469</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10470</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10471</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10472</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10473</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10474</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10475</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10476</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10477</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10478</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10479</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10480</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10481</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10482</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10483</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10484</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10410</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=10007</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10158</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10407\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10406\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10408\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10406\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10409</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10409\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10408\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10408</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10410\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10406\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10411</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10412</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10413</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10414</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10415</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10416</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10418</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10419</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11600</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11601</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11568</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10420</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10421</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10422</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10428</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10432</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10434</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10436</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10438</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10437</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10439</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10443</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10459</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10406</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10411\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10410\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10412\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10410\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10413\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10410\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10414\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10410\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10415\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10410\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10416\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10410\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10418\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10410\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10419\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10410\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11600\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10410\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11601\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10410\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11568\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10410\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10420\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10410\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10421\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10410\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10422\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10410\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10423</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10443</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10451</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10423\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10422\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10422</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10428\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10410\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10429</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10429\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10428\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10428</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10432\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10410\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10433</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10433\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10432\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10432</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10434\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10410\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10435</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10435\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10434\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10434</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10436\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10410\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10438\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10410\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10437\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10410\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10439\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10410\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10440</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10440\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10439\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10439</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10443\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10410\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10444</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10422</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10444\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10443\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10443</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10459\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10410\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10460</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10410</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10460\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10459\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10459</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10463\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9898\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10464\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9899\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10465\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9900\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10466\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9901\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10467\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9902\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10468\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9903\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10469\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9904\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10470\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9905\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10471\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9906\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10472\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9907\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10473\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9908\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10474\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9909\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10475\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9910\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10476\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9911\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10477\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9912\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10478\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9913\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10479\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9914\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10480\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9915\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10481\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9916\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10482\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9917\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10483\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9918\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10484\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=10406\" DataType=\"ns=1;i=9919\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10406</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10485\" BrowseName=\"1:AnalogScalar\" ParentNodeId=\"ns=1;i=10158\">\n    <DisplayName>AnalogScalar</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10486</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10487</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10489</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10542</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10548</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10554</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10560</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10566</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10572</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10578</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10584</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10590</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10596</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10602</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10608</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10614</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10489</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9534</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10158</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10486\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10487\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10485\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10488</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10488\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10487\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10487</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10489\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10485\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10490</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10491</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10492</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10493</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10494</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10495</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10497</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10498</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11602</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11603</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11569</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10499</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10500</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10501</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10507</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10511</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10513</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10515</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10517</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10516</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10518</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10522</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10538</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10485</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10490\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10489\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10491\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10489\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10492\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10489\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10493\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10489\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10494\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10489\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10495\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10489\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10497\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10489\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10498\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10489\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11602\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10489\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11603\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10489\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11569\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10489\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10499\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10489\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10500\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10489\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10501\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10489\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10502</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10522</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10530</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10502\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10501\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10501</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10507\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10489\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10508</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10508\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10507\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10507</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10511\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10489\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10512</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10512\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10511\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10511</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10513\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10489\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10514</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10514\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10513\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10513</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10515\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10489\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10517\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10489\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10516\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10489\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10518\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10489\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10519</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10519\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10518\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10518</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10522\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10489\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10523</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10501</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10523\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10522\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10522</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10538\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10489\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10539</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10489</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10539\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10538\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10538</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10542\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10485\" DataType=\"SByte\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10545</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10545\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10542\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10542</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10548\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Byte\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10551</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10551\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10548\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10548</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10554\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Int16\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10557</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10557\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10554\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10554</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10560\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10485\" DataType=\"UInt16\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10563</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10563\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10560\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10560</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10566\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Int32\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10569</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10569\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10566\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10566</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10572\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10485\" DataType=\"UInt32\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10575</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10575\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10572\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10572</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10578\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Int64\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10581</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10581\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10578\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10578</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10584\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10485\" DataType=\"UInt64\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10587</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10587\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10584\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10584</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10590\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Float\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10593</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10593\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10590\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10590</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10596\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Double\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10599</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10599\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10596\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10596</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10602\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Number\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10605</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10605\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10602\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10602</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10608\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=10485\" DataType=\"Integer\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10611</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10611\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10608\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10608</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10614\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=10485\" DataType=\"UInteger\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10617</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10485</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10617\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10614\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10614</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10620\" BrowseName=\"1:AnalogArray\" ParentNodeId=\"ns=1;i=10158\">\n    <DisplayName>AnalogArray</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10621</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10622</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10624</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10677</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10683</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10689</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10695</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10701</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10707</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10713</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10719</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10725</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10731</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10737</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10743</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10749</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10624</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9763</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10158</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10621\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10622\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10620\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10623</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10623\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10622\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10622</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10624\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10620\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10625</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10626</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10627</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10628</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10629</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10630</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10632</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10633</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11604</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11605</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11570</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10634</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10635</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10636</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10642</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10646</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10648</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10650</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10652</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10651</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10653</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10657</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10673</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10620</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10625\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10624\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10626\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10624\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10627\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10624\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10628\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10624\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10629\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10624\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10630\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10624\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10632\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10624\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10633\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10624\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11604\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10624\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11605\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10624\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11570\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10624\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10634\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10624\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10635\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10624\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10636\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10624\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10637</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10657</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10665</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10637\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10636\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10636</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10642\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10624\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10643</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10643\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10642\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10642</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10646\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10624\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10647</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10647\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10646\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10646</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10648\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10624\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10649</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10649\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10648\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10648</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10650\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10624\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10652\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10624\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10651\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10624\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10653\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10624\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10654</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10654\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10653\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10653</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10657\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10624\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10658</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10636</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10658\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10657\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10657</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10673\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10624\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10674</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10624</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10674\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10673\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10673</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10677\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10620\" DataType=\"SByte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10680</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10680\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10677\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10677</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10683\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Byte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10686</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10686\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10683\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10683</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10689\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Int16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10692</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10692\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10689\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10689</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10695\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10620\" DataType=\"UInt16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10698</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10698\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10695\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10695</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10701\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Int32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10704</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10704\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10701\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10701</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10707\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10620\" DataType=\"UInt32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10710</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10710\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10707\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10707</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10713\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Int64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10716</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10716\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10713\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10713</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10719\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10620\" DataType=\"UInt64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10722</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10722\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10719\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10719</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10725\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Float\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10728</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10728\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10725\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10725</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10731\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Double\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10734</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10734\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10731\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10731</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10737\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Number\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10740</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10740\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10737\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10737</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10743\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=10620\" DataType=\"Integer\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10746</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10746\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10743\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10743</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10749\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=10620\" DataType=\"UInteger\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10752</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10620</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10752\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=10749\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10749</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10755\" BrowseName=\"1:MethodTest\" ParentNodeId=\"ns=1;i=10158\">\n    <DisplayName>MethodTest</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10756</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10759</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10762</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10765</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10768</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10771</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10774</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10777</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10780</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10783</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=10092</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10158</Reference>\n    </References>\n  </UAObject>\n  <UAMethod NodeId=\"ns=1;i=10756\" BrowseName=\"1:ScalarMethod1\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10093\">\n    <DisplayName>ScalarMethod1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10757</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10758</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10757\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10756\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10756</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanIn</Name>\n              <DataType>\n                <Identifier>i=1</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteIn</Name>\n              <DataType>\n                <Identifier>i=2</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteIn</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16In</Name>\n              <DataType>\n                <Identifier>i=4</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16In</Name>\n              <DataType>\n                <Identifier>i=5</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32In</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32In</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64In</Name>\n              <DataType>\n                <Identifier>i=8</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64In</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatIn</Name>\n              <DataType>\n                <Identifier>i=10</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleIn</Name>\n              <DataType>\n                <Identifier>i=11</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10758\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10756\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10756</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanOut</Name>\n              <DataType>\n                <Identifier>i=1</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteOut</Name>\n              <DataType>\n                <Identifier>i=2</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteOut</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16Out</Name>\n              <DataType>\n                <Identifier>i=4</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16Out</Name>\n              <DataType>\n                <Identifier>i=5</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32Out</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32Out</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64Out</Name>\n              <DataType>\n                <Identifier>i=8</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64Out</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatOut</Name>\n              <DataType>\n                <Identifier>i=10</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleOut</Name>\n              <DataType>\n                <Identifier>i=11</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10759\" BrowseName=\"1:ScalarMethod2\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10096\">\n    <DisplayName>ScalarMethod2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10760</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10761</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10760\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10759\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10759</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringIn</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeIn</Name>\n              <DataType>\n                <Identifier>i=13</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidIn</Name>\n              <DataType>\n                <Identifier>i=14</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringIn</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementIn</Name>\n              <DataType>\n                <Identifier>i=16</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdIn</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdIn</Name>\n              <DataType>\n                <Identifier>i=18</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameIn</Name>\n              <DataType>\n                <Identifier>i=20</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextIn</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeIn</Name>\n              <DataType>\n                <Identifier>i=19</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10761\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10759\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10759</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringOut</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeOut</Name>\n              <DataType>\n                <Identifier>i=13</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidOut</Name>\n              <DataType>\n                <Identifier>i=14</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringOut</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementOut</Name>\n              <DataType>\n                <Identifier>i=16</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdOut</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdOut</Name>\n              <DataType>\n                <Identifier>i=18</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameOut</Name>\n              <DataType>\n                <Identifier>i=20</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextOut</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeOut</Name>\n              <DataType>\n                <Identifier>i=19</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10762\" BrowseName=\"1:ScalarMethod3\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10099\">\n    <DisplayName>ScalarMethod3</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10763</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10764</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10763\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10762\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10762</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantIn</Name>\n              <DataType>\n                <Identifier>i=24</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EnumerationIn</Name>\n              <DataType>\n                <Identifier>i=29</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StructureIn</Name>\n              <DataType>\n                <Identifier>i=22</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10764\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10762\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10762</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantOut</Name>\n              <DataType>\n                <Identifier>i=24</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EnumerationOut</Name>\n              <DataType>\n                <Identifier>i=29</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StructureOut</Name>\n              <DataType>\n                <Identifier>i=22</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10765\" BrowseName=\"1:ArrayMethod1\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10102\">\n    <DisplayName>ArrayMethod1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10766</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10767</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10766\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10765\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10765</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanIn</Name>\n              <DataType>\n                <Identifier>i=1</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteIn</Name>\n              <DataType>\n                <Identifier>i=2</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteIn</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16In</Name>\n              <DataType>\n                <Identifier>i=4</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16In</Name>\n              <DataType>\n                <Identifier>i=5</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32In</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32In</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64In</Name>\n              <DataType>\n                <Identifier>i=8</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64In</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatIn</Name>\n              <DataType>\n                <Identifier>i=10</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleIn</Name>\n              <DataType>\n                <Identifier>i=11</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10767\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10765\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10765</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanOut</Name>\n              <DataType>\n                <Identifier>i=1</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteOut</Name>\n              <DataType>\n                <Identifier>i=2</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteOut</Name>\n              <DataType>\n                <Identifier>i=3</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16Out</Name>\n              <DataType>\n                <Identifier>i=4</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16Out</Name>\n              <DataType>\n                <Identifier>i=5</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32Out</Name>\n              <DataType>\n                <Identifier>i=6</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32Out</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64Out</Name>\n              <DataType>\n                <Identifier>i=8</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64Out</Name>\n              <DataType>\n                <Identifier>i=9</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatOut</Name>\n              <DataType>\n                <Identifier>i=10</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleOut</Name>\n              <DataType>\n                <Identifier>i=11</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10768\" BrowseName=\"1:ArrayMethod2\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10105\">\n    <DisplayName>ArrayMethod2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10769</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10770</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10769\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10768\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10768</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringIn</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeIn</Name>\n              <DataType>\n                <Identifier>i=13</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidIn</Name>\n              <DataType>\n                <Identifier>i=14</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringIn</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementIn</Name>\n              <DataType>\n                <Identifier>i=16</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdIn</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdIn</Name>\n              <DataType>\n                <Identifier>i=18</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameIn</Name>\n              <DataType>\n                <Identifier>i=20</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextIn</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeIn</Name>\n              <DataType>\n                <Identifier>i=19</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10770\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10768\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10768</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringOut</Name>\n              <DataType>\n                <Identifier>i=12</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeOut</Name>\n              <DataType>\n                <Identifier>i=13</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidOut</Name>\n              <DataType>\n                <Identifier>i=14</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringOut</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementOut</Name>\n              <DataType>\n                <Identifier>i=16</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdOut</Name>\n              <DataType>\n                <Identifier>i=17</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdOut</Name>\n              <DataType>\n                <Identifier>i=18</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameOut</Name>\n              <DataType>\n                <Identifier>i=20</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextOut</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeOut</Name>\n              <DataType>\n                <Identifier>i=19</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10771\" BrowseName=\"1:ArrayMethod3\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10108\">\n    <DisplayName>ArrayMethod3</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10772</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10773</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10772\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10771\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10771</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantIn</Name>\n              <DataType>\n                <Identifier>i=24</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EnumerationIn</Name>\n              <DataType>\n                <Identifier>i=29</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StructureIn</Name>\n              <DataType>\n                <Identifier>i=22</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10773\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10771\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10771</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantOut</Name>\n              <DataType>\n                <Identifier>i=24</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EnumerationOut</Name>\n              <DataType>\n                <Identifier>i=29</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StructureOut</Name>\n              <DataType>\n                <Identifier>i=22</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10774\" BrowseName=\"1:UserScalarMethod1\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10111\">\n    <DisplayName>UserScalarMethod1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10775</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10776</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10775\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10774\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10774</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9898</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9899</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9900</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9901</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9902</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9903</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9904</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9905</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9906</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9907</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9908</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9909</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10776\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10774\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10774</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9898</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9899</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9900</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9901</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9902</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9903</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9904</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9905</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9906</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9907</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9908</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9909</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10777\" BrowseName=\"1:UserScalarMethod2\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10114\">\n    <DisplayName>UserScalarMethod2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10778</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10779</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10778\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10777\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10777</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9910</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9911</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9912</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9913</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9914</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9915</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9916</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9917</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9918</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9919</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10779\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10777\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10777</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9910</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9911</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9912</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9913</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9914</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9915</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9916</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9917</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9918</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9919</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10780\" BrowseName=\"1:UserArrayMethod1\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10117\">\n    <DisplayName>UserArrayMethod1</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10781</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10782</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10781\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10780\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10780</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9898</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9899</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9900</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9901</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9902</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9903</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9904</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9905</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64In</Name>\n              <DataType>\n                <Identifier>ns=1;i=9906</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9907</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9908</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9909</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10782\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10780\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10780</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>BooleanOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9898</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>SByteOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9899</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9900</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int16Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9901</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt16Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9902</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int32Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9903</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt32Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9904</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Int64Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9905</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>UInt64Out</Name>\n              <DataType>\n                <Identifier>ns=1;i=9906</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>FloatOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9907</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DoubleOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9908</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StringOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9909</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10783\" BrowseName=\"1:UserArrayMethod2\" ParentNodeId=\"ns=1;i=10755\" MethodDeclarationId=\"ns=1;i=10120\">\n    <DisplayName>UserArrayMethod2</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10784</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10785</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10755</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10784\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10783\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10783</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9910</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9911</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9912</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9913</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9914</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9915</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9916</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9917</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9918</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantIn</Name>\n              <DataType>\n                <Identifier>ns=1;i=9919</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10785\" BrowseName=\"OutputArguments\" ParentNodeId=\"ns=1;i=10783\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>OutputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10783</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>DateTimeOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9910</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>GuidOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9911</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ByteStringOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9912</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>XmlElementOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9913</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>NodeIdOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9914</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>ExpandedNodeIdOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9915</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>QualifiedNameOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9916</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>LocalizedTextOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9917</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>StatusCodeOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9918</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>VariantOut</Name>\n              <DataType>\n                <Identifier>ns=1;i=9919</Identifier>\n              </DataType>\n              <ValueRank>1</ValueRank>\n              <ArrayDimensions>\n                <UInt32>0</UInt32>\n              </ArrayDimensions>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10786\" BrowseName=\"1:Dynamic\" ParentNodeId=\"ns=1;i=10157\" EventNotifier=\"1\">\n    <DisplayName>Dynamic</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10787</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10871</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10955</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11034</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11113</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11248</Reference>\n      <Reference ReferenceType=\"HasNotifier\" IsForward=\"false\">ns=1;i=10157</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10787</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10871</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=61</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10157</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=10787\" BrowseName=\"1:Scalar\" ParentNodeId=\"ns=1;i=10786\">\n    <DisplayName>Scalar</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10788</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10789</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10791</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10844</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10845</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10846</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10847</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10848</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10849</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10850</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10851</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10852</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10853</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10854</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10855</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10856</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10857</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10858</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10859</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10860</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10861</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10862</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10863</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10864</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10865</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10866</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10867</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10868</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10869</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10870</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10786</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10791</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9450</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10786</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10788\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10789\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10787\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10790</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10790\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10789\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10789</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10791\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10787\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10792</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10793</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10794</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10795</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10796</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10797</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10799</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10800</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11606</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11607</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11571</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10801</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10802</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10803</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10809</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10813</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10815</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10817</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10819</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10818</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10820</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10824</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10840</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10787</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10792\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10791\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10793\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10791\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10794\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10791\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10795\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10791\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10796\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10791\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10797\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10791\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10799\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10791\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10800\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10791\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11606\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10791\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11607\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10791\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11571\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10791\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10801\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10791\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10802\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10791\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10803\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10791\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10804</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10824</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10832</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10804\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10803\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10803</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10809\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10791\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10810</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10810\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10809\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10809</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10813\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10791\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10814</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10814\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10813\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10813</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10815\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10791\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10816</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10816\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10815\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10815</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10817\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10791\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10819\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10791\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10818\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10791\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10820\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10791\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10821</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10821\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10820\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10820</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10824\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10791\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10825</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10803</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10825\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10824\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10824</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10840\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10791\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10841</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10791</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10841\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10840\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10840</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10844\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Boolean\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10845\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"SByte\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10846\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Byte\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10847\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Int16\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10848\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10787\" DataType=\"UInt16\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10849\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Int32\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10850\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10787\" DataType=\"UInt32\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10851\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Int64\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10852\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10787\" DataType=\"UInt64\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10853\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Float\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10854\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Double\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10855\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"String\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10856\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"DateTime\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10857\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Guid\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10858\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"ByteString\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10859\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"XmlElement\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10860\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"NodeId\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10861\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"ExpandedNodeId\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10862\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"QualifiedName\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10863\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"LocalizedText\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10864\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"StatusCode\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10865\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=10787\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10866\" BrowseName=\"1:EnumerationValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"i=29\">\n    <DisplayName>EnumerationValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10867\" BrowseName=\"1:StructureValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Structure\">\n    <DisplayName>StructureValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10868\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Number\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10869\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"Integer\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10870\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=10787\" DataType=\"UInteger\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10787</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10871\" BrowseName=\"1:Array\" ParentNodeId=\"ns=1;i=10786\">\n    <DisplayName>Array</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10872</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10873</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10875</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10928</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10929</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10930</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10931</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10932</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10933</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10934</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10935</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10936</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10937</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10938</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10939</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10940</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10941</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10942</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10943</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10944</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10945</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10946</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10947</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10948</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10949</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10950</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10951</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10952</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10953</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10954</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10786</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10875</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9679</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10786</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10872\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10873\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10871\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10874</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10874\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10873\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10873</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10875\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10871\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10876</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10877</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10878</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10879</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10880</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10881</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10883</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10884</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11608</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11609</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11572</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10885</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10886</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10887</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10893</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10897</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10899</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10901</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10903</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10902</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10904</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10908</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10924</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10871</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10876\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10875\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10877\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10875\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10878\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10875\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10879\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10875\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10880\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10875\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10881\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10875\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10883\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10875\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10884\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10875\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11608\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10875\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11609\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10875\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11572\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10875\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10885\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10875\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10886\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10875\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10887\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10875\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10888</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10908</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10916</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10888\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10887\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10887</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10893\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10875\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10894</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10894\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10893\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10893</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10897\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10875\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10898</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10898\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10897\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10897</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10899\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10875\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10900</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10900\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10899\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10899</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10901\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10875\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10903\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10875\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10902\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10875\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10904\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10875\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10905</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10905\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10904\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10904</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10908\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10875\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10909</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10887</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10909\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10908\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10908</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10924\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10875\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10925</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10875</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10925\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10924\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10924</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10928\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Boolean\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10929\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"SByte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10930\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Byte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10931\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Int16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10932\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10871\" DataType=\"UInt16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10933\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Int32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10934\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10871\" DataType=\"UInt32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10935\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Int64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10936\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10871\" DataType=\"UInt64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10937\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Float\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10938\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Double\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10939\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"String\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10940\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"DateTime\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10941\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Guid\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10942\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"ByteString\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10943\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"XmlElement\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10944\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"NodeId\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10945\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"ExpandedNodeId\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10946\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"QualifiedName\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10947\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"LocalizedText\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10948\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"StatusCode\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10949\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=10871\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10950\" BrowseName=\"1:EnumerationValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"i=29\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>EnumerationValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10951\" BrowseName=\"1:StructureValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Structure\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StructureValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10952\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Number\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10953\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"Integer\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10954\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=10871\" DataType=\"UInteger\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10871</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10955\" BrowseName=\"1:UserScalar\" ParentNodeId=\"ns=1;i=10786\">\n    <DisplayName>UserScalar</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10956</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10957</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10959</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11012</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11013</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11014</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11015</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11016</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11017</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11018</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11019</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11020</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11021</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11022</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11023</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11024</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11025</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11026</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11027</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11028</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11029</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11030</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11031</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11032</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11033</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=10959</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9921</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10786</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10956\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=10955\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10957\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=10955\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10958</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10958\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10957\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10957</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=10959\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=10955\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10960</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10961</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10962</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10963</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10964</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10965</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10967</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10968</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11610</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11611</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11573</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10969</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10970</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10971</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10977</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10981</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10983</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10985</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10987</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10986</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10988</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=10992</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11008</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=10955</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=10960\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=10959\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10961\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=10959\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10962\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=10959\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10963\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=10959\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10964\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=10959\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10965\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=10959\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10967\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=10959\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10968\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=10959\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11610\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=10959\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11611\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=10959\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11573\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=10959\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10969\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=10959\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10970\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=10959\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10971\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=10959\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10972</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=10992</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=11000</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10972\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10971\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10971</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10977\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=10959\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10978</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10978\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10977\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10977</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10981\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=10959\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10982</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10982\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10981\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10981</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10983\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=10959\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10984</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10984\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=10983\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10983</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10985\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=10959\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=10987\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=10959\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10986\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=10959\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=10988\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=10959\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10989</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=10989\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=10988\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10988</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10992\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=10959\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=10993</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=10971</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=10993\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=10992\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=10992</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11008\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=10959\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11009</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10959</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11009\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11008\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11008</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11012\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9898\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11013\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9899\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11014\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9900\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11015\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9901\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11016\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9902\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11017\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9903\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11018\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9904\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11019\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9905\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11020\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9906\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11021\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9907\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11022\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9908\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11023\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9909\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11024\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9910\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11025\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9911\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11026\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9912\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11027\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9913\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11028\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9914\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11029\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9915\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11030\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9916\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11031\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9917\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11032\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9918\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11033\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=10955\" DataType=\"ns=1;i=9919\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10955</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11034\" BrowseName=\"1:UserArray\" ParentNodeId=\"ns=1;i=10786\">\n    <DisplayName>UserArray</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11035</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11036</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11038</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11091</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11092</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11093</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11094</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11095</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11096</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11097</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11098</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11099</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11100</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11101</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11102</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11103</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11104</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11105</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11106</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11107</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11108</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11109</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11110</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11111</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11112</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=11038</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=10007</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10786</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11035\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=11034\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11036\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=11034\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11037</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11037\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11036\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11036</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11038\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=11034\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11039</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11040</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11041</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11042</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11043</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11044</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11046</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11047</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11612</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11613</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11574</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11048</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11049</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11050</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11056</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11060</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11062</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11064</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11066</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11065</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11067</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11071</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11087</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=11034</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11039\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=11038\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11040\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=11038\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11041\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=11038\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11042\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=11038\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11043\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=11038\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11044\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=11038\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11046\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=11038\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11047\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=11038\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11612\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=11038\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11613\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=11038\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11574\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=11038\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11048\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=11038\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11049\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=11038\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11050\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=11038\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11051</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=11071</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=11079</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11051\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=11050\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11050</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11056\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=11038\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11057</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11057\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11056\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11056</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11060\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=11038\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11061</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11061\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11060\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11060</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11062\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=11038\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11063</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11063\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11062\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11062</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11064\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=11038\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11066\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=11038\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=11065\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=11038\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=11067\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=11038\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11068</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11068\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11067\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11067</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11071\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=11038\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11072</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=11050</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11072\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=11071\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11071</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11087\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=11038\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11088</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11038</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11088\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11087\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11087</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11091\" BrowseName=\"1:BooleanValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9898\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>BooleanValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11092\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9899\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11093\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9900\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11094\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9901\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11095\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9902\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11096\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9903\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11097\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9904\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11098\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9905\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11099\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9906\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11100\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9907\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11101\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9908\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11102\" BrowseName=\"1:StringValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9909\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11103\" BrowseName=\"1:DateTimeValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9910\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DateTimeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11104\" BrowseName=\"1:GuidValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9911\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>GuidValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11105\" BrowseName=\"1:ByteStringValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9912\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteStringValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11106\" BrowseName=\"1:XmlElementValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9913\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>XmlElementValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11107\" BrowseName=\"1:NodeIdValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9914\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11108\" BrowseName=\"1:ExpandedNodeIdValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9915\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ExpandedNodeIdValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11109\" BrowseName=\"1:QualifiedNameValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9916\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>QualifiedNameValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11110\" BrowseName=\"1:LocalizedTextValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9917\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>LocalizedTextValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11111\" BrowseName=\"1:StatusCodeValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9918\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>StatusCodeValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11112\" BrowseName=\"1:VariantValue\" ParentNodeId=\"ns=1;i=11034\" DataType=\"ns=1;i=9919\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>VariantValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11034</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11113\" BrowseName=\"1:AnalogScalar\" ParentNodeId=\"ns=1;i=10786\">\n    <DisplayName>AnalogScalar</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11114</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11115</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11117</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11170</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11176</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11182</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11188</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11194</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11200</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11206</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11212</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11218</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11224</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11230</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11236</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11242</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=11117</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9534</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10786</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11114\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11115\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=11113\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11116</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11116\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11115\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11115</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11117\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=11113\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11118</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11119</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11120</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11121</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11122</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11123</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11125</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11126</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11614</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11615</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11575</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11127</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11128</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11129</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11135</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11139</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11141</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11143</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11145</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11144</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11146</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11150</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11166</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=11113</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11118\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=11117\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11119\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=11117\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11120\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=11117\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11121\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=11117\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11122\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=11117\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11123\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=11117\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11125\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=11117\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11126\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=11117\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11614\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=11117\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11615\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=11117\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11575\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=11117\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11127\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=11117\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11128\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=11117\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11129\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=11117\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11130</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=11150</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=11158</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11130\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=11129\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11129</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11135\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=11117\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11136</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11136\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11135\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11135</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11139\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=11117\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11140</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11140\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11139\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11139</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11141\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=11117\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11142</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11142\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11141\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11141</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11143\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=11117\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11145\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=11117\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=11144\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=11117\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=11146\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=11117\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11147</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11147\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11146\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11146</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11150\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=11117\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11151</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=11129</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11151\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=11150\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11150</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11166\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=11117\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11167</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11117</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11167\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11166\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11166</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11170\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=11113\" DataType=\"SByte\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11173</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11173\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11170\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11170</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11176\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Byte\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11179</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11179\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11176\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11176</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11182\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Int16\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11185</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11185\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11182\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11182</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11188\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=11113\" DataType=\"UInt16\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11191</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11191\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11188\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11188</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11194\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Int32\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11197</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11197\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11194\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11194</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11200\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=11113\" DataType=\"UInt32\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11203</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11203\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11200\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11200</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11206\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Int64\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11209</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11209\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11206\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11206</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11212\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=11113\" DataType=\"UInt64\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11215</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11215\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11212\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11212</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11218\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Float\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11221</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11221\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11218\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11218</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11224\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Double\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11227</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11227\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11224\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11224</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11230\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Number\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11233</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11233\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11230\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11230</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11236\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=11113\" DataType=\"Integer\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11239</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11239\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11236\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11236</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11242\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=11113\" DataType=\"UInteger\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11245</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11113</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11245\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11242\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11242</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11248\" BrowseName=\"1:AnalogArray\" ParentNodeId=\"ns=1;i=10786\">\n    <DisplayName>AnalogArray</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11249</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11250</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11252</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11305</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11311</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11317</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11323</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11329</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11335</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11341</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11347</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11353</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11359</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11365</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11371</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11377</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=11252</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=9763</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10786</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11249\" BrowseName=\"1:SimulationActive\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Boolean\">\n    <DisplayName>SimulationActive</DisplayName>\n    <Description>If true the server will produce new values for each monitored variable.</Description>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11250\" BrowseName=\"1:GenerateValues\" ParentNodeId=\"ns=1;i=11248\" MethodDeclarationId=\"ns=1;i=9385\">\n    <DisplayName>GenerateValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11251</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11251\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11250\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11250</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Iterations</Name>\n              <DataType>\n                <Identifier>i=7</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The number of new values to generate.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11252\" BrowseName=\"1:CycleComplete\" ParentNodeId=\"ns=1;i=11248\">\n    <DisplayName>CycleComplete</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11253</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11254</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11255</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11256</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11257</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11258</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11260</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11261</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11616</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11617</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11576</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11262</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11263</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11264</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11270</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11274</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11276</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11278</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11280</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11279</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11281</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11285</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11301</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=11248</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2881</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11253\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=11252\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11254\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=11252\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11255\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=11252\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11256\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=11252\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11257\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=11252\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11258\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=11252\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11260\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=11252\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11261\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=11252\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11616\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=11252\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11617\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=11252\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11576\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=11252\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11262\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=11252\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11263\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=11252\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11264\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=11252\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11265</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=11285</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\">ns=1;i=11293</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11265\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=11264\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11264</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11270\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=11252\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11271</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11271\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11270\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11270</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11274\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=11252\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11275</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11275\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11274\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11274</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11276\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=11252\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11277</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11277\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11276\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11276</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11278\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=11252\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11280\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=11252\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=11279\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=11252\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=11281\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=11252\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11282</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11282\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11281\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11281</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11285\" BrowseName=\"AckedState\" ParentNodeId=\"ns=1;i=11252\" DataType=\"LocalizedText\">\n    <DisplayName>AckedState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11286</Reference>\n      <Reference ReferenceType=\"HasTrueSubState\" IsForward=\"false\">ns=1;i=11264</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11286\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=11285\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11285</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11301\" BrowseName=\"Acknowledge\" ParentNodeId=\"ns=1;i=11252\" MethodDeclarationId=\"i=9111\">\n    <DisplayName>Acknowledge</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11302</Reference>\n      <Reference ReferenceType=\"i=3065\">i=8944</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11252</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11302\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11301\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11301</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11305\" BrowseName=\"1:SByteValue\" ParentNodeId=\"ns=1;i=11248\" DataType=\"SByte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>SByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11308</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11308\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11305\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11305</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11311\" BrowseName=\"1:ByteValue\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Byte\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>ByteValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11314</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11314\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11311\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11311</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11317\" BrowseName=\"1:Int16Value\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Int16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11320</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11320\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11317\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11317</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11323\" BrowseName=\"1:UInt16Value\" ParentNodeId=\"ns=1;i=11248\" DataType=\"UInt16\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt16Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11326</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11326\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11323\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11323</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11329\" BrowseName=\"1:Int32Value\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Int32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11332</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11332\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11329\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11329</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11335\" BrowseName=\"1:UInt32Value\" ParentNodeId=\"ns=1;i=11248\" DataType=\"UInt32\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt32Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11338</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11338\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11335\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11335</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11341\" BrowseName=\"1:Int64Value\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Int64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>Int64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11344</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11344\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11341\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11341</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11347\" BrowseName=\"1:UInt64Value\" ParentNodeId=\"ns=1;i=11248\" DataType=\"UInt64\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UInt64Value</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11350</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11350\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11347\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11347</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11353\" BrowseName=\"1:FloatValue\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Float\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>FloatValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11356</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11356\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11353\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11353</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11359\" BrowseName=\"1:DoubleValue\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Double\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>DoubleValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11362</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11362\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11359\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11359</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11365\" BrowseName=\"1:NumberValue\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Number\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>NumberValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11368</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11368\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11365\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11365</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11371\" BrowseName=\"1:IntegerValue\" ParentNodeId=\"ns=1;i=11248\" DataType=\"Integer\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>IntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11374</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11374\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11371\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11371</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11377\" BrowseName=\"1:UIntegerValue\" ParentNodeId=\"ns=1;i=11248\" DataType=\"UInteger\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>UIntegerValue</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11380</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11248</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11380\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=11377\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11377</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11383\" BrowseName=\"1:Conditions\" ParentNodeId=\"ns=1;i=10157\" EventNotifier=\"1\">\n    <DisplayName>Conditions</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11384</Reference>\n      <Reference ReferenceType=\"HasEventSource\">ns=1;i=11384</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=61</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=10157</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=11384\" BrowseName=\"1:SystemStatus\" ParentNodeId=\"ns=1;i=11383\">\n    <DisplayName>SystemStatus</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11385</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11386</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11387</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11388</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11389</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11390</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11392</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11393</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11618</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11619</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11577</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11394</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11395</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11396</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11402</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11406</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11408</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11410</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11412</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11411</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11413</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11417</Reference>\n      <Reference ReferenceType=\"HasEventSource\" IsForward=\"false\">ns=1;i=11383</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=10123</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11383</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11385\" BrowseName=\"EventId\" ParentNodeId=\"ns=1;i=11384\" DataType=\"ByteString\">\n    <DisplayName>EventId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11386\" BrowseName=\"EventType\" ParentNodeId=\"ns=1;i=11384\" DataType=\"NodeId\">\n    <DisplayName>EventType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11387\" BrowseName=\"SourceNode\" ParentNodeId=\"ns=1;i=11384\" DataType=\"NodeId\">\n    <DisplayName>SourceNode</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11388\" BrowseName=\"SourceName\" ParentNodeId=\"ns=1;i=11384\" DataType=\"String\">\n    <DisplayName>SourceName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11389\" BrowseName=\"Time\" ParentNodeId=\"ns=1;i=11384\" DataType=\"i=294\">\n    <DisplayName>Time</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11390\" BrowseName=\"ReceiveTime\" ParentNodeId=\"ns=1;i=11384\" DataType=\"i=294\">\n    <DisplayName>ReceiveTime</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11392\" BrowseName=\"Message\" ParentNodeId=\"ns=1;i=11384\" DataType=\"LocalizedText\">\n    <DisplayName>Message</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11393\" BrowseName=\"Severity\" ParentNodeId=\"ns=1;i=11384\" DataType=\"UInt16\">\n    <DisplayName>Severity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11618\" BrowseName=\"ConditionClassId\" ParentNodeId=\"ns=1;i=11384\" DataType=\"NodeId\">\n    <DisplayName>ConditionClassId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11619\" BrowseName=\"ConditionClassName\" ParentNodeId=\"ns=1;i=11384\" DataType=\"LocalizedText\">\n    <DisplayName>ConditionClassName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11577\" BrowseName=\"ConditionName\" ParentNodeId=\"ns=1;i=11384\" DataType=\"String\">\n    <DisplayName>ConditionName</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11394\" BrowseName=\"BranchId\" ParentNodeId=\"ns=1;i=11384\" DataType=\"NodeId\">\n    <DisplayName>BranchId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11395\" BrowseName=\"Retain\" ParentNodeId=\"ns=1;i=11384\" DataType=\"Boolean\">\n    <DisplayName>Retain</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11396\" BrowseName=\"EnabledState\" ParentNodeId=\"ns=1;i=11384\" DataType=\"LocalizedText\">\n    <DisplayName>EnabledState</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11397</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=8995</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11397\" BrowseName=\"Id\" ParentNodeId=\"ns=1;i=11396\" DataType=\"Boolean\">\n    <DisplayName>Id</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11396</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11402\" BrowseName=\"Quality\" ParentNodeId=\"ns=1;i=11384\" DataType=\"StatusCode\">\n    <DisplayName>Quality</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11403</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11403\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11402\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11402</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11406\" BrowseName=\"LastSeverity\" ParentNodeId=\"ns=1;i=11384\" DataType=\"UInt16\">\n    <DisplayName>LastSeverity</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11407</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11407\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11406\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11406</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11408\" BrowseName=\"Comment\" ParentNodeId=\"ns=1;i=11384\" DataType=\"LocalizedText\">\n    <DisplayName>Comment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11409</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=9002</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11409\" BrowseName=\"SourceTimestamp\" ParentNodeId=\"ns=1;i=11408\" DataType=\"i=294\">\n    <DisplayName>SourceTimestamp</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11408</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11410\" BrowseName=\"ClientUserId\" ParentNodeId=\"ns=1;i=11384\" DataType=\"String\">\n    <DisplayName>ClientUserId</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAMethod NodeId=\"ns=1;i=11412\" BrowseName=\"Disable\" ParentNodeId=\"ns=1;i=11384\" MethodDeclarationId=\"i=9028\">\n    <DisplayName>Disable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=11411\" BrowseName=\"Enable\" ParentNodeId=\"ns=1;i=11384\" MethodDeclarationId=\"i=9027\">\n    <DisplayName>Enable</DisplayName>\n    <References>\n      <Reference ReferenceType=\"i=3065\">i=2803</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAMethod>\n  <UAMethod NodeId=\"ns=1;i=11413\" BrowseName=\"AddComment\" ParentNodeId=\"ns=1;i=11384\" MethodDeclarationId=\"i=9029\">\n    <DisplayName>AddComment</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11414</Reference>\n      <Reference ReferenceType=\"i=3065\">i=2829</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAMethod>\n  <UAVariable NodeId=\"ns=1;i=11414\" BrowseName=\"InputArguments\" ParentNodeId=\"ns=1;i=11413\" DataType=\"i=296\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>InputArguments</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11413</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>EventId</Name>\n              <DataType>\n                <Identifier>i=15</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The identifier for the event to comment.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=297</Identifier>\n          </TypeId>\n          <Body>\n            <Argument>\n              <Name>Comment</Name>\n              <DataType>\n                <Identifier>i=21</Identifier>\n              </DataType>\n              <ValueRank>-1</ValueRank>\n              <ArrayDimensions />\n              <Description>\n                <Text>The comment to add to the condition.</Text>\n              </Description>\n            </Argument>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11417\" BrowseName=\"1:MonitoredNodeCount\" ParentNodeId=\"ns=1;i=11384\" DataType=\"Int32\">\n    <DisplayName>MonitoredNodeCount</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11384</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11437\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9440</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=11425</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=11438\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9669</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=11428</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=11439\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9920</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=11431</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=11440\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=10006</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=11434</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1008\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1000</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=1015</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1011\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1004</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=24</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=1012\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=27</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11422\" BrowseName=\"1:TestData\" SymbolicName=\"TestData_BinarySchema\" ReleaseStatus=\"Deprecated\" DataType=\"ByteString\">\n    <DisplayName>TestData</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11424</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15045</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11425</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11428</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11431</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11434</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=1015</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=24</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=27</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=93</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS8iDQogIERlZmF1bHRCeXRl\nT3JkZXI9IkxpdHRsZUVuZGlhbiINCiAgVGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdC5vcmcv\nVUEvRGF0YS8iDQo+DQogIDxvcGM6SW1wb3J0IE5hbWVzcGFjZT0iaHR0cDovL29wY2ZvdW5kYXRp\nb24ub3JnL1VBLyIgTG9jYXRpb249Ik9wYy5VYS5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9w\nYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJTY2FsYXJWYWx1ZURhdGFUeXBlIiBCYXNlVHlwZT0idWE6\nRXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJvb2xlYW5WYWx1ZSIgVHlw\nZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpTQnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJ5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW50MTZWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVJbnQxNlZhbHVl\nIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDMyVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJW\nYWx1ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2\nNFZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUlu\ndDY0VmFsdWUiIFR5cGVOYW1lPSJvcGM6VUludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nRmxvYXRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpGbG9hdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIkRvdWJsZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlN0cmluZ1ZhbHVlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IkRhdGVUaW1lVmFsdWUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJHdWlkVmFsdWUiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAv\nPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudFZhbHVlIiBUeXBlTmFtZT0idWE6WG1s\nRWxlbWVudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZFZhbHVlIiBUeXBlTmFtZT0i\ndWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIg\nVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUXVh\nbGlmaWVkTmFtZVZhbHVlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkxvY2FsaXplZFRleHRWYWx1ZSIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRl\neHQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJ1\nYTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFudFZhbHVlIiBUeXBl\nTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkVudW1lcmF0aW9uVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdHJ1Y3R1\ncmVWYWx1ZSIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9iamVjdCIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik51bWJlciIgVHlwZU5hbWU9InVhOlZhcmlhbnQiIC8+DQogICAgPG9wYzpGaWVsZCBO\nYW1lPSJJbnRlZ2VyIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlVJbnRlZ2VyIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgPC9vcGM6U3RydWN0dXJl\nZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJBcnJheVZhbHVlRGF0YVR5cGUi\nIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P\nZkJvb2xlYW5WYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IkJvb2xlYW5WYWx1ZSIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiBMZW5ndGhGaWVsZD0iTm9P\nZkJvb2xlYW5WYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTQnl0ZVZhbHVlIiBU\neXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpTQnl0ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTQnl0ZVZhbHVlIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iTm9PZkJ5dGVWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4N\nCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJ5dGVWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlIiBMZW5n\ndGhGaWVsZD0iTm9PZkJ5dGVWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZJbnQx\nNlZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW50\nMTZWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQxNiIgTGVuZ3RoRmllbGQ9Ik5vT2ZJbnQxNlZhbHVl\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlVJbnQxNlZhbHVlIiBUeXBlTmFtZT0ib3Bj\nOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDE2VmFsdWUiIFR5cGVOYW1lPSJv\ncGM6VUludDE2IiBMZW5ndGhGaWVsZD0iTm9PZlVJbnQxNlZhbHVlIiAvPg0KICAgIDxvcGM6Rmll\nbGQgTmFtZT0iTm9PZkludDMyVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJJbnQzMlZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiBMZW5ndGhGaWVs\nZD0iTm9PZkludDMyVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludDMyVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJW\nYWx1ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIExlbmd0aEZpZWxkPSJOb09mVUludDMyVmFsdWUi\nIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mSW50NjRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJ\nbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDY0VmFsdWUiIFR5cGVOYW1lPSJvcGM6\nSW50NjQiIExlbmd0aEZpZWxkPSJOb09mSW50NjRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZVSW50NjRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZp\nZWxkIE5hbWU9IlVJbnQ2NFZhbHVlIiBUeXBlTmFtZT0ib3BjOlVJbnQ2NCIgTGVuZ3RoRmllbGQ9\nIk5vT2ZVSW50NjRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZGbG9hdFZhbHVl\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRmxvYXRWYWx1\nZSIgVHlwZU5hbWU9Im9wYzpGbG9hdCIgTGVuZ3RoRmllbGQ9Ik5vT2ZGbG9hdFZhbHVlIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRvdWJsZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMy\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRG91YmxlVmFsdWUiIFR5cGVOYW1lPSJvcGM6RG91\nYmxlIiBMZW5ndGhGaWVsZD0iTm9PZkRvdWJsZVZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iTm9PZlN0cmluZ1ZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6Rmll\nbGQgTmFtZT0iU3RyaW5nVmFsdWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5ndGhGaWVsZD0i\nTm9PZlN0cmluZ1ZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRhdGVUaW1lVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRlVGlt\nZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiBMZW5ndGhGaWVsZD0iTm9PZkRhdGVUaW1l\nVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mR3VpZFZhbHVlIiBUeXBlTmFtZT0i\nb3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iR3VpZFZhbHVlIiBUeXBlTmFtZT0i\nb3BjOkd1aWQiIExlbmd0aEZpZWxkPSJOb09mR3VpZFZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iTm9PZkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5n\nIiBMZW5ndGhGaWVsZD0iTm9PZkJ5dGVTdHJpbmdWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZYbWxFbGVtZW50VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJYbWxFbGVtZW50VmFsdWUiIFR5cGVOYW1lPSJ1YTpYbWxFbGVtZW50IiBM\nZW5ndGhGaWVsZD0iTm9PZlhtbEVsZW1lbnRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIk5vT2ZOb2RlSWRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5vZGVJZFZhbHVlIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBMZW5ndGhGaWVsZD0iTm9P\nZk5vZGVJZFZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkV4cGFuZGVkTm9kZUlk\nVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFeHBh\nbmRlZE5vZGVJZFZhbHVlIiBUeXBlTmFtZT0idWE6RXhwYW5kZWROb2RlSWQiIExlbmd0aEZpZWxk\nPSJOb09mRXhwYW5kZWROb2RlSWRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZR\ndWFsaWZpZWROYW1lVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJRdWFsaWZpZWROYW1lVmFsdWUiIFR5cGVOYW1lPSJ1YTpRdWFsaWZpZWROYW1lIiBM\nZW5ndGhGaWVsZD0iTm9PZlF1YWxpZmllZE5hbWVWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZMb2NhbGl6ZWRUZXh0VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJMb2NhbGl6ZWRUZXh0VmFsdWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6\nZWRUZXh0IiBMZW5ndGhGaWVsZD0iTm9PZkxvY2FsaXplZFRleHRWYWx1ZSIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9Ik5vT2ZTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJ1YTpTdGF0\ndXNDb2RlIiBMZW5ndGhGaWVsZD0iTm9PZlN0YXR1c0NvZGVWYWx1ZSIgLz4NCiAgICA8b3BjOkZp\nZWxkIE5hbWU9Ik5vT2ZWYXJpYW50VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJWYXJpYW50VmFsdWUiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5n\ndGhGaWVsZD0iTm9PZlZhcmlhbnRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZF\nbnVtZXJhdGlvblZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iRW51bWVyYXRpb25WYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTGVuZ3RoRmllbGQ9\nIk5vT2ZFbnVtZXJhdGlvblZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlN0cnVj\ndHVyZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nU3RydWN0dXJlVmFsdWUiIFR5cGVOYW1lPSJ1YTpFeHRlbnNpb25PYmplY3QiIExlbmd0aEZpZWxk\nPSJOb09mU3RydWN0dXJlVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTnVtYmVy\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTnVtYmVyIiBU\neXBlTmFtZT0idWE6VmFyaWFudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZOdW1iZXIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJOb09mSW50ZWdlciIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IkludGVnZXIiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5ndGhGaWVs\nZD0iTm9PZkludGVnZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludGVnZXIiIFR5\ncGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50ZWdlciIgVHlw\nZU5hbWU9InVhOlZhcmlhbnQiIExlbmd0aEZpZWxkPSJOb09mVUludGVnZXIiIC8+DQogIDwvb3Bj\nOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1lPSJCb29sZWFuRGF0YVR5\ncGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1lPSJTQnl0\nZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFt\nZT0iQnl0ZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5\ncGUgTmFtZT0iSW50MTZEYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpP\ncGFxdWVUeXBlIE5hbWU9IlVJbnQxNkRhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0K\nICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iSW50MzJEYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5\ncGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IlVJbnQzMkRhdGFUeXBlIj4NCiAgPC9vcGM6\nT3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iSW50NjREYXRhVHlwZSI+DQog\nIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IlVJbnQ2NERhdGFU\neXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iRmxv\nYXREYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5h\nbWU9IkRvdWJsZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1\nZVR5cGUgTmFtZT0iU3RyaW5nRGF0YVR5cGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxv\ncGM6T3BhcXVlVHlwZSBOYW1lPSJEYXRlVGltZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlw\nZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iR3VpZERhdGFUeXBlIj4NCiAgPC9vcGM6T3Bh\ncXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iQnl0ZVN0cmluZ0RhdGFUeXBlIj4N\nCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iWG1sRWxlbWVu\ndERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFt\nZT0iTm9kZUlkRGF0YVR5cGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVl\nVHlwZSBOYW1lPSJFeHBhbmRlZE5vZGVJZERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4N\nCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIj4NCiAgPC9v\ncGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iTG9jYWxpemVkVGV4dERh\ndGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0i\nU3RhdHVzQ29kZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1\nZVR5cGUgTmFtZT0iVmFyaWFudERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8\nb3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlVzZXJTY2FsYXJWYWx1ZURhdGFUeXBlIiBCYXNlVHlw\nZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJvb2xlYW5EYXRh\nVHlwZSIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5\ndGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpTQnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIkJ5dGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IlVJbnQxNkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkludDMyRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2NERhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDY0\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDY0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nVUludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRmxvYXREYXRhVHlwZSIgVHlwZU5hbWU9\nIm9wYzpGbG9hdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRvdWJsZURhdGFUeXBlIiBUeXBl\nTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0cmluZ0RhdGFUeXBl\nIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGVUaW1l\nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l\nPSJHdWlkRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IkJ5dGVTdHJpbmdEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudERhdGFUeXBlIiBUeXBlTmFtZT0idWE6WG1sRWxl\nbWVudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZERhdGFUeXBlIiBUeXBlTmFtZT0i\ndWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWREYXRhVHlw\nZSIgVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nUXVhbGlmaWVkTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgVHlwZU5hbWU9InVhOkxv\nY2FsaXplZFRleHQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlRGF0YVR5cGUi\nIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFu\ndERhdGFUeXBlIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5\ncGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJVc2VyQXJyYXlWYWx1ZURhdGFUeXBl\nIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZCb29sZWFuRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJCb29sZWFuRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgTGVuZ3RoRmll\nbGQ9Ik5vT2ZCb29sZWFuRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU0J5\ndGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIlNCeXRlRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6U0J5dGUiIExlbmd0aEZpZWxkPSJOb09mU0J5\ndGVEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZCeXRlRGF0YVR5cGUiIFR5\ncGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCeXRlRGF0YVR5cGUi\nIFR5cGVOYW1lPSJvcGM6Qnl0ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZCeXRlRGF0YVR5cGUiIC8+DQog\nICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQz\nMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDE2RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nSW50MTYiIExlbmd0aEZpZWxkPSJOb09mSW50MTZEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5vT2ZVSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IlVJbnQxNkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgTGVu\nZ3RoRmllbGQ9Ik5vT2ZVSW50MTZEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZJbnQzMkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iSW50MzJEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTGVuZ3RoRmllbGQ9Ik5v\nT2ZJbnQzMkRhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlVJbnQzMkRhdGFU\neXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDMy\nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiBMZW5ndGhGaWVsZD0iTm9PZlVJbnQzMkRh\ndGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkludDY0RGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2NERhdGFUeXBlIiBU\neXBlTmFtZT0ib3BjOkludDY0IiBMZW5ndGhGaWVsZD0iTm9PZkludDY0RGF0YVR5cGUiIC8+DQog\nICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludDY0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50\nMzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50NjREYXRhVHlwZSIgVHlwZU5hbWU9Im9w\nYzpVSW50NjQiIExlbmd0aEZpZWxkPSJOb09mVUludDY0RGF0YVR5cGUiIC8+DQogICAgPG9wYzpG\naWVsZCBOYW1lPSJOb09mRmxvYXREYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkZsb2F0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6RmxvYXQiIExl\nbmd0aEZpZWxkPSJOb09mRmxvYXREYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZEb3VibGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IkRvdWJsZURhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgTGVuZ3RoRmllbGQ9\nIk5vT2ZEb3VibGVEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTdHJpbmdE\nYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0\ncmluZ0RhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdHJp\nbmdEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEYXRlVGltZURhdGFUeXBl\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0ZVRpbWVE\nYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZEYXRlVGlt\nZURhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkd1aWREYXRhVHlwZSIgVHlw\nZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikd1aWREYXRhVHlwZSIg\nVHlwZU5hbWU9Im9wYzpHdWlkIiBMZW5ndGhGaWVsZD0iTm9PZkd1aWREYXRhVHlwZSIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZCeXRlU3RyaW5nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCeXRlU3RyaW5nRGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZCeXRlU3RyaW5nRGF0YVR5cGUi\nIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mWG1sRWxlbWVudERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudERhdGFUeXBl\nIiBUeXBlTmFtZT0idWE6WG1sRWxlbWVudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZYbWxFbGVtZW50RGF0\nYVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTm9kZUlkRGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb2RlSWREYXRhVHlwZSIg\nVHlwZU5hbWU9InVhOk5vZGVJZCIgTGVuZ3RoRmllbGQ9Ik5vT2ZOb2RlSWREYXRhVHlwZSIgLz4N\nCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZFeHBhbmRlZE5vZGVJZERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWREYXRh\nVHlwZSIgVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiBMZW5ndGhGaWVsZD0iTm9PZkV4cGFu\nZGVkTm9kZUlkRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUXVhbGlmaWVk\nTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgTGVu\nZ3RoRmllbGQ9Ik5vT2ZRdWFsaWZpZWROYW1lRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBO\nYW1lPSJOb09mTG9jYWxpemVkVGV4dERhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTG9jYWxpemVkVGV4dERhdGFUeXBlIiBUeXBlTmFtZT0idWE6\nTG9jYWxpemVkVGV4dCIgTGVuZ3RoRmllbGQ9Ik5vT2ZMb2NhbGl6ZWRUZXh0RGF0YVR5cGUiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU3RhdHVzQ29kZURhdGFUeXBlIiBUeXBlTmFtZT0i\nb3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhdHVzQ29kZURhdGFUeXBlIiBU\neXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdGF0dXNDb2RlRGF0YVR5\ncGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVmFyaWFudERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFudERhdGFUeXBlIiBU\neXBlTmFtZT0idWE6VmFyaWFudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZWYXJpYW50RGF0YVR5cGUiIC8+\nDQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i\nVmVjdG9yIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlgiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWSIg\nVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJaIiBUeXBlTmFt\nZT0ib3BjOkRvdWJsZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1\nY3R1cmVkVHlwZSBOYW1lPSJXb3JrT3JkZXJTdGF0dXNUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5z\naW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFjdG9yIiBUeXBlTmFtZT0ib3BjOlN0\ncmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRpbWVzdGFtcCIgVHlwZU5hbWU9Im9wYzpE\nYXRlVGltZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNvbW1lbnQiIFR5cGVOYW1lPSJ1YTpM\nb2NhbGl6ZWRUZXh0IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVj\ndHVyZWRUeXBlIE5hbWU9IldvcmtPcmRlclR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmpl\nY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSUQiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkFzc2V0SUQiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iU3RhcnRUaW1lIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlN0YXR1c0NvbW1lbnRzIiBUeXBlTmFtZT0ib3BjOklu\ndDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhdHVzQ29tbWVudHMiIFR5cGVOYW1lPSJ0\nbnM6V29ya09yZGVyU3RhdHVzVHlwZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdGF0dXNDb21tZW50cyIg\nLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCjwvb3BjOlR5cGVEaWN0aW9uYXJ5Pg==</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11424\" BrowseName=\"NamespaceUri\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://test.org/UA/Data/</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15045\" BrowseName=\"Deprecated\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11425\" BrowseName=\"1:ScalarValueDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"String\">\n    <DisplayName>ScalarValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ScalarValueDataType</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11428\" BrowseName=\"1:ArrayValueDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"String\">\n    <DisplayName>ArrayValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">ArrayValueDataType</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11431\" BrowseName=\"1:UserScalarValueDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"String\">\n    <DisplayName>UserScalarValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">UserScalarValueDataType</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11434\" BrowseName=\"1:UserArrayValueDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"String\">\n    <DisplayName>UserArrayValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">UserArrayValueDataType</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=1015\" BrowseName=\"1:Vector\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"String\">\n    <DisplayName>Vector</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">Vector</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=24\" BrowseName=\"1:WorkOrderStatusType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"String\">\n    <DisplayName>WorkOrderStatusType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">WorkOrderStatusType</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=27\" BrowseName=\"1:WorkOrderType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11422\" DataType=\"String\">\n    <DisplayName>WorkOrderType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11422</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">WorkOrderType</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=11418\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9440</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=11444</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=11419\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9669</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=11447</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=11420\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9920</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=11450</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=11421\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=10006</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=11453</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=36\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1000</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=43</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=39\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1004</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=52</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=40\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=55</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=11441\" BrowseName=\"1:TestData\" SymbolicName=\"TestData_XmlSchema\" ReleaseStatus=\"Deprecated\" DataType=\"ByteString\">\n    <DisplayName>TestData</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=11443</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15046</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11444</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11447</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11450</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=11453</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=43</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=52</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=55</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=92</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL3Rlc3Qub3JnL1VBL0RhdGEvIg0KICB0YXJnZXROYW1l\nc3BhY2U9Imh0dHA6Ly90ZXN0Lm9yZy9VQS9EYXRhLyINCiAgZWxlbWVudEZvcm1EZWZhdWx0PSJx\ndWFsaWZpZWQiDQo+DQogIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlv\nbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54c2QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9\nIlNjYWxhclZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IkJvb2xlYW5WYWx1ZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAv\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU0J5dGVWYWx1ZSIgdHlwZT0ieHM6Ynl0ZSIgbWlu\nT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZVZhbHVlIiB0eXBlPSJ4\nczp1bnNpZ25lZEJ5dGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9\nIkludDE2VmFsdWUiIHR5cGU9InhzOnNob3J0IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJVSW50MTZWYWx1ZSIgdHlwZT0ieHM6dW5zaWduZWRTaG9ydCIgbWluT2Nj\ndXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MzJWYWx1ZSIgdHlwZT0ieHM6\naW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJWYWx1\nZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IkludDY0VmFsdWUiIHR5cGU9InhzOmxvbmciIG1pbk9jY3Vycz0iMCIgLz4NCiAg\nICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQ2NFZhbHVlIiB0eXBlPSJ4czp1bnNpZ25lZExvbmci\nIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkZsb2F0VmFsdWUiIHR5\ncGU9InhzOmZsb2F0IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJE\nb3VibGVWYWx1ZSIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTdHJpbmdWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAi\nIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0ZVRpbWVWYWx1\nZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9Ikd1aWRWYWx1ZSIgdHlwZT0idWE6R3VpZCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg\nPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZVN0cmluZ1ZhbHVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnki\nIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l\nPSJYbWxFbGVtZW50VmFsdWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiPg0KICAgICAg\nICA8eHM6Y29tcGxleFR5cGU+DQogICAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgICAg\nPHhzOmFueSBtaW5PY2N1cnM9IjAiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPg0KICAgICAgICAg\nIDwveHM6c2VxdWVuY2U+DQogICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQogICAgICA8L3hzOmVs\nZW1lbnQ+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2RlSWRWYWx1ZSIgdHlwZT0idWE6Tm9k\nZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg\nbmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIgdHlwZT0idWE6RXhwYW5kZWROb2RlSWQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWFs\naWZpZWROYW1lVmFsdWUiIHR5cGU9InVhOlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGl6ZWRUZXh0VmFs\ndWUiIHR5cGU9InVhOkxvY2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlVmFsdWUiIHR5cGU9InVhOlN0\nYXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlZhcmlh\nbnRWYWx1ZSIgdHlwZT0idWE6VmFyaWFudCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVs\nZW1lbnQgbmFtZT0iRW51bWVyYXRpb25WYWx1ZSIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJ1Y3R1cmVWYWx1ZSIgdHlwZT0idWE6RXh0\nZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iTnVtYmVyIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnRlZ2VyIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50ZWdlciIgdHlwZT0idWE6\nVmFyaWFudCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t\ncGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlNjYWxhclZhbHVlRGF0YVR5cGUiIHR5cGU9\nInRuczpTY2FsYXJWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJM\naXN0T2ZTY2FsYXJWYWx1ZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTY2FsYXJWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6U2NhbGFyVmFsdWVE\nYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRy\ndWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVs\nZW1lbnQgbmFtZT0iTGlzdE9mU2NhbGFyVmFsdWVEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZlNj\nYWxhclZhbHVlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhz\nOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5VmFsdWVEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQm9vbGVhblZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZC\nb29sZWFuIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iU0J5dGVWYWx1ZSIgdHlwZT0idWE6TGlzdE9mU0J5dGUiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlVmFsdWUiIHR5\ncGU9InVhOkxpc3RPZkJ5dGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQxNlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQxNiIgbWlu\nT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJ\nbnQxNlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MTYiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9\nInRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQzMlZhbHVlIiB0eXBlPSJ1YTpM\naXN0T2ZJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IlVJbnQzMlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MzIiIG1pbk9jY3Vy\ncz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQ2NFZh\nbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQ2NCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQ2NFZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZV\nSW50NjQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJGbG9hdFZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZGbG9hdCIgbWluT2NjdXJzPSIwIiBu\naWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRvdWJsZVZhbHVlIiB0\neXBlPSJ1YTpMaXN0T2ZEb3VibGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog\nICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJpbmdWYWx1ZSIgdHlwZT0idWE6TGlzdE9mU3RyaW5n\nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt\nZT0iRGF0ZVRpbWVWYWx1ZSIgdHlwZT0idWE6TGlzdE9mRGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJHdWlkVmFsdWUiIHR5\ncGU9InVhOkxpc3RPZkd1aWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlU3RyaW5nVmFsdWUiIHR5cGU9InVhOkxpc3RPZkJ5dGVT\ndHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJYbWxFbGVtZW50VmFsdWUiIHR5cGU9InVhOkxpc3RPZlhtbEVsZW1lbnQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2Rl\nSWRWYWx1ZSIgdHlwZT0idWE6TGlzdE9mTm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0\ncnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIgdHlw\nZT0idWE6TGlzdE9mRXhwYW5kZWROb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWFsaWZpZWROYW1lVmFsdWUiIHR5cGU9InVh\nOkxpc3RPZlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog\nICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGl6ZWRUZXh0VmFsdWUiIHR5cGU9InVhOkxpc3RP\nZkxvY2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8\neHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlVmFsdWUiIHR5cGU9InVhOkxpc3RPZlN0YXR1c0Nv\nZGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJWYXJpYW50VmFsdWUiIHR5cGU9InVhOkxpc3RPZlZhcmlhbnQiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbnVtZXJhdGlvblZh\nbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0cnVjdHVyZVZhbHVlIiB0eXBlPSJ1YTpMaXN0\nT2ZFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJOdW1iZXIiIHR5cGU9InVhOkxpc3RPZlZhcmlhbnQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnRl\nZ2VyIiB0eXBlPSJ1YTpMaXN0T2ZWYXJpYW50IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVUludGVnZXIiIHR5cGU9InVhOkxpc3RPZlZh\ncmlhbnQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5j\nZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQXJyYXlWYWx1ZURh\ndGFUeXBlIiB0eXBlPSJ0bnM6QXJyYXlWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4\nVHlwZSBuYW1lPSJMaXN0T2ZBcnJheVZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFycmF5VmFsdWVEYXRhVHlwZSIgdHlwZT0idG5zOkFy\ncmF5VmFsdWVEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N\nCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQXJyYXlWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6\nTGlzdE9mQXJyYXlWYWx1ZURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0K\nDQogIDx4czplbGVtZW50IG5hbWU9IkJvb2xlYW5EYXRhVHlwZSIgdHlwZT0ieHM6Ym9vbGVhbiIg\nLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJTQnl0ZURhdGFUeXBlIiB0eXBlPSJ4czpieXRlIiAv\nPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkJ5dGVEYXRhVHlwZSIgdHlwZT0ieHM6dW5zaWduZWRC\neXRlIiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkludDE2RGF0YVR5cGUiIHR5cGU9InhzOnNo\nb3J0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IlVJbnQxNkRhdGFUeXBlIiB0eXBlPSJ4czp1\nbnNpZ25lZFNob3J0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkludDMyRGF0YVR5cGUiIHR5\ncGU9InhzOmludCIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJEYXRhVHlwZSIgdHlw\nZT0ieHM6dW5zaWduZWRJbnQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iSW50NjREYXRhVHlw\nZSIgdHlwZT0ieHM6bG9uZyIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50NjREYXRhVHlw\nZSIgdHlwZT0ieHM6dW5zaWduZWRMb25nIiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkZsb2F0\nRGF0YVR5cGUiIHR5cGU9InhzOmZsb2F0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkRvdWJs\nZURhdGFUeXBlIiB0eXBlPSJ4czpkb3VibGUiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iU3Ry\naW5nRGF0YVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJE\nYXRlVGltZURhdGFUeXBlIiB0eXBlPSJ4czpkYXRlVGltZSIgLz4NCg0KICA8eHM6ZWxlbWVudCBu\nYW1lPSJHdWlkRGF0YVR5cGUiIHR5cGU9InVhOkd1aWQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFt\nZT0iQnl0ZVN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIC8+DQoNCiAgPHhz\nOmVsZW1lbnQgbmFtZT0iWG1sRWxlbWVudERhdGFUeXBlIiB0eXBlPSJ1YTpYbWxFbGVtZW50IiAv\nPg0KDQogIDx4czplbGVtZW50IG5hbWU9Ik5vZGVJZERhdGFUeXBlIiB0eXBlPSJ1YTpOb2RlSWQi\nIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWREYXRhVHlwZSIgdHlwZT0i\ndWE6RXhwYW5kZWROb2RlSWQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iUXVhbGlmaWVkTmFt\nZURhdGFUeXBlIiB0eXBlPSJ1YTpRdWFsaWZpZWROYW1lIiAvPg0KDQogIDx4czplbGVtZW50IG5h\nbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgLz4NCg0K\nICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlRGF0YVR5cGUiIHR5cGU9InVhOlN0YXR1c0Nv\nZGUiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudERhdGFUeXBlIiB0eXBlPSJ1YTpW\nYXJpYW50IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJVc2VyU2NhbGFyVmFsdWVEYXRh\nVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQm9vbGVh\nbkRhdGFUeXBlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTQnl0ZURhdGFUeXBlIiB0eXBlPSJ4czpieXRlIiBtaW5PY2N1cnM9IjAi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlRGF0YVR5cGUiIHR5cGU9InhzOnVuc2ln\nbmVkQnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MTZE\nYXRhVHlwZSIgdHlwZT0ieHM6c2hvcnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IlVJbnQxNkRhdGFUeXBlIiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1\ncnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQzMkRhdGFUeXBlIiB0eXBlPSJ4\nczppbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQzMkRh\ndGFUeXBlIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iSW50NjREYXRhVHlwZSIgdHlwZT0ieHM6bG9uZyIgbWluT2NjdXJzPSIw\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVUludDY0RGF0YVR5cGUiIHR5cGU9InhzOnVu\nc2lnbmVkTG9uZyIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmxv\nYXREYXRhVHlwZSIgdHlwZT0ieHM6ZmxvYXQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IkRvdWJsZURhdGFUeXBlIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0i\nMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ4czpz\ndHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJEYXRlVGltZURhdGFUeXBlIiB0eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJzPSIw\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iR3VpZERhdGFUeXBlIiB0eXBlPSJ1YTpHdWlk\nIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlU3RyaW5nRGF0\nYVR5cGUiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1\nZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlhtbEVsZW1lbnREYXRhVHlwZSIgbWluT2Nj\ndXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSI+DQogICAgICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAg\nICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgcHJv\nY2Vzc0NvbnRlbnRzPSJsYXgiIC8+DQogICAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgICAg\nPC94czpjb21wbGV4VHlwZT4NCiAgICAgIDwveHM6ZWxlbWVudD4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9Ik5vZGVJZERhdGFUeXBlIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFeHBhbmRlZE5vZGVJZERh\ndGFUeXBlIiB0eXBlPSJ1YTpFeHBhbmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i\ndHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlF1YWxpZmllZE5hbWVEYXRhVHlwZSIg\ndHlwZT0idWE6UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgdHlwZT0idWE6\nTG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4\nczplbGVtZW50IG5hbWU9IlN0YXR1c0NvZGVEYXRhVHlwZSIgdHlwZT0idWE6U3RhdHVzQ29kZSIg\nbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudERhdGFUeXBl\nIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N\nCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVXNlclNjYWxhclZhbHVl\nRGF0YVR5cGUiIHR5cGU9InRuczpVc2VyU2NhbGFyVmFsdWVEYXRhVHlwZSIgLz4NCg0KICA8eHM6\nY29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVXNlclNjYWxhclZhbHVlRGF0YVR5cGUiPg0KICAgIDx4\nczpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJTY2FsYXJWYWx1ZURhdGFU\neXBlIiB0eXBlPSJ0bnM6VXNlclNjYWxhclZhbHVlRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4\nT2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+\nDQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlVzZXJTY2Fs\nYXJWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mVXNlclNjYWxhclZhbHVlRGF0YVR5cGUi\nIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9\nIlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IkJvb2xlYW5EYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mQm9vbGVhbiIgbWlu\nT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNC\neXRlRGF0YVR5cGUiIHR5cGU9InVhOkxpc3RPZlNCeXRlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl\nPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZURhdGFUeXBlIiB0eXBlPSJ0\nbnM6TGlzdE9mQnl0ZURhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K\nICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MTZEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mSW50\nMTYiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJVSW50MTZEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mVUludDE2IiBtaW5PY2N1cnM9IjAi\nIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MzJEYXRhVHlw\nZSIgdHlwZT0idWE6TGlzdE9mSW50MzIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9m\nVUludDMyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iSW50NjREYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mSW50NjQiIG1pbk9jY3Vycz0i\nMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50NjREYXRh\nVHlwZSIgdHlwZT0idWE6TGlzdE9mVUludDY0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmxvYXREYXRhVHlwZSIgdHlwZT0idWE6TGlz\ndE9mRmxvYXQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl\nbWVudCBuYW1lPSJEb3VibGVEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mRG91YmxlIiBtaW5PY2N1\ncnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RyaW5n\nRGF0YVR5cGUiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i\ndHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGVUaW1lRGF0YVR5cGUiIHR5cGU9\nInVhOkxpc3RPZkRhdGVUaW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nICAgPHhzOmVsZW1lbnQgbmFtZT0iR3VpZERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZHdWlkIiBt\naW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i\nQnl0ZVN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZCeXRlU3RyaW5nIiBtaW5PY2N1cnM9\nIjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iWG1sRWxlbWVu\ndERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZYbWxFbGVtZW50IiBtaW5PY2N1cnM9IjAiIG5pbGxh\nYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZUlkRGF0YVR5cGUiIHR5\ncGU9InVhOkxpc3RPZk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg\nICAgIDx4czplbGVtZW50IG5hbWU9IkV4cGFuZGVkTm9kZUlkRGF0YVR5cGUiIHR5cGU9InVhOkxp\nc3RPZkV4cGFuZGVkTm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0\nT2ZRdWFsaWZpZWROYW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg\nPHhzOmVsZW1lbnQgbmFtZT0iTG9jYWxpemVkVGV4dERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZM\nb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iU3RhdHVzQ29kZURhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZTdGF0dXND\nb2RlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg\nbmFtZT0iVmFyaWFudERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZWYXJpYW50IiBtaW5PY2N1cnM9\nIjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl\neFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiIHR5cGU9\nInRuczpVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l\nPSJMaXN0T2ZVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6VXNl\nckFycmF5VmFsdWVEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw\nZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVXNlckFycmF5VmFsdWVEYXRhVHlwZSIgdHlw\nZT0idG5zOkxpc3RPZlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hz\nOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZlY3RvciI+DQogICAgPHhzOnNl\ncXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iWCIgdHlwZT0ieHM6ZG91YmxlIiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJZIiB0eXBlPSJ4czpkb3VibGUi\nIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IloiIHR5cGU9InhzOmRv\ndWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl\neFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlZlY3RvciIgdHlwZT0idG5zOlZlY3RvciIgLz4N\nCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVmVjdG9yIj4NCiAgICA8eHM6c2VxdWVu\nY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWZWN0b3IiIHR5cGU9InRuczpWZWN0b3IiIG1p\nbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9\nIkxpc3RPZlZlY3RvciIgdHlwZT0idG5zOkxpc3RPZlZlY3RvciIgbmlsbGFibGU9InRydWUiPjwv\neHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyU3RhdHVzVHlw\nZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWN0b3IiIHR5\ncGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4\nczplbGVtZW50IG5hbWU9IlRpbWVzdGFtcCIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0i\nMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNvbW1lbnQiIHR5cGU9InVhOkxvY2FsaXpl\nZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5j\nZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iV29ya09yZGVyU3Rh\ndHVzVHlwZSIgdHlwZT0idG5zOldvcmtPcmRlclN0YXR1c1R5cGUiIC8+DQoNCiAgPHhzOmNvbXBs\nZXhUeXBlIG5hbWU9Ikxpc3RPZldvcmtPcmRlclN0YXR1c1R5cGUiPg0KICAgIDx4czpzZXF1ZW5j\nZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IldvcmtPcmRlclN0YXR1c1R5cGUiIHR5cGU9InRu\nczpXb3JrT3JkZXJTdGF0dXNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVk\nIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU\neXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZXb3JrT3JkZXJTdGF0dXNUeXBlIiB0eXBl\nPSJ0bnM6TGlzdE9mV29ya09yZGVyU3RhdHVzVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxl\nbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+DQogICAgPHhz\nOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSUQiIHR5cGU9InVhOkd1aWQiIG1p\nbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFzc2V0SUQiIHR5cGU9Inhz\nOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IlN0YXJ0VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXR1c0NvbW1lbnRzIiB0eXBlPSJ0bnM6TGlzdE9m\nV29ya09yZGVyU3RhdHVzVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg\nICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l\nPSJXb3JrT3JkZXJUeXBlIiB0eXBlPSJ0bnM6V29ya09yZGVyVHlwZSIgLz4NCg0KICA8eHM6Y29t\ncGxleFR5cGUgbmFtZT0iTGlzdE9mV29ya09yZGVyVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0K\nICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iV29ya09yZGVyVHlwZSIgdHlwZT0idG5zOldvcmtPcmRl\nclR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt\nZW50IG5hbWU9Ikxpc3RPZldvcmtPcmRlclR5cGUiIHR5cGU9InRuczpMaXN0T2ZXb3JrT3JkZXJU\neXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQo8L3hzOnNjaGVtYT4=</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11443\" BrowseName=\"NamespaceUri\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://test.org/UA/Data/</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15046\" BrowseName=\"Deprecated\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11444\" BrowseName=\"1:ScalarValueDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"String\">\n    <DisplayName>ScalarValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ScalarValueDataType']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11447\" BrowseName=\"1:ArrayValueDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"String\">\n    <DisplayName>ArrayValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='ArrayValueDataType']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11450\" BrowseName=\"1:UserScalarValueDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"String\">\n    <DisplayName>UserScalarValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='UserScalarValueDataType']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=11453\" BrowseName=\"1:UserArrayValueDataType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"String\">\n    <DisplayName>UserArrayValueDataType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='UserArrayValueDataType']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=43\" BrowseName=\"1:Vector\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"String\">\n    <DisplayName>Vector</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='Vector']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=52\" BrowseName=\"1:WorkOrderStatusType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"String\">\n    <DisplayName>WorkOrderStatusType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='WorkOrderStatusType']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=55\" BrowseName=\"1:WorkOrderType\" ReleaseStatus=\"Deprecated\" ParentNodeId=\"ns=1;i=11441\" DataType=\"String\">\n    <DisplayName>WorkOrderType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=11441</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='WorkOrderType']</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=15047\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9440</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=15048\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9669</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=15049\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=9920</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=15050\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=10006</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=64\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1000</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=67\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1004</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=68\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=1005</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://test.org/UA/Data/</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <GenerateValuesEventType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9371</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>GenerateValuesEventType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2041</uax:Identifier>\n    </uax:SuperTypeId>\n    <Iterations>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9381</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Iterations</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9381</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Iterations>\n    <NewValueCount>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9382</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NewValueCount</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9382</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NewValueCount>\n  </GenerateValuesEventType>\n  <TestDataObjectType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9383</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>TestDataObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=36</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9387</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <SimulationActive>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9384</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SimulationActive</uax:Name>\n      </uax:BrowseName>\n      <uax:Description>\n        <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n      </uax:Description>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9384</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </SimulationActive>\n    <GenerateValues>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9385</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>GenerateValues</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=9385</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9385</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9386</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9386</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Iterations</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=7</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                    <uax:Description>\n                      <uax:Text>The number of new values to generate.</uax:Text>\n                    </uax:Description>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n    </GenerateValues>\n    <CycleComplete>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9387</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>CycleComplete</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2881</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9387</uax:NumericId>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=36</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=9383</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <EventId xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9388</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EventId</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9388</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=15</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EventId>\n      <EventType xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9389</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EventType</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9389</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=17</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EventType>\n      <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9390</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>SourceNode</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9390</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=17</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </SourceNode>\n      <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9391</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>SourceName</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9391</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=12</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </SourceName>\n      <Time xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9392</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Time</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9392</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=294</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </Time>\n      <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9393</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>ReceiveTime</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9393</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=294</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </ReceiveTime>\n      <Message xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9395</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Message</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9395</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </Message>\n      <Severity xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9396</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Severity</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9396</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=5</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </Severity>\n      <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=11578</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>ConditionClassId</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>11578</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=17</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </ConditionClassId>\n      <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=11579</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>ConditionClassName</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>11579</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </ConditionClassName>\n      <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=11557</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>ConditionName</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>11557</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=12</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </ConditionName>\n      <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9397</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>BranchId</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9397</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=17</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </BranchId>\n      <Retain xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9398</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Retain</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9398</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=1</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </Retain>\n      <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9399</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EnabledState</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=8995</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9399</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <Id>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=9400</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Id</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>9400</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Id>\n      </EnabledState>\n      <Quality xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9405</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Quality</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=9002</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9405</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=19</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <SourceTimestamp>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=9406</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>SourceTimestamp</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>9406</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=294</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SourceTimestamp>\n      </Quality>\n      <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9409</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>LastSeverity</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=9002</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9409</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=5</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <SourceTimestamp>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=9410</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>SourceTimestamp</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>9410</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=294</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SourceTimestamp>\n      </LastSeverity>\n      <Comment xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9411</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Comment</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=9002</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9411</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <SourceTimestamp>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=9412</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>SourceTimestamp</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>9412</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=294</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SourceTimestamp>\n      </Comment>\n      <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9413</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>ClientUserId</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9413</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=12</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </ClientUserId>\n      <Disable xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9415</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Disable</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=9028</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9415</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=3065</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>i=2803</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </Disable>\n      <Enable xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9414</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Enable</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=9027</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9414</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=3065</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>i=2803</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n      </Enable>\n      <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9416</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>AddComment</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=9029</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9416</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=3065</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>i=2829</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <InputArguments>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=9417</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>InputArguments</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>9417</uax:NumericId>\n          <uax:Value>\n            <uax:Value>\n              <uax:ListOfExtensionObject>\n                <uax:ExtensionObject>\n                  <uax:TypeId>\n                    <uax:Identifier>i=297</uax:Identifier>\n                  </uax:TypeId>\n                  <uax:Body>\n                    <uax:Argument>\n                      <uax:Name>EventId</uax:Name>\n                      <uax:DataType>\n                        <uax:Identifier>i=15</uax:Identifier>\n                      </uax:DataType>\n                      <uax:ValueRank>-1</uax:ValueRank>\n                      <uax:ArrayDimensions />\n                      <uax:Description>\n                        <uax:Text>The identifier for the event to comment.</uax:Text>\n                      </uax:Description>\n                    </uax:Argument>\n                  </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                  <uax:TypeId>\n                    <uax:Identifier>i=297</uax:Identifier>\n                  </uax:TypeId>\n                  <uax:Body>\n                    <uax:Argument>\n                      <uax:Name>Comment</uax:Name>\n                      <uax:DataType>\n                        <uax:Identifier>i=21</uax:Identifier>\n                      </uax:DataType>\n                      <uax:ValueRank>-1</uax:ValueRank>\n                      <uax:ArrayDimensions />\n                      <uax:Description>\n                        <uax:Text>The comment to add to the condition.</uax:Text>\n                      </uax:Description>\n                    </uax:Argument>\n                  </uax:Body>\n                </uax:ExtensionObject>\n              </uax:ListOfExtensionObject>\n            </uax:Value>\n          </uax:Value>\n          <uax:DataType>\n            <uax:Identifier>i=296</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </InputArguments>\n      </AddComment>\n      <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9420</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>AckedState</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=8995</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9420</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=21</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        <Id>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=9421</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Id</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>9421</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Id>\n      </AckedState>\n      <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Method_4</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9436</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>Acknowledge</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=9111</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9436</uax:NumericId>\n        <uax:Executable>true</uax:Executable>\n        <uax:UserExecutable>true</uax:UserExecutable>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=3065</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>i=8944</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <InputArguments>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=9437</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>InputArguments</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>9437</uax:NumericId>\n          <uax:Value>\n            <uax:Value>\n              <uax:ListOfExtensionObject>\n                <uax:ExtensionObject>\n                  <uax:TypeId>\n                    <uax:Identifier>i=297</uax:Identifier>\n                  </uax:TypeId>\n                  <uax:Body>\n                    <uax:Argument>\n                      <uax:Name>EventId</uax:Name>\n                      <uax:DataType>\n                        <uax:Identifier>i=15</uax:Identifier>\n                      </uax:DataType>\n                      <uax:ValueRank>-1</uax:ValueRank>\n                      <uax:ArrayDimensions />\n                      <uax:Description>\n                        <uax:Text>The identifier for the event to comment.</uax:Text>\n                      </uax:Description>\n                    </uax:Argument>\n                  </uax:Body>\n                </uax:ExtensionObject>\n                <uax:ExtensionObject>\n                  <uax:TypeId>\n                    <uax:Identifier>i=297</uax:Identifier>\n                  </uax:TypeId>\n                  <uax:Body>\n                    <uax:Argument>\n                      <uax:Name>Comment</uax:Name>\n                      <uax:DataType>\n                        <uax:Identifier>i=21</uax:Identifier>\n                      </uax:DataType>\n                      <uax:ValueRank>-1</uax:ValueRank>\n                      <uax:ArrayDimensions />\n                      <uax:Description>\n                        <uax:Text>The comment to add to the condition.</uax:Text>\n                      </uax:Description>\n                    </uax:Argument>\n                  </uax:Body>\n                </uax:ExtensionObject>\n              </uax:ListOfExtensionObject>\n            </uax:Value>\n          </uax:Value>\n          <uax:DataType>\n            <uax:Identifier>i=296</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </InputArguments>\n      </Acknowledge>\n    </CycleComplete>\n  </TestDataObjectType>\n  <ScalarValueDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9440</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ScalarValueDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>BooleanValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>SByteValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=2</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ByteValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=3</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int16Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=4</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt16Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=5</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int32Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=6</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt32Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=7</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int64Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=8</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt64Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=9</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>FloatValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=10</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>DoubleValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=11</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StringValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>DateTimeValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=13</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>GuidValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=14</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ByteStringValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=15</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>XmlElementValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=16</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>NodeIdValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=17</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ExpandedNodeIdValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=18</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>QualifiedNameValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=20</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>LocalizedTextValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StatusCodeValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=19</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>VariantValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=24</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EnumerationValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=29</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StructureValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=22</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Number</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=26</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Integer</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=27</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInteger</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=28</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </ScalarValueDataType>\n  <ScalarValueObjectType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9450</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ScalarValueObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=9383</uax:Identifier>\n    </uax:SuperTypeId>\n    <BooleanValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9507</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>BooleanValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9507</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </BooleanValue>\n    <SByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9508</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9508</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=2</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </SByteValue>\n    <ByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9509</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9509</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=3</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ByteValue>\n    <Int16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9510</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9510</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=4</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int16Value>\n    <UInt16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9511</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9511</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=5</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt16Value>\n    <Int32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9512</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9512</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=6</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int32Value>\n    <UInt32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9513</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9513</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt32Value>\n    <Int64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9514</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9514</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=8</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int64Value>\n    <UInt64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9515</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9515</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=9</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt64Value>\n    <FloatValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9516</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FloatValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9516</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=10</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </FloatValue>\n    <DoubleValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9517</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DoubleValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9517</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DoubleValue>\n    <StringValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9518</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StringValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9518</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StringValue>\n    <DateTimeValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9519</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DateTimeValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9519</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=13</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DateTimeValue>\n    <GuidValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9520</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>GuidValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9520</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=14</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </GuidValue>\n    <ByteStringValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9521</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteStringValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9521</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=15</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ByteStringValue>\n    <XmlElementValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9522</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>XmlElementValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9522</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=16</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </XmlElementValue>\n    <NodeIdValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9523</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NodeIdValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9523</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=17</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NodeIdValue>\n    <ExpandedNodeIdValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9524</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ExpandedNodeIdValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9524</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=18</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ExpandedNodeIdValue>\n    <QualifiedNameValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9525</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>QualifiedNameValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9525</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=20</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </QualifiedNameValue>\n    <LocalizedTextValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9526</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>LocalizedTextValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9526</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=21</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </LocalizedTextValue>\n    <StatusCodeValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9527</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StatusCodeValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9527</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=19</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StatusCodeValue>\n    <VariantValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9528</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>VariantValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9528</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=24</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </VariantValue>\n    <EnumerationValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9529</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>EnumerationValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9529</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=29</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </EnumerationValue>\n    <StructureValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9530</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StructureValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9530</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=22</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StructureValue>\n    <NumberValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9531</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NumberValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9531</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=26</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NumberValue>\n    <IntegerValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9532</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>IntegerValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9532</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=27</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </IntegerValue>\n    <UIntegerValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9533</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UIntegerValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9533</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=28</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UIntegerValue>\n  </ScalarValueObjectType>\n  <AnalogScalarValueObjectType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9534</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>AnalogScalarValueObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=9383</uax:Identifier>\n    </uax:SuperTypeId>\n    <SByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9591</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9591</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=2</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9594</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9594</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </SByteValue>\n    <ByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9597</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9597</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=3</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9600</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9600</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </ByteValue>\n    <Int16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9603</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9603</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=4</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9606</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9606</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Int16Value>\n    <UInt16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9609</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9609</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=5</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9612</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9612</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </UInt16Value>\n    <Int32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9615</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9615</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=6</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9618</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9618</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Int32Value>\n    <UInt32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9621</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9621</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9624</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9624</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </UInt32Value>\n    <Int64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9627</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9627</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=8</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9630</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9630</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Int64Value>\n    <UInt64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9633</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9633</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=9</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9636</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9636</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </UInt64Value>\n    <FloatValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9639</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FloatValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9639</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=10</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9642</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9642</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </FloatValue>\n    <DoubleValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9645</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DoubleValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9645</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9648</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9648</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </DoubleValue>\n    <NumberValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9651</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NumberValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9651</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=26</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9654</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9654</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </NumberValue>\n    <IntegerValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9657</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>IntegerValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9657</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=27</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9660</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9660</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </IntegerValue>\n    <UIntegerValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9663</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UIntegerValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9663</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=28</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9666</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9666</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </UIntegerValue>\n  </AnalogScalarValueObjectType>\n  <ArrayValueDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9669</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ArrayValueDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>BooleanValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>SByteValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=2</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ByteValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=3</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int16Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=4</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt16Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=5</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int32Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=6</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt32Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=7</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int64Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=8</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt64Value</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=9</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>FloatValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=10</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>DoubleValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=11</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StringValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>DateTimeValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=13</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>GuidValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=14</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ByteStringValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=15</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>XmlElementValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=16</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>NodeIdValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=17</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ExpandedNodeIdValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=18</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>QualifiedNameValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=20</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>LocalizedTextValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StatusCodeValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=19</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>VariantValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=24</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>EnumerationValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=29</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StructureValue</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=22</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Number</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=26</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Integer</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=27</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInteger</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=28</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </ArrayValueDataType>\n  <ArrayValueObjectType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9679</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ArrayValueObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=9383</uax:Identifier>\n    </uax:SuperTypeId>\n    <BooleanValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9736</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>BooleanValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9736</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </BooleanValue>\n    <SByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9737</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9737</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=2</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </SByteValue>\n    <ByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9738</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9738</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=3</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ByteValue>\n    <Int16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9739</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9739</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=4</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int16Value>\n    <UInt16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9740</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9740</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=5</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt16Value>\n    <Int32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9741</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9741</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=6</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int32Value>\n    <UInt32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9742</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9742</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt32Value>\n    <Int64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9743</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9743</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=8</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int64Value>\n    <UInt64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9744</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9744</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=9</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt64Value>\n    <FloatValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9745</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FloatValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9745</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=10</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </FloatValue>\n    <DoubleValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9746</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DoubleValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9746</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DoubleValue>\n    <StringValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9747</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StringValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9747</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StringValue>\n    <DateTimeValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9748</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DateTimeValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9748</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=13</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DateTimeValue>\n    <GuidValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9749</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>GuidValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9749</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=14</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </GuidValue>\n    <ByteStringValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9750</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteStringValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9750</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=15</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ByteStringValue>\n    <XmlElementValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9751</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>XmlElementValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9751</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=16</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </XmlElementValue>\n    <NodeIdValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9752</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NodeIdValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9752</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=17</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NodeIdValue>\n    <ExpandedNodeIdValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9753</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ExpandedNodeIdValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9753</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=18</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ExpandedNodeIdValue>\n    <QualifiedNameValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9754</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>QualifiedNameValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9754</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=20</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </QualifiedNameValue>\n    <LocalizedTextValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9755</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>LocalizedTextValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9755</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=21</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </LocalizedTextValue>\n    <StatusCodeValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9756</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StatusCodeValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9756</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=19</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StatusCodeValue>\n    <VariantValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9757</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>VariantValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9757</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=24</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </VariantValue>\n    <EnumerationValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9758</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>EnumerationValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9758</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=29</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </EnumerationValue>\n    <StructureValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9759</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StructureValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9759</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=22</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StructureValue>\n    <NumberValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9760</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NumberValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9760</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=26</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NumberValue>\n    <IntegerValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9761</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>IntegerValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9761</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=27</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </IntegerValue>\n    <UIntegerValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9762</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UIntegerValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9762</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=28</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UIntegerValue>\n  </ArrayValueObjectType>\n  <AnalogArrayValueObjectType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9763</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>AnalogArrayValueObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=9383</uax:Identifier>\n    </uax:SuperTypeId>\n    <SByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9820</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9820</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=2</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9823</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9823</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </SByteValue>\n    <ByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9826</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9826</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=3</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9829</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9829</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </ByteValue>\n    <Int16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9832</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9832</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=4</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9835</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9835</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Int16Value>\n    <UInt16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9838</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9838</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=5</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9841</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9841</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </UInt16Value>\n    <Int32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9844</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9844</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=6</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9847</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9847</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Int32Value>\n    <UInt32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9850</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9850</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=7</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9853</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9853</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </UInt32Value>\n    <Int64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9856</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9856</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=8</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9859</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9859</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Int64Value>\n    <UInt64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9862</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9862</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=9</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9865</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9865</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </UInt64Value>\n    <FloatValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9868</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FloatValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9868</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=10</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9871</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9871</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </FloatValue>\n    <DoubleValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9874</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DoubleValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9874</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9877</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9877</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </DoubleValue>\n    <NumberValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9880</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NumberValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9880</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=26</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9883</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9883</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </NumberValue>\n    <IntegerValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9886</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>IntegerValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9886</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=27</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9889</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9889</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </IntegerValue>\n    <UIntegerValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9892</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UIntegerValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9892</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=28</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=9895</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>9895</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </UIntegerValue>\n  </AnalogArrayValueObjectType>\n  <BooleanDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9898</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>BooleanDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=1</uax:Identifier>\n    </uax:SuperTypeId>\n  </BooleanDataType>\n  <SByteDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9899</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SByteDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2</uax:Identifier>\n    </uax:SuperTypeId>\n  </SByteDataType>\n  <ByteDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9900</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ByteDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=3</uax:Identifier>\n    </uax:SuperTypeId>\n  </ByteDataType>\n  <Int16DataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9901</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Int16DataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=4</uax:Identifier>\n    </uax:SuperTypeId>\n  </Int16DataType>\n  <UInt16DataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9902</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>UInt16DataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=5</uax:Identifier>\n    </uax:SuperTypeId>\n  </UInt16DataType>\n  <Int32DataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9903</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Int32DataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=6</uax:Identifier>\n    </uax:SuperTypeId>\n  </Int32DataType>\n  <UInt32DataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9904</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>UInt32DataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=7</uax:Identifier>\n    </uax:SuperTypeId>\n  </UInt32DataType>\n  <Int64DataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9905</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Int64DataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=8</uax:Identifier>\n    </uax:SuperTypeId>\n  </Int64DataType>\n  <UInt64DataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9906</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>UInt64DataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=9</uax:Identifier>\n    </uax:SuperTypeId>\n  </UInt64DataType>\n  <FloatDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9907</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>FloatDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=10</uax:Identifier>\n    </uax:SuperTypeId>\n  </FloatDataType>\n  <DoubleDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9908</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>DoubleDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=11</uax:Identifier>\n    </uax:SuperTypeId>\n  </DoubleDataType>\n  <StringDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9909</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>StringDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=12</uax:Identifier>\n    </uax:SuperTypeId>\n  </StringDataType>\n  <DateTimeDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9910</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>DateTimeDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=13</uax:Identifier>\n    </uax:SuperTypeId>\n  </DateTimeDataType>\n  <GuidDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9911</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>GuidDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=14</uax:Identifier>\n    </uax:SuperTypeId>\n  </GuidDataType>\n  <ByteStringDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9912</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ByteStringDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:SuperTypeId>\n  </ByteStringDataType>\n  <XmlElementDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9913</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>XmlElementDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=16</uax:Identifier>\n    </uax:SuperTypeId>\n  </XmlElementDataType>\n  <NodeIdDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9914</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>NodeIdDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=17</uax:Identifier>\n    </uax:SuperTypeId>\n  </NodeIdDataType>\n  <ExpandedNodeIdDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9915</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>ExpandedNodeIdDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=18</uax:Identifier>\n    </uax:SuperTypeId>\n  </ExpandedNodeIdDataType>\n  <QualifiedNameDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9916</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>QualifiedNameDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=20</uax:Identifier>\n    </uax:SuperTypeId>\n  </QualifiedNameDataType>\n  <LocalizedTextDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9917</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>LocalizedTextDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=21</uax:Identifier>\n    </uax:SuperTypeId>\n  </LocalizedTextDataType>\n  <StatusCodeDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9918</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>StatusCodeDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=19</uax:Identifier>\n    </uax:SuperTypeId>\n  </StatusCodeDataType>\n  <VariantDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9919</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>VariantDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=24</uax:Identifier>\n    </uax:SuperTypeId>\n  </VariantDataType>\n  <UserScalarValueDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9920</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>UserScalarValueDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>BooleanDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9898</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>SByteDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9899</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ByteDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9900</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int16DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9901</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt16DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9902</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int32DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9903</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt32DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9904</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int64DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9905</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt64DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9906</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>FloatDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9907</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>DoubleDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9908</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StringDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9909</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>DateTimeDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9910</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>GuidDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9911</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ByteStringDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9912</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>XmlElementDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9913</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>NodeIdDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9914</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ExpandedNodeIdDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9915</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>QualifiedNameDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9916</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>LocalizedTextDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9917</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StatusCodeDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9918</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>VariantDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9919</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </UserScalarValueDataType>\n  <UserScalarValueObjectType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=9921</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>UserScalarValueObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=9383</uax:Identifier>\n    </uax:SuperTypeId>\n    <BooleanValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9978</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>BooleanValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9978</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9898</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </BooleanValue>\n    <SByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9979</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9979</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9899</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </SByteValue>\n    <ByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9980</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9980</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9900</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ByteValue>\n    <Int16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9981</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9981</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9901</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int16Value>\n    <UInt16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9982</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9982</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9902</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt16Value>\n    <Int32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9983</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9983</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9903</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int32Value>\n    <UInt32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9984</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9984</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9904</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt32Value>\n    <Int64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9985</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9985</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9905</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int64Value>\n    <UInt64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9986</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9986</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9906</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt64Value>\n    <FloatValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9987</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FloatValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9987</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9907</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </FloatValue>\n    <DoubleValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9988</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DoubleValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9988</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9908</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DoubleValue>\n    <StringValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9989</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StringValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9989</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9909</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StringValue>\n    <DateTimeValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9990</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DateTimeValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9990</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9910</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DateTimeValue>\n    <GuidValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9991</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>GuidValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9991</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9911</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </GuidValue>\n    <ByteStringValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9992</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteStringValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9992</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9912</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ByteStringValue>\n    <XmlElementValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9993</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>XmlElementValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9993</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9913</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </XmlElementValue>\n    <NodeIdValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9994</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NodeIdValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9994</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9914</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NodeIdValue>\n    <ExpandedNodeIdValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9995</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ExpandedNodeIdValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9995</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9915</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ExpandedNodeIdValue>\n    <QualifiedNameValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9996</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>QualifiedNameValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9996</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9916</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </QualifiedNameValue>\n    <LocalizedTextValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9997</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>LocalizedTextValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9997</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9917</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </LocalizedTextValue>\n    <StatusCodeValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9998</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StatusCodeValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9998</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9918</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StatusCodeValue>\n    <VariantValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=9999</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>VariantValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>9999</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9919</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </VariantValue>\n  </UserScalarValueObjectType>\n  <UserArrayValueDataType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=10006</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>UserArrayValueDataType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>BooleanDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9898</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>SByteDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9899</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ByteDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9900</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int16DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9901</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt16DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9902</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int32DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9903</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt32DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9904</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Int64DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9905</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>UInt64DataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9906</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>FloatDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9907</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>DoubleDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9908</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StringDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9909</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>DateTimeDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9910</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>GuidDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9911</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ByteStringDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9912</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>XmlElementDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9913</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>NodeIdDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9914</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ExpandedNodeIdDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9915</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>QualifiedNameDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9916</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>LocalizedTextDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9917</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StatusCodeDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9918</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>VariantDataType</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=9919</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </UserArrayValueDataType>\n  <UserArrayValueObjectType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=10007</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>UserArrayValueObjectType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=9383</uax:Identifier>\n    </uax:SuperTypeId>\n    <BooleanValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10064</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>BooleanValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10064</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9898</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </BooleanValue>\n    <SByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10065</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10065</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9899</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </SByteValue>\n    <ByteValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10066</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10066</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9900</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ByteValue>\n    <Int16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10067</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10067</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9901</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int16Value>\n    <UInt16Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10068</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt16Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10068</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9902</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt16Value>\n    <Int32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10069</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10069</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9903</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int32Value>\n    <UInt32Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10070</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt32Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10070</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9904</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt32Value>\n    <Int64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10071</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Int64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10071</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9905</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Int64Value>\n    <UInt64Value>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10072</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UInt64Value</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10072</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9906</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UInt64Value>\n    <FloatValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10073</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>FloatValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10073</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9907</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </FloatValue>\n    <DoubleValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10074</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DoubleValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10074</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9908</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DoubleValue>\n    <StringValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10075</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StringValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10075</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9909</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StringValue>\n    <DateTimeValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10076</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>DateTimeValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10076</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9910</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </DateTimeValue>\n    <GuidValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10077</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>GuidValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10077</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9911</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </GuidValue>\n    <ByteStringValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10078</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ByteStringValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10078</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9912</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ByteStringValue>\n    <XmlElementValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10079</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>XmlElementValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10079</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9913</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </XmlElementValue>\n    <NodeIdValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10080</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>NodeIdValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10080</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9914</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NodeIdValue>\n    <ExpandedNodeIdValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10081</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ExpandedNodeIdValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10081</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9915</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ExpandedNodeIdValue>\n    <QualifiedNameValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10082</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>QualifiedNameValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10082</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9916</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </QualifiedNameValue>\n    <LocalizedTextValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10083</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>LocalizedTextValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10083</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9917</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </LocalizedTextValue>\n    <StatusCodeValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10084</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>StatusCodeValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10084</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9918</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </StatusCodeValue>\n    <VariantValue>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10085</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>VariantValue</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10085</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=9919</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </VariantValue>\n  </UserArrayValueObjectType>\n  <Vector xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1000</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Vector</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>X</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=11</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Y</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=11</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Z</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=11</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </Vector>\n  <WorkOrderStatusType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1004</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>WorkOrderStatusType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>Actor</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Timestamp</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=13</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Comment</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=21</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </WorkOrderStatusType>\n  <WorkOrderType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1005</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>WorkOrderType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>ID</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=14</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>AssetID</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StartTime</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=13</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>StatusComments</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>ns=1;i=1004</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>\n                <uax:UInt32>0</uax:UInt32>\n              </uax:ArrayDimensions>\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </WorkOrderType>\n  <MethodTestType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=10092</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>MethodTestType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:SuperTypeId>\n    <ScalarMethod1>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10093</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ScalarMethod1</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10093</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10093</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10094</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10094</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>BooleanIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=1</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>SByteIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=2</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=3</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int16In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=4</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt16In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=5</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int32In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=6</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt32In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=7</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int64In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=8</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt64In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>FloatIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=10</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DoubleIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=11</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10095</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10095</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>BooleanOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=1</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>SByteOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=2</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=3</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int16Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=4</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt16Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=5</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int32Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=6</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt32Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=7</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int64Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=8</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt64Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>FloatOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=10</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DoubleOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=11</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </ScalarMethod1>\n    <ScalarMethod2>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10096</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ScalarMethod2</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10096</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10096</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10097</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10097</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StringIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DateTimeIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=13</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>GuidIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=14</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteStringIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=15</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>XmlElementIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=16</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>NodeIdIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=17</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ExpandedNodeIdIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=18</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>QualifiedNameIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=20</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>LocalizedTextIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StatusCodeIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=19</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10098</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10098</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StringOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DateTimeOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=13</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>GuidOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=14</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteStringOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=15</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>XmlElementOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=16</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>NodeIdOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=17</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ExpandedNodeIdOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=18</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>QualifiedNameOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=20</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>LocalizedTextOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StatusCodeOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=19</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </ScalarMethod2>\n    <ScalarMethod3>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10099</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ScalarMethod3</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10099</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10099</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10100</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10100</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>VariantIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=24</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>EnumerationIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=29</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StructureIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=22</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10101</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10101</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>VariantOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=24</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>EnumerationOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=29</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StructureOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=22</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </ScalarMethod3>\n    <ArrayMethod1>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10102</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ArrayMethod1</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10102</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10102</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10103</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10103</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>BooleanIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=1</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>SByteIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=2</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=3</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int16In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=4</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt16In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=5</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int32In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=6</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt32In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=7</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int64In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=8</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt64In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>FloatIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=10</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DoubleIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=11</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10104</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10104</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>BooleanOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=1</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>SByteOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=2</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=3</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int16Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=4</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt16Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=5</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int32Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=6</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt32Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=7</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int64Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=8</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt64Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=9</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>FloatOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=10</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DoubleOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=11</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </ArrayMethod1>\n    <ArrayMethod2>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10105</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ArrayMethod2</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10105</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10105</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10106</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10106</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StringIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DateTimeIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=13</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>GuidIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=14</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteStringIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=15</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>XmlElementIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=16</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>NodeIdIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=17</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ExpandedNodeIdIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=18</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>QualifiedNameIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=20</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>LocalizedTextIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StatusCodeIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=19</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10107</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10107</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StringOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=12</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DateTimeOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=13</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>GuidOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=14</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteStringOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=15</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>XmlElementOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=16</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>NodeIdOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=17</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ExpandedNodeIdOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=18</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>QualifiedNameOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=20</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>LocalizedTextOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=21</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StatusCodeOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=19</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </ArrayMethod2>\n    <ArrayMethod3>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10108</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ArrayMethod3</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10108</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10108</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10109</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10109</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>VariantIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=24</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>EnumerationIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=29</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StructureIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=22</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10110</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10110</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>VariantOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=24</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>EnumerationOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=29</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StructureOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>i=22</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </ArrayMethod3>\n    <UserScalarMethod1>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10111</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UserScalarMethod1</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10111</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10111</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10112</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10112</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>BooleanIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9898</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>SByteIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9899</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9900</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int16In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9901</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt16In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9902</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int32In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9903</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt32In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9904</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int64In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9905</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt64In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9906</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>FloatIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9907</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DoubleIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9908</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StringIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9909</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10113</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10113</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>BooleanOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9898</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>SByteOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9899</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9900</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int16Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9901</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt16Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9902</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int32Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9903</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt32Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9904</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int64Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9905</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt64Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9906</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>FloatOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9907</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DoubleOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9908</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StringOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9909</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </UserScalarMethod1>\n    <UserScalarMethod2>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10114</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UserScalarMethod2</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10114</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10114</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10115</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10115</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DateTimeIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9910</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>GuidIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9911</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteStringIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9912</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>XmlElementIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9913</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>NodeIdIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9914</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ExpandedNodeIdIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9915</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>QualifiedNameIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9916</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>LocalizedTextIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9917</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StatusCodeIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9918</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>VariantIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9919</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10116</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10116</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DateTimeOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9910</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>GuidOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9911</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteStringOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9912</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>XmlElementOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9913</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>NodeIdOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9914</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ExpandedNodeIdOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9915</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>QualifiedNameOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9916</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>LocalizedTextOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9917</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StatusCodeOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9918</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>VariantOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9919</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>-1</uax:ValueRank>\n                    <uax:ArrayDimensions />\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </UserScalarMethod2>\n    <UserArrayMethod1>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10117</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UserArrayMethod1</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10117</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10117</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10118</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10118</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>BooleanIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9898</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>SByteIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9899</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9900</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int16In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9901</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt16In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9902</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int32In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9903</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt32In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9904</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int64In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9905</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt64In</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9906</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>FloatIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9907</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DoubleIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9908</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StringIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9909</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10119</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10119</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>BooleanOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9898</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>SByteOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9899</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9900</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int16Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9901</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt16Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9902</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int32Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9903</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt32Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9904</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>Int64Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9905</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>UInt64Out</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9906</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>FloatOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9907</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DoubleOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9908</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StringOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9909</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </UserArrayMethod1>\n    <UserArrayMethod2>\n      <uax:NodeClass>Method_4</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10120</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UserArrayMethod2</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=10120</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10120</uax:NumericId>\n      <uax:Executable>true</uax:Executable>\n      <uax:UserExecutable>true</uax:UserExecutable>\n      <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10121</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>InputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10121</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DateTimeIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9910</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>GuidIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9911</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteStringIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9912</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>XmlElementIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9913</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>NodeIdIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9914</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ExpandedNodeIdIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9915</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>QualifiedNameIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9916</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>LocalizedTextIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9917</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StatusCodeIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9918</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>VariantIn</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9919</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </InputArguments>\n      <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10122</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>OutputArguments</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>10122</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>DateTimeOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9910</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>GuidOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9911</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ByteStringOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9912</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>XmlElementOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9913</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>NodeIdOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9914</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>ExpandedNodeIdOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9915</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>QualifiedNameOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9916</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>LocalizedTextOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9917</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>StatusCodeOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9918</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>i=297</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <uax:Argument>\n                    <uax:Name>VariantOut</uax:Name>\n                    <uax:DataType>\n                      <uax:Identifier>ns=1;i=9919</uax:Identifier>\n                    </uax:DataType>\n                    <uax:ValueRank>1</uax:ValueRank>\n                    <uax:ArrayDimensions>\n                      <uax:UInt32>0</uax:UInt32>\n                    </uax:ArrayDimensions>\n                  </uax:Argument>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>i=296</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </OutputArguments>\n    </UserArrayMethod2>\n  </MethodTestType>\n  <TestSystemConditionType xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=10123</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>TestSystemConditionType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=2782</uax:Identifier>\n    </uax:SuperTypeId>\n    <MonitoredNodeCount>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10156</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>MonitoredNodeCount</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>10156</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=6</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </MonitoredNodeCount>\n  </TestSystemConditionType>\n  <Data xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=10157</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Data</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>10157</uax:NumericId>\n    <uax:EventNotifier>1</uax:EventNotifier>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=85</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=2253</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=10158</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=48</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=10786</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <Static>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10158</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Static</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=61</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>10158</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=10157</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=36</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=10159</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=36</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=10243</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <Scalar>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10159</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Scalar</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9450</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10159</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10158</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10163</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10160</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10160</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10161</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10161</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10162</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10162</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10163</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10163</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10159</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10164</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10164</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10165</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10165</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10166</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10166</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10167</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10167</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10168</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10168</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10169</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10169</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10171</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10171</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10172</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10172</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11594</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11594</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11595</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11595</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11565</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11565</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10173</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10173</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10174</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10174</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10175</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10175</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10196</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10204</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10176</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10176</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10181</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10181</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10182</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10182</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10185</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10185</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10186</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10186</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10187</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10187</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10188</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10188</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10189</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10189</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10191</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10191</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10190</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10190</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10192</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10192</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10193</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10193</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10196</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10196</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10175</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10197</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10197</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10212</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10212</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10213</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10213</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <BooleanValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10216</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>BooleanValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10216</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BooleanValue>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10217</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10217</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=2</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10218</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10218</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=3</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10219</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10219</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=4</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10220</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10220</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10221</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10221</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10222</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10222</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10223</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10223</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=8</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10224</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10224</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=9</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10225</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10225</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=10</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10226</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10226</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DoubleValue>\n        <StringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10227</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10227</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StringValue>\n        <DateTimeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10228</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DateTimeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10228</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=13</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DateTimeValue>\n        <GuidValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10229</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GuidValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10229</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=14</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </GuidValue>\n        <ByteStringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10230</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteStringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10230</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=15</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteStringValue>\n        <XmlElementValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10231</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>XmlElementValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10231</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=16</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </XmlElementValue>\n        <NodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10232</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10232</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NodeIdValue>\n        <ExpandedNodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10233</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ExpandedNodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10233</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=18</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ExpandedNodeIdValue>\n        <QualifiedNameValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10234</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>QualifiedNameValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10234</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=20</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </QualifiedNameValue>\n        <LocalizedTextValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10235</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LocalizedTextValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10235</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </LocalizedTextValue>\n        <StatusCodeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10236</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StatusCodeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10236</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=19</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StatusCodeValue>\n        <VariantValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10237</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>VariantValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10237</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=24</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </VariantValue>\n        <EnumerationValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10238</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>EnumerationValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10238</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=29</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EnumerationValue>\n        <StructureValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10239</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StructureValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10239</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StructureValue>\n        <NumberValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10240</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NumberValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10240</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NumberValue>\n        <IntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10241</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>IntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10241</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=27</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </IntegerValue>\n        <UIntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10242</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UIntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10242</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=28</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UIntegerValue>\n      </Scalar>\n      <Array>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10243</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Array</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9679</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10243</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10158</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10247</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10244</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10244</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10245</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10245</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10246</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10246</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10247</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10247</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10243</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10248</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10248</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10249</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10249</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10250</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10250</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10251</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10251</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10252</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10252</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10253</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10253</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10255</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10255</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10256</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10256</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11596</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11596</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11597</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11597</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11566</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11566</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10257</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10257</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10258</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10258</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10259</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10259</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10280</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10288</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10260</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10260</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10265</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10265</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10266</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10266</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10269</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10269</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10270</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10270</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10271</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10271</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10272</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10272</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10273</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10273</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10275</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10275</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10274</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10274</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10276</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10276</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10277</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10277</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10280</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10280</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10259</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10281</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10281</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10296</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10296</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10297</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10297</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <BooleanValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10300</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>BooleanValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10300</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BooleanValue>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10301</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10301</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=2</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10302</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10302</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=3</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10303</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10303</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=4</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10304</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10304</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10305</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10305</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10306</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10306</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10307</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10307</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=8</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10308</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10308</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=9</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10309</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10309</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=10</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10310</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10310</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DoubleValue>\n        <StringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10311</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10311</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StringValue>\n        <DateTimeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10312</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DateTimeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10312</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=13</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DateTimeValue>\n        <GuidValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10313</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GuidValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10313</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=14</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </GuidValue>\n        <ByteStringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10314</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteStringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10314</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=15</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteStringValue>\n        <XmlElementValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10315</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>XmlElementValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10315</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=16</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </XmlElementValue>\n        <NodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10316</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10316</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NodeIdValue>\n        <ExpandedNodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10317</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ExpandedNodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10317</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=18</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ExpandedNodeIdValue>\n        <QualifiedNameValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10318</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>QualifiedNameValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10318</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=20</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </QualifiedNameValue>\n        <LocalizedTextValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10319</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LocalizedTextValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10319</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </LocalizedTextValue>\n        <StatusCodeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10320</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StatusCodeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10320</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=19</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StatusCodeValue>\n        <VariantValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10321</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>VariantValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10321</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=24</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </VariantValue>\n        <EnumerationValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10322</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>EnumerationValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10322</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=29</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EnumerationValue>\n        <StructureValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10323</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StructureValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10323</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StructureValue>\n        <NumberValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10324</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NumberValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10324</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NumberValue>\n        <IntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10325</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>IntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10325</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=27</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </IntegerValue>\n        <UIntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10326</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UIntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10326</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=28</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UIntegerValue>\n      </Array>\n      <UserScalar>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10327</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>UserScalar</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9921</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10327</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10331</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10328</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10328</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10329</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10329</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10330</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10330</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10331</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10331</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10327</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10332</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10332</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10333</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10333</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10334</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10334</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10335</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10335</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10336</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10336</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10337</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10337</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10339</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10339</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10340</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10340</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11598</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11598</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11599</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11599</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11567</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11567</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10341</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10341</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10342</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10342</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10343</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10343</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10364</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10372</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10344</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10344</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10349</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10349</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10350</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10350</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10353</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10353</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10354</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10354</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10355</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10355</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10356</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10356</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10357</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10357</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10359</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10359</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10358</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10358</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10360</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10360</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10361</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10361</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10364</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10364</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10343</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10365</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10365</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10380</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10380</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10381</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10381</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <BooleanValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10384</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>BooleanValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10384</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9898</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BooleanValue>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10385</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10385</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9899</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10386</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10386</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9900</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10387</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10387</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9901</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10388</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10388</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9902</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10389</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10389</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9903</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10390</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10390</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9904</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10391</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10391</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9905</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10392</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10392</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9906</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10393</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10393</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9907</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10394</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10394</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9908</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DoubleValue>\n        <StringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10395</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10395</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9909</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StringValue>\n        <DateTimeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10396</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DateTimeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10396</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9910</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DateTimeValue>\n        <GuidValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10397</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GuidValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10397</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9911</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </GuidValue>\n        <ByteStringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10398</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteStringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10398</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9912</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteStringValue>\n        <XmlElementValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10399</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>XmlElementValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10399</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9913</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </XmlElementValue>\n        <NodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10400</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10400</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9914</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NodeIdValue>\n        <ExpandedNodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10401</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ExpandedNodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10401</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9915</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ExpandedNodeIdValue>\n        <QualifiedNameValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10402</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>QualifiedNameValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10402</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9916</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </QualifiedNameValue>\n        <LocalizedTextValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10403</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LocalizedTextValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10403</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9917</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </LocalizedTextValue>\n        <StatusCodeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10404</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StatusCodeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10404</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9918</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StatusCodeValue>\n        <VariantValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10405</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>VariantValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10405</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9919</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </VariantValue>\n      </UserScalar>\n      <UserArray>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10406</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>UserArray</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=10007</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10406</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10410</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10407</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10407</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10408</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10408</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10409</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10409</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10410</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10410</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10406</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10411</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10411</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10412</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10412</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10413</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10413</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10414</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10414</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10415</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10415</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10416</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10416</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10418</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10418</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10419</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10419</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11600</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11600</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11601</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11601</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11568</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11568</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10420</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10420</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10421</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10421</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10422</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10422</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10443</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10451</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10423</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10423</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10428</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10428</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10429</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10429</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10432</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10432</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10433</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10433</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10434</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10434</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10435</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10435</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10436</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10436</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10438</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10438</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10437</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10437</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10439</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10439</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10440</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10440</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10443</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10443</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10422</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10444</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10444</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10459</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10459</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10460</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10460</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <BooleanValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10463</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>BooleanValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10463</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9898</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BooleanValue>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10464</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10464</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9899</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10465</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10465</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9900</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10466</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10466</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9901</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10467</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10467</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9902</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10468</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10468</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9903</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10469</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10469</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9904</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10470</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10470</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9905</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10471</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10471</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9906</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10472</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10472</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9907</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10473</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10473</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9908</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DoubleValue>\n        <StringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10474</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10474</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9909</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StringValue>\n        <DateTimeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10475</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DateTimeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10475</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9910</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DateTimeValue>\n        <GuidValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10476</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GuidValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10476</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9911</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </GuidValue>\n        <ByteStringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10477</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteStringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10477</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9912</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteStringValue>\n        <XmlElementValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10478</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>XmlElementValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10478</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9913</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </XmlElementValue>\n        <NodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10479</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10479</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9914</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NodeIdValue>\n        <ExpandedNodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10480</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ExpandedNodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10480</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9915</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ExpandedNodeIdValue>\n        <QualifiedNameValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10481</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>QualifiedNameValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10481</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9916</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </QualifiedNameValue>\n        <LocalizedTextValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10482</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LocalizedTextValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10482</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9917</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </LocalizedTextValue>\n        <StatusCodeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10483</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StatusCodeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10483</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9918</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StatusCodeValue>\n        <VariantValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10484</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>VariantValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10484</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9919</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </VariantValue>\n      </UserArray>\n      <AnalogScalar>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10485</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>AnalogScalar</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9534</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10485</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10489</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10486</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10486</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10487</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10487</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10488</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10488</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10489</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10489</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10485</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10490</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10490</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10491</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10491</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10492</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10492</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10493</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10493</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10494</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10494</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10495</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10495</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10497</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10497</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10498</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10498</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11602</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11602</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11603</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11603</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11569</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11569</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10499</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10499</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10500</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10500</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10501</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10501</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10522</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10530</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10502</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10502</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10507</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10507</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10508</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10508</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10511</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10511</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10512</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10512</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10513</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10513</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10514</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10514</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10515</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10515</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10517</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10517</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10516</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10516</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10518</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10518</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10519</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10519</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10522</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10522</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10501</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10523</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10523</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10538</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10538</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10539</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10539</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10542</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10542</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=2</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10545</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10545</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10548</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10548</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=3</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10551</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10551</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10554</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10554</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=4</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10557</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10557</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10560</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10560</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10563</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10563</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10566</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10566</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10569</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10569</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10572</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10572</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10575</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10575</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10578</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10578</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=8</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10581</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10581</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10584</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10584</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=9</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10587</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10587</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10590</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10590</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=10</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10593</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10593</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10596</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10596</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10599</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10599</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </DoubleValue>\n        <NumberValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10602</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NumberValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10602</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10605</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10605</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </NumberValue>\n        <IntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10608</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>IntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10608</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=27</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10611</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10611</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </IntegerValue>\n        <UIntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10614</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UIntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10614</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=28</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10617</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10617</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UIntegerValue>\n      </AnalogScalar>\n      <AnalogArray>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10620</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>AnalogArray</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9763</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10620</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10624</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10621</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10621</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10622</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10622</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10623</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10623</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10624</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10624</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10620</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10625</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10625</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10626</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10626</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10627</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10627</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10628</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10628</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10629</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10629</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10630</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10630</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10632</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10632</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10633</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10633</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11604</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11604</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11605</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11605</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11570</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11570</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10634</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10634</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10635</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10635</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10636</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10636</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10657</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10665</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10637</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10637</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10642</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10642</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10643</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10643</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10646</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10646</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10647</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10647</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10648</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10648</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10649</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10649</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10650</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10650</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10652</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10652</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10651</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10651</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10653</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10653</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10654</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10654</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10657</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10657</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10636</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10658</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10658</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10673</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10673</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10674</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10674</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10677</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10677</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=2</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10680</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10680</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10683</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10683</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=3</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10686</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10686</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10689</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10689</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=4</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10692</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10692</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10695</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10695</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10698</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10698</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10701</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10701</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10704</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10704</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10707</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10707</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10710</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10710</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10713</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10713</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=8</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10716</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10716</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10719</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10719</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=9</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10722</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10722</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10725</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10725</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=10</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10728</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10728</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10731</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10731</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10734</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10734</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </DoubleValue>\n        <NumberValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10737</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NumberValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10737</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10740</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10740</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </NumberValue>\n        <IntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10743</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>IntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10743</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=27</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10746</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10746</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </IntegerValue>\n        <UIntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10749</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UIntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10749</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=28</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10752</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10752</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UIntegerValue>\n      </AnalogArray>\n      <MethodTest>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10755</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>MethodTest</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=10092</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10755</uax:NumericId>\n        <ScalarMethod1>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10756</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ScalarMethod1</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10093</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10756</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10757</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10757</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>BooleanIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=1</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>SByteIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=2</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=3</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int16In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=4</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt16In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=5</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int32In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=6</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt32In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int64In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=8</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt64In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=9</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>FloatIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=10</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DoubleIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=11</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10758</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10758</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>BooleanOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=1</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>SByteOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=2</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=3</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int16Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=4</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt16Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=5</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int32Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=6</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt32Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int64Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=8</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt64Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=9</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>FloatOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=10</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DoubleOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=11</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </ScalarMethod1>\n        <ScalarMethod2>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10759</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ScalarMethod2</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10096</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10759</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10760</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10760</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StringIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=12</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DateTimeIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=13</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>GuidIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=14</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteStringIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=15</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>XmlElementIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=16</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>NodeIdIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=17</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ExpandedNodeIdIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=18</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>QualifiedNameIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=20</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>LocalizedTextIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=21</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StatusCodeIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=19</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10761</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10761</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StringOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=12</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DateTimeOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=13</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>GuidOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=14</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteStringOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=15</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>XmlElementOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=16</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>NodeIdOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=17</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ExpandedNodeIdOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=18</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>QualifiedNameOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=20</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>LocalizedTextOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=21</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StatusCodeOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=19</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </ScalarMethod2>\n        <ScalarMethod3>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10762</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ScalarMethod3</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10099</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10762</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10763</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10763</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>VariantIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=24</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>EnumerationIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=29</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StructureIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=22</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10764</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10764</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>VariantOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=24</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>EnumerationOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=29</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StructureOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=22</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </ScalarMethod3>\n        <ArrayMethod1>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10765</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ArrayMethod1</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10102</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10765</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10766</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10766</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>BooleanIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=1</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>SByteIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=2</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=3</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int16In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=4</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt16In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=5</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int32In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=6</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt32In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int64In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=8</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt64In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=9</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>FloatIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=10</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DoubleIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=11</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10767</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10767</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>BooleanOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=1</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>SByteOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=2</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=3</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int16Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=4</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt16Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=5</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int32Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=6</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt32Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int64Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=8</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt64Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=9</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>FloatOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=10</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DoubleOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=11</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </ArrayMethod1>\n        <ArrayMethod2>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10768</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ArrayMethod2</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10105</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10768</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10769</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10769</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StringIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=12</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DateTimeIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=13</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>GuidIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=14</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteStringIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=15</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>XmlElementIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=16</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>NodeIdIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=17</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ExpandedNodeIdIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=18</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>QualifiedNameIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=20</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>LocalizedTextIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=21</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StatusCodeIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=19</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10770</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10770</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StringOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=12</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DateTimeOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=13</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>GuidOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=14</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteStringOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=15</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>XmlElementOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=16</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>NodeIdOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=17</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ExpandedNodeIdOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=18</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>QualifiedNameOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=20</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>LocalizedTextOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=21</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StatusCodeOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=19</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </ArrayMethod2>\n        <ArrayMethod3>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10771</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ArrayMethod3</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10108</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10771</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10772</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10772</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>VariantIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=24</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>EnumerationIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=29</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StructureIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=22</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10773</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10773</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>VariantOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=24</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>EnumerationOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=29</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StructureOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=22</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </ArrayMethod3>\n        <UserScalarMethod1>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10774</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UserScalarMethod1</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10111</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10774</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10775</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10775</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>BooleanIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9898</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>SByteIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9899</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9900</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int16In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9901</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt16In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9902</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int32In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9903</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt32In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9904</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int64In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9905</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt64In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9906</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>FloatIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9907</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DoubleIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9908</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StringIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9909</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10776</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10776</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>BooleanOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9898</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>SByteOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9899</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9900</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int16Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9901</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt16Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9902</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int32Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9903</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt32Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9904</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int64Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9905</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt64Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9906</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>FloatOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9907</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DoubleOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9908</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StringOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9909</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </UserScalarMethod1>\n        <UserScalarMethod2>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10777</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UserScalarMethod2</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10114</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10777</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10778</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10778</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DateTimeIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9910</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>GuidIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9911</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteStringIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9912</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>XmlElementIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9913</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>NodeIdIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9914</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ExpandedNodeIdIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9915</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>QualifiedNameIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9916</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>LocalizedTextIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9917</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StatusCodeIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9918</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>VariantIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9919</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10779</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10779</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DateTimeOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9910</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>GuidOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9911</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteStringOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9912</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>XmlElementOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9913</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>NodeIdOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9914</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ExpandedNodeIdOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9915</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>QualifiedNameOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9916</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>LocalizedTextOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9917</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StatusCodeOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9918</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>VariantOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9919</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </UserScalarMethod2>\n        <UserArrayMethod1>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10780</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UserArrayMethod1</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10117</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10780</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10781</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10781</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>BooleanIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9898</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>SByteIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9899</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9900</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int16In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9901</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt16In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9902</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int32In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9903</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt32In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9904</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int64In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9905</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt64In</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9906</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>FloatIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9907</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DoubleIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9908</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StringIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9909</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10782</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10782</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>BooleanOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9898</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>SByteOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9899</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9900</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int16Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9901</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt16Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9902</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int32Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9903</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt32Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9904</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Int64Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9905</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>UInt64Out</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9906</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>FloatOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9907</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DoubleOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9908</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StringOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9909</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </UserArrayMethod1>\n        <UserArrayMethod2>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10783</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UserArrayMethod2</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=10120</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10783</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10784</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10784</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DateTimeIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9910</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>GuidIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9911</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteStringIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9912</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>XmlElementIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9913</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>NodeIdIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9914</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ExpandedNodeIdIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9915</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>QualifiedNameIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9916</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>LocalizedTextIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9917</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StatusCodeIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9918</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>VariantIn</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9919</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n          <OutputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10785</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>OutputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10785</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>DateTimeOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9910</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>GuidOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9911</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ByteStringOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9912</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>XmlElementOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9913</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>NodeIdOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9914</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>ExpandedNodeIdOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9915</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>QualifiedNameOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9916</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>LocalizedTextOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9917</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>StatusCodeOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9918</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>VariantOut</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>ns=1;i=9919</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>1</uax:ValueRank>\n                        <uax:ArrayDimensions>\n                          <uax:UInt32>0</uax:UInt32>\n                        </uax:ArrayDimensions>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </OutputArguments>\n        </UserArrayMethod2>\n      </MethodTest>\n    </Static>\n    <Dynamic>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=10786</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Dynamic</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=61</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>10786</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=48</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:IsInverse>true</uax:IsInverse>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=10157</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=36</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=10787</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=36</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=10871</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <Scalar>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10787</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Scalar</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9450</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10787</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10786</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10791</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10788</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10788</uax:NumericId>\n          <uax:Value>\n            <uax:Value>\n              <uax:Boolean>true</uax:Boolean>\n            </uax:Value>\n          </uax:Value>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10789</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10789</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10790</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10790</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10791</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10791</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10787</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10792</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10792</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10793</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10793</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10794</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10794</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10795</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10795</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10796</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10796</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10797</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10797</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10799</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10799</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10800</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10800</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11606</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11606</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11607</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11607</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11571</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11571</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10801</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10801</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10802</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10802</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10803</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10803</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10824</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10832</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10804</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10804</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10809</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10809</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10810</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10810</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10813</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10813</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10814</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10814</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10815</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10815</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10816</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10816</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10817</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10817</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10819</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10819</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10818</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10818</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10820</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10820</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10821</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10821</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10824</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10824</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10825</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10825</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10840</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10840</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10841</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10841</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <BooleanValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10844</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>BooleanValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10844</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BooleanValue>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10845</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10845</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=2</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10846</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10846</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=3</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10847</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10847</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=4</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10848</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10848</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10849</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10849</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10850</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10850</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10851</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10851</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=8</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10852</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10852</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=9</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10853</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10853</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=10</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10854</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10854</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DoubleValue>\n        <StringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10855</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10855</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StringValue>\n        <DateTimeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10856</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DateTimeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10856</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=13</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DateTimeValue>\n        <GuidValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10857</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GuidValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10857</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=14</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </GuidValue>\n        <ByteStringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10858</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteStringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10858</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=15</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteStringValue>\n        <XmlElementValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10859</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>XmlElementValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10859</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=16</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </XmlElementValue>\n        <NodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10860</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10860</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NodeIdValue>\n        <ExpandedNodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10861</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ExpandedNodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10861</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=18</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ExpandedNodeIdValue>\n        <QualifiedNameValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10862</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>QualifiedNameValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10862</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=20</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </QualifiedNameValue>\n        <LocalizedTextValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10863</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LocalizedTextValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10863</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </LocalizedTextValue>\n        <StatusCodeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10864</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StatusCodeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10864</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=19</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StatusCodeValue>\n        <VariantValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10865</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>VariantValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10865</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=24</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </VariantValue>\n        <EnumerationValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10866</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>EnumerationValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10866</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=29</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EnumerationValue>\n        <StructureValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10867</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StructureValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10867</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StructureValue>\n        <NumberValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10868</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NumberValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10868</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NumberValue>\n        <IntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10869</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>IntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10869</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=27</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </IntegerValue>\n        <UIntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10870</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UIntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10870</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=28</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UIntegerValue>\n      </Scalar>\n      <Array>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10871</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>Array</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9679</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10871</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10786</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10875</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10872</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10872</uax:NumericId>\n          <uax:Value>\n            <uax:Value>\n              <uax:Boolean>true</uax:Boolean>\n            </uax:Value>\n          </uax:Value>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10873</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10873</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10874</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10874</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10875</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10875</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10871</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10876</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10876</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10877</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10877</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10878</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10878</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10879</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10879</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10880</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10880</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10881</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10881</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10883</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10883</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10884</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10884</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11608</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11608</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11609</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11609</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11572</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11572</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10885</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10885</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10886</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10886</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10887</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10887</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10908</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10916</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10888</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10888</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10893</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10893</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10894</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10894</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10897</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10897</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10898</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10898</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10899</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10899</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10900</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10900</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10901</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10901</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10903</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10903</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10902</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10902</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10904</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10904</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10905</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10905</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10908</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10908</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10887</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10909</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10909</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10924</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10924</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10925</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10925</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <BooleanValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10928</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>BooleanValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10928</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BooleanValue>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10929</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10929</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=2</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10930</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10930</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=3</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10931</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10931</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=4</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10932</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10932</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10933</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10933</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10934</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10934</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10935</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10935</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=8</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10936</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10936</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=9</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10937</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10937</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=10</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10938</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10938</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DoubleValue>\n        <StringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10939</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10939</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StringValue>\n        <DateTimeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10940</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DateTimeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10940</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=13</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DateTimeValue>\n        <GuidValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10941</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GuidValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10941</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=14</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </GuidValue>\n        <ByteStringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10942</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteStringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10942</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=15</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteStringValue>\n        <XmlElementValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10943</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>XmlElementValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10943</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=16</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </XmlElementValue>\n        <NodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10944</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10944</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NodeIdValue>\n        <ExpandedNodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10945</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ExpandedNodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10945</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=18</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ExpandedNodeIdValue>\n        <QualifiedNameValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10946</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>QualifiedNameValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10946</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=20</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </QualifiedNameValue>\n        <LocalizedTextValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10947</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LocalizedTextValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10947</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </LocalizedTextValue>\n        <StatusCodeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10948</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StatusCodeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10948</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=19</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StatusCodeValue>\n        <VariantValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10949</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>VariantValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10949</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=24</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </VariantValue>\n        <EnumerationValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10950</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>EnumerationValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10950</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=29</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EnumerationValue>\n        <StructureValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10951</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StructureValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10951</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StructureValue>\n        <NumberValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10952</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NumberValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10952</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NumberValue>\n        <IntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10953</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>IntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10953</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=27</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </IntegerValue>\n        <UIntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10954</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UIntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10954</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=28</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UIntegerValue>\n      </Array>\n      <UserScalar>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=10955</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>UserScalar</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9921</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>10955</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=10959</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10956</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10956</uax:NumericId>\n          <uax:Value>\n            <uax:Value>\n              <uax:Boolean>true</uax:Boolean>\n            </uax:Value>\n          </uax:Value>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10957</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10957</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10958</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10958</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=10959</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>10959</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=10955</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10960</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10960</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10961</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10961</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10962</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10962</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10963</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10963</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10964</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10964</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10965</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10965</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10967</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10967</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10968</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10968</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11610</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11610</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11611</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11611</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11573</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11573</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10969</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10969</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10970</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10970</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10971</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10971</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10992</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11000</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10972</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10972</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10977</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10977</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10978</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10978</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10981</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10981</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10982</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10982</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10983</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10983</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10984</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10984</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10985</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10985</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10987</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10987</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10986</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10986</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10988</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10988</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10989</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10989</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=10992</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>10992</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=10971</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=10993</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>10993</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11008</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11008</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11009</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11009</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <BooleanValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11012</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>BooleanValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11012</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9898</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BooleanValue>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11013</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11013</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9899</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11014</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11014</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9900</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11015</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11015</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9901</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11016</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11016</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9902</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11017</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11017</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9903</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11018</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11018</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9904</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11019</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11019</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9905</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11020</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11020</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9906</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11021</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11021</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9907</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11022</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11022</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9908</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DoubleValue>\n        <StringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11023</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11023</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9909</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StringValue>\n        <DateTimeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11024</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DateTimeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11024</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9910</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DateTimeValue>\n        <GuidValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11025</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GuidValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11025</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9911</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </GuidValue>\n        <ByteStringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11026</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteStringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11026</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9912</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteStringValue>\n        <XmlElementValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11027</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>XmlElementValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11027</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9913</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </XmlElementValue>\n        <NodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11028</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11028</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9914</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NodeIdValue>\n        <ExpandedNodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11029</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ExpandedNodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11029</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9915</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ExpandedNodeIdValue>\n        <QualifiedNameValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11030</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>QualifiedNameValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11030</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9916</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </QualifiedNameValue>\n        <LocalizedTextValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11031</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LocalizedTextValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11031</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9917</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </LocalizedTextValue>\n        <StatusCodeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11032</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StatusCodeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11032</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9918</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StatusCodeValue>\n        <VariantValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11033</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>VariantValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11033</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9919</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </VariantValue>\n      </UserScalar>\n      <UserArray>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=11034</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>UserArray</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=10007</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>11034</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=11038</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11035</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11035</uax:NumericId>\n          <uax:Value>\n            <uax:Value>\n              <uax:Boolean>true</uax:Boolean>\n            </uax:Value>\n          </uax:Value>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11036</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11036</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11037</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11037</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11038</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11038</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=11034</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11039</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11039</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11040</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11040</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11041</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11041</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11042</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11042</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11043</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11043</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11044</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11044</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11046</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11046</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11047</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11047</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11612</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11612</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11613</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11613</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11574</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11574</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11048</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11048</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11049</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11049</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11050</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11050</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11071</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11079</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11051</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11051</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11056</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11056</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11057</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11057</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11060</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11060</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11061</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11061</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11062</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11062</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11063</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11063</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11064</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11064</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11066</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11066</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11065</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11065</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11067</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11067</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11068</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11068</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11071</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11071</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11050</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11072</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11072</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11087</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11087</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11088</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11088</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <BooleanValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11091</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>BooleanValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11091</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9898</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BooleanValue>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11092</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11092</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9899</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11093</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11093</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9900</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11094</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11094</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9901</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11095</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11095</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9902</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11096</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11096</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9903</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11097</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11097</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9904</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11098</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11098</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9905</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11099</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11099</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9906</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11100</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11100</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9907</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11101</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11101</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9908</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DoubleValue>\n        <StringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11102</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11102</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9909</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StringValue>\n        <DateTimeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11103</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DateTimeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11103</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9910</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </DateTimeValue>\n        <GuidValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11104</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GuidValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11104</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9911</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </GuidValue>\n        <ByteStringValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11105</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteStringValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11105</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9912</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ByteStringValue>\n        <XmlElementValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11106</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>XmlElementValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11106</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9913</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </XmlElementValue>\n        <NodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11107</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11107</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9914</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </NodeIdValue>\n        <ExpandedNodeIdValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11108</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ExpandedNodeIdValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11108</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9915</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ExpandedNodeIdValue>\n        <QualifiedNameValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11109</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>QualifiedNameValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11109</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9916</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </QualifiedNameValue>\n        <LocalizedTextValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11110</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>LocalizedTextValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11110</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9917</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </LocalizedTextValue>\n        <StatusCodeValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11111</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>StatusCodeValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11111</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9918</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </StatusCodeValue>\n        <VariantValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11112</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>VariantValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=63</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11112</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>ns=1;i=9919</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </VariantValue>\n      </UserArray>\n      <AnalogScalar>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=11113</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>AnalogScalar</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9534</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>11113</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=11117</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11114</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11114</uax:NumericId>\n          <uax:Value>\n            <uax:Value>\n              <uax:Boolean>true</uax:Boolean>\n            </uax:Value>\n          </uax:Value>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11115</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11115</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11116</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11116</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11117</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11117</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=11113</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11118</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11118</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11119</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11119</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11120</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11120</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11121</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11121</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11122</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11122</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11123</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11123</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11125</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11125</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11126</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11126</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11614</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11614</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11615</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11615</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11575</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11575</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11127</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11127</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11128</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11128</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11129</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11129</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11150</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11158</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11130</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11130</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11135</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11135</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11136</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11136</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11139</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11139</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11140</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11140</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11141</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11141</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11142</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11142</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11143</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11143</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11145</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11145</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11144</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11144</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11146</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11146</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11147</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11147</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11150</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11150</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11129</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11151</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11151</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11166</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11166</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11167</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11167</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11170</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11170</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=2</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11173</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11173</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11176</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11176</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=3</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11179</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11179</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11182</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11182</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=4</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11185</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11185</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11188</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11188</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11191</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11191</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11194</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11194</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11197</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11197</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11200</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11200</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11203</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11203</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11206</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11206</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=8</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11209</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11209</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11212</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11212</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=9</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11215</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11215</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11218</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11218</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=10</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11221</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11221</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11224</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11224</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11227</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11227</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </DoubleValue>\n        <NumberValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11230</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NumberValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11230</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11233</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11233</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </NumberValue>\n        <IntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11236</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>IntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11236</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=27</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11239</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11239</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </IntegerValue>\n        <UIntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11242</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UIntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11242</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=28</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11245</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11245</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UIntegerValue>\n      </AnalogScalar>\n      <AnalogArray>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=11248</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>AnalogArray</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=9763</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>11248</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=11252</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <SimulationActive>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11249</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SimulationActive</uax:Name>\n          </uax:BrowseName>\n          <uax:Description>\n            <uax:Text>If true the server will produce new values for each monitored variable.</uax:Text>\n          </uax:Description>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11249</uax:NumericId>\n          <uax:Value>\n            <uax:Value>\n              <uax:Boolean>true</uax:Boolean>\n            </uax:Value>\n          </uax:Value>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SimulationActive>\n        <GenerateValues>\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11250</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>GenerateValues</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>ns=1;i=9385</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11250</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <InputArguments xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11251</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11251</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Iterations</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=7</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The number of new values to generate.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </GenerateValues>\n        <CycleComplete>\n          <uax:NodeClass>Object_1</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11252</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>CycleComplete</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2881</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11252</uax:NumericId>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=36</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:IsInverse>true</uax:IsInverse>\n              <uax:TargetId>\n                <uax:Identifier>ns=1;i=11248</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <EventId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11253</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11253</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=15</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventId>\n          <EventType xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11254</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EventType</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11254</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EventType>\n          <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11255</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceNode</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11255</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceNode>\n          <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11256</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11256</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceName>\n          <Time xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11257</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Time</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11257</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Time>\n          <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11258</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ReceiveTime</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11258</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ReceiveTime>\n          <Message xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11260</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Message</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11260</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Message>\n          <Severity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11261</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Severity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11261</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Severity>\n          <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11616</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11616</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassId>\n          <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11617</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionClassName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11617</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionClassName>\n          <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11576</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ConditionName</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11576</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ConditionName>\n          <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11262</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>BranchId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11262</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=17</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </BranchId>\n          <Retain xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11263</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Retain</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11263</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Retain>\n          <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11264</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EnabledState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11264</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11285</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11293</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11265</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11265</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </EnabledState>\n          <Quality xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11270</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Quality</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11270</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=19</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11271</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11271</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Quality>\n          <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11274</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>LastSeverity</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11274</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=5</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11275</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11275</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </LastSeverity>\n          <Comment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11276</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Comment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9002</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11276</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <SourceTimestamp>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11277</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>SourceTimestamp</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11277</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=294</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </SourceTimestamp>\n          </Comment>\n          <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11278</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>ClientUserId</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11278</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=12</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </ClientUserId>\n          <Disable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11280</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Disable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9028</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11280</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Disable>\n          <Enable xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11279</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Enable</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9027</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11279</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2803</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n          </Enable>\n          <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11281</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AddComment</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9029</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11281</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=2829</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11282</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11282</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </AddComment>\n          <AckedState xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11285</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>AckedState</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=8995</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11285</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=21</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=9004</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:IsInverse>true</uax:IsInverse>\n                <uax:TargetId>\n                  <uax:Identifier>ns=1;i=11264</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <Id>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11286</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>Id</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11286</uax:NumericId>\n              <uax:DataType>\n                <uax:Identifier>i=1</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </Id>\n          </AckedState>\n          <Acknowledge xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Method_4</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11301</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Acknowledge</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=47</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=9111</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11301</uax:NumericId>\n            <uax:Executable>true</uax:Executable>\n            <uax:UserExecutable>true</uax:UserExecutable>\n            <uax:References>\n              <uax:Reference>\n                <uax:ReferenceTypeId>\n                  <uax:Identifier>i=3065</uax:Identifier>\n                </uax:ReferenceTypeId>\n                <uax:TargetId>\n                  <uax:Identifier>i=8944</uax:Identifier>\n                </uax:TargetId>\n              </uax:Reference>\n            </uax:References>\n            <InputArguments>\n              <uax:NodeClass>Variable_2</uax:NodeClass>\n              <uax:NodeId>\n                <uax:Identifier>ns=1;i=11302</uax:Identifier>\n              </uax:NodeId>\n              <uax:BrowseName>\n                <uax:NamespaceIndex>0</uax:NamespaceIndex>\n                <uax:Name>InputArguments</uax:Name>\n              </uax:BrowseName>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=46</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TypeDefinitionId>\n                <uax:Identifier>i=68</uax:Identifier>\n              </uax:TypeDefinitionId>\n              <uax:NumericId>11302</uax:NumericId>\n              <uax:Value>\n                <uax:Value>\n                  <uax:ListOfExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>EventId</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=15</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The identifier for the event to comment.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                    <uax:ExtensionObject>\n                      <uax:TypeId>\n                        <uax:Identifier>i=297</uax:Identifier>\n                      </uax:TypeId>\n                      <uax:Body>\n                        <uax:Argument>\n                          <uax:Name>Comment</uax:Name>\n                          <uax:DataType>\n                            <uax:Identifier>i=21</uax:Identifier>\n                          </uax:DataType>\n                          <uax:ValueRank>-1</uax:ValueRank>\n                          <uax:ArrayDimensions />\n                          <uax:Description>\n                            <uax:Text>The comment to add to the condition.</uax:Text>\n                          </uax:Description>\n                        </uax:Argument>\n                      </uax:Body>\n                    </uax:ExtensionObject>\n                  </uax:ListOfExtensionObject>\n                </uax:Value>\n              </uax:Value>\n              <uax:DataType>\n                <uax:Identifier>i=296</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>1</uax:ValueRank>\n              <uax:ArrayDimensions>0</uax:ArrayDimensions>\n              <uax:AccessLevel>1</uax:AccessLevel>\n              <uax:UserAccessLevel>1</uax:UserAccessLevel>\n            </InputArguments>\n          </Acknowledge>\n        </CycleComplete>\n        <SByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11305</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11305</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=2</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11308</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11308</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </SByteValue>\n        <ByteValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11311</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>ByteValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11311</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=3</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11314</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11314</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </ByteValue>\n        <Int16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11317</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11317</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=4</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11320</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11320</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int16Value>\n        <UInt16Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11323</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt16Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11323</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11326</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11326</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt16Value>\n        <Int32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11329</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11329</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11332</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11332</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int32Value>\n        <UInt32Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11335</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt32Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11335</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=7</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11338</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11338</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt32Value>\n        <Int64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11341</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Int64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11341</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=8</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11344</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11344</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Int64Value>\n        <UInt64Value>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11347</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UInt64Value</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11347</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=9</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11350</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11350</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UInt64Value>\n        <FloatValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11353</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>FloatValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11353</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=10</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11356</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11356</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </FloatValue>\n        <DoubleValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11359</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>DoubleValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11359</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11362</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11362</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </DoubleValue>\n        <NumberValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11365</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>NumberValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11365</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=26</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11368</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11368</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </NumberValue>\n        <IntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11371</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>IntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11371</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=27</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11374</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11374</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </IntegerValue>\n        <UIntegerValue>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11377</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>UIntegerValue</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11377</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=28</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>1</uax:ValueRank>\n          <uax:ArrayDimensions>0</uax:ArrayDimensions>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11380</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11380</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </UIntegerValue>\n      </AnalogArray>\n    </Dynamic>\n    <Conditions>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11383</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Conditions</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=61</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11383</uax:NumericId>\n      <uax:EventNotifier>1</uax:EventNotifier>\n      <uax:References>\n        <uax:Reference>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=36</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TargetId>\n            <uax:Identifier>ns=1;i=11384</uax:Identifier>\n          </uax:TargetId>\n        </uax:Reference>\n      </uax:References>\n      <SystemStatus>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=1;i=11384</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>SystemStatus</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=1;i=10123</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>11384</uax:NumericId>\n        <uax:References>\n          <uax:Reference>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=36</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:IsInverse>true</uax:IsInverse>\n            <uax:TargetId>\n              <uax:Identifier>ns=1;i=11383</uax:Identifier>\n            </uax:TargetId>\n          </uax:Reference>\n        </uax:References>\n        <EventId xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11385</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>EventId</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11385</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=15</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EventId>\n        <EventType xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11386</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>EventType</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11386</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </EventType>\n        <SourceNode xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11387</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>SourceNode</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11387</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SourceNode>\n        <SourceName xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11388</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>SourceName</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11388</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SourceName>\n        <Time xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11389</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Time</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11389</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=294</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Time>\n        <ReceiveTime xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11390</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>ReceiveTime</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11390</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=294</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ReceiveTime>\n        <Message xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11392</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Message</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11392</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Message>\n        <Severity xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11393</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Severity</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11393</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Severity>\n        <ConditionClassId xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11618</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>ConditionClassId</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11618</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ConditionClassId>\n        <ConditionClassName xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11619</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>ConditionClassName</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11619</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ConditionClassName>\n        <ConditionName xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11577</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>ConditionName</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11577</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ConditionName>\n        <BranchId xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11394</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>BranchId</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11394</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=17</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </BranchId>\n        <Retain xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11395</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Retain</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11395</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=1</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Retain>\n        <EnabledState xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11396</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>EnabledState</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=8995</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11396</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <Id>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11397</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>Id</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11397</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=1</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </Id>\n        </EnabledState>\n        <Quality xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11402</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Quality</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=9002</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11402</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=19</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <SourceTimestamp>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11403</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceTimestamp</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11403</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceTimestamp>\n        </Quality>\n        <LastSeverity xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11406</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>LastSeverity</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=9002</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11406</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=5</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <SourceTimestamp>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11407</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceTimestamp</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11407</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceTimestamp>\n        </LastSeverity>\n        <Comment xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11408</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Comment</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=9002</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11408</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=21</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <SourceTimestamp>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11409</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>SourceTimestamp</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11409</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=294</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </SourceTimestamp>\n        </Comment>\n        <ClientUserId xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11410</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>ClientUserId</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11410</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </ClientUserId>\n        <Disable xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11412</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Disable</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=9028</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11412</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=3065</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>i=2803</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </Disable>\n        <Enable xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11411</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>Enable</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=9027</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11411</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=3065</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>i=2803</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n        </Enable>\n        <AddComment xmlns=\"http://opcfoundation.org/UA/\">\n          <uax:NodeClass>Method_4</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11413</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>0</uax:NamespaceIndex>\n            <uax:Name>AddComment</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=9029</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11413</uax:NumericId>\n          <uax:Executable>true</uax:Executable>\n          <uax:UserExecutable>true</uax:UserExecutable>\n          <uax:References>\n            <uax:Reference>\n              <uax:ReferenceTypeId>\n                <uax:Identifier>i=3065</uax:Identifier>\n              </uax:ReferenceTypeId>\n              <uax:TargetId>\n                <uax:Identifier>i=2829</uax:Identifier>\n              </uax:TargetId>\n            </uax:Reference>\n          </uax:References>\n          <InputArguments>\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=1;i=11414</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>InputArguments</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:NumericId>11414</uax:NumericId>\n            <uax:Value>\n              <uax:Value>\n                <uax:ListOfExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>EventId</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=15</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The identifier for the event to comment.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                  <uax:ExtensionObject>\n                    <uax:TypeId>\n                      <uax:Identifier>i=297</uax:Identifier>\n                    </uax:TypeId>\n                    <uax:Body>\n                      <uax:Argument>\n                        <uax:Name>Comment</uax:Name>\n                        <uax:DataType>\n                          <uax:Identifier>i=21</uax:Identifier>\n                        </uax:DataType>\n                        <uax:ValueRank>-1</uax:ValueRank>\n                        <uax:ArrayDimensions />\n                        <uax:Description>\n                          <uax:Text>The comment to add to the condition.</uax:Text>\n                        </uax:Description>\n                      </uax:Argument>\n                    </uax:Body>\n                  </uax:ExtensionObject>\n                </uax:ListOfExtensionObject>\n              </uax:Value>\n            </uax:Value>\n            <uax:DataType>\n              <uax:Identifier>i=296</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>1</uax:ValueRank>\n            <uax:ArrayDimensions>0</uax:ArrayDimensions>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </InputArguments>\n        </AddComment>\n        <MonitoredNodeCount>\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=1;i=11417</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>MonitoredNodeCount</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:NumericId>11417</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=6</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </MonitoredNodeCount>\n      </SystemStatus>\n    </Conditions>\n  </Data>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11437</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11437</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9440</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=11425</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11438</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11438</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9669</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=11428</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11439</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11439</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9920</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=11431</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11440</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11440</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=10006</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=11434</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1008</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>1008</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1000</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1015</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1011</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>1011</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1004</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=24</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=1012</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>1012</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1005</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=27</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <TestData_BinarySchema xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11422</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>TestData</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11422</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vdGVzdC5vcmcvVUEvRGF0YS8iDQogIERlZmF1bHRCeXRl\nT3JkZXI9IkxpdHRsZUVuZGlhbiINCiAgVGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdC5vcmcv\nVUEvRGF0YS8iDQo+DQogIDxvcGM6SW1wb3J0IE5hbWVzcGFjZT0iaHR0cDovL29wY2ZvdW5kYXRp\nb24ub3JnL1VBLyIgTG9jYXRpb249Ik9wYy5VYS5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9w\nYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJTY2FsYXJWYWx1ZURhdGFUeXBlIiBCYXNlVHlwZT0idWE6\nRXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJvb2xlYW5WYWx1ZSIgVHlw\nZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpTQnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJ5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW50MTZWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVJbnQxNlZhbHVl\nIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDMyVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJW\nYWx1ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2\nNFZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUlu\ndDY0VmFsdWUiIFR5cGVOYW1lPSJvcGM6VUludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nRmxvYXRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpGbG9hdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIkRvdWJsZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlN0cmluZ1ZhbHVlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IkRhdGVUaW1lVmFsdWUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJHdWlkVmFsdWUiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAv\nPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudFZhbHVlIiBUeXBlTmFtZT0idWE6WG1s\nRWxlbWVudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZFZhbHVlIiBUeXBlTmFtZT0i\ndWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIg\nVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUXVh\nbGlmaWVkTmFtZVZhbHVlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkxvY2FsaXplZFRleHRWYWx1ZSIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRl\neHQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJ1\nYTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFudFZhbHVlIiBUeXBl\nTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkVudW1lcmF0aW9uVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdHJ1Y3R1\ncmVWYWx1ZSIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9iamVjdCIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik51bWJlciIgVHlwZU5hbWU9InVhOlZhcmlhbnQiIC8+DQogICAgPG9wYzpGaWVsZCBO\nYW1lPSJJbnRlZ2VyIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlVJbnRlZ2VyIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgPC9vcGM6U3RydWN0dXJl\nZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJBcnJheVZhbHVlRGF0YVR5cGUi\nIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P\nZkJvb2xlYW5WYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IkJvb2xlYW5WYWx1ZSIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiBMZW5ndGhGaWVsZD0iTm9P\nZkJvb2xlYW5WYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTQnl0ZVZhbHVlIiBU\neXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5dGVWYWx1ZSIg\nVHlwZU5hbWU9Im9wYzpTQnl0ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTQnl0ZVZhbHVlIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iTm9PZkJ5dGVWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4N\nCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJ5dGVWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlIiBMZW5n\ndGhGaWVsZD0iTm9PZkJ5dGVWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZJbnQx\nNlZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW50\nMTZWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQxNiIgTGVuZ3RoRmllbGQ9Ik5vT2ZJbnQxNlZhbHVl\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlVJbnQxNlZhbHVlIiBUeXBlTmFtZT0ib3Bj\nOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDE2VmFsdWUiIFR5cGVOYW1lPSJv\ncGM6VUludDE2IiBMZW5ndGhGaWVsZD0iTm9PZlVJbnQxNlZhbHVlIiAvPg0KICAgIDxvcGM6Rmll\nbGQgTmFtZT0iTm9PZkludDMyVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJJbnQzMlZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiBMZW5ndGhGaWVs\nZD0iTm9PZkludDMyVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludDMyVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJW\nYWx1ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIExlbmd0aEZpZWxkPSJOb09mVUludDMyVmFsdWUi\nIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mSW50NjRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJ\nbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDY0VmFsdWUiIFR5cGVOYW1lPSJvcGM6\nSW50NjQiIExlbmd0aEZpZWxkPSJOb09mSW50NjRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZVSW50NjRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZp\nZWxkIE5hbWU9IlVJbnQ2NFZhbHVlIiBUeXBlTmFtZT0ib3BjOlVJbnQ2NCIgTGVuZ3RoRmllbGQ9\nIk5vT2ZVSW50NjRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZGbG9hdFZhbHVl\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRmxvYXRWYWx1\nZSIgVHlwZU5hbWU9Im9wYzpGbG9hdCIgTGVuZ3RoRmllbGQ9Ik5vT2ZGbG9hdFZhbHVlIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRvdWJsZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMy\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRG91YmxlVmFsdWUiIFR5cGVOYW1lPSJvcGM6RG91\nYmxlIiBMZW5ndGhGaWVsZD0iTm9PZkRvdWJsZVZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iTm9PZlN0cmluZ1ZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6Rmll\nbGQgTmFtZT0iU3RyaW5nVmFsdWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5ndGhGaWVsZD0i\nTm9PZlN0cmluZ1ZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRhdGVUaW1lVmFs\ndWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRlVGlt\nZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiBMZW5ndGhGaWVsZD0iTm9PZkRhdGVUaW1l\nVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mR3VpZFZhbHVlIiBUeXBlTmFtZT0i\nb3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iR3VpZFZhbHVlIiBUeXBlTmFtZT0i\nb3BjOkd1aWQiIExlbmd0aEZpZWxkPSJOb09mR3VpZFZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iTm9PZkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IkJ5dGVTdHJpbmdWYWx1ZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5n\nIiBMZW5ndGhGaWVsZD0iTm9PZkJ5dGVTdHJpbmdWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZYbWxFbGVtZW50VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJYbWxFbGVtZW50VmFsdWUiIFR5cGVOYW1lPSJ1YTpYbWxFbGVtZW50IiBM\nZW5ndGhGaWVsZD0iTm9PZlhtbEVsZW1lbnRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIk5vT2ZOb2RlSWRWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5vZGVJZFZhbHVlIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBMZW5ndGhGaWVsZD0iTm9P\nZk5vZGVJZFZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkV4cGFuZGVkTm9kZUlk\nVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFeHBh\nbmRlZE5vZGVJZFZhbHVlIiBUeXBlTmFtZT0idWE6RXhwYW5kZWROb2RlSWQiIExlbmd0aEZpZWxk\nPSJOb09mRXhwYW5kZWROb2RlSWRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZR\ndWFsaWZpZWROYW1lVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJRdWFsaWZpZWROYW1lVmFsdWUiIFR5cGVOYW1lPSJ1YTpRdWFsaWZpZWROYW1lIiBM\nZW5ndGhGaWVsZD0iTm9PZlF1YWxpZmllZE5hbWVWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9Ik5vT2ZMb2NhbGl6ZWRUZXh0VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJMb2NhbGl6ZWRUZXh0VmFsdWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6\nZWRUZXh0IiBMZW5ndGhGaWVsZD0iTm9PZkxvY2FsaXplZFRleHRWYWx1ZSIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9Ik5vT2ZTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlVmFsdWUiIFR5cGVOYW1lPSJ1YTpTdGF0\ndXNDb2RlIiBMZW5ndGhGaWVsZD0iTm9PZlN0YXR1c0NvZGVWYWx1ZSIgLz4NCiAgICA8b3BjOkZp\nZWxkIE5hbWU9Ik5vT2ZWYXJpYW50VmFsdWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJWYXJpYW50VmFsdWUiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5n\ndGhGaWVsZD0iTm9PZlZhcmlhbnRWYWx1ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZF\nbnVtZXJhdGlvblZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iRW51bWVyYXRpb25WYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTGVuZ3RoRmllbGQ9\nIk5vT2ZFbnVtZXJhdGlvblZhbHVlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlN0cnVj\ndHVyZVZhbHVlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nU3RydWN0dXJlVmFsdWUiIFR5cGVOYW1lPSJ1YTpFeHRlbnNpb25PYmplY3QiIExlbmd0aEZpZWxk\nPSJOb09mU3RydWN0dXJlVmFsdWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTnVtYmVy\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTnVtYmVyIiBU\neXBlTmFtZT0idWE6VmFyaWFudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZOdW1iZXIiIC8+DQogICAgPG9w\nYzpGaWVsZCBOYW1lPSJOb09mSW50ZWdlciIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IkludGVnZXIiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5ndGhGaWVs\nZD0iTm9PZkludGVnZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludGVnZXIiIFR5\ncGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50ZWdlciIgVHlw\nZU5hbWU9InVhOlZhcmlhbnQiIExlbmd0aEZpZWxkPSJOb09mVUludGVnZXIiIC8+DQogIDwvb3Bj\nOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1lPSJCb29sZWFuRGF0YVR5\ncGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1lPSJTQnl0\nZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFt\nZT0iQnl0ZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5\ncGUgTmFtZT0iSW50MTZEYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpP\ncGFxdWVUeXBlIE5hbWU9IlVJbnQxNkRhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0K\nICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iSW50MzJEYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5\ncGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IlVJbnQzMkRhdGFUeXBlIj4NCiAgPC9vcGM6\nT3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iSW50NjREYXRhVHlwZSI+DQog\nIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IlVJbnQ2NERhdGFU\neXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iRmxv\nYXREYXRhVHlwZSI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5h\nbWU9IkRvdWJsZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1\nZVR5cGUgTmFtZT0iU3RyaW5nRGF0YVR5cGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxv\ncGM6T3BhcXVlVHlwZSBOYW1lPSJEYXRlVGltZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlw\nZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iR3VpZERhdGFUeXBlIj4NCiAgPC9vcGM6T3Bh\ncXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iQnl0ZVN0cmluZ0RhdGFUeXBlIj4N\nCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iWG1sRWxlbWVu\ndERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFt\nZT0iTm9kZUlkRGF0YVR5cGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVl\nVHlwZSBOYW1lPSJFeHBhbmRlZE5vZGVJZERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4N\nCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIj4NCiAgPC9v\ncGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iTG9jYWxpemVkVGV4dERh\ndGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0i\nU3RhdHVzQ29kZURhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1\nZVR5cGUgTmFtZT0iVmFyaWFudERhdGFUeXBlIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8\nb3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlVzZXJTY2FsYXJWYWx1ZURhdGFUeXBlIiBCYXNlVHlw\nZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJvb2xlYW5EYXRh\nVHlwZSIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU0J5\ndGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpTQnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIkJ5dGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IlVJbnQxNkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkludDMyRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg\nPG9wYzpGaWVsZCBOYW1lPSJVSW50MzJEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2NERhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDY0\nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDY0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nVUludDY0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRmxvYXREYXRhVHlwZSIgVHlwZU5hbWU9\nIm9wYzpGbG9hdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRvdWJsZURhdGFUeXBlIiBUeXBl\nTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0cmluZ0RhdGFUeXBl\nIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGVUaW1l\nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l\nPSJHdWlkRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IkJ5dGVTdHJpbmdEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudERhdGFUeXBlIiBUeXBlTmFtZT0idWE6WG1sRWxl\nbWVudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZERhdGFUeXBlIiBUeXBlTmFtZT0i\ndWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWREYXRhVHlw\nZSIgVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nUXVhbGlmaWVkTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgVHlwZU5hbWU9InVhOkxv\nY2FsaXplZFRleHQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlRGF0YVR5cGUi\nIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFu\ndERhdGFUeXBlIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5\ncGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJVc2VyQXJyYXlWYWx1ZURhdGFUeXBl\nIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZCb29sZWFuRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJCb29sZWFuRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgTGVuZ3RoRmll\nbGQ9Ik5vT2ZCb29sZWFuRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU0J5\ndGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9\nIlNCeXRlRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6U0J5dGUiIExlbmd0aEZpZWxkPSJOb09mU0J5\ndGVEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZCeXRlRGF0YVR5cGUiIFR5\ncGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCeXRlRGF0YVR5cGUi\nIFR5cGVOYW1lPSJvcGM6Qnl0ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZCeXRlRGF0YVR5cGUiIC8+DQog\nICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQz\nMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDE2RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nSW50MTYiIExlbmd0aEZpZWxkPSJOb09mSW50MTZEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik5vT2ZVSW50MTZEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8\nb3BjOkZpZWxkIE5hbWU9IlVJbnQxNkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgTGVu\nZ3RoRmllbGQ9Ik5vT2ZVSW50MTZEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZJbnQzMkRhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg\nTmFtZT0iSW50MzJEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTGVuZ3RoRmllbGQ9Ik5v\nT2ZJbnQzMkRhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlVJbnQzMkRhdGFU\neXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVUludDMy\nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiBMZW5ndGhGaWVsZD0iTm9PZlVJbnQzMkRh\ndGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkludDY0RGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnQ2NERhdGFUeXBlIiBU\neXBlTmFtZT0ib3BjOkludDY0IiBMZW5ndGhGaWVsZD0iTm9PZkludDY0RGF0YVR5cGUiIC8+DQog\nICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVUludDY0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6SW50\nMzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50NjREYXRhVHlwZSIgVHlwZU5hbWU9Im9w\nYzpVSW50NjQiIExlbmd0aEZpZWxkPSJOb09mVUludDY0RGF0YVR5cGUiIC8+DQogICAgPG9wYzpG\naWVsZCBOYW1lPSJOb09mRmxvYXREYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkZsb2F0RGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6RmxvYXQiIExl\nbmd0aEZpZWxkPSJOb09mRmxvYXREYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v\nT2ZEb3VibGVEYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9IkRvdWJsZURhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgTGVuZ3RoRmllbGQ9\nIk5vT2ZEb3VibGVEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTdHJpbmdE\nYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0\ncmluZ0RhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdHJp\nbmdEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEYXRlVGltZURhdGFUeXBl\nIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0ZVRpbWVE\nYXRhVHlwZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZEYXRlVGlt\nZURhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkd1aWREYXRhVHlwZSIgVHlw\nZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikd1aWREYXRhVHlwZSIg\nVHlwZU5hbWU9Im9wYzpHdWlkIiBMZW5ndGhGaWVsZD0iTm9PZkd1aWREYXRhVHlwZSIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZCeXRlU3RyaW5nRGF0YVR5cGUiIFR5cGVOYW1lPSJvcGM6\nSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCeXRlU3RyaW5nRGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZCeXRlU3RyaW5nRGF0YVR5cGUi\nIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mWG1sRWxlbWVudERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWG1sRWxlbWVudERhdGFUeXBl\nIiBUeXBlTmFtZT0idWE6WG1sRWxlbWVudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZYbWxFbGVtZW50RGF0\nYVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTm9kZUlkRGF0YVR5cGUiIFR5cGVO\nYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb2RlSWREYXRhVHlwZSIg\nVHlwZU5hbWU9InVhOk5vZGVJZCIgTGVuZ3RoRmllbGQ9Ik5vT2ZOb2RlSWREYXRhVHlwZSIgLz4N\nCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZFeHBhbmRlZE5vZGVJZERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWREYXRh\nVHlwZSIgVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiBMZW5ndGhGaWVsZD0iTm9PZkV4cGFu\nZGVkTm9kZUlkRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUXVhbGlmaWVk\nTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt\nZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgTGVu\nZ3RoRmllbGQ9Ik5vT2ZRdWFsaWZpZWROYW1lRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBO\nYW1lPSJOb09mTG9jYWxpemVkVGV4dERhdGFUeXBlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTG9jYWxpemVkVGV4dERhdGFUeXBlIiBUeXBlTmFtZT0idWE6\nTG9jYWxpemVkVGV4dCIgTGVuZ3RoRmllbGQ9Ik5vT2ZMb2NhbGl6ZWRUZXh0RGF0YVR5cGUiIC8+\nDQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU3RhdHVzQ29kZURhdGFUeXBlIiBUeXBlTmFtZT0i\nb3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhdHVzQ29kZURhdGFUeXBlIiBU\neXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdGF0dXNDb2RlRGF0YVR5\ncGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVmFyaWFudERhdGFUeXBlIiBUeXBlTmFt\nZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFyaWFudERhdGFUeXBlIiBU\neXBlTmFtZT0idWE6VmFyaWFudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZWYXJpYW50RGF0YVR5cGUiIC8+\nDQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i\nVmVjdG9yIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5h\nbWU9IlgiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWSIg\nVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJaIiBUeXBlTmFt\nZT0ib3BjOkRvdWJsZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1\nY3R1cmVkVHlwZSBOYW1lPSJXb3JrT3JkZXJTdGF0dXNUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5z\naW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFjdG9yIiBUeXBlTmFtZT0ib3BjOlN0\ncmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRpbWVzdGFtcCIgVHlwZU5hbWU9Im9wYzpE\nYXRlVGltZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNvbW1lbnQiIFR5cGVOYW1lPSJ1YTpM\nb2NhbGl6ZWRUZXh0IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVj\ndHVyZWRUeXBlIE5hbWU9IldvcmtPcmRlclR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmpl\nY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSUQiIFR5cGVOYW1lPSJvcGM6R3VpZCIgLz4NCiAg\nICA8b3BjOkZpZWxkIE5hbWU9IkFzc2V0SUQiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iU3RhcnRUaW1lIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiAvPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlN0YXR1c0NvbW1lbnRzIiBUeXBlTmFtZT0ib3BjOklu\ndDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhdHVzQ29tbWVudHMiIFR5cGVOYW1lPSJ0\nbnM6V29ya09yZGVyU3RhdHVzVHlwZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdGF0dXNDb21tZW50cyIg\nLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCjwvb3BjOlR5cGVEaWN0aW9uYXJ5Pg==</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=93</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11424</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11424</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://test.org/UA/Data/</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15045</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15045</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <ScalarValueDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11425</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ScalarValueDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11425</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>ScalarValueDataType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ScalarValueDataType>\n    <ArrayValueDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11428</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ArrayValueDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11428</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>ArrayValueDataType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ArrayValueDataType>\n    <UserScalarValueDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11431</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UserScalarValueDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11431</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>UserScalarValueDataType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UserScalarValueDataType>\n    <UserArrayValueDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11434</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UserArrayValueDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11434</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>UserArrayValueDataType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UserArrayValueDataType>\n    <Vector>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=1015</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Vector</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>1015</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>Vector</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Vector>\n    <WorkOrderStatusType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=24</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>WorkOrderStatusType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>24</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>WorkOrderStatusType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </WorkOrderStatusType>\n    <WorkOrderType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=27</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>WorkOrderType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>27</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>WorkOrderType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </WorkOrderType>\n  </TestData_BinarySchema>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11418</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11418</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9440</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=11444</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11419</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11419</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9669</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=11447</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11420</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11420</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9920</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=11450</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11421</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11421</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=10006</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=11453</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=36</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>36</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1000</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=43</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=39</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>39</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1004</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=52</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=40</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>40</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1005</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=55</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <TestData_XmlSchema xmlns=\"http://test.org/UA/Data/\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=11441</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>TestData</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>11441</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL3Rlc3Qub3JnL1VBL0RhdGEvIg0KICB0YXJnZXROYW1l\nc3BhY2U9Imh0dHA6Ly90ZXN0Lm9yZy9VQS9EYXRhLyINCiAgZWxlbWVudEZvcm1EZWZhdWx0PSJx\ndWFsaWZpZWQiDQo+DQogIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlv\nbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54c2QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9\nIlNjYWxhclZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IkJvb2xlYW5WYWx1ZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAv\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU0J5dGVWYWx1ZSIgdHlwZT0ieHM6Ynl0ZSIgbWlu\nT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZVZhbHVlIiB0eXBlPSJ4\nczp1bnNpZ25lZEJ5dGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9\nIkludDE2VmFsdWUiIHR5cGU9InhzOnNob3J0IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJVSW50MTZWYWx1ZSIgdHlwZT0ieHM6dW5zaWduZWRTaG9ydCIgbWluT2Nj\ndXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MzJWYWx1ZSIgdHlwZT0ieHM6\naW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJWYWx1\nZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IkludDY0VmFsdWUiIHR5cGU9InhzOmxvbmciIG1pbk9jY3Vycz0iMCIgLz4NCiAg\nICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQ2NFZhbHVlIiB0eXBlPSJ4czp1bnNpZ25lZExvbmci\nIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkZsb2F0VmFsdWUiIHR5\ncGU9InhzOmZsb2F0IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJE\nb3VibGVWYWx1ZSIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTdHJpbmdWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAi\nIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0ZVRpbWVWYWx1\nZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9Ikd1aWRWYWx1ZSIgdHlwZT0idWE6R3VpZCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg\nPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZVN0cmluZ1ZhbHVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnki\nIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l\nPSJYbWxFbGVtZW50VmFsdWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiPg0KICAgICAg\nICA8eHM6Y29tcGxleFR5cGU+DQogICAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgICAg\nPHhzOmFueSBtaW5PY2N1cnM9IjAiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPg0KICAgICAgICAg\nIDwveHM6c2VxdWVuY2U+DQogICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQogICAgICA8L3hzOmVs\nZW1lbnQ+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2RlSWRWYWx1ZSIgdHlwZT0idWE6Tm9k\nZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg\nbmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIgdHlwZT0idWE6RXhwYW5kZWROb2RlSWQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWFs\naWZpZWROYW1lVmFsdWUiIHR5cGU9InVhOlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGl6ZWRUZXh0VmFs\ndWUiIHR5cGU9InVhOkxvY2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlVmFsdWUiIHR5cGU9InVhOlN0\nYXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlZhcmlh\nbnRWYWx1ZSIgdHlwZT0idWE6VmFyaWFudCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVs\nZW1lbnQgbmFtZT0iRW51bWVyYXRpb25WYWx1ZSIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJ1Y3R1cmVWYWx1ZSIgdHlwZT0idWE6RXh0\nZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iTnVtYmVyIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnRlZ2VyIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50ZWdlciIgdHlwZT0idWE6\nVmFyaWFudCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t\ncGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlNjYWxhclZhbHVlRGF0YVR5cGUiIHR5cGU9\nInRuczpTY2FsYXJWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJM\naXN0T2ZTY2FsYXJWYWx1ZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTY2FsYXJWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6U2NhbGFyVmFsdWVE\nYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRy\ndWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVs\nZW1lbnQgbmFtZT0iTGlzdE9mU2NhbGFyVmFsdWVEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZlNj\nYWxhclZhbHVlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhz\nOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5VmFsdWVEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQm9vbGVhblZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZC\nb29sZWFuIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iU0J5dGVWYWx1ZSIgdHlwZT0idWE6TGlzdE9mU0J5dGUiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlVmFsdWUiIHR5\ncGU9InVhOkxpc3RPZkJ5dGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQxNlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQxNiIgbWlu\nT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJ\nbnQxNlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MTYiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9\nInRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQzMlZhbHVlIiB0eXBlPSJ1YTpM\naXN0T2ZJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IlVJbnQzMlZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MzIiIG1pbk9jY3Vy\ncz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQ2NFZh\nbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQ2NCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQ2NFZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZV\nSW50NjQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJGbG9hdFZhbHVlIiB0eXBlPSJ1YTpMaXN0T2ZGbG9hdCIgbWluT2NjdXJzPSIwIiBu\naWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRvdWJsZVZhbHVlIiB0\neXBlPSJ1YTpMaXN0T2ZEb3VibGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog\nICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJpbmdWYWx1ZSIgdHlwZT0idWE6TGlzdE9mU3RyaW5n\nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt\nZT0iRGF0ZVRpbWVWYWx1ZSIgdHlwZT0idWE6TGlzdE9mRGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJHdWlkVmFsdWUiIHR5\ncGU9InVhOkxpc3RPZkd1aWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlU3RyaW5nVmFsdWUiIHR5cGU9InVhOkxpc3RPZkJ5dGVT\ndHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJYbWxFbGVtZW50VmFsdWUiIHR5cGU9InVhOkxpc3RPZlhtbEVsZW1lbnQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2Rl\nSWRWYWx1ZSIgdHlwZT0idWE6TGlzdE9mTm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0\ncnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWRWYWx1ZSIgdHlw\nZT0idWE6TGlzdE9mRXhwYW5kZWROb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWFsaWZpZWROYW1lVmFsdWUiIHR5cGU9InVh\nOkxpc3RPZlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog\nICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGl6ZWRUZXh0VmFsdWUiIHR5cGU9InVhOkxpc3RP\nZkxvY2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8\neHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlVmFsdWUiIHR5cGU9InVhOkxpc3RPZlN0YXR1c0Nv\nZGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJWYXJpYW50VmFsdWUiIHR5cGU9InVhOkxpc3RPZlZhcmlhbnQiIG1pbk9jY3Vycz0iMCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbnVtZXJhdGlvblZh\nbHVlIiB0eXBlPSJ1YTpMaXN0T2ZJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0cnVjdHVyZVZhbHVlIiB0eXBlPSJ1YTpMaXN0\nT2ZFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJOdW1iZXIiIHR5cGU9InVhOkxpc3RPZlZhcmlhbnQiIG1pbk9j\nY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnRl\nZ2VyIiB0eXBlPSJ1YTpMaXN0T2ZWYXJpYW50IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVUludGVnZXIiIHR5cGU9InVhOkxpc3RPZlZh\ncmlhbnQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5j\nZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQXJyYXlWYWx1ZURh\ndGFUeXBlIiB0eXBlPSJ0bnM6QXJyYXlWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4\nVHlwZSBuYW1lPSJMaXN0T2ZBcnJheVZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFycmF5VmFsdWVEYXRhVHlwZSIgdHlwZT0idG5zOkFy\ncmF5VmFsdWVEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N\nCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQXJyYXlWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6\nTGlzdE9mQXJyYXlWYWx1ZURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0K\nDQogIDx4czplbGVtZW50IG5hbWU9IkJvb2xlYW5EYXRhVHlwZSIgdHlwZT0ieHM6Ym9vbGVhbiIg\nLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJTQnl0ZURhdGFUeXBlIiB0eXBlPSJ4czpieXRlIiAv\nPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkJ5dGVEYXRhVHlwZSIgdHlwZT0ieHM6dW5zaWduZWRC\neXRlIiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkludDE2RGF0YVR5cGUiIHR5cGU9InhzOnNo\nb3J0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IlVJbnQxNkRhdGFUeXBlIiB0eXBlPSJ4czp1\nbnNpZ25lZFNob3J0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkludDMyRGF0YVR5cGUiIHR5\ncGU9InhzOmludCIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJEYXRhVHlwZSIgdHlw\nZT0ieHM6dW5zaWduZWRJbnQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iSW50NjREYXRhVHlw\nZSIgdHlwZT0ieHM6bG9uZyIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50NjREYXRhVHlw\nZSIgdHlwZT0ieHM6dW5zaWduZWRMb25nIiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkZsb2F0\nRGF0YVR5cGUiIHR5cGU9InhzOmZsb2F0IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkRvdWJs\nZURhdGFUeXBlIiB0eXBlPSJ4czpkb3VibGUiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iU3Ry\naW5nRGF0YVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJE\nYXRlVGltZURhdGFUeXBlIiB0eXBlPSJ4czpkYXRlVGltZSIgLz4NCg0KICA8eHM6ZWxlbWVudCBu\nYW1lPSJHdWlkRGF0YVR5cGUiIHR5cGU9InVhOkd1aWQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFt\nZT0iQnl0ZVN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIC8+DQoNCiAgPHhz\nOmVsZW1lbnQgbmFtZT0iWG1sRWxlbWVudERhdGFUeXBlIiB0eXBlPSJ1YTpYbWxFbGVtZW50IiAv\nPg0KDQogIDx4czplbGVtZW50IG5hbWU9Ik5vZGVJZERhdGFUeXBlIiB0eXBlPSJ1YTpOb2RlSWQi\nIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWREYXRhVHlwZSIgdHlwZT0i\ndWE6RXhwYW5kZWROb2RlSWQiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iUXVhbGlmaWVkTmFt\nZURhdGFUeXBlIiB0eXBlPSJ1YTpRdWFsaWZpZWROYW1lIiAvPg0KDQogIDx4czplbGVtZW50IG5h\nbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgLz4NCg0K\nICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlRGF0YVR5cGUiIHR5cGU9InVhOlN0YXR1c0Nv\nZGUiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudERhdGFUeXBlIiB0eXBlPSJ1YTpW\nYXJpYW50IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJVc2VyU2NhbGFyVmFsdWVEYXRh\nVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQm9vbGVh\nbkRhdGFUeXBlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6\nZWxlbWVudCBuYW1lPSJTQnl0ZURhdGFUeXBlIiB0eXBlPSJ4czpieXRlIiBtaW5PY2N1cnM9IjAi\nIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlRGF0YVR5cGUiIHR5cGU9InhzOnVuc2ln\nbmVkQnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MTZE\nYXRhVHlwZSIgdHlwZT0ieHM6c2hvcnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IlVJbnQxNkRhdGFUeXBlIiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1\ncnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQzMkRhdGFUeXBlIiB0eXBlPSJ4\nczppbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJbnQzMkRh\ndGFUeXBlIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iSW50NjREYXRhVHlwZSIgdHlwZT0ieHM6bG9uZyIgbWluT2NjdXJzPSIw\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVUludDY0RGF0YVR5cGUiIHR5cGU9InhzOnVu\nc2lnbmVkTG9uZyIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmxv\nYXREYXRhVHlwZSIgdHlwZT0ieHM6ZmxvYXQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IkRvdWJsZURhdGFUeXBlIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0i\nMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ4czpz\ndHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu\ndCBuYW1lPSJEYXRlVGltZURhdGFUeXBlIiB0eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJzPSIw\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iR3VpZERhdGFUeXBlIiB0eXBlPSJ1YTpHdWlk\nIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlU3RyaW5nRGF0\nYVR5cGUiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1\nZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlhtbEVsZW1lbnREYXRhVHlwZSIgbWluT2Nj\ndXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSI+DQogICAgICAgIDx4czpjb21wbGV4VHlwZT4NCiAgICAg\nICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgcHJv\nY2Vzc0NvbnRlbnRzPSJsYXgiIC8+DQogICAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgICAg\nPC94czpjb21wbGV4VHlwZT4NCiAgICAgIDwveHM6ZWxlbWVudD4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9Ik5vZGVJZERhdGFUeXBlIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmls\nbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFeHBhbmRlZE5vZGVJZERh\ndGFUeXBlIiB0eXBlPSJ1YTpFeHBhbmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i\ndHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlF1YWxpZmllZE5hbWVEYXRhVHlwZSIg\ndHlwZT0idWE6UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkxvY2FsaXplZFRleHREYXRhVHlwZSIgdHlwZT0idWE6\nTG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4\nczplbGVtZW50IG5hbWU9IlN0YXR1c0NvZGVEYXRhVHlwZSIgdHlwZT0idWE6U3RhdHVzQ29kZSIg\nbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudERhdGFUeXBl\nIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N\nCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVXNlclNjYWxhclZhbHVl\nRGF0YVR5cGUiIHR5cGU9InRuczpVc2VyU2NhbGFyVmFsdWVEYXRhVHlwZSIgLz4NCg0KICA8eHM6\nY29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVXNlclNjYWxhclZhbHVlRGF0YVR5cGUiPg0KICAgIDx4\nczpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJTY2FsYXJWYWx1ZURhdGFU\neXBlIiB0eXBlPSJ0bnM6VXNlclNjYWxhclZhbHVlRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4\nT2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+\nDQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlVzZXJTY2Fs\nYXJWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mVXNlclNjYWxhclZhbHVlRGF0YVR5cGUi\nIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9\nIlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czpl\nbGVtZW50IG5hbWU9IkJvb2xlYW5EYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mQm9vbGVhbiIgbWlu\nT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNC\neXRlRGF0YVR5cGUiIHR5cGU9InVhOkxpc3RPZlNCeXRlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl\nPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZURhdGFUeXBlIiB0eXBlPSJ0\nbnM6TGlzdE9mQnl0ZURhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K\nICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MTZEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mSW50\nMTYiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJVSW50MTZEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mVUludDE2IiBtaW5PY2N1cnM9IjAi\nIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MzJEYXRhVHlw\nZSIgdHlwZT0idWE6TGlzdE9mSW50MzIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MzJEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9m\nVUludDMyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iSW50NjREYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mSW50NjQiIG1pbk9jY3Vycz0i\nMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50NjREYXRh\nVHlwZSIgdHlwZT0idWE6TGlzdE9mVUludDY0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmxvYXREYXRhVHlwZSIgdHlwZT0idWE6TGlz\ndE9mRmxvYXQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl\nbWVudCBuYW1lPSJEb3VibGVEYXRhVHlwZSIgdHlwZT0idWE6TGlzdE9mRG91YmxlIiBtaW5PY2N1\ncnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RyaW5n\nRGF0YVR5cGUiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i\ndHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGVUaW1lRGF0YVR5cGUiIHR5cGU9\nInVhOkxpc3RPZkRhdGVUaW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nICAgPHhzOmVsZW1lbnQgbmFtZT0iR3VpZERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZHdWlkIiBt\naW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i\nQnl0ZVN0cmluZ0RhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZCeXRlU3RyaW5nIiBtaW5PY2N1cnM9\nIjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iWG1sRWxlbWVu\ndERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZYbWxFbGVtZW50IiBtaW5PY2N1cnM9IjAiIG5pbGxh\nYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZUlkRGF0YVR5cGUiIHR5\ncGU9InVhOkxpc3RPZk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg\nICAgIDx4czplbGVtZW50IG5hbWU9IkV4cGFuZGVkTm9kZUlkRGF0YVR5cGUiIHR5cGU9InVhOkxp\nc3RPZkV4cGFuZGVkTm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVhbGlmaWVkTmFtZURhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0\nT2ZRdWFsaWZpZWROYW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg\nPHhzOmVsZW1lbnQgbmFtZT0iTG9jYWxpemVkVGV4dERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZM\nb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz\nOmVsZW1lbnQgbmFtZT0iU3RhdHVzQ29kZURhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZTdGF0dXND\nb2RlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg\nbmFtZT0iVmFyaWFudERhdGFUeXBlIiB0eXBlPSJ1YTpMaXN0T2ZWYXJpYW50IiBtaW5PY2N1cnM9\nIjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl\neFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiIHR5cGU9\nInRuczpVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l\nPSJMaXN0T2ZVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg\nICA8eHM6ZWxlbWVudCBuYW1lPSJVc2VyQXJyYXlWYWx1ZURhdGFUeXBlIiB0eXBlPSJ0bnM6VXNl\nckFycmF5VmFsdWVEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg\nbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw\nZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVXNlckFycmF5VmFsdWVEYXRhVHlwZSIgdHlw\nZT0idG5zOkxpc3RPZlVzZXJBcnJheVZhbHVlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hz\nOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZlY3RvciI+DQogICAgPHhzOnNl\ncXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iWCIgdHlwZT0ieHM6ZG91YmxlIiBtaW5P\nY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJZIiB0eXBlPSJ4czpkb3VibGUi\nIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IloiIHR5cGU9InhzOmRv\ndWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl\neFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlZlY3RvciIgdHlwZT0idG5zOlZlY3RvciIgLz4N\nCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVmVjdG9yIj4NCiAgICA8eHM6c2VxdWVu\nY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWZWN0b3IiIHR5cGU9InRuczpWZWN0b3IiIG1p\nbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9\nIkxpc3RPZlZlY3RvciIgdHlwZT0idG5zOkxpc3RPZlZlY3RvciIgbmlsbGFibGU9InRydWUiPjwv\neHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyU3RhdHVzVHlw\nZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWN0b3IiIHR5\ncGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4\nczplbGVtZW50IG5hbWU9IlRpbWVzdGFtcCIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0i\nMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNvbW1lbnQiIHR5cGU9InVhOkxvY2FsaXpl\nZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5j\nZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iV29ya09yZGVyU3Rh\ndHVzVHlwZSIgdHlwZT0idG5zOldvcmtPcmRlclN0YXR1c1R5cGUiIC8+DQoNCiAgPHhzOmNvbXBs\nZXhUeXBlIG5hbWU9Ikxpc3RPZldvcmtPcmRlclN0YXR1c1R5cGUiPg0KICAgIDx4czpzZXF1ZW5j\nZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IldvcmtPcmRlclN0YXR1c1R5cGUiIHR5cGU9InRu\nczpXb3JrT3JkZXJTdGF0dXNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVk\nIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU\neXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZXb3JrT3JkZXJTdGF0dXNUeXBlIiB0eXBl\nPSJ0bnM6TGlzdE9mV29ya09yZGVyU3RhdHVzVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxl\nbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+DQogICAgPHhz\nOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSUQiIHR5cGU9InVhOkd1aWQiIG1p\nbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFzc2V0SUQiIHR5cGU9Inhz\nOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt\nZW50IG5hbWU9IlN0YXJ0VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4N\nCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXR1c0NvbW1lbnRzIiB0eXBlPSJ0bnM6TGlzdE9m\nV29ya09yZGVyU3RhdHVzVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg\nICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l\nPSJXb3JrT3JkZXJUeXBlIiB0eXBlPSJ0bnM6V29ya09yZGVyVHlwZSIgLz4NCg0KICA8eHM6Y29t\ncGxleFR5cGUgbmFtZT0iTGlzdE9mV29ya09yZGVyVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0K\nICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iV29ya09yZGVyVHlwZSIgdHlwZT0idG5zOldvcmtPcmRl\nclR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt\nZW50IG5hbWU9Ikxpc3RPZldvcmtPcmRlclR5cGUiIHR5cGU9InRuczpMaXN0T2ZXb3JrT3JkZXJU\neXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQo8L3hzOnNjaGVtYT4=</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=92</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11443</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11443</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://test.org/UA/Data/</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15046</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15046</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <ScalarValueDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11444</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ScalarValueDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11444</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='ScalarValueDataType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ScalarValueDataType>\n    <ArrayValueDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11447</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>ArrayValueDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11447</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='ArrayValueDataType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </ArrayValueDataType>\n    <UserScalarValueDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11450</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UserScalarValueDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11450</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='UserScalarValueDataType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UserScalarValueDataType>\n    <UserArrayValueDataType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=11453</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>UserArrayValueDataType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>11453</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='UserArrayValueDataType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </UserArrayValueDataType>\n    <Vector>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=43</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Vector</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>43</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='Vector']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Vector>\n    <WorkOrderStatusType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=52</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>WorkOrderStatusType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>52</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='WorkOrderStatusType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </WorkOrderStatusType>\n    <WorkOrderType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=55</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>WorkOrderType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>55</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='WorkOrderType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </WorkOrderType>\n  </TestData_XmlSchema>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15047</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15047</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9440</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15048</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15048</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9669</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15049</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15049</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=9920</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15050</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15050</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=10006</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=64</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>64</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1000</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=67</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>67</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1004</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=68</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>68</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=1005</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://test.org/UA/Data/\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://test.org/UA/Data/\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n  <opc:StructuredType Name=\"ScalarValueDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"BooleanValue\" TypeName=\"opc:Boolean\" />\n    <opc:Field Name=\"SByteValue\" TypeName=\"opc:SByte\" />\n    <opc:Field Name=\"ByteValue\" TypeName=\"opc:Byte\" />\n    <opc:Field Name=\"Int16Value\" TypeName=\"opc:Int16\" />\n    <opc:Field Name=\"UInt16Value\" TypeName=\"opc:UInt16\" />\n    <opc:Field Name=\"Int32Value\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInt32Value\" TypeName=\"opc:UInt32\" />\n    <opc:Field Name=\"Int64Value\" TypeName=\"opc:Int64\" />\n    <opc:Field Name=\"UInt64Value\" TypeName=\"opc:UInt64\" />\n    <opc:Field Name=\"FloatValue\" TypeName=\"opc:Float\" />\n    <opc:Field Name=\"DoubleValue\" TypeName=\"opc:Double\" />\n    <opc:Field Name=\"StringValue\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"DateTimeValue\" TypeName=\"opc:DateTime\" />\n    <opc:Field Name=\"GuidValue\" TypeName=\"opc:Guid\" />\n    <opc:Field Name=\"ByteStringValue\" TypeName=\"opc:ByteString\" />\n    <opc:Field Name=\"XmlElementValue\" TypeName=\"ua:XmlElement\" />\n    <opc:Field Name=\"NodeIdValue\" TypeName=\"ua:NodeId\" />\n    <opc:Field Name=\"ExpandedNodeIdValue\" TypeName=\"ua:ExpandedNodeId\" />\n    <opc:Field Name=\"QualifiedNameValue\" TypeName=\"ua:QualifiedName\" />\n    <opc:Field Name=\"LocalizedTextValue\" TypeName=\"ua:LocalizedText\" />\n    <opc:Field Name=\"StatusCodeValue\" TypeName=\"ua:StatusCode\" />\n    <opc:Field Name=\"VariantValue\" TypeName=\"ua:Variant\" />\n    <opc:Field Name=\"EnumerationValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"StructureValue\" TypeName=\"ua:ExtensionObject\" />\n    <opc:Field Name=\"Number\" TypeName=\"ua:Variant\" />\n    <opc:Field Name=\"Integer\" TypeName=\"ua:Variant\" />\n    <opc:Field Name=\"UInteger\" TypeName=\"ua:Variant\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"ArrayValueDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"NoOfBooleanValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"BooleanValue\" TypeName=\"opc:Boolean\" LengthField=\"NoOfBooleanValue\" />\n    <opc:Field Name=\"NoOfSByteValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"SByteValue\" TypeName=\"opc:SByte\" LengthField=\"NoOfSByteValue\" />\n    <opc:Field Name=\"NoOfByteValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"ByteValue\" TypeName=\"opc:Byte\" LengthField=\"NoOfByteValue\" />\n    <opc:Field Name=\"NoOfInt16Value\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Int16Value\" TypeName=\"opc:Int16\" LengthField=\"NoOfInt16Value\" />\n    <opc:Field Name=\"NoOfUInt16Value\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInt16Value\" TypeName=\"opc:UInt16\" LengthField=\"NoOfUInt16Value\" />\n    <opc:Field Name=\"NoOfInt32Value\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Int32Value\" TypeName=\"opc:Int32\" LengthField=\"NoOfInt32Value\" />\n    <opc:Field Name=\"NoOfUInt32Value\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInt32Value\" TypeName=\"opc:UInt32\" LengthField=\"NoOfUInt32Value\" />\n    <opc:Field Name=\"NoOfInt64Value\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Int64Value\" TypeName=\"opc:Int64\" LengthField=\"NoOfInt64Value\" />\n    <opc:Field Name=\"NoOfUInt64Value\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInt64Value\" TypeName=\"opc:UInt64\" LengthField=\"NoOfUInt64Value\" />\n    <opc:Field Name=\"NoOfFloatValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"FloatValue\" TypeName=\"opc:Float\" LengthField=\"NoOfFloatValue\" />\n    <opc:Field Name=\"NoOfDoubleValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"DoubleValue\" TypeName=\"opc:Double\" LengthField=\"NoOfDoubleValue\" />\n    <opc:Field Name=\"NoOfStringValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"StringValue\" TypeName=\"opc:String\" LengthField=\"NoOfStringValue\" />\n    <opc:Field Name=\"NoOfDateTimeValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"DateTimeValue\" TypeName=\"opc:DateTime\" LengthField=\"NoOfDateTimeValue\" />\n    <opc:Field Name=\"NoOfGuidValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"GuidValue\" TypeName=\"opc:Guid\" LengthField=\"NoOfGuidValue\" />\n    <opc:Field Name=\"NoOfByteStringValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"ByteStringValue\" TypeName=\"opc:ByteString\" LengthField=\"NoOfByteStringValue\" />\n    <opc:Field Name=\"NoOfXmlElementValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"XmlElementValue\" TypeName=\"ua:XmlElement\" LengthField=\"NoOfXmlElementValue\" />\n    <opc:Field Name=\"NoOfNodeIdValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"NodeIdValue\" TypeName=\"ua:NodeId\" LengthField=\"NoOfNodeIdValue\" />\n    <opc:Field Name=\"NoOfExpandedNodeIdValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"ExpandedNodeIdValue\" TypeName=\"ua:ExpandedNodeId\" LengthField=\"NoOfExpandedNodeIdValue\" />\n    <opc:Field Name=\"NoOfQualifiedNameValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"QualifiedNameValue\" TypeName=\"ua:QualifiedName\" LengthField=\"NoOfQualifiedNameValue\" />\n    <opc:Field Name=\"NoOfLocalizedTextValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"LocalizedTextValue\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfLocalizedTextValue\" />\n    <opc:Field Name=\"NoOfStatusCodeValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"StatusCodeValue\" TypeName=\"ua:StatusCode\" LengthField=\"NoOfStatusCodeValue\" />\n    <opc:Field Name=\"NoOfVariantValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"VariantValue\" TypeName=\"ua:Variant\" LengthField=\"NoOfVariantValue\" />\n    <opc:Field Name=\"NoOfEnumerationValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"EnumerationValue\" TypeName=\"opc:Int32\" LengthField=\"NoOfEnumerationValue\" />\n    <opc:Field Name=\"NoOfStructureValue\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"StructureValue\" TypeName=\"ua:ExtensionObject\" LengthField=\"NoOfStructureValue\" />\n    <opc:Field Name=\"NoOfNumber\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Number\" TypeName=\"ua:Variant\" LengthField=\"NoOfNumber\" />\n    <opc:Field Name=\"NoOfInteger\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Integer\" TypeName=\"ua:Variant\" LengthField=\"NoOfInteger\" />\n    <opc:Field Name=\"NoOfUInteger\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInteger\" TypeName=\"ua:Variant\" LengthField=\"NoOfUInteger\" />\n  </opc:StructuredType>\n\n  <opc:OpaqueType Name=\"BooleanDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"SByteDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"ByteDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"Int16DataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"UInt16DataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"Int32DataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"UInt32DataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"Int64DataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"UInt64DataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"FloatDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"DoubleDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"StringDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"DateTimeDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"GuidDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"ByteStringDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"XmlElementDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"NodeIdDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"ExpandedNodeIdDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"QualifiedNameDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"LocalizedTextDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"StatusCodeDataType\">\n  </opc:OpaqueType>\n\n  <opc:OpaqueType Name=\"VariantDataType\">\n  </opc:OpaqueType>\n\n  <opc:StructuredType Name=\"UserScalarValueDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"BooleanDataType\" TypeName=\"opc:Boolean\" />\n    <opc:Field Name=\"SByteDataType\" TypeName=\"opc:SByte\" />\n    <opc:Field Name=\"ByteDataType\" TypeName=\"opc:Byte\" />\n    <opc:Field Name=\"Int16DataType\" TypeName=\"opc:Int16\" />\n    <opc:Field Name=\"UInt16DataType\" TypeName=\"opc:UInt16\" />\n    <opc:Field Name=\"Int32DataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInt32DataType\" TypeName=\"opc:UInt32\" />\n    <opc:Field Name=\"Int64DataType\" TypeName=\"opc:Int64\" />\n    <opc:Field Name=\"UInt64DataType\" TypeName=\"opc:UInt64\" />\n    <opc:Field Name=\"FloatDataType\" TypeName=\"opc:Float\" />\n    <opc:Field Name=\"DoubleDataType\" TypeName=\"opc:Double\" />\n    <opc:Field Name=\"StringDataType\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"DateTimeDataType\" TypeName=\"opc:DateTime\" />\n    <opc:Field Name=\"GuidDataType\" TypeName=\"opc:Guid\" />\n    <opc:Field Name=\"ByteStringDataType\" TypeName=\"opc:ByteString\" />\n    <opc:Field Name=\"XmlElementDataType\" TypeName=\"ua:XmlElement\" />\n    <opc:Field Name=\"NodeIdDataType\" TypeName=\"ua:NodeId\" />\n    <opc:Field Name=\"ExpandedNodeIdDataType\" TypeName=\"ua:ExpandedNodeId\" />\n    <opc:Field Name=\"QualifiedNameDataType\" TypeName=\"ua:QualifiedName\" />\n    <opc:Field Name=\"LocalizedTextDataType\" TypeName=\"ua:LocalizedText\" />\n    <opc:Field Name=\"StatusCodeDataType\" TypeName=\"ua:StatusCode\" />\n    <opc:Field Name=\"VariantDataType\" TypeName=\"ua:Variant\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"UserArrayValueDataType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"NoOfBooleanDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"BooleanDataType\" TypeName=\"opc:Boolean\" LengthField=\"NoOfBooleanDataType\" />\n    <opc:Field Name=\"NoOfSByteDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"SByteDataType\" TypeName=\"opc:SByte\" LengthField=\"NoOfSByteDataType\" />\n    <opc:Field Name=\"NoOfByteDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"ByteDataType\" TypeName=\"opc:Byte\" LengthField=\"NoOfByteDataType\" />\n    <opc:Field Name=\"NoOfInt16DataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Int16DataType\" TypeName=\"opc:Int16\" LengthField=\"NoOfInt16DataType\" />\n    <opc:Field Name=\"NoOfUInt16DataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInt16DataType\" TypeName=\"opc:UInt16\" LengthField=\"NoOfUInt16DataType\" />\n    <opc:Field Name=\"NoOfInt32DataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Int32DataType\" TypeName=\"opc:Int32\" LengthField=\"NoOfInt32DataType\" />\n    <opc:Field Name=\"NoOfUInt32DataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInt32DataType\" TypeName=\"opc:UInt32\" LengthField=\"NoOfUInt32DataType\" />\n    <opc:Field Name=\"NoOfInt64DataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"Int64DataType\" TypeName=\"opc:Int64\" LengthField=\"NoOfInt64DataType\" />\n    <opc:Field Name=\"NoOfUInt64DataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"UInt64DataType\" TypeName=\"opc:UInt64\" LengthField=\"NoOfUInt64DataType\" />\n    <opc:Field Name=\"NoOfFloatDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"FloatDataType\" TypeName=\"opc:Float\" LengthField=\"NoOfFloatDataType\" />\n    <opc:Field Name=\"NoOfDoubleDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"DoubleDataType\" TypeName=\"opc:Double\" LengthField=\"NoOfDoubleDataType\" />\n    <opc:Field Name=\"NoOfStringDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"StringDataType\" TypeName=\"opc:String\" LengthField=\"NoOfStringDataType\" />\n    <opc:Field Name=\"NoOfDateTimeDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"DateTimeDataType\" TypeName=\"opc:DateTime\" LengthField=\"NoOfDateTimeDataType\" />\n    <opc:Field Name=\"NoOfGuidDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"GuidDataType\" TypeName=\"opc:Guid\" LengthField=\"NoOfGuidDataType\" />\n    <opc:Field Name=\"NoOfByteStringDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"ByteStringDataType\" TypeName=\"opc:ByteString\" LengthField=\"NoOfByteStringDataType\" />\n    <opc:Field Name=\"NoOfXmlElementDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"XmlElementDataType\" TypeName=\"ua:XmlElement\" LengthField=\"NoOfXmlElementDataType\" />\n    <opc:Field Name=\"NoOfNodeIdDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"NodeIdDataType\" TypeName=\"ua:NodeId\" LengthField=\"NoOfNodeIdDataType\" />\n    <opc:Field Name=\"NoOfExpandedNodeIdDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"ExpandedNodeIdDataType\" TypeName=\"ua:ExpandedNodeId\" LengthField=\"NoOfExpandedNodeIdDataType\" />\n    <opc:Field Name=\"NoOfQualifiedNameDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"QualifiedNameDataType\" TypeName=\"ua:QualifiedName\" LengthField=\"NoOfQualifiedNameDataType\" />\n    <opc:Field Name=\"NoOfLocalizedTextDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"LocalizedTextDataType\" TypeName=\"ua:LocalizedText\" LengthField=\"NoOfLocalizedTextDataType\" />\n    <opc:Field Name=\"NoOfStatusCodeDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"StatusCodeDataType\" TypeName=\"ua:StatusCode\" LengthField=\"NoOfStatusCodeDataType\" />\n    <opc:Field Name=\"NoOfVariantDataType\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"VariantDataType\" TypeName=\"ua:Variant\" LengthField=\"NoOfVariantDataType\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"Vector\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"X\" TypeName=\"opc:Double\" />\n    <opc:Field Name=\"Y\" TypeName=\"opc:Double\" />\n    <opc:Field Name=\"Z\" TypeName=\"opc:Double\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"WorkOrderStatusType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"Actor\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Timestamp\" TypeName=\"opc:DateTime\" />\n    <opc:Field Name=\"Comment\" TypeName=\"ua:LocalizedText\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"WorkOrderType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"ID\" TypeName=\"opc:Guid\" />\n    <opc:Field Name=\"AssetID\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"StartTime\" TypeName=\"opc:DateTime\" />\n    <opc:Field Name=\"NoOfStatusComments\" TypeName=\"opc:Int32\" />\n    <opc:Field Name=\"StatusComments\" TypeName=\"tns:WorkOrderStatusType\" LengthField=\"NoOfStatusComments\" />\n  </opc:StructuredType>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestData.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://test.org/UA/Data/\"\n  targetNamespace=\"http://test.org/UA/Data/\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n  <xs:complexType name=\"ScalarValueDataType\">\n    <xs:sequence>\n      <xs:element name=\"BooleanValue\" type=\"xs:boolean\" minOccurs=\"0\" />\n      <xs:element name=\"SByteValue\" type=\"xs:byte\" minOccurs=\"0\" />\n      <xs:element name=\"ByteValue\" type=\"xs:unsignedByte\" minOccurs=\"0\" />\n      <xs:element name=\"Int16Value\" type=\"xs:short\" minOccurs=\"0\" />\n      <xs:element name=\"UInt16Value\" type=\"xs:unsignedShort\" minOccurs=\"0\" />\n      <xs:element name=\"Int32Value\" type=\"xs:int\" minOccurs=\"0\" />\n      <xs:element name=\"UInt32Value\" type=\"xs:unsignedInt\" minOccurs=\"0\" />\n      <xs:element name=\"Int64Value\" type=\"xs:long\" minOccurs=\"0\" />\n      <xs:element name=\"UInt64Value\" type=\"xs:unsignedLong\" minOccurs=\"0\" />\n      <xs:element name=\"FloatValue\" type=\"xs:float\" minOccurs=\"0\" />\n      <xs:element name=\"DoubleValue\" type=\"xs:double\" minOccurs=\"0\" />\n      <xs:element name=\"StringValue\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"DateTimeValue\" type=\"xs:dateTime\" minOccurs=\"0\" />\n      <xs:element name=\"GuidValue\" type=\"ua:Guid\" minOccurs=\"0\" />\n      <xs:element name=\"ByteStringValue\" type=\"xs:base64Binary\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"XmlElementValue\" minOccurs=\"0\" nillable=\"true\">\n        <xs:complexType>\n          <xs:sequence>\n            <xs:any minOccurs=\"0\" processContents=\"lax\" />\n          </xs:sequence>\n        </xs:complexType>\n      </xs:element>\n      <xs:element name=\"NodeIdValue\" type=\"ua:NodeId\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"ExpandedNodeIdValue\" type=\"ua:ExpandedNodeId\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"QualifiedNameValue\" type=\"ua:QualifiedName\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"LocalizedTextValue\" type=\"ua:LocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StatusCodeValue\" type=\"ua:StatusCode\" minOccurs=\"0\" />\n      <xs:element name=\"VariantValue\" type=\"ua:Variant\" minOccurs=\"0\" />\n      <xs:element name=\"EnumerationValue\" type=\"xs:int\" minOccurs=\"0\" />\n      <xs:element name=\"StructureValue\" type=\"ua:ExtensionObject\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Number\" type=\"ua:Variant\" minOccurs=\"0\" />\n      <xs:element name=\"Integer\" type=\"ua:Variant\" minOccurs=\"0\" />\n      <xs:element name=\"UInteger\" type=\"ua:Variant\" minOccurs=\"0\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ScalarValueDataType\" type=\"tns:ScalarValueDataType\" />\n\n  <xs:complexType name=\"ListOfScalarValueDataType\">\n    <xs:sequence>\n      <xs:element name=\"ScalarValueDataType\" type=\"tns:ScalarValueDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfScalarValueDataType\" type=\"tns:ListOfScalarValueDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"ArrayValueDataType\">\n    <xs:sequence>\n      <xs:element name=\"BooleanValue\" type=\"ua:ListOfBoolean\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"SByteValue\" type=\"ua:ListOfSByte\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"ByteValue\" type=\"ua:ListOfByte\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Int16Value\" type=\"ua:ListOfInt16\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"UInt16Value\" type=\"ua:ListOfUInt16\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Int32Value\" type=\"ua:ListOfInt32\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"UInt32Value\" type=\"ua:ListOfUInt32\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Int64Value\" type=\"ua:ListOfInt64\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"UInt64Value\" type=\"ua:ListOfUInt64\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"FloatValue\" type=\"ua:ListOfFloat\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"DoubleValue\" type=\"ua:ListOfDouble\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StringValue\" type=\"ua:ListOfString\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"DateTimeValue\" type=\"ua:ListOfDateTime\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"GuidValue\" type=\"ua:ListOfGuid\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"ByteStringValue\" type=\"ua:ListOfByteString\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"XmlElementValue\" type=\"ua:ListOfXmlElement\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"NodeIdValue\" type=\"ua:ListOfNodeId\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"ExpandedNodeIdValue\" type=\"ua:ListOfExpandedNodeId\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"QualifiedNameValue\" type=\"ua:ListOfQualifiedName\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"LocalizedTextValue\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StatusCodeValue\" type=\"ua:ListOfStatusCode\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"VariantValue\" type=\"ua:ListOfVariant\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"EnumerationValue\" type=\"ua:ListOfInt32\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StructureValue\" type=\"ua:ListOfExtensionObject\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Number\" type=\"ua:ListOfVariant\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Integer\" type=\"ua:ListOfVariant\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"UInteger\" type=\"ua:ListOfVariant\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ArrayValueDataType\" type=\"tns:ArrayValueDataType\" />\n\n  <xs:complexType name=\"ListOfArrayValueDataType\">\n    <xs:sequence>\n      <xs:element name=\"ArrayValueDataType\" type=\"tns:ArrayValueDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfArrayValueDataType\" type=\"tns:ListOfArrayValueDataType\" nillable=\"true\"></xs:element>\n\n  <xs:element name=\"BooleanDataType\" type=\"xs:boolean\" />\n\n  <xs:element name=\"SByteDataType\" type=\"xs:byte\" />\n\n  <xs:element name=\"ByteDataType\" type=\"xs:unsignedByte\" />\n\n  <xs:element name=\"Int16DataType\" type=\"xs:short\" />\n\n  <xs:element name=\"UInt16DataType\" type=\"xs:unsignedShort\" />\n\n  <xs:element name=\"Int32DataType\" type=\"xs:int\" />\n\n  <xs:element name=\"UInt32DataType\" type=\"xs:unsignedInt\" />\n\n  <xs:element name=\"Int64DataType\" type=\"xs:long\" />\n\n  <xs:element name=\"UInt64DataType\" type=\"xs:unsignedLong\" />\n\n  <xs:element name=\"FloatDataType\" type=\"xs:float\" />\n\n  <xs:element name=\"DoubleDataType\" type=\"xs:double\" />\n\n  <xs:element name=\"StringDataType\" type=\"xs:string\" />\n\n  <xs:element name=\"DateTimeDataType\" type=\"xs:dateTime\" />\n\n  <xs:element name=\"GuidDataType\" type=\"ua:Guid\" />\n\n  <xs:element name=\"ByteStringDataType\" type=\"xs:base64Binary\" />\n\n  <xs:element name=\"XmlElementDataType\" type=\"ua:XmlElement\" />\n\n  <xs:element name=\"NodeIdDataType\" type=\"ua:NodeId\" />\n\n  <xs:element name=\"ExpandedNodeIdDataType\" type=\"ua:ExpandedNodeId\" />\n\n  <xs:element name=\"QualifiedNameDataType\" type=\"ua:QualifiedName\" />\n\n  <xs:element name=\"LocalizedTextDataType\" type=\"ua:LocalizedText\" />\n\n  <xs:element name=\"StatusCodeDataType\" type=\"ua:StatusCode\" />\n\n  <xs:element name=\"VariantDataType\" type=\"ua:Variant\" />\n\n  <xs:complexType name=\"UserScalarValueDataType\">\n    <xs:sequence>\n      <xs:element name=\"BooleanDataType\" type=\"xs:boolean\" minOccurs=\"0\" />\n      <xs:element name=\"SByteDataType\" type=\"xs:byte\" minOccurs=\"0\" />\n      <xs:element name=\"ByteDataType\" type=\"xs:unsignedByte\" minOccurs=\"0\" />\n      <xs:element name=\"Int16DataType\" type=\"xs:short\" minOccurs=\"0\" />\n      <xs:element name=\"UInt16DataType\" type=\"xs:unsignedShort\" minOccurs=\"0\" />\n      <xs:element name=\"Int32DataType\" type=\"xs:int\" minOccurs=\"0\" />\n      <xs:element name=\"UInt32DataType\" type=\"xs:unsignedInt\" minOccurs=\"0\" />\n      <xs:element name=\"Int64DataType\" type=\"xs:long\" minOccurs=\"0\" />\n      <xs:element name=\"UInt64DataType\" type=\"xs:unsignedLong\" minOccurs=\"0\" />\n      <xs:element name=\"FloatDataType\" type=\"xs:float\" minOccurs=\"0\" />\n      <xs:element name=\"DoubleDataType\" type=\"xs:double\" minOccurs=\"0\" />\n      <xs:element name=\"StringDataType\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"DateTimeDataType\" type=\"xs:dateTime\" minOccurs=\"0\" />\n      <xs:element name=\"GuidDataType\" type=\"ua:Guid\" minOccurs=\"0\" />\n      <xs:element name=\"ByteStringDataType\" type=\"xs:base64Binary\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"XmlElementDataType\" minOccurs=\"0\" nillable=\"true\">\n        <xs:complexType>\n          <xs:sequence>\n            <xs:any minOccurs=\"0\" processContents=\"lax\" />\n          </xs:sequence>\n        </xs:complexType>\n      </xs:element>\n      <xs:element name=\"NodeIdDataType\" type=\"ua:NodeId\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"ExpandedNodeIdDataType\" type=\"ua:ExpandedNodeId\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"QualifiedNameDataType\" type=\"ua:QualifiedName\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"LocalizedTextDataType\" type=\"ua:LocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StatusCodeDataType\" type=\"ua:StatusCode\" minOccurs=\"0\" />\n      <xs:element name=\"VariantDataType\" type=\"ua:Variant\" minOccurs=\"0\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"UserScalarValueDataType\" type=\"tns:UserScalarValueDataType\" />\n\n  <xs:complexType name=\"ListOfUserScalarValueDataType\">\n    <xs:sequence>\n      <xs:element name=\"UserScalarValueDataType\" type=\"tns:UserScalarValueDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfUserScalarValueDataType\" type=\"tns:ListOfUserScalarValueDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"UserArrayValueDataType\">\n    <xs:sequence>\n      <xs:element name=\"BooleanDataType\" type=\"ua:ListOfBoolean\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"SByteDataType\" type=\"ua:ListOfSByte\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"ByteDataType\" type=\"tns:ListOfByteDataType\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Int16DataType\" type=\"ua:ListOfInt16\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"UInt16DataType\" type=\"ua:ListOfUInt16\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Int32DataType\" type=\"ua:ListOfInt32\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"UInt32DataType\" type=\"ua:ListOfUInt32\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Int64DataType\" type=\"ua:ListOfInt64\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"UInt64DataType\" type=\"ua:ListOfUInt64\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"FloatDataType\" type=\"ua:ListOfFloat\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"DoubleDataType\" type=\"ua:ListOfDouble\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StringDataType\" type=\"ua:ListOfString\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"DateTimeDataType\" type=\"ua:ListOfDateTime\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"GuidDataType\" type=\"ua:ListOfGuid\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"ByteStringDataType\" type=\"ua:ListOfByteString\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"XmlElementDataType\" type=\"ua:ListOfXmlElement\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"NodeIdDataType\" type=\"ua:ListOfNodeId\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"ExpandedNodeIdDataType\" type=\"ua:ListOfExpandedNodeId\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"QualifiedNameDataType\" type=\"ua:ListOfQualifiedName\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"LocalizedTextDataType\" type=\"ua:ListOfLocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StatusCodeDataType\" type=\"ua:ListOfStatusCode\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"VariantDataType\" type=\"ua:ListOfVariant\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"UserArrayValueDataType\" type=\"tns:UserArrayValueDataType\" />\n\n  <xs:complexType name=\"ListOfUserArrayValueDataType\">\n    <xs:sequence>\n      <xs:element name=\"UserArrayValueDataType\" type=\"tns:UserArrayValueDataType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfUserArrayValueDataType\" type=\"tns:ListOfUserArrayValueDataType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"Vector\">\n    <xs:sequence>\n      <xs:element name=\"X\" type=\"xs:double\" minOccurs=\"0\" />\n      <xs:element name=\"Y\" type=\"xs:double\" minOccurs=\"0\" />\n      <xs:element name=\"Z\" type=\"xs:double\" minOccurs=\"0\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"Vector\" type=\"tns:Vector\" />\n\n  <xs:complexType name=\"ListOfVector\">\n    <xs:sequence>\n      <xs:element name=\"Vector\" type=\"tns:Vector\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfVector\" type=\"tns:ListOfVector\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"WorkOrderStatusType\">\n    <xs:sequence>\n      <xs:element name=\"Actor\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Timestamp\" type=\"xs:dateTime\" minOccurs=\"0\" />\n      <xs:element name=\"Comment\" type=\"ua:LocalizedText\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"WorkOrderStatusType\" type=\"tns:WorkOrderStatusType\" />\n\n  <xs:complexType name=\"ListOfWorkOrderStatusType\">\n    <xs:sequence>\n      <xs:element name=\"WorkOrderStatusType\" type=\"tns:WorkOrderStatusType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfWorkOrderStatusType\" type=\"tns:ListOfWorkOrderStatusType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"WorkOrderType\">\n    <xs:sequence>\n      <xs:element name=\"ID\" type=\"ua:Guid\" minOccurs=\"0\" />\n      <xs:element name=\"AssetID\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"StartTime\" type=\"xs:dateTime\" minOccurs=\"0\" />\n      <xs:element name=\"StatusComments\" type=\"tns:ListOfWorkOrderStatusType\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"WorkOrderType\" type=\"tns:WorkOrderType\" />\n\n  <xs:complexType name=\"ListOfWorkOrderType\">\n    <xs:sequence>\n      <xs:element name=\"WorkOrderType\" type=\"tns:WorkOrderType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfWorkOrderType\" type=\"tns:ListOfWorkOrderType\" nillable=\"true\"></xs:element>\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestDataDesign.csv",
    "content": "TestData_BinarySchema_WorkOrderStatusType,24,Variable\nTestData_BinarySchema_WorkOrderStatusType_DataTypeVersion,25,Variable\nTestData_BinarySchema_WorkOrderStatusType_DictionaryFragment,26,Variable\nTestData_BinarySchema_WorkOrderType,27,Variable\nTestData_BinarySchema_WorkOrderType_DataTypeVersion,28,Variable\nTestData_BinarySchema_WorkOrderType_DictionaryFragment,29,Variable\nVector_Encoding_DefaultXml,36,Object\nWorkOrderStatusType_Encoding_DefaultXml,39,Object\nWorkOrderType_Encoding_DefaultXml,40,Object\nTestData_XmlSchema_Vector,43,Variable\nTestData_XmlSchema_Vector_DataTypeVersion,44,Variable\nTestData_XmlSchema_Vector_DictionaryFragment,45,Variable\nTestData_XmlSchema_VectorWithOptionalFields,49,Unspecified\nTestData_XmlSchema_VectorWithOptionalFields_DataTypeVersion,50,Unspecified\nTestData_XmlSchema_VectorWithOptionalFields_DictionaryFragment,51,Unspecified\nTestData_XmlSchema_WorkOrderStatusType,52,Variable\nTestData_XmlSchema_WorkOrderStatusType_DataTypeVersion,53,Variable\nTestData_XmlSchema_WorkOrderStatusType_DictionaryFragment,54,Variable\nTestData_XmlSchema_WorkOrderType,55,Variable\nTestData_XmlSchema_WorkOrderType_DataTypeVersion,56,Variable\nTestData_XmlSchema_WorkOrderType_DictionaryFragment,57,Variable\nVector_Encoding_DefaultJson,64,Object\nVectorWithOptionalFields_Encoding_DefaultJson,66,Unspecified\nWorkOrderStatusType_Encoding_DefaultJson,67,Object\nWorkOrderType_Encoding_DefaultJson,68,Object\nVector,1000,DataType\nWorkOrderStatusType,1004,DataType\nWorkOrderType,1005,DataType\nVector_Encoding_DefaultBinary,1008,Object\nWorkOrderStatusType_Encoding_DefaultBinary,1011,Object\nWorkOrderType_Encoding_DefaultBinary,1012,Object\nTestData_BinarySchema_Vector,1015,Variable\nTestData_BinarySchema_Vector_DataTypeVersion,1016,Variable\nTestData_BinarySchema_Vector_DictionaryFragment,1017,Variable\nGenerateValuesMethodType,9369,Method\nGenerateValuesMethodType_InputArguments,9370,Variable\nGenerateValuesEventType,9371,ObjectType\nGenerateValuesEventType_EventId,9372,Variable\nGenerateValuesEventType_EventType,9373,Variable\nGenerateValuesEventType_SourceNode,9374,Variable\nGenerateValuesEventType_SourceName,9375,Variable\nGenerateValuesEventType_Time,9376,Variable\nGenerateValuesEventType_ReceiveTime,9377,Variable\nGenerateValuesEventType_LocalTime,9378,Variable\nGenerateValuesEventType_Message,9379,Variable\nGenerateValuesEventType_Severity,9380,Variable\nGenerateValuesEventType_Iterations,9381,Variable\nGenerateValuesEventType_NewValueCount,9382,Variable\nTestDataObjectType,9383,ObjectType\nTestDataObjectType_SimulationActive,9384,Variable\nTestDataObjectType_GenerateValues,9385,Method\nTestDataObjectType_GenerateValues_InputArguments,9386,Variable\nTestDataObjectType_CycleComplete,9387,Object\nTestDataObjectType_CycleComplete_EventId,9388,Variable\nTestDataObjectType_CycleComplete_EventType,9389,Variable\nTestDataObjectType_CycleComplete_SourceNode,9390,Variable\nTestDataObjectType_CycleComplete_SourceName,9391,Variable\nTestDataObjectType_CycleComplete_Time,9392,Variable\nTestDataObjectType_CycleComplete_ReceiveTime,9393,Variable\nTestDataObjectType_CycleComplete_LocalTime,9394,Variable\nTestDataObjectType_CycleComplete_Message,9395,Variable\nTestDataObjectType_CycleComplete_Severity,9396,Variable\nTestDataObjectType_CycleComplete_BranchId,9397,Variable\nTestDataObjectType_CycleComplete_Retain,9398,Variable\nTestDataObjectType_CycleComplete_EnabledState,9399,Variable\nTestDataObjectType_CycleComplete_EnabledState_Id,9400,Variable\nTestDataObjectType_CycleComplete_EnabledState_Name,9401,Variable\nTestDataObjectType_CycleComplete_EnabledState_Number,9402,Variable\nTestDataObjectType_CycleComplete_EnabledState_EffectiveDisplayName,9403,Variable\nTestDataObjectType_CycleComplete_EnabledState_TransitionTime,9404,Variable\nTestDataObjectType_CycleComplete_Quality,9405,Variable\nTestDataObjectType_CycleComplete_Quality_SourceTimestamp,9406,Variable\nTestDataObjectType_CycleComplete_LastSeverity,9409,Variable\nTestDataObjectType_CycleComplete_LastSeverity_SourceTimestamp,9410,Variable\nTestDataObjectType_CycleComplete_Comment,9411,Variable\nTestDataObjectType_CycleComplete_Comment_SourceTimestamp,9412,Variable\nTestDataObjectType_CycleComplete_ClientUserId,9413,Variable\nTestDataObjectType_CycleComplete_Enable,9414,Method\nTestDataObjectType_CycleComplete_Disable,9415,Method\nTestDataObjectType_CycleComplete_AddComment,9416,Method\nTestDataObjectType_CycleComplete_AddComment_InputArguments,9417,Variable\nTestDataObjectType_CycleComplete_AckedState,9420,Variable\nTestDataObjectType_CycleComplete_AckedState_Id,9421,Variable\nTestDataObjectType_CycleComplete_AckedState_Name,9422,Variable\nTestDataObjectType_CycleComplete_AckedState_Number,9423,Variable\nTestDataObjectType_CycleComplete_AckedState_EffectiveDisplayName,9424,Variable\nTestDataObjectType_CycleComplete_AckedState_TransitionTime,9425,Variable\nTestDataObjectType_CycleComplete_AckedState_TrueState,9426,Variable\nTestDataObjectType_CycleComplete_AckedState_FalseState,9427,Variable\nTestDataObjectType_CycleComplete_ConfirmedState,9428,Variable\nTestDataObjectType_CycleComplete_ConfirmedState_Id,9429,Variable\nTestDataObjectType_CycleComplete_ConfirmedState_Name,9430,Variable\nTestDataObjectType_CycleComplete_ConfirmedState_Number,9431,Variable\nTestDataObjectType_CycleComplete_ConfirmedState_EffectiveDisplayName,9432,Variable\nTestDataObjectType_CycleComplete_ConfirmedState_TransitionTime,9433,Variable\nTestDataObjectType_CycleComplete_ConfirmedState_TrueState,9434,Variable\nTestDataObjectType_CycleComplete_ConfirmedState_FalseState,9435,Variable\nTestDataObjectType_CycleComplete_Acknowledge,9436,Method\nTestDataObjectType_CycleComplete_Acknowledge_InputArguments,9437,Variable\nTestDataObjectType_CycleComplete_Confirm,9438,Method\nTestDataObjectType_CycleComplete_Confirm_InputArguments,9439,Variable\nScalarValueDataType,9440,DataType\nScalarValue1MethodType,9441,Method\nScalarValue1MethodType_InputArguments,9442,Variable\nScalarValue1MethodType_OutputArguments,9443,Variable\nScalarValue2MethodType,9444,Method\nScalarValue2MethodType_InputArguments,9445,Variable\nScalarValue2MethodType_OutputArguments,9446,Variable\nScalarValue3MethodType,9447,Method\nScalarValue3MethodType_InputArguments,9448,Variable\nScalarValue3MethodType_OutputArguments,9449,Variable\nScalarValueObjectType,9450,ObjectType\nScalarValueObjectType_SimulationActive,9451,Variable\nScalarValueObjectType_GenerateValues,9452,Method\nScalarValueObjectType_GenerateValues_InputArguments,9453,Variable\nScalarValueObjectType_CycleComplete,9454,Object\nScalarValueObjectType_CycleComplete_EventId,9455,Variable\nScalarValueObjectType_CycleComplete_EventType,9456,Variable\nScalarValueObjectType_CycleComplete_SourceNode,9457,Variable\nScalarValueObjectType_CycleComplete_SourceName,9458,Variable\nScalarValueObjectType_CycleComplete_Time,9459,Variable\nScalarValueObjectType_CycleComplete_ReceiveTime,9460,Variable\nScalarValueObjectType_CycleComplete_LocalTime,9461,Variable\nScalarValueObjectType_CycleComplete_Message,9462,Variable\nScalarValueObjectType_CycleComplete_Severity,9463,Variable\nScalarValueObjectType_CycleComplete_BranchId,9464,Variable\nScalarValueObjectType_CycleComplete_Retain,9465,Variable\nScalarValueObjectType_CycleComplete_EnabledState,9466,Variable\nScalarValueObjectType_CycleComplete_EnabledState_Id,9467,Variable\nScalarValueObjectType_CycleComplete_EnabledState_Name,9468,Variable\nScalarValueObjectType_CycleComplete_EnabledState_Number,9469,Variable\nScalarValueObjectType_CycleComplete_EnabledState_EffectiveDisplayName,9470,Variable\nScalarValueObjectType_CycleComplete_EnabledState_TransitionTime,9471,Variable\nScalarValueObjectType_CycleComplete_Quality,9472,Variable\nScalarValueObjectType_CycleComplete_Quality_SourceTimestamp,9473,Variable\nScalarValueObjectType_CycleComplete_LastSeverity,9476,Variable\nScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp,9477,Variable\nScalarValueObjectType_CycleComplete_Comment,9478,Variable\nScalarValueObjectType_CycleComplete_Comment_SourceTimestamp,9479,Variable\nScalarValueObjectType_CycleComplete_ClientUserId,9480,Variable\nScalarValueObjectType_CycleComplete_Enable,9481,Method\nScalarValueObjectType_CycleComplete_Disable,9482,Method\nScalarValueObjectType_CycleComplete_AddComment,9483,Method\nScalarValueObjectType_CycleComplete_AddComment_InputArguments,9484,Variable\nScalarValueObjectType_CycleComplete_AckedState,9487,Variable\nScalarValueObjectType_CycleComplete_AckedState_Id,9488,Variable\nScalarValueObjectType_CycleComplete_AckedState_Name,9489,Variable\nScalarValueObjectType_CycleComplete_AckedState_Number,9490,Variable\nScalarValueObjectType_CycleComplete_AckedState_EffectiveDisplayName,9491,Variable\nScalarValueObjectType_CycleComplete_AckedState_TransitionTime,9492,Variable\nScalarValueObjectType_CycleComplete_AckedState_TrueState,9493,Variable\nScalarValueObjectType_CycleComplete_AckedState_FalseState,9494,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState,9495,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState_Id,9496,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState_Name,9497,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState_Number,9498,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState_EffectiveDisplayName,9499,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState_TransitionTime,9500,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState_TrueState,9501,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState_FalseState,9502,Variable\nScalarValueObjectType_CycleComplete_Acknowledge,9503,Method\nScalarValueObjectType_CycleComplete_Acknowledge_InputArguments,9504,Variable\nScalarValueObjectType_CycleComplete_Confirm,9505,Method\nScalarValueObjectType_CycleComplete_Confirm_InputArguments,9506,Variable\nScalarValueObjectType_BooleanValue,9507,Variable\nScalarValueObjectType_SByteValue,9508,Variable\nScalarValueObjectType_ByteValue,9509,Variable\nScalarValueObjectType_Int16Value,9510,Variable\nScalarValueObjectType_UInt16Value,9511,Variable\nScalarValueObjectType_Int32Value,9512,Variable\nScalarValueObjectType_UInt32Value,9513,Variable\nScalarValueObjectType_Int64Value,9514,Variable\nScalarValueObjectType_UInt64Value,9515,Variable\nScalarValueObjectType_FloatValue,9516,Variable\nScalarValueObjectType_DoubleValue,9517,Variable\nScalarValueObjectType_StringValue,9518,Variable\nScalarValueObjectType_DateTimeValue,9519,Variable\nScalarValueObjectType_GuidValue,9520,Variable\nScalarValueObjectType_ByteStringValue,9521,Variable\nScalarValueObjectType_XmlElementValue,9522,Variable\nScalarValueObjectType_NodeIdValue,9523,Variable\nScalarValueObjectType_ExpandedNodeIdValue,9524,Variable\nScalarValueObjectType_QualifiedNameValue,9525,Variable\nScalarValueObjectType_LocalizedTextValue,9526,Variable\nScalarValueObjectType_StatusCodeValue,9527,Variable\nScalarValueObjectType_VariantValue,9528,Variable\nScalarValueObjectType_EnumerationValue,9529,Variable\nScalarValueObjectType_StructureValue,9530,Variable\nScalarValueObjectType_NumberValue,9531,Variable\nScalarValueObjectType_IntegerValue,9532,Variable\nScalarValueObjectType_UIntegerValue,9533,Variable\nAnalogScalarValueObjectType,9534,ObjectType\nAnalogScalarValueObjectType_SimulationActive,9535,Variable\nAnalogScalarValueObjectType_GenerateValues,9536,Method\nAnalogScalarValueObjectType_GenerateValues_InputArguments,9537,Variable\nAnalogScalarValueObjectType_CycleComplete,9538,Object\nAnalogScalarValueObjectType_CycleComplete_EventId,9539,Variable\nAnalogScalarValueObjectType_CycleComplete_EventType,9540,Variable\nAnalogScalarValueObjectType_CycleComplete_SourceNode,9541,Variable\nAnalogScalarValueObjectType_CycleComplete_SourceName,9542,Variable\nAnalogScalarValueObjectType_CycleComplete_Time,9543,Variable\nAnalogScalarValueObjectType_CycleComplete_ReceiveTime,9544,Variable\nAnalogScalarValueObjectType_CycleComplete_LocalTime,9545,Variable\nAnalogScalarValueObjectType_CycleComplete_Message,9546,Variable\nAnalogScalarValueObjectType_CycleComplete_Severity,9547,Variable\nAnalogScalarValueObjectType_CycleComplete_BranchId,9548,Variable\nAnalogScalarValueObjectType_CycleComplete_Retain,9549,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState,9550,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState_Id,9551,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState_Name,9552,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState_Number,9553,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState_EffectiveDisplayName,9554,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState_TransitionTime,9555,Variable\nAnalogScalarValueObjectType_CycleComplete_Quality,9556,Variable\nAnalogScalarValueObjectType_CycleComplete_Quality_SourceTimestamp,9557,Variable\nAnalogScalarValueObjectType_CycleComplete_LastSeverity,9560,Variable\nAnalogScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp,9561,Variable\nAnalogScalarValueObjectType_CycleComplete_Comment,9562,Variable\nAnalogScalarValueObjectType_CycleComplete_Comment_SourceTimestamp,9563,Variable\nAnalogScalarValueObjectType_CycleComplete_ClientUserId,9564,Variable\nAnalogScalarValueObjectType_CycleComplete_Enable,9565,Method\nAnalogScalarValueObjectType_CycleComplete_Disable,9566,Method\nAnalogScalarValueObjectType_CycleComplete_AddComment,9567,Method\nAnalogScalarValueObjectType_CycleComplete_AddComment_InputArguments,9568,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState,9571,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState_Id,9572,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState_Name,9573,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState_Number,9574,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState_EffectiveDisplayName,9575,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState_TransitionTime,9576,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState_TrueState,9577,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState_FalseState,9578,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState,9579,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState_Id,9580,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState_Name,9581,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState_Number,9582,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState_EffectiveDisplayName,9583,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState_TransitionTime,9584,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState_TrueState,9585,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState_FalseState,9586,Variable\nAnalogScalarValueObjectType_CycleComplete_Acknowledge,9587,Method\nAnalogScalarValueObjectType_CycleComplete_Acknowledge_InputArguments,9588,Variable\nAnalogScalarValueObjectType_CycleComplete_Confirm,9589,Method\nAnalogScalarValueObjectType_CycleComplete_Confirm_InputArguments,9590,Variable\nAnalogScalarValueObjectType_SByteValue,9591,Variable\nAnalogScalarValueObjectType_SByteValue_Definition,9592,Variable\nAnalogScalarValueObjectType_SByteValue_ValuePrecision,9593,Variable\nAnalogScalarValueObjectType_SByteValue_EURange,9594,Variable\nAnalogScalarValueObjectType_SByteValue_InstrumentRange,9595,Variable\nAnalogScalarValueObjectType_SByteValue_EngineeringUnits,9596,Variable\nAnalogScalarValueObjectType_ByteValue,9597,Variable\nAnalogScalarValueObjectType_ByteValue_Definition,9598,Variable\nAnalogScalarValueObjectType_ByteValue_ValuePrecision,9599,Variable\nAnalogScalarValueObjectType_ByteValue_EURange,9600,Variable\nAnalogScalarValueObjectType_ByteValue_InstrumentRange,9601,Variable\nAnalogScalarValueObjectType_ByteValue_EngineeringUnits,9602,Variable\nAnalogScalarValueObjectType_Int16Value,9603,Variable\nAnalogScalarValueObjectType_Int16Value_Definition,9604,Variable\nAnalogScalarValueObjectType_Int16Value_ValuePrecision,9605,Variable\nAnalogScalarValueObjectType_Int16Value_EURange,9606,Variable\nAnalogScalarValueObjectType_Int16Value_InstrumentRange,9607,Variable\nAnalogScalarValueObjectType_Int16Value_EngineeringUnits,9608,Variable\nAnalogScalarValueObjectType_UInt16Value,9609,Variable\nAnalogScalarValueObjectType_UInt16Value_Definition,9610,Variable\nAnalogScalarValueObjectType_UInt16Value_ValuePrecision,9611,Variable\nAnalogScalarValueObjectType_UInt16Value_EURange,9612,Variable\nAnalogScalarValueObjectType_UInt16Value_InstrumentRange,9613,Variable\nAnalogScalarValueObjectType_UInt16Value_EngineeringUnits,9614,Variable\nAnalogScalarValueObjectType_Int32Value,9615,Variable\nAnalogScalarValueObjectType_Int32Value_Definition,9616,Variable\nAnalogScalarValueObjectType_Int32Value_ValuePrecision,9617,Variable\nAnalogScalarValueObjectType_Int32Value_EURange,9618,Variable\nAnalogScalarValueObjectType_Int32Value_InstrumentRange,9619,Variable\nAnalogScalarValueObjectType_Int32Value_EngineeringUnits,9620,Variable\nAnalogScalarValueObjectType_UInt32Value,9621,Variable\nAnalogScalarValueObjectType_UInt32Value_Definition,9622,Variable\nAnalogScalarValueObjectType_UInt32Value_ValuePrecision,9623,Variable\nAnalogScalarValueObjectType_UInt32Value_EURange,9624,Variable\nAnalogScalarValueObjectType_UInt32Value_InstrumentRange,9625,Variable\nAnalogScalarValueObjectType_UInt32Value_EngineeringUnits,9626,Variable\nAnalogScalarValueObjectType_Int64Value,9627,Variable\nAnalogScalarValueObjectType_Int64Value_Definition,9628,Variable\nAnalogScalarValueObjectType_Int64Value_ValuePrecision,9629,Variable\nAnalogScalarValueObjectType_Int64Value_EURange,9630,Variable\nAnalogScalarValueObjectType_Int64Value_InstrumentRange,9631,Variable\nAnalogScalarValueObjectType_Int64Value_EngineeringUnits,9632,Variable\nAnalogScalarValueObjectType_UInt64Value,9633,Variable\nAnalogScalarValueObjectType_UInt64Value_Definition,9634,Variable\nAnalogScalarValueObjectType_UInt64Value_ValuePrecision,9635,Variable\nAnalogScalarValueObjectType_UInt64Value_EURange,9636,Variable\nAnalogScalarValueObjectType_UInt64Value_InstrumentRange,9637,Variable\nAnalogScalarValueObjectType_UInt64Value_EngineeringUnits,9638,Variable\nAnalogScalarValueObjectType_FloatValue,9639,Variable\nAnalogScalarValueObjectType_FloatValue_Definition,9640,Variable\nAnalogScalarValueObjectType_FloatValue_ValuePrecision,9641,Variable\nAnalogScalarValueObjectType_FloatValue_EURange,9642,Variable\nAnalogScalarValueObjectType_FloatValue_InstrumentRange,9643,Variable\nAnalogScalarValueObjectType_FloatValue_EngineeringUnits,9644,Variable\nAnalogScalarValueObjectType_DoubleValue,9645,Variable\nAnalogScalarValueObjectType_DoubleValue_Definition,9646,Variable\nAnalogScalarValueObjectType_DoubleValue_ValuePrecision,9647,Variable\nAnalogScalarValueObjectType_DoubleValue_EURange,9648,Variable\nAnalogScalarValueObjectType_DoubleValue_InstrumentRange,9649,Variable\nAnalogScalarValueObjectType_DoubleValue_EngineeringUnits,9650,Variable\nAnalogScalarValueObjectType_NumberValue,9651,Variable\nAnalogScalarValueObjectType_NumberValue_Definition,9652,Variable\nAnalogScalarValueObjectType_NumberValue_ValuePrecision,9653,Variable\nAnalogScalarValueObjectType_NumberValue_EURange,9654,Variable\nAnalogScalarValueObjectType_NumberValue_InstrumentRange,9655,Variable\nAnalogScalarValueObjectType_NumberValue_EngineeringUnits,9656,Variable\nAnalogScalarValueObjectType_IntegerValue,9657,Variable\nAnalogScalarValueObjectType_IntegerValue_Definition,9658,Variable\nAnalogScalarValueObjectType_IntegerValue_ValuePrecision,9659,Variable\nAnalogScalarValueObjectType_IntegerValue_EURange,9660,Variable\nAnalogScalarValueObjectType_IntegerValue_InstrumentRange,9661,Variable\nAnalogScalarValueObjectType_IntegerValue_EngineeringUnits,9662,Variable\nAnalogScalarValueObjectType_UIntegerValue,9663,Variable\nAnalogScalarValueObjectType_UIntegerValue_Definition,9664,Variable\nAnalogScalarValueObjectType_UIntegerValue_ValuePrecision,9665,Variable\nAnalogScalarValueObjectType_UIntegerValue_EURange,9666,Variable\nAnalogScalarValueObjectType_UIntegerValue_InstrumentRange,9667,Variable\nAnalogScalarValueObjectType_UIntegerValue_EngineeringUnits,9668,Variable\nArrayValueDataType,9669,DataType\nArrayValue1MethodType,9670,Method\nArrayValue1MethodType_InputArguments,9671,Variable\nArrayValue1MethodType_OutputArguments,9672,Variable\nArrayValue2MethodType,9673,Method\nArrayValue2MethodType_InputArguments,9674,Variable\nArrayValue2MethodType_OutputArguments,9675,Variable\nArrayValue3MethodType,9676,Method\nArrayValue3MethodType_InputArguments,9677,Variable\nArrayValue3MethodType_OutputArguments,9678,Variable\nArrayValueObjectType,9679,ObjectType\nArrayValueObjectType_SimulationActive,9680,Variable\nArrayValueObjectType_GenerateValues,9681,Method\nArrayValueObjectType_GenerateValues_InputArguments,9682,Variable\nArrayValueObjectType_CycleComplete,9683,Object\nArrayValueObjectType_CycleComplete_EventId,9684,Variable\nArrayValueObjectType_CycleComplete_EventType,9685,Variable\nArrayValueObjectType_CycleComplete_SourceNode,9686,Variable\nArrayValueObjectType_CycleComplete_SourceName,9687,Variable\nArrayValueObjectType_CycleComplete_Time,9688,Variable\nArrayValueObjectType_CycleComplete_ReceiveTime,9689,Variable\nArrayValueObjectType_CycleComplete_LocalTime,9690,Variable\nArrayValueObjectType_CycleComplete_Message,9691,Variable\nArrayValueObjectType_CycleComplete_Severity,9692,Variable\nArrayValueObjectType_CycleComplete_BranchId,9693,Variable\nArrayValueObjectType_CycleComplete_Retain,9694,Variable\nArrayValueObjectType_CycleComplete_EnabledState,9695,Variable\nArrayValueObjectType_CycleComplete_EnabledState_Id,9696,Variable\nArrayValueObjectType_CycleComplete_EnabledState_Name,9697,Variable\nArrayValueObjectType_CycleComplete_EnabledState_Number,9698,Variable\nArrayValueObjectType_CycleComplete_EnabledState_EffectiveDisplayName,9699,Variable\nArrayValueObjectType_CycleComplete_EnabledState_TransitionTime,9700,Variable\nArrayValueObjectType_CycleComplete_Quality,9701,Variable\nArrayValueObjectType_CycleComplete_Quality_SourceTimestamp,9702,Variable\nArrayValueObjectType_CycleComplete_LastSeverity,9705,Variable\nArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp,9706,Variable\nArrayValueObjectType_CycleComplete_Comment,9707,Variable\nArrayValueObjectType_CycleComplete_Comment_SourceTimestamp,9708,Variable\nArrayValueObjectType_CycleComplete_ClientUserId,9709,Variable\nArrayValueObjectType_CycleComplete_Enable,9710,Method\nArrayValueObjectType_CycleComplete_Disable,9711,Method\nArrayValueObjectType_CycleComplete_AddComment,9712,Method\nArrayValueObjectType_CycleComplete_AddComment_InputArguments,9713,Variable\nArrayValueObjectType_CycleComplete_AckedState,9716,Variable\nArrayValueObjectType_CycleComplete_AckedState_Id,9717,Variable\nArrayValueObjectType_CycleComplete_AckedState_Name,9718,Variable\nArrayValueObjectType_CycleComplete_AckedState_Number,9719,Variable\nArrayValueObjectType_CycleComplete_AckedState_EffectiveDisplayName,9720,Variable\nArrayValueObjectType_CycleComplete_AckedState_TransitionTime,9721,Variable\nArrayValueObjectType_CycleComplete_AckedState_TrueState,9722,Variable\nArrayValueObjectType_CycleComplete_AckedState_FalseState,9723,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState,9724,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState_Id,9725,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState_Name,9726,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState_Number,9727,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState_EffectiveDisplayName,9728,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState_TransitionTime,9729,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState_TrueState,9730,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState_FalseState,9731,Variable\nArrayValueObjectType_CycleComplete_Acknowledge,9732,Method\nArrayValueObjectType_CycleComplete_Acknowledge_InputArguments,9733,Variable\nArrayValueObjectType_CycleComplete_Confirm,9734,Method\nArrayValueObjectType_CycleComplete_Confirm_InputArguments,9735,Variable\nArrayValueObjectType_BooleanValue,9736,Variable\nArrayValueObjectType_SByteValue,9737,Variable\nArrayValueObjectType_ByteValue,9738,Variable\nArrayValueObjectType_Int16Value,9739,Variable\nArrayValueObjectType_UInt16Value,9740,Variable\nArrayValueObjectType_Int32Value,9741,Variable\nArrayValueObjectType_UInt32Value,9742,Variable\nArrayValueObjectType_Int64Value,9743,Variable\nArrayValueObjectType_UInt64Value,9744,Variable\nArrayValueObjectType_FloatValue,9745,Variable\nArrayValueObjectType_DoubleValue,9746,Variable\nArrayValueObjectType_StringValue,9747,Variable\nArrayValueObjectType_DateTimeValue,9748,Variable\nArrayValueObjectType_GuidValue,9749,Variable\nArrayValueObjectType_ByteStringValue,9750,Variable\nArrayValueObjectType_XmlElementValue,9751,Variable\nArrayValueObjectType_NodeIdValue,9752,Variable\nArrayValueObjectType_ExpandedNodeIdValue,9753,Variable\nArrayValueObjectType_QualifiedNameValue,9754,Variable\nArrayValueObjectType_LocalizedTextValue,9755,Variable\nArrayValueObjectType_StatusCodeValue,9756,Variable\nArrayValueObjectType_VariantValue,9757,Variable\nArrayValueObjectType_EnumerationValue,9758,Variable\nArrayValueObjectType_StructureValue,9759,Variable\nArrayValueObjectType_NumberValue,9760,Variable\nArrayValueObjectType_IntegerValue,9761,Variable\nArrayValueObjectType_UIntegerValue,9762,Variable\nAnalogArrayValueObjectType,9763,ObjectType\nAnalogArrayValueObjectType_SimulationActive,9764,Variable\nAnalogArrayValueObjectType_GenerateValues,9765,Method\nAnalogArrayValueObjectType_GenerateValues_InputArguments,9766,Variable\nAnalogArrayValueObjectType_CycleComplete,9767,Object\nAnalogArrayValueObjectType_CycleComplete_EventId,9768,Variable\nAnalogArrayValueObjectType_CycleComplete_EventType,9769,Variable\nAnalogArrayValueObjectType_CycleComplete_SourceNode,9770,Variable\nAnalogArrayValueObjectType_CycleComplete_SourceName,9771,Variable\nAnalogArrayValueObjectType_CycleComplete_Time,9772,Variable\nAnalogArrayValueObjectType_CycleComplete_ReceiveTime,9773,Variable\nAnalogArrayValueObjectType_CycleComplete_LocalTime,9774,Variable\nAnalogArrayValueObjectType_CycleComplete_Message,9775,Variable\nAnalogArrayValueObjectType_CycleComplete_Severity,9776,Variable\nAnalogArrayValueObjectType_CycleComplete_BranchId,9777,Variable\nAnalogArrayValueObjectType_CycleComplete_Retain,9778,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState,9779,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState_Id,9780,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState_Name,9781,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState_Number,9782,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState_EffectiveDisplayName,9783,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState_TransitionTime,9784,Variable\nAnalogArrayValueObjectType_CycleComplete_Quality,9785,Variable\nAnalogArrayValueObjectType_CycleComplete_Quality_SourceTimestamp,9786,Variable\nAnalogArrayValueObjectType_CycleComplete_LastSeverity,9789,Variable\nAnalogArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp,9790,Variable\nAnalogArrayValueObjectType_CycleComplete_Comment,9791,Variable\nAnalogArrayValueObjectType_CycleComplete_Comment_SourceTimestamp,9792,Variable\nAnalogArrayValueObjectType_CycleComplete_ClientUserId,9793,Variable\nAnalogArrayValueObjectType_CycleComplete_Enable,9794,Method\nAnalogArrayValueObjectType_CycleComplete_Disable,9795,Method\nAnalogArrayValueObjectType_CycleComplete_AddComment,9796,Method\nAnalogArrayValueObjectType_CycleComplete_AddComment_InputArguments,9797,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState,9800,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState_Id,9801,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState_Name,9802,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState_Number,9803,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState_EffectiveDisplayName,9804,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState_TransitionTime,9805,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState_TrueState,9806,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState_FalseState,9807,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState,9808,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState_Id,9809,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState_Name,9810,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState_Number,9811,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState_EffectiveDisplayName,9812,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState_TransitionTime,9813,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState_TrueState,9814,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState_FalseState,9815,Variable\nAnalogArrayValueObjectType_CycleComplete_Acknowledge,9816,Method\nAnalogArrayValueObjectType_CycleComplete_Acknowledge_InputArguments,9817,Variable\nAnalogArrayValueObjectType_CycleComplete_Confirm,9818,Method\nAnalogArrayValueObjectType_CycleComplete_Confirm_InputArguments,9819,Variable\nAnalogArrayValueObjectType_SByteValue,9820,Variable\nAnalogArrayValueObjectType_SByteValue_Definition,9821,Variable\nAnalogArrayValueObjectType_SByteValue_ValuePrecision,9822,Variable\nAnalogArrayValueObjectType_SByteValue_EURange,9823,Variable\nAnalogArrayValueObjectType_SByteValue_InstrumentRange,9824,Variable\nAnalogArrayValueObjectType_SByteValue_EngineeringUnits,9825,Variable\nAnalogArrayValueObjectType_ByteValue,9826,Variable\nAnalogArrayValueObjectType_ByteValue_Definition,9827,Variable\nAnalogArrayValueObjectType_ByteValue_ValuePrecision,9828,Variable\nAnalogArrayValueObjectType_ByteValue_EURange,9829,Variable\nAnalogArrayValueObjectType_ByteValue_InstrumentRange,9830,Variable\nAnalogArrayValueObjectType_ByteValue_EngineeringUnits,9831,Variable\nAnalogArrayValueObjectType_Int16Value,9832,Variable\nAnalogArrayValueObjectType_Int16Value_Definition,9833,Variable\nAnalogArrayValueObjectType_Int16Value_ValuePrecision,9834,Variable\nAnalogArrayValueObjectType_Int16Value_EURange,9835,Variable\nAnalogArrayValueObjectType_Int16Value_InstrumentRange,9836,Variable\nAnalogArrayValueObjectType_Int16Value_EngineeringUnits,9837,Variable\nAnalogArrayValueObjectType_UInt16Value,9838,Variable\nAnalogArrayValueObjectType_UInt16Value_Definition,9839,Variable\nAnalogArrayValueObjectType_UInt16Value_ValuePrecision,9840,Variable\nAnalogArrayValueObjectType_UInt16Value_EURange,9841,Variable\nAnalogArrayValueObjectType_UInt16Value_InstrumentRange,9842,Variable\nAnalogArrayValueObjectType_UInt16Value_EngineeringUnits,9843,Variable\nAnalogArrayValueObjectType_Int32Value,9844,Variable\nAnalogArrayValueObjectType_Int32Value_Definition,9845,Variable\nAnalogArrayValueObjectType_Int32Value_ValuePrecision,9846,Variable\nAnalogArrayValueObjectType_Int32Value_EURange,9847,Variable\nAnalogArrayValueObjectType_Int32Value_InstrumentRange,9848,Variable\nAnalogArrayValueObjectType_Int32Value_EngineeringUnits,9849,Variable\nAnalogArrayValueObjectType_UInt32Value,9850,Variable\nAnalogArrayValueObjectType_UInt32Value_Definition,9851,Variable\nAnalogArrayValueObjectType_UInt32Value_ValuePrecision,9852,Variable\nAnalogArrayValueObjectType_UInt32Value_EURange,9853,Variable\nAnalogArrayValueObjectType_UInt32Value_InstrumentRange,9854,Variable\nAnalogArrayValueObjectType_UInt32Value_EngineeringUnits,9855,Variable\nAnalogArrayValueObjectType_Int64Value,9856,Variable\nAnalogArrayValueObjectType_Int64Value_Definition,9857,Variable\nAnalogArrayValueObjectType_Int64Value_ValuePrecision,9858,Variable\nAnalogArrayValueObjectType_Int64Value_EURange,9859,Variable\nAnalogArrayValueObjectType_Int64Value_InstrumentRange,9860,Variable\nAnalogArrayValueObjectType_Int64Value_EngineeringUnits,9861,Variable\nAnalogArrayValueObjectType_UInt64Value,9862,Variable\nAnalogArrayValueObjectType_UInt64Value_Definition,9863,Variable\nAnalogArrayValueObjectType_UInt64Value_ValuePrecision,9864,Variable\nAnalogArrayValueObjectType_UInt64Value_EURange,9865,Variable\nAnalogArrayValueObjectType_UInt64Value_InstrumentRange,9866,Variable\nAnalogArrayValueObjectType_UInt64Value_EngineeringUnits,9867,Variable\nAnalogArrayValueObjectType_FloatValue,9868,Variable\nAnalogArrayValueObjectType_FloatValue_Definition,9869,Variable\nAnalogArrayValueObjectType_FloatValue_ValuePrecision,9870,Variable\nAnalogArrayValueObjectType_FloatValue_EURange,9871,Variable\nAnalogArrayValueObjectType_FloatValue_InstrumentRange,9872,Variable\nAnalogArrayValueObjectType_FloatValue_EngineeringUnits,9873,Variable\nAnalogArrayValueObjectType_DoubleValue,9874,Variable\nAnalogArrayValueObjectType_DoubleValue_Definition,9875,Variable\nAnalogArrayValueObjectType_DoubleValue_ValuePrecision,9876,Variable\nAnalogArrayValueObjectType_DoubleValue_EURange,9877,Variable\nAnalogArrayValueObjectType_DoubleValue_InstrumentRange,9878,Variable\nAnalogArrayValueObjectType_DoubleValue_EngineeringUnits,9879,Variable\nAnalogArrayValueObjectType_NumberValue,9880,Variable\nAnalogArrayValueObjectType_NumberValue_Definition,9881,Variable\nAnalogArrayValueObjectType_NumberValue_ValuePrecision,9882,Variable\nAnalogArrayValueObjectType_NumberValue_EURange,9883,Variable\nAnalogArrayValueObjectType_NumberValue_InstrumentRange,9884,Variable\nAnalogArrayValueObjectType_NumberValue_EngineeringUnits,9885,Variable\nAnalogArrayValueObjectType_IntegerValue,9886,Variable\nAnalogArrayValueObjectType_IntegerValue_Definition,9887,Variable\nAnalogArrayValueObjectType_IntegerValue_ValuePrecision,9888,Variable\nAnalogArrayValueObjectType_IntegerValue_EURange,9889,Variable\nAnalogArrayValueObjectType_IntegerValue_InstrumentRange,9890,Variable\nAnalogArrayValueObjectType_IntegerValue_EngineeringUnits,9891,Variable\nAnalogArrayValueObjectType_UIntegerValue,9892,Variable\nAnalogArrayValueObjectType_UIntegerValue_Definition,9893,Variable\nAnalogArrayValueObjectType_UIntegerValue_ValuePrecision,9894,Variable\nAnalogArrayValueObjectType_UIntegerValue_EURange,9895,Variable\nAnalogArrayValueObjectType_UIntegerValue_InstrumentRange,9896,Variable\nAnalogArrayValueObjectType_UIntegerValue_EngineeringUnits,9897,Variable\nBooleanDataType,9898,DataType\nSByteDataType,9899,DataType\nByteDataType,9900,DataType\nInt16DataType,9901,DataType\nUInt16DataType,9902,DataType\nInt32DataType,9903,DataType\nUInt32DataType,9904,DataType\nInt64DataType,9905,DataType\nUInt64DataType,9906,DataType\nFloatDataType,9907,DataType\nDoubleDataType,9908,DataType\nStringDataType,9909,DataType\nDateTimeDataType,9910,DataType\nGuidDataType,9911,DataType\nByteStringDataType,9912,DataType\nXmlElementDataType,9913,DataType\nNodeIdDataType,9914,DataType\nExpandedNodeIdDataType,9915,DataType\nQualifiedNameDataType,9916,DataType\nLocalizedTextDataType,9917,DataType\nStatusCodeDataType,9918,DataType\nVariantDataType,9919,DataType\nUserScalarValueDataType,9920,DataType\nUserScalarValueObjectType,9921,ObjectType\nUserScalarValueObjectType_SimulationActive,9922,Variable\nUserScalarValueObjectType_GenerateValues,9923,Method\nUserScalarValueObjectType_GenerateValues_InputArguments,9924,Variable\nUserScalarValueObjectType_CycleComplete,9925,Object\nUserScalarValueObjectType_CycleComplete_EventId,9926,Variable\nUserScalarValueObjectType_CycleComplete_EventType,9927,Variable\nUserScalarValueObjectType_CycleComplete_SourceNode,9928,Variable\nUserScalarValueObjectType_CycleComplete_SourceName,9929,Variable\nUserScalarValueObjectType_CycleComplete_Time,9930,Variable\nUserScalarValueObjectType_CycleComplete_ReceiveTime,9931,Variable\nUserScalarValueObjectType_CycleComplete_LocalTime,9932,Variable\nUserScalarValueObjectType_CycleComplete_Message,9933,Variable\nUserScalarValueObjectType_CycleComplete_Severity,9934,Variable\nUserScalarValueObjectType_CycleComplete_BranchId,9935,Variable\nUserScalarValueObjectType_CycleComplete_Retain,9936,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState,9937,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState_Id,9938,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState_Name,9939,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState_Number,9940,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState_EffectiveDisplayName,9941,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState_TransitionTime,9942,Variable\nUserScalarValueObjectType_CycleComplete_Quality,9943,Variable\nUserScalarValueObjectType_CycleComplete_Quality_SourceTimestamp,9944,Variable\nUserScalarValueObjectType_CycleComplete_LastSeverity,9947,Variable\nUserScalarValueObjectType_CycleComplete_LastSeverity_SourceTimestamp,9948,Variable\nUserScalarValueObjectType_CycleComplete_Comment,9949,Variable\nUserScalarValueObjectType_CycleComplete_Comment_SourceTimestamp,9950,Variable\nUserScalarValueObjectType_CycleComplete_ClientUserId,9951,Variable\nUserScalarValueObjectType_CycleComplete_Enable,9952,Method\nUserScalarValueObjectType_CycleComplete_Disable,9953,Method\nUserScalarValueObjectType_CycleComplete_AddComment,9954,Method\nUserScalarValueObjectType_CycleComplete_AddComment_InputArguments,9955,Variable\nUserScalarValueObjectType_CycleComplete_AckedState,9958,Variable\nUserScalarValueObjectType_CycleComplete_AckedState_Id,9959,Variable\nUserScalarValueObjectType_CycleComplete_AckedState_Name,9960,Variable\nUserScalarValueObjectType_CycleComplete_AckedState_Number,9961,Variable\nUserScalarValueObjectType_CycleComplete_AckedState_EffectiveDisplayName,9962,Variable\nUserScalarValueObjectType_CycleComplete_AckedState_TransitionTime,9963,Variable\nUserScalarValueObjectType_CycleComplete_AckedState_TrueState,9964,Variable\nUserScalarValueObjectType_CycleComplete_AckedState_FalseState,9965,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState,9966,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState_Id,9967,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState_Name,9968,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState_Number,9969,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState_EffectiveDisplayName,9970,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState_TransitionTime,9971,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState_TrueState,9972,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState_FalseState,9973,Variable\nUserScalarValueObjectType_CycleComplete_Acknowledge,9974,Method\nUserScalarValueObjectType_CycleComplete_Acknowledge_InputArguments,9975,Variable\nUserScalarValueObjectType_CycleComplete_Confirm,9976,Method\nUserScalarValueObjectType_CycleComplete_Confirm_InputArguments,9977,Variable\nUserScalarValueObjectType_BooleanValue,9978,Variable\nUserScalarValueObjectType_SByteValue,9979,Variable\nUserScalarValueObjectType_ByteValue,9980,Variable\nUserScalarValueObjectType_Int16Value,9981,Variable\nUserScalarValueObjectType_UInt16Value,9982,Variable\nUserScalarValueObjectType_Int32Value,9983,Variable\nUserScalarValueObjectType_UInt32Value,9984,Variable\nUserScalarValueObjectType_Int64Value,9985,Variable\nUserScalarValueObjectType_UInt64Value,9986,Variable\nUserScalarValueObjectType_FloatValue,9987,Variable\nUserScalarValueObjectType_DoubleValue,9988,Variable\nUserScalarValueObjectType_StringValue,9989,Variable\nUserScalarValueObjectType_DateTimeValue,9990,Variable\nUserScalarValueObjectType_GuidValue,9991,Variable\nUserScalarValueObjectType_ByteStringValue,9992,Variable\nUserScalarValueObjectType_XmlElementValue,9993,Variable\nUserScalarValueObjectType_NodeIdValue,9994,Variable\nUserScalarValueObjectType_ExpandedNodeIdValue,9995,Variable\nUserScalarValueObjectType_QualifiedNameValue,9996,Variable\nUserScalarValueObjectType_LocalizedTextValue,9997,Variable\nUserScalarValueObjectType_StatusCodeValue,9998,Variable\nUserScalarValueObjectType_VariantValue,9999,Variable\nUserScalarValue1MethodType,10000,Method\nUserScalarValue1MethodType_InputArguments,10001,Variable\nUserScalarValue1MethodType_OutputArguments,10002,Variable\nUserScalarValue2MethodType,10003,Method\nUserScalarValue2MethodType_InputArguments,10004,Variable\nUserScalarValue2MethodType_OutputArguments,10005,Variable\nUserArrayValueDataType,10006,DataType\nUserArrayValueObjectType,10007,ObjectType\nUserArrayValueObjectType_SimulationActive,10008,Variable\nUserArrayValueObjectType_GenerateValues,10009,Method\nUserArrayValueObjectType_GenerateValues_InputArguments,10010,Variable\nUserArrayValueObjectType_CycleComplete,10011,Object\nUserArrayValueObjectType_CycleComplete_EventId,10012,Variable\nUserArrayValueObjectType_CycleComplete_EventType,10013,Variable\nUserArrayValueObjectType_CycleComplete_SourceNode,10014,Variable\nUserArrayValueObjectType_CycleComplete_SourceName,10015,Variable\nUserArrayValueObjectType_CycleComplete_Time,10016,Variable\nUserArrayValueObjectType_CycleComplete_ReceiveTime,10017,Variable\nUserArrayValueObjectType_CycleComplete_LocalTime,10018,Variable\nUserArrayValueObjectType_CycleComplete_Message,10019,Variable\nUserArrayValueObjectType_CycleComplete_Severity,10020,Variable\nUserArrayValueObjectType_CycleComplete_BranchId,10021,Variable\nUserArrayValueObjectType_CycleComplete_Retain,10022,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState,10023,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState_Id,10024,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState_Name,10025,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState_Number,10026,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState_EffectiveDisplayName,10027,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState_TransitionTime,10028,Variable\nUserArrayValueObjectType_CycleComplete_Quality,10029,Variable\nUserArrayValueObjectType_CycleComplete_Quality_SourceTimestamp,10030,Variable\nUserArrayValueObjectType_CycleComplete_LastSeverity,10033,Variable\nUserArrayValueObjectType_CycleComplete_LastSeverity_SourceTimestamp,10034,Variable\nUserArrayValueObjectType_CycleComplete_Comment,10035,Variable\nUserArrayValueObjectType_CycleComplete_Comment_SourceTimestamp,10036,Variable\nUserArrayValueObjectType_CycleComplete_ClientUserId,10037,Variable\nUserArrayValueObjectType_CycleComplete_Enable,10038,Method\nUserArrayValueObjectType_CycleComplete_Disable,10039,Method\nUserArrayValueObjectType_CycleComplete_AddComment,10040,Method\nUserArrayValueObjectType_CycleComplete_AddComment_InputArguments,10041,Variable\nUserArrayValueObjectType_CycleComplete_AckedState,10044,Variable\nUserArrayValueObjectType_CycleComplete_AckedState_Id,10045,Variable\nUserArrayValueObjectType_CycleComplete_AckedState_Name,10046,Variable\nUserArrayValueObjectType_CycleComplete_AckedState_Number,10047,Variable\nUserArrayValueObjectType_CycleComplete_AckedState_EffectiveDisplayName,10048,Variable\nUserArrayValueObjectType_CycleComplete_AckedState_TransitionTime,10049,Variable\nUserArrayValueObjectType_CycleComplete_AckedState_TrueState,10050,Variable\nUserArrayValueObjectType_CycleComplete_AckedState_FalseState,10051,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState,10052,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState_Id,10053,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState_Name,10054,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState_Number,10055,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState_EffectiveDisplayName,10056,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState_TransitionTime,10057,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState_TrueState,10058,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState_FalseState,10059,Variable\nUserArrayValueObjectType_CycleComplete_Acknowledge,10060,Method\nUserArrayValueObjectType_CycleComplete_Acknowledge_InputArguments,10061,Variable\nUserArrayValueObjectType_CycleComplete_Confirm,10062,Method\nUserArrayValueObjectType_CycleComplete_Confirm_InputArguments,10063,Variable\nUserArrayValueObjectType_BooleanValue,10064,Variable\nUserArrayValueObjectType_SByteValue,10065,Variable\nUserArrayValueObjectType_ByteValue,10066,Variable\nUserArrayValueObjectType_Int16Value,10067,Variable\nUserArrayValueObjectType_UInt16Value,10068,Variable\nUserArrayValueObjectType_Int32Value,10069,Variable\nUserArrayValueObjectType_UInt32Value,10070,Variable\nUserArrayValueObjectType_Int64Value,10071,Variable\nUserArrayValueObjectType_UInt64Value,10072,Variable\nUserArrayValueObjectType_FloatValue,10073,Variable\nUserArrayValueObjectType_DoubleValue,10074,Variable\nUserArrayValueObjectType_StringValue,10075,Variable\nUserArrayValueObjectType_DateTimeValue,10076,Variable\nUserArrayValueObjectType_GuidValue,10077,Variable\nUserArrayValueObjectType_ByteStringValue,10078,Variable\nUserArrayValueObjectType_XmlElementValue,10079,Variable\nUserArrayValueObjectType_NodeIdValue,10080,Variable\nUserArrayValueObjectType_ExpandedNodeIdValue,10081,Variable\nUserArrayValueObjectType_QualifiedNameValue,10082,Variable\nUserArrayValueObjectType_LocalizedTextValue,10083,Variable\nUserArrayValueObjectType_StatusCodeValue,10084,Variable\nUserArrayValueObjectType_VariantValue,10085,Variable\nUserArrayValue1MethodType,10086,Method\nUserArrayValue1MethodType_InputArguments,10087,Variable\nUserArrayValue1MethodType_OutputArguments,10088,Variable\nUserArrayValue2MethodType,10089,Method\nUserArrayValue2MethodType_InputArguments,10090,Variable\nUserArrayValue2MethodType_OutputArguments,10091,Variable\nMethodTestType,10092,ObjectType\nMethodTestType_ScalarMethod1,10093,Method\nMethodTestType_ScalarMethod1_InputArguments,10094,Variable\nMethodTestType_ScalarMethod1_OutputArguments,10095,Variable\nMethodTestType_ScalarMethod2,10096,Method\nMethodTestType_ScalarMethod2_InputArguments,10097,Variable\nMethodTestType_ScalarMethod2_OutputArguments,10098,Variable\nMethodTestType_ScalarMethod3,10099,Method\nMethodTestType_ScalarMethod3_InputArguments,10100,Variable\nMethodTestType_ScalarMethod3_OutputArguments,10101,Variable\nMethodTestType_ArrayMethod1,10102,Method\nMethodTestType_ArrayMethod1_InputArguments,10103,Variable\nMethodTestType_ArrayMethod1_OutputArguments,10104,Variable\nMethodTestType_ArrayMethod2,10105,Method\nMethodTestType_ArrayMethod2_InputArguments,10106,Variable\nMethodTestType_ArrayMethod2_OutputArguments,10107,Variable\nMethodTestType_ArrayMethod3,10108,Method\nMethodTestType_ArrayMethod3_InputArguments,10109,Variable\nMethodTestType_ArrayMethod3_OutputArguments,10110,Variable\nMethodTestType_UserScalarMethod1,10111,Method\nMethodTestType_UserScalarMethod1_InputArguments,10112,Variable\nMethodTestType_UserScalarMethod1_OutputArguments,10113,Variable\nMethodTestType_UserScalarMethod2,10114,Method\nMethodTestType_UserScalarMethod2_InputArguments,10115,Variable\nMethodTestType_UserScalarMethod2_OutputArguments,10116,Variable\nMethodTestType_UserArrayMethod1,10117,Method\nMethodTestType_UserArrayMethod1_InputArguments,10118,Variable\nMethodTestType_UserArrayMethod1_OutputArguments,10119,Variable\nMethodTestType_UserArrayMethod2,10120,Method\nMethodTestType_UserArrayMethod2_InputArguments,10121,Variable\nMethodTestType_UserArrayMethod2_OutputArguments,10122,Variable\nTestSystemConditionType,10123,ObjectType\nTestSystemConditionType_EventId,10124,Variable\nTestSystemConditionType_EventType,10125,Variable\nTestSystemConditionType_SourceNode,10126,Variable\nTestSystemConditionType_SourceName,10127,Variable\nTestSystemConditionType_Time,10128,Variable\nTestSystemConditionType_ReceiveTime,10129,Variable\nTestSystemConditionType_LocalTime,10130,Variable\nTestSystemConditionType_Message,10131,Variable\nTestSystemConditionType_Severity,10132,Variable\nTestSystemConditionType_BranchId,10133,Variable\nTestSystemConditionType_Retain,10134,Variable\nTestSystemConditionType_EnabledState,10135,Variable\nTestSystemConditionType_EnabledState_Id,10136,Variable\nTestSystemConditionType_EnabledState_Name,10137,Variable\nTestSystemConditionType_EnabledState_Number,10138,Variable\nTestSystemConditionType_EnabledState_EffectiveDisplayName,10139,Variable\nTestSystemConditionType_EnabledState_TransitionTime,10140,Variable\nTestSystemConditionType_Quality,10141,Variable\nTestSystemConditionType_Quality_SourceTimestamp,10142,Variable\nTestSystemConditionType_LastSeverity,10145,Variable\nTestSystemConditionType_LastSeverity_SourceTimestamp,10146,Variable\nTestSystemConditionType_Comment,10147,Variable\nTestSystemConditionType_Comment_SourceTimestamp,10148,Variable\nTestSystemConditionType_ClientUserId,10149,Variable\nTestSystemConditionType_Enable,10150,Method\nTestSystemConditionType_Disable,10151,Method\nTestSystemConditionType_AddComment,10152,Method\nTestSystemConditionType_AddComment_InputArguments,10153,Variable\nTestSystemConditionType_ConditionRefresh,10154,Method\nTestSystemConditionType_ConditionRefresh_InputArguments,10155,Variable\nTestSystemConditionType_MonitoredNodeCount,10156,Variable\nData,10157,Object\nData_Static,10158,Object\nData_Static_Scalar,10159,Object\nData_Static_Scalar_SimulationActive,10160,Variable\nData_Static_Scalar_GenerateValues,10161,Method\nData_Static_Scalar_GenerateValues_InputArguments,10162,Variable\nData_Static_Scalar_CycleComplete,10163,Object\nData_Static_Scalar_CycleComplete_EventId,10164,Variable\nData_Static_Scalar_CycleComplete_EventType,10165,Variable\nData_Static_Scalar_CycleComplete_SourceNode,10166,Variable\nData_Static_Scalar_CycleComplete_SourceName,10167,Variable\nData_Static_Scalar_CycleComplete_Time,10168,Variable\nData_Static_Scalar_CycleComplete_ReceiveTime,10169,Variable\nData_Static_Scalar_CycleComplete_LocalTime,10170,Variable\nData_Static_Scalar_CycleComplete_Message,10171,Variable\nData_Static_Scalar_CycleComplete_Severity,10172,Variable\nData_Static_Scalar_CycleComplete_BranchId,10173,Variable\nData_Static_Scalar_CycleComplete_Retain,10174,Variable\nData_Static_Scalar_CycleComplete_EnabledState,10175,Variable\nData_Static_Scalar_CycleComplete_EnabledState_Id,10176,Variable\nData_Static_Scalar_CycleComplete_EnabledState_Name,10177,Variable\nData_Static_Scalar_CycleComplete_EnabledState_Number,10178,Variable\nData_Static_Scalar_CycleComplete_EnabledState_EffectiveDisplayName,10179,Variable\nData_Static_Scalar_CycleComplete_EnabledState_TransitionTime,10180,Variable\nData_Static_Scalar_CycleComplete_Quality,10181,Variable\nData_Static_Scalar_CycleComplete_Quality_SourceTimestamp,10182,Variable\nData_Static_Scalar_CycleComplete_LastSeverity,10185,Variable\nData_Static_Scalar_CycleComplete_LastSeverity_SourceTimestamp,10186,Variable\nData_Static_Scalar_CycleComplete_Comment,10187,Variable\nData_Static_Scalar_CycleComplete_Comment_SourceTimestamp,10188,Variable\nData_Static_Scalar_CycleComplete_ClientUserId,10189,Variable\nData_Static_Scalar_CycleComplete_Enable,10190,Method\nData_Static_Scalar_CycleComplete_Disable,10191,Method\nData_Static_Scalar_CycleComplete_AddComment,10192,Method\nData_Static_Scalar_CycleComplete_AddComment_InputArguments,10193,Variable\nData_Static_Scalar_CycleComplete_AckedState,10196,Variable\nData_Static_Scalar_CycleComplete_AckedState_Id,10197,Variable\nData_Static_Scalar_CycleComplete_AckedState_Name,10198,Variable\nData_Static_Scalar_CycleComplete_AckedState_Number,10199,Variable\nData_Static_Scalar_CycleComplete_AckedState_EffectiveDisplayName,10200,Variable\nData_Static_Scalar_CycleComplete_AckedState_TransitionTime,10201,Variable\nData_Static_Scalar_CycleComplete_AckedState_TrueState,10202,Variable\nData_Static_Scalar_CycleComplete_AckedState_FalseState,10203,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState,10204,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState_Id,10205,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState_Name,10206,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState_Number,10207,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState_EffectiveDisplayName,10208,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState_TransitionTime,10209,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState_TrueState,10210,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState_FalseState,10211,Variable\nData_Static_Scalar_CycleComplete_Acknowledge,10212,Method\nData_Static_Scalar_CycleComplete_Acknowledge_InputArguments,10213,Variable\nData_Static_Scalar_CycleComplete_Confirm,10214,Method\nData_Static_Scalar_CycleComplete_Confirm_InputArguments,10215,Variable\nData_Static_Scalar_BooleanValue,10216,Variable\nData_Static_Scalar_SByteValue,10217,Variable\nData_Static_Scalar_ByteValue,10218,Variable\nData_Static_Scalar_Int16Value,10219,Variable\nData_Static_Scalar_UInt16Value,10220,Variable\nData_Static_Scalar_Int32Value,10221,Variable\nData_Static_Scalar_UInt32Value,10222,Variable\nData_Static_Scalar_Int64Value,10223,Variable\nData_Static_Scalar_UInt64Value,10224,Variable\nData_Static_Scalar_FloatValue,10225,Variable\nData_Static_Scalar_DoubleValue,10226,Variable\nData_Static_Scalar_StringValue,10227,Variable\nData_Static_Scalar_DateTimeValue,10228,Variable\nData_Static_Scalar_GuidValue,10229,Variable\nData_Static_Scalar_ByteStringValue,10230,Variable\nData_Static_Scalar_XmlElementValue,10231,Variable\nData_Static_Scalar_NodeIdValue,10232,Variable\nData_Static_Scalar_ExpandedNodeIdValue,10233,Variable\nData_Static_Scalar_QualifiedNameValue,10234,Variable\nData_Static_Scalar_LocalizedTextValue,10235,Variable\nData_Static_Scalar_StatusCodeValue,10236,Variable\nData_Static_Scalar_VariantValue,10237,Variable\nData_Static_Scalar_EnumerationValue,10238,Variable\nData_Static_Scalar_StructureValue,10239,Variable\nData_Static_Scalar_NumberValue,10240,Variable\nData_Static_Scalar_IntegerValue,10241,Variable\nData_Static_Scalar_UIntegerValue,10242,Variable\nData_Static_Array,10243,Object\nData_Static_Array_SimulationActive,10244,Variable\nData_Static_Array_GenerateValues,10245,Method\nData_Static_Array_GenerateValues_InputArguments,10246,Variable\nData_Static_Array_CycleComplete,10247,Object\nData_Static_Array_CycleComplete_EventId,10248,Variable\nData_Static_Array_CycleComplete_EventType,10249,Variable\nData_Static_Array_CycleComplete_SourceNode,10250,Variable\nData_Static_Array_CycleComplete_SourceName,10251,Variable\nData_Static_Array_CycleComplete_Time,10252,Variable\nData_Static_Array_CycleComplete_ReceiveTime,10253,Variable\nData_Static_Array_CycleComplete_LocalTime,10254,Variable\nData_Static_Array_CycleComplete_Message,10255,Variable\nData_Static_Array_CycleComplete_Severity,10256,Variable\nData_Static_Array_CycleComplete_BranchId,10257,Variable\nData_Static_Array_CycleComplete_Retain,10258,Variable\nData_Static_Array_CycleComplete_EnabledState,10259,Variable\nData_Static_Array_CycleComplete_EnabledState_Id,10260,Variable\nData_Static_Array_CycleComplete_EnabledState_Name,10261,Variable\nData_Static_Array_CycleComplete_EnabledState_Number,10262,Variable\nData_Static_Array_CycleComplete_EnabledState_EffectiveDisplayName,10263,Variable\nData_Static_Array_CycleComplete_EnabledState_TransitionTime,10264,Variable\nData_Static_Array_CycleComplete_Quality,10265,Variable\nData_Static_Array_CycleComplete_Quality_SourceTimestamp,10266,Variable\nData_Static_Array_CycleComplete_LastSeverity,10269,Variable\nData_Static_Array_CycleComplete_LastSeverity_SourceTimestamp,10270,Variable\nData_Static_Array_CycleComplete_Comment,10271,Variable\nData_Static_Array_CycleComplete_Comment_SourceTimestamp,10272,Variable\nData_Static_Array_CycleComplete_ClientUserId,10273,Variable\nData_Static_Array_CycleComplete_Enable,10274,Method\nData_Static_Array_CycleComplete_Disable,10275,Method\nData_Static_Array_CycleComplete_AddComment,10276,Method\nData_Static_Array_CycleComplete_AddComment_InputArguments,10277,Variable\nData_Static_Array_CycleComplete_AckedState,10280,Variable\nData_Static_Array_CycleComplete_AckedState_Id,10281,Variable\nData_Static_Array_CycleComplete_AckedState_Name,10282,Variable\nData_Static_Array_CycleComplete_AckedState_Number,10283,Variable\nData_Static_Array_CycleComplete_AckedState_EffectiveDisplayName,10284,Variable\nData_Static_Array_CycleComplete_AckedState_TransitionTime,10285,Variable\nData_Static_Array_CycleComplete_AckedState_TrueState,10286,Variable\nData_Static_Array_CycleComplete_AckedState_FalseState,10287,Variable\nData_Static_Array_CycleComplete_ConfirmedState,10288,Variable\nData_Static_Array_CycleComplete_ConfirmedState_Id,10289,Variable\nData_Static_Array_CycleComplete_ConfirmedState_Name,10290,Variable\nData_Static_Array_CycleComplete_ConfirmedState_Number,10291,Variable\nData_Static_Array_CycleComplete_ConfirmedState_EffectiveDisplayName,10292,Variable\nData_Static_Array_CycleComplete_ConfirmedState_TransitionTime,10293,Variable\nData_Static_Array_CycleComplete_ConfirmedState_TrueState,10294,Variable\nData_Static_Array_CycleComplete_ConfirmedState_FalseState,10295,Variable\nData_Static_Array_CycleComplete_Acknowledge,10296,Method\nData_Static_Array_CycleComplete_Acknowledge_InputArguments,10297,Variable\nData_Static_Array_CycleComplete_Confirm,10298,Method\nData_Static_Array_CycleComplete_Confirm_InputArguments,10299,Variable\nData_Static_Array_BooleanValue,10300,Variable\nData_Static_Array_SByteValue,10301,Variable\nData_Static_Array_ByteValue,10302,Variable\nData_Static_Array_Int16Value,10303,Variable\nData_Static_Array_UInt16Value,10304,Variable\nData_Static_Array_Int32Value,10305,Variable\nData_Static_Array_UInt32Value,10306,Variable\nData_Static_Array_Int64Value,10307,Variable\nData_Static_Array_UInt64Value,10308,Variable\nData_Static_Array_FloatValue,10309,Variable\nData_Static_Array_DoubleValue,10310,Variable\nData_Static_Array_StringValue,10311,Variable\nData_Static_Array_DateTimeValue,10312,Variable\nData_Static_Array_GuidValue,10313,Variable\nData_Static_Array_ByteStringValue,10314,Variable\nData_Static_Array_XmlElementValue,10315,Variable\nData_Static_Array_NodeIdValue,10316,Variable\nData_Static_Array_ExpandedNodeIdValue,10317,Variable\nData_Static_Array_QualifiedNameValue,10318,Variable\nData_Static_Array_LocalizedTextValue,10319,Variable\nData_Static_Array_StatusCodeValue,10320,Variable\nData_Static_Array_VariantValue,10321,Variable\nData_Static_Array_EnumerationValue,10322,Variable\nData_Static_Array_StructureValue,10323,Variable\nData_Static_Array_NumberValue,10324,Variable\nData_Static_Array_IntegerValue,10325,Variable\nData_Static_Array_UIntegerValue,10326,Variable\nData_Static_UserScalar,10327,Object\nData_Static_UserScalar_SimulationActive,10328,Variable\nData_Static_UserScalar_GenerateValues,10329,Method\nData_Static_UserScalar_GenerateValues_InputArguments,10330,Variable\nData_Static_UserScalar_CycleComplete,10331,Object\nData_Static_UserScalar_CycleComplete_EventId,10332,Variable\nData_Static_UserScalar_CycleComplete_EventType,10333,Variable\nData_Static_UserScalar_CycleComplete_SourceNode,10334,Variable\nData_Static_UserScalar_CycleComplete_SourceName,10335,Variable\nData_Static_UserScalar_CycleComplete_Time,10336,Variable\nData_Static_UserScalar_CycleComplete_ReceiveTime,10337,Variable\nData_Static_UserScalar_CycleComplete_LocalTime,10338,Variable\nData_Static_UserScalar_CycleComplete_Message,10339,Variable\nData_Static_UserScalar_CycleComplete_Severity,10340,Variable\nData_Static_UserScalar_CycleComplete_BranchId,10341,Variable\nData_Static_UserScalar_CycleComplete_Retain,10342,Variable\nData_Static_UserScalar_CycleComplete_EnabledState,10343,Variable\nData_Static_UserScalar_CycleComplete_EnabledState_Id,10344,Variable\nData_Static_UserScalar_CycleComplete_EnabledState_Name,10345,Variable\nData_Static_UserScalar_CycleComplete_EnabledState_Number,10346,Variable\nData_Static_UserScalar_CycleComplete_EnabledState_EffectiveDisplayName,10347,Variable\nData_Static_UserScalar_CycleComplete_EnabledState_TransitionTime,10348,Variable\nData_Static_UserScalar_CycleComplete_Quality,10349,Variable\nData_Static_UserScalar_CycleComplete_Quality_SourceTimestamp,10350,Variable\nData_Static_UserScalar_CycleComplete_LastSeverity,10353,Variable\nData_Static_UserScalar_CycleComplete_LastSeverity_SourceTimestamp,10354,Variable\nData_Static_UserScalar_CycleComplete_Comment,10355,Variable\nData_Static_UserScalar_CycleComplete_Comment_SourceTimestamp,10356,Variable\nData_Static_UserScalar_CycleComplete_ClientUserId,10357,Variable\nData_Static_UserScalar_CycleComplete_Enable,10358,Method\nData_Static_UserScalar_CycleComplete_Disable,10359,Method\nData_Static_UserScalar_CycleComplete_AddComment,10360,Method\nData_Static_UserScalar_CycleComplete_AddComment_InputArguments,10361,Variable\nData_Static_UserScalar_CycleComplete_AckedState,10364,Variable\nData_Static_UserScalar_CycleComplete_AckedState_Id,10365,Variable\nData_Static_UserScalar_CycleComplete_AckedState_Name,10366,Variable\nData_Static_UserScalar_CycleComplete_AckedState_Number,10367,Variable\nData_Static_UserScalar_CycleComplete_AckedState_EffectiveDisplayName,10368,Variable\nData_Static_UserScalar_CycleComplete_AckedState_TransitionTime,10369,Variable\nData_Static_UserScalar_CycleComplete_AckedState_TrueState,10370,Variable\nData_Static_UserScalar_CycleComplete_AckedState_FalseState,10371,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState,10372,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState_Id,10373,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState_Name,10374,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState_Number,10375,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState_EffectiveDisplayName,10376,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState_TransitionTime,10377,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState_TrueState,10378,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState_FalseState,10379,Variable\nData_Static_UserScalar_CycleComplete_Acknowledge,10380,Method\nData_Static_UserScalar_CycleComplete_Acknowledge_InputArguments,10381,Variable\nData_Static_UserScalar_CycleComplete_Confirm,10382,Method\nData_Static_UserScalar_CycleComplete_Confirm_InputArguments,10383,Variable\nData_Static_UserScalar_BooleanValue,10384,Variable\nData_Static_UserScalar_SByteValue,10385,Variable\nData_Static_UserScalar_ByteValue,10386,Variable\nData_Static_UserScalar_Int16Value,10387,Variable\nData_Static_UserScalar_UInt16Value,10388,Variable\nData_Static_UserScalar_Int32Value,10389,Variable\nData_Static_UserScalar_UInt32Value,10390,Variable\nData_Static_UserScalar_Int64Value,10391,Variable\nData_Static_UserScalar_UInt64Value,10392,Variable\nData_Static_UserScalar_FloatValue,10393,Variable\nData_Static_UserScalar_DoubleValue,10394,Variable\nData_Static_UserScalar_StringValue,10395,Variable\nData_Static_UserScalar_DateTimeValue,10396,Variable\nData_Static_UserScalar_GuidValue,10397,Variable\nData_Static_UserScalar_ByteStringValue,10398,Variable\nData_Static_UserScalar_XmlElementValue,10399,Variable\nData_Static_UserScalar_NodeIdValue,10400,Variable\nData_Static_UserScalar_ExpandedNodeIdValue,10401,Variable\nData_Static_UserScalar_QualifiedNameValue,10402,Variable\nData_Static_UserScalar_LocalizedTextValue,10403,Variable\nData_Static_UserScalar_StatusCodeValue,10404,Variable\nData_Static_UserScalar_VariantValue,10405,Variable\nData_Static_UserArray,10406,Object\nData_Static_UserArray_SimulationActive,10407,Variable\nData_Static_UserArray_GenerateValues,10408,Method\nData_Static_UserArray_GenerateValues_InputArguments,10409,Variable\nData_Static_UserArray_CycleComplete,10410,Object\nData_Static_UserArray_CycleComplete_EventId,10411,Variable\nData_Static_UserArray_CycleComplete_EventType,10412,Variable\nData_Static_UserArray_CycleComplete_SourceNode,10413,Variable\nData_Static_UserArray_CycleComplete_SourceName,10414,Variable\nData_Static_UserArray_CycleComplete_Time,10415,Variable\nData_Static_UserArray_CycleComplete_ReceiveTime,10416,Variable\nData_Static_UserArray_CycleComplete_LocalTime,10417,Variable\nData_Static_UserArray_CycleComplete_Message,10418,Variable\nData_Static_UserArray_CycleComplete_Severity,10419,Variable\nData_Static_UserArray_CycleComplete_BranchId,10420,Variable\nData_Static_UserArray_CycleComplete_Retain,10421,Variable\nData_Static_UserArray_CycleComplete_EnabledState,10422,Variable\nData_Static_UserArray_CycleComplete_EnabledState_Id,10423,Variable\nData_Static_UserArray_CycleComplete_EnabledState_Name,10424,Variable\nData_Static_UserArray_CycleComplete_EnabledState_Number,10425,Variable\nData_Static_UserArray_CycleComplete_EnabledState_EffectiveDisplayName,10426,Variable\nData_Static_UserArray_CycleComplete_EnabledState_TransitionTime,10427,Variable\nData_Static_UserArray_CycleComplete_Quality,10428,Variable\nData_Static_UserArray_CycleComplete_Quality_SourceTimestamp,10429,Variable\nData_Static_UserArray_CycleComplete_LastSeverity,10432,Variable\nData_Static_UserArray_CycleComplete_LastSeverity_SourceTimestamp,10433,Variable\nData_Static_UserArray_CycleComplete_Comment,10434,Variable\nData_Static_UserArray_CycleComplete_Comment_SourceTimestamp,10435,Variable\nData_Static_UserArray_CycleComplete_ClientUserId,10436,Variable\nData_Static_UserArray_CycleComplete_Enable,10437,Method\nData_Static_UserArray_CycleComplete_Disable,10438,Method\nData_Static_UserArray_CycleComplete_AddComment,10439,Method\nData_Static_UserArray_CycleComplete_AddComment_InputArguments,10440,Variable\nData_Static_UserArray_CycleComplete_AckedState,10443,Variable\nData_Static_UserArray_CycleComplete_AckedState_Id,10444,Variable\nData_Static_UserArray_CycleComplete_AckedState_Name,10445,Variable\nData_Static_UserArray_CycleComplete_AckedState_Number,10446,Variable\nData_Static_UserArray_CycleComplete_AckedState_EffectiveDisplayName,10447,Variable\nData_Static_UserArray_CycleComplete_AckedState_TransitionTime,10448,Variable\nData_Static_UserArray_CycleComplete_AckedState_TrueState,10449,Variable\nData_Static_UserArray_CycleComplete_AckedState_FalseState,10450,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState,10451,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState_Id,10452,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState_Name,10453,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState_Number,10454,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState_EffectiveDisplayName,10455,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState_TransitionTime,10456,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState_TrueState,10457,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState_FalseState,10458,Variable\nData_Static_UserArray_CycleComplete_Acknowledge,10459,Method\nData_Static_UserArray_CycleComplete_Acknowledge_InputArguments,10460,Variable\nData_Static_UserArray_CycleComplete_Confirm,10461,Method\nData_Static_UserArray_CycleComplete_Confirm_InputArguments,10462,Variable\nData_Static_UserArray_BooleanValue,10463,Variable\nData_Static_UserArray_SByteValue,10464,Variable\nData_Static_UserArray_ByteValue,10465,Variable\nData_Static_UserArray_Int16Value,10466,Variable\nData_Static_UserArray_UInt16Value,10467,Variable\nData_Static_UserArray_Int32Value,10468,Variable\nData_Static_UserArray_UInt32Value,10469,Variable\nData_Static_UserArray_Int64Value,10470,Variable\nData_Static_UserArray_UInt64Value,10471,Variable\nData_Static_UserArray_FloatValue,10472,Variable\nData_Static_UserArray_DoubleValue,10473,Variable\nData_Static_UserArray_StringValue,10474,Variable\nData_Static_UserArray_DateTimeValue,10475,Variable\nData_Static_UserArray_GuidValue,10476,Variable\nData_Static_UserArray_ByteStringValue,10477,Variable\nData_Static_UserArray_XmlElementValue,10478,Variable\nData_Static_UserArray_NodeIdValue,10479,Variable\nData_Static_UserArray_ExpandedNodeIdValue,10480,Variable\nData_Static_UserArray_QualifiedNameValue,10481,Variable\nData_Static_UserArray_LocalizedTextValue,10482,Variable\nData_Static_UserArray_StatusCodeValue,10483,Variable\nData_Static_UserArray_VariantValue,10484,Variable\nData_Static_AnalogScalar,10485,Object\nData_Static_AnalogScalar_SimulationActive,10486,Variable\nData_Static_AnalogScalar_GenerateValues,10487,Method\nData_Static_AnalogScalar_GenerateValues_InputArguments,10488,Variable\nData_Static_AnalogScalar_CycleComplete,10489,Object\nData_Static_AnalogScalar_CycleComplete_EventId,10490,Variable\nData_Static_AnalogScalar_CycleComplete_EventType,10491,Variable\nData_Static_AnalogScalar_CycleComplete_SourceNode,10492,Variable\nData_Static_AnalogScalar_CycleComplete_SourceName,10493,Variable\nData_Static_AnalogScalar_CycleComplete_Time,10494,Variable\nData_Static_AnalogScalar_CycleComplete_ReceiveTime,10495,Variable\nData_Static_AnalogScalar_CycleComplete_LocalTime,10496,Variable\nData_Static_AnalogScalar_CycleComplete_Message,10497,Variable\nData_Static_AnalogScalar_CycleComplete_Severity,10498,Variable\nData_Static_AnalogScalar_CycleComplete_BranchId,10499,Variable\nData_Static_AnalogScalar_CycleComplete_Retain,10500,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState,10501,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState_Id,10502,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState_Name,10503,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState_Number,10504,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState_EffectiveDisplayName,10505,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState_TransitionTime,10506,Variable\nData_Static_AnalogScalar_CycleComplete_Quality,10507,Variable\nData_Static_AnalogScalar_CycleComplete_Quality_SourceTimestamp,10508,Variable\nData_Static_AnalogScalar_CycleComplete_LastSeverity,10511,Variable\nData_Static_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp,10512,Variable\nData_Static_AnalogScalar_CycleComplete_Comment,10513,Variable\nData_Static_AnalogScalar_CycleComplete_Comment_SourceTimestamp,10514,Variable\nData_Static_AnalogScalar_CycleComplete_ClientUserId,10515,Variable\nData_Static_AnalogScalar_CycleComplete_Enable,10516,Method\nData_Static_AnalogScalar_CycleComplete_Disable,10517,Method\nData_Static_AnalogScalar_CycleComplete_AddComment,10518,Method\nData_Static_AnalogScalar_CycleComplete_AddComment_InputArguments,10519,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState,10522,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState_Id,10523,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState_Name,10524,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState_Number,10525,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState_EffectiveDisplayName,10526,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState_TransitionTime,10527,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState_TrueState,10528,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState_FalseState,10529,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState,10530,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState_Id,10531,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState_Name,10532,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState_Number,10533,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState_EffectiveDisplayName,10534,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState_TransitionTime,10535,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState_TrueState,10536,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState_FalseState,10537,Variable\nData_Static_AnalogScalar_CycleComplete_Acknowledge,10538,Method\nData_Static_AnalogScalar_CycleComplete_Acknowledge_InputArguments,10539,Variable\nData_Static_AnalogScalar_CycleComplete_Confirm,10540,Method\nData_Static_AnalogScalar_CycleComplete_Confirm_InputArguments,10541,Variable\nData_Static_AnalogScalar_SByteValue,10542,Variable\nData_Static_AnalogScalar_SByteValue_Definition,10543,Variable\nData_Static_AnalogScalar_SByteValue_ValuePrecision,10544,Variable\nData_Static_AnalogScalar_SByteValue_EURange,10545,Variable\nData_Static_AnalogScalar_SByteValue_InstrumentRange,10546,Variable\nData_Static_AnalogScalar_SByteValue_EngineeringUnits,10547,Variable\nData_Static_AnalogScalar_ByteValue,10548,Variable\nData_Static_AnalogScalar_ByteValue_Definition,10549,Variable\nData_Static_AnalogScalar_ByteValue_ValuePrecision,10550,Variable\nData_Static_AnalogScalar_ByteValue_EURange,10551,Variable\nData_Static_AnalogScalar_ByteValue_InstrumentRange,10552,Variable\nData_Static_AnalogScalar_ByteValue_EngineeringUnits,10553,Variable\nData_Static_AnalogScalar_Int16Value,10554,Variable\nData_Static_AnalogScalar_Int16Value_Definition,10555,Variable\nData_Static_AnalogScalar_Int16Value_ValuePrecision,10556,Variable\nData_Static_AnalogScalar_Int16Value_EURange,10557,Variable\nData_Static_AnalogScalar_Int16Value_InstrumentRange,10558,Variable\nData_Static_AnalogScalar_Int16Value_EngineeringUnits,10559,Variable\nData_Static_AnalogScalar_UInt16Value,10560,Variable\nData_Static_AnalogScalar_UInt16Value_Definition,10561,Variable\nData_Static_AnalogScalar_UInt16Value_ValuePrecision,10562,Variable\nData_Static_AnalogScalar_UInt16Value_EURange,10563,Variable\nData_Static_AnalogScalar_UInt16Value_InstrumentRange,10564,Variable\nData_Static_AnalogScalar_UInt16Value_EngineeringUnits,10565,Variable\nData_Static_AnalogScalar_Int32Value,10566,Variable\nData_Static_AnalogScalar_Int32Value_Definition,10567,Variable\nData_Static_AnalogScalar_Int32Value_ValuePrecision,10568,Variable\nData_Static_AnalogScalar_Int32Value_EURange,10569,Variable\nData_Static_AnalogScalar_Int32Value_InstrumentRange,10570,Variable\nData_Static_AnalogScalar_Int32Value_EngineeringUnits,10571,Variable\nData_Static_AnalogScalar_UInt32Value,10572,Variable\nData_Static_AnalogScalar_UInt32Value_Definition,10573,Variable\nData_Static_AnalogScalar_UInt32Value_ValuePrecision,10574,Variable\nData_Static_AnalogScalar_UInt32Value_EURange,10575,Variable\nData_Static_AnalogScalar_UInt32Value_InstrumentRange,10576,Variable\nData_Static_AnalogScalar_UInt32Value_EngineeringUnits,10577,Variable\nData_Static_AnalogScalar_Int64Value,10578,Variable\nData_Static_AnalogScalar_Int64Value_Definition,10579,Variable\nData_Static_AnalogScalar_Int64Value_ValuePrecision,10580,Variable\nData_Static_AnalogScalar_Int64Value_EURange,10581,Variable\nData_Static_AnalogScalar_Int64Value_InstrumentRange,10582,Variable\nData_Static_AnalogScalar_Int64Value_EngineeringUnits,10583,Variable\nData_Static_AnalogScalar_UInt64Value,10584,Variable\nData_Static_AnalogScalar_UInt64Value_Definition,10585,Variable\nData_Static_AnalogScalar_UInt64Value_ValuePrecision,10586,Variable\nData_Static_AnalogScalar_UInt64Value_EURange,10587,Variable\nData_Static_AnalogScalar_UInt64Value_InstrumentRange,10588,Variable\nData_Static_AnalogScalar_UInt64Value_EngineeringUnits,10589,Variable\nData_Static_AnalogScalar_FloatValue,10590,Variable\nData_Static_AnalogScalar_FloatValue_Definition,10591,Variable\nData_Static_AnalogScalar_FloatValue_ValuePrecision,10592,Variable\nData_Static_AnalogScalar_FloatValue_EURange,10593,Variable\nData_Static_AnalogScalar_FloatValue_InstrumentRange,10594,Variable\nData_Static_AnalogScalar_FloatValue_EngineeringUnits,10595,Variable\nData_Static_AnalogScalar_DoubleValue,10596,Variable\nData_Static_AnalogScalar_DoubleValue_Definition,10597,Variable\nData_Static_AnalogScalar_DoubleValue_ValuePrecision,10598,Variable\nData_Static_AnalogScalar_DoubleValue_EURange,10599,Variable\nData_Static_AnalogScalar_DoubleValue_InstrumentRange,10600,Variable\nData_Static_AnalogScalar_DoubleValue_EngineeringUnits,10601,Variable\nData_Static_AnalogScalar_NumberValue,10602,Variable\nData_Static_AnalogScalar_NumberValue_Definition,10603,Variable\nData_Static_AnalogScalar_NumberValue_ValuePrecision,10604,Variable\nData_Static_AnalogScalar_NumberValue_EURange,10605,Variable\nData_Static_AnalogScalar_NumberValue_InstrumentRange,10606,Variable\nData_Static_AnalogScalar_NumberValue_EngineeringUnits,10607,Variable\nData_Static_AnalogScalar_IntegerValue,10608,Variable\nData_Static_AnalogScalar_IntegerValue_Definition,10609,Variable\nData_Static_AnalogScalar_IntegerValue_ValuePrecision,10610,Variable\nData_Static_AnalogScalar_IntegerValue_EURange,10611,Variable\nData_Static_AnalogScalar_IntegerValue_InstrumentRange,10612,Variable\nData_Static_AnalogScalar_IntegerValue_EngineeringUnits,10613,Variable\nData_Static_AnalogScalar_UIntegerValue,10614,Variable\nData_Static_AnalogScalar_UIntegerValue_Definition,10615,Variable\nData_Static_AnalogScalar_UIntegerValue_ValuePrecision,10616,Variable\nData_Static_AnalogScalar_UIntegerValue_EURange,10617,Variable\nData_Static_AnalogScalar_UIntegerValue_InstrumentRange,10618,Variable\nData_Static_AnalogScalar_UIntegerValue_EngineeringUnits,10619,Variable\nData_Static_AnalogArray,10620,Object\nData_Static_AnalogArray_SimulationActive,10621,Variable\nData_Static_AnalogArray_GenerateValues,10622,Method\nData_Static_AnalogArray_GenerateValues_InputArguments,10623,Variable\nData_Static_AnalogArray_CycleComplete,10624,Object\nData_Static_AnalogArray_CycleComplete_EventId,10625,Variable\nData_Static_AnalogArray_CycleComplete_EventType,10626,Variable\nData_Static_AnalogArray_CycleComplete_SourceNode,10627,Variable\nData_Static_AnalogArray_CycleComplete_SourceName,10628,Variable\nData_Static_AnalogArray_CycleComplete_Time,10629,Variable\nData_Static_AnalogArray_CycleComplete_ReceiveTime,10630,Variable\nData_Static_AnalogArray_CycleComplete_LocalTime,10631,Variable\nData_Static_AnalogArray_CycleComplete_Message,10632,Variable\nData_Static_AnalogArray_CycleComplete_Severity,10633,Variable\nData_Static_AnalogArray_CycleComplete_BranchId,10634,Variable\nData_Static_AnalogArray_CycleComplete_Retain,10635,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState,10636,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState_Id,10637,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState_Name,10638,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState_Number,10639,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState_EffectiveDisplayName,10640,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState_TransitionTime,10641,Variable\nData_Static_AnalogArray_CycleComplete_Quality,10642,Variable\nData_Static_AnalogArray_CycleComplete_Quality_SourceTimestamp,10643,Variable\nData_Static_AnalogArray_CycleComplete_LastSeverity,10646,Variable\nData_Static_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp,10647,Variable\nData_Static_AnalogArray_CycleComplete_Comment,10648,Variable\nData_Static_AnalogArray_CycleComplete_Comment_SourceTimestamp,10649,Variable\nData_Static_AnalogArray_CycleComplete_ClientUserId,10650,Variable\nData_Static_AnalogArray_CycleComplete_Enable,10651,Method\nData_Static_AnalogArray_CycleComplete_Disable,10652,Method\nData_Static_AnalogArray_CycleComplete_AddComment,10653,Method\nData_Static_AnalogArray_CycleComplete_AddComment_InputArguments,10654,Variable\nData_Static_AnalogArray_CycleComplete_AckedState,10657,Variable\nData_Static_AnalogArray_CycleComplete_AckedState_Id,10658,Variable\nData_Static_AnalogArray_CycleComplete_AckedState_Name,10659,Variable\nData_Static_AnalogArray_CycleComplete_AckedState_Number,10660,Variable\nData_Static_AnalogArray_CycleComplete_AckedState_EffectiveDisplayName,10661,Variable\nData_Static_AnalogArray_CycleComplete_AckedState_TransitionTime,10662,Variable\nData_Static_AnalogArray_CycleComplete_AckedState_TrueState,10663,Variable\nData_Static_AnalogArray_CycleComplete_AckedState_FalseState,10664,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState,10665,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState_Id,10666,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState_Name,10667,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState_Number,10668,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState_EffectiveDisplayName,10669,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState_TransitionTime,10670,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState_TrueState,10671,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState_FalseState,10672,Variable\nData_Static_AnalogArray_CycleComplete_Acknowledge,10673,Method\nData_Static_AnalogArray_CycleComplete_Acknowledge_InputArguments,10674,Variable\nData_Static_AnalogArray_CycleComplete_Confirm,10675,Method\nData_Static_AnalogArray_CycleComplete_Confirm_InputArguments,10676,Variable\nData_Static_AnalogArray_SByteValue,10677,Variable\nData_Static_AnalogArray_SByteValue_Definition,10678,Variable\nData_Static_AnalogArray_SByteValue_ValuePrecision,10679,Variable\nData_Static_AnalogArray_SByteValue_EURange,10680,Variable\nData_Static_AnalogArray_SByteValue_InstrumentRange,10681,Variable\nData_Static_AnalogArray_SByteValue_EngineeringUnits,10682,Variable\nData_Static_AnalogArray_ByteValue,10683,Variable\nData_Static_AnalogArray_ByteValue_Definition,10684,Variable\nData_Static_AnalogArray_ByteValue_ValuePrecision,10685,Variable\nData_Static_AnalogArray_ByteValue_EURange,10686,Variable\nData_Static_AnalogArray_ByteValue_InstrumentRange,10687,Variable\nData_Static_AnalogArray_ByteValue_EngineeringUnits,10688,Variable\nData_Static_AnalogArray_Int16Value,10689,Variable\nData_Static_AnalogArray_Int16Value_Definition,10690,Variable\nData_Static_AnalogArray_Int16Value_ValuePrecision,10691,Variable\nData_Static_AnalogArray_Int16Value_EURange,10692,Variable\nData_Static_AnalogArray_Int16Value_InstrumentRange,10693,Variable\nData_Static_AnalogArray_Int16Value_EngineeringUnits,10694,Variable\nData_Static_AnalogArray_UInt16Value,10695,Variable\nData_Static_AnalogArray_UInt16Value_Definition,10696,Variable\nData_Static_AnalogArray_UInt16Value_ValuePrecision,10697,Variable\nData_Static_AnalogArray_UInt16Value_EURange,10698,Variable\nData_Static_AnalogArray_UInt16Value_InstrumentRange,10699,Variable\nData_Static_AnalogArray_UInt16Value_EngineeringUnits,10700,Variable\nData_Static_AnalogArray_Int32Value,10701,Variable\nData_Static_AnalogArray_Int32Value_Definition,10702,Variable\nData_Static_AnalogArray_Int32Value_ValuePrecision,10703,Variable\nData_Static_AnalogArray_Int32Value_EURange,10704,Variable\nData_Static_AnalogArray_Int32Value_InstrumentRange,10705,Variable\nData_Static_AnalogArray_Int32Value_EngineeringUnits,10706,Variable\nData_Static_AnalogArray_UInt32Value,10707,Variable\nData_Static_AnalogArray_UInt32Value_Definition,10708,Variable\nData_Static_AnalogArray_UInt32Value_ValuePrecision,10709,Variable\nData_Static_AnalogArray_UInt32Value_EURange,10710,Variable\nData_Static_AnalogArray_UInt32Value_InstrumentRange,10711,Variable\nData_Static_AnalogArray_UInt32Value_EngineeringUnits,10712,Variable\nData_Static_AnalogArray_Int64Value,10713,Variable\nData_Static_AnalogArray_Int64Value_Definition,10714,Variable\nData_Static_AnalogArray_Int64Value_ValuePrecision,10715,Variable\nData_Static_AnalogArray_Int64Value_EURange,10716,Variable\nData_Static_AnalogArray_Int64Value_InstrumentRange,10717,Variable\nData_Static_AnalogArray_Int64Value_EngineeringUnits,10718,Variable\nData_Static_AnalogArray_UInt64Value,10719,Variable\nData_Static_AnalogArray_UInt64Value_Definition,10720,Variable\nData_Static_AnalogArray_UInt64Value_ValuePrecision,10721,Variable\nData_Static_AnalogArray_UInt64Value_EURange,10722,Variable\nData_Static_AnalogArray_UInt64Value_InstrumentRange,10723,Variable\nData_Static_AnalogArray_UInt64Value_EngineeringUnits,10724,Variable\nData_Static_AnalogArray_FloatValue,10725,Variable\nData_Static_AnalogArray_FloatValue_Definition,10726,Variable\nData_Static_AnalogArray_FloatValue_ValuePrecision,10727,Variable\nData_Static_AnalogArray_FloatValue_EURange,10728,Variable\nData_Static_AnalogArray_FloatValue_InstrumentRange,10729,Variable\nData_Static_AnalogArray_FloatValue_EngineeringUnits,10730,Variable\nData_Static_AnalogArray_DoubleValue,10731,Variable\nData_Static_AnalogArray_DoubleValue_Definition,10732,Variable\nData_Static_AnalogArray_DoubleValue_ValuePrecision,10733,Variable\nData_Static_AnalogArray_DoubleValue_EURange,10734,Variable\nData_Static_AnalogArray_DoubleValue_InstrumentRange,10735,Variable\nData_Static_AnalogArray_DoubleValue_EngineeringUnits,10736,Variable\nData_Static_AnalogArray_NumberValue,10737,Variable\nData_Static_AnalogArray_NumberValue_Definition,10738,Variable\nData_Static_AnalogArray_NumberValue_ValuePrecision,10739,Variable\nData_Static_AnalogArray_NumberValue_EURange,10740,Variable\nData_Static_AnalogArray_NumberValue_InstrumentRange,10741,Variable\nData_Static_AnalogArray_NumberValue_EngineeringUnits,10742,Variable\nData_Static_AnalogArray_IntegerValue,10743,Variable\nData_Static_AnalogArray_IntegerValue_Definition,10744,Variable\nData_Static_AnalogArray_IntegerValue_ValuePrecision,10745,Variable\nData_Static_AnalogArray_IntegerValue_EURange,10746,Variable\nData_Static_AnalogArray_IntegerValue_InstrumentRange,10747,Variable\nData_Static_AnalogArray_IntegerValue_EngineeringUnits,10748,Variable\nData_Static_AnalogArray_UIntegerValue,10749,Variable\nData_Static_AnalogArray_UIntegerValue_Definition,10750,Variable\nData_Static_AnalogArray_UIntegerValue_ValuePrecision,10751,Variable\nData_Static_AnalogArray_UIntegerValue_EURange,10752,Variable\nData_Static_AnalogArray_UIntegerValue_InstrumentRange,10753,Variable\nData_Static_AnalogArray_UIntegerValue_EngineeringUnits,10754,Variable\nData_Static_MethodTest,10755,Object\nData_Static_MethodTest_ScalarMethod1,10756,Method\nData_Static_MethodTest_ScalarMethod1_InputArguments,10757,Variable\nData_Static_MethodTest_ScalarMethod1_OutputArguments,10758,Variable\nData_Static_MethodTest_ScalarMethod2,10759,Method\nData_Static_MethodTest_ScalarMethod2_InputArguments,10760,Variable\nData_Static_MethodTest_ScalarMethod2_OutputArguments,10761,Variable\nData_Static_MethodTest_ScalarMethod3,10762,Method\nData_Static_MethodTest_ScalarMethod3_InputArguments,10763,Variable\nData_Static_MethodTest_ScalarMethod3_OutputArguments,10764,Variable\nData_Static_MethodTest_ArrayMethod1,10765,Method\nData_Static_MethodTest_ArrayMethod1_InputArguments,10766,Variable\nData_Static_MethodTest_ArrayMethod1_OutputArguments,10767,Variable\nData_Static_MethodTest_ArrayMethod2,10768,Method\nData_Static_MethodTest_ArrayMethod2_InputArguments,10769,Variable\nData_Static_MethodTest_ArrayMethod2_OutputArguments,10770,Variable\nData_Static_MethodTest_ArrayMethod3,10771,Method\nData_Static_MethodTest_ArrayMethod3_InputArguments,10772,Variable\nData_Static_MethodTest_ArrayMethod3_OutputArguments,10773,Variable\nData_Static_MethodTest_UserScalarMethod1,10774,Method\nData_Static_MethodTest_UserScalarMethod1_InputArguments,10775,Variable\nData_Static_MethodTest_UserScalarMethod1_OutputArguments,10776,Variable\nData_Static_MethodTest_UserScalarMethod2,10777,Method\nData_Static_MethodTest_UserScalarMethod2_InputArguments,10778,Variable\nData_Static_MethodTest_UserScalarMethod2_OutputArguments,10779,Variable\nData_Static_MethodTest_UserArrayMethod1,10780,Method\nData_Static_MethodTest_UserArrayMethod1_InputArguments,10781,Variable\nData_Static_MethodTest_UserArrayMethod1_OutputArguments,10782,Variable\nData_Static_MethodTest_UserArrayMethod2,10783,Method\nData_Static_MethodTest_UserArrayMethod2_InputArguments,10784,Variable\nData_Static_MethodTest_UserArrayMethod2_OutputArguments,10785,Variable\nData_Dynamic,10786,Object\nData_Dynamic_Scalar,10787,Object\nData_Dynamic_Scalar_SimulationActive,10788,Variable\nData_Dynamic_Scalar_GenerateValues,10789,Method\nData_Dynamic_Scalar_GenerateValues_InputArguments,10790,Variable\nData_Dynamic_Scalar_CycleComplete,10791,Object\nData_Dynamic_Scalar_CycleComplete_EventId,10792,Variable\nData_Dynamic_Scalar_CycleComplete_EventType,10793,Variable\nData_Dynamic_Scalar_CycleComplete_SourceNode,10794,Variable\nData_Dynamic_Scalar_CycleComplete_SourceName,10795,Variable\nData_Dynamic_Scalar_CycleComplete_Time,10796,Variable\nData_Dynamic_Scalar_CycleComplete_ReceiveTime,10797,Variable\nData_Dynamic_Scalar_CycleComplete_LocalTime,10798,Variable\nData_Dynamic_Scalar_CycleComplete_Message,10799,Variable\nData_Dynamic_Scalar_CycleComplete_Severity,10800,Variable\nData_Dynamic_Scalar_CycleComplete_BranchId,10801,Variable\nData_Dynamic_Scalar_CycleComplete_Retain,10802,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState,10803,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState_Id,10804,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState_Name,10805,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState_Number,10806,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState_EffectiveDisplayName,10807,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState_TransitionTime,10808,Variable\nData_Dynamic_Scalar_CycleComplete_Quality,10809,Variable\nData_Dynamic_Scalar_CycleComplete_Quality_SourceTimestamp,10810,Variable\nData_Dynamic_Scalar_CycleComplete_LastSeverity,10813,Variable\nData_Dynamic_Scalar_CycleComplete_LastSeverity_SourceTimestamp,10814,Variable\nData_Dynamic_Scalar_CycleComplete_Comment,10815,Variable\nData_Dynamic_Scalar_CycleComplete_Comment_SourceTimestamp,10816,Variable\nData_Dynamic_Scalar_CycleComplete_ClientUserId,10817,Variable\nData_Dynamic_Scalar_CycleComplete_Enable,10818,Method\nData_Dynamic_Scalar_CycleComplete_Disable,10819,Method\nData_Dynamic_Scalar_CycleComplete_AddComment,10820,Method\nData_Dynamic_Scalar_CycleComplete_AddComment_InputArguments,10821,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState,10824,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState_Id,10825,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState_Name,10826,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState_Number,10827,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState_EffectiveDisplayName,10828,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState_TransitionTime,10829,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState_TrueState,10830,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState_FalseState,10831,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState,10832,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState_Id,10833,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState_Name,10834,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState_Number,10835,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState_EffectiveDisplayName,10836,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState_TransitionTime,10837,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState_TrueState,10838,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState_FalseState,10839,Variable\nData_Dynamic_Scalar_CycleComplete_Acknowledge,10840,Method\nData_Dynamic_Scalar_CycleComplete_Acknowledge_InputArguments,10841,Variable\nData_Dynamic_Scalar_CycleComplete_Confirm,10842,Method\nData_Dynamic_Scalar_CycleComplete_Confirm_InputArguments,10843,Variable\nData_Dynamic_Scalar_BooleanValue,10844,Variable\nData_Dynamic_Scalar_SByteValue,10845,Variable\nData_Dynamic_Scalar_ByteValue,10846,Variable\nData_Dynamic_Scalar_Int16Value,10847,Variable\nData_Dynamic_Scalar_UInt16Value,10848,Variable\nData_Dynamic_Scalar_Int32Value,10849,Variable\nData_Dynamic_Scalar_UInt32Value,10850,Variable\nData_Dynamic_Scalar_Int64Value,10851,Variable\nData_Dynamic_Scalar_UInt64Value,10852,Variable\nData_Dynamic_Scalar_FloatValue,10853,Variable\nData_Dynamic_Scalar_DoubleValue,10854,Variable\nData_Dynamic_Scalar_StringValue,10855,Variable\nData_Dynamic_Scalar_DateTimeValue,10856,Variable\nData_Dynamic_Scalar_GuidValue,10857,Variable\nData_Dynamic_Scalar_ByteStringValue,10858,Variable\nData_Dynamic_Scalar_XmlElementValue,10859,Variable\nData_Dynamic_Scalar_NodeIdValue,10860,Variable\nData_Dynamic_Scalar_ExpandedNodeIdValue,10861,Variable\nData_Dynamic_Scalar_QualifiedNameValue,10862,Variable\nData_Dynamic_Scalar_LocalizedTextValue,10863,Variable\nData_Dynamic_Scalar_StatusCodeValue,10864,Variable\nData_Dynamic_Scalar_VariantValue,10865,Variable\nData_Dynamic_Scalar_EnumerationValue,10866,Variable\nData_Dynamic_Scalar_StructureValue,10867,Variable\nData_Dynamic_Scalar_NumberValue,10868,Variable\nData_Dynamic_Scalar_IntegerValue,10869,Variable\nData_Dynamic_Scalar_UIntegerValue,10870,Variable\nData_Dynamic_Array,10871,Object\nData_Dynamic_Array_SimulationActive,10872,Variable\nData_Dynamic_Array_GenerateValues,10873,Method\nData_Dynamic_Array_GenerateValues_InputArguments,10874,Variable\nData_Dynamic_Array_CycleComplete,10875,Object\nData_Dynamic_Array_CycleComplete_EventId,10876,Variable\nData_Dynamic_Array_CycleComplete_EventType,10877,Variable\nData_Dynamic_Array_CycleComplete_SourceNode,10878,Variable\nData_Dynamic_Array_CycleComplete_SourceName,10879,Variable\nData_Dynamic_Array_CycleComplete_Time,10880,Variable\nData_Dynamic_Array_CycleComplete_ReceiveTime,10881,Variable\nData_Dynamic_Array_CycleComplete_LocalTime,10882,Variable\nData_Dynamic_Array_CycleComplete_Message,10883,Variable\nData_Dynamic_Array_CycleComplete_Severity,10884,Variable\nData_Dynamic_Array_CycleComplete_BranchId,10885,Variable\nData_Dynamic_Array_CycleComplete_Retain,10886,Variable\nData_Dynamic_Array_CycleComplete_EnabledState,10887,Variable\nData_Dynamic_Array_CycleComplete_EnabledState_Id,10888,Variable\nData_Dynamic_Array_CycleComplete_EnabledState_Name,10889,Variable\nData_Dynamic_Array_CycleComplete_EnabledState_Number,10890,Variable\nData_Dynamic_Array_CycleComplete_EnabledState_EffectiveDisplayName,10891,Variable\nData_Dynamic_Array_CycleComplete_EnabledState_TransitionTime,10892,Variable\nData_Dynamic_Array_CycleComplete_Quality,10893,Variable\nData_Dynamic_Array_CycleComplete_Quality_SourceTimestamp,10894,Variable\nData_Dynamic_Array_CycleComplete_LastSeverity,10897,Variable\nData_Dynamic_Array_CycleComplete_LastSeverity_SourceTimestamp,10898,Variable\nData_Dynamic_Array_CycleComplete_Comment,10899,Variable\nData_Dynamic_Array_CycleComplete_Comment_SourceTimestamp,10900,Variable\nData_Dynamic_Array_CycleComplete_ClientUserId,10901,Variable\nData_Dynamic_Array_CycleComplete_Enable,10902,Method\nData_Dynamic_Array_CycleComplete_Disable,10903,Method\nData_Dynamic_Array_CycleComplete_AddComment,10904,Method\nData_Dynamic_Array_CycleComplete_AddComment_InputArguments,10905,Variable\nData_Dynamic_Array_CycleComplete_AckedState,10908,Variable\nData_Dynamic_Array_CycleComplete_AckedState_Id,10909,Variable\nData_Dynamic_Array_CycleComplete_AckedState_Name,10910,Variable\nData_Dynamic_Array_CycleComplete_AckedState_Number,10911,Variable\nData_Dynamic_Array_CycleComplete_AckedState_EffectiveDisplayName,10912,Variable\nData_Dynamic_Array_CycleComplete_AckedState_TransitionTime,10913,Variable\nData_Dynamic_Array_CycleComplete_AckedState_TrueState,10914,Variable\nData_Dynamic_Array_CycleComplete_AckedState_FalseState,10915,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState,10916,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState_Id,10917,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState_Name,10918,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState_Number,10919,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState_EffectiveDisplayName,10920,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState_TransitionTime,10921,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState_TrueState,10922,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState_FalseState,10923,Variable\nData_Dynamic_Array_CycleComplete_Acknowledge,10924,Method\nData_Dynamic_Array_CycleComplete_Acknowledge_InputArguments,10925,Variable\nData_Dynamic_Array_CycleComplete_Confirm,10926,Method\nData_Dynamic_Array_CycleComplete_Confirm_InputArguments,10927,Variable\nData_Dynamic_Array_BooleanValue,10928,Variable\nData_Dynamic_Array_SByteValue,10929,Variable\nData_Dynamic_Array_ByteValue,10930,Variable\nData_Dynamic_Array_Int16Value,10931,Variable\nData_Dynamic_Array_UInt16Value,10932,Variable\nData_Dynamic_Array_Int32Value,10933,Variable\nData_Dynamic_Array_UInt32Value,10934,Variable\nData_Dynamic_Array_Int64Value,10935,Variable\nData_Dynamic_Array_UInt64Value,10936,Variable\nData_Dynamic_Array_FloatValue,10937,Variable\nData_Dynamic_Array_DoubleValue,10938,Variable\nData_Dynamic_Array_StringValue,10939,Variable\nData_Dynamic_Array_DateTimeValue,10940,Variable\nData_Dynamic_Array_GuidValue,10941,Variable\nData_Dynamic_Array_ByteStringValue,10942,Variable\nData_Dynamic_Array_XmlElementValue,10943,Variable\nData_Dynamic_Array_NodeIdValue,10944,Variable\nData_Dynamic_Array_ExpandedNodeIdValue,10945,Variable\nData_Dynamic_Array_QualifiedNameValue,10946,Variable\nData_Dynamic_Array_LocalizedTextValue,10947,Variable\nData_Dynamic_Array_StatusCodeValue,10948,Variable\nData_Dynamic_Array_VariantValue,10949,Variable\nData_Dynamic_Array_EnumerationValue,10950,Variable\nData_Dynamic_Array_StructureValue,10951,Variable\nData_Dynamic_Array_NumberValue,10952,Variable\nData_Dynamic_Array_IntegerValue,10953,Variable\nData_Dynamic_Array_UIntegerValue,10954,Variable\nData_Dynamic_UserScalar,10955,Object\nData_Dynamic_UserScalar_SimulationActive,10956,Variable\nData_Dynamic_UserScalar_GenerateValues,10957,Method\nData_Dynamic_UserScalar_GenerateValues_InputArguments,10958,Variable\nData_Dynamic_UserScalar_CycleComplete,10959,Object\nData_Dynamic_UserScalar_CycleComplete_EventId,10960,Variable\nData_Dynamic_UserScalar_CycleComplete_EventType,10961,Variable\nData_Dynamic_UserScalar_CycleComplete_SourceNode,10962,Variable\nData_Dynamic_UserScalar_CycleComplete_SourceName,10963,Variable\nData_Dynamic_UserScalar_CycleComplete_Time,10964,Variable\nData_Dynamic_UserScalar_CycleComplete_ReceiveTime,10965,Variable\nData_Dynamic_UserScalar_CycleComplete_LocalTime,10966,Variable\nData_Dynamic_UserScalar_CycleComplete_Message,10967,Variable\nData_Dynamic_UserScalar_CycleComplete_Severity,10968,Variable\nData_Dynamic_UserScalar_CycleComplete_BranchId,10969,Variable\nData_Dynamic_UserScalar_CycleComplete_Retain,10970,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState,10971,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState_Id,10972,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState_Name,10973,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState_Number,10974,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState_EffectiveDisplayName,10975,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState_TransitionTime,10976,Variable\nData_Dynamic_UserScalar_CycleComplete_Quality,10977,Variable\nData_Dynamic_UserScalar_CycleComplete_Quality_SourceTimestamp,10978,Variable\nData_Dynamic_UserScalar_CycleComplete_LastSeverity,10981,Variable\nData_Dynamic_UserScalar_CycleComplete_LastSeverity_SourceTimestamp,10982,Variable\nData_Dynamic_UserScalar_CycleComplete_Comment,10983,Variable\nData_Dynamic_UserScalar_CycleComplete_Comment_SourceTimestamp,10984,Variable\nData_Dynamic_UserScalar_CycleComplete_ClientUserId,10985,Variable\nData_Dynamic_UserScalar_CycleComplete_Enable,10986,Method\nData_Dynamic_UserScalar_CycleComplete_Disable,10987,Method\nData_Dynamic_UserScalar_CycleComplete_AddComment,10988,Method\nData_Dynamic_UserScalar_CycleComplete_AddComment_InputArguments,10989,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState,10992,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState_Id,10993,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState_Name,10994,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState_Number,10995,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState_EffectiveDisplayName,10996,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState_TransitionTime,10997,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState_TrueState,10998,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState_FalseState,10999,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState,11000,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState_Id,11001,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState_Name,11002,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState_Number,11003,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState_EffectiveDisplayName,11004,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState_TransitionTime,11005,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState_TrueState,11006,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState_FalseState,11007,Variable\nData_Dynamic_UserScalar_CycleComplete_Acknowledge,11008,Method\nData_Dynamic_UserScalar_CycleComplete_Acknowledge_InputArguments,11009,Variable\nData_Dynamic_UserScalar_CycleComplete_Confirm,11010,Method\nData_Dynamic_UserScalar_CycleComplete_Confirm_InputArguments,11011,Variable\nData_Dynamic_UserScalar_BooleanValue,11012,Variable\nData_Dynamic_UserScalar_SByteValue,11013,Variable\nData_Dynamic_UserScalar_ByteValue,11014,Variable\nData_Dynamic_UserScalar_Int16Value,11015,Variable\nData_Dynamic_UserScalar_UInt16Value,11016,Variable\nData_Dynamic_UserScalar_Int32Value,11017,Variable\nData_Dynamic_UserScalar_UInt32Value,11018,Variable\nData_Dynamic_UserScalar_Int64Value,11019,Variable\nData_Dynamic_UserScalar_UInt64Value,11020,Variable\nData_Dynamic_UserScalar_FloatValue,11021,Variable\nData_Dynamic_UserScalar_DoubleValue,11022,Variable\nData_Dynamic_UserScalar_StringValue,11023,Variable\nData_Dynamic_UserScalar_DateTimeValue,11024,Variable\nData_Dynamic_UserScalar_GuidValue,11025,Variable\nData_Dynamic_UserScalar_ByteStringValue,11026,Variable\nData_Dynamic_UserScalar_XmlElementValue,11027,Variable\nData_Dynamic_UserScalar_NodeIdValue,11028,Variable\nData_Dynamic_UserScalar_ExpandedNodeIdValue,11029,Variable\nData_Dynamic_UserScalar_QualifiedNameValue,11030,Variable\nData_Dynamic_UserScalar_LocalizedTextValue,11031,Variable\nData_Dynamic_UserScalar_StatusCodeValue,11032,Variable\nData_Dynamic_UserScalar_VariantValue,11033,Variable\nData_Dynamic_UserArray,11034,Object\nData_Dynamic_UserArray_SimulationActive,11035,Variable\nData_Dynamic_UserArray_GenerateValues,11036,Method\nData_Dynamic_UserArray_GenerateValues_InputArguments,11037,Variable\nData_Dynamic_UserArray_CycleComplete,11038,Object\nData_Dynamic_UserArray_CycleComplete_EventId,11039,Variable\nData_Dynamic_UserArray_CycleComplete_EventType,11040,Variable\nData_Dynamic_UserArray_CycleComplete_SourceNode,11041,Variable\nData_Dynamic_UserArray_CycleComplete_SourceName,11042,Variable\nData_Dynamic_UserArray_CycleComplete_Time,11043,Variable\nData_Dynamic_UserArray_CycleComplete_ReceiveTime,11044,Variable\nData_Dynamic_UserArray_CycleComplete_LocalTime,11045,Variable\nData_Dynamic_UserArray_CycleComplete_Message,11046,Variable\nData_Dynamic_UserArray_CycleComplete_Severity,11047,Variable\nData_Dynamic_UserArray_CycleComplete_BranchId,11048,Variable\nData_Dynamic_UserArray_CycleComplete_Retain,11049,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState,11050,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState_Id,11051,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState_Name,11052,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState_Number,11053,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState_EffectiveDisplayName,11054,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState_TransitionTime,11055,Variable\nData_Dynamic_UserArray_CycleComplete_Quality,11056,Variable\nData_Dynamic_UserArray_CycleComplete_Quality_SourceTimestamp,11057,Variable\nData_Dynamic_UserArray_CycleComplete_LastSeverity,11060,Variable\nData_Dynamic_UserArray_CycleComplete_LastSeverity_SourceTimestamp,11061,Variable\nData_Dynamic_UserArray_CycleComplete_Comment,11062,Variable\nData_Dynamic_UserArray_CycleComplete_Comment_SourceTimestamp,11063,Variable\nData_Dynamic_UserArray_CycleComplete_ClientUserId,11064,Variable\nData_Dynamic_UserArray_CycleComplete_Enable,11065,Method\nData_Dynamic_UserArray_CycleComplete_Disable,11066,Method\nData_Dynamic_UserArray_CycleComplete_AddComment,11067,Method\nData_Dynamic_UserArray_CycleComplete_AddComment_InputArguments,11068,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState,11071,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState_Id,11072,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState_Name,11073,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState_Number,11074,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState_EffectiveDisplayName,11075,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState_TransitionTime,11076,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState_TrueState,11077,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState_FalseState,11078,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState,11079,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState_Id,11080,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState_Name,11081,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState_Number,11082,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState_EffectiveDisplayName,11083,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState_TransitionTime,11084,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState_TrueState,11085,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState_FalseState,11086,Variable\nData_Dynamic_UserArray_CycleComplete_Acknowledge,11087,Method\nData_Dynamic_UserArray_CycleComplete_Acknowledge_InputArguments,11088,Variable\nData_Dynamic_UserArray_CycleComplete_Confirm,11089,Method\nData_Dynamic_UserArray_CycleComplete_Confirm_InputArguments,11090,Variable\nData_Dynamic_UserArray_BooleanValue,11091,Variable\nData_Dynamic_UserArray_SByteValue,11092,Variable\nData_Dynamic_UserArray_ByteValue,11093,Variable\nData_Dynamic_UserArray_Int16Value,11094,Variable\nData_Dynamic_UserArray_UInt16Value,11095,Variable\nData_Dynamic_UserArray_Int32Value,11096,Variable\nData_Dynamic_UserArray_UInt32Value,11097,Variable\nData_Dynamic_UserArray_Int64Value,11098,Variable\nData_Dynamic_UserArray_UInt64Value,11099,Variable\nData_Dynamic_UserArray_FloatValue,11100,Variable\nData_Dynamic_UserArray_DoubleValue,11101,Variable\nData_Dynamic_UserArray_StringValue,11102,Variable\nData_Dynamic_UserArray_DateTimeValue,11103,Variable\nData_Dynamic_UserArray_GuidValue,11104,Variable\nData_Dynamic_UserArray_ByteStringValue,11105,Variable\nData_Dynamic_UserArray_XmlElementValue,11106,Variable\nData_Dynamic_UserArray_NodeIdValue,11107,Variable\nData_Dynamic_UserArray_ExpandedNodeIdValue,11108,Variable\nData_Dynamic_UserArray_QualifiedNameValue,11109,Variable\nData_Dynamic_UserArray_LocalizedTextValue,11110,Variable\nData_Dynamic_UserArray_StatusCodeValue,11111,Variable\nData_Dynamic_UserArray_VariantValue,11112,Variable\nData_Dynamic_AnalogScalar,11113,Object\nData_Dynamic_AnalogScalar_SimulationActive,11114,Variable\nData_Dynamic_AnalogScalar_GenerateValues,11115,Method\nData_Dynamic_AnalogScalar_GenerateValues_InputArguments,11116,Variable\nData_Dynamic_AnalogScalar_CycleComplete,11117,Object\nData_Dynamic_AnalogScalar_CycleComplete_EventId,11118,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EventType,11119,Variable\nData_Dynamic_AnalogScalar_CycleComplete_SourceNode,11120,Variable\nData_Dynamic_AnalogScalar_CycleComplete_SourceName,11121,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Time,11122,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ReceiveTime,11123,Variable\nData_Dynamic_AnalogScalar_CycleComplete_LocalTime,11124,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Message,11125,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Severity,11126,Variable\nData_Dynamic_AnalogScalar_CycleComplete_BranchId,11127,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Retain,11128,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState,11129,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState_Id,11130,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState_Name,11131,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState_Number,11132,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState_EffectiveDisplayName,11133,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState_TransitionTime,11134,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Quality,11135,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Quality_SourceTimestamp,11136,Variable\nData_Dynamic_AnalogScalar_CycleComplete_LastSeverity,11139,Variable\nData_Dynamic_AnalogScalar_CycleComplete_LastSeverity_SourceTimestamp,11140,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Comment,11141,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Comment_SourceTimestamp,11142,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ClientUserId,11143,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Enable,11144,Method\nData_Dynamic_AnalogScalar_CycleComplete_Disable,11145,Method\nData_Dynamic_AnalogScalar_CycleComplete_AddComment,11146,Method\nData_Dynamic_AnalogScalar_CycleComplete_AddComment_InputArguments,11147,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState,11150,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState_Id,11151,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState_Name,11152,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState_Number,11153,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState_EffectiveDisplayName,11154,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState_TransitionTime,11155,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState_TrueState,11156,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState_FalseState,11157,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState,11158,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_Id,11159,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_Name,11160,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_Number,11161,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_EffectiveDisplayName,11162,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_TransitionTime,11163,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_TrueState,11164,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_FalseState,11165,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Acknowledge,11166,Method\nData_Dynamic_AnalogScalar_CycleComplete_Acknowledge_InputArguments,11167,Variable\nData_Dynamic_AnalogScalar_CycleComplete_Confirm,11168,Method\nData_Dynamic_AnalogScalar_CycleComplete_Confirm_InputArguments,11169,Variable\nData_Dynamic_AnalogScalar_SByteValue,11170,Variable\nData_Dynamic_AnalogScalar_SByteValue_Definition,11171,Variable\nData_Dynamic_AnalogScalar_SByteValue_ValuePrecision,11172,Variable\nData_Dynamic_AnalogScalar_SByteValue_EURange,11173,Variable\nData_Dynamic_AnalogScalar_SByteValue_InstrumentRange,11174,Variable\nData_Dynamic_AnalogScalar_SByteValue_EngineeringUnits,11175,Variable\nData_Dynamic_AnalogScalar_ByteValue,11176,Variable\nData_Dynamic_AnalogScalar_ByteValue_Definition,11177,Variable\nData_Dynamic_AnalogScalar_ByteValue_ValuePrecision,11178,Variable\nData_Dynamic_AnalogScalar_ByteValue_EURange,11179,Variable\nData_Dynamic_AnalogScalar_ByteValue_InstrumentRange,11180,Variable\nData_Dynamic_AnalogScalar_ByteValue_EngineeringUnits,11181,Variable\nData_Dynamic_AnalogScalar_Int16Value,11182,Variable\nData_Dynamic_AnalogScalar_Int16Value_Definition,11183,Variable\nData_Dynamic_AnalogScalar_Int16Value_ValuePrecision,11184,Variable\nData_Dynamic_AnalogScalar_Int16Value_EURange,11185,Variable\nData_Dynamic_AnalogScalar_Int16Value_InstrumentRange,11186,Variable\nData_Dynamic_AnalogScalar_Int16Value_EngineeringUnits,11187,Variable\nData_Dynamic_AnalogScalar_UInt16Value,11188,Variable\nData_Dynamic_AnalogScalar_UInt16Value_Definition,11189,Variable\nData_Dynamic_AnalogScalar_UInt16Value_ValuePrecision,11190,Variable\nData_Dynamic_AnalogScalar_UInt16Value_EURange,11191,Variable\nData_Dynamic_AnalogScalar_UInt16Value_InstrumentRange,11192,Variable\nData_Dynamic_AnalogScalar_UInt16Value_EngineeringUnits,11193,Variable\nData_Dynamic_AnalogScalar_Int32Value,11194,Variable\nData_Dynamic_AnalogScalar_Int32Value_Definition,11195,Variable\nData_Dynamic_AnalogScalar_Int32Value_ValuePrecision,11196,Variable\nData_Dynamic_AnalogScalar_Int32Value_EURange,11197,Variable\nData_Dynamic_AnalogScalar_Int32Value_InstrumentRange,11198,Variable\nData_Dynamic_AnalogScalar_Int32Value_EngineeringUnits,11199,Variable\nData_Dynamic_AnalogScalar_UInt32Value,11200,Variable\nData_Dynamic_AnalogScalar_UInt32Value_Definition,11201,Variable\nData_Dynamic_AnalogScalar_UInt32Value_ValuePrecision,11202,Variable\nData_Dynamic_AnalogScalar_UInt32Value_EURange,11203,Variable\nData_Dynamic_AnalogScalar_UInt32Value_InstrumentRange,11204,Variable\nData_Dynamic_AnalogScalar_UInt32Value_EngineeringUnits,11205,Variable\nData_Dynamic_AnalogScalar_Int64Value,11206,Variable\nData_Dynamic_AnalogScalar_Int64Value_Definition,11207,Variable\nData_Dynamic_AnalogScalar_Int64Value_ValuePrecision,11208,Variable\nData_Dynamic_AnalogScalar_Int64Value_EURange,11209,Variable\nData_Dynamic_AnalogScalar_Int64Value_InstrumentRange,11210,Variable\nData_Dynamic_AnalogScalar_Int64Value_EngineeringUnits,11211,Variable\nData_Dynamic_AnalogScalar_UInt64Value,11212,Variable\nData_Dynamic_AnalogScalar_UInt64Value_Definition,11213,Variable\nData_Dynamic_AnalogScalar_UInt64Value_ValuePrecision,11214,Variable\nData_Dynamic_AnalogScalar_UInt64Value_EURange,11215,Variable\nData_Dynamic_AnalogScalar_UInt64Value_InstrumentRange,11216,Variable\nData_Dynamic_AnalogScalar_UInt64Value_EngineeringUnits,11217,Variable\nData_Dynamic_AnalogScalar_FloatValue,11218,Variable\nData_Dynamic_AnalogScalar_FloatValue_Definition,11219,Variable\nData_Dynamic_AnalogScalar_FloatValue_ValuePrecision,11220,Variable\nData_Dynamic_AnalogScalar_FloatValue_EURange,11221,Variable\nData_Dynamic_AnalogScalar_FloatValue_InstrumentRange,11222,Variable\nData_Dynamic_AnalogScalar_FloatValue_EngineeringUnits,11223,Variable\nData_Dynamic_AnalogScalar_DoubleValue,11224,Variable\nData_Dynamic_AnalogScalar_DoubleValue_Definition,11225,Variable\nData_Dynamic_AnalogScalar_DoubleValue_ValuePrecision,11226,Variable\nData_Dynamic_AnalogScalar_DoubleValue_EURange,11227,Variable\nData_Dynamic_AnalogScalar_DoubleValue_InstrumentRange,11228,Variable\nData_Dynamic_AnalogScalar_DoubleValue_EngineeringUnits,11229,Variable\nData_Dynamic_AnalogScalar_NumberValue,11230,Variable\nData_Dynamic_AnalogScalar_NumberValue_Definition,11231,Variable\nData_Dynamic_AnalogScalar_NumberValue_ValuePrecision,11232,Variable\nData_Dynamic_AnalogScalar_NumberValue_EURange,11233,Variable\nData_Dynamic_AnalogScalar_NumberValue_InstrumentRange,11234,Variable\nData_Dynamic_AnalogScalar_NumberValue_EngineeringUnits,11235,Variable\nData_Dynamic_AnalogScalar_IntegerValue,11236,Variable\nData_Dynamic_AnalogScalar_IntegerValue_Definition,11237,Variable\nData_Dynamic_AnalogScalar_IntegerValue_ValuePrecision,11238,Variable\nData_Dynamic_AnalogScalar_IntegerValue_EURange,11239,Variable\nData_Dynamic_AnalogScalar_IntegerValue_InstrumentRange,11240,Variable\nData_Dynamic_AnalogScalar_IntegerValue_EngineeringUnits,11241,Variable\nData_Dynamic_AnalogScalar_UIntegerValue,11242,Variable\nData_Dynamic_AnalogScalar_UIntegerValue_Definition,11243,Variable\nData_Dynamic_AnalogScalar_UIntegerValue_ValuePrecision,11244,Variable\nData_Dynamic_AnalogScalar_UIntegerValue_EURange,11245,Variable\nData_Dynamic_AnalogScalar_UIntegerValue_InstrumentRange,11246,Variable\nData_Dynamic_AnalogScalar_UIntegerValue_EngineeringUnits,11247,Variable\nData_Dynamic_AnalogArray,11248,Object\nData_Dynamic_AnalogArray_SimulationActive,11249,Variable\nData_Dynamic_AnalogArray_GenerateValues,11250,Method\nData_Dynamic_AnalogArray_GenerateValues_InputArguments,11251,Variable\nData_Dynamic_AnalogArray_CycleComplete,11252,Object\nData_Dynamic_AnalogArray_CycleComplete_EventId,11253,Variable\nData_Dynamic_AnalogArray_CycleComplete_EventType,11254,Variable\nData_Dynamic_AnalogArray_CycleComplete_SourceNode,11255,Variable\nData_Dynamic_AnalogArray_CycleComplete_SourceName,11256,Variable\nData_Dynamic_AnalogArray_CycleComplete_Time,11257,Variable\nData_Dynamic_AnalogArray_CycleComplete_ReceiveTime,11258,Variable\nData_Dynamic_AnalogArray_CycleComplete_LocalTime,11259,Variable\nData_Dynamic_AnalogArray_CycleComplete_Message,11260,Variable\nData_Dynamic_AnalogArray_CycleComplete_Severity,11261,Variable\nData_Dynamic_AnalogArray_CycleComplete_BranchId,11262,Variable\nData_Dynamic_AnalogArray_CycleComplete_Retain,11263,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState,11264,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState_Id,11265,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState_Name,11266,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState_Number,11267,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState_EffectiveDisplayName,11268,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState_TransitionTime,11269,Variable\nData_Dynamic_AnalogArray_CycleComplete_Quality,11270,Variable\nData_Dynamic_AnalogArray_CycleComplete_Quality_SourceTimestamp,11271,Variable\nData_Dynamic_AnalogArray_CycleComplete_LastSeverity,11274,Variable\nData_Dynamic_AnalogArray_CycleComplete_LastSeverity_SourceTimestamp,11275,Variable\nData_Dynamic_AnalogArray_CycleComplete_Comment,11276,Variable\nData_Dynamic_AnalogArray_CycleComplete_Comment_SourceTimestamp,11277,Variable\nData_Dynamic_AnalogArray_CycleComplete_ClientUserId,11278,Variable\nData_Dynamic_AnalogArray_CycleComplete_Enable,11279,Method\nData_Dynamic_AnalogArray_CycleComplete_Disable,11280,Method\nData_Dynamic_AnalogArray_CycleComplete_AddComment,11281,Method\nData_Dynamic_AnalogArray_CycleComplete_AddComment_InputArguments,11282,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState,11285,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState_Id,11286,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState_Name,11287,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState_Number,11288,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState_EffectiveDisplayName,11289,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState_TransitionTime,11290,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState_TrueState,11291,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState_FalseState,11292,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState,11293,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState_Id,11294,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState_Name,11295,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState_Number,11296,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState_EffectiveDisplayName,11297,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState_TransitionTime,11298,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState_TrueState,11299,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState_FalseState,11300,Variable\nData_Dynamic_AnalogArray_CycleComplete_Acknowledge,11301,Method\nData_Dynamic_AnalogArray_CycleComplete_Acknowledge_InputArguments,11302,Variable\nData_Dynamic_AnalogArray_CycleComplete_Confirm,11303,Method\nData_Dynamic_AnalogArray_CycleComplete_Confirm_InputArguments,11304,Variable\nData_Dynamic_AnalogArray_SByteValue,11305,Variable\nData_Dynamic_AnalogArray_SByteValue_Definition,11306,Variable\nData_Dynamic_AnalogArray_SByteValue_ValuePrecision,11307,Variable\nData_Dynamic_AnalogArray_SByteValue_EURange,11308,Variable\nData_Dynamic_AnalogArray_SByteValue_InstrumentRange,11309,Variable\nData_Dynamic_AnalogArray_SByteValue_EngineeringUnits,11310,Variable\nData_Dynamic_AnalogArray_ByteValue,11311,Variable\nData_Dynamic_AnalogArray_ByteValue_Definition,11312,Variable\nData_Dynamic_AnalogArray_ByteValue_ValuePrecision,11313,Variable\nData_Dynamic_AnalogArray_ByteValue_EURange,11314,Variable\nData_Dynamic_AnalogArray_ByteValue_InstrumentRange,11315,Variable\nData_Dynamic_AnalogArray_ByteValue_EngineeringUnits,11316,Variable\nData_Dynamic_AnalogArray_Int16Value,11317,Variable\nData_Dynamic_AnalogArray_Int16Value_Definition,11318,Variable\nData_Dynamic_AnalogArray_Int16Value_ValuePrecision,11319,Variable\nData_Dynamic_AnalogArray_Int16Value_EURange,11320,Variable\nData_Dynamic_AnalogArray_Int16Value_InstrumentRange,11321,Variable\nData_Dynamic_AnalogArray_Int16Value_EngineeringUnits,11322,Variable\nData_Dynamic_AnalogArray_UInt16Value,11323,Variable\nData_Dynamic_AnalogArray_UInt16Value_Definition,11324,Variable\nData_Dynamic_AnalogArray_UInt16Value_ValuePrecision,11325,Variable\nData_Dynamic_AnalogArray_UInt16Value_EURange,11326,Variable\nData_Dynamic_AnalogArray_UInt16Value_InstrumentRange,11327,Variable\nData_Dynamic_AnalogArray_UInt16Value_EngineeringUnits,11328,Variable\nData_Dynamic_AnalogArray_Int32Value,11329,Variable\nData_Dynamic_AnalogArray_Int32Value_Definition,11330,Variable\nData_Dynamic_AnalogArray_Int32Value_ValuePrecision,11331,Variable\nData_Dynamic_AnalogArray_Int32Value_EURange,11332,Variable\nData_Dynamic_AnalogArray_Int32Value_InstrumentRange,11333,Variable\nData_Dynamic_AnalogArray_Int32Value_EngineeringUnits,11334,Variable\nData_Dynamic_AnalogArray_UInt32Value,11335,Variable\nData_Dynamic_AnalogArray_UInt32Value_Definition,11336,Variable\nData_Dynamic_AnalogArray_UInt32Value_ValuePrecision,11337,Variable\nData_Dynamic_AnalogArray_UInt32Value_EURange,11338,Variable\nData_Dynamic_AnalogArray_UInt32Value_InstrumentRange,11339,Variable\nData_Dynamic_AnalogArray_UInt32Value_EngineeringUnits,11340,Variable\nData_Dynamic_AnalogArray_Int64Value,11341,Variable\nData_Dynamic_AnalogArray_Int64Value_Definition,11342,Variable\nData_Dynamic_AnalogArray_Int64Value_ValuePrecision,11343,Variable\nData_Dynamic_AnalogArray_Int64Value_EURange,11344,Variable\nData_Dynamic_AnalogArray_Int64Value_InstrumentRange,11345,Variable\nData_Dynamic_AnalogArray_Int64Value_EngineeringUnits,11346,Variable\nData_Dynamic_AnalogArray_UInt64Value,11347,Variable\nData_Dynamic_AnalogArray_UInt64Value_Definition,11348,Variable\nData_Dynamic_AnalogArray_UInt64Value_ValuePrecision,11349,Variable\nData_Dynamic_AnalogArray_UInt64Value_EURange,11350,Variable\nData_Dynamic_AnalogArray_UInt64Value_InstrumentRange,11351,Variable\nData_Dynamic_AnalogArray_UInt64Value_EngineeringUnits,11352,Variable\nData_Dynamic_AnalogArray_FloatValue,11353,Variable\nData_Dynamic_AnalogArray_FloatValue_Definition,11354,Variable\nData_Dynamic_AnalogArray_FloatValue_ValuePrecision,11355,Variable\nData_Dynamic_AnalogArray_FloatValue_EURange,11356,Variable\nData_Dynamic_AnalogArray_FloatValue_InstrumentRange,11357,Variable\nData_Dynamic_AnalogArray_FloatValue_EngineeringUnits,11358,Variable\nData_Dynamic_AnalogArray_DoubleValue,11359,Variable\nData_Dynamic_AnalogArray_DoubleValue_Definition,11360,Variable\nData_Dynamic_AnalogArray_DoubleValue_ValuePrecision,11361,Variable\nData_Dynamic_AnalogArray_DoubleValue_EURange,11362,Variable\nData_Dynamic_AnalogArray_DoubleValue_InstrumentRange,11363,Variable\nData_Dynamic_AnalogArray_DoubleValue_EngineeringUnits,11364,Variable\nData_Dynamic_AnalogArray_NumberValue,11365,Variable\nData_Dynamic_AnalogArray_NumberValue_Definition,11366,Variable\nData_Dynamic_AnalogArray_NumberValue_ValuePrecision,11367,Variable\nData_Dynamic_AnalogArray_NumberValue_EURange,11368,Variable\nData_Dynamic_AnalogArray_NumberValue_InstrumentRange,11369,Variable\nData_Dynamic_AnalogArray_NumberValue_EngineeringUnits,11370,Variable\nData_Dynamic_AnalogArray_IntegerValue,11371,Variable\nData_Dynamic_AnalogArray_IntegerValue_Definition,11372,Variable\nData_Dynamic_AnalogArray_IntegerValue_ValuePrecision,11373,Variable\nData_Dynamic_AnalogArray_IntegerValue_EURange,11374,Variable\nData_Dynamic_AnalogArray_IntegerValue_InstrumentRange,11375,Variable\nData_Dynamic_AnalogArray_IntegerValue_EngineeringUnits,11376,Variable\nData_Dynamic_AnalogArray_UIntegerValue,11377,Variable\nData_Dynamic_AnalogArray_UIntegerValue_Definition,11378,Variable\nData_Dynamic_AnalogArray_UIntegerValue_ValuePrecision,11379,Variable\nData_Dynamic_AnalogArray_UIntegerValue_EURange,11380,Variable\nData_Dynamic_AnalogArray_UIntegerValue_InstrumentRange,11381,Variable\nData_Dynamic_AnalogArray_UIntegerValue_EngineeringUnits,11382,Variable\nData_Conditions,11383,Object\nData_Conditions_SystemStatus,11384,Object\nData_Conditions_SystemStatus_EventId,11385,Variable\nData_Conditions_SystemStatus_EventType,11386,Variable\nData_Conditions_SystemStatus_SourceNode,11387,Variable\nData_Conditions_SystemStatus_SourceName,11388,Variable\nData_Conditions_SystemStatus_Time,11389,Variable\nData_Conditions_SystemStatus_ReceiveTime,11390,Variable\nData_Conditions_SystemStatus_LocalTime,11391,Variable\nData_Conditions_SystemStatus_Message,11392,Variable\nData_Conditions_SystemStatus_Severity,11393,Variable\nData_Conditions_SystemStatus_BranchId,11394,Variable\nData_Conditions_SystemStatus_Retain,11395,Variable\nData_Conditions_SystemStatus_EnabledState,11396,Variable\nData_Conditions_SystemStatus_EnabledState_Id,11397,Variable\nData_Conditions_SystemStatus_EnabledState_Name,11398,Variable\nData_Conditions_SystemStatus_EnabledState_Number,11399,Variable\nData_Conditions_SystemStatus_EnabledState_EffectiveDisplayName,11400,Variable\nData_Conditions_SystemStatus_EnabledState_TransitionTime,11401,Variable\nData_Conditions_SystemStatus_Quality,11402,Variable\nData_Conditions_SystemStatus_Quality_SourceTimestamp,11403,Variable\nData_Conditions_SystemStatus_LastSeverity,11406,Variable\nData_Conditions_SystemStatus_LastSeverity_SourceTimestamp,11407,Variable\nData_Conditions_SystemStatus_Comment,11408,Variable\nData_Conditions_SystemStatus_Comment_SourceTimestamp,11409,Variable\nData_Conditions_SystemStatus_ClientUserId,11410,Variable\nData_Conditions_SystemStatus_Enable,11411,Method\nData_Conditions_SystemStatus_Disable,11412,Method\nData_Conditions_SystemStatus_AddComment,11413,Method\nData_Conditions_SystemStatus_AddComment_InputArguments,11414,Variable\nData_Conditions_SystemStatus_MonitoredNodeCount,11417,Variable\nScalarValueDataType_Encoding_DefaultXml,11418,Object\nArrayValueDataType_Encoding_DefaultXml,11419,Object\nUserScalarValueDataType_Encoding_DefaultXml,11420,Object\nUserArrayValueDataType_Encoding_DefaultXml,11421,Object\nTestData_BinarySchema,11422,Variable\nTestData_BinarySchema_DataTypeVersion,11423,Variable\nTestData_BinarySchema_NamespaceUri,11424,Variable\nTestData_BinarySchema_ScalarValueDataType,11425,Variable\nTestData_BinarySchema_ScalarValueDataType_DataTypeVersion,11426,Variable\nTestData_BinarySchema_ScalarValueDataType_DictionaryFragment,11427,Variable\nTestData_BinarySchema_ArrayValueDataType,11428,Variable\nTestData_BinarySchema_ArrayValueDataType_DataTypeVersion,11429,Variable\nTestData_BinarySchema_ArrayValueDataType_DictionaryFragment,11430,Variable\nTestData_BinarySchema_UserScalarValueDataType,11431,Variable\nTestData_BinarySchema_UserScalarValueDataType_DataTypeVersion,11432,Variable\nTestData_BinarySchema_UserScalarValueDataType_DictionaryFragment,11433,Variable\nTestData_BinarySchema_UserArrayValueDataType,11434,Variable\nTestData_BinarySchema_UserArrayValueDataType_DataTypeVersion,11435,Variable\nTestData_BinarySchema_UserArrayValueDataType_DictionaryFragment,11436,Variable\nScalarValueDataType_Encoding_DefaultBinary,11437,Object\nArrayValueDataType_Encoding_DefaultBinary,11438,Object\nUserScalarValueDataType_Encoding_DefaultBinary,11439,Object\nUserArrayValueDataType_Encoding_DefaultBinary,11440,Object\nTestData_XmlSchema,11441,Variable\nTestData_XmlSchema_DataTypeVersion,11442,Variable\nTestData_XmlSchema_NamespaceUri,11443,Variable\nTestData_XmlSchema_ScalarValueDataType,11444,Variable\nTestData_XmlSchema_ScalarValueDataType_DataTypeVersion,11445,Variable\nTestData_XmlSchema_ScalarValueDataType_DictionaryFragment,11446,Variable\nTestData_XmlSchema_ArrayValueDataType,11447,Variable\nTestData_XmlSchema_ArrayValueDataType_DataTypeVersion,11448,Variable\nTestData_XmlSchema_ArrayValueDataType_DictionaryFragment,11449,Variable\nTestData_XmlSchema_UserScalarValueDataType,11450,Variable\nTestData_XmlSchema_UserScalarValueDataType_DataTypeVersion,11451,Variable\nTestData_XmlSchema_UserScalarValueDataType_DictionaryFragment,11452,Variable\nTestData_XmlSchema_UserArrayValueDataType,11453,Variable\nTestData_XmlSchema_UserArrayValueDataType_DataTypeVersion,11454,Variable\nTestData_XmlSchema_UserArrayValueDataType_DictionaryFragment,11455,Variable\nTestDataObjectType_CycleComplete_EnabledState_EffectiveTransitionTime,11456,Variable\nTestDataObjectType_CycleComplete_EnabledState_TrueState,11457,Variable\nTestDataObjectType_CycleComplete_EnabledState_FalseState,11458,Variable\nTestDataObjectType_CycleComplete_AckedState_EffectiveTransitionTime,11459,Variable\nTestDataObjectType_CycleComplete_ConfirmedState_EffectiveTransitionTime,11460,Variable\nScalarValueObjectType_CycleComplete_EnabledState_EffectiveTransitionTime,11461,Variable\nScalarValueObjectType_CycleComplete_EnabledState_TrueState,11462,Variable\nScalarValueObjectType_CycleComplete_EnabledState_FalseState,11463,Variable\nScalarValueObjectType_CycleComplete_AckedState_EffectiveTransitionTime,11464,Variable\nScalarValueObjectType_CycleComplete_ConfirmedState_EffectiveTransitionTime,11465,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState_EffectiveTransitionTime,11466,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState_TrueState,11467,Variable\nAnalogScalarValueObjectType_CycleComplete_EnabledState_FalseState,11468,Variable\nAnalogScalarValueObjectType_CycleComplete_AckedState_EffectiveTransitionTime,11469,Variable\nAnalogScalarValueObjectType_CycleComplete_ConfirmedState_EffectiveTransitionTime,11470,Variable\nArrayValueObjectType_CycleComplete_EnabledState_EffectiveTransitionTime,11471,Variable\nArrayValueObjectType_CycleComplete_EnabledState_TrueState,11472,Variable\nArrayValueObjectType_CycleComplete_EnabledState_FalseState,11473,Variable\nArrayValueObjectType_CycleComplete_AckedState_EffectiveTransitionTime,11474,Variable\nArrayValueObjectType_CycleComplete_ConfirmedState_EffectiveTransitionTime,11475,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState_EffectiveTransitionTime,11476,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState_TrueState,11477,Variable\nAnalogArrayValueObjectType_CycleComplete_EnabledState_FalseState,11478,Variable\nAnalogArrayValueObjectType_CycleComplete_AckedState_EffectiveTransitionTime,11479,Variable\nAnalogArrayValueObjectType_CycleComplete_ConfirmedState_EffectiveTransitionTime,11480,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState_EffectiveTransitionTime,11481,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState_TrueState,11482,Variable\nUserScalarValueObjectType_CycleComplete_EnabledState_FalseState,11483,Variable\nUserScalarValueObjectType_CycleComplete_AckedState_EffectiveTransitionTime,11484,Variable\nUserScalarValueObjectType_CycleComplete_ConfirmedState_EffectiveTransitionTime,11485,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState_EffectiveTransitionTime,11486,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState_TrueState,11487,Variable\nUserArrayValueObjectType_CycleComplete_EnabledState_FalseState,11488,Variable\nUserArrayValueObjectType_CycleComplete_AckedState_EffectiveTransitionTime,11489,Variable\nUserArrayValueObjectType_CycleComplete_ConfirmedState_EffectiveTransitionTime,11490,Variable\nTestSystemConditionType_EnabledState_EffectiveTransitionTime,11491,Variable\nTestSystemConditionType_EnabledState_TrueState,11492,Variable\nTestSystemConditionType_EnabledState_FalseState,11493,Variable\nData_Static_Scalar_CycleComplete_EnabledState_EffectiveTransitionTime,11494,Variable\nData_Static_Scalar_CycleComplete_EnabledState_TrueState,11495,Variable\nData_Static_Scalar_CycleComplete_EnabledState_FalseState,11496,Variable\nData_Static_Scalar_CycleComplete_AckedState_EffectiveTransitionTime,11497,Variable\nData_Static_Scalar_CycleComplete_ConfirmedState_EffectiveTransitionTime,11498,Variable\nData_Static_Array_CycleComplete_EnabledState_EffectiveTransitionTime,11499,Variable\nData_Static_Array_CycleComplete_EnabledState_TrueState,11500,Variable\nData_Static_Array_CycleComplete_EnabledState_FalseState,11501,Variable\nData_Static_Array_CycleComplete_AckedState_EffectiveTransitionTime,11502,Variable\nData_Static_Array_CycleComplete_ConfirmedState_EffectiveTransitionTime,11503,Variable\nData_Static_UserScalar_CycleComplete_EnabledState_EffectiveTransitionTime,11504,Variable\nData_Static_UserScalar_CycleComplete_EnabledState_TrueState,11505,Variable\nData_Static_UserScalar_CycleComplete_EnabledState_FalseState,11506,Variable\nData_Static_UserScalar_CycleComplete_AckedState_EffectiveTransitionTime,11507,Variable\nData_Static_UserScalar_CycleComplete_ConfirmedState_EffectiveTransitionTime,11508,Variable\nData_Static_UserArray_CycleComplete_EnabledState_EffectiveTransitionTime,11509,Variable\nData_Static_UserArray_CycleComplete_EnabledState_TrueState,11510,Variable\nData_Static_UserArray_CycleComplete_EnabledState_FalseState,11511,Variable\nData_Static_UserArray_CycleComplete_AckedState_EffectiveTransitionTime,11512,Variable\nData_Static_UserArray_CycleComplete_ConfirmedState_EffectiveTransitionTime,11513,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState_EffectiveTransitionTime,11514,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState_TrueState,11515,Variable\nData_Static_AnalogScalar_CycleComplete_EnabledState_FalseState,11516,Variable\nData_Static_AnalogScalar_CycleComplete_AckedState_EffectiveTransitionTime,11517,Variable\nData_Static_AnalogScalar_CycleComplete_ConfirmedState_EffectiveTransitionTime,11518,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState_EffectiveTransitionTime,11519,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState_TrueState,11520,Variable\nData_Static_AnalogArray_CycleComplete_EnabledState_FalseState,11521,Variable\nData_Static_AnalogArray_CycleComplete_AckedState_EffectiveTransitionTime,11522,Variable\nData_Static_AnalogArray_CycleComplete_ConfirmedState_EffectiveTransitionTime,11523,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState_EffectiveTransitionTime,11524,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState_TrueState,11525,Variable\nData_Dynamic_Scalar_CycleComplete_EnabledState_FalseState,11526,Variable\nData_Dynamic_Scalar_CycleComplete_AckedState_EffectiveTransitionTime,11527,Variable\nData_Dynamic_Scalar_CycleComplete_ConfirmedState_EffectiveTransitionTime,11528,Variable\nData_Dynamic_Array_CycleComplete_EnabledState_EffectiveTransitionTime,11529,Variable\nData_Dynamic_Array_CycleComplete_EnabledState_TrueState,11530,Variable\nData_Dynamic_Array_CycleComplete_EnabledState_FalseState,11531,Variable\nData_Dynamic_Array_CycleComplete_AckedState_EffectiveTransitionTime,11532,Variable\nData_Dynamic_Array_CycleComplete_ConfirmedState_EffectiveTransitionTime,11533,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState_EffectiveTransitionTime,11534,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState_TrueState,11535,Variable\nData_Dynamic_UserScalar_CycleComplete_EnabledState_FalseState,11536,Variable\nData_Dynamic_UserScalar_CycleComplete_AckedState_EffectiveTransitionTime,11537,Variable\nData_Dynamic_UserScalar_CycleComplete_ConfirmedState_EffectiveTransitionTime,11538,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState_EffectiveTransitionTime,11539,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState_TrueState,11540,Variable\nData_Dynamic_UserArray_CycleComplete_EnabledState_FalseState,11541,Variable\nData_Dynamic_UserArray_CycleComplete_AckedState_EffectiveTransitionTime,11542,Variable\nData_Dynamic_UserArray_CycleComplete_ConfirmedState_EffectiveTransitionTime,11543,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState_EffectiveTransitionTime,11544,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState_TrueState,11545,Variable\nData_Dynamic_AnalogScalar_CycleComplete_EnabledState_FalseState,11546,Variable\nData_Dynamic_AnalogScalar_CycleComplete_AckedState_EffectiveTransitionTime,11547,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConfirmedState_EffectiveTransitionTime,11548,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState_EffectiveTransitionTime,11549,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState_TrueState,11550,Variable\nData_Dynamic_AnalogArray_CycleComplete_EnabledState_FalseState,11551,Variable\nData_Dynamic_AnalogArray_CycleComplete_AckedState_EffectiveTransitionTime,11552,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConfirmedState_EffectiveTransitionTime,11553,Variable\nData_Conditions_SystemStatus_EnabledState_EffectiveTransitionTime,11554,Variable\nData_Conditions_SystemStatus_EnabledState_TrueState,11555,Variable\nData_Conditions_SystemStatus_EnabledState_FalseState,11556,Variable\nTestDataObjectType_CycleComplete_ConditionName,11557,Variable\nScalarValueObjectType_CycleComplete_ConditionName,11558,Variable\nAnalogScalarValueObjectType_CycleComplete_ConditionName,11559,Variable\nArrayValueObjectType_CycleComplete_ConditionName,11560,Variable\nAnalogArrayValueObjectType_CycleComplete_ConditionName,11561,Variable\nUserScalarValueObjectType_CycleComplete_ConditionName,11562,Variable\nUserArrayValueObjectType_CycleComplete_ConditionName,11563,Variable\nTestSystemConditionType_ConditionName,11564,Variable\nData_Static_Scalar_CycleComplete_ConditionName,11565,Variable\nData_Static_Array_CycleComplete_ConditionName,11566,Variable\nData_Static_UserScalar_CycleComplete_ConditionName,11567,Variable\nData_Static_UserArray_CycleComplete_ConditionName,11568,Variable\nData_Static_AnalogScalar_CycleComplete_ConditionName,11569,Variable\nData_Static_AnalogArray_CycleComplete_ConditionName,11570,Variable\nData_Dynamic_Scalar_CycleComplete_ConditionName,11571,Variable\nData_Dynamic_Array_CycleComplete_ConditionName,11572,Variable\nData_Dynamic_UserScalar_CycleComplete_ConditionName,11573,Variable\nData_Dynamic_UserArray_CycleComplete_ConditionName,11574,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConditionName,11575,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConditionName,11576,Variable\nData_Conditions_SystemStatus_ConditionName,11577,Variable\nTestDataObjectType_CycleComplete_ConditionClassId,11578,Variable\nTestDataObjectType_CycleComplete_ConditionClassName,11579,Variable\nScalarValueObjectType_CycleComplete_ConditionClassId,11580,Variable\nScalarValueObjectType_CycleComplete_ConditionClassName,11581,Variable\nAnalogScalarValueObjectType_CycleComplete_ConditionClassId,11582,Variable\nAnalogScalarValueObjectType_CycleComplete_ConditionClassName,11583,Variable\nArrayValueObjectType_CycleComplete_ConditionClassId,11584,Variable\nArrayValueObjectType_CycleComplete_ConditionClassName,11585,Variable\nAnalogArrayValueObjectType_CycleComplete_ConditionClassId,11586,Variable\nAnalogArrayValueObjectType_CycleComplete_ConditionClassName,11587,Variable\nUserScalarValueObjectType_CycleComplete_ConditionClassId,11588,Variable\nUserScalarValueObjectType_CycleComplete_ConditionClassName,11589,Variable\nUserArrayValueObjectType_CycleComplete_ConditionClassId,11590,Variable\nUserArrayValueObjectType_CycleComplete_ConditionClassName,11591,Variable\nTestSystemConditionType_ConditionClassId,11592,Variable\nTestSystemConditionType_ConditionClassName,11593,Variable\nData_Static_Scalar_CycleComplete_ConditionClassId,11594,Variable\nData_Static_Scalar_CycleComplete_ConditionClassName,11595,Variable\nData_Static_Array_CycleComplete_ConditionClassId,11596,Variable\nData_Static_Array_CycleComplete_ConditionClassName,11597,Variable\nData_Static_UserScalar_CycleComplete_ConditionClassId,11598,Variable\nData_Static_UserScalar_CycleComplete_ConditionClassName,11599,Variable\nData_Static_UserArray_CycleComplete_ConditionClassId,11600,Variable\nData_Static_UserArray_CycleComplete_ConditionClassName,11601,Variable\nData_Static_AnalogScalar_CycleComplete_ConditionClassId,11602,Variable\nData_Static_AnalogScalar_CycleComplete_ConditionClassName,11603,Variable\nData_Static_AnalogArray_CycleComplete_ConditionClassId,11604,Variable\nData_Static_AnalogArray_CycleComplete_ConditionClassName,11605,Variable\nData_Dynamic_Scalar_CycleComplete_ConditionClassId,11606,Variable\nData_Dynamic_Scalar_CycleComplete_ConditionClassName,11607,Variable\nData_Dynamic_Array_CycleComplete_ConditionClassId,11608,Variable\nData_Dynamic_Array_CycleComplete_ConditionClassName,11609,Variable\nData_Dynamic_UserScalar_CycleComplete_ConditionClassId,11610,Variable\nData_Dynamic_UserScalar_CycleComplete_ConditionClassName,11611,Variable\nData_Dynamic_UserArray_CycleComplete_ConditionClassId,11612,Variable\nData_Dynamic_UserArray_CycleComplete_ConditionClassName,11613,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConditionClassId,11614,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConditionClassName,11615,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConditionClassId,11616,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConditionClassName,11617,Variable\nData_Conditions_SystemStatus_ConditionClassId,11618,Variable\nData_Conditions_SystemStatus_ConditionClassName,11619,Variable\nTestDataObjectType_CycleComplete_ConditionSubClassId,15001,Variable\nTestDataObjectType_CycleComplete_ConditionSubClassName,15002,Variable\nScalarValueObjectType_CycleComplete_ConditionSubClassId,15003,Variable\nScalarValueObjectType_CycleComplete_ConditionSubClassName,15004,Variable\nAnalogScalarValueObjectType_CycleComplete_ConditionSubClassId,15005,Variable\nAnalogScalarValueObjectType_CycleComplete_ConditionSubClassName,15006,Variable\nArrayValueObjectType_CycleComplete_ConditionSubClassId,15007,Variable\nArrayValueObjectType_CycleComplete_ConditionSubClassName,15008,Variable\nAnalogArrayValueObjectType_CycleComplete_ConditionSubClassId,15009,Variable\nAnalogArrayValueObjectType_CycleComplete_ConditionSubClassName,15010,Variable\nUserScalarValueObjectType_CycleComplete_ConditionSubClassId,15011,Variable\nUserScalarValueObjectType_CycleComplete_ConditionSubClassName,15012,Variable\nUserArrayValueObjectType_CycleComplete_ConditionSubClassId,15013,Variable\nUserArrayValueObjectType_CycleComplete_ConditionSubClassName,15014,Variable\nTestSystemConditionType_ConditionSubClassId,15015,Variable\nTestSystemConditionType_ConditionSubClassName,15016,Variable\nTestSystemConditionType_ConditionRefresh2,15017,Method\nTestSystemConditionType_ConditionRefresh2_InputArguments,15018,Variable\nData_Static_Scalar_CycleComplete_ConditionSubClassId,15019,Variable\nData_Static_Scalar_CycleComplete_ConditionSubClassName,15020,Variable\nData_Static_Array_CycleComplete_ConditionSubClassId,15021,Variable\nData_Static_Array_CycleComplete_ConditionSubClassName,15022,Variable\nData_Static_UserScalar_CycleComplete_ConditionSubClassId,15023,Variable\nData_Static_UserScalar_CycleComplete_ConditionSubClassName,15024,Variable\nData_Static_UserArray_CycleComplete_ConditionSubClassId,15025,Variable\nData_Static_UserArray_CycleComplete_ConditionSubClassName,15026,Variable\nData_Static_AnalogScalar_CycleComplete_ConditionSubClassId,15027,Variable\nData_Static_AnalogScalar_CycleComplete_ConditionSubClassName,15028,Variable\nData_Static_AnalogArray_CycleComplete_ConditionSubClassId,15029,Variable\nData_Static_AnalogArray_CycleComplete_ConditionSubClassName,15030,Variable\nData_Dynamic_Scalar_CycleComplete_ConditionSubClassId,15031,Variable\nData_Dynamic_Scalar_CycleComplete_ConditionSubClassName,15032,Variable\nData_Dynamic_Array_CycleComplete_ConditionSubClassId,15033,Variable\nData_Dynamic_Array_CycleComplete_ConditionSubClassName,15034,Variable\nData_Dynamic_UserScalar_CycleComplete_ConditionSubClassId,15035,Variable\nData_Dynamic_UserScalar_CycleComplete_ConditionSubClassName,15036,Variable\nData_Dynamic_UserArray_CycleComplete_ConditionSubClassId,15037,Variable\nData_Dynamic_UserArray_CycleComplete_ConditionSubClassName,15038,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConditionSubClassId,15039,Variable\nData_Dynamic_AnalogScalar_CycleComplete_ConditionSubClassName,15040,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConditionSubClassId,15041,Variable\nData_Dynamic_AnalogArray_CycleComplete_ConditionSubClassName,15042,Variable\nData_Conditions_SystemStatus_ConditionSubClassId,15043,Variable\nData_Conditions_SystemStatus_ConditionSubClassName,15044,Variable\nTestData_BinarySchema_Deprecated,15045,Variable\nTestData_XmlSchema_Deprecated,15046,Variable\nScalarValueDataType_Encoding_DefaultJson,15047,Object\nArrayValueDataType_Encoding_DefaultJson,15048,Object\nUserScalarValueDataType_Encoding_DefaultJson,15049,Object\nUserArrayValueDataType_Encoding_DefaultJson,15050,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/TestData/Design/TestDataDesign.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns=\"http://test.org/UA/Data/\"\n  TargetNamespace=\"http://test.org/UA/Data/\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"TestData\" Prefix=\"TestData\">http://test.org/UA/Data/</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:Method SymbolicName=\"GenerateValuesMethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"Iterations\" DataType=\"ua:UInt32\">\n        <opc:Description>The number of new values to generate.</opc:Description>\n      </opc:Argument>\n    </opc:InputArguments>\n  </opc:Method>\n\n  <opc:ObjectType SymbolicName=\"GenerateValuesEventType\" BaseType=\"ua:BaseEventType\">\n    <opc:Children>\n      <opc:Property SymbolicName=\"Iterations\" DataType=\"ua:UInt32\" ModellingRule=\"Mandatory\" />\n      <opc:Property SymbolicName=\"NewValueCount\" DataType=\"ua:UInt32\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <!--\n  <opc:ObjectType SymbolicName=\"Foo_Bar_Type\" BaseType=\"ua:BaseObjectType\">\n    <opc:Children>\n      <opc:Object SymbolicName=\"Blue_Fish\">\n        <opc:Children>\n          <opc:Property SymbolicName=\"Apple_Array\" DataType=\"ua:String\" ValueRank=\"Array\" MinimumSamplingInterval=\"1000\" />\n          <opc:Property SymbolicName=\"Orange_Array\" DataType=\"ua:String\" ValueRank=\"Array\" MinimumSamplingInterval=\"1000\">\n            <opc:References>\n              <opc:Reference>\n                <opc:ReferenceType>ua:HasEffect</opc:ReferenceType>\n                <opc:TargetId>Foo_Bar_Type_Gold_Fish</opc:TargetId>\n              </opc:Reference>\n              <opc:Reference>\n                <opc:ReferenceType>ua:HasEffect</opc:ReferenceType>\n                <opc:TargetId>Foo_Bar_Type</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n        </opc:Children>\n      </opc:Object>\n      <opc:Object SymbolicName=\"Gold_Fish\">\n        <opc:Children>\n          <opc:Property SymbolicName=\"Apple_Array\" DataType=\"ua:String\" ValueRank=\"Array\" MinimumSamplingInterval=\"1000\">\n            <opc:References>\n              <opc:Reference>\n                <opc:ReferenceType>ua:HasEffect</opc:ReferenceType>\n                <opc:TargetId>Foo_Bar_Type_Blue_Fish_Orange_Array</opc:TargetId>\n              </opc:Reference>\n            </opc:References>\n          </opc:Property>\n          <opc:Property SymbolicName=\"Namespace_Array\" DataType=\"ua:String\" ValueRank=\"Array\" MinimumSamplingInterval=\"1000\" />\n        </opc:Children>\n      </opc:Object>\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:Object SymbolicName=\"Hello_World\" TypeDefinition=\"ua:FolderType\" SupportsEvents=\"true\">\n    <opc:Children>\n      <opc:Object SymbolicName=\"Foo_Bar_1\" TypeDefinition=\"Foo_Bar_Type\" SupportsEvents=\"true\">\n      </opc:Object>\n    </opc:Children>\n    <opc:References>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ObjectsFolder</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:Object>\n  -->\n\n  <opc:ObjectType SymbolicName=\"TestDataObjectType\" BaseType=\"ua:BaseObjectType\">\n    <opc:Children>\n      <opc:Property SymbolicName=\"SimulationActive\" DataType=\"ua:Boolean\" ModellingRule=\"Mandatory\">\n        <opc:Description>If true the server will produce new values for each monitored variable.</opc:Description>\n      </opc:Property>\n      <opc:Method SymbolicName=\"GenerateValues\" TypeDefinition=\"GenerateValuesMethodType\" ModellingRule=\"Mandatory\"></opc:Method>\n      <opc:Object SymbolicName=\"CycleComplete\" TypeDefinition=\"ua:AcknowledgeableConditionType\" ModellingRule=\"Mandatory\">\n        <opc:References>\n          <opc:Reference IsInverse=\"true\">\n            <opc:ReferenceType>ua:HasEventSource</opc:ReferenceType>\n            <opc:TargetId>TestDataObjectType</opc:TargetId>\n          </opc:Reference>\n        </opc:References>\n      </opc:Object>\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:DataType SymbolicName=\"ScalarValueDataType\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"BooleanValue\" DataType=\"ua:Boolean\" />\n      <opc:Field Name=\"SByteValue\" DataType=\"ua:SByte\" />\n      <opc:Field Name=\"ByteValue\" DataType=\"ua:Byte\" />\n      <opc:Field Name=\"Int16Value\" DataType=\"ua:Int16\" />\n      <opc:Field Name=\"UInt16Value\" DataType=\"ua:UInt16\" />\n      <opc:Field Name=\"Int32Value\" DataType=\"ua:Int32\" />\n      <opc:Field Name=\"UInt32Value\" DataType=\"ua:UInt32\" />\n      <opc:Field Name=\"Int64Value\" DataType=\"ua:Int64\" />\n      <opc:Field Name=\"UInt64Value\" DataType=\"ua:UInt64\" />\n      <opc:Field Name=\"FloatValue\" DataType=\"ua:Float\" />\n      <opc:Field Name=\"DoubleValue\" DataType=\"ua:Double\" />\n      <opc:Field Name=\"StringValue\" DataType=\"ua:String\" />\n      <opc:Field Name=\"DateTimeValue\" DataType=\"ua:DateTime\" />\n      <opc:Field Name=\"GuidValue\" DataType=\"ua:Guid\" />\n      <opc:Field Name=\"ByteStringValue\" DataType=\"ua:ByteString\" />\n      <opc:Field Name=\"XmlElementValue\" DataType=\"ua:XmlElement\" />\n      <opc:Field Name=\"NodeIdValue\" DataType=\"ua:NodeId\" />\n      <opc:Field Name=\"ExpandedNodeIdValue\" DataType=\"ua:ExpandedNodeId\" />\n      <opc:Field Name=\"QualifiedNameValue\" DataType=\"ua:QualifiedName\" />\n      <opc:Field Name=\"LocalizedTextValue\" DataType=\"ua:LocalizedText\" />\n      <opc:Field Name=\"StatusCodeValue\" DataType=\"ua:StatusCode\" />\n      <opc:Field Name=\"VariantValue\" DataType=\"ua:BaseDataType\" />\n      <opc:Field Name=\"EnumerationValue\" DataType=\"ua:Enumeration\" />\n      <opc:Field Name=\"StructureValue\" DataType=\"ua:Structure\" />\n      <opc:Field Name=\"Number\" DataType=\"ua:Number\" />\n      <opc:Field Name=\"Integer\" DataType=\"ua:Integer\" />\n      <opc:Field Name=\"UInteger\" DataType=\"ua:UInteger\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:Method SymbolicName=\"ScalarValue1MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"BooleanIn\" DataType=\"ua:Boolean\" />\n      <opc:Argument Name=\"SByteIn\" DataType=\"ua:SByte\" />\n      <opc:Argument Name=\"ByteIn\" DataType=\"ua:Byte\" />\n      <opc:Argument Name=\"Int16In\" DataType=\"ua:Int16\" />\n      <opc:Argument Name=\"UInt16In\" DataType=\"ua:UInt16\" />\n      <opc:Argument Name=\"Int32In\" DataType=\"ua:Int32\" />\n      <opc:Argument Name=\"UInt32In\" DataType=\"ua:UInt32\" />\n      <opc:Argument Name=\"Int64In\" DataType=\"ua:Int64\" />\n      <opc:Argument Name=\"UInt64In\" DataType=\"ua:UInt64\" />\n      <opc:Argument Name=\"FloatIn\" DataType=\"ua:Float\" />\n      <opc:Argument Name=\"DoubleIn\" DataType=\"ua:Double\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"BooleanOut\" DataType=\"ua:Boolean\" />\n      <opc:Argument Name=\"SByteOut\" DataType=\"ua:SByte\" />\n      <opc:Argument Name=\"ByteOut\" DataType=\"ua:Byte\" />\n      <opc:Argument Name=\"Int16Out\" DataType=\"ua:Int16\" />\n      <opc:Argument Name=\"UInt16Out\" DataType=\"ua:UInt16\" />\n      <opc:Argument Name=\"Int32Out\" DataType=\"ua:Int32\" />\n      <opc:Argument Name=\"UInt32Out\" DataType=\"ua:UInt32\" />\n      <opc:Argument Name=\"Int64Out\" DataType=\"ua:Int64\" />\n      <opc:Argument Name=\"UInt64Out\" DataType=\"ua:UInt64\" />\n      <opc:Argument Name=\"FloatOut\" DataType=\"ua:Float\" />\n      <opc:Argument Name=\"DoubleOut\" DataType=\"ua:Double\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:Method SymbolicName=\"ScalarValue2MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"StringIn\" DataType=\"ua:String\" />\n      <opc:Argument Name=\"DateTimeIn\" DataType=\"ua:DateTime\" />\n      <opc:Argument Name=\"GuidIn\" DataType=\"ua:Guid\" />\n      <opc:Argument Name=\"ByteStringIn\" DataType=\"ua:ByteString\" />\n      <opc:Argument Name=\"XmlElementIn\" DataType=\"ua:XmlElement\" />\n      <opc:Argument Name=\"NodeIdIn\" DataType=\"ua:NodeId\" />\n      <opc:Argument Name=\"ExpandedNodeIdIn\" DataType=\"ua:ExpandedNodeId\" />\n      <opc:Argument Name=\"QualifiedNameIn\" DataType=\"ua:QualifiedName\" />\n      <opc:Argument Name=\"LocalizedTextIn\" DataType=\"ua:LocalizedText\" />\n      <opc:Argument Name=\"StatusCodeIn\" DataType=\"ua:StatusCode\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"StringOut\" DataType=\"ua:String\" />\n      <opc:Argument Name=\"DateTimeOut\" DataType=\"ua:DateTime\" />\n      <opc:Argument Name=\"GuidOut\" DataType=\"ua:Guid\" />\n      <opc:Argument Name=\"ByteStringOut\" DataType=\"ua:ByteString\" />\n      <opc:Argument Name=\"XmlElementOut\" DataType=\"ua:XmlElement\" />\n      <opc:Argument Name=\"NodeIdOut\" DataType=\"ua:NodeId\" />\n      <opc:Argument Name=\"ExpandedNodeIdOut\" DataType=\"ua:ExpandedNodeId\" />\n      <opc:Argument Name=\"QualifiedNameOut\" DataType=\"ua:QualifiedName\" />\n      <opc:Argument Name=\"LocalizedTextOut\" DataType=\"ua:LocalizedText\" />\n      <opc:Argument Name=\"StatusCodeOut\" DataType=\"ua:StatusCode\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:Method SymbolicName=\"ScalarValue3MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"VariantIn\" DataType=\"ua:BaseDataType\" />\n      <opc:Argument Name=\"EnumerationIn\" DataType=\"ua:Enumeration\" />\n      <opc:Argument Name=\"StructureIn\" DataType=\"ua:Structure\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"VariantOut\" DataType=\"ua:BaseDataType\" />\n      <opc:Argument Name=\"EnumerationOut\" DataType=\"ua:Enumeration\" />\n      <opc:Argument Name=\"StructureOut\" DataType=\"ua:Structure\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:ObjectType SymbolicName=\"ScalarValueObjectType\" BaseType=\"TestDataObjectType\">\n    <opc:Children>\n      <opc:Variable SymbolicName=\"BooleanValue\" DataType=\"ua:Boolean\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"SByteValue\" DataType=\"ua:SByte\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteValue\" DataType=\"ua:Byte\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int16Value\" DataType=\"ua:Int16\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt16Value\" DataType=\"ua:UInt16\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int32Value\" DataType=\"ua:Int32\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt32Value\" DataType=\"ua:UInt32\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int64Value\" DataType=\"ua:Int64\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt64Value\" DataType=\"ua:UInt64\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"FloatValue\" DataType=\"ua:Float\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DoubleValue\" DataType=\"ua:Double\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StringValue\" DataType=\"ua:String\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DateTimeValue\" DataType=\"ua:DateTime\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"GuidValue\" DataType=\"ua:Guid\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteStringValue\" DataType=\"ua:ByteString\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"XmlElementValue\" DataType=\"ua:XmlElement\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"NodeIdValue\" DataType=\"ua:NodeId\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ExpandedNodeIdValue\" DataType=\"ua:ExpandedNodeId\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"QualifiedNameValue\" DataType=\"ua:QualifiedName\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"LocalizedTextValue\" DataType=\"ua:LocalizedText\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StatusCodeValue\" DataType=\"ua:StatusCode\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"VariantValue\" DataType=\"ua:BaseDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"EnumerationValue\" DataType=\"ua:Enumeration\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StructureValue\" DataType=\"ua:Structure\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"NumberValue\" DataType=\"ua:Number\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"IntegerValue\" DataType=\"ua:Integer\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UIntegerValue\" DataType=\"ua:UInteger\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"AnalogScalarValueObjectType\" BaseType=\"TestDataObjectType\">\n    <opc:Children>\n      <opc:Variable SymbolicName=\"SByteValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:SByte\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Byte\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int16Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Int16\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt16Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:UInt16\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int32Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Int32\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt32Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:UInt32\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int64Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Int64\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt64Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:UInt64\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"FloatValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Float\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DoubleValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Double\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"NumberValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Number\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"IntegerValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Integer\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UIntegerValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:UInteger\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:DataType SymbolicName=\"ArrayValueDataType\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"BooleanValue\" DataType=\"ua:Boolean\" ValueRank=\"Array\" />\n      <opc:Field Name=\"SByteValue\" DataType=\"ua:SByte\" ValueRank=\"Array\" />\n      <opc:Field Name=\"ByteValue\" DataType=\"ua:Byte\" ValueRank=\"Array\" />\n      <opc:Field Name=\"Int16Value\" DataType=\"ua:Int16\" ValueRank=\"Array\" />\n      <opc:Field Name=\"UInt16Value\" DataType=\"ua:UInt16\" ValueRank=\"Array\" />\n      <opc:Field Name=\"Int32Value\" DataType=\"ua:Int32\" ValueRank=\"Array\" />\n      <opc:Field Name=\"UInt32Value\" DataType=\"ua:UInt32\" ValueRank=\"Array\" />\n      <opc:Field Name=\"Int64Value\" DataType=\"ua:Int64\" ValueRank=\"Array\" />\n      <opc:Field Name=\"UInt64Value\" DataType=\"ua:UInt64\" ValueRank=\"Array\" />\n      <opc:Field Name=\"FloatValue\" DataType=\"ua:Float\" ValueRank=\"Array\" />\n      <opc:Field Name=\"DoubleValue\" DataType=\"ua:Double\" ValueRank=\"Array\" />\n      <opc:Field Name=\"StringValue\" DataType=\"ua:String\" ValueRank=\"Array\" />\n      <opc:Field Name=\"DateTimeValue\" DataType=\"ua:DateTime\" ValueRank=\"Array\" />\n      <opc:Field Name=\"GuidValue\" DataType=\"ua:Guid\" ValueRank=\"Array\" />\n      <opc:Field Name=\"ByteStringValue\" DataType=\"ua:ByteString\" ValueRank=\"Array\" />\n      <opc:Field Name=\"XmlElementValue\" DataType=\"ua:XmlElement\" ValueRank=\"Array\" />\n      <opc:Field Name=\"NodeIdValue\" DataType=\"ua:NodeId\" ValueRank=\"Array\" />\n      <opc:Field Name=\"ExpandedNodeIdValue\" DataType=\"ua:ExpandedNodeId\" ValueRank=\"Array\" />\n      <opc:Field Name=\"QualifiedNameValue\" DataType=\"ua:QualifiedName\" ValueRank=\"Array\" />\n      <opc:Field Name=\"LocalizedTextValue\" DataType=\"ua:LocalizedText\" ValueRank=\"Array\" />\n      <opc:Field Name=\"StatusCodeValue\" DataType=\"ua:StatusCode\" ValueRank=\"Array\" />\n      <opc:Field Name=\"VariantValue\" DataType=\"ua:BaseDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"EnumerationValue\" DataType=\"ua:Enumeration\" ValueRank=\"Array\" />\n      <opc:Field Name=\"StructureValue\" DataType=\"ua:Structure\" ValueRank=\"Array\" />\n      <opc:Field Name=\"Number\" DataType=\"ua:Number\" ValueRank=\"Array\" />\n      <opc:Field Name=\"Integer\" DataType=\"ua:Integer\" ValueRank=\"Array\" />\n      <opc:Field Name=\"UInteger\" DataType=\"ua:UInteger\" ValueRank=\"Array\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:Method SymbolicName=\"ArrayValue1MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"BooleanIn\" DataType=\"ua:Boolean\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"SByteIn\" DataType=\"ua:SByte\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ByteIn\" DataType=\"ua:Byte\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int16In\" DataType=\"ua:Int16\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt16In\" DataType=\"ua:UInt16\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int32In\" DataType=\"ua:Int32\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt32In\" DataType=\"ua:UInt32\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int64In\" DataType=\"ua:Int64\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt64In\" DataType=\"ua:UInt64\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"FloatIn\" DataType=\"ua:Float\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"DoubleIn\" DataType=\"ua:Double\" ValueRank=\"Array\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"BooleanOut\" DataType=\"ua:Boolean\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"SByteOut\" DataType=\"ua:SByte\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ByteOut\" DataType=\"ua:Byte\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int16Out\" DataType=\"ua:Int16\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt16Out\" DataType=\"ua:UInt16\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int32Out\" DataType=\"ua:Int32\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt32Out\" DataType=\"ua:UInt32\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int64Out\" DataType=\"ua:Int64\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt64Out\" DataType=\"ua:UInt64\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"FloatOut\" DataType=\"ua:Float\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"DoubleOut\" DataType=\"ua:Double\" ValueRank=\"Array\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:Method SymbolicName=\"ArrayValue2MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"StringIn\" DataType=\"ua:String\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"DateTimeIn\" DataType=\"ua:DateTime\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"GuidIn\" DataType=\"ua:Guid\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ByteStringIn\" DataType=\"ua:ByteString\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"XmlElementIn\" DataType=\"ua:XmlElement\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"NodeIdIn\" DataType=\"ua:NodeId\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ExpandedNodeIdIn\" DataType=\"ua:ExpandedNodeId\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"QualifiedNameIn\" DataType=\"ua:QualifiedName\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"LocalizedTextIn\" DataType=\"ua:LocalizedText\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"StatusCodeIn\" DataType=\"ua:StatusCode\" ValueRank=\"Array\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"StringOut\" DataType=\"ua:String\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"DateTimeOut\" DataType=\"ua:DateTime\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"GuidOut\" DataType=\"ua:Guid\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ByteStringOut\" DataType=\"ua:ByteString\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"XmlElementOut\" DataType=\"ua:XmlElement\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"NodeIdOut\" DataType=\"ua:NodeId\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ExpandedNodeIdOut\" DataType=\"ua:ExpandedNodeId\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"QualifiedNameOut\" DataType=\"ua:QualifiedName\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"LocalizedTextOut\" DataType=\"ua:LocalizedText\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"StatusCodeOut\" DataType=\"ua:StatusCode\" ValueRank=\"Array\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:Method SymbolicName=\"ArrayValue3MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"VariantIn\" DataType=\"ua:BaseDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"EnumerationIn\" DataType=\"ua:Enumeration\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"StructureIn\" DataType=\"ua:Structure\" ValueRank=\"Array\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"VariantOut\" DataType=\"ua:BaseDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"EnumerationOut\" DataType=\"ua:Enumeration\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"StructureOut\" DataType=\"ua:Structure\" ValueRank=\"Array\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:ObjectType SymbolicName=\"ArrayValueObjectType\" BaseType=\"TestDataObjectType\">\n    <opc:Children>\n      <opc:Variable SymbolicName=\"BooleanValue\" DataType=\"ua:Boolean\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"SByteValue\" DataType=\"ua:SByte\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteValue\" DataType=\"ua:Byte\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int16Value\" DataType=\"ua:Int16\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt16Value\" DataType=\"ua:UInt16\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int32Value\" DataType=\"ua:Int32\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt32Value\" DataType=\"ua:UInt32\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int64Value\" DataType=\"ua:Int64\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt64Value\" DataType=\"ua:UInt64\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"FloatValue\" DataType=\"ua:Float\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DoubleValue\" DataType=\"ua:Double\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StringValue\" DataType=\"ua:String\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DateTimeValue\" DataType=\"ua:DateTime\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"GuidValue\" DataType=\"ua:Guid\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteStringValue\" DataType=\"ua:ByteString\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"XmlElementValue\" DataType=\"ua:XmlElement\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"NodeIdValue\" DataType=\"ua:NodeId\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ExpandedNodeIdValue\" DataType=\"ua:ExpandedNodeId\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"QualifiedNameValue\" DataType=\"ua:QualifiedName\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"LocalizedTextValue\" DataType=\"ua:LocalizedText\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StatusCodeValue\" DataType=\"ua:StatusCode\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"VariantValue\" DataType=\"ua:BaseDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"EnumerationValue\" DataType=\"ua:Enumeration\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StructureValue\" DataType=\"ua:Structure\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"NumberValue\" DataType=\"ua:Number\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"IntegerValue\" DataType=\"ua:Integer\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UIntegerValue\" DataType=\"ua:UInteger\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"AnalogArrayValueObjectType\" BaseType=\"TestDataObjectType\">\n    <opc:Children>\n      <opc:Variable SymbolicName=\"SByteValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:SByte\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Byte\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int16Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Int16\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt16Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:UInt16\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int32Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Int32\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt32Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:UInt32\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int64Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Int64\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt64Value\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:UInt64\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"FloatValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Float\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DoubleValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Double\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"NumberValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Number\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"IntegerValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:Integer\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UIntegerValue\" TypeDefinition=\"ua:AnalogItemType\" DataType=\"ua:UInteger\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:DataType SymbolicName=\"BooleanDataType\" BaseType=\"ua:Boolean\" />\n  <opc:DataType SymbolicName=\"SByteDataType\" BaseType=\"ua:SByte\" />\n  <opc:DataType SymbolicName=\"ByteDataType\" BaseType=\"ua:Byte\" />\n  <opc:DataType SymbolicName=\"Int16DataType\" BaseType=\"ua:Int16\" />\n  <opc:DataType SymbolicName=\"UInt16DataType\" BaseType=\"ua:UInt16\" />\n  <opc:DataType SymbolicName=\"Int32DataType\" BaseType=\"ua:Int32\" />\n  <opc:DataType SymbolicName=\"UInt32DataType\" BaseType=\"ua:UInt32\" />\n  <opc:DataType SymbolicName=\"Int64DataType\" BaseType=\"ua:Int64\" />\n  <opc:DataType SymbolicName=\"UInt64DataType\" BaseType=\"ua:UInt64\" />\n  <opc:DataType SymbolicName=\"FloatDataType\" BaseType=\"ua:Float\" />\n  <opc:DataType SymbolicName=\"DoubleDataType\" BaseType=\"ua:Double\" />\n  <opc:DataType SymbolicName=\"StringDataType\" BaseType=\"ua:String\" />\n  <opc:DataType SymbolicName=\"DateTimeDataType\" BaseType=\"ua:DateTime\" />\n  <opc:DataType SymbolicName=\"GuidDataType\" BaseType=\"ua:Guid\" />\n  <opc:DataType SymbolicName=\"ByteStringDataType\" BaseType=\"ua:ByteString\" />\n  <opc:DataType SymbolicName=\"XmlElementDataType\" BaseType=\"ua:XmlElement\" />\n  <opc:DataType SymbolicName=\"NodeIdDataType\" BaseType=\"ua:NodeId\" />\n  <opc:DataType SymbolicName=\"ExpandedNodeIdDataType\" BaseType=\"ua:ExpandedNodeId\" />\n  <opc:DataType SymbolicName=\"QualifiedNameDataType\" BaseType=\"ua:QualifiedName\" />\n  <opc:DataType SymbolicName=\"LocalizedTextDataType\" BaseType=\"ua:LocalizedText\" />\n  <opc:DataType SymbolicName=\"StatusCodeDataType\" BaseType=\"ua:StatusCode\" />\n  <opc:DataType SymbolicName=\"VariantDataType\" BaseType=\"ua:BaseDataType\" />\n\n  <opc:DataType SymbolicName=\"UserScalarValueDataType\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"BooleanDataType\" DataType=\"BooleanDataType\" />\n      <opc:Field Name=\"SByteDataType\" DataType=\"SByteDataType\" />\n      <opc:Field Name=\"ByteDataType\" DataType=\"ByteDataType\" />\n      <opc:Field Name=\"Int16DataType\" DataType=\"Int16DataType\" />\n      <opc:Field Name=\"UInt16DataType\" DataType=\"UInt16DataType\" />\n      <opc:Field Name=\"Int32DataType\" DataType=\"Int32DataType\" />\n      <opc:Field Name=\"UInt32DataType\" DataType=\"UInt32DataType\" />\n      <opc:Field Name=\"Int64DataType\" DataType=\"Int64DataType\" />\n      <opc:Field Name=\"UInt64DataType\" DataType=\"UInt64DataType\" />\n      <opc:Field Name=\"FloatDataType\" DataType=\"FloatDataType\" />\n      <opc:Field Name=\"DoubleDataType\" DataType=\"DoubleDataType\" />\n      <opc:Field Name=\"StringDataType\" DataType=\"StringDataType\" />\n      <opc:Field Name=\"DateTimeDataType\" DataType=\"DateTimeDataType\" />\n      <opc:Field Name=\"GuidDataType\" DataType=\"GuidDataType\" />\n      <opc:Field Name=\"ByteStringDataType\" DataType=\"ByteStringDataType\" />\n      <opc:Field Name=\"XmlElementDataType\" DataType=\"XmlElementDataType\" />\n      <opc:Field Name=\"NodeIdDataType\" DataType=\"NodeIdDataType\" />\n      <opc:Field Name=\"ExpandedNodeIdDataType\" DataType=\"ExpandedNodeIdDataType\" />\n      <opc:Field Name=\"QualifiedNameDataType\" DataType=\"QualifiedNameDataType\" />\n      <opc:Field Name=\"LocalizedTextDataType\" DataType=\"LocalizedTextDataType\" />\n      <opc:Field Name=\"StatusCodeDataType\" DataType=\"StatusCodeDataType\" />\n      <opc:Field Name=\"VariantDataType\" DataType=\"VariantDataType\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:ObjectType SymbolicName=\"UserScalarValueObjectType\" BaseType=\"TestDataObjectType\">\n    <opc:Children>\n      <opc:Variable SymbolicName=\"BooleanValue\" DataType=\"BooleanDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"SByteValue\" DataType=\"SByteDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteValue\" DataType=\"ByteDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int16Value\" DataType=\"Int16DataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt16Value\" DataType=\"UInt16DataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int32Value\" DataType=\"Int32DataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt32Value\" DataType=\"UInt32DataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int64Value\" DataType=\"Int64DataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt64Value\" DataType=\"UInt64DataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"FloatValue\" DataType=\"FloatDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DoubleValue\" DataType=\"DoubleDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StringValue\" DataType=\"StringDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DateTimeValue\" DataType=\"DateTimeDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"GuidValue\" DataType=\"GuidDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteStringValue\" DataType=\"ByteStringDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"XmlElementValue\" DataType=\"XmlElementDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"NodeIdValue\" DataType=\"NodeIdDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ExpandedNodeIdValue\" DataType=\"ExpandedNodeIdDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"QualifiedNameValue\" DataType=\"QualifiedNameDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"LocalizedTextValue\" DataType=\"LocalizedTextDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StatusCodeValue\" DataType=\"StatusCodeDataType\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"VariantValue\" DataType=\"VariantDataType\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:Method SymbolicName=\"UserScalarValue1MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"BooleanIn\" DataType=\"BooleanDataType\" />\n      <opc:Argument Name=\"SByteIn\" DataType=\"SByteDataType\" />\n      <opc:Argument Name=\"ByteIn\" DataType=\"ByteDataType\" />\n      <opc:Argument Name=\"Int16In\" DataType=\"Int16DataType\" />\n      <opc:Argument Name=\"UInt16In\" DataType=\"UInt16DataType\" />\n      <opc:Argument Name=\"Int32In\" DataType=\"Int32DataType\" />\n      <opc:Argument Name=\"UInt32In\" DataType=\"UInt32DataType\" />\n      <opc:Argument Name=\"Int64In\" DataType=\"Int64DataType\" />\n      <opc:Argument Name=\"UInt64In\" DataType=\"UInt64DataType\" />\n      <opc:Argument Name=\"FloatIn\" DataType=\"FloatDataType\" />\n      <opc:Argument Name=\"DoubleIn\" DataType=\"DoubleDataType\" />\n      <opc:Argument Name=\"StringIn\" DataType=\"StringDataType\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"BooleanOut\" DataType=\"BooleanDataType\" />\n      <opc:Argument Name=\"SByteOut\" DataType=\"SByteDataType\" />\n      <opc:Argument Name=\"ByteOut\" DataType=\"ByteDataType\" />\n      <opc:Argument Name=\"Int16Out\" DataType=\"Int16DataType\" />\n      <opc:Argument Name=\"UInt16Out\" DataType=\"UInt16DataType\" />\n      <opc:Argument Name=\"Int32Out\" DataType=\"Int32DataType\" />\n      <opc:Argument Name=\"UInt32Out\" DataType=\"UInt32DataType\" />\n      <opc:Argument Name=\"Int64Out\" DataType=\"Int64DataType\" />\n      <opc:Argument Name=\"UInt64Out\" DataType=\"UInt64DataType\" />\n      <opc:Argument Name=\"FloatOut\" DataType=\"FloatDataType\" />\n      <opc:Argument Name=\"DoubleOut\" DataType=\"DoubleDataType\" />\n      <opc:Argument Name=\"StringOut\" DataType=\"StringDataType\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:Method SymbolicName=\"UserScalarValue2MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"DateTimeIn\" DataType=\"DateTimeDataType\" />\n      <opc:Argument Name=\"GuidIn\" DataType=\"GuidDataType\" />\n      <opc:Argument Name=\"ByteStringIn\" DataType=\"ByteStringDataType\" />\n      <opc:Argument Name=\"XmlElementIn\" DataType=\"XmlElementDataType\" />\n      <opc:Argument Name=\"NodeIdIn\" DataType=\"NodeIdDataType\" />\n      <opc:Argument Name=\"ExpandedNodeIdIn\" DataType=\"ExpandedNodeIdDataType\" />\n      <opc:Argument Name=\"QualifiedNameIn\" DataType=\"QualifiedNameDataType\" />\n      <opc:Argument Name=\"LocalizedTextIn\" DataType=\"LocalizedTextDataType\" />\n      <opc:Argument Name=\"StatusCodeIn\" DataType=\"StatusCodeDataType\" />\n      <opc:Argument Name=\"VariantIn\" DataType=\"VariantDataType\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"DateTimeOut\" DataType=\"DateTimeDataType\" />\n      <opc:Argument Name=\"GuidOut\" DataType=\"GuidDataType\" />\n      <opc:Argument Name=\"ByteStringOut\" DataType=\"ByteStringDataType\" />\n      <opc:Argument Name=\"XmlElementOut\" DataType=\"XmlElementDataType\" />\n      <opc:Argument Name=\"NodeIdOut\" DataType=\"NodeIdDataType\" />\n      <opc:Argument Name=\"ExpandedNodeIdOut\" DataType=\"ExpandedNodeIdDataType\" />\n      <opc:Argument Name=\"QualifiedNameOut\" DataType=\"QualifiedNameDataType\" />\n      <opc:Argument Name=\"LocalizedTextOut\" DataType=\"LocalizedTextDataType\" />\n      <opc:Argument Name=\"StatusCodeOut\" DataType=\"StatusCodeDataType\" />\n      <opc:Argument Name=\"VariantOut\" DataType=\"VariantDataType\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:DataType SymbolicName=\"UserArrayValueDataType\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"BooleanDataType\" DataType=\"BooleanDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"SByteDataType\" DataType=\"SByteDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"ByteDataType\" DataType=\"ByteDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"Int16DataType\" DataType=\"Int16DataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"UInt16DataType\" DataType=\"UInt16DataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"Int32DataType\" DataType=\"Int32DataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"UInt32DataType\" DataType=\"UInt32DataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"Int64DataType\" DataType=\"Int64DataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"UInt64DataType\" DataType=\"UInt64DataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"FloatDataType\" DataType=\"FloatDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"DoubleDataType\" DataType=\"DoubleDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"StringDataType\" DataType=\"StringDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"DateTimeDataType\" DataType=\"DateTimeDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"GuidDataType\" DataType=\"GuidDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"ByteStringDataType\" DataType=\"ByteStringDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"XmlElementDataType\" DataType=\"XmlElementDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"NodeIdDataType\" DataType=\"NodeIdDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"ExpandedNodeIdDataType\" DataType=\"ExpandedNodeIdDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"QualifiedNameDataType\" DataType=\"QualifiedNameDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"LocalizedTextDataType\" DataType=\"LocalizedTextDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"StatusCodeDataType\" DataType=\"StatusCodeDataType\" ValueRank=\"Array\" />\n      <opc:Field Name=\"VariantDataType\" DataType=\"VariantDataType\" ValueRank=\"Array\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:ObjectType SymbolicName=\"UserArrayValueObjectType\" BaseType=\"TestDataObjectType\">\n    <opc:Children>\n      <opc:Variable SymbolicName=\"BooleanValue\" DataType=\"BooleanDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"SByteValue\" DataType=\"SByteDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteValue\" DataType=\"ByteDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int16Value\" DataType=\"Int16DataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt16Value\" DataType=\"UInt16DataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int32Value\" DataType=\"Int32DataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt32Value\" DataType=\"UInt32DataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"Int64Value\" DataType=\"Int64DataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"UInt64Value\" DataType=\"UInt64DataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"FloatValue\" DataType=\"FloatDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DoubleValue\" DataType=\"DoubleDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StringValue\" DataType=\"StringDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"DateTimeValue\" DataType=\"DateTimeDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"GuidValue\" DataType=\"GuidDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ByteStringValue\" DataType=\"ByteStringDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"XmlElementValue\" DataType=\"XmlElementDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"NodeIdValue\" DataType=\"NodeIdDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"ExpandedNodeIdValue\" DataType=\"ExpandedNodeIdDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"QualifiedNameValue\" DataType=\"QualifiedNameDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"LocalizedTextValue\" DataType=\"LocalizedTextDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"StatusCodeValue\" DataType=\"StatusCodeDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n      <opc:Variable SymbolicName=\"VariantValue\" DataType=\"VariantDataType\" ValueRank=\"Array\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:DataType SymbolicName=\"Vector\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"X\" DataType=\"ua:Double\" />\n      <opc:Field Name=\"Y\" DataType=\"ua:Double\" />\n      <opc:Field Name=\"Z\" DataType=\"ua:Double\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <!-- TODO Structure With Optional Fields and Union\n  <opc:DataType SymbolicName=\"VectorUnion\" BaseType=\"ua:Union\" IsUnion=\"true\">\n    <opc:Fields>\n      <opc:Field Name=\"X\" DataType=\"ua:Double\" />\n      <opc:Field Name=\"Y\" DataType=\"ua:Double\" />\n      <opc:Field Name=\"Z\" DataType=\"ua:Double\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:DataType SymbolicName=\"VectorWithOptionalFields\" BaseType=\"ua:Structure\" >\n    <opc:Fields>\n      <opc:Field Name=\"X\" DataType=\"ua:Double\" IsOptional=\"true\" />\n      <opc:Field Name=\"Y\" DataType=\"ua:Double\" IsOptional=\"true\" />\n      <opc:Field Name=\"Z\" DataType=\"ua:Double\" IsOptional=\"true\" />\n    </opc:Fields>\n  </opc:DataType>\n  \n  <opc:DataType SymbolicName=\"SampleUnion\" BaseType=\"ua:Union\" IsUnion=\"true\">\n    <opc:Fields>\n      <opc:Field Name=\"FieldA\" DataType=\"ua:UInt32\" />\n      <opc:Field Name=\"FieldB\" DataType=\"ua:String\" ValueRank=\"Array\" />\n      <opc:Field Name=\"FieldC\" DataType=\"ua:ByteString\" />\n      <opc:Field Name=\"FieldD\" DataType=\"WorkOrderType\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:DataType SymbolicName=\"SampleStructureWithOptionalFields\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"FieldA\" DataType=\"ua:UInt32\" />\n      <opc:Field Name=\"FieldB\" DataType=\"ua:String\" ValueRank=\"Array\" IsOptional=\"true\" />\n      <opc:Field Name=\"FieldC\" DataType=\"ua:ByteString\" />\n      <opc:Field Name=\"FieldD\" DataType=\"WorkOrderType\" IsOptional=\"true\" />\n    </opc:Fields>\n  </opc:DataType>\n  \n  <opc:DataType SymbolicName=\"WorkOrderTypeWithDescription\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"ID\" DataType=\"ua:Guid\" />\n      <opc:Field Name=\"AssetID\" DataType=\"ua:String\" />\n      <opc:Field Name=\"StartTime\" DataType=\"ua:DateTime\" />\n      <opc:Field Name=\"Description\" DataType=\"ua:String\" IsOptional=\"true\" />\n      <opc:Field Name=\"StatusComments\" DataType=\"WorkOrderStatusType\" ValueRank=\"Array\" />\n    </opc:Fields>\n  </opc:DataType>\n  \n-->\n\n  <opc:DataType SymbolicName=\"WorkOrderStatusType\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"Actor\" DataType=\"ua:String\" />\n      <opc:Field Name=\"Timestamp\" DataType=\"ua:DateTime\" />\n      <opc:Field Name=\"Comment\" DataType=\"ua:LocalizedText\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:DataType SymbolicName=\"WorkOrderType\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"ID\" DataType=\"ua:Guid\" />\n      <opc:Field Name=\"AssetID\" DataType=\"ua:String\" />\n      <opc:Field Name=\"StartTime\" DataType=\"ua:DateTime\" />\n      <opc:Field Name=\"StatusComments\" DataType=\"WorkOrderStatusType\" ValueRank=\"Array\" />\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:Method SymbolicName=\"UserArrayValue1MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"BooleanIn\" DataType=\"BooleanDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"SByteIn\" DataType=\"SByteDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ByteIn\" DataType=\"ByteDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int16In\" DataType=\"Int16DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt16In\" DataType=\"UInt16DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int32In\" DataType=\"Int32DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt32In\" DataType=\"UInt32DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int64In\" DataType=\"Int64DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt64In\" DataType=\"UInt64DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"FloatIn\" DataType=\"FloatDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"DoubleIn\" DataType=\"DoubleDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"StringIn\" DataType=\"StringDataType\" ValueRank=\"Array\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"BooleanOut\" DataType=\"BooleanDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"SByteOut\" DataType=\"SByteDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ByteOut\" DataType=\"ByteDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int16Out\" DataType=\"Int16DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt16Out\" DataType=\"UInt16DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int32Out\" DataType=\"Int32DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt32Out\" DataType=\"UInt32DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"Int64Out\" DataType=\"Int64DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"UInt64Out\" DataType=\"UInt64DataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"FloatOut\" DataType=\"FloatDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"DoubleOut\" DataType=\"DoubleDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"StringOut\" DataType=\"StringDataType\" ValueRank=\"Array\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:Method SymbolicName=\"UserArrayValue2MethodType\" ModellingRule=\"Mandatory\">\n    <opc:InputArguments>\n      <opc:Argument Name=\"DateTimeIn\" DataType=\"DateTimeDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"GuidIn\" DataType=\"GuidDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ByteStringIn\" DataType=\"ByteStringDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"XmlElementIn\" DataType=\"XmlElementDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"NodeIdIn\" DataType=\"NodeIdDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ExpandedNodeIdIn\" DataType=\"ExpandedNodeIdDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"QualifiedNameIn\" DataType=\"QualifiedNameDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"LocalizedTextIn\" DataType=\"LocalizedTextDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"StatusCodeIn\" DataType=\"StatusCodeDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"VariantIn\" DataType=\"VariantDataType\" ValueRank=\"Array\" />\n    </opc:InputArguments>\n    <opc:OutputArguments>\n      <opc:Argument Name=\"DateTimeOut\" DataType=\"DateTimeDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"GuidOut\" DataType=\"GuidDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ByteStringOut\" DataType=\"ByteStringDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"XmlElementOut\" DataType=\"XmlElementDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"NodeIdOut\" DataType=\"NodeIdDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"ExpandedNodeIdOut\" DataType=\"ExpandedNodeIdDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"QualifiedNameOut\" DataType=\"QualifiedNameDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"LocalizedTextOut\" DataType=\"LocalizedTextDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"StatusCodeOut\" DataType=\"StatusCodeDataType\" ValueRank=\"Array\" />\n      <opc:Argument Name=\"VariantOut\" DataType=\"VariantDataType\" ValueRank=\"Array\" />\n    </opc:OutputArguments>\n  </opc:Method>\n\n  <opc:ObjectType SymbolicName=\"MethodTestType\" BaseType=\"ua:FolderType\">\n    <opc:Children>\n      <opc:Method SymbolicName=\"ScalarMethod1\" TypeDefinition=\"ScalarValue1MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"ScalarMethod2\" TypeDefinition=\"ScalarValue2MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"ScalarMethod3\" TypeDefinition=\"ScalarValue3MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"ArrayMethod1\" TypeDefinition=\"ArrayValue1MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"ArrayMethod2\" TypeDefinition=\"ArrayValue2MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"ArrayMethod3\" TypeDefinition=\"ArrayValue3MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"UserScalarMethod1\" TypeDefinition=\"UserScalarValue1MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"UserScalarMethod2\" TypeDefinition=\"UserScalarValue2MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"UserArrayMethod1\" TypeDefinition=\"UserArrayValue1MethodType\" ModellingRule=\"Mandatory\" />\n      <opc:Method SymbolicName=\"UserArrayMethod2\" TypeDefinition=\"UserArrayValue2MethodType\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"TestSystemConditionType\" BaseType=\"ua:ConditionType\">\n    <opc:Children>\n      <opc:Property SymbolicName=\"MonitoredNodeCount\" DataType=\"ua:Int32\" ModellingRule=\"Mandatory\" />\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:Object SymbolicName=\"Data\" TypeDefinition=\"ua:FolderType\" SupportsEvents=\"true\">\n    <opc:Children>\n      <opc:Object SymbolicName=\"Static\" TypeDefinition=\"ua:FolderType\" SupportsEvents=\"true\">\n        <opc:Children>\n          <opc:Object SymbolicName=\"Scalar\" TypeDefinition=\"ScalarValueObjectType\" ModellingRule=\"Mandatory\"/>\n          <opc:Object SymbolicName=\"Array\" TypeDefinition=\"ArrayValueObjectType\" ModellingRule=\"Mandatory\"/>\n          <opc:Object SymbolicName=\"UserScalar\" TypeDefinition=\"UserScalarValueObjectType\" ModellingRule=\"Mandatory\"/>\n          <opc:Object SymbolicName=\"UserArray\" TypeDefinition=\"UserArrayValueObjectType\" ModellingRule=\"Mandatory\"/>\n          <opc:Object SymbolicName=\"AnalogScalar\" TypeDefinition=\"AnalogScalarValueObjectType\" ModellingRule=\"Mandatory\"/>\n          <opc:Object SymbolicName=\"AnalogArray\" TypeDefinition=\"AnalogArrayValueObjectType\" ModellingRule=\"Mandatory\"/>\n          <opc:Object SymbolicName=\"MethodTest\" TypeDefinition=\"MethodTestType\" ModellingRule=\"Mandatory\"/>\n        </opc:Children>\n        <opc:References>\n          <opc:Reference>\n            <opc:ReferenceType>ua:HasEventSource</opc:ReferenceType>\n            <opc:TargetId>Data_Static_Scalar</opc:TargetId>\n          </opc:Reference>\n          <opc:Reference>\n            <opc:ReferenceType>ua:HasEventSource</opc:ReferenceType>\n            <opc:TargetId>Data_Static_Array</opc:TargetId>\n          </opc:Reference>\n        </opc:References>\n      </opc:Object>\n      <opc:Object SymbolicName=\"Dynamic\" TypeDefinition=\"ua:FolderType\" SupportsEvents=\"true\">\n        <opc:Children>\n          <opc:Object SymbolicName=\"Scalar\" TypeDefinition=\"ScalarValueObjectType\" ModellingRule=\"Mandatory\">\n            <opc:Children>\n              <opc:Property SymbolicName=\"SimulationActive\">\n                <opc:DefaultValue>\n                  <uax:Boolean>true</uax:Boolean>\n                </opc:DefaultValue>\n              </opc:Property>\n            </opc:Children>\n          </opc:Object>\n          <opc:Object SymbolicName=\"Array\" TypeDefinition=\"ArrayValueObjectType\" ModellingRule=\"Mandatory\">\n            <opc:Children>\n              <opc:Property SymbolicName=\"SimulationActive\">\n                <opc:DefaultValue>\n                  <uax:Boolean>true</uax:Boolean>\n                </opc:DefaultValue>\n              </opc:Property>\n            </opc:Children>\n          </opc:Object>\n          <opc:Object SymbolicName=\"UserScalar\" TypeDefinition=\"UserScalarValueObjectType\" ModellingRule=\"Mandatory\">\n            <opc:Children>\n              <opc:Property SymbolicName=\"SimulationActive\">\n                <opc:DefaultValue>\n                  <uax:Boolean>true</uax:Boolean>\n                </opc:DefaultValue>\n              </opc:Property>\n            </opc:Children>\n          </opc:Object>\n          <opc:Object SymbolicName=\"UserArray\" TypeDefinition=\"UserArrayValueObjectType\" ModellingRule=\"Mandatory\">\n            <opc:Children>\n              <opc:Property SymbolicName=\"SimulationActive\">\n                <opc:DefaultValue>\n                  <uax:Boolean>true</uax:Boolean>\n                </opc:DefaultValue>\n              </opc:Property>\n            </opc:Children>\n          </opc:Object>\n          <opc:Object SymbolicName=\"AnalogScalar\" TypeDefinition=\"AnalogScalarValueObjectType\" ModellingRule=\"Mandatory\">\n            <opc:Children>\n              <opc:Property SymbolicName=\"SimulationActive\">\n                <opc:DefaultValue>\n                  <uax:Boolean>true</uax:Boolean>\n                </opc:DefaultValue>\n              </opc:Property>\n            </opc:Children>\n          </opc:Object>\n          <opc:Object SymbolicName=\"AnalogArray\" TypeDefinition=\"AnalogArrayValueObjectType\" ModellingRule=\"Mandatory\">\n            <opc:Children>\n              <opc:Property SymbolicName=\"SimulationActive\">\n                <opc:DefaultValue>\n                  <uax:Boolean>true</uax:Boolean>\n                </opc:DefaultValue>\n              </opc:Property>\n            </opc:Children>\n          </opc:Object>\n        </opc:Children>\n        <opc:References>\n          <opc:Reference>\n            <opc:ReferenceType>ua:HasEventSource</opc:ReferenceType>\n            <opc:TargetId>Data_Dynamic_Scalar</opc:TargetId>\n          </opc:Reference>\n          <opc:Reference>\n            <opc:ReferenceType>ua:HasEventSource</opc:ReferenceType>\n            <opc:TargetId>Data_Dynamic_Array</opc:TargetId>\n          </opc:Reference>\n        </opc:References>\n      </opc:Object>\n      <opc:Object SymbolicName=\"Conditions\" TypeDefinition=\"ua:FolderType\" SupportsEvents=\"true\">\n        <opc:Children>\n          <opc:Object SymbolicName=\"SystemStatus\" TypeDefinition=\"TestSystemConditionType\" ModellingRule=\"Mandatory\" />\n        </opc:Children>\n        <opc:References>\n          <opc:Reference>\n            <opc:ReferenceType>ua:HasEventSource</opc:ReferenceType>\n            <opc:TargetId>Data_Conditions_SystemStatus</opc:TargetId>\n          </opc:Reference>\n        </opc:References>\n      </opc:Object>\n    </opc:Children>\n    <opc:References>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ObjectsFolder</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>ua:Server</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>Data_Static</opc:TargetId>\n      </opc:Reference>\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>Data_Dynamic</opc:TargetId>\n      </opc:Reference>\n      <!--\n      <opc:Reference>\n        <opc:ReferenceType>ua:HasNotifier</opc:ReferenceType>\n        <opc:TargetId>Data_Conditions</opc:TargetId>\n      </opc:Reference>\n      -->\n    </opc:References>\n  </opc:Object>\n\n</opc:ModelDesign>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/ModelDesign1.csv",
    "content": "Vehicles_XmlSchema,287,Variable\nVehicles_XmlSchema_DataTypeVersion,288,Variable\nVehicles_XmlSchema_NamespaceUri,289,Variable\nVehicles_BinarySchema,302,Variable\nVehicles_BinarySchema_DataTypeVersion,303,Variable\nVehicles_BinarySchema_NamespaceUri,304,Variable\nVehicleType,314,DataType\nCarType,315,DataType\nTruckType,316,DataType\nVehicleType_Encoding_DefaultXml,317,Object\nCarType_Encoding_DefaultXml,318,Object\nTruckType_Encoding_DefaultXml,319,Object\nVehicles_XmlSchema_VehicleType,320,Variable\nVehicles_XmlSchema_VehicleType_DataTypeVersion,321,Variable\nVehicles_XmlSchema_VehicleType_DictionaryFragment,322,Variable\nVehicles_XmlSchema_CarType,323,Variable\nVehicles_XmlSchema_CarType_DataTypeVersion,324,Variable\nVehicles_XmlSchema_CarType_DictionaryFragment,325,Variable\nVehicles_XmlSchema_TruckType,326,Variable\nVehicles_XmlSchema_TruckType_DataTypeVersion,327,Variable\nVehicles_XmlSchema_TruckType_DictionaryFragment,328,Variable\nVehicleType_Encoding_DefaultBinary,329,Object\nCarType_Encoding_DefaultBinary,330,Object\nTruckType_Encoding_DefaultBinary,331,Object\nVehicles_BinarySchema_VehicleType,332,Variable\nVehicles_BinarySchema_VehicleType_DataTypeVersion,333,Variable\nVehicles_BinarySchema_VehicleType_DictionaryFragment,334,Variable\nVehicles_BinarySchema_CarType,335,Variable\nVehicles_BinarySchema_CarType_DataTypeVersion,336,Variable\nVehicles_BinarySchema_CarType_DictionaryFragment,337,Variable\nVehicles_BinarySchema_TruckType,338,Variable\nVehicles_BinarySchema_TruckType_DataTypeVersion,339,Variable\nVehicles_BinarySchema_TruckType_DictionaryFragment,340,Variable\nDriverType,341,ObjectType\nDriverType_PrimaryVehicle,342,Variable\nDriverType_OwnedVehicles,344,Variable\nVehicles_BinarySchema_Deprecated,15001,Variable\nVehicles_XmlSchema_Deprecated,15002,Variable\nVehicleType_Encoding_DefaultJson,15003,Object\nCarType_Encoding_DefaultJson,15004,Object\nTruckType_Encoding_DefaultJson,15005,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/ModelDesign1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns=\"http://opcfoundation.org/UA/Vehicles/Types\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Vehicles/Types\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"Vehicles\" Prefix=\"Vehicles.Types\" InternalPrefix=\"Vehicles.Types\">http://opcfoundation.org/UA/Vehicles/Types</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:DataType SymbolicName=\"VehicleType\" BaseType=\"ua:Structure\">\n    <opc:Fields>\n      <opc:Field Name=\"Make\" DataType=\"ua:String\"></opc:Field>\n      <opc:Field Name=\"Model\" DataType=\"ua:String\"></opc:Field>\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:DataType SymbolicName=\"CarType\" BaseType=\"VehicleType\">\n    <opc:Fields>\n      <opc:Field Name=\"NoOfPassengers\" DataType=\"ua:UInt32\"></opc:Field>\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:DataType SymbolicName=\"TruckType\" BaseType=\"VehicleType\">\n    <opc:Fields>\n      <opc:Field Name=\"CargoCapacity\" DataType=\"ua:UInt32\"></opc:Field>\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:ObjectType SymbolicName=\"DriverType\">\n    <opc:Children>\n      <opc:Property SymbolicName=\"PrimaryVehicle\" DataType=\"VehicleType\" ValueRank=\"Scalar\" AccessLevel=\"ReadWrite\">\n        <opc:DefaultValue>\n          <uax:ExtensionObject>\n            <uax:Body>\n              <CarType>\n                <Make>Toyota</Make>\n                <Model>Prius</Model>\n                <NoOfPassengers>4</NoOfPassengers>\n              </CarType>\n            </uax:Body>\n          </uax:ExtensionObject>\n        </opc:DefaultValue>\n      </opc:Property>\n      <opc:Property SymbolicName=\"OwnedVehicles\" DataType=\"VehicleType\" ValueRank=\"Array\" AccessLevel=\"ReadWrite\">\n        <opc:DefaultValue>\n          <uax:ListOfExtensionObject>\n            <uax:ExtensionObject>\n              <uax:Body>\n                <TruckType>\n                  <Make>Dodge</Make>\n                  <Model>Ram</Model>\n                  <CargoCapacity>500</CargoCapacity>\n                </TruckType>\n              </uax:Body>\n            </uax:ExtensionObject>\n            <uax:ExtensionObject>\n              <uax:Body>\n                <VehicleType xsi:type=\"CarType\">\n                  <Make>Porche</Make>\n                  <Model>Roadster</Model>\n                  <NoOfPassengers>2</NoOfPassengers>\n                </VehicleType>\n              </uax:Body>\n            </uax:ExtensionObject>\n          </uax:ListOfExtensionObject>\n        </opc:DefaultValue>\n      </opc:Property>\n    </opc:Children>\n  </opc:ObjectType>\n\n</opc:ModelDesign>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/ModelDesign2.csv",
    "content": "ParkingLot,281,Object\nParkingLot_VehiclesInLot,283,Variable\nVehiclesInstances_XmlSchema,341,Variable\nVehiclesInstances_XmlSchema_DataTypeVersion,342,Variable\nVehiclesInstances_XmlSchema_NamespaceUri,343,Variable\nVehiclesInstances_BinarySchema,353,Variable\nVehiclesInstances_BinarySchema_DataTypeVersion,354,Variable\nVehiclesInstances_BinarySchema_NamespaceUri,355,Variable\nBicycleType,365,DataType\nBicycleType_Encoding_DefaultXml,366,Object\nVehiclesInstances_XmlSchema_BicycleType,367,Variable\nVehiclesInstances_XmlSchema_BicycleType_DataTypeVersion,368,Variable\nVehiclesInstances_XmlSchema_BicycleType_DictionaryFragment,369,Variable\nBicycleType_Encoding_DefaultBinary,370,Object\nVehiclesInstances_BinarySchema_BicycleType,371,Variable\nVehiclesInstances_BinarySchema_BicycleType_DataTypeVersion,372,Variable\nVehiclesInstances_BinarySchema_BicycleType_DictionaryFragment,373,Variable\nParkingLot_DriverOfTheMonth,375,Object\nParkingLot_DriverOfTheMonth_PrimaryVehicle,376,Variable\nParkingLot_DriverOfTheMonth_OwnedVehicles,377,Variable\nParkingLotType,378,DataType\nParkingLot_LotType,380,Variable\nParkingLotType_EnumValues,15001,Variable\nVehiclesInstances_BinarySchema_Deprecated,15002,Variable\nVehiclesInstances_XmlSchema_Deprecated,15003,Variable\nBicycleType_Encoding_DefaultJson,15004,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/ModelDesign2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:s0=\"http://opcfoundation.org/UA/Vehicles/Types\"\n\txmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Vehicles/Instances\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"Vehicles\" Prefix=\"Vehicles.Types\" InternalPrefix=\"Vehicles.Types\" FilePath=\"ModelDesign1.xml\">http://opcfoundation.org/UA/Vehicles/Types</opc:Namespace>\n    <opc:Namespace Name=\"VehiclesInstances\" Prefix=\"Vehicles.Instances\" InternalPrefix=\"Vehicles.Instances\">http://opcfoundation.org/UA/Vehicles/Instances</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:DataType SymbolicName=\"ParkingLotType\" BaseType=\"ua:Enumeration\">\n    <opc:Fields>\n      <opc:Field Name=\"Open\" Identifier=\"1\"></opc:Field>\n      <opc:Field Name=\"Covered\" Identifier=\"2\"></opc:Field>\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:DataType SymbolicName=\"BicycleType\" BaseType=\"s0:VehicleType\">\n    <opc:Fields>\n      <opc:Field Name=\"NoOfGears\" DataType=\"ua:UInt32\"></opc:Field>\n      <opc:Field Name=\"ManufacterName\" DataType=\"ua:QualifiedName\"></opc:Field>\n    </opc:Fields>\n  </opc:DataType>\n\n  <opc:Object SymbolicName=\"ParkingLot\">\n    <opc:Children>\n      <opc:Property SymbolicName=\"LotType\" DataType=\"ParkingLotType\" AccessLevel=\"ReadWrite\"></opc:Property>\n        <opc:Object SymbolicName=\"DriverOfTheMonth\" TypeDefinition=\"s0:DriverType\">\n        <opc:Children>\n          <opc:Property SymbolicName=\"s0:PrimaryVehicle\">\n            <opc:DefaultValue>\n              <uax:ExtensionObject>\n                <uax:Body>\n                  <BicycleType>\n                    <s0:Make>Trek</s0:Make>\n                    <s0:Model>Compact</s0:Model>\n                    <NoOfGears>10</NoOfGears>\n                    <ManufacterName>\n                      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n                      <uax:Name>Hello</uax:Name>\n                    </ManufacterName>\n                  </BicycleType>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </opc:DefaultValue>\n          </opc:Property>\n        </opc:Children>\n      </opc:Object>\n      <opc:Variable SymbolicName=\"VehiclesInLot\" DataType=\"s0:VehicleType\" ValueRank=\"Array\"  AccessLevel=\"ReadWrite\"></opc:Variable>\n    </opc:Children>\n    <opc:References>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ObjectsFolder</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:Object>\n\n</opc:ModelDesign>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Instances.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace Vehicles.Instances\n{\n    #region DataType Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypes\n    {\n        /// <summary>\n        /// The identifier for the ParkingLotType DataType.\n        /// </summary>\n        public const uint ParkingLotType = 378;\n\n        /// <summary>\n        /// The identifier for the BicycleType DataType.\n        /// </summary>\n        public const uint BicycleType = 365;\n    }\n    #endregion\n\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the ParkingLot Object.\n        /// </summary>\n        public const uint ParkingLot = 281;\n\n        /// <summary>\n        /// The identifier for the ParkingLot_DriverOfTheMonth Object.\n        /// </summary>\n        public const uint ParkingLot_DriverOfTheMonth = 375;\n\n        /// <summary>\n        /// The identifier for the BicycleType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint BicycleType_Encoding_DefaultBinary = 370;\n\n        /// <summary>\n        /// The identifier for the BicycleType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint BicycleType_Encoding_DefaultXml = 366;\n\n        /// <summary>\n        /// The identifier for the BicycleType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint BicycleType_Encoding_DefaultJson = 15004;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the ParkingLotType_EnumValues Variable.\n        /// </summary>\n        public const uint ParkingLotType_EnumValues = 15001;\n\n        /// <summary>\n        /// The identifier for the ParkingLot_LotType Variable.\n        /// </summary>\n        public const uint ParkingLot_LotType = 380;\n\n        /// <summary>\n        /// The identifier for the ParkingLot_DriverOfTheMonth_PrimaryVehicle Variable.\n        /// </summary>\n        public const uint ParkingLot_DriverOfTheMonth_PrimaryVehicle = 376;\n\n        /// <summary>\n        /// The identifier for the ParkingLot_DriverOfTheMonth_OwnedVehicles Variable.\n        /// </summary>\n        public const uint ParkingLot_DriverOfTheMonth_OwnedVehicles = 377;\n\n        /// <summary>\n        /// The identifier for the ParkingLot_VehiclesInLot Variable.\n        /// </summary>\n        public const uint ParkingLot_VehiclesInLot = 283;\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_BinarySchema Variable.\n        /// </summary>\n        public const uint VehiclesInstances_BinarySchema = 353;\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint VehiclesInstances_BinarySchema_NamespaceUri = 355;\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public const uint VehiclesInstances_BinarySchema_Deprecated = 15002;\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_BinarySchema_BicycleType Variable.\n        /// </summary>\n        public const uint VehiclesInstances_BinarySchema_BicycleType = 371;\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_XmlSchema Variable.\n        /// </summary>\n        public const uint VehiclesInstances_XmlSchema = 341;\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint VehiclesInstances_XmlSchema_NamespaceUri = 343;\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public const uint VehiclesInstances_XmlSchema_Deprecated = 15003;\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_XmlSchema_BicycleType Variable.\n        /// </summary>\n        public const uint VehiclesInstances_XmlSchema_BicycleType = 367;\n    }\n    #endregion\n\n    #region DataType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypeIds\n    {\n        /// <summary>\n        /// The identifier for the ParkingLotType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId ParkingLotType = new ExpandedNodeId(Vehicles.Instances.DataTypes.ParkingLotType, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the BicycleType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId BicycleType = new ExpandedNodeId(Vehicles.Instances.DataTypes.BicycleType, Vehicles.Instances.Namespaces.VehiclesInstances);\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the ParkingLot Object.\n        /// </summary>\n        public static readonly ExpandedNodeId ParkingLot = new ExpandedNodeId(Vehicles.Instances.Objects.ParkingLot, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the ParkingLot_DriverOfTheMonth Object.\n        /// </summary>\n        public static readonly ExpandedNodeId ParkingLot_DriverOfTheMonth = new ExpandedNodeId(Vehicles.Instances.Objects.ParkingLot_DriverOfTheMonth, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the BicycleType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BicycleType_Encoding_DefaultBinary = new ExpandedNodeId(Vehicles.Instances.Objects.BicycleType_Encoding_DefaultBinary, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the BicycleType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BicycleType_Encoding_DefaultXml = new ExpandedNodeId(Vehicles.Instances.Objects.BicycleType_Encoding_DefaultXml, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the BicycleType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BicycleType_Encoding_DefaultJson = new ExpandedNodeId(Vehicles.Instances.Objects.BicycleType_Encoding_DefaultJson, Vehicles.Instances.Namespaces.VehiclesInstances);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the ParkingLotType_EnumValues Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ParkingLotType_EnumValues = new ExpandedNodeId(Vehicles.Instances.Variables.ParkingLotType_EnumValues, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the ParkingLot_LotType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ParkingLot_LotType = new ExpandedNodeId(Vehicles.Instances.Variables.ParkingLot_LotType, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the ParkingLot_DriverOfTheMonth_PrimaryVehicle Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ParkingLot_DriverOfTheMonth_PrimaryVehicle = new ExpandedNodeId(Vehicles.Instances.Variables.ParkingLot_DriverOfTheMonth_PrimaryVehicle, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the ParkingLot_DriverOfTheMonth_OwnedVehicles Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ParkingLot_DriverOfTheMonth_OwnedVehicles = new ExpandedNodeId(Vehicles.Instances.Variables.ParkingLot_DriverOfTheMonth_OwnedVehicles, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the ParkingLot_VehiclesInLot Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId ParkingLot_VehiclesInLot = new ExpandedNodeId(Vehicles.Instances.Variables.ParkingLot_VehiclesInLot, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_BinarySchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId VehiclesInstances_BinarySchema = new ExpandedNodeId(Vehicles.Instances.Variables.VehiclesInstances_BinarySchema, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId VehiclesInstances_BinarySchema_NamespaceUri = new ExpandedNodeId(Vehicles.Instances.Variables.VehiclesInstances_BinarySchema_NamespaceUri, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId VehiclesInstances_BinarySchema_Deprecated = new ExpandedNodeId(Vehicles.Instances.Variables.VehiclesInstances_BinarySchema_Deprecated, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_BinarySchema_BicycleType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId VehiclesInstances_BinarySchema_BicycleType = new ExpandedNodeId(Vehicles.Instances.Variables.VehiclesInstances_BinarySchema_BicycleType, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_XmlSchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId VehiclesInstances_XmlSchema = new ExpandedNodeId(Vehicles.Instances.Variables.VehiclesInstances_XmlSchema, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId VehiclesInstances_XmlSchema_NamespaceUri = new ExpandedNodeId(Vehicles.Instances.Variables.VehiclesInstances_XmlSchema_NamespaceUri, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId VehiclesInstances_XmlSchema_Deprecated = new ExpandedNodeId(Vehicles.Instances.Variables.VehiclesInstances_XmlSchema_Deprecated, Vehicles.Instances.Namespaces.VehiclesInstances);\n\n        /// <summary>\n        /// The identifier for the VehiclesInstances_XmlSchema_BicycleType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId VehiclesInstances_XmlSchema_BicycleType = new ExpandedNodeId(Vehicles.Instances.Variables.VehiclesInstances_XmlSchema_BicycleType, Vehicles.Instances.Namespaces.VehiclesInstances);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the BicycleType component.\n        /// </summary>\n        public const string BicycleType = \"BicycleType\";\n\n        /// <summary>\n        /// The BrowseName for the DriverOfTheMonth component.\n        /// </summary>\n        public const string DriverOfTheMonth = \"DriverOfTheMonth\";\n\n        /// <summary>\n        /// The BrowseName for the LotType component.\n        /// </summary>\n        public const string LotType = \"LotType\";\n\n        /// <summary>\n        /// The BrowseName for the ParkingLot component.\n        /// </summary>\n        public const string ParkingLot = \"ParkingLot\";\n\n        /// <summary>\n        /// The BrowseName for the ParkingLotType component.\n        /// </summary>\n        public const string ParkingLotType = \"ParkingLotType\";\n\n        /// <summary>\n        /// The BrowseName for the VehiclesInLot component.\n        /// </summary>\n        public const string VehiclesInLot = \"VehiclesInLot\";\n\n        /// <summary>\n        /// The BrowseName for the VehiclesInstances_BinarySchema component.\n        /// </summary>\n        public const string VehiclesInstances_BinarySchema = \"Vehicles.Instances\";\n\n        /// <summary>\n        /// The BrowseName for the VehiclesInstances_XmlSchema component.\n        /// </summary>\n        public const string VehiclesInstances_XmlSchema = \"Vehicles.Instances\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the Vehicles namespace (.NET code namespace is 'Vehicles.Types').\n        /// </summary>\n        public const string Vehicles = \"http://opcfoundation.org/UA/Vehicles/Types\";\n\n        /// <summary>\n        /// The URI for the VehiclesInstances namespace (.NET code namespace is 'Vehicles.Instances').\n        /// </summary>\n        public const string VehiclesInstances = \"http://opcfoundation.org/UA/Vehicles/Instances\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Instances.DataTypes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\nusing Vehicles.Types;\n\nnamespace Vehicles.Instances\n{\n    #region ParkingLotType Enumeration\n#if (!OPCUA_EXCLUDE_ParkingLotType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = Vehicles.Instances.Namespaces.VehiclesInstances)]\n    public enum ParkingLotType\n    {\n        /// <inheritdoc/>\n        [EnumMember(Value = \"Open_1\")]\n        Open = 1,\n\n        /// <inheritdoc/>\n        [EnumMember(Value = \"Covered_2\")]\n        Covered = 2,\n    }\n\n    #region ParkingLotTypeCollection Class\n    /// <summary>\n    /// A collection of ParkingLotType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfParkingLotType\", Namespace = Vehicles.Instances.Namespaces.VehiclesInstances, ItemName = \"ParkingLotType\")]\n#if !NET_STANDARD\n    public partial class ParkingLotTypeCollection : List<ParkingLotType>, ICloneable\n#else\n    public partial class ParkingLotTypeCollection : List<ParkingLotType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public ParkingLotTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public ParkingLotTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public ParkingLotTypeCollection(IEnumerable<ParkingLotType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator ParkingLotTypeCollection(ParkingLotType[] values)\n        {\n            if (values != null)\n            {\n                return new ParkingLotTypeCollection(values);\n            }\n\n            return new ParkingLotTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator ParkingLotType[](ParkingLotTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (ParkingLotTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            ParkingLotTypeCollection clone = new ParkingLotTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((ParkingLotType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region BicycleType Class\n#if (!OPCUA_EXCLUDE_BicycleType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = Vehicles.Instances.Namespaces.VehiclesInstances)]\n    public partial class BicycleType : VehicleType\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public BicycleType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_noOfGears = (uint)0;\n            m_manufacterName = null;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        [DataMember(Name = \"NoOfGears\", IsRequired = false, Order = 1)]\n        public uint NoOfGears\n        {\n            get { return m_noOfGears; }\n            set { m_noOfGears = value; }\n        }\n\n        /// <inheritdoc/>\n        [DataMember(Name = \"ManufacterName\", IsRequired = false, Order = 2)]\n        public QualifiedName ManufacterName\n        {\n            get { return m_manufacterName; }\n            set { m_manufacterName = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public override ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.BicycleType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public override ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.BicycleType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public override ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.BicycleType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public override void Encode(IEncoder encoder)\n        {\n            base.Encode(encoder);\n\n            encoder.PushNamespace(Vehicles.Instances.Namespaces.VehiclesInstances);\n\n            encoder.WriteUInt32(\"NoOfGears\", NoOfGears);\n            encoder.WriteQualifiedName(\"ManufacterName\", ManufacterName);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public override void Decode(IDecoder decoder)\n        {\n            base.Decode(decoder);\n\n            decoder.PushNamespace(Vehicles.Instances.Namespaces.VehiclesInstances);\n\n            NoOfGears = decoder.ReadUInt32(\"NoOfGears\");\n            ManufacterName = decoder.ReadQualifiedName(\"ManufacterName\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public override bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            BicycleType value = encodeable as BicycleType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!base.IsEqual(encodeable)) return false;\n            if (!Utils.IsEqual(m_noOfGears, value.m_noOfGears)) return false;\n            if (!Utils.IsEqual(m_manufacterName, value.m_manufacterName)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public override object Clone()\n        {\n            return (BicycleType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            BicycleType clone = (BicycleType)base.MemberwiseClone();\n\n            clone.m_noOfGears = (uint)Utils.Clone(this.m_noOfGears);\n            clone.m_manufacterName = (QualifiedName)Utils.Clone(this.m_manufacterName);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private uint m_noOfGears;\n        private QualifiedName m_manufacterName;\n        #endregion\n    }\n\n    #region BicycleTypeCollection Class\n    /// <summary>\n    /// A collection of BicycleType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfBicycleType\", Namespace = Vehicles.Instances.Namespaces.VehiclesInstances, ItemName = \"BicycleType\")]\n#if !NET_STANDARD\n    public partial class BicycleTypeCollection : List<BicycleType>, ICloneable\n#else\n    public partial class BicycleTypeCollection : List<BicycleType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public BicycleTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public BicycleTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public BicycleTypeCollection(IEnumerable<BicycleType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator BicycleTypeCollection(BicycleType[] values)\n        {\n            if (values != null)\n            {\n                return new BicycleTypeCollection(values);\n            }\n\n            return new BicycleTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator BicycleType[](BicycleTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (BicycleTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            BicycleTypeCollection clone = new BicycleTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((BicycleType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Instances.NodeIds.csv",
    "content": "BicycleType,365,DataType\nBicycleType_Encoding_DefaultBinary,370,Object\nBicycleType_Encoding_DefaultJson,15004,Object\nBicycleType_Encoding_DefaultXml,366,Object\nParkingLot,281,Object\nParkingLotType,378,DataType\nVehiclesInstances_BinarySchema,353,Variable\nVehiclesInstances_XmlSchema,341,Variable\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Instances.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/UA/Vehicles/Instances</String>\n    <String>http://opcfoundation.org/UA/Vehicles/Types</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=281</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ParkingLot</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ParkingLot</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=85</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=380</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=375</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=283</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=283</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VehiclesInLot</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VehiclesInLot</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=63</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=2;i=314</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=341</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Vehicles.Instances</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Vehicles.Instances</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=92</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=343</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=367</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczpzMT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGlj\nbGVzL1R5cGVzIg0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL0lu\nc3RhbmNlcyINCiAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEv\nVmVoaWNsZXMvSW5zdGFuY2VzIg0KICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4N\nCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4\nLzAyL1R5cGVzLnhzZCIgLz4NCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3Vu\nZGF0aW9uLm9yZy9VQS9WZWhpY2xlcy9UeXBlcyIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFt\nZT0iUGFya2luZ0xvdFR5cGUiPg0KICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmci\nPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuXzEiIC8+DQogICAgICA8eHM6ZW51\nbWVyYXRpb24gdmFsdWU9IkNvdmVyZWRfMiIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8\nL3hzOnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBhcmtpbmdMb3RUeXBlIiB0eXBl\nPSJ0bnM6UGFya2luZ0xvdFR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RP\nZlBhcmtpbmdMb3RUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJQYXJraW5nTG90VHlwZSIgdHlwZT0idG5zOlBhcmtpbmdMb3RUeXBlIiBtaW5PY2N1cnM9\nIjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6\nY29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlBhcmtpbmdMb3RUeXBlIiB0\neXBlPSJ0bnM6TGlzdE9mUGFya2luZ0xvdFR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1l\nbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkJpY3ljbGVUeXBlIj4NCiAgICA8eHM6Y29t\ncGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iczE6\nVmVoaWNsZVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iTm9PZkdlYXJzIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAv\nPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0ZXJOYW1lIiB0eXBlPSJ1YTpR\ndWFsaWZpZWROYW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8\nL3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29u\ndGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQmljeWNsZVR5\ncGUiIHR5cGU9InRuczpCaWN5Y2xlVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i\nTGlzdE9mQmljeWNsZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9IkJpY3ljbGVUeXBlIiB0eXBlPSJ0bnM6QmljeWNsZVR5cGUiIG1pbk9jY3Vycz0iMCIg\nbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVu\nY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkJpY3lj\nbGVUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mQmljeWNsZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hz\nOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1hPg==</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=343</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Vehicles/Instances</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=353</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Vehicles.Instances</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Vehicles.Instances</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=93</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=355</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=371</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpzMT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3Jn\nL1VBL1ZlaGljbGVzL1R5cGVzIg0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvSW5z\ndGFuY2VzIg0KICBEZWZhdWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVz\ncGFjZT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL0luc3RhbmNlcyINCj4N\nCiAgPG9wYzpJbXBvcnQgTmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBM\nb2NhdGlvbj0iT3BjLlVhLkJpbmFyeVNjaGVtYS5ic2QiLz4NCiAgPG9wYzpJbXBvcnQgTmFtZXNw\nYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlwZXMiIExvY2F0aW9u\nPSJWZWhpY2xlcy5UeXBlcy5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9wYzpFbnVtZXJhdGVk\nVHlwZSBOYW1lPSJQYXJraW5nTG90VHlwZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpF\nbnVtZXJhdGVkVmFsdWUgTmFtZT0iT3BlbiIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJh\ndGVkVmFsdWUgTmFtZT0iQ292ZXJlZCIgVmFsdWU9IjIiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRU\neXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQmljeWNsZVR5cGUiIEJhc2VUeXBl\nPSJzMTpWZWhpY2xlVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNYWtlIiBUeXBlTmFtZT0i\nb3BjOlN0cmluZyIgU291cmNlVHlwZT0iczE6VmVoaWNsZVR5cGUiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJNb2RlbCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5cGU9InMxOlZlaGlj\nbGVUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkdlYXJzIiBUeXBlTmFtZT0ib3Bj\nOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1hbnVmYWN0ZXJOYW1lIiBUeXBlTmFt\nZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCjwvb3Bj\nOlR5cGVEaWN0aW9uYXJ5Pg==</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=355</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=353</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Vehicles/Instances</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=365</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BicycleType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BicycleType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=2;i=314</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=370</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=366</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=366</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=365</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=367</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=367</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BicycleType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BicycleType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='BicycleType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=370</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=365</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=371</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=371</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BicycleType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BicycleType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=353</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">BicycleType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=375</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DriverOfTheMonth</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DriverOfTheMonth</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=2;i=341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=376</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=377</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=376</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>PrimaryVehicle</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PrimaryVehicle</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=375</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <TypeId>\n              <Identifier>ns=2;i=366</Identifier>\n            </TypeId>\n            <Body>\n              <BicycleType xmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n                <s0:Make xmlns:s0=\"http://opcfoundation.org/UA/Vehicles/Types\">Trek</s0:Make>\n                <s0:Model xmlns:s0=\"http://opcfoundation.org/UA/Vehicles/Types\">Compact</s0:Model>\n                <NoOfGears>10</NoOfGears>\n                <ManufacterName>\n                  <uax:NamespaceIndex xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:NamespaceIndex>\n                  <uax:Name xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">Hello</uax:Name>\n                </ManufacterName>\n              </BicycleType>\n            </Body>\n          </ExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=2;i=314</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=377</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>OwnedVehicles</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OwnedVehicles</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=375</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>ns=1;i=319</Identifier>\n              </TypeId>\n              <Body>\n                <TruckType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                  <Make>Dodge</Make>\n                  <Model>Ram</Model>\n                  <CargoCapacity>500</CargoCapacity>\n                </TruckType>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>ns=1;i=318</Identifier>\n              </TypeId>\n              <Body>\n                <VehicleType xsi:type=\"CarType\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                  <Make>Porche</Make>\n                  <Model>Roadster</Model>\n                  <NoOfPassengers>2</NoOfPassengers>\n                </VehicleType>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=2;i=314</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=378</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>ParkingLotType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>ParkingLotType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=29</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=380</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LotType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LotType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=281</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=378</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15001</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EnumValues</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EnumValues</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=378</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=7616</Identifier>\n              </TypeId>\n              <Body>\n                <EnumValueType>\n                  <Value>1</Value>\n                  <DisplayName>\n                    <Locale></Locale>\n                    <Text>Open</Text>\n                  </DisplayName>\n                </EnumValueType>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>i=7616</Identifier>\n              </TypeId>\n              <Body>\n                <EnumValueType>\n                  <Value>2</Value>\n                  <DisplayName>\n                    <Locale></Locale>\n                    <Text>Covered</Text>\n                  </DisplayName>\n                </EnumValueType>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=7594</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15002</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=353</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15003</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15004</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=365</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Instances.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/Vehicles/Instances</Uri>\n    <Uri>http://opcfoundation.org/UA/Vehicles/Types</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/Vehicles/Types\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UADataType NodeId=\"ns=1;i=378\" BrowseName=\"1:ParkingLotType\">\n    <DisplayName>ParkingLotType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15001</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=29</Reference>\n    </References>\n    <Definition Name=\"1:ParkingLotType\">\n      <Field Name=\"Open\" Value=\"1\" />\n      <Field Name=\"Covered\" Value=\"2\" />\n    </Definition>\n  </UADataType>\n  <UAVariable NodeId=\"ns=1;i=15001\" BrowseName=\"EnumValues\" ParentNodeId=\"ns=1;i=378\" DataType=\"i=7594\" ValueRank=\"1\" ArrayDimensions=\"0\">\n    <DisplayName>EnumValues</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=378</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=7616</Identifier>\n          </TypeId>\n          <Body>\n            <EnumValueType>\n              <Value>1</Value>\n              <DisplayName>\n                <Locale>\n                </Locale>\n                <Text>Open</Text>\n              </DisplayName>\n            </EnumValueType>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>i=7616</Identifier>\n          </TypeId>\n          <Body>\n            <EnumValueType>\n              <Value>2</Value>\n              <DisplayName>\n                <Locale>\n                </Locale>\n                <Text>Covered</Text>\n              </DisplayName>\n            </EnumValueType>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UADataType NodeId=\"ns=1;i=365\" BrowseName=\"1:BicycleType\">\n    <DisplayName>BicycleType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=2;i=314</Reference>\n    </References>\n    <Definition Name=\"1:BicycleType\">\n      <Field Name=\"NoOfGears\" DataType=\"i=7\" />\n      <Field Name=\"ManufacterName\" DataType=\"i=20\" />\n    </Definition>\n  </UADataType>\n  <UAObject NodeId=\"ns=1;i=281\" BrowseName=\"1:ParkingLot\">\n    <DisplayName>ParkingLot</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=380</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=375</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=283</Reference>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=85</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=58</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=380\" BrowseName=\"1:LotType\" ParentNodeId=\"ns=1;i=281\" DataType=\"ns=1;i=378\" AccessLevel=\"3\">\n    <DisplayName>LotType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=281</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=375\" BrowseName=\"1:DriverOfTheMonth\" ParentNodeId=\"ns=1;i=281\">\n    <DisplayName>DriverOfTheMonth</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=376</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=377</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=2;i=341</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=281</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=376\" BrowseName=\"2:PrimaryVehicle\" ParentNodeId=\"ns=1;i=375\" DataType=\"ns=2;i=314\" AccessLevel=\"3\">\n    <DisplayName>PrimaryVehicle</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=375</Reference>\n    </References>\n    <Value>\n      <ExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <TypeId>\n          <Identifier>ns=1;i=366</Identifier>\n        </TypeId>\n        <Body>\n          <BicycleType xmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n            <s0:Make xmlns:s0=\"http://opcfoundation.org/UA/Vehicles/Types\">Trek</s0:Make>\n            <s0:Model xmlns:s0=\"http://opcfoundation.org/UA/Vehicles/Types\">Compact</s0:Model>\n            <NoOfGears>10</NoOfGears>\n            <ManufacterName>\n              <uax:NamespaceIndex xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:NamespaceIndex>\n              <uax:Name xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">Hello</uax:Name>\n            </ManufacterName>\n          </BicycleType>\n        </Body>\n      </ExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=377\" BrowseName=\"2:OwnedVehicles\" ParentNodeId=\"ns=1;i=375\" DataType=\"ns=2;i=314\" ValueRank=\"1\" ArrayDimensions=\"0\" AccessLevel=\"3\">\n    <DisplayName>OwnedVehicles</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=375</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>ns=2;i=319</Identifier>\n          </TypeId>\n          <Body>\n            <TruckType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n              <Make>Dodge</Make>\n              <Model>Ram</Model>\n              <CargoCapacity>500</CargoCapacity>\n            </TruckType>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>ns=2;i=318</Identifier>\n          </TypeId>\n          <Body>\n            <VehicleType xsi:type=\"CarType\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n              <Make>Porche</Make>\n              <Model>Roadster</Model>\n              <NoOfPassengers>2</NoOfPassengers>\n            </VehicleType>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=283\" BrowseName=\"1:VehiclesInLot\" ParentNodeId=\"ns=1;i=281\" DataType=\"ns=2;i=314\" ValueRank=\"1\" ArrayDimensions=\"0\" AccessLevel=\"3\">\n    <DisplayName>VehiclesInLot</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=63</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=281</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=370\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=365</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=371</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=353\" BrowseName=\"1:Vehicles.Instances\" SymbolicName=\"VehiclesInstances_BinarySchema\" DataType=\"ByteString\">\n    <DisplayName>Vehicles.Instances</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=355</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15002</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=371</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=93</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpzMT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3Jn\nL1VBL1ZlaGljbGVzL1R5cGVzIg0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvSW5z\ndGFuY2VzIg0KICBEZWZhdWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVz\ncGFjZT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL0luc3RhbmNlcyINCj4N\nCiAgPG9wYzpJbXBvcnQgTmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBM\nb2NhdGlvbj0iT3BjLlVhLkJpbmFyeVNjaGVtYS5ic2QiLz4NCiAgPG9wYzpJbXBvcnQgTmFtZXNw\nYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlwZXMiIExvY2F0aW9u\nPSJWZWhpY2xlcy5UeXBlcy5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9wYzpFbnVtZXJhdGVk\nVHlwZSBOYW1lPSJQYXJraW5nTG90VHlwZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpF\nbnVtZXJhdGVkVmFsdWUgTmFtZT0iT3BlbiIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJh\ndGVkVmFsdWUgTmFtZT0iQ292ZXJlZCIgVmFsdWU9IjIiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRU\neXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQmljeWNsZVR5cGUiIEJhc2VUeXBl\nPSJzMTpWZWhpY2xlVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNYWtlIiBUeXBlTmFtZT0i\nb3BjOlN0cmluZyIgU291cmNlVHlwZT0iczE6VmVoaWNsZVR5cGUiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJNb2RlbCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5cGU9InMxOlZlaGlj\nbGVUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkdlYXJzIiBUeXBlTmFtZT0ib3Bj\nOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1hbnVmYWN0ZXJOYW1lIiBUeXBlTmFt\nZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCjwvb3Bj\nOlR5cGVEaWN0aW9uYXJ5Pg==</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=355\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=353\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=353</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Vehicles/Instances</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15002\" BrowseName=\"Deprecated\" ParentNodeId=\"ns=1;i=353\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=353</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=371\" BrowseName=\"1:BicycleType\" ParentNodeId=\"ns=1;i=353\" DataType=\"String\">\n    <DisplayName>BicycleType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=353</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">BicycleType</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=366\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=365</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=367</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=341\" BrowseName=\"1:Vehicles.Instances\" SymbolicName=\"VehiclesInstances_XmlSchema\" DataType=\"ByteString\">\n    <DisplayName>Vehicles.Instances</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=343</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15003</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=367</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=92</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczpzMT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGlj\nbGVzL1R5cGVzIg0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL0lu\nc3RhbmNlcyINCiAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEv\nVmVoaWNsZXMvSW5zdGFuY2VzIg0KICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4N\nCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4\nLzAyL1R5cGVzLnhzZCIgLz4NCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3Vu\nZGF0aW9uLm9yZy9VQS9WZWhpY2xlcy9UeXBlcyIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFt\nZT0iUGFya2luZ0xvdFR5cGUiPg0KICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmci\nPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuXzEiIC8+DQogICAgICA8eHM6ZW51\nbWVyYXRpb24gdmFsdWU9IkNvdmVyZWRfMiIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8\nL3hzOnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBhcmtpbmdMb3RUeXBlIiB0eXBl\nPSJ0bnM6UGFya2luZ0xvdFR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RP\nZlBhcmtpbmdMb3RUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJQYXJraW5nTG90VHlwZSIgdHlwZT0idG5zOlBhcmtpbmdMb3RUeXBlIiBtaW5PY2N1cnM9\nIjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6\nY29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlBhcmtpbmdMb3RUeXBlIiB0\neXBlPSJ0bnM6TGlzdE9mUGFya2luZ0xvdFR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1l\nbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkJpY3ljbGVUeXBlIj4NCiAgICA8eHM6Y29t\ncGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iczE6\nVmVoaWNsZVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iTm9PZkdlYXJzIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAv\nPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0ZXJOYW1lIiB0eXBlPSJ1YTpR\ndWFsaWZpZWROYW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8\nL3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29u\ndGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQmljeWNsZVR5\ncGUiIHR5cGU9InRuczpCaWN5Y2xlVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i\nTGlzdE9mQmljeWNsZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9IkJpY3ljbGVUeXBlIiB0eXBlPSJ0bnM6QmljeWNsZVR5cGUiIG1pbk9jY3Vycz0iMCIg\nbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVu\nY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkJpY3lj\nbGVUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mQmljeWNsZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hz\nOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1hPg==</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=343\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=341\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=341</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Vehicles/Instances</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15003\" BrowseName=\"Deprecated\" ParentNodeId=\"ns=1;i=341\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=341</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=367\" BrowseName=\"1:BicycleType\" ParentNodeId=\"ns=1;i=341\" DataType=\"String\">\n    <DisplayName>BicycleType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=341</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='BicycleType']</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=15004\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=365</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Instances.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Vehicles/Types</uax:NamespaceUri>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Vehicles/Instances</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <ParkingLotType xmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=2;i=378</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>2</uax:NamespaceIndex>\n      <uax:Name>ParkingLotType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=29</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14799</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:EnumDefinition>\n          <uax:Fields>\n            <uax:EnumField>\n              <uax:Value>1</uax:Value>\n              <uax:DisplayName>\n                <uax:Text>Open</uax:Text>\n              </uax:DisplayName>\n              <uax:Name>Open</uax:Name>\n            </uax:EnumField>\n            <uax:EnumField>\n              <uax:Value>2</uax:Value>\n              <uax:DisplayName>\n                <uax:Text>Covered</uax:Text>\n              </uax:DisplayName>\n              <uax:Name>Covered</uax:Name>\n            </uax:EnumField>\n          </uax:Fields>\n        </uax:EnumDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n    <EnumValues xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=15001</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>EnumValues</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>15001</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:ListOfExtensionObject>\n            <uax:ExtensionObject>\n              <uax:TypeId>\n                <uax:Identifier>i=7616</uax:Identifier>\n              </uax:TypeId>\n              <uax:Body>\n                <uax:EnumValueType>\n                  <uax:Value>1</uax:Value>\n                  <uax:DisplayName>\n                    <uax:Locale></uax:Locale>\n                    <uax:Text>Open</uax:Text>\n                  </uax:DisplayName>\n                </uax:EnumValueType>\n              </uax:Body>\n            </uax:ExtensionObject>\n            <uax:ExtensionObject>\n              <uax:TypeId>\n                <uax:Identifier>i=7616</uax:Identifier>\n              </uax:TypeId>\n              <uax:Body>\n                <uax:EnumValueType>\n                  <uax:Value>2</uax:Value>\n                  <uax:DisplayName>\n                    <uax:Locale></uax:Locale>\n                    <uax:Text>Covered</uax:Text>\n                  </uax:DisplayName>\n                </uax:EnumValueType>\n              </uax:Body>\n            </uax:ExtensionObject>\n          </uax:ListOfExtensionObject>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=7594</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </EnumValues>\n  </ParkingLotType>\n  <BicycleType xmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=2;i=365</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>2</uax:NamespaceIndex>\n      <uax:Name>BicycleType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=314</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>ns=1;i=314</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>Make</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Model</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>NoOfGears</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=7</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>ManufacterName</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=20</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </BicycleType>\n  <ParkingLot xmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=2;i=281</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>2</uax:NamespaceIndex>\n      <uax:Name>ParkingLot</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>281</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=85</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <LotType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=380</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>2</uax:NamespaceIndex>\n        <uax:Name>LotType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>380</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=2;i=378</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </LotType>\n    <DriverOfTheMonth>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=375</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>2</uax:NamespaceIndex>\n        <uax:Name>DriverOfTheMonth</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>ns=1;i=341</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>375</uax:NumericId>\n      <PrimaryVehicle xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=2;i=376</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>PrimaryVehicle</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>376</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ExtensionObject>\n              <uax:TypeId>\n                <uax:Identifier>ns=2;i=366</uax:Identifier>\n              </uax:TypeId>\n              <uax:Body>\n                <BicycleType xmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n                  <s0:Make xmlns:s0=\"http://opcfoundation.org/UA/Vehicles/Types\">Trek</s0:Make>\n                  <s0:Model xmlns:s0=\"http://opcfoundation.org/UA/Vehicles/Types\">Compact</s0:Model>\n                  <NoOfGears>10</NoOfGears>\n                  <ManufacterName>\n                    <uax:NamespaceIndex xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">1</uax:NamespaceIndex>\n                    <uax:Name xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">Hello</uax:Name>\n                  </ManufacterName>\n                </BicycleType>\n              </uax:Body>\n            </uax:ExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>ns=1;i=314</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>3</uax:AccessLevel>\n        <uax:UserAccessLevel>3</uax:UserAccessLevel>\n      </PrimaryVehicle>\n      <OwnedVehicles xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=2;i=377</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>1</uax:NamespaceIndex>\n          <uax:Name>OwnedVehicles</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:NumericId>377</uax:NumericId>\n        <uax:Value>\n          <uax:Value>\n            <uax:ListOfExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>ns=1;i=319</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <TruckType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                    <Make>Dodge</Make>\n                    <Model>Ram</Model>\n                    <CargoCapacity>500</CargoCapacity>\n                  </TruckType>\n                </uax:Body>\n              </uax:ExtensionObject>\n              <uax:ExtensionObject>\n                <uax:TypeId>\n                  <uax:Identifier>ns=1;i=318</uax:Identifier>\n                </uax:TypeId>\n                <uax:Body>\n                  <VehicleType xsi:type=\"CarType\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                    <Make>Porche</Make>\n                    <Model>Roadster</Model>\n                    <NoOfPassengers>2</NoOfPassengers>\n                  </VehicleType>\n                </uax:Body>\n              </uax:ExtensionObject>\n            </uax:ListOfExtensionObject>\n          </uax:Value>\n        </uax:Value>\n        <uax:DataType>\n          <uax:Identifier>ns=1;i=314</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>1</uax:ValueRank>\n        <uax:ArrayDimensions>0</uax:ArrayDimensions>\n        <uax:AccessLevel>3</uax:AccessLevel>\n        <uax:UserAccessLevel>3</uax:UserAccessLevel>\n      </OwnedVehicles>\n    </DriverOfTheMonth>\n    <VehiclesInLot>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=283</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>2</uax:NamespaceIndex>\n        <uax:Name>VehiclesInLot</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=63</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>283</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=314</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </VehiclesInLot>\n  </ParkingLot>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=2;i=370</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>370</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=2;i=365</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=2;i=371</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <VehiclesInstances_BinarySchema xmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=2;i=353</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>2</uax:NamespaceIndex>\n      <uax:Name>Vehicles.Instances</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>353</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpzMT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3Jn\nL1VBL1ZlaGljbGVzL1R5cGVzIg0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvSW5z\ndGFuY2VzIg0KICBEZWZhdWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVz\ncGFjZT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL0luc3RhbmNlcyINCj4N\nCiAgPG9wYzpJbXBvcnQgTmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBM\nb2NhdGlvbj0iT3BjLlVhLkJpbmFyeVNjaGVtYS5ic2QiLz4NCiAgPG9wYzpJbXBvcnQgTmFtZXNw\nYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlwZXMiIExvY2F0aW9u\nPSJWZWhpY2xlcy5UeXBlcy5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9wYzpFbnVtZXJhdGVk\nVHlwZSBOYW1lPSJQYXJraW5nTG90VHlwZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpF\nbnVtZXJhdGVkVmFsdWUgTmFtZT0iT3BlbiIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJh\ndGVkVmFsdWUgTmFtZT0iQ292ZXJlZCIgVmFsdWU9IjIiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRU\neXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQmljeWNsZVR5cGUiIEJhc2VUeXBl\nPSJzMTpWZWhpY2xlVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNYWtlIiBUeXBlTmFtZT0i\nb3BjOlN0cmluZyIgU291cmNlVHlwZT0iczE6VmVoaWNsZVR5cGUiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJNb2RlbCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5cGU9InMxOlZlaGlj\nbGVUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkdlYXJzIiBUeXBlTmFtZT0ib3Bj\nOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1hbnVmYWN0ZXJOYW1lIiBUeXBlTmFt\nZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCjwvb3Bj\nOlR5cGVEaWN0aW9uYXJ5Pg==</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=93</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=355</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>355</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/UA/Vehicles/Instances</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=15002</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15002</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <BicycleType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=371</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>2</uax:NamespaceIndex>\n        <uax:Name>BicycleType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>371</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>BicycleType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </BicycleType>\n  </VehiclesInstances_BinarySchema>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=2;i=366</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>366</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=2;i=365</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=2;i=367</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <VehiclesInstances_XmlSchema xmlns=\"http://opcfoundation.org/UA/Vehicles/Instances\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=2;i=341</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>2</uax:NamespaceIndex>\n      <uax:Name>Vehicles.Instances</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>341</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PHhzOnNjaGVtYQ0KICB4bWxuczpzMT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGlj\nbGVzL1R5cGVzIg0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL0lu\nc3RhbmNlcyINCiAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEv\nVmVoaWNsZXMvSW5zdGFuY2VzIg0KICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4N\nCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8yMDA4\nLzAyL1R5cGVzLnhzZCIgLz4NCiAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3Vu\nZGF0aW9uLm9yZy9VQS9WZWhpY2xlcy9UeXBlcyIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFt\nZT0iUGFya2luZ0xvdFR5cGUiPg0KICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmci\nPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuXzEiIC8+DQogICAgICA8eHM6ZW51\nbWVyYXRpb24gdmFsdWU9IkNvdmVyZWRfMiIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8\nL3hzOnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlBhcmtpbmdMb3RUeXBlIiB0eXBl\nPSJ0bnM6UGFya2luZ0xvdFR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RP\nZlBhcmtpbmdMb3RUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJQYXJraW5nTG90VHlwZSIgdHlwZT0idG5zOlBhcmtpbmdMb3RUeXBlIiBtaW5PY2N1cnM9\nIjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6\nY29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlBhcmtpbmdMb3RUeXBlIiB0\neXBlPSJ0bnM6TGlzdE9mUGFya2luZ0xvdFR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1l\nbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkJpY3ljbGVUeXBlIj4NCiAgICA8eHM6Y29t\ncGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iczE6\nVmVoaWNsZVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iTm9PZkdlYXJzIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAv\nPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0ZXJOYW1lIiB0eXBlPSJ1YTpR\ndWFsaWZpZWROYW1lIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8\nL3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29u\ndGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQmljeWNsZVR5\ncGUiIHR5cGU9InRuczpCaWN5Y2xlVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i\nTGlzdE9mQmljeWNsZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50\nIG5hbWU9IkJpY3ljbGVUeXBlIiB0eXBlPSJ0bnM6QmljeWNsZVR5cGUiIG1pbk9jY3Vycz0iMCIg\nbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVu\nY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkJpY3lj\nbGVUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mQmljeWNsZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hz\nOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1hPg==</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=92</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=343</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>343</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/UA/Vehicles/Instances</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=15003</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15003</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <BicycleType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=2;i=367</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>2</uax:NamespaceIndex>\n        <uax:Name>BicycleType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>367</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='BicycleType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </BicycleType>\n  </VehiclesInstances_XmlSchema>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=2;i=15004</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15004</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=2;i=365</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Instances.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:s1=\"http://opcfoundation.org/UA/Vehicles/Types\"\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Vehicles/Instances\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Vehicles/Instances\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/Vehicles/Types\" Location=\"Vehicles.Types.BinarySchema.bsd\"/>\n\n  <opc:EnumeratedType Name=\"ParkingLotType\" LengthInBits=\"32\">\n    <opc:EnumeratedValue Name=\"Open\" Value=\"1\" />\n    <opc:EnumeratedValue Name=\"Covered\" Value=\"2\" />\n  </opc:EnumeratedType>\n\n  <opc:StructuredType Name=\"BicycleType\" BaseType=\"s1:VehicleType\">\n    <opc:Field Name=\"Make\" TypeName=\"opc:String\" SourceType=\"s1:VehicleType\" />\n    <opc:Field Name=\"Model\" TypeName=\"opc:String\" SourceType=\"s1:VehicleType\" />\n    <opc:Field Name=\"NoOfGears\" TypeName=\"opc:UInt32\" />\n    <opc:Field Name=\"ManufacterName\" TypeName=\"ua:QualifiedName\" />\n  </opc:StructuredType>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Instances.Types.xsd",
    "content": "<xs:schema\n  xmlns:s1=\"http://opcfoundation.org/UA/Vehicles/Types\"\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Vehicles/Instances\"\n  targetNamespace=\"http://opcfoundation.org/UA/Vehicles/Instances\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n  <xs:import namespace=\"http://opcfoundation.org/UA/Vehicles/Types\" />\n\n  <xs:simpleType  name=\"ParkingLotType\">\n    <xs:restriction base=\"xs:string\">\n      <xs:enumeration value=\"Open_1\" />\n      <xs:enumeration value=\"Covered_2\" />\n    </xs:restriction>\n  </xs:simpleType>\n  <xs:element name=\"ParkingLotType\" type=\"tns:ParkingLotType\" />\n\n  <xs:complexType name=\"ListOfParkingLotType\">\n    <xs:sequence>\n      <xs:element name=\"ParkingLotType\" type=\"tns:ParkingLotType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfParkingLotType\" type=\"tns:ListOfParkingLotType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"BicycleType\">\n    <xs:complexContent mixed=\"false\">\n      <xs:extension base=\"s1:VehicleType\">\n        <xs:sequence>\n          <xs:element name=\"NoOfGears\" type=\"xs:unsignedInt\" minOccurs=\"0\" />\n          <xs:element name=\"ManufacterName\" type=\"ua:QualifiedName\" minOccurs=\"0\" nillable=\"true\" />\n        </xs:sequence>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n  <xs:element name=\"BicycleType\" type=\"tns:BicycleType\" />\n\n  <xs:complexType name=\"ListOfBicycleType\">\n    <xs:sequence>\n      <xs:element name=\"BicycleType\" type=\"tns:BicycleType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfBicycleType\" type=\"tns:ListOfBicycleType\" nillable=\"true\"></xs:element>\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\n\nnamespace Vehicles.Types\n{\n    #region DriverState Class\n#if (!OPCUA_EXCLUDE_DriverState)\n    /// <summary>\n    /// Stores an instance of the DriverType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class DriverState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public DriverState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Vehicles.Types.ObjectTypes.DriverType, Vehicles.Types.Namespaces.Vehicles, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AQAAACoAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlwZXP/////BGCAAgEA\" +\n           \"AAABABIAAABEcml2ZXJUeXBlSW5zdGFuY2UBAVUBAQFVAVUBAAD/////AgAAABVgqQoCAAAAAQAOAAAA\" +\n           \"UHJpbWFyeVZlaGljbGUBAVYBAC4ARFYBAAAWAQE+AQKPAAAAPENhclR5cGUgeG1sbnM9Imh0dHA6Ly9v\" +\n           \"cGNmb3VuZGF0aW9uLm9yZy9VQS9WZWhpY2xlcy9UeXBlcyI+PE1ha2U+VG95b3RhPC9NYWtlPjxNb2Rl\" +\n           \"bD5Qcml1czwvTW9kZWw+PE5vT2ZQYXNzZW5nZXJzPjQ8L05vT2ZQYXNzZW5nZXJzPjwvQ2FyVHlwZT4B\" +\n           \"AToB/////wMD/////wAAAAAXYKkKAgAAAAEADQAAAE93bmVkVmVoaWNsZXMBAVgBAC4ARFgBAACWAgAA\" +\n           \"AAEBPwECkAAAADxUcnVja1R5cGUgeG1sbnM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS9WZWhp\" +\n           \"Y2xlcy9UeXBlcyI+PE1ha2U+RG9kZ2U8L01ha2U+PE1vZGVsPlJhbTwvTW9kZWw+PENhcmdvQ2FwYWNp\" +\n           \"dHk+NTAwPC9DYXJnb0NhcGFjaXR5PjwvVHJ1Y2tUeXBlPgEBPgEC4wAAADxWZWhpY2xlVHlwZSB4c2k6\" +\n           \"dHlwZT0iQ2FyVHlwZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1p\" +\n           \"bnN0YW5jZSIgeG1sbnM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS9WZWhpY2xlcy9UeXBlcyI+\" +\n           \"PE1ha2U+UG9yY2hlPC9NYWtlPjxNb2RlbD5Sb2Fkc3RlcjwvTW9kZWw+PE5vT2ZQYXNzZW5nZXJzPjI8\" +\n           \"L05vT2ZQYXNzZW5nZXJzPjwvVmVoaWNsZVR5cGU+AQE6AQEAAAABAAAAAAAAAAMD/////wAAAAA=\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<VehicleType> PrimaryVehicle\n        {\n            get\n            {\n                return m_primaryVehicle;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_primaryVehicle, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_primaryVehicle = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<VehicleType[]> OwnedVehicles\n        {\n            get\n            {\n                return m_ownedVehicles;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_ownedVehicles, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_ownedVehicles = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_primaryVehicle != null)\n            {\n                children.Add(m_primaryVehicle);\n            }\n\n            if (m_ownedVehicles != null)\n            {\n                children.Add(m_ownedVehicles);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Vehicles.Types.BrowseNames.PrimaryVehicle:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (PrimaryVehicle == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    PrimaryVehicle = new PropertyState<VehicleType>(this);\n                                }\n                                else\n                                {\n                                    PrimaryVehicle = (PropertyState<VehicleType>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = PrimaryVehicle;\n                        break;\n                    }\n\n                case Vehicles.Types.BrowseNames.OwnedVehicles:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (OwnedVehicles == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    OwnedVehicles = new PropertyState<VehicleType[]>(this);\n                                }\n                                else\n                                {\n                                    OwnedVehicles = (PropertyState<VehicleType[]>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = OwnedVehicles;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<VehicleType> m_primaryVehicle;\n        private PropertyState<VehicleType[]> m_ownedVehicles;\n        #endregion\n    }\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace Vehicles.Types\n{\n    #region DataType Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypes\n    {\n        /// <summary>\n        /// The identifier for the VehicleType DataType.\n        /// </summary>\n        public const uint VehicleType = 314;\n\n        /// <summary>\n        /// The identifier for the CarType DataType.\n        /// </summary>\n        public const uint CarType = 315;\n\n        /// <summary>\n        /// The identifier for the TruckType DataType.\n        /// </summary>\n        public const uint TruckType = 316;\n    }\n    #endregion\n\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the VehicleType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint VehicleType_Encoding_DefaultBinary = 329;\n\n        /// <summary>\n        /// The identifier for the CarType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint CarType_Encoding_DefaultBinary = 330;\n\n        /// <summary>\n        /// The identifier for the TruckType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public const uint TruckType_Encoding_DefaultBinary = 331;\n\n        /// <summary>\n        /// The identifier for the VehicleType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint VehicleType_Encoding_DefaultXml = 317;\n\n        /// <summary>\n        /// The identifier for the CarType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint CarType_Encoding_DefaultXml = 318;\n\n        /// <summary>\n        /// The identifier for the TruckType_Encoding_DefaultXml Object.\n        /// </summary>\n        public const uint TruckType_Encoding_DefaultXml = 319;\n\n        /// <summary>\n        /// The identifier for the VehicleType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint VehicleType_Encoding_DefaultJson = 15003;\n\n        /// <summary>\n        /// The identifier for the CarType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint CarType_Encoding_DefaultJson = 15004;\n\n        /// <summary>\n        /// The identifier for the TruckType_Encoding_DefaultJson Object.\n        /// </summary>\n        public const uint TruckType_Encoding_DefaultJson = 15005;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <summary>\n        /// The identifier for the DriverType ObjectType.\n        /// </summary>\n        public const uint DriverType = 341;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the DriverType_PrimaryVehicle Variable.\n        /// </summary>\n        public const uint DriverType_PrimaryVehicle = 342;\n\n        /// <summary>\n        /// The identifier for the DriverType_OwnedVehicles Variable.\n        /// </summary>\n        public const uint DriverType_OwnedVehicles = 344;\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema Variable.\n        /// </summary>\n        public const uint Vehicles_BinarySchema = 302;\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint Vehicles_BinarySchema_NamespaceUri = 304;\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public const uint Vehicles_BinarySchema_Deprecated = 15001;\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_VehicleType Variable.\n        /// </summary>\n        public const uint Vehicles_BinarySchema_VehicleType = 332;\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_CarType Variable.\n        /// </summary>\n        public const uint Vehicles_BinarySchema_CarType = 335;\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_TruckType Variable.\n        /// </summary>\n        public const uint Vehicles_BinarySchema_TruckType = 338;\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema Variable.\n        /// </summary>\n        public const uint Vehicles_XmlSchema = 287;\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public const uint Vehicles_XmlSchema_NamespaceUri = 289;\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public const uint Vehicles_XmlSchema_Deprecated = 15002;\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_VehicleType Variable.\n        /// </summary>\n        public const uint Vehicles_XmlSchema_VehicleType = 320;\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_CarType Variable.\n        /// </summary>\n        public const uint Vehicles_XmlSchema_CarType = 323;\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_TruckType Variable.\n        /// </summary>\n        public const uint Vehicles_XmlSchema_TruckType = 326;\n    }\n    #endregion\n\n    #region DataType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all DataTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class DataTypeIds\n    {\n        /// <summary>\n        /// The identifier for the VehicleType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId VehicleType = new ExpandedNodeId(Vehicles.Types.DataTypes.VehicleType, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the CarType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId CarType = new ExpandedNodeId(Vehicles.Types.DataTypes.CarType, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the TruckType DataType.\n        /// </summary>\n        public static readonly ExpandedNodeId TruckType = new ExpandedNodeId(Vehicles.Types.DataTypes.TruckType, Vehicles.Types.Namespaces.Vehicles);\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the VehicleType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId VehicleType_Encoding_DefaultBinary = new ExpandedNodeId(Vehicles.Types.Objects.VehicleType_Encoding_DefaultBinary, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the CarType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId CarType_Encoding_DefaultBinary = new ExpandedNodeId(Vehicles.Types.Objects.CarType_Encoding_DefaultBinary, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the TruckType_Encoding_DefaultBinary Object.\n        /// </summary>\n        public static readonly ExpandedNodeId TruckType_Encoding_DefaultBinary = new ExpandedNodeId(Vehicles.Types.Objects.TruckType_Encoding_DefaultBinary, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the VehicleType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId VehicleType_Encoding_DefaultXml = new ExpandedNodeId(Vehicles.Types.Objects.VehicleType_Encoding_DefaultXml, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the CarType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId CarType_Encoding_DefaultXml = new ExpandedNodeId(Vehicles.Types.Objects.CarType_Encoding_DefaultXml, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the TruckType_Encoding_DefaultXml Object.\n        /// </summary>\n        public static readonly ExpandedNodeId TruckType_Encoding_DefaultXml = new ExpandedNodeId(Vehicles.Types.Objects.TruckType_Encoding_DefaultXml, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the VehicleType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId VehicleType_Encoding_DefaultJson = new ExpandedNodeId(Vehicles.Types.Objects.VehicleType_Encoding_DefaultJson, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the CarType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId CarType_Encoding_DefaultJson = new ExpandedNodeId(Vehicles.Types.Objects.CarType_Encoding_DefaultJson, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the TruckType_Encoding_DefaultJson Object.\n        /// </summary>\n        public static readonly ExpandedNodeId TruckType_Encoding_DefaultJson = new ExpandedNodeId(Vehicles.Types.Objects.TruckType_Encoding_DefaultJson, Vehicles.Types.Namespaces.Vehicles);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <summary>\n        /// The identifier for the DriverType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId DriverType = new ExpandedNodeId(Vehicles.Types.ObjectTypes.DriverType, Vehicles.Types.Namespaces.Vehicles);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the DriverType_PrimaryVehicle Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId DriverType_PrimaryVehicle = new ExpandedNodeId(Vehicles.Types.Variables.DriverType_PrimaryVehicle, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the DriverType_OwnedVehicles Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId DriverType_OwnedVehicles = new ExpandedNodeId(Vehicles.Types.Variables.DriverType_OwnedVehicles, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_BinarySchema = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_BinarySchema, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_BinarySchema_NamespaceUri = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_BinarySchema_NamespaceUri, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_BinarySchema_Deprecated = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_BinarySchema_Deprecated, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_VehicleType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_BinarySchema_VehicleType = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_BinarySchema_VehicleType, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_CarType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_BinarySchema_CarType = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_BinarySchema_CarType, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_BinarySchema_TruckType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_BinarySchema_TruckType = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_BinarySchema_TruckType, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_XmlSchema = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_XmlSchema, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_NamespaceUri Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_XmlSchema_NamespaceUri = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_XmlSchema_NamespaceUri, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_Deprecated Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_XmlSchema_Deprecated = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_XmlSchema_Deprecated, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_VehicleType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_XmlSchema_VehicleType = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_XmlSchema_VehicleType, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_CarType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_XmlSchema_CarType = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_XmlSchema_CarType, Vehicles.Types.Namespaces.Vehicles);\n\n        /// <summary>\n        /// The identifier for the Vehicles_XmlSchema_TruckType Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Vehicles_XmlSchema_TruckType = new ExpandedNodeId(Vehicles.Types.Variables.Vehicles_XmlSchema_TruckType, Vehicles.Types.Namespaces.Vehicles);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the CarType component.\n        /// </summary>\n        public const string CarType = \"CarType\";\n\n        /// <summary>\n        /// The BrowseName for the DriverType component.\n        /// </summary>\n        public const string DriverType = \"DriverType\";\n\n        /// <summary>\n        /// The BrowseName for the OwnedVehicles component.\n        /// </summary>\n        public const string OwnedVehicles = \"OwnedVehicles\";\n\n        /// <summary>\n        /// The BrowseName for the PrimaryVehicle component.\n        /// </summary>\n        public const string PrimaryVehicle = \"PrimaryVehicle\";\n\n        /// <summary>\n        /// The BrowseName for the TruckType component.\n        /// </summary>\n        public const string TruckType = \"TruckType\";\n\n        /// <summary>\n        /// The BrowseName for the Vehicles_BinarySchema component.\n        /// </summary>\n        public const string Vehicles_BinarySchema = \"Vehicles.Types\";\n\n        /// <summary>\n        /// The BrowseName for the Vehicles_XmlSchema component.\n        /// </summary>\n        public const string Vehicles_XmlSchema = \"Vehicles.Types\";\n\n        /// <summary>\n        /// The BrowseName for the VehicleType component.\n        /// </summary>\n        public const string VehicleType = \"VehicleType\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the Vehicles namespace (.NET code namespace is 'Vehicles.Types').\n        /// </summary>\n        public const string Vehicles = \"http://opcfoundation.org/UA/Vehicles/Types\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.DataTypes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace Vehicles.Types\n{\n    #region VehicleType Class\n#if (!OPCUA_EXCLUDE_VehicleType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = Vehicles.Types.Namespaces.Vehicles)]\n    public partial class VehicleType : IEncodeable\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public VehicleType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_make = null;\n            m_model = null;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        [DataMember(Name = \"Make\", IsRequired = false, Order = 1)]\n        public string Make\n        {\n            get { return m_make; }\n            set { m_make = value; }\n        }\n\n        /// <inheritdoc/>\n        [DataMember(Name = \"Model\", IsRequired = false, Order = 2)]\n        public string Model\n        {\n            get { return m_model; }\n            set { m_model = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public virtual ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.VehicleType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public virtual ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.VehicleType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public virtual ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.VehicleType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public virtual void Encode(IEncoder encoder)\n        {\n            encoder.PushNamespace(Vehicles.Types.Namespaces.Vehicles);\n\n            encoder.WriteString(\"Make\", Make);\n            encoder.WriteString(\"Model\", Model);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public virtual void Decode(IDecoder decoder)\n        {\n            decoder.PushNamespace(Vehicles.Types.Namespaces.Vehicles);\n\n            Make = decoder.ReadString(\"Make\");\n            Model = decoder.ReadString(\"Model\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public virtual bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            VehicleType value = encodeable as VehicleType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!Utils.IsEqual(m_make, value.m_make)) return false;\n            if (!Utils.IsEqual(m_model, value.m_model)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public virtual object Clone()\n        {\n            return (VehicleType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            VehicleType clone = (VehicleType)base.MemberwiseClone();\n\n            clone.m_make = (string)Utils.Clone(this.m_make);\n            clone.m_model = (string)Utils.Clone(this.m_model);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private string m_make;\n        private string m_model;\n        #endregion\n    }\n\n    #region VehicleTypeCollection Class\n    /// <summary>\n    /// A collection of VehicleType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfVehicleType\", Namespace = Vehicles.Types.Namespaces.Vehicles, ItemName = \"VehicleType\")]\n#if !NET_STANDARD\n    public partial class VehicleTypeCollection : List<VehicleType>, ICloneable\n#else\n    public partial class VehicleTypeCollection : List<VehicleType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public VehicleTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public VehicleTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public VehicleTypeCollection(IEnumerable<VehicleType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator VehicleTypeCollection(VehicleType[] values)\n        {\n            if (values != null)\n            {\n                return new VehicleTypeCollection(values);\n            }\n\n            return new VehicleTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator VehicleType[](VehicleTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (VehicleTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            VehicleTypeCollection clone = new VehicleTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((VehicleType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region CarType Class\n#if (!OPCUA_EXCLUDE_CarType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = Vehicles.Types.Namespaces.Vehicles)]\n    public partial class CarType : VehicleType\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public CarType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_noOfPassengers = (uint)0;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        [DataMember(Name = \"NoOfPassengers\", IsRequired = false, Order = 1)]\n        public uint NoOfPassengers\n        {\n            get { return m_noOfPassengers; }\n            set { m_noOfPassengers = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public override ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.CarType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public override ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.CarType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public override ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.CarType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public override void Encode(IEncoder encoder)\n        {\n            base.Encode(encoder);\n\n            encoder.PushNamespace(Vehicles.Types.Namespaces.Vehicles);\n\n            encoder.WriteUInt32(\"NoOfPassengers\", NoOfPassengers);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public override void Decode(IDecoder decoder)\n        {\n            base.Decode(decoder);\n\n            decoder.PushNamespace(Vehicles.Types.Namespaces.Vehicles);\n\n            NoOfPassengers = decoder.ReadUInt32(\"NoOfPassengers\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public override bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            CarType value = encodeable as CarType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!base.IsEqual(encodeable)) return false;\n            if (!Utils.IsEqual(m_noOfPassengers, value.m_noOfPassengers)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public override object Clone()\n        {\n            return (CarType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            CarType clone = (CarType)base.MemberwiseClone();\n\n            clone.m_noOfPassengers = (uint)Utils.Clone(this.m_noOfPassengers);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private uint m_noOfPassengers;\n        #endregion\n    }\n\n    #region CarTypeCollection Class\n    /// <summary>\n    /// A collection of CarType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfCarType\", Namespace = Vehicles.Types.Namespaces.Vehicles, ItemName = \"CarType\")]\n#if !NET_STANDARD\n    public partial class CarTypeCollection : List<CarType>, ICloneable\n#else\n    public partial class CarTypeCollection : List<CarType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public CarTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public CarTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public CarTypeCollection(IEnumerable<CarType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator CarTypeCollection(CarType[] values)\n        {\n            if (values != null)\n            {\n                return new CarTypeCollection(values);\n            }\n\n            return new CarTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator CarType[](CarTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (CarTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            CarTypeCollection clone = new CarTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((CarType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n\n    #region TruckType Class\n#if (!OPCUA_EXCLUDE_TruckType)\n    /// <summary>\n    /// \n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [DataContract(Namespace = Vehicles.Types.Namespaces.Vehicles)]\n    public partial class TruckType : VehicleType\n    {\n        #region Constructors\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public TruckType()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Called by the .NET framework during deserialization.\n        /// </summary>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            m_cargoCapacity = (uint)0;\n        }\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        [DataMember(Name = \"CargoCapacity\", IsRequired = false, Order = 1)]\n        public uint CargoCapacity\n        {\n            get { return m_cargoCapacity; }\n            set { m_cargoCapacity = value; }\n        }\n        #endregion\n\n        #region IEncodeable Members\n        /// <summary cref=\"IEncodeable.TypeId\" />\n        public override ExpandedNodeId TypeId\n        {\n            get { return DataTypeIds.TruckType; }\n        }\n\n        /// <summary cref=\"IEncodeable.BinaryEncodingId\" />\n        public override ExpandedNodeId BinaryEncodingId\n        {\n            get { return ObjectIds.TruckType_Encoding_DefaultBinary; }\n        }\n\n        /// <summary cref=\"IEncodeable.XmlEncodingId\" />\n        public override ExpandedNodeId XmlEncodingId\n        {\n            get { return ObjectIds.TruckType_Encoding_DefaultXml; }\n        }\n\n        /// <summary cref=\"IEncodeable.Encode(IEncoder)\" />\n        public override void Encode(IEncoder encoder)\n        {\n            base.Encode(encoder);\n\n            encoder.PushNamespace(Vehicles.Types.Namespaces.Vehicles);\n\n            encoder.WriteUInt32(\"CargoCapacity\", CargoCapacity);\n\n            encoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.Decode(IDecoder)\" />\n        public override void Decode(IDecoder decoder)\n        {\n            base.Decode(decoder);\n\n            decoder.PushNamespace(Vehicles.Types.Namespaces.Vehicles);\n\n            CargoCapacity = decoder.ReadUInt32(\"CargoCapacity\");\n\n            decoder.PopNamespace();\n        }\n\n        /// <summary cref=\"IEncodeable.IsEqual(IEncodeable)\" />\n        public override bool IsEqual(IEncodeable encodeable)\n        {\n            if (Object.ReferenceEquals(this, encodeable))\n            {\n                return true;\n            }\n\n            TruckType value = encodeable as TruckType;\n\n            if (value == null)\n            {\n                return false;\n            }\n\n            if (!base.IsEqual(encodeable)) return false;\n            if (!Utils.IsEqual(m_cargoCapacity, value.m_cargoCapacity)) return false;\n\n            return true;\n        }\n\n#if !NET_STANDARD\n        /// <summary cref=\"ICloneable.Clone\" />\n        public override object Clone()\n        {\n            return (TruckType)this.MemberwiseClone();\n        }\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            TruckType clone = (TruckType)base.MemberwiseClone();\n\n            clone.m_cargoCapacity = (uint)Utils.Clone(this.m_cargoCapacity);\n\n            return clone;\n        }\n        #endregion\n\n        #region Private Fields\n        private uint m_cargoCapacity;\n        #endregion\n    }\n\n    #region TruckTypeCollection Class\n    /// <summary>\n    /// A collection of TruckType objects.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    [CollectionDataContract(Name = \"ListOfTruckType\", Namespace = Vehicles.Types.Namespaces.Vehicles, ItemName = \"TruckType\")]\n#if !NET_STANDARD\n    public partial class TruckTypeCollection : List<TruckType>, ICloneable\n#else\n    public partial class TruckTypeCollection : List<TruckType>\n#endif\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the collection with default values.\n        /// </summary>\n        public TruckTypeCollection() { }\n\n        /// <summary>\n        /// Initializes the collection with an initial capacity.\n        /// </summary>\n        public TruckTypeCollection(int capacity) : base(capacity) { }\n\n        /// <summary>\n        /// Initializes the collection with another collection.\n        /// </summary>\n        public TruckTypeCollection(IEnumerable<TruckType> collection) : base(collection) { }\n        #endregion\n\n        #region Static Operators\n        /// <summary>\n        /// Converts an array to a collection.\n        /// </summary>\n        public static implicit operator TruckTypeCollection(TruckType[] values)\n        {\n            if (values != null)\n            {\n                return new TruckTypeCollection(values);\n            }\n\n            return new TruckTypeCollection();\n        }\n\n        /// <summary>\n        /// Converts a collection to an array.\n        /// </summary>\n        public static explicit operator TruckType[](TruckTypeCollection values)\n        {\n            if (values != null)\n            {\n                return values.ToArray();\n            }\n\n            return null;\n        }\n        #endregion\n\n#if !NET_STANDARD\n        #region ICloneable Methods\n        /// <summary>\n        /// Creates a deep copy of the collection.\n        /// </summary>\n        public object Clone()\n        {\n            return (TruckTypeCollection)this.MemberwiseClone();\n        }\n        #endregion\n#endif\n\n        /// <summary cref=\"Object.MemberwiseClone\" />\n        public new object MemberwiseClone()\n        {\n            TruckTypeCollection clone = new TruckTypeCollection(this.Count);\n\n            for (int ii = 0; ii < this.Count; ii++)\n            {\n                clone.Add((TruckType)Utils.Clone(this[ii]));\n            }\n\n            return clone;\n        }\n    }\n    #endregion\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.NodeIds.csv",
    "content": "CarType,315,DataType\nCarType_Encoding_DefaultBinary,330,Object\nCarType_Encoding_DefaultJson,15004,Object\nCarType_Encoding_DefaultXml,318,Object\nDriverType,341,ObjectType\nTruckType,316,DataType\nTruckType_Encoding_DefaultBinary,331,Object\nTruckType_Encoding_DefaultJson,15005,Object\nTruckType_Encoding_DefaultXml,319,Object\nVehicles_BinarySchema,302,Variable\nVehicles_XmlSchema,287,Variable\nVehicleType,314,DataType\nVehicleType_Encoding_DefaultBinary,329,Object\nVehicleType_Encoding_DefaultJson,15003,Object\nVehicleType_Encoding_DefaultXml,317,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/UA/Vehicles/Types</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=287</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Vehicles.Types</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Vehicles.Types</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=92</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=289</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15002</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=320</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=323</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=326</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL1R5\ncGVzIg0KICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS9WZWhp\nY2xlcy9UeXBlcyINCiAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQo+DQogIDx4czpp\nbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBl\ncy54c2QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZlaGljbGVUeXBlIj4NCiAgICA8\neHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNYWtlIiB0eXBlPSJ4czpzdHJp\nbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJNb2RlbCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt\nZW50IG5hbWU9IlZlaGljbGVUeXBlIiB0eXBlPSJ0bnM6VmVoaWNsZVR5cGUiIC8+DQoNCiAgPHhz\nOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlZlaGljbGVUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWZWhpY2xlVHlwZSIgdHlwZT0idG5zOlZlaGljbGVU\neXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZWZWhpY2xlVHlwZSIgdHlwZT0idG5zOkxpc3RPZlZlaGljbGVUeXBlIiBu\naWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJD\nYXJUeXBlIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4\nczpleHRlbnNpb24gYmFzZT0idG5zOlZlaGljbGVUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vT2ZQYXNzZW5nZXJzIiB0eXBlPSJ4czp1\nbnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAg\nICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21w\nbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FyVHlwZSIgdHlwZT0idG5zOkNhclR5cGUi\nIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNhclR5cGUiPg0KICAgIDx4czpz\nZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNhclR5cGUiIHR5cGU9InRuczpDYXJU\neXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZDYXJUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mQ2FyVHlwZSIgbmlsbGFibGU9\nInRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVHJ1Y2tUeXBl\nIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRl\nbnNpb24gYmFzZT0idG5zOlZlaGljbGVUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAg\nICAgICAgIDx4czplbGVtZW50IG5hbWU9IkNhcmdvQ2FwYWNpdHkiIHR5cGU9InhzOnVuc2lnbmVk\nSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hz\nOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBl\nPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJUcnVja1R5cGUiIHR5cGU9InRuczpUcnVja1R5cGUiIC8+\nDQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRydWNrVHlwZSI+DQogICAgPHhzOnNl\ncXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJ1Y2tUeXBlIiB0eXBlPSJ0bnM6VHJ1\nY2tUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1\nZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl\nbWVudCBuYW1lPSJMaXN0T2ZUcnVja1R5cGUiIHR5cGU9InRuczpMaXN0T2ZUcnVja1R5cGUiIG5p\nbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1hPg==</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=289</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Vehicles/Types</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=302</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Vehicles.Types</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Vehicles.Types</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=72</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=93</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=304</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15001</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=332</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=335</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=338</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlw\nZXMiDQogIERlZmF1bHRCeXRlT3JkZXI9IkxpdHRsZUVuZGlhbiINCiAgVGFyZ2V0TmFtZXNwYWNl\nPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlwZXMiDQo+DQogIDxvcGM6\nSW1wb3J0IE5hbWVzcGFjZT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLyIgTG9jYXRpb249\nIk9wYy5VYS5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1l\nPSJWZWhpY2xlVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpG\naWVsZCBOYW1lPSJNYWtlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik1vZGVsIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgPC9vcGM6U3RydWN0dXJl\nZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDYXJUeXBlIiBCYXNlVHlwZT0i\ndG5zOlZlaGljbGVUeXBlIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1ha2UiIFR5cGVOYW1lPSJv\ncGM6U3RyaW5nIiBTb3VyY2VUeXBlPSJ0bnM6VmVoaWNsZVR5cGUiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJNb2RlbCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5cGU9InRuczpWZWhp\nY2xlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZQYXNzZW5nZXJzIiBUeXBlTmFt\nZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1\nY3R1cmVkVHlwZSBOYW1lPSJUcnVja1R5cGUiIEJhc2VUeXBlPSJ0bnM6VmVoaWNsZVR5cGUiPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTWFrZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5\ncGU9InRuczpWZWhpY2xlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1vZGVsIiBUeXBl\nTmFtZT0ib3BjOlN0cmluZyIgU291cmNlVHlwZT0idG5zOlZlaGljbGVUeXBlIiAvPg0KICAgIDxv\ncGM6RmllbGQgTmFtZT0iQ2FyZ29DYXBhY2l0eSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQog\nIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQo8L29wYzpUeXBlRGljdGlvbmFyeT4=</ByteString>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=15</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=304</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>NamespaceUri</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>NamespaceUri</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=302</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Vehicles/Types</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=314</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VehicleType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VehicleType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=22</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=315</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=316</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=329</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=317</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15003</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=315</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CarType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CarType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=314</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=330</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=318</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15004</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"DataTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=316</Identifier>\n      </NodeId>\n      <NodeClass>DataType_64</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TruckType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TruckType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=314</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=331</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=319</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=15005</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n      <DataTypeDefinition i:nil=\"true\" />\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=317</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=314</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=320</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=318</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=315</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=323</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=319</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default XML</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default XML</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=316</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=326</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=320</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VehicleType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VehicleType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='VehicleType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=323</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CarType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CarType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='CarType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=326</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TruckType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TruckType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='TruckType']</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=329</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=314</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=332</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=330</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=315</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=335</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=331</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default Binary</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default Binary</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=316</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=39</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=338</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=332</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>VehicleType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>VehicleType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=302</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">VehicleType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=335</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>CarType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>CarType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=302</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">CarType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=338</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>TruckType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>TruckType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=302</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=69</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">TruckType</String>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=341</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>DriverType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>DriverType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=342</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=344</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=342</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>PrimaryVehicle</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>PrimaryVehicle</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <TypeId>\n              <Identifier>ns=1;i=318</Identifier>\n            </TypeId>\n            <Body>\n              <CarType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                <Make>Toyota</Make>\n                <Model>Prius</Model>\n                <NoOfPassengers>4</NoOfPassengers>\n              </CarType>\n            </Body>\n          </ExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=314</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=344</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>OwnedVehicles</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>OwnedVehicles</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=341</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>ns=1;i=319</Identifier>\n              </TypeId>\n              <Body>\n                <TruckType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                  <Make>Dodge</Make>\n                  <Model>Ram</Model>\n                  <CargoCapacity>500</CargoCapacity>\n                </TruckType>\n              </Body>\n            </ExtensionObject>\n            <ExtensionObject>\n              <TypeId>\n                <Identifier>ns=1;i=318</Identifier>\n              </TypeId>\n              <Body>\n                <VehicleType xsi:type=\"CarType\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                  <Make>Porche</Make>\n                  <Model>Roadster</Model>\n                  <NoOfPassengers>2</NoOfPassengers>\n                </VehicleType>\n              </Body>\n            </ExtensionObject>\n          </ListOfExtensionObject>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>ns=1;i=314</Identifier>\n      </DataType>\n      <ValueRank>1</ValueRank>\n      <ArrayDimensions>\n        <UInt32>0</UInt32>\n      </ArrayDimensions>\n      <AccessLevel>3</AccessLevel>\n      <UserAccessLevel>3</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15001</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=302</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15002</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Deprecated</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Deprecated</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=287</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=1</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15003</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=314</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15004</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=315</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=15005</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>Default JSON</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Default JSON</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=76</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=38</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=316</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/Vehicles/Types</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/Vehicles/Types\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UADataType NodeId=\"ns=1;i=314\" BrowseName=\"1:VehicleType\">\n    <DisplayName>VehicleType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=22</Reference>\n    </References>\n    <Definition Name=\"1:VehicleType\">\n      <Field Name=\"Make\" DataType=\"i=12\" />\n      <Field Name=\"Model\" DataType=\"i=12\" />\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=315\" BrowseName=\"1:CarType\">\n    <DisplayName>CarType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=314</Reference>\n    </References>\n    <Definition Name=\"1:CarType\">\n      <Field Name=\"NoOfPassengers\" DataType=\"i=7\" />\n    </Definition>\n  </UADataType>\n  <UADataType NodeId=\"ns=1;i=316\" BrowseName=\"1:TruckType\">\n    <DisplayName>TruckType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=314</Reference>\n    </References>\n    <Definition Name=\"1:TruckType\">\n      <Field Name=\"CargoCapacity\" DataType=\"i=7\" />\n    </Definition>\n  </UADataType>\n  <UAObjectType NodeId=\"ns=1;i=341\" BrowseName=\"1:DriverType\">\n    <DisplayName>DriverType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=342</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=344</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=342\" BrowseName=\"1:PrimaryVehicle\" ParentNodeId=\"ns=1;i=341\" DataType=\"ns=1;i=314\" AccessLevel=\"3\">\n    <DisplayName>PrimaryVehicle</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=341</Reference>\n    </References>\n    <Value>\n      <ExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <TypeId>\n          <Identifier>ns=1;i=318</Identifier>\n        </TypeId>\n        <Body>\n          <CarType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n            <Make>Toyota</Make>\n            <Model>Prius</Model>\n            <NoOfPassengers>4</NoOfPassengers>\n          </CarType>\n        </Body>\n      </ExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=344\" BrowseName=\"1:OwnedVehicles\" ParentNodeId=\"ns=1;i=341\" DataType=\"ns=1;i=314\" ValueRank=\"1\" ArrayDimensions=\"0\" AccessLevel=\"3\">\n    <DisplayName>OwnedVehicles</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=341</Reference>\n    </References>\n    <Value>\n      <ListOfExtensionObject xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>ns=1;i=319</Identifier>\n          </TypeId>\n          <Body>\n            <TruckType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n              <Make>Dodge</Make>\n              <Model>Ram</Model>\n              <CargoCapacity>500</CargoCapacity>\n            </TruckType>\n          </Body>\n        </ExtensionObject>\n        <ExtensionObject>\n          <TypeId>\n            <Identifier>ns=1;i=318</Identifier>\n          </TypeId>\n          <Body>\n            <VehicleType xsi:type=\"CarType\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n              <Make>Porche</Make>\n              <Model>Roadster</Model>\n              <NoOfPassengers>2</NoOfPassengers>\n            </VehicleType>\n          </Body>\n        </ExtensionObject>\n      </ListOfExtensionObject>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=329\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=314</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=332</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=330\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=315</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=335</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=331\" BrowseName=\"Default Binary\" SymbolicName=\"DefaultBinary\">\n    <DisplayName>Default Binary</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=316</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=338</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=302\" BrowseName=\"1:Vehicles.Types\" SymbolicName=\"Vehicles_BinarySchema\" DataType=\"ByteString\">\n    <DisplayName>Vehicles.Types</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=304</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15001</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=332</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=335</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=338</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=93</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlw\nZXMiDQogIERlZmF1bHRCeXRlT3JkZXI9IkxpdHRsZUVuZGlhbiINCiAgVGFyZ2V0TmFtZXNwYWNl\nPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlwZXMiDQo+DQogIDxvcGM6\nSW1wb3J0IE5hbWVzcGFjZT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLyIgTG9jYXRpb249\nIk9wYy5VYS5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1l\nPSJWZWhpY2xlVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpG\naWVsZCBOYW1lPSJNYWtlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik1vZGVsIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgPC9vcGM6U3RydWN0dXJl\nZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDYXJUeXBlIiBCYXNlVHlwZT0i\ndG5zOlZlaGljbGVUeXBlIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1ha2UiIFR5cGVOYW1lPSJv\ncGM6U3RyaW5nIiBTb3VyY2VUeXBlPSJ0bnM6VmVoaWNsZVR5cGUiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJNb2RlbCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5cGU9InRuczpWZWhp\nY2xlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZQYXNzZW5nZXJzIiBUeXBlTmFt\nZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1\nY3R1cmVkVHlwZSBOYW1lPSJUcnVja1R5cGUiIEJhc2VUeXBlPSJ0bnM6VmVoaWNsZVR5cGUiPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTWFrZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5\ncGU9InRuczpWZWhpY2xlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1vZGVsIiBUeXBl\nTmFtZT0ib3BjOlN0cmluZyIgU291cmNlVHlwZT0idG5zOlZlaGljbGVUeXBlIiAvPg0KICAgIDxv\ncGM6RmllbGQgTmFtZT0iQ2FyZ29DYXBhY2l0eSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQog\nIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQo8L29wYzpUeXBlRGljdGlvbmFyeT4=</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=304\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=302\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=302</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Vehicles/Types</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15001\" BrowseName=\"Deprecated\" ParentNodeId=\"ns=1;i=302\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=302</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=332\" BrowseName=\"1:VehicleType\" ParentNodeId=\"ns=1;i=302\" DataType=\"String\">\n    <DisplayName>VehicleType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=302</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">VehicleType</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=335\" BrowseName=\"1:CarType\" ParentNodeId=\"ns=1;i=302\" DataType=\"String\">\n    <DisplayName>CarType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=302</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">CarType</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=338\" BrowseName=\"1:TruckType\" ParentNodeId=\"ns=1;i=302\" DataType=\"String\">\n    <DisplayName>TruckType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=302</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">TruckType</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=317\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=314</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=320</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=318\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=315</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=323</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=319\" BrowseName=\"Default XML\" SymbolicName=\"DefaultXml\">\n    <DisplayName>Default XML</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=316</Reference>\n      <Reference ReferenceType=\"HasDescription\">ns=1;i=326</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=287\" BrowseName=\"1:Vehicles.Types\" SymbolicName=\"Vehicles_XmlSchema\" DataType=\"ByteString\">\n    <DisplayName>Vehicles.Types</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=289</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=15002</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=320</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=323</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=326</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">i=92</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=72</Reference>\n    </References>\n    <Value>\n      <ByteString xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL1R5\ncGVzIg0KICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS9WZWhp\nY2xlcy9UeXBlcyINCiAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQo+DQogIDx4czpp\nbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBl\ncy54c2QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZlaGljbGVUeXBlIj4NCiAgICA8\neHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNYWtlIiB0eXBlPSJ4czpzdHJp\nbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJNb2RlbCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt\nZW50IG5hbWU9IlZlaGljbGVUeXBlIiB0eXBlPSJ0bnM6VmVoaWNsZVR5cGUiIC8+DQoNCiAgPHhz\nOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlZlaGljbGVUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWZWhpY2xlVHlwZSIgdHlwZT0idG5zOlZlaGljbGVU\neXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZWZWhpY2xlVHlwZSIgdHlwZT0idG5zOkxpc3RPZlZlaGljbGVUeXBlIiBu\naWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJD\nYXJUeXBlIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4\nczpleHRlbnNpb24gYmFzZT0idG5zOlZlaGljbGVUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vT2ZQYXNzZW5nZXJzIiB0eXBlPSJ4czp1\nbnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAg\nICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21w\nbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FyVHlwZSIgdHlwZT0idG5zOkNhclR5cGUi\nIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNhclR5cGUiPg0KICAgIDx4czpz\nZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNhclR5cGUiIHR5cGU9InRuczpDYXJU\neXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZDYXJUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mQ2FyVHlwZSIgbmlsbGFibGU9\nInRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVHJ1Y2tUeXBl\nIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRl\nbnNpb24gYmFzZT0idG5zOlZlaGljbGVUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAg\nICAgICAgIDx4czplbGVtZW50IG5hbWU9IkNhcmdvQ2FwYWNpdHkiIHR5cGU9InhzOnVuc2lnbmVk\nSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hz\nOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBl\nPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJUcnVja1R5cGUiIHR5cGU9InRuczpUcnVja1R5cGUiIC8+\nDQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRydWNrVHlwZSI+DQogICAgPHhzOnNl\ncXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJ1Y2tUeXBlIiB0eXBlPSJ0bnM6VHJ1\nY2tUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1\nZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl\nbWVudCBuYW1lPSJMaXN0T2ZUcnVja1R5cGUiIHR5cGU9InRuczpMaXN0T2ZUcnVja1R5cGUiIG5p\nbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1hPg==</ByteString>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=289\" BrowseName=\"NamespaceUri\" ParentNodeId=\"ns=1;i=287\" DataType=\"String\">\n    <DisplayName>NamespaceUri</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=287</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/Vehicles/Types</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=15002\" BrowseName=\"Deprecated\" ParentNodeId=\"ns=1;i=287\" DataType=\"Boolean\">\n    <DisplayName>Deprecated</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=287</Reference>\n    </References>\n    <Value>\n      <Boolean xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">true</Boolean>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=320\" BrowseName=\"1:VehicleType\" ParentNodeId=\"ns=1;i=287\" DataType=\"String\">\n    <DisplayName>VehicleType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=287</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='VehicleType']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=323\" BrowseName=\"1:CarType\" ParentNodeId=\"ns=1;i=287\" DataType=\"String\">\n    <DisplayName>CarType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=287</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='CarType']</String>\n    </Value>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=326\" BrowseName=\"1:TruckType\" ParentNodeId=\"ns=1;i=287\" DataType=\"String\">\n    <DisplayName>TruckType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=69</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=287</Reference>\n    </References>\n    <Value>\n      <String xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">//xs:element[@name='TruckType']</String>\n    </Value>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=15003\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=314</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=15004\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=315</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=15005\" BrowseName=\"Default JSON\" SymbolicName=\"DefaultJson\">\n    <DisplayName>Default JSON</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasEncoding\" IsForward=\"false\">ns=1;i=316</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=76</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Vehicles/Types</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <VehicleType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=314</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>VehicleType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=22</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>i=22</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>Make</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Model</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </VehicleType>\n  <CarType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=315</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>CarType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=314</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>ns=1;i=314</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>Make</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Model</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>NoOfPassengers</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=7</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </CarType>\n  <TruckType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n    <uax:NodeClass>DataType_64</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=316</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>TruckType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=1;i=314</uax:Identifier>\n    </uax:SuperTypeId>\n    <uax:DataTypeDefinition>\n      <uax:TypeId>\n        <uax:Identifier>i=14798</uax:Identifier>\n      </uax:TypeId>\n      <uax:Body>\n        <uax:StructureDefinition>\n          <uax:BaseDataType>\n            <uax:Identifier>ns=1;i=314</uax:Identifier>\n          </uax:BaseDataType>\n          <uax:StructureType>Structure_0</uax:StructureType>\n          <uax:Fields>\n            <uax:StructureField>\n              <uax:Name>Make</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>Model</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=12</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n            <uax:StructureField>\n              <uax:Name>CargoCapacity</uax:Name>\n              <uax:DataType>\n                <uax:Identifier>i=7</uax:Identifier>\n              </uax:DataType>\n              <uax:ValueRank>-1</uax:ValueRank>\n              <uax:ArrayDimensions />\n              <uax:MaxStringLength>0</uax:MaxStringLength>\n              <uax:IsOptional>false</uax:IsOptional>\n            </uax:StructureField>\n          </uax:Fields>\n        </uax:StructureDefinition>\n      </uax:Body>\n    </uax:DataTypeDefinition>\n  </TruckType>\n  <DriverType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=341</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>DriverType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <PrimaryVehicle>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=342</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>PrimaryVehicle</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>342</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:ExtensionObject>\n            <uax:TypeId>\n              <uax:Identifier>ns=1;i=318</uax:Identifier>\n            </uax:TypeId>\n            <uax:Body>\n              <CarType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                <Make>Toyota</Make>\n                <Model>Prius</Model>\n                <NoOfPassengers>4</NoOfPassengers>\n              </CarType>\n            </uax:Body>\n          </uax:ExtensionObject>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=314</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </PrimaryVehicle>\n    <OwnedVehicles>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=344</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>OwnedVehicles</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>344</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:ListOfExtensionObject>\n            <uax:ExtensionObject>\n              <uax:TypeId>\n                <uax:Identifier>ns=1;i=319</uax:Identifier>\n              </uax:TypeId>\n              <uax:Body>\n                <TruckType xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                  <Make>Dodge</Make>\n                  <Model>Ram</Model>\n                  <CargoCapacity>500</CargoCapacity>\n                </TruckType>\n              </uax:Body>\n            </uax:ExtensionObject>\n            <uax:ExtensionObject>\n              <uax:TypeId>\n                <uax:Identifier>ns=1;i=318</uax:Identifier>\n              </uax:TypeId>\n              <uax:Body>\n                <VehicleType xsi:type=\"CarType\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n                  <Make>Porche</Make>\n                  <Model>Roadster</Model>\n                  <NoOfPassengers>2</NoOfPassengers>\n                </VehicleType>\n              </uax:Body>\n            </uax:ExtensionObject>\n          </uax:ListOfExtensionObject>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>ns=1;i=314</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>1</uax:ValueRank>\n      <uax:ArrayDimensions>0</uax:ArrayDimensions>\n      <uax:AccessLevel>3</uax:AccessLevel>\n      <uax:UserAccessLevel>3</uax:UserAccessLevel>\n    </OwnedVehicles>\n  </DriverType>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=329</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>329</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=314</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=332</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=330</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>330</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=315</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=335</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <DefaultBinary xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=331</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default Binary</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>331</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=316</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=338</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultBinary>\n  <Vehicles_BinarySchema xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=302</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Vehicles.Types</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>302</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlw\nZXMiDQogIERlZmF1bHRCeXRlT3JkZXI9IkxpdHRsZUVuZGlhbiINCiAgVGFyZ2V0TmFtZXNwYWNl\nPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvVmVoaWNsZXMvVHlwZXMiDQo+DQogIDxvcGM6\nSW1wb3J0IE5hbWVzcGFjZT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLyIgTG9jYXRpb249\nIk9wYy5VYS5CaW5hcnlTY2hlbWEuYnNkIi8+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1l\nPSJWZWhpY2xlVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpG\naWVsZCBOYW1lPSJNYWtlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxk\nIE5hbWU9Ik1vZGVsIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgPC9vcGM6U3RydWN0dXJl\nZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDYXJUeXBlIiBCYXNlVHlwZT0i\ndG5zOlZlaGljbGVUeXBlIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1ha2UiIFR5cGVOYW1lPSJv\ncGM6U3RyaW5nIiBTb3VyY2VUeXBlPSJ0bnM6VmVoaWNsZVR5cGUiIC8+DQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJNb2RlbCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5cGU9InRuczpWZWhp\nY2xlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZQYXNzZW5nZXJzIiBUeXBlTmFt\nZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1\nY3R1cmVkVHlwZSBOYW1lPSJUcnVja1R5cGUiIEJhc2VUeXBlPSJ0bnM6VmVoaWNsZVR5cGUiPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTWFrZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5\ncGU9InRuczpWZWhpY2xlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1vZGVsIiBUeXBl\nTmFtZT0ib3BjOlN0cmluZyIgU291cmNlVHlwZT0idG5zOlZlaGljbGVUeXBlIiAvPg0KICAgIDxv\ncGM6RmllbGQgTmFtZT0iQ2FyZ29DYXBhY2l0eSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQog\nIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQo8L29wYzpUeXBlRGljdGlvbmFyeT4=</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=93</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=304</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>304</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/UA/Vehicles/Types</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15001</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15001</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <VehicleType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=332</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>VehicleType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>332</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>VehicleType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </VehicleType>\n    <CarType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=335</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>CarType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>335</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>CarType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </CarType>\n    <TruckType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=338</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>TruckType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>338</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>TruckType</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </TruckType>\n  </Vehicles_BinarySchema>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=317</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>317</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=314</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=320</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=318</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>318</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=315</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=323</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <DefaultXml xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=319</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default XML</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>319</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=316</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=39</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=326</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultXml>\n  <Vehicles_XmlSchema xmlns=\"http://opcfoundation.org/UA/Vehicles/Types\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=287</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Vehicles.Types</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=72</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>287</uax:NumericId>\n    <uax:Value>\n      <uax:Value>\n        <uax:ByteString>PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL1ZlaGljbGVzL1R5\ncGVzIg0KICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS9WZWhp\nY2xlcy9UeXBlcyINCiAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQo+DQogIDx4czpp\nbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBl\ncy54c2QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZlaGljbGVUeXBlIj4NCiAgICA8\neHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNYWtlIiB0eXBlPSJ4czpzdHJp\nbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu\nYW1lPSJNb2RlbCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl\nIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt\nZW50IG5hbWU9IlZlaGljbGVUeXBlIiB0eXBlPSJ0bnM6VmVoaWNsZVR5cGUiIC8+DQoNCiAgPHhz\nOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlZlaGljbGVUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWZWhpY2xlVHlwZSIgdHlwZT0idG5zOlZlaGljbGVU\neXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZWZWhpY2xlVHlwZSIgdHlwZT0idG5zOkxpc3RPZlZlaGljbGVUeXBlIiBu\naWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJD\nYXJUeXBlIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4\nczpleHRlbnNpb24gYmFzZT0idG5zOlZlaGljbGVUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNl\nPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vT2ZQYXNzZW5nZXJzIiB0eXBlPSJ4czp1\nbnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAg\nICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21w\nbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FyVHlwZSIgdHlwZT0idG5zOkNhclR5cGUi\nIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNhclR5cGUiPg0KICAgIDx4czpz\nZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNhclR5cGUiIHR5cGU9InRuczpDYXJU\neXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIg\nLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu\ndCBuYW1lPSJMaXN0T2ZDYXJUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mQ2FyVHlwZSIgbmlsbGFibGU9\nInRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVHJ1Y2tUeXBl\nIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRl\nbnNpb24gYmFzZT0idG5zOlZlaGljbGVUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAg\nICAgICAgIDx4czplbGVtZW50IG5hbWU9IkNhcmdvQ2FwYWNpdHkiIHR5cGU9InhzOnVuc2lnbmVk\nSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hz\nOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBl\nPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJUcnVja1R5cGUiIHR5cGU9InRuczpUcnVja1R5cGUiIC8+\nDQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRydWNrVHlwZSI+DQogICAgPHhzOnNl\ncXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJ1Y2tUeXBlIiB0eXBlPSJ0bnM6VHJ1\nY2tUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1\nZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl\nbWVudCBuYW1lPSJMaXN0T2ZUcnVja1R5cGUiIHR5cGU9InRuczpMaXN0T2ZUcnVja1R5cGUiIG5p\nbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCjwveHM6c2NoZW1hPg==</uax:ByteString>\n      </uax:Value>\n    </uax:Value>\n    <uax:DataType>\n      <uax:Identifier>i=15</uax:Identifier>\n    </uax:DataType>\n    <uax:ValueRank>-1</uax:ValueRank>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=92</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n    <NamespaceUri xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=289</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>NamespaceUri</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>289</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>http://opcfoundation.org/UA/Vehicles/Types</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </NamespaceUri>\n    <Deprecated xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=15002</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>Deprecated</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>15002</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:Boolean>true</uax:Boolean>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=1</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Deprecated>\n    <VehicleType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=320</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>VehicleType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>320</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='VehicleType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </VehicleType>\n    <CarType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=323</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>CarType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>323</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='CarType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </CarType>\n    <TruckType>\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=326</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>TruckType</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=69</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>326</uax:NumericId>\n      <uax:Value>\n        <uax:Value>\n          <uax:String>//xs:element[@name='TruckType']</uax:String>\n        </uax:Value>\n      </uax:Value>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </TruckType>\n  </Vehicles_XmlSchema>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15003</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15003</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=314</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15004</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15004</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=315</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n  <DefaultJson xmlns=\"http://opcfoundation.org/UA/\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=15005</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>0</uax:NamespaceIndex>\n      <uax:Name>Default JSON</uax:Name>\n    </uax:BrowseName>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=76</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>15005</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=38</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>ns=1;i=316</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </DefaultJson>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Vehicles/Types\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Vehicles/Types\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n  <opc:StructuredType Name=\"VehicleType\" BaseType=\"ua:ExtensionObject\">\n    <opc:Field Name=\"Make\" TypeName=\"opc:String\" />\n    <opc:Field Name=\"Model\" TypeName=\"opc:String\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"CarType\" BaseType=\"tns:VehicleType\">\n    <opc:Field Name=\"Make\" TypeName=\"opc:String\" SourceType=\"tns:VehicleType\" />\n    <opc:Field Name=\"Model\" TypeName=\"opc:String\" SourceType=\"tns:VehicleType\" />\n    <opc:Field Name=\"NoOfPassengers\" TypeName=\"opc:UInt32\" />\n  </opc:StructuredType>\n\n  <opc:StructuredType Name=\"TruckType\" BaseType=\"tns:VehicleType\">\n    <opc:Field Name=\"Make\" TypeName=\"opc:String\" SourceType=\"tns:VehicleType\" />\n    <opc:Field Name=\"Model\" TypeName=\"opc:String\" SourceType=\"tns:VehicleType\" />\n    <opc:Field Name=\"CargoCapacity\" TypeName=\"opc:UInt32\" />\n  </opc:StructuredType>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Vehicles/Design/Vehicles.Types.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Vehicles/Types\"\n  targetNamespace=\"http://opcfoundation.org/UA/Vehicles/Types\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n  <xs:complexType name=\"VehicleType\">\n    <xs:sequence>\n      <xs:element name=\"Make\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n      <xs:element name=\"Model\" type=\"xs:string\" minOccurs=\"0\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"VehicleType\" type=\"tns:VehicleType\" />\n\n  <xs:complexType name=\"ListOfVehicleType\">\n    <xs:sequence>\n      <xs:element name=\"VehicleType\" type=\"tns:VehicleType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfVehicleType\" type=\"tns:ListOfVehicleType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"CarType\">\n    <xs:complexContent mixed=\"false\">\n      <xs:extension base=\"tns:VehicleType\">\n        <xs:sequence>\n          <xs:element name=\"NoOfPassengers\" type=\"xs:unsignedInt\" minOccurs=\"0\" />\n        </xs:sequence>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n  <xs:element name=\"CarType\" type=\"tns:CarType\" />\n\n  <xs:complexType name=\"ListOfCarType\">\n    <xs:sequence>\n      <xs:element name=\"CarType\" type=\"tns:CarType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfCarType\" type=\"tns:ListOfCarType\" nillable=\"true\"></xs:element>\n\n  <xs:complexType name=\"TruckType\">\n    <xs:complexContent mixed=\"false\">\n      <xs:extension base=\"tns:VehicleType\">\n        <xs:sequence>\n          <xs:element name=\"CargoCapacity\" type=\"xs:unsignedInt\" minOccurs=\"0\" />\n        </xs:sequence>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n  <xs:element name=\"TruckType\" type=\"tns:TruckType\" />\n\n  <xs:complexType name=\"ListOfTruckType\">\n    <xs:sequence>\n      <xs:element name=\"TruckType\" type=\"tns:TruckType\" minOccurs=\"0\" maxOccurs=\"unbounded\" nillable=\"true\" />\n    </xs:sequence>\n  </xs:complexType>\n  <xs:element name=\"ListOfTruckType\" type=\"tns:ListOfTruckType\" nillable=\"true\"></xs:element>\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Engineering.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace Engineering\n{\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the SerialNumber Variable.\n        /// </summary>\n        public const uint SerialNumber = 443;\n\n        /// <summary>\n        /// The identifier for the Manufacturer Variable.\n        /// </summary>\n        public const uint Manufacturer = 444;\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the SerialNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SerialNumber = new ExpandedNodeId(Engineering.Variables.SerialNumber, Engineering.Namespaces.Engineering);\n\n        /// <summary>\n        /// The identifier for the Manufacturer Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Manufacturer = new ExpandedNodeId(Engineering.Variables.Manufacturer, Engineering.Namespaces.Engineering);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the Manufacturer component.\n        /// </summary>\n        public const string Manufacturer = \"Manufacturer\";\n\n        /// <summary>\n        /// The BrowseName for the SerialNumber component.\n        /// </summary>\n        public const string SerialNumber = \"SerialNumber\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the Engineering namespace (.NET code namespace is 'Engineering').\n        /// </summary>\n        public const string Engineering = \"http://opcfoundation.org/UA/Engineering\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Engineering.NodeIds.csv",
    "content": "Manufacturer,444,Variable\nSerialNumber,443,Variable\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Engineering.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/UA/Engineering</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=443</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SerialNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SerialNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-2</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=444</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Manufacturer</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Manufacturer</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-2</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Engineering.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/Engineering</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/Engineering\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UAVariable NodeId=\"ns=1;i=443\" BrowseName=\"1:SerialNumber\" DataType=\"String\" ValueRank=\"-2\">\n    <DisplayName>SerialNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=444\" BrowseName=\"1:Manufacturer\" DataType=\"String\" ValueRank=\"-2\">\n    <DisplayName>Manufacturer</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n    </References>\n  </UAVariable>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Engineering.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Engineering</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <SerialNumber xmlns=\"http://opcfoundation.org/UA/Engineering\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=443</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SerialNumber</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=46</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=68</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>443</uax:NumericId>\n    <uax:DataType>\n      <uax:Identifier>i=12</uax:Identifier>\n    </uax:DataType>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n  </SerialNumber>\n  <Manufacturer xmlns=\"http://opcfoundation.org/UA/Engineering\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=444</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Manufacturer</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=46</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=68</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>444</uax:NumericId>\n    <uax:DataType>\n      <uax:Identifier>i=12</uax:Identifier>\n    </uax:DataType>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n  </Manufacturer>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Engineering.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Engineering\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Engineering\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Engineering.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Engineering\"\n  targetNamespace=\"http://opcfoundation.org/UA/Engineering\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/EngineeringDesign.csv",
    "content": "SerialNumber,443,Variable\nManufacturer,444,Variable\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/EngineeringDesign.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns=\"http://opcfoundation.org/UA/Engineering\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Engineering\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"Engineering\" Prefix=\"Engineering\" InternalPrefix=\"Engineering\">http://opcfoundation.org/UA/Engineering</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:Property SymbolicName=\"SerialNumber\" DataType=\"ua:String\"></opc:Property>\n  <opc:Property SymbolicName=\"Manufacturer\" DataType=\"ua:String\"></opc:Property>\n\n</opc:ModelDesign>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Model.Classes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\nusing System;\nusing System.Collections.Generic;\n\nnamespace Model\n{\n    #region GenericControllerState Class\n#if (!OPCUA_EXCLUDE_GenericControllerState)\n    /// <summary>\n    /// Stores an instance of the GenericControllerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class GenericControllerState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public GenericControllerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Model.ObjectTypes.GenericControllerType, Model.Namespaces.Views, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AwAAACcAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvRW5naW5lZXJpbmcmAAAAaHR0cDovL29w\" +\n           \"Y2ZvdW5kYXRpb24ub3JnL1VBL09wZXJhdGlvbnMhAAAAaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\" +\n           \"L1ZpZXdz/////wRggAIBAAAAAwAdAAAAR2VuZXJpY0NvbnRyb2xsZXJUeXBlSW5zdGFuY2UBA1kBAQNZ\" +\n           \"AVkBAAD/////BAAAABVgiQoCAAAAAQAMAAAAU2VyaWFsTnVtYmVyAQNaAQAuAERaAQAAAAz/////AQH/\" +\n           \"////AAAAABVgiQoCAAAAAQAMAAAATWFudWZhY3R1cmVyAQNbAQAuAERbAQAAAAz/////AQH/////AAAA\" +\n           \"ABVgiQoCAAAAAgAIAAAAU2V0UG9pbnQBA1wBAC8BAEAJXAEAAAAL/////wEB/////wEAAAAVYIkKAgAA\" +\n           \"AAAABwAAAEVVUmFuZ2UBA18BAC4ARF8BAAABAHQD/////wEB/////wAAAAAVYIkKAgAAAAIACwAAAE1l\" +\n           \"YXN1cmVtZW50AQNiAQAvAQBACWIBAAAAC/////8BAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdl\" +\n           \"AQNlAQAuAERlAQAAAQB0A/////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public PropertyState<string> SerialNumber\n        {\n            get\n            {\n                return m_serialNumber;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_serialNumber, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_serialNumber = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public PropertyState<string> Manufacturer\n        {\n            get\n            {\n                return m_manufacturer;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_manufacturer, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_manufacturer = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public AnalogItemState<double> SetPoint\n        {\n            get\n            {\n                return m_setPoint;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_setPoint, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_setPoint = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public AnalogItemState<double> Measurement\n        {\n            get\n            {\n                return m_measurement;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_measurement, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_measurement = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_serialNumber != null)\n            {\n                children.Add(m_serialNumber);\n            }\n\n            if (m_manufacturer != null)\n            {\n                children.Add(m_manufacturer);\n            }\n\n            if (m_setPoint != null)\n            {\n                children.Add(m_setPoint);\n            }\n\n            if (m_measurement != null)\n            {\n                children.Add(m_measurement);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Engineering.BrowseNames.SerialNumber:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (SerialNumber == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    SerialNumber = new PropertyState<string>(this);\n                                }\n                                else\n                                {\n                                    SerialNumber = (PropertyState<string>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = SerialNumber;\n                        break;\n                    }\n\n                case Engineering.BrowseNames.Manufacturer:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Manufacturer == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Manufacturer = new PropertyState<string>(this);\n                                }\n                                else\n                                {\n                                    Manufacturer = (PropertyState<string>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Manufacturer;\n                        break;\n                    }\n\n                case Operations.BrowseNames.SetPoint:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (SetPoint == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    SetPoint = new AnalogItemState<double>(this);\n                                }\n                                else\n                                {\n                                    SetPoint = (AnalogItemState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = SetPoint;\n                        break;\n                    }\n\n                case Operations.BrowseNames.Measurement:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Measurement == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Measurement = new AnalogItemState<double>(this);\n                                }\n                                else\n                                {\n                                    Measurement = (AnalogItemState<double>)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Measurement;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private PropertyState<string> m_serialNumber;\n        private PropertyState<string> m_manufacturer;\n        private AnalogItemState<double> m_setPoint;\n        private AnalogItemState<double> m_measurement;\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region FlowControllerState Class\n#if (!OPCUA_EXCLUDE_FlowControllerState)\n    /// <summary>\n    /// Stores an instance of the FlowControllerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class FlowControllerState : GenericControllerState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public FlowControllerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Model.ObjectTypes.FlowControllerType, Model.Namespaces.Views, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AwAAACcAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvRW5naW5lZXJpbmcmAAAAaHR0cDovL29w\" +\n           \"Y2ZvdW5kYXRpb24ub3JnL1VBL09wZXJhdGlvbnMhAAAAaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\" +\n           \"L1ZpZXdz/////wRggAIBAAAAAwAaAAAARmxvd0NvbnRyb2xsZXJUeXBlSW5zdGFuY2UBA2gBAQNoAWgB\" +\n           \"AAD/////BAAAABVgiQoCAAAAAQAMAAAAU2VyaWFsTnVtYmVyAQNpAQAuAERpAQAAAAz/////AQH/////\" +\n           \"AAAAABVgiQoCAAAAAQAMAAAATWFudWZhY3R1cmVyAQNqAQAuAERqAQAAAAz/////AQH/////AAAAABVg\" +\n           \"iQoCAAAAAgAIAAAAU2V0UG9pbnQBA2sBAC8BAEAJawEAAAAL/////wEB/////wEAAAAVYIkKAgAAAAAA\" +\n           \"BwAAAEVVUmFuZ2UBA24BAC4ARG4BAAABAHQD/////wEB/////wAAAAAVYIkKAgAAAAIACwAAAE1lYXN1\" +\n           \"cmVtZW50AQNxAQAvAQBACXEBAAAAC/////8BAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQN0\" +\n           \"AQAuAER0AQAAAQB0A/////8BAf////8AAAAA\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region LevelControllerState Class\n#if (!OPCUA_EXCLUDE_LevelControllerState)\n    /// <summary>\n    /// Stores an instance of the LevelControllerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class LevelControllerState : GenericControllerState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public LevelControllerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Model.ObjectTypes.LevelControllerType, Model.Namespaces.Views, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AwAAACcAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvRW5naW5lZXJpbmcmAAAAaHR0cDovL29w\" +\n           \"Y2ZvdW5kYXRpb24ub3JnL1VBL09wZXJhdGlvbnMhAAAAaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\" +\n           \"L1ZpZXdz/////wRggAIBAAAAAwAbAAAATGV2ZWxDb250cm9sbGVyVHlwZUluc3RhbmNlAQN3AQEDdwF3\" +\n           \"AQAA/////wQAAAAVYIkKAgAAAAEADAAAAFNlcmlhbE51bWJlcgEDeAEALgBEeAEAAAAM/////wEB////\" +\n           \"/wAAAAAVYIkKAgAAAAEADAAAAE1hbnVmYWN0dXJlcgEDeQEALgBEeQEAAAAM/////wEB/////wAAAAAV\" +\n           \"YIkKAgAAAAIACAAAAFNldFBvaW50AQN6AQAvAQBACXoBAAAAC/////8BAf////8BAAAAFWCJCgIAAAAA\" +\n           \"AAcAAABFVVJhbmdlAQN9AQAuAER9AQAAAQB0A/////8BAf////8AAAAAFWCJCgIAAAACAAsAAABNZWFz\" +\n           \"dXJlbWVudAEDgAEALwEAQAmAAQAAAAv/////AQH/////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQED\" +\n           \"gwEALgBEgwEAAAEAdAP/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        #endregion\n\n        #region Overridden Methods\n        #endregion\n\n        #region Private Fields\n        #endregion\n    }\n#endif\n    #endregion\n\n    #region BoilerState Class\n#if (!OPCUA_EXCLUDE_BoilerState)\n    /// <summary>\n    /// Stores an instance of the BoilerType ObjectType.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public partial class BoilerState : BaseObjectState\n    {\n        #region Constructors\n        /// <summary>\n        /// Initializes the type with its default attribute values.\n        /// </summary>\n        public BoilerState(NodeState parent) : base(parent)\n        {\n        }\n\n        /// <summary>\n        /// Returns the id of the default type definition node for the instance.\n        /// </summary>\n        protected override NodeId GetDefaultTypeDefinitionId(NamespaceTable namespaceUris)\n        {\n            return Opc.Ua.NodeId.Create(Model.ObjectTypes.BoilerType, Model.Namespaces.Views, namespaceUris);\n        }\n\n#if (!OPCUA_EXCLUDE_InitializationStrings)\n        /// <summary>\n        /// Initializes the instance.\n        /// </summary>\n        protected override void Initialize(ISystemContext context)\n        {\n            Initialize(context, InitializationString);\n            InitializeOptionalChildren(context);\n        }\n\n        /// <summary>\n        /// Initializes the instance with a node.\n        /// </summary>\n        protected override void Initialize(ISystemContext context, NodeState source)\n        {\n            InitializeOptionalChildren(context);\n            base.Initialize(context, source);\n        }\n\n        /// <summary>\n        /// Initializes the any option children defined for the instance.\n        /// </summary>\n        protected override void InitializeOptionalChildren(ISystemContext context)\n        {\n            base.InitializeOptionalChildren(context);\n        }\n\n        #region Initialization String\n        private const string InitializationString =\n           \"AwAAACcAAABodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvRW5naW5lZXJpbmcmAAAAaHR0cDovL29w\" +\n           \"Y2ZvdW5kYXRpb24ub3JnL1VBL09wZXJhdGlvbnMhAAAAaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\" +\n           \"L1ZpZXdz/////wRggAIBAAAAAwASAAAAQm9pbGVyVHlwZUluc3RhbmNlAQOGAQEDhgGGAQAA/////wMA\" +\n           \"AAAEYIAKAQAAAAMABwAAAFdhdGVySW4BA4cBAC8AOocBAAD/////AQAAAARggAoBAAAAAwAEAAAARmxv\" +\n           \"dwEDiAEALwEDaAGIAQAA/////wQAAAAVYIkKAgAAAAEADAAAAFNlcmlhbE51bWJlcgEDiQEALgBEiQEA\" +\n           \"AAAM/////wEB/////wAAAAAVYIkKAgAAAAEADAAAAE1hbnVmYWN0dXJlcgEDigEALgBEigEAAAAM////\" +\n           \"/wEB/////wAAAAAVYIkKAgAAAAIACAAAAFNldFBvaW50AQOLAQAvAQBACYsBAAAAC/////8BAf////8B\" +\n           \"AAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQOOAQAuAESOAQAAAQB0A/////8BAf////8AAAAAFWCJCgIA\" +\n           \"AAACAAsAAABNZWFzdXJlbWVudAEDkQEALwEAQAmRAQAAAAv/////AQH/////AQAAABVgiQoCAAAAAAAH\" +\n           \"AAAARVVSYW5nZQEDlAEALgBElAEAAAEAdAP/////AQH/////AAAAAARggAoBAAAAAwAIAAAAU3RlYW1P\" +\n           \"dXQBA5cBAC8AOpcBAAD/////AQAAAARggAoBAAAAAwAEAAAARmxvdwEDmAEALwEDaAGYAQAA/////wQA\" +\n           \"AAAVYIkKAgAAAAEADAAAAFNlcmlhbE51bWJlcgEDmQEALgBEmQEAAAAM/////wEB/////wAAAAAVYIkK\" +\n           \"AgAAAAEADAAAAE1hbnVmYWN0dXJlcgEDmgEALgBEmgEAAAAM/////wEB/////wAAAAAVYIkKAgAAAAIA\" +\n           \"CAAAAFNldFBvaW50AQObAQAvAQBACZsBAAAAC/////8BAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJh\" +\n           \"bmdlAQOeAQAuAESeAQAAAQB0A/////8BAf////8AAAAAFWCJCgIAAAACAAsAAABNZWFzdXJlbWVudAED\" +\n           \"oQEALwEAQAmhAQAAAAv/////AQH/////AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEDpAEALgBEpAEA\" +\n           \"AAEAdAP/////AQH/////AAAAAARggAoBAAAAAwAEAAAARHJ1bQEDpwEALwA6pwEAAP////8BAAAABGCA\" +\n           \"CgEAAAADAAUAAABMZXZlbAEDqAEALwEDdwGoAQAA/////wQAAAAVYIkKAgAAAAEADAAAAFNlcmlhbE51\" +\n           \"bWJlcgEDqQEALgBEqQEAAAAM/////wEB/////wAAAAAVYIkKAgAAAAEADAAAAE1hbnVmYWN0dXJlcgED\" +\n           \"qgEALgBEqgEAAAAM/////wEB/////wAAAAAVYIkKAgAAAAIACAAAAFNldFBvaW50AQOrAQAvAQBACasB\" +\n           \"AAAAC/////8BAf////8BAAAAFWCJCgIAAAAAAAcAAABFVVJhbmdlAQOuAQAuAESuAQAAAQB0A/////8B\" +\n           \"Af////8AAAAAFWCJCgIAAAACAAsAAABNZWFzdXJlbWVudAEDsQEALwEAQAmxAQAAAAv/////AQH/////\" +\n           \"AQAAABVgiQoCAAAAAAAHAAAARVVSYW5nZQEDtAEALgBEtAEAAAEAdAP/////AQH/////AAAAAA==\";\n        #endregion\n#endif\n        #endregion\n\n        #region Public Properties\n        /// <inheritdoc/>\n        public BaseObjectState WaterIn\n        {\n            get\n            {\n                return m_waterIn;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_waterIn, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_waterIn = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public BaseObjectState SteamOut\n        {\n            get\n            {\n                return m_steamOut;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_steamOut, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_steamOut = value;\n            }\n        }\n\n        /// <inheritdoc/>\n        public BaseObjectState Drum\n        {\n            get\n            {\n                return m_drum;\n            }\n\n            set\n            {\n                if (!Object.ReferenceEquals(m_drum, value))\n                {\n                    ChangeMasks |= NodeStateChangeMasks.Children;\n                }\n\n                m_drum = value;\n            }\n        }\n        #endregion\n\n        #region Overridden Methods\n        /// <summary>\n        /// Populates a list with the children that belong to the node.\n        /// </summary>\n        /// <param name=\"context\">The context for the system being accessed.</param>\n        /// <param name=\"children\">The list of children to populate.</param>\n        public override void GetChildren(\n            ISystemContext context,\n            IList<BaseInstanceState> children)\n        {\n            if (m_waterIn != null)\n            {\n                children.Add(m_waterIn);\n            }\n\n            if (m_steamOut != null)\n            {\n                children.Add(m_steamOut);\n            }\n\n            if (m_drum != null)\n            {\n                children.Add(m_drum);\n            }\n\n            base.GetChildren(context, children);\n        }\n\n        /// <summary>\n        /// Finds the child with the specified browse name.\n        /// </summary>\n        protected override BaseInstanceState FindChild(\n            ISystemContext context,\n            QualifiedName browseName,\n            bool createOrReplace,\n            BaseInstanceState replacement)\n        {\n            if (QualifiedName.IsNull(browseName))\n            {\n                return null;\n            }\n\n            BaseInstanceState instance = null;\n\n            switch (browseName.Name)\n            {\n                case Model.BrowseNames.WaterIn:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (WaterIn == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    WaterIn = new BaseObjectState(this);\n                                }\n                                else\n                                {\n                                    WaterIn = (BaseObjectState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = WaterIn;\n                        break;\n                    }\n\n                case Model.BrowseNames.SteamOut:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (SteamOut == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    SteamOut = new BaseObjectState(this);\n                                }\n                                else\n                                {\n                                    SteamOut = (BaseObjectState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = SteamOut;\n                        break;\n                    }\n\n                case Model.BrowseNames.Drum:\n                    {\n                        if (createOrReplace)\n                        {\n                            if (Drum == null)\n                            {\n                                if (replacement == null)\n                                {\n                                    Drum = new BaseObjectState(this);\n                                }\n                                else\n                                {\n                                    Drum = (BaseObjectState)replacement;\n                                }\n                            }\n                        }\n\n                        instance = Drum;\n                        break;\n                    }\n            }\n\n            if (instance != null)\n            {\n                return instance;\n            }\n\n            return base.FindChild(context, browseName, createOrReplace, replacement);\n        }\n        #endregion\n\n        #region Private Fields\n        private BaseObjectState m_waterIn;\n        private BaseObjectState m_steamOut;\n        private BaseObjectState m_drum;\n        #endregion\n    }\n#endif\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Model.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace Model\n{\n    #region Object Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Objects\n    {\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn Object.\n        /// </summary>\n        public const uint BoilerType_WaterIn = 391;\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow Object.\n        /// </summary>\n        public const uint BoilerType_WaterIn_Flow = 392;\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut Object.\n        /// </summary>\n        public const uint BoilerType_SteamOut = 407;\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow Object.\n        /// </summary>\n        public const uint BoilerType_SteamOut_Flow = 408;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum Object.\n        /// </summary>\n        public const uint BoilerType_Drum = 423;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level Object.\n        /// </summary>\n        public const uint BoilerType_Drum_Level = 424;\n\n        /// <summary>\n        /// The identifier for the Plant Object.\n        /// </summary>\n        public const uint Plant = 442;\n    }\n    #endregion\n\n    #region ObjectType Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypes\n    {\n        /// <summary>\n        /// The identifier for the GenericControllerType ObjectType.\n        /// </summary>\n        public const uint GenericControllerType = 345;\n\n        /// <summary>\n        /// The identifier for the FlowControllerType ObjectType.\n        /// </summary>\n        public const uint FlowControllerType = 360;\n\n        /// <summary>\n        /// The identifier for the LevelControllerType ObjectType.\n        /// </summary>\n        public const uint LevelControllerType = 375;\n\n        /// <summary>\n        /// The identifier for the BoilerType ObjectType.\n        /// </summary>\n        public const uint BoilerType = 390;\n    }\n    #endregion\n\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the GenericControllerType_SerialNumber Variable.\n        /// </summary>\n        public const uint GenericControllerType_SerialNumber = 346;\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_Manufacturer Variable.\n        /// </summary>\n        public const uint GenericControllerType_Manufacturer = 347;\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_SetPoint Variable.\n        /// </summary>\n        public const uint GenericControllerType_SetPoint = 348;\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_SetPoint_EURange Variable.\n        /// </summary>\n        public const uint GenericControllerType_SetPoint_EURange = 351;\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_Measurement Variable.\n        /// </summary>\n        public const uint GenericControllerType_Measurement = 354;\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_Measurement_EURange Variable.\n        /// </summary>\n        public const uint GenericControllerType_Measurement_EURange = 357;\n\n        /// <summary>\n        /// The identifier for the FlowControllerType_SetPoint_EURange Variable.\n        /// </summary>\n        public const uint FlowControllerType_SetPoint_EURange = 366;\n\n        /// <summary>\n        /// The identifier for the FlowControllerType_Measurement_EURange Variable.\n        /// </summary>\n        public const uint FlowControllerType_Measurement_EURange = 372;\n\n        /// <summary>\n        /// The identifier for the LevelControllerType_SetPoint_EURange Variable.\n        /// </summary>\n        public const uint LevelControllerType_SetPoint_EURange = 381;\n\n        /// <summary>\n        /// The identifier for the LevelControllerType_Measurement_EURange Variable.\n        /// </summary>\n        public const uint LevelControllerType_Measurement_EURange = 387;\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_SerialNumber Variable.\n        /// </summary>\n        public const uint BoilerType_WaterIn_Flow_SerialNumber = 393;\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_Manufacturer Variable.\n        /// </summary>\n        public const uint BoilerType_WaterIn_Flow_Manufacturer = 394;\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_SetPoint Variable.\n        /// </summary>\n        public const uint BoilerType_WaterIn_Flow_SetPoint = 395;\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_SetPoint_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_WaterIn_Flow_SetPoint_EURange = 398;\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_Measurement Variable.\n        /// </summary>\n        public const uint BoilerType_WaterIn_Flow_Measurement = 401;\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_Measurement_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_WaterIn_Flow_Measurement_EURange = 404;\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_SerialNumber Variable.\n        /// </summary>\n        public const uint BoilerType_SteamOut_Flow_SerialNumber = 409;\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_Manufacturer Variable.\n        /// </summary>\n        public const uint BoilerType_SteamOut_Flow_Manufacturer = 410;\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_SetPoint Variable.\n        /// </summary>\n        public const uint BoilerType_SteamOut_Flow_SetPoint = 411;\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_SetPoint_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_SteamOut_Flow_SetPoint_EURange = 414;\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_Measurement Variable.\n        /// </summary>\n        public const uint BoilerType_SteamOut_Flow_Measurement = 417;\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_Measurement_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_SteamOut_Flow_Measurement_EURange = 420;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_SerialNumber Variable.\n        /// </summary>\n        public const uint BoilerType_Drum_Level_SerialNumber = 425;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_Manufacturer Variable.\n        /// </summary>\n        public const uint BoilerType_Drum_Level_Manufacturer = 426;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_SetPoint Variable.\n        /// </summary>\n        public const uint BoilerType_Drum_Level_SetPoint = 427;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_SetPoint_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_Drum_Level_SetPoint_EURange = 430;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_Measurement Variable.\n        /// </summary>\n        public const uint BoilerType_Drum_Level_Measurement = 433;\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_Measurement_EURange Variable.\n        /// </summary>\n        public const uint BoilerType_Drum_Level_Measurement_EURange = 436;\n    }\n    #endregion\n\n    #region View Identifiers\n    /// <summary>\n    /// A class that declares constants for all Views in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Views\n    {\n        /// <summary>\n        /// The identifier for the Engineering View.\n        /// </summary>\n        public const uint Engineering = 439;\n\n        /// <summary>\n        /// The identifier for the Operations View.\n        /// </summary>\n        public const uint Operations = 441;\n    }\n    #endregion\n\n    #region Object Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Objects in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectIds\n    {\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_WaterIn = new ExpandedNodeId(Model.Objects.BoilerType_WaterIn, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_WaterIn_Flow = new ExpandedNodeId(Model.Objects.BoilerType_WaterIn_Flow, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_SteamOut = new ExpandedNodeId(Model.Objects.BoilerType_SteamOut, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_SteamOut_Flow = new ExpandedNodeId(Model.Objects.BoilerType_SteamOut_Flow, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum = new ExpandedNodeId(Model.Objects.BoilerType_Drum, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level Object.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_Level = new ExpandedNodeId(Model.Objects.BoilerType_Drum_Level, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the Plant Object.\n        /// </summary>\n        public static readonly ExpandedNodeId Plant = new ExpandedNodeId(Model.Objects.Plant, Model.Namespaces.Views);\n    }\n    #endregion\n\n    #region ObjectType Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all ObjectTypes in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ObjectTypeIds\n    {\n        /// <summary>\n        /// The identifier for the GenericControllerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType = new ExpandedNodeId(Model.ObjectTypes.GenericControllerType, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the FlowControllerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId FlowControllerType = new ExpandedNodeId(Model.ObjectTypes.FlowControllerType, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the LevelControllerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId LevelControllerType = new ExpandedNodeId(Model.ObjectTypes.LevelControllerType, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType ObjectType.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType = new ExpandedNodeId(Model.ObjectTypes.BoilerType, Model.Namespaces.Views);\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the GenericControllerType_SerialNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_SerialNumber = new ExpandedNodeId(Model.Variables.GenericControllerType_SerialNumber, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_Manufacturer Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_Manufacturer = new ExpandedNodeId(Model.Variables.GenericControllerType_Manufacturer, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_SetPoint = new ExpandedNodeId(Model.Variables.GenericControllerType_SetPoint, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_SetPoint_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_SetPoint_EURange = new ExpandedNodeId(Model.Variables.GenericControllerType_SetPoint_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_Measurement = new ExpandedNodeId(Model.Variables.GenericControllerType_Measurement, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the GenericControllerType_Measurement_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId GenericControllerType_Measurement_EURange = new ExpandedNodeId(Model.Variables.GenericControllerType_Measurement_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the FlowControllerType_SetPoint_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId FlowControllerType_SetPoint_EURange = new ExpandedNodeId(Model.Variables.FlowControllerType_SetPoint_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the FlowControllerType_Measurement_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId FlowControllerType_Measurement_EURange = new ExpandedNodeId(Model.Variables.FlowControllerType_Measurement_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the LevelControllerType_SetPoint_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId LevelControllerType_SetPoint_EURange = new ExpandedNodeId(Model.Variables.LevelControllerType_SetPoint_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the LevelControllerType_Measurement_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId LevelControllerType_Measurement_EURange = new ExpandedNodeId(Model.Variables.LevelControllerType_Measurement_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_SerialNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_WaterIn_Flow_SerialNumber = new ExpandedNodeId(Model.Variables.BoilerType_WaterIn_Flow_SerialNumber, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_Manufacturer Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_WaterIn_Flow_Manufacturer = new ExpandedNodeId(Model.Variables.BoilerType_WaterIn_Flow_Manufacturer, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_WaterIn_Flow_SetPoint = new ExpandedNodeId(Model.Variables.BoilerType_WaterIn_Flow_SetPoint, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_SetPoint_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_WaterIn_Flow_SetPoint_EURange = new ExpandedNodeId(Model.Variables.BoilerType_WaterIn_Flow_SetPoint_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_WaterIn_Flow_Measurement = new ExpandedNodeId(Model.Variables.BoilerType_WaterIn_Flow_Measurement, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_WaterIn_Flow_Measurement_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_WaterIn_Flow_Measurement_EURange = new ExpandedNodeId(Model.Variables.BoilerType_WaterIn_Flow_Measurement_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_SerialNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_SteamOut_Flow_SerialNumber = new ExpandedNodeId(Model.Variables.BoilerType_SteamOut_Flow_SerialNumber, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_Manufacturer Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_SteamOut_Flow_Manufacturer = new ExpandedNodeId(Model.Variables.BoilerType_SteamOut_Flow_Manufacturer, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_SteamOut_Flow_SetPoint = new ExpandedNodeId(Model.Variables.BoilerType_SteamOut_Flow_SetPoint, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_SetPoint_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_SteamOut_Flow_SetPoint_EURange = new ExpandedNodeId(Model.Variables.BoilerType_SteamOut_Flow_SetPoint_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_SteamOut_Flow_Measurement = new ExpandedNodeId(Model.Variables.BoilerType_SteamOut_Flow_Measurement, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_SteamOut_Flow_Measurement_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_SteamOut_Flow_Measurement_EURange = new ExpandedNodeId(Model.Variables.BoilerType_SteamOut_Flow_Measurement_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_SerialNumber Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_Level_SerialNumber = new ExpandedNodeId(Model.Variables.BoilerType_Drum_Level_SerialNumber, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_Manufacturer Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_Level_Manufacturer = new ExpandedNodeId(Model.Variables.BoilerType_Drum_Level_Manufacturer, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_Level_SetPoint = new ExpandedNodeId(Model.Variables.BoilerType_Drum_Level_SetPoint, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_SetPoint_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_Level_SetPoint_EURange = new ExpandedNodeId(Model.Variables.BoilerType_Drum_Level_SetPoint_EURange, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_Level_Measurement = new ExpandedNodeId(Model.Variables.BoilerType_Drum_Level_Measurement, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the BoilerType_Drum_Level_Measurement_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId BoilerType_Drum_Level_Measurement_EURange = new ExpandedNodeId(Model.Variables.BoilerType_Drum_Level_Measurement_EURange, Model.Namespaces.Views);\n    }\n    #endregion\n\n    #region View Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Views in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class ViewIds\n    {\n        /// <summary>\n        /// The identifier for the Engineering View.\n        /// </summary>\n        public static readonly ExpandedNodeId Engineering = new ExpandedNodeId(Model.Views.Engineering, Model.Namespaces.Views);\n\n        /// <summary>\n        /// The identifier for the Operations View.\n        /// </summary>\n        public static readonly ExpandedNodeId Operations = new ExpandedNodeId(Model.Views.Operations, Model.Namespaces.Views);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the BoilerType component.\n        /// </summary>\n        public const string BoilerType = \"BoilerType\";\n\n        /// <summary>\n        /// The BrowseName for the Drum component.\n        /// </summary>\n        public const string Drum = \"Drum\";\n\n        /// <summary>\n        /// The BrowseName for the Engineering component.\n        /// </summary>\n        public const string Engineering = \"Engineering\";\n\n        /// <summary>\n        /// The BrowseName for the FlowControllerType component.\n        /// </summary>\n        public const string FlowControllerType = \"FlowControllerType\";\n\n        /// <summary>\n        /// The BrowseName for the GenericControllerType component.\n        /// </summary>\n        public const string GenericControllerType = \"GenericControllerType\";\n\n        /// <summary>\n        /// The BrowseName for the LevelControllerType component.\n        /// </summary>\n        public const string LevelControllerType = \"LevelControllerType\";\n\n        /// <summary>\n        /// The BrowseName for the Operations component.\n        /// </summary>\n        public const string Operations = \"Operations\";\n\n        /// <summary>\n        /// The BrowseName for the Plant component.\n        /// </summary>\n        public const string Plant = \"Plant\";\n\n        /// <summary>\n        /// The BrowseName for the SteamOut component.\n        /// </summary>\n        public const string SteamOut = \"SteamOut\";\n\n        /// <summary>\n        /// The BrowseName for the WaterIn component.\n        /// </summary>\n        public const string WaterIn = \"WaterIn\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the Engineering namespace (.NET code namespace is 'Engineering').\n        /// </summary>\n        public const string Engineering = \"http://opcfoundation.org/UA/Engineering\";\n\n        /// <summary>\n        /// The URI for the Operations namespace (.NET code namespace is 'Operations').\n        /// </summary>\n        public const string Operations = \"http://opcfoundation.org/UA/Operations\";\n\n        /// <summary>\n        /// The URI for the Views namespace (.NET code namespace is 'Model').\n        /// </summary>\n        public const string Views = \"http://opcfoundation.org/UA/Views\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Model.NodeIds.csv",
    "content": "BoilerType,390,ObjectType\nEngineering,439,View\nFlowControllerType,360,ObjectType\nGenericControllerType,345,ObjectType\nLevelControllerType,375,ObjectType\nOperations,441,View\nPlant,442,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Model.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/UA/Views</String>\n    <String>http://opcfoundation.org/UA/Engineering</String>\n    <String>http://opcfoundation.org/UA/Operations</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=345</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>GenericControllerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>GenericControllerType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=346</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=347</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=348</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=354</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=360</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=375</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=346</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>SerialNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SerialNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=345</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=347</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>Manufacturer</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Manufacturer</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=345</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=348</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>3</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=345</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=351</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=351</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=348</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=354</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>3</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=345</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=357</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=357</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=354</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=360</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>FlowControllerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>FlowControllerType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=345</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=375</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>LevelControllerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>LevelControllerType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=345</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectTypeNode\">\n      <NodeId>\n        <Identifier>ns=1;i=390</Identifier>\n      </NodeId>\n      <NodeClass>ObjectType_8</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>BoilerType</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>BoilerType</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=45</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=391</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=407</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=423</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <IsAbstract>false</IsAbstract>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=391</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>WaterIn</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>WaterIn</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=390</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=392</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=392</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Flow</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Flow</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=391</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=360</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=393</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=394</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=395</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=401</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=393</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>SerialNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SerialNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=392</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=394</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>Manufacturer</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Manufacturer</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=392</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=395</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>3</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=392</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=398</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=398</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=395</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=401</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>3</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=392</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=404</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=404</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=401</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=407</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SteamOut</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SteamOut</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=390</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=408</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Flow</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Flow</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=407</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=360</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=409</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=410</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=411</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=417</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=409</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>SerialNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SerialNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=410</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>Manufacturer</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Manufacturer</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=411</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>3</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=414</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=414</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=411</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=417</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>3</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=408</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=420</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=420</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=417</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=423</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Drum</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Drum</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=390</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=58</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=424</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=424</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Level</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Level</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=423</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=375</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=425</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=426</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=427</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=433</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=425</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>SerialNumber</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SerialNumber</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=424</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=426</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>2</NamespaceIndex>\n        <Name>Manufacturer</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Manufacturer</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=424</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=12</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=427</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>3</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=424</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=430</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=430</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=427</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=433</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>3</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=47</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=424</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=436</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Double xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">0</Double>\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=436</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=433</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=37</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=78</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"ViewNode\">\n      <NodeId>\n        <Identifier>ns=1;i=439</Identifier>\n      </NodeId>\n      <NodeClass>View_128</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Engineering</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Engineering</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=87</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <ContainsNoLoops>false</ContainsNoLoops>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ViewNode\">\n      <NodeId>\n        <Identifier>ns=1;i=441</Identifier>\n      </NodeId>\n      <NodeClass>View_128</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Operations</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Operations</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=87</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <ContainsNoLoops>false</ContainsNoLoops>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n    <Node i:type=\"ObjectNode\">\n      <NodeId>\n        <Identifier>ns=1;i=442</Identifier>\n      </NodeId>\n      <NodeClass>Object_1</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Plant</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Plant</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=61</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=35</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>i=85</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <EventNotifier>0</EventNotifier>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Model.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/Views</Uri>\n    <Uri>http://opcfoundation.org/UA/Engineering</Uri>\n    <Uri>http://opcfoundation.org/UA/Operations</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/Views\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UAView NodeId=\"ns=1;i=439\" BrowseName=\"1:Engineering\">\n    <DisplayName>Engineering</DisplayName>\n    <References>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=87</Reference>\n    </References>\n  </UAView>\n  <UAView NodeId=\"ns=1;i=441\" BrowseName=\"1:Operations\">\n    <DisplayName>Operations</DisplayName>\n    <References>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=87</Reference>\n    </References>\n  </UAView>\n  <UAObjectType NodeId=\"ns=1;i=345\" BrowseName=\"1:GenericControllerType\">\n    <DisplayName>GenericControllerType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=346</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=347</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=348</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=354</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAVariable NodeId=\"ns=1;i=346\" BrowseName=\"2:SerialNumber\" ParentNodeId=\"ns=1;i=345\" DataType=\"String\">\n    <DisplayName>SerialNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=345</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=347\" BrowseName=\"2:Manufacturer\" ParentNodeId=\"ns=1;i=345\" DataType=\"String\">\n    <DisplayName>Manufacturer</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=345</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=348\" BrowseName=\"3:SetPoint\" ParentNodeId=\"ns=1;i=345\" DataType=\"Double\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=351</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=345</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=351\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=348\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=348</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=354\" BrowseName=\"3:Measurement\" ParentNodeId=\"ns=1;i=345\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=357</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=345</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=357\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=354\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=354</Reference>\n    </References>\n  </UAVariable>\n  <UAObjectType NodeId=\"ns=1;i=360\" BrowseName=\"1:FlowControllerType\">\n    <DisplayName>FlowControllerType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=345</Reference>\n    </References>\n  </UAObjectType>\n  <UAObjectType NodeId=\"ns=1;i=375\" BrowseName=\"1:LevelControllerType\">\n    <DisplayName>LevelControllerType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">ns=1;i=345</Reference>\n    </References>\n  </UAObjectType>\n  <UAObjectType NodeId=\"ns=1;i=390\" BrowseName=\"1:BoilerType\">\n    <DisplayName>BoilerType</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=391</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=407</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=423</Reference>\n      <Reference ReferenceType=\"HasSubtype\" IsForward=\"false\">i=58</Reference>\n    </References>\n  </UAObjectType>\n  <UAObject NodeId=\"ns=1;i=391\" BrowseName=\"1:WaterIn\" ParentNodeId=\"ns=1;i=390\">\n    <DisplayName>WaterIn</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=392</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=58</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=390</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=392\" BrowseName=\"1:Flow\" ParentNodeId=\"ns=1;i=391\">\n    <DisplayName>Flow</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=393</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=394</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=395</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=401</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=360</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=391</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=393\" BrowseName=\"2:SerialNumber\" ParentNodeId=\"ns=1;i=392\" DataType=\"String\">\n    <DisplayName>SerialNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=392</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=394\" BrowseName=\"2:Manufacturer\" ParentNodeId=\"ns=1;i=392\" DataType=\"String\">\n    <DisplayName>Manufacturer</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=392</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=395\" BrowseName=\"3:SetPoint\" ParentNodeId=\"ns=1;i=392\" DataType=\"Double\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=398</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=392</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=398\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=395\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=395</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=401\" BrowseName=\"3:Measurement\" ParentNodeId=\"ns=1;i=392\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=404</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=392</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=404\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=401\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=401</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=407\" BrowseName=\"1:SteamOut\" ParentNodeId=\"ns=1;i=390\">\n    <DisplayName>SteamOut</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=408</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=58</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=390</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=408\" BrowseName=\"1:Flow\" ParentNodeId=\"ns=1;i=407\">\n    <DisplayName>Flow</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=409</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=410</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=411</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=417</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=360</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=407</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=409\" BrowseName=\"2:SerialNumber\" ParentNodeId=\"ns=1;i=408\" DataType=\"String\">\n    <DisplayName>SerialNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=408</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=410\" BrowseName=\"2:Manufacturer\" ParentNodeId=\"ns=1;i=408\" DataType=\"String\">\n    <DisplayName>Manufacturer</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=408</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=411\" BrowseName=\"3:SetPoint\" ParentNodeId=\"ns=1;i=408\" DataType=\"Double\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=414</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=408</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=414\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=411\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=411</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=417\" BrowseName=\"3:Measurement\" ParentNodeId=\"ns=1;i=408\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=420</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=408</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=420\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=417\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=417</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=423\" BrowseName=\"1:Drum\" ParentNodeId=\"ns=1;i=390\">\n    <DisplayName>Drum</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=424</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=58</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=390</Reference>\n    </References>\n  </UAObject>\n  <UAObject NodeId=\"ns=1;i=424\" BrowseName=\"1:Level\" ParentNodeId=\"ns=1;i=423\">\n    <DisplayName>Level</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=425</Reference>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=426</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=427</Reference>\n      <Reference ReferenceType=\"HasComponent\">ns=1;i=433</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">ns=1;i=375</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=423</Reference>\n    </References>\n  </UAObject>\n  <UAVariable NodeId=\"ns=1;i=425\" BrowseName=\"2:SerialNumber\" ParentNodeId=\"ns=1;i=424\" DataType=\"String\">\n    <DisplayName>SerialNumber</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=424</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=426\" BrowseName=\"2:Manufacturer\" ParentNodeId=\"ns=1;i=424\" DataType=\"String\">\n    <DisplayName>Manufacturer</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=424</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=427\" BrowseName=\"3:SetPoint\" ParentNodeId=\"ns=1;i=424\" DataType=\"Double\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=430</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=424</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=430\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=427\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=427</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=433\" BrowseName=\"3:Measurement\" ParentNodeId=\"ns=1;i=424\" DataType=\"Double\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=436</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasComponent\" IsForward=\"false\">ns=1;i=424</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=436\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=433\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasModellingRule\">i=78</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=433</Reference>\n    </References>\n  </UAVariable>\n  <UAObject NodeId=\"ns=1;i=442\" BrowseName=\"1:Plant\">\n    <DisplayName>Plant</DisplayName>\n    <References>\n      <Reference ReferenceType=\"Organizes\" IsForward=\"false\">i=85</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=61</Reference>\n    </References>\n  </UAObject>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Model.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Engineering</uax:NamespaceUri>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Operations</uax:NamespaceUri>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Views</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <Engineering xmlns=\"http://opcfoundation.org/UA/Views\">\n    <uax:NodeClass>View_128</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=3;i=439</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>3</uax:NamespaceIndex>\n      <uax:Name>Engineering</uax:Name>\n    </uax:BrowseName>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=87</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </Engineering>\n  <Operations xmlns=\"http://opcfoundation.org/UA/Views\">\n    <uax:NodeClass>View_128</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=3;i=441</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>3</uax:NamespaceIndex>\n      <uax:Name>Operations</uax:Name>\n    </uax:BrowseName>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=87</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </Operations>\n  <GenericControllerType xmlns=\"http://opcfoundation.org/UA/Views\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=3;i=345</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>3</uax:NamespaceIndex>\n      <uax:Name>GenericControllerType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <SerialNumber xmlns=\"http://opcfoundation.org/UA/Engineering\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=3;i=346</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>SerialNumber</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>346</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </SerialNumber>\n    <Manufacturer xmlns=\"http://opcfoundation.org/UA/Engineering\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=3;i=347</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>1</uax:NamespaceIndex>\n        <uax:Name>Manufacturer</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>347</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=12</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </Manufacturer>\n    <SetPoint xmlns=\"http://opcfoundation.org/UA/Operations\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=3;i=348</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>2</uax:NamespaceIndex>\n        <uax:Name>SetPoint</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>348</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=3;i=351</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>351</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </SetPoint>\n    <Measurement xmlns=\"http://opcfoundation.org/UA/Operations\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=3;i=354</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>2</uax:NamespaceIndex>\n        <uax:Name>Measurement</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=2368</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>354</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=11</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      <EURange xmlns=\"http://opcfoundation.org/UA/\">\n        <uax:NodeClass>Variable_2</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=3;i=357</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>0</uax:NamespaceIndex>\n          <uax:Name>EURange</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=46</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>i=68</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>357</uax:NumericId>\n        <uax:DataType>\n          <uax:Identifier>i=884</uax:Identifier>\n        </uax:DataType>\n        <uax:ValueRank>-1</uax:ValueRank>\n        <uax:AccessLevel>1</uax:AccessLevel>\n        <uax:UserAccessLevel>1</uax:UserAccessLevel>\n      </EURange>\n    </Measurement>\n  </GenericControllerType>\n  <FlowControllerType xmlns=\"http://opcfoundation.org/UA/Views\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=3;i=360</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>3</uax:NamespaceIndex>\n      <uax:Name>FlowControllerType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=3;i=345</uax:Identifier>\n    </uax:SuperTypeId>\n  </FlowControllerType>\n  <LevelControllerType xmlns=\"http://opcfoundation.org/UA/Views\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=3;i=375</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>3</uax:NamespaceIndex>\n      <uax:Name>LevelControllerType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>ns=3;i=345</uax:Identifier>\n    </uax:SuperTypeId>\n  </LevelControllerType>\n  <BoilerType xmlns=\"http://opcfoundation.org/UA/Views\">\n    <uax:NodeClass>ObjectType_8</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=3;i=390</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>3</uax:NamespaceIndex>\n      <uax:Name>BoilerType</uax:Name>\n    </uax:BrowseName>\n    <uax:SuperTypeId>\n      <uax:Identifier>i=58</uax:Identifier>\n    </uax:SuperTypeId>\n    <WaterIn>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=3;i=391</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>3</uax:NamespaceIndex>\n        <uax:Name>WaterIn</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=58</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>391</uax:NumericId>\n      <Flow>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=3;i=392</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>3</uax:NamespaceIndex>\n          <uax:Name>Flow</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=3;i=360</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>392</uax:NumericId>\n        <SerialNumber xmlns=\"http://opcfoundation.org/UA/Engineering\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=393</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SerialNumber</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>393</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SerialNumber>\n        <Manufacturer xmlns=\"http://opcfoundation.org/UA/Engineering\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=394</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Manufacturer</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>394</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Manufacturer>\n        <SetPoint xmlns=\"http://opcfoundation.org/UA/Operations\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=395</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>2</uax:NamespaceIndex>\n            <uax:Name>SetPoint</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>395</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=3;i=398</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>398</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </SetPoint>\n        <Measurement xmlns=\"http://opcfoundation.org/UA/Operations\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=401</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>2</uax:NamespaceIndex>\n            <uax:Name>Measurement</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>401</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=3;i=404</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>404</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Measurement>\n      </Flow>\n    </WaterIn>\n    <SteamOut>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=3;i=407</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>3</uax:NamespaceIndex>\n        <uax:Name>SteamOut</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=58</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>407</uax:NumericId>\n      <Flow>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=3;i=408</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>3</uax:NamespaceIndex>\n          <uax:Name>Flow</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=3;i=360</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>408</uax:NumericId>\n        <SerialNumber xmlns=\"http://opcfoundation.org/UA/Engineering\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=409</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SerialNumber</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>409</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SerialNumber>\n        <Manufacturer xmlns=\"http://opcfoundation.org/UA/Engineering\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=410</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Manufacturer</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>410</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Manufacturer>\n        <SetPoint xmlns=\"http://opcfoundation.org/UA/Operations\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=411</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>2</uax:NamespaceIndex>\n            <uax:Name>SetPoint</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>411</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=3;i=414</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>414</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </SetPoint>\n        <Measurement xmlns=\"http://opcfoundation.org/UA/Operations\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=417</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>2</uax:NamespaceIndex>\n            <uax:Name>Measurement</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>417</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=3;i=420</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>420</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Measurement>\n      </Flow>\n    </SteamOut>\n    <Drum>\n      <uax:NodeClass>Object_1</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=3;i=423</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>3</uax:NamespaceIndex>\n        <uax:Name>Drum</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=47</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=58</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:ModellingRuleId>\n        <uax:Identifier>i=78</uax:Identifier>\n      </uax:ModellingRuleId>\n      <uax:NumericId>423</uax:NumericId>\n      <Level>\n        <uax:NodeClass>Object_1</uax:NodeClass>\n        <uax:NodeId>\n          <uax:Identifier>ns=3;i=424</uax:Identifier>\n        </uax:NodeId>\n        <uax:BrowseName>\n          <uax:NamespaceIndex>3</uax:NamespaceIndex>\n          <uax:Name>Level</uax:Name>\n        </uax:BrowseName>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=47</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:TypeDefinitionId>\n          <uax:Identifier>ns=3;i=375</uax:Identifier>\n        </uax:TypeDefinitionId>\n        <uax:ModellingRuleId>\n          <uax:Identifier>i=78</uax:Identifier>\n        </uax:ModellingRuleId>\n        <uax:NumericId>424</uax:NumericId>\n        <SerialNumber xmlns=\"http://opcfoundation.org/UA/Engineering\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=425</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>SerialNumber</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>425</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </SerialNumber>\n        <Manufacturer xmlns=\"http://opcfoundation.org/UA/Engineering\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=426</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>1</uax:NamespaceIndex>\n            <uax:Name>Manufacturer</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=46</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=68</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>426</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=12</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n        </Manufacturer>\n        <SetPoint xmlns=\"http://opcfoundation.org/UA/Operations\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=427</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>2</uax:NamespaceIndex>\n            <uax:Name>SetPoint</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>427</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=3;i=430</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>430</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </SetPoint>\n        <Measurement xmlns=\"http://opcfoundation.org/UA/Operations\">\n          <uax:NodeClass>Variable_2</uax:NodeClass>\n          <uax:NodeId>\n            <uax:Identifier>ns=3;i=433</uax:Identifier>\n          </uax:NodeId>\n          <uax:BrowseName>\n            <uax:NamespaceIndex>2</uax:NamespaceIndex>\n            <uax:Name>Measurement</uax:Name>\n          </uax:BrowseName>\n          <uax:ReferenceTypeId>\n            <uax:Identifier>i=47</uax:Identifier>\n          </uax:ReferenceTypeId>\n          <uax:TypeDefinitionId>\n            <uax:Identifier>i=2368</uax:Identifier>\n          </uax:TypeDefinitionId>\n          <uax:ModellingRuleId>\n            <uax:Identifier>i=78</uax:Identifier>\n          </uax:ModellingRuleId>\n          <uax:NumericId>433</uax:NumericId>\n          <uax:DataType>\n            <uax:Identifier>i=11</uax:Identifier>\n          </uax:DataType>\n          <uax:ValueRank>-1</uax:ValueRank>\n          <uax:AccessLevel>1</uax:AccessLevel>\n          <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          <EURange xmlns=\"http://opcfoundation.org/UA/\">\n            <uax:NodeClass>Variable_2</uax:NodeClass>\n            <uax:NodeId>\n              <uax:Identifier>ns=3;i=436</uax:Identifier>\n            </uax:NodeId>\n            <uax:BrowseName>\n              <uax:NamespaceIndex>0</uax:NamespaceIndex>\n              <uax:Name>EURange</uax:Name>\n            </uax:BrowseName>\n            <uax:ReferenceTypeId>\n              <uax:Identifier>i=46</uax:Identifier>\n            </uax:ReferenceTypeId>\n            <uax:TypeDefinitionId>\n              <uax:Identifier>i=68</uax:Identifier>\n            </uax:TypeDefinitionId>\n            <uax:ModellingRuleId>\n              <uax:Identifier>i=78</uax:Identifier>\n            </uax:ModellingRuleId>\n            <uax:NumericId>436</uax:NumericId>\n            <uax:DataType>\n              <uax:Identifier>i=884</uax:Identifier>\n            </uax:DataType>\n            <uax:ValueRank>-1</uax:ValueRank>\n            <uax:AccessLevel>1</uax:AccessLevel>\n            <uax:UserAccessLevel>1</uax:UserAccessLevel>\n          </EURange>\n        </Measurement>\n      </Level>\n    </Drum>\n  </BoilerType>\n  <Plant xmlns=\"http://opcfoundation.org/UA/Views\">\n    <uax:NodeClass>Object_1</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=3;i=442</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>3</uax:NamespaceIndex>\n      <uax:Name>Plant</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=61</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>442</uax:NumericId>\n    <uax:References>\n      <uax:Reference>\n        <uax:ReferenceTypeId>\n          <uax:Identifier>i=35</uax:Identifier>\n        </uax:ReferenceTypeId>\n        <uax:IsInverse>true</uax:IsInverse>\n        <uax:TargetId>\n          <uax:Identifier>i=85</uax:Identifier>\n        </uax:TargetId>\n      </uax:Reference>\n    </uax:References>\n  </Plant>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Model.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:s1=\"http://opcfoundation.org/UA/Engineering\"\n  xmlns:s2=\"http://opcfoundation.org/UA/Operations\"\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Views\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Views\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/Engineering\" Location=\"Engineering.BinarySchema.bsd\"/>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/Operations\" Location=\"Operations.BinarySchema.bsd\"/>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Model.Types.xsd",
    "content": "<xs:schema\n  xmlns:s1=\"http://opcfoundation.org/UA/Engineering\"\n  xmlns:s2=\"http://opcfoundation.org/UA/Operations\"\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Views\"\n  targetNamespace=\"http://opcfoundation.org/UA/Views\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n  <xs:import namespace=\"http://opcfoundation.org/UA/Engineering\" />\n  <xs:import namespace=\"http://opcfoundation.org/UA/Operations\" />\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/ModelDesign.csv",
    "content": "GenericControllerType,345,ObjectType\nGenericControllerType_SerialNumber,346,Variable\nGenericControllerType_Manufacturer,347,Variable\nGenericControllerType_SetPoint,348,Variable\nGenericControllerType_SetPoint_Definition,349,Variable\nGenericControllerType_SetPoint_ValuePrecision,350,Variable\nGenericControllerType_SetPoint_EURange,351,Variable\nGenericControllerType_SetPoint_InstrumentRange,352,Variable\nGenericControllerType_SetPoint_EngineeringUnits,353,Variable\nGenericControllerType_Measurement,354,Variable\nGenericControllerType_Measurement_Definition,355,Variable\nGenericControllerType_Measurement_ValuePrecision,356,Variable\nGenericControllerType_Measurement_EURange,357,Variable\nGenericControllerType_Measurement_InstrumentRange,358,Variable\nGenericControllerType_Measurement_EngineeringUnits,359,Variable\nFlowControllerType,360,ObjectType\nFlowControllerType_SerialNumber,361,Variable\nFlowControllerType_Manufacturer,362,Variable\nFlowControllerType_SetPoint,363,Variable\nFlowControllerType_SetPoint_Definition,364,Variable\nFlowControllerType_SetPoint_ValuePrecision,365,Variable\nFlowControllerType_SetPoint_EURange,366,Variable\nFlowControllerType_SetPoint_InstrumentRange,367,Variable\nFlowControllerType_SetPoint_EngineeringUnits,368,Variable\nFlowControllerType_Measurement,369,Variable\nFlowControllerType_Measurement_Definition,370,Variable\nFlowControllerType_Measurement_ValuePrecision,371,Variable\nFlowControllerType_Measurement_EURange,372,Variable\nFlowControllerType_Measurement_InstrumentRange,373,Variable\nFlowControllerType_Measurement_EngineeringUnits,374,Variable\nLevelControllerType,375,ObjectType\nLevelControllerType_SerialNumber,376,Variable\nLevelControllerType_Manufacturer,377,Variable\nLevelControllerType_SetPoint,378,Variable\nLevelControllerType_SetPoint_Definition,379,Variable\nLevelControllerType_SetPoint_ValuePrecision,380,Variable\nLevelControllerType_SetPoint_EURange,381,Variable\nLevelControllerType_SetPoint_InstrumentRange,382,Variable\nLevelControllerType_SetPoint_EngineeringUnits,383,Variable\nLevelControllerType_Measurement,384,Variable\nLevelControllerType_Measurement_Definition,385,Variable\nLevelControllerType_Measurement_ValuePrecision,386,Variable\nLevelControllerType_Measurement_EURange,387,Variable\nLevelControllerType_Measurement_InstrumentRange,388,Variable\nLevelControllerType_Measurement_EngineeringUnits,389,Variable\nBoilerType,390,ObjectType\nBoilerType_WaterIn,391,Object\nBoilerType_WaterIn_Flow,392,Object\nBoilerType_WaterIn_Flow_SerialNumber,393,Variable\nBoilerType_WaterIn_Flow_Manufacturer,394,Variable\nBoilerType_WaterIn_Flow_SetPoint,395,Variable\nBoilerType_WaterIn_Flow_SetPoint_Definition,396,Variable\nBoilerType_WaterIn_Flow_SetPoint_ValuePrecision,397,Variable\nBoilerType_WaterIn_Flow_SetPoint_EURange,398,Variable\nBoilerType_WaterIn_Flow_SetPoint_InstrumentRange,399,Variable\nBoilerType_WaterIn_Flow_SetPoint_EngineeringUnits,400,Variable\nBoilerType_WaterIn_Flow_Measurement,401,Variable\nBoilerType_WaterIn_Flow_Measurement_Definition,402,Variable\nBoilerType_WaterIn_Flow_Measurement_ValuePrecision,403,Variable\nBoilerType_WaterIn_Flow_Measurement_EURange,404,Variable\nBoilerType_WaterIn_Flow_Measurement_InstrumentRange,405,Variable\nBoilerType_WaterIn_Flow_Measurement_EngineeringUnits,406,Variable\nBoilerType_SteamOut,407,Object\nBoilerType_SteamOut_Flow,408,Object\nBoilerType_SteamOut_Flow_SerialNumber,409,Variable\nBoilerType_SteamOut_Flow_Manufacturer,410,Variable\nBoilerType_SteamOut_Flow_SetPoint,411,Variable\nBoilerType_SteamOut_Flow_SetPoint_Definition,412,Variable\nBoilerType_SteamOut_Flow_SetPoint_ValuePrecision,413,Variable\nBoilerType_SteamOut_Flow_SetPoint_EURange,414,Variable\nBoilerType_SteamOut_Flow_SetPoint_InstrumentRange,415,Variable\nBoilerType_SteamOut_Flow_SetPoint_EngineeringUnits,416,Variable\nBoilerType_SteamOut_Flow_Measurement,417,Variable\nBoilerType_SteamOut_Flow_Measurement_Definition,418,Variable\nBoilerType_SteamOut_Flow_Measurement_ValuePrecision,419,Variable\nBoilerType_SteamOut_Flow_Measurement_EURange,420,Variable\nBoilerType_SteamOut_Flow_Measurement_InstrumentRange,421,Variable\nBoilerType_SteamOut_Flow_Measurement_EngineeringUnits,422,Variable\nBoilerType_Drum,423,Object\nBoilerType_Drum_Level,424,Object\nBoilerType_Drum_Level_SerialNumber,425,Variable\nBoilerType_Drum_Level_Manufacturer,426,Variable\nBoilerType_Drum_Level_SetPoint,427,Variable\nBoilerType_Drum_Level_SetPoint_Definition,428,Variable\nBoilerType_Drum_Level_SetPoint_ValuePrecision,429,Variable\nBoilerType_Drum_Level_SetPoint_EURange,430,Variable\nBoilerType_Drum_Level_SetPoint_InstrumentRange,431,Variable\nBoilerType_Drum_Level_SetPoint_EngineeringUnits,432,Variable\nBoilerType_Drum_Level_Measurement,433,Variable\nBoilerType_Drum_Level_Measurement_Definition,434,Variable\nBoilerType_Drum_Level_Measurement_ValuePrecision,435,Variable\nBoilerType_Drum_Level_Measurement_EURange,436,Variable\nBoilerType_Drum_Level_Measurement_InstrumentRange,437,Variable\nBoilerType_Drum_Level_Measurement_EngineeringUnits,438,Variable\nEngineering,439,View\nOperations,441,View\nPlant,442,Object\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/ModelDesign.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns:qve=\"http://opcfoundation.org/UA/Engineering\"\n\txmlns:qvo=\"http://opcfoundation.org/UA/Operations\"\n\txmlns=\"http://opcfoundation.org/UA/Views\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Views\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"Engineering\" Prefix=\"Engineering\" InternalPrefix=\"Engineering\">http://opcfoundation.org/UA/Engineering</opc:Namespace>\n    <opc:Namespace Name=\"Operations\" Prefix=\"Operations\" InternalPrefix=\"Operations\">http://opcfoundation.org/UA/Operations</opc:Namespace>\n    <opc:Namespace Name=\"Views\" Prefix=\"Model\" InternalPrefix=\"Model\">http://opcfoundation.org/UA/Views</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:View SymbolicName=\"Engineering\">\n    <opc:References>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ViewsFolder</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:View>\n\n  <opc:View SymbolicName=\"Operations\">\n    <opc:References>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ViewsFolder</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:View>\n\n  <opc:ObjectType SymbolicName=\"GenericControllerType\" BaseType=\"ua:BaseObjectType\">\n    <opc:Children>\n      <opc:Property SymbolicName=\"qve:SerialNumber\" DataType=\"ua:String\"></opc:Property>\n      <opc:Property SymbolicName=\"qve:Manufacturer\" DataType=\"ua:String\"></opc:Property>\n      <opc:Variable SymbolicName=\"qvo:SetPoint\" DataType=\"ua:Double\" TypeDefinition=\"ua:AnalogItemType\"></opc:Variable>\n      <opc:Variable SymbolicName=\"qvo:Measurement\" DataType=\"ua:Double\" TypeDefinition=\"ua:AnalogItemType\"></opc:Variable>\n    </opc:Children>\n  </opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"FlowControllerType\" BaseType=\"GenericControllerType\"></opc:ObjectType>\n  <opc:ObjectType SymbolicName=\"LevelControllerType\" BaseType=\"GenericControllerType\"></opc:ObjectType>\n\n  <opc:ObjectType SymbolicName=\"BoilerType\" BaseType=\"ua:BaseObjectType\">\n    <opc:Children>\n      <opc:Object SymbolicName=\"WaterIn\" TypeDefinition=\"ua:BaseObjectType\">\n        <opc:Children>\n          <opc:Object SymbolicName=\"Flow\" TypeDefinition=\"FlowControllerType\"></opc:Object>\n        </opc:Children>\n      </opc:Object>\n      <opc:Object SymbolicName=\"SteamOut\" TypeDefinition=\"ua:BaseObjectType\">\n        <opc:Children>\n          <opc:Object SymbolicName=\"Flow\" TypeDefinition=\"FlowControllerType\"></opc:Object>\n        </opc:Children>\n      </opc:Object>\n      <opc:Object SymbolicName=\"Drum\" TypeDefinition=\"ua:BaseObjectType\">\n        <opc:Children>\n          <opc:Object SymbolicName=\"Level\" TypeDefinition=\"LevelControllerType\"></opc:Object>\n        </opc:Children>\n      </opc:Object>\n    </opc:Children>\n  </opc:ObjectType>\n\n\n  <opc:Object SymbolicName=\"Plant\" TypeDefinition=\"ua:FolderType\">\n    <opc:References>\n      <opc:Reference IsInverse=\"true\">\n        <opc:ReferenceType>ua:Organizes</opc:ReferenceType>\n        <opc:TargetId>ua:ObjectsFolder</opc:TargetId>\n      </opc:Reference>\n    </opc:References>\n  </opc:Object>\n\n</opc:ModelDesign>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Operations.Constants.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nusing Opc.Ua;\n\nnamespace Operations\n{\n    #region Variable Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Variables\n    {\n        /// <summary>\n        /// The identifier for the SetPoint Variable.\n        /// </summary>\n        public const uint SetPoint = 443;\n\n        /// <summary>\n        /// The identifier for the SetPoint_EURange Variable.\n        /// </summary>\n        public const uint SetPoint_EURange = 446;\n\n        /// <summary>\n        /// The identifier for the Measurement Variable.\n        /// </summary>\n        public const uint Measurement = 449;\n\n        /// <summary>\n        /// The identifier for the Measurement_EURange Variable.\n        /// </summary>\n        public const uint Measurement_EURange = 452;\n    }\n    #endregion\n\n    #region Variable Node Identifiers\n    /// <summary>\n    /// A class that declares constants for all Variables in the Model Design.\n    /// </summary>\n    /// <exclude />\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class VariableIds\n    {\n        /// <summary>\n        /// The identifier for the SetPoint Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SetPoint = new ExpandedNodeId(Operations.Variables.SetPoint, Operations.Namespaces.Operations);\n\n        /// <summary>\n        /// The identifier for the SetPoint_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId SetPoint_EURange = new ExpandedNodeId(Operations.Variables.SetPoint_EURange, Operations.Namespaces.Operations);\n\n        /// <summary>\n        /// The identifier for the Measurement Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Measurement = new ExpandedNodeId(Operations.Variables.Measurement, Operations.Namespaces.Operations);\n\n        /// <summary>\n        /// The identifier for the Measurement_EURange Variable.\n        /// </summary>\n        public static readonly ExpandedNodeId Measurement_EURange = new ExpandedNodeId(Operations.Variables.Measurement_EURange, Operations.Namespaces.Operations);\n    }\n    #endregion\n\n    #region BrowseName Declarations\n    /// <summary>\n    /// Declares all of the BrowseNames used in the Model Design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class BrowseNames\n    {\n        /// <summary>\n        /// The BrowseName for the Measurement component.\n        /// </summary>\n        public const string Measurement = \"Measurement\";\n\n        /// <summary>\n        /// The BrowseName for the SetPoint component.\n        /// </summary>\n        public const string SetPoint = \"SetPoint\";\n    }\n    #endregion\n\n    #region Namespace Declarations\n    /// <summary>\n    /// Defines constants for all namespaces referenced by the model design.\n    /// </summary>\n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"Opc.Ua.ModelCompiler\", \"1.0.0.0\")]\n    public static partial class Namespaces\n    {\n        /// <summary>\n        /// The URI for the OpcUa namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUa = \"http://opcfoundation.org/UA/\";\n\n        /// <summary>\n        /// The URI for the OpcUaXsd namespace (.NET code namespace is 'Opc.Ua').\n        /// </summary>\n        public const string OpcUaXsd = \"http://opcfoundation.org/UA/2008/02/Types.xsd\";\n\n        /// <summary>\n        /// The URI for the Operations namespace (.NET code namespace is 'Operations').\n        /// </summary>\n        public const string Operations = \"http://opcfoundation.org/UA/Operations\";\n    }\n    #endregion\n}"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Operations.NodeIds.csv",
    "content": "Measurement,449,Variable\nSetPoint,443,Variable\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Operations.NodeSet.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<NodeSet xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <NamespaceUris>\n    <String>http://opcfoundation.org/UA/</String>\n    <String>http://opcfoundation.org/UA/Operations</String>\n  </NamespaceUris>\n  <ServerUris />\n  <Nodes>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=443</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>SetPoint</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>SetPoint</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=446</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-2</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=446</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=443</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=449</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>1</NamespaceIndex>\n        <Name>Measurement</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>Measurement</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=2368</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=452</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=11</Identifier>\n      </DataType>\n      <ValueRank>-2</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n    <Node i:type=\"VariableNode\">\n      <NodeId>\n        <Identifier>ns=1;i=452</Identifier>\n      </NodeId>\n      <NodeClass>Variable_2</NodeClass>\n      <BrowseName>\n        <NamespaceIndex>0</NamespaceIndex>\n        <Name>EURange</Name>\n      </BrowseName>\n      <DisplayName>\n        <Locale></Locale>\n        <Text>EURange</Text>\n      </DisplayName>\n      <Description i:nil=\"true\" />\n      <WriteMask>0</WriteMask>\n      <UserWriteMask>0</UserWriteMask>\n      <RolePermissions />\n      <UserRolePermissions />\n      <AccessRestrictions>0</AccessRestrictions>\n      <References>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=46</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>true</IsInverse>\n          <TargetId>\n            <Identifier>ns=1;i=449</Identifier>\n          </TargetId>\n        </ReferenceNode>\n        <ReferenceNode>\n          <ReferenceTypeId>\n            <Identifier>i=40</Identifier>\n          </ReferenceTypeId>\n          <IsInverse>false</IsInverse>\n          <TargetId>\n            <Identifier>i=68</Identifier>\n          </TargetId>\n        </ReferenceNode>\n      </References>\n      <Value>\n        <Value>\n          <Null xmlns=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n        </Value>\n      </Value>\n      <DataType>\n        <Identifier>i=884</Identifier>\n      </DataType>\n      <ValueRank>-1</ValueRank>\n      <ArrayDimensions />\n      <AccessLevel>1</AccessLevel>\n      <UserAccessLevel>1</UserAccessLevel>\n      <MinimumSamplingInterval>0</MinimumSamplingInterval>\n      <Historizing>false</Historizing>\n      <AccessLevelEx>0</AccessLevelEx>\n    </Node>\n  </Nodes>\n</NodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Operations.NodeSet2.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UANodeSet xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://opcfoundation.org/UA/2011/03/UANodeSet.xsd\">\n  <NamespaceUris>\n    <Uri>http://opcfoundation.org/UA/Operations</Uri>\n  </NamespaceUris>\n  <Models>\n    <Model ModelUri=\"http://opcfoundation.org/UA/Operations\">\n      <RequiredModel ModelUri=\"http://opcfoundation.org/UA/\" Version=\"1.04.6\" PublicationDate=\"2020-04-10T00:00:00Z\" />\n    </Model>\n  </Models>\n  <Aliases>\n    <Alias Alias=\"Boolean\">i=1</Alias>\n    <Alias Alias=\"SByte\">i=2</Alias>\n    <Alias Alias=\"Byte\">i=3</Alias>\n    <Alias Alias=\"Int16\">i=4</Alias>\n    <Alias Alias=\"UInt16\">i=5</Alias>\n    <Alias Alias=\"Int32\">i=6</Alias>\n    <Alias Alias=\"UInt32\">i=7</Alias>\n    <Alias Alias=\"Int64\">i=8</Alias>\n    <Alias Alias=\"UInt64\">i=9</Alias>\n    <Alias Alias=\"Float\">i=10</Alias>\n    <Alias Alias=\"Double\">i=11</Alias>\n    <Alias Alias=\"DateTime\">i=13</Alias>\n    <Alias Alias=\"String\">i=12</Alias>\n    <Alias Alias=\"ByteString\">i=15</Alias>\n    <Alias Alias=\"Guid\">i=14</Alias>\n    <Alias Alias=\"XmlElement\">i=16</Alias>\n    <Alias Alias=\"NodeId\">i=17</Alias>\n    <Alias Alias=\"ExpandedNodeId\">i=18</Alias>\n    <Alias Alias=\"QualifiedName\">i=20</Alias>\n    <Alias Alias=\"LocalizedText\">i=21</Alias>\n    <Alias Alias=\"StatusCode\">i=19</Alias>\n    <Alias Alias=\"Structure\">i=22</Alias>\n    <Alias Alias=\"Number\">i=26</Alias>\n    <Alias Alias=\"Integer\">i=27</Alias>\n    <Alias Alias=\"UInteger\">i=28</Alias>\n    <Alias Alias=\"HasComponent\">i=47</Alias>\n    <Alias Alias=\"HasProperty\">i=46</Alias>\n    <Alias Alias=\"Organizes\">i=35</Alias>\n    <Alias Alias=\"HasEventSource\">i=36</Alias>\n    <Alias Alias=\"HasNotifier\">i=48</Alias>\n    <Alias Alias=\"HasSubtype\">i=45</Alias>\n    <Alias Alias=\"HasTypeDefinition\">i=40</Alias>\n    <Alias Alias=\"HasModellingRule\">i=37</Alias>\n    <Alias Alias=\"HasEncoding\">i=38</Alias>\n    <Alias Alias=\"HasDescription\">i=39</Alias>\n  </Aliases>\n  <UAVariable NodeId=\"ns=1;i=443\" BrowseName=\"1:SetPoint\" DataType=\"Double\" ValueRank=\"-2\">\n    <DisplayName>SetPoint</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=446</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=446\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=443\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=443</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=449\" BrowseName=\"1:Measurement\" DataType=\"Double\" ValueRank=\"-2\">\n    <DisplayName>Measurement</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasProperty\">ns=1;i=452</Reference>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=2368</Reference>\n    </References>\n  </UAVariable>\n  <UAVariable NodeId=\"ns=1;i=452\" BrowseName=\"EURange\" ParentNodeId=\"ns=1;i=449\" DataType=\"i=884\">\n    <DisplayName>EURange</DisplayName>\n    <References>\n      <Reference ReferenceType=\"HasTypeDefinition\">i=68</Reference>\n      <Reference ReferenceType=\"HasProperty\" IsForward=\"false\">ns=1;i=449</Reference>\n    </References>\n  </UAVariable>\n</UANodeSet>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Operations.PredefinedNodes.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<uax:ListOfNodeState xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">\n  <uax:NamespaceUris>\n    <uax:NamespaceUri>http://opcfoundation.org/UA/Operations</uax:NamespaceUri>\n  </uax:NamespaceUris>\n  <SetPoint xmlns=\"http://opcfoundation.org/UA/Operations\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=443</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>SetPoint</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=2368</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>443</uax:NumericId>\n    <uax:DataType>\n      <uax:Identifier>i=11</uax:Identifier>\n    </uax:DataType>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <EURange xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=446</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>EURange</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>446</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=884</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </EURange>\n  </SetPoint>\n  <Measurement xmlns=\"http://opcfoundation.org/UA/Operations\">\n    <uax:NodeClass>Variable_2</uax:NodeClass>\n    <uax:NodeId>\n      <uax:Identifier>ns=1;i=449</uax:Identifier>\n    </uax:NodeId>\n    <uax:BrowseName>\n      <uax:NamespaceIndex>1</uax:NamespaceIndex>\n      <uax:Name>Measurement</uax:Name>\n    </uax:BrowseName>\n    <uax:ReferenceTypeId>\n      <uax:Identifier>i=47</uax:Identifier>\n    </uax:ReferenceTypeId>\n    <uax:TypeDefinitionId>\n      <uax:Identifier>i=2368</uax:Identifier>\n    </uax:TypeDefinitionId>\n    <uax:NumericId>449</uax:NumericId>\n    <uax:DataType>\n      <uax:Identifier>i=11</uax:Identifier>\n    </uax:DataType>\n    <uax:AccessLevel>1</uax:AccessLevel>\n    <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    <EURange xmlns=\"http://opcfoundation.org/UA/\">\n      <uax:NodeClass>Variable_2</uax:NodeClass>\n      <uax:NodeId>\n        <uax:Identifier>ns=1;i=452</uax:Identifier>\n      </uax:NodeId>\n      <uax:BrowseName>\n        <uax:NamespaceIndex>0</uax:NamespaceIndex>\n        <uax:Name>EURange</uax:Name>\n      </uax:BrowseName>\n      <uax:ReferenceTypeId>\n        <uax:Identifier>i=46</uax:Identifier>\n      </uax:ReferenceTypeId>\n      <uax:TypeDefinitionId>\n        <uax:Identifier>i=68</uax:Identifier>\n      </uax:TypeDefinitionId>\n      <uax:NumericId>452</uax:NumericId>\n      <uax:DataType>\n        <uax:Identifier>i=884</uax:Identifier>\n      </uax:DataType>\n      <uax:ValueRank>-1</uax:ValueRank>\n      <uax:AccessLevel>1</uax:AccessLevel>\n      <uax:UserAccessLevel>1</uax:UserAccessLevel>\n    </EURange>\n  </Measurement>\n</uax:ListOfNodeState>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Operations.Types.bsd",
    "content": "<opc:TypeDictionary\n  xmlns:opc=\"http://opcfoundation.org/BinarySchema/\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Operations\"\n  DefaultByteOrder=\"LittleEndian\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Operations\"\n>\n  <opc:Import Namespace=\"http://opcfoundation.org/UA/\" Location=\"Opc.Ua.BinarySchema.bsd\"/>\n\n</opc:TypeDictionary>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/Operations.Types.xsd",
    "content": "<xs:schema\n  xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n  xmlns:ua=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n  xmlns:tns=\"http://opcfoundation.org/UA/Operations\"\n  targetNamespace=\"http://opcfoundation.org/UA/Operations\"\n  elementFormDefault=\"qualified\"\n>\n  <xs:import namespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\" />\n\n</xs:schema>"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/OperationsDesign.csv",
    "content": "SetPoint,443,Variable\nSetPoint_Definition,444,Variable\nSetPoint_ValuePrecision,445,Variable\nSetPoint_EURange,446,Variable\nSetPoint_InstrumentRange,447,Variable\nSetPoint_EngineeringUnits,448,Variable\nMeasurement,449,Variable\nMeasurement_Definition,450,Variable\nMeasurement_ValuePrecision,451,Variable\nMeasurement_EURange,452,Variable\nMeasurement_InstrumentRange,453,Variable\nMeasurement_EngineeringUnits,454,Variable\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Generated/Views/Design/OperationsDesign.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<opc:ModelDesign\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n\txmlns:opc=\"http://opcfoundation.org/UA/ModelDesign.xsd\"\n  xmlns:ua=\"http://opcfoundation.org/UA/\"\n  xmlns:uax=\"http://opcfoundation.org/UA/2008/02/Types.xsd\"\n\txmlns=\"http://opcfoundation.org/UA/Operations\"\n  TargetNamespace=\"http://opcfoundation.org/UA/Operations\"\n>\n  <opc:Namespaces>\n    <opc:Namespace Name=\"OpcUa\" Prefix=\"Opc.Ua\" XmlNamespace=\"http://opcfoundation.org/UA/2008/02/Types.xsd\">http://opcfoundation.org/UA/</opc:Namespace>\n    <opc:Namespace Name=\"Operations\" Prefix=\"Operations\" InternalPrefix=\"Operations\">http://opcfoundation.org/UA/Operations</opc:Namespace>\n  </opc:Namespaces>\n\n  <opc:Variable SymbolicName=\"SetPoint\" DataType=\"ua:Double\" TypeDefinition=\"ua:AnalogItemType\"></opc:Variable>\n  <opc:Variable SymbolicName=\"Measurement\" DataType=\"ua:Double\" TypeDefinition=\"ua:AnalogItemType\"></opc:Variable>\n\n</opc:ModelDesign>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/GlobalSuppressions.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\n// This file is used by Code Analysis to maintain SuppressMessage\n// attributes that are applied to this project.\n// Project-level suppressions either have no target or are given\n// a specific target and scoped to a namespace, type, member, etc.\n\nusing System.Diagnostics.CodeAnalysis;\n\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.GenericControllerState.Measurement\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.CustomController\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.Drum\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.FlowController\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.InputPipe\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.LevelController\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.OutputPipe\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.Simulation\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Halt\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Reset\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Resume\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Start\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Suspend\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.UpdateRate\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.GenericControllerState.ControlOut\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.GenericControllerState.SetPoint\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.IntegerValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.NumberValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.UIntegerValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.IntegerValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.NumberValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.UIntegerValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.BooleanValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.ByteStringValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.DateTimeValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.EnumerationValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.ExpandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.GuidValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.IntegerValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.LocalizedTextValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.NodeIdValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.NumberValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.QualifiedNameValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.StatusCodeValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.StringValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.StructureValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.UIntegerValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.VariantValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.XmlElementValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ArrayMethod1\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ArrayMethod2\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ArrayMethod3\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ScalarMethod1\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ScalarMethod2\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ScalarMethod3\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.UserArrayMethod1\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.UserArrayMethod2\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.UserScalarMethod1\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.UserScalarMethod2\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.BooleanValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.ByteStringValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.DateTimeValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.EnumerationValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.ExpandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.GuidValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.IntegerValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.LocalizedTextValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.NodeIdValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.NumberValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.QualifiedNameValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.StatusCodeValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.StringValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.StructureValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.UIntegerValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.VariantValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.XmlElementValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.TestDataObjectState.CycleComplete\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.TestDataObjectState.GenerateValues\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.TestDataObjectState.SimulationActive\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.TestSystemConditionState.MonitoredNodeCount\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.BooleanValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.ByteStringValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.DateTimeValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.ExpandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.GuidValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.LocalizedTextValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.NodeIdValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.QualifiedNameValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.StatusCodeValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.StringValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.VariantValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.XmlElementValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.BooleanValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.ByteStringValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.DateTimeValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.ExpandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.GuidValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.LocalizedTextValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.NodeIdValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.QualifiedNameValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.StatusCodeValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.StringValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.VariantValue\")]\n[assembly: SuppressMessage(\"Potential Code Quality Issues\", \"RECS0016:Bitwise operation on enum which has no [Flags] attribute\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.XmlElementValue\")]\n\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.CustomController\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.Drum\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.FlowController\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.InputPipe\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.LevelController\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.OutputPipe\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerState.Simulation\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Halt\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Reset\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Resume\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Start\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.Suspend\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.BoilerStateMachineState.UpdateRate\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.GenericControllerState.ControlOut\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.GenericControllerState.Measurement\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0027:Use expression body for accessors\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~P:Boiler.GenericControllerState.SetPoint\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:Vehicles.Types.TruckType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:Vehicles.Types.VehicleType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:Vehicles.Types.CarType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:SimpleEvents.CycleStepDataType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:TestData.ArrayValueDataType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:TestData.ScalarValueDataType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:TestData.UserArrayValueDataType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:TestData.UserScalarValueDataType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Redundancies in Symbol Declarations\", \"RECS0154:Parameter is never used\", Justification = \"Code generated by external tool\", Scope = \"member\", Target = \"~M:Vehicles.Instances.BicycleType.Initialize(System.Runtime.Serialization.StreamingContext)\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1720:Identifier contains type name\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:DataAccess.UnderlyingSystemDataType.String\")]\n[assembly: SuppressMessage(\"Usage\", \"CA2213:Disposable fields should be disposed\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:HistoricalEvents.HistoricalEventsNodeManager._simulationTimer\")]\n[assembly: SuppressMessage(\"Usage\", \"CA2213:Disposable fields should be disposed\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:SimpleEvents.SimpleEventsNodeManager._simulationTimer\")]\n[assembly: SuppressMessage(\"Usage\", \"CA2213:Disposable fields should be disposed\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataNodeManager._systemStatusCondition\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.AlarmConditionServerNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.AlarmConditionServerNodeManager.OnRaiseSystemEvents(System.Object)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.AlarmConditionServerNodeManager.OnRaiseSystemEvents(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.AreaState.#ctor(Opc.Ua.ISystemContext,Alarms.AreaState,Opc.Ua.NodeId,Alarms.AreaConfiguration)\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.ModelUtils.ConstructIdForComponent(Opc.Ua.NodeState,System.UInt16)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.SourceState.ConditionRefresh(Opc.Ua.ISystemContext,System.Collections.Generic.List{Opc.Ua.IFilterTarget},System.Boolean)\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.SourceState.GetRecordNumber(Opc.Ua.AlarmConditionState)~System.UInt32\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.SourceState.GetUserName(Opc.Ua.ISystemContext)~System.String\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.UnderlyingSystem.CreateSource(System.String,Alarms.AlarmChangedEventHandler)~Alarms.UnderlyingSystemSource\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.UnderlyingSystem.CreateSource(System.String,Alarms.AlarmChangedEventHandler)~Alarms.UnderlyingSystemSource\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.UnderlyingSystem.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.UnderlyingSystemSource.DoSimulation(System.Int64,System.Int32)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Alarms.UnderlyingSystemSource.ReportAlarmChange(Alarms.UnderlyingSystemAlarm)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerNodeManager.#ctor(Opc.Ua.Server.IServerInternal,Opc.Ua.ApplicationConfiguration)\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerNodeManager.UpdateDisplayName(Opc.Ua.BaseInstanceState,System.String)\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerNodeManager.UpdateDisplayName(Opc.Ua.BaseInstanceState,System.String)\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerState.Adjust(System.Double,System.Double,System.Double,Opc.Ua.Range)~System.Double\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerState.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerState.GetPercentage(Opc.Ua.AnalogItemState{System.Double})~System.Double\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerState.GetValue(System.Double,Opc.Ua.Range)~System.Double\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerStateMachineState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerStateMachineState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.GenericControllerState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.GenericControllerState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.GenericControllerState.UpdateMeasurement(Opc.Ua.AnalogItemState{System.Double})~System.Double\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.BlockState.#ctor(DataAccess.DataAccessNodeManager,Opc.Ua.NodeId,DataAccess.UnderlyingSystemBlock)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.BlockState.#ctor(DataAccess.DataAccessNodeManager,Opc.Ua.NodeId,DataAccess.UnderlyingSystemBlock)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.BlockState.OnWriteTagValue(Opc.Ua.ISystemContext,Opc.Ua.NodeState,System.Object@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.BlockState.PopulateBrowser(Opc.Ua.ISystemContext,Opc.Ua.NodeBrowser)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.BlockState.StartMonitoring(Opc.Ua.Server.ServerSystemContext)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.BlockState.StopMonitoring(Opc.Ua.Server.ServerSystemContext)~System.Boolean\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.BlockState.UpdateVariable(Opc.Ua.ISystemContext,DataAccess.UnderlyingSystemTag,Opc.Ua.BaseVariableState)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.DataAccessNodeManager.#ctor(Opc.Ua.Server.IServerInternal,Opc.Ua.ApplicationConfiguration)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.DataAccessNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.DataAccessNodeManager.GetManagerHandle(Opc.Ua.Server.ServerSystemContext,Opc.Ua.NodeId,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})~Opc.Ua.Server.NodeHandle\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.DataAccessNodeManager.ValidateNode(Opc.Ua.Server.ServerSystemContext,Opc.Ua.Server.NodeHandle,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})~Opc.Ua.NodeState\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.DataAccessServerConfiguration.Initialize\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.ModelUtils.ConstructIdForComponent(Opc.Ua.NodeState,System.UInt16)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.SegmentState.#ctor(Opc.Ua.ISystemContext,Opc.Ua.NodeId,DataAccess.UnderlyingSystemSegment)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.SegmentState.PopulateBrowser(Opc.Ua.ISystemContext,Opc.Ua.NodeBrowser)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.UnderlyingSystem.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.UnderlyingSystem.FindBlocks(System.String)~System.Collections.Generic.IList{System.String}\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.UnderlyingSystem.FindSegments(System.String)~System.Collections.Generic.IList{DataAccess.UnderlyingSystemSegment}\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.UnderlyingSystemBlock.DoSimulation(System.Int64,System.Int32,Opc.Ua.Test.TestDataGenerator)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.UnderlyingSystemBlock.DoSimulation(System.Int64,System.Int32,Opc.Ua.Test.TestDataGenerator)\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.UnderlyingSystemBlock.UpdateTagMetadata(DataAccess.UnderlyingSystemTag,Opc.Ua.Test.TestDataGenerator)~System.Boolean\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.UnderlyingSystemBlock.UpdateTagValue(DataAccess.UnderlyingSystemTag,Opc.Ua.Test.TestDataGenerator)~System.Boolean\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:DataAccess.UnderlyingSystemBlock.WriteTagValue(System.String,System.Object)~System.UInt32\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItem.#ctor(System.String,System.Reflection.Assembly,System.String)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.DeleteHistory(Opc.Ua.SystemContext,System.DateTime)~System.UInt32\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.DeleteHistory(Opc.Ua.SystemContext,System.DateTime)~System.UInt32\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.DeleteHistory(Opc.Ua.SystemContext,System.DateTime,System.DateTime,System.Boolean)~System.UInt32\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.DeleteHistory(Opc.Ua.SystemContext,System.DateTime,System.DateTime,System.Boolean)~System.UInt32\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.FindValueAfter(System.Data.DataView,System.Int32,System.Boolean,System.Boolean@)~System.Int32\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.FindValueAfter(System.Data.DataView,System.Int32,System.Boolean,System.Boolean@)~System.Int32\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.FindValueAtOrBefore(System.Data.DataView,System.DateTime,System.Boolean,System.Boolean@)~System.Int32\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.FindValueAtOrBefore(System.Data.DataView,System.DateTime,System.Boolean,System.Boolean@)~System.Int32\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.GetModificationInfo(Opc.Ua.SystemContext,Opc.Ua.HistoryUpdateType)~Opc.Ua.ModificationInfo\")]\n[assembly: SuppressMessage(\"Usage\", \"CA1801:Review unused parameters\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.ReadHistory(System.DateTime,System.DateTime,System.Boolean,Opc.Ua.QualifiedName)~System.Data.DataView\")]\n[assembly: SuppressMessage(\"Usage\", \"CA1801:Review unused parameters\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.UpdateAnnotations(Opc.Ua.SystemContext,Opc.Ua.Annotation,Opc.Ua.DataValue,Opc.Ua.PerformUpdateType)~System.UInt32\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.UpdateAnnotations(Opc.Ua.SystemContext,Opc.Ua.Annotation,Opc.Ua.DataValue,Opc.Ua.PerformUpdateType)~System.UInt32\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.UpdateAnnotations(Opc.Ua.SystemContext,Opc.Ua.Annotation,Opc.Ua.DataValue,Opc.Ua.PerformUpdateType)~System.UInt32\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.UpdateHistory(Opc.Ua.SystemContext,Opc.Ua.DataValue,Opc.Ua.PerformUpdateType)~System.UInt32\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.ArchiveItemState.UpdateHistory(Opc.Ua.SystemContext,Opc.Ua.DataValue,Opc.Ua.PerformUpdateType)~System.UInt32\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.CreateData(HistoricalAccess.ArchiveItem)\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.CreateDataSet~System.Data.DataSet\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.ExtractField(System.Int32,System.String@,Opc.Ua.BuiltInType@)~System.Boolean\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.ExtractField(System.Int32,System.String@,Opc.Ua.StatusCode@)~System.Boolean\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.ExtractField(System.Int32,System.String@,System.Int32@)~System.Boolean\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1305:Specify IFormatProvider\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.ExtractField(System.Int32,System.String@,System.Int32@)~System.Boolean\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.ExtractField(System.String@)~System.String\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.ExtractField(System.String@)~System.String\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.LoadConfiguration(Opc.Ua.ISystemContext,HistoricalAccess.ArchiveItem)~System.Boolean\")]\n[assembly: SuppressMessage(\"Usage\", \"CA1801:Review unused parameters\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.LoadConfiguration(Opc.Ua.ISystemContext,HistoricalAccess.ArchiveItem)~System.Boolean\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.DataFileReader.LoadHistoryData(Opc.Ua.ISystemContext,HistoricalAccess.ArchiveItem)\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerConfiguration.Initialize\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.CreateFolderFromResources(Opc.Ua.NodeState,System.String)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryDeleteAtTime(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.DeleteAtTimeDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryDeleteAtTime(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.DeleteAtTimeDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryDeleteRawModified(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.DeleteRawModifiedDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryDeleteRawModified(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.DeleteRawModifiedDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryReadAtTime(Opc.Ua.Server.ServerSystemContext,Opc.Ua.ReadAtTimeDetails,Opc.Ua.TimestampsToReturn,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.HistoryReadResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryReadAtTime(Opc.Ua.Server.ServerSystemContext,Opc.Ua.ReadAtTimeDetails,Opc.Ua.TimestampsToReturn,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.HistoryReadResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryReadProcessed(Opc.Ua.Server.ServerSystemContext,Opc.Ua.ReadProcessedDetails,Opc.Ua.TimestampsToReturn,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.HistoryReadResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryReadProcessed(Opc.Ua.Server.ServerSystemContext,Opc.Ua.ReadProcessedDetails,Opc.Ua.TimestampsToReturn,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.HistoryReadResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryReadRawModified(Opc.Ua.Server.ServerSystemContext,Opc.Ua.ReadRawModifiedDetails,Opc.Ua.TimestampsToReturn,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.HistoryReadResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryReadRawModified(Opc.Ua.Server.ServerSystemContext,Opc.Ua.ReadRawModifiedDetails,Opc.Ua.TimestampsToReturn,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.HistoryReadResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryReleaseContinuationPoints(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryUpdateData(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.UpdateDataDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryUpdateData(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.UpdateDataDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryUpdateStructureData(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.UpdateStructureDataDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.HistoryUpdateStructureData(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.UpdateStructureDataDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.QueueProcessedValues(Opc.Ua.Server.ServerSystemContext,Opc.Ua.Server.IAggregateCalculator,Opc.Ua.NumericRange,Opc.Ua.QualifiedName,System.Boolean,System.Boolean,System.Collections.Generic.LinkedList{Opc.Ua.DataValue})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.Read(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.ReadValueId},System.Collections.Generic.IList{Opc.Ua.DataValue},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.Reload(Opc.Ua.Server.ServerSystemContext,Opc.Ua.Server.NodeHandle)~HistoricalAccess.ArchiveItemState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.ReviseAggregateFilter(Opc.Ua.Server.ServerSystemContext,Opc.Ua.Server.NodeHandle,System.Double,System.UInt32,Opc.Ua.Server.ServerAggregateFilter)~Opc.Ua.StatusCode\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.RowToDataValue(Opc.Ua.Server.ServerSystemContext,Opc.Ua.HistoryReadValueId,System.Data.DataRowView,System.Boolean)~Opc.Ua.DataValue\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.ValidateNode(Opc.Ua.Server.ServerSystemContext,Opc.Ua.Server.NodeHandle,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})~Opc.Ua.NodeState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.HistoricalAccessServerNodeManager.ValidateNode(Opc.Ua.Server.ServerSystemContext,Opc.Ua.Server.NodeHandle,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})~Opc.Ua.NodeState\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.NodeTypes.ConstructIdForComponent(Opc.Ua.NodeState,System.UInt16)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalAccess.UnderlyingSystem.GetItemState(Opc.Ua.ISystemContext,Opc.Ua.Server.ParsedNodeId)~HistoricalAccess.ArchiveItemState\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.CreateHistoryReadRequest(Opc.Ua.Server.ServerSystemContext,Opc.Ua.ReadEventDetails,Opc.Ua.Server.NodeHandle,Opc.Ua.HistoryReadValueId)~HistoricalEvents.HistoricalEventsNodeManager.HistoryReadRequest\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.HistoryDeleteEvents(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.DeleteEventDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.HistoryDeleteEvents(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.DeleteEventDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.HistoryReadEvents(Opc.Ua.Server.ServerSystemContext,Opc.Ua.ReadEventDetails,Opc.Ua.TimestampsToReturn,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.HistoryReadResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.HistoryReleaseContinuationPoints(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.HistoryUpdateEvents(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.UpdateEventDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.List{Opc.Ua.Server.NodeHandle},System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.HistoricalEventsServerConfiguration.Initialize\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.ReportGenerator.DeleteEvent(System.String)~System.Boolean\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.ReportGenerator.GetAreas~System.String[]\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.ReportGenerator.GetFluidLevelTestReport(Opc.Ua.ISystemContext,System.UInt16,System.Data.DataRow)~Opc.Ua.BaseEventState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.ReportGenerator.GetInjectionTestReport(Opc.Ua.ISystemContext,System.UInt16,System.Data.DataRow)~Opc.Ua.BaseEventState\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.ReportGenerator.GetWells(System.String)~HistoricalEvents.ReportGenerator.WellInfo[]\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferNodeManager.#ctor(Opc.Ua.Server.IServerInternal,Opc.Ua.ApplicationConfiguration)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferNodeManager.DeleteMonitoredItem(Opc.Ua.ISystemContext,Opc.Ua.Server.IMonitoredItem,System.Boolean@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferNodeManager.GetManagerHandle(Opc.Ua.ISystemContext,Opc.Ua.NodeId,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})~System.Object\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1307:Specify StringComparison\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferNodeManager.GetManagerHandle(Opc.Ua.ISystemContext,Opc.Ua.NodeId,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})~System.Object\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1305:Specify IFormatProvider\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferNodeManager.GetManagerHandle(Opc.Ua.ISystemContext,Opc.Ua.NodeId,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})~System.Object\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferNodeManager.ModifyMonitoredItem(Opc.Ua.ISystemContext,Opc.Ua.DiagnosticsMasks,Opc.Ua.TimestampsToReturn,Opc.Ua.Server.IMonitoredItem,Opc.Ua.MonitoredItemModifyRequest,Opc.Ua.MonitoringFilterResult@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferNodeManager.SetMonitoringMode(Opc.Ua.ISystemContext,Opc.Ua.Server.IMonitoredItem,Opc.Ua.MonitoringMode,System.Boolean@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferNodeManager.SetMonitoringMode(Opc.Ua.ISystemContext,Opc.Ua.Server.IMonitoredItem,Opc.Ua.MonitoringMode,System.Boolean@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferState.DeleteItem(MemoryBuffer.MemoryBufferMonitoredItem)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryTagState.#ctor(MemoryBuffer.MemoryBufferState,System.UInt32)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.MonitoredNode.ConditionRefresh(Opc.Ua.ISystemContext,Opc.Ua.Server.IEventMonitoredItem)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.#ctor(Opc.Ua.Server.IServerInternal)\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.AddExternalReference(Opc.Ua.NodeId,Opc.Ua.NodeId,System.Boolean,Opc.Ua.NodeId,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.AddExternalReference(Opc.Ua.NodeId,Opc.Ua.NodeId,System.Boolean,Opc.Ua.NodeId,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.AddReferences(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.AddTypesToTypeTree(Opc.Ua.BaseTypeState)\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1716:Identifiers should not match keywords\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.Call(Opc.Ua.ISystemContext,Opc.Ua.CallMethodRequest,Opc.Ua.NodeState,Opc.Ua.MethodState,Opc.Ua.CallMethodResult)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.Call(Opc.Ua.ISystemContext,Opc.Ua.CallMethodRequest,Opc.Ua.NodeState,Opc.Ua.MethodState,Opc.Ua.CallMethodResult)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.Call(Opc.Ua.Server.OperationContext,System.Collections.Generic.IList{Opc.Ua.CallMethodRequest},System.Collections.Generic.IList{Opc.Ua.CallMethodResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult})\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1716:Identifiers should not match keywords\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.Call(Opc.Ua.Server.OperationContext,System.Collections.Generic.IList{Opc.Ua.CallMethodRequest},System.Collections.Generic.IList{Opc.Ua.CallMethodResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.ConditionRefresh(Opc.Ua.Server.OperationContext,System.Collections.Generic.IList{Opc.Ua.Server.IEventMonitoredItem})~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.DeleteMonitoredItem(Opc.Ua.ISystemContext,Opc.Ua.Server.IMonitoredItem,System.Boolean@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.DeleteMonitoredItems(Opc.Ua.Server.OperationContext,System.Collections.Generic.IList{Opc.Ua.Server.IMonitoredItem},System.Collections.Generic.IList{System.Boolean},System.Collections.Generic.IList{Opc.Ua.ServiceResult})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.DeleteReference(System.Object,Opc.Ua.NodeId,System.Boolean,Opc.Ua.ExpandedNodeId,System.Boolean)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Usage\", \"CA1816:Dispose methods should call SuppressFinalize\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.Dispose\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.DoSample(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.HistoryRead(Opc.Ua.Server.OperationContext,Opc.Ua.HistoryReadDetails,Opc.Ua.TimestampsToReturn,System.Boolean,System.Collections.Generic.IList{Opc.Ua.HistoryReadValueId},System.Collections.Generic.IList{Opc.Ua.HistoryReadResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.HistoryUpdate(Opc.Ua.Server.OperationContext,System.Type,System.Collections.Generic.IList{Opc.Ua.HistoryUpdateDetails},System.Collections.Generic.IList{Opc.Ua.HistoryUpdateResult},System.Collections.Generic.IList{Opc.Ua.ServiceResult})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.IsNodeIdInNamespace(Opc.Ua.NodeId)~System.Boolean\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.ModifyMonitoredItem(Opc.Ua.ISystemContext,Opc.Ua.DiagnosticsMasks,Opc.Ua.TimestampsToReturn,Opc.Ua.Server.IMonitoredItem,Opc.Ua.MonitoredItemModifyRequest,Opc.Ua.MonitoringFilterResult@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.ModifyMonitoredItems(Opc.Ua.Server.OperationContext,Opc.Ua.TimestampsToReturn,System.Collections.Generic.IList{Opc.Ua.Server.IMonitoredItem},System.Collections.Generic.IList{Opc.Ua.MonitoredItemModifyRequest},System.Collections.Generic.IList{Opc.Ua.ServiceResult},System.Collections.Generic.IList{Opc.Ua.MonitoringFilterResult})\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1716:Identifiers should not match keywords\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.Read(Opc.Ua.Server.OperationContext,System.Double,System.Collections.Generic.IList{Opc.Ua.ReadValueId},System.Collections.Generic.IList{Opc.Ua.DataValue},System.Collections.Generic.IList{Opc.Ua.ServiceResult})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.SetMonitoringMode(Opc.Ua.ISystemContext,Opc.Ua.Server.IMonitoredItem,Opc.Ua.MonitoringMode,System.Boolean@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.SetMonitoringMode(Opc.Ua.Server.OperationContext,Opc.Ua.MonitoringMode,System.Collections.Generic.IList{Opc.Ua.Server.IMonitoredItem},System.Collections.Generic.IList{System.Boolean},System.Collections.Generic.IList{Opc.Ua.ServiceResult})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.SubscribeToAllEvents(Opc.Ua.ISystemContext,Opc.Ua.Server.IEventMonitoredItem,System.Boolean,Opc.Ua.NodeState)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.TranslateBrowsePath(Opc.Ua.Server.OperationContext,System.Object,Opc.Ua.RelativePathElement,System.Collections.Generic.IList{Opc.Ua.ExpandedNodeId},System.Collections.Generic.IList{Opc.Ua.NodeId})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.ValidateDataChangeFilter(Opc.Ua.ISystemContext,Opc.Ua.NodeState,System.UInt32,Opc.Ua.ExtensionObject,Opc.Ua.DataChangeFilter@,Opc.Ua.Range@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.ValidateNode(Opc.Ua.Server.ServerSystemContext,Opc.Ua.NodeState)~System.Boolean\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Sample.SampleNodeManager.Write(Opc.Ua.Server.OperationContext,System.Collections.Generic.IList{Opc.Ua.WriteValue},System.Collections.Generic.IList{Opc.Ua.ServiceResult})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Opc.Ua.Test.TestDataGenerator.LoadStringData(System.String)~System.Collections.Generic.SortedDictionary{System.String,System.String[]}\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.MemoryRegister.OnUpdate(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.MemoryRegisterState.#ctor(PerfTest.MemoryRegister,System.UInt16)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.ModelUtils.GetRegisterId(PerfTest.MemoryRegister,System.UInt16)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.ModelUtils.GetRegisterVariable(PerfTest.MemoryRegister,System.Int32,System.UInt16)~Opc.Ua.BaseDataVariableState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.ModelUtils.GetRegisterVariableId(PerfTest.MemoryRegister,System.Int32,System.UInt16)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.PerfTestNodeManager.#ctor(Opc.Ua.Server.IServerInternal,Opc.Ua.ApplicationConfiguration)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.PerfTestNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.PerfTestNodeManager.GetManagerHandle(Opc.Ua.Server.ServerSystemContext,Opc.Ua.NodeId,System.Collections.Generic.IDictionary{Opc.Ua.NodeId,Opc.Ua.NodeState})~Opc.Ua.Server.NodeHandle\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.PerfTestNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.PerfTestNodeManager.OnCreateMonitoredItemsComplete(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.Server.IMonitoredItem})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.PerfTestNodeManager.OnDeleteMonitoredItemsComplete(Opc.Ua.Server.ServerSystemContext,System.Collections.Generic.IList{Opc.Ua.Server.IMonitoredItem})\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:PerfTest.PerfTestServerConfiguration.Initialize\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PlcNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PlcNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PlcNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PlcNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Reference.ReferenceServerConfiguration.Initialize\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:SimpleEvents.SimpleEventsNodeManager.#ctor(Opc.Ua.Server.IServerInternal,Opc.Ua.ApplicationConfiguration)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:SimpleEvents.SimpleEventsNodeManager.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:SimpleEvents.SimpleEventsNodeManager.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1305:Specify IFormatProvider\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:SimpleEvents.SimpleEventsNodeManager.DoSimulation(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:SimpleEvents.SimpleEventsNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:SimpleEvents.SimpleEventsServerConfiguration.Initialize\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogArrayValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogArrayValueObjectState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogArrayValueObjectState.OnGenerateValues(Opc.Ua.ISystemContext,Opc.Ua.MethodState,Opc.Ua.NodeId,System.UInt32)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogScalarValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogScalarValueObjectState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogScalarValueObjectState.OnGenerateValues(Opc.Ua.ISystemContext,Opc.Ua.MethodState,Opc.Ua.NodeId,System.UInt32)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ArrayValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ArrayValueObjectState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ArrayValueObjectState.OnGenerateValues(Opc.Ua.ISystemContext,Opc.Ua.MethodState,Opc.Ua.NodeId,System.UInt32)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.HistoryArchive.OnUpdate(System.Object)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.MethodTestState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.MethodTestState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ScalarValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ScalarValueObjectState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ScalarValueObjectState.OnGenerateValues(Opc.Ua.ISystemContext,Opc.Ua.MethodState,Opc.Ua.NodeId,System.UInt32)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataNodeManager.#ctor(Opc.Ua.Server.IServerInternal,Opc.Ua.ApplicationConfiguration)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataNodeManager.OnDataChange(Opc.Ua.BaseVariableState,System.Object,Opc.Ua.StatusCode,System.DateTime)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1031:Do not catch general exception types\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.DoDeviceRead(Opc.Ua.ISystemContext,Opc.Ua.NodeState,Opc.Ua.NumericRange,Opc.Ua.QualifiedName,System.Object@,Opc.Ua.StatusCode@,System.DateTime@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.GenerateValue(TestData.TestDataSystem,Opc.Ua.BaseVariableState)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.GenerateValue(TestData.TestDataSystem,Opc.Ua.BaseVariableState)\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.InitializeVariable(Opc.Ua.ISystemContext,Opc.Ua.BaseVariableState,System.UInt32)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.OnGenerateValues(Opc.Ua.ISystemContext,Opc.Ua.MethodState,Opc.Ua.NodeId,System.UInt32)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Globalization\", \"CA1305:Specify IFormatProvider\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.OnWriteAnalogValue(Opc.Ua.ISystemContext,Opc.Ua.NodeState,System.Object@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.OnWriteAnalogValue(Opc.Ua.ISystemContext,Opc.Ua.NodeState,System.Object@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.OnWriteAnalogValue(Opc.Ua.ISystemContext,Opc.Ua.NodeState,System.Object@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Usage\", \"CA2200:Rethrow to preserve stack details.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.OnWriteAnalogValue(Opc.Ua.ISystemContext,Opc.Ua.NodeState,System.Object@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Usage\", \"CA1816:Dispose methods should call SuppressFinalize\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataSystem.Dispose\")]\n[assembly: SuppressMessage(\"Design\", \"CA1063:Implement IDisposable Correctly\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataSystem.Dispose\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataSystem.ReadValue(Opc.Ua.BaseVariableState)~System.Object\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestSystemConditionState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestSystemConditionState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestSystemConditionState.OnReadMonitoredNodeCount(Opc.Ua.ISystemContext,Opc.Ua.NodeState,System.Object@)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserArrayValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserArrayValueObjectState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserArrayValueObjectState.OnGenerateValues(Opc.Ua.ISystemContext,Opc.Ua.MethodState,Opc.Ua.NodeId,System.UInt32)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserScalarValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserScalarValueObjectState.GetChildren(Opc.Ua.ISystemContext,System.Collections.Generic.IList{Opc.Ua.BaseInstanceState})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserScalarValueObjectState.OnGenerateValues(Opc.Ua.ISystemContext,Opc.Ua.MethodState,Opc.Ua.NodeId,System.UInt32)~Opc.Ua.ServiceResult\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Vehicles.VehiclesNodeManager.#ctor(Opc.Ua.Server.IServerInternal,Opc.Ua.ApplicationConfiguration)\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Vehicles.VehiclesNodeManager.LoadSchemaFromResource(System.String,System.Reflection.Assembly)~System.Byte[]\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Vehicles.VehiclesNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Vehicles.VehiclesServerConfiguration.Initialize\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Views.ViewsNodeManager.#ctor(Opc.Ua.Server.IServerInternal,Opc.Ua.ApplicationConfiguration)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Views.ViewsNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Views.ViewsNodeManager.IsNodeInView(Opc.Ua.Server.ServerSystemContext,Opc.Ua.Server.ContinuationPoint,Opc.Ua.NodeState)~System.Boolean\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Views.ViewsNodeManager.IsReferenceInView(Opc.Ua.Server.ServerSystemContext,Opc.Ua.Server.ContinuationPoint,Opc.Ua.IReference)~System.Boolean\")]\n[assembly: SuppressMessage(\"Design\", \"CA1062:Validate arguments of public methods\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Views.ViewsNodeManager.New(Opc.Ua.ISystemContext,Opc.Ua.NodeState)~Opc.Ua.NodeId\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Views.ViewsServerConfiguration.Initialize\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1819:Properties should not return arrays\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:Alarms.UnderlyingSystemAlarm.Limits\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1819:Properties should not return arrays\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:DataAccess.UnderlyingSystemTag.EuRange\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1819:Properties should not return arrays\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:DataAccess.UnderlyingSystemTag.Labels\")]\n[assembly: SuppressMessage(\"Design\", \"CA1001:Types that own disposable fields should be disposable\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:HistoricalEvents.ReportGenerator\")]\n[assembly: SuppressMessage(\"Design\", \"CA1034:Nested types should not be visible\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:HistoricalEvents.ReportGenerator.WellInfo\")]\n[assembly: SuppressMessage(\"Design\", \"CA1001:Types that own disposable fields should be disposable\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:PerfTest.MemoryRegister\")]\n[assembly: SuppressMessage(\"Design\", \"CA1063:Implement IDisposable Correctly\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.TestDataSystem\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0065:Misplaced using directive\", Justification = \"<Pending>\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerStateMachineState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.GenericControllerState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:DataAccess.UnderlyingSystem.s_BlockDatabase\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:DataAccess.UnderlyingSystem.s_BlockPathDatabase\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:MemoryBuffer.MemoryBufferState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:MemoryBuffer.MemoryTagState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.HistoryEntry.IsModified\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.HistoryEntry.Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.HistoryRecord.DataType\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.HistoryRecord.Historizing\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.HistoryRecord.RawData\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataObjectState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataSystem.Sample.StatusCode\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataSystem.Sample.Timestamp\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataSystem.Sample.Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataSystem.Sample.Variable\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestSystemConditionState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.InitializationString\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.InitializationString\")]\n[assembly: SuppressMessage(\"Security\", \"CA5394:Do not use insecure randomness\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Boiler.BoilerState.RoundAndPerturb(System.Double,System.Byte)~System.Double\")]\n[assembly: SuppressMessage(\"Security\", \"CA5394:Do not use insecure randomness\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:HistoricalEvents.ReportGenerator.GetRandom(System.Int32,System.Int32)~System.Int32\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Reference.ReferenceNodeManager.CreateAddressSpace(System.Collections.Generic.IDictionary{Opc.Ua.NodeId,System.Collections.Generic.IList{Opc.Ua.IReference}})\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Reference.ReferenceNodeManager.CreateDynamicVariables(Opc.Ua.NodeState,System.String,System.String,Opc.Ua.NodeId,System.Int32,System.UInt32)~Opc.Ua.BaseDataVariableState[]\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Reference.ReferenceNodeManager.CreateVariables(Opc.Ua.NodeState,System.String,System.String,Opc.Ua.NodeId,System.Int32,System.UInt16)~Opc.Ua.BaseDataVariableState[]\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.ArrayValue1MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.ArrayValue2MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.ArrayValue3MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.GenerateValuesMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.ScalarValue1MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.ScalarValue2MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.ScalarValue3MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.UserArrayValue1MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.UserArrayValue2MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.UserScalarValue1MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.UserScalarValue2MethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.IntegerValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.NumberValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogArrayValueObjectState.UIntegerValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.IntegerValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.NumberValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.AnalogScalarValueObjectState.UIntegerValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.BooleanValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.ByteStringValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.DateTimeValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.EnumerationValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.ExpandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.GuidValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.IntegerValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.LocalizedTextValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.NodeIdValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.NumberValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.QualifiedNameValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.StatusCodeValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.StringValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.StructureValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.UIntegerValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.VariantValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ArrayValueObjectState.XmlElementValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ArrayMethod1\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ArrayMethod2\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ArrayMethod3\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ScalarMethod1\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ScalarMethod2\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.ScalarMethod3\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.UserArrayMethod1\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.UserArrayMethod2\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.UserScalarMethod1\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.MethodTestState.UserScalarMethod2\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.BooleanValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.ByteStringValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.DateTimeValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.EnumerationValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.ExpandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.GuidValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.IntegerValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.LocalizedTextValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.NodeIdValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.NumberValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.QualifiedNameValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.StatusCodeValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.StringValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.StructureValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.UIntegerValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.VariantValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.ScalarValueObjectState.XmlElementValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.TestDataObjectState.CycleComplete\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.TestDataObjectState.GenerateValues\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.TestDataObjectState.SimulationActive\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.TestSystemConditionState.MonitoredNodeCount\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.BooleanValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.ByteStringValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.DateTimeValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.ExpandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.GuidValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.LocalizedTextValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.NodeIdValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.QualifiedNameValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.StatusCodeValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.StringValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.VariantValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserArrayValueObjectState.XmlElementValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.BooleanValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.ByteStringValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.ByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.DateTimeValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.DoubleValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.ExpandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.FloatValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.GuidValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.Int16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.Int32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.Int64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.LocalizedTextValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.NodeIdValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.QualifiedNameValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.SByteValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.StatusCodeValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.StringValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.UInt16Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.UInt32Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.UInt64Value\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.VariantValue\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:TestData.UserScalarValueObjectState.XmlElementValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerState.m_customController\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerState.m_drum\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerState.m_flowController\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerState.m_inputPipe\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerState.m_levelController\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerState.m_outputPipe\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerState.m_simulation\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerStateMachineState.m_haltMethod\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerStateMachineState.m_resetMethod\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerStateMachineState.m_resumeMethod\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerStateMachineState.m_startMethod\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerStateMachineState.m_suspendMethod\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.BoilerStateMachineState.m_updateRate\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.GenericControllerState.m_controlOut\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.GenericControllerState.m_measurement\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Boiler.GenericControllerState.m_setPoint\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:MemoryBuffer.MemoryBufferState.m_sizeInBytes\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:MemoryBuffer.MemoryBufferState.m_startAddress\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_byteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_doubleValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_floatValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_int16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_int32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_int64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_integerValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_numberValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_sByteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_uInt16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_uInt32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_uInt64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogArrayValueObjectState.m_uIntegerValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_byteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_doubleValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_floatValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_int16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_int32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_int64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_integerValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_numberValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_sByteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_uInt16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_uInt32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_uInt64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.AnalogScalarValueObjectState.m_uIntegerValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_booleanValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_byteStringValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_byteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_dateTimeValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_doubleValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_enumerationValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_expandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_floatValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_guidValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_int16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_int32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_int64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_integerValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_localizedTextValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_nodeIdValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_numberValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_qualifiedNameValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_sByteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_statusCodeValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_stringValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_structureValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_uInt16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_uInt32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_uInt64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_uIntegerValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_variantValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ArrayValueObjectState.m_xmlElementValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_arrayMethod1Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_arrayMethod2Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_arrayMethod3Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_scalarMethod1Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_scalarMethod2Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_scalarMethod3Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_userArrayMethod1Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_userArrayMethod2Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_userScalarMethod1Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.MethodTestState.m_userScalarMethod2Method\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_booleanValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_byteStringValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_byteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_dateTimeValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_doubleValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_enumerationValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_expandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_floatValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_guidValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_int16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_int32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_int64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_integerValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_localizedTextValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_nodeIdValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_numberValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_qualifiedNameValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_sByteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_statusCodeValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_stringValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_structureValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_uInt16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_uInt32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_uInt64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_uIntegerValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_variantValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.ScalarValueObjectState.m_xmlElementValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataObjectState.m_cycleComplete\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataObjectState.m_generateValuesMethod\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestDataObjectState.m_simulationActive\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.TestSystemConditionState.m_monitoredNodeCount\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_booleanValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_byteStringValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_byteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_dateTimeValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_doubleValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_expandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_floatValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_guidValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_int16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_int32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_int64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_localizedTextValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_nodeIdValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_qualifiedNameValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_sByteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_statusCodeValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_stringValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_uInt16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_uInt32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_uInt64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_variantValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserArrayValueObjectState.m_xmlElementValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_booleanValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_byteStringValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_byteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_dateTimeValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_doubleValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_expandedNodeIdValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_floatValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_guidValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_int16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_int32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_int64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_localizedTextValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_nodeIdValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_qualifiedNameValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_sByteValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_statusCodeValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_stringValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_uInt16Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_uInt32Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_uInt64Value\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_variantValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE1006:Naming Styles\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:TestData.UserScalarValueObjectState.m_xmlElementValue\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogArrayValueObjectState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogScalarValueObjectState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ArrayValueObjectState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.MethodTestState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ScalarValueObjectState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestSystemConditionState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserArrayValueObjectState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserScalarValueObjectState.Initialize(Opc.Ua.ISystemContext)\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.AnalogArrayValueObjectState\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.AnalogScalarValueObjectState\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.ArrayValueObjectState\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.MethodTestState\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.ScalarValueObjectState\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.TestDataObjectState\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.TestSystemConditionState\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.UserArrayValueObjectState\")]\n[assembly: SuppressMessage(\"Style\", \"IDE0047:Remove unnecessary parentheses\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:TestData.UserScalarValueObjectState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogArrayValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.AnalogScalarValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ArrayValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.MethodTestState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.ScalarValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestDataObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.TestSystemConditionState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserArrayValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1173:Use coalesce expression instead of 'if'.\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:TestData.UserScalarValueObjectState.FindChild(Opc.Ua.ISystemContext,Opc.Ua.QualifiedName,System.Boolean,Opc.Ua.BaseInstanceState)~Opc.Ua.BaseInstanceState\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1819:Properties should not return arrays\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:DeterministicAlarms.Configuration.Folder.Sources\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1819:Properties should not return arrays\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:DeterministicAlarms.Configuration.Script.Steps\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1819:Properties should not return arrays\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:DeterministicAlarms.Configuration.Source.Alarms\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1819:Properties should not return arrays\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:DeterministicAlarms.Configuration.AlarmsConfiguration.Folders\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1819:Properties should not return arrays\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~P:DeterministicAlarms.Configuration.Event.StateChanges\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PlcNodeManager.CreateBaseVariable(Opc.Ua.NodeState,System.Object,System.String,Opc.Ua.NodeId,System.Int32,System.Byte,System.String,Plc.NamespaceType,System.Boolean,System.Object,System.Object,System.Object,System.Object)~Opc.Ua.BaseDataVariableState\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PlcNodeManager.CreateBaseVariable(Opc.Ua.NodeState,System.Object,System.String,Opc.Ua.NodeId,System.Int32,System.Byte,System.String,Plc.NamespaceType,System.Object)~Opc.Ua.BaseDataVariableState\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PlcSimulation.UpdateEventInstances\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.ComplexTypePlcPluginNode.AddNodes(Opc.Ua.FolderState)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.DataPluginNodes.AddMethods(Opc.Ua.FolderState)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.DataPluginNodes.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.DeterministicGuidPluginNodes.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.DipPluginNode.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.FastPluginNodes.AddMethods(Opc.Ua.FolderState)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.FastPluginNodes.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.FastRandomPluginNodes.AddMethods(Opc.Ua.FolderState)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.FastRandomPluginNodes.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.LongIdPluginNode.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.LongStringPluginNodes.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.NegTrendPluginNode.AddMethods(Opc.Ua.FolderState)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.NegTrendPluginNode.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.PosTrendPluginNode.AddMethods(Opc.Ua.FolderState)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.PosTrendPluginNode.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.SlowPluginNodes.AddMethods(Opc.Ua.FolderState)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.SlowPluginNodes.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.SlowRandomPluginNodes.AddMethods(Opc.Ua.FolderState)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.SlowRandomPluginNodes.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.SpecialCharNamePluginNode.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Plc.PluginNodes.SpikePluginNode.AddToAddressSpace(Opc.Ua.FolderState,Opc.Ua.FolderState,Plc.PlcNodeManager)\")]\n[assembly: SuppressMessage(\"Reliability\", \"CA2000:Dispose objects before losing scope\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:MemoryBuffer.MemoryBufferBrowser.NextChild~Opc.Ua.NodeStateReference\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.CloseAndUpdateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.CreateAssetMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.DeleteAssetMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.CloseAndUpdateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.CloseAndUpdateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.CreateAssetMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.CreateAssetMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.DeleteAssetMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.DeleteAssetMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:Asset.Namespaces\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:Asset.Namespaces.WoT_Con\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95EquipmentDataTypeFields.Properties\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95JobOrderDataTypeFields.MaterialRequirements\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95JobResponseDataTypeFields.MaterialActuals\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95MaterialDataTypeFields.Properties\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95ParameterDataTypeFields.Subparameters\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95PersonnelDataTypeFields.Properties\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95PhysicalAssetDataTypeFields.Properties\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95PropertyDataTypeFields.Subproperties\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~F:UAModel.ISA95_JOBCONTROL_V2.ISA95WorkMasterDataTypeFields.Parameters\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.AbortMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.AbortMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.CancelMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.CancelMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ClearMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ClearMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95EquipmentDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95JobOrderDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95JobResponseDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95MaterialDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95ParameterDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95PersonnelDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95PhysicalAssetDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95PropertyDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ISA95WorkMasterDataTypeFields\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.PauseMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.PauseMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ReceiveJobResponseMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ReceiveJobResponseMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RequestJobResponseByJobOrderIDMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RequestJobResponseByJobOrderIDMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RequestJobResponseByJobOrderStateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RequestJobResponseByJobOrderStateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ResumeMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ResumeMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RevokeStartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RevokeStartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StopMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StopMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StoreAndStartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StoreAndStartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StoreMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StoreMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1139:Add summary element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.UpdateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Roslynator\", \"RCS1141:Add 'param' element to documentation comment\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.UpdateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"namespace\", Target = \"~N:UAModel.ISA95_JOBCONTROL_V2\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.AbortMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.CancelMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ClearMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.PauseMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ReceiveJobResponseMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RequestJobResponseByJobOrderIDMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RequestJobResponseByJobOrderStateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.ResumeMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.RevokeStartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StopMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StoreAndStartMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.StoreMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Naming\", \"CA1707:Identifiers should not contain underscores\", Justification = \"<Pending>\", Scope = \"type\", Target = \"~T:UAModel.ISA95_JOBCONTROL_V2.UpdateMethodStateMethodCallHandler\")]\n[assembly: SuppressMessage(\"Performance\", \"CA1822:Mark members as static\", Justification = \"<Pending>\", Scope = \"member\", Target = \"~M:Isa95Jobs.Isa95JobControlServerConfiguration.Initialize\")]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/ArchiveFolder.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// Stores the metadata for a node representing a folder on a file system.\n    /// </summary>\n    public class ArchiveFolder\n    {\n        /// <summary>\n        /// Creates a new instance.\n        /// </summary>\n        /// <param name=\"uniquePath\"></param>\n        /// <param name=\"folder\"></param>\n        public ArchiveFolder(string uniquePath, DirectoryInfo folder)\n        {\n            UniquePath = uniquePath;\n            DirectoryInfo = folder;\n        }\n\n        /// <summary>\n        /// Returns the child folders.\n        /// </summary>\n        public ArchiveFolder[] GetChildFolders()\n        {\n            var folders = new List<ArchiveFolder>();\n\n            if (!DirectoryInfo.Exists)\n            {\n                return [.. folders];\n            }\n\n            foreach (var directory in DirectoryInfo.GetDirectories())\n            {\n                var buffer = new StringBuilder(UniquePath);\n                buffer.Append('/')\n                    .Append(directory.Name);\n                folders.Add(new ArchiveFolder(buffer.ToString(), directory));\n            }\n\n            return [.. folders];\n        }\n\n        /// <summary>\n        /// Returns the child folders.\n        /// </summary>\n        public ArchiveItem[] GetItems()\n        {\n            var items = new List<ArchiveItem>();\n\n            if (!DirectoryInfo.Exists)\n            {\n                return [.. items];\n            }\n\n            foreach (var file in DirectoryInfo.GetFiles(\"*.csv\"))\n            {\n                var buffer = new StringBuilder(UniquePath);\n                buffer.Append('/')\n                    .Append(file.Name);\n                items.Add(new ArchiveItem(buffer.ToString(), file));\n            }\n\n            return [.. items];\n        }\n\n        /// <summary>\n        /// Returns the parent folder.\n        /// </summary>\n        public ArchiveFolder GetParentFolder()\n        {\n            var parentPath = string.Empty;\n\n            if (!DirectoryInfo.Exists)\n            {\n                return null;\n            }\n\n            var index = UniquePath.LastIndexOf('/');\n\n            if (index > 0)\n            {\n                parentPath = UniquePath[..index];\n            }\n\n            return new ArchiveFolder(parentPath, DirectoryInfo.Parent);\n        }\n\n        /// <summary>\n        /// The unique path to the folder in the archive.\n        /// </summary>\n        public string UniquePath { get; }\n\n        /// <summary>\n        /// A name for the folder.\n        /// </summary>\n        public string Name => DirectoryInfo.Name;\n\n        /// <summary>\n        /// The physical folder in the archive.\n        /// </summary>\n        public DirectoryInfo DirectoryInfo { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/ArchiveFolderBrowser.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Browses the references for an archive folder.\n    /// </summary>\n    public class ArchiveFolderBrowser : NodeBrowser\n    {\n        /// <summary>\n        /// Creates a new browser object with a set of filters.\n        /// </summary>\n        /// <param name=\"context\">The system context to use.</param>\n        /// <param name=\"view\">The view which may restrict the set of references/nodes found.</param>\n        /// <param name=\"referenceType\">The type of references being followed.</param>\n        /// <param name=\"includeSubtypes\">Whether subtypes of the reference type are followed.</param>\n        /// <param name=\"browseDirection\">Which way the references are being followed.</param>\n        /// <param name=\"browseName\">The browse name of a specific target (used when translating browse paths).</param>\n        /// <param name=\"additionalReferences\">Any additional references that should be included.</param>\n        /// <param name=\"internalOnly\">If true the browser should not making blocking calls to external systems.</param>\n        /// <param name=\"source\">The segment being accessed.</param>\n        public ArchiveFolderBrowser(\n            ISystemContext context,\n            ViewDescription view,\n            NodeId referenceType,\n            bool includeSubtypes,\n            BrowseDirection browseDirection,\n            QualifiedName browseName,\n            IEnumerable<IReference> additionalReferences,\n            bool internalOnly,\n            ArchiveFolderState source)\n        :\n            base(\n                context,\n                view,\n                referenceType,\n                includeSubtypes,\n                browseDirection,\n                browseName,\n                additionalReferences,\n                internalOnly)\n        {\n            _source = source;\n            _stage = Stage.Begin;\n        }\n\n        /// <summary>\n        /// Returns the next reference.\n        /// </summary>\n        /// <returns>The next reference that meets the browse criteria.</returns>\n        public override IReference Next()\n        {\n            lock (DataLock)\n            {\n                // enumerate pre-defined references.\n                // always call first to ensure any pushed-back references are returned first.\n                var reference = base.Next();\n\n                if (reference != null)\n                {\n                    return reference;\n                }\n\n                if (_stage == Stage.Begin)\n                {\n                    _folders = _source.ArchiveFolder.GetChildFolders();\n                    _stage = Stage.Folders;\n                    _position = 0;\n                }\n\n                // don't start browsing huge number of references when only internal references are requested.\n                if (InternalOnly)\n                {\n                    return null;\n                }\n\n                // enumerate folders.\n                if (_stage == Stage.Folders)\n                {\n                    if (IsRequired(ReferenceTypeIds.Organizes, false))\n                    {\n                        reference = NextChild();\n\n                        if (reference != null)\n                        {\n                            return reference;\n                        }\n                    }\n\n                    _items = _source.ArchiveFolder.GetItems();\n                    _stage = Stage.Items;\n                    _position = 0;\n                }\n\n                // enumerate items.\n                if (_stage == Stage.Items && IsRequired(ReferenceTypeIds.Organizes, false))\n                {\n                    reference = NextChild();\n\n                    if (reference != null)\n                    {\n                        return reference;\n                    }\n\n                    _stage = Stage.Parents;\n                    _position = 0;\n                }\n\n                // enumerate parents.\n                if (_stage == Stage.Parents && IsRequired(ReferenceTypeIds.Organizes, true))\n                {\n                    reference = NextChild();\n\n                    if (reference != null)\n                    {\n                        return reference;\n                    }\n\n                    _stage = Stage.Done;\n                    _position = 0;\n                }\n\n                // all done.\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Returns the next child.\n        /// </summary>\n        private NodeStateReference NextChild()\n        {\n            NodeId targetId = null;\n\n            // check if a specific browse name is requested.\n            if (!QualifiedName.IsNull(BrowseName))\n            {\n                // check if match found previously.\n                if (_position == int.MaxValue)\n                {\n                    return null;\n                }\n\n                // browse name must be qualified by the correct namespace.\n                if (_source.BrowseName.NamespaceIndex != BrowseName.NamespaceIndex)\n                {\n                    return null;\n                }\n\n                // look for matching folder.\n                if (_stage == Stage.Folders && _folders != null)\n                {\n                    for (var ii = 0; ii < _folders.Length; ii++)\n                    {\n                        if (BrowseName.Name == _folders[ii].Name)\n                        {\n                            targetId = ArchiveFolderState.ConstructId(_folders[ii].UniquePath, _source.NodeId.NamespaceIndex);\n                            break;\n                        }\n                    }\n                }\n\n                // look for matching item.\n                else if (_stage == Stage.Items && _items != null)\n                {\n                    for (var ii = 0; ii < _items.Length; ii++)\n                    {\n                        if (BrowseName.Name == _items[ii].Name)\n                        {\n                            targetId = ArchiveItemState.ConstructId(_items[ii].UniquePath, _source.NodeId.NamespaceIndex);\n                            break;\n                        }\n                    }\n                }\n\n                // look for matching parent.\n                else if (_stage == Stage.Parents)\n                {\n                    var parent = _source.ArchiveFolder.GetParentFolder();\n\n                    if (BrowseName.Name == parent.Name)\n                    {\n                        targetId = ArchiveFolderState.ConstructId(parent.UniquePath, _source.NodeId.NamespaceIndex);\n                    }\n                }\n\n                _position = int.MaxValue;\n            }\n\n            // return the child at the next position.\n            else\n            {\n                // look for next folder.\n                if (_stage == Stage.Folders && _folders != null)\n                {\n                    if (_position >= _folders.Length)\n                    {\n                        return null;\n                    }\n\n                    targetId = ArchiveFolderState.ConstructId(_folders[_position++].UniquePath, _source.NodeId.NamespaceIndex);\n                }\n\n                // look for next item.\n                else if (_stage == Stage.Items && _items != null)\n                {\n                    if (_position >= _items.Length)\n                    {\n                        return null;\n                    }\n\n                    targetId = ArchiveItemState.ConstructId(_items[_position++].UniquePath, _source.NodeId.NamespaceIndex);\n                }\n\n                // look for matching parent.\n                else if (_stage == Stage.Parents)\n                {\n                    var parent = _source.ArchiveFolder.GetParentFolder();\n\n                    if (parent != null)\n                    {\n                        targetId = ArchiveFolderState.ConstructId(parent.UniquePath, _source.NodeId.NamespaceIndex);\n                    }\n                }\n            }\n\n            // create reference.\n            if (targetId != null)\n            {\n                return new NodeStateReference(ReferenceTypeIds.Organizes, false, targetId);\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// The stages available in a browse operation.\n        /// </summary>\n        private enum Stage\n        {\n            Begin,\n            Folders,\n            Items,\n            Parents,\n            Done\n        }\n\n        private Stage _stage;\n        private int _position;\n        private readonly ArchiveFolderState _source;\n        private ArchiveFolder[] _folders;\n        private ArchiveItem[] _items;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/ArchiveFolderState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Stores the metadata for a node representing a folder on a file system.\n    /// </summary>\n    public class ArchiveFolderState : FolderState\n    {\n        /// <summary>\n        /// Creates a new instance of a folder.\n        /// </summary>\n        /// <param name=\"folder\"></param>\n        /// <param name=\"namespaceIndex\"></param>\n        public ArchiveFolderState(ArchiveFolder folder, ushort namespaceIndex)\n            : base(null)\n        {\n            ArchiveFolder = folder;\n\n            TypeDefinitionId = ObjectTypeIds.FolderType;\n            SymbolicName = folder.Name;\n            NodeId = ConstructId(folder.UniquePath, namespaceIndex);\n            BrowseName = new QualifiedName(folder.Name, namespaceIndex);\n            DisplayName = new LocalizedText(BrowseName.Name);\n            Description = null;\n            WriteMask = 0;\n            UserWriteMask = 0;\n            EventNotifier = EventNotifiers.None;\n        }\n\n        /// <summary>\n        /// Constructs a node identifier for a folder object.\n        /// </summary>\n        /// <param name=\"filePath\"></param>\n        /// <param name=\"namespaceIndex\"></param>\n        public static NodeId ConstructId(string filePath, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = filePath,\n                NamespaceIndex = namespaceIndex,\n                RootType = NodeTypes.Folder\n            };\n\n            return parsedNodeId.Construct();\n        }\n\n        /// <summary>\n        /// The physical folder referenced by the node.\n        /// </summary>\n        public ArchiveFolder ArchiveFolder { get; }\n\n        /// <summary>\n        /// Creates a browser that explores the structure of the block.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"referenceType\"></param>\n        /// <param name=\"includeSubtypes\"></param>\n        /// <param name=\"browseDirection\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"additionalReferences\"></param>\n        /// <param name=\"internalOnly\"></param>\n        public override INodeBrowser CreateBrowser(\n            ISystemContext context,\n            ViewDescription view,\n            NodeId referenceType,\n            bool includeSubtypes,\n            BrowseDirection browseDirection,\n            QualifiedName browseName,\n            IEnumerable<IReference> additionalReferences,\n            bool internalOnly)\n        {\n            NodeBrowser browser = new ArchiveFolderBrowser(\n                context,\n                view,\n                referenceType,\n                includeSubtypes,\n                browseDirection,\n                browseName,\n                additionalReferences,\n                internalOnly,\n                this);\n\n            PopulateBrowser(context, browser);\n\n            return browser;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/ArchiveItem.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using System;\n    using System.Data;\n    using System.IO;\n    using System.Reflection;\n    using System.Text;\n\n    /// <summary>\n    /// Stores the metadata for a node representing a folder on a file system.\n    /// </summary>\n    public class ArchiveItem\n    {\n        /// <summary>\n        /// Creates a new instance.\n        /// </summary>\n        /// <param name=\"uniquePath\"></param>\n        /// <param name=\"file\"></param>\n        public ArchiveItem(string uniquePath, FileInfo file)\n        {\n            UniquePath = uniquePath;\n            FileInfo = file;\n            Name = string.Empty;\n\n            if (FileInfo != null)\n            {\n                Name = FileInfo.Name;\n\n                var index = Name.LastIndexOf('.');\n\n                if (index > 0)\n                {\n                    Name = Name[..index];\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates a new instance.\n        /// </summary>\n        /// <param name=\"uniquePath\"></param>\n        /// <param name=\"assembly\"></param>\n        /// <param name=\"resourcePath\"></param>\n        public ArchiveItem(string uniquePath, Assembly assembly, string resourcePath)\n        {\n            UniquePath = uniquePath;\n            ResourceInfo = new ResourceInfoType { Assembly = assembly, ResourcePath = resourcePath };\n            Name = string.Empty;\n\n            Name = ResourceInfo.ResourcePath;\n\n            var index = Name.LastIndexOf('.');\n\n            if (index > 0)\n            {\n                Name = Name[..index];\n            }\n\n            index = Name.LastIndexOf('.');\n\n            if (index > 0)\n            {\n                Name = Name[(index + 1)..];\n            }\n        }\n\n        /// <summary>\n        /// Returns a stream that can be used to read the archive.\n        /// </summary>\n        public StreamReader OpenArchive()\n        {\n            if (FileInfo != null)\n            {\n                return new StreamReader(FileInfo.FullName, Encoding.UTF8);\n            }\n\n            if (ResourceInfo.Assembly != null)\n            {\n                return new StreamReader(ResourceInfo.Assembly.GetManifestResourceStream(ResourceInfo.ResourcePath), Encoding.UTF8);\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// A name for the item.\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// The unique path to the item in the archive.\n        /// </summary>\n        public string UniquePath { get; }\n\n        /// <summary>\n        /// The data type for the item.\n        /// </summary>\n        public BuiltInType DataType { get; set; }\n\n        /// <summary>\n        /// The value rank for the item.\n        /// </summary>\n        public int ValueRank { get; set; }\n\n        /// <summary>\n        /// The type of simulated data.\n        /// </summary>\n        public int SimulationType { get; set; }\n\n        /// <summary>\n        /// The amplitude of the simulated data.\n        /// </summary>\n        public double Amplitude { get; set; }\n\n        /// <summary>\n        /// The period of the simulated data.\n        /// </summary>\n        public double Period { get; set; }\n\n        /// <summary>\n        /// Whether the simulation is running.\n        /// </summary>\n        public bool Archiving { get; set; }\n\n        /// <summary>\n        /// Whether the data requires stepped interpolation.\n        /// </summary>\n        public bool Stepped { get; set; }\n\n        /// <summary>\n        /// The sampling interval for the simulation.\n        /// </summary>\n        public double SamplingInterval { get; set; }\n\n        /// <summary>\n        /// The history for the item.\n        /// </summary>\n        public DataSet DataSet { get; set; }\n\n        /// <summary>\n        /// The last the dataset was loaded from its source.\n        /// </summary>\n        public DateTime LastLoadTime { get; set; }\n\n        /// <summary>\n        /// Whether the source is perisistent and needs to be reloaded.\n        /// </summary>\n        public bool Persistent { get; set; }\n\n        /// <summary>\n        /// The aggregate configuration for the item.\n        /// </summary>\n        public AggregateConfiguration AggregateConfiguration { get; set; }\n\n        /// <summary>\n        /// The physical file containing the item history.\n        /// </summary>\n        private FileInfo FileInfo { get; }\n\n        /// <summary>\n        /// An embeddded resource in containing the item history.\n        /// </summary>\n        private ResourceInfoType ResourceInfo { get; set; }\n\n        /// <summary>\n        /// Stores information about an embedded resource.\n        /// </summary>\n        private struct ResourceInfoType\n        {\n            public Assembly Assembly { get; set; }\n            public string ResourcePath { get; set; }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/ArchiveItemState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Data;\n\n    /// <summary>\n    /// Stores the metadata for a node representing an item in the archive.\n    /// </summary>\n    public class ArchiveItemState : DataItemState\n    {\n        /// <summary>\n        /// Creates a new instance of a item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"namespaceIndex\"></param>\n        /// <param name=\"timeService\"></param>\n        public ArchiveItemState(ISystemContext context, ArchiveItem item, ushort namespaceIndex, TimeService timeService)\n        :\n            base(null)\n        {\n            ArchiveItem = item;\n            _timeService = timeService;\n            TypeDefinitionId = VariableTypeIds.DataItemType;\n            SymbolicName = ArchiveItem.Name;\n            NodeId = ConstructId(ArchiveItem.UniquePath, namespaceIndex);\n            BrowseName = new QualifiedName(ArchiveItem.Name, namespaceIndex);\n            DisplayName = new LocalizedText(BrowseName.Name);\n            Description = null;\n            WriteMask = 0;\n            UserWriteMask = 0;\n            DataType = DataTypeIds.BaseDataType;\n            ValueRank = ValueRanks.Scalar;\n            AccessLevel = AccessLevels.HistoryReadOrWrite | AccessLevels.CurrentRead;\n            UserAccessLevel = AccessLevels.HistoryReadOrWrite | AccessLevels.CurrentRead;\n            MinimumSamplingInterval = MinimumSamplingIntervals.Indeterminate;\n            Historizing = true;\n\n            _annotations = new PropertyState<Annotation>(this)\n            {\n                ReferenceTypeId = ReferenceTypeIds.HasProperty,\n                TypeDefinitionId = VariableTypeIds.PropertyType,\n                SymbolicName = BrowseNames.Annotations,\n                BrowseName = BrowseNames.Annotations\n            };\n            _annotations.DisplayName = new LocalizedText(_annotations.BrowseName.Name);\n            _annotations.Description = null;\n            _annotations.WriteMask = 0;\n            _annotations.UserWriteMask = 0;\n            _annotations.DataType = DataTypeIds.Annotation;\n            _annotations.ValueRank = ValueRanks.Scalar;\n            _annotations.AccessLevel = AccessLevels.HistoryReadOrWrite;\n            _annotations.UserAccessLevel = AccessLevels.HistoryReadOrWrite;\n            _annotations.MinimumSamplingInterval = MinimumSamplingIntervals.Indeterminate;\n            _annotations.Historizing = false;\n            AddChild(_annotations);\n\n            _annotations.NodeId = NodeTypes.ConstructIdForComponent(_annotations, namespaceIndex);\n\n            _configuration = new HistoricalDataConfigurationState(this);\n            _configuration.MaxTimeInterval = new PropertyState<double>(_configuration);\n            _configuration.MinTimeInterval = new PropertyState<double>(_configuration);\n            _configuration.StartOfArchive = new PropertyState<DateTime>(_configuration);\n            _configuration.StartOfOnlineArchive = new PropertyState<DateTime>(_configuration);\n\n            _configuration.Create(\n                context,\n                null,\n                BrowseNames.HAConfiguration,\n                null,\n                true);\n\n            _configuration.SymbolicName = BrowseNames.HAConfiguration;\n            _configuration.ReferenceTypeId = ReferenceTypeIds.HasHistoricalConfiguration;\n\n            AddChild(_configuration);\n        }\n\n        /// <summary>\n        /// Loads the configuration.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        public void LoadConfiguration(SystemContext context)\n        {\n            var reader = new DataFileReader(_timeService);\n\n            if (reader.LoadConfiguration(context, ArchiveItem))\n            {\n                DataType = (uint)ArchiveItem.DataType;\n                ValueRank = ArchiveItem.ValueRank;\n                Historizing = ArchiveItem.Archiving;\n\n                _configuration.MinTimeInterval.Value = ArchiveItem.SamplingInterval;\n                _configuration.MaxTimeInterval.Value = ArchiveItem.SamplingInterval;\n                _configuration.Stepped.Value = ArchiveItem.Stepped;\n\n                var configuration = ArchiveItem.AggregateConfiguration;\n                _configuration.AggregateConfiguration.PercentDataGood.Value = configuration.PercentDataGood;\n                _configuration.AggregateConfiguration.PercentDataBad.Value = configuration.PercentDataBad;\n                _configuration.AggregateConfiguration.UseSlopedExtrapolation.Value = configuration.UseSlopedExtrapolation;\n                _configuration.AggregateConfiguration.TreatUncertainAsBad.Value = configuration.TreatUncertainAsBad;\n            }\n        }\n\n        /// <summary>\n        /// Loads the data.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        public void ReloadFromSource(SystemContext context)\n        {\n            LoadConfiguration(context);\n\n            if (ArchiveItem.LastLoadTime == DateTime.MinValue\n                || (ArchiveItem.Persistent && ArchiveItem.LastLoadTime.AddDays(1) < _timeService.UtcNow))\n            {\n                var reader = new DataFileReader(_timeService);\n                reader.LoadHistoryData(context, ArchiveItem);\n\n                // set the start of the archive.\n                if (ArchiveItem.DataSet.Tables[0].DefaultView.Count > 0)\n                {\n                    _configuration.StartOfArchive.Value = (DateTime)ArchiveItem.DataSet.Tables[0].DefaultView[0].Row[0];\n                    _configuration.StartOfOnlineArchive.Value = _configuration.StartOfArchive.Value;\n                }\n\n                if (ArchiveItem.Archiving)\n                {\n                    // save the pattern used to produce new data.\n                    _pattern = [];\n\n                    foreach (DataRowView row in ArchiveItem.DataSet.Tables[0].DefaultView)\n                    {\n                        var value = (DataValue)row.Row[2];\n                        _pattern.Add(value);\n                        _nextSampleTime = value.SourceTimestamp.AddMilliseconds(ArchiveItem.SamplingInterval);\n                    }\n\n                    // fill in data until the present time.\n                    _patternIndex = 0;\n                    NewSamples(context);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates a new sample.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        public IList<DataValue> NewSamples(SystemContext context)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context is not null);\n            var newSamples = new List<DataValue>();\n\n            while (_pattern != null && _nextSampleTime < _timeService.UtcNow)\n            {\n                var value = new DataValue\n                {\n                    WrappedValue = _pattern[_patternIndex].WrappedValue,\n                    ServerTimestamp = _nextSampleTime,\n                    SourceTimestamp = _nextSampleTime,\n                    StatusCode = _pattern[_patternIndex].StatusCode\n                };\n                _nextSampleTime = value.SourceTimestamp.AddMilliseconds(ArchiveItem.SamplingInterval);\n                newSamples.Add(value);\n\n                var row = ArchiveItem.DataSet.Tables[0].NewRow();\n\n                row[0] = value.SourceTimestamp;\n                row[1] = value.ServerTimestamp;\n                row[2] = value;\n                row[3] = value.WrappedValue.TypeInfo.BuiltInType;\n                row[4] = value.WrappedValue.TypeInfo.ValueRank;\n\n                ArchiveItem.DataSet.Tables[0].Rows.Add(row);\n                _patternIndex = (_patternIndex + 1) % _pattern.Count;\n            }\n\n            ArchiveItem.DataSet.AcceptChanges();\n            return newSamples;\n        }\n\n        /// <summary>\n        /// Updates the history.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"performUpdateType\"></param>\n        public uint UpdateHistory(SystemContext context, DataValue value, PerformUpdateType performUpdateType)\n        {\n            var replaced = false;\n\n            if (performUpdateType == PerformUpdateType.Remove)\n            {\n                return StatusCodes.BadNotSupported;\n            }\n\n            if (StatusCode.IsNotBad(value.StatusCode))\n            {\n                var typeInfo = value.WrappedValue.TypeInfo ?? TypeInfo.Construct(value.Value);\n\n                if (typeInfo == null || typeInfo.BuiltInType != ArchiveItem.DataType || typeInfo.ValueRank != ValueRanks.Scalar)\n                {\n                    return StatusCodes.BadTypeMismatch;\n                }\n            }\n\n            var filter = string.Format(System.Globalization.CultureInfo.InvariantCulture, \"SourceTimestamp = #{0}#\", value.SourceTimestamp);\n\n            var view = new DataView(\n                ArchiveItem.DataSet.Tables[0],\n                filter,\n                null,\n                DataViewRowState.CurrentRows);\n\n            DataRow row = null;\n\n            const int ii = 0;\n            for (; ii < view.Count;)\n            {\n                if (performUpdateType == PerformUpdateType.Insert)\n                {\n                    return StatusCodes.BadEntryExists;\n                }\n\n                // add record indicating it was replaced.\n                var modifiedRow = ArchiveItem.DataSet.Tables[1].NewRow();\n\n                modifiedRow[0] = view[ii].Row[0];\n                modifiedRow[1] = view[ii].Row[1];\n                modifiedRow[2] = view[ii].Row[2];\n                modifiedRow[3] = view[ii].Row[3];\n                modifiedRow[4] = view[ii].Row[4];\n                modifiedRow[5] = HistoryUpdateType.Replace;\n                modifiedRow[6] = GetModificationInfo(context, HistoryUpdateType.Replace);\n\n                ArchiveItem.DataSet.Tables[1].Rows.Add(modifiedRow);\n\n                replaced = true;\n                row = view[ii].Row;\n                break;\n            }\n\n            // add record indicating it was inserted.\n            if (!replaced)\n            {\n                if (performUpdateType == PerformUpdateType.Replace)\n                {\n                    return StatusCodes.BadNoEntryExists;\n                }\n\n                var modifiedRow = ArchiveItem.DataSet.Tables[1].NewRow();\n\n                modifiedRow[0] = value.SourceTimestamp;\n                modifiedRow[1] = value.ServerTimestamp;\n                modifiedRow[2] = value;\n\n                if (value.WrappedValue.TypeInfo != null)\n                {\n                    modifiedRow[3] = value.WrappedValue.TypeInfo.BuiltInType;\n                    modifiedRow[4] = value.WrappedValue.TypeInfo.ValueRank;\n                }\n                else\n                {\n                    modifiedRow[3] = BuiltInType.Variant;\n                    modifiedRow[4] = ValueRanks.Scalar;\n                }\n\n                modifiedRow[5] = HistoryUpdateType.Insert;\n                modifiedRow[6] = GetModificationInfo(context, HistoryUpdateType.Insert);\n\n                ArchiveItem.DataSet.Tables[1].Rows.Add(modifiedRow);\n\n                row = ArchiveItem.DataSet.Tables[0].NewRow();\n            }\n\n            // add/update new record.\n            row[0] = value.SourceTimestamp;\n            row[1] = value.ServerTimestamp;\n            row[2] = value;\n\n            if (value.WrappedValue.TypeInfo != null)\n            {\n                row[3] = value.WrappedValue.TypeInfo.BuiltInType;\n                row[4] = value.WrappedValue.TypeInfo.ValueRank;\n            }\n            else\n            {\n                row[3] = BuiltInType.Variant;\n                row[4] = ValueRanks.Scalar;\n            }\n\n            if (!replaced)\n            {\n                ArchiveItem.DataSet.Tables[0].Rows.Add(row);\n            }\n\n            // accept all changes.\n            ArchiveItem.DataSet.AcceptChanges();\n\n            return StatusCodes.Good;\n        }\n\n        /// <summary>\n        /// Updates the history.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"annotation\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"performUpdateType\"></param>\n        public uint UpdateAnnotations(SystemContext context, Annotation annotation, DataValue value, PerformUpdateType performUpdateType)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context is not null);\n            var replaced = false;\n\n            var filter = string.Format(System.Globalization.CultureInfo.InvariantCulture, \"SourceTimestamp = #{0}#\", value.SourceTimestamp);\n\n            var view = new DataView(\n                ArchiveItem.DataSet.Tables[2],\n                filter,\n                null,\n                DataViewRowState.CurrentRows);\n\n            DataRow row = null;\n\n            for (var ii = 0; ii < view.Count; ii++)\n            {\n                var current = (Annotation)view[ii].Row[5];\n\n                replaced = current.UserName == annotation.UserName;\n\n                if (performUpdateType == PerformUpdateType.Insert && replaced)\n                {\n                    return StatusCodes.BadEntryExists;\n                }\n\n                if (replaced)\n                {\n                    row = view[ii].Row;\n                    break;\n                }\n            }\n\n            // add record indicating it was inserted.\n            if (!replaced)\n            {\n                if (performUpdateType == PerformUpdateType.Replace || performUpdateType == PerformUpdateType.Remove)\n                {\n                    return StatusCodes.BadNoEntryExists;\n                }\n\n                row = ArchiveItem.DataSet.Tables[2].NewRow();\n            }\n\n            // add/update new record.\n            if (performUpdateType != PerformUpdateType.Remove)\n            {\n                row[0] = value.SourceTimestamp;\n                row[1] = value.ServerTimestamp;\n                row[2] = new DataValue(new ExtensionObject(annotation), StatusCodes.Good, value.SourceTimestamp, value.ServerTimestamp);\n                row[3] = BuiltInType.ExtensionObject;\n                row[4] = ValueRanks.Scalar;\n                row[5] = annotation;\n\n                if (!replaced)\n                {\n                    ArchiveItem.DataSet.Tables[2].Rows.Add(row);\n                }\n            }\n\n            // delete record.\n            else\n            {\n                row.Delete();\n            }\n\n            // accept all changes.\n            ArchiveItem.DataSet.AcceptChanges();\n\n            return StatusCodes.Good;\n        }\n\n        /// <summary>\n        /// Deletes a value from the history.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"sourceTimestamp\"></param>\n        public uint DeleteHistory(SystemContext context, DateTime sourceTimestamp)\n        {\n            var deleted = false;\n\n            var filter = string.Format(System.Globalization.CultureInfo.InvariantCulture, \"SourceTimestamp = #{0}#\", sourceTimestamp);\n\n            var view = new DataView(\n                ArchiveItem.DataSet.Tables[0],\n                filter,\n                null,\n                DataViewRowState.CurrentRows);\n\n            for (var ii = 0; ii < view.Count; ii++)\n            {\n                var modifiedRow = ArchiveItem.DataSet.Tables[1].NewRow();\n\n                modifiedRow[0] = view[ii].Row[0];\n                modifiedRow[1] = view[ii].Row[1];\n                modifiedRow[2] = view[ii].Row[2];\n                modifiedRow[3] = view[ii].Row[3];\n                modifiedRow[4] = view[ii].Row[4];\n                modifiedRow[5] = HistoryUpdateType.Delete;\n                modifiedRow[6] = GetModificationInfo(context, HistoryUpdateType.Delete);\n\n                view[ii].Row.Delete();\n\n                ArchiveItem.DataSet.Tables[1].Rows.Add(modifiedRow);\n                deleted = true;\n            }\n\n            if (!deleted)\n            {\n                return StatusCodes.BadNoEntryExists;\n            }\n\n            ArchiveItem.DataSet.AcceptChanges();\n            return StatusCodes.Good;\n        }\n\n        /// <summary>\n        /// Deletes a value from the history.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"startTime\"></param>\n        /// <param name=\"endTime\"></param>\n        /// <param name=\"isModified\"></param>\n        public uint DeleteHistory(SystemContext context, DateTime startTime, DateTime endTime, bool isModified)\n        {\n            // ensure time goes up.\n            if (endTime < startTime)\n            {\n                (endTime, startTime) = (startTime, endTime);\n            }\n\n            var filter = string.Format(\n                System.Globalization.CultureInfo.InvariantCulture,\n                \"SourceTimestamp >= #{0}# AND SourceTimestamp < #{1}#\",\n                startTime,\n                endTime);\n\n            // select the table.\n            var table = ArchiveItem.DataSet.Tables[0];\n\n            if (isModified)\n            {\n                table = ArchiveItem.DataSet.Tables[1];\n            }\n\n            // delete the values.\n            var view = new DataView(\n                table,\n                filter,\n                null,\n                DataViewRowState.CurrentRows);\n\n            var rowsToDelete = new List<DataRow>();\n\n            for (var ii = 0; ii < view.Count; ii++)\n            {\n                if (!isModified)\n                {\n                    var modifiedRow = ArchiveItem.DataSet.Tables[1].NewRow();\n\n                    modifiedRow[0] = view[ii].Row[0];\n                    modifiedRow[1] = view[ii].Row[1];\n                    modifiedRow[2] = view[ii].Row[2];\n                    modifiedRow[3] = view[ii].Row[3];\n                    modifiedRow[4] = view[ii].Row[4];\n                    modifiedRow[5] = HistoryUpdateType.Delete;\n                    modifiedRow[6] = GetModificationInfo(context, HistoryUpdateType.Delete);\n\n                    ArchiveItem.DataSet.Tables[1].Rows.Add(modifiedRow);\n                }\n\n                rowsToDelete.Add(view[ii].Row);\n            }\n\n            // delete rows.\n            foreach (var row in rowsToDelete)\n            {\n                row.Delete();\n            }\n\n            // commit all changes.\n            ArchiveItem.DataSet.AcceptChanges();\n\n            return StatusCodes.Good;\n        }\n\n        /// <summary>\n        /// Creates a modification info record.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"updateType\"></param>\n        private ModificationInfo GetModificationInfo(SystemContext context, HistoryUpdateType updateType)\n        {\n            var info = new ModificationInfo\n            {\n                UpdateType = updateType,\n                ModificationTime = _timeService.UtcNow\n            };\n\n            if (context.OperationContext?.UserIdentity != null)\n            {\n                info.UserName = context.OperationContext.UserIdentity.DisplayName;\n            }\n\n            return info;\n        }\n\n        /// <summary>\n        /// Reads the history for the specified time range.\n        /// </summary>\n        /// <param name=\"startTime\"></param>\n        /// <param name=\"endTime\"></param>\n        /// <param name=\"isModified\"></param>\n        public DataView ReadHistory(DateTime startTime, DateTime endTime, bool isModified)\n        {\n            return ReadHistory(startTime, endTime, isModified, null);\n        }\n\n        /// <summary>\n        /// Reads the history for the specified time range.\n        /// </summary>\n        /// <param name=\"startTime\"></param>\n        /// <param name=\"endTime\"></param>\n        /// <param name=\"isModified\"></param>\n        /// <param name=\"browseName\"></param>\n        public DataView ReadHistory(DateTime startTime, DateTime endTime, bool isModified, QualifiedName browseName)\n        {\n            if (startTime != DateTime.MinValue && endTime != DateTime.MaxValue)\n            {\n                //\n            }\n\n            if (isModified)\n            {\n                return ArchiveItem.DataSet.Tables[1].DefaultView;\n            }\n\n            if (browseName == BrowseNames.Annotations)\n            {\n                return ArchiveItem.DataSet.Tables[2].DefaultView;\n            }\n\n            return ArchiveItem.DataSet.Tables[0].DefaultView;\n        }\n\n        /// <summary>\n        /// Finds the value at or before the timestamp.\n        /// </summary>\n        /// <param name=\"view\"></param>\n        /// <param name=\"timestamp\"></param>\n        /// <param name=\"ignoreBad\"></param>\n        /// <param name=\"dataIgnored\"></param>\n        public int FindValueAtOrBefore(DataView view, DateTime timestamp, bool ignoreBad, out bool dataIgnored)\n        {\n            dataIgnored = false;\n\n            if (view.Count <= 0)\n            {\n                return -1;\n            }\n\n            var min = 0;\n            var max = view.Count;\n            var position = (max - min) / 2;\n\n            while (position >= 0 && position < view.Count)\n            {\n                var current = (DateTime)view[position].Row[0];\n\n                // check for exact match.\n                if (current == timestamp)\n                {\n                    // skip the first timestamp.\n                    while (position > 0 && (DateTime)view[position - 1].Row[0] == timestamp)\n                    {\n                        position--;\n                    }\n\n                    return position;\n                }\n\n                // move up.\n                if (current < timestamp)\n                {\n                    min = position + 1;\n                }\n\n                // move down.\n                if (current > timestamp)\n                {\n                    max = position - 1;\n                }\n\n                // not found.\n                if (max < min)\n                {\n                    // find the value before.\n                    while (position >= 0)\n                    {\n                        timestamp = (DateTime)view[position].Row[0];\n\n                        // skip the first timestamp in group.\n                        while (position > 0 && (DateTime)view[position - 1].Row[0] == timestamp)\n                        {\n                            position--;\n                        }\n\n                        // ignore bad data.\n                        if (ignoreBad)\n                        {\n                            var value = (DataValue)view[position].Row[2];\n\n                            if (StatusCode.IsBad(value.StatusCode))\n                            {\n                                position--;\n                                dataIgnored = true;\n                                continue;\n                            }\n                        }\n\n                        break;\n                    }\n\n                    // return the position.\n                    return position;\n                }\n\n                position = min + ((max - min) / 2);\n            }\n\n            return -1;\n        }\n\n        /// <summary>\n        /// Returns the next value after the current position.\n        /// </summary>\n        /// <param name=\"view\"></param>\n        /// <param name=\"position\"></param>\n        /// <param name=\"ignoreBad\"></param>\n        /// <param name=\"dataIgnored\"></param>\n        public int FindValueAfter(DataView view, int position, bool ignoreBad, out bool dataIgnored)\n        {\n            dataIgnored = false;\n\n            if (position < 0 || position >= view.Count)\n            {\n                return -1;\n            }\n\n            var timestamp = (DateTime)view[position].Row[0];\n\n            // skip the current timestamp.\n            while (position < view.Count && (DateTime)view[position].Row[0] == timestamp)\n            {\n                position++;\n            }\n\n            if (position >= view.Count)\n            {\n                return -1;\n            }\n\n            // find the value after.\n            while (position < view.Count)\n            {\n                _ = (DateTime)view[position].Row[0];\n\n                // ignore bad data.\n                if (ignoreBad)\n                {\n                    var value = (DataValue)view[position].Row[2];\n\n                    if (StatusCode.IsBad(value.StatusCode))\n                    {\n                        position++;\n                        dataIgnored = true;\n                        continue;\n                    }\n                }\n\n                break;\n            }\n\n            if (position >= view.Count)\n            {\n                return -1;\n            }\n\n            // return the position.\n            return position;\n        }\n\n        /// <summary>\n        /// Constructs a node identifier for a item object.\n        /// </summary>\n        /// <param name=\"filePath\"></param>\n        /// <param name=\"namespaceIndex\"></param>\n        public static NodeId ConstructId(string filePath, ushort namespaceIndex)\n        {\n            var parsedNodeId = new ParsedNodeId\n            {\n                RootId = filePath,\n                NamespaceIndex = namespaceIndex,\n                RootType = NodeTypes.Item\n            };\n\n            return parsedNodeId.Construct();\n        }\n\n        /// <summary>\n        /// The item in the archive.\n        /// </summary>\n        public ArchiveItem ArchiveItem { get; }\n\n        /// <summary>\n        /// The item in the archive.\n        /// </summary>\n        public int SubscribeCount { get; set; }\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            _annotations?.Dispose();\n            _configuration?.Dispose();\n        }\n\n        private readonly HistoricalDataConfigurationState _configuration;\n        private readonly PropertyState<Annotation> _annotations;\n        private readonly TimeService _timeService;\n        private List<DataValue> _pattern;\n        private int _patternIndex;\n        private DateTime _nextSampleTime;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/Boolean.txt",
    "content": "﻿Boolean,1,1,0,0,0,1,0,0,0,1,1\n10000,10000,0,0,,,Boolean,1\n20000,20000,0,0,,,Boolean,1\n30000,30000,0,0,,,Boolean,0\n40000,40000,0x80000000,0,,,Boolean,0\n50000,50000,0,0,,,Boolean,1\n60000,60000,0,0,,,Boolean,1\n70000,70000,0x40000000,0,,,Boolean,0\n80000,80000,0,0,,,Boolean,1\n90000,90000,0,0,,,Boolean,0"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/Byte.txt",
    "content": "﻿Byte,1,250,0,0,0,1,0,0,0,100,100\n10000,10000,0,0,,,Byte,11\n20000,20000,0,0,,,Byte,22\n30000,30000,0,0,,,Byte,33\n40000,40000,0x80000000,0,,,Byte,44\n50000,50000,0,0,,,Byte,55\n60000,60000,0,0,,,Byte,66\n70000,70000,0x40000000,0,,,Byte,77\n80000,80000,0,0,,,Byte,88\n90000,90000,0,0,,,Byte,99"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/DateTime.txt",
    "content": "﻿DateTime,-1,10000,0,0,0,0,0,0,1,100,100\n0,0,0x809B0000,0,,,Null\n2000,2000,0,0,,,DateTime,2013-10-18T16:24:13.000\n25000,25000,0,0,,,DateTime,2013-10-18T17:25:13.000\n28000,28000,0,0,,,DateTime,2013-10-18T18:26:13.575\n39000,39000,0,0,,,DateTime,2013-10-18T19:24:13.575\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,DateTime,2013-10-18T21:24:13.575\n52000,52000,0,0,,,DateTime,2013-10-18T12:30:13.575\n72000,72000,0,0,,,DateTime,2013-10-18T13:36:13.575\n77000,77000,0x40000000,0,,,DateTime,2013-10-18T14:24:13.575\n83000,83000,0,0,,,DateTime,2013-10-18T16:28:33.575\n86000,86000,0,0,,,DateTime,2013-10-18T18:24:13.575\n90000,90000,0,0,,,DateTime,2013-10-18T19:24:13.575"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/Double.txt",
    "content": "﻿Double,-1,1000,0,0,0,1,0,0,0,100,100\n10000,10000,0,0,,,Double,10.0\n20000,20000,0,0,,,Double,20.0\n30000,30000,0,0,,,Double,30.0\n40000,40000,0x80000000,0,,,Double,40.0\n50000,50000,0,0,,,Double,50.0\n60000,60000,0,0,,,Double,60.0\n70000,70000,0x40000000,0,,,Double,70.0\n80000,80000,0,0,,,Double,80.0\n90000,90000,0,0,,,Double,90.0"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/Float.txt",
    "content": "﻿Float,-1,1000,0,0,0,1,0,0,0,100,100\n10000,10000,0,0,,,Float,10.0\n20000,20000,0,0,,,Float,20.0\n30000,30000,0,0,,,Float,30.0\n40000,40000,0x80000000,0,,,Float,40.0\n50000,50000,0,0,,,Float,50.0\n60000,60000,0,0,,,Float,60.0\n70000,70000,0x40000000,0,,,Float,70.0\n80000,80000,0,0,,,Float,80.0\n90000,90000,0,0,,,Float,90.0"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/Int16.txt",
    "content": "﻿Int16,-1,1000,0,0,0,1,1,0,0,100,100\n10000,10000,0,0,,,Int16,10\n20000,20000,0,0,,,Int16,20\n30000,30000,0,0,,,Int16,30\n40000,40000,0x80000000,0,,,Int16,40\n50000,50000,0,0,,,Int16,50\n60000,60000,0,0,,,Int16,60\n70000,70000,0x40000000,0,,,Int16,70\n80000,80000,0,0,,,Int16,80\n90000,90000,0,0,,,Int16,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/Int32.txt",
    "content": "﻿Int32,-1,1000,0,0,0,1,1,0,0,100,100\n10000,10000,0,0,,,Int32,10\n20000,20000,0,0,,,Int32,20\n30000,30000,0,0,,,Int32,30\n40000,40000,0x80000000,0,,,Int32,40\n50000,50000,0,0,,,Int32,50\n60000,60000,0,0,,,Int32,60\n70000,70000,0x40000000,0,,,Int32,70\n80000,80000,0,0,,,Int32,80\n90000,90000,0,0,,,Int32,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/Int64.txt",
    "content": "﻿Int64,-1,1000,0,0,0,1,1,0,0,100,100\n10000,10000,0,0,,,Int64,10\n20000,20000,0,0,,,Int64,20\n30000,30000,0,0,,,Int64,30\n40000,40000,0x80000000,0,,,Int64,40\n50000,50000,0,0,,,Int64,50\n60000,60000,0,0,,,Int64,60\n70000,70000,0x40000000,0,,,Int64,70\n80000,80000,0,0,,,Int64,80\n90000,90000,0,0,,,Int64,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/SByte.txt",
    "content": "﻿SByte,-1,125,0,0,0,1,0,0,0,100,100\n10000,10000,0,0,,,SByte,11\n20000,20000,0,0,,,SByte,22\n30000,30000,0,0,,,SByte,33\n40000,40000,0x80000000,0,,,SByte,44\n50000,50000,0,0,,,SByte,55\n60000,60000,0,0,,,SByte,66\n70000,70000,0x40000000,0,,,SByte,77\n80000,80000,0,0,,,SByte,88\n90000,90000,0,0,,,SByte,99"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/String.txt",
    "content": "﻿String,-1,10000,0,0,0,0,0,0,1,100,100\n0,0,0x809B0000,0,,,Null\n2000,2000,0,0,,,String,abcd\n25000,25000,0,0,,,String,efgh\n28000,28000,0,0,,,String,ijkl\n39000,39000,0,0,,,String,mnop\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,String,qrst\n52000,52000,0,0,,,String,uvw\n72000,72000,0,0,,,String,xyza\n77000,77000,0x40000000,0,,,String,bcd\n83000,83000,0,0,,,String,egh\n86000,86000,0,0,,,String,sadga\n90000,90000,0,0,,,String,erfhrty"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/UInt16.txt",
    "content": "﻿UInt16,-1,1000,0,0,0,1,1,0,0,100,100\n10000,10000,0,0,,,UInt16,10\n20000,20000,0,0,,,UInt16,20\n30000,30000,0,0,,,UInt16,30\n40000,40000,0x80000000,0,,,UInt16,40\n50000,50000,0,0,,,UInt16,50\n60000,60000,0,0,,,UInt16,60\n70000,70000,0x40000000,0,,,UInt16,70\n80000,80000,0,0,,,UInt16,80\n90000,90000,0,0,,,UInt16,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/UInt32.txt",
    "content": "﻿UInt32,-1,1000,0,0,0,1,1,0,0,100,100\n10000,10000,0,0,,,UInt32,10\n20000,20000,0,0,,,UInt32,20\n30000,30000,0,0,,,UInt32,30\n40000,40000,0x80000000,0,,,UInt32,40\n50000,50000,0,0,,,UInt32,50\n60000,60000,0,0,,,UInt32,60\n70000,70000,0x40000000,0,,,UInt32,70\n80000,80000,0,0,,,UInt32,80\n90000,90000,0,0,,,UInt32,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Dynamic/UInt64.txt",
    "content": "﻿UInt64,-1,1000,0,0,0,1,1,0,0,100,100\n10000,10000,0,0,,,UInt64,10\n20000,20000,0,0,,,UInt64,20\n30000,30000,0,0,,,UInt64,30\n40000,40000,0x80000000,0,,,UInt64,40\n50000,50000,0,0,,,UInt64,50\n60000,60000,0,0,,,UInt64,60\n70000,70000,0x40000000,0,,,UInt64,70\n80000,80000,0,0,,,UInt64,80\n90000,90000,0,0,,,UInt64,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Boolean.txt",
    "content": "﻿Boolean,-1,10000,0,0,0,0,1,0,1,100,100\n2000,2000,0,0,,,Boolean,true\n25000,25000,0,0,,,Boolean,false\n28000,28000,0,0,,,Boolean,true\n39000,39000,0,0,,,Boolean,true\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,Boolean,true\n52000,52000,0,0,,,Boolean,false\n72000,72000,0,0,,,Boolean,false\n77000,77000,0x40000000,0,,,Boolean,true\n83000,83000,0,0,,,Boolean,true\n86000,86000,0,0,,,Boolean,false\n90000,90000,0,0,,,Boolean,true"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Byte.txt",
    "content": "﻿Byte,-1,10000,0,0,0,0,0,0,0,100,100\n10000,10000,0,0,,,Byte,250\n20000,20000,0,0,,,Byte,230\n30000,30000,0,0,,,Byte,150\n40000,40000,0x80000000,0,,,Byte,120\n40000,40000,0,-1,,,100000,Operator,Someone pulled the plug.\n50000,50000,0,0,,,Byte,100\n60000,60000,0,0,,,Byte,80\n70000,70000,0x40000000,0,,,Byte,70\n80000,80000,0,0,,,Byte,40\n90000,90000,0,0,,,Byte,20\n90000,90000,0,-1,,,100000,Operator,End of data collection."
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/ByteString.txt",
    "content": "﻿ByteString,-1,10000,0,0,0,0,1,0,1,100,100\n2000,2000,0,0,,,ByteString,00010203040506070809\n25000,25000,0,0,,,ByteString,00102030405060708090\n28000,28000,0,0,,,ByteString,01020304050607080900\n39000,39000,0,0,,,ByteString,10203040506070809000\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,ByteString,02030405060708090001\n52000,52000,0,0,,,ByteString,20304050607080900010\n72000,72000,0,0,,,ByteString,50607080900010203040\n77000,77000,0x40000000,0,,,ByteString,03040506070809000102\n83000,83000,0,0,,,ByteString,03040506070809001020\n86000,86000,0,0,,,ByteString,00010050607080920304\n90000,90000,0,0,,,ByteString,07080900010203040506"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/DateTime.txt",
    "content": "﻿DateTime,-1,10000,0,0,0,0,1,0,1,100,100\n2000,2000,0,0,,,DateTime,2013-10-18T16:24:13.000\n25000,25000,0,0,,,DateTime,2013-10-18T17:25:13.000\n28000,28000,0,0,,,DateTime,2013-10-18T18:26:13.575\n39000,39000,0,0,,,DateTime,2013-10-18T19:24:13.575\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,DateTime,2013-10-18T21:24:13.575\n52000,52000,0,0,,,DateTime,2013-10-18T12:30:13.575\n72000,72000,0,0,,,DateTime,2013-10-18T13:36:13.575\n77000,77000,0x40000000,0,,,DateTime,2013-10-18T14:24:13.575\n83000,83000,0,0,,,DateTime,2013-10-18T16:28:33.575\n86000,86000,0,0,,,DateTime,2013-10-18T18:24:13.575\n90000,90000,0,0,,,DateTime,2013-10-18T19:24:13.575"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Double.txt",
    "content": "﻿Double,-1,10000,0,0,0,0,0,0,0,100,100\n10000,10000,0,0,,,Double,10.0\n20000,20000,0,0,,,Double,20.0\n30000,30000,0,0,,,Double,30.0\n40000,40000,0x80000000,0,,,Double,40.0\n40000,40000,0,-1,,,100000,Operator,Someone pulled the plug.\n50000,50000,0,0,,,Double,50.0\n60000,60000,0,0,,,Double,60.0\n70000,70000,0x40000000,0,,,Double,70.0\n80000,80000,0,0,,,Double,80.0\n90000,90000,0,0,,,Double,90.0\n90000,90000,0,-1,,,100000,Operator,End of data collection."
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Float.txt",
    "content": "﻿Float,-1,10000,0,0,0,0,0,0,1,100,100\n2000,2000,0,0,,,Float,10\n25000,25000,0,0,,,Float,20\n28000,28000,0,0,,,Float,25\n39000,39000,0,0,,,Float,30\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,Float,4\n52000,52000,0,0,,,Float,50\n72000,72000,0,0,,,Float,60\n77000,77000,0x40000000,0,,,Float,70\n83000,83000,0,0,,,Float,70\n86000,86000,0,0,,,Float,80\n90000,90000,0,0,,,Float,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Historian1ExpectedData.csv",
    "content": "Time,Interopolated #1,,Interopolated #2,,Start Bounds,,End Bounds,,Average,,Time Average,,Time Average Bounds,,Count,,Total,,Time\n0,0,BR,0,BR,0,BR,0,BR,0,BR,0,BR,0,BR,0,GC,0,GC,0\n5,0,BR,0,BR,0,BR,10,GR,0,BR,0,BR,0,BR,0,GC,0,GC,5\n10,10,GR,10,GR,10,GR,15,GI,10,GC,12.5,GC,12.5,GC,1,GC,10,GC,10\n15,15,GI,15,GI,15,GI,20,GR,0,BR,17.5,GC,17.5,GC,0,GC,0,GC,15\n20,20,GR,20,GR,20,GR,25,GI,20,GC,22.5,GC,22.5,GC,1,GC,20,GC,20\n25,25,GI,25,GI,25,GI,30,GR,0,BR,27.5,GC,27.5,GC,0,GC,0,GC,25\n30,30,GR,30,GR,30,GR,30,UI,30,GC,32.5,GC,30,GC,1,GC,30,GC,30\n35,35,UI,35,UI,30,UI,0,BD,0,BR,37.5,UC,30,UC,0,GC,0,GC,35\n40,40,UI,40,UI,0,BD,0,BR,0,BR,42.5,UC,0,BR,0,GC,0,GC,40\n45,45,UI,45,UI,0,BR,50,GR,0,BR,47.5,UC,0,BR,0,GC,0,GC,45\n50,50,GR,50,GR,50,GR,55,GI,50,GC,52.5,GC,52.5,GC,1,GC,50,GC,50\n55,55,GI,55,GI,55,GI,60,GR,0,BR,57.5,GC,57.5,GC,0,GC,0,GC,55\n60,60,GR,60,GR,60,GR,65,UI,60,GC,62.5,GC,62.5,GC,1,GC,60,GC,60\n65,65,UI,65,UI,65,UI,70,UR,0,BR,67.5,UC,67.5,UC,0,GC,0,GC,65\n70,70,UR,70,UI,70,UR,75,UI,70,GC,72.5,UC,72.5,UC,1,GC,70,UC,70\n75,75,UI,75,UI,75,UI,80,GR,0,BR,77.5,UC,77.5,UC,0,GC,0,GC,75\n80,80,GR,80,GR,80,GR,85,GI,80,GC,82.5,GC,82.5,GC,1,GC,80,GC,80\n85,85,GI,85,GI,85,GI,90,GR,0,BR,87.5,GC,87.5,GC,0,GC,0,GC,85\n90,90,GR,90,GR,90,GR,0,BR,90,GC,92.5,UC,90,UC,1,GC,90,GC,90\n95,95,UI,95,UI,0,BR,0,BR,0,BR,97.5,UC,0,BR,0,GC,0,GC,95\n100,100,UI,100,UI,0,BR,0,BR,0,BR,105,UC,0,BR,0,GC,0,GC,100\n,,,,,,,,,,,,,,,,,,,\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Historian2ExpectedData.csv",
    "content": "Time,Interopolated #1,,Interopolated #2,,Start Bounds,,End Bounds,,Average,,Time Average,,Time Average Bounds,,Count,,Total,,Time\n0,0,BR,0,BR,0,BR,11.30434783,GI,10,UC,10.65217391,UC,10.65217391,UC,1,GC,10,GC,0\n5,11.30434783,GI,11.30434783,GI,11.30434783,GI,13.47826087,GI,0,BR,12.39130435,GC,12.39130435,GC,0,GC,0,GC,5\n10,13.47826087,GI,13.47826087,GI,13.47826087,GI,15.65217391,GI,0,BR,14.56521739,GC,14.56521739,GC,0,GC,0,GC,10\n15,15.65217391,GI,15.65217391,GI,15.65217391,GI,17.82608696,GI,0,BR,16.73913043,GC,16.73913043,GC,0,GC,0,GC,15\n20,17.82608696,GI,17.82608696,GI,17.82608696,GI,20,GR,0,BR,18.91304348,GC,18.91304348,GC,0,GC,0,GC,20\n25,20,GR,20,GR,20,GR,25.90909091,GI,22.5,GC,23.68181818,GC,23.68181818,GC,2,GC,45,GC,25\n30,25.90909091,GI,25.90909091,GI,25.90909091,GI,28.18181818,GI,0,BR,27.04545455,GC,27.04545455,GC,0,GC,0,GC,30\n35,28.18181818,GI,28.18181818,GI,28.18181818,GI,30,UI,30,GC,29.38383838,UC,29.27272727,UC,1,GC,30,GC,35\n40,31.11111111,UI,31.11111111,UI,30,UI,0,BR,0,BR,33.88888889,UC,30,UC,0,GC,0,UC,40\n45,36.66666667,UI,36.66666667,UI,0,BR,45,GI,40,UC,40,UC,42.5,UC,1,GC,40,GC,45\n50,45,GI,45,GI,45,GI,51.5,GI,50,GC,49.45,GC,49.45,GC,1,GC,50,GC,50\n55,51.5,GI,51.5,GI,51.5,GI,54,GI,0,BR,52.75,GC,52.75,GC,0,GC,0,GC,55\n60,54,GI,54,GI,54,GI,56.5,GI,0,BR,55.25,GC,55.25,GC,0,GC,0,GC,60\n65,56.5,GI,56.5,GI,56.5,GI,59,GI,0,BR,57.75,GC,57.75,GC,0,GC,0,GC,65\n70,59,GI,59,GI,59,GI,60,UI,60,GC,60.61818182,UC,59.8,UC,1,GC,60,GC,70\n75,62.72727273,UI,66,UI,60,UI,0,BR,0,BR,65,UC,60,UC,0,GC,0,UC,75\n80,67.27272727,UI,70,UI,0,BR,76.66666667,GI,70,UC,70.51515152,UC,73.33333333,UC,1,GC,70,GC,80\n85,76.66666667,GI,76.66666667,GI,76.66666667,GI,90,GR,80,GC,83.66666667,GC,83.66666667,GC,1,GC,80,GC,85\n90,90,GR,90,GR,90,GR,0,BR,90,GC,96.25,UC,90,UC,1,GC,90,GC,90\n95,102.5,UI,102.5,UI,0,BR,0,BR,0,BR,108.75,UC,0,BR,0,GC,0,GC,95\n100,115,UI,115,UI,0,BR,0,BR,0,BR,117.5,UC,0,BR,0,GC,0,GC,100\n,,,,,,,,,,,,,,,,,,,\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Historian3ExpectedData.csv",
    "content": "Time,Interopolated #1,,Interopolated #2,,Start Bounds,,End Bounds,,Average,,Time Average,,Time Average Bounds,,Count,,Total,\n0,0,BR,0,BR,0,BR,10,GI,10,UC,10,UC,10,UC,1,GC,10,GC\n5,10,GI,10,GI,10,GI,10,GI,0,BR,10,GC,10,GC,0,GC,0,GC\n10,10,GI,10,GI,10,GI,10,GI,0,BR,10,GC,10,GC,0,GC,0,GC\n15,10,GI,10,GI,10,GI,10,GI,0,BR,10,GC,10,GC,0,GC,0,GC\n20,10,GI,10,GI,10,GI,20,GR,0,BR,10,GC,10,GC,0,GC,0,GC\n25,20,GR,20,GR,20,GR,25,GI,22.5,GC,22,GC,22,GC,2,GC,45,GC\n30,25,GI,25,GI,25,GI,25,GI,0,BR,25,GC,25,GC,0,GC,0,GC\n35,25,GI,25,GI,25,GI,30,GI,30,GC,26,GC,26,GC,1,GC,30,GC\n40,30,GI,30,GI,30,GI,0,BR,0,BR,30,UC,30,UC,0,GC,0,UC\n45,30,UI,30,UI,0,BR,40,GI,40,UC,34,UC,40,UC,1,GC,40,GC\n50,40,GI,40,GI,40,GI,50,GI,50,GC,46,GC,46,GC,1,GC,50,GC\n55,50,GI,50,GI,50,GI,50,GI,0,BR,50,GC,50,GC,0,GC,0,GC\n60,50,GI,50,GI,50,GI,50,GI,0,BR,50,GC,50,GC,0,GC,0,GC\n65,50,GI,50,GI,50,GI,50,GI,0,BR,50,GC,50,GC,0,GC,0,GC\n70,50,GI,50,GI,50,GI,60,GI,60,GC,56,GC,56,GC,1,GC,60,GC\n75,60,GI,60,GI,60,GI,0,BR,0,BR,60,UC,60,UC,0,GC,0,UC\n80,60,UI,70,UI,0,BR,70,GI,70,UC,64,UC,70,UC,1,GC,70,GC\n85,70,GI,70,GI,70,GI,90,GR,80,GC,78,GC,78,GC,1,GC,80,GC\n90,90,GR,90,GR,90,GR,0,BR,90,GC,90,UC,90,UC,1,GC,90,GC\n95,90,UI,90,UI,0,BR,0,BR,0,BR,90,UC,0,BR,0,GC,0,GC\n100,90,UI,90,UI,0,BR,0,BR,0,BR,90,UC,0,BR,0,GC,0,GC\n,,,,,,,,,,,,,,,,,,\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Int16.txt",
    "content": "﻿Int16,-1,10000,0,0,0,0,0,0,1,100,100\n2000,2000,0,0,,,Int16,10\n25000,25000,0,0,,,Int16,20\n28000,28000,0,0,,,Int16,25\n39000,39000,0,0,,,Int16,30\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,Int16,4\n52000,52000,0,0,,,Int16,50\n72000,72000,0,0,,,Int16,60\n77000,77000,0x40000000,0,,,Int16,70\n83000,83000,0,0,,,Int16,70\n86000,86000,0,0,,,Int16,80\n90000,90000,0,0,,,Int16,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Int32.txt",
    "content": "﻿Int32,-1,10000,0,0,0,0,1,0,1,100,100\n2000,2000,0,0,,,Int32,10\n25000,25000,0,0,,,Int32,20\n28000,28000,0,0,,,Int32,25\n39000,39000,0,0,,,Int32,30\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,Int32,40\n52000,52000,0,0,,,Int32,50\n72000,72000,0,0,,,Int32,60\n77000,77000,0x40000000,0,,,Int32,70\n83000,83000,0,0,,,Int32,70\n86000,86000,0,0,,,Int32,80\n90000,90000,0,0,,,Int32,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/Int64.txt",
    "content": "﻿Int64,-1,10000,0,0,0,0,1,0,1,100,100\n2000,2000,0,0,,,Int64,10\n25000,25000,0,0,,,Int64,20\n28000,28000,0,0,,,Int64,25\n39000,39000,0,0,,,Int64,30\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,Int64,40\n52000,52000,0,0,,,Int64,50\n72000,72000,0,0,,,Int64,60\n77000,77000,0x40000000,0,,,Int64,70\n83000,83000,0,0,,,Int64,70\n86000,86000,0,0,,,Int64,80\n90000,90000,0,0,,,Int64,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/SByte.txt",
    "content": "﻿SByte,-1,10000,0,0,0,0,1,0,1,100,100\n2000,2000,0,0,,,SByte,10\n25000,25000,0,0,,,SByte,20\n28000,28000,0,0,,,SByte,25\n39000,39000,0,0,,,SByte,30\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,SByte,40\n52000,52000,0,0,,,SByte,50\n72000,72000,0,0,,,SByte,60\n77000,77000,0x40000000,0,,,SByte,70\n83000,83000,0,0,,,SByte,70\n86000,86000,0,0,,,SByte,80\n90000,90000,0,0,,,SByte,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/String.txt",
    "content": "﻿String,-1,10000,0,0,0,0,1,0,1,100,100\n2000,2000,0,0,,,String,jasOEWUT\n25000,25000,0,0,,,String,JWYEJFDLJA\n28000,28000,0,0,,,String,UFDfdc'po\n39000,39000,0,0,,,String,wueyd20897\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,String,jedf;ocv\n52000,52000,0,0,,,String,e;jphg\n72000,72000,0,0,,,String,shjdj\n77000,77000,0x40000000,0,,,String,poewdrc\n83000,83000,0,0,,,String,ouepofg\n86000,86000,0,0,,,String,eglogf\n90000,90000,0,0,,,String,wetrc"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/UInt16.txt",
    "content": "﻿UInt16,-1,10000,0,0,0,0,0,0,1,100,100\n2000,2000,0,0,,,UInt16,10\n25000,25000,0,0,,,UInt16,20\n28000,28000,0,0,,,UInt16,25\n39000,39000,0,0,,,UInt16,30\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,UInt16,4\n52000,52000,0,0,,,UInt16,50\n72000,72000,0,0,,,UInt16,60\n77000,77000,0x40000000,0,,,UInt16,70\n83000,83000,0,0,,,UInt16,70\n86000,86000,0,0,,,UInt16,80\n90000,90000,0,0,,,UInt16,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/UInt32.txt",
    "content": "﻿UInt32,-1,10000,0,0,0,0,0,0,1,100,100\n2000,2000,0,0,,,UInt32,10\n25000,25000,0,0,,,UInt32,20\n28000,28000,0,0,,,UInt32,25\n39000,39000,0,0,,,UInt32,30\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,UInt32,4\n52000,52000,0,0,,,UInt32,50\n72000,72000,0,0,,,UInt32,60\n77000,77000,0x40000000,0,,,UInt32,70\n83000,83000,0,0,,,UInt32,70\n86000,86000,0,0,,,UInt32,80\n90000,90000,0,0,,,UInt32,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Data/Sample/UInt64.txt",
    "content": "﻿UInt64,-1,10000,0,0,0,0,0,0,1,100,100\n2000,2000,0,0,,,UInt64,10\n25000,25000,0,0,,,UInt64,20\n28000,28000,0,0,,,UInt64,25\n39000,39000,0,0,,,UInt64,30\n42000,42000,0x80000000,0,,,Null\n48000,48000,0,0,,,UInt64,4\n52000,52000,0,0,,,UInt64,50\n72000,72000,0,0,,,UInt64,60\n77000,77000,0x40000000,0,,,UInt64,70\n83000,83000,0,0,,,UInt64,70\n86000,86000,0,0,,,UInt64,80\n90000,90000,0,0,,,UInt64,90"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/DataFileReader.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Data;\n    using System.Globalization;\n    using System.IO;\n    using System.Text;\n    using System.Xml;\n\n    /// <summary>\n    /// Reads an item history from a file.\n    /// </summary>\n    public class DataFileReader\n    {\n        private readonly TimeService _timeService;\n\n        public DataFileReader(TimeService timeService)\n        {\n            _timeService = timeService;\n        }\n\n        /// <summary>\n        /// Creates a new data set.\n        /// </summary>\n        private DataSet CreateDataSet()\n        {\n            var dataset = new DataSet();\n\n            dataset.Tables.Add(\"CurrentData\");\n\n            dataset.Tables[0].Columns.Add(\"SourceTimestamp\", typeof(DateTime));\n            dataset.Tables[0].Columns.Add(\"ServerTimestamp\", typeof(DateTime));\n            dataset.Tables[0].Columns.Add(\"Value\", typeof(DataValue));\n            dataset.Tables[0].Columns.Add(\"DataType\", typeof(BuiltInType));\n            dataset.Tables[0].Columns.Add(\"ValueRank\", typeof(int));\n\n            dataset.Tables[0].DefaultView.Sort = \"SourceTimestamp\";\n\n            dataset.Tables.Add(\"ModifiedData\");\n\n            dataset.Tables[1].Columns.Add(\"SourceTimestamp\", typeof(DateTime));\n            dataset.Tables[1].Columns.Add(\"ServerTimestamp\", typeof(DateTime));\n            dataset.Tables[1].Columns.Add(\"Value\", typeof(DataValue));\n            dataset.Tables[1].Columns.Add(\"DataType\", typeof(BuiltInType));\n            dataset.Tables[1].Columns.Add(\"ValueRank\", typeof(int));\n            dataset.Tables[1].Columns.Add(\"UpdateType\", typeof(int));\n            dataset.Tables[1].Columns.Add(\"ModificationInfo\", typeof(ModificationInfo));\n\n            dataset.Tables[1].DefaultView.Sort = \"SourceTimestamp\";\n\n            dataset.Tables.Add(\"AnnotationData\");\n\n            dataset.Tables[2].Columns.Add(\"SourceTimestamp\", typeof(DateTime));\n            dataset.Tables[2].Columns.Add(\"ServerTimestamp\", typeof(DateTime));\n            dataset.Tables[2].Columns.Add(\"Value\", typeof(DataValue));\n            dataset.Tables[2].Columns.Add(\"DataType\", typeof(BuiltInType));\n            dataset.Tables[2].Columns.Add(\"ValueRank\", typeof(int));\n            dataset.Tables[2].Columns.Add(\"Annotation\", typeof(Annotation));\n\n            dataset.Tables[2].DefaultView.Sort = \"SourceTimestamp\";\n\n            return dataset;\n        }\n\n#pragma warning disable IDE0079 // Remove unnecessary suppression\n#pragma warning disable IDE0060 // Remove unused parameter\n        /// <summary>\n        /// Loads the item configuaration.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"item\"></param>\n        public bool LoadConfiguration(ISystemContext context, ArchiveItem item)\n#pragma warning restore IDE0060 // Remove unused parameter\n#pragma warning restore IDE0079 // Remove unnecessary suppression\n        {\n            using var reader = item.OpenArchive();\n            while (!reader.EndOfStream)\n            {\n                var line = reader.ReadLine();\n\n                // check for end or error.\n                if (line == null)\n                {\n                    break;\n                }\n\n                // ignore blank lines.\n                line = line.Trim();\n\n                if (string.IsNullOrEmpty(line))\n                {\n                    continue;\n                }\n\n                // ignore commented out lines.\n                if (line.StartsWith(\"//\", StringComparison.CurrentCulture))\n                {\n                    continue;\n                }\n\n                // get data type.\n                if (!ExtractField(1, ref line, out BuiltInType dataType))\n                {\n                    return false;\n                }\n\n                // get value rank.\n                if (!ExtractField(1, ref line, out\n                int valueRank))\n                {\n                    return false;\n                }\n\n                // get sampling interval.\n                if (!ExtractField(1, ref line, out int samplingInterval))\n                {\n                    return false;\n                }\n\n                // get simulation type.\n                if (!ExtractField(1, ref line, out int simulationType))\n                {\n                    return false;\n                }\n\n                // get simulation amplitude.\n                if (!ExtractField(1, ref line, out int amplitude))\n                {\n                    return false;\n                }\n\n                // get simulation period.\n                if (!ExtractField(1, ref line, out int period))\n                {\n                    return false;\n                }\n\n                // get flag indicating whether new data is generated.\n                if (!ExtractField(1, ref line, out int archiving))\n                {\n                    return false;\n                }\n\n                // get flag indicating whether stepped interpolation is used.\n                if (!ExtractField(1, ref line, out int stepped))\n                {\n                    return false;\n                }\n\n                // get flag indicating whether sloped interpolation should be used.\n                if (!ExtractField(1, ref line, out int useSlopedExtrapolation))\n                {\n                    return false;\n                }\n\n                // get flag indicating whether sloped interpolation should be used.\n                if (!ExtractField(1, ref line, out int treatUncertainAsBad))\n                {\n                    return false;\n                }\n\n                // get the maximum permitted of bad data in an interval.\n                if (!ExtractField(1, ref line, out int percentDataBad))\n                {\n                    return false;\n                }\n\n                // get the minimum amount of good data in an interval.\n                if (!ExtractField(1, ref line, out int percentDataGood))\n                {\n                    return false;\n                }\n\n                // update the item.\n                item.DataType = dataType;\n                item.ValueRank = valueRank;\n                item.SimulationType = simulationType;\n                item.Amplitude = amplitude;\n                item.Period = period;\n                item.SamplingInterval = samplingInterval;\n                item.Archiving = archiving != 0;\n                item.Stepped = stepped != 0;\n                item.AggregateConfiguration = new AggregateConfiguration\n                {\n                    UseServerCapabilitiesDefaults = false,\n                    UseSlopedExtrapolation = useSlopedExtrapolation != 0,\n                    TreatUncertainAsBad = treatUncertainAsBad != 0,\n                    PercentDataBad = (byte)percentDataBad,\n                    PercentDataGood = (byte)percentDataGood\n                };\n                break;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Creates new data.\n        /// </summary>\n        /// <param name=\"item\"></param>\n        public void CreateData(ArchiveItem item)\n        {\n            // get the data set to use.\n            var dataset = item.DataSet ?? CreateDataSet();\n\n            // generate one hour worth of data by default.\n            var startTime = _timeService.UtcNow.AddHours(-1);\n            startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0, DateTimeKind.Utc);\n\n            // check for existing data.\n            if (dataset.Tables[0].Rows.Count > 0)\n            {\n                var index = dataset.Tables[0].DefaultView.Count;\n                _ = (DateTime)dataset.Tables[0].DefaultView[index - 1].Row[0];\n                _ = startTime.AddMilliseconds(item.SamplingInterval);\n            }\n\n            var currentTime = startTime;\n            var generator = new TestDataGenerator();\n\n            var endTime = startTime.AddHours(1);\n            while (currentTime < endTime)\n            {\n                var dataValue = new DataValue\n                {\n                    SourceTimestamp = currentTime,\n                    ServerTimestamp = currentTime,\n                    StatusCode = StatusCodes.Good\n                };\n\n                // generate random value.\n                if (item.ValueRank < 0)\n                {\n                    dataValue.Value = generator.GetRandom(item.DataType);\n                }\n                else\n                {\n                    dataValue.Value = generator.GetRandomArray(item.DataType, 10, false);\n                }\n\n                // add record to table.\n                var row = dataset.Tables[0].NewRow();\n\n                row[0] = dataValue.SourceTimestamp;\n                row[1] = dataValue.ServerTimestamp;\n                row[2] = dataValue;\n                row[3] = dataValue.WrappedValue.TypeInfo.BuiltInType;\n                row[4] = dataValue.WrappedValue.TypeInfo.ValueRank;\n\n                dataset.Tables[0].Rows.Add(row);\n\n                // increment timestamp.\n                currentTime = currentTime.AddMilliseconds(item.SamplingInterval);\n            }\n\n            dataset.AcceptChanges();\n            item.DataSet = dataset;\n        }\n\n        /// <summary>\n        /// Loads the history for the item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"item\"></param>\n        public void LoadHistoryData(ISystemContext context, ArchiveItem item)\n        {\n            // use the beginning of the current hour for the baseline.\n            var baseline = _timeService.UtcNow;\n            baseline = new DateTime(baseline.Year, baseline.Month, baseline.Day, baseline.Hour, 0, 0, DateTimeKind.Utc);\n\n            using (var reader = item.OpenArchive())\n            {\n                // skip configuration line.\n                reader.ReadLine();\n                item.DataSet = LoadData(context, baseline, reader);\n            }\n\n            // create a random dataset if nothing found in the archive,\n            if (item.DataSet == null || item.DataSet.Tables[0].Rows.Count == 0)\n            {\n                CreateData(item);\n            }\n\n            // update the timestamp.\n            item.LastLoadTime = _timeService.UtcNow;\n        }\n\n        /// <summary>\n        /// Loads the history data from a stream.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"baseline\"></param>\n        /// <param name=\"reader\"></param>\n        private DataSet LoadData(ISystemContext context, DateTime baseline, StreamReader reader)\n        {\n            var dataset = CreateDataSet();\n\n            var messageContext = new ServiceMessageContext();\n\n            if (context != null)\n            {\n                messageContext.NamespaceUris = context.NamespaceUris;\n                messageContext.ServerUris = context.ServerUris;\n                messageContext.Factory = context.EncodeableFactory;\n            }\n            else\n            {\n                messageContext.NamespaceUris = ServiceMessageContext.GlobalContext.NamespaceUris;\n                messageContext.ServerUris = ServiceMessageContext.GlobalContext.ServerUris;\n                messageContext.Factory = ServiceMessageContext.GlobalContext.Factory;\n            }\n\n            var valueType = BuiltInType.String;\n            var value = Variant.Null;\n            var annotationTimeOffet = 0;\n            var annotationUser = string.Empty;\n            var annotationMessage = string.Empty;\n            var lineCount = 0;\n\n            while (!reader.EndOfStream)\n            {\n                var line = reader.ReadLine();\n\n                // check for end or error.\n                if (line == null)\n                {\n                    break;\n                }\n\n                // ignore blank lines.\n                line = line.Trim();\n                lineCount++;\n\n                if (string.IsNullOrEmpty(line))\n                {\n                    continue;\n                }\n\n                // ignore commented out lines.\n                if (line.StartsWith(\"//\", StringComparison.CurrentCulture))\n                {\n                    continue;\n                }\n\n                // get source time.\n                if (!ExtractField(lineCount, ref line, out int sourceTimeOffset))\n                {\n                    continue;\n                }\n\n                // get server time.\n                if (!ExtractField(lineCount, ref line, out int serverTimeOffset))\n                {\n                    continue;\n                }\n\n                // get status code.\n                if (!ExtractField(lineCount, ref line, out StatusCode status))\n                {\n                    continue;\n                }\n\n                // get modification type.\n                if (!ExtractField(lineCount, ref line, out\n                int recordType))\n                {\n                    continue;\n                }\n\n                // get modification time.\n                if (!ExtractField(lineCount, ref line, out\n                int modificationTimeOffet))\n                {\n                    continue;\n                }\n\n                // get modification user.\n                if (!ExtractField(ref line, out var modificationUser))\n                {\n                    continue;\n                }\n\n                if (recordType >= 0)\n                {\n                    // get value type.\n                    if (!ExtractField(lineCount, ref line, out valueType))\n                    {\n                        continue;\n                    }\n\n                    // get value.\n                    if (!ExtractField(lineCount, ref line, messageContext, valueType, out value))\n                    {\n                        continue;\n                    }\n                }\n                else\n                {\n                    // get annotation time.\n                    if (!ExtractField(lineCount, ref line, out annotationTimeOffet))\n                    {\n                        continue;\n                    }\n\n                    // get annotation user.\n                    if (!ExtractField(ref line, out annotationUser))\n                    {\n                        continue;\n                    }\n\n                    // get annotation message.\n                    if (!ExtractField(ref line, out annotationMessage))\n                    {\n                        continue;\n                    }\n                }\n\n                // add values to data table.\n                var dataValue = new DataValue\n                {\n                    WrappedValue = value,\n                    SourceTimestamp = baseline.AddMilliseconds(sourceTimeOffset),\n                    ServerTimestamp = baseline.AddMilliseconds(serverTimeOffset),\n                    StatusCode = status\n                };\n\n                DataRow row;\n                if (recordType == 0)\n                {\n                    row = dataset.Tables[0].NewRow();\n\n                    row[0] = dataValue.SourceTimestamp;\n                    row[1] = dataValue.ServerTimestamp;\n                    row[2] = dataValue;\n                    row[3] = valueType;\n                    row[4] = (value.TypeInfo != null) ? value.TypeInfo.ValueRank : ValueRanks.Any;\n\n                    dataset.Tables[0].Rows.Add(row);\n                }\n                else if (recordType > 0)\n                {\n                    row = dataset.Tables[1].NewRow();\n\n                    row[0] = dataValue.SourceTimestamp;\n                    row[1] = dataValue.ServerTimestamp;\n                    row[2] = dataValue;\n                    row[3] = valueType;\n                    row[4] = (value.TypeInfo != null) ? value.TypeInfo.ValueRank : ValueRanks.Any;\n                    row[5] = recordType;\n\n                    row[6] = new ModificationInfo\n                    {\n                        UpdateType = (HistoryUpdateType)recordType,\n                        ModificationTime = baseline.AddMilliseconds(modificationTimeOffet),\n                        UserName = modificationUser\n                    };\n\n                    dataset.Tables[1].Rows.Add(row);\n                }\n                else if (recordType < 0)\n                {\n                    row = dataset.Tables[2].NewRow();\n\n                    var annotation = new Annotation\n                    {\n                        AnnotationTime = baseline.AddMilliseconds(annotationTimeOffet),\n                        UserName = annotationUser,\n                        Message = annotationMessage\n                    };\n                    dataValue.WrappedValue = new ExtensionObject(annotation);\n\n                    row[0] = dataValue.SourceTimestamp;\n                    row[1] = dataValue.ServerTimestamp;\n                    row[2] = dataValue;\n                    row[3] = valueType;\n                    row[4] = (value.TypeInfo != null) ? value.TypeInfo.ValueRank : ValueRanks.Any;\n                    row[5] = annotation;\n\n                    dataset.Tables[2].Rows.Add(row);\n                }\n\n                dataset.AcceptChanges();\n            }\n\n            return dataset;\n        }\n\n        /// <summary>\n        /// Extracts the next comma seperated field from the line.\n        /// </summary>\n        /// <param name=\"line\"></param>\n        private string ExtractField(ref string line)\n        {\n            var field = line;\n            var index = field.IndexOf(',');\n\n            if (index >= 0)\n            {\n                field = field[..index];\n                line = line[(index + 1)..];\n            }\n\n            field = field.Trim();\n\n            if (string.IsNullOrEmpty(field))\n            {\n                return null;\n            }\n\n            return field;\n        }\n\n        /// <summary>\n        /// Extracts an integer value from the line.\n        /// </summary>\n        /// <param name=\"line\"></param>\n        /// <param name=\"value\"></param>\n        private bool ExtractField(ref string line, out string value)\n        {\n            value = string.Empty;\n            var field = ExtractField(ref line);\n\n            if (field == null)\n            {\n                return true;\n            }\n\n            value = field;\n            return true;\n        }\n\n        /// <summary>\n        /// Extracts an integer value from the line.\n        /// </summary>\n        /// <param name=\"lineCount\"></param>\n        /// <param name=\"line\"></param>\n        /// <param name=\"value\"></param>\n        private bool ExtractField(int lineCount, ref string line, out int value)\n        {\n            value = 0;\n            var field = ExtractField(ref line);\n\n            if (field == null)\n            {\n                return true;\n            }\n\n            try\n            {\n                value = Convert.ToInt32(field);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(\"PARSE ERROR [Line:{0}] - '{1}': {2}\", lineCount, field, e.Message);\n                return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Extracts a StatusCode value from the line.\n        /// </summary>\n        /// <param name=\"lineCount\"></param>\n        /// <param name=\"line\"></param>\n        /// <param name=\"value\"></param>\n        private bool ExtractField(int lineCount, ref string line, out StatusCode value)\n        {\n            value = 0;\n            var field = ExtractField(ref line);\n\n            if (field == null)\n            {\n                return true;\n            }\n\n            if (field.StartsWith(\"0x\", StringComparison.CurrentCulture))\n            {\n                field = field[2..];\n            }\n\n            try\n            {\n                var code = Convert.ToUInt32(field, 16);\n                value = new StatusCode(code);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(\"PARSE ERROR [Line:{0}] - '{1}': {2}\", lineCount, field, e.Message);\n                return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Extracts a BuiltInType value from the line.\n        /// </summary>\n        /// <param name=\"lineCount\"></param>\n        /// <param name=\"line\"></param>\n        /// <param name=\"value\"></param>\n        private bool ExtractField(int lineCount, ref string line, out BuiltInType value)\n        {\n            value = BuiltInType.String;\n            var field = ExtractField(ref line);\n\n            if (field == null)\n            {\n                return true;\n            }\n\n            try\n            {\n                value = Enum.Parse<BuiltInType>(field);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(\"PARSE ERROR [Line:{0}] - '{1}': {2}\", lineCount, field, e.Message);\n                return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Extracts a BuiltInType value from the line.\n        /// </summary>\n        /// <param name=\"lineCount\"></param>\n        /// <param name=\"line\"></param>\n        /// <param name=\"context\"></param>\n        /// <param name=\"valueType\"></param>\n        /// <param name=\"value\"></param>\n        private static bool ExtractField(int lineCount, ref string line,\n            IServiceMessageContext context, BuiltInType valueType, out Variant value)\n        {\n            value = Variant.Null;\n            var field = line;\n\n            if (field == null)\n            {\n                return true;\n            }\n\n            if (valueType == BuiltInType.Null)\n            {\n                return true;\n            }\n\n            var builder = new StringBuilder()\n                .AppendFormat(CultureInfo.InvariantCulture, \"<Value xmlns=\\\"{0}\\\">\", Opc.Ua.Namespaces.OpcUaXsd)\n                .AppendFormat(CultureInfo.InvariantCulture, \"<{0}>\", valueType)\n                .Append(line)\n                .AppendFormat(CultureInfo.InvariantCulture, \"</{0}>\", valueType)\n                .Append(\"</Value>\");\n\n            var document = new XmlDocument\n            {\n                InnerXml = builder.ToString()\n            };\n\n            XmlDecoder decoder = null;\n            try\n            {\n                decoder = new XmlDecoder(document.DocumentElement, context);\n                value = decoder.ReadVariant(null);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(\"PARSE ERROR [Line:{0}] - '{1}': {2}\", lineCount, field, e.Message);\n                return false;\n            }\n            finally\n            {\n                decoder?.Dispose();\n            }\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/HistoricalAccessNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Data;\n    using System.Reflection;\n    using System.Threading;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class HistoricalAccessServerNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"timeService\"></param>\n        public HistoricalAccessServerNodeManager(IServerInternal server, ApplicationConfiguration configuration, TimeService timeService)\n        :\n            base(server, configuration, Namespaces.HistoricalAccess)\n        {\n            AliasRoot = \"HDA\";\n\n            // get the configuration for the node manager.\n            _configuration = configuration.ParseExtension<HistoricalAccessServerConfiguration>();\n\n            // use suitable defaults if no configuration exists.\n            _configuration ??= new HistoricalAccessServerConfiguration\n            {\n                ArchiveRoot = \"Historian\"\n            };\n\n            _timeService = timeService;\n            SystemContext.SystemHandle = _system = new UnderlyingSystem(_configuration, NamespaceIndex, timeService);\n            SystemContext.NodeIdFactory = this;\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _simulationTimer != null)\n            {\n                _simulationTimer.Dispose();\n                _simulationTimer = null;\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The node.</param>\n        /// <returns>The new NodeId.</returns>\n        /// <remarks>\n        /// This method is called by the NodeState.Create() method which initializes a Node from\n        /// the type model. During initialization a number of child nodes are created and need to\n        /// have NodeIds assigned to them. This implementation constructs NodeIds by constructing\n        /// strings. Other implementations could assign unique integers or Guids and save the new\n        /// Node in a dictionary for later lookup.\n        /// </remarks>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            if (node is BaseInstanceState instance && instance.Parent != null)\n            {\n                return NodeTypes.ConstructIdForComponent(instance, instance.Parent.NodeId.NamespaceIndex);\n            }\n\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Server.DiagnosticsLock)\n            {\n                var capabilities = Server.DiagnosticsNodeManager.GetDefaultHistoryCapabilities();\n                capabilities.AccessHistoryDataCapability.Value = true;\n                capabilities.InsertDataCapability.Value = true;\n                capabilities.ReplaceDataCapability.Value = true;\n                capabilities.UpdateDataCapability.Value = true;\n                capabilities.DeleteRawCapability.Value = true;\n                capabilities.DeleteAtTimeCapability.Value = true;\n                capabilities.InsertAnnotationCapability.Value = true;\n            }\n\n            lock (Lock)\n            {\n                if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out var references))\n                {\n                    externalReferences[ObjectIds.ObjectsFolder] = references = [];\n                }\n\n                var root = _system.GetFolderState(string.Empty);\n                references.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, root.NodeId));\n                root.AddReference(ReferenceTypeIds.Organizes, true, ObjectIds.ObjectsFolder);\n\n                CreateFolderFromResources(root, \"Sample\");\n                // CreateFolderFromResources(root, \"Dynamic\");\n            }\n        }\n\n        /// <summary>\n        /// Creates items from embedded resources.\n        /// </summary>\n        /// <param name=\"root\"></param>\n        /// <param name=\"folderName\"></param>\n        private void CreateFolderFromResources(NodeState root, string folderName)\n        {\n            var dataFolder = new FolderState(root)\n            {\n                ReferenceTypeId = ReferenceTypeIds.Organizes,\n                TypeDefinitionId = ObjectTypeIds.FolderType,\n                NodeId = new NodeId(folderName, NamespaceIndex),\n                BrowseName = new QualifiedName(folderName, NamespaceIndex)\n            };\n            dataFolder.DisplayName = dataFolder.BrowseName.Name;\n            dataFolder.WriteMask = AttributeWriteMask.None;\n            dataFolder.UserWriteMask = AttributeWriteMask.None;\n            dataFolder.EventNotifier = EventNotifiers.None;\n            root.AddChild(dataFolder);\n            AddPredefinedNode(SystemContext, root);\n\n            var type = GetType().GetTypeInfo();\n            foreach (var resourcePath in Assembly.GetExecutingAssembly().GetManifestResourceNames())\n            {\n                if (!resourcePath.StartsWith($\"{type.Assembly.GetName().Name}.HistoricalAccess.Data.{folderName}.\", StringComparison.Ordinal))\n                {\n                    continue;\n                }\n\n                var item = new ArchiveItem(resourcePath, Assembly.GetExecutingAssembly(), resourcePath);\n                var node = new ArchiveItemState(SystemContext, item, NamespaceIndex, _timeService);\n                node.ReloadFromSource(SystemContext);\n\n                dataFolder.AddReference(ReferenceTypeIds.Organizes, false, node.NodeId);\n                node.AddReference(ReferenceTypeIds.Organizes, true, dataFolder.NodeId);\n\n                AddPredefinedNode(SystemContext, node);\n            }\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                // TBD\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // check for check for nodes that are being currently monitored.\n\n                if (MonitoredNodes.TryGetValue(nodeId, out var monitoredNode))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = true,\n                        Node = monitoredNode.Node\n                    };\n                }\n\n                // check for predefined nodes,\n\n                if (PredefinedNodes.TryGetValue(nodeId, out var node))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Node = node,\n                        Validated = true\n                    };\n                }\n\n                // parse the identifier.\n                var parsedNodeId = ParsedNodeId.Parse(nodeId);\n\n                if (parsedNodeId != null)\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = false,\n                        Node = null,\n                        ParsedNodeId = parsedNodeId\n                    };\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // lookup in cache.\n            var target = FindNodeInCache(context, handle, cache);\n\n            if (target != null)\n            {\n                handle.Node = target;\n                handle.Validated = true;\n                return handle.Node;\n            }\n\n            var pnd = (ParsedNodeId)handle.ParsedNodeId;\n\n            // check for a new node.\n            switch (pnd.RootType)\n            {\n                case NodeTypes.Folder:\n                    {\n                        target = _system.GetFolderState(pnd.RootId);\n                        break;\n                    }\n\n                case NodeTypes.Item:\n                    {\n                        var item = _system.GetItemState(SystemContext, pnd);\n                        item.LoadConfiguration(context);\n                        target = item;\n                        break;\n                    }\n            }\n\n            // root is not valid.\n            if (target == null)\n            {\n                return null;\n            }\n\n            // validate component.\n            if (!string.IsNullOrEmpty(pnd.ComponentPath))\n            {\n                NodeState component = target.FindChildBySymbolicName(context, pnd.ComponentPath);\n\n                // component does not exist.\n                if (component == null)\n                {\n                    return null;\n                }\n\n                target = component;\n            }\n\n            // put root into cache.\n            if (cache != null)\n            {\n                cache[handle.NodeId] = target;\n            }\n\n            handle.Node = target;\n            handle.Validated = true;\n            return handle.Node;\n        }\n\n        /// <summary>\n        /// Validates the nodes and reads the values from the underlying source.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"values\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToValidate\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void Read(\n            ServerSystemContext context,\n            IList<ReadValueId> nodesToRead,\n            IList<DataValue> values,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToValidate,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToValidate.Count; ii++)\n            {\n                var handle = nodesToValidate[ii];\n\n                lock (Lock)\n                {\n                    // validate node.\n                    var source = ValidateNode(context, handle, cache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    // check if the node needs to be initialized from disk.\n\n                    if (source.GetHierarchyRoot() is ArchiveItemState item\n                        && item.ArchiveItem.LastLoadTime.AddDays(1) < _timeService.UtcNow)\n                    {\n                        item.LoadConfiguration(context);\n                    }\n\n                    var nodeToRead = nodesToRead[handle.Index];\n                    var value = values[handle.Index];\n\n                    // update the attribute value.\n                    errors[handle.Index] = source.ReadAttribute(\n                        context,\n                        nodeToRead.AttributeId,\n                        nodeToRead.ParsedIndexRange,\n                        nodeToRead.DataEncoding,\n                        value);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Reads the initial value for a monitored item.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The item handle.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override ServiceResult ReadInitialValue(\n            ISystemContext context,\n            NodeHandle handle,\n            IDataChangeMonitoredItem2 monitoredItem)\n        {\n            var monitoredItemObj = monitoredItem as MonitoredItem;\n            if (handle.Node is not ArchiveItemState || monitoredItemObj?.AttributeId != Attributes.Value)\n            {\n                return base.ReadInitialValue(context, handle, monitoredItem);\n            }\n\n            if (monitoredItemObj?.Filter is not AggregateFilter filter ||\n                filter.StartTime >= _timeService.UtcNow.AddMilliseconds(-filter.ProcessingInterval))\n            {\n                return base.ReadInitialValue(context, handle, monitoredItem);\n            }\n\n            var details = new ReadRawModifiedDetails\n            {\n                StartTime = filter.StartTime,\n                EndTime = _timeService.UtcNow,\n                ReturnBounds = true,\n                IsReadModified = false,\n                NumValuesPerNode = 0\n            };\n\n            var nodeToRead = new HistoryReadValueId\n            {\n                NodeId = handle.NodeId,\n                ParsedIndexRange = NumericRange.Empty\n            };\n\n            try\n            {\n                var request = CreateHistoryReadRequest(\n                    context as ServerSystemContext,\n                    details,\n                    handle,\n                    nodeToRead);\n\n                while (request.Values.Count > 0)\n                {\n                    if (request.Values.Count == 0)\n                    {\n                        break;\n                    }\n\n                    var value = request.Values.First.Value;\n                    request.Values.RemoveFirst();\n                    monitoredItemObj.QueueValue(value, null, true);\n                }\n                return StatusCodes.Good;\n            }\n            catch (Exception e)\n            {\n                var error = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, \"Unexpected error fetching initial values.\");\n                monitoredItemObj.QueueValue(null, error, true);\n                return error;\n            }\n        }\n\n        /// <summary>\n        /// Called after creating a MonitoredItem.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        protected override void OnMonitoredItemCreated(ServerSystemContext context, NodeHandle handle, ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            lock (Lock)\n            {\n                var root = handle.Node.GetHierarchyRoot();\n\n                if (root != null && root is ArchiveItemState item)\n                {\n                    _monitoredItems ??= [];\n\n                    _monitoredItems.TryAdd(item.ArchiveItem.UniquePath, item);\n                    item.SubscribeCount++;\n\n                    _simulationTimer ??= new Timer(DoSimulation, null, 500, 500);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Revises an aggregate filter (may require knowledge of the variable being used).\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle.</param>\n        /// <param name=\"samplingInterval\">The sampling interval for the monitored item.</param>\n        /// <param name=\"queueSize\">The queue size for the monitored item.</param>\n        /// <param name=\"filterToUse\">The filter to revise.</param>\n        /// <returns>Good if the filter is acceptable.</returns>\n        protected override StatusCode ReviseAggregateFilter(\n            ServerSystemContext context,\n            NodeHandle handle,\n            double samplingInterval,\n            uint queueSize,\n            ServerAggregateFilter filterToUse)\n        {\n            // use the sampling interval to limit the processing interval.\n            if (filterToUse.ProcessingInterval < samplingInterval)\n            {\n                filterToUse.ProcessingInterval = samplingInterval;\n            }\n\n            // check if an archive item.\n\n            if (handle.Node is not ArchiveItemState item)\n            {\n                // no historial data so must start in the future.\n                while (filterToUse.StartTime < _timeService.UtcNow)\n                {\n                    filterToUse.StartTime = filterToUse.StartTime.AddMilliseconds(filterToUse.ProcessingInterval);\n                }\n\n                // use suitable defaults for values which are are not archived items.\n                filterToUse.AggregateConfiguration.UseServerCapabilitiesDefaults = false;\n                filterToUse.AggregateConfiguration.UseSlopedExtrapolation = false;\n                filterToUse.AggregateConfiguration.TreatUncertainAsBad = false;\n                filterToUse.AggregateConfiguration.PercentDataBad = 100;\n                filterToUse.AggregateConfiguration.PercentDataGood = 100;\n                filterToUse.Stepped = true;\n            }\n            else\n            {\n                // use the archive acquisition sampling interval to limit the processing interval.\n                if (filterToUse.ProcessingInterval < item.ArchiveItem.SamplingInterval)\n                {\n                    filterToUse.ProcessingInterval = item.ArchiveItem.SamplingInterval;\n                }\n\n                // ensure the buffer does not get overfilled.\n                while (filterToUse.StartTime.AddMilliseconds(queueSize * filterToUse.ProcessingInterval) < _timeService.UtcNow)\n                {\n                    filterToUse.StartTime = filterToUse.StartTime.AddMilliseconds(filterToUse.ProcessingInterval);\n                }\n\n                filterToUse.Stepped = item.ArchiveItem.Stepped;\n\n                // revise the configration.\n                ReviseAggregateConfiguration(context, item, filterToUse.AggregateConfiguration);\n            }\n\n            return StatusCodes.Good;\n        }\n\n        /// <summary>\n        /// Revises the aggregate configuration.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"item\"></param>\n        /// <param name=\"configurationToUse\"></param>\n        private void ReviseAggregateConfiguration(\n            ServerSystemContext context,\n            ArchiveItemState item,\n            AggregateConfiguration configurationToUse)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context != null);\n            // set configuration from defaults.\n            if (configurationToUse.UseServerCapabilitiesDefaults)\n            {\n                var configuration = item.ArchiveItem.AggregateConfiguration;\n\n                if (configuration?.UseServerCapabilitiesDefaults != false)\n                {\n                    configuration = Server.AggregateManager.GetDefaultConfiguration(null);\n                }\n\n                configurationToUse.UseSlopedExtrapolation = configuration.UseSlopedExtrapolation;\n                configurationToUse.TreatUncertainAsBad = configuration.TreatUncertainAsBad;\n                configurationToUse.PercentDataBad = configuration.PercentDataBad;\n                configurationToUse.PercentDataGood = configuration.PercentDataGood;\n            }\n\n            // override configuration when it does not make sense for the item.\n            configurationToUse.UseServerCapabilitiesDefaults = false;\n\n            if (item.ArchiveItem.Stepped)\n            {\n                configurationToUse.UseSlopedExtrapolation = false;\n            }\n        }\n\n        /// <summary>\n        /// Called after deleting a MonitoredItem.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        protected override void OnMonitoredItemDeleted(ServerSystemContext context, NodeHandle handle, ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            lock (Lock)\n            {\n                var root = handle.Node.GetHierarchyRoot();\n\n                if (root != null && root is ArchiveItemState item &&\n                    _monitoredItems.TryGetValue(item.ArchiveItem.UniquePath, out var item2))\n                {\n                    item2.SubscribeCount--;\n\n                    if (item2.SubscribeCount == 0)\n                    {\n                        _monitoredItems.Remove(item.ArchiveItem.UniquePath);\n                    }\n\n                    if (_monitoredItems.Count == 0 && _simulationTimer != null)\n                    {\n                        _simulationTimer.Dispose();\n                        _simulationTimer = null;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Reads the raw data for an item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryReadRawModified(\n            ServerSystemContext context,\n            ReadRawModifiedDetails details,\n            TimestampsToReturn timestampsToReturn,\n            IList<HistoryReadValueId> nodesToRead,\n            IList<HistoryReadResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToRead.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToRead = nodesToRead[handle.Index];\n                var result = results[handle.Index];\n                try\n                {\n                    // validate node.\n                    var source = ValidateNode(context, handle, cache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    HistoryReadRequest request;\n                    // load an exising request.\n                    if (nodeToRead.ContinuationPoint != null)\n                    {\n                        request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint);\n\n                        if (request == null)\n                        {\n                            errors[handle.Index] = StatusCodes.BadContinuationPointInvalid;\n                            continue;\n                        }\n                    }\n\n                    // create a new request.\n                    else\n                    {\n                        request = CreateHistoryReadRequest(\n                            context,\n                            details,\n                            handle,\n                            nodeToRead);\n                    }\n\n                    // process values until the max is reached.\n                    var data = details.IsReadModified ? new HistoryModifiedData() : new HistoryData();\n\n                    while (request.NumValuesPerNode == 0 || data.DataValues.Count < request.NumValuesPerNode)\n                    {\n                        if (request.Values.Count == 0)\n                        {\n                            break;\n                        }\n\n                        var value = request.Values.First.Value;\n                        request.Values.RemoveFirst();\n                        data.DataValues.Add(value);\n\n                        if (data is HistoryModifiedData modifiedData)\n                        {\n                            ModificationInfo modificationInfo = null;\n\n                            if (request.ModificationInfos?.Count > 0)\n                            {\n                                modificationInfo = request.ModificationInfos.First.Value;\n                                request.ModificationInfos.RemoveFirst();\n                            }\n\n                            modifiedData.ModificationInfos.Add(modificationInfo);\n                        }\n                    }\n\n                    errors[handle.Index] = ServiceResult.Good;\n\n                    // check if a continuation point is requred.\n                    if (request.Values.Count > 0)\n                    {\n                        // only set if both end time and start time are specified.\n                        if (details.StartTime != DateTime.MinValue && details.EndTime != DateTime.MinValue)\n                        {\n                            result.ContinuationPoint = SaveContinuationPoint(context, request);\n                        }\n                    }\n\n                    // check if no data returned.\n                    else\n                    {\n                        errors[handle.Index] = StatusCodes.GoodNoData;\n                    }\n\n                    // return the data.\n                    result.HistoryData = new ExtensionObject(data);\n                }\n                catch (Exception e)\n                {\n                    errors[handle.Index] = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, \"Unexpected error processing request.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Reads the processed data for an item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryReadProcessed(\n            ServerSystemContext context,\n            ReadProcessedDetails details,\n            TimestampsToReturn timestampsToReturn,\n            IList<HistoryReadValueId> nodesToRead,\n            IList<HistoryReadResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToRead.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToRead = nodesToRead[handle.Index];\n                var result = results[handle.Index];\n                try\n                {\n                    // validate node.\n                    var source = ValidateNode(context, handle, cache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    HistoryReadRequest request;\n                    // load an exising request.\n                    if (nodeToRead.ContinuationPoint != null)\n                    {\n                        request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint);\n\n                        if (request == null)\n                        {\n                            errors[handle.Index] = StatusCodes.BadContinuationPointInvalid;\n                            continue;\n                        }\n                    }\n\n                    // create a new request.\n                    else\n                    {\n                        // validate aggregate type.\n                        if (details.AggregateType.Count <= ii || !Server.AggregateManager.IsSupported(details.AggregateType[ii]))\n                        {\n                            errors[handle.Index] = StatusCodes.BadAggregateNotSupported;\n                            continue;\n                        }\n\n                        request = CreateHistoryReadRequest(\n                            context,\n                            details,\n                            handle,\n                            nodeToRead,\n                            details.AggregateType[ii]);\n                    }\n\n                    // process values until the max is reached.\n                    var data = new HistoryData();\n\n                    while (request.NumValuesPerNode == 0 || data.DataValues.Count < request.NumValuesPerNode)\n                    {\n                        if (request.Values.Count == 0)\n                        {\n                            break;\n                        }\n\n                        var value = request.Values.First.Value;\n                        request.Values.RemoveFirst();\n                        data.DataValues.Add(value);\n                    }\n\n                    errors[handle.Index] = ServiceResult.Good;\n\n                    // check if a continuation point is requred.\n                    if (request.Values.Count > 0)\n                    {\n                        result.ContinuationPoint = SaveContinuationPoint(context, request);\n                    }\n\n                    // check if no data returned.\n                    else\n                    {\n                        errors[handle.Index] = StatusCodes.GoodNoData;\n                    }\n\n                    // return the data.\n                    result.HistoryData = new ExtensionObject(data);\n                }\n                catch (Exception e)\n                {\n                    errors[handle.Index] = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, \"Unexpected error processing request.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Reads the data at the specified time for an item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryReadAtTime(\n            ServerSystemContext context,\n            ReadAtTimeDetails details,\n            TimestampsToReturn timestampsToReturn,\n            IList<HistoryReadValueId> nodesToRead,\n            IList<HistoryReadResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToRead.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToRead = nodesToRead[handle.Index];\n                var result = results[handle.Index];\n                try\n                {\n                    // validate node.\n                    var source = ValidateNode(context, handle, cache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    HistoryReadRequest request;\n                    // load an exising request.\n                    if (nodeToRead.ContinuationPoint != null)\n                    {\n                        request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint);\n\n                        if (request == null)\n                        {\n                            errors[handle.Index] = StatusCodes.BadContinuationPointInvalid;\n                            continue;\n                        }\n                    }\n\n                    // create a new request.\n                    else\n                    {\n                        request = CreateHistoryReadRequest(\n                            context,\n                            details,\n                            handle,\n                            nodeToRead);\n                    }\n\n                    // process values until the max is reached.\n                    var data = new HistoryData();\n\n                    while (request.NumValuesPerNode == 0 || data.DataValues.Count < request.NumValuesPerNode)\n                    {\n                        if (request.Values.Count == 0)\n                        {\n                            break;\n                        }\n\n                        var value = request.Values.First.Value;\n                        request.Values.RemoveFirst();\n                        data.DataValues.Add(value);\n                    }\n\n                    errors[handle.Index] = ServiceResult.Good;\n\n                    // check if a continuation point is requred.\n                    if (request.Values.Count > 0)\n                    {\n                        result.ContinuationPoint = SaveContinuationPoint(context, request);\n                    }\n\n                    // check if no data returned.\n                    else\n                    {\n                        errors[handle.Index] = StatusCodes.GoodNoData;\n                    }\n\n                    // return the data.\n                    result.HistoryData = new ExtensionObject(data);\n                }\n                catch (Exception e)\n                {\n                    errors[handle.Index] = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, \"Unexpected error processing request.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates the data history for one or more nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToUpdate\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryUpdateData(\n            ServerSystemContext context,\n            IList<UpdateDataDetails> nodesToUpdate,\n            IList<HistoryUpdateResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToUpdate = nodesToUpdate[handle.Index];\n                var result = results[handle.Index];\n\n                try\n                {\n                    // remove not supported.\n                    if (nodeToUpdate.PerformInsertReplace == PerformUpdateType.Remove)\n                    {\n                        continue;\n                    }\n\n                    // validate node.\n                    var source = ValidateNode(context, handle, cache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    // load the archive.\n\n                    if (handle.Node is not ArchiveItemState item)\n                    {\n                        continue;\n                    }\n\n                    item.ReloadFromSource(context);\n\n                    // process each item.\n                    for (var jj = 0; jj < nodeToUpdate.UpdateValues.Count; jj++)\n                    {\n                        StatusCode error = item.UpdateHistory(context, nodeToUpdate.UpdateValues[jj], nodeToUpdate.PerformInsertReplace);\n                        result.OperationResults.Add(error);\n                    }\n\n                    errors[handle.Index] = ServiceResult.Good;\n                }\n                catch (Exception e)\n                {\n                    errors[handle.Index] = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, \"Unexpected error processing request.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Updates the data history for one or more nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToUpdate\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryUpdateStructureData(\n            ServerSystemContext context,\n            IList<UpdateStructureDataDetails> nodesToUpdate,\n            IList<HistoryUpdateResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToUpdate = nodesToUpdate[handle.Index];\n                var result = results[handle.Index];\n\n                try\n                {\n                    // validate node.\n                    var source = ValidateNode(context, handle, cache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    // only support annotations.\n                    if (handle.Node.BrowseName != BrowseNames.Annotations)\n                    {\n                        continue;\n                    }\n\n                    // load the archive.\n                    var item = Reload(context, handle);\n\n                    if (item == null)\n                    {\n                        continue;\n                    }\n\n                    // process each item.\n                    for (var jj = 0; jj < nodeToUpdate.UpdateValues.Count; jj++)\n                    {\n                        if (ExtensionObject.ToEncodeable(nodeToUpdate.UpdateValues[jj].Value as ExtensionObject) is not Annotation annotation)\n                        {\n                            result.OperationResults.Add(StatusCodes.BadTypeMismatch);\n                            continue;\n                        }\n\n                        StatusCode error = item.UpdateAnnotations(\n                            context,\n                            annotation,\n                            nodeToUpdate.UpdateValues[jj],\n                            nodeToUpdate.PerformInsertReplace);\n\n                        result.OperationResults.Add(error);\n                    }\n\n                    errors[handle.Index] = ServiceResult.Good;\n                }\n                catch (Exception e)\n                {\n                    errors[handle.Index] = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, \"Unexpected error processing request.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Deletes the data history for one or more nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToUpdate\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryDeleteRawModified(\n            ServerSystemContext context,\n            IList<DeleteRawModifiedDetails> nodesToUpdate,\n            IList<HistoryUpdateResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToUpdate = nodesToUpdate[handle.Index];\n\n                try\n                {\n                    // validate node.\n                    var source = ValidateNode(context, handle, cache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    // load the archive.\n\n                    if (handle.Node is not ArchiveItemState item)\n                    {\n                        continue;\n                    }\n\n                    item.ReloadFromSource(context);\n\n                    // delete the history.\n                    item.DeleteHistory(context, nodeToUpdate.StartTime, nodeToUpdate.EndTime, nodeToUpdate.IsDeleteModified);\n                    errors[handle.Index] = ServiceResult.Good;\n                }\n                catch (Exception e)\n                {\n                    errors[handle.Index] = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, \"Error deleting data from archive.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Deletes the data history for one or more nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToUpdate\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryDeleteAtTime(\n            ServerSystemContext context,\n            IList<DeleteAtTimeDetails> nodesToUpdate,\n            IList<HistoryUpdateResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToUpdate = nodesToUpdate[handle.Index];\n                var result = results[handle.Index];\n\n                try\n                {\n                    // validate node.\n                    var source = ValidateNode(context, handle, cache);\n\n                    if (source == null)\n                    {\n                        continue;\n                    }\n\n                    // load the archive.\n\n                    if (handle.Node is not ArchiveItemState item)\n                    {\n                        continue;\n                    }\n\n                    item.ReloadFromSource(context);\n\n                    // process each item.\n                    for (var jj = 0; jj < nodeToUpdate.ReqTimes.Count; jj++)\n                    {\n                        StatusCode error = item.DeleteHistory(context, nodeToUpdate.ReqTimes[jj]);\n                        result.OperationResults.Add(error);\n                    }\n\n                    errors[handle.Index] = ServiceResult.Good;\n                }\n                catch (Exception e)\n                {\n                    errors[handle.Index] = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, \"Unexpected error processing request.\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// Loads the archive item state from the underlying source.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        private ArchiveItemState Reload(ServerSystemContext context, NodeHandle handle)\n        {\n            var item = handle.Node as ArchiveItemState;\n\n            if (item == null && handle.Node is BaseInstanceState property)\n            {\n                item = property.Parent as ArchiveItemState;\n            }\n\n            item?.ReloadFromSource(context);\n\n            return item;\n        }\n\n        /// <summary>\n        /// Creates a new history request.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private HistoryReadRequest CreateHistoryReadRequest(\n            ServerSystemContext context,\n            ReadRawModifiedDetails details,\n            NodeHandle handle,\n            HistoryReadValueId nodeToRead)\n        {\n            var sizeLimited = details.StartTime == DateTime.MinValue || details.EndTime == DateTime.MinValue;\n            var applyIndexRangeOrEncoding = nodeToRead.ParsedIndexRange != NumericRange.Empty || !QualifiedName.IsNull(nodeToRead.DataEncoding);\n            var returnBounds = !details.IsReadModified && details.ReturnBounds;\n            var timeFlowsBackward = (details.StartTime == DateTime.MinValue) || (details.EndTime != DateTime.MinValue && details.EndTime < details.StartTime);\n\n            // find the archive item.\n            var item = Reload(context, handle);\n\n            if (item == null)\n            {\n                throw new ServiceResultException(StatusCodes.BadNotSupported);\n            }\n\n            var values = new LinkedList<DataValue>();\n            LinkedList<ModificationInfo> modificationInfos = null;\n\n            if (details.IsReadModified)\n            {\n                modificationInfos = new LinkedList<ModificationInfo>();\n            }\n\n            // read history.\n            var view = item.ReadHistory(details.StartTime, details.EndTime, details.IsReadModified, handle.Node.BrowseName);\n\n            var startBound = -1;\n            var endBound = -1;\n            var ii = timeFlowsBackward ? view.Count - 1 : 0;\n\n            while (ii >= 0 && ii < view.Count)\n            {\n                try\n                {\n                    var timestamp = (DateTime)view[ii].Row[0];\n\n                    // check if looking for start of data.\n                    if (values.Count == 0)\n                    {\n                        if (timeFlowsBackward)\n                        {\n                            if ((details.StartTime != DateTime.MinValue && timestamp >= details.StartTime) || (details.StartTime == DateTime.MinValue && timestamp >= details.EndTime))\n                            {\n                                startBound = ii;\n\n                                if (timestamp > details.StartTime)\n                                {\n                                    continue;\n                                }\n                            }\n                        }\n                        else\n                        {\n                            if (timestamp <= details.StartTime)\n                            {\n                                startBound = ii;\n\n                                if (timestamp < details.StartTime)\n                                {\n                                    continue;\n                                }\n                            }\n                        }\n                    }\n\n                    // check if absolute max values specified.\n                    if (sizeLimited && details.NumValuesPerNode > 0 && details.NumValuesPerNode < values.Count)\n                    {\n                        break;\n                    }\n\n                    // check for end bound.\n                    if (details.EndTime != DateTime.MinValue && timestamp >= details.EndTime)\n                    {\n                        if (timeFlowsBackward)\n                        {\n                            if (timestamp <= details.EndTime)\n                            {\n                                endBound = ii;\n                                break;\n                            }\n                        }\n                        else\n                        {\n                            if (timestamp >= details.EndTime)\n                            {\n                                endBound = ii;\n                                break;\n                            }\n                        }\n                    }\n\n                    // check if the start bound needs to be returned.\n                    if (returnBounds && values.Count == 0 && startBound != ii && details.StartTime != DateTime.MinValue)\n                    {\n                        // add start bound.\n                        if (startBound == -1)\n                        {\n                            values.AddLast(new DataValue(Variant.Null, StatusCodes.BadBoundNotFound, details.StartTime, details.StartTime));\n                        }\n                        else\n                        {\n                            values.AddLast(RowToDataValue(context, nodeToRead, view[startBound], applyIndexRangeOrEncoding));\n                        }\n\n                        // check if absolute max values specified.\n                        if (sizeLimited && details.NumValuesPerNode > 0 && details.NumValuesPerNode < values.Count)\n                        {\n                            break;\n                        }\n                    }\n\n                    // add value.\n                    values.AddLast(RowToDataValue(context, nodeToRead, view[ii], applyIndexRangeOrEncoding));\n\n                    modificationInfos?.AddLast((ModificationInfo)view[ii].Row[6]);\n                }\n                finally\n                {\n                    if (timeFlowsBackward)\n                    {\n                        ii--;\n                    }\n                    else\n                    {\n                        ii++;\n                    }\n                }\n            }\n\n            // add late bound.\n            while (returnBounds && details.EndTime != DateTime.MinValue)\n            {\n                // add start bound.\n                if (values.Count == 0)\n                {\n                    if (startBound == -1)\n                    {\n                        values.AddLast(new DataValue(Variant.Null, StatusCodes.BadBoundNotFound, details.StartTime, details.StartTime));\n                    }\n                    else\n                    {\n                        values.AddLast(RowToDataValue(context, nodeToRead, view[startBound], applyIndexRangeOrEncoding));\n                    }\n                }\n\n                // check if absolute max values specified.\n                if (sizeLimited && details.NumValuesPerNode > 0 && details.NumValuesPerNode < values.Count)\n                {\n                    break;\n                }\n\n                // add end bound.\n                if (endBound == -1)\n                {\n                    values.AddLast(new DataValue(Variant.Null, StatusCodes.BadBoundNotFound, details.EndTime, details.EndTime));\n                }\n                else\n                {\n                    values.AddLast(RowToDataValue(context, nodeToRead, view[endBound], applyIndexRangeOrEncoding));\n                }\n\n                break;\n            }\n\n            return new HistoryReadRequest\n            {\n                Values = values,\n                ModificationInfos = modificationInfos,\n                NumValuesPerNode = details.NumValuesPerNode,\n                Filter = null\n            };\n        }\n\n        /// <summary>\n        /// Creates a new history request.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        /// <param name=\"aggregateId\"></param>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private HistoryReadRequest CreateHistoryReadRequest(\n            ServerSystemContext context,\n            ReadProcessedDetails details,\n            NodeHandle handle,\n            HistoryReadValueId nodeToRead,\n            NodeId aggregateId)\n        {\n            var applyIndexRangeOrEncoding = nodeToRead.ParsedIndexRange != NumericRange.Empty || !QualifiedName.IsNull(nodeToRead.DataEncoding);\n            var timeFlowsBackward = details.EndTime < details.StartTime;\n\n            if (handle.Node is not ArchiveItemState item)\n            {\n                throw new ServiceResultException(StatusCodes.BadNotSupported);\n            }\n\n            item.ReloadFromSource(context);\n\n            var values = new LinkedList<DataValue>();\n\n            // read history.\n            var view = item.ReadHistory(details.StartTime, details.EndTime, false);\n\n            var ii = timeFlowsBackward ? view.Count - 1 : 0;\n\n            // choose the aggregate configuration.\n            var configuration = (AggregateConfiguration)details.AggregateConfiguration.MemberwiseClone();\n            ReviseAggregateConfiguration(context, item, configuration);\n\n            // create the aggregate calculator.\n            var calculator = Server.AggregateManager.CreateCalculator(\n                aggregateId,\n                details.StartTime,\n                details.EndTime,\n                details.ProcessingInterval,\n                item.ArchiveItem.Stepped,\n                configuration);\n\n            while (ii >= 0 && ii < view.Count)\n            {\n                try\n                {\n                    var value = (DataValue)view[ii].Row[2];\n                    calculator.QueueRawValue(value);\n\n                    // queue any processed values.\n                    QueueProcessedValues(\n                        context,\n                        calculator,\n                        nodeToRead.ParsedIndexRange,\n                        nodeToRead.DataEncoding,\n                        applyIndexRangeOrEncoding,\n                        false,\n                        values);\n                }\n                finally\n                {\n                    if (timeFlowsBackward)\n                    {\n                        ii--;\n                    }\n                    else\n                    {\n                        ii++;\n                    }\n                }\n            }\n\n            // queue any processed values beyond the end of the data.\n            QueueProcessedValues(\n                context,\n                calculator,\n                nodeToRead.ParsedIndexRange,\n                nodeToRead.DataEncoding,\n                applyIndexRangeOrEncoding,\n                true,\n                values);\n\n            return new HistoryReadRequest\n            {\n                Values = values,\n                NumValuesPerNode = 0,\n                Filter = null\n            };\n        }\n\n        /// <summary>\n        /// Creates a new history request.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        private static HistoryReadRequest CreateHistoryReadRequest(\n            ServerSystemContext context,\n            ReadAtTimeDetails details,\n            NodeHandle handle,\n            HistoryReadValueId nodeToRead)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(nodeToRead is not null);\n\n            if (handle.Node is not ArchiveItemState item)\n            {\n                throw new ServiceResultException(StatusCodes.BadNotSupported);\n            }\n\n            item.ReloadFromSource(context);\n\n            // find the start and end times.\n            var startTime = DateTime.MaxValue;\n            var endTime = DateTime.MinValue;\n\n            for (var ii = 0; ii < details.ReqTimes.Count; ii++)\n            {\n                if (startTime > details.ReqTimes[ii])\n                {\n                    startTime = details.ReqTimes[ii];\n                }\n\n                if (endTime < details.ReqTimes[ii])\n                {\n                    endTime = details.ReqTimes[ii];\n                }\n            }\n\n            var view = item.ReadHistory(startTime, endTime, false);\n\n            var values = new LinkedList<DataValue>();\n\n            for (var ii = 0; ii < details.ReqTimes.Count; ii++)\n            {\n                // find the value at the time.\n                var index = item.FindValueAtOrBefore(view, details.ReqTimes[ii], !details.UseSimpleBounds, out var dataBeforeIgnored);\n\n                if (index < 0)\n                {\n                    values.AddLast(new DataValue(StatusCodes.BadNoData, details.ReqTimes[ii]));\n                    continue;\n                }\n\n                // nothing more to do if a raw value exists.\n                if ((DateTime)view[index].Row[0] == details.ReqTimes[ii])\n                {\n                    values.AddLast((DataValue)view[index].Row[2]);\n                    continue;\n                }\n\n                var before = (DataValue)view[index].Row[2];\n                DataValue value;\n\n                // find the value after the time.\n                var afterIndex = item.FindValueAfter(view, index, !details.UseSimpleBounds, out var dataAfterIgnored);\n\n                if (afterIndex < 0)\n                {\n                    // use stepped interpolation if no end bound exists.\n                    value = AggregateCalculator.SteppedInterpolate(details.ReqTimes[ii], before);\n\n                    if (StatusCode.IsNotBad(value.StatusCode) && dataBeforeIgnored)\n                    {\n                        value.StatusCode = value.StatusCode.SetCodeBits(StatusCodes.UncertainDataSubNormal);\n                    }\n\n                    values.AddLast(value);\n                    continue;\n                }\n\n                // use stepped or slopped interpolation depending on the value.\n                if (item.ArchiveItem.Stepped)\n                {\n                    value = AggregateCalculator.SteppedInterpolate(details.ReqTimes[ii], before);\n\n                    if (StatusCode.IsNotBad(value.StatusCode) && dataBeforeIgnored)\n                    {\n                        value.StatusCode = value.StatusCode.SetCodeBits(StatusCodes.UncertainDataSubNormal);\n                    }\n                }\n                else\n                {\n                    value = AggregateCalculator.SlopedInterpolate(details.ReqTimes[ii], before, (DataValue)view[afterIndex].Row[2]);\n\n                    if (StatusCode.IsNotBad(value.StatusCode) && (dataBeforeIgnored || dataAfterIgnored))\n                    {\n                        value.StatusCode = value.StatusCode.SetCodeBits(StatusCodes.UncertainDataSubNormal);\n                    }\n                }\n\n                values.AddLast(value);\n            }\n\n            return new HistoryReadRequest\n            {\n                Values = values,\n                NumValuesPerNode = 0,\n                Filter = null\n            };\n        }\n\n        /// <summary>\n        /// Extracts and queues any processed values.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"calculator\"></param>\n        /// <param name=\"indexRange\"></param>\n        /// <param name=\"dataEncoding\"></param>\n        /// <param name=\"applyIndexRangeOrEncoding\"></param>\n        /// <param name=\"returnPartial\"></param>\n        /// <param name=\"values\"></param>\n        private void QueueProcessedValues(\n            ServerSystemContext context,\n            IAggregateCalculator calculator,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            bool applyIndexRangeOrEncoding,\n            bool returnPartial,\n            LinkedList<DataValue> values)\n        {\n            var proccessedValue = calculator.GetProcessedValue(returnPartial);\n\n            while (proccessedValue != null)\n            {\n                // apply any index range or encoding.\n                if (applyIndexRangeOrEncoding)\n                {\n                    var rawValue = proccessedValue.Value;\n                    var result = BaseVariableState.ApplyIndexRangeAndDataEncoding(context, indexRange, dataEncoding, ref rawValue);\n\n                    if (ServiceResult.IsBad(result))\n                    {\n                        proccessedValue.Value = rawValue;\n                    }\n                    else\n                    {\n                        proccessedValue.Value = null;\n                        proccessedValue.StatusCode = result.StatusCode;\n                    }\n                }\n\n                // queue the result.\n                values.AddLast(proccessedValue);\n                proccessedValue = calculator.GetProcessedValue(returnPartial);\n            }\n        }\n\n        /// <summary>\n        /// Creates a new history request.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        /// <param name=\"row\"></param>\n        /// <param name=\"applyIndexRangeOrEncoding\"></param>\n        private DataValue RowToDataValue(\n            ServerSystemContext context,\n            HistoryReadValueId nodeToRead,\n            DataRowView row,\n            bool applyIndexRangeOrEncoding)\n        {\n            var value = (DataValue)row[2];\n\n            // apply any index range or encoding.\n            if (applyIndexRangeOrEncoding)\n            {\n                var rawValue = value.Value;\n                var result = BaseVariableState.ApplyIndexRangeAndDataEncoding(context, nodeToRead.ParsedIndexRange, nodeToRead.DataEncoding, ref rawValue);\n\n                if (ServiceResult.IsBad(result))\n                {\n                    value.Value = rawValue;\n                }\n                else\n                {\n                    value.Value = null;\n                    value.StatusCode = result.StatusCode;\n                }\n            }\n\n            return value;\n        }\n\n        /// <summary>\n        /// Stores a read history request.\n        /// </summary>\n        private sealed class HistoryReadRequest\n        {\n            public byte[] ContinuationPoint { get; set; }\n            public LinkedList<DataValue> Values { get; set; }\n            public LinkedList<ModificationInfo> ModificationInfos { get; set; }\n            public uint NumValuesPerNode { get; set; }\n            public AggregateFilter Filter { get; set; }\n        }\n\n        /// <summary>\n        /// Releases the history continuation point.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryReleaseContinuationPoints(\n            ServerSystemContext context,\n            IList<HistoryReadValueId> nodesToRead,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToRead = nodesToRead[handle.Index];\n\n                // find the continuation point.\n                var request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint);\n\n                if (request == null)\n                {\n                    errors[handle.Index] = StatusCodes.BadContinuationPointInvalid;\n                    continue;\n                }\n\n                // all done.\n                errors[handle.Index] = StatusCodes.Good;\n            }\n        }\n\n        /// <summary>\n        /// Loads a history continuation point.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        private static HistoryReadRequest LoadContinuationPoint(\n            ServerSystemContext context,\n            byte[] continuationPoint)\n        {\n            var session = context.OperationContext.Session;\n\n            if (session == null)\n            {\n                return null;\n            }\n\n            if (session.RestoreHistoryContinuationPoint(continuationPoint)\n                is not HistoryReadRequest request)\n            {\n                return null;\n            }\n\n            return request;\n        }\n\n        /// <summary>\n        /// Saves a history continuation point.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"request\"></param>\n        private static byte[] SaveContinuationPoint(\n            ServerSystemContext context,\n            HistoryReadRequest request)\n        {\n            var session = context.OperationContext.Session;\n\n            if (session == null)\n            {\n                return null;\n            }\n\n            var id = Guid.NewGuid();\n            session.SaveHistoryContinuationPoint(id, request);\n            request.ContinuationPoint = id.ToByteArray();\n            return request.ContinuationPoint;\n        }\n\n        /// <summary>\n        /// Runs the simulation.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void DoSimulation(object state)\n        {\n            try\n            {\n                lock (Lock)\n                {\n                    foreach (var item in _monitoredItems.Values)\n                    {\n                        if (item.ArchiveItem.LastLoadTime.AddDays(1) < _timeService.UtcNow)\n                        {\n                            item.LoadConfiguration(SystemContext);\n                        }\n\n                        foreach (var value in item.NewSamples(SystemContext))\n                        {\n                            item.WrappedValue = value.WrappedValue;\n                            item.Timestamp = value.SourceTimestamp;\n                            item.StatusCode = value.StatusCode;\n                            item.ClearChangeMasks(SystemContext, true);\n                        }\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(\"Unexpected error during simulation: {0}\", e.Message);\n            }\n        }\n\n        private readonly UnderlyingSystem _system;\n        private readonly HistoricalAccessServerConfiguration _configuration;\n        private readonly TimeService _timeService;\n        private Timer _simulationTimer;\n        private Dictionary<string, ArchiveItemState> _monitoredItems;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/HistoricalAccessServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n\n    /// <inheritdoc/>\n    public class HistoricalAccessServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.HistoricalAccess\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public HistoricalAccessServer(TimeService timeservice)\n        {\n            _timeservice = timeservice;\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new HistoricalAccessServerNodeManager(server, configuration, _timeservice);\n        }\n\n        private readonly TimeService _timeservice;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/HistoricalAccessServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.HistoricalAccess)]\n    public class HistoricalAccessServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public HistoricalAccessServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n\n        /// <summary>\n        /// The root of the archive.\n        /// </summary>\n        [DataMember(Order = 1)]\n        public string ArchiveRoot { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/Namespaces.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the server.\n        /// </summary>\n        public const string HistoricalAccess = \"http://opcfoundation.org/HistoricalAccess\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/NodeTypes.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using System.Text;\n\n    /// <summary>\n    /// Defines the types of nodes exposed by the HistoricalAccessServer NodeManager.\n    /// </summary>\n    public static class NodeTypes\n    {\n        /// <summary>\n        /// A node representing a Folder.\n        /// </summary>\n        public const int Folder = 0;\n\n        /// <summary>\n        /// A node representing an Item.\n        /// </summary>\n        public const int Item = 1;\n\n        /// <summary>\n        /// Constructs the node identifier for a component.\n        /// </summary>\n        /// <param name=\"component\">The component.</param>\n        /// <param name=\"namespaceIndex\">Index of the namespace.</param>\n        /// <returns>The node identifier for a component.</returns>\n        public static NodeId ConstructIdForComponent(NodeState component, ushort namespaceIndex)\n        {\n            if (component == null)\n            {\n                return null;\n            }\n\n            // components must be instances with a parent.\n\n            if (component is not BaseInstanceState instance || instance.Parent == null)\n            {\n                return component.NodeId;\n            }\n\n            // parent must have a string identifier.\n\n            if (instance.Parent.NodeId.Identifier is not string parentId)\n            {\n                return null;\n            }\n\n            var buffer = new StringBuilder();\n            buffer.Append(parentId);\n\n            // check if the parent is another component.\n            var index = parentId.IndexOf('?');\n\n            if (index < 0)\n            {\n                buffer.Append('?');\n            }\n            else\n            {\n                buffer.Append('/');\n            }\n\n            buffer.Append(component.SymbolicName);\n\n            // return the node identifier.\n            return new NodeId(buffer.ToString(), namespaceIndex);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalAccess/UnderlyingSystem.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalAccess\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// Provides access to the system which stores the data.\n    /// </summary>\n    public class UnderlyingSystem\n    {\n        /// <summary>\n        /// Constructs a new system.\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"namespaceIndex\"></param>\n        /// <param name=\"timeService\"></param>\n        public UnderlyingSystem(HistoricalAccessServerConfiguration configuration, ushort namespaceIndex, TimeService timeService)\n        {\n            _configuration = configuration;\n            _namespaceIndex = namespaceIndex;\n            _timeService = timeService;\n        }\n\n        /// <summary>\n        /// Returns a folder object for the specified node.\n        /// </summary>\n        /// <param name=\"rootId\"></param>\n        public ArchiveFolderState GetFolderState(string rootId)\n        {\n            var path = new StringBuilder()\n                .Append(_configuration.ArchiveRoot)\n                .Append('/')\n                .Append(rootId);\n\n            var folder = new ArchiveFolder(rootId, new DirectoryInfo(path.ToString()));\n            return new ArchiveFolderState(folder, _namespaceIndex);\n        }\n\n        /// <summary>\n        /// Returns a item object for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"parsedNodeId\"></param>\n        public ArchiveItemState GetItemState(ISystemContext context, ParsedNodeId parsedNodeId)\n        {\n            if (parsedNodeId.RootType != NodeTypes.Item)\n            {\n                return null;\n            }\n\n            var path = new StringBuilder()\n                .Append(_configuration.ArchiveRoot)\n                .Append('/')\n                .Append(parsedNodeId.RootId);\n\n            var item = new ArchiveItem(parsedNodeId.RootId, new FileInfo(path.ToString()));\n\n            return new ArchiveItemState(context, item, _namespaceIndex, _timeService);\n        }\n\n        private readonly ushort _namespaceIndex;\n        private readonly TimeService _timeService;\n        private readonly HistoricalAccessServerConfiguration _configuration;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalEvents/HistoricalEventsNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalEvents\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Data;\n    using System.Reflection;\n    using System.Threading;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class HistoricalEventsNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"timeService\"></param>\n        public HistoricalEventsNodeManager(IServerInternal server,\n            ApplicationConfiguration configuration, TimeService timeService) :\n            base(server, configuration)\n        {\n            SystemContext.NodeIdFactory = this;\n\n            // set one namespace for the type model and one names for dynamically created nodes.\n            var namespaceUrls = new string[1];\n            namespaceUrls[0] = Namespaces.HistoricalEvents;\n            SetNamespaces(namespaceUrls);\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<HistoricalEventsServerConfiguration>()\n                ?? new HistoricalEventsServerConfiguration();\n\n            // initilize the report generator.\n            _generator = new ReportGenerator(timeService);\n            _generator.Initialize();\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _simulationTimer != null)\n            {\n                Utils.SilentDispose(_simulationTimer);\n                _simulationTimer = null;\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            return predefinedNodes;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                LoadPredefinedNodes(SystemContext, externalReferences);\n\n                var platforms = (BaseObjectState)FindPredefinedNode(new NodeId(Objects.Plaforms, NamespaceIndex), typeof(BaseObjectState));\n                platforms.EventNotifier = EventNotifiers.SubscribeToEvents | EventNotifiers.HistoryRead | EventNotifiers.HistoryWrite;\n                base.AddRootNotifier(platforms);\n\n                foreach (var areaName in _generator.GetAreas())\n                {\n                    var area = CreateArea(SystemContext, platforms, areaName);\n\n                    foreach (var well in _generator.GetWells(areaName))\n                    {\n                        CreateWell(SystemContext, area, well.Id, well.Name);\n                    }\n                }\n\n                // start the simulation.\n                _simulationTimer = new Timer(DoSimulation, null, 10000, 10000);\n            }\n        }\n\n        /// <summary>\n        /// Creates a new area.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"platforms\"></param>\n        /// <param name=\"areaName\"></param>\n        private FolderState CreateArea(SystemContext context, BaseObjectState platforms, string areaName)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context != null);\n            var area = new FolderState(null)\n            {\n                NodeId = new NodeId(areaName, NamespaceIndex),\n                BrowseName = new QualifiedName(areaName, NamespaceIndex)\n            };\n            area.DisplayName = area.BrowseName.Name;\n            area.EventNotifier = EventNotifiers.SubscribeToEvents | EventNotifiers.HistoryRead | EventNotifiers.HistoryWrite;\n            area.TypeDefinitionId = Opc.Ua.ObjectTypeIds.FolderType;\n\n            platforms.AddNotifier(SystemContext, ReferenceTypeIds.HasNotifier, false, area);\n            area.AddNotifier(SystemContext, ReferenceTypeIds.HasNotifier, true, platforms);\n\n            AddPredefinedNode(SystemContext, area);\n\n            return area;\n        }\n\n        /// <summary>\n        /// Creates a new well.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"area\"></param>\n        /// <param name=\"wellId\"></param>\n        /// <param name=\"wellName\"></param>\n        private void CreateWell(SystemContext context, FolderState area, string wellId, string wellName)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(context != null);\n#pragma warning disable CA2000 // Dispose objects before losing scope\n            var well = new WellState(null)\n            {\n                NodeId = new NodeId(wellId, NamespaceIndex),\n                BrowseName = new QualifiedName(wellName, NamespaceIndex),\n                DisplayName = wellName,\n                EventNotifier = EventNotifiers.SubscribeToEvents | EventNotifiers.HistoryRead | EventNotifiers.HistoryWrite,\n                TypeDefinitionId = new NodeId(ObjectTypes.WellType, NamespaceIndex)\n            };\n#pragma warning restore CA2000 // Dispose objects before losing scope\n\n            area.AddNotifier(SystemContext, ReferenceTypeIds.HasNotifier, false, well);\n            well.AddNotifier(SystemContext, ReferenceTypeIds.HasNotifier, true, area);\n\n            AddPredefinedNode(SystemContext, well);\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                base.DeleteAddressSpace();\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // check for predefined nodes.\n                if (PredefinedNodes != null && PredefinedNodes.TryGetValue(nodeId, out var node))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = true,\n                        Node = node\n                    };\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            // TBD\n\n            return null;\n        }\n\n        /// <summary>\n        /// Reads history events.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryReadEvents(\n            ServerSystemContext context,\n            ReadEventDetails details,\n            TimestampsToReturn timestampsToReturn,\n            IList<HistoryReadValueId> nodesToRead,\n            IList<HistoryReadResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToRead = nodesToRead[handle.Index];\n                var result = results[handle.Index];\n\n                HistoryReadRequest request;\n\n                // load an exising request.\n                if (nodeToRead.ContinuationPoint != null)\n                {\n                    request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint);\n\n                    if (request == null)\n                    {\n                        errors[handle.Index] = StatusCodes.BadContinuationPointInvalid;\n                        continue;\n                    }\n                }\n\n                // create a new request.\n                else\n                {\n                    request = CreateHistoryReadRequest(\n                        context,\n                        details,\n                        handle,\n                        nodeToRead);\n                }\n\n                // process events until the max is reached.\n                var events = new HistoryEvent();\n\n                while (request.NumValuesPerNode == 0 || events.Events.Count < request.NumValuesPerNode)\n                {\n                    if (request.Events.Count == 0)\n                    {\n                        break;\n                    }\n\n                    BaseEventState e;\n                    if (request.TimeFlowsBackward)\n                    {\n                        e = request.Events.Last.Value;\n                        request.Events.RemoveLast();\n                    }\n                    else\n                    {\n                        e = request.Events.First.Value;\n                        request.Events.RemoveFirst();\n                    }\n\n                    events.Events.Add(GetEventFields(request, e));\n                }\n\n                errors[handle.Index] = ServiceResult.Good;\n\n                // check if a continuation point is requred.\n                if (request.Events.Count > 0)\n                {\n                    // only set if both end time and start time are specified.\n                    if (details.StartTime != DateTime.MinValue && details.EndTime != DateTime.MinValue)\n                    {\n                        result.ContinuationPoint = SaveContinuationPoint(context, request);\n                    }\n                }\n\n                // check if no data returned.\n                else\n                {\n                    errors[handle.Index] = StatusCodes.GoodNoData;\n                }\n\n                // return the data.\n                result.HistoryData = new ExtensionObject(events);\n            }\n        }\n\n        /// <summary>\n        /// Updates or inserts events.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToUpdate\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryUpdateEvents(\n            ServerSystemContext context,\n            IList<UpdateEventDetails> nodesToUpdate,\n            IList<HistoryUpdateResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToUpdate = nodesToUpdate[handle.Index];\n\n                // validate the event filter.\n                var filterContext = new FilterContext(context.NamespaceUris, context.TypeTable, context);\n                var filterResult = nodeToUpdate.Filter.Validate(filterContext);\n\n                if (ServiceResult.IsBad(filterResult.Status))\n                {\n                    errors[handle.Index] = filterResult.Status;\n                    continue;\n                }\n\n                // all done.\n                errors[handle.Index] = StatusCodes.BadNotImplemented;\n            }\n        }\n\n        /// <summary>\n        /// Deletes history events.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToUpdate\"></param>\n        /// <param name=\"results\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryDeleteEvents(\n            ServerSystemContext context,\n            IList<DeleteEventDetails> nodesToUpdate,\n            IList<HistoryUpdateResult> results,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToUpdate = nodesToUpdate[handle.Index];\n                var result = results[handle.Index];\n\n                // delete events.\n                var failed = false;\n\n                for (var jj = 0; jj < nodeToUpdate.EventIds.Count; jj++)\n                {\n                    try\n                    {\n                        var eventId = new Guid(nodeToUpdate.EventIds[jj]).ToString();\n\n                        if (!_generator.DeleteEvent(eventId))\n                        {\n                            result.OperationResults.Add(StatusCodes.BadEventIdUnknown);\n                            failed = true;\n                            continue;\n                        }\n\n                        result.OperationResults.Add(StatusCodes.Good);\n                    }\n                    catch\n                    {\n                        result.OperationResults.Add(StatusCodes.BadEventIdUnknown);\n                        failed = true;\n                    }\n                }\n\n                // check if diagnostics are required.\n                if (failed)\n                {\n                    if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0)\n                    {\n                        for (var jj = 0; jj < nodeToUpdate.EventIds.Count; jj++)\n                        {\n                            if (StatusCode.IsBad(result.OperationResults[jj]))\n                            {\n                                result.DiagnosticInfos.Add(ServerUtils.CreateDiagnosticInfo(Server, context.OperationContext, result.OperationResults[jj]));\n                            }\n                        }\n                    }\n                }\n\n                // clear operation results if all good.\n                else\n                {\n                    result.OperationResults.Clear();\n                }\n\n                // all done.\n                errors[handle.Index] = ServiceResult.Good;\n            }\n        }\n\n        /// <summary>\n        /// Fetches the requested event fields from the event.\n        /// </summary>\n        /// <param name=\"request\"></param>\n        /// <param name=\"instance\"></param>\n        private HistoryEventFieldList GetEventFields(HistoryReadRequest request, BaseEventState instance)\n        {\n            // fetch the event fields.\n            var fields = new HistoryEventFieldList();\n\n            foreach (var clause in request.Filter.SelectClauses)\n            {\n                // get the value of the attribute (apply localization).\n                var value = instance.GetAttributeValue(\n                    request.FilterContext,\n                    clause.TypeDefinitionId,\n                    clause.BrowsePath,\n                    clause.AttributeId,\n                    clause.ParsedIndexRange);\n\n                // add the value to the list of event fields.\n                if (value != null)\n                {\n                    // translate any localized text.\n                    var text = value as LocalizedText;\n\n                    if (text != null)\n                    {\n                        value = Server.ResourceManager.Translate(request.FilterContext.PreferredLocales, text);\n                    }\n\n                    // add value.\n                    fields.EventFields.Add(new Variant(value));\n                }\n\n                // add a dummy entry for missing values.\n                else\n                {\n                    fields.EventFields.Add(Variant.Null);\n                }\n            }\n\n            return fields;\n        }\n\n        /// <summary>\n        /// Creates a new history request.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"details\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"nodeToRead\"></param>\n        private HistoryReadRequest CreateHistoryReadRequest(\n            ServerSystemContext context,\n            ReadEventDetails details,\n            NodeHandle handle,\n            HistoryReadValueId nodeToRead)\n        {\n            System.Diagnostics.Contracts.Contract.Assume(nodeToRead != null);\n            var filterContext = new FilterContext(context.NamespaceUris, context.TypeTable, context.PreferredLocales);\n            var events = new LinkedList<BaseEventState>();\n\n            for (var ii = ReportType.FluidLevelTest; ii <= ReportType.InjectionTest; ii++)\n            {\n                DataView view;\n                if (handle.Node is WellState)\n                {\n                    view = _generator.ReadHistoryForWellId(\n                        ii,\n                        (string)handle.Node.NodeId.Identifier,\n                        details.StartTime,\n                        details.EndTime);\n                }\n                else\n                {\n                    view = _generator.ReadHistoryForArea(\n                        ii,\n                        handle.Node.NodeId.Identifier as string,\n                        details.StartTime,\n                        details.EndTime);\n                }\n\n                var pos = events.First;\n                var sizeLimited = details.StartTime == DateTime.MinValue || details.EndTime == DateTime.MinValue;\n\n                foreach (DataRowView row in view)\n                {\n                    // check if reached max results.\n                    if (sizeLimited && events.Count >= details.NumValuesPerNode)\n                    {\n                        break;\n                    }\n\n                    var e = _generator.GetReport(context, NamespaceIndex, ii, row.Row);\n\n                    if (details.Filter.WhereClause?.Elements.Count > 0 && !details.Filter.WhereClause.Evaluate(filterContext, e))\n                    {\n                        continue;\n                    }\n\n                    var inserted = false;\n\n                    for (var jj = pos; jj != null; jj = jj.Next)\n                    {\n                        if (jj.Value.Time.Value > e.Time.Value)\n                        {\n                            events.AddBefore(jj, e);\n                            pos = jj;\n                            inserted = true;\n                            break;\n                        }\n                    }\n\n                    if (!inserted)\n                    {\n                        events.AddLast(e);\n                        pos = null;\n                    }\n                }\n            }\n\n            return new HistoryReadRequest\n            {\n                Events = events,\n                TimeFlowsBackward = details.StartTime == DateTime.MinValue || (details.EndTime != DateTime.MinValue && details.EndTime < details.StartTime),\n                NumValuesPerNode = details.NumValuesPerNode,\n                Filter = details.Filter,\n                FilterContext = filterContext\n            };\n        }\n\n        /// <summary>\n        /// Stores a read history request.\n        /// </summary>\n        private sealed class HistoryReadRequest\n        {\n            public byte[] ContinuationPoint { get; set; }\n            public LinkedList<BaseEventState> Events { get; set; }\n            public bool TimeFlowsBackward { get; set; }\n            public uint NumValuesPerNode { get; set; }\n            public EventFilter Filter { get; set; }\n            public FilterContext FilterContext { get; set; }\n        }\n\n        /// <summary>\n        /// Releases the history continuation point.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodesToRead\"></param>\n        /// <param name=\"errors\"></param>\n        /// <param name=\"nodesToProcess\"></param>\n        /// <param name=\"cache\"></param>\n        protected override void HistoryReleaseContinuationPoints(\n            ServerSystemContext context,\n            IList<HistoryReadValueId> nodesToRead,\n            IList<ServiceResult> errors,\n            List<NodeHandle> nodesToProcess,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            for (var ii = 0; ii < nodesToProcess.Count; ii++)\n            {\n                var handle = nodesToProcess[ii];\n                var nodeToRead = nodesToRead[handle.Index];\n\n                // find the continuation point.\n                var request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint);\n\n                if (request == null)\n                {\n                    errors[handle.Index] = StatusCodes.BadContinuationPointInvalid;\n                    continue;\n                }\n\n                // all done.\n                errors[handle.Index] = StatusCodes.Good;\n            }\n        }\n\n        /// <summary>\n        /// Loads a history continuation point.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        private static HistoryReadRequest LoadContinuationPoint(\n            ServerSystemContext context,\n            byte[] continuationPoint)\n        {\n            var session = context.OperationContext.Session;\n\n            if (session == null)\n            {\n                return null;\n            }\n\n            if (session.RestoreHistoryContinuationPoint(continuationPoint)\n                is not HistoryReadRequest request)\n            {\n                return null;\n            }\n\n            return request;\n        }\n\n        /// <summary>\n        /// Saves a history continuation point.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"request\"></param>\n        private static byte[] SaveContinuationPoint(\n            ServerSystemContext context,\n            HistoryReadRequest request)\n        {\n            var session = context.OperationContext.Session;\n\n            if (session == null)\n            {\n                return null;\n            }\n\n            var id = Guid.NewGuid();\n            session.SaveHistoryContinuationPoint(id, request);\n            request.ContinuationPoint = id.ToByteArray();\n            return request.ContinuationPoint;\n        }\n\n        /// <summary>\n        /// Does the simulation.\n        /// </summary>\n        /// <param name=\"state\">The state.</param>\n        private void DoSimulation(object state)\n        {\n            try\n            {\n                {\n                    var row = _generator.GenerateFluidLevelTestReport();\n                    var well = (BaseObjectState)FindPredefinedNode(new NodeId((string)row[BrowseNames.UidWell], NamespaceIndex), typeof(BaseObjectState));\n\n                    if (well?.AreEventsMonitored == true)\n                    {\n                        var e = _generator.GetFluidLevelTestReport(SystemContext, NamespaceIndex, row);\n                        well.ReportEvent(SystemContext, e);\n                    }\n                }\n\n                {\n                    var row = _generator.GenerateInjectionTestReport();\n                    var well = (BaseObjectState)FindPredefinedNode(new NodeId((string)row[BrowseNames.UidWell], NamespaceIndex), typeof(BaseObjectState));\n\n                    if (well?.AreEventsMonitored == true)\n                    {\n                        var e = _generator.GetInjectionTestReport(SystemContext, NamespaceIndex, row);\n                        well.ReportEvent(SystemContext, e);\n                    }\n                }\n            }\n            catch (NullReferenceException)\n            {\n                // Stop simulation because the subscription is closed. This should be fixed in the server library.\n                _simulationTimer.Change(Timeout.Infinite, Timeout.Infinite);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error during simulation.\");\n            }\n        }\n\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly HistoricalEventsServerConfiguration _configuration;\n#pragma warning restore IDE0052 // Remove unread private members\n        private Timer _simulationTimer;\n        private readonly ReportGenerator _generator;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalEvents/HistoricalEventsServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalEvents\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n\n    /// <inheritdoc/>\n    public class HistoricalEventsServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.HistoricalEvents\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public HistoricalEventsServer(TimeService timeservice)\n        {\n            _timeservice = timeservice;\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new HistoricalEventsNodeManager(server, configuration, _timeservice);\n        }\n\n        private readonly TimeService _timeservice;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalEvents/HistoricalEventsServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalEvents\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.HistoricalEvents)]\n    public class HistoricalEventsServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public HistoricalEventsServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/HistoricalEvents/ReportGenerator.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace HistoricalEvents\n{\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Data;\n    using System.Text;\n\n    public class ReportGenerator\n    {\n        public ReportGenerator(TimeService timeService)\n        {\n            _timeService = timeService;\n        }\n\n        public void Initialize()\n        {\n            _dataset = new DataSet();\n\n            _dataset.Tables.Add(\"FluidLevelTests\");\n            _dataset.Tables[0].Columns.Add(Opc.Ua.BrowseNames.EventId, typeof(string));\n            _dataset.Tables[0].Columns.Add(Opc.Ua.BrowseNames.Time, typeof(DateTime));\n            _dataset.Tables[0].Columns.Add(BrowseNames.NameWell, typeof(string));\n            _dataset.Tables[0].Columns.Add(BrowseNames.UidWell, typeof(string));\n            _dataset.Tables[0].Columns.Add(BrowseNames.TestDate, typeof(DateTime));\n            _dataset.Tables[0].Columns.Add(BrowseNames.TestReason, typeof(string));\n            _dataset.Tables[0].Columns.Add(BrowseNames.FluidLevel, typeof(double));\n            _dataset.Tables[0].Columns.Add(Opc.Ua.BrowseNames.EngineeringUnits, typeof(string));\n            _dataset.Tables[0].Columns.Add(BrowseNames.TestedBy, typeof(string));\n\n            _dataset.Tables.Add(\"InjectionTests\");\n            _dataset.Tables[1].Columns.Add(Opc.Ua.BrowseNames.EventId, typeof(string));\n            _dataset.Tables[1].Columns.Add(Opc.Ua.BrowseNames.Time, typeof(DateTime));\n            _dataset.Tables[1].Columns.Add(BrowseNames.NameWell, typeof(string));\n            _dataset.Tables[1].Columns.Add(BrowseNames.UidWell, typeof(string));\n            _dataset.Tables[1].Columns.Add(BrowseNames.TestDate, typeof(DateTime));\n            _dataset.Tables[1].Columns.Add(BrowseNames.TestReason, typeof(string));\n            _dataset.Tables[1].Columns.Add(BrowseNames.TestDuration, typeof(double));\n            _dataset.Tables[1].Columns.Add(Opc.Ua.BrowseNames.EngineeringUnits, typeof(string));\n            _dataset.Tables[1].Columns.Add(BrowseNames.InjectedFluid, typeof(string));\n\n            _random = new Random();\n\n            // look up the local timezone.\n            var timeZone = TimeZoneInfo.Local;\n            _timeZone = new TimeZoneDataType\n            {\n                Offset = (short)timeZone.GetUtcOffset(_timeService.Now).TotalMinutes,\n                DaylightSavingInOffset = timeZone.IsDaylightSavingTime(_timeService.Now)\n            };\n        }\n\n        private static readonly string[] kWellNames = [\n            \"Area51/Jupiter\",\n            \"Area51/Titan\",\n            \"Area99/Saturn\",\n            \"Area99/Mars\"\n        ];\n        private static readonly string[] kWellUIDs = [\n            \"Well_24412\",\n            \"Well_48306\",\n            \"Well_86234\",\n            \"Well_91423\"\n        ];\n        private static readonly string[] kTestReasons = [\n            \"initial\",\n            \"periodic\",\n            \"revision\",\n            \"unknown\",\n            \"other\"\n        ];\n        private static readonly string[] kTesters = [\n            \"Anne\",\n            \"Bob\",\n            \"Charley\",\n            \"Dawn\"\n        ];\n        private static readonly string[] kUnitLengths = [\n            \"m\",\n            \"yd\"\n        ];\n        private static readonly string[] kUnitTimes = [\n            \"s\",\n            \"min\",\n            \"h\"\n        ];\n        private static readonly string[] kInjectionFluids = [\n            \"oil\",\n            \"gas\",\n            \"non HC gas\",\n            \"CO2\",\n            \"water\",\n            \"brine\",\n            \"fresh water\",\n            \"oil-gas\",\n            \"oil-water\",\n            \"gas-water\",\n            \"condensate\",\n            \"steam\",\n            \"air\",\n            \"dry\",\n            \"unknown\",\n            \"other\"\n        ];\n\n        private int GetRandom(int min, int max)\n        {\n            return (int)Math.Truncate((_random.NextDouble() * (max - min + 1)) + min);\n        }\n\n        private string GetRandom(string[] values)\n        {\n            return values[GetRandom(0, values.Length - 1)];\n        }\n\n        public string[] GetAreas()\n        {\n            var area = new List<string>();\n\n            for (var ii = 0; ii < kWellNames.Length; ii++)\n            {\n                var index = kWellNames[ii].LastIndexOf('/');\n\n                if (index >= 0)\n                {\n                    var areaName = kWellNames[ii][..index];\n\n                    if (!area.Contains(areaName))\n                    {\n                        area.Add(areaName);\n                    }\n                }\n            }\n\n            return [.. area];\n        }\n\n        public WellInfo[] GetWells(string areaName)\n        {\n            var wells = new List<WellInfo>();\n\n            for (var ii = 0; ii < kWellUIDs.Length; ii++)\n            {\n                var well = new WellInfo\n                {\n                    Id = kWellUIDs[ii],\n                    Name = kWellUIDs[ii]\n                };\n\n                if (kWellNames.Length > ii)\n                {\n                    var index = kWellNames[ii].LastIndexOf('/');\n\n                    if (index >= 0 && kWellNames[ii][..index] == areaName)\n                    {\n                        well.Name = kWellNames[ii][(index + 1)..];\n                        wells.Add(well);\n                    }\n                }\n            }\n\n            return [.. wells];\n        }\n\n        public class WellInfo\n        {\n            public string Id { get; set; }\n            public string Name { get; set; }\n        }\n\n        public DataRow GenerateFluidLevelTestReport()\n        {\n            lock (_dataset)\n            {\n                var row = _dataset.Tables[0].NewRow();\n\n                row[0] = Guid.NewGuid().ToString();\n                row[1] = _timeService.UtcNow;\n\n                var index = GetRandom(0, kWellUIDs.Length - 1);\n                row[2] = kWellNames[index];\n                row[3] = kWellUIDs[index];\n\n                row[4] = _timeService.UtcNow.AddHours(-GetRandom(0, 10));\n                row[5] = GetRandom(kTestReasons);\n                row[6] = GetRandom(0, 1000);\n                row[7] = GetRandom(kUnitLengths);\n                row[8] = GetRandom(kTesters);\n\n                _dataset.Tables[0].Rows.Add(row);\n                _dataset.AcceptChanges();\n                return row;\n            }\n        }\n\n        /// <summary>\n        /// Deletes the event with the specified event id.\n        /// </summary>\n        /// <param name=\"eventId\"></param>\n        public bool DeleteEvent(string eventId)\n        {\n            var filter = new StringBuilder()\n                .Append('(')\n                .Append(Opc.Ua.BrowseNames.EventId)\n                .Append('=')\n                .Append('\\'')\n                .Append(eventId)\n                .Append('\\'')\n                .Append(')');\n\n            lock (_dataset)\n            {\n                for (var ii = 0; ii < _dataset.Tables.Count; ii++)\n                {\n                    var view = new DataView(_dataset.Tables[ii], filter.ToString(), null, DataViewRowState.CurrentRows);\n\n                    if (view.Count > 0)\n                    {\n                        view[0].Delete();\n                        _dataset.AcceptChanges();\n                        return true;\n                    }\n                }\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// Reads the report history for the specified time range.\n        /// </summary>\n        /// <param name=\"reportType\"></param>\n        /// <param name=\"uidWell\"></param>\n        /// <param name=\"startTime\"></param>\n        /// <param name=\"endTime\"></param>\n        public DataView ReadHistoryForWellId(ReportType reportType, string uidWell, DateTime startTime, DateTime endTime)\n        {\n            var filter = new StringBuilder()\n                .Append('(')\n                .Append(BrowseNames.UidWell)\n                .Append('=')\n                .Append('\\'')\n                .Append(uidWell)\n                .Append('\\'')\n                .Append(')');\n\n            return ReadHistory(reportType, filter, startTime, endTime);\n        }\n\n        /// <summary>\n        /// Reads the report history for the specified time range.\n        /// </summary>\n        /// <param name=\"reportType\"></param>\n        /// <param name=\"areaName\"></param>\n        /// <param name=\"startTime\"></param>\n        /// <param name=\"endTime\"></param>\n        public DataView ReadHistoryForArea(ReportType reportType, string areaName, DateTime startTime, DateTime endTime)\n        {\n            var filter = new StringBuilder();\n\n            if (!string.IsNullOrEmpty(areaName))\n            {\n                filter\n                    .Append('(')\n                    .Append(BrowseNames.NameWell)\n                    .Append(\" LIKE \")\n                    .Append('\\'')\n                    .Append(areaName)\n                    .Append('*')\n                    .Append('\\'')\n                    .Append(')');\n            }\n\n            return ReadHistory(reportType, filter, startTime, endTime);\n        }\n\n        /// <summary>\n        /// Reads the history for the specified time range.\n        /// </summary>\n        /// <param name=\"reportType\"></param>\n        /// <param name=\"filter\"></param>\n        /// <param name=\"startTime\"></param>\n        /// <param name=\"endTime\"></param>\n        private DataView ReadHistory(ReportType reportType, StringBuilder filter, DateTime startTime, DateTime endTime)\n        {\n            var earlyTime = startTime;\n            var lateTime = endTime;\n\n            if (endTime < startTime && endTime != DateTime.MinValue)\n            {\n                earlyTime = endTime;\n                lateTime = startTime;\n            }\n\n            if (earlyTime != DateTime.MinValue)\n            {\n                if (filter.Length > 0)\n                {\n                    filter.Append(\" AND \");\n                }\n\n                filter\n                    .Append('(')\n                    .Append(Opc.Ua.BrowseNames.Time)\n                    .Append(\">=\")\n                    .Append('#')\n                    .Append(earlyTime)\n                    .Append('#')\n                    .Append(')');\n            }\n\n            if (lateTime != DateTime.MinValue)\n            {\n                if (filter.Length > 0)\n                {\n                    filter.Append(\" AND \");\n                }\n\n                filter\n                    .Append('(')\n                    .Append(Opc.Ua.BrowseNames.Time)\n                    .Append('<')\n                    .Append('#')\n                    .Append(lateTime)\n                    .Append('#')\n                    .Append(')');\n            }\n\n            lock (_dataset)\n            {\n                return new DataView(\n                _dataset.Tables[(int)reportType],\n                filter.ToString(),\n                Opc.Ua.BrowseNames.Time,\n                DataViewRowState.CurrentRows);\n            }\n        }\n\n        /// <summary>\n        /// Converts the DB row to a UA event,\n        /// </summary>\n        /// <param name=\"context\">The UA context to use for the conversion.</param>\n        /// <param name=\"namespaceIndex\">The index assigned to the type model namespace.</param>\n        /// <param name=\"reportType\">The type of report.</param>\n        /// <param name=\"row\">The source for the report.</param>\n        /// <returns>The new report.</returns>\n        public BaseEventState GetReport(ISystemContext context, ushort namespaceIndex, ReportType reportType, DataRow row)\n        {\n            switch (reportType)\n            {\n                case ReportType.FluidLevelTest: return GetFluidLevelTestReport(context, namespaceIndex, row);\n                case ReportType.InjectionTest: return GetInjectionTestReport(context, namespaceIndex, row);\n            }\n\n            return null;\n        }\n\n        public BaseEventState GetFluidLevelTestReport(ISystemContext SystemContext, ushort namespaceIndex, DataRow row)\n        {\n            // construct translation object with default text.\n            var info = new TranslationInfo(\n                \"FluidLevelTestReport\",\n                \"en-US\",\n                \"A fluid level test report is available.\");\n\n            // construct the event.\n            var e = new FluidLevelTestReportState(null);\n\n            e.Initialize(\n                SystemContext,\n                null,\n                EventSeverity.Medium,\n                new LocalizedText(info));\n\n            // override event id and time.\n            e.EventId.Value = new Guid((string)row[Opc.Ua.BrowseNames.EventId]).ToByteArray();\n            e.Time.Value = (DateTime)row[Opc.Ua.BrowseNames.Time];\n\n            var nameWell = (string)row[BrowseNames.NameWell];\n            var uidWell = (string)row[BrowseNames.UidWell];\n\n            e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.SourceName, nameWell, false);\n            e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.SourceNode, new NodeId(uidWell, namespaceIndex), false);\n            e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.LocalTime, _timeZone, false);\n\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.NameWell, namespaceIndex), nameWell, false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.UidWell, namespaceIndex), uidWell, false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.TestDate, namespaceIndex), row[BrowseNames.TestDate], false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.TestReason, namespaceIndex), row[BrowseNames.TestReason], false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.TestedBy, namespaceIndex), row[BrowseNames.TestedBy], false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.FluidLevel, namespaceIndex), row[BrowseNames.FluidLevel], false);\n            e.FluidLevel.SetChildValue(SystemContext, Opc.Ua.BrowseNames.EngineeringUnits, new EUInformation((string)row[Opc.Ua.BrowseNames.EngineeringUnits], Namespaces.HistoricalEvents), false);\n\n            return e;\n        }\n\n        public DataRow GenerateInjectionTestReport()\n        {\n            lock (_dataset)\n            {\n                var row = _dataset.Tables[1].NewRow();\n\n                row[0] = Guid.NewGuid().ToString();\n                row[1] = _timeService.UtcNow;\n\n                var index = GetRandom(0, kWellUIDs.Length - 1);\n                row[2] = kWellNames[index];\n                row[3] = kWellUIDs[index];\n\n                row[4] = _timeService.UtcNow.AddHours(-GetRandom(0, 10));\n                row[5] = GetRandom(kTestReasons);\n                row[6] = GetRandom(0, 1000);\n                row[7] = GetRandom(kUnitTimes);\n                row[8] = GetRandom(kInjectionFluids);\n\n                _dataset.Tables[1].Rows.Add(row);\n                _dataset.AcceptChanges();\n\n                return row;\n            }\n        }\n\n        public BaseEventState GetInjectionTestReport(ISystemContext SystemContext, ushort namespaceIndex, DataRow row)\n        {\n            // construct translation object with default text.\n            var info = new TranslationInfo(\n                \"InjectionTestReport\",\n                \"en-US\",\n                \"An injection test report is available.\");\n\n            // construct the event.\n            var e = new InjectionTestReportState(null);\n\n            e.Initialize(\n                SystemContext,\n                null,\n                EventSeverity.Medium,\n                new LocalizedText(info));\n\n            // override event id and time.\n            e.EventId.Value = new Guid((string)row[Opc.Ua.BrowseNames.EventId]).ToByteArray();\n            e.Time.Value = (DateTime)row[Opc.Ua.BrowseNames.Time];\n\n            var nameWell = (string)row[BrowseNames.NameWell];\n            var uidWell = (string)row[BrowseNames.UidWell];\n\n            e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.SourceName, nameWell, false);\n            e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.SourceNode, new NodeId(uidWell, namespaceIndex), false);\n            e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.LocalTime, _timeZone, false);\n\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.NameWell, namespaceIndex), nameWell, false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.UidWell, namespaceIndex), uidWell, false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.TestDate, namespaceIndex), row[BrowseNames.TestDate], false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.TestReason, namespaceIndex), row[BrowseNames.TestReason], false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.InjectedFluid, namespaceIndex), row[BrowseNames.InjectedFluid], false);\n            e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.TestDuration, namespaceIndex), row[BrowseNames.TestDuration], false);\n            e.TestDuration.SetChildValue(SystemContext, Opc.Ua.BrowseNames.EngineeringUnits, new EUInformation((string)row[Opc.Ua.BrowseNames.EngineeringUnits], Namespaces.HistoricalEvents), false);\n\n            return e;\n        }\n\n        private DataSet _dataset;\n        private Random _random;\n        private TimeZoneDataType _timeZone;\n        private readonly TimeService _timeService;\n    }\n\n    public enum ReportType\n    {\n        FluidLevelTest,\n        InjectionTest\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/IServerFactory.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Create servers\n    /// </summary>\n    public interface IServerFactory\n    {\n        /// <summary>\n        /// Create server and server configuration for hosting.\n        /// </summary>\n        /// <param name=\"ports\"></param>\n        /// <param name=\"pkiRootPath\"></param>\n        /// <param name=\"server\"></param>\n        /// <param name=\"listenHostName\"></param>\n        /// <param name=\"alternativeAddresses\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"certStoreType\"></param>\n        /// <param name=\"configure\"></param>\n        /// <returns></returns>\n        ApplicationConfiguration CreateServer(IEnumerable<int> ports,\n            string pkiRootPath, out ServerBase server, string listenHostName = null,\n            IEnumerable<string> alternativeAddresses = null, string path = null,\n            string certStoreType = null, Action<ServerConfiguration> configure = null);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/IServerHost.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Server host\n    /// </summary>\n    public interface IServerHost : IDisposable\n    {\n        /// <summary>\n        /// Server application instance certificate\n        /// </summary>\n        X509Certificate2 Certificate { get; }\n\n        /// <summary>\n        /// Set auto accept mode\n        /// </summary>\n        bool AutoAccept { get; set; }\n\n        /// <summary>\n        /// Start server listening on the specified\n        /// ports.\n        /// </summary>\n        /// <param name=\"ports\"></param>\n        /// <returns></returns>\n        Task StartAsync(IEnumerable<int> ports);\n\n        /// <summary>\n        /// Restart server.\n        /// </summary>\n        /// <param name=\"predicate\"></param>\n        /// <returns></returns>\n        Task RestartAsync(Func<Task> predicate = null);\n\n        /// <summary>\n        /// Add reverse connection\n        /// </summary>\n        /// <param name=\"client\"></param>\n        /// <param name=\"maxSessionCount\"></param>\n        Task AddReverseConnectionAsync(Uri client, int maxSessionCount);\n\n        /// <summary>\n        /// Remove reverse connection\n        /// </summary>\n        /// <param name=\"client\"></param>\n        Task RemoveReverseConnectionAsync(Uri client);\n\n        /// <summary>\n        /// Stop server - same as dispose but async.\n        /// </summary>\n        Task StopAsync();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/ITestServer.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    /// <summary>\n    /// Test server interface\n    /// </summary>\n    public interface ITestServer\n    {\n        /// <summary>\n        /// Get published nodes json\n        /// </summary>\n        /// <returns></returns>\n        public string PublishedNodesJson { get; }\n\n        /// <summary>\n        /// Run in choas mode and randomly delete sessions, subscriptions\n        /// inject errors and so on.\n        /// </summary>\n        bool Chaos { get; set; }\n\n        /// <summary>\n        /// Inject errors responding to incoming requests. The error\n        /// rate is the probability of injection, e.g. 3 means 1 out\n        /// of 3 requests will be injected with an error.\n        /// </summary>\n        int InjectErrorResponseRate { get; set; }\n\n        /// <summary>\n        /// Close sessions\n        /// </summary>\n        /// <param name=\"deleteSubscriptions\"></param>\n        void CloseSessions(bool deleteSubscriptions = false);\n\n        /// <summary>\n        /// Close subscription. Notify expiration (timeout) of the\n        /// subscription before closing (status message) if notifyExpiration\n        /// is set to true.\n        /// </summary>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"notifyExpiration\"></param>\n        void CloseSubscription(uint subscriptionId, bool notifyExpiration);\n\n        /// <summary>\n        /// Close all subscriptions. Notify expiration (timeout) of the\n        /// subscription before closing (status message) if notifyExpiration\n        /// is set to true.\n        /// </summary>\n        /// <param name=\"notifyExpiration\"></param>\n        void CloseSubscriptions(bool notifyExpiration = false);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Isa95Jobs/Isa95JobControlNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Isa95Jobs\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.Reflection;\n    using System.Threading;\n    using UAModel.ISA95_JOBCONTROL_V2;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class Isa95JobControlNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public Isa95JobControlNodeManager(IServerInternal server, ApplicationConfiguration configuration) :\n            base(server, configuration)\n        {\n            SystemContext.NodeIdFactory = this;\n\n            // set one namespace for the type model and one names for dynamically created nodes.\n            var namespaceUrls = new string[1];\n            namespaceUrls[0] = UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2;\n            SetNamespaces(namespaceUrls);\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<Isa95JobControlServerConfiguration>()\n                ?? new Isa95JobControlServerConfiguration();\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _simulationTimer != null)\n            {\n                Utils.SilentDispose(_simulationTimer);\n                _simulationTimer = null;\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.UAModel.ISA95_JOBCONTROL_V2.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            return predefinedNodes;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                LoadPredefinedNodes(SystemContext, externalReferences);\n\n                // start a simulation that changes the values of the nodes.\n                _simulationTimer = new Timer(DoSimulation, null, kEventInterval, kEventInterval);\n            }\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                base.DeleteAddressSpace();\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // check for predefined nodes.\n                if (PredefinedNodes != null && PredefinedNodes.TryGetValue(nodeId, out var node))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = true,\n                        Node = node\n                    };\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            // TBD\n\n            return null;\n        }\n\n        /// <summary>\n        /// Does the simulation.\n        /// </summary>\n        /// <param name=\"state\">The state.</param>\n        private void DoSimulation(object state)\n        {\n            try\n            {\n                // construct translation object with default text.\n                var info = new TranslationInfo(\n                    \"ISA95JobResponse\",\n                    \"en-US\",\n                    \"The job '{0}' has completed.\",\n                    ++_jobId);\n\n                // construct the event.\n                var e = new ISA95JobOrderStatusEventTypeState(null);\n\n                e.Initialize(\n                    SystemContext,\n                    null,\n                    (EventSeverity)0,\n                    new LocalizedText(info));\n\n                e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.SourceName, \"GB05_ServerTEST\", false);\n                e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.SourceNode, Opc.Ua.ObjectIds.Server, false);\n\n                var startTime = DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(3));\n                var endTime = DateTime.UtcNow;\n                var response = new ISA95JobResponseDataType\n                {\n                    EncodingMask = (ISA95JobResponseDataTypeFields)(\n                        (int)ISA95JobResponseDataTypeFields.None |\n                        (int)ISA95JobResponseDataTypeFields.StartTime |\n                        (int)ISA95JobResponseDataTypeFields.EndTime |\n                        (int)ISA95JobResponseDataTypeFields.EquipmentActuals |\n                        (int)ISA95JobResponseDataTypeFields.MaterialActuals),\n                    JobOrderID = _jobId.ToString(CultureInfo.InvariantCulture),\n                    JobResponseID = Guid.NewGuid().ToString(),\n                    StartTime = startTime,\n                    EndTime = endTime,\n                    EquipmentActuals =\n                        [\n                            new ISA95EquipmentDataType\n                            {\n                                EncodingMask =  (ISA95EquipmentDataTypeFields)(\n                                    (int)ISA95EquipmentDataTypeFields.EquipmentUse |\n                                    (int)ISA95EquipmentDataTypeFields.EngineeringUnits |\n                                    (int)ISA95EquipmentDataTypeFields.Quantity),\n                                EngineeringUnits = new EUInformation(\"rpm\", \"RPM\"),\n                                EquipmentUse = \"consumable\",\n                                Quantity = \"500\"\n                            },\n                            new ISA95EquipmentDataType\n                            {\n                                EncodingMask =  (ISA95EquipmentDataTypeFields)(\n                                    (int)ISA95EquipmentDataTypeFields.EquipmentUse |\n                                    (int)ISA95EquipmentDataTypeFields.EngineeringUnits |\n                                    (int)ISA95EquipmentDataTypeFields.Quantity),\n                                EngineeringUnits = new EUInformation(\"C\", \"Celsius\"),\n                                EquipmentUse = \"consumable\",\n                                Quantity = \"3\"\n                            }\n                        ],\n                    MaterialActuals =\n                        [\n                            new ISA95MaterialDataType\n                            {\n                                EncodingMask = (ISA95MaterialDataTypeFields)(\n                                    (int)ISA95MaterialDataTypeFields.MaterialClassID |\n                                    (int)ISA95MaterialDataTypeFields.MaterialUse |\n                                    (int)ISA95MaterialDataTypeFields.Quantity),\n                                MaterialClassID = Guid.NewGuid().ToString(),\n                                MaterialUse = \"consumable\",\n                                Quantity = \"1\"\n                            },\n                            new ISA95MaterialDataType\n                            {\n                                EncodingMask = (ISA95MaterialDataTypeFields)(\n                                    (int)ISA95MaterialDataTypeFields.MaterialClassID |\n                                    (int)ISA95MaterialDataTypeFields.MaterialUse |\n                                    (int)ISA95MaterialDataTypeFields.Quantity),\n                                MaterialClassID = Guid.NewGuid().ToString(),\n                                MaterialUse = \"consumable\",\n                                Quantity = \"2\"\n                            }\n                        ]\n                };\n                e.SetChildValue(SystemContext, new QualifiedName(UAModel.ISA95_JOBCONTROL_V2.BrowseNames.JobResponse, NamespaceIndex), response, false);\n\n                var jobOrderState = new ISA95JobOrderAndStateDataType\n                {\n                    JobOrder = new ISA95JobOrderDataType\n                    {\n                        EncodingMask = ISA95JobOrderDataTypeFields.None,\n                        JobOrderID = _jobId.ToString(CultureInfo.InvariantCulture),\n                        EquipmentRequirements =\n                            [\n                                new ISA95EquipmentDataType\n                                {\n                                    EncodingMask = (ISA95EquipmentDataTypeFields)(\n                                        (int)ISA95EquipmentDataTypeFields.EquipmentUse |\n                                        (int) ISA95EquipmentDataTypeFields.EngineeringUnits |\n                                        (int)ISA95EquipmentDataTypeFields.Quantity),\n                                    EngineeringUnits = new EUInformation(\"rpm\", \"RPM\"),\n                                    EquipmentUse = \"free\",\n                                    Quantity = \"1000\"\n                                }\n                            ]\n                    },\n                    State =\n                    [\n                        new ISA95StateDataType\n                        {\n                            StateNumber = ++_state,\n                            BrowsePath = new RelativePath(new QualifiedName(\"State \" + _state, NamespaceIndex)),\n                            StateText = new LocalizedText(\"en-US\", \"State \" + _state)\n                        },\n                        new ISA95StateDataType\n                        {\n                            StateNumber = ++_state,\n                            BrowsePath = new RelativePath(new QualifiedName(\"State \" + _state, NamespaceIndex)),\n                            StateText = new LocalizedText(\"en-US\", \"State \" + _state)\n                        },\n                        new ISA95StateDataType\n                        {\n                            StateNumber = ++_state,\n                            BrowsePath = new RelativePath(new QualifiedName(\"State \" + _state, NamespaceIndex)),\n                            StateText = new LocalizedText(\"en-US\", \"State \" + _state)\n                        }\n                    ]\n                };\n                e.SetChildValue(SystemContext, new QualifiedName(UAModel.ISA95_JOBCONTROL_V2.BrowseNames.JobState, NamespaceIndex), jobOrderState, false);\n                // e.SetChildValue(SystemContext, new QualifiedName(UAModel.ISA95_JOBCONTROL_V2.BrowseNames.JobOrder, NamespaceIndex), state, false);\n\n                Server.ReportEvent(e);\n            }\n            catch (NullReferenceException)\n            {\n                // Stop simulation because the subscription is closed. This should be fixed in the server library.\n                _simulationTimer.Change(Timeout.Infinite, Timeout.Infinite);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error during simulation.\");\n            }\n        }\n\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly Isa95JobControlServerConfiguration _configuration;\n#pragma warning restore IDE0052 // Remove unread private members\n        private Timer _simulationTimer;\n        private int _jobId;\n        private uint _state;\n        private const int kEventInterval = 1000;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Isa95Jobs/Isa95JobControlServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Isa95Jobs\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class Isa95JobControlServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    UAModel.ISA95_JOBCONTROL_V2.Namespaces.ISA95_JOBCONTROL_V2\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new Isa95JobControlNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Isa95Jobs/Isa95JobControlServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Isa95Jobs\n{\n    using System.Runtime.Serialization;\n    using UAModel.ISA95_JOBCONTROL_V2;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.ISA95_JOBCONTROL_V2)]\n    public class Isa95JobControlServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public Isa95JobControlServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/MemoryBuffer/MemoryBufferBrowser.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace MemoryBuffer\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// A class to browse the references for a memory buffer.\n    /// </summary>\n    public class MemoryBufferBrowser : NodeBrowser\n    {\n        /// <summary>\n        /// Creates a new browser object with a set of filters.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"referenceType\"></param>\n        /// <param name=\"includeSubtypes\"></param>\n        /// <param name=\"browseDirection\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"additionalReferences\"></param>\n        /// <param name=\"internalOnly\"></param>\n        /// <param name=\"buffer\"></param>\n        public MemoryBufferBrowser(\n            ISystemContext context,\n            ViewDescription view,\n            NodeId referenceType,\n            bool includeSubtypes,\n            BrowseDirection browseDirection,\n            QualifiedName browseName,\n            IEnumerable<IReference> additionalReferences,\n            bool internalOnly,\n            MemoryBufferState buffer)\n        :\n            base(\n                context,\n                view,\n                referenceType,\n                includeSubtypes,\n                browseDirection,\n                browseName,\n                additionalReferences,\n                internalOnly)\n        {\n            _buffer = buffer;\n            _stage = Stage.Begin;\n        }\n\n        /// <summary>\n        /// Returns the next reference.\n        /// </summary>\n        /// <returns></returns>\n        public override IReference Next()\n        {\n            lock (DataLock)\n            {\n                // enumerate pre-defined references.\n                // always call first to ensure any pushed-back references are returned first.\n                var reference = base.Next();\n\n                if (reference != null)\n                {\n                    return reference;\n                }\n\n                if (_stage == Stage.Begin)\n                {\n                    _stage = Stage.Components;\n                    _position = 0;\n                }\n\n                // don't start browsing huge number of references when only internal references are requested.\n                if (InternalOnly)\n                {\n                    return null;\n                }\n\n                // enumerate components.\n                if (_stage == Stage.Components)\n                {\n                    if (IsRequired(ReferenceTypeIds.HasComponent, false))\n                    {\n                        reference = NextChild();\n\n                        if (reference != null)\n                        {\n                            return reference;\n                        }\n                    }\n\n                    _stage = Stage.ModelParents;\n                    _position = 0;\n                }\n\n                // all done.\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Returns the next child.\n        /// </summary>\n        private NodeStateReference NextChild()\n        {\n            MemoryTagState tag;\n\n            // check if a specific browse name is requested.\n            if (!QualifiedName.IsNull(BrowseName))\n            {\n                // check if match found previously.\n                if (_position == uint.MaxValue)\n                {\n                    return null;\n                }\n\n                // browse name must be qualified by the correct namespace.\n                if (_buffer.TypeDefinitionId.NamespaceIndex != BrowseName.NamespaceIndex)\n                {\n                    return null;\n                }\n\n                var name = BrowseName.Name;\n\n                for (var ii = 0; ii < name.Length; ii++)\n                {\n#pragma warning disable CA2249 // Consider using 'string.Contains' instead of 'string.IndexOf'\n                    if (\"0123456789ABCDEF\".IndexOf(name[ii], StringComparison.Ordinal) == -1)\n                    {\n#pragma warning restore CA2249 // Consider using 'string.Contains' instead of 'string.IndexOf'\n                        return null;\n                    }\n                }\n\n                _position = Convert.ToUInt32(name, 16);\n\n                // check for memory overflow.\n                if (_position >= _buffer.SizeInBytes.Value)\n                {\n                    return null;\n                }\n\n                tag = new MemoryTagState(_buffer, _position);\n                _position = uint.MaxValue;\n            }\n\n            // return the child at the next position.\n            else\n            {\n                if (_position >= _buffer.SizeInBytes.Value)\n                {\n                    return null;\n                }\n\n                tag = new MemoryTagState(_buffer, _position);\n                _position += _buffer.ElementSize;\n\n                // check for memory overflow.\n                if (_position >= _buffer.SizeInBytes.Value)\n                {\n                    return null;\n                }\n            }\n\n            return new NodeStateReference(ReferenceTypeIds.HasComponent, false, tag);\n        }\n\n        /// <summary>\n        /// The stages available in a browse operation.\n        /// </summary>\n        private enum Stage\n        {\n            Begin,\n            Components,\n            ModelParents,\n            Done\n        }\n\n        private Stage _stage;\n        private uint _position;\n        private readonly MemoryBufferState _buffer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/MemoryBuffer/MemoryBufferConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace MemoryBuffer\n{\n    using System.Collections.Generic;\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the test node manager\n    /// </summary>\n    [DataContract(Namespace = Namespaces.MemoryBuffer)]\n    public class MemoryBufferConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public MemoryBufferConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            Buffers = null;\n        }\n\n        /// <summary>\n        /// The buffers exposed by the memory\n        /// </summary>\n        [DataMember(Order = 1)]\n        public MemoryBufferInstanceCollection Buffers { get; set; }\n    }\n\n    /// <summary>\n    /// Stores the configuration for a memory buffer instance.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.MemoryBuffer)]\n    public class MemoryBufferInstance\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public MemoryBufferInstance()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            Name = null;\n            TagCount = 0;\n            DataType = null;\n        }\n\n        /// <summary>\n        /// The browse name for the instance.\n        /// </summary>\n        [DataMember(Order = 1)]\n        public string Name { get; set; }\n\n        /// <summary>\n        /// The number of tags in the buffer.\n        /// </summary>\n        [DataMember(Order = 2)]\n        public int TagCount { get; set; }\n\n        /// <summary>\n        /// The data type of the tags in the buffer.\n        /// </summary>\n        [DataMember(Order = 3)]\n        public string DataType { get; set; }\n    }\n\n    /// <summary>\n    /// A collection of MemoryBufferInstances.\n    /// </summary>\n    [CollectionDataContract(Name = \"ListOfMemoryBufferInstance\", Namespace = Namespaces.MemoryBuffer, ItemName = \"MemoryBufferInstance\")]\n    public class MemoryBufferInstanceCollection : List<MemoryBufferInstance>;\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/MemoryBuffer/MemoryBufferMonitoredItem.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace MemoryBuffer\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <summary>\n    /// Provides a basic monitored item implementation which does not support queuing.\n    /// </summary>\n    public class MemoryBufferMonitoredItem : MonitoredItem\n    {\n        /// <summary>\n        /// Initializes the object with its node type.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"nodeManager\"></param>\n        /// <param name=\"mangerHandle\"></param>\n        /// <param name=\"offset\"></param>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"id\"></param>\n        /// <param name=\"itemToMonitor\"></param>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"monitoringMode\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"originalFilter\"></param>\n        /// <param name=\"filterToUse\"></param>\n        /// <param name=\"range\"></param>\n        /// <param name=\"samplingInterval\"></param>\n        /// <param name=\"queueSize\"></param>\n        /// <param name=\"discardOldest\"></param>\n        /// <param name=\"minimumSamplingInterval\"></param>\n        public MemoryBufferMonitoredItem(\n            IServerInternal server,\n            INodeManager nodeManager,\n            object mangerHandle,\n            uint offset,\n            uint subscriptionId,\n            uint id,\n            ReadValueId itemToMonitor,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            MonitoringMode monitoringMode,\n            uint clientHandle,\n            MonitoringFilter originalFilter,\n            MonitoringFilter filterToUse,\n            Range range,\n            double samplingInterval,\n            uint queueSize,\n            bool discardOldest,\n            double minimumSamplingInterval)\n        :\n            base(\n                server,\n                nodeManager,\n                mangerHandle,\n                subscriptionId,\n                id,\n                itemToMonitor,\n                diagnosticsMasks,\n                timestampsToReturn,\n                monitoringMode,\n                clientHandle,\n                originalFilter,\n                filterToUse,\n                range,\n                samplingInterval,\n                queueSize,\n                discardOldest,\n                minimumSamplingInterval)\n        {\n            Offset = offset;\n        }\n\n        /// <summary>\n        /// Modifies the monitored item parameters,\n        /// </summary>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"samplingInterval\"></param>\n        public ServiceResult Modify(\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            uint clientHandle,\n            double samplingInterval)\n        {\n            return ModifyAttributes(diagnosticsMasks,\n                timestampsToReturn,\n                clientHandle,\n                null,\n                null,\n                null,\n                samplingInterval,\n                0,\n                false);\n        }\n\n        /// <summary>\n        /// The offset in the memory buffer.\n        /// </summary>\n        public uint Offset { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/MemoryBuffer/MemoryBufferNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace MemoryBuffer\n{\n    using Opc.Ua;\n    using Opc.Ua.Sample;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Reflection;\n\n    /// <summary>\n    /// A node manager for a variety of test data.\n    /// </summary>\n    public class MemoryBufferNodeManager : SampleNodeManager\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public MemoryBufferNodeManager(IServerInternal server,\n            ApplicationConfiguration configuration) :\n            base(server)\n        {\n            NamespaceUris = new List<string> {\n                Namespaces.MemoryBuffer,\n                Namespaces.MemoryBuffer + \"/Instance\"\n            };\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<MemoryBufferConfiguration>()\n                ?? new MemoryBufferConfiguration();\n\n            _buffers = [];\n        }\n\n        /// <summary>\n        /// Dispose\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            if (disposing && _buffers != null)\n            {\n                foreach (var buffer in _buffers.Values)\n                {\n                    buffer.Dispose();\n                }\n                _buffers.Clear();\n                _buffers = null;\n            }\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                base.CreateAddressSpace(externalReferences);\n\n                // create the nodes from configuration.\n                var namespaceIndex = Server.NamespaceUris.GetIndexOrAppend(Namespaces.MemoryBuffer);\n\n                var root = (BaseInstanceState)FindPredefinedNode(\n                    new NodeId(Objects.MemoryBuffers, namespaceIndex),\n                    typeof(BaseInstanceState));\n\n                // create the nodes from configuration.\n                namespaceIndex = Server.NamespaceUris.GetIndexOrAppend(Namespaces.MemoryBuffer + \"/Instance\");\n\n                if (_configuration?.Buffers != null)\n                {\n                    for (var ii = 0; ii < _configuration.Buffers.Count; ii++)\n                    {\n                        var instance = _configuration.Buffers[ii];\n\n                        // create a new buffer.\n                        var bufferNode = new MemoryBufferState(SystemContext, instance);\n\n                        // assign node ids.\n                        bufferNode.Create(\n                            SystemContext,\n                            new NodeId(bufferNode.SymbolicName, namespaceIndex),\n                            new QualifiedName(bufferNode.SymbolicName, namespaceIndex),\n                            null,\n                            true);\n\n                        bufferNode.CreateBuffer(instance.DataType, instance.TagCount);\n                        bufferNode.InitializeMonitoring(Server, this);\n\n                        // save the buffers for easy look up later.\n                        _buffers[bufferNode.SymbolicName] = bufferNode;\n\n                        // link to root.\n                        root.AddChild(bufferNode);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            return predefinedNodes;\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                base.DeleteAddressSpace();\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        /// <remarks>\n        /// This must efficiently determine whether the node belongs to the node manager. If it does belong to\n        /// NodeManager it should return a handle that does not require the NodeId to be validated again when\n        /// the handle is passed into other methods such as 'Read' or 'Write'.\n        /// </remarks>\n        protected override object GetManagerHandle(ISystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                if (nodeId.Identifier is string id)\n                {\n                    // check for a reference to the buffer.\n\n                    if (_buffers.TryGetValue(id, out var buffer))\n                    {\n                        return buffer;\n                    }\n\n                    // tag ids have the syntax <bufferName>[<address>]\n                    if (id[^1] != ']')\n                    {\n                        return null;\n                    }\n\n                    var index = id.IndexOf('[');\n\n                    if (index == -1)\n                    {\n                        return null;\n                    }\n\n                    var bufferName = id[..index];\n\n                    // verify the buffer.\n                    if (!_buffers.TryGetValue(bufferName, out buffer))\n                    {\n                        return null;\n                    }\n\n                    // validate the address.\n                    var offsetText = id.Substring(index + 1, id.Length - index - 2);\n\n                    for (var ii = 0; ii < offsetText.Length; ii++)\n                    {\n                        if (!char.IsDigit(offsetText[ii]))\n                        {\n                            return null;\n                        }\n                    }\n\n                    // check range on offset.\n                    var offset = Convert.ToUInt32(offsetText);\n\n                    if (offset >= buffer.SizeInBytes.Value)\n                    {\n                        return null;\n                    }\n\n                    // the tags contain all of the metadata required to support the UA\n                    // operations and pointers to functions in the buffer object that\n                    // allow the value to be accessed. These tags are ephemeral and are\n                    // discarded after the operation completes. This design pattern allows\n                    // the server to expose potentially millions of UA nodes without\n                    // creating millions of objects that reside in memory.\n                    return new MemoryTagState(buffer, offset);\n                }\n\n                return base.GetManagerHandle(context, nodeId, cache);\n            }\n        }\n\n        /// <summary>\n        /// Creates a new set of monitored items for a set of variables.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"source\"></param>\n        /// <param name=\"subscriptionId\"></param>\n        /// <param name=\"publishingInterval\"></param>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"itemToCreate\"></param>\n        /// <param name=\"createDurable\"></param>\n        /// <param name=\"globalIdCounter\"></param>\n        /// <param name=\"filterError\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <remarks>\n        /// This method only handles data change subscriptions. Event subscriptions are created by the SDK.\n        /// </remarks>\n        protected override ServiceResult CreateMonitoredItem(\n            ISystemContext context,\n            NodeState source,\n            uint subscriptionId,\n            double publishingInterval,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            MonitoredItemCreateRequest itemToCreate,\n            bool createDurable,\n            ref long globalIdCounter,\n            out MonitoringFilterResult filterError,\n            out IMonitoredItem monitoredItem)\n        {\n            filterError = null;\n            monitoredItem = null;\n\n            // use default behavoir for non-tag sources.\n            if (source is not MemoryTagState tag)\n            {\n                return base.CreateMonitoredItem(\n                    context,\n                    source,\n                    subscriptionId,\n                    publishingInterval,\n                    diagnosticsMasks,\n                    timestampsToReturn,\n                    itemToCreate,\n                    createDurable,\n                    ref globalIdCounter,\n                    out filterError,\n                    out monitoredItem);\n            }\n\n            // validate parameters.\n            var parameters = itemToCreate.RequestedParameters;\n\n            // no filters supported at this time.\n            var filter = (MonitoringFilter)ExtensionObject.ToEncodeable(parameters.Filter);\n\n            if (filter != null)\n            {\n                return StatusCodes.BadFilterNotAllowed;\n            }\n\n            // index range not supported.\n            if (itemToCreate.ItemToMonitor.ParsedIndexRange != NumericRange.Empty)\n            {\n                return StatusCodes.BadIndexRangeInvalid;\n            }\n\n            // data encoding not supported.\n            if (!QualifiedName.IsNull(itemToCreate.ItemToMonitor.DataEncoding))\n            {\n                return StatusCodes.BadDataEncodingInvalid;\n            }\n\n            // read initial value.\n            var initialValue = new DataValue\n            {\n                Value = null,\n                ServerTimestamp = DateTime.UtcNow,\n                SourceTimestamp = DateTime.MinValue,\n                StatusCode = StatusCodes.Good\n            };\n\n            var error = source.ReadAttribute(\n                context,\n                itemToCreate.ItemToMonitor.AttributeId,\n                itemToCreate.ItemToMonitor.ParsedIndexRange,\n                itemToCreate.ItemToMonitor.DataEncoding,\n                initialValue);\n\n            if (ServiceResult.IsBad(error))\n            {\n                return error;\n            }\n\n            // get the monitored node for the containing buffer.\n\n            if (tag.Parent is not MemoryBufferState buffer)\n            {\n                return StatusCodes.BadInternalError;\n            }\n\n            // create a globally unique identifier.\n            var monitoredItemId = Utils.IncrementIdentifier(ref globalIdCounter);\n\n            // determine the sampling interval.\n            var samplingInterval = itemToCreate.RequestedParameters.SamplingInterval;\n\n            if (samplingInterval < 0)\n            {\n                samplingInterval = publishingInterval;\n            }\n\n            // create the item.\n            var datachangeItem = buffer.CreateDataChangeItem(\n                tag,\n                monitoredItemId,\n                itemToCreate.ItemToMonitor,\n                diagnosticsMasks,\n                timestampsToReturn,\n                itemToCreate.MonitoringMode,\n                itemToCreate.RequestedParameters.ClientHandle,\n                samplingInterval);\n\n            /*\n            // create the item.\n            MemoryBufferMonitoredItem datachangeItem = buffer.CreateDataChangeItem(\n                context,\n                tag,\n                monitoredItemId,\n                itemToCreate.ItemToMonitor.AttributeId,\n                diagnosticsMasks,\n                timestampsToReturn,\n                itemToCreate.MonitoringMode,\n                itemToCreate.RequestedParameters.ClientHandle,\n                samplingInterval);\n            */\n\n            // report the initial value.\n            datachangeItem.QueueValue(initialValue, null);\n\n            // update monitored item list.\n            monitoredItem = datachangeItem;\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Modifies the parameters for a monitored item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"itemToModify\"></param>\n        /// <param name=\"filterError\"></param>\n        protected override ServiceResult ModifyMonitoredItem(\n            ISystemContext context,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            IMonitoredItem monitoredItem,\n            MonitoredItemModifyRequest itemToModify,\n            out MonitoringFilterResult filterError)\n        {\n            filterError = null;\n\n            // check for valid handle.\n\n            if (monitoredItem.ManagerHandle is not MemoryBufferState)\n            {\n                return base.ModifyMonitoredItem(\n                    context,\n                    diagnosticsMasks,\n                    timestampsToReturn,\n                    monitoredItem,\n                    itemToModify,\n                    out filterError);\n            }\n\n            // owned by this node manager.\n            itemToModify.Processed = true;\n\n            // get the monitored item.\n\n            if (monitoredItem is not MemoryBufferMonitoredItem datachangeItem)\n            {\n                return StatusCodes.BadMonitoredItemIdInvalid;\n            }\n\n            // validate parameters.\n            var parameters = itemToModify.RequestedParameters;\n\n            // no filters supported at this time.\n            var filter = (MonitoringFilter)ExtensionObject.ToEncodeable(parameters.Filter);\n\n            if (filter != null)\n            {\n                return StatusCodes.BadFilterNotAllowed;\n            }\n\n            // modify the monitored item parameters.\n            _ = datachangeItem.Modify(\n                diagnosticsMasks,\n                timestampsToReturn,\n                itemToModify.RequestedParameters.ClientHandle,\n                itemToModify.RequestedParameters.SamplingInterval);\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Deletes a monitored item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"processed\"></param>\n        protected override ServiceResult DeleteMonitoredItem(\n            ISystemContext context,\n            IMonitoredItem monitoredItem,\n            out bool processed)\n        {\n            // check for valid handle.\n            if (monitoredItem.ManagerHandle is not MemoryBufferState buffer)\n            {\n                return base.DeleteMonitoredItem(\n                    context,\n                    monitoredItem,\n                    out processed);\n            }\n\n            // owned by this node manager.\n            processed = true;\n\n            // get the monitored item.\n\n            if (monitoredItem is not MemoryBufferMonitoredItem datachangeItem)\n            {\n                return StatusCodes.BadMonitoredItemIdInvalid;\n            }\n\n            // delete the item.\n            buffer.DeleteItem(datachangeItem);\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Changes the monitoring mode for an item.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        /// <param name=\"monitoringMode\"></param>\n        /// <param name=\"processed\"></param>\n        protected override ServiceResult SetMonitoringMode(\n            ISystemContext context,\n            IMonitoredItem monitoredItem,\n            MonitoringMode monitoringMode,\n            out bool processed)\n        {\n            // check for valid handle.\n\n            if (monitoredItem.ManagerHandle is not MemoryBufferState buffer)\n            {\n                return base.SetMonitoringMode(\n                    context,\n                    monitoredItem,\n                    monitoringMode,\n                    out processed);\n            }\n\n            // owned by this node manager.\n            processed = true;\n\n            // get the monitored item.\n\n            if (monitoredItem is not MemoryBufferMonitoredItem datachangeItem)\n            {\n                return StatusCodes.BadMonitoredItemIdInvalid;\n            }\n\n            // delete the item.\n            var previousMode = datachangeItem.SetMonitoringMode(monitoringMode);\n\n            // need to provide an immediate update after enabling.\n            if (previousMode == MonitoringMode.Disabled && monitoringMode != MonitoringMode.Disabled)\n            {\n                var initialValue = new DataValue\n                {\n                    Value = null,\n                    ServerTimestamp = DateTime.UtcNow,\n                    SourceTimestamp = DateTime.MinValue,\n                    StatusCode = StatusCodes.Good\n                };\n\n                var tag = new MemoryTagState(buffer, datachangeItem.Offset);\n\n                var error = tag.ReadAttribute(\n                    context,\n                    datachangeItem.AttributeId,\n                    NumericRange.Empty,\n                    null,\n                    initialValue);\n\n                datachangeItem.QueueValue(initialValue, error);\n            }\n\n            return ServiceResult.Good;\n        }\n\n        private readonly MemoryBufferConfiguration _configuration;\n        private Dictionary<string, MemoryBufferState> _buffers;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/MemoryBuffer/MemoryBufferServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace MemoryBuffer\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class MemoryBufferServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.MemoryBuffer,\n                    Namespaces.MemoryBuffer + \"/Instance\"\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new MemoryBufferNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/MemoryBuffer/MemoryBufferState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace MemoryBuffer\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Threading;\n\n    public partial class MemoryBufferState\n    {\n        /// <summary>\n        /// Initializes the buffer from the configuration.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"configuration\"></param>\n        public MemoryBufferState(ISystemContext context, MemoryBufferInstance configuration) :\n            base(null)\n        {\n            Initialize(context);\n            var dataType = \"UInt32\";\n            var name = dataType;\n            var count = 10;\n\n            if (configuration != null)\n            {\n                count = configuration.TagCount;\n\n                if (!string.IsNullOrEmpty(configuration.DataType))\n                {\n                    dataType = configuration.DataType;\n                }\n\n                if (!string.IsNullOrEmpty(configuration.Name))\n                {\n                    name = dataType;\n                }\n            }\n\n            SymbolicName = name;\n\n            var elementType = BuiltInType.UInt32;\n\n            switch (dataType)\n            {\n                case \"Double\":\n                    {\n                        elementType = BuiltInType.Double;\n                        break;\n                    }\n            }\n\n            CreateBuffer(elementType, count);\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _scanTimer != null)\n            {\n                _scanTimer.Dispose();\n                _scanTimer = null;\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// The server that the buffer belongs to.\n        /// </summary>\n        public IServerInternal Server { get; private set; }\n\n        /// <summary>\n        /// The node manager that the buffer belongs to.\n        /// </summary>\n        public INodeManager NodeManager { get; private set; }\n\n        /// <summary>\n        /// The built-in type for the values stored in the buffer.\n        /// </summary>\n        public BuiltInType ElementType { get; private set; }\n\n        /// <summary>\n        /// The size of each element in the buffer.\n        /// </summary>\n        public uint ElementSize => (uint)_elementSize;\n\n        /// <summary>\n        /// The rate at which the buffer is scanned.\n        /// </summary>\n        public int MaximumScanRate { get; private set; }\n\n        /// <summary>\n        /// Initializes the buffer with enough space to hold the specified number of elements.\n        /// </summary>\n        /// <param name=\"elementName\">The type of element.</param>\n        /// <param name=\"noOfElements\">The number of elements.</param>\n        public void CreateBuffer(string elementName, int noOfElements)\n        {\n            if (string.IsNullOrEmpty(elementName))\n            {\n                elementName = \"UInt32\";\n            }\n\n            var elementType = BuiltInType.UInt32;\n\n            switch (elementName)\n            {\n                case \"Double\":\n                    {\n                        elementType = BuiltInType.Double;\n                        break;\n                    }\n            }\n\n            CreateBuffer(elementType, noOfElements);\n        }\n\n        /// <summary>\n        /// Initializes the buffer with enough space to hold the specified number of elements.\n        /// </summary>\n        /// <param name=\"elementType\">The type of element.</param>\n        /// <param name=\"noOfElements\">The number of elements.</param>\n        public void CreateBuffer(BuiltInType elementType, int noOfElements)\n        {\n            lock (_dataLock)\n            {\n                ElementType = elementType;\n                _elementSize = 1;\n\n                switch (ElementType)\n                {\n                    case BuiltInType.UInt32:\n                        {\n                            _elementSize = 4;\n                            break;\n                        }\n\n                    case BuiltInType.Double:\n                        {\n                            _elementSize = 8;\n                            break;\n                        }\n                }\n\n                _lastScanTime = DateTime.UtcNow;\n                MaximumScanRate = 1000;\n\n                _buffer = new byte[_elementSize * noOfElements];\n                SizeInBytes.Value = (uint)_buffer.Length;\n            }\n        }\n\n        /// <summary>\n        /// Creates an object which can browser the tags in the buffer.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"referenceType\"></param>\n        /// <param name=\"includeSubtypes\"></param>\n        /// <param name=\"browseDirection\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"additionalReferences\"></param>\n        /// <param name=\"internalOnly\"></param>\n        public override INodeBrowser CreateBrowser(\n            ISystemContext context,\n            ViewDescription view,\n            NodeId referenceType,\n            bool includeSubtypes,\n            BrowseDirection browseDirection,\n            QualifiedName browseName,\n            IEnumerable<IReference> additionalReferences,\n            bool internalOnly)\n        {\n            NodeBrowser browser = new MemoryBufferBrowser(\n                context,\n                view,\n                referenceType,\n                includeSubtypes,\n                browseDirection,\n                browseName,\n                additionalReferences,\n                internalOnly,\n                this);\n\n            PopulateBrowser(context, browser);\n\n            return browser;\n        }\n\n        /// <summary>\n        /// Handles the read operation for an invidual tag.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        /// <param name=\"indexRange\"></param>\n        /// <param name=\"dataEncoding\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"timestamp\"></param>\n        public ServiceResult ReadTagValue(\n#pragma warning disable IDE0079 // Remove unnecessary suppression\n#pragma warning disable IDE0060 // Remove unused parameter\n            ISystemContext context,\n#pragma warning restore IDE0060 // Remove unused parameter\n#pragma warning restore IDE0079 // Remove unnecessary suppression\n            NodeState node,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            ref object value,\n            ref StatusCode statusCode,\n            ref DateTime timestamp)\n        {\n            if (node is not MemoryTagState tag)\n            {\n                return StatusCodes.BadNodeIdUnknown;\n            }\n\n            if (NumericRange.Empty != indexRange)\n            {\n                return StatusCodes.BadIndexRangeInvalid;\n            }\n\n            if (!QualifiedName.IsNull(dataEncoding))\n            {\n                return StatusCodes.BadDataEncodingInvalid;\n            }\n\n            var offset = (int)tag.Offset;\n\n            lock (_dataLock)\n            {\n                if (offset < 0 || offset >= _buffer.Length)\n                {\n                    return StatusCodes.BadNodeIdUnknown;\n                }\n\n                if (_buffer == null)\n                {\n                    return StatusCodes.BadOutOfService;\n                }\n\n                value = GetValueAtOffset(offset).Value;\n            }\n\n            statusCode = StatusCodes.Good;\n            timestamp = _lastScanTime;\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Handles a write operation for an individual tag.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        /// <param name=\"indexRange\"></param>\n        /// <param name=\"dataEncoding\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"timestamp\"></param>\n        public ServiceResult WriteTagValue(\n#pragma warning disable IDE0079 // Remove unnecessary suppression\n#pragma warning disable IDE0060 // Remove unused parameter\n            ISystemContext context,\n#pragma warning restore IDE0060 // Remove unused parameter\n#pragma warning restore IDE0079 // Remove unnecessary suppression\n            NodeState node,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            ref object value,\n            ref StatusCode statusCode,\n            ref DateTime timestamp)\n        {\n            if (node is not MemoryTagState tag)\n            {\n                return StatusCodes.BadNodeIdUnknown;\n            }\n\n            if (NumericRange.Empty != indexRange)\n            {\n                return StatusCodes.BadIndexRangeInvalid;\n            }\n\n            if (!QualifiedName.IsNull(dataEncoding))\n            {\n                return StatusCodes.BadDataEncodingInvalid;\n            }\n\n            if (statusCode != StatusCodes.Good)\n            {\n                return StatusCodes.BadWriteNotSupported;\n            }\n\n            if (timestamp != DateTime.MinValue)\n            {\n                return StatusCodes.BadWriteNotSupported;\n            }\n\n            var changed = false;\n            var offset = (int)tag.Offset;\n\n            lock (_dataLock)\n            {\n                if (offset < 0 || offset >= _buffer.Length)\n                {\n                    return StatusCodes.BadNodeIdUnknown;\n                }\n\n                if (_buffer == null)\n                {\n                    return StatusCodes.BadOutOfService;\n                }\n\n                byte[] bytes = null;\n\n                switch (ElementType)\n                {\n                    case BuiltInType.UInt32:\n                        {\n                            if (value is not uint valueToWrite)\n                            {\n                                return StatusCodes.BadTypeMismatch;\n                            }\n\n                            bytes = BitConverter.GetBytes(valueToWrite);\n                            break;\n                        }\n\n                    case BuiltInType.Double:\n                        {\n                            if (value is not double valueToWrite)\n                            {\n                                return StatusCodes.BadTypeMismatch;\n                            }\n\n                            bytes = BitConverter.GetBytes(valueToWrite);\n                            break;\n                        }\n\n                    default:\n                        {\n                            return StatusCodes.BadNodeIdUnknown;\n                        }\n                }\n\n                for (var ii = 0; ii < bytes.Length; ii++)\n                {\n                    if (!changed && _buffer[offset + ii] != bytes[ii])\n                    {\n                        changed = true;\n                    }\n\n                    _buffer[offset + ii] = bytes[ii];\n                }\n            }\n\n            if (changed)\n            {\n                OnBufferChanged(offset);\n            }\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Returns the value at the specified offset.\n        /// </summary>\n        /// <param name=\"offset\"></param>\n        public Variant GetValueAtOffset(int offset)\n        {\n            lock (_dataLock)\n            {\n                if (offset < 0 || offset >= _buffer.Length)\n                {\n                    return Variant.Null;\n                }\n\n                if (_buffer == null)\n                {\n                    return Variant.Null;\n                }\n\n                switch (ElementType)\n                {\n                    case BuiltInType.UInt32:\n                        {\n                            return new Variant(BitConverter.ToUInt32(_buffer, offset));\n                        }\n\n                    case BuiltInType.Double:\n                        {\n                            return new Variant(BitConverter.ToDouble(_buffer, offset));\n                        }\n                }\n\n                return Variant.Null;\n            }\n        }\n\n        /// <summary>\n        /// Initializes the instance with the context for the node being monitored.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"nodeManager\"></param>\n        public void InitializeMonitoring(\n            IServerInternal server,\n            INodeManager nodeManager)\n        {\n            lock (_dataLock)\n            {\n                Server = server;\n                NodeManager = nodeManager;\n                _nonValueMonitoredItems = [];\n            }\n        }\n\n        /// <summary>\n        /// Creates a new data change monitored item.\n        /// </summary>\n        /// <param name=\"tag\"></param>\n        /// <param name=\"monitoredItemId\"></param>\n        /// <param name=\"itemToMonitor\"></param>\n        /// <param name=\"diagnosticsMasks\"></param>\n        /// <param name=\"timestampsToReturn\"></param>\n        /// <param name=\"monitoringMode\"></param>\n        /// <param name=\"clientHandle\"></param>\n        /// <param name=\"samplingInterval\"></param>\n        public MemoryBufferMonitoredItem CreateDataChangeItem(\n            MemoryTagState tag,\n            uint monitoredItemId,\n            ReadValueId itemToMonitor,\n            DiagnosticsMasks diagnosticsMasks,\n            TimestampsToReturn timestampsToReturn,\n            MonitoringMode monitoringMode,\n            uint clientHandle,\n            double samplingInterval)\n        {\n            lock (_dataLock)\n            {\n                var monitoredItem = new MemoryBufferMonitoredItem(\n                    Server,\n                    NodeManager,\n                    this,\n                    tag.Offset,\n                    0,\n                    monitoredItemId,\n                    itemToMonitor,\n                    diagnosticsMasks,\n                    timestampsToReturn,\n                    monitoringMode,\n                    clientHandle,\n                    null,\n                    null,\n                    null,\n                    samplingInterval,\n                    0,\n                    false,\n                    0);\n\n                if (itemToMonitor.AttributeId != Attributes.Value)\n                {\n                    _nonValueMonitoredItems.Add(monitoredItem.Id, monitoredItem);\n                    return monitoredItem;\n                }\n\n                var elementCount = (int)(SizeInBytes.Value / ElementSize);\n\n                if (_monitoringTable == null)\n                {\n                    _monitoringTable = new MemoryBufferMonitoredItem[elementCount][];\n                    _scanTimer = new Timer(DoScan, null, 100, 100);\n                }\n\n                var elementOffet = (int)(tag.Offset / ElementSize);\n\n                var monitoredItems = _monitoringTable[elementOffet];\n\n                if (monitoredItems == null)\n                {\n                    monitoredItems = new MemoryBufferMonitoredItem[1];\n                }\n                else\n                {\n                    monitoredItems = new MemoryBufferMonitoredItem[monitoredItems.Length + 1];\n                    _monitoringTable[elementOffet].CopyTo(monitoredItems, 0);\n                }\n\n                monitoredItems[^1] = monitoredItem;\n                _monitoringTable[elementOffet] = monitoredItems;\n                _itemCount++;\n\n                return monitoredItem;\n            }\n        }\n\n        /// <summary>\n        /// Scans the buffer and updates every other element.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void DoScan(object state)\n        {\n            var start1 = DateTime.UtcNow;\n\n            lock (_dataLock)\n            {\n                for (var ii = 0; ii < _buffer.Length; ii += _elementSize)\n                {\n                    _buffer[ii]++;\n\n                    // notify any monitored items that the value has changed.\n                    OnBufferChanged(ii);\n                }\n\n                _lastScanTime = DateTime.UtcNow;\n            }\n\n            var end1 = DateTime.UtcNow;\n\n            var delta1 = ((double)(end1.Ticks - start1.Ticks)) / TimeSpan.TicksPerMillisecond;\n\n            if (delta1 > 100)\n            {\n                Debug.WriteLine(\"SAMPLING DELAY ({0}ms)\", delta1);\n            }\n        }\n\n        /// <summary>\n        /// Deletes the monitored item.\n        /// </summary>\n        /// <param name=\"monitoredItem\"></param>\n        public void DeleteItem(MemoryBufferMonitoredItem monitoredItem)\n        {\n            lock (_dataLock)\n            {\n                if (monitoredItem.AttributeId != Attributes.Value)\n                {\n                    _nonValueMonitoredItems.Remove(monitoredItem.Id);\n                    return;\n                }\n\n                if (_monitoringTable != null)\n                {\n                    var elementOffet = (int)(monitoredItem.Offset / ElementSize);\n\n                    var monitoredItems = _monitoringTable[elementOffet];\n\n                    if (monitoredItems != null)\n                    {\n                        var index = -1;\n\n                        for (var ii = 0; ii < monitoredItems.Length; ii++)\n                        {\n                            if (ReferenceEquals(monitoredItems[ii], monitoredItem))\n                            {\n                                index = ii;\n                                break;\n                            }\n                        }\n\n                        if (index >= 0)\n                        {\n                            _itemCount--;\n\n                            if (monitoredItems.Length == 1)\n                            {\n                                monitoredItems = null;\n                            }\n                            else\n                            {\n                                monitoredItems = new MemoryBufferMonitoredItem[monitoredItems.Length - 1];\n\n                                Array.Copy(_monitoringTable[elementOffet], 0, monitoredItems, 0, index);\n                                Array.Copy(_monitoringTable[elementOffet], index + 1, monitoredItems, index, monitoredItems.Length - index);\n                            }\n\n                            _monitoringTable[elementOffet] = monitoredItems;\n                        }\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Handles change events raised by the node.\n        /// </summary>\n        /// <param name=\"offset\"></param>\n        public void OnBufferChanged(int offset)\n        {\n            lock (_dataLock)\n            {\n                if (_monitoringTable != null)\n                {\n                    var elementOffet = (int)(offset / ElementSize);\n\n                    var monitoredItems = _monitoringTable[elementOffet];\n\n                    if (monitoredItems != null)\n                    {\n                        var value = new DataValue\n                        {\n                            WrappedValue = GetValueAtOffset(offset),\n                            StatusCode = StatusCodes.Good,\n                            ServerTimestamp = DateTime.UtcNow,\n                            SourceTimestamp = _lastScanTime\n                        };\n\n                        for (var ii = 0; ii < monitoredItems.Length; ii++)\n                        {\n                            monitoredItems[ii].QueueValue(value, null);\n                            _updateCount++;\n                        }\n                    }\n                }\n            }\n        }\n\n        private void ScanTimer_Tick(object sender, EventArgs e)\n        {\n            DoScan(null);\n        }\n\n        private void PublishTimer_Tick(object sender, EventArgs e)\n        {\n            var start1 = DateTime.UtcNow;\n\n            lock (_dataLock)\n            {\n                if (_itemCount > 0 && _updateCount < _itemCount)\n                {\n                    Debug.WriteLine(\"{0:HH:mm:ss.fff} MEMORYBUFFER Reported  {1}/{2} items ***.\", DateTime.Now, _updateCount, _itemCount);\n                }\n\n                _updateCount = 0;\n            }\n\n            var end1 = DateTime.UtcNow;\n\n            var delta1 = ((double)(end1.Ticks - start1.Ticks)) / TimeSpan.TicksPerMillisecond;\n\n            if (delta1 > 100)\n            {\n                Debug.WriteLine(\"****** PUBLISH DELAY ({0}ms) ******\", delta1);\n            }\n        }\n\n        private readonly Lock _dataLock = new();\n        private MemoryBufferMonitoredItem[][] _monitoringTable;\n        private Dictionary<uint, MemoryBufferMonitoredItem> _nonValueMonitoredItems;\n        private int _elementSize;\n        private DateTime _lastScanTime;\n        private byte[] _buffer;\n        private Timer _scanTimer;\n        private int _updateCount;\n        private int _itemCount;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/MemoryBuffer/MemoryTagState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace MemoryBuffer\n{\n    using Opc.Ua;\n\n    public partial class MemoryTagState\n    {\n        /// <summary>\n        /// Initializes a memory tag for a buffer.\n        /// </summary>\n        /// <param name=\"parent\">The buffer that owns the tag.</param>\n        /// <param name=\"offet\">The offset of the tag address in the memory buffer.</param>\n        public MemoryTagState(MemoryBufferState parent, uint offet) : base(parent)\n        {\n            // these objects are created an discarded during each operation.\n            // the metadata is derived from the parameters passed to constructors.\n            NodeId = new NodeId(Utils.Format(\"{0}[{1}]\", parent.SymbolicName, offet), parent.NodeId.NamespaceIndex);\n            BrowseName = new QualifiedName(Utils.Format(\"{1:X8}\", parent.SymbolicName, offet), parent.TypeDefinitionId.NamespaceIndex);\n            DisplayName = BrowseName.Name;\n            Description = null;\n            WriteMask = AttributeWriteMask.None;\n            UserWriteMask = AttributeWriteMask.None;\n            ReferenceTypeId = ReferenceTypeIds.HasComponent;\n            TypeDefinitionId = new NodeId(VariableTypes.MemoryTagType, parent.TypeDefinitionId.NamespaceIndex);\n            ModellingRuleId = null;\n            NumericId = offet;\n            DataType = new NodeId((uint)parent.ElementType);\n            ValueRank = ValueRanks.Scalar;\n            ArrayDimensions = null;\n            AccessLevel = AccessLevels.CurrentReadOrWrite;\n            UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            MinimumSamplingInterval = parent.MaximumScanRate;\n            Historizing = false;\n\n            // re-direct read and write operations to the parent.\n            OnReadValue = parent.ReadTagValue;\n            OnWriteValue = parent.WriteTagValue;\n\n            Offset = offet;\n        }\n\n        /// <summary>\n        /// The offset of the tag address in the memory buffer.\n        /// </summary>\n        public uint Offset { get; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/PerfTest/MemoryRegisterState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace PerfTest\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n\n    public static class ModelUtils\n    {\n        public static NodeId GetRegisterId(MemoryRegister register, ushort namespaceIndex)\n        {\n            return new NodeId((uint)register.Id, namespaceIndex);\n        }\n\n        public static NodeId GetRegisterVariableId(MemoryRegister register, int index, ushort namespaceIndex)\n        {\n            var id = (uint)(register.Id << 24) + (uint)index;\n            return new NodeId(id, namespaceIndex);\n        }\n\n        public static MemoryRegisterState GetRegister(MemoryRegister register, ushort namespaceIndex)\n        {\n            return new MemoryRegisterState(register, namespaceIndex);\n        }\n\n        public static BaseDataVariableState GetRegisterVariable(MemoryRegister register, int index, ushort namespaceIndex)\n        {\n            if (index < 0 || index >= register.Size)\n            {\n                return null;\n            }\n\n            var variable = new BaseDataVariableState<int>(null)\n            {\n                NodeId = GetRegisterVariableId(register, index, namespaceIndex),\n                BrowseName = new QualifiedName(Utils.Format(\"{0:000000}\", index), namespaceIndex)\n            };\n            variable.DisplayName = variable.BrowseName.Name;\n            variable.Value = register.Read(index);\n            variable.DataType = DataTypeIds.Int32;\n            variable.ValueRank = ValueRanks.Scalar;\n            variable.MinimumSamplingInterval = 100;\n            variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.Handle = register;\n            variable.NumericId = (uint)index;\n\n            return variable;\n        }\n    }\n\n    public class MemoryRegisterState : FolderState\n    {\n        public MemoryRegisterState(MemoryRegister register, ushort namespaceIndex) : base(null)\n        {\n            Register = register;\n\n            NodeId = new NodeId((uint)register.Id, namespaceIndex);\n            BrowseName = new QualifiedName(register.Name, namespaceIndex);\n            DisplayName = BrowseName.Name;\n\n            AddReference(ReferenceTypeIds.Organizes, true, ObjectIds.ObjectsFolder);\n        }\n\n        public MemoryRegister Register { get; }\n\n        public override INodeBrowser CreateBrowser(\n            ISystemContext context,\n            ViewDescription view,\n            NodeId referenceType,\n            bool includeSubtypes,\n            BrowseDirection browseDirection,\n            QualifiedName browseName,\n            IEnumerable<IReference> additionalReferences,\n            bool internalOnly)\n        {\n            return new MemoryRegisterBrowser(\n                context,\n                view,\n                referenceType,\n                includeSubtypes,\n                browseDirection,\n                browseName,\n                additionalReferences,\n                internalOnly,\n                this);\n        }\n    }\n\n    /// <summary>\n    /// Browses the children of a segment.\n    /// </summary>\n    public class MemoryRegisterBrowser : NodeBrowser\n    {\n        /// <summary>\n        /// Creates a new browser object with a set of filters.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"view\"></param>\n        /// <param name=\"referenceType\"></param>\n        /// <param name=\"includeSubtypes\"></param>\n        /// <param name=\"browseDirection\"></param>\n        /// <param name=\"browseName\"></param>\n        /// <param name=\"additionalReferences\"></param>\n        /// <param name=\"internalOnly\"></param>\n        /// <param name=\"parent\"></param>\n        public MemoryRegisterBrowser(\n            ISystemContext context,\n            ViewDescription view,\n            NodeId referenceType,\n            bool includeSubtypes,\n            BrowseDirection browseDirection,\n            QualifiedName browseName,\n            IEnumerable<IReference> additionalReferences,\n            bool internalOnly,\n            MemoryRegisterState parent)\n        :\n            base(\n                context,\n                view,\n                referenceType,\n                includeSubtypes,\n                browseDirection,\n                browseName,\n                additionalReferences,\n                internalOnly)\n        {\n            _parent = parent;\n            _stage = Stage.Begin;\n        }\n\n        /// <summary>\n        /// Returns the next reference.\n        /// </summary>\n        /// <returns>The next reference that meets the browse criteria.</returns>\n        public override IReference Next()\n        {\n            _ = (UnderlyingSystem)SystemContext.SystemHandle;\n\n            lock (DataLock)\n            {\n                // enumerate pre-defined references.\n                // always call first to ensure any pushed-back references are returned first.\n                var reference = base.Next();\n\n                if (reference != null)\n                {\n                    return reference;\n                }\n\n                if (_stage == Stage.Begin)\n                {\n                    _stage = Stage.Tags;\n                    _position = 0;\n                }\n\n                // don't start browsing huge number of references when only internal references are requested.\n                if (InternalOnly)\n                {\n                    return null;\n                }\n\n                // enumerate tags.\n                if (_stage == Stage.Tags && IsRequired(ReferenceTypeIds.Organizes, false))\n                {\n                    reference = NextChild();\n\n                    if (reference != null)\n                    {\n                        return reference;\n                    }\n                }\n\n                // all done.\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Returns the next child.\n        /// </summary>\n        private NodeStateReference NextChild()\n        {\n            _ = (UnderlyingSystem)SystemContext.SystemHandle;\n\n            NodeId targetId;\n\n            // check if a specific browse name is requested.\n            if (!QualifiedName.IsNull(BrowseName))\n            {\n                // browse name must be qualified by the correct namespace.\n                if (_parent.BrowseName.NamespaceIndex != BrowseName.NamespaceIndex)\n                {\n                    return null;\n                }\n\n                // parse the browse name.\n                var index = 0;\n\n                for (var ii = 0; ii < BrowseName.Name.Length; ii++)\n                {\n                    var ch = BrowseName.Name[ii];\n\n                    if (!char.IsDigit(ch))\n                    {\n                        return null;\n                    }\n\n                    index *= 10;\n                    index += Convert.ToInt32(ch - '0');\n                }\n\n                // check for valid browse name.\n                if (index < 0 || index > _parent.Register.Size)\n                {\n                    return null;\n                }\n\n                // return target.\n                targetId = ModelUtils.GetRegisterVariableId(_parent.Register, index, _parent.NodeId.NamespaceIndex);\n            }\n\n            // return the child at the next position.\n            else\n            {\n                // look for next segment.\n                if (_position >= _parent.Register.Size)\n                {\n                    return null;\n                }\n\n                // return target.\n                targetId = ModelUtils.GetRegisterVariableId(_parent.Register, _position, _parent.NodeId.NamespaceIndex);\n                _position++;\n            }\n\n            // create reference.\n            if (targetId != null)\n            {\n                return new NodeStateReference(ReferenceTypeIds.Organizes, false, targetId);\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// The stages available in a browse operation.\n        /// </summary>\n        private enum Stage\n        {\n            Begin,\n            Tags,\n            Done\n        }\n\n        private Stage _stage;\n        private int _position;\n        private readonly MemoryRegisterState _parent;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/PerfTest/Namespaces.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace PerfTest\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the server.\n        /// </summary>\n        public const string PerfTest = \"http://opcfoundation.org/PerfTest\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/PerfTest/PerfTestNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace PerfTest\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class PerfTestNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public PerfTestNodeManager(IServerInternal server, ApplicationConfiguration configuration)\n        : base(server, configuration, Namespaces.PerfTest)\n        {\n            SystemContext.NodeIdFactory = this;\n            SystemContext.SystemHandle = _system = new UnderlyingSystem();\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<PerfTestServerConfiguration>() ??\n                new PerfTestServerConfiguration();\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                // TBD\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                _system.Initialize();\n\n                var registers = _system.Registers;\n\n                for (var ii = 0; ii < registers.Count; ii++)\n                {\n                    var targetId = ModelUtils.GetRegisterId(registers[ii], NamespaceIndex);\n\n                    if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out var references))\n                    {\n                        externalReferences[ObjectIds.ObjectsFolder] = references = [];\n                    }\n\n                    references.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, targetId));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                // TBD\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                var handle = new NodeHandle\n                {\n                    NodeId = nodeId,\n                    Validated = true\n                };\n\n                var id = (uint)nodeId.Identifier;\n\n                // find register\n                var registerId = (int)((id & 0xFF000000) >> 24);\n                var index = (int)(id & 0x00FFFFFF);\n\n                if (registerId == 0)\n                {\n                    var register = _system.GetRegister(index);\n\n                    if (register == null)\n                    {\n                        return null;\n                    }\n\n                    handle.Node = ModelUtils.GetRegister(register, NamespaceIndex);\n                }\n\n                // find register variable.\n                else\n                {\n                    var register = _system.GetRegister(registerId);\n\n                    if (register == null)\n                    {\n                        return null;\n                    }\n\n                    // find register variable.\n                    var variable = ModelUtils.GetRegisterVariable(register, index, NamespaceIndex);\n\n                    if (variable == null)\n                    {\n                        return null;\n                    }\n\n                    handle.Node = variable;\n                }\n\n                return handle;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            // TBD\n\n            return null;\n        }\n\n        protected override void OnCreateMonitoredItemsComplete(ServerSystemContext context, IList<IMonitoredItem> monitoredItems)\n        {\n            for (var ii = 0; ii < monitoredItems.Count; ii++)\n            {\n                var handle = IsHandleInNamespace(monitoredItems[ii].ManagerHandle);\n\n                if (handle == null)\n                {\n                    continue;\n                }\n\n                var variable = handle.Node as BaseVariableState;\n\n                if (handle.Node.Handle is MemoryRegister register)\n                {\n                    register.Subscribe((int)variable.NumericId, (IDataChangeMonitoredItem2)monitoredItems[ii]);\n                }\n            }\n        }\n\n        protected override void OnDeleteMonitoredItemsComplete(ServerSystemContext context, IList<IMonitoredItem> monitoredItems)\n        {\n            for (var ii = 0; ii < monitoredItems.Count; ii++)\n            {\n                var handle = IsHandleInNamespace(monitoredItems[ii].ManagerHandle);\n\n                if (handle == null)\n                {\n                    continue;\n                }\n\n                var variable = handle.Node as BaseVariableState;\n\n                if (handle.Node.Handle is MemoryRegister register)\n                {\n                    register.Unsubscribe((int)variable.NumericId, (IDataChangeMonitoredItem2)monitoredItems[ii]);\n                }\n            }\n        }\n\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly PerfTestServerConfiguration _configuration;\n#pragma warning restore IDE0052 // Remove unread private members\n        private readonly UnderlyingSystem _system;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/PerfTest/PerfTestServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace PerfTest\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class PerfTestServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.PerfTest\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new PerfTestNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/PerfTest/PerfTestServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace PerfTest\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.PerfTest)]\n    public class PerfTestServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public PerfTestServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/PerfTest/UnderlyingSystem.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace PerfTest\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    public class UnderlyingSystem\n    {\n        public void Initialize()\n        {\n            _registers = [];\n            var register1 = new MemoryRegister();\n            register1.Initialize(1, \"R1\", 50000);\n            _registers.Add(register1);\n        }\n\n        public IList<MemoryRegister> Registers => _registers;\n\n        public MemoryRegister GetRegister(int id)\n        {\n            if (id > 0 && id <= _registers.Count)\n            {\n                return _registers[id - 1];\n            }\n\n            return null;\n        }\n\n        private List<MemoryRegister> _registers;\n    }\n\n    public class MemoryRegister\n    {\n        public int Id { get; private set; }\n\n        public string Name { get; private set; }\n\n        public int Size => _values.Length;\n\n        public void Initialize(int id, string name, int size)\n        {\n            Id = id;\n            Name = name;\n            _values = new int[size];\n            _monitoredItems = new IDataChangeMonitoredItem2[size][];\n        }\n\n        public int Read(int index)\n        {\n            if (index >= 0 && index < _values.Length)\n            {\n                return _values[index];\n            }\n\n            return 0;\n        }\n\n        public void Subscribe(int index, IDataChangeMonitoredItem2 monitoredItem)\n        {\n            lock (_lock)\n            {\n                _timer ??= new Timer(OnUpdate, null, 45, 45);\n\n                if (index >= 0 && index < _values.Length)\n                {\n                    var monitoredItems = _monitoredItems[index];\n\n                    if (monitoredItems == null)\n                    {\n                        _monitoredItems[index] = monitoredItems = new IDataChangeMonitoredItem2[1];\n                    }\n                    else\n                    {\n                        _monitoredItems[index] = new IDataChangeMonitoredItem2[monitoredItems.Length + 1];\n                        Array.Copy(monitoredItems, _monitoredItems[index], monitoredItems.Length);\n                        monitoredItems = _monitoredItems[index];\n                    }\n\n                    monitoredItems[^1] = monitoredItem;\n                }\n            }\n        }\n\n        public void Unsubscribe(int index, IDataChangeMonitoredItem2 monitoredItem)\n        {\n            lock (_lock)\n            {\n                if (index >= 0 && index < _values.Length)\n                {\n                    var monitoredItems = _monitoredItems[index];\n\n                    if (monitoredItems != null)\n                    {\n                        for (var ii = 0; ii < monitoredItems.Length; ii++)\n                        {\n                            if (ReferenceEquals(monitoredItems[ii], monitoredItem))\n                            {\n                                _monitoredItems[index] = new IDataChangeMonitoredItem2[monitoredItems.Length - 1];\n\n                                if (ii > 0)\n                                {\n                                    Array.Copy(monitoredItems, _monitoredItems[index], ii);\n                                }\n\n                                if (ii < monitoredItems.Length - 1)\n                                {\n                                    Array.Copy(monitoredItems, ii + 1, _monitoredItems[index], 0, monitoredItems.Length - ii - 1);\n                                }\n\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        private void OnUpdate(object state)\n        {\n            try\n            {\n                lock (_lock)\n                {\n                    var start = HiResClock.UtcNow;\n                    var delta = _values.Length / 2;\n\n                    var value = new DataValue\n                    {\n                        ServerTimestamp = DateTime.UtcNow,\n                        SourceTimestamp = DateTime.UtcNow\n                    };\n\n                    for (var ii = _start; ii < delta + _start && ii < _values.Length; ii++)\n                    {\n                        _values[ii] += ii + 1;\n\n                        var monitoredItems = _monitoredItems[ii];\n\n                        if (monitoredItems != null)\n                        {\n                            value.WrappedValue = new Variant(_values[ii]);\n\n                            for (var jj = 0; jj < monitoredItems.Length; jj++)\n                            {\n                                monitoredItems[jj].QueueValue(value, null, true);\n                            }\n                        }\n                    }\n\n                    _start += delta;\n\n                    if (_start >= _values.Length)\n                    {\n                        _start = 0;\n                    }\n\n                    if ((HiResClock.UtcNow - start).TotalMilliseconds > 50)\n                    {\n                        Utils.Trace(\"Update took {0}ms.\", (HiResClock.UtcNow - start).TotalMilliseconds);\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error updating items.\");\n            }\n        }\n\n        private readonly Lock _lock = new();\n        private int[] _values;\n        private int _start;\n        private Timer _timer;\n        private IDataChangeMonitoredItem2[][] _monitoredItems;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/Models/BaseDataVariableStateExtended.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc\n{\n    using Opc.Ua;\n    using System;\n\n    /// <summary>\n    /// Extended BaseDataVariableState class to hold additional parameters for simulation.\n    /// </summary>\n    public class BaseDataVariableStateExtended : BaseDataVariableState\n    {\n        public bool Randomize { get; }\n        public object StepSize { get; }\n        public object MinValue { get; }\n        public object MaxValue { get; }\n\n        public BaseDataVariableStateExtended(NodeState nodeState, bool randomize,\n            object stepSize, object minValue, object maxValue) : base(nodeState)\n        {\n            ArgumentNullException.ThrowIfNull(nodeState);\n\n            Randomize = randomize;\n            StepSize = stepSize ?? throw new ArgumentNullException(nameof(stepSize));\n            MinValue = minValue ?? throw new ArgumentNullException(nameof(minValue));\n            MaxValue = maxValue ?? throw new ArgumentNullException(nameof(maxValue));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/Models/IPluginNodes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes.Models\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    public interface IPluginNodes\n    {\n        uint ScaleUnits { get; set; }\n        ILogger Logger { get; set; }\n        TimeService TimeService { get; set; }\n        IReadOnlyCollection<NodeWithIntervals> Nodes { get; }\n        void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager);\n        void StartSimulation();\n        void StopSimulation();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/Models/NodeWithIntervals.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes.Models\n{\n    using Opc.Ua;\n\n    public sealed class NodeWithIntervals\n    {\n        public string NodeId { get; set; }\n        public string NodeIdTypePrefix { get; set; } = \"s\";\n        public string Namespace { get; set; }\n        public uint PublishingInterval { get; set; }\n        public uint SamplingInterval { get; set; }\n\n        internal static string GetPrefix(IdType idType)\n        {\n            switch (idType)\n            {\n                case IdType.Numeric:\n                    return \"i\";\n                case IdType.Guid:\n                    return \"g\";\n                case IdType.Opaque:\n                    return \"b\";\n                default:\n                    return \"s\";\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/Models/SimulatedVariableNode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc\n{\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n\n    public sealed class SimulatedVariableNode<T> : IDisposable\n    {\n        private readonly ISystemContext _context;\n        private readonly BaseDataVariableState _variable;\n        private ITimer _timer;\n        private readonly TimeService _timeService;\n\n        public T Value\n        {\n            get => (T)_variable.Value;\n            set => SetValue(_variable, value);\n        }\n\n        public SimulatedVariableNode(ISystemContext context, BaseDataVariableState variable, TimeService timeService)\n        {\n            _context = context;\n            _variable = variable;\n            _timeService = timeService;\n        }\n\n        public void Dispose()\n        {\n            Stop();\n            _timer.Dispose();\n        }\n\n        /// <summary>\n        /// Start periodic update.\n        /// The update Func gets the current value as input and should return the updated value.\n        /// </summary>\n        /// <param name=\"update\"></param>\n        /// <param name=\"periodMs\"></param>\n        public void Start(Func<T, T> update, int periodMs)\n        {\n            _timer = _timeService.NewTimer((s, o) => Value = update(Value), (uint)periodMs);\n        }\n\n        public void Stop()\n        {\n            if (_timer == null)\n            {\n                return;\n            }\n\n            _timer.Enabled = false;\n        }\n\n        private void SetValue(BaseDataVariableState variable, T value)\n        {\n            variable.Value = value;\n            variable.Timestamp = _timeService.Now;\n            variable.ClearChangeMasks(_context, false);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/NamespaceType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc\n{\n    public enum NamespaceType\n    {\n        PlcApplications,\n        PlcSimulation,\n        PlcInstance,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/Namespaces.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by for boiler type.\n        /// </summary>\n        public const string PlcSimulation = \"http://opcfoundation.org/UA/Plc\";\n\n        /// <summary>\n        /// The namespace for the nodes provided by the for the boiler instance.\n        /// </summary>\n        public const string PlcInstance = \"http://opcfoundation.org/UA/Plc/PlcInstance\";\n\n        /// <summary>\n        /// The namespace for the nodes provided by the plc server.\n        /// </summary>\n        public const string PlcApplications = \"http://opcfoundation.org/UA/Plc/Applications\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PlcNodeManager.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc\n{\n    using Plc.PluginNodes;\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n\n    public class PlcNodeManager : CustomNodeManager2\n    {\n        public IEnumerable<IPluginNodes> PluginNodes { get; }\n\n        public PlcNodeManager(IServerInternal server,\n            ApplicationConfiguration configuration,\n            TimeService timeService, ILogger logger, uint scaleunits)\n            : base(server, configuration,\n            [\n                Namespaces.PlcApplications,\n                Namespaces.PlcSimulation,\n                Namespaces.PlcInstance\n            ])\n        {\n            _timeService = timeService;\n            _logger = logger;\n            SystemContext.NodeIdFactory = this;\n\n            PluginNodes = new List<IPluginNodes>\n            {\n                new ComplexTypePlcPluginNode(),\n                new DataPluginNodes(),\n                new DeterministicGuidPluginNodes(),\n                new DipPluginNode(),\n                new FastPluginNodes(),\n                new FastRandomPluginNodes(),\n                new LongIdPluginNode(),\n                new LongStringPluginNodes(),\n                new NegTrendPluginNode(),\n                new PosTrendPluginNode(),\n                new SlowPluginNodes(),\n                new SlowRandomPluginNodes(),\n                new SpecialCharNamePluginNode(),\n                new SpikePluginNode()\n            };\n\n            foreach (var plugin in PluginNodes)\n            {\n                plugin.Logger = logger;\n                plugin.TimeService = timeService;\n                plugin.ScaleUnits = scaleunits;\n            }\n\n            _simulation = new PlcSimulation(this, timeService);\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            _simulation.Stop();\n            base.Dispose(disposing);\n        }\n\n        public string GetPnJson()\n        {\n            return _simulation.GetPublisherConfigJson();\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            if (node is BaseInstanceState instance && instance.Parent?.NodeId.Identifier is string id)\n            {\n                return new NodeId(id + \"_\" + instance.SymbolicName, instance.Parent.NodeId.NamespaceIndex);\n            }\n\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out var references))\n                {\n                    externalReferences[ObjectIds.ObjectsFolder] = references = [];\n                }\n\n                _externalReferences = externalReferences;\n\n                var root = CreateFolder(null, \"OpcPlc\", \"OpcPlc\", NamespaceType.PlcApplications);\n                root.AddReference(ReferenceTypes.Organizes, true, ObjectIds.ObjectsFolder);\n                references.Add(new NodeStateReference(ReferenceTypes.Organizes, false, root.NodeId));\n                root.EventNotifier = EventNotifiers.SubscribeToEvents;\n                AddRootNotifier(root);\n\n                try\n                {\n                    var telemetryFolder = CreateFolder(root, \"Telemetry\", \"Telemetry\", NamespaceType.PlcApplications);\n                    var methodsFolder = CreateFolder(root, \"Methods\", \"Methods\", NamespaceType.PlcApplications);\n\n                    // Add nodes to address space from plugin nodes list.\n                    foreach (var plugin in PluginNodes)\n                    {\n                        plugin.AddToAddressSpace(telemetryFolder, methodsFolder, plcNodeManager: this);\n                    }\n                }\n                catch (Exception e)\n                {\n                    _logger.AddressSpaceError(e);\n                }\n\n                AddPredefinedNode(SystemContext, root);\n            }\n            _simulation.Start();\n        }\n\n        public SimulatedVariableNode<T> CreateVariableNode<T>(BaseDataVariableState variable)\n        {\n            return new SimulatedVariableNode<T>(SystemContext, variable, _timeService);\n        }\n\n        /// <summary>\n        /// Creates a new folder.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"namespaceType\"></param>\n        public FolderState CreateFolder(NodeState parent, string path, string name, NamespaceType namespaceType)\n        {\n            var existingFolder = parent?.FindChildBySymbolicName(SystemContext, name);\n            if (existingFolder != null)\n            {\n                return (FolderState)existingFolder;\n            }\n\n            var namespaceIndex = NamespaceIndexes[(int)namespaceType];\n\n            var folder = new FolderState(parent)\n            {\n                SymbolicName = name,\n                ReferenceTypeId = ReferenceTypes.Organizes,\n                TypeDefinitionId = ObjectTypeIds.FolderType,\n                NodeId = new NodeId(path, namespaceIndex),\n                BrowseName = new QualifiedName(path, namespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None,\n                EventNotifier = EventNotifiers.None\n            };\n\n            parent?.AddChild(folder);\n\n            return folder;\n        }\n\n        /// <summary>\n        /// Creates a new extended variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <param name=\"accessLevel\"></param>\n        /// <param name=\"description\"></param>\n        /// <param name=\"namespaceType\"></param>\n        /// <param name=\"randomize\"></param>\n        /// <param name=\"stepSizeValue\"></param>\n        /// <param name=\"minTypeValue\"></param>\n        /// <param name=\"maxTypeValue\"></param>\n        /// <param name=\"defaultValue\"></param>\n        public BaseDataVariableState CreateBaseVariable(NodeState parent, dynamic path,\n            string name, NodeId dataType, int valueRank, byte accessLevel, string description,\n            NamespaceType namespaceType, bool randomize, object stepSizeValue,\n            object minTypeValue, object maxTypeValue, object defaultValue = null)\n        {\n            var baseDataVariableState = new BaseDataVariableStateExtended(parent, randomize,\n                stepSizeValue, minTypeValue, maxTypeValue)\n            {\n                SymbolicName = name,\n                ReferenceTypeId = ReferenceTypes.Organizes,\n                TypeDefinitionId = VariableTypeIds.BaseDataVariableType\n            };\n            return CreateBaseVariable(baseDataVariableState, parent, path, name, dataType,\n                valueRank, accessLevel, description, namespaceType, defaultValue);\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <param name=\"accessLevel\"></param>\n        /// <param name=\"description\"></param>\n        /// <param name=\"namespaceType\"></param>\n        /// <param name=\"defaultValue\"></param>\n        public BaseDataVariableState CreateBaseVariable(NodeState parent, dynamic path,\n            string name, NodeId dataType, int valueRank, byte accessLevel, string description,\n            NamespaceType namespaceType, object defaultValue = null)\n        {\n            var baseDataVariableState = new BaseDataVariableState(parent)\n            {\n                SymbolicName = name,\n                ReferenceTypeId = ReferenceTypes.Organizes,\n                TypeDefinitionId = VariableTypeIds.BaseDataVariableType\n            };\n            return CreateBaseVariable(baseDataVariableState, parent, path, name, dataType,\n                valueRank, accessLevel, description, namespaceType, defaultValue);\n        }\n\n        /// <summary>\n        /// Creates a new method.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"description\"></param>\n        /// <param name=\"namespaceType\"></param>\n        public MethodState CreateMethod(NodeState parent, string path, string name,\n            string description, NamespaceType namespaceType)\n        {\n            var namespaceIndex = NamespaceIndexes[(int)namespaceType];\n\n            var method = new MethodState(parent)\n            {\n                SymbolicName = name,\n                ReferenceTypeId = ReferenceTypeIds.HasComponent,\n                NodeId = new NodeId(path, namespaceIndex),\n                BrowseName = new QualifiedName(path, namespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None,\n                Executable = true,\n                UserExecutable = true,\n                Description = new LocalizedText(description)\n            };\n\n            parent?.AddChild(method);\n\n            return method;\n        }\n\n        private BaseDataVariableState CreateBaseVariable(BaseDataVariableState baseDataVariableState,\n            NodeState parent, dynamic path, string name, NodeId dataType, int valueRank,\n            byte accessLevel, string description, NamespaceType namespaceType, object defaultValue = null)\n        {\n            var namespaceIndex = NamespaceIndexes[(int)namespaceType];\n\n            if (path is uint || path is long)\n            {\n                baseDataVariableState.NodeId = new NodeId((uint)path, namespaceIndex);\n                baseDataVariableState.BrowseName = new QualifiedName(((uint)path)\n                    .ToString(CultureInfo.CurrentCulture), namespaceIndex);\n            }\n            else if (path is string)\n            {\n                baseDataVariableState.NodeId = new NodeId(path, namespaceIndex);\n                baseDataVariableState.BrowseName = new QualifiedName(path, namespaceIndex);\n            }\n            else\n            {\n                _logger.NodeIdType((string)path.GetType().ToString());\n                baseDataVariableState.NodeId = new NodeId(path, namespaceIndex);\n                baseDataVariableState.BrowseName = new QualifiedName(name, namespaceIndex);\n            }\n\n            baseDataVariableState.DisplayName = new LocalizedText(\"en\", name);\n            baseDataVariableState.WriteMask = AttributeWriteMask.DisplayName | AttributeWriteMask.Description;\n            baseDataVariableState.UserWriteMask = AttributeWriteMask.DisplayName | AttributeWriteMask.Description;\n            baseDataVariableState.DataType = dataType;\n            baseDataVariableState.ValueRank = valueRank;\n            baseDataVariableState.AccessLevel = accessLevel;\n            baseDataVariableState.UserAccessLevel = accessLevel;\n            baseDataVariableState.Historizing = false;\n            baseDataVariableState.Value = defaultValue ?? TypeInfo.GetDefaultValue(dataType, valueRank, Server.TypeTree);\n            baseDataVariableState.StatusCode = StatusCodes.Good;\n            baseDataVariableState.Timestamp = _timeService.UtcNow;\n            baseDataVariableState.Description = new LocalizedText(description);\n\n            if (valueRank == ValueRanks.OneDimension)\n            {\n                baseDataVariableState.ArrayDimensions = new ReadOnlyList<uint>([0]);\n            }\n            else if (valueRank == ValueRanks.TwoDimensions)\n            {\n                baseDataVariableState.ArrayDimensions = new ReadOnlyList<uint>([0, 0]);\n            }\n\n            parent?.AddChild(baseDataVariableState);\n\n            return baseDataVariableState;\n        }\n\n        /// <summary>\n        /// Loads a predefined node set by using the specified handler.\n        /// </summary>\n        /// <param name=\"loadPredefinedNodeshandler\"></param>\n        public void LoadPredefinedNodes(Func<ISystemContext, NodeStateCollection> loadPredefinedNodeshandler)\n        {\n            _loadPredefinedNodeshandler = loadPredefinedNodeshandler;\n\n            base.LoadPredefinedNodes(SystemContext, _externalReferences);\n        }\n\n        /// <summary>\n        /// Adds a predefined node set.\n        /// </summary>\n        /// <param name=\"node\"></param>\n        public void AddPredefinedNode(NodeState node)\n        {\n            base.AddPredefinedNode(SystemContext, node);\n        }\n\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            return _loadPredefinedNodeshandler?.Invoke(context);\n        }\n\n        private readonly TimeService _timeService;\n        private readonly ILogger _logger;\n        private IDictionary<NodeId, IList<IReference>> _externalReferences;\n        private Func<ISystemContext, NodeStateCollection> _loadPredefinedNodeshandler;\n        private readonly PlcSimulation _simulation;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for PlcNodeManager\n    /// </summary>\n    internal static partial class PlcNodeManagerLogging\n    {\n        private const int EventClass = 50;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Error,\n            Message = \"Error creating address space.\")]\n        public static partial void AddressSpaceError(this ILogger logger, Exception e);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"NodeId type is {NodeIdType}\")]\n        public static partial void NodeIdType(this ILogger logger, string nodeIdType);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PlcServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n\n    /// <inheritdoc/>\n    public class PlcServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.PlcApplications,\n                    Namespaces.PlcSimulation,\n                    Namespaces.PlcInstance\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public PlcServer(TimeService timeservice, ILogger logger, uint scaleunits)\n        {\n            _timeservice = timeservice;\n            _logger = logger;\n            _scaleunits = scaleunits;\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new PlcNodeManager(server, configuration, _timeservice, _logger, _scaleunits);\n        }\n\n        private readonly TimeService _timeservice;\n        private readonly ILogger _logger;\n        private readonly uint _scaleunits;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PlcSimulation.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc\n{\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Diagnostics;\n    using System.Text;\n    using System.Text.Encodings.Web;\n    using System.Text.Json;\n    using System.Timers;\n\n    public class PlcSimulation\n    {\n        public static uint EventInstanceCount { get; set; } = 1;\n        /// <summary>\n        /// ms.\n        /// </summary>\n        public static uint EventInstanceRate { get; set; } = 1000;\n\n        /// <summary>\n        /// Simulation data.\n        /// </summary>\n        public static int SimulationCycleCount { get; set; } = kSimulationCycleCountDefault;\n        public static int SimulationCycleLength { get; set; } = kSimulationCycleLengthDefault;\n\n        /// <summary>\n        /// Ctor for simulation server.\n        /// </summary>\n        /// <param name=\"plcNodeManager\"></param>\n        /// <param name=\"timeService\"></param>\n        public PlcSimulation(PlcNodeManager plcNodeManager, TimeService timeService)\n        {\n            _plcNodeManager = plcNodeManager;\n            _timeService = timeService;\n        }\n\n        /// <summary>\n        /// Start the simulation.\n        /// </summary>\n        public void Start()\n        {\n            if (EventInstanceCount > 0)\n            {\n                _eventInstanceGenerator = EventInstanceRate >= 50 || !Stopwatch.IsHighResolution\n                    ? _timeService.NewTimer(UpdateEventInstances, EventInstanceRate)\n                    : _timeService.NewFastTimer(UpdateVeryFastEventInstances, EventInstanceRate);\n            }\n\n            // Start simulation of nodes from plugin nodes list.\n            foreach (var plugin in _plcNodeManager.PluginNodes)\n            {\n                plugin.StartSimulation();\n            }\n        }\n\n        /// <summary>\n        /// Stop the simulation.\n        /// </summary>\n        public void Stop()\n        {\n            Disable(_eventInstanceGenerator);\n\n            // Stop simulation of nodes from plugin nodes list.\n            foreach (var plugin in _plcNodeManager.PluginNodes)\n            {\n                plugin.StopSimulation();\n            }\n        }\n\n        private void UpdateEventInstances(object state, ElapsedEventArgs elapsedEventArgs)\n        {\n            UpdateEventInstances();\n        }\n\n        private void UpdateVeryFastEventInstances(object state, FastTimerElapsedEventArgs elapsedEventArgs)\n        {\n            UpdateEventInstances();\n        }\n\n        private void UpdateEventInstances()\n        {\n            var eventInstanceCycle = _eventInstanceCycle++;\n\n            for (uint i = 0; i < EventInstanceCount; i++)\n            {\n                var e = new BaseEventState(null);\n                var info = new TranslationInfo(\n                    \"EventInstanceCycleEventKey\",\n                    \"en-us\",\n                    \"Event with index '{0}' and event cycle '{1}'\",\n                    i, eventInstanceCycle);\n\n                e.Initialize(\n                    _plcNodeManager.SystemContext,\n                    source: null,\n                    EventSeverity.Medium,\n                    new LocalizedText(info));\n\n                e.SetChildValue(_plcNodeManager.SystemContext, BrowseNames.SourceName, \"System\", false);\n                e.SetChildValue(_plcNodeManager.SystemContext, BrowseNames.SourceNode, ObjectIds.Server, false);\n\n                _plcNodeManager.Server.ReportEvent(e);\n            }\n        }\n\n        private static void Disable(ITimer timer)\n        {\n            if (timer == null)\n            {\n                return;\n            }\n\n            timer.Enabled = false;\n        }\n\n        /// <summary>\n        /// Get pn.json\n        /// </summary>\n        public string GetPublisherConfigJson()\n        {\n            var sb = new StringBuilder();\n\n            sb.Append(Environment.NewLine)\n                .AppendLine(\"[\")\n                .AppendLine(\"  {\")\n                .AppendLine(\"    \\\"EndpointUrl\\\": \\\"{{EndpointUrl}}\\\",\")\n                .AppendLine(\"    \\\"UseSecurity\\\": true,\")\n                .AppendLine(\"    \\\"OpcNodes\\\": [\");\n\n            // Print config from plugin nodes list.\n            foreach (var plugin in _plcNodeManager.PluginNodes)\n            {\n                foreach (var node in plugin.Nodes)\n                {\n                    // Show only if > 0 and != 1000 ms.\n                    var publishingInterval = node.PublishingInterval > 0 &&\n                                                node.PublishingInterval != 1000\n                        ? $\", \\\"OpcPublishingInterval\\\": {node.PublishingInterval}\"\n                        : string.Empty;\n                    // Show only if > 0 ms.\n                    var samplingInterval = node.SamplingInterval > 0\n                        ? $\", \\\"OpcSamplingInterval\\\": {node.SamplingInterval}\"\n                        : string.Empty;\n\n                    var nodeId = JsonEncodedText.Encode(node.NodeId, JavaScriptEncoder.Default).ToString();\n                    sb.Append(\"      { \\\"Id\\\": \\\"nsu=\")\n                        .Append(node.Namespace)\n                        .Append(';')\n                        .Append(node.NodeIdTypePrefix)\n                        .Append('=')\n                        .Append(nodeId)\n                        .Append('\\\"')\n                        .Append(publishingInterval)\n                        .Append(samplingInterval)\n                        .AppendLine(\" },\")\n                        ;\n                }\n            }\n\n            var trimLen = Environment.NewLine.Length + 1;\n            sb\n                .Remove(sb.Length - trimLen, trimLen)\n                .Append(Environment.NewLine).AppendLine(\"    ]\")\n                .AppendLine(\"  }\")\n                .AppendLine(\"]\"); // Trim trailing ,\\n.\n\n            return sb.ToString();\n        }\n\n        /// <summary>\n        /// in cycles\n        /// </summary>\n        private const int kSimulationCycleCountDefault = 50;\n        /// <summary>\n        /// in msec\n        /// </summary>\n        private const int kSimulationCycleLengthDefault = 100;\n        private readonly PlcNodeManager _plcNodeManager;\n        private readonly TimeService _timeService;\n        private ITimer _eventInstanceGenerator;\n        private uint _eventInstanceCycle;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/ComplexTypePluginNode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using PlcModel;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Reflection;\n    using System.Timers;\n\n    /// <summary>\n    /// Complex type boiler node.\n    /// </summary>\n    public sealed class ComplexTypePlcPluginNode : IPluginNodes, IDisposable\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        private PlcNodeManager _plcNodeManager;\n        private PlcState _node;\n        private ITimer _nodeGenerator;\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n\n            AddNodes(methodsFolder);\n        }\n\n        public void Dispose()\n        {\n            _node.Dispose();\n            _nodeGenerator.Dispose();\n        }\n\n        public void StartSimulation()\n        {\n            _nodeGenerator = TimeService.NewTimer(UpdatePlc1, 1000);\n        }\n\n        public void StopSimulation()\n        {\n            if (_nodeGenerator != null)\n            {\n                _nodeGenerator.Enabled = false;\n            }\n        }\n\n        private void AddNodes(FolderState methodsFolder)\n        {\n            // Load complex types from binary uanodes file.\n            _plcNodeManager.LoadPredefinedNodes(LoadPredefinedNodes);\n\n            // Find the Plc1 node that was created when the model was loaded.\n            var passiveNode = (BaseObjectState)_plcNodeManager.FindPredefinedNode(\n                new NodeId(PlcModel.Objects.Plc1, _plcNodeManager.NamespaceIndexes[(int)NamespaceType.PlcSimulation]), typeof(BaseObjectState));\n\n            // Convert to node that can be manipulated within the server.\n            _node = new PlcState(null);\n            _node.Create(_plcNodeManager.SystemContext, passiveNode);\n            _node.PlcStatus.Value = new PlcDataType();\n\n            _plcNodeManager.AddPredefinedNode(_node);\n\n            // Create heater on/off methods.\n            var heaterOnMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"HeaterOn\",\n                name: \"HeaterOn\",\n                \"Turn the heater on\",\n                NamespaceType.PlcSimulation);\n            SetHeaterOnMethodProperties(ref heaterOnMethod);\n            var heaterOffMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"HeaterOff\",\n                name: \"HeaterOff\",\n                \"Turn the heater off\",\n                NamespaceType.PlcSimulation);\n            SetHeaterOffMethodProperties(ref heaterOffMethod);\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = \"Plc\",\n                    Namespace = Plc.Namespaces.PlcSimulation\n                }\n            };\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and adds them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        private NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.Plc.Design.PlcModel.PredefinedNodes.uanodes\",\n                typeof(PlcNodeManager).GetTypeInfo().Assembly,\n                updateTables: true);\n            return predefinedNodes;\n        }\n\n        private void UpdatePlc1(object state, ElapsedEventArgs elapsedEventArgs)\n        {\n            var newValue = new PlcDataType\n            {\n                HeaterState = _node.PlcStatus.Value.HeaterState\n            };\n\n            var currentTemperatureBottom = _node.PlcStatus.Value.Temperature.Bottom;\n            var newTemperature = newValue.Temperature;\n\n            if (_node.PlcStatus.Value.HeaterState == PlcHeaterStateType.On)\n            {\n                // Heater on, increase by 1.\n                newTemperature.Bottom = currentTemperatureBottom + 1;\n            }\n            else\n            {\n                // Heater off, decrease down to a minimum of 20.\n                newTemperature.Bottom = currentTemperatureBottom > 20\n                    ? currentTemperatureBottom - 1\n                    : currentTemperatureBottom;\n            }\n\n            // Top is always 5 degrees less than bottom, with a minimum value of 20.\n            newTemperature.Top = Math.Max(20, newTemperature.Bottom - 5);\n\n            // Pressure is always 100_000 + bottom temperature.\n            newValue.Pressure = 100_000 + newTemperature.Bottom;\n\n            // Change complex value in one atomic step.\n            _node.PlcStatus.Value = newValue;\n            _node.PlcStatus.ClearChangeMasks(_plcNodeManager.SystemContext, includeChildren: true);\n        }\n\n        private void SetHeaterOnMethodProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnHeaterOnCall;\n        }\n\n        private void SetHeaterOffMethodProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnHeaterOffCall;\n        }\n\n        /// <summary>\n        /// Method to turn the heater on. Executes synchronously.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnHeaterOnCall(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _node.PlcStatus.Value.HeaterState = PlcHeaterStateType.On;\n            Logger.LogDebug(\"OnHeaterOnCall method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method to turn the heater off. Executes synchronously.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnHeaterOffCall(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _node.PlcStatus.Value.HeaterState = PlcHeaterStateType.Off;\n            Logger.LogDebug(\"OnHeaterOffCall method called\");\n            return ServiceResult.Good;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/DataPluginNodes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Nodes with values: Cycling step-up, alternating boolean, random signed 32-bit integer and random unsigend 32-bit integer.\n    /// </summary>\n    public class DataPluginNodes : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Basic\",\n                name: \"Basic\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n            AddMethods(methodsFolder);\n        }\n\n        public void StartSimulation()\n        {\n            _stepUpCycleInPhase = PlcSimulation.SimulationCycleCount;\n            _stepUpStarted = true;\n            _alternatingBooleanCycleInPhase = PlcSimulation.SimulationCycleCount;\n\n            _stepUpNode.Start(StepUpGenerator, PlcSimulation.SimulationCycleLength);\n            _alternatingBooleanNode.Start(AlternatingBooleanGenerator, PlcSimulation.SimulationCycleLength);\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _randomSignedInt32.Start(_ => _random.Next(int.MinValue, int.MaxValue), PlcSimulation.SimulationCycleLength);\n#pragma warning restore CA5394 // Do not use insecure randomness\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _randomUnsignedInt32.Start(_ => (uint)_random.Next(), PlcSimulation.SimulationCycleLength);\n#pragma warning restore CA5394 // Do not use insecure randomness\n        }\n\n        public void StopSimulation()\n        {\n            _stepUpNode.Stop();\n            _alternatingBooleanNode.Stop();\n            _randomSignedInt32.Stop();\n            _randomUnsignedInt32.Stop();\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            _stepUpNode = _plcNodeManager.CreateVariableNode<uint>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"StepUp\",\n                    name: \"StepUp\",\n                    new NodeId((uint)BuiltInType.UInt32),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentReadOrWrite,\n                    \"Constantly increasing value\",\n                    NamespaceType.PlcApplications));\n\n            _alternatingBooleanNode = _plcNodeManager.CreateVariableNode<bool>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"AlternatingBoolean\",\n                    name: \"AlternatingBoolean\",\n                    new NodeId((uint)BuiltInType.Boolean),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentRead,\n                    \"Alternating boolean value\",\n                    NamespaceType.PlcApplications));\n\n            _randomSignedInt32 = _plcNodeManager.CreateVariableNode<int>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"RandomSignedInt32\",\n                    name: \"RandomSignedInt32\",\n                    new NodeId((uint)BuiltInType.Int32),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentRead,\n                    \"Random signed 32 bit integer value\",\n                    NamespaceType.PlcApplications));\n\n            _randomUnsignedInt32 = _plcNodeManager.CreateVariableNode<uint>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"RandomUnsignedInt32\",\n                    \"RandomUnsignedInt32\",\n                    new NodeId((uint)BuiltInType.UInt32),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentRead,\n                    \"Random unsigned 32 bit integer value\",\n                    NamespaceType.PlcApplications));\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = \"StepUp\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                },\n                new() {\n                    NodeId = \"AlternatingBoolean\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                },\n                new() {\n                    NodeId = \"RandomSignedInt32\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                },\n                new() {\n                    NodeId = \"RandomUnsignedInt32\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                }\n            };\n        }\n\n        private void AddMethods(FolderState parentFolder)\n        {\n            var resetStepUpMethod = _plcNodeManager.CreateMethod(parentFolder,\n                \"ResetStepUp\", \"ResetStepUp\", \"Resets the StepUp counter to 0\", NamespaceType.PlcApplications);\n            SetResetStepUpMethodProperties(ref resetStepUpMethod);\n            var startStepUpMethod = _plcNodeManager.CreateMethod(parentFolder,\n                \"StartStepUp\", \"StartStepUp\", \"Starts the StepUp counter\", NamespaceType.PlcApplications);\n            SetStartStepUpMethodProperties(ref startStepUpMethod);\n            var stopStepUpMethod = _plcNodeManager.CreateMethod(parentFolder,\n                \"StopStepUp\", \"StopStepUp\", \"Stops the StepUp counter\", NamespaceType.PlcApplications);\n            SetStopStepUpMethodProperties(ref stopStepUpMethod);\n        }\n\n        private void SetResetStepUpMethodProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnResetStepUpCall;\n        }\n\n        private void SetStartStepUpMethodProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStartStepUpCall;\n        }\n\n        private void SetStopStepUpMethodProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStopStepUpCall;\n        }\n\n        /// <summary>\n        /// Method to reset the stepup value. Executes synchronously.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnResetStepUpCall(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            ResetStepUpData();\n            Logger.LogDebug(\"ResetStepUp method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method to start the stepup value. Executes synchronously.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStartStepUpCall(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            StartStepUp();\n            Logger.LogDebug(\"StartStepUp method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method to stop the stepup value. Executes synchronously.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStopStepUpCall(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            StopStepUp();\n            Logger.LogDebug(\"StopStepUp method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Updates simulation values. Called each SimulationCycleLength msec.\n        /// Using SimulationCycleCount cycles per simulation phase.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        private uint StepUpGenerator(uint value)\n        {\n            // increase step up value\n            if (_stepUpStarted && (_stepUpCycleInPhase % (PlcSimulation.SimulationCycleCount / 50) == 0))\n            {\n                value++;\n            }\n\n            // end of cycle: reset cycle count\n            if (--_stepUpCycleInPhase == 0)\n            {\n                _stepUpCycleInPhase = PlcSimulation.SimulationCycleCount;\n            }\n\n            return value;\n        }\n\n        /// <summary>\n        /// Updates simulation values. Called each SimulationCycleLength msec.\n        /// Using SimulationCycleCount cycles per simulation phase.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        private bool AlternatingBooleanGenerator(bool value)\n        {\n            // calculate next boolean value\n            var nextAlternatingBoolean = _alternatingBooleanCycleInPhase % PlcSimulation.SimulationCycleCount == 0 ? !value : value;\n            if (value != nextAlternatingBoolean)\n            {\n                Logger.LogTrace(\"Data change to: {NextAlternatingBoolean}\", nextAlternatingBoolean);\n            }\n\n            // end of cycle: reset cycle count\n            if (--_alternatingBooleanCycleInPhase == 0)\n            {\n                _alternatingBooleanCycleInPhase = PlcSimulation.SimulationCycleCount;\n            }\n\n            return nextAlternatingBoolean;\n        }\n\n        /// <summary>\n        /// Method implementation to reset the StepUp data.\n        /// </summary>\n        public void ResetStepUpData()\n        {\n            _stepUpNode.Value = 0;\n        }\n\n        /// <summary>\n        /// Method implementation to start the StepUp.\n        /// </summary>\n        public void StartStepUp()\n        {\n            _stepUpStarted = true;\n        }\n\n        /// <summary>\n        /// Method implementation to stop the StepUp.\n        /// </summary>\n        public void StopStepUp()\n        {\n            _stepUpStarted = false;\n        }\n\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<uint> _stepUpNode;\n        private SimulatedVariableNode<bool> _alternatingBooleanNode;\n        private SimulatedVariableNode<int> _randomSignedInt32;\n        private SimulatedVariableNode<uint> _randomUnsignedInt32;\n        private readonly Random _random = new();\n        private bool _stepUpStarted;\n        private int _stepUpCycleInPhase;\n        private int _alternatingBooleanCycleInPhase;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/DeterministicGuidPluginNodes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Nodes with deterministic GUIDs as ID.\n    /// </summary>\n    public class DeterministicGuidPluginNodes : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n        private uint NodeCount => ScaleUnits == 0 ? 1u : ScaleUnits * 50;\n\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeRate { get; } = 1000;\n        private NodeType NodeType { get; } = NodeType.UIntScalar;\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Deterministic GUID\",\n                name: \"Deterministic GUID\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n        }\n\n        public void StartSimulation()\n        {\n            foreach (var node in _nodes)\n            {\n                node.Start(value => value + 1, periodMs: 1000);\n            }\n        }\n\n        public void StopSimulation()\n        {\n            foreach (var node in _nodes)\n            {\n                node.Stop();\n            }\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            _nodes = new SimulatedVariableNode<uint>[NodeCount];\n            var nodes = new List<NodeWithIntervals>((int)NodeCount);\n\n            if (NodeCount > 0)\n            {\n                Logger.LogInformation(\"Creating {NodeCount} GUID node(s) of type: {NodeType}\", NodeCount, NodeType);\n                Logger.LogInformation(\"Node values will change every {NodeRate} ms\", NodeRate);\n            }\n\n            for (var i = 0; i < NodeCount; i++)\n            {\n                var id = DeterministicGuid.NewGuid().ToString();\n\n                _nodes[i] = _plcNodeManager.CreateVariableNode<uint>(\n                    _plcNodeManager.CreateBaseVariable(\n                        folder,\n                        path: id,\n                        name: id,\n                        new NodeId((uint)BuiltInType.UInt32),\n                        ValueRanks.Scalar,\n                        AccessLevels.CurrentReadOrWrite,\n                        \"Constantly increasing value\",\n                        NamespaceType.PlcApplications,\n                        defaultValue: (uint)0));\n\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = id,\n                    Namespace = Plc.Namespaces.PlcApplications\n                });\n            }\n\n            Nodes = nodes;\n        }\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<uint>[] _nodes;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/DipPluginNode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Node with a sine wave value with a dip anomaly.\n    /// </summary>\n    public class DipPluginNode : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Anomaly\",\n                name: \"Anomaly\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n        }\n\n        public void StartSimulation()\n        {\n            _dipCycleInPhase = PlcSimulation.SimulationCycleCount;\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _dipAnomalyCycle = _random.Next(PlcSimulation.SimulationCycleCount);\n#pragma warning restore CA5394 // Do not use insecure randomness\n            Logger.LogTrace(\"First dip anomaly cycle: {DipAnomalyCycle}\", _dipAnomalyCycle);\n\n            _node.Start(DipGenerator, PlcSimulation.SimulationCycleLength);\n        }\n\n        public void StopSimulation()\n        {\n            _node.Stop();\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            _node = _plcNodeManager.CreateVariableNode<double>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"DipData\",\n                    name: \"DipData\",\n                    new NodeId((uint)BuiltInType.Double),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentRead,\n                    \"Value with random dips\",\n                    NamespaceType.PlcApplications));\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = \"DipData\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                }\n            };\n        }\n\n        /// <summary>\n        /// Generates a sine wave with dips at a random cycle in the phase.\n        /// Called each SimulationCycleLength msec.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        private double DipGenerator(double value)\n        {\n            // calculate next value\n            double nextValue;\n            if (_dipCycleInPhase == _dipAnomalyCycle)\n            {\n                nextValue = kSimulationMaxAmplitude * -10;\n                Logger.LogTrace(\"Generate dip anomaly\");\n            }\n            else\n            {\n                nextValue = kSimulationMaxAmplitude * Math.Sin(2 * Math.PI / PlcSimulation.SimulationCycleCount * _dipCycleInPhase);\n            }\n            Logger.LogTrace(\"Spike cycle: {DipCycleInPhase} data: {NextValue}\", _dipCycleInPhase, nextValue);\n\n            // end of cycle: reset cycle count and calc next anomaly cycle\n            if (--_dipCycleInPhase == 0)\n            {\n                _dipCycleInPhase = PlcSimulation.SimulationCycleCount;\n#pragma warning disable CA5394 // Do not use insecure randomness\n                _dipAnomalyCycle = _random.Next(PlcSimulation.SimulationCycleCount);\n#pragma warning restore CA5394 // Do not use insecure randomness\n                Logger.LogTrace(\"Next dip anomaly cycle: {AnomalyCycle}\", _dipAnomalyCycle);\n            }\n\n            return nextValue;\n        }\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<double> _node;\n        private readonly Random _random = new();\n        private int _dipCycleInPhase;\n        private int _dipAnomalyCycle;\n        private const double kSimulationMaxAmplitude = 100.0;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/FastPluginNodes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Timers;\n\n    /// <summary>\n    /// Nodes with fast changing values.\n    /// </summary>\n    public class FastPluginNodes : IPluginNodes\n    {\n        public TimeService TimeService { get; set; }\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n\n        private uint NodeCount => ScaleUnits == 0 ? 3u : ScaleUnits * 1000;\n        public uint ScaleUnits { get; set; }\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeRate { get; } = 1000;\n        private NodeType NodeType { get; } = NodeType.UIntScalar;\n        private string NodeMinValue { get; }\n        private string NodeMaxValue { get; }\n        private string NodeStepSize { get; } = \"1\";\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeSamplingInterval { get; }\n        public ILogger Logger { get; set; }\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            _slowFastCommon = new SlowFastCommon(_plcNodeManager, TimeService, Logger);\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Fast\",\n                name: \"Fast\",\n                NamespaceType.PlcApplications);\n\n            // Used for methods to limit the number of updates to a fixed count.\n            var simulatorFolder = _plcNodeManager.CreateFolder(\n                telemetryFolder.Parent, // Root.\n                path: \"SimulatorConfiguration\",\n                name: \"SimulatorConfiguration\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder, simulatorFolder);\n            AddMethods(methodsFolder);\n        }\n\n        private void AddMethods(FolderState methodsFolder)\n        {\n            var stopUpdateMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"StopUpdateFastNodes\",\n                name: \"StopUpdateFastNodes\",\n                \"Stop the increase of value of fast nodes\",\n                NamespaceType.PlcApplications);\n            SetStopUpdateFastNodesProperties(ref stopUpdateMethod);\n            var startUpdateMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"StartUpdateFastNodes\",\n                name: \"StartUpdateFastNodes\",\n                \"Start the increase of value of fast nodes\",\n                NamespaceType.PlcApplications);\n            SetStartUpdateFastNodesProperties(ref startUpdateMethod);\n        }\n\n        public void StartSimulation()\n        {\n            // Only use the fast timers when we need to go really fast,\n            // since they consume more resources and create an own thread.\n            _nodeGenerator = NodeRate >= 50 || !Stopwatch.IsHighResolution ?\n                TimeService.NewTimer(UpdateNodes, NodeRate) :\n                TimeService.NewFastTimer(UpdateVeryFastNodes, NodeRate);\n        }\n\n        public void StopSimulation()\n        {\n            if (_nodeGenerator != null)\n            {\n                _nodeGenerator.Enabled = false;\n            }\n        }\n\n        private void AddNodes(FolderState folder, FolderState simulatorFolder)\n        {\n            (_nodes, _badNodes) = _slowFastCommon.CreateNodes(NodeType, \"Fast\",\n                NodeCount, folder, simulatorFolder, false, NodeStepSize,\n                NodeMinValue, NodeMaxValue, NodeRate, NodeSamplingInterval);\n\n            ExposeNodesWithIntervals();\n        }\n\n        /// <summary>\n        /// Expose node information for dumping pn.json.\n        /// </summary>\n        private void ExposeNodesWithIntervals()\n        {\n            var nodes = new List<NodeWithIntervals>();\n\n            foreach (var node in _nodes)\n            {\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = node.NodeId.Identifier.ToString(),\n                    NodeIdTypePrefix = NodeWithIntervals.GetPrefix(node.NodeId.IdType),\n                    Namespace = Plc.Namespaces.PlcApplications,\n                    PublishingInterval = NodeRate,\n                    SamplingInterval = NodeSamplingInterval\n                });\n            }\n\n            foreach (var node in _badNodes)\n            {\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = node.NodeId.Identifier.ToString(),\n                    NodeIdTypePrefix = NodeWithIntervals.GetPrefix(node.NodeId.IdType),\n                    Namespace = Plc.Namespaces.PlcApplications,\n                    PublishingInterval = NodeRate,\n                    SamplingInterval = NodeSamplingInterval\n                });\n            }\n\n            Nodes = nodes;\n        }\n\n        private void SetStopUpdateFastNodesProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStopUpdateFastNodes;\n        }\n\n        private void SetStartUpdateFastNodesProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStartUpdateFastNodes;\n        }\n\n        /// <summary>\n        /// Method to stop updating the fast nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStopUpdateFastNodes(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _updateNodes = false;\n            Logger.LogDebug(\"StopUpdateFastNodes method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method to start updating the fast nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStartUpdateFastNodes(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _updateNodes = true;\n            Logger.LogDebug(\"StartUpdateFastNodes method called\");\n            return ServiceResult.Good;\n        }\n\n        private void UpdateNodes(object state, ElapsedEventArgs elapsedEventArgs)\n        {\n            _slowFastCommon.UpdateNodes(_nodes, _badNodes, NodeType, _updateNodes);\n        }\n\n        private void UpdateVeryFastNodes(object state, FastTimerElapsedEventArgs elapsedEventArgs)\n        {\n            _slowFastCommon.UpdateNodes(_nodes, _badNodes, NodeType, _updateNodes);\n        }\n\n        private PlcNodeManager _plcNodeManager;\n        private SlowFastCommon _slowFastCommon;\n        private BaseDataVariableState[] _nodes;\n        private BaseDataVariableState[] _badNodes;\n        private ITimer _nodeGenerator;\n        private bool _updateNodes = true;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/FastRandomPluginNodes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Timers;\n\n    /// <summary>\n    /// Nodes with fast changing values.\n    /// </summary>\n    public class FastRandomPluginNodes : IPluginNodes\n    {\n        public TimeService TimeService { get; set; }\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        private uint NodeCount => ScaleUnits == 0 ? 3u : ScaleUnits * 1000;\n        public uint ScaleUnits { get; set; }\n\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeRate { get; } = 1000;\n        private NodeType NodeType { get; } = NodeType.UIntScalar;\n        private string NodeMinValue { get; }\n        private string NodeMaxValue { get; }\n        private string NodeStepSize { get; } = \"1\";\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeSamplingInterval { get; }\n        public ILogger Logger { get; set; }\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            _slowFastCommon = new SlowFastCommon(_plcNodeManager, TimeService, Logger);\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Fast\",\n                name: \"Fast\",\n                NamespaceType.PlcApplications);\n\n            // Used for methods to limit the number of updates to a fixed count.\n            var simulatorFolder = _plcNodeManager.CreateFolder(\n                telemetryFolder.Parent, // Root.\n                path: \"SimulatorConfiguration\",\n                name: \"SimulatorConfiguration\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder, simulatorFolder);\n            AddMethods(methodsFolder);\n        }\n\n        private void AddMethods(FolderState methodsFolder)\n        {\n            var stopUpdateMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"StopUpdateFastNodes\",\n                name: \"StopUpdateFastNodes\",\n                \"Stop the increase of value of fast nodes\",\n                NamespaceType.PlcApplications);\n            SetStopUpdateFastNodesProperties(ref stopUpdateMethod);\n            var startUpdateMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"StartUpdateFastNodes\",\n                name: \"StartUpdateFastNodes\",\n                \"Start the increase of value of fast nodes\",\n                NamespaceType.PlcApplications);\n            SetStartUpdateFastNodesProperties(ref startUpdateMethod);\n        }\n\n        public void StartSimulation()\n        {\n            // Only use the fast timers when we need to go really fast,\n            // since they consume more resources and create an own thread.\n            _nodeGenerator = NodeRate >= 50 || !Stopwatch.IsHighResolution ?\n                TimeService.NewTimer(UpdateNodes, NodeRate) :\n                TimeService.NewFastTimer(UpdateVeryFastNodes, NodeRate);\n        }\n\n        public void StopSimulation()\n        {\n            if (_nodeGenerator != null)\n            {\n                _nodeGenerator.Enabled = false;\n            }\n        }\n\n        private void AddNodes(FolderState folder, FolderState simulatorFolder)\n        {\n            (_nodes, _badNodes) = _slowFastCommon.CreateNodes(NodeType, \"FastRandom\",\n                NodeCount, folder, simulatorFolder, true, NodeStepSize,\n                NodeMinValue, NodeMaxValue, NodeRate, NodeSamplingInterval);\n\n            ExposeNodesWithIntervals();\n        }\n\n        /// <summary>\n        /// Expose node information for dumping pn.json.\n        /// </summary>\n        private void ExposeNodesWithIntervals()\n        {\n            var nodes = new List<NodeWithIntervals>();\n\n            foreach (var node in _nodes)\n            {\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = node.NodeId.Identifier.ToString(),\n                    NodeIdTypePrefix = NodeWithIntervals.GetPrefix(node.NodeId.IdType),\n                    Namespace = Plc.Namespaces.PlcApplications,\n                    PublishingInterval = NodeRate,\n                    SamplingInterval = NodeSamplingInterval\n                });\n            }\n\n            foreach (var node in _badNodes)\n            {\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = node.NodeId.Identifier.ToString(),\n                    NodeIdTypePrefix = NodeWithIntervals.GetPrefix(node.NodeId.IdType),\n                    Namespace = Plc.Namespaces.PlcApplications,\n                    PublishingInterval = NodeRate,\n                    SamplingInterval = NodeSamplingInterval\n                });\n            }\n\n            Nodes = nodes;\n        }\n\n        private void SetStopUpdateFastNodesProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStopUpdateFastNodes;\n        }\n\n        private void SetStartUpdateFastNodesProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStartUpdateFastNodes;\n        }\n\n        /// <summary>\n        /// Method to stop updating the fast nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStopUpdateFastNodes(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _updateNodes = false;\n            Logger.LogDebug(\"StopUpdateFastNodes method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method to start updating the fast nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStartUpdateFastNodes(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _updateNodes = true;\n            Logger.LogDebug(\"StartUpdateFastNodes method called\");\n            return ServiceResult.Good;\n        }\n\n        private void UpdateNodes(object state, ElapsedEventArgs elapsedEventArgs)\n        {\n            _slowFastCommon.UpdateNodes(_nodes, _badNodes, NodeType, _updateNodes);\n        }\n\n        private void UpdateVeryFastNodes(object state, FastTimerElapsedEventArgs elapsedEventArgs)\n        {\n            _slowFastCommon.UpdateNodes(_nodes, _badNodes, NodeType, _updateNodes);\n        }\n\n        private PlcNodeManager _plcNodeManager;\n        private SlowFastCommon _slowFastCommon;\n        private BaseDataVariableState[] _nodes;\n        private BaseDataVariableState[] _badNodes;\n        private ITimer _nodeGenerator;\n        private bool _updateNodes = true;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/LongIdPluginNode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n    using System.Text;\n\n    /// <summary>\n    /// Node with ID of 3950 chars.\n    /// </summary>\n    public class LongIdPluginNode : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Special\",\n                name: \"Special\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n        }\n\n        public void StartSimulation()\n        {\n            _node.Start(value => value + 1, periodMs: 1000);\n        }\n\n        public void StopSimulation()\n        {\n            _node.Stop();\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            // Repeat A-Z until 3950 chars are collected.\n            var id = new StringBuilder(4000);\n            for (var i = 0; i < 3950; i++)\n            {\n                id.Append((char)(65 + (i % 26)));\n            }\n\n            _node = _plcNodeManager.CreateVariableNode<uint>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: id.ToString(),\n                    name: \"LongId3950\",\n                    new NodeId((uint)BuiltInType.UInt32),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentReadOrWrite,\n                    \"Constantly increasing value\",\n                    NamespaceType.PlcApplications,\n                    defaultValue: (uint)0));\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = id.ToString(),\n                    Namespace = Plc.Namespaces.PlcApplications\n                }\n            };\n        }\n\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<uint> _node;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/LongStringPluginNodes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Text;\n\n    /// <summary>\n    /// Nodes that change value every second to string containing single repeated uppercase letter.\n    /// </summary>\n    public class LongStringPluginNodes : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<string> _longStringIdNode10;\n        private SimulatedVariableNode<string> _longStringIdNode50;\n        private SimulatedVariableNode<byte[]> _longStringIdNode100;\n        private SimulatedVariableNode<byte[]> _longStringIdNode200;\n        private readonly Random _random = new();\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Special\",\n                name: \"Special\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n        }\n\n        public void StartSimulation()\n        {\n            // Change value every second to string containing single repeated uppercase letter.\n            const int A = 65, Z = 90 + 1;\n\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _longStringIdNode10.Start(_ => new string((char)_random.Next(A, Z), 10 * 1024), periodMs: 1000);\n#pragma warning restore CA5394 // Do not use insecure randomness\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _longStringIdNode50.Start(_ => new string((char)_random.Next(A, Z), 50 * 1024), periodMs: 1000);\n#pragma warning restore CA5394 // Do not use insecure randomness\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _longStringIdNode100.Start(_ => Encoding.UTF8.GetBytes(new string((char)_random.Next(A, Z), 100 * 1024)), periodMs: 1000);\n#pragma warning restore CA5394 // Do not use insecure randomness\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _longStringIdNode200.Start(_ => Encoding.UTF8.GetBytes(new string((char)_random.Next(A, Z), 200 * 1024)), periodMs: 1000);\n#pragma warning restore CA5394 // Do not use insecure randomness\n        }\n\n        public void StopSimulation()\n        {\n            _longStringIdNode10.Stop();\n            _longStringIdNode50.Stop();\n            _longStringIdNode100.Stop();\n            _longStringIdNode200.Stop();\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            // 10 kB.\n            var initialString = new string('A', 10 * 1024);\n            _longStringIdNode10 = _plcNodeManager.CreateVariableNode<string>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"LongString10kB\",\n                    name: \"LongString10kB\",\n                    new NodeId((uint)BuiltInType.String),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentReadOrWrite,\n                    \"Long string\",\n                    NamespaceType.PlcApplications,\n                    initialString));\n\n            // 50 kB.\n            initialString = new string('A', 50 * 1024);\n            _longStringIdNode50 = _plcNodeManager.CreateVariableNode<string>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"LongString50kB\",\n                    name: \"LongString50kB\",\n                    new NodeId((uint)BuiltInType.String),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentReadOrWrite,\n                    \"Long string\",\n                    NamespaceType.PlcApplications,\n                    initialString));\n\n            // 100 kB.\n            var initialByteArray = Encoding.UTF8.GetBytes(new string('A', 100 * 1024));\n            _longStringIdNode100 = _plcNodeManager.CreateVariableNode<byte[]>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"LongString100kB\",\n                    name: \"LongString100kB\",\n                    new NodeId((uint)BuiltInType.ByteString),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentReadOrWrite,\n                    \"Long string\",\n                    NamespaceType.PlcApplications,\n                    initialByteArray));\n\n            // 200 kB.\n            initialByteArray = Encoding.UTF8.GetBytes(new string('A', 200 * 1024));\n            _longStringIdNode200 = _plcNodeManager.CreateVariableNode<byte[]>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"LongString200kB\",\n                    name: \"LongString200kB\",\n                    new NodeId((uint)BuiltInType.Byte),\n                    ValueRanks.OneDimension,\n                    AccessLevels.CurrentReadOrWrite,\n                    \"Long string\",\n                    NamespaceType.PlcApplications,\n                    initialByteArray));\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = \"LongString10kB\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                },\n                new() {\n                    NodeId = \"LongString50kB\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                },\n                new() {\n                    NodeId = \"LongString100kB\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                },\n                new() {\n                    NodeId = \"LongString200kB\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                }\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/NegTrendPluginNode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Node with a value that shows a negative trend.\n    /// </summary>\n    public class NegTrendPluginNode : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Anomaly\",\n                name: \"Anomaly\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n            AddMethods(methodsFolder);\n        }\n\n        public void StartSimulation()\n        {\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _negTrendAnomalyPhase = _random.Next(10);\n#pragma warning restore CA5394 // Do not use insecure randomness\n            _negTrendCycleInPhase = PlcSimulation.SimulationCycleCount;\n            Logger.LogTrace(\"First neg trend anomaly phase: {NegTrendAnomalyPhase}\", _negTrendAnomalyPhase);\n\n            _node.Start(NegTrendGenerator, PlcSimulation.SimulationCycleLength);\n        }\n\n        public void StopSimulation()\n        {\n            _node.Stop();\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            _node = _plcNodeManager.CreateVariableNode<double>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"NegativeTrendData\",\n                    name: \"NegativeTrendData\",\n                    new NodeId((uint)BuiltInType.Double),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentRead,\n                    \"Value with a slow negative trend\",\n                    NamespaceType.PlcApplications));\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = \"NegativeTrendData\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                }\n            };\n        }\n\n        private void AddMethods(FolderState methodsFolder)\n        {\n            var resetTrendMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"ResetNegTrend\",\n                name: \"ResetNegTrend\",\n                \"Reset the negative trend values to their baseline value\",\n                NamespaceType.PlcApplications);\n            SetResetTrendMethodProperties(ref resetTrendMethod);\n        }\n\n        /// <summary>\n        /// Generates a sine wave with spikes at a configurable cycle in the phase.\n        /// Called each SimulationCycleLength msec.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        private double NegTrendGenerator(double value)\n        {\n            // calculate next value\n            var nextValue = kTrendBaseValue;\n            if (_negTrendPhase >= _negTrendAnomalyPhase)\n            {\n                nextValue = kTrendBaseValue - ((_negTrendPhase - _negTrendAnomalyPhase) / 10d);\n                Logger.LogTrace(\"Generate negtrend anomaly\");\n            }\n\n            // end of cycle: reset cycle count and calc next anomaly cycle\n            if (--_negTrendCycleInPhase == 0)\n            {\n                _negTrendCycleInPhase = PlcSimulation.SimulationCycleCount;\n                _negTrendPhase++;\n                Logger.LogTrace(\"Neg trend phase: {NegTrendPhase}, data: {NextValue}\",\n                    _negTrendPhase, nextValue);\n            }\n\n            return nextValue;\n        }\n\n        private void SetResetTrendMethodProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnResetTrendCall;\n        }\n\n        /// <summary>\n        /// Method to reset the trend values. Executes synchronously.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnResetTrendCall(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            ResetTrendData();\n            Logger.LogDebug(\"ResetNegTrend method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method implementation to reset the trend data.\n        /// </summary>\n        public void ResetTrendData()\n        {\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _negTrendAnomalyPhase = _random.Next(10);\n#pragma warning restore CA5394 // Do not use insecure randomness\n            _negTrendCycleInPhase = PlcSimulation.SimulationCycleCount;\n            _negTrendPhase = 0;\n        }\n\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<double> _node;\n        private readonly Random _random = new();\n        private int _negTrendCycleInPhase;\n        private int _negTrendPhase;\n        private int _negTrendAnomalyPhase;\n        private const double kTrendBaseValue = 100.0;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/NodeType.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    public enum NodeType\n    {\n        UIntScalar,\n        DoubleScalar,\n        BoolScalar,\n        UIntArray,\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/PosTrendPluginNode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Node with a value that shows a positive trend.\n    /// </summary>\n    public class PosTrendPluginNode : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Anomaly\",\n                name: \"Anomaly\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n            AddMethods(methodsFolder);\n        }\n\n        public void StartSimulation()\n        {\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _posTrendAnomalyPhase = _random.Next(10);\n#pragma warning restore CA5394 // Do not use insecure randomness\n            _posTrendCycleInPhase = PlcSimulation.SimulationCycleCount;\n            Logger.LogTrace(\"First pos trend anomaly phase: {PosTrendAnomalyPhase}\", _posTrendAnomalyPhase);\n\n            _node.Start(PosTrendGenerator, PlcSimulation.SimulationCycleLength);\n        }\n\n        public void StopSimulation()\n        {\n            _node.Stop();\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            _node = _plcNodeManager.CreateVariableNode<double>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"PositiveTrendData\",\n                    name: \"PositiveTrendData\",\n                    new NodeId((uint)BuiltInType.Double),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentRead,\n                    \"Value with a slow positive trend\",\n                    NamespaceType.PlcApplications));\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = \"PositiveTrendData\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                }\n            };\n        }\n\n        private void AddMethods(FolderState methodsFolder)\n        {\n            var resetTrendMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"ResetPosTrend\",\n                name: \"ResetPosTrend\",\n                \"Reset the positive trend values to their baseline value\",\n                NamespaceType.PlcApplications);\n            SetResetTrendMethodProperties(ref resetTrendMethod);\n        }\n\n        /// <summary>\n        /// Generates a sine wave with spikes at a configurable cycle in the phase.\n        /// Called each SimulationCycleLength msec.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        private double PosTrendGenerator(double value)\n        {\n            // calculate next value\n            var nextValue = kTrendBaseValue;\n            if (_posTrendPhase >= _posTrendAnomalyPhase)\n            {\n                nextValue = kTrendBaseValue + ((_posTrendPhase - _posTrendAnomalyPhase) / 10d);\n                Logger.LogTrace(\"Generate postrend anomaly\");\n            }\n\n            // end of cycle: reset cycle count and calc next anomaly cycle\n            if (--_posTrendCycleInPhase == 0)\n            {\n                _posTrendCycleInPhase = PlcSimulation.SimulationCycleCount;\n                _posTrendPhase++;\n                Logger.LogTrace(\"Pos trend phase: {PosTrendPhase}, data: {NextValue}\",\n                    _posTrendPhase, nextValue);\n            }\n            return nextValue;\n        }\n\n        private void SetResetTrendMethodProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnResetTrendCall;\n        }\n\n        /// <summary>\n        /// Method to reset the trend values. Executes synchronously.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnResetTrendCall(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            ResetTrendData();\n            Logger.LogDebug(\"ResetPosTrend method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method implementation to reset the trend data.\n        /// </summary>\n        public void ResetTrendData()\n        {\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _posTrendAnomalyPhase = _random.Next(10);\n#pragma warning restore CA5394 // Do not use insecure randomness\n            _posTrendCycleInPhase = PlcSimulation.SimulationCycleCount;\n            _posTrendPhase = 0;\n        }\n\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<double> _node;\n        private readonly Random _random = new();\n        private int _posTrendCycleInPhase;\n        private int _posTrendPhase;\n        private int _posTrendAnomalyPhase;\n        private const double kTrendBaseValue = 100.0;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/SlowFastCommon.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Globalization;\n\n    public class SlowFastCommon\n    {\n        public SlowFastCommon(PlcNodeManager plcNodeManager, TimeService timeService, ILogger logger)\n        {\n            _plcNodeManager = plcNodeManager ?? throw new ArgumentNullException(nameof(plcNodeManager));\n            _timeService = timeService;\n            _logger = logger;\n        }\n\n        public (BaseDataVariableState[] nodes, BaseDataVariableState[] badNodes) CreateNodes(NodeType nodeType,\n            string name, uint count, FolderState folder, FolderState simulatorFolder,\n            bool nodeRandomization, string nodeStepSize, string nodeMinValue, string nodeMaxValue,\n            uint nodeRate, uint nodeSamplingInterval)\n        {\n            var nodes = CreateBaseLoadNodes(folder, name, count, nodeType, nodeRandomization, nodeStepSize,\n                nodeMinValue, nodeMaxValue, nodeRate, nodeSamplingInterval);\n            var badNodes = CreateBaseLoadNodes(folder, $\"Bad{name}\", count: 1, nodeType, nodeRandomization,\n                nodeStepSize, nodeMinValue, nodeMaxValue, nodeRate, nodeSamplingInterval);\n            _numberOfUpdates = CreateNumberOfUpdatesVariable(name, simulatorFolder);\n\n            return (nodes, badNodes);\n        }\n\n        private BaseDataVariableState[] CreateBaseLoadNodes(FolderState folder, string name, uint count,\n            NodeType type, bool randomize, string stepSize, string minValue, string maxValue, uint nodeRate,\n            uint nodeSamplingInterval)\n        {\n            var nodes = new BaseDataVariableState[count];\n\n            if (count > 0)\n            {\n                _logger.CreatingNodes(count, name, type);\n                _logger.NodeChangeRate(nodeRate);\n                _logger.SamplingRate(nodeSamplingInterval);\n            }\n\n            for (var i = 0; i < count; i++)\n            {\n                var (dataType, valueRank, defaultValue, stepTypeSize, minTypeValue, maxTypeValue) =\n                    GetNodeType(type, stepSize, minValue, maxValue);\n\n                var id = (i + 1).ToString(CultureInfo.InvariantCulture);\n                nodes[i] = _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: $\"{name}{type}{id}\",\n                    name: $\"{name}{type}{id}\",\n                    dataType,\n                    valueRank,\n                    AccessLevels.CurrentReadOrWrite,\n                    \"Constantly increasing value(s)\",\n                    NamespaceType.PlcApplications,\n                    randomize,\n                    stepTypeSize,\n                    minTypeValue,\n                    maxTypeValue,\n                    defaultValue);\n            }\n\n            return nodes;\n        }\n\n        private BaseDataVariableState CreateNumberOfUpdatesVariable(string baseName, FolderState simulatorFolder)\n        {\n            // Create property to hold NumberOfUpdates (to stop simulated updates after a given count)\n            var variable = new BaseDataVariableState(simulatorFolder);\n            var name = $\"{baseName}{kNumberOfUpdates}\";\n            variable.NodeId = new NodeId(name, _plcNodeManager.NamespaceIndexes[(int)NamespaceType.PlcApplications]);\n            variable.DataType = DataTypeIds.Int32;\n            variable.Value = -1; // a value < 0 means to update nodes indefinitely.\n            variable.ValueRank = ValueRanks.Scalar;\n            variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.BrowseName = name;\n            variable.DisplayName = name;\n            variable.Description = new LocalizedText(\n                \"The number of times to update the {name} nodes. Set to -1 to update indefinitely.\");\n            simulatorFolder.AddChild(variable);\n\n            return variable;\n        }\n\n        private static (NodeId dataType, int valueRank, object defaultValue, object stepSize, object minValue, object maxValue)\n            GetNodeType(NodeType nodeType, string stepSize, string minValue, string maxValue)\n        {\n            return nodeType switch\n            {\n                NodeType.BoolScalar => (new NodeId((uint)BuiltInType.Boolean), ValueRanks.Scalar, true, null, null, null),\n\n                NodeType.DoubleScalar => (new NodeId((uint)BuiltInType.Double), ValueRanks.Scalar,\n                0.0, double.Parse(stepSize, CultureInfo.InvariantCulture),\n                    minValue == null\n                        ? 0.0\n                        : double.Parse(minValue, CultureInfo.InvariantCulture),\n                    maxValue == null\n                        ? double.MaxValue\n                        : double.Parse(maxValue, CultureInfo.InvariantCulture)),\n\n                NodeType.UIntArray => (new NodeId((uint)BuiltInType.UInt32), ValueRanks.OneDimension, new uint[32], null, null, null),\n\n                NodeType.UIntScalar => (new NodeId((uint)BuiltInType.UInt32), ValueRanks.Scalar, 0u, uint.Parse(stepSize, CultureInfo.InvariantCulture),\n                    minValue == null\n                        ? uint.MinValue\n                        : uint.Parse(minValue, CultureInfo.InvariantCulture),\n                    maxValue == null\n                        ? uint.MaxValue\n                        : uint.Parse(maxValue, CultureInfo.InvariantCulture)),\n\n                _ => throw new NotSupportedException(\"Node type unknown\")\n            };\n        }\n\n        public void UpdateNodes(BaseDataVariableState[] nodes, BaseDataVariableState[] badNodes,\n            NodeType nodeType, bool updateNodes)\n        {\n            if (!ShouldUpdateNodes(_numberOfUpdates) || !updateNodes)\n            {\n                return;\n            }\n\n            if (nodes != null)\n            {\n                UpdateNodes(nodes, nodeType, StatusCodes.Good, false);\n            }\n\n            if (badNodes != null)\n            {\n                (var status, var addBadValue) = _badStatusSequence[_badNodesCycle++ % _badStatusSequence.Length];\n                UpdateNodes(badNodes, nodeType, status, addBadValue);\n            }\n        }\n\n        private void UpdateNodes(BaseDataVariableState[] nodes, NodeType type, StatusCode status, bool addBadValue)\n        {\n            if (nodes == null || nodes.Length == 0)\n            {\n                _logger.InvalidArgument(nodes);\n                return;\n            }\n\n            for (var nodeIndex = 0; nodeIndex < nodes.Length; nodeIndex++)\n            {\n                var extendedNode = (BaseDataVariableStateExtended)nodes[nodeIndex];\n\n                object value = null;\n                if (StatusCode.IsNotBad(status) || addBadValue)\n                {\n                    switch (type)\n                    {\n                        case NodeType.DoubleScalar:\n                            var minDoubleValue = (double)extendedNode.MinValue;\n                            var maxDoubleValue = (double)extendedNode.MaxValue;\n                            var extendedDoubleNodeValue = (double)(extendedNode.Value ?? minDoubleValue);\n\n                            if (extendedNode.Randomize)\n                            {\n                                if (minDoubleValue != maxDoubleValue)\n                                {\n                                    // Hybrid range case (e.g. -5.0 to 5.0).\n                                    if (minDoubleValue < 0 && maxDoubleValue > 0)\n                                    {\n                                        // If new random value is same as previous one, generate a new one until it is not.\n                                        while (value == null || extendedDoubleNodeValue == (double)value)\n                                        {\n                                            // Split the range from 0 on both sides.\n#pragma warning disable CA5394 // Do not use insecure randomness\n                                            var value1 = _random.NextDouble() * maxDoubleValue;\n#pragma warning restore CA5394 // Do not use insecure randomness\n#pragma warning disable CA5394 // Do not use insecure randomness\n                                            var value2 = _random.NextDouble() * minDoubleValue;\n#pragma warning restore CA5394 // Do not use insecure randomness\n\n                                            // Return random value from postive or negative range, randomly.\n#pragma warning disable CA5394 // Do not use insecure randomness\n                                            value = _random.Next(10) % 2 == 0 ? value1 : value2;\n#pragma warning restore CA5394 // Do not use insecure randomness\n                                        }\n                                    }\n                                    else // Negative and positive only range cases (e.g. -5.0 to -8.0 or 0 to 9.5).\n                                    {\n                                        // If new random value is same as previous one, generate a new one until it is not.\n                                        while (value == null || extendedDoubleNodeValue == (double)value)\n                                        {\n#pragma warning disable CA5394 // Do not use insecure randomness\n                                            value = minDoubleValue + (_random.NextDouble() * (maxDoubleValue - minDoubleValue));\n#pragma warning restore CA5394 // Do not use insecure randomness\n                                        }\n                                    }\n                                }\n                                else\n                                {\n                                    throw new ArgumentException($\"Range {minDoubleValue} to {maxDoubleValue}does not have provision for randomness.\");\n                                }\n                            }\n                            else\n                            {\n                                // Positive only range cases (e.g. 0 to 9.5).\n                                if (minDoubleValue >= 0 && maxDoubleValue > 0)\n                                {\n                                    value = (extendedDoubleNodeValue % maxDoubleValue) < minDoubleValue\n                                         ? minDoubleValue\n                                             : ((extendedDoubleNodeValue % maxDoubleValue) + (double)extendedNode.StepSize) > maxDoubleValue\n                                                 ? minDoubleValue\n                                                     : ((extendedDoubleNodeValue % maxDoubleValue) + (double)extendedNode.StepSize);\n                                }\n                                else if (maxDoubleValue <= 0 && minDoubleValue < 0) // Negative only range cases (e.g. 0 to -9.5).\n                                {\n                                    value = (extendedDoubleNodeValue % minDoubleValue) > maxDoubleValue\n                                    ? maxDoubleValue\n                                     : ((extendedDoubleNodeValue % minDoubleValue) - (double)extendedNode.StepSize) < minDoubleValue\n                                                 ? maxDoubleValue\n                                                 : (extendedDoubleNodeValue % minDoubleValue) - (double)extendedNode.StepSize;\n                                }\n                                else\n                                {\n                                    // This is to prevent infinte loop while attempting to create a different random number than previous one if no range is provided.\n                                    throw new ArgumentException($\"Negative to positive range {minDoubleValue} to {maxDoubleValue} for sequential node values is not supported currently.\");\n                                }\n                            }\n                            break;\n\n                        case NodeType.BoolScalar:\n                            value = extendedNode.Value == null || !(bool)extendedNode.Value;\n                            break;\n\n                        case NodeType.UIntArray:\n                            var arrayValue = (uint[])extendedNode.Value;\n                            if (arrayValue != null)\n                            {\n                                for (var arrayIndex = 0; arrayIndex < arrayValue.Length; arrayIndex++)\n                                {\n                                    arrayValue[arrayIndex]++;\n                                }\n                            }\n                            else\n                            {\n                                arrayValue = new uint[32];\n                            }\n                            value = arrayValue;\n                            break;\n\n                        case NodeType.UIntScalar:\n                            var minUIntValue = (uint)extendedNode.MinValue;\n                            var maxUIntValue = (uint)extendedNode.MaxValue;\n                            var extendedUIntNodeValue = (uint)(extendedNode.Value ?? minUIntValue);\n\n                            if (extendedNode.Randomize)\n                            {\n                                if (minUIntValue != maxUIntValue)\n                                {\n                                    // If new random value is same as previous one, generate a new one until it is not.\n                                    while (value == null || extendedUIntNodeValue == (uint)value)\n                                    {\n                                        // uint.MaxValue + 1 cycles back to 0 which causes infinte loop here hence a check maxUIntValue == uint.MaxValue to prevent it.\n#pragma warning disable CA5394 // Do not use insecure randomness\n                                        value = (uint)(minUIntValue + (_random.NextDouble() * ((maxUIntValue == uint.MaxValue ? maxUIntValue : maxUIntValue + 1) - minUIntValue)));\n#pragma warning restore CA5394 // Do not use insecure randomness\n                                    }\n                                }\n                                else\n                                {\n                                    // This is to prevent infinte loop while attempting to create a different random number than previous one if no range is provided.\n                                    throw new ArgumentException($\"Range {minUIntValue} to {maxUIntValue} does not have provision for randomness.\");\n                                }\n                            }\n                            else\n                            {\n                                value = (extendedUIntNodeValue % maxUIntValue) < minUIntValue\n                                            ? minUIntValue\n                                                : ((extendedUIntNodeValue % maxUIntValue) + (uint)extendedNode.StepSize) > maxUIntValue\n                                                    ? minUIntValue\n                                                        : ((extendedUIntNodeValue % maxUIntValue) + (uint)extendedNode.StepSize);\n                            }\n                            break;\n                        default:\n                            throw new NotSupportedException(\"Node type unknown\");\n                    }\n                }\n\n                extendedNode.StatusCode = status;\n                SetValue(extendedNode, value);\n            }\n        }\n\n        private void SetValue<T>(BaseVariableState variable, T value)\n        {\n            variable.Value = value;\n            variable.Timestamp = _timeService.Now;\n            variable.ClearChangeMasks(_plcNodeManager.SystemContext, false);\n        }\n\n        /// <summary>\n        /// Determines whether the values of simulated nodes should be updated, based\n        /// on the value of the corresponding <see cref=\"kNumberOfUpdates\"/> variable.\n        /// Decrements the NumberOfUpdates variable value and returns true if the NumberOfUpdates variable value if greater than zero,\n        /// returns false if the NumberOfUpdates variable value is zero,\n        /// returns true if the NumberOfUpdates variable value is less than zero.\n        /// </summary>\n        /// <param name=\"numberOfUpdatesVariable\">Node that contains the setting of the number of updates to apply.</param>\n        /// <returns>True if the value of the node should be updated by the simulator, false otherwise.</returns>\n        private bool ShouldUpdateNodes(BaseDataVariableState numberOfUpdatesVariable)\n        {\n            var value = (int)numberOfUpdatesVariable.Value;\n            if (value == 0)\n            {\n                return false;\n            }\n\n            if (value > 0)\n            {\n                SetValue(numberOfUpdatesVariable, value - 1);\n            }\n\n            return true;\n        }\n\n        private readonly (StatusCode, bool)[] _badStatusSequence =\n        [\n            ( StatusCodes.Good, true ),\n            ( StatusCodes.Good, true ),\n            ( StatusCodes.Good, true ),\n            ( StatusCodes.UncertainLastUsableValue, true),\n            ( StatusCodes.Good, true ),\n            ( StatusCodes.Good, true ),\n            ( StatusCodes.Good, true ),\n            ( StatusCodes.UncertainLastUsableValue, true),\n            ( StatusCodes.BadDataLost, true),\n            ( StatusCodes.BadNoCommunication, false)\n        ];\n\n        private readonly PlcNodeManager _plcNodeManager;\n        private readonly TimeService _timeService;\n        private readonly ILogger _logger;\n        private readonly Random _random = new();\n        private BaseDataVariableState _numberOfUpdates;\n        private uint _badNodesCycle;\n        private const string kNumberOfUpdates = \"NumberOfUpdates\";\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for SlowFastCommon\n    /// </summary>\n    internal static partial class SlowFastCommonLogging\n    {\n        private const int EventClass = 80;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Creating {Count} {Name} nodes of type: {Type}\")]\n        public static partial void CreatingNodes(this ILogger logger, uint count, string name, NodeType type);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Node values will change every {Rate} ms\")]\n        public static partial void NodeChangeRate(this ILogger logger, uint rate);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Node values sampling rate is {NodeSamplingInterval} ms\")]\n        public static partial void SamplingRate(this ILogger logger, uint nodeSamplingInterval);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Warning,\n            Message = \"Invalid argument {Argument} provided.\")]\n        public static partial void InvalidArgument(this ILogger logger, object argument);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/SlowPluginNodes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n    using System.Timers;\n\n    /// <summary>\n    /// Nodes with slow changing values.\n    /// </summary>\n    public class SlowPluginNodes : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n        private uint NodeCount => ScaleUnits == 0 ? 3u : ScaleUnits * 1000;\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeRate { get; } = 10000;\n        private NodeType NodeType { get; } = NodeType.UIntScalar;\n        private string NodeMinValue { get; }\n        private string NodeMaxValue { get; }\n        private string NodeStepSize { get; } = \"1\";\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeSamplingInterval { get; }\n\n        private PlcNodeManager _plcNodeManager;\n        private SlowFastCommon _slowFastCommon;\n        private BaseDataVariableState[] _nodes;\n        private BaseDataVariableState[] _badNodes;\n        private ITimer _nodeGenerator;\n        private bool _updateNodes = true;\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            _slowFastCommon = new SlowFastCommon(_plcNodeManager, TimeService, Logger);\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Slow\",\n                name: \"Slow\",\n                NamespaceType.PlcApplications);\n\n            // Used for methods to limit the number of updates to a fixed count.\n            var simulatorFolder = _plcNodeManager.CreateFolder(\n                telemetryFolder.Parent, // Root.\n                path: \"SimulatorConfiguration\",\n                name: \"SimulatorConfiguration\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder, simulatorFolder);\n            AddMethods(methodsFolder);\n        }\n\n        private void AddMethods(FolderState methodsFolder)\n        {\n            var stopUpdateMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"StopUpdateSlowNodes\",\n                name: \"StopUpdateSlowNodes\",\n                \"Stop the increase of value of slow nodes\",\n                NamespaceType.PlcApplications);\n            SetStopUpdateSlowNodesProperties(ref stopUpdateMethod);\n            var startUpdateMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"StartUpdateSlowNodes\",\n                name: \"StartUpdateSlowNodes\",\n                \"Start the increase of value of slow nodes\",\n                NamespaceType.PlcApplications);\n            SetStartUpdateSlowNodesProperties(ref startUpdateMethod);\n        }\n\n        public void StartSimulation()\n        {\n            _nodeGenerator = TimeService.NewTimer(UpdateNodes, NodeRate);\n        }\n\n        public void StopSimulation()\n        {\n            if (_nodeGenerator != null)\n            {\n                _nodeGenerator.Enabled = false;\n            }\n        }\n\n        private void AddNodes(FolderState folder, FolderState simulatorFolder)\n        {\n            (_nodes, _badNodes) = _slowFastCommon.CreateNodes(NodeType, \"Slow\", NodeCount,\n                folder, simulatorFolder, false, NodeStepSize, NodeMinValue,\n                NodeMaxValue, NodeRate, NodeSamplingInterval);\n\n            ExposeNodesWithIntervals();\n        }\n\n        /// <summary>\n        /// Expose node information for dumping pn.json.\n        /// </summary>\n        private void ExposeNodesWithIntervals()\n        {\n            var nodes = new List<NodeWithIntervals>();\n\n            foreach (var node in _nodes)\n            {\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = node.NodeId.Identifier.ToString(),\n                    NodeIdTypePrefix = NodeWithIntervals.GetPrefix(node.NodeId.IdType),\n                    Namespace = Plc.Namespaces.PlcApplications,\n                    PublishingInterval = NodeRate,\n                    SamplingInterval = NodeSamplingInterval\n                });\n            }\n\n            foreach (var node in _badNodes)\n            {\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = node.NodeId.Identifier.ToString(),\n                    NodeIdTypePrefix = NodeWithIntervals.GetPrefix(node.NodeId.IdType),\n                    Namespace = Plc.Namespaces.PlcApplications,\n                    PublishingInterval = NodeRate,\n                    SamplingInterval = NodeSamplingInterval\n                });\n            }\n\n            Nodes = nodes;\n        }\n\n        private void SetStopUpdateSlowNodesProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStopUpdateSlowNodes;\n        }\n\n        private void SetStartUpdateSlowNodesProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStartUpdateSlowNodes;\n        }\n\n        /// <summary>\n        /// Method to stop updating the slow nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStopUpdateSlowNodes(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _updateNodes = false;\n            Logger.LogDebug(\"StopUpdateSlowNodes method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method to start updating the slow nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStartUpdateSlowNodes(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _updateNodes = true;\n            Logger.LogDebug(\"StartUpdateSlowNodes method called\");\n            return ServiceResult.Good;\n        }\n\n        private void UpdateNodes(object state, ElapsedEventArgs elapsedEventArgs)\n        {\n            _slowFastCommon.UpdateNodes(_nodes, _badNodes, NodeType, _updateNodes);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/SlowRandomPluginNodes.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n    using System.Timers;\n\n    /// <summary>\n    /// Nodes with slow changing values.\n    /// </summary>\n    public class SlowRandomPluginNodes : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n        private uint NodeCount => ScaleUnits == 0 ? 3u : ScaleUnits * 1000;\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeRate { get; } = 10000;\n        private NodeType NodeType { get; } = NodeType.UIntScalar;\n        private string NodeMinValue { get; }\n        private string NodeMaxValue { get; }\n        private string NodeStepSize { get; } = \"1\";\n        /// <summary>\n        /// ms.\n        /// </summary>\n        private uint NodeSamplingInterval { get; }\n\n        private PlcNodeManager _plcNodeManager;\n        private SlowFastCommon _slowFastCommon;\n        private BaseDataVariableState[] _nodes;\n        private BaseDataVariableState[] _badNodes;\n        private ITimer _nodeGenerator;\n        private bool _updateNodes = true;\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            _slowFastCommon = new SlowFastCommon(_plcNodeManager, TimeService, Logger);\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Slow\",\n                name: \"Slow\",\n                NamespaceType.PlcApplications);\n\n            // Used for methods to limit the number of updates to a fixed count.\n            var simulatorFolder = _plcNodeManager.CreateFolder(\n                telemetryFolder.Parent, // Root.\n                path: \"SimulatorConfiguration\",\n                name: \"SimulatorConfiguration\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder, simulatorFolder);\n            AddMethods(methodsFolder);\n        }\n\n        private void AddMethods(FolderState methodsFolder)\n        {\n            var stopUpdateMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"StopUpdateSlowNodes\",\n                name: \"StopUpdateSlowNodes\",\n                \"Stop the increase of value of slow nodes\",\n                NamespaceType.PlcApplications);\n            SetStopUpdateSlowNodesProperties(ref stopUpdateMethod);\n            var startUpdateMethod = _plcNodeManager.CreateMethod(\n                methodsFolder,\n                path: \"StartUpdateSlowNodes\",\n                name: \"StartUpdateSlowNodes\",\n                \"Start the increase of value of slow nodes\",\n                NamespaceType.PlcApplications);\n            SetStartUpdateSlowNodesProperties(ref startUpdateMethod);\n        }\n\n        public void StartSimulation()\n        {\n            _nodeGenerator = TimeService.NewTimer(UpdateNodes, NodeRate);\n        }\n\n        public void StopSimulation()\n        {\n            if (_nodeGenerator != null)\n            {\n                _nodeGenerator.Enabled = false;\n            }\n        }\n\n        private void AddNodes(FolderState folder, FolderState simulatorFolder)\n        {\n            (_nodes, _badNodes) = _slowFastCommon.CreateNodes(NodeType, \"SlowRandom\", NodeCount,\n                folder, simulatorFolder, true, NodeStepSize, NodeMinValue,\n                NodeMaxValue, NodeRate, NodeSamplingInterval);\n\n            ExposeNodesWithIntervals();\n        }\n\n        /// <summary>\n        /// Expose node information for dumping pn.json.\n        /// </summary>\n        private void ExposeNodesWithIntervals()\n        {\n            var nodes = new List<NodeWithIntervals>();\n\n            foreach (var node in _nodes)\n            {\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = node.NodeId.Identifier.ToString(),\n                    NodeIdTypePrefix = NodeWithIntervals.GetPrefix(node.NodeId.IdType),\n                    Namespace = Plc.Namespaces.PlcApplications,\n                    PublishingInterval = NodeRate,\n                    SamplingInterval = NodeSamplingInterval\n                });\n            }\n\n            foreach (var node in _badNodes)\n            {\n                nodes.Add(new NodeWithIntervals\n                {\n                    NodeId = node.NodeId.Identifier.ToString(),\n                    NodeIdTypePrefix = NodeWithIntervals.GetPrefix(node.NodeId.IdType),\n                    Namespace = Plc.Namespaces.PlcApplications,\n                    PublishingInterval = NodeRate,\n                    SamplingInterval = NodeSamplingInterval\n                });\n            }\n\n            Nodes = nodes;\n        }\n\n        private void SetStopUpdateSlowNodesProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStopUpdateSlowNodes;\n        }\n\n        private void SetStartUpdateSlowNodesProperties(ref MethodState method)\n        {\n            method.OnCallMethod += OnStartUpdateSlowNodes;\n        }\n\n        /// <summary>\n        /// Method to stop updating the slow nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStopUpdateSlowNodes(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _updateNodes = false;\n            Logger.LogDebug(\"StopUpdateSlowNodes method called\");\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Method to start updating the slow nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"inputArguments\"></param>\n        /// <param name=\"outputArguments\"></param>\n        private ServiceResult OnStartUpdateSlowNodes(ISystemContext context, MethodState method, IList<object> inputArguments, IList<object> outputArguments)\n        {\n            _updateNodes = true;\n            Logger.LogDebug(\"StartUpdateSlowNodes method called\");\n            return ServiceResult.Good;\n        }\n\n        private void UpdateNodes(object state, ElapsedEventArgs elapsedEventArgs)\n        {\n            _slowFastCommon.UpdateNodes(_nodes, _badNodes, NodeType, _updateNodes);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/SpecialCharNamePluginNode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n    using System.Web;\n\n    /// <summary>\n    /// Node with special chars in name and ID.\n    /// </summary>\n    public class SpecialCharNamePluginNode : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<uint> _node;\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Special\",\n                name: \"Special\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n        }\n\n        public void StartSimulation()\n        {\n            _node.Start(value => value + 1, periodMs: 1000);\n        }\n\n        public void StopSimulation()\n        {\n            _node.Stop();\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            var SpecialChars = HttpUtility.HtmlDecode(@\"&quot;!&#167;$%&amp;/()=?`&#180;\\+~*&#39;#_-:.;,&lt;&gt;|@^&#176;€&#181;{[]}\");\n\n            _node = _plcNodeManager.CreateVariableNode<uint>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"Special_\" + SpecialChars,\n                    name: SpecialChars,\n                    new NodeId((uint)BuiltInType.UInt32),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentReadOrWrite,\n                    \"Constantly increasing value\",\n                    NamespaceType.PlcApplications,\n                    defaultValue: (uint)0));\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = \"Special_\" + SpecialChars,\n                    Namespace = Plc.Namespaces.PlcApplications\n                }\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Plc/PluginNodes/SpikePluginNode.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Plc.PluginNodes\n{\n    using Plc.PluginNodes.Models;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Node with a sine wave value with a spike anomaly.\n    /// </summary>\n    public class SpikePluginNode : IPluginNodes\n    {\n        public IReadOnlyCollection<NodeWithIntervals> Nodes { get; private set; } = new List<NodeWithIntervals>();\n        public TimeService TimeService { get; set; }\n        public ILogger Logger { get; set; }\n        public uint ScaleUnits { get; set; }\n\n        public void AddToAddressSpace(FolderState telemetryFolder, FolderState methodsFolder, PlcNodeManager plcNodeManager)\n        {\n            _plcNodeManager = plcNodeManager;\n            var folder = _plcNodeManager.CreateFolder(\n                telemetryFolder,\n                path: \"Anomaly\",\n                name: \"Anomaly\",\n                NamespaceType.PlcApplications);\n            AddNodes(folder);\n        }\n\n        public void StartSimulation()\n        {\n            _spikeCycleInPhase = PlcSimulation.SimulationCycleCount;\n#pragma warning disable CA5394 // Do not use insecure randomness\n            _spikeAnomalyCycle = _random.Next(PlcSimulation.SimulationCycleCount);\n#pragma warning restore CA5394 // Do not use insecure randomness\n            Logger.LogTrace(\"First spike anomaly cycle: {SpikeAnomalyCycle}\", _spikeAnomalyCycle);\n\n            _node.Start(SpikeGenerator, PlcSimulation.SimulationCycleLength);\n        }\n\n        public void StopSimulation()\n        {\n            _node.Stop();\n        }\n\n        private void AddNodes(FolderState folder)\n        {\n            _node = _plcNodeManager.CreateVariableNode<double>(\n                _plcNodeManager.CreateBaseVariable(\n                    folder,\n                    path: \"SpikeData\",\n                    name: \"SpikeData\",\n                    new NodeId((uint)BuiltInType.Double),\n                    ValueRanks.Scalar,\n                    AccessLevels.CurrentRead,\n                    \"Value with random spikes\",\n                    NamespaceType.PlcApplications));\n\n            Nodes = new List<NodeWithIntervals>\n            {\n                new() {\n                    NodeId = \"SpikeData\",\n                    Namespace = Plc.Namespaces.PlcApplications\n                }\n            };\n        }\n\n        /// <summary>\n        /// Generates a sine wave with spikes at a random cycle in the phase.\n        /// Called each SimulationCycleLength msec.\n        /// </summary>\n        /// <param name=\"value\"></param>\n        private double SpikeGenerator(double value)\n        {\n            // calculate next value\n            double nextValue;\n            if (_spikeCycleInPhase == _spikeAnomalyCycle)\n            {\n                // todo calculate\n                nextValue = kSimulationMaxAmplitude * 10;\n                Logger.LogTrace(\"Generate spike anomaly\");\n            }\n            else\n            {\n                nextValue = kSimulationMaxAmplitude * Math.Sin(2 * Math.PI / PlcSimulation.SimulationCycleCount * _spikeCycleInPhase);\n            }\n            Logger.LogTrace(\"Spike cycle: {SpikeCycleInPhase} data: {NextValue}\",\n                _spikeCycleInPhase, nextValue);\n\n            // end of cycle: reset cycle count and calc next anomaly cycle\n            if (--_spikeCycleInPhase == 0)\n            {\n                _spikeCycleInPhase = PlcSimulation.SimulationCycleCount;\n#pragma warning disable CA5394 // Do not use insecure randomness\n                _spikeAnomalyCycle = _random.Next(PlcSimulation.SimulationCycleCount);\n#pragma warning restore CA5394 // Do not use insecure randomness\n                Logger.LogTrace(\"Next spike anomaly cycle: {SpikeAnomalyCycle}\", _spikeAnomalyCycle);\n            }\n\n            return nextValue;\n        }\n\n        private PlcNodeManager _plcNodeManager;\n        private SimulatedVariableNode<double> _node;\n        private readonly Random _random = new();\n        private int _spikeCycleInPhase;\n        private int _spikeAnomalyCycle;\n        private const double kSimulationMaxAmplitude = 100.0;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System;\n\n[assembly: CLSCompliant(false)]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Reference/Namespaces.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Reference\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the server.\n        /// </summary>\n        public const string ReferenceApplications = \"http://opcfoundation.org/ReferenceApplications\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Reference/ReferenceNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2020 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Reference\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.Numerics;\n    using System.Threading;\n    using System.Xml;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class ReferenceNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public ReferenceNodeManager(IServerInternal server, ApplicationConfiguration configuration)\n            : base(server, configuration, Namespaces.ReferenceApplications)\n        {\n            SystemContext.NodeIdFactory = this;\n            _dynamicNodes = [];\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _simulationTimer != null)\n            {\n                _simulationTimer.Dispose();\n                _simulationTimer = null;\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            if (node is BaseInstanceState instance &&\n                instance.Parent?.NodeId.Identifier is string id)\n            {\n                return new NodeId(id + \"_\" + instance.SymbolicName, instance.Parent.NodeId.NamespaceIndex);\n            }\n\n            return node.NodeId;\n        }\n\n        private static bool IsAnalogType(BuiltInType builtInType)\n        {\n            switch (builtInType)\n            {\n                case BuiltInType.Byte:\n                case BuiltInType.UInt16:\n                case BuiltInType.UInt32:\n                case BuiltInType.UInt64:\n                case BuiltInType.SByte:\n                case BuiltInType.Int16:\n                case BuiltInType.Int32:\n                case BuiltInType.Int64:\n                case BuiltInType.Float:\n                case BuiltInType.Double:\n                    return true;\n            }\n            return false;\n        }\n\n        private static Opc.Ua.Range GetAnalogRange(BuiltInType builtInType)\n        {\n            switch (builtInType)\n            {\n                case BuiltInType.UInt16:\n                    return new Opc.Ua.Range(ushort.MaxValue, ushort.MinValue);\n                case BuiltInType.UInt32:\n                    return new Opc.Ua.Range(uint.MaxValue, uint.MinValue);\n                case BuiltInType.UInt64:\n                    return new Opc.Ua.Range(ulong.MaxValue, ulong.MinValue);\n                case BuiltInType.SByte:\n                    return new Opc.Ua.Range(sbyte.MaxValue, sbyte.MinValue);\n                case BuiltInType.Int16:\n                    return new Opc.Ua.Range(short.MaxValue, short.MinValue);\n                case BuiltInType.Int32:\n                    return new Opc.Ua.Range(int.MaxValue, int.MinValue);\n                case BuiltInType.Int64:\n                    return new Opc.Ua.Range(long.MaxValue, long.MinValue);\n                case BuiltInType.Float:\n                    return new Opc.Ua.Range(float.MaxValue, float.MinValue);\n                case BuiltInType.Double:\n                    return new Opc.Ua.Range(double.MaxValue, double.MinValue);\n                case BuiltInType.Byte:\n                    return new Opc.Ua.Range(byte.MaxValue, byte.MinValue);\n                default:\n                    return new Opc.Ua.Range(sbyte.MaxValue, sbyte.MinValue);\n            }\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out var references))\n                {\n                    externalReferences[ObjectIds.ObjectsFolder] = references = [];\n                }\n\n                var root = CreateFolder(null, \"CTT\", \"CTT\");\n                root.AddReference(ReferenceTypes.Organizes, true, ObjectIds.ObjectsFolder);\n                references.Add(new NodeStateReference(ReferenceTypes.Organizes, false, root.NodeId));\n                root.EventNotifier = EventNotifiers.SubscribeToEvents;\n                AddRootNotifier(root);\n\n                var variables = new List<BaseDataVariableState>();\n\n                try\n                {\n                    // Scalar_Static\n                    ResetRandomGenerator(1);\n                    var scalarFolder = CreateFolder(root, \"Scalar\", \"Scalar\");\n                    var scalarInstructions = CreateVariable(scalarFolder, \"Scalar_Instructions\", \"Scalar_Instructions\", DataTypeIds.String, ValueRanks.Scalar);\n                    scalarInstructions.Value = \"A library of Read/Write Variables of all supported data-types.\";\n                    variables.Add(scalarInstructions);\n\n                    var staticFolder = CreateFolder(scalarFolder, \"Scalar_Static\", \"Scalar_Static\");\n                    const string scalarStatic = \"Scalar_Static_\";\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Boolean\", \"Boolean\", DataTypeIds.Boolean, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Byte\", \"Byte\", DataTypeIds.Byte, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"ByteString\", \"ByteString\", DataTypeIds.ByteString, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"DateTime\", \"DateTime\", DataTypeIds.DateTime, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Double\", \"Double\", DataTypeIds.Double, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Float\", \"Float\", DataTypeIds.Float, ValueRanks.Scalar).MinimumSamplingInterval(100));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Guid\", \"Guid\", DataTypeIds.Guid, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Int16\", \"Int16\", DataTypeIds.Int16, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Int32\", \"Int32\", DataTypeIds.Int32, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Int64\", \"Int64\", DataTypeIds.Int64, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Integer\", \"Integer\", DataTypeIds.Integer, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"LocaleId\", \"LocaleId\", DataTypeIds.LocaleId, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"LocalizedText\", \"LocalizedText\", DataTypeIds.LocalizedText, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"NodeId\", \"NodeId\", DataTypeIds.NodeId, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Number\", \"Number\", DataTypeIds.Number, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"QualifiedName\", \"QualifiedName\", DataTypeIds.QualifiedName, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"SByte\", \"SByte\", DataTypeIds.SByte, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"String\", \"String\", DataTypeIds.String, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"UInteger\", \"UInteger\", DataTypeIds.UInteger, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.Scalar));\n                    variables.Add(CreateVariable(staticFolder, scalarStatic + \"XmlElement\", \"XmlElement\", DataTypeIds.XmlElement, ValueRanks.Scalar).MinimumSamplingInterval(1000));\n\n                    var decimalVariable = CreateVariable(staticFolder, scalarStatic + \"Decimal\", \"Decimal\", DataTypeIds.DecimalDataType, ValueRanks.Scalar);\n                    // Set an arbitrary precision decimal value.\n                    var largeInteger = BigInteger.Parse(\"1234567890123546789012345678901234567890123456789012345\", CultureInfo.InvariantCulture);\n                    decimalVariable.Value = new DecimalDataType\n                    {\n                        Scale = 100,\n                        Value = largeInteger.ToByteArray()\n                    };\n                    variables.Add(decimalVariable);\n\n                    // Scalar_Static_Arrays\n                    ResetRandomGenerator(2);\n                    var arraysFolder = CreateFolder(staticFolder, \"Scalar_Static_Arrays\", \"Arrays\");\n                    const string staticArrays = \"Scalar_Static_Arrays_\";\n\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Boolean\", \"Boolean\", DataTypeIds.Boolean, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Byte\", \"Byte\", DataTypeIds.Byte, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"ByteString\", \"ByteString\", DataTypeIds.ByteString, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"DateTime\", \"DateTime\", DataTypeIds.DateTime, ValueRanks.OneDimension));\n\n                    var doubleArrayVar = CreateVariable(arraysFolder, staticArrays + \"Double\", \"Double\", DataTypeIds.Double, ValueRanks.OneDimension);\n                    // Set the first elements of the array to a smaller value.\n                    var doubleArrayVal = doubleArrayVar.Value as double[];\n                    doubleArrayVal[0] %= 10E+10;\n                    doubleArrayVal[1] %= 10E+10;\n                    doubleArrayVal[2] %= 10E+10;\n                    doubleArrayVal[3] %= 10E+10;\n                    variables.Add(doubleArrayVar);\n\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.OneDimension));\n\n                    var floatArrayVar = CreateVariable(arraysFolder, staticArrays + \"Float\", \"Float\", DataTypeIds.Float, ValueRanks.OneDimension);\n                    // Set the first elements of the array to a smaller value.\n                    var floatArrayVal = floatArrayVar.Value as float[];\n                    floatArrayVal[0] %= 0xf10E + 4;\n                    floatArrayVal[1] %= 0xf10E + 4;\n                    floatArrayVal[2] %= 0xf10E + 4;\n                    floatArrayVal[3] %= 0xf10E + 4;\n                    variables.Add(floatArrayVar);\n\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Guid\", \"Guid\", DataTypeIds.Guid, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Int16\", \"Int16\", DataTypeIds.Int16, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Int32\", \"Int32\", DataTypeIds.Int32, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Int64\", \"Int64\", DataTypeIds.Int64, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Integer\", \"Integer\", DataTypeIds.Integer, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"LocaleId\", \"LocaleId\", DataTypeIds.LocaleId, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"LocalizedText\", \"LocalizedText\", DataTypeIds.LocalizedText, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"NodeId\", \"NodeId\", DataTypeIds.NodeId, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Number\", \"Number\", DataTypeIds.Number, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"QualifiedName\", \"QualifiedName\", DataTypeIds.QualifiedName, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"SByte\", \"SByte\", DataTypeIds.SByte, ValueRanks.OneDimension));\n\n                    var stringArrayVar = CreateVariable(arraysFolder, staticArrays + \"String\", \"String\", DataTypeIds.String, ValueRanks.OneDimension);\n                    stringArrayVar.Value = new string[] {\n                        \"Лошадь_ Пурпурово( Змейка( Слон\",\n                        \"猪 绿色 绵羊 大象~ 狗 菠萝 猪鼠\",\n                        \"Лошадь Овцы Голубика Овцы Змейка\",\n                        \"Чернота` Дракон Бело Дракон\",\n                        \"Horse# Black Lemon Lemon Grape\",\n                        \"猫< パイナップル; ドラゴン 犬 モモ\",\n                        \"레몬} 빨간% 자주색 쥐 백색; 들\" ,\n                        \"Yellow Sheep Peach Elephant Cow\",\n                        \"Крыса Корова Свинья Собака Кот\",\n                        \"龙_ 绵羊 大象 芒果; 猫'\" };\n                    variables.Add(stringArrayVar);\n\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"UInteger\", \"UInteger\", DataTypeIds.UInteger, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.OneDimension));\n                    variables.Add(CreateVariable(arraysFolder, staticArrays + \"XmlElement\", \"XmlElement\", DataTypeIds.XmlElement, ValueRanks.OneDimension));\n\n                    // Scalar_Static_Arrays2D\n                    ResetRandomGenerator(3);\n                    var arrays2DFolder = CreateFolder(staticFolder, \"Scalar_Static_Arrays2D\", \"Arrays2D\");\n                    const string staticArrays2D = \"Scalar_Static_Arrays2D_\";\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Boolean\", \"Boolean\", DataTypeIds.Boolean, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Byte\", \"Byte\", DataTypeIds.Byte, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"ByteString\", \"ByteString\", DataTypeIds.ByteString, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"DateTime\", \"DateTime\", DataTypeIds.DateTime, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Double\", \"Double\", DataTypeIds.Double, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Float\", \"Float\", DataTypeIds.Float, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Guid\", \"Guid\", DataTypeIds.Guid, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Int16\", \"Int16\", DataTypeIds.Int16, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Int32\", \"Int32\", DataTypeIds.Int32, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Int64\", \"Int64\", DataTypeIds.Int64, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Integer\", \"Integer\", DataTypeIds.Integer, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"LocaleId\", \"LocaleId\", DataTypeIds.LocaleId, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"LocalizedText\", \"LocalizedText\", DataTypeIds.LocalizedText, ValueRanks.TwoDimensions).MinimumSamplingInterval(1000));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"NodeId\", \"NodeId\", DataTypeIds.NodeId, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Number\", \"Number\", DataTypeIds.Number, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"QualifiedName\", \"QualifiedName\", DataTypeIds.QualifiedName, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"SByte\", \"SByte\", DataTypeIds.SByte, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"String\", \"String\", DataTypeIds.String, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"UInteger\", \"UInteger\", DataTypeIds.UInteger, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.TwoDimensions));\n                    variables.Add(CreateVariable(arrays2DFolder, staticArrays2D + \"XmlElement\", \"XmlElement\", DataTypeIds.XmlElement, ValueRanks.TwoDimensions).MinimumSamplingInterval(1000));\n\n                    // Scalar_Static_ArrayDynamic\n                    ResetRandomGenerator(4);\n                    var arrayDynamicFolder = CreateFolder(staticFolder, \"Scalar_Static_ArrayDynamic\", \"ArrayDynamic\");\n                    const string staticArraysDynamic = \"Scalar_Static_ArrayDynamic_\";\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Boolean\", \"Boolean\", DataTypeIds.Boolean, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Byte\", \"Byte\", DataTypeIds.Byte, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"ByteString\", \"ByteString\", DataTypeIds.ByteString, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"DateTime\", \"DateTime\", DataTypeIds.DateTime, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Double\", \"Double\", DataTypeIds.Double, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Float\", \"Float\", DataTypeIds.Float, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Guid\", \"Guid\", DataTypeIds.Guid, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Int16\", \"Int16\", DataTypeIds.Int16, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Int32\", \"Int32\", DataTypeIds.Int32, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Int64\", \"Int64\", DataTypeIds.Int64, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Integer\", \"Integer\", DataTypeIds.Integer, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"LocaleId\", \"LocaleId\", DataTypeIds.LocaleId, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"LocalizedText\", \"LocalizedText\", DataTypeIds.LocalizedText, ValueRanks.OneOrMoreDimensions).MinimumSamplingInterval(1000));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"NodeId\", \"NodeId\", DataTypeIds.NodeId, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Number\", \"Number\", DataTypeIds.Number, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"QualifiedName\", \"QualifiedName\", DataTypeIds.QualifiedName, ValueRanks.OneOrMoreDimensions).MinimumSamplingInterval(1000));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"SByte\", \"SByte\", DataTypeIds.SByte, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"String\", \"String\", DataTypeIds.String, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"UInteger\", \"UInteger\", DataTypeIds.UInteger, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.OneOrMoreDimensions));\n                    variables.Add(CreateVariable(arrayDynamicFolder, staticArraysDynamic + \"XmlElement\", \"XmlElement\", DataTypeIds.XmlElement, ValueRanks.OneOrMoreDimensions).MinimumSamplingInterval(1000));\n\n                    // Scalar_Static_Mass\n                    ResetRandomGenerator(5);\n                    // create 100 instances of each static scalar type\n                    var massFolder = CreateFolder(staticFolder, \"Scalar_Static_Mass\", \"Mass\");\n                    const string staticMass = \"Scalar_Static_Mass_\";\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Boolean\", \"Boolean\", DataTypeIds.Boolean, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Byte\", \"Byte\", DataTypeIds.Byte, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"ByteString\", \"ByteString\", DataTypeIds.ByteString, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"DateTime\", \"DateTime\", DataTypeIds.DateTime, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Double\", \"Double\", DataTypeIds.Double, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Float\", \"Float\", DataTypeIds.Float, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Guid\", \"Guid\", DataTypeIds.Guid, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Int16\", \"Int16\", DataTypeIds.Int16, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Int32\", \"Int32\", DataTypeIds.Int32, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Int64\", \"Int64\", DataTypeIds.Int64, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Integer\", \"Integer\", DataTypeIds.Integer, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"LocalizedText\", \"LocalizedText\", DataTypeIds.LocalizedText, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"NodeId\", \"NodeId\", DataTypeIds.NodeId, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Number\", \"Number\", DataTypeIds.Number, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"SByte\", \"SByte\", DataTypeIds.SByte, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"String\", \"String\", DataTypeIds.String, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"UInteger\", \"UInteger\", DataTypeIds.UInteger, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.Scalar, 100));\n                    variables.AddRange(CreateVariables(massFolder, staticMass + \"XmlElement\", \"XmlElement\", DataTypeIds.XmlElement, ValueRanks.Scalar, 100));\n\n                    // Scalar_Simulation\n                    ResetRandomGenerator(6);\n                    var simulationFolder = CreateFolder(scalarFolder, \"Scalar_Simulation\", \"Simulation\");\n                    const string scalarSimulation = \"Scalar_Simulation_\";\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Boolean\", \"Boolean\", DataTypeIds.Boolean, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Byte\", \"Byte\", DataTypeIds.Byte, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"ByteString\", \"ByteString\", DataTypeIds.ByteString, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"DateTime\", \"DateTime\", DataTypeIds.DateTime, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Double\", \"Double\", DataTypeIds.Double, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Float\", \"Float\", DataTypeIds.Float, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Guid\", \"Guid\", DataTypeIds.Guid, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Int16\", \"Int16\", DataTypeIds.Int16, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Int32\", \"Int32\", DataTypeIds.Int32, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Int64\", \"Int64\", DataTypeIds.Int64, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Integer\", \"Integer\", DataTypeIds.Integer, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"LocaleId\", \"LocaleId\", DataTypeIds.LocaleId, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"LocalizedText\", \"LocalizedText\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"NodeId\", \"NodeId\", DataTypeIds.NodeId, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Number\", \"Number\", DataTypeIds.Number, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"QualifiedName\", \"QualifiedName\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"SByte\", \"SByte\", DataTypeIds.SByte, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"String\", \"String\", DataTypeIds.String, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"UInteger\", \"UInteger\", DataTypeIds.UInteger, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.Scalar);\n                    CreateDynamicVariable(simulationFolder, scalarSimulation + \"XmlElement\", \"XmlElement\", DataTypeIds.XmlElement, ValueRanks.Scalar);\n\n                    var intervalVariable = CreateVariable(simulationFolder, scalarSimulation + \"Interval\", \"Interval\", DataTypeIds.UInt16, ValueRanks.Scalar);\n                    intervalVariable.Value = _simulationInterval;\n                    intervalVariable.OnSimpleWriteValue = OnWriteInterval;\n\n                    var enabledVariable = CreateVariable(simulationFolder, scalarSimulation + \"Enabled\", \"Enabled\", DataTypeIds.Boolean, ValueRanks.Scalar);\n                    enabledVariable.Value = _simulationEnabled;\n                    enabledVariable.OnSimpleWriteValue = OnWriteEnabled;\n\n                    // Scalar_Simulation_Arrays\n                    ResetRandomGenerator(7);\n                    var arraysSimulationFolder = CreateFolder(simulationFolder, \"Scalar_Simulation_Arrays\", \"Arrays\");\n                    const string simulationArrays = \"Scalar_Simulation_Arrays_\";\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Boolean\", \"Boolean\", DataTypeIds.Boolean, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Byte\", \"Byte\", DataTypeIds.Byte, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"ByteString\", \"ByteString\", DataTypeIds.ByteString, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"DateTime\", \"DateTime\", DataTypeIds.DateTime, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Double\", \"Double\", DataTypeIds.Double, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Float\", \"Float\", DataTypeIds.Float, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Guid\", \"Guid\", DataTypeIds.Guid, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Int16\", \"Int16\", DataTypeIds.Int16, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Int32\", \"Int32\", DataTypeIds.Int32, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Int64\", \"Int64\", DataTypeIds.Int64, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Integer\", \"Integer\", DataTypeIds.Integer, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"LocaleId\", \"LocaleId\", DataTypeIds.LocaleId, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"LocalizedText\", \"LocalizedText\", DataTypeIds.LocalizedText, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"NodeId\", \"NodeId\", DataTypeIds.NodeId, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Number\", \"Number\", DataTypeIds.Number, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"QualifiedName\", \"QualifiedName\", DataTypeIds.QualifiedName, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"SByte\", \"SByte\", DataTypeIds.SByte, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"String\", \"String\", DataTypeIds.String, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"UInteger\", \"UInteger\", DataTypeIds.UInteger, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.OneDimension);\n                    CreateDynamicVariable(arraysSimulationFolder, simulationArrays + \"XmlElement\", \"XmlElement\", DataTypeIds.XmlElement, ValueRanks.OneDimension);\n\n                    // Scalar_Simulation_Mass\n                    ResetRandomGenerator(8);\n                    var massSimulationFolder = CreateFolder(simulationFolder, \"Scalar_Simulation_Mass\", \"Mass\");\n                    const string massSimulation = \"Scalar_Simulation_Mass_\";\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Boolean\", \"Boolean\", DataTypeIds.Boolean, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Byte\", \"Byte\", DataTypeIds.Byte, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"ByteString\", \"ByteString\", DataTypeIds.ByteString, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"DateTime\", \"DateTime\", DataTypeIds.DateTime, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Double\", \"Double\", DataTypeIds.Double, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Float\", \"Float\", DataTypeIds.Float, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Guid\", \"Guid\", DataTypeIds.Guid, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Int16\", \"Int16\", DataTypeIds.Int16, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Int32\", \"Int32\", DataTypeIds.Int32, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Int64\", \"Int64\", DataTypeIds.Int64, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Integer\", \"Integer\", DataTypeIds.Integer, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"LocaleId\", \"LocaleId\", DataTypeIds.LocaleId, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"LocalizedText\", \"LocalizedText\", DataTypeIds.LocalizedText, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"NodeId\", \"NodeId\", DataTypeIds.NodeId, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Number\", \"Number\", DataTypeIds.Number, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"QualifiedName\", \"QualifiedName\", DataTypeIds.QualifiedName, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"SByte\", \"SByte\", DataTypeIds.SByte, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"String\", \"String\", DataTypeIds.String, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"UInteger\", \"UInteger\", DataTypeIds.UInteger, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.Scalar, 100);\n                    CreateDynamicVariables(massSimulationFolder, massSimulation + \"XmlElement\", \"XmlElement\", DataTypeIds.XmlElement, ValueRanks.Scalar, 100);\n\n                    // DataAccess_DataItem\n                    ResetRandomGenerator(9);\n                    var daFolder = CreateFolder(root, \"DataAccess\", \"DataAccess\");\n                    var daInstructions = CreateVariable(daFolder, \"DataAccess_Instructions\", \"Instructions\", DataTypeIds.String, ValueRanks.Scalar);\n                    daInstructions.Value = \"A library of Read/Write Variables of all supported data-types.\";\n                    variables.Add(daInstructions);\n\n                    var dataItemFolder = CreateFolder(daFolder, \"DataAccess_DataItem\", \"DataItem\");\n                    const string daDataItem = \"DataAccess_DataIte_\";\n\n                    foreach (var name in Enum.GetNames<BuiltInType>())\n                    {\n                        var item = CreateDataItemVariable(dataItemFolder, daDataItem + name, name, Enum.Parse<BuiltInType>(name), ValueRanks.Scalar);\n\n                        // set initial value to String.Empty for String node.\n                        if (name == nameof(BuiltInType.String))\n                        {\n                            item.Value = string.Empty;\n                        }\n                    }\n\n                    // DataAccess_AnalogType\n                    ResetRandomGenerator(10);\n                    var analogItemFolder = CreateFolder(daFolder, \"DataAccess_AnalogType\", \"AnalogType\");\n                    const string daAnalogItem = \"DataAccess_AnalogType_\";\n\n                    foreach (var name in Enum.GetNames<BuiltInType>())\n                    {\n                        var builtInType = Enum.Parse<BuiltInType>(name);\n                        if (IsAnalogType(builtInType))\n                        {\n                            var item = CreateAnalogItemVariable(analogItemFolder, daAnalogItem + name, name, builtInType, ValueRanks.Scalar);\n\n                            if (builtInType == BuiltInType.Int64 ||\n                                builtInType == BuiltInType.UInt64)\n                            {\n                                // make test case without optional ranges\n                                item.EngineeringUnits = null;\n                                item.InstrumentRange = null;\n                            }\n                            else if (builtInType == BuiltInType.Float)\n                            {\n                                item.EURange.Value.High = 0;\n                                item.EURange.Value.Low = 0;\n                            }\n\n                            //set default value for Definition property\n                            if (item.Definition != null)\n                            {\n                                item.Definition.Value = string.Empty;\n                            }\n                        }\n                    }\n\n                    // DataAccess_AnalogType_Array\n                    ResetRandomGenerator(11);\n                    var analogArrayFolder = CreateFolder(analogItemFolder, \"DataAccess_AnalogType_Array\", \"Array\");\n                    const string daAnalogArray = \"DataAccess_AnalogType_Array_\";\n\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Boolean\", \"Boolean\", BuiltInType.Boolean, ValueRanks.OneDimension, new bool[] { true, false, true, false, true, false, true, false, true });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Byte\", \"Byte\", BuiltInType.Byte, ValueRanks.OneDimension, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"ByteString\", \"ByteString\", BuiltInType.ByteString, ValueRanks.OneDimension, new byte[][] { [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"DateTime\", \"DateTime\", BuiltInType.DateTime, ValueRanks.OneDimension, new DateTime[] { DateTime.MinValue, DateTime.MaxValue, DateTime.MinValue, DateTime.MaxValue, DateTime.MinValue, DateTime.MaxValue, DateTime.MinValue, DateTime.MaxValue, DateTime.MinValue });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Double\", \"Double\", BuiltInType.Double, ValueRanks.OneDimension, new double[] { 9.00001d, 9.0002d, 9.003d, 9.04d, 9.5d, 9.06d, 9.007d, 9.008d, 9.0009d });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Duration\", \"Duration\", DataTypeIds.Duration, ValueRanks.OneDimension, new double[] { 9.00001d, 9.0002d, 9.003d, 9.04d, 9.5d, 9.06d, 9.007d, 9.008d, 9.0009d }, null);\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Float\", \"Float\", BuiltInType.Float, ValueRanks.OneDimension, new float[] { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 1.1f, 2.2f, 3.3f, 4.4f, 5.5f });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Guid\", \"Guid\", BuiltInType.Guid, ValueRanks.OneDimension, new Guid[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Int16\", \"Int16\", BuiltInType.Int16, ValueRanks.OneDimension, new short[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Int32\", \"Int32\", BuiltInType.Int32, ValueRanks.OneDimension, new int[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Int64\", \"Int64\", BuiltInType.Int64, ValueRanks.OneDimension, new long[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Integer\", \"Integer\", BuiltInType.Integer, ValueRanks.OneDimension, new long[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"LocaleId\", \"LocaleId\", DataTypeIds.LocaleId, ValueRanks.OneDimension, new string[] { \"en\", \"fr\", \"de\", \"en\", \"fr\", \"de\", \"en\", \"fr\", \"de\", \"en\" }, null);\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"LocalizedText\", \"LocalizedText\", BuiltInType.LocalizedText, ValueRanks.OneDimension, new LocalizedText[] { new(\"en\", \"Hello World1\"), new(\"en\", \"Hello World2\"), new(\"en\", \"Hello World3\"), new(\"en\", \"Hello World4\"), new(\"en\", \"Hello World5\"), new(\"en\", \"Hello World6\"), new(\"en\", \"Hello World7\"), new(\"en\", \"Hello World8\"), new(\"en\", \"Hello World9\"), new(\"en\", \"Hello World10\") });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"NodeId\", \"NodeId\", BuiltInType.NodeId, ValueRanks.OneDimension, new NodeId[] { new(Guid.NewGuid()), new(Guid.NewGuid()), new(Guid.NewGuid()), new(Guid.NewGuid()), new(Guid.NewGuid()), new(Guid.NewGuid()), new(Guid.NewGuid()), new(Guid.NewGuid()), new(Guid.NewGuid()), new(Guid.NewGuid()) });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Number\", \"Number\", BuiltInType.Number, ValueRanks.OneDimension, new short[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"QualifiedName\", \"QualifiedName\", BuiltInType.QualifiedName, ValueRanks.OneDimension, new short[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"SByte\", \"SByte\", BuiltInType.SByte, ValueRanks.OneDimension, new sbyte[] { 10, 20, 30, 40, 50, 60, 70, 80, 90 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"String\", \"String\", BuiltInType.String, ValueRanks.OneDimension, new string[] { \"a00\", \"b10\", \"c20\", \"d30\", \"e40\", \"f50\", \"g60\", \"h70\", \"i80\", \"j90\" });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"TimeString\", \"TimeString\", DataTypeIds.TimeString, ValueRanks.OneDimension, new string[] { DateTime.MinValue.ToString(CultureInfo.InvariantCulture), DateTime.MaxValue.ToString(CultureInfo.InvariantCulture), DateTime.MinValue.ToString(CultureInfo.InvariantCulture), DateTime.MaxValue.ToString(CultureInfo.InvariantCulture), DateTime.MinValue.ToString(CultureInfo.InvariantCulture), DateTime.MaxValue.ToString(CultureInfo.InvariantCulture), DateTime.MinValue.ToString(CultureInfo.InvariantCulture), DateTime.MaxValue.ToString(CultureInfo.InvariantCulture), DateTime.MinValue.ToString(CultureInfo.InvariantCulture), DateTime.MaxValue.ToString(CultureInfo.InvariantCulture) }, null);\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"UInt16\", \"UInt16\", BuiltInType.UInt16, ValueRanks.OneDimension, new ushort[] { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"UInt32\", \"UInt32\", BuiltInType.UInt32, ValueRanks.OneDimension, new uint[] { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"UInt64\", \"UInt64\", BuiltInType.UInt64, ValueRanks.OneDimension, new ulong[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"UInteger\", \"UInteger\", BuiltInType.UInteger, ValueRanks.OneDimension, new ulong[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"UtcTime\", \"UtcTime\", DataTypeIds.UtcTime, ValueRanks.OneDimension, new DateTime[] { DateTime.MinValue.ToUniversalTime(), DateTime.MaxValue.ToUniversalTime(), DateTime.MinValue.ToUniversalTime(), DateTime.MaxValue.ToUniversalTime(), DateTime.MinValue.ToUniversalTime(), DateTime.MaxValue.ToUniversalTime(), DateTime.MinValue.ToUniversalTime(), DateTime.MaxValue.ToUniversalTime(), DateTime.MinValue.ToUniversalTime() }, null);\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"Variant\", \"Variant\", BuiltInType.Variant, ValueRanks.OneDimension, new Variant[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 });\n                    var doc1 = new XmlDocument();\n                    CreateAnalogItemVariable(analogArrayFolder, daAnalogArray + \"XmlElement\", \"XmlElement\", BuiltInType.XmlElement, ValueRanks.OneDimension, new XmlElement[] { doc1.CreateElement(\"tag1\"), doc1.CreateElement(\"tag2\"), doc1.CreateElement(\"tag3\"), doc1.CreateElement(\"tag4\"), doc1.CreateElement(\"tag5\"), doc1.CreateElement(\"tag6\"), doc1.CreateElement(\"tag7\"), doc1.CreateElement(\"tag8\"), doc1.CreateElement(\"tag9\"), doc1.CreateElement(\"tag10\") });\n\n                    // DataAccess_DiscreteType\n                    ResetRandomGenerator(12);\n                    var discreteTypeFolder = CreateFolder(daFolder, \"DataAccess_DiscreteType\", \"DiscreteType\");\n                    var twoStateDiscreteFolder = CreateFolder(discreteTypeFolder, \"DataAccess_TwoStateDiscreteType\", \"TwoStateDiscreteType\");\n                    const string daTwoStateDiscrete = \"DataAccess_TwoStateDiscreteType_\";\n\n                    // Add our Nodes to the folder, and specify their customized discrete enumerations\n                    CreateTwoStateDiscreteItemVariable(twoStateDiscreteFolder, daTwoStateDiscrete + \"001\", \"001\", \"red\", \"blue\");\n                    CreateTwoStateDiscreteItemVariable(twoStateDiscreteFolder, daTwoStateDiscrete + \"002\", \"002\", \"open\", \"close\");\n                    CreateTwoStateDiscreteItemVariable(twoStateDiscreteFolder, daTwoStateDiscrete + \"003\", \"003\", \"up\", \"down\");\n                    CreateTwoStateDiscreteItemVariable(twoStateDiscreteFolder, daTwoStateDiscrete + \"004\", \"004\", \"left\", \"right\");\n                    CreateTwoStateDiscreteItemVariable(twoStateDiscreteFolder, daTwoStateDiscrete + \"005\", \"005\", \"circle\", \"cross\");\n\n                    var multiStateDiscreteFolder = CreateFolder(discreteTypeFolder, \"DataAccess_MultiStateDiscreteType\", \"MultiStateDiscreteType\");\n                    const string daMultiStateDiscrete = \"DataAccess_MultiStateDiscreteType_\";\n\n                    // Add our Nodes to the folder, and specify their customized discrete enumerations\n                    CreateMultiStateDiscreteItemVariable(multiStateDiscreteFolder, daMultiStateDiscrete + \"001\", \"001\", \"open\", \"closed\", \"jammed\");\n                    CreateMultiStateDiscreteItemVariable(multiStateDiscreteFolder, daMultiStateDiscrete + \"002\", \"002\", \"red\", \"green\", \"blue\", \"cyan\");\n                    CreateMultiStateDiscreteItemVariable(multiStateDiscreteFolder, daMultiStateDiscrete + \"003\", \"003\", \"lolo\", \"lo\", \"normal\", \"hi\", \"hihi\");\n                    CreateMultiStateDiscreteItemVariable(multiStateDiscreteFolder, daMultiStateDiscrete + \"004\", \"004\", \"left\", \"right\", \"center\");\n                    CreateMultiStateDiscreteItemVariable(multiStateDiscreteFolder, daMultiStateDiscrete + \"005\", \"005\", \"circle\", \"cross\", \"triangle\");\n\n                    // DataAccess_MultiStateValueDiscreteType\n                    ResetRandomGenerator(13);\n                    var multiStateValueDiscreteFolder = CreateFolder(discreteTypeFolder, \"DataAccess_MultiStateValueDiscreteType\", \"MultiStateValueDiscreteType\");\n                    const string daMultiStateValueDiscrete = \"DataAccess_MultiStateValueDiscreteType_\";\n\n                    // Add our Nodes to the folder, and specify their customized discrete enumerations\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"001\", \"001\", [\"open\", \"closed\", \"jammed\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"002\", \"002\", [\"red\", \"green\", \"blue\", \"cyan\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"003\", \"003\", [\"lolo\", \"lo\", \"normal\", \"hi\", \"hihi\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"004\", \"004\", [\"left\", \"right\", \"center\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"005\", \"005\", [\"circle\", \"cross\", \"triangle\"]);\n\n                    // Add our Nodes to the folder and specify varying data types\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"Byte\", \"Byte\", DataTypeIds.Byte, [\"open\", \"closed\", \"jammed\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"Int16\", \"Int16\", DataTypeIds.Int16, [\"red\", \"green\", \"blue\", \"cyan\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"Int32\", \"Int32\", DataTypeIds.Int32, [\"lolo\", \"lo\", \"normal\", \"hi\", \"hihi\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"Int64\", \"Int64\", DataTypeIds.Int64, [\"left\", \"right\", \"center\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"SByte\", \"SByte\", DataTypeIds.SByte, [\"open\", \"closed\", \"jammed\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"UInt16\", \"UInt16\", DataTypeIds.UInt16, [\"red\", \"green\", \"blue\", \"cyan\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"UInt32\", \"UInt32\", DataTypeIds.UInt32, [\"lolo\", \"lo\", \"normal\", \"hi\", \"hihi\"]);\n                    CreateMultiStateValueDiscreteItemVariable(multiStateValueDiscreteFolder, daMultiStateValueDiscrete + \"UInt64\", \"UInt64\", DataTypeIds.UInt64, [\"left\", \"right\", \"center\"]);\n\n                    // References\n                    ResetRandomGenerator(14);\n                    var referencesFolder = CreateFolder(root, \"References\", \"References\");\n                    const string referencesPrefix = \"References_\";\n\n                    var referencesInstructions = CreateVariable(referencesFolder, \"References_Instructions\", \"Instructions\", DataTypeIds.String, ValueRanks.Scalar);\n                    referencesInstructions.Value = \"This folder will contain nodes that have specific Reference configurations.\";\n                    variables.Add(referencesInstructions);\n\n                    // create variable nodes with specific references\n                    var hasForwardReference = CreateMeshVariable(referencesFolder, referencesPrefix + \"HasForwardReference\", \"HasForwardReference\");\n                    hasForwardReference.AddReference(ReferenceTypes.HasCause, false, variables[0].NodeId);\n                    variables.Add(hasForwardReference);\n\n                    var hasInverseReference = CreateMeshVariable(referencesFolder, referencesPrefix + \"HasInverseReference\", \"HasInverseReference\");\n                    hasInverseReference.AddReference(ReferenceTypes.HasCause, true, variables[0].NodeId);\n                    variables.Add(hasInverseReference);\n\n                    BaseDataVariableState has3InverseReference = null;\n                    for (var i = 1; i <= 5; i++)\n                    {\n                        var referenceString = \"Has3ForwardReferences\";\n                        if (i > 1)\n                        {\n                            referenceString += i.ToString(CultureInfo.InvariantCulture);\n                        }\n                        var has3ForwardReferences = CreateMeshVariable(referencesFolder, referencesPrefix + referenceString, referenceString);\n                        has3ForwardReferences.AddReference(ReferenceTypes.HasCause, false, variables[0].NodeId);\n                        has3ForwardReferences.AddReference(ReferenceTypes.HasCause, false, variables[1].NodeId);\n                        has3ForwardReferences.AddReference(ReferenceTypes.HasCause, false, variables[2].NodeId);\n                        if (i == 1)\n                        {\n                            has3InverseReference = has3ForwardReferences;\n                        }\n                        variables.Add(has3ForwardReferences);\n                    }\n\n                    var has3InverseReferences = CreateMeshVariable(referencesFolder, referencesPrefix + \"Has3InverseReferences\", \"Has3InverseReferences\");\n                    has3InverseReferences.AddReference(ReferenceTypes.HasEffect, true, variables[0].NodeId);\n                    has3InverseReferences.AddReference(ReferenceTypes.HasEffect, true, variables[1].NodeId);\n                    has3InverseReferences.AddReference(ReferenceTypes.HasEffect, true, variables[2].NodeId);\n                    variables.Add(has3InverseReferences);\n\n                    var hasForwardAndInverseReferences = CreateMeshVariable(referencesFolder, referencesPrefix + \"HasForwardAndInverseReference\", \"HasForwardAndInverseReference\", hasForwardReference, hasInverseReference, has3InverseReference, has3InverseReferences, variables[0]);\n                    variables.Add(hasForwardAndInverseReferences);\n\n                    // AccessRights\n                    ResetRandomGenerator(15);\n                    var folderAccessRights = CreateFolder(root, \"AccessRights\", \"AccessRights\");\n                    const string accessRights = \"AccessRights_\";\n\n                    var accessRightsInstructions = CreateVariable(folderAccessRights, accessRights + \"Instructions\", \"Instructions\", DataTypeIds.String, ValueRanks.Scalar);\n                    accessRightsInstructions.Value = \"This folder will be accessible to all who enter, but contents therein will be secured.\";\n                    variables.Add(accessRightsInstructions);\n\n                    // sub-folder for \"AccessAll\"\n                    var folderAccessRightsAccessAll = CreateFolder(folderAccessRights, \"AccessRights_AccessAll\", \"AccessAll\");\n                    const string accessRightsAccessAll = \"AccessRights_AccessAll_\";\n\n                    var arAllRO = CreateVariable(folderAccessRightsAccessAll, accessRightsAccessAll + \"RO\", \"RO\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arAllRO.AccessLevel = AccessLevels.CurrentRead;\n                    arAllRO.UserAccessLevel = AccessLevels.CurrentRead;\n                    variables.Add(arAllRO);\n                    var arAllWO = CreateVariable(folderAccessRightsAccessAll, accessRightsAccessAll + \"WO\", \"WO\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arAllWO.AccessLevel = AccessLevels.CurrentWrite;\n                    arAllWO.UserAccessLevel = AccessLevels.CurrentWrite;\n                    variables.Add(arAllWO);\n                    var arAllRW = CreateVariable(folderAccessRightsAccessAll, accessRightsAccessAll + \"RW\", \"RW\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arAllRW.AccessLevel = AccessLevels.CurrentReadOrWrite;\n                    arAllRW.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n                    variables.Add(arAllRW);\n                    var arAllRONotUser = CreateVariable(folderAccessRightsAccessAll, accessRightsAccessAll + \"RO_NotUser\", \"RO_NotUser\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arAllRONotUser.AccessLevel = AccessLevels.CurrentRead;\n                    arAllRONotUser.UserAccessLevel = AccessLevels.None;\n                    variables.Add(arAllRONotUser);\n                    var arAllWONotUser = CreateVariable(folderAccessRightsAccessAll, accessRightsAccessAll + \"WO_NotUser\", \"WO_NotUser\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arAllWONotUser.AccessLevel = AccessLevels.CurrentWrite;\n                    arAllWONotUser.UserAccessLevel = AccessLevels.None;\n                    variables.Add(arAllWONotUser);\n                    var arAllRWNotUser = CreateVariable(folderAccessRightsAccessAll, accessRightsAccessAll + \"RW_NotUser\", \"RW_NotUser\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arAllRWNotUser.AccessLevel = AccessLevels.CurrentReadOrWrite;\n                    arAllRWNotUser.UserAccessLevel = AccessLevels.CurrentRead;\n                    variables.Add(arAllRWNotUser);\n                    var arAllROUserRW = CreateVariable(folderAccessRightsAccessAll, accessRightsAccessAll + \"RO_User1_RW\", \"RO_User1_RW\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arAllROUserRW.AccessLevel = AccessLevels.CurrentRead;\n                    arAllROUserRW.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n                    variables.Add(arAllROUserRW);\n                    var arAllROGroupRW = CreateVariable(folderAccessRightsAccessAll, accessRightsAccessAll + \"RO_Group1_RW\", \"RO_Group1_RW\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arAllROGroupRW.AccessLevel = AccessLevels.CurrentRead;\n                    arAllROGroupRW.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n                    variables.Add(arAllROGroupRW);\n\n                    // sub-folder for \"AccessUser1\"\n                    var folderAccessRightsAccessUser1 = CreateFolder(folderAccessRights, \"AccessRights_AccessUser1\", \"AccessUser1\");\n                    const string accessRightsAccessUser1 = \"AccessRights_AccessUser1_\";\n\n                    var arUserRO = CreateVariable(folderAccessRightsAccessUser1, accessRightsAccessUser1 + \"RO\", \"RO\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arUserRO.AccessLevel = AccessLevels.CurrentRead;\n                    arUserRO.UserAccessLevel = AccessLevels.CurrentRead;\n                    variables.Add(arUserRO);\n                    var arUserWO = CreateVariable(folderAccessRightsAccessUser1, accessRightsAccessUser1 + \"WO\", \"WO\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arUserWO.AccessLevel = AccessLevels.CurrentWrite;\n                    arUserWO.UserAccessLevel = AccessLevels.CurrentWrite;\n                    variables.Add(arUserWO);\n                    var arUserRW = CreateVariable(folderAccessRightsAccessUser1, accessRightsAccessUser1 + \"RW\", \"RW\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arUserRW.AccessLevel = AccessLevels.CurrentReadOrWrite;\n                    arUserRW.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n                    variables.Add(arUserRW);\n\n                    // sub-folder for \"AccessGroup1\"\n                    var folderAccessRightsAccessGroup1 = CreateFolder(folderAccessRights, \"AccessRights_AccessGroup1\", \"AccessGroup1\");\n                    const string accessRightsAccessGroup1 = \"AccessRights_AccessGroup1_\";\n\n                    var arGroupRO = CreateVariable(folderAccessRightsAccessGroup1, accessRightsAccessGroup1 + \"RO\", \"RO\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arGroupRO.AccessLevel = AccessLevels.CurrentRead;\n                    arGroupRO.UserAccessLevel = AccessLevels.CurrentRead;\n                    variables.Add(arGroupRO);\n                    var arGroupWO = CreateVariable(folderAccessRightsAccessGroup1, accessRightsAccessGroup1 + \"WO\", \"WO\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arGroupWO.AccessLevel = AccessLevels.CurrentWrite;\n                    arGroupWO.UserAccessLevel = AccessLevels.CurrentWrite;\n                    variables.Add(arGroupWO);\n                    var arGroupRW = CreateVariable(folderAccessRightsAccessGroup1, accessRightsAccessGroup1 + \"RW\", \"RW\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arGroupRW.AccessLevel = AccessLevels.CurrentReadOrWrite;\n                    arGroupRW.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n                    variables.Add(arGroupRW);\n\n                    // sub folder for \"RolePermissions\"\n                    var folderRolePermissions = CreateFolder(folderAccessRights, \"AccessRights_RolePermissions\", \"RolePermissions\");\n                    const string rolePermissions = \"AccessRights_RolePermissions_\";\n\n                    var rpAnonymous = CreateVariable(folderRolePermissions, rolePermissions + \"AnonymousAccess\", \"AnonymousAccess\", BuiltInType.Int16, ValueRanks.Scalar);\n                    rpAnonymous.Description = \"This node can be accessed by users that have Anonymous Role\";\n                    rpAnonymous.RolePermissions =\n                    [\n                        // allow access to users with Anonymous role\n                        new RolePermissionType()\n                        {\n                            RoleId = ObjectIds.WellKnownRole_Anonymous,\n                            Permissions = (uint)(PermissionType.Browse |PermissionType.Read|PermissionType.ReadRolePermissions | PermissionType.Write)\n                        }\n                    ];\n                    variables.Add(rpAnonymous);\n\n                    var rpAuthenticatedUser = CreateVariable(folderRolePermissions, rolePermissions + \"AuthenticatedUser\", \"AuthenticatedUser\", BuiltInType.Int16, ValueRanks.Scalar);\n                    rpAuthenticatedUser.Description = \"This node can be accessed by users that have AuthenticatedUser Role\";\n                    rpAuthenticatedUser.RolePermissions =\n                    [\n                        // allow access to users with AuthenticatedUser role\n                        new RolePermissionType()\n                        {\n                            RoleId = ObjectIds.WellKnownRole_AuthenticatedUser,\n                            Permissions = (uint)(PermissionType.Browse |PermissionType.Read|PermissionType.ReadRolePermissions | PermissionType.Write)\n                        }\n                    ];\n                    variables.Add(rpAuthenticatedUser);\n\n                    var rpAdminUser = CreateVariable(folderRolePermissions, rolePermissions + \"AdminUser\", \"AdminUser\", BuiltInType.Int16, ValueRanks.Scalar);\n                    rpAdminUser.Description = \"This node can be accessed by users that have SecurityAdmin Role over an encrypted connection\";\n                    rpAdminUser.AccessRestrictions = AccessRestrictionType.EncryptionRequired;\n                    rpAdminUser.RolePermissions =\n                    [\n                        // allow access to users with SecurityAdmin role\n                        new RolePermissionType()\n                        {\n                            RoleId = ObjectIds.WellKnownRole_SecurityAdmin,\n                            Permissions = (uint)(PermissionType.Browse |PermissionType.Read|PermissionType.ReadRolePermissions | PermissionType.Write)\n                        }\n                    ];\n                    variables.Add(rpAdminUser);\n\n                    // sub-folder for \"AccessRestrictions\"\n                    var folderAccessRestrictions = CreateFolder(folderAccessRights, \"AccessRights_AccessRestrictions\", \"AccessRestrictions\");\n                    const string accessRestrictions = \"AccessRights_AccessRestrictions_\";\n\n                    var arNone = CreateVariable(folderAccessRestrictions, accessRestrictions + \"None\", \"None\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arNone.AccessLevel = AccessLevels.CurrentRead;\n                    arNone.UserAccessLevel = AccessLevels.CurrentRead;\n                    arNone.AccessRestrictions = AccessRestrictionType.None;\n                    variables.Add(arNone);\n\n                    var arSigningRequired = CreateVariable(folderAccessRestrictions, accessRestrictions + \"SigningRequired\", \"SigningRequired\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arSigningRequired.AccessLevel = AccessLevels.CurrentRead;\n                    arSigningRequired.UserAccessLevel = AccessLevels.CurrentRead;\n                    arSigningRequired.AccessRestrictions = AccessRestrictionType.SigningRequired;\n                    variables.Add(arSigningRequired);\n\n                    var arEncryptionRequired = CreateVariable(folderAccessRestrictions, accessRestrictions + \"EncryptionRequired\", \"EncryptionRequired\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arEncryptionRequired.AccessLevel = AccessLevels.CurrentRead;\n                    arEncryptionRequired.UserAccessLevel = AccessLevels.CurrentRead;\n                    arEncryptionRequired.AccessRestrictions = AccessRestrictionType.EncryptionRequired;\n                    variables.Add(arEncryptionRequired);\n\n                    var arSessionRequired = CreateVariable(folderAccessRestrictions, accessRestrictions + \"SessionRequired\", \"SessionRequired\", BuiltInType.Int16, ValueRanks.Scalar);\n                    arSessionRequired.AccessLevel = AccessLevels.CurrentRead;\n                    arSessionRequired.UserAccessLevel = AccessLevels.CurrentRead;\n                    arSessionRequired.AccessRestrictions = AccessRestrictionType.SessionRequired;\n                    variables.Add(arSessionRequired);\n\n                    // NodeIds\n                    ResetRandomGenerator(16);\n                    var nodeIdsFolder = CreateFolder(root, \"NodeIds\", \"NodeIds\");\n                    const string nodeIds = \"NodeIds_\";\n\n                    var nodeIdsInstructions = CreateVariable(folderAccessRights, nodeIds + \"Instructions\", \"Instructions\", DataTypeIds.String, ValueRanks.Scalar);\n                    nodeIdsInstructions.Value = \"All supported Node types are available except whichever is in use for the other nodes.\";\n                    variables.Add(nodeIdsInstructions);\n\n                    var integerNodeId = CreateVariable(nodeIdsFolder, nodeIds + \"Int16Integer\", \"Int16Integer\", DataTypeIds.Int16, ValueRanks.Scalar);\n                    integerNodeId.NodeId = new NodeId(9202, NamespaceIndex);\n                    variables.Add(integerNodeId);\n\n                    variables.Add(CreateVariable(nodeIdsFolder, nodeIds + \"Int16String\", \"Int16String\", DataTypeIds.Int16, ValueRanks.Scalar));\n\n                    var guidNodeId = CreateVariable(nodeIdsFolder, nodeIds + \"Int16GUID\", \"Int16GUID\", DataTypeIds.Int16, ValueRanks.Scalar);\n                    guidNodeId.NodeId = new NodeId(new Guid(\"00000000-0000-0000-0000-000000009204\"), NamespaceIndex);\n                    variables.Add(guidNodeId);\n\n                    var opaqueNodeId = CreateVariable(nodeIdsFolder, nodeIds + \"Int16Opaque\", \"Int16Opaque\", DataTypeIds.Int16, ValueRanks.Scalar);\n                    opaqueNodeId.NodeId = new NodeId([9, 2, 0, 5], NamespaceIndex);\n                    variables.Add(opaqueNodeId);\n\n                    // Methods\n                    ResetRandomGenerator(17);\n                    var methodsFolder = CreateFolder(root, \"Methods\", \"Methods\");\n                    const string methods = \"Methods_\";\n\n                    var methodsInstructions = CreateVariable(methodsFolder, methods + \"Instructions\", \"Instructions\", DataTypeIds.String, ValueRanks.Scalar);\n                    methodsInstructions.Value = \"Contains methods with varying parameter definitions.\";\n                    variables.Add(methodsInstructions);\n\n                    var voidMethod = CreateMethod(methodsFolder, methods + \"Void\", \"Void\");\n                    voidMethod.OnCallMethod = new GenericMethodCalledEventHandler(OnVoidCall);\n\n                    // Add Method\n                    var addMethod = CreateMethod(methodsFolder, methods + \"Add\", \"Add\");\n                    // set input arguments\n                    addMethod.InputArguments = new PropertyState<Argument[]>(addMethod)\n                    {\n                        NodeId = new NodeId(addMethod.BrowseName.Name + \"InArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.InputArguments\n                    };\n                    addMethod.InputArguments.DisplayName = addMethod.InputArguments.BrowseName.Name;\n                    addMethod.InputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    addMethod.InputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    addMethod.InputArguments.DataType = DataTypeIds.Argument;\n                    addMethod.InputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    addMethod.InputArguments.Value =\n                    [\n                        new() { Name = \"Float value\", Description = \"Float value\",  DataType = DataTypeIds.Float, ValueRank = ValueRanks.Scalar },\n                        new() { Name = \"UInt32 value\", Description = \"UInt32 value\",  DataType = DataTypeIds.UInt32, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    // set output arguments\n                    addMethod.OutputArguments = new PropertyState<Argument[]>(addMethod)\n                    {\n                        NodeId = new NodeId(addMethod.BrowseName.Name + \"OutArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.OutputArguments\n                    };\n                    addMethod.OutputArguments.DisplayName = addMethod.OutputArguments.BrowseName.Name;\n                    addMethod.OutputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    addMethod.OutputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    addMethod.OutputArguments.DataType = DataTypeIds.Argument;\n                    addMethod.OutputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    addMethod.OutputArguments.Value =\n                    [\n                        new() { Name = \"Add Result\", Description = \"Add Result\",  DataType = DataTypeIds.Float, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    addMethod.OnCallMethod = new GenericMethodCalledEventHandler(OnAddCall);\n\n                    // Multiply Method\n                    var multiplyMethod = CreateMethod(methodsFolder, methods + \"Multiply\", \"Multiply\");\n                    // set input arguments\n                    multiplyMethod.InputArguments = new PropertyState<Argument[]>(multiplyMethod)\n                    {\n                        NodeId = new NodeId(multiplyMethod.BrowseName.Name + \"InArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.InputArguments\n                    };\n                    multiplyMethod.InputArguments.DisplayName = multiplyMethod.InputArguments.BrowseName.Name;\n                    multiplyMethod.InputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    multiplyMethod.InputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    multiplyMethod.InputArguments.DataType = DataTypeIds.Argument;\n                    multiplyMethod.InputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    multiplyMethod.InputArguments.Value =\n                    [\n                        new() { Name = \"Int16 value\", Description = \"Int16 value\",  DataType = DataTypeIds.Int16, ValueRank = ValueRanks.Scalar },\n                        new() { Name = \"UInt16 value\", Description = \"UInt16 value\",  DataType = DataTypeIds.UInt16, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    // set output arguments\n                    multiplyMethod.OutputArguments = new PropertyState<Argument[]>(multiplyMethod)\n                    {\n                        NodeId = new NodeId(multiplyMethod.BrowseName.Name + \"OutArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.OutputArguments\n                    };\n                    multiplyMethod.OutputArguments.DisplayName = multiplyMethod.OutputArguments.BrowseName.Name;\n                    multiplyMethod.OutputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    multiplyMethod.OutputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    multiplyMethod.OutputArguments.DataType = DataTypeIds.Argument;\n                    multiplyMethod.OutputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    multiplyMethod.OutputArguments.Value =\n                    [\n                        new() { Name = \"Multiply Result\", Description = \"Multiply Result\",  DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    multiplyMethod.OnCallMethod = new GenericMethodCalledEventHandler(OnMultiplyCall);\n\n                    // Divide Method\n                    var divideMethod = CreateMethod(methodsFolder, methods + \"Divide\", \"Divide\");\n                    // set input arguments\n                    divideMethod.InputArguments = new PropertyState<Argument[]>(divideMethod)\n                    {\n                        NodeId = new NodeId(divideMethod.BrowseName.Name + \"InArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.InputArguments\n                    };\n                    divideMethod.InputArguments.DisplayName = divideMethod.InputArguments.BrowseName.Name;\n                    divideMethod.InputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    divideMethod.InputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    divideMethod.InputArguments.DataType = DataTypeIds.Argument;\n                    divideMethod.InputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    divideMethod.InputArguments.Value =\n                    [\n                        new() { Name = \"Int32 value\", Description = \"Int32 value\",  DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar },\n                        new() { Name = \"UInt16 value\", Description = \"UInt16 value\",  DataType = DataTypeIds.UInt16, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    // set output arguments\n                    divideMethod.OutputArguments = new PropertyState<Argument[]>(divideMethod)\n                    {\n                        NodeId = new NodeId(divideMethod.BrowseName.Name + \"OutArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.OutputArguments\n                    };\n                    divideMethod.OutputArguments.DisplayName = divideMethod.OutputArguments.BrowseName.Name;\n                    divideMethod.OutputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    divideMethod.OutputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    divideMethod.OutputArguments.DataType = DataTypeIds.Argument;\n                    divideMethod.OutputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    divideMethod.OutputArguments.Value =\n                    [\n                        new() { Name = \"Divide Result\", Description = \"Divide Result\",  DataType = DataTypeIds.Float, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    divideMethod.OnCallMethod = new GenericMethodCalledEventHandler(OnDivideCall);\n\n                    // Substract Method\n                    var substractMethod = CreateMethod(methodsFolder, methods + \"Substract\", \"Substract\");\n                    // set input arguments\n                    substractMethod.InputArguments = new PropertyState<Argument[]>(substractMethod)\n                    {\n                        NodeId = new NodeId(substractMethod.BrowseName.Name + \"InArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.InputArguments\n                    };\n                    substractMethod.InputArguments.DisplayName = substractMethod.InputArguments.BrowseName.Name;\n                    substractMethod.InputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    substractMethod.InputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    substractMethod.InputArguments.DataType = DataTypeIds.Argument;\n                    substractMethod.InputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    substractMethod.InputArguments.Value =\n                    [\n                        new() { Name = \"Int16 value\", Description = \"Int16 value\",  DataType = DataTypeIds.Int16, ValueRank = ValueRanks.Scalar },\n                        new() { Name = \"Byte value\", Description = \"Byte value\",  DataType = DataTypeIds.Byte, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    // set output arguments\n                    substractMethod.OutputArguments = new PropertyState<Argument[]>(substractMethod)\n                    {\n                        NodeId = new NodeId(substractMethod.BrowseName.Name + \"OutArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.OutputArguments\n                    };\n                    substractMethod.OutputArguments.DisplayName = substractMethod.OutputArguments.BrowseName.Name;\n                    substractMethod.OutputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    substractMethod.OutputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    substractMethod.OutputArguments.DataType = DataTypeIds.Argument;\n                    substractMethod.OutputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    substractMethod.OutputArguments.Value =\n                    [\n                        new() { Name = \"Substract Result\", Description = \"Substract Result\",  DataType = DataTypeIds.Int16, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    substractMethod.OnCallMethod = new GenericMethodCalledEventHandler(OnSubstractCall);\n\n                    // Hello Method\n                    var helloMethod = CreateMethod(methodsFolder, methods + \"Hello\", \"Hello\");\n                    // set input arguments\n                    helloMethod.InputArguments = new PropertyState<Argument[]>(helloMethod)\n                    {\n                        NodeId = new NodeId(helloMethod.BrowseName.Name + \"InArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.InputArguments\n                    };\n                    helloMethod.InputArguments.DisplayName = helloMethod.InputArguments.BrowseName.Name;\n                    helloMethod.InputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    helloMethod.InputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    helloMethod.InputArguments.DataType = DataTypeIds.Argument;\n                    helloMethod.InputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    helloMethod.InputArguments.Value =\n                    [\n                        new() { Name = \"String value\", Description = \"String value\",  DataType = DataTypeIds.String, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    // set output arguments\n                    helloMethod.OutputArguments = new PropertyState<Argument[]>(helloMethod)\n                    {\n                        NodeId = new NodeId(helloMethod.BrowseName.Name + \"OutArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.OutputArguments\n                    };\n                    helloMethod.OutputArguments.DisplayName = helloMethod.OutputArguments.BrowseName.Name;\n                    helloMethod.OutputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    helloMethod.OutputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    helloMethod.OutputArguments.DataType = DataTypeIds.Argument;\n                    helloMethod.OutputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    helloMethod.OutputArguments.Value =\n                    [\n                        new() { Name = \"Hello Result\", Description = \"Hello Result\",  DataType = DataTypeIds.String, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    helloMethod.OnCallMethod = new GenericMethodCalledEventHandler(OnHelloCall);\n\n                    // Input Method\n                    var inputMethod = CreateMethod(methodsFolder, methods + \"Input\", \"Input\");\n                    // set input arguments\n                    inputMethod.InputArguments = new PropertyState<Argument[]>(inputMethod)\n                    {\n                        NodeId = new NodeId(inputMethod.BrowseName.Name + \"InArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.InputArguments\n                    };\n                    inputMethod.InputArguments.DisplayName = inputMethod.InputArguments.BrowseName.Name;\n                    inputMethod.InputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    inputMethod.InputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    inputMethod.InputArguments.DataType = DataTypeIds.Argument;\n                    inputMethod.InputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    inputMethod.InputArguments.Value =\n                    [\n                        new() { Name = \"String value\", Description = \"String value\",  DataType = DataTypeIds.String, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    inputMethod.OnCallMethod = new GenericMethodCalledEventHandler(OnInputCall);\n\n                    // Output Method\n                    var outputMethod = CreateMethod(methodsFolder, methods + \"Output\", \"Output\");\n\n                    // set output arguments\n                    outputMethod.OutputArguments = new PropertyState<Argument[]>(helloMethod)\n                    {\n                        NodeId = new NodeId(helloMethod.BrowseName.Name + \"OutArgs\", NamespaceIndex),\n                        BrowseName = BrowseNames.OutputArguments\n                    };\n                    outputMethod.OutputArguments.DisplayName = helloMethod.OutputArguments.BrowseName.Name;\n                    outputMethod.OutputArguments.TypeDefinitionId = VariableTypeIds.PropertyType;\n                    outputMethod.OutputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty;\n                    outputMethod.OutputArguments.DataType = DataTypeIds.Argument;\n                    outputMethod.OutputArguments.ValueRank = ValueRanks.OneDimension;\n\n                    outputMethod.OutputArguments.Value =\n                    [\n                        new() { Name = \"Output Result\", Description = \"Output Result\",  DataType = DataTypeIds.String, ValueRank = ValueRanks.Scalar }\n                    ];\n\n                    outputMethod.OnCallMethod = new GenericMethodCalledEventHandler(OnOutputCall);\n\n                    // Views\n                    ResetRandomGenerator(18);\n                    var viewsFolder = CreateFolder(root, \"Views\", \"Views\");\n                    const string views = \"Views_\";\n                    var viewStateOperations = CreateView(viewsFolder, externalReferences, views + \"Operations\", \"Operations\");\n                    viewStateOperations.AddReference(ReferenceTypes.Organizes, false, massFolder.NodeId);\n                    massFolder.AddReference(ReferenceTypes.Organizes, true, viewStateOperations.NodeId);\n\n                    var viewStateEngineering = CreateView(viewsFolder, externalReferences, views + \"Engineering\", \"Engineering\");\n                    viewStateEngineering.AddReference(ReferenceTypes.Organizes, false, simulationFolder.NodeId);\n                    simulationFolder.AddReference(ReferenceTypes.Organizes, true, viewStateEngineering.NodeId);\n\n                    // Locales\n                    ResetRandomGenerator(19);\n                    var localesFolder = CreateFolder(root, \"Locales\", \"Locales\");\n                    const string locales = \"Locales_\";\n\n                    var qnEnglishVariable = CreateVariable(localesFolder, locales + \"QNEnglish\", \"QNEnglish\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnEnglishVariable.Description = new LocalizedText(\"en\", \"English\");\n                    qnEnglishVariable.Value = new QualifiedName(\"Hello World\", NamespaceIndex);\n                    variables.Add(qnEnglishVariable);\n                    var ltEnglishVariable = CreateVariable(localesFolder, locales + \"LTEnglish\", \"LTEnglish\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltEnglishVariable.Description = new LocalizedText(\"en\", \"English\");\n                    ltEnglishVariable.Value = new LocalizedText(\"en\", \"Hello World\");\n                    variables.Add(ltEnglishVariable);\n\n                    var qnFrancaisVariable = CreateVariable(localesFolder, locales + \"QNFrancais\", \"QNFrancais\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnFrancaisVariable.Description = new LocalizedText(\"en\", \"Francais\");\n                    qnFrancaisVariable.Value = new QualifiedName(\"Salut tout le monde\", NamespaceIndex);\n                    variables.Add(qnFrancaisVariable);\n                    var ltFrancaisVariable = CreateVariable(localesFolder, locales + \"LTFrancais\", \"LTFrancais\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltFrancaisVariable.Description = new LocalizedText(\"en\", \"Francais\");\n                    ltFrancaisVariable.Value = new LocalizedText(\"fr\", \"Salut tout le monde\");\n                    variables.Add(ltFrancaisVariable);\n\n                    var qnDeutschVariable = CreateVariable(localesFolder, locales + \"QNDeutsch\", \"QNDeutsch\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnDeutschVariable.Description = new LocalizedText(\"en\", \"Deutsch\");\n                    qnDeutschVariable.Value = new QualifiedName(\"Hallo Welt\", NamespaceIndex);\n                    variables.Add(qnDeutschVariable);\n                    var ltDeutschVariable = CreateVariable(localesFolder, locales + \"LTDeutsch\", \"LTDeutsch\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltDeutschVariable.Description = new LocalizedText(\"en\", \"Deutsch\");\n                    ltDeutschVariable.Value = new LocalizedText(\"de\", \"Hallo Welt\");\n                    variables.Add(ltDeutschVariable);\n\n                    var qnEspanolVariable = CreateVariable(localesFolder, locales + \"QNEspanol\", \"QNEspanol\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnEspanolVariable.Description = new LocalizedText(\"en\", \"Espanol\");\n                    qnEspanolVariable.Value = new QualifiedName(\"Hola mundo\", NamespaceIndex);\n                    variables.Add(qnEspanolVariable);\n                    var ltEspanolVariable = CreateVariable(localesFolder, locales + \"LTEspanol\", \"LTEspanol\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltEspanolVariable.Description = new LocalizedText(\"en\", \"Espanol\");\n                    ltEspanolVariable.Value = new LocalizedText(\"es\", \"Hola mundo\");\n                    variables.Add(ltEspanolVariable);\n\n                    var qnJapaneseVariable = CreateVariable(localesFolder, locales + \"QN日本の\", \"QN日本の\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnJapaneseVariable.Description = new LocalizedText(\"en\", \"Japanese\");\n                    qnJapaneseVariable.Value = new QualifiedName(\"ハローワールド\", NamespaceIndex);\n                    variables.Add(qnJapaneseVariable);\n                    var ltJapaneseVariable = CreateVariable(localesFolder, locales + \"LT日本の\", \"LT日本の\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltJapaneseVariable.Description = new LocalizedText(\"en\", \"Japanese\");\n                    ltJapaneseVariable.Value = new LocalizedText(\"jp\", \"ハローワールド\");\n                    variables.Add(ltJapaneseVariable);\n\n                    var qnChineseVariable = CreateVariable(localesFolder, locales + \"QN中國的\", \"QN中國的\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnChineseVariable.Description = new LocalizedText(\"en\", \"Chinese\");\n                    qnChineseVariable.Value = new QualifiedName(\"世界您好\", NamespaceIndex);\n                    variables.Add(qnChineseVariable);\n                    var ltChineseVariable = CreateVariable(localesFolder, locales + \"LT中國的\", \"LT中國的\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltChineseVariable.Description = new LocalizedText(\"en\", \"Chinese\");\n                    ltChineseVariable.Value = new LocalizedText(\"ch\", \"世界您好\");\n                    variables.Add(ltChineseVariable);\n\n                    var qnRussianVariable = CreateVariable(localesFolder, locales + \"QNрусский\", \"QNрусский\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnRussianVariable.Description = new LocalizedText(\"en\", \"Russian\");\n                    qnRussianVariable.Value = new QualifiedName(\"LTрусский\", NamespaceIndex);\n                    variables.Add(qnRussianVariable);\n                    var ltRussianVariable = CreateVariable(localesFolder, locales + \"LTрусский\", \"LTрусский\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltRussianVariable.Description = new LocalizedText(\"en\", \"Russian\");\n                    ltRussianVariable.Value = new LocalizedText(\"ru\", \"LTрусский\");\n                    variables.Add(ltRussianVariable);\n\n                    var qnArabicVariable = CreateVariable(localesFolder, locales + \"QNالعربية\", \"QNالعربية\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnArabicVariable.Description = new LocalizedText(\"en\", \"Arabic\");\n                    qnArabicVariable.Value = new QualifiedName(\"مرحبا بالعال\", NamespaceIndex);\n                    variables.Add(qnArabicVariable);\n                    var ltArabicVariable = CreateVariable(localesFolder, locales + \"LTالعربية\", \"LTالعربية\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltArabicVariable.Description = new LocalizedText(\"en\", \"Arabic\");\n                    ltArabicVariable.Value = new LocalizedText(\"ae\", \"مرحبا بالعال\");\n                    variables.Add(ltArabicVariable);\n\n                    var qnKlingonVariable = CreateVariable(localesFolder, locales + \"QNtlhIngan\", \"QNtlhIngan\", DataTypeIds.QualifiedName, ValueRanks.Scalar);\n                    qnKlingonVariable.Description = new LocalizedText(\"en\", \"Klingon\");\n                    qnKlingonVariable.Value = new QualifiedName(\"qo' vIvan\", NamespaceIndex);\n                    variables.Add(qnKlingonVariable);\n                    var ltKlingonVariable = CreateVariable(localesFolder, locales + \"LTtlhIngan\", \"LTtlhIngan\", DataTypeIds.LocalizedText, ValueRanks.Scalar);\n                    ltKlingonVariable.Description = new LocalizedText(\"en\", \"Klingon\");\n                    ltKlingonVariable.Value = new LocalizedText(\"ko\", \"qo' vIvan\");\n                    variables.Add(ltKlingonVariable);\n\n                    // Attributes\n                    ResetRandomGenerator(20);\n                    var folderAttributes = CreateFolder(root, \"Attributes\", \"Attributes\");\n\n                    // AccessAll\n                    var folderAttributesAccessAll = CreateFolder(folderAttributes, \"Attributes_AccessAll\", \"AccessAll\");\n                    const string attributesAccessAll = \"Attributes_AccessAll_\";\n\n                    var accessLevelAccessAll = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"AccessLevel\", \"AccessLevel\", DataTypeIds.Double, ValueRanks.Scalar);\n                    accessLevelAccessAll.WriteMask = AttributeWriteMask.AccessLevel;\n                    accessLevelAccessAll.UserWriteMask = AttributeWriteMask.AccessLevel;\n                    variables.Add(accessLevelAccessAll);\n\n                    var arrayDimensionsAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"ArrayDimensions\", \"ArrayDimensions\", DataTypeIds.Double, ValueRanks.Scalar);\n                    arrayDimensionsAccessLevel.WriteMask = AttributeWriteMask.ArrayDimensions;\n                    arrayDimensionsAccessLevel.UserWriteMask = AttributeWriteMask.ArrayDimensions;\n                    variables.Add(arrayDimensionsAccessLevel);\n\n                    var browseNameAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"BrowseName\", \"BrowseName\", DataTypeIds.Double, ValueRanks.Scalar);\n                    browseNameAccessLevel.WriteMask = AttributeWriteMask.BrowseName;\n                    browseNameAccessLevel.UserWriteMask = AttributeWriteMask.BrowseName;\n                    variables.Add(browseNameAccessLevel);\n\n                    var containsNoLoopsAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"ContainsNoLoops\", \"ContainsNoLoops\", DataTypeIds.Double, ValueRanks.Scalar);\n                    containsNoLoopsAccessLevel.WriteMask = AttributeWriteMask.ContainsNoLoops;\n                    containsNoLoopsAccessLevel.UserWriteMask = AttributeWriteMask.ContainsNoLoops;\n                    variables.Add(containsNoLoopsAccessLevel);\n\n                    var dataTypeAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"DataType\", \"DataType\", DataTypeIds.Double, ValueRanks.Scalar);\n                    dataTypeAccessLevel.WriteMask = AttributeWriteMask.DataType;\n                    dataTypeAccessLevel.UserWriteMask = AttributeWriteMask.DataType;\n                    variables.Add(dataTypeAccessLevel);\n\n                    var descriptionAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"Description\", \"Description\", DataTypeIds.Double, ValueRanks.Scalar);\n                    descriptionAccessLevel.WriteMask = AttributeWriteMask.Description;\n                    descriptionAccessLevel.UserWriteMask = AttributeWriteMask.Description;\n                    variables.Add(descriptionAccessLevel);\n\n                    var eventNotifierAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"EventNotifier\", \"EventNotifier\", DataTypeIds.Double, ValueRanks.Scalar);\n                    eventNotifierAccessLevel.WriteMask = AttributeWriteMask.EventNotifier;\n                    eventNotifierAccessLevel.UserWriteMask = AttributeWriteMask.EventNotifier;\n                    variables.Add(eventNotifierAccessLevel);\n\n                    var executableAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"Executable\", \"Executable\", DataTypeIds.Double, ValueRanks.Scalar);\n                    executableAccessLevel.WriteMask = AttributeWriteMask.Executable;\n                    executableAccessLevel.UserWriteMask = AttributeWriteMask.Executable;\n                    variables.Add(executableAccessLevel);\n\n                    var historizingAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"Historizing\", \"Historizing\", DataTypeIds.Double, ValueRanks.Scalar);\n                    historizingAccessLevel.WriteMask = AttributeWriteMask.Historizing;\n                    historizingAccessLevel.UserWriteMask = AttributeWriteMask.Historizing;\n                    variables.Add(historizingAccessLevel);\n\n                    var inverseNameAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"InverseName\", \"InverseName\", DataTypeIds.Double, ValueRanks.Scalar);\n                    inverseNameAccessLevel.WriteMask = AttributeWriteMask.InverseName;\n                    inverseNameAccessLevel.UserWriteMask = AttributeWriteMask.InverseName;\n                    variables.Add(inverseNameAccessLevel);\n\n                    var isAbstractAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"IsAbstract\", \"IsAbstract\", DataTypeIds.Double, ValueRanks.Scalar);\n                    isAbstractAccessLevel.WriteMask = AttributeWriteMask.IsAbstract;\n                    isAbstractAccessLevel.UserWriteMask = AttributeWriteMask.IsAbstract;\n                    variables.Add(isAbstractAccessLevel);\n\n                    var minimumSamplingIntervalAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"MinimumSamplingInterval\", \"MinimumSamplingInterval\", DataTypeIds.Double, ValueRanks.Scalar);\n                    minimumSamplingIntervalAccessLevel.WriteMask = AttributeWriteMask.MinimumSamplingInterval;\n                    minimumSamplingIntervalAccessLevel.UserWriteMask = AttributeWriteMask.MinimumSamplingInterval;\n                    variables.Add(minimumSamplingIntervalAccessLevel);\n\n                    var nodeClassIntervalAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"NodeClass\", \"NodeClass\", DataTypeIds.Double, ValueRanks.Scalar);\n                    nodeClassIntervalAccessLevel.WriteMask = AttributeWriteMask.NodeClass;\n                    nodeClassIntervalAccessLevel.UserWriteMask = AttributeWriteMask.NodeClass;\n                    variables.Add(nodeClassIntervalAccessLevel);\n\n                    var nodeIdAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"NodeId\", \"NodeId\", DataTypeIds.Double, ValueRanks.Scalar);\n                    nodeIdAccessLevel.WriteMask = AttributeWriteMask.NodeId;\n                    nodeIdAccessLevel.UserWriteMask = AttributeWriteMask.NodeId;\n                    variables.Add(nodeIdAccessLevel);\n\n                    var symmetricAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"Symmetric\", \"Symmetric\", DataTypeIds.Double, ValueRanks.Scalar);\n                    symmetricAccessLevel.WriteMask = AttributeWriteMask.Symmetric;\n                    symmetricAccessLevel.UserWriteMask = AttributeWriteMask.Symmetric;\n                    variables.Add(symmetricAccessLevel);\n\n                    var userAccessLevelAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"UserAccessLevel\", \"UserAccessLevel\", DataTypeIds.Double, ValueRanks.Scalar);\n                    userAccessLevelAccessLevel.WriteMask = AttributeWriteMask.UserAccessLevel;\n                    userAccessLevelAccessLevel.UserWriteMask = AttributeWriteMask.UserAccessLevel;\n                    variables.Add(userAccessLevelAccessLevel);\n\n                    var userExecutableAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"UserExecutable\", \"UserExecutable\", DataTypeIds.Double, ValueRanks.Scalar);\n                    userExecutableAccessLevel.WriteMask = AttributeWriteMask.UserExecutable;\n                    userExecutableAccessLevel.UserWriteMask = AttributeWriteMask.UserExecutable;\n                    variables.Add(userExecutableAccessLevel);\n\n                    var valueRankAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"ValueRank\", \"ValueRank\", DataTypeIds.Double, ValueRanks.Scalar);\n                    valueRankAccessLevel.WriteMask = AttributeWriteMask.ValueRank;\n                    valueRankAccessLevel.UserWriteMask = AttributeWriteMask.ValueRank;\n                    variables.Add(valueRankAccessLevel);\n\n                    var writeMaskAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"WriteMask\", \"WriteMask\", DataTypeIds.Double, ValueRanks.Scalar);\n                    writeMaskAccessLevel.WriteMask = AttributeWriteMask.WriteMask;\n                    writeMaskAccessLevel.UserWriteMask = AttributeWriteMask.WriteMask;\n                    variables.Add(writeMaskAccessLevel);\n\n                    var valueForVariableTypeAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"ValueForVariableType\", \"ValueForVariableType\", DataTypeIds.Double, ValueRanks.Scalar);\n                    valueForVariableTypeAccessLevel.WriteMask = AttributeWriteMask.ValueForVariableType;\n                    valueForVariableTypeAccessLevel.UserWriteMask = AttributeWriteMask.ValueForVariableType;\n                    variables.Add(valueForVariableTypeAccessLevel);\n\n                    var allAccessLevel = CreateVariable(folderAttributesAccessAll, attributesAccessAll + \"All\", \"All\", DataTypeIds.Double, ValueRanks.Scalar);\n                    allAccessLevel.WriteMask = AttributeWriteMask.AccessLevel | AttributeWriteMask.ArrayDimensions | AttributeWriteMask.BrowseName | AttributeWriteMask.ContainsNoLoops | AttributeWriteMask.DataType |\n                            AttributeWriteMask.Description | AttributeWriteMask.DisplayName | AttributeWriteMask.EventNotifier | AttributeWriteMask.Executable | AttributeWriteMask.Historizing | AttributeWriteMask.InverseName | AttributeWriteMask.IsAbstract |\n                            AttributeWriteMask.MinimumSamplingInterval | AttributeWriteMask.NodeClass | AttributeWriteMask.NodeId | AttributeWriteMask.Symmetric | AttributeWriteMask.UserAccessLevel | AttributeWriteMask.UserExecutable |\n                            AttributeWriteMask.UserWriteMask | AttributeWriteMask.ValueForVariableType | AttributeWriteMask.ValueRank | AttributeWriteMask.WriteMask;\n                    allAccessLevel.UserWriteMask = AttributeWriteMask.AccessLevel | AttributeWriteMask.ArrayDimensions | AttributeWriteMask.BrowseName | AttributeWriteMask.ContainsNoLoops | AttributeWriteMask.DataType |\n                            AttributeWriteMask.Description | AttributeWriteMask.DisplayName | AttributeWriteMask.EventNotifier | AttributeWriteMask.Executable | AttributeWriteMask.Historizing | AttributeWriteMask.InverseName | AttributeWriteMask.IsAbstract |\n                            AttributeWriteMask.MinimumSamplingInterval | AttributeWriteMask.NodeClass | AttributeWriteMask.NodeId | AttributeWriteMask.Symmetric | AttributeWriteMask.UserAccessLevel | AttributeWriteMask.UserExecutable |\n                            AttributeWriteMask.UserWriteMask | AttributeWriteMask.ValueForVariableType | AttributeWriteMask.ValueRank | AttributeWriteMask.WriteMask;\n                    variables.Add(allAccessLevel);\n\n                    // AccessUser1\n                    var folderAttributesAccessUser1 = CreateFolder(folderAttributes, \"Attributes_AccessUser1\", \"AccessUser1\");\n                    const string attributesAccessUser1 = \"Attributes_AccessUser1_\";\n\n                    var accessLevelAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"AccessLevel\", \"AccessLevel\", DataTypeIds.Double, ValueRanks.Scalar);\n                    accessLevelAccessAll.WriteMask = AttributeWriteMask.AccessLevel;\n                    accessLevelAccessAll.UserWriteMask = AttributeWriteMask.AccessLevel;\n                    variables.Add(accessLevelAccessAll);\n\n                    var arrayDimensionsAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"ArrayDimensions\", \"ArrayDimensions\", DataTypeIds.Double, ValueRanks.Scalar);\n                    arrayDimensionsAccessUser1.WriteMask = AttributeWriteMask.ArrayDimensions;\n                    arrayDimensionsAccessUser1.UserWriteMask = AttributeWriteMask.ArrayDimensions;\n                    variables.Add(arrayDimensionsAccessUser1);\n\n                    var browseNameAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"BrowseName\", \"BrowseName\", DataTypeIds.Double, ValueRanks.Scalar);\n                    browseNameAccessUser1.WriteMask = AttributeWriteMask.BrowseName;\n                    browseNameAccessUser1.UserWriteMask = AttributeWriteMask.BrowseName;\n                    variables.Add(browseNameAccessUser1);\n\n                    var containsNoLoopsAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"ContainsNoLoops\", \"ContainsNoLoops\", DataTypeIds.Double, ValueRanks.Scalar);\n                    containsNoLoopsAccessUser1.WriteMask = AttributeWriteMask.ContainsNoLoops;\n                    containsNoLoopsAccessUser1.UserWriteMask = AttributeWriteMask.ContainsNoLoops;\n                    variables.Add(containsNoLoopsAccessUser1);\n\n                    var dataTypeAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"DataType\", \"DataType\", DataTypeIds.Double, ValueRanks.Scalar);\n                    dataTypeAccessUser1.WriteMask = AttributeWriteMask.DataType;\n                    dataTypeAccessUser1.UserWriteMask = AttributeWriteMask.DataType;\n                    variables.Add(dataTypeAccessUser1);\n\n                    var descriptionAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"Description\", \"Description\", DataTypeIds.Double, ValueRanks.Scalar);\n                    descriptionAccessUser1.WriteMask = AttributeWriteMask.Description;\n                    descriptionAccessUser1.UserWriteMask = AttributeWriteMask.Description;\n                    variables.Add(descriptionAccessUser1);\n\n                    var eventNotifierAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"EventNotifier\", \"EventNotifier\", DataTypeIds.Double, ValueRanks.Scalar);\n                    eventNotifierAccessUser1.WriteMask = AttributeWriteMask.EventNotifier;\n                    eventNotifierAccessUser1.UserWriteMask = AttributeWriteMask.EventNotifier;\n                    variables.Add(eventNotifierAccessUser1);\n\n                    var executableAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"Executable\", \"Executable\", DataTypeIds.Double, ValueRanks.Scalar);\n                    executableAccessUser1.WriteMask = AttributeWriteMask.Executable;\n                    executableAccessUser1.UserWriteMask = AttributeWriteMask.Executable;\n                    variables.Add(executableAccessUser1);\n\n                    var historizingAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"Historizing\", \"Historizing\", DataTypeIds.Double, ValueRanks.Scalar);\n                    historizingAccessUser1.WriteMask = AttributeWriteMask.Historizing;\n                    historizingAccessUser1.UserWriteMask = AttributeWriteMask.Historizing;\n                    variables.Add(historizingAccessUser1);\n\n                    var inverseNameAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"InverseName\", \"InverseName\", DataTypeIds.Double, ValueRanks.Scalar);\n                    inverseNameAccessUser1.WriteMask = AttributeWriteMask.InverseName;\n                    inverseNameAccessUser1.UserWriteMask = AttributeWriteMask.InverseName;\n                    variables.Add(inverseNameAccessUser1);\n\n                    var isAbstractAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"IsAbstract\", \"IsAbstract\", DataTypeIds.Double, ValueRanks.Scalar);\n                    isAbstractAccessUser1.WriteMask = AttributeWriteMask.IsAbstract;\n                    isAbstractAccessUser1.UserWriteMask = AttributeWriteMask.IsAbstract;\n                    variables.Add(isAbstractAccessUser1);\n\n                    var minimumSamplingIntervalAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"MinimumSamplingInterval\", \"MinimumSamplingInterval\", DataTypeIds.Double, ValueRanks.Scalar);\n                    minimumSamplingIntervalAccessUser1.WriteMask = AttributeWriteMask.MinimumSamplingInterval;\n                    minimumSamplingIntervalAccessUser1.UserWriteMask = AttributeWriteMask.MinimumSamplingInterval;\n                    variables.Add(minimumSamplingIntervalAccessUser1);\n\n                    var nodeClassIntervalAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"NodeClass\", \"NodeClass\", DataTypeIds.Double, ValueRanks.Scalar);\n                    nodeClassIntervalAccessUser1.WriteMask = AttributeWriteMask.NodeClass;\n                    nodeClassIntervalAccessUser1.UserWriteMask = AttributeWriteMask.NodeClass;\n                    variables.Add(nodeClassIntervalAccessUser1);\n\n                    var nodeIdAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"NodeId\", \"NodeId\", DataTypeIds.Double, ValueRanks.Scalar);\n                    nodeIdAccessUser1.WriteMask = AttributeWriteMask.NodeId;\n                    nodeIdAccessUser1.UserWriteMask = AttributeWriteMask.NodeId;\n                    variables.Add(nodeIdAccessUser1);\n\n                    var symmetricAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"Symmetric\", \"Symmetric\", DataTypeIds.Double, ValueRanks.Scalar);\n                    symmetricAccessUser1.WriteMask = AttributeWriteMask.Symmetric;\n                    symmetricAccessUser1.UserWriteMask = AttributeWriteMask.Symmetric;\n                    variables.Add(symmetricAccessUser1);\n\n                    var userAccessUser1AccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"UserAccessUser1\", \"UserAccessUser1\", DataTypeIds.Double, ValueRanks.Scalar);\n                    userAccessUser1AccessUser1.WriteMask = AttributeWriteMask.UserAccessLevel;\n                    userAccessUser1AccessUser1.UserWriteMask = AttributeWriteMask.UserAccessLevel;\n                    variables.Add(userAccessUser1AccessUser1);\n\n                    var userExecutableAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"UserExecutable\", \"UserExecutable\", DataTypeIds.Double, ValueRanks.Scalar);\n                    userExecutableAccessUser1.WriteMask = AttributeWriteMask.UserExecutable;\n                    userExecutableAccessUser1.UserWriteMask = AttributeWriteMask.UserExecutable;\n                    variables.Add(userExecutableAccessUser1);\n\n                    var valueRankAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"ValueRank\", \"ValueRank\", DataTypeIds.Double, ValueRanks.Scalar);\n                    valueRankAccessUser1.WriteMask = AttributeWriteMask.ValueRank;\n                    valueRankAccessUser1.UserWriteMask = AttributeWriteMask.ValueRank;\n                    variables.Add(valueRankAccessUser1);\n\n                    var writeMaskAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"WriteMask\", \"WriteMask\", DataTypeIds.Double, ValueRanks.Scalar);\n                    writeMaskAccessUser1.WriteMask = AttributeWriteMask.WriteMask;\n                    writeMaskAccessUser1.UserWriteMask = AttributeWriteMask.WriteMask;\n                    variables.Add(writeMaskAccessUser1);\n\n                    var valueForVariableTypeAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"ValueForVariableType\", \"ValueForVariableType\", DataTypeIds.Double, ValueRanks.Scalar);\n                    valueForVariableTypeAccessUser1.WriteMask = AttributeWriteMask.ValueForVariableType;\n                    valueForVariableTypeAccessUser1.UserWriteMask = AttributeWriteMask.ValueForVariableType;\n                    variables.Add(valueForVariableTypeAccessUser1);\n\n                    var allAccessUser1 = CreateVariable(folderAttributesAccessUser1, attributesAccessUser1 + \"All\", \"All\", DataTypeIds.Double, ValueRanks.Scalar);\n                    allAccessUser1.WriteMask = AttributeWriteMask.AccessLevel | AttributeWriteMask.ArrayDimensions | AttributeWriteMask.BrowseName | AttributeWriteMask.ContainsNoLoops | AttributeWriteMask.DataType |\n                            AttributeWriteMask.Description | AttributeWriteMask.DisplayName | AttributeWriteMask.EventNotifier | AttributeWriteMask.Executable | AttributeWriteMask.Historizing | AttributeWriteMask.InverseName | AttributeWriteMask.IsAbstract |\n                            AttributeWriteMask.MinimumSamplingInterval | AttributeWriteMask.NodeClass | AttributeWriteMask.NodeId | AttributeWriteMask.Symmetric | AttributeWriteMask.UserAccessLevel | AttributeWriteMask.UserExecutable |\n                            AttributeWriteMask.UserWriteMask | AttributeWriteMask.ValueForVariableType | AttributeWriteMask.ValueRank | AttributeWriteMask.WriteMask;\n                    allAccessUser1.UserWriteMask = AttributeWriteMask.AccessLevel | AttributeWriteMask.ArrayDimensions | AttributeWriteMask.BrowseName | AttributeWriteMask.ContainsNoLoops | AttributeWriteMask.DataType |\n                            AttributeWriteMask.Description | AttributeWriteMask.DisplayName | AttributeWriteMask.EventNotifier | AttributeWriteMask.Executable | AttributeWriteMask.Historizing | AttributeWriteMask.InverseName | AttributeWriteMask.IsAbstract |\n                            AttributeWriteMask.MinimumSamplingInterval | AttributeWriteMask.NodeClass | AttributeWriteMask.NodeId | AttributeWriteMask.Symmetric | AttributeWriteMask.UserAccessLevel | AttributeWriteMask.UserExecutable |\n                            AttributeWriteMask.UserWriteMask | AttributeWriteMask.ValueForVariableType | AttributeWriteMask.ValueRank | AttributeWriteMask.WriteMask;\n                    variables.Add(allAccessUser1);\n\n                    // MyCompany\n                    ResetRandomGenerator(21);\n                    var myCompanyFolder = CreateFolder(root, \"MyCompany\", \"MyCompany\");\n                    const string myCompany = \"MyCompany_\";\n\n                    var myCompanyInstructions = CreateVariable(myCompanyFolder, myCompany + \"Instructions\", \"Instructions\", DataTypeIds.String, ValueRanks.Scalar);\n                    myCompanyInstructions.Value = \"A place for the vendor to describe their address-space.\";\n                    variables.Add(myCompanyInstructions);\n                }\n                catch (Exception e)\n                {\n                    Utils.LogError(e, \"Error creating the ReferenceNodeManager address space.\");\n                }\n\n                AddPredefinedNode(SystemContext, root);\n\n                // reset random generator and generate boundary values\n                ResetRandomGenerator(100, 1);\n                _simulationTimer = new Timer(DoSimulation, null, 1000, 1000);\n            }\n        }\n\n        private ServiceResult OnWriteInterval(ISystemContext context, NodeState node, ref object value)\n        {\n            try\n            {\n                _simulationInterval = (ushort)value;\n\n                if (_simulationEnabled)\n                {\n                    _simulationTimer.Change(100, _simulationInterval);\n                }\n\n                return ServiceResult.Good;\n            }\n            catch (Exception e)\n            {\n                Utils.LogError(e, \"Error writing Interval variable.\");\n                return ServiceResult.Create(e, StatusCodes.Bad, \"Error writing Interval variable.\");\n            }\n        }\n\n        private ServiceResult OnWriteEnabled(ISystemContext context, NodeState node, ref object value)\n        {\n            try\n            {\n                _simulationEnabled = (bool)value;\n\n                if (_simulationEnabled)\n                {\n                    _simulationTimer.Change(100, _simulationInterval);\n                }\n                else\n                {\n                    _simulationTimer.Change(100, 0);\n                }\n\n                return ServiceResult.Good;\n            }\n            catch (Exception e)\n            {\n                Utils.LogError(e, \"Error writing Enabled variable.\");\n                return ServiceResult.Create(e, StatusCodes.Bad, \"Error writing Enabled variable.\");\n            }\n        }\n\n        /// <summary>\n        /// Creates a new folder.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        private FolderState CreateFolder(NodeState parent, string path, string name)\n        {\n            var folder = new FolderState(parent)\n            {\n                SymbolicName = name,\n                ReferenceTypeId = ReferenceTypes.Organizes,\n                TypeDefinitionId = ObjectTypeIds.FolderType,\n                NodeId = new NodeId(path, NamespaceIndex),\n                BrowseName = new QualifiedName(path, NamespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None,\n                EventNotifier = EventNotifiers.None\n            };\n\n            parent?.AddChild(folder);\n\n            return folder;\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"peers\"></param>\n        private BaseDataVariableState CreateMeshVariable(NodeState parent, string path, string name, params NodeState[] peers)\n        {\n            var variable = CreateVariable(parent, path, name, BuiltInType.Double, ValueRanks.Scalar);\n\n            if (peers != null)\n            {\n                foreach (var peer in peers)\n                {\n                    peer.AddReference(ReferenceTypes.HasCause, false, variable.NodeId);\n                    variable.AddReference(ReferenceTypes.HasCause, true, peer.NodeId);\n                    peer.AddReference(ReferenceTypes.HasEffect, true, variable.NodeId);\n                    variable.AddReference(ReferenceTypes.HasEffect, false, peer.NodeId);\n                }\n            }\n\n            return variable;\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        private DataItemState CreateDataItemVariable(NodeState parent, string path, string name, BuiltInType dataType, int valueRank)\n        {\n            var variable = new DataItemState(parent);\n            variable.ValuePrecision = new PropertyState<double>(variable);\n            variable.Definition = new PropertyState<string>(variable);\n\n            variable.Create(\n                SystemContext,\n                null,\n                variable.BrowseName,\n                null,\n                true);\n\n            variable.SymbolicName = name;\n            variable.ReferenceTypeId = ReferenceTypes.Organizes;\n            variable.NodeId = new NodeId(path, NamespaceIndex);\n            variable.BrowseName = new QualifiedName(path, NamespaceIndex);\n            variable.DisplayName = new LocalizedText(\"en\", name);\n            variable.WriteMask = AttributeWriteMask.None;\n            variable.UserWriteMask = AttributeWriteMask.None;\n            variable.DataType = (uint)dataType;\n            variable.ValueRank = valueRank;\n            variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.Historizing = false;\n            variable.Value = TypeInfo.GetDefaultValue((uint)dataType, valueRank, Server.TypeTree);\n            variable.StatusCode = StatusCodes.Good;\n            variable.Timestamp = DateTime.UtcNow;\n\n            if (valueRank == ValueRanks.OneDimension)\n            {\n                variable.ArrayDimensions = new ReadOnlyList<uint>([0]);\n            }\n            else if (valueRank == ValueRanks.TwoDimensions)\n            {\n                variable.ArrayDimensions = new ReadOnlyList<uint>([0, 0]);\n            }\n\n            variable.ValuePrecision.Value = 2;\n            variable.ValuePrecision.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.ValuePrecision.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.Definition.Value = string.Empty;\n            variable.Definition.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.Definition.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n\n            parent?.AddChild(variable);\n\n            return variable;\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        private AnalogItemState CreateAnalogItemVariable(NodeState parent, string path, string name, BuiltInType dataType, int valueRank)\n        {\n            return CreateAnalogItemVariable(parent, path, name, dataType, valueRank, null);\n        }\n\n        private AnalogItemState CreateAnalogItemVariable(NodeState parent, string path, string name, BuiltInType dataType, int valueRank, object initialValues)\n        {\n            return CreateAnalogItemVariable(parent, path, name, dataType, valueRank, initialValues, null);\n        }\n\n        private AnalogItemState CreateAnalogItemVariable(NodeState parent, string path, string name, BuiltInType dataType, int valueRank, object initialValues, Opc.Ua.Range customRange)\n        {\n            return CreateAnalogItemVariable(parent, path, name, (uint)dataType, valueRank, initialValues, customRange);\n        }\n\n        private AnalogItemState CreateAnalogItemVariable(NodeState parent, string path, string name, NodeId dataType, int valueRank, object initialValues, Opc.Ua.Range customRange)\n        {\n            var variable = new AnalogItemState(parent)\n            {\n                BrowseName = new QualifiedName(path, NamespaceIndex)\n            };\n            variable.EngineeringUnits = new PropertyState<EUInformation>(variable);\n            variable.InstrumentRange = new PropertyState<Opc.Ua.Range>(variable);\n\n            variable.Create(\n                SystemContext,\n                new NodeId(path, NamespaceIndex),\n                variable.BrowseName,\n                null,\n                true);\n\n            variable.NodeId = new NodeId(path, NamespaceIndex);\n            variable.SymbolicName = name;\n            variable.DisplayName = new LocalizedText(\"en\", name);\n            variable.WriteMask = AttributeWriteMask.None;\n            variable.UserWriteMask = AttributeWriteMask.None;\n            variable.ReferenceTypeId = ReferenceTypes.Organizes;\n            variable.DataType = dataType;\n            variable.ValueRank = valueRank;\n            variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.Historizing = false;\n\n            if (valueRank == ValueRanks.OneDimension)\n            {\n                variable.ArrayDimensions = new ReadOnlyList<uint>([0]);\n            }\n            else if (valueRank == ValueRanks.TwoDimensions)\n            {\n                variable.ArrayDimensions = new ReadOnlyList<uint>([0, 0]);\n            }\n\n            var builtInType = TypeInfo.GetBuiltInType(dataType, Server.TypeTree);\n\n            // Simulate a mV Voltmeter\n            var newRange = GetAnalogRange(builtInType);\n            // Using anything but 120,-10 fails a few tests\n            newRange.High = Math.Min(newRange.High, 120);\n            newRange.Low = Math.Max(newRange.Low, -10);\n            variable.InstrumentRange.Value = newRange;\n\n            variable.EURange.Value = customRange ?? new Opc.Ua.Range(100, 0);\n\n            variable.Value = initialValues ?? TypeInfo.GetDefaultValue(dataType, valueRank, Server.TypeTree);\n\n            variable.StatusCode = StatusCodes.Good;\n            variable.Timestamp = DateTime.UtcNow;\n            // The latest UNECE version (Rev 11, published in 2015) is available here:\n            // http://www.opcfoundation.org/UA/EngineeringUnits/UNECE/rec20_latest_08052015.zip\n            variable.EngineeringUnits.Value = new EUInformation(\"mV\", \"millivolt\", \"http://www.opcfoundation.org/UA/units/un/cefact\")\n            {\n                // The mapping of the UNECE codes to OPC UA(EUInformation.unitId) is available here:\n                // http://www.opcfoundation.org/UA/EngineeringUnits/UNECE/UNECE_to_OPCUA.csv\n                UnitId = 12890 // \"2Z\"\n            };\n            variable.OnWriteValue = OnWriteAnalog;\n            variable.EURange.OnWriteValue = OnWriteAnalogRange;\n            variable.EURange.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.EURange.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.EngineeringUnits.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.EngineeringUnits.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.InstrumentRange.OnWriteValue = OnWriteAnalogRange;\n            variable.InstrumentRange.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.InstrumentRange.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n\n            parent?.AddChild(variable);\n\n            return variable;\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"trueState\"></param>\n        /// <param name=\"falseState\"></param>\n        private TwoStateDiscreteState CreateTwoStateDiscreteItemVariable(NodeState parent, string path, string name, string trueState, string falseState)\n        {\n            var variable = new TwoStateDiscreteState(parent)\n            {\n                NodeId = new NodeId(path, NamespaceIndex),\n                BrowseName = new QualifiedName(path, NamespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None\n            };\n\n            variable.Create(\n                SystemContext,\n                null,\n                variable.BrowseName,\n                null,\n                true);\n\n            variable.SymbolicName = name;\n            variable.ReferenceTypeId = ReferenceTypes.Organizes;\n            variable.DataType = DataTypeIds.Boolean;\n            variable.ValueRank = ValueRanks.Scalar;\n            variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.Historizing = false;\n            variable.Value = (bool)GetNewValue(variable);\n            variable.StatusCode = StatusCodes.Good;\n            variable.Timestamp = DateTime.UtcNow;\n\n            variable.TrueState.Value = trueState;\n            variable.TrueState.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.TrueState.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n\n            variable.FalseState.Value = falseState;\n            variable.FalseState.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.FalseState.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n\n            parent?.AddChild(variable);\n\n            return variable;\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"values\"></param>\n        private MultiStateDiscreteState CreateMultiStateDiscreteItemVariable(NodeState parent, string path, string name, params string[] values)\n        {\n            var variable = new MultiStateDiscreteState(parent)\n            {\n                NodeId = new NodeId(path, NamespaceIndex),\n                BrowseName = new QualifiedName(path, NamespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None\n            };\n\n            variable.Create(\n                SystemContext,\n                null,\n                variable.BrowseName,\n                null,\n                true);\n\n            variable.SymbolicName = name;\n            variable.ReferenceTypeId = ReferenceTypes.Organizes;\n            variable.DataType = DataTypeIds.UInt32;\n            variable.ValueRank = ValueRanks.Scalar;\n            variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.Historizing = false;\n            variable.Value = (uint)0;\n            variable.StatusCode = StatusCodes.Good;\n            variable.Timestamp = DateTime.UtcNow;\n            variable.OnWriteValue = OnWriteDiscrete;\n\n            var strings = new LocalizedText[values.Length];\n\n            for (var ii = 0; ii < strings.Length; ii++)\n            {\n                strings[ii] = values[ii];\n            }\n\n            variable.EnumStrings.Value = strings;\n            variable.EnumStrings.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.EnumStrings.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n\n            parent?.AddChild(variable);\n\n            return variable;\n        }\n\n        /// <summary>\n        /// Creates a new UInt32 variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"enumNames\"></param>\n        private MultiStateValueDiscreteState CreateMultiStateValueDiscreteItemVariable(NodeState parent, string path, string name, params string[] enumNames)\n        {\n            return CreateMultiStateValueDiscreteItemVariable(parent, path, name, null, enumNames);\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"enumNames\"></param>\n        private MultiStateValueDiscreteState CreateMultiStateValueDiscreteItemVariable(NodeState parent, string path, string name, NodeId nodeId, params string[] enumNames)\n        {\n            var variable = new MultiStateValueDiscreteState(parent)\n            {\n                NodeId = new NodeId(path, NamespaceIndex),\n                BrowseName = new QualifiedName(path, NamespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None\n            };\n\n            variable.Create(\n                SystemContext,\n                null,\n                variable.BrowseName,\n                null,\n                true);\n\n            variable.SymbolicName = name;\n            variable.ReferenceTypeId = ReferenceTypes.Organizes;\n            variable.DataType = nodeId ?? DataTypeIds.UInt32;\n            variable.ValueRank = ValueRanks.Scalar;\n            variable.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.Historizing = false;\n            variable.Value = (uint)0;\n            variable.StatusCode = StatusCodes.Good;\n            variable.Timestamp = DateTime.UtcNow;\n            variable.OnWriteValue = OnWriteValueDiscrete;\n\n            // there are two enumerations for this type:\n            // EnumStrings = the string representations for enumerated values\n            // ValueAsText = the actual enumerated value\n\n            // set the enumerated strings\n            var strings = new LocalizedText[enumNames.Length];\n            for (var ii = 0; ii < strings.Length; ii++)\n            {\n                strings[ii] = enumNames[ii];\n            }\n\n            // set the enumerated values\n            var values = new EnumValueType[enumNames.Length];\n            for (var ii = 0; ii < values.Length; ii++)\n            {\n                values[ii] = new EnumValueType\n                {\n                    Value = ii,\n                    Description = strings[ii],\n                    DisplayName = strings[ii]\n                };\n            }\n            variable.EnumValues.Value = values;\n            variable.EnumValues.AccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.EnumValues.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            variable.ValueAsText.Value = variable.EnumValues.Value[0].DisplayName;\n\n            parent?.AddChild(variable);\n\n            return variable;\n        }\n\n        private ServiceResult OnWriteDiscrete(\n            ISystemContext context,\n            NodeState node,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            ref object value,\n            ref StatusCode statusCode,\n            ref DateTime timestamp)\n        {\n            var variable = node as MultiStateDiscreteState;\n\n            // verify data type.\n            var typeInfo = TypeInfo.IsInstanceOfDataType(\n                value,\n                variable.DataType,\n                variable.ValueRank,\n                context.NamespaceUris,\n                context.TypeTable);\n\n            if (typeInfo == null || typeInfo == TypeInfo.Unknown)\n            {\n                return StatusCodes.BadTypeMismatch;\n            }\n\n            if (indexRange != NumericRange.Empty)\n            {\n                return StatusCodes.BadIndexRangeInvalid;\n            }\n\n            var number = Convert.ToDouble(value, CultureInfo.InvariantCulture);\n\n            if (number >= variable.EnumStrings.Value.Length || number < 0)\n            {\n                return StatusCodes.BadOutOfRange;\n            }\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnWriteValueDiscrete(\n            ISystemContext context,\n            NodeState node,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            ref object value,\n            ref StatusCode statusCode,\n            ref DateTime timestamp)\n        {\n            var typeInfo = TypeInfo.Construct(value);\n\n            if (node is not MultiStateValueDiscreteState variable ||\n                typeInfo == null ||\n                typeInfo == TypeInfo.Unknown ||\n                !TypeInfo.IsNumericType(typeInfo.BuiltInType))\n            {\n                return StatusCodes.BadTypeMismatch;\n            }\n\n            if (indexRange != NumericRange.Empty)\n            {\n                return StatusCodes.BadIndexRangeInvalid;\n            }\n\n            var number = Convert.ToInt32(value, CultureInfo.InvariantCulture);\n            if (number >= variable.EnumValues.Value.Length || number < 0)\n            {\n                return StatusCodes.BadOutOfRange;\n            }\n\n            if (!node.SetChildValue(context, BrowseNames.ValueAsText, variable.EnumValues.Value[number].DisplayName, true))\n            {\n                return StatusCodes.BadOutOfRange;\n            }\n\n            node.ClearChangeMasks(context, true);\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnWriteAnalog(\n            ISystemContext context,\n            NodeState node,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            ref object value,\n            ref StatusCode statusCode,\n            ref DateTime timestamp)\n        {\n            var variable = node as AnalogItemState;\n\n            // verify data type.\n            var typeInfo = TypeInfo.IsInstanceOfDataType(\n                value,\n                variable.DataType,\n                variable.ValueRank,\n                context.NamespaceUris,\n                context.TypeTable);\n\n            if (typeInfo == null || typeInfo == TypeInfo.Unknown)\n            {\n                return StatusCodes.BadTypeMismatch;\n            }\n\n            // check index range.\n            if (variable.ValueRank >= 0)\n            {\n                if (indexRange != NumericRange.Empty)\n                {\n                    var target = variable.Value;\n                    ServiceResult result = indexRange.UpdateRange(ref target, value);\n\n                    if (ServiceResult.IsBad(result))\n                    {\n                        return result;\n                    }\n\n                    value = target;\n                }\n            }\n\n            // check instrument range.\n            else\n            {\n                if (indexRange != NumericRange.Empty)\n                {\n                    return StatusCodes.BadIndexRangeInvalid;\n                }\n\n                var number = Convert.ToDouble(value, CultureInfo.InvariantCulture);\n\n                if (variable.InstrumentRange != null && (number < variable.InstrumentRange.Value.Low || number > variable.InstrumentRange.Value.High))\n                {\n                    return StatusCodes.BadOutOfRange;\n                }\n            }\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnWriteAnalogRange(\n            ISystemContext context,\n            NodeState node,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            ref object value,\n            ref StatusCode statusCode,\n            ref DateTime timestamp)\n        {\n            var typeInfo = TypeInfo.Construct(value);\n\n            if (node is not PropertyState<Opc.Ua.Range> variable ||\n                value is not ExtensionObject extensionObject ||\n                typeInfo == null ||\n                typeInfo == TypeInfo.Unknown)\n            {\n                return StatusCodes.BadTypeMismatch;\n            }\n\n            if (extensionObject.Body is not Opc.Ua.Range newRange ||\n                variable.Parent is not AnalogItemState parent)\n            {\n                return StatusCodes.BadTypeMismatch;\n            }\n\n            if (indexRange != NumericRange.Empty)\n            {\n                return StatusCodes.BadIndexRangeInvalid;\n            }\n\n            var parentTypeInfo = TypeInfo.Construct(parent.Value);\n            var parentRange = GetAnalogRange(parentTypeInfo.BuiltInType);\n            if (parentRange.High < newRange.High ||\n                parentRange.Low > newRange.Low)\n            {\n                return StatusCodes.BadOutOfRange;\n            }\n\n            value = newRange;\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        private BaseDataVariableState CreateVariable(NodeState parent, string path, string name, BuiltInType dataType, int valueRank)\n        {\n            return CreateVariable(parent, path, name, (uint)dataType, valueRank);\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        private BaseDataVariableState CreateVariable(NodeState parent, string path, string name, NodeId dataType, int valueRank)\n        {\n            var variable = new BaseDataVariableState(parent)\n            {\n                SymbolicName = name,\n                ReferenceTypeId = ReferenceTypes.Organizes,\n                TypeDefinitionId = VariableTypeIds.BaseDataVariableType,\n                NodeId = new NodeId(path, NamespaceIndex),\n                BrowseName = new QualifiedName(path, NamespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.DisplayName | AttributeWriteMask.Description,\n                UserWriteMask = AttributeWriteMask.DisplayName | AttributeWriteMask.Description,\n                DataType = dataType,\n                ValueRank = valueRank,\n                AccessLevel = AccessLevels.CurrentReadOrWrite,\n                UserAccessLevel = AccessLevels.CurrentReadOrWrite,\n                Historizing = false\n            };\n            variable.Value = GetNewValue(variable);\n            variable.StatusCode = StatusCodes.Good;\n            variable.Timestamp = DateTime.UtcNow;\n\n            if (valueRank == ValueRanks.OneDimension)\n            {\n                variable.ArrayDimensions = new ReadOnlyList<uint>([0]);\n            }\n            else if (valueRank == ValueRanks.TwoDimensions)\n            {\n                variable.ArrayDimensions = new ReadOnlyList<uint>([0, 0]);\n            }\n\n            parent?.AddChild(variable);\n\n            return variable;\n        }\n\n        private BaseDataVariableState[] CreateVariables(NodeState parent, string path, string name, BuiltInType dataType, int valueRank, ushort numVariables)\n        {\n            return CreateVariables(parent, path, name, (uint)dataType, valueRank, numVariables);\n        }\n\n        private BaseDataVariableState[] CreateVariables(NodeState parent, string path, string name, NodeId dataType, int valueRank, ushort numVariables)\n        {\n            // first, create a new Parent folder for this data-type\n            var newParentFolder = CreateFolder(parent, path, name);\n\n            var itemsCreated = new List<BaseDataVariableState>();\n            // now to create the remaining NUMBERED items\n            for (uint i = 0; i < numVariables; i++)\n            {\n                var newName = string.Format(CultureInfo.InvariantCulture, \"{0}_{1}\", name, i.ToString(\"00\", CultureInfo.InvariantCulture));\n                var newPath = string.Format(CultureInfo.InvariantCulture, \"{0}_{1}\", path, newName);\n                itemsCreated.Add(CreateVariable(newParentFolder, newPath, newName, dataType, valueRank));\n            }\n            return [.. itemsCreated];\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        private BaseDataVariableState CreateDynamicVariable(NodeState parent, string path, string name, BuiltInType dataType, int valueRank)\n        {\n            return CreateDynamicVariable(parent, path, name, (uint)dataType, valueRank);\n        }\n\n        /// <summary>\n        /// Creates a new variable.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        private BaseDataVariableState CreateDynamicVariable(NodeState parent, string path, string name, NodeId dataType, int valueRank)\n        {\n            var variable = CreateVariable(parent, path, name, dataType, valueRank);\n            _dynamicNodes.Add(variable);\n            return variable;\n        }\n\n        private BaseDataVariableState[] CreateDynamicVariables(NodeState parent, string path, string name, BuiltInType dataType, int valueRank, uint numVariables)\n        {\n            return CreateDynamicVariables(parent, path, name, (uint)dataType, valueRank, numVariables);\n        }\n\n        private BaseDataVariableState[] CreateDynamicVariables(NodeState parent, string path, string name, NodeId dataType, int valueRank, uint numVariables)\n        {\n            // first, create a new Parent folder for this data-type\n            var newParentFolder = CreateFolder(parent, path, name);\n\n            var itemsCreated = new List<BaseDataVariableState>();\n            // now to create the remaining NUMBERED items\n            for (uint i = 0; i < numVariables; i++)\n            {\n                var newName = string.Format(CultureInfo.InvariantCulture, \"{0}_{1}\", name, i.ToString(\"00\", CultureInfo.InvariantCulture));\n                var newPath = string.Format(CultureInfo.InvariantCulture, \"{0}_{1}\", path, newName);\n                itemsCreated.Add(CreateDynamicVariable(newParentFolder, newPath, newName, dataType, valueRank));\n            }//for i\n            return [.. itemsCreated];\n        }\n\n        /// <summary>\n        /// Creates a new view.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"externalReferences\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        private ViewState CreateView(NodeState parent, IDictionary<NodeId, IList<IReference>> externalReferences, string path, string name)\n        {\n            var type = new ViewState\n            {\n                SymbolicName = name,\n                NodeId = new NodeId(path, NamespaceIndex),\n                BrowseName = new QualifiedName(name, NamespaceIndex)\n            };\n            type.DisplayName = type.BrowseName.Name;\n            type.WriteMask = AttributeWriteMask.None;\n            type.UserWriteMask = AttributeWriteMask.None;\n            type.ContainsNoLoops = true;\n\n            if (!externalReferences.TryGetValue(ObjectIds.ViewsFolder, out var references))\n            {\n                externalReferences[ObjectIds.ViewsFolder] = references = [];\n            }\n\n            type.AddReference(ReferenceTypeIds.Organizes, true, ObjectIds.ViewsFolder);\n            references.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, type.NodeId));\n\n            if (parent != null)\n            {\n                parent.AddReference(ReferenceTypes.Organizes, false, type.NodeId);\n                type.AddReference(ReferenceTypes.Organizes, true, parent.NodeId);\n            }\n\n            AddPredefinedNode(SystemContext, type);\n            return type;\n        }\n\n        /// <summary>\n        /// Creates a new method.\n        /// </summary>\n        /// <param name=\"parent\"></param>\n        /// <param name=\"path\"></param>\n        /// <param name=\"name\"></param>\n        private MethodState CreateMethod(NodeState parent, string path, string name)\n        {\n            var method = new MethodState(parent)\n            {\n                SymbolicName = name,\n                ReferenceTypeId = ReferenceTypeIds.HasComponent,\n                NodeId = new NodeId(path, NamespaceIndex),\n                BrowseName = new QualifiedName(path, NamespaceIndex),\n                DisplayName = new LocalizedText(\"en\", name),\n                WriteMask = AttributeWriteMask.None,\n                UserWriteMask = AttributeWriteMask.None,\n                Executable = true,\n                UserExecutable = true\n            };\n\n            parent?.AddChild(method);\n\n            return method;\n        }\n\n        private ServiceResult OnVoidCall(\n            ISystemContext context,\n            MethodState method,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnAddCall(\n            ISystemContext context,\n            MethodState method,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            // all arguments must be provided.\n            if (inputArguments.Count < 2)\n            {\n                return StatusCodes.BadArgumentsMissing;\n            }\n\n            try\n            {\n                var floatValue = (float)inputArguments[0];\n                var uintValue = (uint)inputArguments[1];\n\n                // set output parameter\n                outputArguments[0] = floatValue + uintValue;\n                return ServiceResult.Good;\n            }\n            catch\n            {\n                return new ServiceResult(StatusCodes.BadInvalidArgument);\n            }\n        }\n\n        private ServiceResult OnMultiplyCall(\n            ISystemContext context,\n            MethodState method,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            // all arguments must be provided.\n            if (inputArguments.Count < 2)\n            {\n                return StatusCodes.BadArgumentsMissing;\n            }\n\n            try\n            {\n                var op1 = (short)inputArguments[0];\n                var op2 = (ushort)inputArguments[1];\n\n                // set output parameter\n                outputArguments[0] = op1 * op2;\n                return ServiceResult.Good;\n            }\n            catch\n            {\n                return new ServiceResult(StatusCodes.BadInvalidArgument);\n            }\n        }\n\n        private ServiceResult OnDivideCall(\n            ISystemContext context,\n            MethodState method,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            // all arguments must be provided.\n            if (inputArguments.Count < 2)\n            {\n                return StatusCodes.BadArgumentsMissing;\n            }\n\n            try\n            {\n                var op1 = (int)inputArguments[0];\n                var op2 = (ushort)inputArguments[1];\n\n                // set output parameter\n                outputArguments[0] = op1 / (float)op2;\n                return ServiceResult.Good;\n            }\n            catch\n            {\n                return new ServiceResult(StatusCodes.BadInvalidArgument);\n            }\n        }\n\n        private ServiceResult OnSubstractCall(\n            ISystemContext context,\n            MethodState method,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            // all arguments must be provided.\n            if (inputArguments.Count < 2)\n            {\n                return StatusCodes.BadArgumentsMissing;\n            }\n\n            try\n            {\n                var op1 = (short)inputArguments[0];\n                var op2 = (byte)inputArguments[1];\n\n                // set output parameter\n                outputArguments[0] = (short)(op1 - op2);\n                return ServiceResult.Good;\n            }\n            catch\n            {\n                return new ServiceResult(StatusCodes.BadInvalidArgument);\n            }\n        }\n\n        private ServiceResult OnHelloCall(\n            ISystemContext context,\n            MethodState method,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            // all arguments must be provided.\n            if (inputArguments.Count < 1)\n            {\n                return StatusCodes.BadArgumentsMissing;\n            }\n\n            try\n            {\n                var op1 = (string)inputArguments[0];\n\n                // set output parameter\n                outputArguments[0] = \"hello \" + op1;\n                return ServiceResult.Good;\n            }\n            catch\n            {\n                return new ServiceResult(StatusCodes.BadInvalidArgument);\n            }\n        }\n\n        private ServiceResult OnInputCall(\n            ISystemContext context,\n            MethodState method,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            // all arguments must be provided.\n            if (inputArguments.Count < 1)\n            {\n                return StatusCodes.BadArgumentsMissing;\n            }\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnOutputCall(\n            ISystemContext context,\n            MethodState method,\n            IList<object> inputArguments,\n            IList<object> outputArguments)\n        {\n            // all arguments must be provided.\n            try\n            {\n                // set output parameter\n                outputArguments[0] = \"Output\";\n                return ServiceResult.Good;\n            }\n            catch\n            {\n                return new ServiceResult(StatusCodes.BadInvalidArgument);\n            }\n        }\n\n        private void ResetRandomGenerator(int seed, int boundaryValueFrequency = 0)\n        {\n            _randomSource = new Opc.Ua.Test.RandomSource(seed);\n            _generator = new Opc.Ua.Test.TestDataGenerator(_randomSource)\n            {\n                BoundaryValueFrequency = boundaryValueFrequency\n            };\n        }\n\n        private object GetNewValue(BaseVariableState variable)\n        {\n            Debug.Assert(_generator != null, \"Need a random generator!\");\n\n            object value = null;\n            for (var retryCount = 0; value == null && retryCount < 10; retryCount++)\n            {\n                value = _generator.GetRandom(variable.DataType, variable.ValueRank,\n                    new uint[] { 10 }, Server.TypeTree);\n                if (value is Variant variant && variant.Value == null)\n                {\n                    value = null;\n                }\n            }\n            return value;\n        }\n\n        private void DoSimulation(object state)\n        {\n            try\n            {\n                lock (Lock)\n                {\n                    var timeStamp = DateTime.UtcNow;\n                    foreach (var variable in _dynamicNodes)\n                    {\n                        variable.Value = GetNewValue(variable);\n                        variable.Timestamp = timeStamp;\n                        variable.ClearChangeMasks(SystemContext, false);\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Utils.LogError(e, \"Unexpected error doing simulation.\");\n            }\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                // TBD\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context,\n            NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                if (!PredefinedNodes.TryGetValue(nodeId, out var node))\n                {\n                    return null;\n                }\n\n                return new NodeHandle\n                {\n                    NodeId = nodeId,\n                    Node = node,\n                    Validated = true\n                };\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n           ServerSystemContext context,\n           NodeHandle handle,\n           IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            // TBD\n\n            return null;\n        }\n\n        private Opc.Ua.Test.RandomSource _randomSource;\n        private Opc.Ua.Test.TestDataGenerator _generator;\n        private Timer _simulationTimer;\n        private ushort _simulationInterval = 1000;\n        private bool _simulationEnabled = true;\n        private readonly List<BaseDataVariableState> _dynamicNodes;\n    }\n\n    public static class VariableExtensions\n    {\n        public static BaseDataVariableState MinimumSamplingInterval(this BaseDataVariableState variable, int minimumSamplingInterval)\n        {\n            variable.MinimumSamplingInterval = minimumSamplingInterval;\n            return variable;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Reference/ReferenceServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Reference\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class ReferenceServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.ReferenceApplications\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new ReferenceNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Reference/ReferenceServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Reference\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.ReferenceApplications)]\n    public class ReferenceServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public ReferenceServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/ServerConsoleHost.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Services\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Furly.Exceptions;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Configuration;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Console host for servers\n    /// </summary>\n    public sealed class ServerConsoleHost : IServerHost\n    {\n        /// <inheritdoc/>\n        public X509Certificate2 Certificate { get; private set; }\n        /// <inheritdoc/>\n        public string PkiRootPath { get; set; }\n        /// <inheritdoc/>\n        public bool AutoAccept { get; set; }\n        /// <inheritdoc/>\n        public string HostName { get; set; }\n        /// <inheritdoc/>\n        public List<string> AlternativeHosts { get; set; }\n        /// <inheritdoc/>\n        public string UriPath { get; set; }\n        /// <inheritdoc/>\n        public string CertStoreType { get; set; }\n\n        /// <summary>\n        /// Get access to the server\n        /// </summary>\n        public ITestServer TestServer => _server as ITestServer;\n\n        /// <summary>\n        /// Create server console host\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"logger\"></param>\n        public ServerConsoleHost(IServerFactory factory, ILogger<ServerConsoleHost> logger)\n        {\n            _instance = Guid.NewGuid().ToString();\n            _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n            _factory = factory ?? throw new ArgumentNullException(nameof(factory));\n        }\n\n        /// <inheritdoc/>\n        public async Task StopAsync()\n        {\n            if (_server != null)\n            {\n                await _lock.WaitAsync().ConfigureAwait(false);\n                try\n                {\n#pragma warning disable CA1508 // Avoid dead conditional code\n                    if (_server != null)\n                    {\n                        _logger.StoppingServer(this);\n                        try\n                        {\n                            _server.Stop();\n                        }\n                        catch (OperationCanceledException) { }\n                        catch (Exception se)\n                        {\n                            _logger.ServerStopError(se, this);\n                        }\n                        _server.Dispose();\n                        _logger.ServerStopped(this);\n                    }\n#pragma warning restore CA1508 // Avoid dead conditional code\n                }\n                catch (Exception ce)\n                {\n                    _logger.StoppingError(ce, this);\n                }\n                finally\n                {\n                    _server = null;\n                    Certificate = null;\n                    _lock.Release();\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task AddReverseConnectionAsync(Uri client, int maxSessionCount)\n        {\n            await _lock.WaitAsync().ConfigureAwait(false);\n            try\n            {\n                if (_server is ReverseConnectServer server)\n                {\n                    server.AddReverseConnection(client, maxSessionCount: maxSessionCount);\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.AddReverseConnectionError(ex, this);\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task RemoveReverseConnectionAsync(Uri client)\n        {\n            await _lock.WaitAsync().ConfigureAwait(false);\n            try\n            {\n                if (_server is ReverseConnectServer server)\n                {\n                    server.RemoveReverseConnection(client);\n                }\n            }\n            catch (Exception ex)\n            {\n                _logger.RemoveReverseConnectionError(ex, this);\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public async Task StartAsync(IEnumerable<int> ports)\n        {\n            if (_server == null)\n            {\n                await _lock.WaitAsync().ConfigureAwait(false);\n                try\n                {\n#pragma warning disable CA1508 // Avoid dead conditional code\n                    if (_server == null)\n                    {\n                        await StartServerInternalAsync(ports).ConfigureAwait(false);\n                        _ports = ports.ToArray();\n                        return;\n                    }\n#pragma warning restore CA1508 // Avoid dead conditional code\n                }\n                catch (Exception ex)\n                {\n                    _logger.StartingError(ex, this);\n                    _server?.Dispose();\n                    _server = null;\n                    throw;\n                }\n                finally\n                {\n                    _lock.Release();\n                }\n            }\n            throw new InvalidOperationException($\"Server {this} already started\");\n        }\n\n        /// <inheritdoc/>\n        public async Task RestartAsync(Func<Task> predicate)\n        {\n            await _lock.WaitAsync().ConfigureAwait(false);\n            try\n            {\n                if (_server != null)\n                {\n                    _server.Stop();\n                    _server.Dispose();\n\n                    if (predicate != null)\n                    {\n                        await predicate().ConfigureAwait(false);\n                    }\n\n                    _logger.Restarting(this);\n                    Debug.Assert(_ports != null);\n\n                    await StartServerInternalAsync(_ports).ConfigureAwait(false);\n                }\n            }\n            finally\n            {\n                _lock.Release();\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            StopAsync().WaitAsync(TimeSpan.FromMinutes(1)).GetAwaiter().GetResult();\n            _lock.Dispose();\n        }\n\n        /// <inheritdoc/>\n        public override string ToString()\n        {\n            return _instance;\n        }\n\n        /// <summary>\n        /// Start server\n        /// </summary>\n        /// <param name=\"ports\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"InvalidConfigurationException\"></exception>\n        private async Task StartServerInternalAsync(IEnumerable<int> ports)\n        {\n            ApplicationInstance.MessageDlg = new DummyDialog();\n\n            var config = _factory.CreateServer(ports, PkiRootPath, out _server,\n                listenHostName: HostName,\n                alternativeAddresses: AlternativeHosts,\n                path: UriPath,\n                certStoreType: CertStoreType,\n                configure: configuration => configuration.DiagnosticsEnabled = true);\n            _logger.ServerCreated(this);\n\n            config.SecurityConfiguration.AutoAcceptUntrustedCertificates = AutoAccept;\n            config = ApplicationInstance.FixupAppConfig(config);\n\n            _logger.ValidatingConfig(this);\n            await config.ValidateAsync(config.ApplicationType).ConfigureAwait(false);\n\n            _logger.InitializingCertValidation(this);\n            var application = new ApplicationInstance(config);\n\n            // check the application certificate.\n            var hasAppCertificate = await application.CheckApplicationInstanceCertificatesAsync(\n                silent: true).ConfigureAwait(false);\n            if (!hasAppCertificate)\n            {\n                _logger.CertValidationError(this);\n                throw new InvalidConfigurationException(\"Application instance certificate invalid!\");\n            }\n\n            config.CertificateValidator.CertificateValidation += (v, e) =>\n            {\n                if (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted)\n                {\n                    e.Accept = AutoAccept;\n                    _logger.CertificateAction(this,\n                        e.Accept ? \"Accepted\" : \"Rejected\", e.Certificate.Subject);\n                }\n            };\n\n            await config.CertificateValidator.UpdateAsync(config).ConfigureAwait(false);\n\n            // Set Certificate\n            try\n            {\n                // just take the public key\n                Certificate = X509CertificateLoader.LoadCertificate(\n                    config.SecurityConfiguration.ApplicationCertificate.Certificate.RawData);\n            }\n            catch\n            {\n                Certificate = config.SecurityConfiguration.ApplicationCertificate.Certificate;\n            }\n\n            _logger.StartingServer();\n            // start the server.\n            await application.StartAsync(_server).ConfigureAwait(false);\n\n            foreach (var ep in config.ServerConfiguration.BaseAddresses)\n            {\n                _logger.ServerEndpoint(this, ep);\n            }\n\n            _logger.ServerStarted(this);\n        }\n\n        /// <inheritdoc/>\n        private sealed class DummyDialog : IApplicationMessageDlg\n        {\n            /// <inheritdoc/>\n            public override void Message(string text, bool ask) { }\n            /// <inheritdoc/>\n            public override Task<bool> ShowAsync()\n            {\n                return Task.FromResult(true);\n            }\n        }\n\n        private readonly string _instance;\n        private readonly ILogger _logger;\n        private readonly IServerFactory _factory;\n        private readonly SemaphoreSlim _lock = new(1, 1);\n        private ServerBase _server;\n        private int[] _ports;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for ServerConsoleHost\n    /// </summary>\n    internal static partial class ServerConsoleHostLogging\n    {\n        private const int EventClass = 100;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Stopping server {Instance}.\")]\n        public static partial void StoppingServer(this ILogger logger, object instance);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Error,\n            Message = \"Server {Instance} not cleanly stopped.\")]\n        public static partial void ServerStopError(this ILogger logger, Exception ex, object instance);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Server {Instance} stopped.\")]\n        public static partial void ServerStopped(this ILogger logger, object instance);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"Stopping server {Instance} caused exception.\")]\n        public static partial void StoppingError(this ILogger logger, Exception ex, object instance);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Error,\n            Message = \"Adding reverse connection in server {Instance} failed.\")]\n        public static partial void AddReverseConnectionError(this ILogger logger, Exception ex, object instance);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"Remove reverse connection in server {Instance} failed.\")]\n        public static partial void RemoveReverseConnectionError(this ILogger logger, Exception ex, object instance);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Error,\n            Message = \"Starting server {Instance} caused exception.\")]\n        public static partial void StartingError(this ILogger logger, Exception ex, object instance);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"Restarting server {Instance}...\")]\n        public static partial void Restarting(this ILogger logger, object instance);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"Server {Instance} created...\")]\n        public static partial void ServerCreated(this ILogger logger, object instance);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"Server {Instance} - Validate configuration...\")]\n        public static partial void ValidatingConfig(this ILogger logger, object instance);\n\n        [LoggerMessage(EventId = EventClass + 11, Level = LogLevel.Information,\n            Message = \"Server {Instance} - Initialize certificate validation...\")]\n        public static partial void InitializingCertValidation(this ILogger logger, object instance);\n\n        [LoggerMessage(EventId = EventClass + 12, Level = LogLevel.Error,\n            Message = \"Server {Instance} - Failed validating own certificate!\")]\n        public static partial void CertValidationError(this ILogger logger, object instance);\n\n        [LoggerMessage(EventId = EventClass + 13, Level = LogLevel.Information,\n            Message = \"Server {Instance} - {Action} Certificate {Subject}\")]\n        public static partial void CertificateAction(this ILogger logger, object instance, string action, string subject);\n\n        [LoggerMessage(EventId = EventClass + 14, Level = LogLevel.Information,\n            Message = \"Starting server ...\")]\n        public static partial void StartingServer(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 15, Level = LogLevel.Information,\n            Message = \"Server {Instance} - Listening on {Endpoint}\")]\n        public static partial void ServerEndpoint(this ILogger logger, object instance, string endpoint);\n\n        [LoggerMessage(EventId = EventClass + 16, Level = LogLevel.Information,\n            Message = \"Server {Instance} started.\")]\n        public static partial void ServerStarted(this ILogger logger, object instance);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/ServerFactory.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack.Sample\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Furly.Extensions.Utils;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Reflection;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using System.Xml;\n\n    /// <summary>\n    /// Server factory\n    /// </summary>\n    public sealed class ServerFactory : IServerFactory\n    {\n        /// <summary>\n        /// Whether to log status\n        /// </summary>\n        public bool LogStatus { get; set; }\n\n        /// <summary>\n        /// Whether to enable diagnostics\n        /// </summary>\n        public bool EnableDiagnostics { get; set; }\n\n        /// <summary>\n        /// Server factory\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"tempPath\"></param>\n        /// <param name=\"nodes\"></param>\n        public ServerFactory(ILogger<ServerFactory> logger, string tempPath,\n            IEnumerable<INodeManagerFactory> nodes)\n        {\n            _logger = logger ?? throw new ArgumentNullException(nameof(logger));\n            _nodes = nodes ?? throw new ArgumentNullException(nameof(nodes));\n            _tempPath = tempPath;\n        }\n\n        /// <summary>\n        /// Full set of servers\n        /// </summary>\n        /// <param name=\"logger\"></param>\n        /// <param name=\"tempPath\"></param>\n        /// <param name=\"scaleunits\"></param>\n        public ServerFactory(ILogger<ServerFactory> logger, string tempPath,\n            uint scaleunits = 0) :\n            this(logger, tempPath, new List<INodeManagerFactory>\n            {\n                new TestData.TestDataServer(),\n                new MemoryBuffer.MemoryBufferServer(),\n                new Boiler.BoilerServer(),\n                new Vehicles.VehiclesServer(),\n                new Reference.ReferenceServer(),\n                new HistoricalEvents.HistoricalEventsServer(new TimeService()),\n                new HistoricalAccess.HistoricalAccessServer(new TimeService()),\n                new Views.ViewsServer(),\n                new DataAccess.DataAccessServer(),\n                new Alarms.AlarmConditionServer(new TimeService()),\n                new SimpleEvents.SimpleEventsServer(),\n                new Plc.PlcServer(new TimeService(), logger, scaleunits),\n                new Isa95Jobs.Isa95JobControlServer()\n                // new FileSystem.FileSystemServer(),\n                // new Asset.AssetServer(logger),\n                // new PerfTest.PerfTestServer(),\n            })\n        {\n        }\n\n        /// <inheritdoc/>\n        public ApplicationConfiguration CreateServer(IEnumerable<int> ports,\n            string pkiRootPath, out ServerBase server, string listenHostName,\n            IEnumerable<string> alternativeAddresses, string path,\n            string certStoreType, Action<ServerConfiguration> configure)\n        {\n            server = new Server(LogStatus, _nodes, _logger);\n            return Server.CreateServerConfiguration(_tempPath,\n                ports, listenHostName, alternativeAddresses, path,\n                pkiRootPath, certStoreType, EnableDiagnostics, configure);\n        }\n\n        /// <inheritdoc/>\n        private sealed class Server : ReverseConnectServer, ITestServer\n        {\n            /// <inheritdoc/>\n            public string PublishedNodesJson => _plc.GetPnJson();\n\n            /// <inheritdoc/>\n            public bool Chaos\n            {\n                get\n                {\n                    return _chaosMode != null;\n                }\n                set\n                {\n                    if (value)\n                    {\n                        if (_chaosMode == null)\n                        {\n                            _chaosCts = new CancellationTokenSource();\n                            _chaosMode = ChaosAsync(_chaosCts.Token);\n                        }\n                    }\n                    else if (_chaosMode != null)\n                    {\n                        _chaosCts.Cancel();\n                        _chaosMode.GetAwaiter().GetResult();\n                        _chaosCts.Dispose();\n                        _chaosMode = null;\n                        _chaosCts = null;\n                    }\n                }\n            }\n\n            /// <inheritdoc/>\n            public int InjectErrorResponseRate { get; set; }\n\n            /// <summary>\n            /// Create server\n            /// </summary>\n            /// <param name=\"logStatus\"></param>\n            /// <param name=\"nodes\"></param>\n            /// <param name=\"logger\"></param>\n            public Server(bool logStatus, IEnumerable<INodeManagerFactory> nodes,\n                ILogger logger)\n            {\n                _logger = logger;\n                _logStatus = logStatus;\n                _nodes = nodes;\n            }\n\n            /// <summary>\n            /// Create configuration\n            /// </summary>\n            /// <param name=\"curDir\"></param>\n            /// <param name=\"ports\"></param>\n            /// <param name=\"hostName\"></param>\n            /// <param name=\"alternativeAddresses\"></param>\n            /// <param name=\"path\"></param>\n            /// <param name=\"pkiRootPath\"></param>\n            /// <param name=\"certStoreType\"></param>\n            /// <param name=\"enableDiagnostics\"></param>\n            /// <param name=\"configure\"></param>\n            /// <returns></returns>\n            public static ApplicationConfiguration CreateServerConfiguration(string curDir,\n                IEnumerable<int> ports, string hostName, IEnumerable<string> alternativeAddresses,\n                string path, string pkiRootPath, string certStoreType, bool enableDiagnostics = false,\n                Action<ServerConfiguration> configure = null)\n            {\n                var extensions = new List<object>\n                {\n                    new MemoryBuffer.MemoryBufferConfiguration\n                    {\n                        Buffers =\n                        [\n                            new MemoryBuffer.MemoryBufferInstance\n                            {\n                                Name = \"UInt32\",\n                                TagCount = 10000,\n                                DataType = \"UInt32\"\n                            },\n                            new MemoryBuffer.MemoryBufferInstance\n                            {\n                                Name = \"Double\",\n                                TagCount = 100,\n                                DataType = \"Double\"\n                            }\n                        ]\n                    },\n\n                    // ...\n\n                    new FolderConfiguration\n                    {\n                        CurrentDirectory = curDir\n                    }\n                };\n                certStoreType ??= CertificateStoreType.Directory;\n                if (string.IsNullOrEmpty(pkiRootPath))\n                {\n                    pkiRootPath = \"pki\";\n                }\n                path ??= \"/UA/SampleServer\";\n                if (path.Length > 0 && !path.StartsWith('/'))\n                {\n                    path = \"/\" + path;\n                }\n                var configuration = new ApplicationConfiguration\n                {\n                    ApplicationName = \"UA Core Sample Server\",\n                    ApplicationType = ApplicationType.Server,\n                    ApplicationUri = $\"urn:{hostName ?? Utils.GetHostName()}:OPCFoundation:CoreSampleServer\",\n                    Extensions = [.. extensions.Select(XmlElementEx.SerializeObject)],\n\n                    ProductUri = \"http://opcfoundation.org/UA/SampleServer\",\n                    SecurityConfiguration = new SecurityConfiguration\n                    {\n                        ApplicationCertificate = new CertificateIdentifier\n                        {\n                            StoreType = certStoreType,\n                            StorePath = $\"{pkiRootPath}/own\",\n                            SubjectName = \"UA Core Sample Server\"\n                        },\n                        TrustedPeerCertificates = new CertificateTrustList\n                        {\n                            StoreType = certStoreType,\n                            StorePath = $\"{pkiRootPath}/trusted\"\n                        },\n                        TrustedIssuerCertificates = new CertificateTrustList\n                        {\n                            StoreType = certStoreType,\n                            StorePath = $\"{pkiRootPath}/issuer\"\n                        },\n                        RejectedCertificateStore = new CertificateTrustList\n                        {\n                            StoreType = certStoreType,\n                            StorePath = $\"{pkiRootPath}/rejected\"\n                        },\n                        MinimumCertificateKeySize = 1024,\n                        RejectSHA1SignedCertificates = false,\n                        AutoAcceptUntrustedCertificates = true,\n                        AddAppCertToTrustedStore = true,\n                        RejectUnknownRevocationStatus = true\n                    },\n                    TransportConfigurations = [],\n                    TransportQuotas = new TransportQuotas\n                    {\n                        SecurityTokenLifetime = 60 * 60 * 1000,\n                        ChannelLifetime = 300 * 1000,\n                        MaxBufferSize = (64 * 1024) - 1,\n                        MaxMessageSize = 4 * 1024 * 1024,\n                        MaxArrayLength = (64 * 1024) - 1,\n                        MaxByteStringLength = 1024 * 1024,\n                        MaxStringLength = (128 * 1024) - 256,\n                        OperationTimeout = 120 * 1000\n                    },\n                    ServerConfiguration = new ServerConfiguration\n                    {\n                        // Sample server specific\n                        ServerProfileArray = [\n                             \"Standard UA Server Profile\",\n                             \"Data Access Server Facet\",\n                             \"Method Server Facet\"\n                        ],\n                        ServerCapabilities = [\n                            \"DA\"\n                        ],\n                        SupportedPrivateKeyFormats = [\n                            \"PFX\", \"PEM\"\n                        ],\n\n                        ReverseConnect = new ReverseConnectServerConfiguration\n                        {\n                            ConnectInterval = 1000,\n                            ConnectTimeout = 120000,\n                            RejectTimeout = 120000\n                        },\n\n                        NodeManagerSaveFile = \"nodes.xml\",\n                        DiagnosticsEnabled = enableDiagnostics,\n                        ShutdownDelay = 0,\n\n                        // Runtime configuration\n                        BaseAddresses = [.. ports\n                            .Distinct()\n                            .Select(p => $\"opc.tcp://{hostName ?? \"localhost\"}:{p}{path}\")],\n                        AlternateBaseAddresses = alternativeAddresses == null ? null :\n                            [.. alternativeAddresses.Distinct().SelectMany(e => ports\n                                .Distinct()\n                                .Select(p => $\"opc.tcp://{e}:{p}{path}\"))],\n                        SecurityPolicies = [\n                            new ServerSecurityPolicy {\n                                SecurityMode = MessageSecurityMode.Sign,\n                                SecurityPolicyUri = SecurityPolicies.Basic256Sha256\n                            },\n                            new ServerSecurityPolicy {\n                                SecurityMode = MessageSecurityMode.SignAndEncrypt,\n                                SecurityPolicyUri =SecurityPolicies.Basic256Sha256\n                            },\n                            new ServerSecurityPolicy {\n                                SecurityMode = MessageSecurityMode.None,\n                                SecurityPolicyUri = SecurityPolicies.None\n                            }\n                        ],\n                        UserTokenPolicies = [\n                            new UserTokenPolicy {\n                                TokenType = UserTokenType.Anonymous,\n                                SecurityPolicyUri = SecurityPolicies.None\n                            },\n                            new UserTokenPolicy {\n                                TokenType = UserTokenType.UserName\n                            },\n                            new UserTokenPolicy {\n                                TokenType = UserTokenType.Certificate\n                            }\n                        ],\n\n                        MinRequestThreadCount = 200,\n                        MaxRequestThreadCount = 2000,\n                        MaxQueuedRequestCount = 2000000,\n\n                        MaxSessionCount = 30,\n                        MinSessionTimeout = 10000,\n                        MaxSessionTimeout = 3600000,\n                        MaxBrowseContinuationPoints = 1000,\n                        MaxQueryContinuationPoints = 1000,\n                        MaxHistoryContinuationPoints = 1000,\n                        MaxRequestAge = 600000,\n                        MinPublishingInterval = 100,\n                        MaxPublishingInterval = 3600000,\n                        PublishingResolution = 50,\n                        MaxSubscriptionLifetime = 3600000,\n                        MaxMessageQueueSize = 100,\n                        MaxNotificationQueueSize = 100,\n                        MaxNotificationsPerPublish = 1000,\n                        MinMetadataSamplingInterval = 1000,\n                        MaxPublishRequestCount = 8,\n                        MaxSubscriptionCount = 30,\n                        MaxEventQueueSize = 10000,\n                        MinSubscriptionLifetime = 10000,\n\n                        // Do not register with LDS\n                        MaxRegistrationInterval = 0, // TODO\n                        RegistrationEndpoint = null\n                    },\n                    TraceConfiguration = new TraceConfiguration\n                    {\n                        TraceMasks = 1\n                    }\n                };\n                configure?.Invoke(configuration.ServerConfiguration);\n                return configuration;\n            }\n\n            private NodeId[] Sessions => CurrentInstance.SessionManager\n                .GetSessions()\n                .Select(s => s.Id)\n                .ToArray();\n\n            /// <inheritdoc/>\n            public void CloseSessions(bool deleteSubscriptions = false)\n            {\n                foreach (var session in Sessions)\n                {\n                    CurrentInstance.CloseSession(null, session, deleteSubscriptions);\n                }\n            }\n\n            private uint[] Subscriptions => CurrentInstance.SubscriptionManager\n                .GetSubscriptions()\n                .Select(s => s.Id)\n                .ToArray();\n\n            /// <inheritdoc/>\n            public void CloseSubscriptions(bool notifyExpiration = false)\n            {\n                foreach (var subscription in Subscriptions)\n                {\n                    CloseSubscription(subscription, notifyExpiration);\n                }\n            }\n\n            /// <inheritdoc/>\n            public void CloseSubscription(uint subscriptionId, bool notifyExpiration)\n            {\n                if (notifyExpiration)\n                {\n                    NotifySubscriptionExpiration(subscriptionId);\n                }\n                CurrentInstance.DeleteSubscription(subscriptionId);\n            }\n\n            /// <inheritdoc/>\n            public void NotifySubscriptionExpiration(uint subscriptionId)\n            {\n                try\n                {\n                    var subscription = CurrentInstance.SubscriptionManager\n                        .GetSubscriptions()\n                        .FirstOrDefault(s => s.Id == subscriptionId);\n                    if (subscription != null)\n                    {\n                        var expireMethod = typeof(SubscriptionManager).GetMethod(\"SubscriptionExpired\",\n                            BindingFlags.NonPublic | BindingFlags.Instance);\n                        expireMethod?.Invoke(\n                            CurrentInstance.SubscriptionManager, new object[] { subscription });\n                    }\n                }\n                catch\n                {\n                    // Nothing to do\n                }\n            }\n\n            /// <inheritdoc/>\n            protected override ServerProperties LoadServerProperties()\n            {\n                return new ServerProperties\n                {\n                    ManufacturerName = \"OPC Foundation\",\n                    ProductName = \"OPC UA Sample Servers\",\n                    ProductUri = \"http://opcfoundation.org/UA/Samples/v1.0\",\n                    SoftwareVersion = Utils.GetAssemblySoftwareVersion(),\n                    BuildNumber = Utils.GetAssemblyBuildNumber(),\n                    BuildDate = Utils.GetAssemblyTimestamp()\n                };\n            }\n\n            /// <inheritdoc/>\n            protected override MasterNodeManager CreateMasterNodeManager(\n                IServerInternal server, ApplicationConfiguration configuration)\n            {\n                _logger.CreatingNodeManagers();\n                var nodeManagers = _nodes\n                    .Select(n => n.Create(server, configuration))\n                    .ToArray();\n\n                _plc = nodeManagers.OfType<Plc.PlcNodeManager>().FirstOrDefault();\n                return new MasterNodeManager(server, configuration, null, nodeManagers);\n            }\n\n            /// <inheritdoc/>\n            protected override void OnServerStopping()\n            {\n                _logger.ServerStopping();\n                base.OnServerStopping();\n                _cts.Cancel();\n                _statusLogger?.Wait();\n            }\n\n            /// <inheritdoc/>\n            protected override void OnServerStarted(IServerInternal server)\n            {\n                // start the status thread\n                _cts = new CancellationTokenSource();\n                if (_logStatus)\n                {\n                    _statusLogger = Task.Run(() => LogStatusAsync(_cts.Token));\n\n                    // print notification on session events\n                    CurrentInstance.SessionManager.SessionActivated += OnEvent;\n                    CurrentInstance.SessionManager.SessionClosing += OnEvent;\n                    CurrentInstance.SessionManager.SessionCreated += OnEvent;\n                }\n                base.OnServerStarted(server);\n                // request notifications when the user identity is changed. all valid users are accepted by default.\n                server.SessionManager.ImpersonateUser += SessionManager_ImpersonateUser;\n            }\n\n            /// <inheritdoc/>\n            protected override void OnServerStarting(ApplicationConfiguration configuration)\n            {\n                _logger.ServerStarting();\n                CreateUserIdentityValidators(configuration);\n                base.OnServerStarting(configuration);\n            }\n\n            /// <inheritdoc/>\n            protected override void OnNodeManagerStarted(IServerInternal server)\n            {\n                _logger.NodeManagersStarted();\n                base.OnNodeManagerStarted(server);\n            }\n\n            /// <inheritdoc/>\n            protected override void Dispose(bool disposing)\n            {\n                base.Dispose(disposing);\n                _cts?.Dispose();\n            }\n\n            /// <summary>\n            /// Handle session event by logging status\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"reason\"></param>\n            private void OnEvent(ISession session, SessionEventReason reason)\n            {\n                _lastEventTime = DateTime.UtcNow;\n                LogSessionStatus(session, reason.ToString());\n            }\n\n            /// <summary>\n            /// Continously log session status if not logged during events\n            /// </summary>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n            private async Task LogStatusAsync(CancellationToken ct)\n            {\n                while (!ct.IsCancellationRequested)\n                {\n                    if (DateTime.UtcNow - _lastEventTime > TimeSpan.FromMilliseconds(6000))\n                    {\n                        _lastEventTime = DateTime.UtcNow;\n                        foreach (var session in CurrentInstance.SessionManager.GetSessions())\n                        {\n                            LogSessionStatus(session, \"-Status-\", _lastEventTime);\n                        }\n                    }\n                    await Try.Async(() => Task.Delay(1000, ct)).ConfigureAwait(false);\n                }\n            }\n\n            /// <summary>\n            /// Helper to log session status\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"reason\"></param>\n            /// <param name=\"lastContact\"></param>\n            private void LogSessionStatus(ISession session, string reason, DateTime? lastContact = null)\n            {\n                lock (session.DiagnosticsLock)\n                {\n                    if (lastContact.HasValue)\n                    {\n                        _logger.SessionLastContact(reason, session.SessionDiagnostics.SessionName, lastContact.Value);\n                    }\n                    else\n                    {\n                        _logger.SessionStatus(reason, session.SessionDiagnostics.SessionName,\n                            session.Identity.DisplayName ?? \"session\",\n                            session.Id);\n                    }\n                }\n            }\n            /// <summary>\n            /// Creates the objects used to validate the user identity tokens supported by the server.\n            /// </summary>\n            /// <param name=\"configuration\"></param>\n            private void CreateUserIdentityValidators(ApplicationConfiguration configuration)\n            {\n                for (var ii = 0; ii < configuration.ServerConfiguration.UserTokenPolicies.Count; ii++)\n                {\n                    var policy = configuration.ServerConfiguration.UserTokenPolicies[ii];\n\n                    // ignore policies without an explicit id.\n                    if (string.IsNullOrEmpty(policy.PolicyId))\n                    {\n                        continue;\n                    }\n\n                    // create a validator for an issued token policy.\n                    if (policy.TokenType == UserTokenType.IssuedToken)\n                    {\n                        // the name of the element in the configuration file.\n                        var qname = new XmlQualifiedName(policy.PolicyId, Namespaces.OpcUa);\n\n                        // find the id for the issuer certificate.\n                        var id = configuration.ParseExtension<CertificateIdentifier>(qname);\n\n                        if (id == null)\n                        {\n                            Utils.Trace(\n                                Utils.TraceMasks.Error,\n                                \"Could not load CertificateIdentifier for UserTokenPolicy {0}\",\n                                policy.PolicyId);\n\n                            continue;\n                        }\n                    }\n\n                    // create a validator for a certificate token policy.\n                    if (policy.TokenType == UserTokenType.Certificate)\n                    {\n                        // the name of the element in the configuration file.\n                        var qname = new XmlQualifiedName(policy.PolicyId, Namespaces.OpcUa);\n\n                        // find the location of the trusted issuers.\n                        var trustedIssuers = configuration.ParseExtension<CertificateTrustList>(qname);\n\n                        if (trustedIssuers == null)\n                        {\n                            Utils.Trace(\n                                Utils.TraceMasks.Error,\n                                \"Could not load CertificateTrustList for UserTokenPolicy {0}\",\n                                policy.PolicyId);\n\n                            continue;\n                        }\n\n                        // trusts any certificate in the trusted people store.\n                        _certificateValidator = CertificateValidator.GetChannelValidator();\n                    }\n                }\n            }\n\n            /// <summary>\n            /// Called when a client tries to change its user identity.\n            /// </summary>\n            /// <param name=\"session\"></param>\n            /// <param name=\"args\"></param>\n            /// <exception cref=\"ArgumentNullException\"><paramref name=\"session\"/> is <c>null</c>.</exception>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            private void SessionManager_ImpersonateUser(ISession session,\n                ImpersonateEventArgs args)\n            {\n                ArgumentNullException.ThrowIfNull(session);\n\n                if (args.NewIdentity is AnonymousIdentityToken guest)\n                {\n                    args.Identity = new UserIdentity(guest);\n                    Utils.Trace(\"Guest access accepted: {0}\", args.Identity.DisplayName);\n                    return;\n                }\n\n                // check for a user name token.\n                if (args.NewIdentity is UserNameIdentityToken userNameToken)\n                {\n                    var admin = VerifyPassword(userNameToken.UserName, userNameToken.DecryptedPassword);\n                    args.Identity = new UserIdentity(userNameToken);\n                    if (admin)\n                    {\n                        args.Identity = new SystemConfigurationIdentity(args.Identity);\n                    }\n                    Utils.Trace(\"UserName Token accepted: {0}\", args.Identity.DisplayName);\n                    return;\n                }\n\n                // check for x509 user token.\n                if (args.NewIdentity is X509IdentityToken x509Token)\n                {\n                    var admin = VerifyCertificate(x509Token.Certificate);\n                    args.Identity = new UserIdentity(x509Token);\n                    if (admin)\n                    {\n                        args.Identity = new SystemConfigurationIdentity(args.Identity);\n                    }\n                    Utils.Trace(\"X509 Token accepted: {0}\", args.Identity.DisplayName);\n                    return;\n                }\n\n                // check for x509 user token.\n                if (args.NewIdentity is IssuedIdentityToken wssToken)\n                {\n                    var admin = VerifyToken(wssToken);\n                    args.Identity = new UserIdentity(wssToken);\n                    if (admin)\n                    {\n                        args.Identity = new SystemConfigurationIdentity(args.Identity);\n                    }\n                    Utils.Trace(\"Issued Token accepted: {0}\", args.Identity.DisplayName);\n                    return;\n                }\n\n                // construct translation object with default text.\n                var info = new TranslationInfo(\"InvalidToken\", \"en-US\",\n                    \"Specified token is not valid.\");\n                // create an exception with a vendor defined sub-code.\n                throw new ServiceResultException(new ServiceResult(\n                    StatusCodes.BadIdentityTokenRejected, \"Bad token\",\n                    kServerNamespaceUri, new LocalizedText(info)));\n            }\n\n            /// <summary>\n            /// Validates the token\n            /// </summary>\n            /// <param name=\"wssToken\"></param>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            private static bool VerifyToken(IssuedIdentityToken wssToken)\n            {\n                if ((wssToken.TokenData?.Length ?? 0) == 0)\n                {\n                    var info = new TranslationInfo(\"InvalidToken\", \"en-US\",\n                        \"Specified token is empty.\");\n                    // create an exception with a vendor defined sub-code.\n                    throw new ServiceResultException(new ServiceResult(\n                        StatusCodes.BadIdentityTokenRejected, \"Bad token\",\n                        kServerNamespaceUri, new LocalizedText(info)));\n                }\n                return false;\n            }\n\n            /// <summary>\n            /// Validates the password for a username token.\n            /// </summary>\n            /// <param name=\"userName\"></param>\n            /// <param name=\"password\"></param>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            private static bool VerifyPassword(string userName, string password)\n            {\n                if (string.IsNullOrEmpty(password))\n                {\n                    // construct translation object with default text.\n                    var info = new TranslationInfo(\n                        \"InvalidPassword\", \"en-US\",\n                        \"Specified password is not valid for user '{0}'.\",\n                        userName);\n                    // create an exception with a vendor defined sub-code.\n                    throw new ServiceResultException(new ServiceResult(\n                        StatusCodes.BadIdentityTokenRejected, \"InvalidPassword\",\n                        kServerNamespaceUri, new LocalizedText(info)));\n                }\n\n                if (StringComparer.OrdinalIgnoreCase.Equals(userName, \"test\") && password == \"test\")\n                {\n                    // Testing purposes only\n                    return true;\n                }\n                return false;\n            }\n\n            /// <summary>\n            /// Verifies that a certificate user token is trusted.\n            /// </summary>\n            /// <param name=\"certificate\"></param>\n            /// <exception cref=\"ServiceResultException\"></exception>\n            private bool VerifyCertificate(X509Certificate2 certificate)\n            {\n                try\n                {\n                    if (_certificateValidator != null)\n                    {\n                        _certificateValidator.Validate(certificate);\n                    }\n                    else\n                    {\n                        CertificateValidator.Validate(certificate);\n                    }\n\n                    // determine if self-signed.\n                    var isSelfSigned = X509Utils.CompareDistinguishedName(\n                        certificate.Subject, certificate.Issuer);\n\n                    // do not allow self signed application certs as user token\n                    if (isSelfSigned && X509Utils.HasApplicationURN(certificate))\n                    {\n                        throw new ServiceResultException(StatusCodes.BadCertificateUseNotAllowed);\n                    }\n                    return false;\n                }\n                catch (Exception e)\n                {\n                    TranslationInfo info;\n                    StatusCode result = StatusCodes.BadIdentityTokenRejected;\n                    if (e is ServiceResultException se &&\n                        se.StatusCode == StatusCodes.BadCertificateUseNotAllowed)\n                    {\n                        info = new TranslationInfo(\n                            \"InvalidCertificate\",\n                            \"en-US\",\n                            \"'{0}' is an invalid user certificate.\",\n                            certificate.Subject);\n\n                        result = StatusCodes.BadIdentityTokenInvalid;\n                    }\n                    else\n                    {\n                        // construct translation object with default text.\n                        info = new TranslationInfo(\n                            \"UntrustedCertificate\",\n                            \"en-US\",\n                            \"'{0}' is not a trusted user certificate.\",\n                            certificate.Subject);\n                    }\n\n                    // create an exception with a vendor defined sub-code.\n                    throw new ServiceResultException(new ServiceResult(\n                        result, info.Key, kServerNamespaceUri, new LocalizedText(info)));\n                }\n            }\n\n            /// <summary>\n            /// Chaos monkey mode\n            /// </summary>\n            /// <param name=\"ct\"></param>\n            /// <returns></returns>\n#pragma warning disable CA5394 // Do not use insecure randomness\n            private async Task ChaosAsync(CancellationToken ct)\n            {\n                try\n                {\n                    while (!ct.IsCancellationRequested)\n                    {\n                        await Task.Delay(TimeSpan.FromSeconds(Random.Shared.Next(10, 60)), ct).ConfigureAwait(false);\n                        Console.WriteLine(\"===================\\nCHAOS MONKEY TIME\\n===================\");\n                        Console.WriteLine($\"{Subscriptions.Length} subscriptions in {Sessions.Length} sessions!\");\n                        switch (Random.Shared.Next(0, 16))\n                        {\n                            case 0:\n                                Console.WriteLine(\"!!!!! Closing all sessions and associated subscriptions. !!!!!!\");\n                                CloseSessions(true);\n                                break;\n                            case 1:\n                                Console.WriteLine(\"!!!!! Closing all sessions. !!!!! \");\n                                CloseSessions(false);\n                                break;\n                            case 2:\n                                Console.WriteLine(\"!!!!! Notifying expiration and closing all subscriptions. !!!!! \");\n                                CloseSubscriptions(true);\n                                break;\n                            case 3:\n                                Console.WriteLine(\"!!!!! Closing all subscriptions. !!!!!\");\n                                CloseSubscriptions(false);\n                                break;\n                            case > 3 and < 8:\n                                var sessions = Sessions;\n                                if (sessions.Length == 0)\n                                {\n                                    break;\n                                }\n\n                                var session = sessions[Random.Shared.Next(0, sessions.Length)];\n                                var delete = Random.Shared.Next() % 2 == 0;\n                                Console.WriteLine($\"!!!!! Closing session {session} (delete subscriptions:{delete}). !!!!!\");\n                                CurrentInstance.CloseSession(null, session, delete);\n                                break;\n                            case > 10 and < 13:\n                                if (InjectErrorResponseRate != 0)\n                                {\n                                    break;\n                                }\n                                InjectErrorResponseRate = Random.Shared.Next(1, 20);\n                                var duration = TimeSpan.FromSeconds(Random.Shared.Next(10, 150));\n                                Console.WriteLine($\"!!!!! Injecting random errors every {InjectErrorResponseRate} \" +\n                                    $\"responses for {duration.TotalMicroseconds} ms. !!!!!\");\n                                _ = Task.Run(async () =>\n                                {\n                                    try\n                                    {\n                                        await Task.Delay(duration, ct).ConfigureAwait(false);\n                                    }\n                                    catch (OperationCanceledException) { }\n                                    InjectErrorResponseRate = 0;\n                                }, ct);\n                                break;\n                            default:\n                                var subscriptions = Subscriptions;\n                                if (subscriptions.Length == 0)\n                                {\n                                    break;\n                                }\n\n                                var subscription = subscriptions[Random.Shared.Next(0, subscriptions.Length)];\n                                var notify = Random.Shared.Next() % 2 == 0;\n                                Console.WriteLine($\"!!!!! Closing subscription {subscription} (notify:{notify}). !!!!!\");\n                                CloseSubscription(subscription, notify);\n                                break;\n                        }\n                    }\n                }\n                catch (OperationCanceledException)\n                {\n                    // Nothing to do\n                }\n            }\n\n            private static readonly StatusCode[] kStatusCodes =\n            {\n                StatusCodes.BadCertificateInvalid,\n                StatusCodes.BadAlreadyExists,\n                StatusCodes.BadNoSubscription,\n                StatusCodes.BadSecureChannelClosed,\n                StatusCodes.BadSessionClosed,\n                StatusCodes.BadSessionIdInvalid,\n                StatusCodes.BadSessionIdInvalid,\n                StatusCodes.BadSessionIdInvalid,\n                StatusCodes.BadSessionIdInvalid,\n                StatusCodes.BadSessionIdInvalid,\n                StatusCodes.BadSessionIdInvalid,\n                StatusCodes.BadSessionIdInvalid,\n                StatusCodes.BadSessionIdInvalid,\n                StatusCodes.BadConnectionClosed,\n                StatusCodes.BadServerHalted,\n                StatusCodes.BadNotConnected,\n                StatusCodes.BadNoCommunication,\n                StatusCodes.BadRequestInterrupted,\n                StatusCodes.BadRequestInterrupted,\n                StatusCodes.BadRequestInterrupted\n            };\n            protected override OperationContext ValidateRequest(RequestHeader requestHeader, RequestType requestType)\n            {\n                if (InjectErrorResponseRate != 0)\n                {\n                    var dice = Random.Shared.Next(0, kStatusCodes.Length * InjectErrorResponseRate);\n                    if (dice < kStatusCodes.Length)\n                    {\n                        Console.WriteLine(\"--------> Injecting error: {0}\", kStatusCodes[dice]);\n                        throw new ServiceResultException(kStatusCodes[dice]);\n                    }\n                }\n                return base.ValidateRequest(requestHeader, requestType);\n            }\n\n#pragma warning restore CA5394 // Do not use insecure randomness\n            private readonly ILogger _logger;\n            private readonly bool _logStatus;\n            private readonly IEnumerable<INodeManagerFactory> _nodes;\n            private Task _statusLogger;\n            private DateTime _lastEventTime;\n            private CancellationTokenSource _cts;\n            private ICertificateValidator _certificateValidator;\n            private CancellationTokenSource _chaosCts;\n            private Task _chaosMode;\n#pragma warning disable CA2213 // Disposable fields should be disposed\n            private Plc.PlcNodeManager _plc;\n#pragma warning restore CA2213 // Disposable fields should be disposed\n            private const string kServerNamespaceUri = \"http://opcfoundation.org/UA/Sample/\";\n        }\n\n        private readonly ILogger _logger;\n        private readonly IEnumerable<INodeManagerFactory> _nodes;\n        private readonly string _tempPath;\n    }\n\n    /// <summary>\n    /// Source-generated logging definitions for Server\n    /// </summary>\n    internal static partial class ServerLogging\n    {\n        private const int EventClass = 150;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Creating the Node Managers.\")]\n        public static partial void CreatingNodeManagers(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Debug,\n            Message = \"The server is stopping.\")]\n        public static partial void ServerStopping(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Debug,\n            Message = \"The server is starting.\")]\n        public static partial void ServerStarting(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Information,\n            Message = \"The NodeManagers have started.\")]\n        public static partial void NodeManagersStarted(this ILogger logger);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"{Reason,9}:{SessionName,20}:Last Event:{LastEvent:HH:mm:ss}\")]\n        public static partial void SessionLastContact(this ILogger logger,\n            string reason, string sessionName, DateTime lastEvent);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Information,\n            Message = \"{Reason,9}:{SessionName,20}:{DisplayName,20}:{SessionId}\")]\n        public static partial void SessionStatus(this ILogger logger,\n            string reason, string sessionName, string displayName, NodeId sessionId);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/SimpleEvents/SimpleEventsNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace SimpleEvents\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Reflection;\n    using System.Threading;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class SimpleEventsNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public SimpleEventsNodeManager(IServerInternal server, ApplicationConfiguration configuration) :\n            base(server, configuration)\n        {\n            SystemContext.NodeIdFactory = this;\n\n            // set one namespace for the type model and one names for dynamically created nodes.\n            var namespaceUrls = new string[1];\n            namespaceUrls[0] = Namespaces.SimpleEvents;\n            SetNamespaces(namespaceUrls);\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<SimpleEventsServerConfiguration>()\n                ?? new SimpleEventsServerConfiguration();\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _simulationTimer != null)\n            {\n                Utils.SilentDispose(_simulationTimer);\n                _simulationTimer = null;\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            return predefinedNodes;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                LoadPredefinedNodes(SystemContext, externalReferences);\n\n                // start a simulation that changes the values of the nodes.\n                _simulationTimer = new Timer(DoSimulation, null, kEventInterval, kEventInterval);\n            }\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                base.DeleteAddressSpace();\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // check for predefined nodes.\n                if (PredefinedNodes != null && PredefinedNodes.TryGetValue(nodeId, out var node))\n                {\n                    return new NodeHandle\n                    {\n                        NodeId = nodeId,\n                        Validated = true,\n                        Node = node\n                    };\n                }\n\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            // TBD\n\n            return null;\n        }\n\n        /// <summary>\n        /// Does the simulation.\n        /// </summary>\n        /// <param name=\"state\">The state.</param>\n        private void DoSimulation(object state)\n        {\n            try\n            {\n                for (var ii = 1; ii < 3; ii++)\n                {\n                    // construct translation object with default text.\n                    var info = new TranslationInfo(\n                        \"SystemCycleStarted\",\n                        \"en-US\",\n                        \"The system cycle '{0}' has started.\",\n                        ++_cycleId);\n\n                    // construct the event.\n                    var e = new SystemCycleStartedEventState(null);\n\n                    e.Initialize(\n                        SystemContext,\n                        null,\n                        (EventSeverity)ii,\n                        new LocalizedText(info));\n\n                    e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.SourceName, \"System\", false);\n                    e.SetChildValue(SystemContext, Opc.Ua.BrowseNames.SourceNode, Opc.Ua.ObjectIds.Server, false);\n                    e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.CycleId, NamespaceIndex), _cycleId.ToString(), false);\n\n                    var step = new CycleStepDataType\n                    {\n                        Name = \"Step 1\",\n                        Duration = 1000\n                    };\n\n                    e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.CurrentStep, NamespaceIndex), step, false);\n                    e.SetChildValue(SystemContext, new QualifiedName(BrowseNames.Steps, NamespaceIndex), new CycleStepDataType[] { step, step }, false);\n\n                    Server.ReportEvent(e);\n                }\n            }\n            catch (NullReferenceException)\n            {\n                // Stop simulation because the subscription is closed. This should be fixed in the server library.\n                _simulationTimer.Change(Timeout.Infinite, Timeout.Infinite);\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error during simulation.\");\n            }\n        }\n\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly SimpleEventsServerConfiguration _configuration;\n#pragma warning restore IDE0052 // Remove unread private members\n        private Timer _simulationTimer;\n        private int _cycleId;\n\n        private const int kEventInterval = 1000;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/SimpleEvents/SimpleEventsServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace SimpleEvents\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class SimpleEventsServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.SimpleEvents\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new SimpleEventsNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/SimpleEvents/SimpleEventsServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace SimpleEvents\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.SimpleEvents)]\n    public class SimpleEventsServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public SimpleEventsServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/AnalogArrayValueObjectState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n\n    public partial class AnalogArrayValueObjectState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            InitializeVariable(context, SByteValue, Variables.AnalogArrayValueObjectType_SByteValue);\n            InitializeVariable(context, ByteValue, Variables.AnalogArrayValueObjectType_ByteValue);\n            InitializeVariable(context, Int16Value, Variables.AnalogArrayValueObjectType_Int16Value);\n            InitializeVariable(context, UInt16Value, Variables.AnalogArrayValueObjectType_UInt16Value);\n            InitializeVariable(context, Int32Value, Variables.AnalogArrayValueObjectType_Int32Value);\n            InitializeVariable(context, UInt32Value, Variables.AnalogArrayValueObjectType_UInt32Value);\n            InitializeVariable(context, Int64Value, Variables.AnalogArrayValueObjectType_Int64Value);\n            InitializeVariable(context, UInt64Value, Variables.AnalogArrayValueObjectType_UInt64Value);\n            InitializeVariable(context, FloatValue, Variables.AnalogArrayValueObjectType_FloatValue);\n            InitializeVariable(context, DoubleValue, Variables.AnalogArrayValueObjectType_DoubleValue);\n            InitializeVariable(context, NumberValue, Variables.AnalogArrayValueObjectType_NumberValue);\n            InitializeVariable(context, IntegerValue, Variables.AnalogArrayValueObjectType_IntegerValue);\n            InitializeVariable(context, UIntegerValue, Variables.AnalogArrayValueObjectType_UIntegerValue);\n        }\n\n        /// <summary>\n        /// Handles the generate values method.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"objectId\"></param>\n        /// <param name=\"count\"></param>\n        protected override ServiceResult OnGenerateValues(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            uint count)\n        {\n            if (context.SystemHandle is not TestDataSystem system)\n            {\n                return StatusCodes.BadOutOfService;\n            }\n\n            GenerateValue(system, SByteValue);\n            GenerateValue(system, ByteValue);\n            GenerateValue(system, Int16Value);\n            GenerateValue(system, UInt16Value);\n            GenerateValue(system, Int32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, Int64Value);\n            GenerateValue(system, UInt64Value);\n            GenerateValue(system, FloatValue);\n            GenerateValue(system, DoubleValue);\n            GenerateValue(system, NumberValue);\n            GenerateValue(system, IntegerValue);\n            GenerateValue(system, UIntegerValue);\n\n            return base.OnGenerateValues(context, method, objectId, count);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/AnalogScalarValueObjectState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n\n    public partial class AnalogScalarValueObjectState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            InitializeVariable(context, SByteValue, Variables.AnalogScalarValueObjectType_SByteValue);\n            InitializeVariable(context, ByteValue, Variables.AnalogScalarValueObjectType_ByteValue);\n            InitializeVariable(context, Int16Value, Variables.AnalogScalarValueObjectType_Int16Value);\n            InitializeVariable(context, UInt16Value, Variables.AnalogScalarValueObjectType_UInt16Value);\n            InitializeVariable(context, Int32Value, Variables.AnalogScalarValueObjectType_Int32Value);\n            InitializeVariable(context, UInt32Value, Variables.AnalogScalarValueObjectType_UInt32Value);\n            InitializeVariable(context, Int64Value, Variables.AnalogScalarValueObjectType_Int64Value);\n            InitializeVariable(context, UInt64Value, Variables.AnalogScalarValueObjectType_UInt64Value);\n            InitializeVariable(context, FloatValue, Variables.AnalogScalarValueObjectType_FloatValue);\n            InitializeVariable(context, DoubleValue, Variables.AnalogScalarValueObjectType_DoubleValue);\n            InitializeVariable(context, NumberValue, Variables.AnalogScalarValueObjectType_NumberValue);\n            InitializeVariable(context, IntegerValue, Variables.AnalogScalarValueObjectType_IntegerValue);\n            InitializeVariable(context, UIntegerValue, Variables.AnalogScalarValueObjectType_UIntegerValue);\n        }\n\n        /// <summary>\n        /// Handles the generate values method.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"objectId\"></param>\n        /// <param name=\"count\"></param>\n        protected override ServiceResult OnGenerateValues(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            uint count)\n        {\n            if (context.SystemHandle is not TestDataSystem system)\n            {\n                return StatusCodes.BadOutOfService;\n            }\n\n            GenerateValue(system, SByteValue);\n            GenerateValue(system, ByteValue);\n            GenerateValue(system, Int16Value);\n            GenerateValue(system, UInt16Value);\n            GenerateValue(system, Int32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, Int64Value);\n            GenerateValue(system, UInt64Value);\n            GenerateValue(system, FloatValue);\n            GenerateValue(system, DoubleValue);\n            GenerateValue(system, NumberValue);\n            GenerateValue(system, IntegerValue);\n            GenerateValue(system, UIntegerValue);\n\n            return base.OnGenerateValues(context, method, objectId, count);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/ArrayValueObjectState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n\n    public partial class ArrayValueObjectState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            InitializeVariable(context, BooleanValue, Variables.ArrayValueObjectType_BooleanValue);\n            InitializeVariable(context, SByteValue, Variables.ArrayValueObjectType_SByteValue);\n            InitializeVariable(context, ByteValue, Variables.ArrayValueObjectType_ByteValue);\n            InitializeVariable(context, Int16Value, Variables.ArrayValueObjectType_Int16Value);\n            InitializeVariable(context, UInt16Value, Variables.ArrayValueObjectType_UInt16Value);\n            InitializeVariable(context, Int32Value, Variables.ArrayValueObjectType_Int32Value);\n            InitializeVariable(context, UInt32Value, Variables.ArrayValueObjectType_UInt32Value);\n            InitializeVariable(context, Int64Value, Variables.ArrayValueObjectType_Int64Value);\n            InitializeVariable(context, UInt64Value, Variables.ArrayValueObjectType_UInt64Value);\n            InitializeVariable(context, FloatValue, Variables.ArrayValueObjectType_FloatValue);\n            InitializeVariable(context, DoubleValue, Variables.ArrayValueObjectType_DoubleValue);\n            InitializeVariable(context, StringValue, Variables.ArrayValueObjectType_StringValue);\n            InitializeVariable(context, DateTimeValue, Variables.ArrayValueObjectType_DateTimeValue);\n            InitializeVariable(context, GuidValue, Variables.ArrayValueObjectType_GuidValue);\n            InitializeVariable(context, ByteStringValue, Variables.ArrayValueObjectType_ByteStringValue);\n            InitializeVariable(context, XmlElementValue, Variables.ArrayValueObjectType_XmlElementValue);\n            InitializeVariable(context, NodeIdValue, Variables.ArrayValueObjectType_NodeIdValue);\n            InitializeVariable(context, ExpandedNodeIdValue, Variables.ArrayValueObjectType_ExpandedNodeIdValue);\n            InitializeVariable(context, QualifiedNameValue, Variables.ArrayValueObjectType_QualifiedNameValue);\n            InitializeVariable(context, LocalizedTextValue, Variables.ArrayValueObjectType_LocalizedTextValue);\n            InitializeVariable(context, StatusCodeValue, Variables.ArrayValueObjectType_StatusCodeValue);\n            InitializeVariable(context, VariantValue, Variables.ArrayValueObjectType_VariantValue);\n            InitializeVariable(context, EnumerationValue, Variables.ArrayValueObjectType_EnumerationValue);\n            InitializeVariable(context, StructureValue, Variables.ArrayValueObjectType_StructureValue);\n            InitializeVariable(context, NumberValue, Variables.ArrayValueObjectType_NumberValue);\n            InitializeVariable(context, IntegerValue, Variables.ArrayValueObjectType_IntegerValue);\n            InitializeVariable(context, UIntegerValue, Variables.ArrayValueObjectType_UIntegerValue);\n        }\n\n        /// <summary>\n        /// Handles the generate values method.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"objectId\"></param>\n        /// <param name=\"count\"></param>\n        protected override ServiceResult OnGenerateValues(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            uint count)\n        {\n            if (context.SystemHandle is not TestDataSystem system)\n            {\n                return StatusCodes.BadOutOfService;\n            }\n\n            GenerateValue(system, BooleanValue);\n            GenerateValue(system, SByteValue);\n            GenerateValue(system, ByteValue);\n            GenerateValue(system, Int16Value);\n            GenerateValue(system, UInt16Value);\n            GenerateValue(system, Int32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, Int64Value);\n            GenerateValue(system, UInt64Value);\n            GenerateValue(system, FloatValue);\n            GenerateValue(system, DoubleValue);\n            GenerateValue(system, StringValue);\n            GenerateValue(system, DateTimeValue);\n            GenerateValue(system, GuidValue);\n            GenerateValue(system, ByteStringValue);\n            GenerateValue(system, XmlElementValue);\n            GenerateValue(system, NodeIdValue);\n            GenerateValue(system, ExpandedNodeIdValue);\n            GenerateValue(system, QualifiedNameValue);\n            GenerateValue(system, LocalizedTextValue);\n            GenerateValue(system, StatusCodeValue);\n            GenerateValue(system, VariantValue);\n            GenerateValue(system, EnumerationValue);\n            GenerateValue(system, StructureValue);\n            GenerateValue(system, NumberValue);\n            GenerateValue(system, IntegerValue);\n            GenerateValue(system, UIntegerValue);\n\n            return base.OnGenerateValues(context, method, objectId, count);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/HistoryArchive.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n\n    /// <summary>\n    /// A class that provides access to archived data.\n    /// </summary>\n    internal sealed class HistoryArchive : IDisposable\n    {\n        /// <summary>\n        /// Frees any unmanaged resources.\n        /// </summary>\n        public void Dispose()\n        {\n            if (_updateTimer != null)\n            {\n                _updateTimer.Dispose();\n                _updateTimer = null;\n            }\n        }\n\n        /// <summary>\n        /// Creates a new record in the archive.\n        /// </summary>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"dataType\"></param>\n        public void CreateRecord(NodeId nodeId, BuiltInType dataType)\n        {\n            lock (_lock)\n            {\n                var record = new HistoryRecord\n                {\n                    RawData = [],\n                    Historizing = true,\n                    DataType = dataType\n                };\n\n                var now = DateTime.UtcNow;\n\n                for (var ii = 1000; ii >= 0; ii--)\n                {\n                    var entry = new HistoryEntry\n                    {\n                        Value = new DataValue\n                        {\n                            ServerTimestamp = now.AddSeconds(-(ii * 10))\n                        }\n                    };\n                    entry.Value.SourceTimestamp = entry.Value.ServerTimestamp.AddMilliseconds(1234);\n                    entry.IsModified = false;\n\n                    switch (dataType)\n                    {\n                        case BuiltInType.Int32:\n                            {\n                                entry.Value.Value = ii;\n                                break;\n                            }\n                    }\n\n                    record.RawData.Add(entry);\n                }\n\n                _records ??= [];\n\n                _records[nodeId] = record;\n\n                _updateTimer ??= new Timer(OnUpdate, null, 10000, 10000);\n            }\n        }\n\n        /// <summary>\n        /// Periodically adds new values into the archive.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void OnUpdate(object state)\n        {\n            try\n            {\n                var now = DateTime.UtcNow;\n\n                lock (_lock)\n                {\n                    foreach (var record in _records.Values)\n                    {\n                        if (!record.Historizing || record.RawData.Count >= 2000)\n                        {\n                            continue;\n                        }\n\n                        var entry = new HistoryEntry\n                        {\n                            Value = new DataValue\n                            {\n                                ServerTimestamp = now\n                            }\n                        };\n                        entry.Value.SourceTimestamp = entry.Value.ServerTimestamp.AddMilliseconds(-4567);\n                        entry.IsModified = false;\n\n                        switch (record.DataType)\n                        {\n                            case BuiltInType.Int32:\n                                {\n                                    var lastValue = (int)record.RawData[^1].Value.Value;\n                                    entry.Value.Value = lastValue + 1;\n                                    break;\n                                }\n                        }\n\n                        record.RawData.Add(entry);\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Utils.Trace(e, \"Unexpected error updating history.\");\n            }\n        }\n\n        private readonly Lock _lock = new();\n        private Timer _updateTimer;\n        private Dictionary<NodeId, HistoryRecord> _records;\n    }\n\n    /// <summary>\n    /// A single entry in the archive.\n    /// </summary>\n    internal sealed class HistoryEntry\n    {\n        public DataValue Value;\n        public bool IsModified;\n    }\n\n    /// <summary>\n    /// A record in the archive.\n    /// </summary>\n    internal sealed class HistoryRecord\n    {\n        public List<HistoryEntry> RawData;\n        public bool Historizing;\n        public BuiltInType DataType;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/MethodTestState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n    using System;\n    using System.Xml;\n\n    public partial class MethodTestState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            ScalarMethod1.OnCall = OnScalarValue1;\n            ScalarMethod2.OnCall = OnScalarValue2;\n            ScalarMethod3.OnCall = OnScalarValue3;\n            ArrayMethod1.OnCall = OnArrayValue1;\n            ArrayMethod2.OnCall = OnArrayValue2;\n            ArrayMethod3.OnCall = OnArrayValue3;\n            UserScalarMethod1.OnCall = OnUserScalarValue1;\n            UserScalarMethod2.OnCall = OnUserScalarValue2;\n            UserArrayMethod1.OnCall = OnUserArrayValue1;\n            UserArrayMethod2.OnCall = OnUserArrayValue2;\n        }\n\n        private ServiceResult OnScalarValue1(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            bool booleanIn,\n            sbyte sByteIn,\n            byte byteIn,\n            short int16In,\n            ushort uInt16In,\n            int int32In,\n            uint uInt32In,\n            long int64In,\n            ulong uInt64In,\n            float floatIn,\n            double doubleIn,\n            ref bool booleanOut,\n            ref sbyte sByteOut,\n            ref byte byteOut,\n            ref short int16Out,\n            ref ushort uInt16Out,\n            ref int int32Out,\n            ref uint uInt32Out,\n            ref long int64Out,\n            ref ulong uInt64Out,\n            ref float floatOut,\n            ref double doubleOut)\n        {\n            booleanOut = booleanIn;\n            sByteOut = sByteIn;\n            byteOut = byteIn;\n            int16Out = int16In;\n            uInt16Out = uInt16In;\n            int32Out = int32In;\n            uInt32Out = uInt32In;\n            int64Out = int64In;\n            uInt64Out = uInt64In;\n            floatOut = floatIn;\n            doubleOut = doubleIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnScalarValue2(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            string stringIn,\n            DateTime dateTimeIn,\n            Uuid guidIn,\n            byte[] byteStringIn,\n            XmlElement xmlElementIn,\n            NodeId nodeIdIn,\n            ExpandedNodeId expandedNodeIdIn,\n            QualifiedName qualifiedNameIn,\n            LocalizedText localizedTextIn,\n            StatusCode statusCodeIn,\n            ref string stringOut,\n            ref DateTime dateTimeOut,\n            ref Uuid guidOut,\n            ref byte[] byteStringOut,\n            ref XmlElement xmlElementOut,\n            ref NodeId nodeIdOut,\n            ref ExpandedNodeId expandedNodeIdOut,\n            ref QualifiedName qualifiedNameOut,\n            ref LocalizedText localizedTextOut,\n            ref StatusCode statusCodeOut)\n        {\n            stringOut = stringIn;\n            dateTimeOut = dateTimeIn;\n            guidOut = guidIn;\n            byteStringOut = byteStringIn;\n            xmlElementOut = xmlElementIn;\n            nodeIdOut = nodeIdIn;\n            expandedNodeIdOut = expandedNodeIdIn;\n            qualifiedNameOut = qualifiedNameIn;\n            localizedTextOut = localizedTextIn;\n            statusCodeOut = statusCodeIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnScalarValue3(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            object variantIn,\n            int enumerationIn,\n            ExtensionObject structureIn,\n            ref object variantOut,\n            ref int enumerationOut,\n            ref ExtensionObject structureOut)\n        {\n            variantOut = variantIn;\n            enumerationOut = enumerationIn;\n            structureOut = structureIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnArrayValue1(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            bool[] booleanIn,\n            sbyte[] sByteIn,\n            byte[] byteIn,\n            short[] int16In,\n            ushort[] uInt16In,\n            int[] int32In,\n            uint[] uInt32In,\n            long[] int64In,\n            ulong[] uInt64In,\n            float[] floatIn,\n            double[] doubleIn,\n            ref bool[] booleanOut,\n            ref sbyte[] sByteOut,\n            ref byte[] byteOut,\n            ref short[] int16Out,\n            ref ushort[] uInt16Out,\n            ref int[] int32Out,\n            ref uint[] uInt32Out,\n            ref long[] int64Out,\n            ref ulong[] uInt64Out,\n            ref float[] floatOut,\n            ref double[] doubleOut)\n        {\n            booleanOut = booleanIn;\n            sByteOut = sByteIn;\n            byteOut = byteIn;\n            int16Out = int16In;\n            uInt16Out = uInt16In;\n            int32Out = int32In;\n            uInt32Out = uInt32In;\n            int64Out = int64In;\n            uInt64Out = uInt64In;\n            floatOut = floatIn;\n            doubleOut = doubleIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnArrayValue2(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            string[] stringIn,\n            DateTime[] dateTimeIn,\n            Uuid[] guidIn,\n            byte[][] byteStringIn,\n            XmlElement[] xmlElementIn,\n            NodeId[] nodeIdIn,\n            ExpandedNodeId[] expandedNodeIdIn,\n            QualifiedName[] qualifiedNameIn,\n            LocalizedText[] localizedTextIn,\n            StatusCode[] statusCodeIn,\n            ref string[] stringOut,\n            ref DateTime[] dateTimeOut,\n            ref Uuid[] guidOut,\n            ref byte[][] byteStringOut,\n            ref XmlElement[] xmlElementOut,\n            ref NodeId[] nodeIdOut,\n            ref ExpandedNodeId[] expandedNodeIdOut,\n            ref QualifiedName[] qualifiedNameOut,\n            ref LocalizedText[] localizedTextOut,\n            ref StatusCode[] statusCodeOut)\n        {\n            stringOut = stringIn;\n            dateTimeOut = dateTimeIn;\n            guidOut = guidIn;\n            byteStringOut = byteStringIn;\n            xmlElementOut = xmlElementIn;\n            nodeIdOut = nodeIdIn;\n            expandedNodeIdOut = expandedNodeIdIn;\n            qualifiedNameOut = qualifiedNameIn;\n            localizedTextOut = localizedTextIn;\n            statusCodeOut = statusCodeIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnArrayValue3(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            Variant[] variantIn,\n            int[] enumerationIn,\n            ExtensionObject[] structureIn,\n            ref Variant[] variantOut,\n            ref int[] enumerationOut,\n            ref ExtensionObject[] structureOut)\n        {\n            variantOut = variantIn;\n            enumerationOut = enumerationIn;\n            structureOut = structureIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnUserScalarValue1(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            bool booleanIn,\n            sbyte sByteIn,\n            byte byteIn,\n            short int16In,\n            ushort uInt16In,\n            int int32In,\n            uint uInt32In,\n            long int64In,\n            ulong uInt64In,\n            float floatIn,\n            double doubleIn,\n            string stringIn,\n            ref bool booleanOut,\n            ref sbyte sByteOut,\n            ref byte byteOut,\n            ref short int16Out,\n            ref ushort uInt16Out,\n            ref int int32Out,\n            ref uint uInt32Out,\n            ref long int64Out,\n            ref ulong uInt64Out,\n            ref float floatOut,\n            ref double doubleOut,\n            ref string stringOut)\n        {\n            booleanOut = booleanIn;\n            sByteOut = sByteIn;\n            byteOut = byteIn;\n            int16Out = int16In;\n            uInt16Out = uInt16In;\n            int32Out = int32In;\n            uInt32Out = uInt32In;\n            int64Out = int64In;\n            uInt64Out = uInt64In;\n            floatOut = floatIn;\n            doubleOut = doubleIn;\n            stringOut = stringIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnUserScalarValue2(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            DateTime dateTimeIn,\n            Uuid guidIn,\n            byte[] byteStringIn,\n            XmlElement xmlElementIn,\n            NodeId nodeIdIn,\n            ExpandedNodeId expandedNodeIdIn,\n            QualifiedName qualifiedNameIn,\n            LocalizedText localizedTextIn,\n            StatusCode statusCodeIn,\n            object variantIn,\n            ref DateTime dateTimeOut,\n            ref Uuid guidOut,\n            ref byte[] byteStringOut,\n            ref XmlElement xmlElementOut,\n            ref NodeId nodeIdOut,\n            ref ExpandedNodeId expandedNodeIdOut,\n            ref QualifiedName qualifiedNameOut,\n            ref LocalizedText localizedTextOut,\n            ref StatusCode statusCodeOut,\n            ref object variantOut)\n        {\n            dateTimeOut = dateTimeIn;\n            guidOut = guidIn;\n            byteStringOut = byteStringIn;\n            xmlElementOut = xmlElementIn;\n            nodeIdOut = nodeIdIn;\n            expandedNodeIdOut = expandedNodeIdIn;\n            qualifiedNameOut = qualifiedNameIn;\n            localizedTextOut = localizedTextIn;\n            statusCodeOut = statusCodeIn;\n            variantOut = variantIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnUserArrayValue1(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            bool[] booleanIn,\n            sbyte[] sByteIn,\n            byte[] byteIn,\n            short[] int16In,\n            ushort[] uInt16In,\n            int[] int32In,\n            uint[] uInt32In,\n            long[] int64In,\n            ulong[] uInt64In,\n            float[] floatIn,\n            double[] doubleIn,\n            string[] stringIn,\n            ref bool[] booleanOut,\n            ref sbyte[] sByteOut,\n            ref byte[] byteOut,\n            ref short[] int16Out,\n            ref ushort[] uInt16Out,\n            ref int[] int32Out,\n            ref uint[] uInt32Out,\n            ref long[] int64Out,\n            ref ulong[] uInt64Out,\n            ref float[] floatOut,\n            ref double[] doubleOut,\n            ref string[] stringOut)\n        {\n            booleanOut = booleanIn;\n            sByteOut = sByteIn;\n            byteOut = byteIn;\n            int16Out = int16In;\n            uInt16Out = uInt16In;\n            int32Out = int32In;\n            uInt32Out = uInt32In;\n            int64Out = int64In;\n            uInt64Out = uInt64In;\n            floatOut = floatIn;\n            doubleOut = doubleIn;\n            stringOut = stringIn;\n\n            return ServiceResult.Good;\n        }\n\n        private ServiceResult OnUserArrayValue2(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            DateTime[] dateTimeIn,\n            Uuid[] guidIn,\n            byte[][] byteStringIn,\n            XmlElement[] xmlElementIn,\n            NodeId[] nodeIdIn,\n            ExpandedNodeId[] expandedNodeIdIn,\n            QualifiedName[] qualifiedNameIn,\n            LocalizedText[] localizedTextIn,\n            StatusCode[] statusCodeIn,\n            Variant[] variantIn,\n            ref DateTime[] dateTimeOut,\n            ref Uuid[] guidOut,\n            ref byte[][] byteStringOut,\n            ref XmlElement[] xmlElementOut,\n            ref NodeId[] nodeIdOut,\n            ref ExpandedNodeId[] expandedNodeIdOut,\n            ref QualifiedName[] qualifiedNameOut,\n            ref LocalizedText[] localizedTextOut,\n            ref StatusCode[] statusCodeOut,\n            ref Variant[] variantOut)\n        {\n            dateTimeOut = dateTimeIn;\n            guidOut = guidIn;\n            byteStringOut = byteStringIn;\n            xmlElementOut = xmlElementIn;\n            nodeIdOut = nodeIdIn;\n            expandedNodeIdOut = expandedNodeIdIn;\n            qualifiedNameOut = qualifiedNameIn;\n            localizedTextOut = localizedTextIn;\n            statusCodeOut = statusCodeIn;\n            variantOut = variantIn;\n\n            return ServiceResult.Good;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/ScalarValueObjectState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n\n    public partial class ScalarValueObjectState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            InitializeVariable(context, BooleanValue, Variables.ScalarValueObjectType_BooleanValue);\n            InitializeVariable(context, SByteValue, Variables.ScalarValueObjectType_SByteValue);\n            InitializeVariable(context, ByteValue, Variables.ScalarValueObjectType_ByteValue);\n            InitializeVariable(context, Int16Value, Variables.ScalarValueObjectType_Int16Value);\n            InitializeVariable(context, UInt16Value, Variables.ScalarValueObjectType_UInt16Value);\n            InitializeVariable(context, Int32Value, Variables.ScalarValueObjectType_Int32Value);\n            InitializeVariable(context, UInt32Value, Variables.ScalarValueObjectType_UInt32Value);\n            InitializeVariable(context, Int64Value, Variables.ScalarValueObjectType_Int64Value);\n            InitializeVariable(context, UInt64Value, Variables.ScalarValueObjectType_UInt64Value);\n            InitializeVariable(context, FloatValue, Variables.ScalarValueObjectType_FloatValue);\n            InitializeVariable(context, DoubleValue, Variables.ScalarValueObjectType_DoubleValue);\n            InitializeVariable(context, StringValue, Variables.ScalarValueObjectType_StringValue);\n            InitializeVariable(context, DateTimeValue, Variables.ScalarValueObjectType_DateTimeValue);\n            InitializeVariable(context, GuidValue, Variables.ScalarValueObjectType_GuidValue);\n            InitializeVariable(context, ByteStringValue, Variables.ScalarValueObjectType_ByteStringValue);\n            InitializeVariable(context, XmlElementValue, Variables.ScalarValueObjectType_XmlElementValue);\n            InitializeVariable(context, NodeIdValue, Variables.ScalarValueObjectType_NodeIdValue);\n            InitializeVariable(context, ExpandedNodeIdValue, Variables.ScalarValueObjectType_ExpandedNodeIdValue);\n            InitializeVariable(context, QualifiedNameValue, Variables.ScalarValueObjectType_QualifiedNameValue);\n            InitializeVariable(context, LocalizedTextValue, Variables.ScalarValueObjectType_LocalizedTextValue);\n            InitializeVariable(context, StatusCodeValue, Variables.ScalarValueObjectType_StatusCodeValue);\n            InitializeVariable(context, VariantValue, Variables.ScalarValueObjectType_VariantValue);\n            InitializeVariable(context, EnumerationValue, Variables.ScalarValueObjectType_EnumerationValue);\n            InitializeVariable(context, StructureValue, Variables.ScalarValueObjectType_StructureValue);\n            InitializeVariable(context, NumberValue, Variables.ScalarValueObjectType_NumberValue);\n            InitializeVariable(context, IntegerValue, Variables.ScalarValueObjectType_IntegerValue);\n            InitializeVariable(context, UIntegerValue, Variables.ScalarValueObjectType_UIntegerValue);\n        }\n\n        /// <summary>\n        /// Handles the generate values method.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"objectId\"></param>\n        /// <param name=\"count\"></param>\n        protected override ServiceResult OnGenerateValues(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            uint count)\n        {\n            if (context.SystemHandle is not TestDataSystem system)\n            {\n                return StatusCodes.BadOutOfService;\n            }\n\n            GenerateValue(system, BooleanValue);\n            GenerateValue(system, SByteValue);\n            GenerateValue(system, ByteValue);\n            GenerateValue(system, Int16Value);\n            GenerateValue(system, UInt16Value);\n            GenerateValue(system, Int32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, Int64Value);\n            GenerateValue(system, UInt64Value);\n            GenerateValue(system, FloatValue);\n            GenerateValue(system, DoubleValue);\n            GenerateValue(system, StringValue);\n            GenerateValue(system, DateTimeValue);\n            GenerateValue(system, GuidValue);\n            GenerateValue(system, ByteStringValue);\n            GenerateValue(system, XmlElementValue);\n            GenerateValue(system, NodeIdValue);\n            GenerateValue(system, ExpandedNodeIdValue);\n            GenerateValue(system, QualifiedNameValue);\n            GenerateValue(system, LocalizedTextValue);\n            GenerateValue(system, StatusCodeValue);\n            GenerateValue(system, VariantValue);\n            GenerateValue(system, EnumerationValue);\n            GenerateValue(system, StructureValue);\n            GenerateValue(system, NumberValue);\n            GenerateValue(system, IntegerValue);\n            GenerateValue(system, UIntegerValue);\n\n            return base.OnGenerateValues(context, method, objectId, count);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/TestDataNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Reflection;\n    using System.Threading;\n\n    /// <summary>\n    /// A node manager for a variety of test data.\n    /// </summary>\n    public class TestDataNodeManager : CustomNodeManager2, ITestDataSystemCallback\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public TestDataNodeManager(IServerInternal server, ApplicationConfiguration configuration)\n        :\n            base(server, configuration)\n        {\n            // update the namespaces.\n            NamespaceUris = new List<string> {\n                Namespaces.TestData,\n                Namespaces.TestData + \"/Instance\"\n            };\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<TestDataNodeManagerConfiguration>()\n                ?? new TestDataNodeManagerConfiguration();\n\n            _lastUsedId = _configuration.NextUnusedId - 1;\n\n            // create the object used to access the test system.\n            _system = new TestDataSystem(this, server.NamespaceUris, server.ServerUris);\n\n            // update the default context.\n            SystemContext.SystemHandle = _system;\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                if (_systemStatusTimer != null)\n                {\n                    _systemStatusTimer.Dispose();\n                    _systemStatusTimer = null;\n                }\n                if (_system != null)\n                {\n                    _system.Dispose();\n                    _system = null;\n                }\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Updates the variable after receiving a notification that it has changed in the underlying system.\n        /// </summary>\n        /// <param name=\"variable\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"timestamp\"></param>\n        public void OnDataChange(BaseVariableState variable, object value, StatusCode statusCode, DateTime timestamp)\n        {\n            lock (Lock)\n            {\n                variable.Value = value;\n                variable.StatusCode = statusCode;\n                variable.Timestamp = timestamp;\n\n                // notifies any monitored items that the value has changed.\n                variable.ClearChangeMasks(SystemContext, false);\n            }\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"node\">The node.</param>\n        /// <returns>The new NodeId.</returns>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            var id = Utils.IncrementIdentifier(ref _lastUsedId);\n            return new NodeId(id, _namespaceIndex);\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                // ensure the namespace used by the node manager is in the server's namespace table.\n                _typeNamespaceIndex = Server.NamespaceUris.GetIndexOrAppend(Namespaces.TestData);\n                _namespaceIndex = Server.NamespaceUris.GetIndexOrAppend(Namespaces.TestData + \"/Instance\");\n\n                base.CreateAddressSpace(externalReferences);\n\n                // start monitoring the system status.\n                _systemStatusCondition = (TestSystemConditionState)FindPredefinedNode(\n                    new NodeId(Objects.Data_Conditions_SystemStatus, _typeNamespaceIndex),\n                    typeof(TestSystemConditionState));\n\n                if (_systemStatusCondition != null)\n                {\n                    _systemStatusTimer = new Timer(OnCheckSystemStatus, null, 5000, 5000);\n                    _systemStatusCondition.Retain.Value = true;\n                }\n\n                // link all conditions to the conditions folder.\n                var conditionsFolder = FindPredefinedNode(\n                    new NodeId(Objects.Data_Conditions, _typeNamespaceIndex),\n                    typeof(NodeState));\n\n                foreach (var node in PredefinedNodes.Values)\n                {\n                    if (node is ConditionState condition && !ReferenceEquals(condition.Parent, conditionsFolder))\n                    {\n                        condition.AddNotifier(SystemContext, null, true, conditionsFolder);\n                        conditionsFolder.AddNotifier(SystemContext, null, false, condition);\n                    }\n                }\n\n                // enable history for all numeric scalar values.\n                var scalarValues = (ScalarValueObjectState)FindPredefinedNode(\n                    new NodeId(Objects.Data_Dynamic_Scalar, _typeNamespaceIndex),\n                    typeof(ScalarValueObjectState));\n\n                scalarValues.Int32Value.Historizing = true;\n                scalarValues.Int32Value.AccessLevel = (byte)(scalarValues.Int32Value.AccessLevel | AccessLevels.HistoryRead);\n\n                _system.EnableHistoryArchiving(scalarValues.Int32Value);\n            }\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            return predefinedNodes;\n        }\n\n        /// <summary>\n        /// Replaces the generic node with a node specific to the model.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"predefinedNode\"></param>\n        protected override NodeState AddBehaviourToPredefinedNode(ISystemContext context, NodeState predefinedNode)\n        {\n            if (predefinedNode is not BaseObjectState passiveNode)\n            {\n                return predefinedNode;\n            }\n\n            var typeId = passiveNode.TypeDefinitionId;\n\n            if (!IsNodeIdInNamespace(typeId) || typeId.IdType != IdType.Numeric)\n            {\n                return predefinedNode;\n            }\n\n            switch ((uint)typeId.Identifier)\n            {\n                case ObjectTypes.TestSystemConditionType:\n                    {\n                        if (passiveNode is TestSystemConditionState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new TestSystemConditionState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        return activeNode;\n                    }\n\n                case ObjectTypes.ScalarValueObjectType:\n                    {\n                        if (passiveNode is ScalarValueObjectState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new ScalarValueObjectState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        return activeNode;\n                    }\n\n                case ObjectTypes.AnalogScalarValueObjectType:\n                    {\n                        if (passiveNode is AnalogScalarValueObjectState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new AnalogScalarValueObjectState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        return activeNode;\n                    }\n\n                case ObjectTypes.ArrayValueObjectType:\n                    {\n                        if (passiveNode is ArrayValueObjectState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new ArrayValueObjectState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        return activeNode;\n                    }\n\n                case ObjectTypes.AnalogArrayValueObjectType:\n                    {\n                        if (passiveNode is AnalogArrayValueObjectState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new AnalogArrayValueObjectState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        return activeNode;\n                    }\n\n                case ObjectTypes.UserScalarValueObjectType:\n                    {\n                        if (passiveNode is UserScalarValueObjectState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new UserScalarValueObjectState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        return activeNode;\n                    }\n\n                case ObjectTypes.UserArrayValueObjectType:\n                    {\n                        if (passiveNode is UserArrayValueObjectState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new UserArrayValueObjectState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        return activeNode;\n                    }\n\n                case ObjectTypes.MethodTestType:\n                    {\n                        if (passiveNode is MethodTestState)\n                        {\n                            break;\n                        }\n\n                        var activeNode = new MethodTestState(passiveNode.Parent);\n                        activeNode.Create(context, passiveNode);\n\n                        passiveNode.Parent?.ReplaceChild(context, activeNode);\n\n                        return activeNode;\n                    }\n            }\n\n            return predefinedNode;\n        }\n\n        /// <summary>\n        /// Returns true if the system must be scanning to provide updates for the monitored item.\n        /// </summary>\n        /// <param name=\"monitoredNode\"></param>\n        /// <param name=\"monitoredItem\"></param>\n        private static bool SystemScanRequired(MonitoredNode2 monitoredNode, ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            // ingore other types of monitored items.\n            if (monitoredItem == null)\n            {\n                return false;\n            }\n\n            // only care about variables.\n\n            if (monitoredNode.Node is not BaseDataVariableState source)\n            {\n                return false;\n            }\n\n            // check for variables that need to be scanned.\n            if (monitoredItem.AttributeId == Attributes.Value && source.Parent is TestDataObjectState test && test.SimulationActive.Value)\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Called after creating a MonitoredItem2.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override void OnMonitoredItemCreated(\n            ServerSystemContext context,\n            NodeHandle handle,\n            ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            if (SystemScanRequired(handle.MonitoredNode, monitoredItem) && monitoredItem.MonitoringMode != MonitoringMode.Disabled)\n            {\n                _system.StartMonitoringValue(\n                    monitoredItem.Id,\n                    monitoredItem.SamplingInterval,\n                    handle.Node as BaseVariableState);\n            }\n        }\n\n        /// <summary>\n        /// Called after modifying a MonitoredItem2.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override void OnMonitoredItemModified(\n            ServerSystemContext context,\n            NodeHandle handle,\n            ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            if (SystemScanRequired(handle.MonitoredNode, monitoredItem) && monitoredItem.MonitoringMode != MonitoringMode.Disabled)\n            {\n                var source = handle.Node as BaseVariableState;\n                _system.StopMonitoringValue(monitoredItem.Id);\n                _system.StartMonitoringValue(monitoredItem.Id, monitoredItem.SamplingInterval, source);\n            }\n        }\n\n        /// <summary>\n        /// Called after deleting a MonitoredItem2.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        protected override void OnMonitoredItemDeleted(\n            ServerSystemContext context,\n            NodeHandle handle,\n            ISampledDataChangeMonitoredItem monitoredItem)\n        {\n            // check for variables that need to be scanned.\n            if (SystemScanRequired(handle.MonitoredNode, monitoredItem))\n            {\n                _system.StopMonitoringValue(monitoredItem.Id);\n            }\n        }\n\n        /// <summary>\n        /// Called after changing the MonitoringMode for a MonitoredItem2.\n        /// </summary>\n        /// <param name=\"context\">The context.</param>\n        /// <param name=\"handle\">The handle for the node.</param>\n        /// <param name=\"monitoredItem\">The monitored item.</param>\n        /// <param name=\"previousMode\">The previous monitoring mode.</param>\n        /// <param name=\"monitoringMode\">The current monitoring mode.</param>\n        protected override void OnMonitoringModeChanged(\n            ServerSystemContext context,\n            NodeHandle handle,\n            ISampledDataChangeMonitoredItem monitoredItem,\n            MonitoringMode previousMode,\n            MonitoringMode monitoringMode)\n        {\n            if (SystemScanRequired(handle.MonitoredNode, monitoredItem))\n            {\n                var source = handle.Node as BaseVariableState;\n\n                if (previousMode != MonitoringMode.Disabled && monitoredItem.MonitoringMode == MonitoringMode.Disabled)\n                {\n                    _system.StopMonitoringValue(monitoredItem.Id);\n                }\n\n                if (previousMode == MonitoringMode.Disabled && monitoredItem.MonitoringMode != MonitoringMode.Disabled)\n                {\n                    _system.StartMonitoringValue(monitoredItem.Id, monitoredItem.SamplingInterval, source);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Peridically checks the system state.\n        /// </summary>\n        /// <param name=\"state\"></param>\n        private void OnCheckSystemStatus(object state)\n        {\n#if CONDITION_SAMPLES\n            lock (Lock)\n            {\n                try\n                {\n                    // create the dialog.\n                    if (_dialog == null)\n                    {\n                        _dialog = new DialogConditionState(null);\n\n                        CreateNode(\n                            SystemContext,\n                            ExpandedNodeId.ToNodeId(ObjectIds.Data_Conditions, SystemContext.NamespaceUris),\n                            ReferenceTypeIds.HasComponent,\n                            new QualifiedName(\"ResetSystemDialog\", _namespaceIndex),\n                            _dialog);\n\n                        _dialog.OnAfterResponse = OnDialogComplete;\n                    }\n\n                    StatusCode systemStatus = _system.SystemStatus;\n                    _systemStatusCondition.UpdateStatus(systemStatus);\n\n                    // cycle through different status codes in order to simulate a real system.\n                    if (StatusCode.IsGood(systemStatus))\n                    {\n                        _systemStatusCondition.UpdateSeverity((ushort)EventSeverity.Low);\n                        _system.SystemStatus = StatusCodes.Uncertain;\n                    }\n                    else if (StatusCode.IsUncertain(systemStatus))\n                    {\n                        _systemStatusCondition.UpdateSeverity((ushort)EventSeverity.Medium);\n                        _system.SystemStatus = StatusCodes.Bad;\n                    }\n                    else\n                    {\n                        _systemStatusCondition.UpdateSeverity((ushort)EventSeverity.High);\n                        _system.SystemStatus = StatusCodes.Good;\n                    }\n\n                    // request a reset if status is bad.\n                    if (StatusCode.IsBad(systemStatus))\n                    {\n                        _dialog.RequestResponse(\n                            SystemContext,\n                            \"Reset the test system?\",\n                            (uint)(int)(DialogConditionChoice.Ok | DialogConditionChoice.Cancel),\n                            (ushort)EventSeverity.MediumHigh);\n                    }\n\n                    // report the event.\n                    TranslationInfo info = new TranslationInfo(\n                        \"TestSystemStatusChange\",\n                        \"en-US\",\n                        \"The TestSystem status is now {0}.\",\n                        systemStatus);\n\n                    _systemStatusCondition.ReportConditionChange(\n                        SystemContext,\n                        null,\n                        new LocalizedText(info),\n                        false);\n                }\n                catch (Exception e)\n                {\n                    Utils.Trace(e, \"Unexpected error monitoring system status.\");\n                }\n            }\n#endif\n        }\n\n#if CONDITION_SAMPLES\n        /// <summary>\n        /// Handles a user response to a dialog.\n        /// </summary>\n        private ServiceResult OnDialogComplete(\n            ISystemContext context,\n            DialogConditionState dialog,\n            DialogConditionChoice response)\n        {\n            if (_dialog != null)\n            {\n                DeleteNode(SystemContext, _dialog.NodeId);\n                _dialog = null;\n            }\n\n            return ServiceResult.Good;\n        }\n#endif\n\n        private readonly TestDataNodeManagerConfiguration _configuration;\n        private ushort _namespaceIndex;\n        private ushort _typeNamespaceIndex;\n        private TestDataSystem _system;\n        private long _lastUsedId;\n        private Timer _systemStatusTimer;\n        private TestSystemConditionState _systemStatusCondition;\n\n#if CONDITION_SAMPLES\n        private DialogConditionState _dialog;\n#endif\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/TestDataNodeManagerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the test node manager\n    /// </summary>\n    [DataContract(Namespace = Namespaces.TestData)]\n    public class TestDataNodeManagerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public TestDataNodeManagerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n            SaveFilePath = null;\n            MaxQueueSize = 100;\n        }\n\n        /// <summary>\n        /// The path to the file that stores state of the node manager.\n        /// </summary>\n        [DataMember(Order = 1)]\n        public string SaveFilePath { get; set; }\n\n        /// <summary>\n        /// The maximum length for a monitored item sampling queue.\n        /// </summary>\n        [DataMember(Order = 2)]\n        public uint MaxQueueSize { get; set; }\n\n        /// <summary>\n        /// The next unused value that can be assigned to new nodes.\n        /// </summary>\n        [DataMember(Order = 3)]\n        public uint NextUnusedId { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/TestDataObjectState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n    using System;\n\n    public partial class TestDataObjectState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            GenerateValues.OnCall = OnGenerateValues;\n        }\n\n        /// <summary>\n        /// Initialzies the variable as a counter.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"variable\"></param>\n        /// <param name=\"numericId\"></param>\n        protected void InitializeVariable(ISystemContext context, BaseVariableState variable, uint numericId)\n        {\n            variable.NumericId = numericId;\n\n            // provide an implementation that produces a random value on each read.\n            if (SimulationActive.Value)\n            {\n                variable.OnReadValue = DoDeviceRead;\n            }\n\n            // set a valid initial value.\n\n            if (context.SystemHandle is TestDataSystem system)\n            {\n                GenerateValue(system, variable);\n            }\n\n            // allow writes if the simulation is not active.\n            if (!SimulationActive.Value)\n            {\n                variable.AccessLevel = variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;\n            }\n\n            // set the EU range.\n\n            if (variable.FindChild(context, Opc.Ua.BrowseNames.EURange) is BaseVariableState euRange)\n            {\n                if (context.TypeTable.IsTypeOf(variable.DataType, Opc.Ua.DataTypeIds.UInteger))\n                {\n                    euRange.Value = new Opc.Ua.Range(250, 50);\n                }\n                else\n                {\n                    euRange.Value = new Opc.Ua.Range(100, -100);\n                }\n            }\n\n            variable.OnSimpleWriteValue = OnWriteAnalogValue;\n        }\n\n        /// <summary>\n        /// Validates a written value.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        /// <param name=\"value\"></param>\n        public ServiceResult OnWriteAnalogValue(\n            ISystemContext context,\n            NodeState node,\n            ref object value)\n        {\n            if (node.FindChild(context, Opc.Ua.BrowseNames.EURange) is not BaseVariableState euRange)\n            {\n                return ServiceResult.Good;\n            }\n\n            if (euRange.Value is not Opc.Ua.Range range)\n            {\n                return ServiceResult.Good;\n            }\n\n            if (value is Array array)\n            {\n                for (var ii = 0; ii < array.Length; ii++)\n                {\n                    var element = array.GetValue(ii);\n\n                    if (typeof(Variant).IsInstanceOfType(element))\n                    {\n                        element = ((Variant)element).Value;\n                    }\n\n                    var elementNumber = Convert.ToDouble(element);\n\n                    if (elementNumber > range.High || elementNumber < range.Low)\n                    {\n                        return StatusCodes.BadOutOfRange;\n                    }\n                }\n\n                return ServiceResult.Good;\n            }\n\n            var number = Convert.ToDouble(value);\n\n            if (number > range.High || number < range.Low)\n            {\n                return StatusCodes.BadOutOfRange;\n            }\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Generates a new value for the variable.\n        /// </summary>\n        /// <param name=\"system\"></param>\n        /// <param name=\"variable\"></param>\n        protected void GenerateValue(TestDataSystem system, BaseVariableState variable)\n        {\n            variable.Value = system.ReadValue(variable);\n            variable.Timestamp = DateTime.UtcNow;\n            variable.StatusCode = StatusCodes.Good;\n        }\n\n        /// <summary>\n        /// Handles the generate values method.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"objectId\"></param>\n        /// <param name=\"count\"></param>\n        protected virtual ServiceResult OnGenerateValues(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            uint count)\n        {\n            ClearChangeMasks(context, true);\n\n            if (AreEventsMonitored)\n            {\n                var e = new GenerateValuesEventState(null);\n\n                var message = new TranslationInfo(\n                    \"GenerateValuesEventType\",\n                    \"en-US\",\n                    \"New values generated for test source '{0}'.\",\n                    DisplayName);\n\n                e.Initialize(\n                    context,\n                    this,\n                    EventSeverity.MediumLow,\n                    new LocalizedText(message));\n\n                e.Iterations = new PropertyState<uint>(e)\n                {\n                    Value = count\n                };\n\n                e.NewValueCount = new PropertyState<uint>(e)\n                {\n                    Value = 10\n                };\n\n                ReportEvent(context, e);\n            }\n\n#if CONDITION_SAMPLES\n            this.CycleComplete.RequestAcknowledgement(context, (ushort)EventSeverity.Low);\n#endif\n\n            return ServiceResult.Good;\n        }\n\n        /// <summary>\n        /// Generates a new value each time the value is read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        /// <param name=\"indexRange\"></param>\n        /// <param name=\"dataEncoding\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"statusCode\"></param>\n        /// <param name=\"timestamp\"></param>\n        private ServiceResult DoDeviceRead(\n            ISystemContext context,\n            NodeState node,\n            NumericRange indexRange,\n            QualifiedName dataEncoding,\n            ref object value,\n            ref StatusCode statusCode,\n            ref DateTime timestamp)\n        {\n            if (node is not BaseVariableState variable)\n            {\n                return ServiceResult.Good;\n            }\n\n            if (!SimulationActive.Value)\n            {\n                return ServiceResult.Good;\n            }\n\n            if (context.SystemHandle is not TestDataSystem system)\n            {\n                return StatusCodes.BadOutOfService;\n            }\n\n            try\n            {\n                value = system.ReadValue(variable);\n\n                statusCode = StatusCodes.Good;\n                timestamp = DateTime.UtcNow;\n\n                var error = BaseVariableState.ApplyIndexRangeAndDataEncoding(\n                    context,\n                    indexRange,\n                    dataEncoding,\n                    ref value);\n\n                if (ServiceResult.IsBad(error))\n                {\n                    statusCode = error.StatusCode;\n                }\n\n                return ServiceResult.Good;\n            }\n            catch (Exception e)\n            {\n                return new ServiceResult(e);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/TestDataServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class TestDataServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.TestData,\n                    Namespaces.TestData + \"/Instance\"\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new TestDataNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/TestDataSystem.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Xml;\n\n    public interface ITestDataSystemCallback\n    {\n        void OnDataChange(\n            BaseVariableState variable,\n            object value,\n            StatusCode statusCode,\n            DateTime timestamp);\n    }\n\n    public class TestDataSystem : IDisposable\n    {\n        public TestDataSystem(ITestDataSystemCallback callback,\n            NamespaceTable namespaceUris, StringTable serverUris)\n        {\n            _callback = callback;\n            _minimumSamplingInterval = int.MaxValue;\n            _monitoredNodes = [];\n            _generator = new Opc.Ua.Test.TestDataGenerator()\n            {\n                NamespaceUris = namespaceUris,\n                ServerUris = serverUris\n            };\n            _historyArchive = new HistoryArchive();\n        }\n\n        public void Dispose()\n        {\n            if (_historyArchive != null)\n            {\n                _historyArchive.Dispose();\n                _historyArchive = null;\n            }\n            if (_timer != null)\n            {\n                _timer.Dispose();\n                _timer = null;\n            }\n        }\n\n        /// <summary>\n        /// The number of nodes being monitored.\n        /// </summary>\n        public int MonitoredNodeCount\n        {\n            get\n            {\n                lock (_lock)\n                {\n                    if (_monitoredNodes == null)\n                    {\n                        return 0;\n                    }\n\n                    return _monitoredNodes.Count;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates an archive for the variable.\n        /// </summary>\n        /// <param name=\"variable\"></param>\n        public void EnableHistoryArchiving(BaseVariableState variable)\n        {\n            if (variable == null)\n            {\n                return;\n            }\n\n            if (variable.ValueRank == ValueRanks.Scalar)\n            {\n                _historyArchive.CreateRecord(variable.NodeId, TypeInfo.GetBuiltInType(variable.DataType));\n            }\n        }\n\n        /// <summary>\n        /// Returns a new value for the variable.\n        /// </summary>\n        /// <param name=\"variable\"></param>\n        public object ReadValue(BaseVariableState variable)\n        {\n            lock (_lock)\n            {\n                switch (variable.NumericId)\n                {\n                    case Variables.ScalarValueObjectType_BooleanValue:\n                    case Variables.UserScalarValueObjectType_BooleanValue:\n                        return _generator.GetRandom<bool>();\n                    case Variables.ScalarValueObjectType_SByteValue:\n                    case Variables.UserScalarValueObjectType_SByteValue:\n                        return _generator.GetRandom<sbyte>();\n                    case Variables.AnalogScalarValueObjectType_SByteValue:\n                        return (sbyte)(((int)(_generator.GetRandom<uint>() % 201)) - 100);\n                    case Variables.ScalarValueObjectType_ByteValue:\n                    case Variables.UserScalarValueObjectType_ByteValue:\n                        return _generator.GetRandom<byte>();\n                    case Variables.AnalogScalarValueObjectType_ByteValue:\n                        return (byte)((_generator.GetRandom<uint>() % 201) + 50);\n                    case Variables.ScalarValueObjectType_Int16Value:\n                    case Variables.UserScalarValueObjectType_Int16Value:\n                        return _generator.GetRandom<short>();\n                    case Variables.AnalogScalarValueObjectType_Int16Value:\n                        return (short)(((int)(_generator.GetRandom<uint>() % 201)) - 100);\n                    case Variables.ScalarValueObjectType_UInt16Value:\n                    case Variables.UserScalarValueObjectType_UInt16Value:\n                        return _generator.GetRandom<ushort>();\n                    case Variables.AnalogScalarValueObjectType_UInt16Value:\n                        return (ushort)((_generator.GetRandom<uint>() % 201) + 50);\n                    case Variables.ScalarValueObjectType_Int32Value:\n                    case Variables.UserScalarValueObjectType_Int32Value:\n                        return _generator.GetRandom<int>();\n                    case Variables.AnalogScalarValueObjectType_Int32Value:\n                    case Variables.AnalogScalarValueObjectType_IntegerValue:\n                        return ((int)(_generator.GetRandom<uint>() % 201)) - 100;\n                    case Variables.ScalarValueObjectType_UInt32Value:\n                    case Variables.UserScalarValueObjectType_UInt32Value:\n                        return _generator.GetRandom<uint>();\n                    case Variables.AnalogScalarValueObjectType_UInt32Value:\n                    case Variables.AnalogScalarValueObjectType_UIntegerValue:\n                        return (_generator.GetRandom<uint>() % 201) + 50;\n                    case Variables.ScalarValueObjectType_Int64Value:\n                    case Variables.UserScalarValueObjectType_Int64Value:\n                        return _generator.GetRandom<long>();\n                    case Variables.AnalogScalarValueObjectType_Int64Value:\n                        return (long)(((int)(_generator.GetRandom<uint>() % 201)) - 100);\n                    case Variables.ScalarValueObjectType_UInt64Value:\n                    case Variables.UserScalarValueObjectType_UInt64Value:\n                        return _generator.GetRandom<ulong>();\n                    case Variables.AnalogScalarValueObjectType_UInt64Value:\n                        return (ulong)((_generator.GetRandom<uint>() % 201) + 50);\n                    case Variables.ScalarValueObjectType_FloatValue:\n                    case Variables.UserScalarValueObjectType_FloatValue:\n                        return _generator.GetRandom<float>();\n                    case Variables.AnalogScalarValueObjectType_FloatValue:\n                        return (float)(((int)(_generator.GetRandom<uint>() % 201)) - 100);\n                    case Variables.ScalarValueObjectType_DoubleValue:\n                    case Variables.UserScalarValueObjectType_DoubleValue:\n                        return _generator.GetRandom<double>();\n                    case Variables.AnalogScalarValueObjectType_DoubleValue:\n                    case Variables.AnalogScalarValueObjectType_NumberValue:\n                        return (double)(((int)(_generator.GetRandom<uint>() % 201)) - 100);\n                    case Variables.ScalarValueObjectType_StringValue:\n                    case Variables.UserScalarValueObjectType_StringValue:\n                        return _generator.GetRandom<string>();\n                    case Variables.ScalarValueObjectType_DateTimeValue:\n                    case Variables.UserScalarValueObjectType_DateTimeValue:\n                        return _generator.GetRandom<DateTime>();\n                    case Variables.ScalarValueObjectType_GuidValue:\n                    case Variables.UserScalarValueObjectType_GuidValue:\n                        return _generator.GetRandom<Guid>();\n                    case Variables.ScalarValueObjectType_ByteStringValue:\n                    case Variables.UserScalarValueObjectType_ByteStringValue:\n                        return _generator.GetRandom<byte[]>();\n                    case Variables.ScalarValueObjectType_XmlElementValue:\n                    case Variables.UserScalarValueObjectType_XmlElementValue:\n                        return _generator.GetRandom<XmlElement>();\n                    case Variables.ScalarValueObjectType_NodeIdValue:\n                    case Variables.UserScalarValueObjectType_NodeIdValue:\n                        return _generator.GetRandom<NodeId>();\n                    case Variables.ScalarValueObjectType_ExpandedNodeIdValue:\n                    case Variables.UserScalarValueObjectType_ExpandedNodeIdValue:\n                        return _generator.GetRandom<ExpandedNodeId>();\n                    case Variables.ScalarValueObjectType_QualifiedNameValue:\n                    case Variables.UserScalarValueObjectType_QualifiedNameValue:\n                        return _generator.GetRandom<QualifiedName>();\n                    case Variables.ScalarValueObjectType_LocalizedTextValue:\n                    case Variables.UserScalarValueObjectType_LocalizedTextValue:\n                        return _generator.GetRandom<LocalizedText>();\n                    case Variables.ScalarValueObjectType_StatusCodeValue:\n                    case Variables.UserScalarValueObjectType_StatusCodeValue:\n                        return _generator.GetRandom<StatusCode>();\n                    case Variables.ScalarValueObjectType_VariantValue:\n                    case Variables.UserScalarValueObjectType_VariantValue:\n                        return _generator.GetRandomVariant().Value;\n                    case Variables.ScalarValueObjectType_StructureValue:\n                        return GetRandomStructure();\n                    case Variables.ScalarValueObjectType_EnumerationValue:\n                        return _generator.GetRandom<int>();\n                    case Variables.ScalarValueObjectType_NumberValue:\n                        return _generator.GetRandom(BuiltInType.Number);\n                    case Variables.ScalarValueObjectType_IntegerValue:\n                        return _generator.GetRandom(BuiltInType.Integer);\n                    case Variables.ScalarValueObjectType_UIntegerValue:\n                        return _generator.GetRandom(BuiltInType.UInteger);\n                    case Variables.ArrayValueObjectType_BooleanValue:\n                    case Variables.UserArrayValueObjectType_BooleanValue:\n                        return _generator.GetRandomArray<bool>();\n                    case Variables.ArrayValueObjectType_SByteValue:\n                    case Variables.UserArrayValueObjectType_SByteValue:\n                        return _generator.GetRandomArray<sbyte>();\n                    case Variables.ArrayValueObjectType_ByteValue:\n                    case Variables.UserArrayValueObjectType_ByteValue:\n                        return _generator.GetRandomArray<byte>();\n                    case Variables.ArrayValueObjectType_Int16Value:\n                    case Variables.UserArrayValueObjectType_Int16Value:\n                        return _generator.GetRandomArray<short>();\n                    case Variables.ArrayValueObjectType_UInt16Value:\n                    case Variables.UserArrayValueObjectType_UInt16Value:\n                        return _generator.GetRandomArray<ushort>();\n                    case Variables.ArrayValueObjectType_Int32Value:\n                    case Variables.UserArrayValueObjectType_Int32Value:\n                        return _generator.GetRandomArray<int>();\n                    case Variables.ArrayValueObjectType_UInt32Value:\n                    case Variables.UserArrayValueObjectType_UInt32Value:\n                        return _generator.GetRandomArray<uint>();\n                    case Variables.ArrayValueObjectType_Int64Value:\n                    case Variables.UserArrayValueObjectType_Int64Value:\n                        return _generator.GetRandomArray<long>();\n                    case Variables.ArrayValueObjectType_UInt64Value:\n                    case Variables.UserArrayValueObjectType_UInt64Value:\n                        return _generator.GetRandomArray<ulong>();\n                    case Variables.ArrayValueObjectType_FloatValue:\n                    case Variables.UserArrayValueObjectType_FloatValue:\n                        return _generator.GetRandomArray<float>();\n                    case Variables.ArrayValueObjectType_DoubleValue:\n                    case Variables.UserArrayValueObjectType_DoubleValue:\n                        return _generator.GetRandomArray<double>();\n                    case Variables.ArrayValueObjectType_StringValue:\n                    case Variables.UserArrayValueObjectType_StringValue:\n                        return _generator.GetRandomArray<string>();\n                    case Variables.ArrayValueObjectType_DateTimeValue:\n                    case Variables.UserArrayValueObjectType_DateTimeValue:\n                        return _generator.GetRandomArray<DateTime>();\n                    case Variables.ArrayValueObjectType_GuidValue:\n                    case Variables.UserArrayValueObjectType_GuidValue:\n                        return _generator.GetRandomArray<Guid>();\n                    case Variables.ArrayValueObjectType_ByteStringValue:\n                    case Variables.UserArrayValueObjectType_ByteStringValue:\n                        return _generator.GetRandomArray<byte[]>();\n                    case Variables.ArrayValueObjectType_XmlElementValue:\n                    case Variables.UserArrayValueObjectType_XmlElementValue:\n                        return _generator.GetRandomArray<XmlElement>();\n                    case Variables.ArrayValueObjectType_NodeIdValue:\n                    case Variables.UserArrayValueObjectType_NodeIdValue:\n                        return _generator.GetRandomArray<NodeId>();\n                    case Variables.ArrayValueObjectType_ExpandedNodeIdValue:\n                    case Variables.UserArrayValueObjectType_ExpandedNodeIdValue:\n                        return _generator.GetRandomArray<ExpandedNodeId>();\n                    case Variables.ArrayValueObjectType_QualifiedNameValue:\n                    case Variables.UserArrayValueObjectType_QualifiedNameValue:\n                        return _generator.GetRandomArray<QualifiedName>();\n                    case Variables.ArrayValueObjectType_LocalizedTextValue:\n                    case Variables.UserArrayValueObjectType_LocalizedTextValue:\n                        return _generator.GetRandomArray<LocalizedText>();\n                    case Variables.ArrayValueObjectType_StatusCodeValue:\n                    case Variables.UserArrayValueObjectType_StatusCodeValue:\n                        return _generator.GetRandomArray<StatusCode>();\n                    case Variables.ArrayValueObjectType_VariantValue:\n                    case Variables.UserArrayValueObjectType_VariantValue:\n                        return _generator.GetRandomArray<object>();\n                    case Variables.ArrayValueObjectType_EnumerationValue:\n                        return _generator.GetRandomArray<int>();\n                    case Variables.ArrayValueObjectType_NumberValue:\n                        return _generator.GetRandomArray(BuiltInType.Number, 100, false);\n                    case Variables.ArrayValueObjectType_IntegerValue:\n                        return _generator.GetRandomArray(BuiltInType.Integer, 100, false);\n                    case Variables.ArrayValueObjectType_UIntegerValue:\n                        return _generator.GetRandomArray(BuiltInType.UInteger, 100, false);\n                    case Variables.AnalogArrayValueObjectType_SByteValue:\n                        {\n                            var values = _generator.GetRandomArray<sbyte>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = (sbyte)(((int)(_generator.GetRandom<uint>() % 201)) - 100);\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_ByteValue:\n                        {\n                            var values = _generator.GetRandomArray<byte>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = (byte)((_generator.GetRandom<uint>() % 201) + 50);\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_Int16Value:\n                        {\n                            var values = _generator.GetRandomArray<short>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = (short)(((int)(_generator.GetRandom<uint>() % 201)) - 100);\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_UInt16Value:\n                        {\n                            var values = _generator.GetRandomArray<ushort>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = (ushort)((_generator.GetRandom<uint>() % 201) + 50);\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_Int32Value:\n                    case Variables.AnalogArrayValueObjectType_IntegerValue:\n                        {\n                            var values = _generator.GetRandomArray<int>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = ((int)(_generator.GetRandom<uint>() % 201)) - 100;\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_UInt32Value:\n                    case Variables.AnalogArrayValueObjectType_UIntegerValue:\n                        {\n                            var values = _generator.GetRandomArray<uint>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = (_generator.GetRandom<uint>() % 201) + 50;\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_Int64Value:\n                        {\n                            var values = _generator.GetRandomArray<long>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = ((int)(_generator.GetRandom<uint>() % 201)) - 100;\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_UInt64Value:\n                        {\n                            var values = _generator.GetRandomArray<ulong>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = (_generator.GetRandom<uint>() % 201) + 50;\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_FloatValue:\n                        {\n                            var values = _generator.GetRandomArray<float>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = ((int)(_generator.GetRandom<uint>() % 201)) - 100;\n                            }\n                            return values;\n                        }\n                    case Variables.AnalogArrayValueObjectType_DoubleValue:\n                    case Variables.AnalogArrayValueObjectType_NumberValue:\n                        {\n                            var values = _generator.GetRandomArray<double>();\n                            for (var i = 0; i < values.Length; i++)\n                            {\n                                values[i] = ((int)(_generator.GetRandom<uint>() % 201)) - 100;\n                            }\n                            return values;\n                        }\n                    case Variables.ArrayValueObjectType_StructureValue:\n                        {\n                            var values = _generator.GetRandomArray<ExtensionObject>(10);\n                            for (var i = 0; values != null && i < values.Length; i++)\n                            {\n                                values[i] = GetRandomStructure();\n                            }\n                            return values;\n                        }\n                }\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Returns a random structure.\n        /// </summary>\n        private ExtensionObject GetRandomStructure()\n        {\n            if (_generator.GetRandomBoolean())\n            {\n                var scalar = new ScalarValueDataType\n                {\n                    BooleanValue = _generator.GetRandom<bool>(),\n                    SByteValue = _generator.GetRandom<sbyte>(),\n                    ByteValue = _generator.GetRandom<byte>(),\n                    Int16Value = _generator.GetRandom<short>(),\n                    UInt16Value = _generator.GetRandom<ushort>(),\n                    Int32Value = _generator.GetRandom<int>(),\n                    UInt32Value = _generator.GetRandom<uint>(),\n                    Int64Value = _generator.GetRandom<long>(),\n                    UInt64Value = _generator.GetRandom<ulong>(),\n                    FloatValue = _generator.GetRandom<float>(),\n                    DoubleValue = _generator.GetRandom<double>(),\n                    StringValue = _generator.GetRandom<string>(),\n                    DateTimeValue = _generator.GetRandom<DateTime>(),\n                    GuidValue = _generator.GetRandom<Uuid>(),\n                    ByteStringValue = _generator.GetRandom<byte[]>(),\n                    XmlElementValue = _generator.GetRandom<XmlElement>(),\n                    NodeIdValue = _generator.GetRandom<NodeId>(),\n                    ExpandedNodeIdValue = _generator.GetRandom<ExpandedNodeId>(),\n                    QualifiedNameValue = _generator.GetRandom<QualifiedName>(),\n                    LocalizedTextValue = _generator.GetRandom<LocalizedText>(),\n                    StatusCodeValue = _generator.GetRandom<StatusCode>(),\n                    VariantValue = _generator.GetRandomVariant()\n                };\n                return new ExtensionObject(scalar);\n            }\n            var array = new ArrayValueDataType\n            {\n                BooleanValue = _generator.GetRandomArray<bool>(10),\n                SByteValue = _generator.GetRandomArray<sbyte>(10),\n                ByteValue = _generator.GetRandomArray<byte>(10),\n                Int16Value = _generator.GetRandomArray<short>(10),\n                UInt16Value = _generator.GetRandomArray<ushort>(10),\n                Int32Value = _generator.GetRandomArray<int>(10),\n                UInt32Value = _generator.GetRandomArray<uint>(10),\n                Int64Value = _generator.GetRandomArray<long>(10),\n                UInt64Value = _generator.GetRandomArray<ulong>(10),\n                FloatValue = _generator.GetRandomArray<float>(10),\n                DoubleValue = _generator.GetRandomArray<double>(10),\n                StringValue = _generator.GetRandomArray<string>(10),\n                DateTimeValue = _generator.GetRandomArray<DateTime>(10),\n                GuidValue = _generator.GetRandomArray<Uuid>(10),\n                ByteStringValue = _generator.GetRandomArray<byte[]>(10),\n                XmlElementValue = _generator.GetRandomArray<XmlElement>(10),\n                NodeIdValue = _generator.GetRandomArray<NodeId>(10),\n                ExpandedNodeIdValue = _generator.GetRandomArray<ExpandedNodeId>(10),\n                QualifiedNameValue = _generator.GetRandomArray<QualifiedName>(10),\n                LocalizedTextValue = _generator.GetRandomArray<LocalizedText>(10),\n                StatusCodeValue = _generator.GetRandomArray<StatusCode>(10)\n            };\n\n            var values = _generator.GetRandomArray<object>(10);\n            for (var i = 0; values != null && i < values.Length; i++)\n            {\n                array.VariantValue.Add(new Variant(values[i]));\n            }\n\n            return new ExtensionObject(array.TypeId, array);\n        }\n\n        public void StartMonitoringValue(uint monitoredItemId,\n            double samplingInterval, BaseVariableState variable)\n        {\n            lock (_lock)\n            {\n                _monitoredNodes ??= [];\n                _monitoredNodes[monitoredItemId] = variable;\n                SetSamplingInterval(samplingInterval);\n            }\n        }\n\n        public void SetSamplingInterval(double samplingInterval)\n        {\n            lock (_lock)\n            {\n                if (samplingInterval < 0)\n                {\n                    // _samplingEvent.Set();\n                    _minimumSamplingInterval = int.MaxValue;\n\n                    if (_timer != null)\n                    {\n                        _timer.Dispose();\n                        _timer = null;\n                    }\n\n                    return;\n                }\n\n                if (_minimumSamplingInterval > samplingInterval)\n                {\n                    _minimumSamplingInterval = (int)samplingInterval;\n\n                    if (_minimumSamplingInterval < 100)\n                    {\n                        _minimumSamplingInterval = 100;\n                    }\n\n                    if (_timer != null)\n                    {\n                        _timer.Dispose();\n                        _timer = null;\n                    }\n\n                    _timer = new Timer(DoSample, null,\n                        _minimumSamplingInterval, _minimumSamplingInterval);\n                }\n            }\n        }\n\n        private void DoSample(object state)\n        {\n            Utils.Trace(\"DoSample HiRes={0:ss.ffff} Now={1:ss.ffff}\", HiResClock.UtcNow, DateTime.UtcNow);\n\n            var samples = new Queue<Sample>();\n\n            lock (_lock)\n            {\n                if (_monitoredNodes == null)\n                {\n                    return;\n                }\n\n                foreach (var variable in _monitoredNodes.Values)\n                {\n                    var sample = new Sample\n                    {\n                        Variable = variable\n                    };\n                    sample.Value = ReadValue(sample.Variable);\n                    sample.StatusCode = StatusCodes.Good;\n                    sample.Timestamp = DateTime.UtcNow;\n\n                    samples.Enqueue(sample);\n                }\n            }\n\n            while (samples.Count > 0)\n            {\n                var sample = samples.Dequeue();\n\n                _callback.OnDataChange(\n                    sample.Variable,\n                    sample.Value,\n                    sample.StatusCode,\n                    sample.Timestamp);\n            }\n        }\n\n        public void StopMonitoringValue(uint monitoredItemId)\n        {\n            lock (_lock)\n            {\n                if (_monitoredNodes == null)\n                {\n                    return;\n                }\n\n                _monitoredNodes.Remove(monitoredItemId);\n\n                if (_monitoredNodes.Count == 0)\n                {\n                    SetSamplingInterval(-1);\n                }\n            }\n        }\n\n        private sealed class Sample\n        {\n            public BaseVariableState Variable;\n            public object Value;\n            public StatusCode StatusCode;\n            public DateTime Timestamp;\n        }\n\n        private readonly Lock _lock = new();\n        private readonly ITestDataSystemCallback _callback;\n        private readonly Opc.Ua.Test.TestDataGenerator _generator;\n        private int _minimumSamplingInterval;\n        private Dictionary<uint, BaseVariableState> _monitoredNodes;\n        private Timer _timer;\n        private HistoryArchive _historyArchive;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/TestSystemConditionState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n\n    public partial class TestSystemConditionState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            MonitoredNodeCount.OnSimpleReadValue = OnReadMonitoredNodeCount;\n        }\n\n        /// <summary>\n        /// Reads the value for the MonitoredNodeCount.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        /// <param name=\"value\"></param>\n        protected virtual ServiceResult OnReadMonitoredNodeCount(\n            ISystemContext context,\n            NodeState node,\n            ref object value)\n        {\n            if (context.SystemHandle is not TestDataSystem system)\n            {\n                return StatusCodes.BadOutOfService;\n            }\n\n            value = system.MonitoredNodeCount;\n            return ServiceResult.Good;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/UserArrayValueObjectState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n\n    public partial class UserArrayValueObjectState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            InitializeVariable(context, BooleanValue, Variables.UserArrayValueObjectType_BooleanValue);\n            InitializeVariable(context, SByteValue, Variables.UserArrayValueObjectType_SByteValue);\n            InitializeVariable(context, ByteValue, Variables.UserArrayValueObjectType_ByteValue);\n            InitializeVariable(context, Int16Value, Variables.UserArrayValueObjectType_Int16Value);\n            InitializeVariable(context, UInt16Value, Variables.UserArrayValueObjectType_UInt16Value);\n            InitializeVariable(context, Int32Value, Variables.UserArrayValueObjectType_Int32Value);\n            InitializeVariable(context, UInt32Value, Variables.UserArrayValueObjectType_UInt32Value);\n            InitializeVariable(context, Int64Value, Variables.UserArrayValueObjectType_Int64Value);\n            InitializeVariable(context, UInt64Value, Variables.UserArrayValueObjectType_UInt64Value);\n            InitializeVariable(context, FloatValue, Variables.UserArrayValueObjectType_FloatValue);\n            InitializeVariable(context, DoubleValue, Variables.UserArrayValueObjectType_DoubleValue);\n            InitializeVariable(context, StringValue, Variables.UserArrayValueObjectType_StringValue);\n            InitializeVariable(context, DateTimeValue, Variables.UserArrayValueObjectType_DateTimeValue);\n            InitializeVariable(context, GuidValue, Variables.UserArrayValueObjectType_GuidValue);\n            InitializeVariable(context, ByteStringValue, Variables.UserArrayValueObjectType_ByteStringValue);\n            InitializeVariable(context, XmlElementValue, Variables.UserArrayValueObjectType_XmlElementValue);\n            InitializeVariable(context, NodeIdValue, Variables.UserArrayValueObjectType_NodeIdValue);\n            InitializeVariable(context, ExpandedNodeIdValue, Variables.UserArrayValueObjectType_ExpandedNodeIdValue);\n            InitializeVariable(context, QualifiedNameValue, Variables.UserArrayValueObjectType_QualifiedNameValue);\n            InitializeVariable(context, LocalizedTextValue, Variables.UserArrayValueObjectType_LocalizedTextValue);\n            InitializeVariable(context, StatusCodeValue, Variables.UserArrayValueObjectType_StatusCodeValue);\n            InitializeVariable(context, VariantValue, Variables.UserArrayValueObjectType_VariantValue);\n        }\n\n        /// <summary>\n        /// Handles the generate values method.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"objectId\"></param>\n        /// <param name=\"count\"></param>\n        protected override ServiceResult OnGenerateValues(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            uint count)\n        {\n            if (context.SystemHandle is not TestDataSystem system)\n            {\n                return StatusCodes.BadOutOfService;\n            }\n\n            GenerateValue(system, BooleanValue);\n            GenerateValue(system, SByteValue);\n            GenerateValue(system, ByteValue);\n            GenerateValue(system, Int16Value);\n            GenerateValue(system, UInt16Value);\n            GenerateValue(system, Int32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, Int64Value);\n            GenerateValue(system, UInt64Value);\n            GenerateValue(system, FloatValue);\n            GenerateValue(system, DoubleValue);\n            GenerateValue(system, StringValue);\n            GenerateValue(system, DateTimeValue);\n            GenerateValue(system, GuidValue);\n            GenerateValue(system, ByteStringValue);\n            GenerateValue(system, XmlElementValue);\n            GenerateValue(system, NodeIdValue);\n            GenerateValue(system, ExpandedNodeIdValue);\n            GenerateValue(system, QualifiedNameValue);\n            GenerateValue(system, LocalizedTextValue);\n            GenerateValue(system, StatusCodeValue);\n            GenerateValue(system, VariantValue);\n\n            return base.OnGenerateValues(context, method, objectId, count);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/TestData/UserScalarValueObjectState.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2016 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace TestData\n{\n    using Opc.Ua;\n\n    public partial class UserScalarValueObjectState\n    {\n        /// <summary>\n        /// Initializes the object as a collection of counters which change value on read.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        protected override void OnAfterCreate(ISystemContext context, NodeState node)\n        {\n            base.OnAfterCreate(context, node);\n\n            InitializeVariable(context, BooleanValue, Variables.UserScalarValueObjectType_BooleanValue);\n            InitializeVariable(context, SByteValue, Variables.UserScalarValueObjectType_SByteValue);\n            InitializeVariable(context, ByteValue, Variables.UserScalarValueObjectType_ByteValue);\n            InitializeVariable(context, Int16Value, Variables.UserScalarValueObjectType_Int16Value);\n            InitializeVariable(context, UInt16Value, Variables.UserScalarValueObjectType_UInt16Value);\n            InitializeVariable(context, Int32Value, Variables.UserScalarValueObjectType_Int32Value);\n            InitializeVariable(context, UInt32Value, Variables.UserScalarValueObjectType_UInt32Value);\n            InitializeVariable(context, Int64Value, Variables.UserScalarValueObjectType_Int64Value);\n            InitializeVariable(context, UInt64Value, Variables.UserScalarValueObjectType_UInt64Value);\n            InitializeVariable(context, FloatValue, Variables.UserScalarValueObjectType_FloatValue);\n            InitializeVariable(context, DoubleValue, Variables.UserScalarValueObjectType_DoubleValue);\n            InitializeVariable(context, StringValue, Variables.UserScalarValueObjectType_StringValue);\n            InitializeVariable(context, DateTimeValue, Variables.UserScalarValueObjectType_DateTimeValue);\n            InitializeVariable(context, GuidValue, Variables.UserScalarValueObjectType_GuidValue);\n            InitializeVariable(context, ByteStringValue, Variables.UserScalarValueObjectType_ByteStringValue);\n            InitializeVariable(context, XmlElementValue, Variables.UserScalarValueObjectType_XmlElementValue);\n            InitializeVariable(context, NodeIdValue, Variables.UserScalarValueObjectType_NodeIdValue);\n            InitializeVariable(context, ExpandedNodeIdValue, Variables.UserScalarValueObjectType_ExpandedNodeIdValue);\n            InitializeVariable(context, QualifiedNameValue, Variables.UserScalarValueObjectType_QualifiedNameValue);\n            InitializeVariable(context, LocalizedTextValue, Variables.UserScalarValueObjectType_LocalizedTextValue);\n            InitializeVariable(context, StatusCodeValue, Variables.UserScalarValueObjectType_StatusCodeValue);\n            InitializeVariable(context, VariantValue, Variables.UserScalarValueObjectType_VariantValue);\n        }\n\n        /// <summary>\n        /// Handles the generate values method.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"method\"></param>\n        /// <param name=\"objectId\"></param>\n        /// <param name=\"count\"></param>\n        protected override ServiceResult OnGenerateValues(\n            ISystemContext context,\n            MethodState method,\n            NodeId objectId,\n            uint count)\n        {\n            if (context.SystemHandle is not TestDataSystem system)\n            {\n                return StatusCodes.BadOutOfService;\n            }\n\n            GenerateValue(system, BooleanValue);\n            GenerateValue(system, SByteValue);\n            GenerateValue(system, ByteValue);\n            GenerateValue(system, Int16Value);\n            GenerateValue(system, UInt16Value);\n            GenerateValue(system, Int32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, UInt32Value);\n            GenerateValue(system, Int64Value);\n            GenerateValue(system, UInt64Value);\n            GenerateValue(system, FloatValue);\n            GenerateValue(system, DoubleValue);\n            GenerateValue(system, StringValue);\n            GenerateValue(system, DateTimeValue);\n            GenerateValue(system, GuidValue);\n            GenerateValue(system, ByteStringValue);\n            GenerateValue(system, XmlElementValue);\n            GenerateValue(system, NodeIdValue);\n            GenerateValue(system, ExpandedNodeIdValue);\n            GenerateValue(system, QualifiedNameValue);\n            GenerateValue(system, LocalizedTextValue);\n            GenerateValue(system, StatusCodeValue);\n            GenerateValue(system, VariantValue);\n\n            return base.OnGenerateValues(context, method, objectId, count);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Utils/DeterministicGuid.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Opc.Ua.Test\n{\n    using System;\n\n    public static class DeterministicGuid\n    {\n        public static Guid NewGuid()\n        {\n            return new Guid($\"{GetRandHex(4)}-{GetRandHex(2)}-{GetRandHex(2)}-{GetRandHex(2)}-{GetRandHex(6)}\");\n        }\n\n        private static string GetRandHex(int length)\n        {\n            var hexString = string.Empty;\n\n            for (var i = 0; i < length; i++)\n            {\n#pragma warning disable CA5394 // Do not use insecure randomness\n                hexString += $\"{Random.Shared.Next(0, 255):x2}\";\n#pragma warning restore CA5394 // Do not use insecure randomness\n            }\n\n            return hexString;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Utils/FastTimer.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Opc.Ua.Test\n{\n    using System;\n    using System.Diagnostics;\n    using System.Threading;\n\n    public sealed class FastTimer : ITimer\n    {\n        /// <summary>\n        /// Initializes a new instance of the FastTimer class and sets all properties to their default values\n        /// </summary>\n        public FastTimer()\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the FastTimer class and sets all properties to their default values except interval\n        /// </summary>\n        /// <param name=\"interval\"></param>\n        public FastTimer(double interval)\n        {\n            Interval = interval;\n        }\n\n        /// <summary>\n        /// Property that sets if the timer should restart when an event has been fired\n        /// </summary>\n        public bool AutoReset { get; set; } = true;\n\n        /// <summary>\n        /// Is this timer currently running?\n        /// </summary>\n        public bool Enabled\n        {\n            get => _isEnabled;\n            set\n            {\n                _isEnabled = value;\n                if (_isEnabled)\n                {\n                    Start();\n                }\n                else\n                {\n                    Stop();\n                }\n            }\n        }\n\n        /// <summary>\n        /// The current interval between triggering of this timer\n        /// </summary>\n        public double Interval { get; set; }\n\n        /// <summary>\n        /// The event handler we call when the timer is triggered\n        /// </summary>\n        public event EventHandler<FastTimerElapsedEventArgs> Elapsed;\n\n        public void Close()\n        {\n            Enabled = false;\n        }\n\n        /// <summary>\n        /// Starts the timer\n        /// </summary>\n        private void Start()\n        {\n            var isRunning = Interlocked.Exchange(ref _isRunning, 1);\n            if (isRunning == 0)\n            {\n                var thread = new Thread(Runner)\n                {\n                    Priority = ThreadPriority.Highest\n                };\n                thread.Start();\n            }\n        }\n\n        /// <summary>\n        /// Stops the timer\n        /// </summary>\n        private void Stop()\n        {\n            Interlocked.Exchange(ref _isRunning, 0);\n        }\n\n        private void Runner()\n        {\n            double nextTrigger = 0f;\n\n            var sw = new Stopwatch();\n            sw.Start();\n\n            while (_isRunning == 1)\n            {\n                WaitInterval(sw, ref nextTrigger);\n                if (_isRunning == 1)\n                {\n                    Elapsed?.Invoke(this, new FastTimerElapsedEventArgs());\n\n                    if (!AutoReset)\n                    {\n                        Interlocked.Exchange(ref _isRunning, 0);\n                        Enabled = false;\n                        break;\n                    }\n\n                    // restarting the timer in every hour to prevent precision problems\n                    if (sw.Elapsed.TotalHours >= 1d)\n                    {\n                        sw.Restart();\n                        nextTrigger = 0f;\n                    }\n                }\n            }\n\n            sw.Stop();\n        }\n\n        private void WaitInterval(Stopwatch sw, ref double nextTrigger)\n        {\n            var intervalLocal = Interval;\n            nextTrigger += intervalLocal;\n\n            while (true)\n            {\n                var elapsed = sw.ElapsedTicks * kTickFrequency;\n                var diff = nextTrigger - elapsed;\n                if (diff <= 0f)\n                {\n                    break;\n                }\n\n                if (diff < 1f)\n                {\n                    Thread.SpinWait(10);\n                }\n                else if (diff < 10f)\n                {\n                    Thread.SpinWait(100);\n                }\n                else\n                {\n                    if (diff >= 16f)\n                    {\n                        Thread.Sleep(diff >= 100f ? 50 : 1);\n                    }\n                    else\n                    {\n                        Thread.SpinWait(1000);\n                        Thread.Sleep(0);\n                    }\n\n                    // if we have a larger time to wait, we check if the interval has been changed in the meantime\n                    var newInterval = Interval;\n\n                    if (intervalLocal != newInterval)\n                    {\n                        nextTrigger += newInterval - intervalLocal;\n                        intervalLocal = newInterval;\n                    }\n                }\n\n                if (_isRunning == 0)\n                {\n                    return;\n                }\n            }\n        }\n\n        public void Dispose()\n        {\n            Interlocked.Exchange(ref _isRunning, 0);\n        }\n\n        private static readonly float kTickFrequency = 1000f / Stopwatch.Frequency;\n\n        private bool _isEnabled;\n        private int _isRunning;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Utils/FastTimerElapsedEventArgs.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Opc.Ua.Test\n{\n    using System;\n\n    public class FastTimerElapsedEventArgs : EventArgs;\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Utils/ITimer.cs",
    "content": "﻿/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Opc.Ua.Test\n{\n    using System;\n    using Timer = System.Timers.Timer;\n\n    /// <summary>\n    /// An interface expressing the methods from the <see cref=\"Timer\"/> class\n    /// used in this project. Used for mocking.\n    /// Add methods and properties from <see cref=\"Timer\"/> to this interface as needed.\n    /// </summary>\n    public interface ITimer : IDisposable\n    {\n        bool Enabled { get; set; }\n\n        bool AutoReset { get; set; }\n\n        double Interval { get; set; }\n\n        void Close();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Utils/TestDataGenerator.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Opc.Ua.Test\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Reflection;\n    using System.Text;\n    using System.Xml;\n\n    /// <summary>\n    /// Data generator that generates non null typed data.  This is a\n    /// fork of the DataGenerator, but ensuring that the data generated\n    /// is consistent for the use in unit tests.\n    /// </summary>\n    public class TestDataGenerator\n    {\n        /// <summary>\n        /// Set max array length\n        /// </summary>\n        public int MaxArrayLength { get; set; } = 100;\n\n        /// <summary>\n        /// Set max string length\n        /// </summary>\n        public int MaxStringLength { get; set; } = 100;\n\n        /// <summary>\n        /// Set min date time value\n        /// </summary>\n        public DateTime MinDateTimeValue { get; set; }\n\n        /// <summary>\n        /// Set max date time value\n        /// </summary>\n        public DateTime MaxDateTimeValue { get; set; }\n\n        /// <summary>\n        /// Max xml attribute count\n        /// </summary>\n        public int MaxXmlAttributeCount { get; set; } = 10;\n\n        /// <summary>\n        /// Max xml element count\n        /// </summary>\n        public int MaxXmlElementCount { get; set; } = 10;\n\n        /// <summary>\n        /// Namespace uris\n        /// </summary>\n        public NamespaceTable NamespaceUris { get; set; }\n\n        /// <summary>\n        /// Server uris\n        /// </summary>\n        public StringTable ServerUris { get; set; }\n\n        /// <summary>\n        /// Frequency of boundary values used\n        /// </summary>\n        public int BoundaryValueFrequency { get; set; } = 20;\n\n        /// <summary>\n        /// Create generator\n        /// </summary>\n        /// <param name=\"random\"></param>\n        public TestDataGenerator(IRandomSource random = null)\n        {\n            MinDateTimeValue = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc);\n            MaxDateTimeValue = new DateTime(2100, 1, 1, 0, 0, 0, DateTimeKind.Utc);\n            NamespaceUris = new NamespaceTable();\n            ServerUris = new StringTable();\n            _random = random ?? new RandomSource();\n            _boundaryValues = [];\n            for (var i = 0; i < kAvailableBoundaryValues.Length; i++)\n            {\n                _boundaryValues[kAvailableBoundaryValues[i].SystemType.Name] =\n                    [.. kAvailableBoundaryValues[i].Values];\n            }\n            _tokenValues = LoadStringData(\"Opc.Ua.Types.Utils.LocalizedData.txt\");\n            if (_tokenValues.Count == 0)\n            {\n                _tokenValues = LoadStringData(\"Opc.Ua.Utils.LocalizedData.txt\");\n            }\n            _availableLocales = new string[_tokenValues.Count];\n            var num = 0;\n            foreach (var key in _tokenValues.Keys)\n            {\n                _availableLocales[num++] = key;\n            }\n        }\n\n        /// <summary>\n        /// Get random data\n        /// </summary>\n        /// <param name=\"dataType\"></param>\n        /// <param name=\"valueRank\"></param>\n        /// <param name=\"arrayDimensions\"></param>\n        /// <param name=\"typeTree\"></param>\n        /// <returns></returns>\n        public object GetRandom(NodeId dataType, int valueRank, IList<uint> arrayDimensions,\n            ITypeTable typeTree)\n        {\n            var builtInType = Ua.TypeInfo.GetBuiltInType(dataType, typeTree);\n            int num;\n            switch (valueRank)\n            {\n                case -2:\n                    num = (arrayDimensions == null || arrayDimensions.Count == 0) ?\n                        GetRandomRange(0, 1) : arrayDimensions.Count;\n                    break;\n                case -3:\n                    num = GetRandomRange(0, 1);\n                    break;\n                case 0:\n                    num = (arrayDimensions == null || arrayDimensions.Count == 0) ?\n                        GetRandomRange(1, 1) : arrayDimensions.Count;\n                    break;\n                case -1:\n                    num = 0;\n                    break;\n                default:\n                    num = valueRank;\n                    break;\n            }\n            if (num == 0)\n            {\n                if (builtInType == BuiltInType.Variant)\n                {\n                    var builtInType2 = BuiltInType.Variant;\n                    while (builtInType2 == BuiltInType.Variant || builtInType2 == BuiltInType.DataValue)\n                    {\n                        builtInType2 = (BuiltInType)_random.NextInt32(24);\n                    }\n                    return GetRandomVariant(builtInType2, isArray: false);\n                }\n                return GetRandom(builtInType);\n            }\n            var array = new int[num];\n            for (var i = 0; i < num; i++)\n            {\n                if (arrayDimensions != null && arrayDimensions.Count > i)\n                {\n                    array[i] = (int)arrayDimensions[i];\n                }\n                while (array[i] == 0)\n                {\n                    array[i] = _random.NextInt32(MaxArrayLength);\n                }\n            }\n            var array2 = Ua.TypeInfo.CreateArray(builtInType, array);\n            var length = array2.Length;\n            var array3 = new int[array.Length];\n            for (var j = 0; j < length; j++)\n            {\n                var num2 = array2.Length;\n                for (var k = 0; k < array3.Length; k++)\n                {\n                    num2 /= array[k];\n                    array3[k] = j / num2 % array[k];\n                }\n                var obj = GetRandom(dataType, -1, null, typeTree);\n                if (obj != null)\n                {\n                    if (builtInType == BuiltInType.Guid)\n                    {\n                        obj = new Uuid((Guid)obj);\n                    }\n                    array2.SetValue(obj, array3);\n                }\n            }\n            return array2;\n        }\n\n        /// <summary>\n        /// Get random data\n        /// </summary>\n        /// <param name=\"expectedType\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public object GetRandom(BuiltInType expectedType)\n        {\n            switch (expectedType)\n            {\n                case BuiltInType.Boolean:\n                    return GetRandomBoolean();\n                case BuiltInType.SByte:\n                    return GetRandomSByte();\n                case BuiltInType.Byte:\n                    return GetRandomByte();\n                case BuiltInType.Int16:\n                    return GetRandomInt16();\n                case BuiltInType.UInt16:\n                    return GetRandomUInt16();\n                case BuiltInType.Int32:\n                    return GetRandomInt32();\n                case BuiltInType.UInt32:\n                    return GetRandomUInt32();\n                case BuiltInType.Int64:\n                    return GetRandomInt64();\n                case BuiltInType.UInt64:\n                    return GetRandomUInt64();\n                case BuiltInType.Float:\n                    return GetRandomFloat();\n                case BuiltInType.Double:\n                    return GetRandomDouble();\n                case BuiltInType.String:\n                    return GetRandomString();\n                case BuiltInType.DateTime:\n                    return GetRandomDateTime();\n                case BuiltInType.Guid:\n                    return GetRandomGuid();\n                case BuiltInType.ByteString:\n                    return GetRandomByteString();\n                case BuiltInType.XmlElement:\n                    return GetRandomXmlElement();\n                case BuiltInType.NodeId:\n                    return GetRandomNodeId();\n                case BuiltInType.ExpandedNodeId:\n                    return GetRandomExpandedNodeId();\n                case BuiltInType.QualifiedName:\n                    return GetRandomQualifiedName();\n                case BuiltInType.LocalizedText:\n                    return GetRandomLocalizedText();\n                case BuiltInType.StatusCode:\n                    return GetRandomStatusCode();\n                case BuiltInType.Variant:\n                    return GetRandomVariant();\n                case BuiltInType.Enumeration:\n                    return GetRandomInt32();\n                case BuiltInType.ExtensionObject:\n                    return GetRandomExtensionObject();\n                case BuiltInType.Number:\n                    {\n                        var builtInType = (BuiltInType)(_random.NextInt32(9) + 2);\n                        return GetRandomVariant(builtInType, isArray: false);\n                    }\n                case BuiltInType.Integer:\n                    {\n                        var builtInType = (BuiltInType)((_random.NextInt32(3) * 2) + 2);\n                        return GetRandomVariant(builtInType, isArray: false);\n                    }\n                case BuiltInType.UInteger:\n                    {\n                        var builtInType = (BuiltInType)((_random.NextInt32(3) * 2) + 3);\n                        return GetRandomVariant(builtInType, isArray: false);\n                    }\n                case BuiltInType.Null:\n                    return null;\n                default:\n                    throw new ArgumentException($\"Unexpected scalar type {expectedType} passed\");\n            }\n        }\n\n        /// <summary>\n        /// Get random array data\n        /// </summary>\n        /// <param name=\"expectedType\"></param>\n        /// <param name=\"length\"></param>\n        /// <param name=\"fixedLength\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public Array GetRandomArray(BuiltInType expectedType, int length,\n            bool fixedLength)\n        {\n            switch (expectedType)\n            {\n                case BuiltInType.Boolean:\n                    return GetRandomArray<bool>(length, fixedLength);\n                case BuiltInType.SByte:\n                    return GetRandomArray<sbyte>(length, fixedLength);\n                case BuiltInType.Byte:\n                    return GetRandomArray<byte>(length, fixedLength);\n                case BuiltInType.Int16:\n                    return GetRandomArray<short>(length, fixedLength);\n                case BuiltInType.UInt16:\n                    return GetRandomArray<ushort>(length, fixedLength);\n                case BuiltInType.Int32:\n                    return GetRandomArray<int>(length, fixedLength);\n                case BuiltInType.UInt32:\n                    return GetRandomArray<uint>(length, fixedLength);\n                case BuiltInType.Int64:\n                    return GetRandomArray<long>(length, fixedLength);\n                case BuiltInType.UInt64:\n                    return GetRandomArray<ulong>(length, fixedLength);\n                case BuiltInType.Float:\n                    return GetRandomArray<float>(length, fixedLength);\n                case BuiltInType.Double:\n                    return GetRandomArray<double>(length, fixedLength);\n                case BuiltInType.String:\n                    return GetRandomArray<string>(length, fixedLength);\n                case BuiltInType.DateTime:\n                    return GetRandomArray<DateTime>(length, fixedLength);\n                case BuiltInType.Guid:\n                    return GetRandomArray<Uuid>(length, fixedLength);\n                case BuiltInType.ByteString:\n                    return GetRandomArray<byte[]>(length, fixedLength);\n                case BuiltInType.XmlElement:\n                    return GetRandomArray<XmlElement>(length, fixedLength);\n                case BuiltInType.NodeId:\n                    return GetRandomArray<NodeId>(length, fixedLength);\n                case BuiltInType.ExpandedNodeId:\n                    return GetRandomArray<ExpandedNodeId>(length, fixedLength);\n                case BuiltInType.QualifiedName:\n                    return GetRandomArray<QualifiedName>(length, fixedLength);\n                case BuiltInType.LocalizedText:\n                    return GetRandomArray<LocalizedText>(length, fixedLength);\n                case BuiltInType.StatusCode:\n                    return GetRandomArray<StatusCode>(length, fixedLength);\n                case BuiltInType.Variant:\n                    return GetRandomArray<Variant>(length, fixedLength);\n                case BuiltInType.Enumeration:\n                    return GetRandomArray<int>(length, fixedLength);\n                case BuiltInType.ExtensionObject:\n                    return GetRandomArray<ExtensionObject>(length, fixedLength);\n                case BuiltInType.Number:\n                    {\n                        var builtInType3 = (BuiltInType)(_random.NextInt32(9) + 2);\n                        return GetRandomArrayInVariant(builtInType3, length, fixedLength);\n                    }\n                case BuiltInType.Integer:\n                    {\n                        var builtInType2 = (BuiltInType)((_random.NextInt32(3) * 2) + 2);\n                        return GetRandomArrayInVariant(builtInType2, length, fixedLength);\n                    }\n                case BuiltInType.UInteger:\n                    {\n                        var builtInType = (BuiltInType)((_random.NextInt32(3) * 2) + 3);\n                        return GetRandomArrayInVariant(builtInType, length, fixedLength);\n                    }\n                case BuiltInType.Null:\n                    return null;\n                default:\n                    throw new ArgumentException($\"Unexpected array type {expectedType} passed\");\n            }\n        }\n\n        /// <summary>\n        /// Get random\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <returns></returns>\n        public T GetRandom<T>()\n        {\n            if (UseBoundaryValue())\n            {\n                var boundaryValue = GetBoundaryValue(typeof(T));\n                if (boundaryValue != null)\n                {\n                    return (T)boundaryValue;\n                }\n            }\n            return (T)GetRandom(typeof(T));\n        }\n\n        /// <summary>\n        /// Get random array\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"length\"></param>\n        /// <param name=\"fixedLength\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentOutOfRangeException\"></exception>\n        public T[] GetRandomArray<T>(int length = 100, bool fixedLength = false)\n        {\n            if (length < 0)\n            {\n                throw new ArgumentOutOfRangeException(nameof(length),\n                    $\"Length is negative {length}\");\n            }\n            if (!fixedLength)\n            {\n                length = _random.NextInt32(length);\n            }\n            var array = new T[length];\n            for (var i = 0; i < array.Length; i++)\n            {\n                object obj = null;\n                do\n                {\n                    if (UseBoundaryValue())\n                    {\n                        obj = GetBoundaryValue(typeof(T));\n                    }\n                    obj ??= GetRandom<T>();\n                }\n                while (obj == null);\n                array[i] = (T)obj;\n            }\n            return array;\n        }\n\n        /// <summary>\n        /// Random boolean\n        /// </summary>\n        /// <returns></returns>\n        public bool GetRandomBoolean()\n        {\n            return _random.NextInt32(1) != 0;\n        }\n\n        /// <summary>\n        /// Random signed byte\n        /// </summary>\n        /// <returns></returns>\n        public sbyte GetRandomSByte()\n        {\n            var num = _random.NextInt32(255);\n            if (num > 127)\n            {\n                return (sbyte)(-128 + (num - 127) - 1);\n            }\n            return (sbyte)num;\n        }\n\n        /// <summary>\n        /// Random byte\n        /// </summary>\n        /// <returns></returns>\n        public byte GetRandomByte()\n        {\n            return (byte)_random.NextInt32(255);\n        }\n\n        /// <summary>\n        /// Random short\n        /// </summary>\n        /// <returns></returns>\n        public short GetRandomInt16()\n        {\n            var array = new byte[2];\n            _random.NextBytes(array, 0, array.Length);\n            return BitConverter.ToInt16(array, 0);\n        }\n\n        /// <summary>\n        /// random ushort\n        /// </summary>\n        /// <returns></returns>\n        public ushort GetRandomUInt16()\n        {\n            var array = new byte[2];\n            _random.NextBytes(array, 0, array.Length);\n            return BitConverter.ToUInt16(array, 0);\n        }\n\n        /// <summary>\n        /// Random int32\n        /// </summary>\n        /// <returns></returns>\n        public int GetRandomInt32()\n        {\n            var array = new byte[4];\n            _random.NextBytes(array, 0, array.Length);\n            return BitConverter.ToInt32(array, 0);\n        }\n\n        /// <summary>\n        /// Random uint32\n        /// </summary>\n        /// <returns></returns>\n        public uint GetRandomUInt32()\n        {\n            var array = new byte[4];\n            _random.NextBytes(array, 0, array.Length);\n            return BitConverter.ToUInt32(array, 0);\n        }\n\n        /// <summary>\n        /// Random uint64\n        /// </summary>\n        /// <returns></returns>\n        public long GetRandomInt64()\n        {\n            var array = new byte[8];\n            _random.NextBytes(array, 0, array.Length);\n            return BitConverter.ToInt64(array, 0);\n        }\n\n        /// <summary>\n        /// Random int64\n        /// </summary>\n        /// <returns></returns>\n        public ulong GetRandomUInt64()\n        {\n            var array = new byte[8];\n            _random.NextBytes(array, 0, array.Length);\n            return BitConverter.ToUInt64(array, 0);\n        }\n\n        public float GetRandomFloat()\n        {\n            var array = new byte[4];\n            _random.NextBytes(array, 0, array.Length);\n            return BitConverter.ToSingle(array, 0);\n        }\n\n        /// <summary>\n        /// Get random double\n        /// </summary>\n        /// <returns></returns>\n        public double GetRandomDouble()\n        {\n            var array = new byte[8];\n            _random.NextBytes(array, 0, array.Length);\n            return BitConverter.ToDouble(array, 0);\n        }\n\n        /// <summary>\n        /// Random string\n        /// </summary>\n        /// <returns></returns>\n        public string GetRandomString()\n        {\n            return CreateString(GetRandomLocale(), false);\n        }\n\n        public DateTime GetRandomDateTime()\n        {\n            var min = (int)(MinDateTimeValue.Ticks >> 32);\n            var max = (int)(MaxDateTimeValue.Ticks >> 32);\n            long num = GetRandomRange(min, max);\n            var num2 = num << 32;\n            var randomUInt = GetRandomUInt32();\n            return new DateTime(num2 + randomUInt, DateTimeKind.Utc);\n        }\n\n        /// <summary>\n        /// Get random guid\n        /// </summary>\n        /// <returns></returns>\n        public Guid GetRandomGuid()\n        {\n            var array = new byte[16];\n            _random.NextBytes(array, 0, array.Length);\n            return new Guid(array);\n        }\n\n        /// <summary>\n        /// Get random byte array\n        /// </summary>\n        /// <returns></returns>\n        public byte[] GetRandomByteString()\n        {\n            var num = _random.NextInt32(MaxStringLength);\n            var array = new byte[num];\n            _random.NextBytes(array, 0, array.Length);\n            return array;\n        }\n\n        /// <summary>\n        /// Get random xml element\n        /// </summary>\n        /// <returns></returns>\n        public XmlElement GetRandomXmlElement()\n        {\n            var randomLocale = GetRandomLocale();\n            var randomLocale2 = GetRandomLocale();\n            var xmlDocument = new XmlDocument();\n            var xmlElement = xmlDocument.CreateElement(\"n0\",\n                CreateString(randomLocale, true), Utils.Format(\"http://{0}\", CreateString(randomLocale, true)));\n            xmlDocument.AppendChild(xmlElement);\n            var num = _random.NextInt32(MaxXmlAttributeCount);\n            for (var i = 0; i < num; i++)\n            {\n                var name = CreateString(randomLocale, true);\n                var xmlAttribute = xmlDocument.CreateAttribute(name);\n                xmlAttribute.Value = CreateString(randomLocale2, true);\n                xmlElement.SetAttributeNode(xmlAttribute);\n            }\n            var num2 = _random.NextInt32(MaxXmlElementCount);\n            for (var j = 0; j < num2; j++)\n            {\n                var localName = CreateString(randomLocale, true);\n                var xmlElement2 = xmlDocument.CreateElement(xmlElement.Prefix, localName, xmlElement.NamespaceURI);\n                xmlElement2.InnerText = CreateString(randomLocale2, false);\n                xmlElement.AppendChild(xmlElement2);\n            }\n            return xmlElement;\n        }\n\n        /// <summary>\n        /// Get random node id\n        /// </summary>\n        /// <returns></returns>\n        public NodeId GetRandomNodeId()\n        {\n            var namespaceIndex = (ushort)_random.NextInt32(NamespaceUris.Count - 1);\n            switch (_random.NextInt32(4))\n            {\n                case 1:\n                    return new NodeId(CreateString(GetRandomLocale(), true), namespaceIndex);\n                case 2:\n                    return new NodeId(GetRandomGuid(), namespaceIndex);\n                case 3:\n                    return new NodeId(GetRandomByteString(), namespaceIndex);\n                default:\n                    return new NodeId(GetRandomUInt32(), namespaceIndex);\n            }\n        }\n\n        /// <summary>\n        /// Get random expanded node id\n        /// </summary>\n        /// <returns></returns>\n        public ExpandedNodeId GetRandomExpandedNodeId()\n        {\n            var randomNodeId = GetRandomNodeId();\n            var serverIndex = (ushort)((ServerUris.Count != 0) ?\n                ((ushort)_random.NextInt32(ServerUris.Count - 1)) : 0);\n            return new ExpandedNodeId(randomNodeId, NamespaceUris.GetString(randomNodeId.NamespaceIndex), serverIndex);\n        }\n\n        /// <summary>\n        /// Get random qn\n        /// </summary>\n        /// <returns></returns>\n        public QualifiedName GetRandomQualifiedName()\n        {\n            var namespaceIndex = (ushort)_random.NextInt32(NamespaceUris.Count - 1);\n            return new QualifiedName(CreateString(GetRandomLocale(), true), namespaceIndex);\n        }\n\n        /// <summary>\n        /// Get random localized text\n        /// </summary>\n        /// <returns></returns>\n        public LocalizedText GetRandomLocalizedText()\n        {\n            var randomLocale = GetRandomLocale();\n            return new LocalizedText(randomLocale, CreateString(randomLocale, false));\n        }\n\n        /// <summary>\n        /// Get random status code\n        /// </summary>\n        /// <returns></returns>\n        public StatusCode GetRandomStatusCode()\n        {\n            var randomRange = GetRandomRange(32769, 32951);\n            return (uint)(2147549184u + (randomRange << 16));\n        }\n\n        /// <summary>\n        /// Create random variant\n        /// </summary>\n        /// <param name=\"allowArrays\"></param>\n        /// <returns></returns>\n        public Variant GetRandomVariant(bool allowArrays = true)\n        {\n            var builtInType = BuiltInType.Variant;\n            while (builtInType == BuiltInType.Variant || builtInType == BuiltInType.DataValue || builtInType == BuiltInType.Null)\n            {\n                builtInType = (BuiltInType)_random.NextInt32(24);\n            }\n            return GetRandomVariant(builtInType, allowArrays && _random.NextInt32(1) == 1);\n        }\n\n        private bool UseBoundaryValue()\n        {\n            if (!_useBoundaryValues)\n            {\n                return false;\n            }\n            return _random.NextInt32(99) < BoundaryValueFrequency;\n        }\n\n        private Variant[] GetRandomArrayInVariant(BuiltInType builtInType,\n            int length, bool fixedLength)\n        {\n            var randomArray = GetRandomArray(builtInType, length, fixedLength);\n            var array = new Variant[randomArray.Length];\n            var typeInfo = new Ua.TypeInfo(builtInType, -1);\n            for (var i = 0; i < array.Length; i++)\n            {\n                array[i] = new Variant(randomArray.GetValue(i), typeInfo);\n            }\n            return array;\n        }\n\n        private Variant GetRandomVariant(BuiltInType builtInType, bool isArray)\n        {\n            if (builtInType == BuiltInType.Null)\n            {\n                return Variant.Null;\n            }\n            var num = -1;\n            if (isArray)\n            {\n                num = _random.NextInt32(MaxArrayLength - 1);\n            }\n            else if (builtInType == BuiltInType.Variant)\n            {\n                num = 1;\n            }\n            if (num >= 0)\n            {\n                switch (builtInType)\n                {\n                    case BuiltInType.Boolean:\n                        return new Variant(GetRandomArray<bool>(num, true));\n                    case BuiltInType.SByte:\n                        return new Variant(GetRandomArray<sbyte>(num, true));\n                    case BuiltInType.Byte:\n                        return new Variant(GetRandomArray<byte>(num, true));\n                    case BuiltInType.Int16:\n                        return new Variant(GetRandomArray<short>(num, true));\n                    case BuiltInType.UInt16:\n                        return new Variant(GetRandomArray<ushort>(num, true));\n                    case BuiltInType.Int32:\n                        return new Variant(GetRandomArray<int>(num, true));\n                    case BuiltInType.UInt32:\n                        return new Variant(GetRandomArray<uint>(num, true));\n                    case BuiltInType.Int64:\n                        return new Variant(GetRandomArray<long>(num, true));\n                    case BuiltInType.UInt64:\n                        return new Variant(GetRandomArray<ulong>(num, true));\n                    case BuiltInType.Float:\n                        return new Variant(GetRandomArray<float>(num, true));\n                    case BuiltInType.Double:\n                        return new Variant(GetRandomArray<double>(num, true));\n                    case BuiltInType.String:\n                        return new Variant(GetRandomArray<string>(num, true));\n                    case BuiltInType.DateTime:\n                        return new Variant(GetRandomArray<DateTime>(num, true));\n                    case BuiltInType.Guid:\n                        return new Variant(GetRandomArray<Guid>(num, true));\n                    case BuiltInType.ByteString:\n                        return new Variant(GetRandomArray<byte[]>(num, true));\n                    case BuiltInType.XmlElement:\n                        return new Variant(GetRandomArray<XmlElement>(num, true));\n                    case BuiltInType.NodeId:\n                        return new Variant(GetRandomArray<NodeId>(num, true));\n                    case BuiltInType.ExpandedNodeId:\n                        return new Variant(GetRandomArray<ExpandedNodeId>(num, true));\n                    case BuiltInType.QualifiedName:\n                        return new Variant(GetRandomArray<QualifiedName>(num, true));\n                    case BuiltInType.LocalizedText:\n                        return new Variant(GetRandomArray<LocalizedText>(num, true));\n                    case BuiltInType.StatusCode:\n                        return new Variant(GetRandomArray<StatusCode>(num, true));\n                    case BuiltInType.Variant:\n                        return new Variant(GetRandomArray<Variant>(num, true));\n                    case BuiltInType.ExtensionObject:\n                        return new Variant(GetRandomArray<ExtensionObject>(num, true));\n                    default:\n                        throw new ArgumentException($\"Unexpected type {builtInType} constructing variant\");\n                }\n            }\n            return new Variant(GetRandom(builtInType));\n        }\n\n        public ExtensionObject GetRandomExtensionObject()\n        {\n            var randomNodeId = GetRandomNodeId();\n            if (!NodeId.IsNull(randomNodeId))\n            {\n                return new ExtensionObject(randomNodeId, (_random.NextInt32(1) == 0) ?\n                    GetRandomXmlElement() : GetRandomByteString());\n            }\n            return new ExtensionObject();\n        }\n\n        private static SortedDictionary<string, string[]> LoadStringData(string resourceName)\n        {\n            var sortedDictionary = new SortedDictionary<string, string[]>();\n            try\n            {\n                string text = null;\n                List<string> list = null;\n                var stream = typeof(DataGenerator).GetTypeInfo().Assembly.GetManifestResourceStream(resourceName);\n                if (stream == null)\n                {\n                    var fileInfo = new FileInfo(resourceName);\n                    stream = fileInfo.OpenRead();\n                }\n                using (var streamReader = new StreamReader(stream))\n                {\n                    for (var text2 = streamReader.ReadLine(); text2 != null; text2 = streamReader.ReadLine())\n                    {\n                        var text3 = text2.Trim();\n                        if (!string.IsNullOrEmpty(text3))\n                        {\n                            if (text3.StartsWith('='))\n                            {\n                                if (text != null)\n                                {\n                                    sortedDictionary.Add(text, [.. list]);\n                                }\n                                text = text3[1..];\n                                list = [];\n                            }\n                            else\n                            {\n                                list.Add(text3);\n                            }\n                        }\n                    }\n                }\n                return sortedDictionary;\n            }\n            catch (Exception)\n            {\n                return sortedDictionary;\n            }\n        }\n\n        private object GetBoundaryValue(Type type)\n        {\n            if (type == null)\n            {\n                return null;\n            }\n            if (!_boundaryValues.TryGetValue(type.Name, out var value))\n            {\n                return null;\n            }\n            if (value == null || value.Length == 0)\n            {\n                return null;\n            }\n            var num = _random.NextInt32(value.Length - 1);\n            if (type.IsInstanceOfType(value[num]))\n            {\n                return value[num];\n            }\n            return null;\n        }\n\n        private int GetRandomRange(int min, int max)\n        {\n            if (min < 0)\n            {\n                min = 0;\n            }\n            if (max < 0)\n            {\n                max = 0;\n            }\n            if (min >= max)\n            {\n                return min;\n            }\n            return _random.NextInt32(max - min) + min;\n        }\n\n        private object GetRandom(Type expectedType)\n        {\n            var random = GetRandom(Ua.TypeInfo.Construct(expectedType).BuiltInType);\n            if (expectedType == typeof(Uuid))\n            {\n                return new Uuid((Guid)random);\n            }\n            return random;\n        }\n\n        private string GetRandomLocale()\n        {\n            var num = _random.NextInt32(_availableLocales.Length - 1);\n            return _availableLocales[num];\n        }\n\n        private string CreateString(string locale, bool isSymbol)\n        {\n            if (!_tokenValues.TryGetValue(locale, out var value))\n            {\n                value = _tokenValues[\"en-US\"];\n            }\n            var num = (!isSymbol) ? (_random.NextInt32(MaxStringLength) + 1) : (_random.NextInt32(2) + 1);\n            var stringBuilder = new StringBuilder();\n            while (stringBuilder.Length < num)\n            {\n                if (!isSymbol && stringBuilder.Length > 0)\n                {\n                    stringBuilder.Append(' ');\n                }\n                var num2 = _random.NextInt32(value.Length - 1);\n                stringBuilder.Append(value[num2]);\n                if (!isSymbol && _random.NextInt32(1) != 0)\n                {\n                    num2 = _random.NextInt32(\"`~!@#$%^&*()_-+={}[]:\\\"';?><,./\".Length - 1);\n                    stringBuilder.Append(\"`~!@#$%^&*()_-+={}[]:\\\"';?><,./\"[num2]);\n                }\n            }\n            return stringBuilder.ToString();\n        }\n\n        /// <summary>\n        /// Boundary value holder\n        /// </summary>\n        private sealed class BoundaryValues\n        {\n            public Type SystemType { get; set; }\n\n            public List<object> Values { get; set; }\n\n            public BoundaryValues(Type systemType, params object[] values)\n            {\n                SystemType = systemType;\n                if (values != null)\n                {\n                    Values = [.. values];\n                }\n                else\n                {\n                    Values = [];\n                }\n            }\n        }\n\n        private static readonly BoundaryValues[] kAvailableBoundaryValues = [\n            new BoundaryValues(typeof(sbyte), sbyte.MinValue, (sbyte)0, sbyte.MaxValue),\n            new BoundaryValues(typeof(byte), (byte)0, byte.MaxValue),\n            new BoundaryValues(typeof(short), short.MinValue, (short)0, short.MaxValue),\n            new BoundaryValues(typeof(ushort), (ushort)0, ushort.MaxValue),\n            new BoundaryValues(typeof(int), -2147483648, 0, 2147483647),\n            new BoundaryValues(typeof(uint), 0u, uint.MaxValue),\n            new BoundaryValues(typeof(long), -9223372036854775808L, 0L, 9223372036854775807L),\n            new BoundaryValues(typeof(ulong), 0uL, ulong.MaxValue),\n            new BoundaryValues(typeof(float), 1.401298E-45f, 3.40282347E+38f, -3.40282347E+38f,\n                float.NaN, float.NegativeInfinity, float.PositiveInfinity, 0f),\n            new BoundaryValues(typeof(double), 4.94065645841247E-324, 1.7976931348623157E+308,\n                -1.7976931348623157E+308, double.NaN, double.NegativeInfinity,\n                double.PositiveInfinity, 0.0),\n            new BoundaryValues(typeof(string), string.Empty),\n         // TODO:  Fix\n         //   new BoundaryValues(typeof(DateTime), DateTime.MinValue, DateTime.MaxValue,\n         //       new DateTime(1099, 1, 1), new DateTime(2039, 4, 4),\n         //       new DateTime(2001, 9, 11, 9, 15, 0, DateTimeKind.Local)),\n            new BoundaryValues(typeof(byte[]), Array.Empty<byte>()),\n            new BoundaryValues(typeof(StatusCode), 0u, 1073741824u, 2147483648u)\n        ];\n\n        private readonly IRandomSource _random;\n        private readonly SortedDictionary<string, object[]> _boundaryValues;\n        private readonly bool _useBoundaryValues = true;\n        private readonly string[] _availableLocales;\n        private readonly SortedDictionary<string, string[]> _tokenValues;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Utils/TimeService.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Opc.Ua.Test\n{\n    using System;\n    using System.Timers;\n    using Timer = System.Timers.Timer;\n\n    /// <summary>\n    /// Service returning <see cref=\"DateTime\"/> values and <see cref=\"Timer\"/> instances. Mocked in tests.\n    /// </summary>\n    public class TimeService\n    {\n        /// <summary>\n        /// Create a new <see cref=\"Timer\"/> instance with <see cref=\"Timer.Enabled\"/> set to true\n        /// and <see cref=\"Timer.AutoReset\"/> set to true. The <see cref=\"Timer\"/> will call the\n        /// provided callback at regular intervals. This method is overridden in tests to return\n        /// a mock object.\n        /// </summary>\n        /// <param name=\"callback\">Event handler to call at regular intervals.</param>\n        /// <param name=\"intervalInMilliseconds\">Time interval at which to call the callback.</param>\n        /// <returns>A <see cref=\"Timer\"/>.</returns>\n        public virtual ITimer NewTimer(\n            ElapsedEventHandler callback,\n            uint intervalInMilliseconds)\n        {\n            var timer = new TimerAdapter\n            {\n                Interval = intervalInMilliseconds,\n                AutoReset = true,\n                Enabled = true\n            };\n            timer.Elapsed += callback;\n            return timer;\n        }\n\n        /// <summary>\n        /// Create a new <see cref=\"FastTimer\"/> instance with <see cref=\"FastTimer.Enabled\"/> set to true\n        /// and <see cref=\"FastTimer.AutoReset\"/> set to true. The <see cref=\"FastTimer\"/> will call the\n        /// provided callback at regular intervals. This method is overridden in tests to return\n        /// a mock object.\n        /// </summary>\n        /// <param name=\"callback\">Event handler to call at regular intervals.</param>\n        /// <param name=\"intervalInMilliseconds\">Time interval at which to call the callback.</param>\n        /// <returns>A <see cref=\"Timer\"/>.</returns>\n        public virtual ITimer NewFastTimer(\n            EventHandler<FastTimerElapsedEventArgs> callback,\n            uint intervalInMilliseconds)\n        {\n            var timer = new FastTimer\n            {\n                Interval = intervalInMilliseconds,\n                AutoReset = true\n            };\n            timer.Elapsed += callback;\n            timer.Enabled = true;\n            return timer;\n        }\n\n        /// <summary>\n        /// Returns the current time. Overridden in tests.\n        /// </summary>\n        /// <returns>The current time.</returns>\n        public virtual DateTime Now => DateTime.Now;\n\n        /// <summary>\n        /// Returns the current UTC time. Overridden in tests.\n        /// </summary>\n        /// <returns>The current UTC time.</returns>\n        public virtual DateTime UtcNow => DateTime.UtcNow;\n\n        /// <summary>\n        /// An adapter allowing the construction of <see cref=\"Timer\"/> objects\n        /// that explicitly implement the <see cref=\"ITimer\"/> interface.\n        /// The adapter itself must remain empty, add any required properties\n        /// or methods from the <see cref=\"Timer\"/> class into the\n        /// <see cref=\"ITimer\"/> interface.\n        /// </summary>\n        private sealed class TimerAdapter : Timer, ITimer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Vehicles/Namespaces.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Vehicles\n{\n    /// <summary>\n    /// Defines constants for namespaces used by the application.\n    /// </summary>\n    public static class Namespaces\n    {\n        /// <summary>\n        /// The namespace for the nodes provided by the server.\n        /// </summary>\n        public const string Vehicles = \"urn:localhost:somecompany.com:VehiclesServer\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Vehicles/VehiclesNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Vehicles\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System;\n    using System.Collections.Generic;\n    using System.Reflection;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class VehiclesNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public VehiclesNodeManager(IServerInternal server, ApplicationConfiguration configuration)\n        :\n            base(server, configuration)\n        {\n            SystemContext.NodeIdFactory = this;\n\n            SetNamespaces(\n                Namespaces.Vehicles,\n                Types.Namespaces.Vehicles,\n                Instances.Namespaces.VehiclesInstances);\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<VehiclesServerConfiguration>()\n                ?? new VehiclesServerConfiguration();\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                // TBD\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            // generate a numeric node id if the node has a parent and no node id assigned.\n\n            if (node is BaseInstanceState instance && instance.Parent != null)\n            {\n                return GenerateNodeId();\n            }\n\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                base.CreateAddressSpace(externalReferences);\n\n                var dictionary = (BaseDataVariableState)FindPredefinedNode(\n                    ExpandedNodeId.ToNodeId(Types.VariableIds.Vehicles_BinarySchema, Server.NamespaceUris),\n                    typeof(BaseDataVariableState));\n\n                var type = GetType().GetTypeInfo();\n                dictionary.Value = LoadSchemaFromResource(\n                    $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.Types.Types.bsd\",\n                    typeof(Types.VehicleType).Assembly);\n\n                dictionary = (BaseDataVariableState)FindPredefinedNode(\n                    ExpandedNodeId.ToNodeId(Types.VariableIds.Vehicles_XmlSchema, Server.NamespaceUris),\n                    typeof(BaseDataVariableState));\n\n                dictionary.Value = LoadSchemaFromResource(\n                    $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.Types.Types.xsd\",\n                    typeof(Types.VehicleType).Assembly);\n            }\n        }\n\n        /// <summary>\n        /// Loads the schema from an embedded resource.\n        /// </summary>\n        /// <param name=\"resourcePath\"></param>\n        /// <param name=\"assembly\"></param>\n        /// <exception cref=\"ArgumentNullException\"><paramref name=\"resourcePath\"/> is <c>null</c>.</exception>\n        /// <exception cref=\"ServiceResultException\"></exception>\n        public byte[] LoadSchemaFromResource(string resourcePath, Assembly assembly)\n        {\n            ArgumentNullException.ThrowIfNull(resourcePath);\n            if (assembly == null)\n            {\n                assembly = Assembly.GetCallingAssembly();\n            }\n\n            var istrm = assembly.GetManifestResourceStream(resourcePath);\n            if (istrm == null)\n            {\n                throw ServiceResultException.Create(StatusCodes.BadDecodingError, \"Could not load nodes from resource: {0}\", resourcePath);\n            }\n\n            var buffer = new byte[istrm.Length];\n            istrm.ReadExactly(buffer, 0, (int)istrm.Length);\n            return buffer;\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.Types.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.{type.Namespace}.Instances.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            return predefinedNodes;\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n            lock (Lock)\n            {\n                // TBD\n            }\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // check cache (the cache is used because the same node id can appear many times in a single request).\n                if (cache != null && cache.TryGetValue(nodeId, out var node))\n                {\n                    return new NodeHandle(nodeId, node);\n                }\n\n                // look up predefined node.\n                if (PredefinedNodes.TryGetValue(nodeId, out node))\n                {\n                    var handle = new NodeHandle(nodeId, node);\n\n                    cache?.Add(nodeId, node);\n\n                    return handle;\n                }\n\n                // node not found.\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            // lookup in operation cache.\n            var target = FindNodeInCache(context, handle, cache);\n\n            if (target != null)\n            {\n                handle.Node = target;\n                handle.Validated = true;\n                return handle.Node;\n            }\n\n            // put root into operation cache.\n            if (cache != null)\n            {\n                cache[handle.NodeId] = target;\n            }\n\n            handle.Node = target;\n            handle.Validated = true;\n            return handle.Node;\n        }\n\n        /// <summary>\n        /// Generates a new node id.\n        /// </summary>\n        private NodeId GenerateNodeId()\n        {\n            return new NodeId(++_nextNodeId, NamespaceIndex);\n        }\n\n        private uint _nextNodeId;\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly VehiclesServerConfiguration _configuration;\n#pragma warning restore IDE0052 // Remove unread private members\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Vehicles/VehiclesServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Vehicles\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class VehiclesServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Namespaces.Vehicles,\n                    Types.Namespaces.Vehicles,\n                    Instances.Namespaces.VehiclesInstances\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new VehiclesNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Vehicles/VehiclesServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Vehicles\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Namespaces.Vehicles)]\n    public class VehiclesServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public VehiclesServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Views/ViewsNodeManager.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Views\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using System.Collections.Generic;\n    using System.Reflection;\n\n    /// <summary>\n    /// A node manager for a server that exposes several variables.\n    /// </summary>\n    public class ViewsNodeManager : CustomNodeManager2\n    {\n        /// <summary>\n        /// Initializes the node manager.\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"configuration\"></param>\n        public ViewsNodeManager(IServerInternal server, ApplicationConfiguration configuration)\n        : base(server, configuration, Model.Namespaces.Views,\n                Model.Namespaces.Engineering, Model.Namespaces.Operations)\n        {\n            SystemContext.NodeIdFactory = this;\n\n            // get the configuration for the node manager.\n            // use suitable defaults if no configuration exists.\n            _configuration = configuration.ParseExtension<ViewsServerConfiguration>()\n                ?? new ViewsServerConfiguration();\n        }\n\n        /// <summary>\n        /// An overrideable version of the Dispose.\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                // TBD\n            }\n            base.Dispose(disposing);\n        }\n\n        /// <summary>\n        /// Creates the NodeId for the specified node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"node\"></param>\n        public override NodeId New(ISystemContext context, NodeState node)\n        {\n            if (node is BaseInstanceState instance && instance.Parent != null)\n            {\n                var pnd = ParsedNodeId.Parse(instance.Parent.NodeId);\n\n                if (pnd != null)\n                {\n                    return pnd.Construct(instance.SymbolicName);\n                }\n            }\n\n            return node.NodeId;\n        }\n\n        /// <summary>\n        /// Loads a node set from a file or resource and addes them to the set of predefined nodes.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        protected override NodeStateCollection LoadPredefinedNodes(ISystemContext context)\n        {\n            var type = GetType().GetTypeInfo();\n            var predefinedNodes = new NodeStateCollection();\n            predefinedNodes.LoadFromBinaryResource(context,\n                $\"{type.Assembly.GetName().Name}.Generated.{type.Namespace}.Design.Model.PredefinedNodes.uanodes\",\n                type.Assembly, true);\n            return predefinedNodes;\n        }\n\n        /// <summary>\n        /// Does any initialization required before the address space can be used.\n        /// </summary>\n        /// <param name=\"externalReferences\"></param>\n        /// <remarks>\n        /// The externalReferences is an out parameter that allows the node manager to link to nodes\n        /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and\n        /// should have a reference to the root folder node(s) exposed by this node manager.\n        /// </remarks>\n        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)\n        {\n            lock (Lock)\n            {\n                base.CreateAddressSpace(externalReferences);\n\n                var root = FindPredefinedNode(new NodeId(Model.Objects.Plant, NamespaceIndex), typeof(NodeState));\n\n                var boiler1 = new Model.BoilerState(null);\n                var pnd1 = new ParsedNodeId { NamespaceIndex = NamespaceIndex, RootId = \"Boiler #1\" };\n\n                boiler1.Create(\n                    SystemContext,\n                    pnd1.Construct(),\n                    new QualifiedName(\"Boiler #1\", NamespaceIndex),\n                    null,\n                    true);\n\n                boiler1.AddReference(ReferenceTypeIds.Organizes, true, root.NodeId);\n                root.AddReference(ReferenceTypeIds.Organizes, false, boiler1.NodeId);\n\n                AddPredefinedNode(SystemContext, boiler1);\n\n                var boiler2 = new Model.BoilerState(null);\n                var pnd2 = new ParsedNodeId { NamespaceIndex = NamespaceIndex, RootId = \"Boiler #2\" };\n\n                boiler2.Create(\n                    SystemContext,\n                    pnd2.Construct(),\n                    new QualifiedName(\"Boiler #2\", NamespaceIndex),\n                    null,\n                    true);\n\n                boiler2.AddReference(ReferenceTypeIds.Organizes, true, root.NodeId);\n                root.AddReference(ReferenceTypeIds.Organizes, false, boiler2.NodeId);\n\n                AddPredefinedNode(SystemContext, boiler2);\n            }\n        }\n\n        /// <summary>\n        /// Checks if the node is in the view.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        /// <param name=\"node\"></param>\n        protected override bool IsNodeInView(ServerSystemContext context, ContinuationPoint continuationPoint, NodeState node)\n        {\n            if (continuationPoint.View != null)\n            {\n                if (continuationPoint.View.ViewId == new NodeId(Model.Views.Engineering, NamespaceIndex))\n                {\n                    // suppress operations properties.\n                    if (node != null && node.BrowseName.NamespaceIndex == NamespaceIndexes[2])\n                    {\n                        return false;\n                    }\n                }\n\n                if (continuationPoint.View.ViewId == new NodeId(Model.Views.Operations, NamespaceIndex))\n                {\n                    // suppress engineering properties.\n                    if (node != null && node.BrowseName.NamespaceIndex == NamespaceIndexes[1])\n                    {\n                        return false;\n                    }\n                }\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Checks if the reference is in the view.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"continuationPoint\"></param>\n        /// <param name=\"reference\"></param>\n        protected override bool IsReferenceInView(ServerSystemContext context, ContinuationPoint continuationPoint, IReference reference)\n        {\n            if (continuationPoint.View != null)\n            {\n                // guard against absolute node ids.\n                if (reference.TargetId.IsAbsolute)\n                {\n                    return true;\n                }\n\n                // find the node.\n                var node = FindPredefinedNode((NodeId)reference.TargetId, typeof(NodeState));\n\n                if (node != null)\n                {\n                    return IsNodeInView(context, continuationPoint, node);\n                }\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Frees any resources allocated for the address space.\n        /// </summary>\n        public override void DeleteAddressSpace()\n        {\n        }\n\n        /// <summary>\n        /// Returns a unique handle for the node.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"nodeId\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeHandle GetManagerHandle(ServerSystemContext context, NodeId nodeId, IDictionary<NodeId, NodeState> cache)\n        {\n            lock (Lock)\n            {\n                // quickly exclude nodes that are not in the namespace.\n                if (!IsNodeIdInNamespace(nodeId))\n                {\n                    return null;\n                }\n\n                // check cache (the cache is used because the same node id can appear many times in a single request).\n                if (cache != null && cache.TryGetValue(nodeId, out var node))\n                {\n                    return new NodeHandle(nodeId, node);\n                }\n\n                // look up predefined node.\n                if (PredefinedNodes.TryGetValue(nodeId, out node))\n                {\n                    var handle = new NodeHandle(nodeId, node);\n\n                    cache?.Add(nodeId, node);\n\n                    return handle;\n                }\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Verifies that the specified node exists.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        /// <param name=\"handle\"></param>\n        /// <param name=\"cache\"></param>\n        protected override NodeState ValidateNode(\n            ServerSystemContext context,\n            NodeHandle handle,\n            IDictionary<NodeId, NodeState> cache)\n        {\n            // not valid if no root.\n            if (handle == null)\n            {\n                return null;\n            }\n\n            // check if previously validated.\n            if (handle.Validated)\n            {\n                return handle.Node;\n            }\n\n            // lookup in operation cache.\n            var target = FindNodeInCache(context, handle, cache);\n\n            if (target == null)\n            {\n                // TBD\n                return null;\n            }\n\n            return ValidationComplete(context, handle, target, cache);\n        }\n\n#pragma warning disable IDE0052 // Remove unread private members\n        private readonly ViewsServerConfiguration _configuration;\n#pragma warning restore IDE0052 // Remove unread private members\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Views/ViewsServer.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Views\n{\n    using Opc.Ua;\n    using Opc.Ua.Server;\n\n    /// <inheritdoc/>\n    public class ViewsServer : INodeManagerFactory\n    {\n        /// <inheritdoc/>\n        public StringCollection NamespacesUris\n        {\n            get\n            {\n                return [\n                    Model.Namespaces.Views,\n                    Model.Namespaces.Engineering,\n                    Model.Namespaces.Operations\n                ];\n            }\n        }\n\n        /// <inheritdoc/>\n        public INodeManager Create(IServerInternal server,\n            ApplicationConfiguration configuration)\n        {\n            return new ViewsNodeManager(server, configuration);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/src/Views/ViewsServerConfiguration.cs",
    "content": "/* ========================================================================\n * Copyright (c) 2005-2017 The OPC Foundation, Inc. All rights reserved.\n *\n * OPC Foundation MIT License 1.00\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n *\n * The complete license agreement can be found here:\n * http://opcfoundation.org/License/MIT/1.00/\n * ======================================================================*/\n\nnamespace Views\n{\n    using System.Runtime.Serialization;\n\n    /// <summary>\n    /// Stores the configuration the data access node manager.\n    /// </summary>\n    [DataContract(Namespace = Model.Namespaces.Views)]\n    public class ViewsServerConfiguration\n    {\n        /// <summary>\n        /// The default constructor.\n        /// </summary>\n        public ViewsServerConfiguration()\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Initializes the object during deserialization.\n        /// </summary>\n        /// <param name=\"context\"></param>\n        [OnDeserializing]\n        private void Initialize(StreamingContext context)\n        {\n            Initialize();\n        }\n\n        /// <summary>\n        /// Sets private members to default values.\n        /// </summary>\n        private void Initialize()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Azure.IIoT.OpcUa.Publisher.Testing.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <Description>Contains fixtures and tests executing against test servers</Description>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Furly.Extensions.Newtonsoft\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Extensions.Json\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Furly.Extensions.Autofac\" Version=\"1.1.54\" />\n    <PackageReference Include=\"Microsoft.Extensions.Logging.Abstractions\" Version=\"9.0.9\" />\n    <PackageReference Include=\"Microsoft.Extensions.Configuration.Abstractions\" Version=\"9.0.9\" />\n    <PackageReference Include=\"FluentAssertions\" Version=\"[7.2.0]\" />\n    <PackageReference Include=\"Moq\" Version=\"[4.20.2]\" />\n    <PackageReference Include=\"xunit.assert\" Version=\"2.9.3\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Azure.IIoT.OpcUa.Publisher\\src\\Azure.IIoT.OpcUa.Publisher.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\Azure.IIoT.OpcUa.Publisher.Testing.Servers.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Extensions/OpcUaClientManagerEx.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Stack\n{\n    using Azure.IIoT.OpcUa.Encoders;\n    using Furly.Extensions.Serializers;\n    using Opc.Ua;\n    using Opc.Ua.Extensions;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// Session provider extensions\n    /// </summary>\n    public static class OpcUaClientManagerEx\n    {\n        /// <summary>\n        /// Read value\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"client\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"readNode\"></param>\n        /// <param name=\"serializer\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static Task<VariantValue> ReadValueAsync<T>(this IOpcUaClientManager<T> client,\n            T connection, string readNode, IJsonSerializer serializer, CancellationToken ct = default)\n        {\n            return client.ExecuteAsync(connection, async context =>\n            {\n                var nodesToRead = new ReadValueIdCollection\n                {\n                    new ReadValueId\n                    {\n                        NodeId = readNode.ToNodeId(context.Session.MessageContext),\n                        AttributeId = Attributes.Value\n                    }\n                };\n                var response = await context.Session.Services.ReadAsync(\n                    new RequestHeader(), 0, TimestampsToReturn.Both,\n                    nodesToRead, context.Ct).ConfigureAwait(false);\n                return new JsonVariantEncoder(context.Session.MessageContext, serializer)\n                    .Encode(response.Results[0].WrappedValue, out var tmp);\n            }, ct: ct);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/AlarmsServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Alarms server fixture\n    /// </summary>\n    public class AlarmsServer : BaseServerFixture\n    {\n        /// <summary>\n        /// Alarm server nodes\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"timeservice\"></param>\n        public static IEnumerable<INodeManagerFactory> Alarms(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new Alarms.AlarmConditionServer(timeservice);\n        }\n\n        /// <inheritdoc/>\n        public AlarmsServer()\n            : base(Alarms)\n        {\n        }\n\n        /// <inheritdoc/>\n        private AlarmsServer(ILoggerFactory loggerFactory)\n            : base(Alarms, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static AlarmsServer Create(ILoggerFactory loggerFactory)\n        {\n            return new AlarmsServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/AssetServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Furly.Extensions.Logging;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Asset server fixture\n    /// </summary>\n    public class AssetServer : BaseServerFixture\n    {\n        /// <summary>\n        /// Sample server nodes\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"timeservice\"></param>\n        public static IEnumerable<INodeManagerFactory> Asset(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            var logger = (factory ?? Log.ConsoleFactory())\n                .CreateLogger<Asset.AssetServer>();\n            yield return new Asset.AssetServer(logger);\n        }\n\n        /// <inheritdoc/>\n        public AssetServer() : base(Asset)\n        {\n        }\n\n        /// <inheritdoc/>\n        private AssetServer(ILoggerFactory loggerFactory)\n            : base(Asset, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static AssetServer Create(ILoggerFactory loggerFactory)\n        {\n            return new AssetServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/BaseServerFixture.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Runtime;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Publisher.Parser;\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Sample;\n    using Azure.IIoT.OpcUa.Publisher.Stack.Services;\n    using Autofac;\n    using Furly.Extensions.Logging;\n    using Furly.Extensions.Utils;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Logging;\n    using Microsoft.Extensions.Options;\n    using Moq;\n    using Opc.Ua;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System;\n    using System.Collections.Concurrent;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.IO;\n    using System.Linq;\n    using System.Net;\n    using System.Net.Sockets;\n    using System.Security.Cryptography.X509Certificates;\n    using System.Threading.Tasks;\n    using System.Timers;\n\n    /// <summary>\n    /// Adds sample server as fixture to unit tests\n    /// </summary>\n    public abstract class BaseServerFixture : IDisposable\n    {\n        /// <summary>\n        /// Host server is running on\n        /// </summary>\n        public IPHostEntry? Host { get; }\n\n        /// <summary>\n        /// Use reverse connect\n        /// </summary>\n        public bool UseReverseConnect { get; }\n\n        /// <summary>\n        /// Client port\n        /// </summary>\n        public int ReverseConnectPort { get; }\n\n        /// <summary>\n        /// Certificate of the server\n        /// </summary>\n        public X509Certificate2 Certificate => _serverHost.Certificate;\n\n        /// <summary>\n        /// Client\n        /// </summary>\n        public IOpcUaClientManager<ConnectionModel> Client\n            => _container.Resolve<IOpcUaClientManager<ConnectionModel>>();\n\n        /// <summary>\n        /// Now\n        /// </summary>\n        public DateTime Now { get; private set; }\n\n        /// <summary>\n        /// Time service\n        /// </summary>\n        public TimeService TimeService => _timeService.Object;\n\n        /// <summary>\n        /// Temporary path\n        /// </summary>\n        public string TempPath { get; }\n            = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());\n\n        /// <summary>\n        /// Filter parser\n        /// </summary>\n        public IFilterParser Parser => _container.Resolve<IFilterParser>();\n\n        /// <summary>\n        /// EndpointUrl\n        /// </summary>\n        public string EndpointUrl\n            => $\"opc.tcp://{HostName}:{_port}/{kSampleServerPath}\";\n\n        /// <summary>\n        /// <para>Host name</para>\n        /// <para>\n        /// There is a quirk in registration matching inside the reconnect manager the\n        /// server must present their endpoint in RHEL exactly like it is requested by\n        /// the client. The reconnect manager compares to the endpoint url and if it is\n        /// not the same it will reject.\n        /// </para>\n        /// <para>\n        /// In this test the host name is the FQDN host name here, but the one it matches\n        /// against and presented by the server is just the machine's host name and\n        /// therefore rejects even though it is the same.\n        /// </para>\n        /// </summary>\n        private string HostName\n            => (UseReverseConnect ? Utils.GetHostName() : Host?.HostName) ?? \"localhost\";\n\n        /// <summary>\n        /// Get server connection\n        /// </summary>\n        /// <returns></returns>\n        public ConnectionModel GetConnection()\n        {\n            return new ConnectionModel\n            {\n                Endpoint = new EndpointModel\n                {\n                    Url = EndpointUrl,\n                    AlternativeUrls = Host?.AddressList\n                        .Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)\n                        .Select(ip => $\"opc.tcp://{ip}:{_port}/{kSampleServerPath}\")\n                        .ToHashSet(),\n                    Certificate = Certificate?.RawData?.ToThumbprint()\n                },\n                Options = UseReverseConnect ?\n                    ConnectionOptions.UseReverseConnect : ConnectionOptions.None\n            };\n        }\n\n        /// <summary>\n        /// Create fixture\n        /// </summary>\n        /// <param name=\"nodesFactory\"></param>\n        /// <param name=\"loggerFactory\"></param>\n        /// <param name=\"useReverseConnect\"></param>\n        protected BaseServerFixture(\n            Func<ILoggerFactory?, TimeService, IEnumerable<INodeManagerFactory>> nodesFactory,\n            ILoggerFactory? loggerFactory = null, bool useReverseConnect = false)\n        {\n            var sw = Stopwatch.StartNew();\n            Host = Try.Op(() => Dns.GetHostEntry(Utils.GetHostName()))\n                ?? Try.Op(() => Dns.GetHostEntry(\"localhost\"));\n            _container = CreateContainer(loggerFactory ?? Log.ConsoleFactory(LogLevel.Debug));\n\n            Now = new DateTime(2023, 1, 1, 7, 15, 0, DateTimeKind.Utc);\n            _timeService = CreateTimeServiceMock(Now);\n\n            _port = NextPort();\n            var logger = _container.Resolve<ILogger<BaseServerFixture>>();\n            var options = _container.Resolve<IOptions<OpcUaClientOptions>>();\n            var nodes = nodesFactory(_container.Resolve<ILoggerFactory>(), TimeService);\n            ServerConsoleHost? serverHost = null;\n            while (true)\n            {\n                try\n                {\n                    serverHost = new ServerConsoleHost(new ServerFactory(\n                        _container.Resolve<ILogger<ServerFactory>>(), TempPath, nodes)\n                    {\n                        LogStatus = false\n                    }, _container.Resolve<ILogger<ServerConsoleHost>>())\n                    {\n                        PkiRootPath = options.Value.Security.PkiRootPath,\n                        AutoAccept = true\n                    };\n                    logger.StartingServerHost(serverHost, _port);\n                    serverHost.StartAsync(new int[] { _port }).Wait();\n\n                    //\n                    // Test server connection. Sometimes the server has not\n                    // started and tests are failing with Not reachable, this\n                    // should ensure the server has started up correctly.\n                    //\n                    var endpoint =\n                        _container.Resolve<IConnectionServices<ConnectionModel>>();\n                    var result = endpoint.TestConnectionAsync(new ConnectionModel\n                    {\n                        Endpoint = new EndpointModel\n                        {\n                            Url = EndpointUrl\n                        }\n                    }, new TestConnectionRequestModel()).WaitAsync(TimeSpan.FromSeconds(10))\n                        .GetAwaiter().GetResult();\n                    if (result.ErrorInfo != null)\n                    {\n                        throw new IOException(\n                            result.ErrorInfo.ErrorMessage ?? \"Failed testing connection.\");\n                    }\n\n                    logger.ServerHostListening(serverHost, EndpointUrl);\n                    _serverHost = serverHost;\n                    if (!useReverseConnect)\n                    {\n                        break;\n                    }\n\n                    int clientPort;\n                    // Find a port for the client\n                    while (true)\n                    {\n                        clientPort = NextPort();\n                        try\n                        {\n                            logger.TryAddingReverseConnect(clientPort);\n                            using var listener = TcpListener.Create(clientPort);\n                            listener.Start(); // Throws if used and cleans up.\n                            listener.Stop();  // Cleanup\n                            break;\n                        }\n                        catch (Exception ex)\n                        {\n                            logger.PortNotAccessible(ex, clientPort);\n                            kPorts.AddOrUpdate(clientPort, false, (_, _) => false);\n                        }\n                    }\n                    UseReverseConnect = true;\n                    ReverseConnectPort = clientPort;\n                    var clientUrl = $\"opc.tcp://{HostName}:{clientPort}\";\n                    _serverHost.AddReverseConnectionAsync(new Uri(clientUrl), 4)\n                        .WaitAsync(TimeSpan.FromMinutes(1)).GetAwaiter().GetResult();\n                    logger.StartReverseConnect(clientUrl);\n                    break;\n                }\n                catch (Exception ex)\n                {\n                    kPorts.AddOrUpdate(_port, false, (_, _) => false);\n                    _port = NextPort();\n                    logger.FailedToStartHost(ex, serverHost, _port);\n                    serverHost?.Dispose();\n                    serverHost = null;\n                }\n            }\n            logger.ServerHostStarted(serverHost, sw.Elapsed);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            Dispose(disposing: true);\n            GC.SuppressFinalize(this);\n        }\n\n        /// <summary>\n        /// Restart server\n        /// </summary>\n        /// <param name=\"predicate\"></param>\n        /// <returns></returns>\n        public Task RestartAsync(Func<Task> predicate)\n        {\n            return _serverHost.RestartAsync(predicate);\n        }\n\n        /// <summary>\n        /// Override to dispose\n        /// </summary>\n        /// <param name=\"disposing\"></param>\n        protected virtual void Dispose(bool disposing)\n        {\n            if (!_disposedValue)\n            {\n                if (disposing)\n                {\n                    var sw = Stopwatch.StartNew();\n                    var logger = _container.Resolve<ILogger<BaseServerFixture>>();\n                    logger.DisposingServerHost(_serverHost);\n\n                    string? pkiPath = null;\n                    if (_container.TryResolve<IOptions<OpcUaClientOptions>>(out var options) &&\n                        Directory.Exists(options.Value.Security.PkiRootPath))\n                    {\n                        pkiPath = options.Value.Security.PkiRootPath;\n                    }\n\n                    _container.Dispose();\n                    _serverHost.Dispose();\n                    kPorts.TryRemove(_port, out _);\n\n                    logger.ServerHostDisposed(_serverHost, pkiPath, sw.Elapsed);\n\n                    // Clean up all created certificates\n                    if (!string.IsNullOrEmpty(pkiPath) && Directory.Exists(pkiPath))\n                    {\n                        Try.Op(() => Directory.Delete(pkiPath, true));\n                    }\n                    logger.ServerDisposingElapsed(sw.Elapsed);\n\n                    if (Directory.Exists(TempPath))\n                    {\n                        Try.Op(() => Directory.Delete(TempPath, true));\n                    }\n                }\n                _disposedValue = true;\n            }\n        }\n\n        private static IContainer CreateContainer(ILoggerFactory loggerFactory)\n        {\n            var builder = new ContainerBuilder();\n            builder.ConfigureServices(services => services.AddLogging());\n            builder.RegisterInstance(new ConfigurationBuilder().Build())\n                .AsImplementedInterfaces();\n            builder.RegisterInstance(loggerFactory)\n                .AsImplementedInterfaces();\n\n            builder.AddDefaultJsonSerializer();\n            // builder.AddNewtonsoftJsonSerializer();\n            builder.RegisterType<TestClientConfig>()\n                .AsImplementedInterfaces();\n\n            builder.AddOpcUaStack();\n            return builder.Build();\n        }\n\n        /// <summary>\n        /// Cause a subset of the mocked timers to fire a number of times,\n        /// and the current mocked time to advance accordingly.\n        /// </summary>\n        /// <param name=\"period\">Defines the timers to fire:\n        /// only timers with this interval are fired.</param>\n        /// <param name=\"numberOfTimes\">Number of times the timer\n        /// should be fired.</param>\n#pragma warning disable CA1030 // Use events where appropriate\n        public void FireTimersWithPeriod(TimeSpan period, int numberOfTimes)\n#pragma warning restore CA1030 // Use events where appropriate\n        {\n            var matchedHandlers = GetTimerHandlersForPeriod((uint)period.TotalMilliseconds);\n            for (var i = 0; i < numberOfTimes; i++)\n            {\n                Now += period;\n                foreach (var handler in matchedHandlers)\n                {\n                    handler();\n                }\n            }\n        }\n\n        /// <summary>\n        /// Retrieve the timer handlers for the given period\n        /// </summary>\n        /// <param name=\"periodInMilliseconds\"></param>\n        /// <returns></returns>\n        private List<Action> GetTimerHandlersForPeriod(uint periodInMilliseconds)\n        {\n            var matchedTimers = _timers.Where(t\n                    => t.timer.Enabled\n                       && CloseTo(t.timer.Interval, periodInMilliseconds))\n                .Select(t => (Action)(() => t.handler(null, null!)))\n                .ToList();\n\n            var matchedFastTimers = _fastTimers.Where(t\n                    => t.timer.Enabled\n                       && CloseTo(t.timer.Interval, periodInMilliseconds))\n                .Select(t => (Action)(() => t.handler(null, null!)))\n                .ToList();\n\n            return matchedTimers.Union(matchedFastTimers).ToList();\n\n            static bool CloseTo(double a, double b) =>\n                Math.Abs(a - b) <= Math.Abs(a * .00001);\n        }\n\n        /// <summary>\n        /// Get another port\n        /// </summary>\n        /// <returns></returns>\n        private static int NextPort()\n        {\n            while (true)\n            {\n#pragma warning disable CA5394 // Do not use insecure randomness\n                var port = Random.Shared.Next(53000, 58000);\n#pragma warning restore CA5394 // Do not use insecure randomness\n                if (kPorts.TryAdd(port, true))\n                {\n                    return port;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Create a mocked time service for the tests to be able to\n        /// control time in the server.\n        /// </summary>\n        /// <param name=\"now\">The start time</param>\n        /// <returns></returns>\n        private Mock<TimeService> CreateTimeServiceMock(DateTime now)\n        {\n            var mock = new Mock<TimeService>();\n            mock.Setup(f => f.NewTimer(\n                It.IsAny<ElapsedEventHandler>(),\n                It.IsAny<uint>()))\n                .Returns((ElapsedEventHandler handler,\n                    uint intervalInMilliseconds) =>\n                {\n                    var mockTimer = new Mock<ITimer>();\n                    mockTimer.SetupAllProperties();\n                    var timer = mockTimer.Object;\n                    timer.Interval = intervalInMilliseconds;\n                    timer.AutoReset = true;\n                    timer.Enabled = true;\n                    _timers.Add((timer, handler));\n                    return timer;\n                });\n            mock.Setup(f => f.NewFastTimer(\n                It.IsAny<EventHandler<FastTimerElapsedEventArgs>>(),\n                It.IsAny<uint>()))\n                .Returns((EventHandler<FastTimerElapsedEventArgs> handler,\n                    uint intervalInMilliseconds) =>\n                {\n                    var mockTimer = new Mock<ITimer>();\n                    mockTimer.SetupAllProperties();\n                    var timer = mockTimer.Object;\n                    timer.Interval = intervalInMilliseconds;\n                    timer.AutoReset = true;\n                    timer.Enabled = true;\n                    _fastTimers.Add((timer, handler));\n                    return timer;\n                });\n\n            mock.Setup(f => f.Now)\n                .Returns(() => now);\n\n            mock.Setup(f => f.UtcNow)\n                .Returns(() => now);\n            return mock;\n        }\n\n        /// <summary> Registry of mocked timers. </summary>\n        private readonly ConcurrentBag<(ITimer timer,\n            ElapsedEventHandler handler)> _timers = [];\n        /// <summary> Registry of mocked fast timers. </summary>\n        private readonly ConcurrentBag<(ITimer timer,\n            EventHandler<FastTimerElapsedEventArgs> handler)> _fastTimers = [];\n        private static readonly ConcurrentDictionary<int, bool> kPorts = new();\n        private bool _disposedValue;\n        private readonly int _port;\n        private readonly IContainer _container;\n        private readonly ServerConsoleHost _serverHost;\n        private readonly Mock<TimeService> _timeService;\n        private const string kSampleServerPath = \"UA/SampleServer\";\n    }\n\n    /// <summary>\n    /// Generated logging methods for BaseServerFixture\n    /// </summary>\n    internal static partial class BaseServerFixtureLogging\n    {\n        private const int EventClass = 0;\n\n        [LoggerMessage(EventId = EventClass + 1, Level = LogLevel.Information,\n            Message = \"Starting server host {Host} on {Port}...\")]\n        public static partial void StartingServerHost(this ILogger logger, ServerConsoleHost host, int port);\n\n        [LoggerMessage(EventId = EventClass + 2, Level = LogLevel.Information,\n            Message = \"Server host {Host} listening on {EndpointUrl}!\")]\n        public static partial void ServerHostListening(this ILogger logger, ServerConsoleHost host, string endpointUrl);\n\n        [LoggerMessage(EventId = EventClass + 3, Level = LogLevel.Information,\n            Message = \"Try adding reverse connect client on {Port}...\")]\n        public static partial void TryAddingReverseConnect(this ILogger logger, int port);\n\n        [LoggerMessage(EventId = EventClass + 4, Level = LogLevel.Error,\n            Message = \"Port {Port} is not accessible...\")]\n        public static partial void PortNotAccessible(this ILogger logger, Exception ex, int port);\n\n        [LoggerMessage(EventId = EventClass + 5, Level = LogLevel.Information,\n            Message = \"Start reverse connect to client at {Url}...\")]\n        public static partial void StartReverseConnect(this ILogger logger, string url);\n\n        [LoggerMessage(EventId = EventClass + 6, Level = LogLevel.Error,\n            Message = \"Failed to start host {Host}, retrying with port {Port}...\")]\n        public static partial void FailedToStartHost(this ILogger logger, Exception ex, ServerConsoleHost? host, int port);\n\n        [LoggerMessage(EventId = EventClass + 7, Level = LogLevel.Information,\n            Message = \"Server host {Host} started in {Elapsed}...\")]\n        public static partial void ServerHostStarted(this ILogger logger, ServerConsoleHost host, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 8, Level = LogLevel.Information,\n            Message = \"Disposing server host {Host} and client fixture...\")]\n        public static partial void DisposingServerHost(this ILogger logger, ServerConsoleHost host);\n\n        [LoggerMessage(EventId = EventClass + 9, Level = LogLevel.Information,\n            Message = \"Client fixture and server host {Host} disposed - cleaning up server certificates at '{PkiRoot}' ({Elapsed})...\")]\n        public static partial void ServerHostDisposed(this ILogger logger, ServerConsoleHost host, string? pkiRoot, TimeSpan elapsed);\n\n        [LoggerMessage(EventId = EventClass + 10, Level = LogLevel.Information,\n            Message = \"Disposing Server took {Elapsed}...\")]\n        public static partial void ServerDisposingElapsed(this ILogger logger, TimeSpan elapsed);\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/DeterministicAlarmsServer1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Furly.Extensions.Logging;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Alarms server fixture\n    /// </summary>\n    public class DeterministicAlarmsServer1 : BaseServerFixture\n    {\n        public static readonly string Config = \"\"\"\n{\n  \"folders\": [\n    {\n      \"name\": \"VendingMachines\",\n      \"sources\": [\n        {\n          \"objectType\": \"BaseObjectState\",\n          \"name\": \"VendingMachine1\",\n          \"alarms\": [\n            {\n              \"objectType\": \"TripAlarmType\",\n              \"name\": \"VendingMachine1_DoorOpen\",\n              \"id\": \"V1_DoorOpen\"\n            },\n            {\n              \"objectType\": \"LimitAlarmType\",\n              \"name\": \"VendingMachine1_TemperatureHigh\",\n              \"id\": \"V1_TemperatureHigh\"\n            }\n          ]\n        },\n        {\n          \"objectType\": \"BaseObjectState\",\n          \"name\": \"VendingMachine2\",\n          \"alarms\": [\n            {\n              \"objectType\": \"TripAlarmType\",\n              \"name\": \"VendingMachine2_DoorOpen\",\n              \"id\": \"V2_DoorOpen\"\n            },\n            {\n              \"objectType\": \"OffNormalAlarmType\",\n              \"name\": \"VendingMachine2_LightOff\",\n              \"id\": \"V2_LightOff\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"script\": {\n    \"waitUntilStartInSeconds\": 9,\n    \"isScriptInRepeatingLoop\": true,\n    \"runningForSeconds\": 22,\n    \"steps\": [\n      {\n        \"event\": {\n          \"alarmId\": \"V1_DoorOpen\",\n          \"reason\": \"Door Open\",\n          \"severity\": \"High\",\n          \"eventId\": \"V1_DoorOpen-1\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Enabled\",\n              \"state\": true\n            },\n            {\n              \"stateType\": \"Activated\",\n              \"state\": true\n            }\n          ]\n        }\n      },\n      {\n        \"sleepInSeconds\": 5\n      },\n      {\n        \"event\": {\n          \"alarmId\": \"V2_LightOff\",\n          \"reason\": \"Light Off in machine\",\n          \"severity\": \"Medium\",\n          \"eventId\": \"V2_LightOff-1\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Enabled\",\n              \"state\": true\n            },\n            {\n              \"stateType\": \"Activated\",\n              \"state\": true\n            }\n          ]\n        }\n      },\n      {\n        \"sleepInSeconds\": 7\n      },\n      {\n        \"event\": {\n          \"alarmId\": \"V1_DoorOpen\",\n          \"reason\": \"Door Closed\",\n          \"severity\": \"Medium\",\n          \"eventId\": \"V1_DoorOpen-2\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Activated\",\n              \"state\": false\n            }\n          ]\n        }\n      },\n      {\n        \"sleepInSeconds\": 4\n      },\n      {\n        \"event\": {\n          \"alarmId\": \"V1_TemperatureHigh\",\n          \"reason\": \"Temperature is HIGH\",\n          \"severity\": \"High\",\n          \"eventId\": \"V1_TemperatureHigh-1\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Activated\",\n              \"state\": true\n            },\n            {\n              \"stateType\": \"Enabled\",\n              \"state\": true\n            }\n          ]\n        }\n      }\n    ]\n  }\n}\n\n\"\"\";\n        /// <inheritdoc/>\n        public static IEnumerable<INodeManagerFactory> DeterministicAlarms1(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            var logger = (factory ?? Log.ConsoleFactory())\n                .CreateLogger<DeterministicAlarms.DeterministicAlarmsServer>();\n            yield return new DeterministicAlarms.DeterministicAlarmsServer(\n                timeservice, Config, logger);\n        }\n\n        /// <inheritdoc/>\n        public DeterministicAlarmsServer1()\n            : base(DeterministicAlarms1)\n        {\n        }\n\n        /// <inheritdoc/>\n        private DeterministicAlarmsServer1(ILoggerFactory loggerFactory)\n            : base(DeterministicAlarms1, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static DeterministicAlarmsServer1 Create(ILoggerFactory loggerFactory)\n        {\n            return new DeterministicAlarmsServer1(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/DeterministicAlarmsServer2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Furly.Extensions.Logging;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Alarms server fixture\n    /// </summary>\n    public class DeterministicAlarmsServer2 : BaseServerFixture\n    {\n        public static readonly string Config = \"\"\"\n\n{\n  \"folders\": [\n    {\n      \"name\": \"VendingMachines\",\n      \"sources\": [\n        {\n          \"objectType\": \"BaseObjectState\",\n          \"name\": \"VendingMachine1\",\n          \"alarms\": [\n            {\n              \"objectType\": \"TripAlarmType\",\n              \"name\": \"VendingMachine1_DoorOpen\",\n              \"id\": \"V1_DoorOpen\"\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"script\": {\n    \"waitUntilStartInSeconds\": 5,\n    \"isScriptInRepeatingLoop\": false,\n    \"runningForSeconds\": 36000,\n    \"steps\": [\n      {\n        \"event\": {\n          \"alarmId\": \"V1_DoorOpen\",\n          \"reason\": \"Door Open\",\n          \"severity\": \"High\",\n          \"eventId\": \"V1_DoorOpen-1\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Enabled\",\n              \"state\": true\n            },\n            {\n              \"stateType\": \"Activated\",\n              \"state\": true\n            }\n          ]\n        }\n      },\n      {\n        \"sleepInSeconds\": 5\n      },\n      {\n        \"event\": {\n          \"alarmId\": \"V1_DoorOpen\",\n          \"reason\": \"Door Closed\",\n          \"severity\": \"Medium\",\n          \"eventId\": \"V1_DoorOpen-2\",\n          \"stateChanges\": [\n            {\n              \"stateType\": \"Enabled\",\n              \"state\": false\n            },\n            {\n              \"stateType\": \"Activated\",\n              \"state\": false\n            }\n          ]\n        }\n      }\n    ]\n  }\n}\n\n\"\"\";\n        /// <inheritdoc/>\n        public static IEnumerable<INodeManagerFactory> DeterministicAlarms2(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            var logger = (factory ?? Log.ConsoleFactory())\n                .CreateLogger<DeterministicAlarms.DeterministicAlarmsServer>();\n            yield return new DeterministicAlarms.DeterministicAlarmsServer(\n                timeservice, Config, logger);\n        }\n\n        /// <inheritdoc/>\n        public DeterministicAlarmsServer2()\n            : base(DeterministicAlarms2)\n        {\n        }\n\n        /// <inheritdoc/>\n        private DeterministicAlarmsServer2(ILoggerFactory loggerFactory)\n            : base(DeterministicAlarms2, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static DeterministicAlarmsServer2 Create(ILoggerFactory loggerFactory)\n        {\n            return new DeterministicAlarmsServer2(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/FileSystemServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Sample server fixture\n    /// </summary>\n    public class FileSystemServer : BaseServerFixture\n    {\n        /// <summary>\n        /// Sample server nodes\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"timeservice\"></param>\n        public static IEnumerable<INodeManagerFactory> FileSystem(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new FileSystem.FileSystemServer();\n        }\n\n        /// <inheritdoc/>\n        public FileSystemServer() : base(FileSystem)\n        {\n        }\n\n        /// <inheritdoc/>\n        private FileSystemServer(ILoggerFactory loggerFactory)\n            : base(FileSystem, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static FileSystemServer Create(ILoggerFactory loggerFactory)\n        {\n            return new FileSystemServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/HistoricalAccessServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Sample server fixture\n    /// </summary>\n    public class HistoricalAccessServer : BaseServerFixture\n    {\n        /// <summary>\n        /// Sample server nodes\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"timeservice\"></param>\n        public static IEnumerable<INodeManagerFactory> HistoricalAccess(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new HistoricalAccess.HistoricalAccessServer(timeservice);\n        }\n\n        /// <inheritdoc/>\n        public HistoricalAccessServer()\n            : base(HistoricalAccess)\n        {\n        }\n\n        /// <inheritdoc/>\n        private HistoricalAccessServer(ILoggerFactory loggerFactory)\n            : base(HistoricalAccess, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static HistoricalAccessServer Create(ILoggerFactory loggerFactory)\n        {\n            return new HistoricalAccessServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/HistoricalEventsServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Sample server fixture\n    /// </summary>\n    public class HistoricalEventsServer : BaseServerFixture\n    {\n        /// <summary>\n        /// Sample server nodes\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"timeservice\"></param>\n        public static IEnumerable<INodeManagerFactory> HistoricalEvents(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new HistoricalEvents.HistoricalEventsServer(timeservice);\n        }\n\n        /// <inheritdoc/>\n        public HistoricalEventsServer()\n            : base(HistoricalEvents)\n        {\n        }\n\n        /// <inheritdoc/>\n        private HistoricalEventsServer(ILoggerFactory loggerFactory)\n            : base(HistoricalEvents, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static HistoricalEventsServer Create(ILoggerFactory loggerFactory)\n        {\n            return new HistoricalEventsServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/Isa95JobsServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Isa95Jobs fixture\n    /// </summary>\n    public class Isa95JobsServer : BaseServerFixture\n    {\n        /// <inheritdoc/>\n        public static IEnumerable<INodeManagerFactory> Isa95Jobs(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new Isa95Jobs.Isa95JobControlServer();\n        }\n\n        /// <inheritdoc/>\n        public Isa95JobsServer()\n            : base(Isa95Jobs)\n        {\n        }\n\n        /// <inheritdoc/>\n        private Isa95JobsServer(ILoggerFactory loggerFactory)\n            : base(Isa95Jobs, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static Isa95JobsServer Create(ILoggerFactory loggerFactory)\n        {\n            return new Isa95JobsServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/PlcServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Furly.Extensions.Logging;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Plc server fixture\n    /// </summary>\n    public class PlcServer : BaseServerFixture\n    {\n        /// <inheritdoc/>\n        public static IEnumerable<INodeManagerFactory> Plc(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new Plc.PlcServer(timeservice,\n                (factory ?? Log.ConsoleFactory()).CreateLogger<Plc.PlcServer>(), 0);\n        }\n\n        /// <inheritdoc/>\n        public PlcServer()\n            : base(Plc)\n        {\n        }\n\n        /// <inheritdoc/>\n        private PlcServer(ILoggerFactory loggerFactory)\n            : base(Plc, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static PlcServer Create(ILoggerFactory loggerFactory)\n        {\n            return new PlcServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/ReferenceServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Furly.Extensions.Logging;\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Reference server fixture\n    /// </summary>\n    public class ReferenceServer : BaseServerFixture\n    {\n        /// <summary>\n        /// Sample server nodes\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"timeservice\"></param>\n        public static IEnumerable<INodeManagerFactory> Reference(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new TestData.TestDataServer();\n            yield return new MemoryBuffer.MemoryBufferServer();\n            yield return new Boiler.BoilerServer();\n            yield return new Vehicles.VehiclesServer();\n            yield return new Reference.ReferenceServer();\n            yield return new HistoricalEvents.HistoricalEventsServer(timeservice);\n            yield return new HistoricalAccess.HistoricalAccessServer(timeservice);\n            yield return new Views.ViewsServer();\n            yield return new DataAccess.DataAccessServer();\n            yield return new Alarms.AlarmConditionServer(timeservice);\n            yield return new SimpleEvents.SimpleEventsServer();\n            yield return new Plc.PlcServer(timeservice,\n                (factory ?? Log.ConsoleFactory()).CreateLogger<Plc.PlcServer>(), 0);\n        }\n\n        /// <inheritdoc/>\n        public ReferenceServer()\n            : base(Reference)\n        {\n        }\n\n        /// <inheritdoc/>\n        private ReferenceServer(ILoggerFactory loggerFactory,\n            bool useReverseConnect)\n            : base(Reference, loggerFactory, useReverseConnect)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static ReferenceServer Create(ILoggerFactory loggerFactory,\n            bool useReverseConnect = false)\n        {\n            return new ReferenceServer(loggerFactory, useReverseConnect);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/SimpleEventsServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Simple events fixture\n    /// </summary>\n    public class SimpleEventsServer : BaseServerFixture\n    {\n        /// <inheritdoc/>\n        public static IEnumerable<INodeManagerFactory> SimpleEvents(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new SimpleEvents.SimpleEventsServer();\n        }\n\n        /// <inheritdoc/>\n        public SimpleEventsServer()\n            : base(SimpleEvents)\n        {\n        }\n\n        /// <inheritdoc/>\n        private SimpleEventsServer(ILoggerFactory loggerFactory)\n            : base(SimpleEvents, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static SimpleEventsServer Create(ILoggerFactory loggerFactory)\n        {\n            return new SimpleEventsServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Fixtures/TestDataServer.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Fixtures\n{\n    using Microsoft.Extensions.Logging;\n    using Opc.Ua.Server;\n    using Opc.Ua.Test;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// Sample server fixture\n    /// </summary>\n    public class TestDataServer : BaseServerFixture\n    {\n        /// <summary>\n        /// Sample server nodes\n        /// </summary>\n        /// <param name=\"factory\"></param>\n        /// <param name=\"timeservice\"></param>\n        public static IEnumerable<INodeManagerFactory> TestData(\n            ILoggerFactory? factory, TimeService timeservice)\n        {\n            yield return new TestData.TestDataServer();\n            yield return new MemoryBuffer.MemoryBufferServer();\n            yield return new Boiler.BoilerServer();\n            yield return new DataAccess.DataAccessServer();\n        }\n\n        /// <inheritdoc/>\n        public TestDataServer() : base(TestData)\n        {\n        }\n\n        /// <inheritdoc/>\n        private TestDataServer(ILoggerFactory loggerFactory)\n            : base(TestData, loggerFactory)\n        {\n        }\n\n        /// <inheritdoc/>\n        public static TestDataServer Create(ILoggerFactory loggerFactory)\n        {\n            return new TestDataServer(loggerFactory);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Properties/AssemblyInfo.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nusing System;\n\n[assembly: CLSCompliant(false)]\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Runtime/TestClientConfig.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Runtime\n{\n    using Azure.IIoT.OpcUa.Publisher.Stack;\n    using Furly.Extensions.Configuration;\n    using Furly.Extensions.Utils;\n    using Microsoft.Extensions.Configuration;\n    using System;\n    using System.IO;\n\n    /// <summary>\n    /// Client's application configuration implementation\n    /// </summary>\n    public sealed class TestClientConfig : ConfigureOptionBase<OpcUaClientOptions>,\n        IDisposable\n    {\n        public TestClientConfig(IConfiguration configuration) : base(configuration)\n        {\n            _path = Path.Combine(Directory.GetCurrentDirectory(), \"pki\",\n                    Guid.NewGuid().ToByteArray().ToBase16String());\n        }\n\n        /// <inheritdoc/>\n        public override void Configure(string? name, OpcUaClientOptions options)\n        {\n            options.Security.PkiRootPath = _path;\n            options.LingerTimeoutDuration = TimeSpan.FromSeconds(20);\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            if (Directory.Exists(_path))\n            {\n                Try.Op(() => Directory.Delete(_path, true));\n            }\n        }\n\n        private readonly string _path;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/Alarms/AlarmServerTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Alarms;\n    using FluentAssertions;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    /// <summary>\n    /// Alarms server node tests\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class AlarmServerTests<T>\n    {\n        public AlarmServerTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task BrowseAreaPathTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            var results = await services.BrowsePathAsync(_connection, new BrowsePathRequestModel\n            {\n                NodeId = Opc.Ua.ObjectIds.Server.ToString(),\n                BrowsePaths = new[]\n                {\n                    new[]\n                    {\n                        Namespaces.AlarmCondition + \"#Green\",\n                        Namespaces.AlarmCondition + \"#East\",\n                        Namespaces.AlarmCondition + \"#Blue\"\n                    }\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            var target = Assert.Single(results.Targets!);\n            Assert.NotNull(target.BrowsePath);\n            Assert.NotNull(target.Target);\n            Assert.Equal(\"http://opcfoundation.org/AlarmCondition#s=0%3aEast%2fBlue\", target.Target.NodeId);\n        }\n\n        public async Task BrowseMetalsSouthMotorTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.BrowsePathAsync(_connection, new BrowsePathRequestModel\n            {\n                NodeId = Opc.Ua.ObjectIds.Server.ToString(),\n                BrowsePaths = new[]\n                {\n                    new[]\n                    {\n                        Namespaces.AlarmCondition + \"#Green\",\n                        Namespaces.AlarmCondition + \"#East\",\n                        Namespaces.AlarmCondition + \"#Blue\",\n                        Namespaces.AlarmCondition + \"#SouthMotor\"\n                    }\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            var target = Assert.Single(results.Targets!);\n            Assert.NotNull(target.BrowsePath);\n            Assert.NotNull(target.Target);\n            Assert.Equal(\"http://opcfoundation.org/AlarmCondition#s=1%3aMetals%2fSouthMotor\", target.Target.NodeId);\n        }\n\n        public async Task BrowseColoursEastTankTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            var results = await services.BrowsePathAsync(_connection, new BrowsePathRequestModel\n            {\n                NodeId = Opc.Ua.ObjectIds.Server.ToString(),\n                BrowsePaths = new[]\n                {\n                    new[]\n                    {\n                        Namespaces.AlarmCondition + \"#Yellow\",\n                        Namespaces.AlarmCondition + \"#West\",\n                        Namespaces.AlarmCondition + \"#Blue\",\n                        Namespaces.AlarmCondition + \"#EastTank\"\n                    }\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            var target = Assert.Single(results.Targets!);\n            Assert.NotNull(target.BrowsePath);\n            Assert.NotNull(target.Target);\n            Assert.Equal(\"http://opcfoundation.org/AlarmCondition#s=1%3aColours%2fEastTank\", target.Target.NodeId);\n        }\n\n        public async Task CompileSimpleBaseEventQueryTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var result = await services.CompileQueryAsync(_connection, new QueryCompilationRequestModel\n            {\n                Query = \"select * from BaseEventType\",\n                QueryType = QueryType.Event\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Null(result.ErrorInfo);\n            var expected = new EventFilterModel\n            {\n                SelectClauses = new List<SimpleAttributeOperandModel>\n                {\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventType\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventType.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceNode\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceNode.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Time\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Time.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ReceiveTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReceiveTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/LocalTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LocalTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Message\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Message.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Severity\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Severity.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionSubClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionSubClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassName.Value\"\n                    }\n                }\n            };\n            result.EventFilter.Should().BeEquivalentTo(expected);\n        }\n\n        public async Task CompileSimpleTripAlarmQueryTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var result = await services.CompileQueryAsync(_connection, new QueryCompilationRequestModel\n            {\n                Query = \"select * from TripAlarmType\",\n                QueryType = QueryType.Event\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Null(result.ErrorInfo);\n            var expected = new EventFilterModel\n            {\n                SelectClauses = new List<SimpleAttributeOperandModel>\n                {\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventType\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventType.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceNode\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceNode.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Time\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Time.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ReceiveTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReceiveTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/LocalTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LocalTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Message\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Message.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Severity\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Severity.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionSubClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionSubClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/BranchId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/BranchId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Retain\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Retain.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/SupportsFilteredRetain\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SupportsFilteredRetain.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/EnabledState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/EnabledState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/EnabledState\", \"/EffectiveDisplayName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState/EffectiveDisplayName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/EnabledState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/EnabledState\", \"/EffectiveTransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState/EffectiveTransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Quality\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Quality.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Quality\", \"/SourceTimestamp\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Quality/SourceTimestamp.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/LastSeverity\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LastSeverity.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/LastSeverity\", \"/SourceTimestamp\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LastSeverity/SourceTimestamp.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Comment\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Comment.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Comment\", \"/SourceTimestamp\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Comment/SourceTimestamp.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/AckedState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AckedState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/AckedState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AckedState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/AckedState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AckedState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/ConfirmedState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConfirmedState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/ConfirmedState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConfirmedState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/ConfirmedState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConfirmedState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\", \"/EffectiveDisplayName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState/EffectiveDisplayName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\", \"/EffectiveTransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState/EffectiveTransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/InputNode\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/InputNode.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SuppressedState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SuppressedState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SuppressedState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SuppressedState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SuppressedState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SuppressedState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OutOfServiceState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OutOfServiceState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OutOfServiceState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OutOfServiceState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OutOfServiceState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OutOfServiceState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/CurrentState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/CurrentState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/CurrentState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/CurrentState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/LastTransition\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/LastTransition.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/LastTransition\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/LastTransition/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/LastTransition\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/LastTransition/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/UnshelveTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/UnshelveTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/TimedShelve\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/TimedShelve.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/TimedShelve\", \"/InputArguments\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/TimedShelve/InputArguments.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/Unshelve\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/Unshelve.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/OneShotShelve\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/OneShotShelve.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SuppressedOrShelved\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SuppressedOrShelved.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/MaxTimeShelved\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/MaxTimeShelved.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/AudibleEnabled\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AudibleEnabled.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/AudibleSound\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AudibleSound.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SilenceState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SilenceState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SilenceState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SilenceState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SilenceState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SilenceState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OnDelay\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OnDelay.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OffDelay\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OffDelay.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/FirstInGroupFlag\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/FirstInGroupFlag.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/FirstInGroup\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/FirstInGroup.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/LatchedState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LatchedState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/LatchedState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LatchedState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/LatchedState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LatchedState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/%3cAlarmGroup%3e\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/<AlarmGroup>.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ReAlarmTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReAlarmTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ReAlarmRepeatCount\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReAlarmRepeatCount.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=10637\",\n                        BrowsePath = new[] { \"/NormalState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/NormalState.Value\"\n                    }\n                }\n            };\n            result.EventFilter.Should().BeEquivalentTo(expected);\n        }\n\n        public async Task CompileAlarmQueryTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var result = await services.CompileQueryAsync(_connection, new QueryCompilationRequestModel\n            {\n                Query = @\"\n                    PREFIX ac <http://opcfoundation.org/AlarmCondition>\n                    SELECT /Comment, /Severity, /SourceNode FROM TripAlarmType, BaseEventType\n                    WHERE\n                        OFTYPE TripAlarmType AND\n                        /SourceNode IN ('ac:s=1%3aMetals%2fSouthMotor'^^NodeId)\n                \",\n                QueryType = QueryType.Event\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Null(result.ErrorInfo);\n\n            var expected = new EventFilterModel\n            {\n                SelectClauses = new List<SimpleAttributeOperandModel>\n                {\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Comment\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Comment.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Severity\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Severity.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceNode\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceNode.Value\"\n                    }\n                },\n                WhereClause = new ContentFilterModel\n                {\n                    Elements = new List<ContentFilterElementModel>\n                    {\n                        new() {\n                            FilterOperator = FilterOperatorType.And,\n                            FilterOperands = new []\n                            {\n                                new FilterOperandModel\n                                {\n                                    Index = 1\n                                },\n                                new FilterOperandModel\n                                {\n                                    Index = 2\n                                }\n                            }\n                        },\n                        new() {\n                            FilterOperator = FilterOperatorType.InList,\n                            FilterOperands = new List<FilterOperandModel>\n                            {\n                                new() {\n                                    NodeId = \"i=2041\",\n                                    BrowsePath = new[] { \"/SourceNode\" },\n                                    AttributeId = NodeAttribute.Value\n                                },\n                                new() {\n                                    Value = \"http://opcfoundation.org/AlarmCondition#s=1%3aMetals%2fSouthMotor\",\n                                    DataType = \"NodeId\"\n                                }\n                            }\n                        },\n                        new() {\n                            FilterOperator = FilterOperatorType.OfType,\n                            FilterOperands = new List<FilterOperandModel>\n                            {\n                                new() {\n                                    Value = \"i=10751\",\n                                    DataType = \"NodeId\"\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n\n            result.EventFilter.Should().BeEquivalentTo(expected);\n        }\n\n        public async Task CompileAlarmQueryTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var result = await services.CompileQueryAsync(_connection, new QueryCompilationRequestModel\n            {\n                Query = @\"\n                    PREFIX ac <http://opcfoundation.org/AlarmCondition>\n                    SELECT * FROM BaseEventType, TripAlarmType\n                    WHERE\n                        OFTYPE TripAlarmType AND\n                        /SourceNode IN ('ac:s=1%3aMetals%2fSouthMotor'^^NodeId)\n                \",\n                QueryType = QueryType.Event\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Null(result.ErrorInfo);\n            var expected = new EventFilterModel\n            {\n                SelectClauses = new List<SimpleAttributeOperandModel>\n                {\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventType\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventType.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceNode\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceNode.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Time\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Time.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ReceiveTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReceiveTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/LocalTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LocalTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Message\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Message.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Severity\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Severity.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionSubClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionSubClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionSubClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionSubClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/ConditionName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/BranchId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/BranchId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Retain\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Retain.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/SupportsFilteredRetain\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SupportsFilteredRetain.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/EnabledState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/EnabledState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/EnabledState\", \"/EffectiveDisplayName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState/EffectiveDisplayName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/EnabledState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/EnabledState\", \"/EffectiveTransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EnabledState/EffectiveTransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Quality\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Quality.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Quality\", \"/SourceTimestamp\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Quality/SourceTimestamp.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/LastSeverity\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LastSeverity.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/LastSeverity\", \"/SourceTimestamp\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LastSeverity/SourceTimestamp.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Comment\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Comment.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2782\",\n                        BrowsePath = new[] { \"/Comment\", \"/SourceTimestamp\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Comment/SourceTimestamp.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/AckedState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AckedState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/AckedState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AckedState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/AckedState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AckedState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/ConfirmedState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConfirmedState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/ConfirmedState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConfirmedState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2881\",\n                        BrowsePath = new[] { \"/ConfirmedState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConfirmedState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\", \"/EffectiveDisplayName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState/EffectiveDisplayName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ActiveState\", \"/EffectiveTransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ActiveState/EffectiveTransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/InputNode\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/InputNode.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SuppressedState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SuppressedState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SuppressedState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SuppressedState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SuppressedState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SuppressedState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OutOfServiceState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OutOfServiceState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OutOfServiceState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OutOfServiceState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OutOfServiceState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OutOfServiceState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/CurrentState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/CurrentState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/CurrentState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/CurrentState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/LastTransition\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/LastTransition.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/LastTransition\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/LastTransition/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/LastTransition\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/LastTransition/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/UnshelveTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/UnshelveTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/TimedShelve\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/TimedShelve.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/TimedShelve\", \"/InputArguments\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/TimedShelve/InputArguments.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/Unshelve\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/Unshelve.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ShelvingState\", \"/OneShotShelve\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ShelvingState/OneShotShelve.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SuppressedOrShelved\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SuppressedOrShelved.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/MaxTimeShelved\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/MaxTimeShelved.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/AudibleEnabled\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AudibleEnabled.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/AudibleSound\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/AudibleSound.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SilenceState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SilenceState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SilenceState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SilenceState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/SilenceState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SilenceState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OnDelay\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OnDelay.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/OffDelay\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/OffDelay.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/FirstInGroupFlag\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/FirstInGroupFlag.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/FirstInGroup\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/FirstInGroup.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/LatchedState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LatchedState.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/LatchedState\", \"/Id\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LatchedState/Id.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/LatchedState\", \"/TransitionTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LatchedState/TransitionTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/%3cAlarmGroup%3e\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/<AlarmGroup>.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ReAlarmTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReAlarmTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2915\",\n                        BrowsePath = new[] { \"/ReAlarmRepeatCount\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReAlarmRepeatCount.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=10637\",\n                        BrowsePath = new[] { \"/NormalState\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/NormalState.Value\"\n                    }\n                },\n                WhereClause = new ContentFilterModel\n                {\n                    Elements = new List<ContentFilterElementModel>\n                    {\n                        new() {\n                            FilterOperator = FilterOperatorType.And,\n                            FilterOperands = new []\n                            {\n                                new FilterOperandModel\n                                {\n                                    Index = 1u\n                                },\n                                new FilterOperandModel\n                                {\n                                    Index = 2u\n                                }\n                            }\n                        },\n                        new() {\n                            FilterOperator = FilterOperatorType.InList,\n                            FilterOperands = new []\n                            {\n                                new FilterOperandModel\n                                {\n                                    NodeId = \"i=2041\",\n                                    BrowsePath = new[] { \"/SourceNode\" },\n                                    AttributeId = NodeAttribute.Value\n                                },\n                                new FilterOperandModel\n                                {\n                                    Value = \"http://opcfoundation.org/AlarmCondition#s=1%3aMetals%2fSouthMotor\",\n                                    DataType = \"NodeId\"\n                                }\n                            }\n                        },\n                        new() {\n                            FilterOperator = FilterOperatorType.OfType,\n                            FilterOperands = new []\n                            {\n                                new FilterOperandModel\n                                {\n                                    Value = \"i=10751\",\n                                    DataType = \"NodeId\"\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n            result.EventFilter.Should().BeEquivalentTo(expected);\n        }\n\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/Asset/AssetTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Moq;\n    using Moq.Language.Flow;\n    using System;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class AssetTests1\n    {\n        /// <summary>\n        /// Create configuration tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"verify\"></param>\n        public AssetTests1(Func<IPublishedNodesServices, IAssetConfiguration<Stream>> services,\n            ConnectionModel connection, bool verify = true)\n        {\n            _verify = verify;\n            _service = services;\n            _connection = connection;\n\n            _publishedNodesServices = new Mock<IPublishedNodesServices>();\n            _createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                .Returns(Task.CompletedTask);\n            _deleteCall = _publishedNodesServices.Setup(s => s.RemoveDataSetWriterEntryAsync(\n                \"WriterGroup1\", It.IsAny<string>(), false, It.IsAny<CancellationToken>()))\n                .Returns(Task.CompletedTask);\n        }\n\n        public async Task ConfigureAndDeleteAssetsAsync(CancellationToken ct = default)\n        {\n            var service = _service(_publishedNodesServices.Object);\n\n            ServiceResponse<PublishedNodesEntryModel> result;\n            var asset1 = _connection.ToPublishedNodesEntry();\n            asset1.DataSetWriterGroup = \"WriterGroup1\";\n            asset1.DataSetName = \"Sim3264Asset\";\n\n            _createCall.Verifiable(Times.Exactly(2));\n            _deleteCall.Verifiable(Times.Once);\n\n            const string Asset1 = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:sim3264\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"sim-3264\",\n    \"base\": \"sim://simserver1:443\",\n    \"title\": \"Simulated Asset\",\n    \"properties\": {\n        \"VoltageL1-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"3\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"5\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL1-L2\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"7\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-L3\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"9\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-L1\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"11\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"13\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"15\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"17\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"19\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"139\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"141\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalApparentPower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"63\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalActivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"65\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalReactivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"67\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalPowerFactor\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"69\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n            var stream = new MemoryStream(Encoding.UTF8.GetBytes(Asset1));\n            await using (var c1 = stream.ConfigureAwait(false))\n            {\n                var request = new PublishedNodeCreateAssetRequestModel<Stream>\n                {\n                    Configuration = stream,\n                    Entry = asset1\n                };\n\n                result = await service.CreateOrUpdateAssetAsync(\n                    request, ct).ConfigureAwait(false);\n\n                Assert.Null(result.ErrorInfo);\n                Assert.NotNull(result.Result);\n                Assert.NotNull(result.Result.OpcNodes);\n                Assert.Equal(16, result.Result.OpcNodes.Count);\n                Assert.Equal(\"nsu=http://opcfoundation.org/AssetServer;i=1\",\n                    result.Result.DataSetWriterId);\n\n                asset1 = result.Result;\n            }\n\n            var asset2 = _connection.ToPublishedNodesEntry();\n            asset2.DataSetWriterGroup = \"WriterGroup1\";\n            asset2.DataSetName = \"Sim3265Asset\";\n\n            const string Asset2 = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:sim3265\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"sim-3264\",\n    \"base\": \"sim://simserver1:443\",\n    \"title\": \"Simulated Asset\",\n    \"properties\": {\n        \"VoltageL1-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"3\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"5\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL1-L2\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"7\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-L3\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"9\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-L1\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"11\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"13\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"15\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"17\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"19\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"139\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"141\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalApparentPower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"63\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalActivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"65\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalReactivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"67\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalPowerFactor\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"69\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n            var stream2 = new MemoryStream(Encoding.UTF8.GetBytes(Asset2));\n            await using (var c2 = stream2.ConfigureAwait(false))\n            {\n                var request = new PublishedNodeCreateAssetRequestModel<Stream>\n                {\n                    Configuration = stream2,\n                    Entry = asset2\n                };\n\n                result = await service.CreateOrUpdateAssetAsync(\n                    request, ct).ConfigureAwait(false);\n                Assert.Null(result.ErrorInfo);\n                Assert.NotNull(result.Result);\n                Assert.NotNull(result.Result.OpcNodes);\n                Assert.Equal(16, result.Result.OpcNodes.Count);\n                Assert.Equal(\"nsu=http://opcfoundation.org/AssetServer;i=24\",\n                    result.Result.DataSetWriterId);\n\n                asset2 = result.Result;\n            }\n\n            // Now we have 2 assets created\n            var results = await service.GetAllAssetsAsync(result.Result, ct: ct)\n                .ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(2, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.Equal(16, r.Result.OpcNodes.Count);\n            });\n\n            var errorInfo = await service.DeleteAssetAsync(\n                new PublishedNodeDeleteAssetRequestModel\n                {\n                    Entry = asset2\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(errorInfo);\n            Assert.Equal(0u, errorInfo.StatusCode);\n\n            // Now we have 1 asset remaining\n            results = await service.GetAllAssetsAsync(asset1, ct: ct)\n                .ToListAsync(ct).ConfigureAwait(false);\n\n            var remainingAsset = Assert.Single(results);\n            Assert.Null(remainingAsset.ErrorInfo);\n            Assert.NotNull(remainingAsset.Result);\n            Assert.NotNull(remainingAsset.Result.OpcNodes);\n            Assert.Equal(16, remainingAsset.Result.OpcNodes.Count);\n\n            Verify();\n        }\n\n        private void Verify()\n        {\n            if (_verify)\n            {\n                _publishedNodesServices.Verify();\n                _publishedNodesServices.VerifyNoOtherCalls();\n            }\n        }\n\n        private readonly ConnectionModel _connection;\n        private readonly bool _verify;\n        private readonly Mock<IPublishedNodesServices> _publishedNodesServices;\n        private readonly IReturnsResult<IPublishedNodesServices> _createCall;\n        private readonly IReturnsResult<IPublishedNodesServices> _deleteCall;\n        private readonly Func<IPublishedNodesServices, IAssetConfiguration<Stream>> _service;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/Asset/AssetTests2.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Moq;\n    using Moq.Language.Flow;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class AssetTests2\n    {\n        /// <summary>\n        /// Create configuration tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"verify\"></param>\n        public AssetTests2(Func<IPublishedNodesServices, IAssetConfiguration<Stream>> services,\n            ConnectionModel connection, bool verify = true)\n        {\n            _verify = verify;\n            _service = services;\n            _connection = connection;\n\n            _publishedNodesServices = new Mock<IPublishedNodesServices>();\n            _createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                .Returns(Task.CompletedTask);\n            _deleteCall = _publishedNodesServices.Setup(s => s.RemoveDataSetWriterEntryAsync(\n                \"WriterGroup1\", It.IsAny<string>(), false, It.IsAny<CancellationToken>()))\n                .Returns(Task.CompletedTask);\n        }\n\n        public async Task ConfigureAsset1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.DataSetWriterGroup = \"WriterGroup1\";\n            entry.DataSetName = \"Sim3264Asset\";\n\n            const string Asset1 = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:sim3264\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"sim-3264\",\n    \"base\": \"sim://simserver1:443\",\n    \"title\": \"Simulated Asset\",\n    \"properties\": {\n        \"VoltageL1-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"3\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"5\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL1-L2\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"7\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-L3\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"9\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-L1\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"11\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"13\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"15\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"17\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"19\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"139\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"141\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalApparentPower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"63\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalActivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"65\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalReactivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"67\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalPowerFactor\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"69\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n            var stream = new MemoryStream(Encoding.UTF8.GetBytes(Asset1));\n            await using var _ = stream.ConfigureAwait(false);\n            var request = new PublishedNodeCreateAssetRequestModel<Stream>\n            {\n                Configuration = stream,\n                Entry = entry\n            };\n\n            _createCall.Verifiable(Times.Once);\n            var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                request, ct).ConfigureAwait(false);\n\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(16, result.Result.OpcNodes.Count);\n            Assert.StartsWith(\"nsu=http://opcfoundation.org/AssetServer;i=\",\n                result.Result.DataSetWriterId, StringComparison.Ordinal);\n\n            Verify();\n        }\n\n        public async Task ConfigureAsset2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.DataSetWriterGroup = \"WriterGroup1\";\n            entry.DataSetName = \"Sim3265Asset\";\n\n            const string Asset2 = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:sim3265\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"sim-3265\",\n    \"base\": \"sim://simserver1:443\",\n    \"title\": \"Simulated Asset\",\n    \"properties\": {\n        \"VoltageL1-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"3\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"5\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL1-L2\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"7\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-L3\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"9\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-L1\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"11\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"13\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"15\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"17\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"19\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"139\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"141\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalApparentPower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"63\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalActivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"65\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalReactivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"67\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalPowerFactor\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"69\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n            var stream = new MemoryStream(Encoding.UTF8.GetBytes(Asset2));\n            await using var _ = stream.ConfigureAwait(false);\n            var request = new PublishedNodeCreateAssetRequestModel<Stream>\n            {\n                Configuration = stream,\n                Entry = entry\n            };\n\n            _createCall.Verifiable(Times.Once);\n            _deleteCall.Verifiable(Times.Once);\n            var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                request, ct).ConfigureAwait(false);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(16, result.Result.OpcNodes.Count);\n            Assert.StartsWith(\"nsu=http://opcfoundation.org/AssetServer;i=\",\n                result.Result.DataSetWriterId, StringComparison.Ordinal);\n\n            var errorInfo = await _service(_publishedNodesServices.Object).DeleteAssetAsync(\n                new PublishedNodeDeleteAssetRequestModel\n                {\n                    Entry = result.Result\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(result.ErrorInfo);\n\n            Verify();\n        }\n\n        public async Task ConfigureAsset3Async(CancellationToken ct = default)\n        {\n            var service = _service(_publishedNodesServices.Object);\n            const string Template = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:<<name>>\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"<<name>>\",\n    \"base\": \"sim://<<name>>:443\",\n    \"title\": \"Simulated Asset <<name>>\",\n    \"properties\": {\n        \"AssetTag\": {\n            \"type\": \"number\",\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"writeproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"String\",\n                    \"sim:pollingTime\": 1000\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n            const int NumberOfAssets = 50;\n            const string AssetPrefix = \"SimAsset__\";\n            _createCall.Verifiable(Times.Exactly(NumberOfAssets));\n            _deleteCall.Verifiable(Times.Exactly(NumberOfAssets));\n\n            var assets = new List<PublishedNodesEntryModel>();\n            for (var i = 0; i < NumberOfAssets; i++)\n            {\n                var asset = _connection.ToPublishedNodesEntry();\n                asset.DataSetWriterGroup = \"WriterGroup1\";\n                asset.DataSetName = AssetPrefix + i;\n                var t = Template.Replace(\"<<name>>\", \"sim\" + i, StringComparison.Ordinal);\n\n                var stream = new MemoryStream(Encoding.UTF8.GetBytes(t));\n                await using var c1 = stream.ConfigureAwait(false);\n                var request = new PublishedNodeCreateAssetRequestModel<Stream>\n                {\n                    Configuration = stream,\n                    Entry = asset\n                };\n\n                var result = await service.CreateOrUpdateAssetAsync(\n                    request, ct).ConfigureAwait(false);\n\n                AssertResult(result);\n                assets.Add(result.Result!);\n            }\n\n            var firstAsset = assets[0];\n            foreach (var asset in assets.ToList())\n            {\n                var results = await service.GetAllAssetsAsync(firstAsset, ct: ct)\n                    .ToListAsync(ct).ConfigureAwait(false);\n                results = results.Where(e => e.Result?.DataSetName?\n                    .StartsWith(AssetPrefix, StringComparison.Ordinal) ?? true).ToList();\n                Assert.Equal(assets.Count, results.Count);\n                Assert.All(results, AssertResult);\n\n                var errorInfo = await service.DeleteAssetAsync(\n                    new PublishedNodeDeleteAssetRequestModel\n                    {\n                        Entry = asset\n                    }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(errorInfo);\n                Assert.Equal(0u, errorInfo.StatusCode);\n                assets.Remove(asset);\n            }\n\n            // Now none remaining\n            var nothingLeft = await service.GetAllAssetsAsync(firstAsset, ct: ct)\n                .ToListAsync(ct).ConfigureAwait(false);\n            nothingLeft = nothingLeft.Where(e => e.Result?.DataSetName?\n               .StartsWith(AssetPrefix, StringComparison.Ordinal) ?? true).ToList();\n            Assert.Empty(nothingLeft);\n\n            Verify();\n\n            static void AssertResult(ServiceResponse<PublishedNodesEntryModel> result)\n            {\n                Assert.Null(result.ErrorInfo);\n                Assert.NotNull(result.Result);\n                Assert.NotNull(result.Result.OpcNodes);\n                Assert.StartsWith(AssetPrefix, result.Result.DataSetName, StringComparison.Ordinal);\n                var node = Assert.Single(result.Result.OpcNodes);\n            }\n        }\n\n        private void Verify()\n        {\n            if (_verify)\n            {\n                _publishedNodesServices.Verify();\n                _publishedNodesServices.VerifyNoOtherCalls();\n            }\n        }\n\n        private readonly ConnectionModel _connection;\n        private readonly Mock<IPublishedNodesServices> _publishedNodesServices;\n        private readonly IReturnsResult<IPublishedNodesServices> _createCall;\n        private readonly IReturnsResult<IPublishedNodesServices> _deleteCall;\n        private readonly Func<IPublishedNodesServices, IAssetConfiguration<Stream>> _service;\n        private readonly bool _verify;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/Asset/AssetTests3.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Moq;\n    using Moq.Language.Flow;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class AssetTests3\n    {\n        /// <summary>\n        /// Create configuration tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"verify\"></param>\n        public AssetTests3(Func<IPublishedNodesServices, IAssetConfiguration<byte[]>> services,\n            ConnectionModel connection, bool verify = true)\n        {\n            _verify = verify;\n            _service = services;\n            _connection = connection;\n\n            _publishedNodesServices = new Mock<IPublishedNodesServices>();\n            _createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                .Returns(Task.CompletedTask);\n            _deleteCall = _publishedNodesServices.Setup(s => s.RemoveDataSetWriterEntryAsync(\n                \"WriterGroup1\", It.IsAny<string>(), false, It.IsAny<CancellationToken>()))\n                .Returns(Task.CompletedTask);\n        }\n\n        public async Task ConfigureAsset1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.DataSetWriterGroup = \"WriterGroup1\";\n            entry.DataSetName = \"Sim3264Asset\";\n\n            const string Asset1 = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:sim3264\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"sim-3264\",\n    \"base\": \"sim://simserver1:443\",\n    \"title\": \"Simulated Asset\",\n    \"properties\": {\n        \"VoltageL1-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"3\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"5\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL1-L2\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"7\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-L3\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"9\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-L1\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"11\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"13\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"15\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"17\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"19\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"139\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"141\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalApparentPower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"63\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalActivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"65\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalReactivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"67\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalPowerFactor\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"69\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n            var request = new PublishedNodeCreateAssetRequestModel<byte[]>\n            {\n                Configuration = Encoding.UTF8.GetBytes(Asset1),\n                Entry = entry\n            };\n\n            _createCall.Verifiable(Times.Once);\n            var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                request, ct).ConfigureAwait(false);\n\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(16, result.Result.OpcNodes.Count);\n            Assert.StartsWith(\"nsu=http://opcfoundation.org/AssetServer;i=\",\n                result.Result.DataSetWriterId, StringComparison.Ordinal);\n\n            Verify();\n        }\n\n        public async Task ConfigureAsset2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.DataSetWriterGroup = \"WriterGroup1\";\n            entry.DataSetName = \"Sim3265Asset\";\n\n            const string Asset2 = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:sim3265\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"sim-3265\",\n    \"base\": \"sim://simserver1:443\",\n    \"title\": \"Simulated Asset\",\n    \"properties\": {\n        \"VoltageL1-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"3\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"5\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL1-L2\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"7\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL2-L3\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"9\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"VoltageL3-L1\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"11\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"13\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"15\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"CurrentL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=Current\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"17\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL1\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"19\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL2\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"139\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"PowerFactorL3\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=PowerFactor\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"141\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalApparentPower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"63\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalActivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"65\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalReactivePower\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"67\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        },\n        \"TotalPowerFactor\": {\n            \"type\": \"number\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"69\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n            var request = new PublishedNodeCreateAssetRequestModel<byte[]>\n            {\n                Configuration = Encoding.UTF8.GetBytes(Asset2),\n                Entry = entry\n            };\n\n            _createCall.Verifiable(Times.Once);\n            _deleteCall.Verifiable(Times.Once);\n            var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                request, ct).ConfigureAwait(false);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(16, result.Result.OpcNodes.Count);\n            Assert.StartsWith(\"nsu=http://opcfoundation.org/AssetServer;i=\",\n                result.Result.DataSetWriterId, StringComparison.Ordinal);\n\n            var errorInfo = await _service(_publishedNodesServices.Object).DeleteAssetAsync(\n                new PublishedNodeDeleteAssetRequestModel\n                {\n                    Entry = result.Result\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(result.ErrorInfo);\n\n            Verify();\n        }\n\n        public async Task ConfigureAsset3Async(CancellationToken ct = default)\n        {\n            var service = _service(_publishedNodesServices.Object);\n            const string Template = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:<<name>>\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"<<name>>\",\n    \"base\": \"sim://<<name>>:443\",\n    \"title\": \"Simulated Asset <<name>>\",\n    \"properties\": {\n        \"AssetTag\": {\n            \"type\": \"number\",\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"writeproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"String\",\n                    \"sim:pollingTime\": 1000\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n            const int NumberOfAssets = 33;\n            const string AssetPrefix = \"SimAsset__\";\n            _createCall.Verifiable(Times.Exactly(NumberOfAssets));\n            _deleteCall.Verifiable(Times.Exactly(NumberOfAssets));\n\n            var assets = new List<PublishedNodesEntryModel>();\n            for (var i = 0; i < NumberOfAssets; i++)\n            {\n                var asset = _connection.ToPublishedNodesEntry();\n                asset.DataSetWriterGroup = \"WriterGroup1\";\n                asset.DataSetName = AssetPrefix + i;\n                var t = Template.Replace(\"<<name>>\", \"sim\" + i, StringComparison.Ordinal);\n\n                var request = new PublishedNodeCreateAssetRequestModel<byte[]>\n                {\n                    Configuration = Encoding.UTF8.GetBytes(t),\n                    Entry = asset\n                };\n\n                var result = await service.CreateOrUpdateAssetAsync(\n                    request, ct).ConfigureAwait(false);\n\n                AssertResult(result);\n                assets.Add(result.Result!);\n            }\n\n            var firstAsset = assets[0];\n            foreach (var asset in assets.ToList())\n            {\n                var results = await service.GetAllAssetsAsync(firstAsset, ct: ct)\n                    .ToListAsync(ct).ConfigureAwait(false);\n                results = results.Where(e => e.Result?.DataSetName?\n                    .StartsWith(AssetPrefix, StringComparison.Ordinal) ?? true).ToList();\n                Assert.Equal(assets.Count, results.Count);\n                Assert.All(results, AssertResult);\n\n                var errorInfo = await service.DeleteAssetAsync(\n                    new PublishedNodeDeleteAssetRequestModel\n                    {\n                        Entry = asset\n                    }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(errorInfo);\n                Assert.Equal(0u, errorInfo.StatusCode);\n                assets.Remove(asset);\n            }\n\n            // Now none remaining\n            var nothingLeft = await service.GetAllAssetsAsync(firstAsset, ct: ct)\n                .ToListAsync(ct).ConfigureAwait(false);\n            nothingLeft = nothingLeft.Where(e => e.Result?.DataSetName?\n               .StartsWith(AssetPrefix, StringComparison.Ordinal) ?? true).ToList();\n            Assert.Empty(nothingLeft);\n\n            Verify();\n\n            static void AssertResult(ServiceResponse<PublishedNodesEntryModel> result)\n            {\n                Assert.Null(result.ErrorInfo);\n                Assert.NotNull(result.Result);\n                Assert.NotNull(result.Result.OpcNodes);\n                Assert.StartsWith(AssetPrefix, result.Result.DataSetName, StringComparison.Ordinal);\n                var node = Assert.Single(result.Result.OpcNodes);\n            }\n        }\n\n        private void Verify()\n        {\n            if (_verify)\n            {\n                _publishedNodesServices.Verify();\n                _publishedNodesServices.VerifyNoOtherCalls();\n            }\n        }\n\n        private readonly ConnectionModel _connection;\n        private readonly Mock<IPublishedNodesServices> _publishedNodesServices;\n        private readonly IReturnsResult<IPublishedNodesServices> _createCall;\n        private readonly IReturnsResult<IPublishedNodesServices> _deleteCall;\n        private readonly Func<IPublishedNodesServices, IAssetConfiguration<byte[]>> _service;\n        private readonly bool _verify;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/Asset/AssetTests4.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Moq;\n    using System;\n    using System.IO;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class AssetTests4\n    {\n        /// <summary>\n        /// Create configuration tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"verify\"></param>\n        public AssetTests4(Func<IPublishedNodesServices, IAssetConfiguration<Stream>> services,\n            ConnectionModel connection, bool verify = true)\n        {\n            _verify = verify;\n            _service = services;\n            _connection = connection;\n\n            _publishedNodesServices = new Mock<IPublishedNodesServices>();\n        }\n\n        public async Task ConfigureDuplicateAssetFailsAsync(CancellationToken ct = default)\n        {\n            var asset1 = _connection.ToPublishedNodesEntry();\n            asset1.DataSetWriterGroup = \"WriterGroup1\";\n            asset1.DataSetName = \"ConfigureDuplicateAssetFailsAsync\";\n            var stream1 = new MemoryStream(Encoding.UTF8.GetBytes(kTestAsset));\n            await using (var s1 = stream1.ConfigureAwait(false))\n            {\n                var request1 = new PublishedNodeCreateAssetRequestModel<Stream>\n                {\n                    Configuration = stream1,\n                    Entry = asset1\n                };\n                var createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                    It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                    .Returns(Task.CompletedTask);\n                createCall.Verifiable(Times.Once);\n                var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                    request1, ct).ConfigureAwait(false);\n                Assert.Null(result.ErrorInfo);\n                Assert.NotNull(result.Result);\n                Assert.NotNull(result.Result.OpcNodes);\n                var node = Assert.Single(result.Result.OpcNodes);\n                Assert.StartsWith(\"nsu=http://opcfoundation.org/AssetServer;i=\",\n                    result.Result.DataSetWriterId, StringComparison.Ordinal);\n            }\n\n            var asset2 = _connection.ToPublishedNodesEntry();\n            asset2.DataSetWriterGroup = \"WriterGroup2\";\n            asset2.DataSetName = asset1.DataSetName;\n            var stream2 = new MemoryStream(Encoding.UTF8.GetBytes(kTestAsset));\n            await using (var s2 = stream2.ConfigureAwait(false))\n            {\n                var request2 = new PublishedNodeCreateAssetRequestModel<Stream>\n                {\n                    Configuration = stream2,\n                    Entry = asset2\n                };\n                var dup = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                    request2, ct).ConfigureAwait(false);\n\n                Assert.NotNull(dup.ErrorInfo);\n                Assert.Equal(Opc.Ua.StatusCodes.BadBrowseNameDuplicated, dup.ErrorInfo.StatusCode);\n            }\n            Verify();\n        }\n\n        public async Task ConfigureWithBadStreamFails1Async(CancellationToken ct = default)\n        {\n            var asset = _connection.ToPublishedNodesEntry();\n            asset.DataSetWriterGroup = \"WriterGroup1\";\n            asset.DataSetName = \"ConfigureWithBadStreamFails1Async\";\n\n            var stream = new MemoryStream(Encoding.UTF8.GetBytes(kTestAsset));\n            await stream.DisposeAsync().ConfigureAwait(false);\n            var request = new PublishedNodeCreateAssetRequestModel<Stream>\n            {\n                Configuration = stream,\n                Entry = asset\n            };\n\n            var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                request, ct).ConfigureAwait(false);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(Opc.Ua.StatusCodes.Bad, result.ErrorInfo.StatusCode);\n\n            Verify();\n        }\n\n        public async Task ConfigureWithBadStreamFails2Async(CancellationToken ct = default)\n        {\n            // Test passing a stream that throws on read\n            var asset = _connection.ToPublishedNodesEntry();\n            asset.DataSetWriterGroup = \"WriterGroup1\";\n            asset.DataSetName = \"ConfigureWithBadStreamFails2Async\";\n\n            var stream = new Mock<Stream>();\n            stream.Setup(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()))\n                .Throws(new IOException());\n            var request = new PublishedNodeCreateAssetRequestModel<Stream>\n            {\n                Configuration = stream.Object,\n                Entry = asset\n            };\n\n            var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                request, ct).ConfigureAwait(false);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(Opc.Ua.StatusCodes.BadUnexpectedError, result.ErrorInfo.StatusCode);\n\n            Verify();\n        }\n\n        public async Task ConfigureWithBadStreamFails3Async(CancellationToken ct = default)\n        {\n            // Test passing a stream that throws on close\n            var asset = _connection.ToPublishedNodesEntry();\n            asset.DataSetWriterGroup = \"WriterGroup1\";\n            asset.DataSetName = \"ConfigureWithBadStreamFails3Async\";\n\n            var stream = new Mock<Stream>();\n            stream.Setup(s => s.Close()).Throws(new IOException());\n            var request = new PublishedNodeCreateAssetRequestModel<Stream>\n            {\n                Configuration = stream.Object,\n                Entry = asset\n            };\n\n            var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                request, ct).ConfigureAwait(false);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(Opc.Ua.StatusCodes.BadUnexpectedError, result.ErrorInfo.StatusCode);\n\n            Verify();\n        }\n\n        public async Task ConfigureAssetFails1Async(CancellationToken ct = default)\n        {\n            // Throw in when calling create or update\n            var asset = _connection.ToPublishedNodesEntry();\n            asset.DataSetWriterGroup = \"WriterGroup1\";\n            asset.DataSetName = \"ConfigureAssetFails1Async\";\n\n            var stream = new MemoryStream(Encoding.UTF8.GetBytes(kTestAsset));\n            var request = new PublishedNodeCreateAssetRequestModel<Stream>\n            {\n                Configuration = stream,\n                Entry = asset\n            };\n\n            var createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                .Returns(Task.FromException(new IOException(\"Bad\")));\n            createCall.Verifiable(Times.Once);\n            var result = await _service(_publishedNodesServices.Object).CreateOrUpdateAssetAsync(\n                request, ct).ConfigureAwait(false);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(Opc.Ua.StatusCodes.Bad, result.ErrorInfo.StatusCode);\n\n            Verify();\n        }\n\n        private void Verify()\n        {\n            if (_verify)\n            {\n                _publishedNodesServices.Verify();\n                _publishedNodesServices.VerifyNoOtherCalls();\n            }\n        }\n\n        private readonly ConnectionModel _connection;\n        private readonly Mock<IPublishedNodesServices> _publishedNodesServices;\n        private readonly Func<IPublishedNodesServices, IAssetConfiguration<Stream>> _service;\n        private readonly bool _verify;\n        private const string kTestAsset = \"\"\"\n{\n    \"@context\": [\n        \"https://www.w3.org/2022/wot/td/v1.1\"\n    ],\n    \"id\": \"urn:sim3264\",\n    \"securityDefinitions\": {\n        \"nosec_sc\": {\n            \"scheme\": \"nosec\"\n        }\n    },\n    \"security\": [\n        \"nosec_sc\"\n    ],\n    \"@type\": [\n        \"Thing\"\n    ],\n    \"name\": \"sim-3264\",\n    \"base\": \"sim://simserver1:443\",\n    \"title\": \"Simulated Asset\",\n    \"properties\": {\n        \"VoltageL1-N\": {\n            \"type\": \"number\",\n            \"opcua:nodeId\": \"s=VoltageL-N\",\n            \"readOnly\": true,\n            \"observable\": true,\n            \"forms\": [\n                {\n                    \"href\": \"1\",\n                    \"op\": [\n                        \"readproperty\",\n                        \"observeproperty\"\n                    ],\n                    \"sim:type\": \"Double\",\n                    \"sim:pollingTime\": 120\n                }\n            ]\n        }\n    }\n}\n\"\"\";\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/DeterministicAlarms/DeterministicAlarmsTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using DeterministicAlarms;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class DeterministicAlarmsTests1<T>\n    {\n        public DeterministicAlarmsTests1(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task BrowseAreaPathVendingMachine1DoorOpenTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.BrowsePathAsync(_connection, new BrowsePathRequestModel\n            {\n                NodeId = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine1\",\n                BrowsePaths = new[] {\n                    new[]\n                    {\n                        Namespaces.DeterministicAlarmsInstance + \"#VendingMachine1_DoorOpen\"\n                    }\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            var target = Assert.Single(results.Targets!);\n            Assert.NotNull(target.BrowsePath);\n            Assert.NotNull(target.Target);\n            Assert.Equal(Namespaces.DeterministicAlarmsInstance + \"#i=1\", target.Target.NodeId);\n        }\n\n        public async Task BrowseAreaPathVendingMachine2DoorOpenTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.BrowsePathAsync(_connection, new BrowsePathRequestModel\n            {\n                NodeId = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine2\",\n                BrowsePaths = new[] {\n                    new[]\n                    {\n                        Namespaces.DeterministicAlarmsInstance + \"#VendingMachine2_DoorOpen\"\n                    }\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            var target = Assert.Single(results.Targets!);\n            Assert.NotNull(target.BrowsePath);\n            Assert.NotNull(target.Target);\n            Assert.Equal(Namespaces.DeterministicAlarmsInstance + \"#i=234\", target.Target.NodeId);\n        }\n\n        public async Task BrowseAreaPathVendingMachine1TemperatureHighTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.BrowsePathAsync(_connection, new BrowsePathRequestModel\n            {\n                NodeId = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine1\",\n                BrowsePaths = new[] {\n                    new[]\n                    {\n                        Namespaces.DeterministicAlarmsInstance + \"#VendingMachine1_TemperatureHigh\"\n                    }\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            var target = Assert.Single(results.Targets!);\n            Assert.NotNull(target.BrowsePath);\n            Assert.NotNull(target.Target);\n            Assert.Equal(Namespaces.DeterministicAlarmsInstance + \"#i=110\", target.Target.NodeId);\n        }\n\n        public async Task BrowseAreaPathVendingMachine2LightOffTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.BrowsePathAsync(_connection, new BrowsePathRequestModel\n            {\n                NodeId = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine2\",\n                BrowsePaths = new[] {\n                    new[]\n                    {\n                        Namespaces.DeterministicAlarmsInstance + \"#VendingMachine2_LightOff\"\n                    }\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            var target = Assert.Single(results.Targets!);\n            Assert.NotNull(target.BrowsePath);\n            Assert.NotNull(target.Target);\n            Assert.Equal(Namespaces.DeterministicAlarmsInstance + \"#i=343\", target.Target.NodeId);\n        }\n\n#if UNUSED\n        public async Task FiresEventSequenceTestWithEdgeFilteringAsync(CancellationToken ct = default)\n        {\n            // Subscribe to server events\n            using var provider = _subscription();\n            var services = _services();\n\n\n            var monitoredItem = await provider.AddMonitoredItemAsync(new MonitoredItemModel\n            {\n                NodeId = Opc.Ua.ObjectIds.Server.ToString(),\n                Attribute = NodeAttribute.EventNotifier,\n                Settings = new MonitoredItemSettingsModel\n                {\n                    QueueSize = 1000\n                }\n            }).ConfigureAwait(false);\n\n            const string machine1 = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine1\";\n            const string machine2 = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine2\";\n            const string doorOpen1 = Namespaces.DeterministicAlarmsInstance + \"#i=1\";\n            const string tempHigh1 = Namespaces.DeterministicAlarmsInstance + \"#i=110\";\n            const string doorOpen2 = Namespaces.DeterministicAlarmsInstance + \"#i=226\";\n            const string lightOff2 = Namespaces.DeterministicAlarmsInstance + \"#i=335\";\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, tempHigh1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n\n            var waitUntilStartInSeconds = TimeSpan.FromSeconds(9); // value in *.json file\n            _server.FireTimersWithPeriod(waitUntilStartInSeconds, 1);\n            var opcEvent1 = await provider.GetEventChangesAsDictionary(1, true, Filter)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent1[\"/EventId\"], Encoding.UTF8.GetBytes(\"V1_DoorOpen-1 (1)\"));\n            Assert.Equal(opcEvent1[\"/EventType\"], Opc.Ua.ObjectTypeIds.TripAlarmType.ToString());\n            Assert.Equal(opcEvent1[\"/SourceNode\"], machine1);\n            Assert.Equal(opcEvent1[\"/SourceName\"], \"VendingMachine1\");\n            Assert.Equal(opcEvent1[\"/Message\"].GetByPath(\"Text\"), \"Door Open\");\n            Assert.Equal(opcEvent1[\"/Severity\"], (int)Opc.Ua.EventSeverity.High);\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, tempHigh1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(5), 1);\n            var opcEvent2 = await provider.GetEventChangesAsDictionary(1, true, Filter)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent2[\"/EventId\"], Encoding.UTF8.GetBytes(\"V2_LightOff-1 (1)\"));\n            Assert.Equal(opcEvent2[\"/EventType\"], Opc.Ua.ObjectTypeIds.OffNormalAlarmType.ToString());\n            Assert.Equal(opcEvent2[\"/SourceNode\"], machine2);\n            Assert.Equal(opcEvent2[\"/SourceName\"], \"VendingMachine2\");\n            Assert.Equal(opcEvent2[\"/Message\"].GetByPath(\"Text\"), \"Light Off in machine\");\n            Assert.Equal(opcEvent2[\"/Severity\"], (int)Opc.Ua.EventSeverity.Medium);\n\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(7), 1);\n            var opcEvent3 = await provider.GetEventChangesAsDictionary(1, true, Filter)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent3[\"/EventId\"], Encoding.UTF8.GetBytes(\"V1_DoorOpen-2 (1)\"));\n            Assert.Equal(opcEvent3[\"/EventType\"], Opc.Ua.ObjectTypeIds.TripAlarmType.ToString());\n            Assert.Equal(opcEvent3[\"/SourceNode\"], machine1);\n            Assert.Equal(opcEvent3[\"/SourceName\"], \"VendingMachine1\");\n            Assert.Equal(opcEvent3[\"/Message\"].GetByPath(\"Text\"), \"Door Closed\");\n            Assert.Equal(opcEvent3[\"/Severity\"], (int)Opc.Ua.EventSeverity.Medium);\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Inactive\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(4), 1);\n            var opcEvent4 = await provider.GetEventChangesAsDictionary(1, true, Filter)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent4[\"/EventId\"], Encoding.UTF8.GetBytes(\"V1_TemperatureHigh-1 (1)\"));\n            Assert.Equal(opcEvent4[\"/EventType\"], Opc.Ua.ObjectTypeIds.LimitAlarmType.ToString());\n            Assert.Equal(opcEvent4[\"/SourceNode\"], machine1);\n            Assert.Equal(opcEvent4[\"/SourceName\"], \"VendingMachine1\");\n            Assert.Equal(opcEvent4[\"/Message\"].GetByPath(\"Text\"), \"Temperature is HIGH\");\n            Assert.Equal(opcEvent4[\"/Severity\"], (int)Opc.Ua.EventSeverity.High);\n\n            await services.NodeShouldHaveStatesAsync(_connection, tempHigh1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1);\n            var opcEvent5 = await provider.GetEventChangesAsDictionary(1, true, Filter)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent5[\"/EventId\"], Encoding.UTF8.GetBytes(\"V1_DoorOpen-1 (2)\"));\n            Assert.Equal(opcEvent5[\"/Message\"].GetByPath(\"Text\"), \"Door Open\");\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(5), 1);\n            var opcEvent6 = await provider.GetEventChangesAsDictionary(1, true, Filter)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent6[\"/EventId\"], Encoding.UTF8.GetBytes(\"V2_LightOff-1 (2)\"));\n            Assert.Equal(opcEvent6[\"/Message\"].GetByPath(\"Text\"), \"Light Off in machine\");\n\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            // At this point, the *runningForSeconds* limit in the JSON config causes execution to stop\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1);\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, tempHigh1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            static bool Filter(Dictionary<string, VariantValue> evt)\n            {\n                return ((string?)evt[\"/SourceNode\"])?.StartsWith(\n                    Namespaces.DeterministicAlarmsInstance, StringComparison.OrdinalIgnoreCase) == true;\n            }\n        }\n\n        public async Task FiresEventSequenceTestWithServerFilteringAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var result = await services.CompileQueryAsync(_connection, new QueryCompilationRequestModel\n            {\n                Query = $@\"\n                    PREFIX ns <{Namespaces.DeterministicAlarmsInstance}>\n                    SELECT * FROM BaseEventType\n                    WHERE\n                        /SourceNode IN (\n                            'ns:s=VendingMachine1'^^NodeId,\n                            'ns:s=VendingMachine2'^^NodeId\n                        )\n                \"\n            }).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Null(result.ErrorInfo);\n\n            // Subscribe to server events\n            using var provider = _subscription();\n\n            var monitoredItem = await provider.AddMonitoredItemAsync(new MonitoredItemModel\n            {\n                NodeId = Opc.Ua.ObjectIds.Server.ToString(),\n                Attribute = NodeAttribute.EventNotifier,\n                Settings = new MonitoredItemSettingsModel\n                {\n                    EventFilter = result.EventFilter\n                }\n            }).ConfigureAwait(false);\n\n            const string machine1 = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine1\";\n            const string machine2 = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine2\";\n            const string doorOpen1 = Namespaces.DeterministicAlarmsInstance + \"#i=1\";\n            const string tempHigh1 = Namespaces.DeterministicAlarmsInstance + \"#i=110\";\n            const string doorOpen2 = Namespaces.DeterministicAlarmsInstance + \"#i=226\";\n            const string lightOff2 = Namespaces.DeterministicAlarmsInstance + \"#i=335\";\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, tempHigh1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n\n            var waitUntilStartInSeconds = TimeSpan.FromSeconds(9); // value in *.json file\n            _server.FireTimersWithPeriod(waitUntilStartInSeconds, 1);\n            var opcEvent1 = await provider.GetEventChangesAsDictionary(1)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent1[\"/EventId\"], Encoding.UTF8.GetBytes(\"V1_DoorOpen-1 (1)\"));\n            Assert.Equal(opcEvent1[\"/EventType\"], Opc.Ua.ObjectTypeIds.TripAlarmType.ToString());\n            Assert.Equal(opcEvent1[\"/SourceNode\"], machine1);\n            Assert.Equal(opcEvent1[\"/SourceName\"], \"VendingMachine1\");\n            Assert.Equal(opcEvent1[\"/Message\"].GetByPath(\"Text\"), \"Door Open\");\n            Assert.Equal(opcEvent1[\"/Severity\"], (int)Opc.Ua.EventSeverity.High);\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, tempHigh1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(5), 1);\n            var opcEvent2 = await provider.GetEventChangesAsDictionary(1)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent2[\"/EventId\"], Encoding.UTF8.GetBytes(\"V2_LightOff-1 (1)\"));\n            Assert.Equal(opcEvent2[\"/EventType\"], Opc.Ua.ObjectTypeIds.OffNormalAlarmType.ToString());\n            Assert.Equal(opcEvent2[\"/SourceNode\"], machine2);\n            Assert.Equal(opcEvent2[\"/SourceName\"], \"VendingMachine2\");\n            Assert.Equal(opcEvent2[\"/Message\"].GetByPath(\"Text\"), \"Light Off in machine\");\n            Assert.Equal(opcEvent2[\"/Severity\"], (int)Opc.Ua.EventSeverity.Medium);\n\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(7), 1);\n            var opcEvent3 = await provider.GetEventChangesAsDictionary(1)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent3[\"/EventId\"], Encoding.UTF8.GetBytes(\"V1_DoorOpen-2 (1)\"));\n            Assert.Equal(opcEvent3[\"/EventType\"], Opc.Ua.ObjectTypeIds.TripAlarmType.ToString());\n            Assert.Equal(opcEvent3[\"/SourceNode\"], machine1);\n            Assert.Equal(opcEvent3[\"/SourceName\"], \"VendingMachine1\");\n            Assert.Equal(opcEvent3[\"/Message\"].GetByPath(\"Text\"), \"Door Closed\");\n            Assert.Equal(opcEvent3[\"/Severity\"], (int)Opc.Ua.EventSeverity.Medium);\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Inactive\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(4), 1);\n            var opcEvent4 = await provider.GetEventChangesAsDictionary(1)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent4[\"/EventId\"], Encoding.UTF8.GetBytes(\"V1_TemperatureHigh-1 (1)\"));\n            Assert.Equal(opcEvent4[\"/EventType\"], Opc.Ua.ObjectTypeIds.LimitAlarmType.ToString());\n            Assert.Equal(opcEvent4[\"/SourceNode\"], machine1);\n            Assert.Equal(opcEvent4[\"/SourceName\"], \"VendingMachine1\");\n            Assert.Equal(opcEvent4[\"/Message\"].GetByPath(\"Text\"), \"Temperature is HIGH\");\n            Assert.Equal(opcEvent4[\"/Severity\"], (int)Opc.Ua.EventSeverity.High);\n\n            await services.NodeShouldHaveStatesAsync(_connection, tempHigh1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1);\n            var opcEvent5 = await provider.GetEventChangesAsDictionary(1)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent5[\"/EventId\"], Encoding.UTF8.GetBytes(\"V1_DoorOpen-1 (2)\"));\n            Assert.Equal(opcEvent5[\"/Message\"].GetByPath(\"Text\"), \"Door Open\");\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(5), 1);\n            var opcEvent6 = await provider.GetEventChangesAsDictionary(1)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            Assert.Equal(opcEvent6[\"/EventId\"], Encoding.UTF8.GetBytes(\"V2_LightOff-1 (2)\"));\n            Assert.Equal(opcEvent6[\"/Message\"].GetByPath(\"Text\"), \"Light Off in machine\");\n\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            // At this point, the *runningForSeconds* limit in the JSON config causes execution to stop\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1);\n\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, tempHigh1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, doorOpen2,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n            await services.NodeShouldHaveStatesAsync(_connection, lightOff2,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n        }\n        private readonly DeterministicAlarmsServer1 _server;\n#endif\n\n        private readonly Func<INodeServices<T>> _services;\n        private readonly T _connection;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/DeterministicAlarms/DeterministicAlarmsTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using DeterministicAlarms;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class DeterministicAlarmsTests2<T>\n    {\n        public DeterministicAlarmsTests2(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task BrowseAreaPathVendingMachine1DoorOpenTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            var results = await services.BrowsePathAsync(_connection, new BrowsePathRequestModel\n            {\n                NodeId = Namespaces.DeterministicAlarmsInstance + \"#s=VendingMachine1\",\n                BrowsePaths = new[] {\n                    new[]\n                    {\n                        Namespaces.DeterministicAlarmsInstance + \"#VendingMachine1_DoorOpen\"\n                    }\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            var target = Assert.Single(results.Targets!);\n            Assert.NotNull(target.BrowsePath);\n            Assert.NotNull(target.Target);\n            Assert.Equal(Namespaces.DeterministicAlarmsInstance + \"#i=1\", target.Target.NodeId);\n        }\n\n#if UNUSED\n        public async Task VerifyThatTimeForEventsChangesEdgeFilteredAsync(CancellationToken ct = default)\n        {\n            // Subscribe to server events\n            using var provider = _subscription();\n            var services = _services();\n            var connection = await _connection().ConfigureAwait(false);\n\n            var monitoredItem = await provider.AddMonitoredItemAsync(new MonitoredItemModel\n            {\n                NodeId = Opc.Ua.ObjectIds.Server.ToString(),\n                Attribute = NodeAttribute.EventNotifier,\n                Settings = new MonitoredItemSettingsModel\n                {\n                    QueueSize = 1000\n                }\n            }).ConfigureAwait(false);\n\n            const string doorOpen1 = Namespaces.DeterministicAlarmsInstance + \"#i=1\";\n\n            await services.NodeShouldHaveStatesAsync(connection, doorOpen1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n\n            var waitUntilStartInSeconds = TimeSpan.FromSeconds(5); // value in config\n            _server.FireTimersWithPeriod(waitUntilStartInSeconds, 1);\n            var opcEvent1 = await provider.GetEventChangesAsDictionary(1, true, Filter)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            var timeForFirstEvent = (DateTime)opcEvent1[\"/Time\"];\n\n            await services.NodeShouldHaveStatesAsync(connection, doorOpen1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(waitUntilStartInSeconds, 1);\n            var opcEvent2 = await provider.GetEventChangesAsDictionary(1, true, Filter)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            var timeForNextEvent = (DateTime)opcEvent2[\"/Time\"];\n\n            await services.NodeShouldHaveStatesAsync(connection, doorOpen1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n\n            Assert.NotEqual(timeForFirstEvent, timeForNextEvent);\n\n            static bool Filter(Dictionary<string, VariantValue> evt)\n            {\n                return ((string?)evt[\"/SourceNode\"])?.StartsWith(\n                    Namespaces.DeterministicAlarmsInstance, StringComparison.OrdinalIgnoreCase) == true;\n            }\n        }\n\n        public async Task VerifyThatTimeForEventsChangesServerFilteredAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var result = await services.CompileQueryAsync(connection, new QueryCompilationRequestModel\n            {\n                Query = $@\"\n                    PREFIX ns <{Namespaces.DeterministicAlarmsInstance}>\n                    SELECT * FROM BaseEventType\n                    WHERE\n                        /SourceNode IN (\n                            'ns:s=VendingMachine1'^^NodeId,\n                            'ns:s=VendingMachine2'^^NodeId\n                        )\n                \"\n            }).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Null(result.ErrorInfo);\n\n            // Subscribe to server events\n            using var provider = _subscription();\n\n            var monitoredItem = await provider.AddMonitoredItemAsync(new MonitoredItemModel\n            {\n                NodeId = Opc.Ua.ObjectIds.Server.ToString(),\n                Attribute = NodeAttribute.EventNotifier,\n                Settings = new MonitoredItemSettingsModel\n                {\n                    EventFilter = result.EventFilter\n                }\n            }).ConfigureAwait(false);\n\n            const string doorOpen1 = Namespaces.DeterministicAlarmsInstance + \"#i=1\";\n\n            await services.NodeShouldHaveStatesAsync(connection, doorOpen1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n\n            var waitUntilStartInSeconds = TimeSpan.FromSeconds(5); // value in config\n            _server.FireTimersWithPeriod(waitUntilStartInSeconds, 1);\n            var opcEvent1 = await provider.GetEventChangesAsDictionary(1)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            var timeForFirstEvent = (DateTime)opcEvent1[\"/Time\"];\n\n            await services.NodeShouldHaveStatesAsync(connection, doorOpen1,\n                \"Active\", \"Enabled\").ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1), 1); // advance to next step\n\n            _server.FireTimersWithPeriod(waitUntilStartInSeconds, 1);\n            var opcEvent2 = await provider.GetEventChangesAsDictionary(1)\n                .FirstAsync(CancellationToken ct = default).ConfigureAwait(false);\n            var timeForNextEvent = (DateTime)opcEvent2[\"/Time\"];\n\n            await services.NodeShouldHaveStatesAsync(connection, doorOpen1,\n                \"Inactive\", \"Disabled\").ConfigureAwait(false);\n\n            Assert.NotEqual(timeForFirstEvent, timeForNextEvent);\n        }\n        private readonly DeterministicAlarmsServer2 _server;\n#endif\n        private readonly Func<INodeServices<T>> _services;\n        private readonly T _connection;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/DeterministicAlarms/Extensions/Extensions.cs",
    "content": "﻿// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace DeterministicAlarms.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using FluentAssertions;\n    using System.Threading.Tasks;\n\n    internal static class Extensions\n    {\n        public static async Task NodeShouldHaveStatesAsync<T>(this INodeServices<T> server,\n            T connectionId, string node, string activeState, string enabledState)\n        {\n            await server.NodeShouldHaveStateAsync(connectionId, node, \"ActiveState\",\n                activeState).ConfigureAwait(false);\n            await server.NodeShouldHaveStateAsync(connectionId, node, \"EnabledState\",\n                enabledState).ConfigureAwait(false);\n        }\n\n        private static async Task NodeShouldHaveStateAsync<T>(this INodeServices<T> server,\n            T connectionId, string node, string state, string expectedValue)\n        {\n            var value = await server.ValueReadAsync(connectionId, new ValueReadRequestModel\n            {\n                NodeId = node,\n                BrowsePath = new[] { \".\" + state }\n            }).ConfigureAwait(false);\n\n            var text = value?.Value?[\"Text\"];\n            text.Should().NotBeNull().And.Be(expectedValue,\n                \"{0} should be {1}\", state, expectedValue);\n            var loc = value?.Value?[\"Locale\"];\n            loc.Should().NotBeNull().And.Be(\"en-US\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/FileSystem/BrowseTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class BrowseTests<T>\n    {\n        /// <summary>\n        /// Create metadata tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tempPath\"></param>\n        public BrowseTests(Func<IFileSystemServices<T>> services, T connection, string tempPath)\n        {\n            _services = services;\n            _connection = connection;\n            _tempPath = tempPath;\n        }\n\n        public async Task GetFileSystemsTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var drives = DriveInfo.GetDrives().Select(d => d.Name).ToHashSet();\n            await foreach (var fs in services.GetFileSystemsAsync(_connection, ct).ConfigureAwait(false))\n            {\n                Assert.Null(fs.ErrorInfo);\n                Assert.NotNull(fs.Result);\n                Assert.NotNull(fs.Result.Name);\n                Assert.True(drives.Remove(fs.Result.Name),\n                    $\"{fs.Result.Name} not found in {string.Join('\\n', drives)}\");\n            }\n            Assert.Empty(drives);\n        }\n\n        public async Task GetDirectoriesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var directories = await services.GetDirectoriesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n            Assert.Null(directories.ErrorInfo);\n            Assert.NotNull(directories.Result);\n            Assert.Empty(directories.Result);\n        }\n\n        public async Task GetDirectoriesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var path2 = Path.Combine(path, Path.GetRandomFileName());\n            Directory.CreateDirectory(path2);\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var directories = await services.GetDirectoriesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(directories.ErrorInfo);\n            Assert.NotNull(directories.Result);\n            var item = Assert.Single(directories.Result);\n            Assert.NotNull(item);\n            Assert.Equal(Path.GetFileName(path2), item.Name);\n        }\n\n        public async Task GetDirectoriesTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            for (var i = 0; i < 10; i++)\n            {\n                var path2 = Path.Combine(path, i.ToString(CultureInfo.InvariantCulture));\n                Directory.CreateDirectory(path2);\n            }\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var directories = await services.GetDirectoriesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(directories.ErrorInfo);\n            Assert.NotNull(directories.Result);\n            var result = directories.Result.ToList();\n            Assert.Equal(10, result.Count);\n            Assert.All(result, item => Assert.NotNull(item.Name));\n            Assert.All(result.Select(r => r.Name).Order(),\n                (item, i) => Assert.Equal(i.ToString(CultureInfo.InvariantCulture), item));\n        }\n\n        public async Task GetDirectoriesTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            for (var i = 0; i < 10; i++)\n            {\n                CreateFile(path, i.ToString(CultureInfo.InvariantCulture), 1024);\n            }\n\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n\n            var directories = await services.GetDirectoriesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(directories.ErrorInfo);\n            Assert.NotNull(directories.Result);\n            Assert.Empty(directories.Result);\n        }\n\n        public async Task GetDirectoriesTest5Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n\n            var directories = await services.GetDirectoriesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(directories.ErrorInfo);\n            Assert.NotNull(directories.Result);\n            Assert.Empty(directories.Result);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, directories.ErrorInfo.StatusCode);\n        }\n\n        public async Task GetDirectoriesTest6Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n            var p3 = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2, p3);\n            Directory.CreateDirectory(path);\n            var path2 = Path.Combine(path, Path.GetRandomFileName());\n            Directory.CreateDirectory(path2);\n\n            var directories = await services.GetDirectoriesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = $\"nsu=FileSystem;s=1:{root}\",\n                BrowsePath = new List<string>\n                {\n                    $\"nsu=FileSystem;{p1}\",\n                    $\"nsu=FileSystem;{p2}\",\n                    $\"nsu=FileSystem;{p3}\"\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(directories.ErrorInfo);\n            Assert.NotNull(directories.Result);\n            var item = Assert.Single(directories.Result);\n            Assert.NotNull(item);\n            Assert.Equal(Path.GetFileName(path2), item.Name);\n        }\n\n        public async Task GetFilesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            for (var i = 10; i < 20; i++)\n            {\n                var path2 = Path.Combine(path, i.ToString(CultureInfo.InvariantCulture));\n                Directory.CreateDirectory(path2);\n            }\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            Assert.Empty(files.Result);\n        }\n\n        public async Task GetFilesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n\n            for (var i = 0; i < 10; i++)\n            {\n                CreateFile(path, i.ToString(CultureInfo.InvariantCulture), 1024);\n            }\n\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            var result = files.Result.ToList();\n            Assert.Equal(10, result.Count);\n            Assert.All(result, item => Assert.NotNull(item.Name));\n            Assert.All(result.Select(r => r.Name).Order(),\n                (item, i) => Assert.Equal(i.ToString(CultureInfo.InvariantCulture), item));\n        }\n\n        public async Task GetFilesTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            for (var i = 0; i < 10; i++)\n            {\n                CreateFile(path, i.ToString(CultureInfo.InvariantCulture), 1024);\n            }\n            for (var i = 10; i < 20; i++)\n            {\n                var path2 = Path.Combine(path, i.ToString(CultureInfo.InvariantCulture));\n                Directory.CreateDirectory(path2);\n            }\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            var result = files.Result.ToList();\n            Assert.Equal(10, result.Count);\n            Assert.All(result, item => Assert.NotNull(item.Name));\n            Assert.All(result.Select(r => r.Name).Order(),\n                (item, i) => Assert.Equal(i.ToString(CultureInfo.InvariantCulture), item));\n        }\n\n        public async Task GetFilesTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            for (var i = 0; i < 5; i++)\n            {\n                CreateFile(path, i.ToString(CultureInfo.InvariantCulture), 1024);\n            }\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n\n            var files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            var result = files.Result.ToList();\n            Assert.Equal(5, result.Count);\n            Assert.All(result, item => Assert.NotNull(item.Name));\n            Assert.All(result.Select(r => r.Name).Order(),\n                (item, i) => Assert.Equal(i.ToString(CultureInfo.InvariantCulture), item));\n\n            for (var i = 5; i < 10; i++)\n            {\n                CreateFile(path, i.ToString(CultureInfo.InvariantCulture), 1024);\n            }\n\n            files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            result = files.Result.ToList();\n            Assert.Equal(10, result.Count);\n            Assert.All(result, item => Assert.NotNull(item.Name));\n            Assert.All(result.Select(r => r.Name).Order(),\n                (item, i) => Assert.Equal(i.ToString(CultureInfo.InvariantCulture), item));\n\n            for (var i = 0; i < 6; i++)\n            {\n                var path2 = Path.Combine(path, i.ToString(CultureInfo.InvariantCulture));\n                File.Delete(path2);\n            }\n\n            files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            result = files.Result.ToList();\n            Assert.Equal(4, result.Count);\n            Assert.All(result, item => Assert.NotNull(item.Name));\n            Assert.All(result.Select(r => r.Name).Order(),\n                (item, i) => Assert.Equal((i + 6).ToString(CultureInfo.InvariantCulture), item));\n\n            foreach (var file in Directory.GetFiles(path))\n            {\n                File.Delete(file);\n            }\n            files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            Assert.Empty(files.Result);\n        }\n\n        public async Task GetFilesTest5Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n\n            var files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(files.Result);\n            Assert.Empty(files.Result);\n            Assert.NotNull(files.ErrorInfo);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, files.ErrorInfo.StatusCode);\n        }\n\n        public async Task GetFilesTest6Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n            var p3 = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2, p3);\n            Directory.CreateDirectory(path);\n            CreateFile(path, \"test\", 1000);\n            var files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = $\"nsu=FileSystem;s=1:{root}\",\n                BrowsePath = new List<string> { $\"nsu=FileSystem;{p1}\", $\"nsu=FileSystem;{p2}\", $\"nsu=FileSystem;{p3}\" }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            var item = Assert.Single(files.Result);\n            Assert.Equal(\"test\", item.Name);\n        }\n\n        private static string CreateFile(string path, string name, long length)\n        {\n            var fullPath = Path.Combine(path, name);\n            using var f = File.Create(fullPath);\n            var buffer = new byte[length];\n            for (var i = 0; i < buffer.Length; i++)\n            {\n                buffer[i] = (byte)i;\n            }\n            f.Write(buffer);\n            return fullPath;\n        }\n\n        private readonly T _connection;\n        private readonly string _tempPath;\n        private readonly Func<IFileSystemServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/FileSystem/OperationsTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class OperationsTests<T>\n    {\n        /// <summary>\n        /// Create tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tempPath\"></param>\n        public OperationsTests(Func<IFileSystemServices<T>> services, T connection, string tempPath)\n        {\n            _services = services;\n            _connection = connection;\n            _tempPath = tempPath;\n        }\n\n        public async Task CreateDirectoryTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var directory = await services.CreateDirectoryAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, \"testdirectory\", ct).ConfigureAwait(false);\n\n            Assert.Null(directory.ErrorInfo);\n            Assert.True(Directory.Exists(Path.Combine(path, \"testdirectory\")));\n\n            var directories = await services.GetDirectoriesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(directories.ErrorInfo);\n            Assert.NotNull(directories.Result);\n            var item = Assert.Single(directories.Result);\n            Assert.Equal(item, directory.Result);\n        }\n\n        public async Task CreateDirectoryTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            Directory.CreateDirectory(Path.Combine(path, \"testdirectory\"));\n\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var directory = await services.CreateDirectoryAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, \"testdirectory\", ct).ConfigureAwait(false);\n\n            Assert.NotNull(directory.ErrorInfo);\n            Assert.Equal(Opc.Ua.StatusCodes.BadBrowseNameDuplicated, directory.ErrorInfo.StatusCode);\n        }\n\n        public async Task CreateDirectoryTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n            var p3 = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2, p3);\n            Directory.CreateDirectory(path);\n            Assert.Empty(Directory.GetDirectories(path));\n\n            var directory = await services.CreateDirectoryAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = $\"nsu=FileSystem;s=1:{root}\",\n                BrowsePath = new List<string> { $\"nsu=FileSystem;{p1}\", $\"nsu=FileSystem;{p2}\", $\"nsu=FileSystem;{p3}\" }\n            }, \"testdir\", ct).ConfigureAwait(false);\n\n            Assert.Null(directory.ErrorInfo);\n            Assert.NotEmpty(Directory.GetDirectories(path));\n            Assert.True(Directory.Exists(Path.Combine(path, \"testdir\")));\n        }\n\n        public async Task CreateDirectoryTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n            var p3 = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2, p3);\n            Directory.CreateDirectory(path);\n            Assert.Empty(Directory.GetDirectories(path));\n\n            var directory = await services.CreateDirectoryAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = $\"nsu=FileSystem;s=1:{root}\",\n                BrowsePath = new List<string> { $\"nsu=FileSystem;{p1}\", $\"nsu=FileSystem;{p2}\", \"nsu=FileSystem;Bad\" }\n            }, \"testdir\", ct).ConfigureAwait(false);\n\n            Assert.NotNull(directory.ErrorInfo);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNotFound, directory.ErrorInfo.StatusCode);\n            Assert.Empty(Directory.GetDirectories(path));\n        }\n\n        public async Task DeleteDirectoryTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var path2 = Path.Combine(path, \"testDirectory\");\n            Directory.CreateDirectory(Path.Combine(path, \"testDirectory\"));\n\n            var parentDirectoryId = $\"nsu=FileSystem;s=1:{path}\";\n\n            Assert.NotEmpty(Directory.GetDirectories(path));\n\n            var nodeToDelete = $\"nsu=FileSystem;s=1:{path2}\";\n            var result = await services.DeleteFileSystemObjectAsync(_connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = nodeToDelete\n                },\n                new FileSystemObjectModel\n                {\n                    NodeId = parentDirectoryId\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Equal(0u, result.StatusCode);\n            Assert.Empty(Directory.GetDirectories(path));\n        }\n\n        public async Task DeleteDirectoryTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var path2 = Path.Combine(path, \"testDirectory\");\n            Directory.CreateDirectory(Path.Combine(path, \"testDirectory\"));\n\n            Assert.NotEmpty(Directory.GetDirectories(path));\n\n            var nodeToDelete = $\"nsu=FileSystem;s=1:{path2}\";\n            var result = await services.DeleteFileSystemObjectAsync(_connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = nodeToDelete\n                }, ct: ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Equal(0u, result.StatusCode);\n            Assert.Empty(Directory.GetDirectories(path));\n        }\n\n        public async Task DeleteDirectoryTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var parentDirectoryId = $\"nsu=FileSystem;s=1:{path}\";\n\n            var fileToDeleteId = $\"nsu=FileSystem;s=1:{Path.Combine(path, \"wrong\")}\";\n            var result = await services.DeleteFileSystemObjectAsync(_connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = fileToDeleteId\n                },\n                new FileSystemObjectModel\n                {\n                    NodeId = parentDirectoryId\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNotFound, result.StatusCode);\n        }\n\n        public async Task CreateFileTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var file = await services.CreateFileAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, \"testfile\", ct).ConfigureAwait(false);\n\n            Assert.Null(file.ErrorInfo);\n            Assert.True(File.Exists(Path.Combine(path, \"testfile\")));\n\n            var files = await services.GetFilesAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(files.ErrorInfo);\n            Assert.NotNull(files.Result);\n            var item = Assert.Single(files.Result);\n            Assert.Equal(item, file.Result);\n        }\n\n        public async Task CreateFileTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var directoryNodeId = $\"nsu=FileSystem;s=1:{path}\";\n            var file = await services.CreateFileAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, \"testfile\", ct).ConfigureAwait(false);\n\n            Assert.Null(file.ErrorInfo);\n            Assert.True(File.Exists(Path.Combine(path, \"testfile\")));\n\n            var file2 = await services.CreateFileAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = directoryNodeId\n            }, \"testfile\", ct).ConfigureAwait(false);\n\n            Assert.Null(file2.Result);\n            Assert.NotNull(file2.ErrorInfo);\n            Assert.Equal(Opc.Ua.StatusCodes.BadBrowseNameDuplicated, file2.ErrorInfo.StatusCode);\n        }\n\n        public async Task CreateFileTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2);\n            Directory.CreateDirectory(path);\n\n            Assert.Empty(Directory.GetFiles(path));\n\n            var file = await services.CreateFileAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = $\"nsu=FileSystem;s=1:{root}\",\n                BrowsePath = new List<string> { $\"nsu=FileSystem;{p1}\", $\"nsu=FileSystem;{p2}\" }\n            }, \"testfile\", ct).ConfigureAwait(false);\n\n            Assert.Null(file.ErrorInfo);\n            Assert.True(File.Exists(Path.Combine(path, \"testfile\")));\n        }\n\n        public async Task CreateFileTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2);\n            Directory.CreateDirectory(path);\n\n            Assert.Empty(Directory.GetFiles(path));\n\n            var file = await services.CreateFileAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = $\"nsu=FileSystem;s=1:{root}\",\n                BrowsePath = new List<string> { $\"nsu=FileSystem;{p1}\", \"nsu=FileSystem;Bad\" }\n            }, \"testfile\", ct).ConfigureAwait(false);\n\n            Assert.NotNull(file.ErrorInfo);\n        }\n\n        public async Task GetFileInfoTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var path2 = CreateFile(path, \"testfile\", 1024);\n            var fileNodeId = $\"nsu=FileSystem;s=2:{path2}\";\n            var fileInfo = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(fileInfo.ErrorInfo);\n            Assert.NotNull(fileInfo.Result);\n            Assert.Equal(1024, fileInfo.Result.Size);\n            Assert.True(fileInfo.Result.Writable);\n            Assert.Equal(0, fileInfo.Result.OpenCount);\n        }\n\n        public async Task GetFileInfoTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var fileNodeId = $\"nsu=FileSystem;s=2:{Path.Combine(path, \"bad\")}\";\n            var fileInfo = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(fileInfo.ErrorInfo);\n            Assert.Null(fileInfo.Result);\n        }\n\n        public async Task GetFileInfoTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n            var f = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2);\n            Directory.CreateDirectory(path);\n            CreateFile(path, f, 100);\n            var fileInfo = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = $\"nsu=FileSystem;s=1:{Path.Combine(root, p1)}\",\n                BrowsePath = new List<string> { $\"nsu=FileSystem;{p2}\", $\"nsu=FileSystem;{f}\" }\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(fileInfo.ErrorInfo);\n            Assert.NotNull(fileInfo.Result);\n            Assert.Equal(100, fileInfo.Result.Size);\n            Assert.True(fileInfo.Result.Writable);\n            Assert.Equal(0, fileInfo.Result.OpenCount);\n        }\n\n        public async Task DeleteFileTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var path2 = CreateFile(path, \"testfile\", 1024);\n            var fileToDeleteId = $\"nsu=FileSystem;s=2:{path2}\";\n\n            Assert.NotEmpty(Directory.GetFiles(path));\n\n            var result = await services.DeleteFileSystemObjectAsync(_connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = fileToDeleteId\n                }, ct: ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Equal(0u, result.StatusCode);\n            Assert.Empty(Directory.GetFiles(path));\n        }\n\n        public async Task DeleteFileTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var path2 = CreateFile(path, \"testfile\", 1024);\n\n            Assert.NotEmpty(Directory.GetFiles(path));\n\n            var parentDirectoryId = $\"nsu=FileSystem;s=1:{path}\";\n\n            var fileToDeleteId = $\"nsu=FileSystem;s=2:{path2}\";\n            var result = await services.DeleteFileSystemObjectAsync(_connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = fileToDeleteId\n                },\n                new FileSystemObjectModel\n                {\n                    NodeId = parentDirectoryId\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Equal(0u, result.StatusCode);\n            Assert.Empty(Directory.GetFiles(path));\n        }\n\n        public async Task DeleteFileTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n\n            var parentDirectoryId = $\"nsu=FileSystem;s=1:{path}\";\n\n            var fileToDeleteId = $\"nsu=FileSystem;s=2:{Path.Combine(path, \"wrong\")}\";\n            var result = await services.DeleteFileSystemObjectAsync(_connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = fileToDeleteId\n                },\n                new FileSystemObjectModel\n                {\n                    NodeId = parentDirectoryId\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNotFound, result.StatusCode);\n        }\n\n        public async Task DeleteFileTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n            var f = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2);\n            Directory.CreateDirectory(path);\n            CreateFile(path, f, 100);\n\n            Assert.NotEmpty(Directory.GetFiles(path));\n\n            var result = await services.DeleteFileSystemObjectAsync(_connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = $\"nsu=FileSystem;s=1:{Path.Combine(root, p1)}\",\n                    BrowsePath = new List<string> { $\"nsu=FileSystem;{p2}\", $\"nsu=FileSystem;{f}\" }\n                }, ct: ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Equal(0u, result.StatusCode);\n            Assert.Empty(Directory.GetFiles(path));\n        }\n\n        public async Task DeleteFileTest5Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var root = _tempPath;\n            var p1 = Path.GetRandomFileName();\n            var p2 = Path.GetRandomFileName();\n            var f = Path.GetRandomFileName();\n\n            var path = Path.Combine(root, p1, p2);\n            Directory.CreateDirectory(path);\n            CreateFile(path, f, 100);\n            Assert.NotEmpty(Directory.GetFiles(path));\n\n            var result = await services.DeleteFileSystemObjectAsync(_connection,\n                new FileSystemObjectModel\n                {\n                    NodeId = $\"nsu=FileSystem;s=1:{Path.Combine(root, p1)}\",\n                    BrowsePath = new List<string> { $\"nsu=FileSystem;{p2}\", \"nsu=FileSystem;Notexisting\" }\n                }, ct: ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNotFound, result.StatusCode);\n        }\n\n        private static string CreateFile(string path, string name, long length)\n        {\n            var fullPath = Path.Combine(path, name);\n            using var f = File.Create(fullPath);\n            var buffer = new byte[length];\n            for (var i = 0; i < buffer.Length; i++)\n            {\n                buffer[i] = (byte)i;\n            }\n            f.Write(buffer);\n            return fullPath;\n        }\n\n        private readonly T _connection;\n        private readonly string _tempPath;\n        private readonly Func<IFileSystemServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/FileSystem/ReadTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.IO;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class ReadTests<T>\n    {\n        /// <summary>\n        /// Create tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tempPath\"></param>\n        public ReadTests(Func<IFileSystemServices<T>> services, T connection, string tempPath)\n        {\n            _services = services;\n            _connection = connection;\n            _tempPath = tempPath;\n        }\n\n        public async Task ReadFileTest0Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 1 * 1024 * 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var stream = await services.OpenReadAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using var _ = stream.Result.ConfigureAwait(false);\n            var buffer = new byte[256 * 1024];\n            await stream.Result.ReadExactlyAsync(buffer, ct).ConfigureAwait(false);\n            for (var i = 0; i < buffer.Length; i++)\n            {\n                Assert.Equal((byte)i, buffer[i]);\n            }\n\n            await stream.Result.ReadExactlyAsync(buffer, ct).ConfigureAwait(false);\n        }\n\n        public async Task ReadFileTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var stream = await services.OpenReadAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(1024, fi.Result.Size);\n                Assert.Equal(1, fi.Result.OpenCount);\n                Assert.False(fi.Result.Writable);\n\n                var buffer = new byte[1024];\n                var read = await stream.Result.ReadAsync(buffer, ct).ConfigureAwait(false);\n                Assert.Equal(read, buffer.Length);\n                for (var i = 0; i < buffer.Length; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n\n                read = await stream.Result.ReadAsync(buffer, ct).ConfigureAwait(false);\n                Assert.Equal(0, read);\n            }\n            {\n                // Now check it is closed\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(0, fi.Result.OpenCount);\n                Assert.True(fi.Result.Writable);\n            }\n        }\n\n        public async Task ReadFileTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 1 * 1024 * 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var stream = await services.OpenReadAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(1 * 1024 * 1024, fi.Result.Size);\n                Assert.Equal(1, fi.Result.OpenCount);\n                Assert.False(fi.Result.Writable);\n\n                var buffer = new byte[256 * 1024];\n                var read = await stream.Result.ReadAsync(buffer, ct).ConfigureAwait(false);\n                Assert.Equal(read, buffer.Length);\n                for (var i = 0; i < buffer.Length; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n\n                read = await stream.Result.ReadAsync(buffer, ct).ConfigureAwait(false);\n                Assert.Equal(buffer.Length, read);\n            }\n            {\n                // Now check it is closed\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(0, fi.Result.OpenCount);\n                Assert.True(fi.Result.Writable);\n            }\n        }\n\n        public async Task ReadFileTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var stream = await services.OpenReadAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(1024, fi.Result.Size);\n                Assert.Equal(1, fi.Result.OpenCount);\n                Assert.False(fi.Result.Writable);\n\n                var buffer = new byte[2 * 1024];\n                var read = await stream.Result.ReadAsync(buffer, ct).ConfigureAwait(false);\n                Assert.Equal(1024, read);\n                for (var i = 0; i < read; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n\n                read = await stream.Result.ReadAsync(buffer, ct).ConfigureAwait(false);\n                Assert.Equal(0, read);\n            }\n            {\n                // Now check it is closed\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(0, fi.Result.OpenCount);\n                Assert.True(fi.Result.Writable);\n            }\n        }\n\n        public async Task ReadFileTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var stream1 = await services.OpenReadAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n            Assert.Null(stream1.ErrorInfo);\n            Assert.NotNull(stream1.Result);\n            await using var __ = stream1.Result.ConfigureAwait(false);\n            var stream = await services.OpenReadAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(1024, fi.Result.Size);\n                Assert.Equal(2, fi.Result.OpenCount);\n                Assert.False(fi.Result.Writable);\n\n                var buffer = new byte[2 * 1024];\n                var read = await stream.Result.ReadAsync(buffer, ct).ConfigureAwait(false);\n                Assert.Equal(1024, read);\n                for (var i = 0; i < read; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n\n                read = await stream.Result.ReadAsync(buffer, ct).ConfigureAwait(false);\n                Assert.Equal(0, read);\n            }\n            {\n                // Now check it is closed\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(1, fi.Result.OpenCount);\n                Assert.False(fi.Result.Writable);\n            }\n        }\n\n        private static string CreateFile(string path, string name, long length)\n        {\n            var fullPath = Path.Combine(path, name);\n            using var f = File.Create(fullPath);\n            var buffer = new byte[length];\n            for (var i = 0; i < buffer.Length; i++)\n            {\n                buffer[i] = (byte)i;\n            }\n            f.Write(buffer);\n            return fullPath;\n        }\n\n        private readonly T _connection;\n        private readonly string _tempPath;\n        private readonly Func<IFileSystemServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/FileSystem/WriteTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.IO;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class WriteTests<T>\n    {\n        /// <summary>\n        /// Create tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tempPath\"></param>\n        public WriteTests(Func<IFileSystemServices<T>> services, T connection, string tempPath)\n        {\n            _services = services;\n            _connection = connection;\n            _tempPath = tempPath;\n        }\n\n        public async Task WriteFileTest0Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 8 * 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var stream = await services.OpenWriteAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct: ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                // Now write file\n                var buffer = Enumerable.Range(0, 1024).Select(b => (byte)b).ToArray();\n                await stream.Result.WriteAsync(buffer, ct).ConfigureAwait(false);\n            }\n            {\n                var buffer = await File.ReadAllBytesAsync(file, ct).ConfigureAwait(false);\n                Assert.Equal(1024, buffer.Length);\n                for (var i = 0; i < buffer.Length; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n            }\n        }\n\n        public async Task WriteFileTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 8 * 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(fi.Result);\n            Assert.Equal(8 * 1024, fi.Result.Size);\n            Assert.Equal(0, fi.Result.OpenCount);\n\n            var stream = await services.OpenWriteAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct: ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(0, fi.Result.Size);\n                Assert.Equal(1, fi.Result.OpenCount);\n\n                // Now write file\n                var buffer = Enumerable.Range(0, 1024).Select(b => (byte)b).ToArray();\n                await stream.Result.WriteAsync(buffer, ct).ConfigureAwait(false);\n            }\n            {\n                // Now check it is closed\n                fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(0, fi.Result.OpenCount);\n                Assert.True(fi.Result.Writable);\n                Assert.Equal(1024, fi.Result.Size);\n\n                var buffer = await File.ReadAllBytesAsync(file, ct).ConfigureAwait(false);\n                Assert.Equal(1024, buffer.Length);\n                for (var i = 0; i < buffer.Length; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n            }\n        }\n\n        public async Task WriteFileTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 2 * 1024 * 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(fi.Result);\n            Assert.Equal(2 * 1024 * 1024, fi.Result.Size);\n            Assert.Equal(0, fi.Result.OpenCount);\n\n            var stream = await services.OpenWriteAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, new FileOpenWriteOptionsModel { Mode = FileWriteMode.Write }, ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(2 * 1024 * 1024, fi.Result.Size);\n                Assert.Equal(1, fi.Result.OpenCount);\n\n                // Now write first half of file\n                var buffer = new byte[1 * 1024 * 1024];\n                await stream.Result.WriteAsync(buffer, ct).ConfigureAwait(false);\n            }\n            {\n                // Now check it is closed\n                fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(0, fi.Result.OpenCount);\n                Assert.True(fi.Result.Writable);\n                Assert.Equal(2 * 1024 * 1024, fi.Result.Size);\n\n                var buffer = await File.ReadAllBytesAsync(file, ct).ConfigureAwait(false);\n                Assert.Equal(2 * 1024 * 1024, buffer.Length);\n                for (var i = 0; i < buffer.Length / 2; i++)\n                {\n                    Assert.Equal(0, buffer[i]);\n                }\n                for (var i = buffer.Length / 2; i < buffer.Length; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n            }\n        }\n\n        public async Task AppendFileTest0Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 8 * 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var stream = await services.OpenWriteAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, new FileOpenWriteOptionsModel { Mode = FileWriteMode.Append }, ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                // Now write file\n                var buffer = Enumerable.Range(8 * 1024, 2 * 1024).Select(b => (byte)b).ToArray();\n                await stream.Result.WriteAsync(buffer, ct).ConfigureAwait(false);\n            }\n            {\n                var buffer = await File.ReadAllBytesAsync(file, ct).ConfigureAwait(false);\n                Assert.Equal(10 * 1024, buffer.Length);\n                for (var i = 0; i < buffer.Length; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n            }\n        }\n\n        public async Task AppendFileTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = CreateFile(path, \"testfile\", 8 * 1024);\n\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(fi.Result);\n            Assert.Equal(8 * 1024, fi.Result.Size);\n            Assert.Equal(0, fi.Result.OpenCount);\n\n            var stream = await services.OpenWriteAsync(_connection, new FileSystemObjectModel\n            {\n                NodeId = fileNodeId\n            }, new FileOpenWriteOptionsModel { Mode = FileWriteMode.Append }, ct).ConfigureAwait(false);\n\n            Assert.Null(stream.ErrorInfo);\n            Assert.NotNull(stream.Result);\n            await using (var _ = stream.Result.ConfigureAwait(false))\n            {\n                fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(8 * 1024, fi.Result.Size);\n                Assert.Equal(1, fi.Result.OpenCount);\n\n                // Now write file\n                var buffer = Enumerable.Range(8 * 1024, 2 * 1024).Select(b => (byte)b).ToArray();\n                await stream.Result.WriteAsync(buffer, ct).ConfigureAwait(false);\n            }\n            {\n                // Now check it is closed\n                fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(0, fi.Result.OpenCount);\n                Assert.True(fi.Result.Writable);\n                Assert.Equal(10 * 1024, fi.Result.Size);\n\n                var buffer = await File.ReadAllBytesAsync(file, ct).ConfigureAwait(false);\n                Assert.Equal(10 * 1024, buffer.Length);\n                for (var i = 0; i < buffer.Length; i++)\n                {\n                    Assert.Equal((byte)i, buffer[i]);\n                }\n            }\n        }\n\n        public async Task AppendFileTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var path = Path.Combine(_tempPath, Path.GetRandomFileName());\n            Directory.CreateDirectory(path);\n            var file = Path.Combine(path, \"testfile\");\n            var fileNodeId = $\"nsu=FileSystem;s=2:{file}\";\n            await File.Create(file).DisposeAsync().ConfigureAwait(false);\n\n            for (var i = 0; i < 10; i++)\n            {\n                var stream = await services.OpenWriteAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, new FileOpenWriteOptionsModel { Mode = FileWriteMode.Append }, ct).ConfigureAwait(false);\n\n                Assert.Null(stream.ErrorInfo);\n                Assert.NotNull(stream.Result);\n                await using var _ = stream.Result.ConfigureAwait(false);\n                // Now write file\n                var buffer = new byte[130000];\n                Array.Fill(buffer, (byte)i);\n                await stream.Result.WriteAsync(buffer, ct).ConfigureAwait(false);\n            }\n            {\n                // Now check it is closed\n                var fi = await services.GetFileInfoAsync(_connection, new FileSystemObjectModel\n                {\n                    NodeId = fileNodeId\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(fi.Result);\n                Assert.Equal(0, fi.Result.OpenCount);\n                Assert.True(fi.Result.Writable);\n                Assert.Equal(10 * 130000, fi.Result.Size);\n\n                var fs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);\n                await using var _ = fs.ConfigureAwait(false);\n                for (var i = 0; i < 10; i++)\n                {\n                    fs.Seek(i * 130000, SeekOrigin.Begin);\n                    Assert.Equal(i, fs.ReadByte());\n                }\n            }\n        }\n\n        private static string CreateFile(string path, string name, long length)\n        {\n            var fullPath = Path.Combine(path, name);\n            using var f = File.Create(fullPath);\n            var buffer = new byte[length];\n            for (var i = 0; i < buffer.Length; i++)\n            {\n                buffer[i] = (byte)i;\n            }\n            f.Write(buffer);\n            return fullPath;\n        }\n\n        private readonly T _connection;\n        private readonly string _tempPath;\n        private readonly Func<IFileSystemServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/HistoricalAccess/HistoryReadValuesAtTimes.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class HistoryReadValuesAtTimesTests<T>\n    {\n        /// <summary>\n        /// Create history services tests\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public HistoryReadValuesAtTimesTests(BaseServerFixture server,\n            Func<IHistoryServices<T>> services, T connection)\n        {\n            _server = server;\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task HistoryReadInt32ValuesAtTimesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = _server.Now.Subtract(TimeSpan.FromHours(1));\n            var results = await services.HistoryReadValuesAtTimesAsync(_connection, new HistoryReadRequestModel<ReadValuesAtTimesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadValuesAtTimesDetailsModel\n                {\n                    ReqTimes = Enumerable.Repeat(0, 10).Select((_, i) => startTime.AddMilliseconds(i * 10000)).ToArray(),\n                    UseSimpleBounds = true\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(10, results.History.Length);\n            Assert.All(results.History,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Equal(DataLocation.Interpolated, arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryReadInt32ValuesAtTimesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = _server.Now.Subtract(TimeSpan.FromHours(1));\n            var results = await services.HistoryReadValuesAtTimesAsync(_connection, new HistoryReadRequestModel<ReadValuesAtTimesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadValuesAtTimesDetailsModel\n                {\n                    ReqTimes = Enumerable.Repeat(0, 10).Select((_, i) => startTime.AddMilliseconds(i * 10000)).ToArray(),\n                    UseSimpleBounds = false\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(10, results.History.Length);\n            Assert.All(results.History,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Equal(DataLocation.Interpolated, arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryReadInt32ValuesAtTimesTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = _server.Now.Subtract(TimeSpan.FromHours(1));\n            var results = await services.HistoryReadValuesAtTimesAsync(_connection, new HistoryReadRequestModel<ReadValuesAtTimesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadValuesAtTimesDetailsModel\n                {\n                    ReqTimes = Enumerable.Repeat(0, 1).Select((_, i) => startTime.AddMilliseconds(i * 10000)).ToArray(),\n                    UseSimpleBounds = true\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(1, results.History.Length);\n            Assert.All(results.History,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Equal(DataLocation.Interpolated, arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryReadInt32ValuesAtTimesTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = _server.Now.Subtract(TimeSpan.FromHours(1));\n            var results = await services.HistoryReadValuesAtTimesAsync(_connection, new HistoryReadRequestModel<ReadValuesAtTimesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                TimestampsToReturn = TimestampsToReturn.Source,\n                Details = new ReadValuesAtTimesDetailsModel\n                {\n                    ReqTimes = Enumerable.Repeat(0, 1).Select((_, i) => startTime.AddMilliseconds(i * 10000)).ToArray(),\n                    UseSimpleBounds = false\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(1, results.History.Length);\n            Assert.All(results.History,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    //   Assert.Null(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Equal(DataLocation.Interpolated, arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryStreamInt32ValuesAtTimesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = _server.Now.Subtract(TimeSpan.FromHours(5));\n            var history = await services.HistoryStreamValuesAtTimesAsync(_connection, new HistoryReadRequestModel<ReadValuesAtTimesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadValuesAtTimesDetailsModel\n                {\n                    ReqTimes = Enumerable.Repeat(0, 500).Select((_, i) => startTime.AddMilliseconds(i * 10000)).ToArray(),\n                    UseSimpleBounds = false\n                }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.Equal(500, history.Count);\n            Assert.All(history,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                    Assert.Equal(DataLocation.Interpolated, arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryStreamInt32ValuesAtTimesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = _server.Now.Subtract(TimeSpan.FromHours(5));\n            var history = await services.HistoryStreamValuesAtTimesAsync(_connection, new HistoryReadRequestModel<ReadValuesAtTimesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadValuesAtTimesDetailsModel\n                {\n                    ReqTimes = Enumerable.Repeat(0, 500).Select((_, i) => startTime.AddMilliseconds(i * 10000)).ToArray(),\n                    UseSimpleBounds = true\n                }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.Equal(500, history.Count);\n            Assert.All(history,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                    Assert.Equal(DataLocation.Interpolated, arg.DataLocation);\n                });\n        }\n        private readonly T _connection;\n        private readonly BaseServerFixture _server;\n        private readonly Func<IHistoryServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/HistoricalAccess/HistoryReadValuesModified.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class HistoryReadValuesModifiedTests<T>\n    {\n        /// <summary>\n        /// Create history services tests\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public HistoryReadValuesModifiedTests(BaseServerFixture server,\n            Func<IHistoryServices<T>> services, T connection)\n        {\n            _server = server;\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task HistoryReadInt16ValuesModifiedTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int16.txt\";\n\n            var results = await services.HistoryReadModifiedValuesAsync(_connection, new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadModifiedValuesDetailsModel\n                {\n                    StartTime = _server.Now - TimeSpan.FromDays(600),\n                    EndTime = _server.Now + TimeSpan.FromDays(1),\n                    NumValues = 14\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(0, results.History.Length);\n            Assert.Empty(results.History);\n        }\n\n        public async Task HistoryStreamInt16ValuesModifiedTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int16.txt\";\n\n            var history = await services.HistoryStreamModifiedValuesAsync(_connection, new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadModifiedValuesDetailsModel\n                {\n                    EndTime = _server.Now + TimeSpan.FromDays(1),\n                    NumValues = 10\n                }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.Equal(0, history.Count);\n        }\n\n        private readonly T _connection;\n        private readonly BaseServerFixture _server;\n        private readonly Func<IHistoryServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/HistoricalAccess/HistoryReadValuesProcessed.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using System;\n    using System.Linq;\n    using System.Text.Json;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class HistoryReadValuesProcessedTests<T>\n    {\n        /// <summary>\n        /// Create history services tests\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public HistoryReadValuesProcessedTests(BaseServerFixture server,\n            Func<IHistoryServices<T>> services, T connection)\n        {\n            _server = server;\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task HistoryReadUInt64ProcessedValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.UInt64.txt\";\n\n            var now = _server.Now;\n            now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, 0, DateTimeKind.Utc);\n            var results = await services.HistoryReadProcessedValuesAsync(_connection, new HistoryReadRequestModel<ReadProcessedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadProcessedValuesDetailsModel\n                {\n                    StartTime = now - TimeSpan.FromHours(1),\n                    EndTime = now,\n                    ProcessingInterval = TimeSpan.FromMinutes(1),\n                    AggregateType = \"i=2347\"\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.All(results.History.Where(h => VariantValue.IsNullOrNullValue(h.Value)), arg =>\n            {\n                Assert.Equal(\"BadNoData\", arg.Status?.SymbolicId);\n                Assert.NotNull(arg.SourceTimestamp);\n                Assert.NotNull(arg.ServerTimestamp);\n                Assert.Null(arg.Value);\n                Assert.Null(arg.DataLocation);\n                Assert.Null(arg.AdditionalData);\n            });\n            var values = results.History.Where(h => !VariantValue.IsNullOrNullValue(h.Value)).ToList();\n            Assert.True(values.Count == 2, JsonSerializer.Serialize(values));\n            Assert.Equal(2, values.Count);\n            Assert.Collection(values,\n                arg =>\n                {\n                    Assert.Equal(\"UncertainDataSubNormal\", arg.Status?.SymbolicId);\n                    Assert.True(arg.Value == 50);\n                    Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UncertainDataSubNormal\", arg.Status?.SymbolicId);\n                    Assert.True(arg.Value == 90);\n                    Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n                });\n        }\n\n        public async Task HistoryReadUInt64ProcessedValuesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.UInt64.txt\";\n\n            var now = _server.Now;\n            now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, 0, DateTimeKind.Utc);\n            var results = await services.HistoryReadProcessedValuesAsync(_connection, new HistoryReadRequestModel<ReadProcessedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadProcessedValuesDetailsModel\n                {\n                    StartTime = now - TimeSpan.FromHours(1),\n                    EndTime = now,\n                    ProcessingInterval = TimeSpan.FromMinutes(1),\n                    AggregateType = \"Count\"\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.All(results.History.Where(h => VariantValue.IsNullOrNullValue(h.Value)), arg =>\n            {\n                Assert.Equal(\"BadNoData\", arg.Status?.SymbolicId);\n                Assert.NotNull(arg.SourceTimestamp);\n                Assert.NotNull(arg.ServerTimestamp);\n                Assert.Null(arg.Value);\n                Assert.Null(arg.DataLocation);\n                Assert.Null(arg.AdditionalData);\n            });\n            var values = results.History.Where(h => !VariantValue.IsNullOrNullValue(h.Value)).ToList();\n            Assert.True(values.Count == 2, JsonSerializer.Serialize(values));\n            Assert.Equal(2, values.Count);\n            Assert.Collection(values,\n                arg =>\n                {\n                    Assert.Equal(\"UncertainDataSubNormal\", arg.Status?.SymbolicId);\n                    Assert.True(arg.Value == 6);\n                    Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UncertainDataSubNormal\", arg.Status?.SymbolicId);\n                    Assert.True(arg.Value == 4);\n                    Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n                });\n        }\n\n        public async Task HistoryReadUInt64ProcessedValuesTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.UInt64.txt\";\n\n            var now = _server.Now;\n            now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, 0, DateTimeKind.Utc);\n            var results = await services.HistoryReadProcessedValuesAsync(_connection, new HistoryReadRequestModel<ReadProcessedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadProcessedValuesDetailsModel\n                {\n                    StartTime = now - TimeSpan.FromHours(1),\n                    EndTime = now,\n                    ProcessingInterval = TimeSpan.FromMinutes(20),\n                    AggregateType = \"Delta\"\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.All(results.History.Where(h => VariantValue.IsNullOrNullValue(h.Value)), arg =>\n            {\n                Assert.Equal(\"BadNoData\", arg.Status?.SymbolicId);\n                Assert.NotNull(arg.SourceTimestamp);\n                Assert.NotNull(arg.ServerTimestamp);\n                Assert.Null(arg.Value);\n                Assert.Null(arg.DataLocation);\n                Assert.Null(arg.AdditionalData);\n            });\n            Assert.True(results.History.Count(h => !VariantValue.IsNullOrNullValue(h.Value)) == 1, JsonSerializer.Serialize(results.History));\n            var arg = Assert.Single(results.History.Where(h => !VariantValue.IsNullOrNullValue(h.Value)));\n            Assert.Null(arg.Status);\n            Assert.True(arg.Value == 80, JsonSerializer.Serialize(arg));\n            Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n            Assert.NotNull(arg.SourceTimestamp);\n            Assert.NotNull(arg.ServerTimestamp);\n            Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n        }\n\n        public async Task HistoryStreamUInt64ProcessedValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.UInt64.txt\";\n\n            var now = _server.Now;\n            now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, 0, DateTimeKind.Utc);\n            var history = await services.HistoryStreamProcessedValuesAsync(_connection, new HistoryReadRequestModel<ReadProcessedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadProcessedValuesDetailsModel\n                {\n                    StartTime = now - TimeSpan.FromHours(1),\n                    EndTime = now,\n                    ProcessingInterval = TimeSpan.FromMinutes(1),\n                    AggregateType = \"i=2347\"\n                }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.All(history.Where(h => VariantValue.IsNullOrNullValue(h.Value)), arg =>\n            {\n                Assert.Equal(\"BadNoData\", arg.Status?.SymbolicId);\n                Assert.NotNull(arg.SourceTimestamp);\n                Assert.NotNull(arg.ServerTimestamp);\n                Assert.Null(arg.Value);\n                Assert.Null(arg.DataLocation);\n                Assert.Null(arg.AdditionalData);\n            });\n            var values = history.Where(h => !VariantValue.IsNullOrNullValue(h.Value)).ToList();\n            Assert.True(values.Count == 2, JsonSerializer.Serialize(values));\n            Assert.Equal(2, values.Count);\n            Assert.Collection(values,\n                arg =>\n                {\n                    Assert.Equal(\"UncertainDataSubNormal\", arg.Status?.SymbolicId);\n                    Assert.True(arg.Value == 50);\n                    Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UncertainDataSubNormal\", arg.Status?.SymbolicId);\n                    Assert.True(arg.Value == 90);\n                    Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n                });\n        }\n\n        public async Task HistoryStreamUInt64ProcessedValuesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.UInt64.txt\";\n\n            var now = _server.Now;\n            now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, 0, DateTimeKind.Utc);\n            var history = await services.HistoryStreamProcessedValuesAsync(_connection, new HistoryReadRequestModel<ReadProcessedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadProcessedValuesDetailsModel\n                {\n                    StartTime = now - TimeSpan.FromHours(1),\n                    EndTime = now,\n                    ProcessingInterval = TimeSpan.FromMinutes(1),\n                    AggregateType = \"Count\"\n                }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.All(history.Where(h => VariantValue.IsNullOrNullValue(h.Value)), arg =>\n            {\n                Assert.Equal(\"BadNoData\", arg.Status?.SymbolicId);\n                Assert.NotNull(arg.SourceTimestamp);\n                Assert.NotNull(arg.ServerTimestamp);\n                Assert.Null(arg.Value);\n                Assert.Null(arg.DataLocation);\n                Assert.Null(arg.AdditionalData);\n            });\n            var values = history.Where(h => !VariantValue.IsNullOrNullValue(h.Value)).ToList();\n            Assert.True(values.Count == 2, JsonSerializer.Serialize(values));\n            Assert.Equal(2, values.Count);\n            Assert.Collection(values,\n                arg =>\n                {\n                    Assert.Equal(\"UncertainDataSubNormal\", arg.Status?.SymbolicId);\n                    Assert.True(arg.Value == 6);\n                    Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UncertainDataSubNormal\", arg.Status?.SymbolicId);\n                    Assert.True(arg.Value == 4);\n                    Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n                });\n        }\n\n        public async Task HistoryStreamUInt64ProcessedValuesTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.UInt64.txt\";\n\n            var now = _server.Now;\n            now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0, 0, DateTimeKind.Utc);\n            var history = await services.HistoryStreamProcessedValuesAsync(_connection, new HistoryReadRequestModel<ReadProcessedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadProcessedValuesDetailsModel\n                {\n                    StartTime = now - TimeSpan.FromHours(1),\n                    EndTime = now,\n                    ProcessingInterval = TimeSpan.FromMinutes(10),\n                    AggregateType = \"Delta\"\n                }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.All(history.Where(h => VariantValue.IsNullOrNullValue(h.Value)), arg =>\n            {\n                Assert.Equal(\"BadNoData\", arg.Status?.SymbolicId);\n                Assert.NotNull(arg.SourceTimestamp);\n                Assert.NotNull(arg.ServerTimestamp);\n                Assert.Null(arg.Value);\n                Assert.Null(arg.DataLocation);\n                Assert.Null(arg.AdditionalData);\n            });\n            Assert.True(history.Count(h => !VariantValue.IsNullOrNullValue(h.Value)) == 1, JsonSerializer.Serialize(history));\n            var arg = Assert.Single(history.Where(h => !VariantValue.IsNullOrNullValue(h.Value)));\n            Assert.Null(arg.Status);\n            Assert.True(arg.Value == 80);\n            Assert.Equal(DataLocation.Calculated, arg.DataLocation);\n            Assert.NotNull(arg.SourceTimestamp);\n            Assert.NotNull(arg.ServerTimestamp);\n            Assert.Equal(AdditionalData.Partial, arg.AdditionalData);\n        }\n\n        private readonly T _connection;\n        private readonly BaseServerFixture _server;\n        private readonly Func<IHistoryServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/HistoricalAccess/HistoryReadValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class HistoryReadValuesTests<T>\n    {\n        /// <summary>\n        /// Create history services tests\n        /// </summary>\n        /// <param name=\"server\"></param>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public HistoryReadValuesTests(BaseServerFixture server,\n            Func<IHistoryServices<T>> services, T connection)\n        {\n            _server = server;\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task HistoryReadInt64ValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var results = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = _server.Now - TimeSpan.FromDays(600),\n                        EndTime = _server.Now + TimeSpan.FromDays(1),\n                        ReturnBounds = true\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(14, results.History.Length);\n            Assert.Collection(results.History,\n                arg =>\n                {\n                    Assert.Equal(2161573888, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                    Assert.Null(arg.DataLocation);\n                    Assert.Null(arg.AdditionalData);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 20);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 25);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 30);\n                },\n                arg =>\n                {\n                    Assert.Equal(2147483648, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 40);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 50);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 60);\n                },\n                arg =>\n                {\n                    Assert.Equal(1073741824u, arg.Status?.StatusCode);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 80);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 90);\n                },\n                arg =>\n                {\n                    Assert.Equal(2161573888, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                });\n            Assert.All(results.History,\n                arg =>\n                {\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Null(arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryReadInt64ValuesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var results = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = _server.Now - TimeSpan.FromDays(600),\n                        NumValues = 10\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(10, results.History.Length);\n            Assert.Collection(results.History,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 20);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 25);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 30);\n                },\n                arg =>\n                {\n                    Assert.Equal(2147483648u, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 40);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 50);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 60);\n                },\n                arg =>\n                {\n                    Assert.Equal(1073741824u, arg.Status?.StatusCode);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 70);\n                });\n            Assert.All(results.History,\n                arg =>\n                {\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Null(arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryReadInt64ValuesTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var results = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = _server.Now - TimeSpan.FromDays(600),\n                        EndTime = _server.Now + TimeSpan.FromDays(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(12, results.History.Length);\n            Assert.Collection(results.History,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 20);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 25);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 30);\n                },\n                arg =>\n                {\n                    Assert.Equal(2147483648, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 40);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 50);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 60);\n                },\n                arg =>\n                {\n                    Assert.Equal(1073741824u, arg.Status?.StatusCode);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 80);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 90);\n                });\n            Assert.All(results.History,\n                arg =>\n                {\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Null(arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryReadInt64ValuesTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var results = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        EndTime = _server.Now + TimeSpan.FromDays(1),\n                        NumValues = 10\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.History);\n            Assert.Equal(10, results.History.Length);\n            Assert.Collection(results.History,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 90);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 80);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Equal(1073741824u, arg.Status?.StatusCode);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 60);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 50);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 40);\n                },\n                arg =>\n                {\n                    Assert.Equal(2147483648, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 30);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 25);\n                });\n            Assert.All(results.History,\n                arg =>\n                {\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Null(arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryStreamInt64ValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var history = await services.HistoryStreamValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = _server.Now - TimeSpan.FromDays(600),\n                        EndTime = _server.Now + TimeSpan.FromDays(1),\n                        ReturnBounds = true\n                    }\n                }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.Equal(14, history.Count);\n            Assert.Collection(history,\n                arg =>\n                {\n                    Assert.Equal(2161573888, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 20);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 25);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 30);\n                },\n                arg =>\n                {\n                    Assert.Equal(2147483648, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 40);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 50);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 60);\n                },\n                arg =>\n                {\n                    Assert.Equal(1073741824u, arg.Status?.StatusCode);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 80);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 90);\n                },\n                arg =>\n                {\n                    Assert.Equal(2161573888, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                });\n            Assert.All(history,\n                arg =>\n                {\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Null(arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryStreamInt64ValuesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var history = await services.HistoryStreamValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = _server.Now - TimeSpan.FromDays(600),\n                        NumValues = 10\n                    }\n                }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.Equal(10, history.Count);\n            Assert.Collection(history,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 20);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 25);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 30);\n                },\n                arg =>\n                {\n                    Assert.Equal(2147483648u, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 40);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 50);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 60);\n                },\n                arg =>\n                {\n                    Assert.Equal(1073741824u, arg.Status?.StatusCode);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 70);\n                });\n            Assert.All(history,\n                arg =>\n                {\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Null(arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryStreamInt64ValuesTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var history = await services.HistoryStreamValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = _server.Now - TimeSpan.FromDays(600),\n                        EndTime = _server.Now + TimeSpan.FromDays(1)\n                    }\n                }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.Equal(12, history.Count);\n            Assert.Collection(history,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 10);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 20);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 25);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 30);\n                },\n                arg =>\n                {\n                    Assert.Equal(2147483648, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 40);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 50);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 60);\n                },\n                arg =>\n                {\n                    Assert.Equal(1073741824u, arg.Status?.StatusCode);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 80);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 90);\n                });\n            Assert.All(history,\n                arg =>\n                {\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Null(arg.DataLocation);\n                });\n        }\n\n        public async Task HistoryStreamInt64ValuesTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var history = await services.HistoryStreamValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        EndTime = _server.Now + TimeSpan.FromDays(1),\n                        NumValues = 10\n                    }\n                }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.NotNull(history);\n            Assert.Equal(10, history.Count);\n            Assert.Collection(history,\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 90);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 80);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Equal(1073741824u, arg.Status?.StatusCode);\n                    Assert.True(arg.Value == 70);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 60);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 50);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 40);\n                },\n                arg =>\n                {\n                    Assert.Equal(2147483648, arg.Status?.StatusCode);\n                    Assert.Null(arg.Value);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 30);\n                },\n                arg =>\n                {\n                    Assert.Null(arg.Status);\n                    Assert.True(arg.Value == 25);\n                });\n            Assert.All(history,\n                arg =>\n                {\n                    Assert.NotNull(arg.SourceTimestamp);\n                    Assert.NotNull(arg.ServerTimestamp);\n                    Assert.Null(arg.AdditionalData);\n                    Assert.Null(arg.DataLocation);\n                });\n        }\n\n        private readonly T _connection;\n        private readonly BaseServerFixture _server;\n        private readonly Func<IHistoryServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/HistoricalAccess/HistoryUpdateValuesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class HistoryUpdateValuesTests<T>\n    {\n        /// <summary>\n        /// Create history services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public HistoryUpdateValuesTests(Func<IHistoryServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task HistoryInsertUInt32ValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var toUpsert = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMilliseconds(i * 10000))\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 77\n                })\n                .ToArray();\n\n            var insert = await services.HistoryInsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toUpsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(insert.ErrorInfo);\n            Assert.Equal(toUpsert.Length, insert.Results?.Count);\n            Assert.All(insert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var read2 = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        NumValues = (uint)toUpsert.Length\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read2.ErrorInfo);\n            Assert.NotNull(read2.History);\n            Assert.Equal(10, read2.History.Length);\n            Assert.All(read2.History,\n               arg => Assert.True(arg.Value == 77));\n        }\n\n        public async Task HistoryInsertUInt32ValuesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var toUpsert = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMilliseconds(i * 10000))\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 77\n                })\n                .ToArray();\n\n            var insert = await services.HistoryInsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toUpsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(insert.ErrorInfo);\n            Assert.Equal(toUpsert.Length, insert.Results?.Count);\n            Assert.All(insert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var insert2 = await services.HistoryInsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toUpsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(insert2.ErrorInfo);\n            Assert.Equal(toUpsert.Length, insert2.Results?.Count);\n            Assert.All(insert2.Results!, arg => Assert.Equal(\"BadEntryExists\", arg.SymbolicId));\n        }\n\n        public async Task HistoryUpsertUInt32ValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var toUpsert = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMilliseconds(i * 10000))\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 5\n                })\n                .ToArray();\n\n            var upsert = await services.HistoryUpsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toUpsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(upsert.ErrorInfo);\n            Assert.Equal(toUpsert.Length, upsert.Results?.Count);\n            Assert.All(upsert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var read2 = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        NumValues = (uint)toUpsert.Length\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read2.ErrorInfo);\n            Assert.NotNull(read2.History);\n            Assert.Equal(10, read2.History.Length);\n            Assert.All(read2.History,\n               arg => Assert.True(arg.Value == 5));\n        }\n\n        public async Task HistoryUpsertUInt32ValuesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var reqTimes = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMinutes(i)).ToArray();\n            var toUpsert = reqTimes\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 5\n                })\n                .ToArray();\n\n            var upsert = await services.HistoryInsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toUpsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(upsert.ErrorInfo);\n            Assert.Equal(toUpsert.Length, upsert.Results?.Count);\n            Assert.All(upsert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var toReplace = toUpsert.Select(v => v with { Value = 99 }).ToArray();\n            var replace = await services.HistoryUpsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toReplace\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(replace.ErrorInfo);\n            Assert.Equal(toReplace.Length, replace.Results?.Count);\n            Assert.All(replace.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var read2 = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        NumValues = (uint)reqTimes.Length\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read2.ErrorInfo);\n            Assert.NotNull(read2.History);\n            Assert.Equal(10, read2.History.Length);\n            Assert.All(read2.History,\n               arg => Assert.True(arg.Value == 99));\n\n            var read3 = await services.HistoryReadModifiedValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadModifiedValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        NumValues = (uint)reqTimes.Length\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read3.ErrorInfo);\n            Assert.NotNull(read3.History);\n            Assert.Equal(10, read3.History.Length);\n            Assert.All(read3.History,\n               arg => Assert.True(arg.Value == 5));\n        }\n\n        public async Task HistoryReplaceUInt32ValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var reqTimes = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMinutes(i)).ToArray();\n            var toUpsert = reqTimes\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 5\n                })\n                .ToArray();\n\n            var upsert = await services.HistoryInsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toUpsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(upsert.ErrorInfo);\n            Assert.Equal(toUpsert.Length, upsert.Results?.Count);\n            Assert.All(upsert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var toReplace = toUpsert.Select(v => v with { Value = 99 }).ToArray();\n            var replace = await services.HistoryReplaceValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toReplace\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(replace.ErrorInfo);\n            Assert.Equal(toReplace.Length, replace.Results?.Count);\n            Assert.All(replace.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var read2 = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        NumValues = (uint)reqTimes.Length\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read2.ErrorInfo);\n            Assert.NotNull(read2.History);\n            Assert.Equal(10, read2.History.Length);\n            Assert.All(read2.History,\n               arg => Assert.True(arg.Value == 99));\n\n            var read3 = await services.HistoryReadModifiedValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadModifiedValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        NumValues = (uint)reqTimes.Length * 2\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(read3.History);\n            Assert.Equal(20, read3.History.Length);\n            Assert.Null(read3.ErrorInfo);\n            Assert.All(read3.History,\n               arg =>\n               {\n                   Assert.True(arg.Value == 5);\n                   Assert.NotNull(arg.ModificationInfo);\n               });\n            Assert.Equal(10, read3.History.Count(\n                h => h.ModificationInfo?.UpdateType == HistoryUpdateOperation.Insert));\n            Assert.Equal(10, read3.History.Count(\n                h => h.ModificationInfo?.UpdateType == HistoryUpdateOperation.Replace));\n        }\n\n        public async Task HistoryReplaceUInt32ValuesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var reqTimes = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMinutes(i)).ToArray();\n            var toReplace = reqTimes\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 5\n                })\n                .ToArray();\n\n            var replace = await services.HistoryReplaceValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toReplace\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(replace.ErrorInfo);\n            Assert.Equal(toReplace.Length, replace.Results?.Count);\n            Assert.All(replace.Results!, arg => Assert.Equal(\"BadNoEntryExists\", arg.SymbolicId));\n        }\n\n        public async Task HistoryInsertDeleteUInt32ValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var reqTimes = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMinutes(i)).ToArray();\n            var toUpsert = reqTimes\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = null, // Discover data type\n                    SourceTimestamp = ts,\n                    Value = 5\n                })\n                .ToArray();\n\n            var upsert = await services.HistoryInsertValuesAsync(_connection, new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new UpdateValuesDetailsModel\n                {\n                    Values = toUpsert\n                }\n            }, ct).ConfigureAwait(false);\n            Assert.Null(upsert.ErrorInfo);\n            Assert.Equal(toUpsert.Length, upsert.Results?.Count);\n            Assert.All(upsert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var replace = await services.HistoryDeleteValuesAsync(_connection,\n                new HistoryUpdateRequestModel<DeleteValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new DeleteValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(replace.ErrorInfo);\n            Assert.Empty(replace.Results!);\n\n            var read2 = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(read2.ErrorInfo);\n            Assert.Equal(\"GoodNoData\", read2.ErrorInfo.SymbolicId);\n            Assert.NotNull(read2.History);\n            Assert.Empty(read2.History);\n\n            var read3 = await services.HistoryReadModifiedValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadModifiedValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read3.ErrorInfo);\n\n            // Insert + Delete = 20\n            Assert.NotNull(read3.History);\n            Assert.Equal(20, read3.History.Length);\n            Assert.All(read3.History,\n               arg =>\n               {\n                   Assert.NotNull(arg.ModificationInfo);\n                   Assert.True(arg.Value == 5);\n               });\n            Assert.Equal(10, read3.History.Count(\n                h => h.ModificationInfo?.UpdateType == HistoryUpdateOperation.Insert));\n            Assert.Equal(10, read3.History.Count(\n                h => h.ModificationInfo?.UpdateType == HistoryUpdateOperation.Delete));\n        }\n\n        public async Task HistoryInsertDeleteUInt32ValuesTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var reqTimes = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMinutes(i)).ToArray();\n            var toUpsert = reqTimes\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 66\n                })\n                .ToArray();\n\n            var upsert = await services.HistoryInsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toUpsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(upsert.ErrorInfo);\n            Assert.Equal(toUpsert.Length, upsert.Results?.Count);\n            Assert.All(upsert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var read2 = await services.HistoryReadModifiedValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadModifiedValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read2.ErrorInfo);\n            Assert.NotNull(read2.History);\n            Assert.Equal(10, read2.History.Length);\n            Assert.All(read2.History,\n               arg =>\n               {\n                   Assert.NotNull(arg.ModificationInfo);\n                   Assert.True(arg.Value == 66);\n                   Assert.Equal(HistoryUpdateOperation.Insert, arg.ModificationInfo?.UpdateType);\n               });\n\n            var deleteModified = await services.HistoryDeleteModifiedValuesAsync(_connection,\n                new HistoryUpdateRequestModel<DeleteValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new DeleteValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(deleteModified.ErrorInfo);\n            Assert.Empty(deleteModified.Results!);\n\n            var read3 = await services.HistoryReadModifiedValuesAsync(_connection, new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n            {\n                NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                Details = new ReadModifiedValuesDetailsModel\n                {\n                    StartTime = startTime,\n                    EndTime = reqTimes[^1].AddHours(1)\n                }\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(read3.ErrorInfo);\n            Assert.Equal(\"GoodNoData\", read3.ErrorInfo.SymbolicId);\n            Assert.NotNull(read3.History);\n            Assert.Empty(read3.History);\n        }\n\n        public async Task HistoryInsertDeleteUInt32ValuesTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var reqTimes = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMinutes(i)).ToArray();\n            var toUpsert = reqTimes\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 66\n                })\n                .ToArray();\n\n            var upsert = await services.HistoryInsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toUpsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(upsert.ErrorInfo);\n            Assert.Equal(toUpsert.Length, upsert.Results?.Count);\n            Assert.All(upsert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var read2 = await services.HistoryReadModifiedValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadModifiedValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read2.ErrorInfo);\n            Assert.NotNull(read2.History);\n            Assert.Equal(10, read2.History.Length);\n            Assert.All(read2.History,\n               arg =>\n               {\n                   Assert.NotNull(arg.ModificationInfo);\n                   Assert.True(arg.Value == 66);\n                   Assert.Equal(HistoryUpdateOperation.Insert, arg.ModificationInfo?.UpdateType);\n               });\n\n            var delete = await services.HistoryDeleteValuesAsync(_connection,\n                new HistoryUpdateRequestModel<DeleteValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new DeleteValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(delete.ErrorInfo);\n            Assert.Empty(delete.Results!);\n\n            var deleteModified = await services.HistoryDeleteModifiedValuesAsync(_connection,\n                new HistoryUpdateRequestModel<DeleteValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new DeleteValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(deleteModified.ErrorInfo);\n            Assert.Empty(deleteModified.Results!);\n\n            var read3 = await services.HistoryReadModifiedValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadModifiedValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(read3.ErrorInfo);\n            Assert.Equal(\"GoodNoData\", read3.ErrorInfo.SymbolicId); // TODO: Check this\n            Assert.NotNull(read3.History);\n            Assert.Empty(read3.History);\n        }\n\n        public async Task HistoryInsertDeleteUInt32ValuesTest4Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var reqTimes = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMinutes(i)).ToArray();\n            var toInsert = reqTimes\n                .Select(ts => new HistoricValueModel\n                {\n                    DataType = \"Int32\",\n                    SourceTimestamp = ts,\n                    Value = 88\n                })\n                .ToArray();\n\n            var upsert = await services.HistoryInsertValuesAsync(_connection,\n                new HistoryUpdateRequestModel<UpdateValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new UpdateValuesDetailsModel\n                    {\n                        Values = toInsert\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(upsert.ErrorInfo);\n            Assert.Equal(toInsert.Length, upsert.Results?.Count);\n            Assert.All(upsert.Results!, arg => Assert.Equal(\"Good\", arg.SymbolicId));\n\n            var read2 = await services.HistoryReadModifiedValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadModifiedValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read2.ErrorInfo);\n            Assert.NotNull(read2.History);\n            Assert.Equal(10, read2.History.Length);\n            Assert.All(read2.History,\n               arg =>\n               {\n                   Assert.NotNull(arg.ModificationInfo);\n                   Assert.NotNull(arg.SourceTimestamp);\n                   Assert.True(arg.Value == 88);\n                   Assert.Equal(HistoryUpdateOperation.Insert, arg.ModificationInfo?.UpdateType);\n               });\n\n            var delete = await services.HistoryDeleteValuesAtTimesAsync(_connection,\n                new HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new DeleteValuesAtTimesDetailsModel\n                    {\n                        ReqTimes = new[] { startTime }\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(delete.ErrorInfo);\n            var arg = Assert.Single(delete.Results!);\n            Assert.Equal(\"Good\", arg.SymbolicId);\n\n            var read4 = await services.HistoryReadValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read4.ErrorInfo);\n            Assert.NotNull(read4.History);\n            Assert.Equal(9, read4.History.Length);\n            Assert.All(read4.History,\n               arg => Assert.True(arg.Value == 88));\n\n            var read3 = await services.HistoryReadModifiedValuesAsync(_connection,\n                new HistoryReadRequestModel<ReadModifiedValuesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new ReadModifiedValuesDetailsModel\n                    {\n                        StartTime = startTime,\n                        EndTime = reqTimes[^1].AddHours(1)\n                    }\n                }, ct).ConfigureAwait(false);\n\n            Assert.Null(read3.ErrorInfo);\n\n            // Insert + Delete = 11\n            Assert.NotNull(read3.History);\n            Assert.Equal(11, read3.History.Length);\n            Assert.All(read3.History,\n               arg =>\n               {\n                   Assert.NotNull(arg.ModificationInfo);\n                   Assert.True(arg.Value == 88);\n               });\n            Assert.Equal(10, read3.History.Count(\n                h => h.ModificationInfo?.UpdateType == HistoryUpdateOperation.Insert));\n            Assert.Single(read3.History.Where(\n                h => h.ModificationInfo?.UpdateType == HistoryUpdateOperation.Delete));\n        }\n\n        public async Task HistoryDeleteUInt32ValuesTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int32.txt\";\n\n            var startTime = StartTime();\n            var reqTimes = Enumerable.Repeat(0, 10)\n                .Select((_, i) => startTime.AddMinutes(i)).ToArray();\n            var delete = await services.HistoryDeleteValuesAtTimesAsync(_connection,\n                new HistoryUpdateRequestModel<DeleteValuesAtTimesDetailsModel>\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples,\n                    Details = new DeleteValuesAtTimesDetailsModel\n                    {\n                        ReqTimes = reqTimes\n                    }\n                }, ct).ConfigureAwait(false);\n            Assert.Null(delete.ErrorInfo);\n            Assert.Equal(10, delete.Results?.Count);\n            Assert.All(delete.Results!, arg => Assert.Equal(\"BadNoEntryExists\", arg.SymbolicId));\n        }\n\n        private static DateTime StartTime()\n        {\n            return new DateTime(1973, 1, 1, 0, 0, 0, DateTimeKind.Utc)\n                .AddYears(Interlocked.Increment(ref _counter));\n        }\n\n        private static int _counter;\n        private readonly T _connection;\n        private readonly Func<IHistoryServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/HistoricalAccess/NodeHistoricalAccessTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class NodeHistoricalAccessTests<T>\n    {\n        /// <summary>\n        /// Create history services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public NodeHistoricalAccessTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task GetServerCapabilitiesTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.GetServerCapabilitiesAsync(_connection,\n                null, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            Assert.NotNull(results.AggregateFunctions);\n            Assert.Equal(37, results.AggregateFunctions?.Count);\n            Assert.Single(results.SupportedLocales!);\n            Assert.Equal(\"en-US\", results.SupportedLocales?[0]);\n            Assert.NotEmpty(results.ServerProfiles!);\n            Assert.Equal(3, results.ServerProfiles!.Count);\n            Assert.NotNull(results.OperationLimits);\n            Assert.Null(results.OperationLimits.MinSupportedSampleRate);\n            Assert.Equal(1000u, results.OperationLimits.MaxBrowseContinuationPoints!.Value);\n            Assert.Equal(1000u, results.OperationLimits.MaxQueryContinuationPoints!.Value);\n            Assert.Equal(1000u, results.OperationLimits.MaxHistoryContinuationPoints!.Value);\n            Assert.Null(results.OperationLimits.MaxNodesPerBrowse);\n            Assert.Null(results.OperationLimits.MaxNodesPerRegisterNodes);\n            Assert.Null(results.OperationLimits.MaxNodesPerWrite);\n            Assert.Null(results.OperationLimits.MaxNodesPerMethodCall);\n            Assert.Null(results.OperationLimits.MaxNodesPerNodeManagement);\n            Assert.Null(results.OperationLimits.MaxMonitoredItemsPerCall);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryReadData);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryReadEvents);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryUpdateData);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryUpdateEvents);\n            Assert.Equal(65535u, results.OperationLimits.MaxArrayLength);\n            Assert.Equal(130816u, results.OperationLimits.MaxStringLength);\n            Assert.Equal(1048576u, results.OperationLimits.MaxByteStringLength);\n            Assert.Null(results.ModellingRules);\n        }\n\n        public async Task HistoryGetServerCapabilitiesTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.HistoryGetServerCapabilitiesAsync(_connection,\n                null, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            Assert.NotNull(results.AggregateFunctions);\n            Assert.Equal(37, results.AggregateFunctions?.Count);\n            Assert.True(results.AccessHistoryDataCapability);\n            Assert.False(results.AccessHistoryEventsCapability);\n            Assert.True(results.InsertDataCapability);\n            Assert.False(results.InsertEventCapability);\n            Assert.True(results.InsertAnnotationCapability);\n            Assert.True(results.ReplaceDataCapability);\n            Assert.False(results.ReplaceEventCapability);\n            Assert.True(results.DeleteRawCapability);\n            Assert.True(results.DeleteAtTimeCapability);\n            Assert.False(results.DeleteEventCapability);\n            Assert.False(results.ServerTimestampSupported);\n            Assert.True(results.UpdateDataCapability);\n            Assert.False(results.UpdateEventCapability);\n            Assert.NotNull(results.MaxReturnDataValues);\n            Assert.Equal(uint.MaxValue, results.MaxReturnDataValues!.Value);\n            Assert.Null(results.MaxReturnEventValues);\n        }\n\n        public async Task HistoryGetInt16NodeHistoryConfigurationAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int16.txt\";\n\n            var results = await services.HistoryGetConfigurationAsync(_connection,\n                new HistoryConfigurationRequestModel\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            Assert.NotNull(results.Configuration);\n            Assert.NotNull(results.Configuration?.StartOfArchive);\n            Assert.NotNull(results.Configuration?.EndOfArchive);\n            Assert.NotNull(results.Configuration?.StartOfOnlineArchive);\n            Assert.Equal(ExceptionDeviationType.AbsoluteValue, results.Configuration?.ExceptionDeviationType);\n            Assert.Equal(0, results.Configuration?.ExceptionDeviation);\n            Assert.Null(results.Configuration?.AggregateFunctions);\n            Assert.NotNull(results.Configuration?.AggregateConfiguration);\n            Assert.Equal((byte)100, results.Configuration?.AggregateConfiguration?.PercentDataGood);\n            Assert.Equal((byte)100, results.Configuration?.AggregateConfiguration?.PercentDataBad);\n            Assert.False(results.Configuration?.AggregateConfiguration?.UseSlopedExtrapolation);\n            Assert.True(results.Configuration?.AggregateConfiguration?.TreatUncertainAsBad);\n            Assert.Equal(TimeSpan.FromSeconds(10), results.Configuration?.MinTimeInterval);\n            Assert.Equal(TimeSpan.FromSeconds(10), results.Configuration?.MaxTimeInterval);\n            Assert.False(results.Configuration?.ServerTimestampSupported);\n            Assert.False(results.Configuration?.Stepped);\n            Assert.Null(results.ErrorInfo);\n        }\n\n        public async Task HistoryGetInt64NodeHistoryConfigurationAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Int64.txt\";\n\n            var results = await services.HistoryGetConfigurationAsync(_connection,\n                new HistoryConfigurationRequestModel\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            Assert.NotNull(results.Configuration);\n            Assert.NotNull(results.Configuration?.StartOfArchive);\n            Assert.NotNull(results.Configuration?.EndOfArchive);\n            Assert.NotNull(results.Configuration?.StartOfOnlineArchive);\n            Assert.Equal(ExceptionDeviationType.AbsoluteValue, results.Configuration?.ExceptionDeviationType);\n            Assert.Equal(0, results.Configuration?.ExceptionDeviation);\n            Assert.Null(results.Configuration?.AggregateFunctions);\n            Assert.NotNull(results.Configuration?.AggregateConfiguration);\n            Assert.Equal((byte)100, results.Configuration?.AggregateConfiguration?.PercentDataGood);\n            Assert.Equal((byte)100, results.Configuration?.AggregateConfiguration?.PercentDataBad);\n            Assert.False(results.Configuration?.AggregateConfiguration?.UseSlopedExtrapolation);\n            Assert.True(results.Configuration?.AggregateConfiguration?.TreatUncertainAsBad);\n            Assert.Equal(TimeSpan.FromSeconds(10), results.Configuration?.MinTimeInterval);\n            Assert.Equal(TimeSpan.FromSeconds(10), results.Configuration?.MaxTimeInterval);\n            Assert.False(results.Configuration?.ServerTimestampSupported);\n            Assert.True(results.Configuration?.Stepped);\n            Assert.Null(results.ErrorInfo);\n        }\n\n        public async Task HistoryGetNodeHistoryConfigurationFromBadNodeAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string samples = \"s=1:Azure.IIoT.OpcUa.Publisher.Testing.Servers.HistoricalAccess.Data.Sample.Unknown.txt\";\n\n            var results = await services.HistoryGetConfigurationAsync(_connection,\n                new HistoryConfigurationRequestModel\n                {\n                    NodeId = \"http://opcfoundation.org/HistoricalAccess#\" + samples\n                }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            Assert.Null(results.Configuration);\n            Assert.NotNull(results.ErrorInfo);\n            // Assert.Equal(\"BadNodeIdUnknown\", results.ErrorInfo.SymbolicId);\n            Assert.Equal(\"BadUnexpectedError\", results.ErrorInfo.SymbolicId);\n        }\n\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/HistoricalEvents/NodeHistoricalEventsTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class NodeHistoricalEventsTests<T>\n    {\n        /// <summary>\n        /// Create history services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public NodeHistoricalEventsTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task GetServerCapabilitiesTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.GetServerCapabilitiesAsync(_connection,\n                null, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            Assert.NotNull(results.AggregateFunctions);\n            Assert.Equal(37, results.AggregateFunctions?.Count);\n            Assert.Single(results.SupportedLocales!);\n            Assert.Equal(\"en-US\", results.SupportedLocales?[0]);\n            Assert.NotEmpty(results.ServerProfiles!);\n            Assert.Equal(3, results.ServerProfiles!.Count);\n            Assert.NotNull(results.OperationLimits);\n            Assert.Null(results.OperationLimits.MinSupportedSampleRate);\n            Assert.Equal(1000u, results.OperationLimits.MaxBrowseContinuationPoints!.Value);\n            Assert.Equal(1000u, results.OperationLimits.MaxQueryContinuationPoints!.Value);\n            Assert.Equal(1000u, results.OperationLimits.MaxHistoryContinuationPoints!.Value);\n            Assert.Null(results.OperationLimits.MaxNodesPerBrowse);\n            Assert.Null(results.OperationLimits.MaxNodesPerRegisterNodes);\n            Assert.Null(results.OperationLimits.MaxNodesPerWrite);\n            Assert.Null(results.OperationLimits.MaxNodesPerMethodCall);\n            Assert.Null(results.OperationLimits.MaxNodesPerNodeManagement);\n            Assert.Null(results.OperationLimits.MaxMonitoredItemsPerCall);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryReadData);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryReadEvents);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryUpdateData);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryUpdateEvents);\n            Assert.Equal(65535u, results.OperationLimits.MaxArrayLength);\n            Assert.Equal(130816u, results.OperationLimits.MaxStringLength);\n            Assert.Equal(1048576u, results.OperationLimits.MaxByteStringLength);\n            Assert.Null(results.ModellingRules);\n        }\n\n        public async Task HistoryGetServerCapabilitiesTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.HistoryGetServerCapabilitiesAsync(_connection,\n                null, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            //  Assert.NotNull(results.AggregateFunctions);\n            //  Assert.Equal(37, results.AggregateFunctions.Count);\n            //  Assert.False(results.AccessHistoryDataCapability);\n            //  Assert.True(results.AccessHistoryEventsCapability);\n            //  Assert.False(results.InsertDataCapability);\n            //  Assert.True(results.InsertEventCapability);\n            //  Assert.True(results.InsertAnnotationCapability);\n            //  Assert.False(results.ReplaceDataCapability);\n            //  Assert.True(results.ReplaceEventCapability);\n            //  Assert.False(results.DeleteRawCapability);\n            //  Assert.False(results.DeleteAtTimeCapability);\n            //  Assert.True(results.DeleteEventCapability);\n            //  Assert.False(results.ServerTimestampSupported);\n            //  Assert.False(results.UpdateDataCapability);\n            //  Assert.True(results.UpdateEventCapability);\n            //  Assert.Null(results.MaxReturnDataValues);\n            //  Assert.NotNull(results.MaxReturnEventValues);\n            //  Assert.Equal(uint.MaxValue, results.MaxReturnEventValues.Value);\n        }\n\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/Isa95Jobs/Isa95JobsServerTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using System;\n\n    /// <summary>\n    /// Simple Events server node tests\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class Isa95JobsServerTests<T>\n    {\n        public Isa95JobsServerTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/Plc/PlcModelComplexTypeTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    /// <summary>\n    /// Tests for the Plc model, which is a complex type.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public sealed class PlcModelComplexTypeTests<T>\n    {\n        public PlcModelComplexTypeTests(BaseServerFixture server,\n            Func<INodeServices<T>> services, T connection)\n        {\n            _server = server;\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task PlcModelHeaterTestsAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            await TurnHeaterOnAsync(ct).ConfigureAwait(false);\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1000);\n\n            // TODO: Fix flaky test\n#if FALSE\n\n            var model = await GetPlcModelAsync(ct).ConfigureAwait(false);\n            var state = model?.HeaterState;\n            var temperature = model?.Temperature;\n            var pressure = model?.Pressure;\n\n            state.Should().Be(PlcHeaterStateType.On,\n                \"heater should start in 'on' state\");\n            pressure.Should().BeGreaterThan(10_000,\n                \"pressure should start at 10k and get higher\");\n            temperature?.Top.Should().Be(pressure - 100_005,\n                \"top is always 100,005 less than pressure. Pressure: {0}\", pressure);\n            temperature?.Bottom.Should().Be(pressure - 100_000,\n                \"bottom is always 100,000 less than pressure. Pressure: {0}\", pressure);\n\n            var previousPressure = 0;\n            for (var i = 0; i < 5; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1000);\n                model = await GetPlcModelAsync(ct).ConfigureAwait(false);\n                pressure = model?.Pressure;\n\n                pressure.Should().BeGreaterThan(previousPressure,\n                    \"pressure should build when heater is on\");\n                previousPressure = pressure ?? int.MaxValue;\n            }\n\n            // let heater run for a few seconds to make temperature rise\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1000);\n            await TurnHeaterOffAsync(ct).ConfigureAwait(false);\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1000);\n\n            model = await GetPlcModelAsync(ct).ConfigureAwait(false);\n            state = model?.HeaterState;\n            temperature = model?.Temperature;\n            pressure = model?.Pressure;\n\n            state.Should().Be(PlcHeaterStateType.Off,\n                \"heater should have been turned off\");\n            pressure.Should().BeGreaterThan(10_000,\n                \"pressure should start at 10k and get higher\");\n\n            temperature?.Top.Should().Be(pressure - 100_005,\n                \"top is always 100,005 less than pressure. Pressure: {0}\", pressure);\n            temperature?.Bottom.Should().Be(pressure - 100_000,\n                \"btoom is always 100,000 less than pressure. Pressure: {0}\", pressure);\n\n            await TurnHeaterOffAsync(ct).ConfigureAwait(false);\n            for (var i = 0; i < 5; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1000);\n                model = await GetPlcModelAsync(ct).ConfigureAwait(false);\n                pressure = model?.Pressure;\n\n                pressure.Should().BeLessThan(previousPressure,\n                    \"pressure should drop when heater is off\");\n                previousPressure = pressure ?? 0;\n            }\n#endif\n\n            async Task TurnHeaterOnAsync(CancellationToken ct = default)\n            {\n                var result = await services.MethodCallAsync(_connection, new MethodCallRequestModel\n                {\n                    ObjectId = Plc.Namespaces.PlcApplications + \"#s=Methods\",\n                    MethodId = Plc.Namespaces.PlcSimulation + \"#s=HeaterOn\"\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(result);\n                Assert.Null(result.ErrorInfo);\n            }\n#if FALSE\n\n            async Task TurnHeaterOffAsync(CancellationToken ct = default)\n            {\n                var result = await services.MethodCallAsync(_connection, new MethodCallRequestModel\n                {\n                    ObjectId = Plc.Namespaces.PlcApplications + \"#s=Methods\",\n                    MethodId = Plc.Namespaces.PlcSimulation + \"#s=HeaterOff\"\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(result);\n                Assert.Null(result.ErrorInfo);\n            }\n\n            async Task<PlcDataType?> GetPlcModelAsync(CancellationToken ct = default)\n            {\n                var value = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcSimulation + \"#i=\" + Variables.Plc1_PlcStatus\n                }, ct).ConfigureAwait(false);\n\n                Assert.NotNull(value);\n                Assert.Null(value.ErrorInfo);\n                Assert.NotNull(value.Value);\n                Assert.True(value.Value.TryGetProperty(\"Body\", out var body));\n\n                // TODO: workaround decoder shortfall.  Need to look into this.\n                var serializer = new NewtonsoftJsonSerializer();\n                return serializer.Deserialize<PlcDataType>(serializer.SerializeToString(body));\n            }\n#endif\n        }\n\n        private readonly T _connection;\n        private readonly BaseServerFixture _server;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/Plc/SimulatorNodesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Testing.Fixtures;\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using FluentAssertions;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    /// <summary>\n    /// Tests for the variables defined in the simulator, such\n    /// as fast-changing and trended nodes.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class SimulatorNodesTests<T>\n    {\n        public SimulatorNodesTests(BaseServerFixture server,\n            Func<INodeServices<T>> services, T connection)\n        {\n            _server = server;\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task TelemetryStepUpTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            // need to track the first value encountered b/c the measurement stream starts when\n            // the server starts and it can take several seconds for our test to start\n            uint? firstValue = null;\n            var measurements = new List<object?>();\n            for (var i = 0; i < 10; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 1);\n\n                var value = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=StepUp\"\n                }, ct).ConfigureAwait(false);\n                firstValue ??= (uint?)value?.Value;\n                measurements.Add((uint?)value?.Value);\n            }\n\n            var expectedValues = Enumerable.Range((int)(firstValue ?? 0u), 10)\n                .Select<int, object>(i => (uint)i)\n                .ToList();\n\n            measurements.Should().NotBeEmpty()\n                .And.HaveCount(10)\n                .And.ContainInOrder(expectedValues)\n                .And.ContainItemsAssignableTo<uint>();\n        }\n\n        public async Task TelemetryFastNodeTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            uint? lastValue = null;\n            for (var i = 0; i < 10; i++)\n            {\n                var value = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n                }, ct).ConfigureAwait(false);\n                if (lastValue == null)\n                {\n                    lastValue = (uint?)value?.Value;\n                }\n                else\n                {\n                    Assert.Equal(lastValue + 1, (uint)(value?.Value ?? 0));\n                    lastValue = (uint?)value?.Value;\n                }\n\n                _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1);\n            }\n\n            lastValue++;\n\n            await services.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                ObjectId = Plc.Namespaces.PlcApplications + \"#s=Methods\",\n                MethodId = Plc.Namespaces.PlcApplications + \"#s=StopUpdateFastNodes\"\n            }, ct).ConfigureAwait(false);\n\n            var nextValue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n            Assert.Equal(lastValue, (uint?)nextValue?.Value);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1);\n            nextValue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n            Assert.Equal(lastValue, (uint?)nextValue?.Value);\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1);\n\n            await services.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                ObjectId = Plc.Namespaces.PlcApplications + \"#s=Methods\",\n                MethodId = Plc.Namespaces.PlcApplications + \"#s=StartUpdateFastNodes\"\n            }, ct).ConfigureAwait(false);\n            _server.FireTimersWithPeriod(TimeSpan.FromSeconds(1), 1);\n\n            nextValue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n            Assert.Equal(lastValue + 1, (uint?)nextValue?.Value);\n        }\n\n        public async Task TelemetryContainsOutlierInDipDataAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            const int outlierValue = -1000;\n            var outlierCount = 0;\n            var maxValue = 0d;\n            var minValue = 0d;\n\n            // take 300 measurements, which is enough that at least a few outliers should be present\n            for (var i = 0; i < 300; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 1);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=DipData\"\n                }, ct).ConfigureAwait(false);\n\n                var value = (double?)rawvalue?.Value;\n                if (Math.Round(value ?? 0.0) == outlierValue)\n                {\n                    outlierCount++;\n                }\n                else\n                {\n                    maxValue = Math.Max(maxValue, value ?? double.MaxValue);\n                    minValue = Math.Min(minValue, value ?? 0.0);\n                }\n            }\n\n            maxValue.Should().BeInRange(90, 100,\n                \"measurement data should have a ceiling around 100\");\n            minValue.Should().BeInRange(-100, -90,\n                \"measurement data should have a floor around -100\");\n            outlierCount.Should().BeGreaterThan(0,\n                \"there should be at least a few measurements that were {0}\", outlierValue);\n        }\n\n        public async Task TelemetryContainsOutlierInSpikeDataAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            const int outlierValue = 1000;\n            var outlierCount = 0;\n            var maxValue = 0d;\n            var minValue = 0d;\n\n            // take 300 measurements, which is enough that at least a few outliers should be present\n            for (var i = 0; i < 300; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 1);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=SpikeData\"\n                }, ct).ConfigureAwait(false);\n\n                var value = (double?)rawvalue?.Value;\n                if (Math.Round(value ?? 0.0) == outlierValue)\n                {\n                    outlierCount++;\n                }\n                else\n                {\n                    maxValue = Math.Max(maxValue, value ?? double.MaxValue);\n                    minValue = Math.Min(minValue, value ?? 0.0);\n                }\n            }\n\n            maxValue.Should().BeInRange(90, 100,\n                \"measurement data should have a ceiling around 100\");\n            minValue.Should().BeInRange(-100, -90,\n                \"measurement data should have a floor around -100\");\n            outlierCount.Should().BeGreaterThan(0,\n                \"there should be at least a few measurements that were {0}\", outlierValue);\n        }\n\n        public async Task RandomSignedInt32TelemetryChangesWithPeriodAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            int? lastValue = null;\n            var numberOfValueChanges = 0;\n            for (var i = 0; i < 4; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 1);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=RandomSignedInt32\"\n                }, ct).ConfigureAwait(false);\n                var value = (int?)rawvalue?.Value;\n                if (i > 0 && value?.CompareTo(lastValue) != 0)\n                {\n                    numberOfValueChanges++;\n                }\n                lastValue = value;\n            }\n            numberOfValueChanges.Should().Be(3);\n        }\n\n        public async Task RandomUnsignedInt32TelemetryChangesWithPeriodAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            uint? lastValue = null;\n            var numberOfValueChanges = 0;\n            for (var i = 0; i < 4; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 1);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=RandomUnsignedInt32\"\n                }, ct).ConfigureAwait(false);\n                var value = (uint?)rawvalue?.Value;\n                if (i > 0 && value?.CompareTo(lastValue) != 0)\n                {\n                    numberOfValueChanges++;\n                }\n                lastValue = value;\n            }\n            numberOfValueChanges.Should().Be(3);\n        }\n\n        public async Task AlternatingBooleanTelemetryChangesWithPeriodAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            bool? lastValue = null;\n            var numberOfValueChanges = 0;\n            for (var i = 0; i < 4; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 50);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=AlternatingBoolean\"\n                }, ct).ConfigureAwait(false);\n                var value = (bool?)rawvalue.Value;\n                if (i > 0 && value?.CompareTo(lastValue) != 0)\n                {\n                    numberOfValueChanges++;\n                }\n                lastValue = value;\n            }\n            numberOfValueChanges.Should().Be(3);\n        }\n\n        public async Task NegativeTrendDataTelemetryChangesWithPeriodAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            const uint periodInMilliseconds = 100u;\n            const int invocations = 50;\n            const int rampUpPeriods = kRampUpPeriods;\n            const int numberOfTimes = invocations * rampUpPeriods;\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), numberOfTimes);\n\n            // Measure the value 4 times, sleeping for a third of the period at which the value changes each time.\n            // The number of times the value changes over the 4 measurements should be between 1 and 2.\n            double? lastValue = null;\n            var numberOfValueChanges = 0;\n            for (var i = 0; i < 4; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), invocations);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=NegativeTrendData\"\n                }, ct).ConfigureAwait(false);\n                var value = (double?)rawvalue?.Value;\n                if (i > 0 && value?.CompareTo(lastValue) != 0)\n                {\n                    numberOfValueChanges++;\n                }\n                lastValue = value;\n            }\n            numberOfValueChanges.Should().Be(3);\n        }\n\n        public async Task PositiveTrendDataTelemetryChangesWithPeriodAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            const uint periodInMilliseconds = 100u;\n            const int invocations = 50;\n            const int rampUpPeriods = kRampUpPeriods;\n            const int numberOfTimes = invocations * rampUpPeriods;\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), numberOfTimes);\n\n            double? lastValue = null;\n            var numberOfValueChanges = 0;\n            for (var i = 0; i < 4; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), invocations);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=PositiveTrendData\"\n                }, ct).ConfigureAwait(false);\n                var value = (double?)rawvalue?.Value;\n                if (i > 0 && value?.CompareTo(lastValue) != 0)\n                {\n                    numberOfValueChanges++;\n                }\n                lastValue = value;\n            }\n            numberOfValueChanges.Should().Be(3);\n        }\n\n        public async Task SlowUIntScalar1TelemetryChangesWithPeriodAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            uint? lastValue = null;\n            var numberOfValueChanges = 0;\n            for (var i = 0; i < 4; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(10000), 1);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowUIntScalar1\"\n                }, ct).ConfigureAwait(false);\n                var value = (uint?)rawvalue?.Value;\n                if (i > 0 && value?.CompareTo(lastValue) != 0)\n                {\n                    numberOfValueChanges++;\n                }\n                lastValue = value;\n            }\n            numberOfValueChanges.Should().Be(3);\n        }\n\n        public async Task FastUIntScalar1TelemetryChangesWithPeriodAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            uint? lastValue = null;\n            var numberOfValueChanges = 0;\n            for (var i = 0; i < 4; i++)\n            {\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(1000), 1);\n\n                var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n                }, ct).ConfigureAwait(false);\n                var value = (uint?)rawvalue?.Value;\n                if (i > 0 && value?.CompareTo(lastValue) != 0)\n                {\n                    numberOfValueChanges++;\n                }\n                lastValue = value;\n            }\n            numberOfValueChanges.Should().Be(3);\n        }\n\n        public async Task BadNodeHasAlternatingStatusCodeAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            const uint periodInMilliseconds = 1000u;\n            const int invocations = 1;\n            const int cycles = 15;\n            var values = await AsyncEnumerable.Range(0, cycles)\n                .SelectAwait(async i =>\n                {\n                    _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), invocations);\n                    var value = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                    {\n                        NodeId = Plc.Namespaces.PlcApplications + \"#s=BadFastUIntScalar1\"\n                    }).ConfigureAwait(false);\n                    return (value.ErrorInfo?.StatusCode ?? StatusCodes.Good, value.Value);\n                }).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            var valuesByStatus = values.GroupBy(v => v.Item1).ToDictionary(g => g.Key, g => g.ToList());\n\n            valuesByStatus\n                .Keys.Should().BeEquivalentTo(new[]\n                {\n                    StatusCodes.Good,\n                    StatusCodes.UncertainLastUsableValue,\n                    StatusCodes.BadDataLost,\n                    StatusCodes.BadNoCommunication\n                });\n\n            valuesByStatus\n                .Should().ContainKey(StatusCodes.Good)\n                .WhoseValue\n                .Should().HaveCountGreaterThan(cycles * 5 / 10)\n                .And.OnlyContain(v => v.Value != null);\n\n            valuesByStatus\n                .Should().ContainKey(StatusCodes.UncertainLastUsableValue)\n                .WhoseValue\n                .Should().OnlyContain(v => v.Value != null);\n        }\n\n        public async Task FastLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            const uint periodInMilliseconds = 1000u;\n            var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n            var value1 = (uint?)rawvalue?.Value;\n\n            // Change the value of the NumberOfUpdates control variable to 6.\n            await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastNumberOfUpdates\",\n                Value = 6\n            }, ct).ConfigureAwait(false);\n\n            // Fire the timer 6 times, should increase the value each time.\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), 6);\n            rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n\n            var value2 = (uint?)rawvalue?.Value;\n            value2.Should().Be(value1 + 6);\n\n            // NumberOfUpdates variable should now be 0. The Fast node value should not change anymore.\n            for (var i = 0; i < 10; i++)\n            {\n                rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=FastNumberOfUpdates\"\n                }, ct).ConfigureAwait(false);\n                ((int?)rawvalue?.Value).Should().Be(0);\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), 1);\n                rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n                }, ct).ConfigureAwait(false);\n\n                var value3 = (uint?)rawvalue?.Value;\n                value3.Should().Be(value1 + 6);\n            }\n\n            // Change the value of the NumberOfUpdates control variable to -1.\n            // The Fast node value should now increase indefinitely.\n            await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastNumberOfUpdates\",\n                Value = kNoLimit\n            }, ct).ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), 3);\n            rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n\n            var value4 = (uint?)rawvalue?.Value;\n            value4.Should().Be(value1 + 6 + 3);\n            rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=FastNumberOfUpdates\"\n            }, ct).ConfigureAwait(false);\n            ((int?)rawvalue?.Value).Should().Be(kNoLimit,\n                \"NumberOfUpdates node value should not change when it is {0}\", kNoLimit);\n        }\n\n        public async Task SlowLimitNumberOfUpdatesStopsUpdatingAfterLimitAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            const uint periodInMilliseconds = 10000u;\n            var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n            var value1 = (uint?)rawvalue?.Value;\n\n            // Change the value of the NumberOfUpdates control variable to 6.\n            await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowNumberOfUpdates\",\n                Value = 6\n            }, ct).ConfigureAwait(false);\n\n            // Fire the timer 6 times, should increase the value each time.\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), 6);\n            rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n\n            var value2 = (uint?)rawvalue?.Value;\n            value2.Should().Be(value1 + 6);\n\n            // NumberOfUpdates variable should now be 0. The Fast node value should not change anymore.\n            for (var i = 0; i < 10; i++)\n            {\n                rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowNumberOfUpdates\"\n                }, ct).ConfigureAwait(false);\n                ((int?)rawvalue?.Value).Should().Be(0);\n                _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), 1);\n                rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n                {\n                    NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowUIntScalar1\"\n                }, ct).ConfigureAwait(false);\n\n                var value3 = (uint?)rawvalue?.Value;\n                value3.Should().Be(value1 + 6);\n            }\n\n            // Change the value of the NumberOfUpdates control variable to -1.\n            // The Fast node value should now increase indefinitely.\n            await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowNumberOfUpdates\",\n                Value = kNoLimit\n            }, ct).ConfigureAwait(false);\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(periodInMilliseconds), 3);\n            rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowUIntScalar1\"\n            }, ct).ConfigureAwait(false);\n\n            var value4 = (uint?)rawvalue?.Value;\n            value4.Should().Be(value1 + 6 + 3);\n            rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=SlowNumberOfUpdates\"\n            }, ct).ConfigureAwait(false);\n            ((int?)rawvalue?.Value).Should().Be(kNoLimit,\n                \"NumberOfUpdates node value should not change when it is {0}\", kNoLimit);\n        }\n\n        public async Task PositiveTrendDataNodeHasValueWithTrendAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 50 * kRampUpPeriods);\n\n            var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=PositiveTrendData\"\n            }, ct).ConfigureAwait(false);\n\n            var firstValue = (double?)rawvalue?.Value;\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 50);\n\n            rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=PositiveTrendData\"\n            }, ct).ConfigureAwait(false);\n            var secondValue = (double?)rawvalue?.Value;\n\n            secondValue.Should().BeGreaterThan(firstValue ?? double.MaxValue);\n        }\n\n        public async Task NegativeTrendDataNodeHasValueWithTrendAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 50 * kRampUpPeriods);\n\n            var rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=NegativeTrendData\"\n            }, ct).ConfigureAwait(false);\n\n            var firstValue = (double?)rawvalue?.Value;\n            _server.FireTimersWithPeriod(TimeSpan.FromMilliseconds(100), 50);\n\n            rawvalue = await services.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = Plc.Namespaces.PlcApplications + \"#s=NegativeTrendData\"\n            }, ct).ConfigureAwait(false);\n            var secondValue = (double?)rawvalue?.Value;\n            secondValue.Should().BeLessThan(firstValue ?? 0.0);\n        }\n\n        /// <summary>\n        /// Simulator does not update trended and boolean values in the first few cycles\n        /// (a random number of cycles between 1 and 10)\n        /// </summary>\n        private const int kRampUpPeriods = 10;\n\n        /// <summary>\n        /// Value set for NumberOfUpdates for the simulator to update value indefinitely.\n        /// </summary>\n        private const int kNoLimit = -1;\n        private readonly T _connection;\n        private readonly BaseServerFixture _server;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/SimpleEvents/SimpleEventsServerTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using FluentAssertions;\n    using SimpleEvents;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    /// <summary>\n    /// Simple Events server node tests\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class SimpleEventsServerTests<T>\n    {\n        public SimpleEventsServerTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task CompileSimpleBaseEventQueryTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            var result = await services.CompileQueryAsync(_connection, new QueryCompilationRequestModel\n            {\n                Query = \"select * from BaseEventType\",\n                QueryType = QueryType.Event\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.EventFilter);\n            result.EventFilter.Should().BeEquivalentTo(new EventFilterModel\n            {\n                SelectClauses = new List<SimpleAttributeOperandModel>\n                {\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventType\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventType.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceNode\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceNode.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Time\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Time.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ReceiveTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReceiveTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/LocalTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LocalTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Message\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Message.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Severity\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Severity.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionSubClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionSubClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassName.Value\"\n                    }\n                }\n            });\n        }\n\n        public async Task CompileSimpleEventsQueryTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var result = await services.CompileQueryAsync(_connection, new QueryCompilationRequestModel\n            {\n                Query = \"prefix se <http://opcfoundation.org/SimpleEvents> \" +\n                    $\"select * from se:i={ObjectTypes.SystemCycleStartedEventType} \" +\n                    $\"where oftype se:i={ObjectTypes.SystemCycleStartedEventType}\",\n                QueryType = QueryType.Event\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(result);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.EventFilter);\n            result.EventFilter.Should().BeEquivalentTo(new EventFilterModel\n            {\n                SelectClauses = new List<SimpleAttributeOperandModel>\n                {\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/EventType\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/EventType.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceNode\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceNode.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/SourceName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/SourceName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Time\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Time.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ReceiveTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ReceiveTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/LocalTime\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/LocalTime.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Message\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Message.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/Severity\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Severity.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionSubClassId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"i=2041\",\n                        BrowsePath = new[] { \"/ConditionSubClassName\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/ConditionSubClassName.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"http://opcfoundation.org/SimpleEvents#i=235\",\n                        BrowsePath = new[] { \"/http://opcfoundation.org/SimpleEvents#CycleId\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/CycleId.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"http://opcfoundation.org/SimpleEvents#i=235\",\n                        BrowsePath = new[] { \"/http://opcfoundation.org/SimpleEvents#CurrentStep\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/CurrentStep.Value\"\n                    },\n                    new() {\n                        TypeDefinitionId = \"http://opcfoundation.org/SimpleEvents#i=184\",\n                        BrowsePath = new[] { \"/http://opcfoundation.org/SimpleEvents#Steps\" },\n                        AttributeId = NodeAttribute.Value,\n                        DisplayName = \"/Steps.Value\"\n                    }\n                },\n                WhereClause = new ContentFilterModel\n                {\n                    Elements = new List<ContentFilterElementModel>\n                    {\n                        new() {\n                            FilterOperator = FilterOperatorType.OfType,\n                            FilterOperands = new List<FilterOperandModel>\n                            {\n                                new() {\n                                    Value = \"http://opcfoundation.org/SimpleEvents#i=184\",\n                                    DataType = \"NodeId\"\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n        }\n\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/BrowsePathTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class BrowsePathTests<T>\n    {\n        /// <summary>\n        /// Create browse path tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public BrowsePathTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task NodeBrowsePathStaticScalarMethod3Test1Async(CancellationToken ct = default)\n        {\n            const string nodeId = \"http://test.org/UA/Data/#i=10157\"; // Data\n            var pathElements = new[] {\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#MethodTest\",\n                \"http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowsePathAsync(_connection,\n                new BrowsePathRequestModel\n                {\n                    Header = new RequestHeaderModel\n                    {\n                        Diagnostics = new DiagnosticsModel\n                        {\n                            Level = DiagnosticsLevel.None\n                        }\n                    },\n                    NodeId = nodeId,\n                    BrowsePaths = new List<string[]> { pathElements }\n                }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ErrorInfo);\n            Assert.Collection(results.Targets!, target =>\n            {\n                Assert.Equal(\"http://test.org/UA/Data/#ScalarMethod3\", target.Target.BrowseName);\n                Assert.Equal(\"ScalarMethod3\", target.Target.DisplayName);\n                Assert.Equal(\"http://test.org/UA/Data/#i=10762\", target.Target.NodeId);\n                Assert.Equal(false, target.Target.Children);\n                Assert.Equal(-1, target.RemainingPathIndex);\n            });\n        }\n\n        public async Task NodeBrowsePathStaticScalarMethod3Test2Async(CancellationToken ct = default)\n        {\n            const string nodeId = \"http://test.org/UA/Data/#i=10157\"; // Data\n            var pathElements = new[] {\n                \".http://test.org/UA/Data/#Static\",\n                \".http://test.org/UA/Data/#MethodTest\",\n                \".http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowsePathAsync(_connection,\n                new BrowsePathRequestModel\n                {\n                    Header = new RequestHeaderModel\n                    {\n                        Diagnostics = new DiagnosticsModel\n                        {\n                            Level = DiagnosticsLevel.None\n                        }\n                    },\n                    NodeId = nodeId,\n                    BrowsePaths = new List<string[]> { pathElements }\n                }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ErrorInfo);\n            Assert.Collection(results.Targets!, target =>\n            {\n                Assert.Equal(\"http://test.org/UA/Data/#ScalarMethod3\", target.Target.BrowseName);\n                Assert.Equal(\"ScalarMethod3\", target.Target.DisplayName);\n                Assert.Equal(\"http://test.org/UA/Data/#i=10762\", target.Target.NodeId);\n                Assert.Equal(false, target.Target.Children);\n                Assert.Equal(-1, target.RemainingPathIndex);\n            });\n        }\n\n        public async Task NodeBrowsePathStaticScalarMethod3Test3Async(CancellationToken ct = default)\n        {\n            const string nodeId = \"http://test.org/UA/Data/#i=10157\"; // Data\n            var pathElements = new[] {\n                \"<HasComponent>http://test.org/UA/Data/#Static\",\n                \"<HasComponent>http://test.org/UA/Data/#MethodTest\",\n                \"<HasComponent>http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowsePathAsync(_connection,\n                new BrowsePathRequestModel\n                {\n                    Header = new RequestHeaderModel\n                    {\n                        Diagnostics = new DiagnosticsModel\n                        {\n                            Level = DiagnosticsLevel.None\n                        }\n                    },\n                    NodeId = nodeId,\n                    BrowsePaths = new List<string[]> { pathElements }\n                }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ErrorInfo);\n            Assert.Collection(results.Targets!, target =>\n            {\n                Assert.Equal(\"http://test.org/UA/Data/#ScalarMethod3\", target.Target.BrowseName);\n                Assert.Equal(\"ScalarMethod3\", target.Target.DisplayName);\n                Assert.Equal(\"http://test.org/UA/Data/#i=10762\", target.Target.NodeId);\n                Assert.Equal(false, target.Target.Children);\n                Assert.Equal(-1, target.RemainingPathIndex);\n            });\n        }\n\n        public async Task NodeBrowsePathStaticScalarMethodsTestAsync(CancellationToken ct = default)\n        {\n            const string nodeId = \"http://test.org/UA/Data/#i=10157\"; // Data\n            var pathElements3 = new[] {\n                \".http://test.org/UA/Data/#Static\",\n                \".http://test.org/UA/Data/#MethodTest\",\n                \".http://test.org/UA/Data/#ScalarMethod3\"\n            };\n            var pathElements2 = new[] {\n                \".http://test.org/UA/Data/#Static\",\n                \".http://test.org/UA/Data/#MethodTest\",\n                \".http://test.org/UA/Data/#ScalarMethod2\"\n            };\n\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowsePathAsync(_connection,\n                new BrowsePathRequestModel\n                {\n                    Header = new RequestHeaderModel\n                    {\n                        Diagnostics = new DiagnosticsModel\n                        {\n                            Level = DiagnosticsLevel.None\n                        }\n                    },\n                    NodeId = nodeId,\n                    BrowsePaths = new List<string[]> { pathElements3, pathElements2 }\n                }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ErrorInfo);\n            Assert.Collection(results.Targets!, target =>\n            {\n                Assert.Equal(\"http://test.org/UA/Data/#ScalarMethod3\", target.Target.BrowseName);\n                Assert.Equal(\"ScalarMethod3\", target.Target.DisplayName);\n                Assert.Equal(\"http://test.org/UA/Data/#i=10762\", target.Target.NodeId);\n                Assert.Equal(false, target.Target.Children);\n                Assert.Equal(-1, target.RemainingPathIndex);\n            }, target =>\n            {\n                Assert.Equal(\"http://test.org/UA/Data/#ScalarMethod2\", target.Target.BrowseName);\n                Assert.Equal(\"ScalarMethod2\", target.Target.DisplayName);\n                Assert.Equal(\"http://test.org/UA/Data/#i=10759\", target.Target.NodeId);\n                Assert.Equal(false, target.Target.Children);\n                Assert.Equal(-1, target.RemainingPathIndex);\n            });\n        }\n\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/BrowseServicesTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class BrowseServicesTests<T>\n    {\n        /// <summary>\n        /// Create browse services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public BrowseServicesTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n            _serializer = new DefaultJsonSerializer();\n        }\n\n        public async Task NodeBrowseInRootTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel(), ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(\"i=84\", results.Node.NodeId);\n            Assert.Equal(\"Root\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(\"The root of the server address space.\", results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            // No order anymore in stack\n\n            // Assert.Collection(results.References,\n            //     reference =>\n            //     {\n            //         Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n            //         Assert.Equal(BrowseDirection.Forward, reference.Direction);\n            //         Assert.Equal(\"Objects\", reference.Target.BrowseName);\n            //         Assert.Equal(\"Objects\", reference.Target.DisplayName);\n            //         Assert.Equal(\"i=85\", reference.Target.NodeId);\n            //         Assert.True(reference.Target.Value.IsNull());\n            //         Assert.True(reference.Target.Children);\n            //     },\n            //     reference =>\n            //     {\n            //         Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n            //         Assert.Equal(BrowseDirection.Forward, reference.Direction);\n            //         Assert.Equal(\"Types\", reference.Target.BrowseName);\n            //         Assert.Equal(\"Types\", reference.Target.DisplayName);\n            //         Assert.Equal(\"i=86\", reference.Target.NodeId);\n            //         Assert.True(reference.Target.Value.IsNull());\n            //         Assert.True(reference.Target.Children);\n            //     },\n            //     reference =>\n            //     {\n            //         Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n            //         Assert.Equal(BrowseDirection.Forward, reference.Direction);\n            //         Assert.Equal(\"Views\", reference.Target.BrowseName);\n            //         Assert.Equal(\"Views\", reference.Target.DisplayName);\n            //         Assert.Equal(\"i=87\", reference.Target.NodeId);\n            //         Assert.True(reference.Target.Value.IsNull());\n            //         Assert.False(reference.Target.Children);\n            //     });\n        }\n\n        public async Task NodeBrowseInRootTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                TargetNodesOnly = true,\n                ReadVariableValues = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(\"i=84\", results.Node.NodeId);\n            Assert.Equal(\"Root\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(\"The root of the server address space.\", results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            // No order anymore in stack\n            // Assert.Collection(results.References,\n            //     reference =>\n            //     {\n            //         Assert.Null(reference.ReferenceTypeId);\n            //         Assert.Null(reference.Direction);\n            //         Assert.Equal(\"Objects\", reference.Target.BrowseName);\n            //         Assert.Equal(\"Objects\", reference.Target.DisplayName);\n            //         Assert.Equal(\"i=85\", reference.Target.NodeId);\n            //         Assert.True(reference.Target.Value.IsNull());\n            //         Assert.True(reference.Target.Children);\n            //     },\n            //     reference =>\n            //     {\n            //         Assert.Null(reference.ReferenceTypeId);\n            //         Assert.Null(reference.Direction);\n            //         Assert.Equal(\"Types\", reference.Target.BrowseName);\n            //         Assert.Equal(\"Types\", reference.Target.DisplayName);\n            //         Assert.Equal(\"i=86\", reference.Target.NodeId);\n            //         Assert.True(reference.Target.Value.IsNull());\n            //         Assert.True(reference.Target.Children);\n            //     },\n            //     reference =>\n            //     {\n            //         Assert.Null(reference.ReferenceTypeId);\n            //         Assert.Null(reference.Direction);\n            //         Assert.Equal(\"Views\", reference.Target.BrowseName);\n            //         Assert.Equal(\"Views\", reference.Target.DisplayName);\n            //         Assert.Equal(\"i=87\", reference.Target.NodeId);\n            //         Assert.True(reference.Target.Value.IsNull());\n            //         Assert.False(reference.Target.Children);\n            //     });\n        }\n\n        public async Task NodeBrowseFirstInRootTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseFirstAsync(_connection, new BrowseFirstRequestModel\n            {\n                TargetNodesOnly = false,\n                MaxReferencesToReturn = 1\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(\"i=84\", results.Node.NodeId);\n            Assert.Equal(\"Root\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(\"The root of the server address space.\", results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n\n            Assert.NotNull(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.True(results.References.Count == 1);\n\n            // No order anymore in stack\n            // Assert.Collection(results.References,\n            //   reference =>\n            //   {\n            //       Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n            //       Assert.Equal(BrowseDirection.Forward, reference.Direction);\n            //       Assert.Equal(\"Objects\", reference.Target.BrowseName);\n            //       Assert.Equal(\"Objects\", reference.Target.DisplayName);\n            //       Assert.Equal(\"i=85\", reference.Target.NodeId);\n            //       Assert.True(reference.Target.Children);\n            //   });\n        }\n\n        public async Task NodeBrowseFirstInRootTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseFirstAsync(_connection, new BrowseFirstRequestModel\n            {\n                TargetNodesOnly = false,\n                MaxReferencesToReturn = 2\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(\"i=84\", results.Node.NodeId);\n            Assert.Equal(\"Root\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(\"The root of the server address space.\", results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n\n            Assert.NotNull(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.True(results.References.Count == 2);\n            // No order anymore in stack\n            // Assert.Collection(results.References,\n            //     reference =>\n            //     {\n            //         Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n            //         Assert.Equal(BrowseDirection.Forward, reference.Direction);\n            //         Assert.Equal(\"Objects\", reference.Target.BrowseName);\n            //         Assert.Equal(\"Objects\", reference.Target.DisplayName);\n            //         Assert.Equal(\"i=85\", reference.Target.NodeId);\n            //         Assert.True(reference.Target.Children);\n            //     },\n            //     reference =>\n            //     {\n            //         Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n            //         Assert.Equal(BrowseDirection.Forward, reference.Direction);\n            //         Assert.Equal(\"Types\", reference.Target.BrowseName);\n            //         Assert.Equal(\"Types\", reference.Target.DisplayName);\n            //         Assert.Equal(\"i=86\", reference.Target.NodeId);\n            //         Assert.True(reference.Target.Children);\n            //     });\n        }\n\n        public async Task NodeBrowseBoilersObjectsTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#i=1240\",\n                TargetNodesOnly = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.Node);\n            Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1240\", results.Node.NodeId);\n            Assert.Equal(\"Boilers\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(NodeEventNotifier.SubscribeToEvents, results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"Boiler #1\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1241\",\n                        reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"Boiler #2\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler//Instance#i=1\",\n                        reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseDataAccessObjectsTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"nsu=DataAccess;s=0:TestData/Static\",\n                TargetNodesOnly = false\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n\n            Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", results.Node.NodeId);\n            Assert.Equal(\"Static\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.Null(results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC1001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"FC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC1001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"LC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC1001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"CC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC2001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"FC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC2001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"LC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC2001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"CC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseDataAccessObjectsTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"DataAccess#s=0:TestData/Static\",\n                TargetNodesOnly = false\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n\n            Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", results.Node.NodeId);\n            Assert.Equal(\"Static\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.Null(results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC1001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"FC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC1001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"LC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC1001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"CC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC2001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"FC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC2001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"LC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC2001\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"CC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseDataAccessObjectsTest3Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"nsu=DataAccess;s=0:TestData/Static\",\n                TargetNodesOnly = true,\n                ReadVariableValues = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n\n            Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", results.Node.NodeId);\n            Assert.Equal(\"Static\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.Null(results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC1001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"FC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC1001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"LC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC1001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"CC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC2001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"FC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC2001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"LC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC2001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"CC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseDataAccessObjectsTest4Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"DataAccess#s=0:TestData/Static\",\n                TargetNodesOnly = true,\n                ReadVariableValues = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n\n            Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", results.Node.NodeId);\n            Assert.Equal(\"Static\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.Null(results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC1001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"FC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC1001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"LC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC1001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"CC1001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC1001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC2001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"FC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC2001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"LC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC2001\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"CC2001\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC2001\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseDataAccessFC1001Test1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"nsu=DataAccess;s=1:FC1001\",\n                TargetNodesOnly = false\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n\n            Assert.Equal(\"nsu=DataAccess;s=1:FC1001\", results.Node.NodeId);\n            Assert.Equal(\"FC1001\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.Null(results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Equal(\"i=47\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#SetPoint\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"SetPoint\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001?SetPoint\", reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=47\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#Measurement\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"Measurement\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001?Measurement\", reference.Target.NodeId);\n                    Assert.Equal(\"i=2365\", reference.Target.TypeDefinitionId);\n                    Assert.Equal(\"Float\", reference.Target.DataType);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=47\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#Output\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"Output\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001?Output\", reference.Target.NodeId);\n                    Assert.Equal(\"i=2365\", reference.Target.TypeDefinitionId);\n                    Assert.Equal(\"Float\", reference.Target.DataType);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"i=47\", reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#Status\", reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"Status\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001?Status\", reference.Target.NodeId);\n                    Assert.Equal(\"i=2376\", reference.Target.TypeDefinitionId);\n                    Assert.Equal(\"Int32\", reference.Target.DataType);\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseDataAccessFC1001Test2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"nsu=DataAccess;s=1:FC1001\",\n                TargetNodesOnly = true,\n                ReadVariableValues = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n\n            Assert.Equal(\"nsu=DataAccess;s=1:FC1001\", results.Node.NodeId);\n            Assert.Equal(\"FC1001\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.Null(results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#SetPoint\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"SetPoint\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001?SetPoint\", reference.Target.NodeId);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#Measurement\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"Measurement\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001?Measurement\", reference.Target.NodeId);\n                    Assert.Equal(\"i=2365\", reference.Target.TypeDefinitionId);\n                    Assert.Equal(\"Float\", reference.Target.DataType);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#Output\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"Output\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001?Output\", reference.Target.NodeId);\n                    Assert.Equal(\"i=2365\", reference.Target.TypeDefinitionId);\n                    Assert.Equal(\"Float\", reference.Target.DataType);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#Status\", reference.Target.BrowseName);\n                    Assert.Null(reference.Direction);\n\n                    Assert.Equal(\"Status\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001?Status\", reference.Target.NodeId);\n                    Assert.Equal(\"i=2376\", reference.Target.TypeDefinitionId);\n                    Assert.Equal(\"Int32\", reference.Target.DataType);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseBoilersObjectsTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#i=1240\",\n                TargetNodesOnly = false\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n\n            Assert.NotNull(results.Node);\n            Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1240\", results.Node.NodeId);\n            Assert.Equal(\"Boilers\", results.Node.DisplayName);\n            Assert.Equal(true, results.Node.Children);\n            Assert.Equal(NodeEventNotifier.SubscribeToEvents, results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Contains(results.References,\n                reference =>\n                {\n                    if (reference.ReferenceTypeId != \"i=47\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Equal(\"i=47\", reference.ReferenceTypeId);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#Boiler+%231\",\n                        reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"Boiler #1\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1241\",\n                        reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                    return true;\n                });\n            Assert.Contains(results.References,\n                reference =>\n                {\n                    if (reference.ReferenceTypeId != \"i=48\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Equal(\"i=48\", reference.ReferenceTypeId);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#Boiler+%231\",\n                        reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"Boiler #1\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1241\",\n                        reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                    return true;\n                });\n            Assert.Contains(results.References,\n                reference =>\n                {\n                    if (reference.ReferenceTypeId != \"i=35\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler//Instance#Boiler+%232\",\n                        reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"Boiler #2\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler//Instance#i=1\",\n                        reference.Target.NodeId);\n                    Assert.True(reference.Target.Children);\n                    return true;\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://test.org/UA/Data/#i=10159\",\n                TargetNodesOnly = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ContinuationToken);\n            Assert.Equal(\"http://test.org/UA/Data/#i=10159\", results.Node.NodeId);\n            Assert.Equal(\"Scalar\", results.Node.DisplayName);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.True(results.Node.Children);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10216\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Boolean\", reference.Target.DataType);\n                    Assert.Equal(\"BooleanValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10217\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"SByte\", reference.Target.DataType);\n                    Assert.Equal(\"SByteValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10218\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Byte\", reference.Target.DataType);\n                    Assert.Equal(\"ByteValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10219\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int16\", reference.Target.DataType);\n                    Assert.Equal(\"Int16Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10220\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt16\", reference.Target.DataType);\n                    Assert.Equal(\"UInt16Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10221\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int32\", reference.Target.DataType);\n                    Assert.Equal(\"Int32Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10222\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt32\", reference.Target.DataType);\n                    Assert.Equal(\"UInt32Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10223\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int64\", reference.Target.DataType);\n                    Assert.Equal(\"Int64Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10224\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt64\", reference.Target.DataType);\n                    Assert.Equal(\"UInt64Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10225\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Float\", reference.Target.DataType);\n                    Assert.Equal(\"FloatValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10226\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Double\", reference.Target.DataType);\n                    Assert.Equal(\"DoubleValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10227\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"String\", reference.Target.DataType);\n                    Assert.Equal(\"StringValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10228\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"DateTime\", reference.Target.DataType);\n                    Assert.Equal(\"DateTimeValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10229\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Guid\", reference.Target.DataType);\n                    Assert.Equal(\"GuidValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10230\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ByteString\", reference.Target.DataType);\n                    Assert.Equal(\"ByteStringValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10231\", reference.Target.NodeId);\n                    Assert.Equal(\"XmlElement\", reference.Target.DataType);\n                    Assert.Equal(\"XmlElementValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10232\", reference.Target.NodeId);\n                    Assert.Equal(\"NodeId\", reference.Target.DataType);\n                    Assert.Equal(\"NodeIdValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10233\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ExpandedNodeId\", reference.Target.DataType);\n                    Assert.Equal(\"ExpandedNodeIdValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10234\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"QualifiedName\", reference.Target.DataType);\n                    Assert.Equal(\"QualifiedNameValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10235\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"LocalizedText\", reference.Target.DataType);\n                    Assert.Equal(\"LocalizedTextValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10236\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"StatusCode\", reference.Target.DataType);\n                    Assert.Equal(\"StatusCodeValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10237\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Variant\", reference.Target.DataType);\n                    Assert.Equal(\"VariantValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10238\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Enumeration\", reference.Target.DataType);\n                    Assert.Equal(\"EnumerationValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10239\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ExtensionObject\", reference.Target.DataType);\n                    Assert.Equal(\"StructureValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                }\n                , reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10240\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Number\", reference.Target.DataType);\n                    Assert.Equal(\"NumberValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10241\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Integer\", reference.Target.DataType);\n                    Assert.Equal(\"IntegerValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10242\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInteger\", reference.Target.DataType);\n                    Assert.Equal(\"UIntegerValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10160\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Boolean\", reference.Target.DataType);\n                    Assert.Equal(\"SimulationActive\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(NodeAccessLevel.CurrentRead,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"GenerateValues\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Method, reference.Target.NodeClass);\n                    Assert.True(reference.Target.Executable);\n                    Assert.True(reference.Target.UserExecutable);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10163\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"CycleComplete\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Null(reference.Target.Executable);\n                    Assert.Null(reference.Target.UserExecutable);\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestWithFilter1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://test.org/UA/Data/#i=10159\",\n                TargetNodesOnly = true,\n                NodeClassFilter = new List<NodeClass> {\n                        NodeClass.Method,\n                        NodeClass.Object\n                    }\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ContinuationToken);\n            Assert.Equal(\"http://test.org/UA/Data/#i=10159\", results.Node.NodeId);\n            Assert.Equal(\"Scalar\", results.Node.DisplayName);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.True(results.Node.Children);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"GenerateValues\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Method, reference.Target.NodeClass);\n                    Assert.True(reference.Target.Executable);\n                    Assert.True(reference.Target.UserExecutable);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10163\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"CycleComplete\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Null(reference.Target.Executable);\n                    Assert.Null(reference.Target.UserExecutable);\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestWithFilter2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://test.org/UA/Data/#i=10159\",\n                TargetNodesOnly = true,\n                NodeClassFilter = new List<NodeClass> {\n                        NodeClass.Method\n                    }\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ContinuationToken);\n            Assert.Equal(\"http://test.org/UA/Data/#i=10159\", results.Node.NodeId);\n            Assert.Equal(\"Scalar\", results.Node.DisplayName);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.True(results.Node.Children);\n            Assert.NotNull(results.References);\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"GenerateValues\", reference.Target.DisplayName);\n                    Assert.Equal(NodeClass.Method, reference.Target.NodeClass);\n                    Assert.True(reference.Target.Executable);\n                    Assert.True(reference.Target.UserExecutable);\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseStaticArrayVariablesTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://test.org/UA/Data/#i=10243\",\n                TargetNodesOnly = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ContinuationToken);\n            Assert.Equal(\"http://test.org/UA/Data/#i=10243\", results.Node.NodeId);\n            Assert.Equal(\"Array\", results.Node.DisplayName);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.True(results.Node.Children);\n            Assert.NotNull(results.References);\n            Assert.True(results.References.Count == 30,\n                _serializer.SerializeToString(\n                    results.References.Select(r => r.Target.DisplayName)) + results.ErrorInfo?.ToString());\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10300\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Boolean\", reference.Target.DataType);\n                    Assert.Equal(\"BooleanValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10301\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"SByte\", reference.Target.DataType);\n                    Assert.Equal(\"SByteValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10302\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Byte\", reference.Target.DataType);\n                    Assert.Equal(\"ByteValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10303\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int16\", reference.Target.DataType);\n                    Assert.Equal(\"Int16Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10304\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt16\", reference.Target.DataType);\n                    Assert.Equal(\"UInt16Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10305\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int32\", reference.Target.DataType);\n                    Assert.Equal(\"Int32Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10306\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt32\", reference.Target.DataType);\n                    Assert.Equal(\"UInt32Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10307\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int64\", reference.Target.DataType);\n                    Assert.Equal(\"Int64Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10308\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt64\", reference.Target.DataType);\n                    Assert.Equal(\"UInt64Value\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10309\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Float\", reference.Target.DataType);\n                    Assert.Equal(\"FloatValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10310\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Double\", reference.Target.DataType);\n                    Assert.Equal(\"DoubleValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10311\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"String\", reference.Target.DataType);\n                    Assert.Equal(\"StringValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10312\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"DateTime\", reference.Target.DataType);\n                    Assert.Equal(\"DateTimeValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10313\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Guid\", reference.Target.DataType);\n                    Assert.Equal(\"GuidValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10314\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ByteString\", reference.Target.DataType);\n                    Assert.Equal(\"ByteStringValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10315\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"XmlElement\", reference.Target.DataType);\n                    Assert.Equal(\"XmlElementValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10316\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"NodeId\", reference.Target.DataType);\n                    Assert.Equal(\"NodeIdValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10317\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ExpandedNodeId\", reference.Target.DataType);\n                    Assert.Equal(\"ExpandedNodeIdValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10318\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"QualifiedName\", reference.Target.DataType);\n                    Assert.Equal(\"QualifiedNameValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10319\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"LocalizedText\", reference.Target.DataType);\n                    Assert.Equal(\"LocalizedTextValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10320\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"StatusCode\", reference.Target.DataType);\n                    Assert.Equal(\"StatusCodeValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10321\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Variant\", reference.Target.DataType);\n                    Assert.Equal(\"VariantValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10322\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Enumeration\", reference.Target.DataType);\n                    Assert.Equal(\"EnumerationValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10323\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ExtensionObject\", reference.Target.DataType);\n                    Assert.Equal(\"StructureValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10324\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Number\", reference.Target.DataType);\n                    Assert.Equal(\"NumberValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10325\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Integer\", reference.Target.DataType);\n                    Assert.Equal(\"IntegerValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10326\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInteger\", reference.Target.DataType);\n                    Assert.Equal(\"UIntegerValue\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead | NodeAccessLevel.CurrentWrite,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.OneDimension, reference.Target.ValueRank);\n                    Assert.NotNull(reference.Target.ArrayDimensions);\n                    Assert.Single(reference.Target.ArrayDimensions);\n                    Assert.Equal(0u, reference.Target.ArrayDimensions[0]);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10244\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Boolean\", reference.Target.DataType);\n                    Assert.Equal(\"SimulationActive\", reference.Target.DisplayName);\n                    Assert.Equal(NodeAccessLevel.CurrentRead,\n                        reference.Target.AccessLevel);\n                    Assert.Equal(NodeAccessLevel.CurrentRead,\n                        reference.Target.UserAccessLevel);\n                    Assert.Equal(NodeValueRank.Scalar, reference.Target.ValueRank);\n                    Assert.Null(reference.Target.ArrayDimensions);\n                    Assert.False(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Method, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10245\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"GenerateValues\", reference.Target.DisplayName);\n                    Assert.True(reference.Target.Executable);\n                    Assert.True(reference.Target.UserExecutable);\n                    Assert.True(reference.Target.Children);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10247\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"CycleComplete\", reference.Target.DisplayName);\n                    Assert.Null(reference.Target.Executable);\n                    Assert.Null(reference.Target.UserExecutable);\n                    Assert.True(reference.Target.Children);\n                });\n        }\n\n        public async Task NodeBrowseStaticArrayVariablesWithValuesTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://test.org/UA/Data/#i=10243\",\n                TargetNodesOnly = true,\n                ReadVariableValues = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(results.ContinuationToken);\n            Assert.Equal(\"http://test.org/UA/Data/#i=10243\", results.Node.NodeId);\n            Assert.Equal(\"Array\", results.Node.DisplayName);\n            Assert.Equal(NodeClass.Object, results.Node.NodeClass);\n            Assert.True(results.Node.Children);\n            Assert.NotNull(results.References);\n            Assert.True(results.References.Count == 30,\n                _serializer.SerializeToString(\n                    results.References.Select(r => r.Target.DisplayName)) + results.ErrorInfo?.ToString());\n            Assert.Collection(results.References,\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10300\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Boolean\", reference.Target.DataType);\n                    Assert.Equal(\"BooleanValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10301\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"SByte\", reference.Target.DataType);\n                    Assert.Equal(\"SByteValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10302\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Byte\", reference.Target.DataType);\n                    Assert.Equal(\"ByteValue\", reference.Target.DisplayName);\n                    // Assert.False(reference.Target.Value.IsNull());\n                    if (!reference.Target.Value.IsNull())\n                    {\n                        Assert.True(reference.Target.Value!.IsString);\n                    }\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10303\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int16\", reference.Target.DataType);\n                    Assert.Equal(\"Int16Value\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10304\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt16\", reference.Target.DataType);\n                    Assert.Equal(\"UInt16Value\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10305\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int32\", reference.Target.DataType);\n                    Assert.Equal(\"Int32Value\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10306\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt32\", reference.Target.DataType);\n                    Assert.Equal(\"UInt32Value\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10307\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Int64\", reference.Target.DataType);\n                    Assert.Equal(\"Int64Value\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10308\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"UInt64\", reference.Target.DataType);\n                    Assert.Equal(\"UInt64Value\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10309\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Float\", reference.Target.DataType);\n                    Assert.Equal(\"FloatValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10310\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Double\", reference.Target.DataType);\n                    Assert.Equal(\"DoubleValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10311\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"String\", reference.Target.DataType);\n                    Assert.Equal(\"StringValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10312\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"DateTime\", reference.Target.DataType);\n                    Assert.Equal(\"DateTimeValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10313\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Guid\", reference.Target.DataType);\n                    Assert.Equal(\"GuidValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10314\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ByteString\", reference.Target.DataType);\n                    Assert.Equal(\"ByteStringValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10315\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"XmlElement\", reference.Target.DataType);\n                    Assert.Equal(\"XmlElementValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10316\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"NodeId\", reference.Target.DataType);\n                    Assert.Equal(\"NodeIdValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10317\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ExpandedNodeId\", reference.Target.DataType);\n                    Assert.Equal(\"ExpandedNodeIdValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10318\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"QualifiedName\", reference.Target.DataType);\n                    Assert.Equal(\"QualifiedNameValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10319\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"LocalizedText\", reference.Target.DataType);\n                    Assert.Equal(\"LocalizedTextValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10320\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"StatusCode\", reference.Target.DataType);\n                    Assert.Equal(\"StatusCodeValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10321\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Variant\", reference.Target.DataType);\n                    Assert.Equal(\"VariantValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10322\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Enumeration\", reference.Target.DataType);\n                    Assert.Equal(\"EnumerationValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10323\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"ExtensionObject\", reference.Target.DataType);\n                    Assert.Equal(\"StructureValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsListOfValues);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10324\",\n                        reference.Target.NodeId);\n                    // Assert.Equal(\"Number\", reference.Target.DataType);\n                    Assert.Equal(\"NumberValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    // Assert.True(reference.Target.Value!.IsArray);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10325\",\n                        reference.Target.NodeId);\n                    // Assert.Equal(\"Integer\", reference.Target.DataType);\n                    Assert.Equal(\"IntegerValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    // Assert.True(reference.Target.Value!.IsArray);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10326\",\n                        reference.Target.NodeId);\n                    // Assert.Equal(\"UInteger\", reference.Target.DataType);\n                    Assert.Equal(\"UIntegerValue\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    // Assert.True(reference.Target.Value!.IsArray);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Variable, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10244\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"Boolean\", reference.Target.DataType);\n                    Assert.Equal(\"SimulationActive\", reference.Target.DisplayName);\n                    Assert.False(reference.Target.Value.IsNull());\n                    Assert.True(reference.Target.Value!.IsBoolean);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Method, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10245\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"GenerateValues\", reference.Target.DisplayName);\n                },\n                reference =>\n                {\n                    Assert.Equal(NodeClass.Object, reference.Target.NodeClass);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10247\",\n                        reference.Target.NodeId);\n                    Assert.Equal(\"CycleComplete\", reference.Target.DisplayName);\n                });\n        }\n\n        public async Task NodeBrowseStaticArrayVariablesRawModeTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#i=1240\",\n                NodeIdsOnly = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1240\", results.Node.NodeId);\n            Assert.Null(results.Node.DisplayName);\n            Assert.Null(results.Node.Children);\n            Assert.Null(results.Node.EventNotifier);\n            Assert.Null(results.Node.Description);\n            Assert.Null(results.Node.AccessRestrictions);\n            Assert.Null(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Contains(results.References,\n                reference =>\n                {\n                    if (reference.ReferenceTypeId != \"i=47\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Equal(\"i=47\", reference.ReferenceTypeId);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#Boiler+%231\",\n                        reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1241\",\n                        reference.Target.NodeId);\n                    Assert.NotNull(reference.Target.NodeClass);\n                    Assert.Null(reference.Target.DataType);\n                    Assert.Null(reference.Target.Description);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.Null(reference.Target.Children);\n                    return true;\n                });\n            Assert.Contains(results.References,\n                reference =>\n            {\n                if (reference.ReferenceTypeId != \"i=48\")\n                {\n                    return false;\n                }\n\n                Assert.Equal(\"i=48\", reference.ReferenceTypeId);\n                Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#Boiler+%231\",\n                    reference.Target.BrowseName);\n                Assert.Equal(BrowseDirection.Forward, reference.Direction);\n                Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1241\",\n                    reference.Target.NodeId);\n                Assert.NotNull(reference.Target.NodeClass);\n                Assert.Null(reference.Target.DataType);\n                Assert.Null(reference.Target.Description);\n                Assert.True(reference.Target.Value.IsNull());\n                Assert.Null(reference.Target.Children);\n                return true;\n            });\n            Assert.Contains(results.References,\n                reference =>\n                {\n                    if (reference.ReferenceTypeId != \"i=35\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Equal(\"i=35\", reference.ReferenceTypeId);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler//Instance#Boiler+%232\",\n                        reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Direction);\n\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler//Instance#i=1\",\n                        reference.Target.NodeId);\n                    Assert.NotNull(reference.Target.NodeClass);\n                    Assert.Null(reference.Target.DataType);\n                    Assert.Null(reference.Target.Description);\n                    Assert.True(reference.Target.Value.IsNull());\n                    Assert.Null(reference.Target.Children);\n                    return true;\n                });\n        }\n\n        public async Task NodeBrowseContinuationTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseFirstAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://samples.org/UA/memorybuffer/Instance#s=UInt32\",\n                MaxReferencesToReturn = 5\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            Assert.NotNull(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Equal(5, results.References.Count);\n\n            // Act\n            var results2 = await browser.BrowseNextAsync(_connection, new BrowseNextRequestModel\n            {\n                ContinuationToken = results.ContinuationToken\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results2.ErrorInfo);\n            Assert.NotNull(results2.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Equal(5, results2.References.Count);\n\n            // Act\n            var results3 = await browser.BrowseNextAsync(_connection, new BrowseNextRequestModel\n            {\n                ContinuationToken = results2.ContinuationToken\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results3.ErrorInfo);\n            Assert.NotNull(results3.ContinuationToken);\n            Assert.NotNull(results3.References);\n            Assert.Equal(5, results3.References.Count);\n\n            // Act\n            var results4 = await browser.BrowseNextAsync(_connection, new BrowseNextRequestModel\n            {\n                ContinuationToken = results3.ContinuationToken\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results4.ErrorInfo);\n            Assert.NotNull(results4.ContinuationToken);\n            Assert.NotNull(results4.References);\n            Assert.Equal(5, results4.References.Count);\n        }\n\n        public async Task NodeBrowseContinuationTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseFirstAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://samples.org/UA/memorybuffer/Instance#s=UInt32\",\n                MaxReferencesToReturn = 200\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            Assert.NotNull(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Equal(200, results.References.Count);\n\n            // Act\n            var results2 = await browser.BrowseNextAsync(_connection, new BrowseNextRequestModel\n            {\n                ContinuationToken = results.ContinuationToken\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results2.ErrorInfo);\n            Assert.NotNull(results2.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Equal(200, results2.References.Count);\n        }\n\n        public async Task NodeBrowseContinuationTest3Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseFirstAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://samples.org/UA/memorybuffer/Instance#s=UInt32\",\n                MaxReferencesToReturn = 1,\n                NodeIdsOnly = true\n            }, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Single(results.References);\n        }\n\n        public async Task NodeBrowseContinuationTest4Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const uint maxCount = 500;\n\n            // Act\n            var results = await browser.BrowseFirstAsync(_connection, new BrowseFirstRequestModel\n            {\n                NodeId = \"http://samples.org/UA/memorybuffer/Instance#s=UInt32\",\n                MaxReferencesToReturn = maxCount,\n                Direction = BrowseDirection.Forward,\n                ReadVariableValues = false\n            }, ct).ConfigureAwait(false);\n\n            Assert.Null(results.ErrorInfo);\n            Assert.NotNull(results.ContinuationToken);\n            Assert.NotNull(results.References);\n            Assert.Equal((int)maxCount, results.References.Count);\n\n            var continuationToken = results.ContinuationToken;\n            for (var i = 0; i < 50 && continuationToken != null; i++)  // Ensure test does not run too long\n            {\n                var results2 = await browser.BrowseNextAsync(_connection, new BrowseNextRequestModel\n                {\n                    ContinuationToken = continuationToken\n                }, ct).ConfigureAwait(false);\n\n                Assert.Null(results2.ErrorInfo);\n                Assert.NotNull(results2.References);\n                Assert.True(results2.References.Count > 0 && results2.References.Count <= maxCount);\n                continuationToken = results2.ContinuationToken;\n            }\n        }\n\n        public async Task NodeBrowseDiagnosticsNoneTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.None\n                    }\n                },\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#s=unknown\",\n                TargetNodesOnly = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.ErrorInfo);\n            Assert.Null(results.ErrorInfo.NamespaceUri);\n            Assert.Null(results.ErrorInfo.Locale);\n            Assert.Null(results.ErrorInfo.Inner);\n            Assert.Null(results.ErrorInfo.AdditionalInfo);\n            Assert.Null(results.ErrorInfo.ErrorMessage);\n            Assert.NotNull(results.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, results.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeBrowseDiagnosticsStatusTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeBrowseDiagnosticsStatusTestAsync),\n                        TimeStamp = DateTime.Now,\n                        Level = DiagnosticsLevel.Status\n                    }\n                },\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#s=unknown\",\n                TargetNodesOnly = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.ErrorInfo);\n            Assert.Null(results.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", results.ErrorInfo.Locale);\n            Assert.Equal(\"BadNodeIdUnknown\", results.ErrorInfo.ErrorMessage);\n            Assert.Null(results.ErrorInfo.Inner);\n            Assert.Null(results.ErrorInfo.AdditionalInfo);\n            Assert.NotNull(results.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, results.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeBrowseDiagnosticsInfoTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseFirstRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.Information\n                    }\n                },\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#s=unknown\",\n                TargetNodesOnly = true\n            }, ct: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.ErrorInfo);\n            Assert.Null(results.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", results.ErrorInfo.Locale);\n            Assert.Equal(\"BadNodeIdUnknown\", results.ErrorInfo.ErrorMessage);\n            Assert.Null(results.ErrorInfo.Inner);\n            Assert.Null(results.ErrorInfo.AdditionalInfo);\n            Assert.NotNull(results.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, results.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeBrowseDiagnosticsVerboseTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseFirstAsync(_connection, new BrowseFirstRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.Verbose\n                    }\n                },\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#s=unknown\",\n                TargetNodesOnly = true\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.ErrorInfo);\n            Assert.Null(results.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", results.ErrorInfo.Locale);\n            Assert.Equal(\"BadNodeIdUnknown\", results.ErrorInfo.ErrorMessage);\n            Assert.Null(results.ErrorInfo.Inner);\n            Assert.Null(results.ErrorInfo.AdditionalInfo);\n            Assert.NotNull(results.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, results.ErrorInfo.StatusCode);\n        }\n\n        private readonly T _connection;\n        private readonly IJsonSerializer _serializer;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/BrowseStreamTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class BrowseStreamTests<T>\n    {\n        /// <summary>\n        /// Create browse tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public BrowseStreamTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n            _serializer = new DefaultJsonSerializer();\n        }\n\n        public async Task NodeBrowseInRootTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NoRecurse = true\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Contains(results,\n                node =>\n                {\n                    if (node.Attributes?.DisplayName != \"Root\")\n                    {\n                        return false;\n                    }\n\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"i=84\", node.SourceId);\n                    Assert.Equal(\"Root\", node.Attributes.DisplayName);\n                    Assert.Equal(\"The root of the server address space.\", node.Attributes.Description);\n                    Assert.Null(node.Attributes.AccessRestrictions);\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.Target.DisplayName != \"Objects\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"i=84\", reference.SourceId);\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"Objects\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(\"Objects\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"i=85\", reference.Reference.Target.NodeId);\n                    Assert.True(reference.Reference.Target.Value.IsNull());\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.Target.DisplayName != \"Types\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"i=84\", reference.SourceId);\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"Types\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(\"Types\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"i=86\", reference.Reference.Target.NodeId);\n                    Assert.True(reference.Reference.Target.Value.IsNull());\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.Target.DisplayName != \"Views\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"i=84\", reference.SourceId);\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"Views\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(\"Views\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"i=87\", reference.Reference.Target.NodeId);\n                    Assert.True(reference.Reference.Target.Value.IsNull());\n                    return true;\n                });\n        }\n\n        public async Task NodeBrowseInRootTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NoRecurse = true,\n                Direction = BrowseDirection.Forward,\n                ReadVariableValues = true\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Contains(results,\n                node =>\n                {\n                    if (node.Attributes?.DisplayName != \"Root\")\n                    {\n                        return false;\n                    }\n\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"i=84\", node.SourceId);\n                    Assert.Equal(\"i=84\", node.Attributes.NodeId);\n                    Assert.Equal(\"Root\", node.Attributes.DisplayName);\n                    Assert.Equal(\"The root of the server address space.\", node.Attributes.Description);\n                    Assert.Null(node.Attributes.AccessRestrictions);\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.Target.DisplayName != \"Objects\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"i=84\", reference.SourceId);\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"Objects\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(\"Objects\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"i=85\", reference.Reference.Target.NodeId);\n                    Assert.True(reference.Reference.Target.Value.IsNull());\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.Target.DisplayName != \"Types\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"i=84\", reference.SourceId);\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"Types\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(\"Types\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"i=86\", reference.Reference.Target.NodeId);\n                    Assert.True(reference.Reference.Target.Value.IsNull());\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.Target.DisplayName != \"Views\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"i=84\", reference.SourceId);\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"Views\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(\"Views\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"i=87\", reference.Reference.Target.NodeId);\n                    Assert.True(reference.Reference.Target.Value.IsNull());\n                    return true;\n                });\n        }\n\n        public async Task NodeBrowseBoilersObjectsTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"http://opcfoundation.org/UA/Boiler/#i=1240\" },\n                Direction = BrowseDirection.Forward,\n                NoRecurse = true\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Contains(results,\n                node =>\n                {\n                    if (node.Reference != null)\n                    {\n                        return false;\n                    }\n\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1240\", node.SourceId);\n\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1240\",\n                        node.Attributes.NodeId);\n                    Assert.Equal(\"Boilers\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeEventNotifier.SubscribeToEvents, node.Attributes.EventNotifier);\n                    Assert.Null(node.Attributes.Description);\n                    Assert.Null(node.Attributes.AccessRestrictions);\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.ReferenceTypeId != \"i=47\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1240\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"i=47\", reference.Reference.ReferenceTypeId);\n\n                    Assert.Equal(\"Boiler #1\", reference.Reference.Target.DisplayName);\n                    Assert.Null(reference.Reference.Target.NodeClass);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1241\",\n                        reference.Reference.Target.NodeId);\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.ReferenceTypeId != \"i=48\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1240\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"i=48\", reference.Reference.ReferenceTypeId);\n\n                    Assert.Equal(\"Boiler #1\", reference.Reference.Target.DisplayName);\n                    Assert.Null(reference.Reference.Target.NodeClass);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1241\",\n                        reference.Reference.Target.NodeId);\n                    return true;\n                });\n            Assert.Contains(results,\n                reference =>\n                {\n                    if (reference.Reference?.ReferenceTypeId != \"i=35\")\n                    {\n                        return false;\n                    }\n\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler/#i=1240\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n\n                    Assert.Equal(\"Boiler #2\", reference.Reference.Target.DisplayName);\n                    Assert.Null(reference.Reference.Target.NodeClass);\n                    Assert.Equal(\"http://opcfoundation.org/UA/Boiler//Instance#i=1\",\n                        reference.Reference.Target.NodeId);\n                    return true;\n                });\n        }\n\n        public async Task NodeBrowseDataAccessObjectsTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"nsu=DataAccess;s=0:TestData/Static\" },\n                NoRecurse = true\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n\n            Assert.Collection(results,\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", node.SourceId);\n\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", node.Attributes.NodeId);\n                    Assert.Equal(\"Static\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Object, node.Attributes.NodeClass);\n\n                    Assert.Null(node.Attributes.EventNotifier);\n                    Assert.Null(node.Attributes.Description);\n                    Assert.Null(node.Attributes.AccessRestrictions);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", reference.SourceId);\n\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#TestData\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Backward, reference.Reference.Direction);\n\n                    Assert.Equal(\"TestData\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData\", reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", reference.SourceId);\n\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC1001\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n\n                    Assert.Equal(\"FC1001\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC1001\", reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", reference.SourceId);\n\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC1001\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n\n                    Assert.Equal(\"LC1001\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC1001\", reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", reference.SourceId);\n\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC1001\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n\n                    Assert.Equal(\"CC1001\", reference.Reference.Target.DisplayName);\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC1001\", reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", reference.SourceId);\n\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#FC2001\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n\n                    Assert.Equal(\"FC2001\", reference.Reference.Target.DisplayName);\n\n                    Assert.Equal(\"nsu=DataAccess;s=1:FC2001\", reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", reference.SourceId);\n\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#LC2001\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n\n                    Assert.Equal(\"LC2001\", reference.Reference.Target.DisplayName);\n\n                    Assert.Equal(\"nsu=DataAccess;s=1:LC2001\", reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"nsu=DataAccess;s=0:TestData/Static\", reference.SourceId);\n\n                    Assert.Equal(\"i=35\", reference.Reference.ReferenceTypeId);\n                    Assert.Equal(\"DataAccess#CC2001\", reference.Reference.Target.BrowseName);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n\n                    Assert.Equal(\"CC2001\", reference.Reference.Target.DisplayName);\n\n                    Assert.Equal(\"nsu=DataAccess;s=1:CC2001\", reference.Reference.Target.NodeId);\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"http://test.org/UA/Data/#i=10159\" },\n                NoRecurse = true\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(results,\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.SourceId);\n\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.Attributes.NodeId);\n                    Assert.Equal(\"Scalar\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Object, node.Attributes.NodeClass);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10216\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10217\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10218\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10219\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10220\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10221\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10222\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10223\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10224\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10225\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10226\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10227\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10228\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10229\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10230\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10231\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10232\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10233\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10234\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10235\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10236\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10237\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10238\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10239\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10240\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10241\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10242\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10160\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10163\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10163\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Backward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10158\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Backward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10158\",\n                        reference.Reference.Target.NodeId);\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestWithFilter1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"http://test.org/UA/Data/#i=10159\" },\n                NodeClassFilter = new List<NodeClass> {\n                        NodeClass.Method,\n                        NodeClass.Object\n                    },\n                Direction = BrowseDirection.Forward,\n                NoRecurse = true\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(results,\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.SourceId);\n\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.Attributes.NodeId);\n                    Assert.Equal(\"Scalar\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Object, node.Attributes.NodeClass);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10163\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10163\",\n                        reference.Reference.Target.NodeId);\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestWithFilter2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"http://test.org/UA/Data/#i=10159\" },\n                NodeClassFilter = new List<NodeClass> {\n                        NodeClass.Method\n                    },\n                Direction = BrowseDirection.Forward,\n                NoRecurse = true\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(results,\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.SourceId);\n\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.Attributes.NodeId);\n                    Assert.Equal(\"Scalar\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Object, node.Attributes.NodeClass);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\",\n                        reference.Reference.Target.NodeId);\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestWithFilter3Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"http://test.org/UA/Data/#i=10159\" },\n                NodeClassFilter = new List<NodeClass>\n                {\n                    NodeClass.Method\n                },\n                Direction = BrowseDirection.Forward\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(results,\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.Attributes.NodeId);\n                    Assert.Equal(\"Scalar\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Object, node.Attributes.NodeClass);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\",\n                        reference.Reference.Target.NodeId);\n                },\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=9385\", node.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=9385\", node.Attributes.NodeId);\n                    Assert.Equal(\"GenerateValues\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Method, node.Attributes.NodeClass);\n                },\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"i=47\", node.SourceId);\n                    Assert.Equal(\"i=47\", node.Attributes.NodeId);\n                    Assert.Equal(\"HasComponent\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.ReferenceType, node.Attributes.NodeClass);\n                },\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\", node.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\", node.Attributes.NodeId);\n                    Assert.Equal(\"GenerateValues\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Method, node.Attributes.NodeClass);\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestWithFilter4Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"http://test.org/UA/Data/#i=10159\" },\n                NodeClassFilter = new List<NodeClass>\n                {\n                    NodeClass.Method\n                },\n                Direction = BrowseDirection.Both\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(results,\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.SourceId);\n\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", node.Attributes.NodeId);\n                    Assert.Equal(\"Scalar\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Object, node.Attributes.NodeClass);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10159\", reference.SourceId);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\",\n                        reference.Reference.Target.NodeId);\n                },\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=9385\", node.SourceId);\n\n                    Assert.Equal(\"http://test.org/UA/Data/#i=9385\", node.Attributes.NodeId);\n                    Assert.Equal(\"GenerateValues\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Method, node.Attributes.NodeClass);\n                },\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"i=47\", node.SourceId);\n\n                    Assert.Equal(\"i=47\", node.Attributes.NodeId);\n                    Assert.Equal(\"HasComponent\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.ReferenceType, node.Attributes.NodeClass);\n                },\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\", node.SourceId);\n\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10161\", node.Attributes.NodeId);\n                    Assert.Equal(\"GenerateValues\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Method, node.Attributes.NodeClass);\n                });\n        }\n\n        public async Task NodeBrowseStaticScalarVariablesTestWithFilter5Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"http://test.org/UA/Data/#i=10159\" },\n                NodeClassFilter = new List<NodeClass>\n                {\n                    NodeClass.Method,\n                    NodeClass.Object\n                }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            Assert.Equal(2547, results.Count);\n        }\n\n        public async Task NodeBrowseStaticArrayVariablesTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                NodeIds = new[] { \"http://test.org/UA/Data/#i=10243\" },\n                Direction = BrowseDirection.Forward,\n                NoRecurse = true\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(results,\n                node =>\n                {\n                    Assert.NotNull(node.Attributes);\n                    Assert.Null(node.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", node.SourceId);\n\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", node.Attributes.NodeId);\n                    Assert.Equal(\"Array\", node.Attributes.DisplayName);\n                    Assert.Equal(NodeClass.Object, node.Attributes.NodeClass);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10300\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10301\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10302\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10303\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10304\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10305\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10306\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10307\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10308\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10309\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10310\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10311\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10312\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10313\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10314\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10315\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10316\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10317\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10318\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10319\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10320\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10321\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10322\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10323\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10324\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10325\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10326\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10244\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10245\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10247\",\n                        reference.Reference.Target.NodeId);\n                },\n                reference =>\n                {\n                    Assert.Null(reference.Attributes);\n                    Assert.NotNull(reference.Reference);\n                    Assert.Equal(BrowseDirection.Forward, reference.Reference.Direction);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10243\", reference.SourceId);\n                    Assert.Equal(\"http://test.org/UA/Data/#i=10247\",\n                        reference.Reference.Target.NodeId);\n                });\n        }\n\n        public async Task NodeBrowseDiagnosticsNoneTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.None\n                    }\n                },\n                NodeIds = new[] { \"http://opcfoundation.org/UA/Boiler/#s=unknown\" }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            var result = Assert.Single(results);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Null(result.ErrorInfo.NamespaceUri);\n            Assert.Null(result.ErrorInfo.Locale);\n            Assert.Null(result.ErrorInfo.Inner);\n            Assert.Null(result.ErrorInfo.AdditionalInfo);\n            Assert.Null(result.ErrorInfo.ErrorMessage);\n            Assert.NotNull(result.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, result.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeBrowseDiagnosticsStatusTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeBrowseDiagnosticsStatusTestAsync),\n                        TimeStamp = DateTime.Now,\n                        Level = DiagnosticsLevel.Status\n                    }\n                },\n                NodeIds = new[] { \"http://opcfoundation.org/UA/Boiler/#s=unknown\" }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            var result = Assert.Single(results);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Null(result.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", result.ErrorInfo.Locale);\n            Assert.Equal(\"BadNodeIdUnknown\", result.ErrorInfo.ErrorMessage);\n            Assert.Null(result.ErrorInfo.Inner);\n            Assert.Null(result.ErrorInfo.AdditionalInfo);\n            Assert.NotNull(result.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, result.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeBrowseDiagnosticsInfoTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.Information\n                    }\n                },\n                NodeIds = new[] { \"http://opcfoundation.org/UA/Boiler/#s=unknown\" }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            var result = Assert.Single(results);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Null(result.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", result.ErrorInfo.Locale);\n            Assert.Equal(\"BadNodeIdUnknown\", result.ErrorInfo.ErrorMessage);\n            Assert.Null(result.ErrorInfo.Inner);\n            Assert.Null(result.ErrorInfo.AdditionalInfo);\n            Assert.NotNull(result.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, result.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeBrowseDiagnosticsVerboseTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.BrowseAsync(_connection, new BrowseStreamRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.Verbose\n                    }\n                },\n                NodeIds = new[] { \"http://opcfoundation.org/UA/Boiler/#s=unknown\" }\n            }, ct).ToListAsync(cancellationToken: ct).ConfigureAwait(false);\n\n            // Assert\n            var result = Assert.Single(results);\n\n            // Assert\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Null(result.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", result.ErrorInfo.Locale);\n            Assert.Equal(\"BadNodeIdUnknown\", result.ErrorInfo.ErrorMessage);\n            Assert.Null(result.ErrorInfo.Inner);\n            Assert.Null(result.ErrorInfo.AdditionalInfo);\n            Assert.NotNull(result.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, result.ErrorInfo.StatusCode);\n        }\n\n        private readonly T _connection;\n        private readonly IJsonSerializer _serializer;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/CallArrayMethodTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class CallArrayMethodTests<T>\n    {\n        /// <summary>\n        /// Create node services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"newMetadata\"></param>\n        public CallArrayMethodTests(Func<INodeServices<T>> services, T connection, bool newMetadata = false)\n        {\n            _services = services;\n            _connection = connection;\n            _serializer = new DefaultJsonSerializer();\n            _newMetadata = newMetadata;\n        }\n\n        public async Task NodeMethodMetadataStaticArrayMethod1TestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10765\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            MethodMetadataModel result;\n            if (!_newMetadata)\n            {\n                result = await service.GetMethodMetadataAsync(_connection, new MethodMetadataRequestModel\n                {\n                    MethodId = methodId\n                }, ct).ConfigureAwait(false);\n            }\n            else\n            {\n                var metadata = await service.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n                {\n                    NodeId = methodId\n                }, ct).ConfigureAwait(false);\n                result = metadata.MethodMetadata!;\n            }\n\n            // Assert\n            Assert.Equal(objectId, result.ObjectId);\n            Assert.Collection(result.InputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"BooleanIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Boolean\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Boolean\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"SByteIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"SByte\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"SByte\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ByteIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Byte\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Byte\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int16In\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int16\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int16\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt16In\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt16\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt16\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int32In\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int32\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int32\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt32In\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt32\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt32\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int64In\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int64\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int64\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt64In\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt64\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt64\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"FloatIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Float\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Float\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"DoubleIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Double\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Double\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n            Assert.Collection(result.OutputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"BooleanOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Boolean\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Boolean\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"SByteOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"SByte\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"SByte\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ByteOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Byte\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Byte\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int16Out\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int16\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int16\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt16Out\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt16\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt16\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int32Out\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int32\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int32\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt32Out\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt32\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt32\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int64Out\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int64\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int64\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt64Out\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt64\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt64\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"FloatOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Float\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Float\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"DoubleOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Double\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Double\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n        }\n\n        public async Task NodeMethodMetadataStaticArrayMethod2TestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10768\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            MethodMetadataModel result;\n            if (!_newMetadata)\n            {\n                result = await service.GetMethodMetadataAsync(_connection, new MethodMetadataRequestModel\n                {\n                    MethodId = methodId\n                }, ct).ConfigureAwait(false);\n            }\n            else\n            {\n                var metadata = await service.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n                {\n                    NodeId = methodId\n                }, ct).ConfigureAwait(false);\n                result = metadata.MethodMetadata!;\n            }\n\n            // Assert\n            Assert.Equal(objectId, result.ObjectId);\n            Assert.Collection(result.InputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"StringIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"String\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"String\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"DateTimeIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"DateTime\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"DateTime\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"GuidIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Guid\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Guid\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ByteStringIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ByteString\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"ByteString\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"XmlElementIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"XmlElement\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"XmlElement\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"NodeIdIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"NodeId\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"NodeId\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ExpandedNodeIdIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExpandedNodeId\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"ExpandedNodeId\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"QualifiedNameIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"QualifiedName\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"QualifiedName\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"LocalizedTextIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"LocalizedText\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"LocalizedText\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StatusCodeIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"StatusCode\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"StatusCode\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n            Assert.Collection(result.OutputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"StringOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"String\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"String\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"DateTimeOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"DateTime\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"DateTime\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"GuidOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Guid\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Guid\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ByteStringOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ByteString\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"ByteString\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"XmlElementOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"XmlElement\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"XmlElement\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"NodeIdOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"NodeId\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"NodeId\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ExpandedNodeIdOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExpandedNodeId\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"ExpandedNodeId\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"QualifiedNameOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"QualifiedName\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"QualifiedName\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"LocalizedTextOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"LocalizedText\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"LocalizedText\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StatusCodeOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"StatusCode\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"StatusCode\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n        }\n\n        public async Task NodeMethodMetadataStaticArrayMethod3TestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10771\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            MethodMetadataModel result;\n            if (!_newMetadata)\n            {\n                result = await service.GetMethodMetadataAsync(_connection, new MethodMetadataRequestModel\n                {\n                    MethodId = methodId\n                }, ct).ConfigureAwait(false);\n            }\n            else\n            {\n                var metadata = await service.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n                {\n                    NodeId = methodId\n                }, ct).ConfigureAwait(false);\n                result = metadata.MethodMetadata!;\n            }\n\n            // Assert\n            Assert.Equal(objectId, result!.ObjectId);\n            Assert.Collection(result.InputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"VariantIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Variant\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"BaseDataType\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"EnumerationIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Enumeration\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Enumeration\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StructureIn\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExtensionObject\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Structure\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n            Assert.Collection(result.OutputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"VariantOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Variant\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"BaseDataType\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"EnumerationOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Enumeration\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Enumeration\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StructureOut\", arg.Name);\n                    Assert.Equal(NodeValueRank.OneDimension, arg.ValueRank);\n                    Assert.NotNull(arg.ArrayDimensions);\n                    Assert.Single(arg.ArrayDimensions);\n                    Assert.Equal(0u, arg.ArrayDimensions[0]);\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExtensionObject\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Structure\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod1Test1Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10765\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"boolean\",\n                    Value = _serializer.FromObject(\n                        new bool[] { true, false, true, true, false })\n                },\n                new() {\n                    DataType = \"sbyte\",\n                    Value = _serializer.FromObject(\n                        new sbyte[] { 1, 2, 3, 4, 5, -1, -2, -3 })\n                },\n                new() {\n                    DataType = \"ByteString\",\n                    Value = _serializer.FromObject(\n                        Encoding.UTF8.GetBytes(\"testtesttest\"))\n                },\n                new() {\n                    DataType = \"Int16\",\n                    Value = _serializer.FromObject(\n                        new short[] { short.MinValue, short.MaxValue, 0, 2 })\n                },\n                new() {\n                    DataType = \"UInt16\",\n                    Value = _serializer.FromObject(\n                        new ushort[] { ushort.MinValue, ushort.MaxValue, 0, 2 })\n                },\n                new() {\n                    DataType = \"int32\",\n                    Value = _serializer.FromObject(\n                        new int[] { int.MinValue, int.MaxValue, 0, 2 })\n                },\n                new() {\n                    DataType = \"uInt32\",\n                    Value = _serializer.FromObject(\n                        new uint[] { uint.MinValue, uint.MaxValue, 0, 2 })\n                },\n                new() {\n                    DataType = \"Int64\",\n                    Value = _serializer.FromObject(\n                        new long[] { long.MinValue, long.MaxValue, 0, 2 })\n                },\n                new() {\n                    DataType = \"uint64\",\n                    Value = _serializer.FromObject(\n                        new ulong[] { ulong.MinValue, ulong.MaxValue, 0, 2 })\n                },\n                new() {\n                    DataType = \"float\",\n                    Value = _serializer.FromObject(\n                        new float[] { float.MinValue, float.MaxValue, 0.0f, 2.0f })\n                },\n                new() {\n                    DataType = \"DOUBLE\",\n                    Value = _serializer.FromObject(\n                        new double[] { double.MinValue, double.MaxValue, 0.0, 2.0 })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"Boolean\", \"SByte\", \"ByteString\", \"Int16\", \"UInt16\",\n                \"Int32\", \"UInt32\", \"Int64\", \"UInt64\", \"Float\", \"Double\"\n            }, result.Results.Select(arg => arg.DataType));\n            Assert.Equal(input.Select(arg => arg.Value),\n                result.Results.Select(arg => arg.Value));\n            Assert.All(result.Results.Where(arg => arg.DataType != \"ByteString\"),\n                arg => Assert.True(arg.Value!.IsListOfValues));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod1Test2Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10765\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"boolean\",\n                    Value = _serializer.FromObject(\n                        new bool[] { true, false, true, true, false })\n                },\n                new() {\n                    DataType = \"sbyte\",\n                    Value = _serializer.FromObject(\n                        new sbyte[] { 1, 2, 3, 4, 5, -1, -2, -3 })\n                },\n                new() {\n                    DataType = \"ByteString\",\n                    Value = _serializer.FromObject(\n                        Encoding.UTF8.GetBytes(\"testtesttest\"))\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"Boolean\", \"SByte\", \"ByteString\", \"Int16\", \"UInt16\",\n                \"Int32\", \"UInt32\", \"Int64\", \"UInt64\", \"Float\", \"Double\"\n            }, result.Results.Select(arg => arg.DataType));\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(input[0].Value, arg.Value),\n                arg => Assert.Equal(input[1].Value, arg.Value),\n                arg => Assert.Equal(input[2].Value, arg.Value),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values));\n            Assert.All(result.Results.Where(arg => arg.DataType != \"ByteString\"),\n                arg => Assert.True(arg.Value!.IsListOfValues));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod1Test3Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10765\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"Boolean\", \"SByte\", \"ByteString\", \"Int16\", \"UInt16\",\n                \"Int32\", \"UInt32\", \"Int64\", \"UInt64\", \"Float\", \"Double\"\n            }, result.Results.Select(arg => arg.DataType));\n            Assert.All(result.Results.Where(arg => arg.DataType != \"ByteString\"),\n                arg => Assert.Empty(arg.Value!.Values));\n            Assert.All(result.Results.Where(arg => arg.DataType != \"ByteString\"),\n                arg => Assert.True(arg.Value!.IsListOfValues));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod1Test4Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10765\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel?> {\n                new() {\n                    DataType = \"boolean\",\n                    Value = _serializer.FromObject(\n                        new bool[] { true, false, true, true, false })\n                },\n                new() {\n                    DataType = \"sbyte\",\n                    Value = _serializer.FromObject(\n                        new sbyte[] { 1, 2, 3, 4, 5, -1, -2, -3 })\n                },\n                new() {\n                    DataType = \"byte\",\n                    Value = _serializer.FromObject(\n                        new ushort[] { 0, 1, 2, 3, 4, 5, 6, byte.MaxValue })\n                },\n                null,\n                null,\n                null,\n                null,\n                null,\n                null,\n                null,\n                new() {\n                    DataType = \"DOUBLE\",\n                    Value = _serializer.FromObject(\n                        new double[] { 1234.4567, 23.34, 33 })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"Boolean\", \"SByte\", \"ByteString\", \"Int16\", \"UInt16\",\n                \"Int32\", \"UInt32\", \"Int64\", \"UInt64\", \"Float\", \"Double\"\n            }, result.Results.Select(arg => arg.DataType));\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(input[0]!.Value, arg.Value),\n                arg => Assert.Equal(input[1]!.Value, arg.Value),\n                arg =>\n                {\n                    Assert.Equal(_serializer.FromObject(\n                        new byte[] { 0, 1, 2, 3, 4, 5, 6, byte.MaxValue }),\n                        arg.Value);\n                },\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Equal(input[10]!.Value, arg.Value));\n            Assert.All(result.Results.Where(arg => arg.DataType != \"ByteString\"),\n                arg => Assert.True(arg.Value!.IsListOfValues));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod1Test5Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10765\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"boolean\",\n                    Value = _serializer.FromObject(Array.Empty<bool>())\n                },\n                new() {\n                    DataType = \"sbyte\",\n                    Value = _serializer.FromObject(Array.Empty<sbyte>())\n                },\n                new() {\n                    DataType = \"Byte\",\n                    Value = _serializer.FromObject(\"[]\")\n                },\n                new() {\n                    DataType = \"Int16\",\n                    Value = _serializer.FromObject(Array.Empty<short>())\n                },\n                new() {\n                    DataType = \"UInt16\",\n                    Value = _serializer.FromObject(Array.Empty<ushort>())\n                },\n                new() {\n                    DataType = \"int32\",\n                    Value = _serializer.FromObject(Array.Empty<int>())\n                },\n                new() {\n                    DataType = \"uInt32\",\n                    Value = _serializer.FromObject(Array.Empty<uint>())\n                },\n                new() {\n                    DataType = \"Int64\",\n                    Value = _serializer.FromObject(Array.Empty<long>())\n                },\n                new() {\n                    DataType = \"uint64\",\n                    Value = _serializer.FromObject(Array.Empty<ulong>())\n                },\n                new() {\n                    DataType = \"float\",\n                    Value = _serializer.FromObject(Array.Empty<float>())\n                },\n                new() {\n                    DataType = \"DOUBLE\",\n                    Value = _serializer.FromObject(Array.Empty<double>())\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"Boolean\", \"SByte\", \"ByteString\", \"Int16\", \"UInt16\",\n                \"Int32\", \"UInt32\", \"Int64\", \"UInt64\", \"Float\", \"Double\"\n            }, result.Results.Select(arg => arg.DataType));\n            Assert.All(result.Results.Where(arg => arg.DataType != \"ByteString\"),\n                arg => Assert.True(arg.Value!.IsListOfValues));\n            Assert.Collection(result.Results,\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.True(arg.Value.IsNull()),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Empty(arg.Value!.Values),\n                arg => Assert.Equal(input[10].Value, arg.Value));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod2Test1Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10768\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"String\",\n                    Value = _serializer.FromObject(new string[] {\n                        \"!adfasdfsdf!\",\n                        \"!46!\",\n                        \"!asdf!\",\n                        \"!adfasdfsdf!\",\n                        \"sfdgsfdgs\",\n                        \"ÜÖÄ\"\n                    })\n                },\n                new() {\n                    DataType = \"DateTime\",\n                    Value = _serializer.FromObject(new DateTime[] {\n                        DateTime.UtcNow,\n                        DateTime.UtcNow,\n                        DateTime.UtcNow,\n                        DateTime.UtcNow\n                    })\n                },\n                new() {\n                    DataType = \"Guid\",\n                    Value = _serializer.FromObject(new Guid[] {\n                        Guid.NewGuid(),\n                        Guid.NewGuid(),\n                        Guid.NewGuid(),\n                        Guid.NewGuid(),\n                        Guid.NewGuid(),\n                        Guid.NewGuid()\n                    })\n                },\n                new() {\n                    DataType = \"ByteString\",\n                    Value = _serializer.FromObject(new byte[][] {\n                        Encoding.UTF8.GetBytes(\"!adfasdfsdf!\"),\n                        Encoding.UTF8.GetBytes(\"!46!\"),\n                        Encoding.UTF8.GetBytes(\"!asdf!\"),\n                        Encoding.UTF8.GetBytes(\"!adfasdfsdf!\"),\n                        Encoding.UTF8.GetBytes(\"sfdgsfdgs\"),\n                        Encoding.UTF8.GetBytes(\"ÜÖÄ\")\n                    })\n                },\n                new() {\n                    DataType = \"XmlElement\",\n                    Value = _serializer.FromObject(Array.Empty<System.Xml.XmlElement>())\n                },\n                new() {\n                    DataType = \"NodeId\",\n                    Value = _serializer.FromObject(new string[]{\n                        \"byte\",\n                        \"http://test.org/#i=23534\",\n                        \"http://muh.test/#s=35645\",\n                        \"http://test.org/test/#i=354\"\n                    })\n                },\n                new() {\n                    DataType = \"ExpandedNodeId\",\n                    Value = _serializer.FromObject(new string[] {\n                        \"byte\",\n                        \"http://test.org/#i=23534\",\n                        \"http://muh.test/#s=35645\",\n                        \"http://test.org/test/#i=354\"\n                    })\n                },\n                new() {\n                    DataType = \"QualifiedName\",\n                    Value = _serializer.FromObject(new string[] {\n                        \"http://test.org/#qn1\",\n                        \"http://test.org/#qn2\",\n                        \"http://test.org/#qn3\",\n                        \"test\"\n                    })\n                },\n                new() {\n                    DataType = \"LocalizedText\",\n                    Value = _serializer.FromObject(new object[] {\n                        new {\n                            Text = \"Hällö\",\n                            Locale = \"de\"\n                        },\n                        new {\n                            Text = \"Hallo\"\n                        },\n                        new {\n                            Text = \"Hello\",\n                            Locale = \"en\"\n                        }\n                    })\n                },\n                new() {\n                    DataType = \"StatusCode\",\n                    Value = _serializer.FromObject(new object[] {\n                        new {\n                            Symbol = \"BadEndOfStream\",\n                            Code = 0x80B00000\n                        },\n                        new {\n                            Symbol = \"BadWaitingForResponse\",\n                            Code = 0x80B20000\n                        },\n                        new {\n                            Symbol = \"BadOperationAbandoned\",\n                            Code = 0x80B30000\n                        }\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"String\", \"DateTime\", \"Guid\", \"ByteString\",\n                \"XmlElement\", \"NodeId\", \"ExpandedNodeId\",\n                \"QualifiedName\",\"LocalizedText\",\"StatusCode\" },\n                result.Results.Select(arg => arg.DataType));\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(input[0].Value, arg.Value),\n                arg => Assert.Equal(input[1].Value, arg.Value),\n                arg => Assert.Equal(input[2].Value, arg.Value),\n                arg => Assert.Equal(input[3].Value, arg.Value),\n                arg => Assert.Equal(input[4].Value, arg.Value),\n                arg => Assert.Equal(input[5].Value, arg.Value),\n                arg => Assert.Equal(input[6].Value, arg.Value),\n                arg => Assert.Equal(input[7].Value, arg.Value),\n                arg => Assert.Equal(input[8].Value, arg.Value),\n                arg => Assert.Equal(input[9].Value, arg.Value));\n            Assert.All(result.Results, arg => Assert.True(arg.Value!.IsListOfValues));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod2Test2Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10768\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"String\", \"DateTime\", \"Guid\", \"ByteString\",\n                \"XmlElement\", \"NodeId\", \"ExpandedNodeId\",\n                \"QualifiedName\",\"LocalizedText\",\"StatusCode\" },\n                result.Results.Select(arg => arg.DataType));\n            Assert.All(result.Results, arg => Assert.True(arg.Value!.IsListOfValues));\n            Assert.All(result.Results, arg => Assert.Empty(arg.Value!.Values));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod2Test3Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10768\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel?> {\n                null,\n                null,\n                null,\n                null,\n                null,\n                null,\n                null,\n                null,\n                new() {\n                    DataType = \"LocalizedText\",\n                    Value = _serializer.FromObject(new string[] {\n                        \"unloc1\",\n                        \"unloc2\",\n                        \"unloc3\"\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"String\", \"DateTime\", \"Guid\", \"ByteString\",\n                \"XmlElement\", \"NodeId\", \"ExpandedNodeId\",\n                \"QualifiedName\",\"LocalizedText\",\"StatusCode\" },\n                result.Results.Select(arg => arg.DataType));\n            Assert.NotNull(result.Results);\n            Assert.All(result.Results, arg => Assert.True(arg.Value!.IsListOfValues));\n            Assert.NotNull(result.Results[8].Value);\n            Assert.Equal(3, result.Results[8].Value!.Count);\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod2Test4Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10768\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"String\",\n                    Value = _serializer.FromObject(Array.Empty<string>())\n                },\n                new() {\n                    DataType = \"DateTime\",\n                    Value = _serializer.FromObject(Array.Empty<DateTime>())\n                },\n                new() {\n                    DataType = \"Guid\",\n                    Value = _serializer.FromObject(Array.Empty<Guid>())\n                },\n                new() {\n                    DataType = \"ByteString\",\n                    Value = _serializer.FromObject(new byte[0,0])\n                },\n                new() {\n                    DataType = \"XmlElement\",\n                    Value = _serializer.FromObject(Array.Empty<System.Xml.XmlElement>())\n                },\n                new() {\n                    DataType = \"NodeId\",\n                    Value = _serializer.FromObject(Array.Empty<string>())\n                },\n                new() {\n                    DataType = \"ExpandedNodeId\",\n                    Value = _serializer.FromObject(Array.Empty<string>())\n                },\n                new() {\n                    DataType = \"QualifiedName\",\n                    Value = _serializer.FromObject(Array.Empty<string>())\n                },\n                new() {\n                    DataType = \"LocalizedText\",\n                    Value = _serializer.FromObject(Array.Empty<object>())\n                },\n                new() {\n                    DataType = \"StatusCode\",\n                    Value = _serializer.FromObject(Array.Empty<int>())\n                }\n            };\n#pragma warning restore CA1814 // Prefer jagged arrays over multidimensional\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"String\", \"DateTime\", \"Guid\", \"ByteString\",\n                \"XmlElement\", \"NodeId\", \"ExpandedNodeId\",\n                \"QualifiedName\", \"LocalizedText\", \"StatusCode\" },\n                result.Results.Select(arg => arg.DataType));\n            Assert.Equal(input.Select(arg => arg.Value),\n                result.Results.Select(arg => arg.Value));\n            Assert.All(result.Results, arg => Assert.True(arg.Value!.IsListOfValues));\n            Assert.All(result.Results, arg => Assert.Empty(arg.Value!.Values));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod3Test1Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10771\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"Variant\",\n                    Value = _serializer.FromArray()\n                },\n                new() {\n                    DataType = \"Enumeration\",\n                    Value = _serializer.FromArray()\n                },\n                new() {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromArray()\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"Variant\", \"Int32\", \"ExtensionObject\"\n            }, result.Results.Select(arg => arg.DataType));\n            Assert.Equal(input.Select(arg => arg.Value),\n                result.Results.Select(arg => arg.Value));\n            Assert.All(result.Results, arg => Assert.True(arg.Value!.IsListOfValues));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod3Test2Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10771\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    Value = _serializer.FromObject(new object[] {\n                        new {\n                            Type = \"UInt32\",\n                            Body = 500000\n                        },\n                        new {\n                            Type = \"String\",\n                            Body = \"test\"\n                        },\n                        new {\n                            Type = \"Float\",\n                            Body = 0.3f\n                        },\n                        new {\n                            Type = \"Byte\",\n                            Body = 50\n                        }\n                    })\n                },\n                new() {\n                    DataType = \"int32\",\n                    Value = _serializer.FromObject(new int[] { 1, 2, 3, 4, 5, 6 })\n                },\n                new() {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromObject(new object[] {\n                        new {\n                            TypeId = \"http://test.org/#s=test2\",\n                            Body = new Opc.Ua.Argument(\"test1\", Opc.Ua.DataTypes.String, -1, \"desc1\")\n                                .AsBinary(Opc.Ua.ServiceMessageContext.GlobalContext)\n                        },\n                        new {\n                            TypeId = \"http://test.org/#s=test55\",\n                            Encoding = \"Xml\",\n                            Body = new Opc.Ua.Argument(\"test2\", Opc.Ua.DataTypes.String, -2, \"desc1\")\n                                .AsXmlElement(Opc.Ua.ServiceMessageContext.GlobalContext)\n                        }\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"Variant\", \"Int32\", \"ExtensionObject\"\n            }, result.Results.Select(arg => arg.DataType));\n            Assert.All(result.Results, arg => Assert.True(arg.Value!.IsListOfValues));\n        }\n\n        public async Task NodeMethodCallStaticArrayMethod3Test3Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10771\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Equal(new List<string> {\n                \"Variant\", \"Int32\", \"ExtensionObject\"\n            }, result.Results.Select(arg => arg.DataType));\n            Assert.All(result.Results, arg => Assert.True(arg.Value!.IsListOfValues));\n            Assert.All(result.Results, arg => Assert.Empty(arg.Value!.Values));\n        }\n\n        private readonly bool _newMetadata;\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n        private readonly DefaultJsonSerializer _serializer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/CallScalarMethodTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using MemoryBuffer;\n    using Opc.Ua.Extensions;\n    using System;\n    using System.Collections.Generic;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using System.Xml;\n    using Xunit;\n\n    public class CallScalarMethodTests<T>\n    {\n        /// <summary>\n        /// Create node services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"newMetadata\"></param>\n        public CallScalarMethodTests(Func<INodeServices<T>> services, T connection, bool newMetadata = false)\n        {\n            _services = services;\n            _connection = connection;\n            _serializer = new DefaultJsonSerializer();\n            _newMetadata = newMetadata;\n        }\n\n        public async Task NodeMethodMetadataStaticScalarMethod1TestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10756\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            MethodMetadataModel result;\n            if (!_newMetadata)\n            {\n                result = await service.GetMethodMetadataAsync(_connection, new MethodMetadataRequestModel\n                {\n                    MethodId = methodId\n                }, ct).ConfigureAwait(false);\n            }\n            else\n            {\n                var metadata = await service.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n                {\n                    NodeId = methodId\n                }, ct).ConfigureAwait(false);\n                result = metadata.MethodMetadata!;\n            }\n\n            // Assert\n            Assert.Equal(objectId, result.ObjectId);\n            Assert.Collection(result.InputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"BooleanIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Boolean\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Boolean\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"SByteIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"SByte\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"SByte\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ByteIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Byte\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Byte\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int16In\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int16\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int16\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt16In\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt16\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt16\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int32In\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int32\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int32\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt32In\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt32\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt32\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int64In\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int64\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int64\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt64In\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt64\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt64\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"FloatIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Float\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Float\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"DoubleIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Double\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Double\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n            Assert.Collection(result.OutputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"BooleanOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Boolean\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Boolean\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"SByteOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"SByte\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"SByte\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ByteOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Byte\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Byte\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int16Out\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int16\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int16\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt16Out\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt16\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt16\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int32Out\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int32\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int32\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt32Out\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt32\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt32\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Int64Out\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Int64\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Int64\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"UInt64Out\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"UInt64\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"UInt64\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"FloatOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Float\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Float\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"DoubleOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Double\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Double\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n        }\n\n        public async Task NodeMethodMetadataStaticScalarMethod2TestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10759\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            MethodMetadataModel result;\n            if (!_newMetadata)\n            {\n                result = await service.GetMethodMetadataAsync(_connection, new MethodMetadataRequestModel\n                {\n                    MethodId = methodId\n                }, ct).ConfigureAwait(false);\n            }\n            else\n            {\n                var metadata = await service.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n                {\n                    NodeId = methodId\n                }, ct).ConfigureAwait(false);\n                result = metadata.MethodMetadata!;\n            }\n\n            // Assert\n            Assert.Equal(objectId, result.ObjectId);\n            Assert.Collection(result.InputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"StringIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"String\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"String\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"DateTimeIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"DateTime\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"DateTime\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"GuidIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Guid\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Guid\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ByteStringIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ByteString\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"ByteString\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"XmlElementIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"XmlElement\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"XmlElement\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"NodeIdIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"NodeId\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"NodeId\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ExpandedNodeIdIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExpandedNodeId\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"ExpandedNodeId\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"QualifiedNameIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"QualifiedName\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"QualifiedName\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"LocalizedTextIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"LocalizedText\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"LocalizedText\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StatusCodeIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"StatusCode\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"StatusCode\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n            Assert.Collection(result.OutputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"StringOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"String\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"String\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"DateTimeOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"DateTime\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"DateTime\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"GuidOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Guid\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Guid\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ByteStringOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ByteString\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"ByteString\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"XmlElementOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"XmlElement\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"XmlElement\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"NodeIdOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"NodeId\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"NodeId\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"ExpandedNodeIdOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExpandedNodeId\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"ExpandedNodeId\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"QualifiedNameOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"QualifiedName\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"QualifiedName\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"LocalizedTextOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"LocalizedText\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"LocalizedText\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StatusCodeOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"StatusCode\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"StatusCode\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n        }\n\n        public async Task NodeMethodMetadataStaticScalarMethod3TestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10762\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            MethodMetadataModel result;\n            if (!_newMetadata)\n            {\n                result = await service.GetMethodMetadataAsync(_connection, new MethodMetadataRequestModel\n                {\n                    MethodId = methodId\n                }, ct).ConfigureAwait(false);\n            }\n            else\n            {\n                var metadata = await service.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n                {\n                    NodeId = methodId\n                }, ct).ConfigureAwait(false);\n                result = metadata.MethodMetadata!;\n            }\n\n            // Assert\n            Assert.Equal(objectId, result.ObjectId);\n            Assert.Collection(result.InputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"VariantIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Variant\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"BaseDataType\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"EnumerationIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Enumeration\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Enumeration\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StructureIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExtensionObject\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Structure\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n            Assert.Collection(result.OutputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"VariantOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Variant\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"BaseDataType\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"EnumerationOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Enumeration\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Enumeration\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StructureOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExtensionObject\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Structure\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n        }\n\n        public async Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest1Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n            var path = new[] {\n                \".http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            // Act\n            MethodMetadataModel result;\n            if (!_newMetadata)\n            {\n                result = await service.GetMethodMetadataAsync(_connection, new MethodMetadataRequestModel\n                {\n                    MethodId = objectId,\n                    MethodBrowsePath = path\n                }, ct).ConfigureAwait(false);\n            }\n            else\n            {\n                var metadata = await service.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n                {\n                    NodeId = objectId,\n                    BrowsePath = path\n                }, ct).ConfigureAwait(false);\n                result = metadata.MethodMetadata!;\n            }\n\n            // Assert\n            Assert.Equal(objectId, result.ObjectId);\n            Assert.Collection(result.InputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"VariantIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Variant\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"BaseDataType\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"EnumerationIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Enumeration\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Enumeration\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StructureIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExtensionObject\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Structure\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n            Assert.Collection(result.OutputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"VariantOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Variant\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"BaseDataType\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"EnumerationOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Enumeration\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Enumeration\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StructureOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExtensionObject\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Structure\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n        }\n\n        public async Task NodeMethodMetadataStaticScalarMethod3WithBrowsePathTest2Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            var path = new[] {\n                \"Objects\",\n                \"http://test.org/UA/Data/#Data\",\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#MethodTest\",\n                \"http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            // Act\n            MethodMetadataModel result;\n            if (!_newMetadata)\n            {\n                result = await service.GetMethodMetadataAsync(_connection, new MethodMetadataRequestModel\n                {\n                    MethodBrowsePath = path\n                }, ct).ConfigureAwait(false);\n            }\n            else\n            {\n                var metadata = await service.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n                {\n                    BrowsePath = path\n                }, ct).ConfigureAwait(false);\n                result = metadata.MethodMetadata!;\n            }\n\n            // Assert\n            Assert.Equal(\"http://test.org/UA/Data/#i=10755\", result.ObjectId);\n            Assert.Collection(result.InputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"VariantIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Variant\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"BaseDataType\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"EnumerationIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Enumeration\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Enumeration\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StructureIn\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExtensionObject\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Structure\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n            Assert.Collection(result.OutputArguments!,\n                arg =>\n                {\n                    Assert.Equal(\"VariantOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Variant\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"BaseDataType\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"EnumerationOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"Enumeration\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Enumeration\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                },\n                arg =>\n                {\n                    Assert.Equal(\"StructureOut\", arg.Name);\n                    Assert.Null(arg.ValueRank);\n                    Assert.Equal(\"[]\", _serializer.SerializeToString(arg.ArrayDimensions));\n                    Assert.Equal(NodeClass.DataType, arg.Type.NodeClass);\n                    Assert.Equal(\"ExtensionObject\", arg.Type.NodeId);\n                    Assert.Null(arg.Type.DataType);\n                    Assert.Equal(\"Structure\", arg.Type.DisplayName);\n                    Assert.True(arg.DefaultValue.IsNull());\n                });\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod1Test1Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10756\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"boolean\",\n                    Value = true\n                },\n                new() {\n                    DataType = \"sbyte\",\n                    Value = -1\n                },\n                new() {\n                    DataType = \"byte\",\n                    Value = 244\n                },\n                new() {\n                    DataType = \"Int16\",\n                    Value = short.MinValue\n                },\n                new() {\n                    DataType = \"UInt16\",\n                    Value = 0\n                },\n                new() {\n                    DataType = \"int32\",\n                    Value = int.MinValue\n                },\n                new() {\n                    DataType = \"uInt32\",\n                    Value = uint.MaxValue\n                },\n                new() {\n                    DataType = \"Int64\",\n                    Value = -55555\n                },\n                new() {\n                    DataType = \"uint64\",\n                    Value = 55555\n                },\n                new() {\n                    DataType = \"float\",\n                    Value = 12.898345f\n                },\n                new() {\n                    DataType = \"DOUBLE\",\n                    Value = 1234.4567\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.True((bool)arg.Value!),\n                arg => Assert.Equal((sbyte)input[1]!.Value!, (sbyte)arg.Value!),\n                arg => Assert.Equal((byte)input[2]!.Value!, (byte)arg.Value!),\n                arg => Assert.Equal(short.MinValue, (short)arg.Value!),\n                arg => Assert.Equal((ushort)0, (ushort)arg.Value!),\n                arg => Assert.Equal(int.MinValue, (int)arg.Value!),\n                arg => Assert.Equal(uint.MaxValue, (uint)arg.Value!),\n                arg => Assert.Equal((long)input[7]!.Value!, (long)arg.Value!),\n                arg => Assert.Equal((ulong)input[8]!.Value!, (ulong)arg.Value!),\n                arg => Assert.Equal((float)input[9]!.Value!, (float)arg.Value!),\n                arg => Assert.Equal((double)input[10]!.Value!, (double)arg.Value!));\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod1Test2Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10756\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"boolean\",\n                    Value = false\n                },\n                new() {\n                    DataType = \"sbyte\",\n                    Value = -100\n                },\n                new() {\n                    DataType = \"byte\",\n                    Value = 100\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.False((bool)arg.Value!),\n                arg => Assert.Equal((sbyte)input[1]!.Value!, (sbyte)arg.Value!),\n                arg => Assert.Equal((byte)input[2]!.Value!, (byte)arg.Value!),\n                arg => Assert.Equal((short)0, (short)arg.Value!),\n                arg => Assert.Equal((ushort)0, (ushort)arg.Value!),\n                arg => Assert.Equal(0, (int)arg.Value!),\n                arg => Assert.Equal((uint)0, (uint)arg.Value!),\n                arg => Assert.Equal(0, (long)arg.Value!),\n                arg => Assert.Equal((ulong)0, (ulong)arg.Value!),\n                arg => Assert.Equal(0, (float)arg.Value!),\n                arg => Assert.Equal(0, (double)arg.Value!));\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod1Test3Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10756\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.False((bool)arg.Value!),\n                arg => Assert.Equal((sbyte)0, (sbyte)arg.Value!),\n                arg => Assert.Equal((byte)0, (byte)arg.Value!),\n                arg => Assert.Equal((short)0, (short)arg.Value!),\n                arg => Assert.Equal((ushort)0, (ushort)arg.Value!),\n                arg => Assert.Equal(0, (int)arg.Value!),\n                arg => Assert.Equal((uint)0, (uint)arg.Value!),\n                arg => Assert.Equal(0, (long)arg.Value!),\n                arg => Assert.Equal((ulong)0, (ulong)arg.Value!),\n                arg => Assert.Equal(0, (float)arg.Value!),\n                arg => Assert.Equal(0, (double)arg.Value!));\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod1Test4Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10756\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = new List<MethodCallArgumentModel>()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.False((bool)arg.Value!),\n                arg => Assert.Equal((sbyte)0, (sbyte)arg.Value!),\n                arg => Assert.Equal((byte)0, (byte)arg.Value!),\n                arg => Assert.Equal((short)0, (short)arg.Value!),\n                arg => Assert.Equal((ushort)0, (ushort)arg.Value!),\n                arg => Assert.Equal(0, (int)arg.Value!),\n                arg => Assert.Equal((uint)0, (uint)arg.Value!),\n                arg => Assert.Equal(0, (long)arg.Value!),\n                arg => Assert.Equal((ulong)0, (ulong)arg.Value!),\n                arg => Assert.Equal(0, (float)arg.Value!),\n                arg => Assert.Equal(0, (double)arg.Value!));\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod1Test5Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10756\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel?> {\n                new() {\n                    DataType = \"boolean\",\n                    Value = true\n                },\n                new() {\n                    DataType = \"sbyte\",\n                    Value = -1\n                },\n                new() {\n                    DataType = \"byte\",\n                    Value = 244\n                },\n                null,\n                null,\n                null,\n                null,\n                null,\n                null,\n                null,\n                new() {\n                    DataType = \"DOUBLE\",\n                    Value = 1234.4567\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.True((bool)arg.Value!),\n                arg => Assert.Equal((sbyte)input[1]!.Value!, (sbyte)arg.Value!),\n                arg => Assert.Equal((byte)input[2]!.Value!, (byte)arg.Value!),\n                arg => Assert.Equal((short)0, (short)arg.Value!),\n                arg => Assert.Equal((ushort)0, (ushort)arg.Value!),\n                arg => Assert.Equal(0, (int)arg.Value!),\n                arg => Assert.Equal((uint)0, (uint)arg.Value!),\n                arg => Assert.Equal(0, (long)arg.Value!),\n                arg => Assert.Equal((ulong)0, (ulong)arg.Value!),\n                arg => Assert.Equal(0, (float)arg.Value!),\n                arg => Assert.Equal((double)input[10]!.Value!, (double)arg.Value!));\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod2Test1Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10759\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"String\",\n                    Value = \"test\"\n                },\n                new() {\n                    DataType = \"DateTime\",\n                    Value = DateTime.UtcNow\n                },\n                new() {\n                    DataType = \"Guid\",\n                    Value = Guid.NewGuid().ToString()\n                },\n                new() {\n                    DataType = \"ByteString\",\n                    Value = Encoding.UTF32.GetBytes(\"asdfasdfadsfs\")\n                },\n                new() {\n                    DataType = \"XmlElement\",\n                    Value = _serializer.FromObject(XmlElementEx.SerializeObject(\n                        new MemoryBufferInstance{\n                            Name = \"test\",\n                            TagCount = 333,\n                            DataType =\"Byte\"\n                        }))\n                },\n                new() {\n                    DataType = \"NodeId\",\n                    Value = \"http://test.org/#i=44\"\n                },\n                new() {\n                    DataType = \"ExpandedNodeId\",\n                    Value = \"http://test.org/#i=45\"\n                },\n                new() {\n                    DataType = \"QualifiedName\",\n                    Value = \"http://test.org/#name\"\n                },\n                new() {\n                    DataType = \"LocalizedText\",\n                    Value = _serializer.FromObject(new {\n                        Locale = \"de\",\n                        Text = \"Hallo Welt\"\n                    })\n                },\n                new() {\n                    DataType = \"StatusCode\",\n                    Value = 8888888\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg =>\n                {\n                    Assert.Equal(input[0].Value, arg.Value);\n                    Assert.Equal(input[0].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.Equal(input[1].Value, arg.Value);\n                    Assert.Equal(input[1].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.Equal(input[2].Value, arg.Value);\n                    Assert.Equal(input[2].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.Equal(input[3].Value, arg.Value);\n                    Assert.Equal(input[3].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.Equal(input[4].Value, arg.Value);\n                    Assert.Equal(input[4].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.Equal(input[5].Value, arg.Value);\n                    Assert.Equal(input[5].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.Equal(input[6].Value, arg.Value);\n                    Assert.Equal(input[6].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.Equal(input[7].Value, arg.Value);\n                    Assert.Equal(input[7].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.True(VariantValue.DeepEquals(input[8].Value, arg.Value),\n                        $\"Expected: {input[8].Value} != Actual: {arg.Value}\");\n                    Assert.Equal(input[8].DataType, arg.DataType);\n                },\n                arg =>\n                {\n                    Assert.Equal(8888888, (int)arg.Value!);\n                    Assert.Equal(input[9].DataType, arg.DataType);\n                });\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod2Test2Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10759\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var types = new List<string> {\n                \"String\", \"DateTime\", \"Guid\", \"ByteString\",\n                \"XmlElement\", \"NodeId\", \"ExpandedNodeId\",\n                \"QualifiedName\",\"LocalizedText\",\"StatusCode\" };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[0], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[1], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[2], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[3], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[4], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[5], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[6], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[7], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[8], arg.DataType);\n                 },\n                 arg =>\n                 {\n                     Assert.True(arg.Value.IsNull());\n                     Assert.Equal(types[9], arg.DataType);\n                 });\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod3Test1Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10762\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"Variant\",\n                    Value = _serializer.FromObject(new {\n                        Type = \"Uint32\",\n                        Body = 50\n                    })\n                },\n                new() {\n                    DataType = \"Enumeration\",\n                    Value = 8\n                },\n                new() {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromObject(new {\n                        Encoding = \"Xml\",\n                        TypeId = \"http://test.org/#s=test\",\n                        Body = new Opc.Ua.Argument(\"test\", Opc.Ua.DataTypes.String, -1, \"desc\")\n                            .AsXmlElement(Opc.Ua.ServiceMessageContext.GlobalContext)\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(50u, (uint)arg.Value!),\n                arg => Assert.Equal(8, (int)arg.Value!),\n                arg =>\n                {\n                    Assert.True(VariantValue.DeepEquals(input[2].Value, arg.Value),\n                        $\"Expected: {input[2].Value} != Actual: {arg.Value}\");\n                });\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod3Test2Async(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://test.org/UA/Data/#i=10762\";\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"String\",\n                    Value = \"varianttest\"\n                },\n                new() {\n                    DataType = \"int32\",\n                    Value = 9999\n                },\n                new() {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromObject(new {\n                        TypeId = \"http://test.org/#s=test2\",\n                        Body = new Opc.Ua.Argument(\"test1\", Opc.Ua.DataTypes.String, -1, \"desc1\")\n                            .AsBinary(Opc.Ua.ServiceMessageContext.GlobalContext)\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(\"varianttest\", (string)arg.Value!),\n                arg => Assert.Equal(9999, (int)arg.Value!),\n                arg => Assert.Equal(input[2].Value, arg.Value));\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod3WithBrowsePathNoIdsTestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            var objectPath = new[] {\n                \"Objects\",\n                \"http://test.org/UA/Data/#Data\",\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#MethodTest\"\n            };\n\n            var methodPath = new[] {\n                \"http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"Variant\",\n                    Value = _serializer.FromObject(new {\n                        Type = \"Uint32\",\n                        Body = 50\n                    })\n                },\n                new() {\n                    DataType = \"Enumeration\",\n                    Value = 8\n                },\n                new() {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromObject(new {\n                        Encoding = \"Xml\",\n                        TypeId = \"http://test.org/#s=test\",\n                        Body = new Opc.Ua.Argument(\"test\", Opc.Ua.DataTypes.String, -1, \"desc\")\n                            .AsXmlElement(Opc.Ua.ServiceMessageContext.GlobalContext)\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodBrowsePath = methodPath,\n                ObjectBrowsePath = objectPath,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(50u, (uint)arg.Value!),\n                arg => Assert.Equal(8, (int)arg.Value!),\n                arg =>\n                {\n                    Assert.True(VariantValue.DeepEquals(input[2].Value, arg.Value),\n                        $\"Expected: {input[2].Value} != Actual: {arg.Value}\");\n                });\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod3WithObjectIdAndBrowsePathTestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n            var methodPath = new[] {\n                \"http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"Variant\",\n                    Value = _serializer.FromObject(new {\n                        Type = \"Uint32\",\n                        Body = 50\n                    })\n                },\n                new() {\n                    DataType = \"Enumeration\",\n                    Value = 8\n                },\n                new() {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromObject(new {\n                        Encoding = \"Xml\",\n                        TypeId = \"http://test.org/#s=test\",\n                        Body = new Opc.Ua.Argument(\"test\", Opc.Ua.DataTypes.String, -1, \"desc\")\n                            .AsXmlElement(Opc.Ua.ServiceMessageContext.GlobalContext)\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodBrowsePath = methodPath,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(50u, (uint)arg.Value!),\n                arg => Assert.Equal(8, (int)arg.Value!),\n                arg =>\n                {\n                    Assert.True(VariantValue.DeepEquals(input[2].Value, arg.Value),\n                        $\"Expected: {input[2].Value} != Actual: {arg.Value}\");\n                });\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod3WithObjectIdAndMethodIdAndBrowsePathTestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string objectId = \"http://test.org/UA/Data/#i=10755\";\n\n            const string methodId = \"http://test.org/UA/Data/#i=10157\"; // Data\n            var methodPath = new[] {\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#MethodTest\",\n                \"http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"Variant\",\n                    Value = _serializer.FromObject(new {\n                        Type = \"Uint32\",\n                        Body = 50\n                    })\n                },\n                new() {\n                    DataType = \"Enumeration\",\n                    Value = 8\n                },\n                new() {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromObject(new {\n                        Encoding = \"Xml\",\n                        TypeId = \"http://test.org/#s=test\",\n                        Body = new Opc.Ua.Argument(\"test\", Opc.Ua.DataTypes.String, -1, \"desc\")\n                            .AsXmlElement(Opc.Ua.ServiceMessageContext.GlobalContext)\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodBrowsePath = methodPath,\n                ObjectId = objectId,\n                MethodId = methodId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(50u, (uint)arg.Value!),\n                arg => Assert.Equal(8, (int)arg.Value!),\n                arg =>\n                {\n                    Assert.True(VariantValue.DeepEquals(input[2].Value, arg.Value),\n                        $\"Expected: {input[2].Value} != Actual: {arg.Value}\");\n                });\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod3WithObjectPathAndMethodIdAndBrowsePathTestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            var objectPath = new[] {\n                \"Objects\",\n                \"http://test.org/UA/Data/#Data\",\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#MethodTest\"\n            };\n\n            const string methodId = \"http://test.org/UA/Data/#i=10157\"; // Data\n            var methodPath = new[] {\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#MethodTest\",\n                \"http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            var input = new List<MethodCallArgumentModel> {\n                new() {\n                    DataType = \"Variant\",\n                    Value = _serializer.FromObject(new {\n                        Type = \"Uint32\",\n                        Body = 50\n                    })\n                },\n                new() {\n                    DataType = \"Enumeration\",\n                    Value = 8\n                },\n                new() {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromObject(new {\n                        Encoding = \"Xml\",\n                        TypeId = \"http://test.org/#s=test\",\n                        Body = new Opc.Ua.Argument(\"test\", Opc.Ua.DataTypes.String, -1, \"desc\")\n                            .AsXmlElement(Opc.Ua.ServiceMessageContext.GlobalContext)\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodBrowsePath = methodPath,\n                ObjectBrowsePath = objectPath,\n                MethodId = methodId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(50u, (uint)arg.Value!),\n                arg => Assert.Equal(8, (int)arg.Value!),\n                arg =>\n                {\n                    Assert.True(VariantValue.DeepEquals(input[2].Value, arg.Value),\n                        $\"Expected: {input[2].Value} != Actual: {arg.Value}\");\n                });\n        }\n\n        public async Task NodeMethodCallStaticScalarMethod3WithObjectIdAndPathAndMethodIdAndPathTestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string objectId = \"http://test.org/UA/Data/#i=10157\"; // Data\n            var objectPath = new[] {\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#MethodTest\"\n            };\n\n            const string methodId = \"http://test.org/UA/Data/#i=10157\"; // Data\n            var methodPath = new[] {\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#MethodTest\",\n                \"http://test.org/UA/Data/#ScalarMethod3\"\n            };\n\n            var input = new List<MethodCallArgumentModel>\n            {\n                new()\n                {\n                    DataType = \"Variant\",\n                    Value = _serializer.FromObject(new\n                    {\n                        Type = \"Uint32\",\n                        Body = 50\n                    })\n                },\n                new()\n                {\n                    DataType = \"Enumeration\",\n                    Value = 8\n                },\n                new()\n                {\n                    DataType = \"ExtensionObject\",\n                    Value = _serializer.FromObject(new {\n                        Encoding = \"Xml\",\n                        TypeId = \"http://test.org/#s=test\",\n                        Body = new Opc.Ua.Argument(\"test\", Opc.Ua.DataTypes.String, -1, \"desc\")\n                            .AsXmlElement(Opc.Ua.ServiceMessageContext.GlobalContext)\n                    })\n                }\n            };\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodBrowsePath = methodPath,\n                ObjectBrowsePath = objectPath,\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = input\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Collection(result.Results,\n                arg => Assert.Equal(50u, (uint)arg.Value!),\n                arg => Assert.Equal(8, (int)arg.Value!),\n                arg =>\n                {\n                    Assert.True(VariantValue.DeepEquals(input[2].Value, arg.Value),\n                        $\"Expected: {input[2].Value} != Actual: {arg.Value}\");\n                });\n        }\n\n        public async Task NodeMethodCallBoiler2ResetTestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"ns=4;i=37\";\n            const string objectId = \"ns=4;i=31\";\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Empty(result.Results);\n            Assert.Null(result.ErrorInfo);\n        }\n\n        public async Task NodeMethodCallBoiler1ResetTestAsync(CancellationToken ct = default)\n        {\n            var service = _services();\n            const string methodId = \"http://opcfoundation.org/UA/Boiler/#i=15022\";\n            const string objectId = \"http://opcfoundation.org/UA/Boiler/#i=1287\";\n\n            // Act\n            var result = await service.MethodCallAsync(_connection, new MethodCallRequestModel\n            {\n                MethodId = methodId,\n                ObjectId = objectId,\n                Arguments = new List<MethodCallArgumentModel>()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Empty(result.Results);\n            Assert.Null(result.ErrorInfo);\n        }\n\n        private readonly bool _newMetadata;\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n        private readonly DefaultJsonSerializer _serializer;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/ConfigurationTests1.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Exceptions;\n    using Opc.Ua;\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class ConfigurationTests1\n    {\n        /// <summary>\n        /// Create configuration tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public ConfigurationTests1(IConfigurationServices services, ConnectionModel connection)\n        {\n            _service = services;\n            _connection = connection;\n        }\n\n        public async Task ExpandObjectWithBrowsePathTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\",\n                    BrowsePath = new[]\n                    {\n                        \"http://test.org/UA/Data/#Static\"\n                    }\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(12, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandObjectWithBrowsePathTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\",\n                    BrowsePath = new[]\n                    {\n                        \"http://test.org/UA/Data/#Static\"\n                    }\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(300, result.Result.OpcNodes.Count);\n            Assert.All(result.Result.OpcNodes, result =>\n            {\n                Assert.NotNull(result.DataSetFieldId);\n                Assert.NotNull(result.Id);\n            });\n        }\n\n        public async Task ExpandObjectTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\"\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(25, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandObjectTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\"\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(623, result.Result.OpcNodes.Count);\n        }\n\n        public async Task ExpandServerObjectTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(77, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandServerObjectTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(78, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandServerObjectTest3Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(940, result.Result.OpcNodes.Count);\n        }\n\n        public async Task ExpandServerObjectTest4Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    MaxDepth = 1,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(9, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandServerObjectTest5Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    MaxDepth = 0,\n                    MaxLevelsToExpand = 1,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(7, result.Result.OpcNodes.Count);\n        }\n\n        public async Task ExpandBaseObjectTypeTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.BaseObjectType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    MaxLevelsToExpand = 1,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(81, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandBaseObjectTypeTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.BaseObjectType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = true,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(5, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandBaseObjectsAndObjectTypesTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.BaseObjectType.ToString(),\n                    DataSetFieldId = \"type\"\n                },\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString(),\n                    DataSetFieldId = \"object\"\n                },\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\",\n                    DataSetFieldId = \"data\"\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    FlattenTypeInstance = false,\n                    NoSubTypesOfTypeNodes = false,\n                    MaxLevelsToExpand = 1,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(184, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandServerTypeTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.ServerType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(32, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandServerTypeWithMethodsTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.ServerType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    IncludeMethods = true,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n            Assert.Equal(36, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            var methods = results\n                .SelectMany(r => r.Result!.OpcNodes!).Where(n => n.MethodMetadata != null)\n                .ToList();\n            Assert.Equal(108, methods.Count);\n            Assert.All(methods, m =>\n            {\n                Assert.NotNull(m.MethodMetadata?.InputArguments);\n                Assert.NotNull(m.MethodMetadata?.OutputArguments);\n                Assert.NotNull(m.MethodMetadata?.ObjectId);\n            });\n        }\n\n        public async Task ExpandPublishSubscribeTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.PublishSubscribeType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(7, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandTestDataObjectTypeTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = TestData.ObjectTypeIds.TestDataObjectType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(24, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandBoilerTypeTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Boiler.ObjectTypeIds.BoilerType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    CreateSingleWriter = false,\n                    UseBrowseNameAsDisplayName = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(16, results.Count);\n            var groups = results.GroupBy(r => r.Result?.DataSetWriterGroup);\n            Assert.Equal(2, groups.Count());\n            Assert.All(groups, g =>\n            {\n                Assert.Equal(8, g.Count());\n                Assert.Contains(g.Key, new HashSet<string?> { \"Boiler #1\", \"Boiler #2\" });\n            });\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandBoilerDrumTypeTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Boiler.ObjectTypeIds.BoilerDrumType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    CreateSingleWriter = false,\n                    UseBrowseNameAsDisplayName = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(2, results.Count);\n            var groups = results.GroupBy(r => r.Result?.DataSetWriterGroup);\n            Assert.Equal(2, groups.Count());\n            Assert.All(groups, g =>\n            {\n                Assert.Single(g);\n                Assert.Contains(g.Key, new HashSet<string?> { \"Boiler #1\", \"Boiler #2\" });\n            });\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandValveTypeTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Boiler.ObjectTypeIds.ValveType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    CreateSingleWriter = false,\n                    UseBrowseNameAsDisplayName = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(2, results.Count);\n            var groups = results.GroupBy(r =>\n                (r.Result?.DataSetWriterGroup, r.Result?.WriterGroupRootNodeId));\n            Assert.Equal(2, groups.Count());\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandBoilerDrumAndValveTypeTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Boiler.ObjectTypeIds.BoilerDrumType.ToString()\n                },\n                new OpcNodeModel\n                {\n                    Id = Boiler.ObjectTypeIds.ValveType.ToString()\n                }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(4, results.Count);\n            var groups = results.GroupBy(r =>\n                (r.Result?.DataSetWriterGroup, r.Result?.WriterGroupRootNodeId));\n            Assert.Equal(4, groups.Count()); // 2 drum, 2 valve\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandVariablesTest1Async(CancellationToken ct = default)\n        {\n            // Test only variables as node ids in an entry\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10216\" },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10217\" },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10218\" }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(6, result.Result.OpcNodes.Count);\n        }\n\n        public async Task ExpandVariablesAndObjectsTest1Async(CancellationToken ct = default)\n        {\n            // Test mixing variables and objects in an entry to expand\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10217\" },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10216\" },\n                new OpcNodeModel { Id = Opc.Ua.ObjectIds.Server.ToString() },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10218\" },\n                new OpcNodeModel { Id = Opc.Ua.ObjectTypeIds.BaseObjectType.ToString() }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    FlattenTypeInstance = false,\n                    MaxLevelsToExpand = 1,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(162, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n        }\n\n        public async Task ExpandVariableTypesTest1Async(CancellationToken ct = default)\n        {\n            // Test only variable types as node ids in an entry\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = Opc.Ua.VariableTypeIds.PropertyType.ToString() }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.Equal(Opc.Ua.VariableTypeIds.PropertyType + \"/PropertyType\", result.Result.DataSetWriterId);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(697, result.Result.OpcNodes.Count);\n        }\n\n        public async Task ExpandVariableTypesTest2Async(CancellationToken ct = default)\n        {\n            // Test only variable types as node ids in an entry\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = Opc.Ua.VariableTypeIds.DataItemType.ToString() }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false,\n                    UseBrowseNameAsDisplayName = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.Equal(Opc.Ua.VariableTypeIds.DataItemType + \"/DataItemType\", result.Result.DataSetWriterId);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(96, result.Result.OpcNodes.Count);\n        }\n\n        public async Task ExpandVariableTypesTest3Async(CancellationToken ct = default)\n        {\n            // Test only variable types as node ids in an entry\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = Opc.Ua.VariableTypeIds.PropertyType.ToString() },\n                new OpcNodeModel { Id = Opc.Ua.VariableTypeIds.DataItemType.ToString() }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(2, results.Count);\n            var total = 0;\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                total += r.Result.OpcNodes.Count;\n            });\n            Assert.Equal(793, total);\n        }\n\n        public async Task ExpandObjectWithNoObjectsTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10791\" }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            //  An object node that has no objects and is excluded should result\n            //  in a service result model with \"No objects resolved\"\n            var result = Assert.Single(results);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(\"http://test.org/UA/Data/#i=10791\",\n                Assert.Single(result.Result.OpcNodes).Id);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(\"No objects resolved.\", result.ErrorInfo.ErrorMessage);\n            Assert.Equal(StatusCodes.BadNotFound, result.ErrorInfo.StatusCode);\n        }\n\n        public async Task ExpandObjectWithNoObjectsTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10791\" }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = true,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            // Discard errors -> no errors\n            Assert.Empty(results);\n        }\n\n        public async Task ExpandEmptyEntryTest1Async(CancellationToken ct = default)\n        {\n            // Nothing should be returned when an empty entry passed\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = Array.Empty<OpcNodeModel>();\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Empty(results);\n        }\n\n        public async Task ExpandEmptyEntryTest2Async(CancellationToken ct = default)\n        {\n            // Nothing should be returned when an empty entry passed\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = Array.Empty<OpcNodeModel>();\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Empty(results);\n        }\n\n        public async Task ExpandBadNodeIdTest1Async(CancellationToken ct = default)\n        {\n            // Entry with bad node id should return error\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"s=bad\" }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(\"s=bad\", Assert.Single(result.Result.OpcNodes).Id);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(StatusCodes.BadNodeIdUnknown, result.ErrorInfo.StatusCode);\n        }\n\n        public async Task ExpandBadNodeIdTest2Async(CancellationToken ct = default)\n        {\n            //  An entry with multiple nodes and duplicate field ids should return an error\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10157\", DataSetFieldId = \"test\" },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10158\", DataSetFieldId = \"test\" }\n            };\n            var ex = await Assert.ThrowsAnyAsync<Exception>(async () => await _service.ExpandAsync(\n                entry, new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false)).ConfigureAwait(false);\n\n            Assert.True(ex is MethodCallStatusException or BadRequestException);\n        }\n\n        public async Task ExpandBadNodeIdTest3Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            // Method or view node id passed results in not supported error.\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = MethodIds.Server_GetMonitoredItems.ToString() }\n            };\n            var results = await _service.ExpandAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(MethodIds.Server_GetMonitoredItems.ToString(), Assert.Single(result.Result.OpcNodes).Id);\n            Assert.Equal(StatusCodes.BadNotSupported, result.ErrorInfo.StatusCode);\n        }\n\n        //\n        //  7. Object and maxdepth 0 -> max depth 1\n        //  7b.Object and stop first found -> organizes is used\n        //  8. Object type with stop first found set uses organizes\n        //\n\n        private readonly ConnectionModel _connection;\n        private readonly IConfigurationServices _service;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/ConfigurationTests2.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Config.Models;\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Exceptions;\n    using Moq;\n    using Moq.Language.Flow;\n    using Opc.Ua;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class ConfigurationTests2\n    {\n        /// <summary>\n        /// Create configuration tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public ConfigurationTests2(Func<IPublishedNodesServices, IConfigurationServices> services,\n            ConnectionModel connection)\n        {\n            _service = services;\n            _connection = connection;\n            _publishedNodesServices = new Mock<IPublishedNodesServices>();\n            _createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                .Returns(Task.CompletedTask);\n        }\n\n        public async Task ConfigureFromObjectErrorTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\"\n                }\n            };\n\n            // Save error will return error for entry\n            var createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                .Throws<BadRequestException>();\n            createCall.Verifiable(Times.Exactly(25));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(25, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.NotNull(r.ErrorInfo);\n                Assert.Equal(StatusCodes.BadInvalidArgument, r.ErrorInfo.StatusCode);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromObjectErrorTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\"\n                }\n            };\n\n            // Save error will return error for entry\n            var createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                .Throws<BadRequestException>();\n            createCall.Verifiable(Times.Exactly(25));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = true,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Empty(results);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromObjectErrorTest3Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\"\n                }\n            };\n\n            // Save error will return error for entry\n            var createCall = _publishedNodesServices.Setup(s => s.CreateOrUpdateDataSetWriterEntryAsync(\n                It.IsAny<PublishedNodesEntryModel>(), It.IsAny<CancellationToken>()))\n                .Throws<BadRequestException>();\n            createCall.Verifiable(Times.Once);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(StatusCodes.BadInvalidArgument, result.ErrorInfo.StatusCode);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(623, result.Result.OpcNodes.Count);\n\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromObjectWithBrowsePathTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\",\n                    BrowsePath = new[]\n                    {\n                        \"http://test.org/UA/Data/#Static\"\n                    }\n                }\n            };\n            _createCall.Verifiable(Times.Exactly(12));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(12, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromObjectWithBrowsePathTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\",\n                    BrowsePath = new[]\n                    {\n                        \"http://test.org/UA/Data/#Static\"\n                    }\n                }\n            };\n            _createCall.Verifiable(Times.Once);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(300, result.Result.OpcNodes.Count);\n            Assert.All(result.Result.OpcNodes, result =>\n            {\n                Assert.NotNull(result.DataSetFieldId);\n                Assert.NotNull(result.Id);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromObjectTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\"\n                }\n            };\n            _createCall.Verifiable(Times.Exactly(25));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(25, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromObjectTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\"\n                }\n            };\n            _createCall.Verifiable(Times.Once);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(623, result.Result.OpcNodes.Count);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromServerObjectTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            _createCall.Verifiable(Times.Exactly(77));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(77, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromServerObjectTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            _createCall.Verifiable(Times.Exactly(78));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(78, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromServerObjectTest3Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            _createCall.Verifiable(Times.Once);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(940, result.Result.OpcNodes.Count);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromServerObjectTest4Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            _createCall.Verifiable(Times.Exactly(9));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    MaxDepth = 1,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(9, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromServerObjectTest5Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString()\n                }\n            };\n            _createCall.Verifiable(Times.Once);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    MaxDepth = 0,\n                    MaxLevelsToExpand = 1,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(7, result.Result.OpcNodes.Count);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromBaseObjectTypeTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.BaseObjectType.ToString()\n                }\n            };\n            _createCall.Verifiable(Times.Exactly(81));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    FlattenTypeInstance = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(81, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromBaseObjectTypeTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.BaseObjectType.ToString()\n                }\n            };\n            _createCall.Verifiable(Times.Exactly(5));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    FlattenTypeInstance = true,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(5, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromBaseObjectsAndObjectTypesTestAsync(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectTypeIds.BaseObjectType.ToString(),\n                    DataSetFieldId = \"type\"\n                },\n                new OpcNodeModel\n                {\n                    Id = Opc.Ua.ObjectIds.Server.ToString(),\n                    DataSetFieldId = \"object\"\n                },\n                new OpcNodeModel\n                {\n                    Id = \"http://test.org/UA/Data/#i=10157\",\n                    DataSetFieldId = \"data\"\n                }\n            };\n            _createCall.Verifiable(Times.Exactly(184));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    FlattenTypeInstance = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(184, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromVariablesTest1Async(CancellationToken ct = default)\n        {\n            // Test only variables as node ids in an entry\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10216\" },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10217\" },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10218\" }\n            };\n            _createCall.Verifiable(Times.Once);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(6, result.Result.OpcNodes.Count);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromVariablesAndObjectsTest1Async(CancellationToken ct = default)\n        {\n            // Test mixing variables and objects in an entry to expand\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10217\" },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10216\" },\n                new OpcNodeModel { Id = Opc.Ua.ObjectIds.Server.ToString() },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10218\" },\n                new OpcNodeModel { Id = Opc.Ua.ObjectTypeIds.BaseObjectType.ToString() }\n            };\n            _createCall.Verifiable(Times.Exactly(160));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    FlattenTypeInstance = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(160, results.Count);\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                Assert.True(r.Result.OpcNodes.Count > 0);\n            });\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromVariableTypesTest1Async(CancellationToken ct = default)\n        {\n            // Test only variable types as node ids in an entry\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = Opc.Ua.VariableTypeIds.PropertyType.ToString() }\n            };\n            _createCall.Verifiable(Times.Once);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.Equal(Opc.Ua.VariableTypeIds.PropertyType + \"/PropertyType\", result.Result.DataSetWriterId);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(697, result.Result.OpcNodes.Count);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromVariableTypesTest2Async(CancellationToken ct = default)\n        {\n            // Test only variable types as node ids in an entry\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = Opc.Ua.VariableTypeIds.DataItemType.ToString() }\n            };\n            _createCall.Verifiable(Times.Once);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.Equal(Opc.Ua.VariableTypeIds.DataItemType + \"/DataItemType\", result.Result.DataSetWriterId);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(96, result.Result.OpcNodes.Count);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromVariableTypesTest3Async(CancellationToken ct = default)\n        {\n            // Test only variable types as node ids in an entry\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = Opc.Ua.VariableTypeIds.PropertyType.ToString() },\n                new OpcNodeModel { Id = Opc.Ua.VariableTypeIds.DataItemType.ToString() }\n            };\n            _createCall.Verifiable(Times.Exactly(2));\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Equal(2, results.Count);\n            var total = 0;\n            Assert.All(results, r =>\n            {\n                Assert.Null(r.ErrorInfo);\n                Assert.NotNull(r.Result);\n                Assert.NotNull(r.Result.OpcNodes);\n                total += r.Result.OpcNodes.Count;\n            });\n            Assert.Equal(793, total);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromObjectWithNoObjectsTest1Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10791\" }\n            };\n            _createCall.Verifiable(Times.Never);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            //  An object node that has no objects and is excluded should result\n            //  in a service result model with \"No objects resolved\"\n            var result = Assert.Single(results);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(\"http://test.org/UA/Data/#i=10791\",\n                Assert.Single(result.Result.OpcNodes).Id);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(\"No objects resolved.\", result.ErrorInfo.ErrorMessage);\n            Assert.Equal(StatusCodes.BadNotFound, result.ErrorInfo.StatusCode);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromObjectWithNoObjectsTest2Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10791\" }\n            };\n            _createCall.Verifiable(Times.Never);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = true,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            // Discard errors -> no errors\n            Assert.Empty(results);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromEmptyEntryTest1Async(CancellationToken ct = default)\n        {\n            // Nothing should be returned when an empty entry passed\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = Array.Empty<OpcNodeModel>();\n            _createCall.Verifiable(Times.Never);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Empty(results);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromEmptyEntryTest2Async(CancellationToken ct = default)\n        {\n            // Nothing should be returned when an empty entry passed\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = Array.Empty<OpcNodeModel>();\n            _createCall.Verifiable(Times.Never);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = true\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            Assert.Empty(results);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromBadNodeIdTest1Async(CancellationToken ct = default)\n        {\n            // Entry with bad node id should return error\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"s=bad\" }\n            };\n            _createCall.Verifiable(Times.Never);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(\"s=bad\", Assert.Single(result.Result.OpcNodes).Id);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.Equal(StatusCodes.BadNodeIdUnknown, result.ErrorInfo.StatusCode);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromBadNodeIdTest2Async(CancellationToken ct = default)\n        {\n            //  An entry with multiple nodes and duplicate field ids should return an error\n            var entry = _connection.ToPublishedNodesEntry();\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10157\", DataSetFieldId = \"test\" },\n                new OpcNodeModel { Id = \"http://test.org/UA/Data/#i=10158\", DataSetFieldId = \"test\" }\n            };\n            _createCall.Verifiable(Times.Never);\n            var ex = await Assert.ThrowsAnyAsync<Exception>(async () => await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(\n                entry, new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = true,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false)).ConfigureAwait(false);\n\n            Assert.True(ex is MethodCallStatusException or BadRequestException);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        public async Task ConfigureFromBadNodeIdTest3Async(CancellationToken ct = default)\n        {\n            var entry = _connection.ToPublishedNodesEntry();\n            // Method or view node id passed results in not supported error.\n            entry.OpcNodes = new[]\n            {\n                new OpcNodeModel { Id = MethodIds.Server_GetMonitoredItems.ToString() }\n            };\n            _createCall.Verifiable(Times.Never);\n            var results = await _service(_publishedNodesServices.Object).CreateOrUpdateAsync(entry,\n                new PublishedNodeExpansionModel\n                {\n                    DiscardErrors = false,\n                    ExcludeRootIfInstanceNode = false,\n                    NoSubTypesOfTypeNodes = false,\n                    CreateSingleWriter = false\n                }, ct).ToListAsync(ct).ConfigureAwait(false);\n\n            var result = Assert.Single(results);\n            Assert.NotNull(result.ErrorInfo);\n            Assert.NotNull(result.Result);\n            Assert.NotNull(result.Result.OpcNodes);\n            Assert.Equal(MethodIds.Server_GetMonitoredItems.ToString(), Assert.Single(result.Result.OpcNodes).Id);\n            Assert.Equal(StatusCodes.BadNotSupported, result.ErrorInfo.StatusCode);\n            _publishedNodesServices.Verify();\n            _publishedNodesServices.VerifyNoOtherCalls();\n        }\n\n        private readonly ConnectionModel _connection;\n        private readonly Mock<IPublishedNodesServices> _publishedNodesServices;\n        private readonly IReturnsResult<IPublishedNodesServices> _createCall;\n        private readonly Func<IPublishedNodesServices, IConfigurationServices> _service;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/NodeMetadataTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Xunit;\n\n    public class NodeMetadataTests<T>\n    {\n        /// <summary>\n        /// Create metadata tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        public NodeMetadataTests(Func<INodeServices<T>> services, T connection)\n        {\n            _services = services;\n            _connection = connection;\n        }\n\n        public async Task GetServerCapabilitiesTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.GetServerCapabilitiesAsync(_connection,\n                null, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            Assert.NotNull(results.AggregateFunctions);\n            Assert.Equal(37, results.AggregateFunctions.Count);\n            Assert.Single(results.SupportedLocales!);\n            Assert.Equal(\"en-US\", results.SupportedLocales![0]);\n            Assert.NotEmpty(results.ServerProfiles!);\n            Assert.Equal(3, results.ServerProfiles!.Count);\n            Assert.NotNull(results.OperationLimits);\n            Assert.Null(results.OperationLimits.MinSupportedSampleRate);\n            Assert.Equal(1000u, results.OperationLimits.MaxBrowseContinuationPoints!.Value);\n            Assert.Equal(1000u, results.OperationLimits.MaxQueryContinuationPoints!.Value);\n            Assert.Equal(1000u, results.OperationLimits.MaxHistoryContinuationPoints!.Value);\n            Assert.Null(results.OperationLimits.MaxNodesPerBrowse);\n            Assert.Null(results.OperationLimits.MaxNodesPerRegisterNodes);\n            Assert.Null(results.OperationLimits.MaxNodesPerWrite);\n            Assert.Null(results.OperationLimits.MaxNodesPerMethodCall);\n            Assert.Null(results.OperationLimits.MaxNodesPerNodeManagement);\n            Assert.Null(results.OperationLimits.MaxMonitoredItemsPerCall);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryReadData);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryReadEvents);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryUpdateData);\n            Assert.Null(results.OperationLimits.MaxNodesPerHistoryUpdateEvents);\n            Assert.Equal(65535u, results.OperationLimits.MaxArrayLength);\n            Assert.Equal(130816u, results.OperationLimits.MaxStringLength);\n            Assert.Equal(1048576u, results.OperationLimits.MaxByteStringLength);\n            Assert.Null(results.ModellingRules);\n        }\n\n        public async Task HistoryGetServerCapabilitiesTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n\n            var results = await services.HistoryGetServerCapabilitiesAsync(_connection,\n                null, ct).ConfigureAwait(false);\n\n            Assert.NotNull(results);\n            Assert.Null(results.AggregateFunctions);\n            Assert.False(results.AccessHistoryDataCapability);\n            Assert.False(results.AccessHistoryEventsCapability);\n            Assert.False(results.InsertDataCapability);\n            Assert.False(results.InsertEventCapability);\n            Assert.False(results.InsertAnnotationCapability);\n            Assert.False(results.ReplaceDataCapability);\n            Assert.False(results.ReplaceEventCapability);\n            Assert.False(results.DeleteRawCapability);\n            Assert.False(results.DeleteAtTimeCapability);\n            Assert.False(results.DeleteEventCapability);\n            Assert.False(results.ServerTimestampSupported);\n            Assert.False(results.UpdateDataCapability);\n            Assert.False(results.UpdateEventCapability);\n            Assert.Null(results.MaxReturnDataValues);\n            Assert.Null(results.MaxReturnEventValues);\n        }\n\n        public async Task NodeGetMetadataForFolderTypeTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.Verbose\n                    }\n                },\n                NodeId = Opc.Ua.ObjectTypeIds.FolderType.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.Equal(NodeType.Object, result.TypeDefinition.NodeType);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.Empty(result.TypeDefinition.Declarations);\n        }\n\n        public async Task NodeGetMetadataForServerObjectTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                NodeId = Opc.Ua.ObjectIds.Server.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.Equal(\"ServerType\", result.TypeDefinition.BrowseName);\n            Assert.Equal(Opc.Ua.ObjectTypeIds.ServerType.ToString(),\n                result.TypeDefinition.TypeDefinitionId);\n            Assert.Equal(NodeType.Object, result.TypeDefinition.NodeType);\n            var baseType = Assert.Single(result.TypeDefinition.TypeHierarchy!);\n            Assert.Equal(\"i=58\", baseType.NodeId);\n            Assert.Equal(\"BaseObjectType\", baseType.BrowseName);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.NotEmpty(result.TypeDefinition.Declarations);\n            Assert.Equal(63, result.TypeDefinition.Declarations.Count);\n            Assert.Collection(result.TypeDefinition.Declarations.Select(d => d.BrowseName),\n                arg => Assert.Equal(\"ServerArray\", arg),\n                arg => Assert.Equal(\"NamespaceArray\", arg),\n                arg => Assert.Equal(\"UrisVersion\", arg),\n                arg => Assert.Equal(\"ServerStatus\", arg),\n                arg => Assert.Equal(\"StartTime\", arg),\n                arg => Assert.Equal(\"CurrentTime\", arg),\n                arg => Assert.Equal(\"State\", arg),\n                arg => Assert.Equal(\"BuildInfo\", arg),\n                arg => Assert.Equal(\"ProductUri\", arg),\n                arg => Assert.Equal(\"ManufacturerName\", arg),\n                arg => Assert.Equal(\"ProductName\", arg),\n                arg => Assert.Equal(\"SoftwareVersion\", arg),\n                arg => Assert.Equal(\"BuildNumber\", arg),\n                arg => Assert.Equal(\"BuildDate\", arg),\n                arg => Assert.Equal(\"SecondsTillShutdown\", arg),\n                arg => Assert.Equal(\"ShutdownReason\", arg),\n                arg => Assert.Equal(\"ServiceLevel\", arg),\n                arg => Assert.Equal(\"Auditing\", arg),\n                arg => Assert.Equal(\"EstimatedReturnTime\", arg),\n                arg => Assert.Equal(\"LocalTime\", arg),\n                arg => Assert.Equal(\"ServerCapabilities\", arg),\n                arg => Assert.Equal(\"ServerProfileArray\", arg),\n                arg => Assert.Equal(\"LocaleIdArray\", arg),\n                arg => Assert.Equal(\"MinSupportedSampleRate\", arg),\n                arg => Assert.Equal(\"MaxBrowseContinuationPoints\", arg),\n                arg => Assert.Equal(\"MaxQueryContinuationPoints\", arg),\n                arg => Assert.Equal(\"MaxHistoryContinuationPoints\", arg),\n                arg => Assert.Equal(\"SoftwareCertificates\", arg),\n                arg => Assert.Equal(\"ModellingRules\", arg),\n                arg => Assert.Equal(\"AggregateFunctions\", arg),\n                arg => Assert.Equal(\"ServerDiagnostics\", arg),\n                arg => Assert.Equal(\"ServerDiagnosticsSummary\", arg),\n                arg => Assert.Equal(\"ServerViewCount\", arg),\n                arg => Assert.Equal(\"CurrentSessionCount\", arg),\n                arg => Assert.Equal(\"CumulatedSessionCount\", arg),\n                arg => Assert.Equal(\"SecurityRejectedSessionCount\", arg),\n                arg => Assert.Equal(\"RejectedSessionCount\", arg),\n                arg => Assert.Equal(\"SessionTimeoutCount\", arg),\n                arg => Assert.Equal(\"SessionAbortCount\", arg),\n                arg => Assert.Equal(\"PublishingIntervalCount\", arg),\n                arg => Assert.Equal(\"CurrentSubscriptionCount\", arg),\n                arg => Assert.Equal(\"CumulatedSubscriptionCount\", arg),\n                arg => Assert.Equal(\"SecurityRejectedRequestsCount\", arg),\n                arg => Assert.Equal(\"RejectedRequestsCount\", arg),\n                arg => Assert.Equal(\"SubscriptionDiagnosticsArray\", arg),\n                arg => Assert.Equal(\"SessionsDiagnosticsSummary\", arg),\n                arg => Assert.Equal(\"SessionDiagnosticsArray\", arg),\n                arg => Assert.Equal(\"SessionSecurityDiagnosticsArray\", arg),\n                arg => Assert.Equal(\"EnabledFlag\", arg),\n                arg => Assert.Equal(\"VendorServerInfo\", arg),\n                arg => Assert.Equal(\"ServerRedundancy\", arg),\n                arg => Assert.Equal(\"RedundancySupport\", arg),\n                arg => Assert.Equal(\"Namespaces\", arg),\n                arg => Assert.Equal(\"GetMonitoredItems\", arg),\n                arg => Assert.Equal(\"InputArguments\", arg),\n                arg => Assert.Equal(\"OutputArguments\", arg),\n                arg => Assert.Equal(\"ResendData\", arg),\n                arg => Assert.Equal(\"InputArguments\", arg),\n                arg => Assert.Equal(\"SetSubscriptionDurable\", arg),\n                arg => Assert.Equal(\"InputArguments\", arg),\n                arg => Assert.Equal(\"OutputArguments\", arg),\n                arg => Assert.Equal(\"RequestServerStateChange\", arg),\n                arg => Assert.Equal(\"InputArguments\", arg));\n        }\n\n        public async Task NodeGetMetadataForConditionTypeTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.Verbose\n                    }\n                },\n                NodeId = Opc.Ua.ObjectTypeIds.ConditionType.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.Equal(NodeType.Event, result.TypeDefinition.NodeType);\n            Assert.NotEmpty(result.TypeDefinition.TypeHierarchy!);\n            Assert.Equal(2, result.TypeDefinition.TypeHierarchy!.Count);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.NotEmpty(result.TypeDefinition.Declarations);\n            Assert.Equal(35, result.TypeDefinition.Declarations.Count);\n        }\n\n        public async Task NodeGetMetadataForServerStatusVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                NodeId = Opc.Ua.VariableIds.Server_ServerStatus.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.Equal(\"ServerStatusType\", result.TypeDefinition.BrowseName);\n            Assert.Equal(Opc.Ua.VariableTypeIds.ServerStatusType.ToString(),\n                result.TypeDefinition.TypeDefinitionId);\n            Assert.Equal(NodeType.DataVariable, result.TypeDefinition.NodeType);\n            Assert.Equal(2, result.TypeDefinition.TypeHierarchy!.Count);\n            Assert.Equal(\"i=62\", result.TypeDefinition.TypeHierarchy[0].NodeId);\n            Assert.Equal(\"BaseVariableType\", result.TypeDefinition.TypeHierarchy[0].BrowseName);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.NotEmpty(result.TypeDefinition.Declarations);\n            Assert.Equal(12, result.TypeDefinition.Declarations.Count);\n            Assert.Collection(result.TypeDefinition.Declarations.Select(d => d.BrowseName),\n                arg => Assert.Equal(\"StartTime\", arg),\n                arg => Assert.Equal(\"CurrentTime\", arg),\n                arg => Assert.Equal(\"State\", arg),\n                arg => Assert.Equal(\"BuildInfo\", arg),\n                arg => Assert.Equal(\"ProductUri\", arg),\n                arg => Assert.Equal(\"ManufacturerName\", arg),\n                arg => Assert.Equal(\"ProductName\", arg),\n                arg => Assert.Equal(\"SoftwareVersion\", arg),\n                arg => Assert.Equal(\"BuildNumber\", arg),\n                arg => Assert.Equal(\"BuildDate\", arg),\n                arg => Assert.Equal(\"SecondsTillShutdown\", arg),\n                arg => Assert.Equal(\"ShutdownReason\", arg));\n        }\n\n        public async Task NodeGetMetadataForRedundancySupportPropertyTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                NodeId = Opc.Ua.VariableIds.Server_ServerRedundancy_RedundancySupport.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.Equal(\"PropertyType\", result.TypeDefinition.BrowseName);\n            Assert.Equal(Opc.Ua.VariableTypeIds.PropertyType.ToString(),\n                result.TypeDefinition.TypeDefinitionId);\n            Assert.Equal(NodeType.Property, result.TypeDefinition.NodeType);\n            var baseType = Assert.Single(result.TypeDefinition.TypeHierarchy!);\n            Assert.Equal(\"i=62\", baseType.NodeId);\n            Assert.Equal(\"BaseVariableType\", baseType.BrowseName);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.Empty(result.TypeDefinition.Declarations);\n        }\n\n        public async Task NodeGetMetadataForBaseInterfaceTypeTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.Verbose\n                    }\n                },\n                NodeId = Opc.Ua.ObjectTypeIds.BaseInterfaceType.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.NotEmpty(result.TypeDefinition.TypeHierarchy!);\n            var baseType = Assert.Single(result.TypeDefinition.TypeHierarchy!);\n            Assert.Equal(\"i=58\", baseType.NodeId);\n            Assert.Equal(\"BaseObjectType\", baseType.BrowseName);\n            Assert.Equal(NodeType.Interface, result.TypeDefinition.NodeType);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.Empty(result.TypeDefinition.Declarations);\n        }\n\n        public async Task NodeGetMetadataTestForBaseEventTypeTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        Level = DiagnosticsLevel.Verbose\n                    }\n                },\n                NodeId = Opc.Ua.ObjectTypeIds.BaseEventType.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.NotEmpty(result.TypeDefinition.Declarations);\n            Assert.NotEmpty(result.TypeDefinition.TypeHierarchy!);\n            var baseType = Assert.Single(result.TypeDefinition!.TypeHierarchy!);\n            Assert.Equal(\"i=58\", baseType.NodeId);\n            Assert.Equal(\"BaseObjectType\", baseType.BrowseName);\n            Assert.Equal(NodeType.Event, result.TypeDefinition.NodeType);\n            Assert.All(result.TypeDefinition.Declarations, arg =>\n            {\n                Assert.Equal(\"i=2041\", arg.RootTypeId);\n                Assert.Equal(NodeClass.Variable, arg.NodeClass);\n                Assert.NotNull(arg.VariableMetadata);\n                Assert.NotNull(arg.VariableMetadata.DataType);\n                Assert.Null(arg.Description);\n                Assert.Null(arg.OverriddenDeclaration);\n            });\n            Assert.Collection(result.TypeDefinition.Declarations,\n                arg =>\n                {\n                    Assert.Equal(\"/EventId\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"EventId\", arg.DisplayName);\n                    Assert.Equal(\"ByteString\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Mandatory\", arg.ModellingRule);\n                    Assert.Equal(\"i=2042\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/EventType\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"EventType\", arg.DisplayName);\n                    Assert.Equal(\"NodeId\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Mandatory\", arg.ModellingRule);\n                    Assert.Equal(\"i=2043\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/SourceNode\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"SourceNode\", arg.DisplayName);\n                    Assert.Equal(\"NodeId\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Mandatory\", arg.ModellingRule);\n                    Assert.Equal(\"i=2044\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/SourceName\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"SourceName\", arg.DisplayName);\n                    Assert.Equal(\"String\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Mandatory\", arg.ModellingRule);\n                    Assert.Equal(\"i=2045\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/Time\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"Time\", arg.DisplayName);\n                    Assert.Equal(\"UtcTime\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Mandatory\", arg.ModellingRule);\n                    Assert.Equal(\"i=2046\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/ReceiveTime\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"ReceiveTime\", arg.DisplayName);\n                    Assert.Equal(\"UtcTime\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Mandatory\", arg.ModellingRule);\n                    Assert.Equal(\"i=2047\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/LocalTime\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"LocalTime\", arg.DisplayName);\n                    Assert.Equal(\"TimeZoneDataType\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Optional\", arg.ModellingRule);\n                    Assert.Equal(\"i=3190\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/Message\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"Message\", arg.DisplayName);\n                    Assert.Equal(\"LocalizedText\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Mandatory\", arg.ModellingRule);\n                    Assert.Equal(\"i=2050\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/Severity\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"Severity\", arg.DisplayName);\n                    Assert.Equal(\"UInt16\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Mandatory\", arg.ModellingRule);\n                    Assert.Equal(\"i=2051\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/ConditionClassId\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"ConditionClassId\", arg.DisplayName);\n                    Assert.Equal(\"NodeId\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Optional\", arg.ModellingRule);\n                    Assert.Equal(\"i=31771\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/ConditionClassName\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"ConditionClassName\", arg.DisplayName);\n                    Assert.Equal(\"LocalizedText\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Optional\", arg.ModellingRule);\n                    Assert.Equal(\"i=31772\", arg.NodeId);\n                    Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/ConditionSubClassId\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"ConditionSubClassId\", arg.DisplayName);\n                    Assert.Equal(\"NodeId\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Optional\", arg.ModellingRule);\n                    Assert.Equal(\"i=31773\", arg.NodeId);\n                    Assert.NotNull(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(0u, Assert.Single(arg.VariableMetadata.ArrayDimensions));\n                    Assert.Equal(NodeValueRank.OneDimension, arg.VariableMetadata.ValueRank!.Value);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"/ConditionSubClassName\", Assert.Single(arg.BrowsePath!));\n                    Assert.Equal(\"ConditionSubClassName\", arg.DisplayName);\n                    Assert.Equal(\"LocalizedText\", arg.VariableMetadata!.DataType!.DataType);\n                    Assert.Equal(\"Optional\", arg.ModellingRule);\n                    Assert.Equal(\"i=31774\", arg.NodeId);\n                    Assert.NotNull(arg.VariableMetadata.ArrayDimensions);\n                    Assert.Equal(0u, Assert.Single(arg.VariableMetadata.ArrayDimensions));\n                    Assert.Equal(NodeValueRank.OneDimension, arg.VariableMetadata.ValueRank!.Value);\n                });\n        }\n\n        public async Task NodeGetMetadataForPropertyTypeTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                NodeId = Opc.Ua.VariableTypeIds.PropertyType.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.NotEmpty(result.TypeDefinition.TypeHierarchy!);\n            var baseType = Assert.Single(result.TypeDefinition.TypeHierarchy!);\n            Assert.Equal(\"i=62\", baseType.NodeId);\n            Assert.Equal(\"BaseVariableType\", baseType.BrowseName);\n            Assert.Equal(NodeType.Property, result.TypeDefinition.NodeType);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.Empty(result.TypeDefinition.Declarations);\n        }\n\n        public async Task NodeGetMetadataForBaseDataVariableTypeTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                NodeId = Opc.Ua.VariableTypeIds.BaseDataVariableType.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.NotEmpty(result.TypeDefinition.TypeHierarchy!);\n            var baseType = Assert.Single(result.TypeDefinition.TypeHierarchy!);\n            Assert.Equal(\"i=62\", baseType.NodeId);\n            Assert.Equal(\"BaseVariableType\", baseType.BrowseName);\n            Assert.Equal(NodeType.DataVariable, result.TypeDefinition.NodeType);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.Empty(result.TypeDefinition.Declarations);\n        }\n\n        public async Task NodeGetMetadataForAudioVariableTypeTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var result = await browser.GetMetadataAsync(_connection, new NodeMetadataRequestModel\n            {\n                NodeId = Opc.Ua.VariableTypeIds.AudioVariableType.ToString()\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.Null(result.ErrorInfo);\n            Assert.NotNull(result.TypeDefinition);\n            Assert.NotEmpty(result.TypeDefinition.TypeHierarchy!);\n            Assert.Equal(2, result.TypeDefinition.TypeHierarchy!.Count);\n            Assert.Equal(NodeType.DataVariable, result.TypeDefinition.NodeType);\n            Assert.NotNull(result.TypeDefinition.Declarations);\n            Assert.Equal(3, result.TypeDefinition.Declarations.Count);\n            Assert.All(result.TypeDefinition.Declarations, arg =>\n            {\n                Assert.Equal(Opc.Ua.VariableTypeIds.AudioVariableType.ToString(), arg.RootTypeId);\n                Assert.Equal(NodeClass.Variable, arg.NodeClass);\n                Assert.NotNull(arg.VariableMetadata);\n                Assert.Null(arg.VariableMetadata.ArrayDimensions);\n                Assert.Null(arg.MethodMetadata);\n                Assert.Null(arg.Description);\n                Assert.Null(arg.OverriddenDeclaration);\n                Assert.NotNull(arg.VariableMetadata.DataType);\n                Assert.Equal(\"String\", arg.VariableMetadata!.DataType!.DataType);\n                Assert.Equal(NodeValueRank.Scalar, arg.VariableMetadata!.ValueRank!.Value);\n            });\n            Assert.Collection(result.TypeDefinition.Declarations,\n                arg =>\n                {\n                    Assert.Equal(\"Optional\", arg.ModellingRule);\n                    Assert.Equal(\"ListId\", arg.DisplayName);\n                    Assert.Equal(\"i=17988\", arg.NodeId);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Optional\", arg.ModellingRule);\n                    Assert.Equal(\"AgencyId\", arg.DisplayName);\n                    Assert.Equal(\"i=17989\", arg.NodeId);\n                },\n                arg =>\n                {\n                    Assert.Equal(\"Optional\", arg.ModellingRule);\n                    Assert.Equal(\"VersionId\", arg.DisplayName);\n                    Assert.Equal(\"i=17990\", arg.NodeId);\n                });\n        }\n\n        private readonly T _connection;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/ReadArrayValueTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using System.Xml;\n    using Xunit;\n\n    public class ReadArrayValueTests<T>\n    {\n        /// <summary>\n        /// Create node services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"readExpected\"></param>\n        public ReadArrayValueTests(Func<INodeServices<T>> services, T connection,\n            Func<T, string, IJsonSerializer, Task<VariantValue>> readExpected)\n        {\n            _services = services;\n            _connection = connection;\n            _readExpected = readExpected;\n            _serializer = new DefaultJsonSerializer();\n        }\n\n        public async Task NodeReadAllStaticArrayVariableNodeClassTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const Opc.Ua.NodeClass expected = Opc.Ua.NodeClass.Variable;\n\n            var attributes = new List<AttributeReadRequestModel>();\n            for (var i = 10300; i < 10326; i++)\n            {\n                attributes.Add(new AttributeReadRequestModel\n                {\n                    Attribute = NodeAttribute.NodeClass,\n                    NodeId = \"http://test.org/UA/Data/#i=\" + i\n                });\n            }\n\n            // Act\n            var result = await browser.ReadAsync(_connection, new ReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadAllStaticArrayVariableNodeClassTest1Async),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                Attributes = attributes\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Results);\n            Assert.Equal(attributes.Count, result.Results.Count);\n            Assert.All(result.Results, r => Assert.Null(r.ErrorInfo));\n            Assert.All(result.Results, r => Assert.Equal((int)expected, (int)r.Value));\n        }\n\n        public async Task NodeReadAllStaticArrayVariableAccessLevelTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const int expected = Opc.Ua.AccessLevels.CurrentRead | Opc.Ua.AccessLevels.CurrentWrite;\n            var attributes = new List<AttributeReadRequestModel>();\n            for (var i = 10300; i < 10326; i++)\n            {\n                attributes.Add(new AttributeReadRequestModel\n                {\n                    Attribute = NodeAttribute.AccessLevel,\n                    NodeId = \"http://test.org/UA/Data/#i=\" + i\n                });\n            }\n\n            // Act\n            var result = await browser.ReadAsync(_connection, new ReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadAllStaticArrayVariableAccessLevelTest1Async),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                Attributes = attributes\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Results);\n            Assert.Equal(attributes.Count, result.Results.Count);\n            Assert.All(result.Results, r => Assert.Null(r.ErrorInfo));\n            Assert.All(result.Results, r => Assert.Equal(expected, (int)r.Value));\n        }\n\n        public async Task NodeReadAllStaticArrayVariableWriteMaskTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            var attributes = new List<AttributeReadRequestModel>();\n            for (var i = 10300; i < 10326; i++)\n            {\n                attributes.Add(new AttributeReadRequestModel\n                {\n                    Attribute = NodeAttribute.WriteMask,\n                    NodeId = \"http://test.org/UA/Data/#i=\" + i\n                });\n            }\n\n            // Act\n            var result = await browser.ReadAsync(_connection, new ReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadAllStaticArrayVariableWriteMaskTest1Async),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                Attributes = attributes\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Results);\n            Assert.Equal(attributes.Count, result.Results.Count);\n            Assert.All(result.Results, r => Assert.Null(r.ErrorInfo));\n            Assert.All(result.Results, r => Assert.Equal(0, (int)r.Value));\n        }\n\n        public async Task NodeReadAllStaticArrayVariableWriteMaskTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            var attributes = new List<AttributeReadRequestModel>();\n            for (var i = 10300; i < 10326; i++)\n            {\n                attributes.Add(new AttributeReadRequestModel\n                {\n                    Attribute = NodeAttribute.WriteMask,\n                    NodeId = \"http://test.org/UA/Data/#i=10300\"\n                });\n            }\n\n            // Act\n            var result = await browser.ReadAsync(_connection, new ReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadAllStaticArrayVariableWriteMaskTest2Async),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                Attributes = attributes\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Results);\n            Assert.Equal(attributes.Count, result.Results.Count);\n            Assert.All(result.Results, r => Assert.Null(r.ErrorInfo));\n            Assert.All(result.Results, r => Assert.Equal(0, (int)r.Value));\n        }\n\n        public async Task NodeReadStaticArrayBooleanValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10300\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsBoolean, $\"{result.Value[0]} is not a boolean.\");\n            Assert.Equal(\"Boolean\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArraySByteValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10301\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n            Assert.Equal(\"SByte\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayByteValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10302\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.Equal(\"ByteString\", result.DataType);\n            Assert.True(result.Value.IsNull() || result.Value!.IsBytes);\n        }\n\n        public async Task NodeReadStaticArrayInt16ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10303\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n            Assert.Equal(\"Int16\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayUInt16ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10304\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n            Assert.Equal(\"UInt16\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayInt32ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10305\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n            Assert.Equal(\"Int32\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayUInt32ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10306\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n            Assert.Equal(\"UInt32\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayInt64ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10307\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n            Assert.Equal(\"Int64\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayUInt64ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10308\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n            Assert.Equal(\"UInt64\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayFloatValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10309\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsFloat, $\"First is {result.Value}\");\n            Assert.Equal(\"Float\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayDoubleValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10310\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsDouble);\n            Assert.Equal(\"Double\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayStringValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10311\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsString, $\"{result.Value[0]} is not a string.\");\n            Assert.Equal(\"String\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayDateTimeValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10312\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsDateTime);\n            Assert.Equal(\"DateTime\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayGuidValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10313\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsGuid);\n            Assert.Equal(\"Guid\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayByteStringValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10314\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            if (result.Value.IsNull())\n            {\n                return;\n            }\n            Assert.True(result.Value!.IsListOfValues);\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n            // TODO: Can be null.  Assert.Equal(VariantValueType.String, (result.Value)[0].Type);\n            // TODO:  Assert.Equal(VariantValueType.Bytes, (result.Value)[0].Type);\n            Assert.Equal(\"ByteString\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayXmlElementValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10315\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsBytes);\n            Assert.Equal(\"XmlElement\", result.DataType);\n            var xml = result.Value[0].ConvertTo<XmlElement>();\n            Assert.NotNull(xml);\n        }\n\n        public async Task NodeReadStaticArrayNodeIdValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10316\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsString, $\"{result.Value[0]} is not a string.\");\n            Assert.Equal(\"NodeId\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayExpandedNodeIdValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10317\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsString, $\"{result.Value[0]} is not a string.\");\n            Assert.Equal(\"ExpandedNodeId\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayQualifiedNameValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10318\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsString, $\"{result.Value[0]} is not a string.\");\n            Assert.Equal(\"QualifiedName\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayLocalizedTextValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10319\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsObject, $\"{result.Value[0]} is not an object.\");\n            Assert.Equal(\"LocalizedText\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayStatusCodeValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10320\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n            Assert.True(\n               result.Value[0].IsObject ||\n               result.Value[0].IsInteger, $\"{result.Value[0]} is not a integer or object.\");\n            Assert.Equal(\"StatusCode\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayVariantValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10321\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n        }\n\n        public async Task NodeReadStaticArrayEnumerationValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10322\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n            Assert.Equal(\"Int32\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayStructureValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10323\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsObject, $\"{result.Value[0]} is not an object.\");\n            // TODO: Assert.Equal(VariantValueType.Bytes, (result.Value)[0].Type);\n            Assert.Equal(\"ExtensionObject\", result.DataType);\n        }\n\n        public async Task NodeReadStaticArrayNumberValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10324\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsArray, $\"Not an array {result.Value}\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n            Assert.True(result.Value[0].IsDouble || result.Value[0].IsDecimal,\n                $\"Not a number {result.Value[0]}\");\n        }\n\n        public async Task NodeReadStaticArrayIntegerValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10325\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsListOfValues, $\"{result.Value} is not a list.\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n        }\n\n        public async Task NodeReadStaticArrayUIntegerValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10326\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n\n            Assert.True(result.Value.IsArray, $\"Not an array {result.Value}\");\n            if (result.Value.Count == 0)\n            {\n                return;\n            }\n\n            Assert.True(result.Value[0].IsInteger, $\"{result.Value[0]} is not an integer.\");\n        }\n\n        /// <summary>\n        /// Helper to compare equal value\n        /// </summary>\n        /// <param name=\"expected\"></param>\n        /// <param name=\"value\"></param>\n        private static void AssertEqualValue(VariantValue? expected, VariantValue? value)\n        {\n            Assert.True(VariantValue.DeepEquals(expected, value),\n                $\"Expected: {expected}  != Actual: {value} \");\n        }\n\n        private readonly T _connection;\n        private readonly Func<T, string, IJsonSerializer, Task<VariantValue>> _readExpected;\n        private readonly DefaultJsonSerializer _serializer;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/ReadScalarValueTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using System.Xml;\n    using Xunit;\n\n    public class ReadScalarValueTests<T>\n    {\n        /// <summary>\n        /// Create node services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"readExpected\"></param>\n        public ReadScalarValueTests(Func<INodeServices<T>> services, T connection,\n            Func<T, string, IJsonSerializer, Task<VariantValue>> readExpected)\n        {\n            _services = services;\n            _connection = connection;\n            _serializer = new DefaultJsonSerializer();\n            _readExpected = readExpected;\n        }\n\n        public async Task NodeReadAllStaticScalarVariableNodeClassTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const Opc.Ua.NodeClass expected = Opc.Ua.NodeClass.Variable;\n\n            var attributes = new List<AttributeReadRequestModel>();\n            for (var i = 10216; i < 10243; i++)\n            {\n                attributes.Add(new AttributeReadRequestModel\n                {\n                    Attribute = NodeAttribute.NodeClass,\n                    NodeId = \"http://test.org/UA/Data/#i=\" + i\n                });\n            }\n\n            // Act\n            var result = await browser.ReadAsync(_connection, new ReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadAllStaticScalarVariableNodeClassTest1Async),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                Attributes = attributes\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Results);\n            Assert.Equal(attributes.Count, result.Results.Count);\n            Assert.All(result.Results, r => Assert.Null(r.ErrorInfo));\n            Assert.All(result.Results, r => Assert.Equal((int)expected, (int)r.Value));\n        }\n\n        public async Task NodeReadAllStaticScalarVariableAccessLevelTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const byte expected = Opc.Ua.AccessLevels.CurrentReadOrWrite;\n\n            var attributes = new List<AttributeReadRequestModel>();\n            for (var i = 10216; i < 10243; i++)\n            {\n                attributes.Add(new AttributeReadRequestModel\n                {\n                    Attribute = NodeAttribute.AccessLevel,\n                    NodeId = \"http://test.org/UA/Data/#i=\" + i\n                });\n            }\n\n            // Act\n            var result = await browser.ReadAsync(_connection, new ReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadAllStaticScalarVariableAccessLevelTest1Async),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                Attributes = attributes\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Results);\n            Assert.Equal(attributes.Count, result.Results.Count);\n            Assert.All(result.Results, r => Assert.Null(r.ErrorInfo));\n            Assert.All(result.Results, r => Assert.Equal(expected, (int)r.Value));\n        }\n\n        public async Task NodeReadAllStaticScalarVariableWriteMaskTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            var attributes = new List<AttributeReadRequestModel>();\n            for (var i = 10216; i < 10243; i++)\n            {\n                attributes.Add(new AttributeReadRequestModel\n                {\n                    Attribute = NodeAttribute.WriteMask,\n                    NodeId = \"http://test.org/UA/Data/#i=\" + i\n                });\n            }\n\n            // Act\n            var result = await browser.ReadAsync(_connection, new ReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadAllStaticScalarVariableWriteMaskTest1Async),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                Attributes = attributes\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Results);\n            Assert.Equal(attributes.Count, result.Results.Count);\n            Assert.All(result.Results, r => Assert.Null(r.ErrorInfo));\n            Assert.All(result.Results, r => Assert.Equal(0, (int)r.Value));\n        }\n\n        public async Task NodeReadAllStaticScalarVariableWriteMaskTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            var attributes = new List<AttributeReadRequestModel>();\n            for (var i = 10216; i < 10243; i++)\n            {\n                attributes.Add(new AttributeReadRequestModel\n                {\n                    Attribute = NodeAttribute.WriteMask,\n                    NodeId = \"http://test.org/UA/Data/#i=10216\"\n                });\n            }\n\n            // Act\n            var result = await browser.ReadAsync(_connection, new ReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadAllStaticScalarVariableWriteMaskTest2Async),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                Attributes = attributes\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.Results);\n            Assert.Equal(attributes.Count, result.Results.Count);\n            Assert.All(result.Results, r => Assert.Null(r.ErrorInfo));\n            Assert.All(result.Results, r => Assert.Equal(0, (int)r.Value));\n        }\n\n        public async Task NodeReadStaticScalarBooleanValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10216\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadStaticScalarBooleanValueVariableTestAsync),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsBoolean, $\"{result.Value} is not a boolean.\");\n            Assert.True(VariantValue.DeepEquals(expected, result.Value),\n                $\"Expected: {expected} != Actual: {result.Value}\");\n            Assert.Equal(\"Boolean\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10159\"; // Scalar\n            var path = new[] {\n                \".http://test.org/UA/Data/#BooleanValue\"\n            };\n            var expected = await _readExpected(_connection, \"http://test.org/UA/Data/#i=10216\", _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadStaticScalarBooleanValueVariableTestAsync),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                NodeId = node,\n                BrowsePath = path\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsBoolean, $\"{result.Value} is not a boolean.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Boolean\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10159\"; // Scalar\n            var path = new[] {\n                \"http://test.org/UA/Data/#BooleanValue\"\n            };\n            var expected = await _readExpected(_connection, \"http://test.org/UA/Data/#i=10216\", _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadStaticScalarBooleanValueVariableTestAsync),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                NodeId = node,\n                BrowsePath = path\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsBoolean, $\"{result.Value} is not a boolean.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Boolean\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarBooleanValueVariableWithBrowsePathTest3Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            var path = new[] {\n                \"Objects\",\n                \"http://test.org/UA/Data/#Data\",\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#Scalar\",\n                \"http://test.org/UA/Data/#BooleanValue\"\n            };\n            var expected = await _readExpected(_connection, \"http://test.org/UA/Data/#i=10216\", _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadStaticScalarBooleanValueVariableTestAsync),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                BrowsePath = path\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsBoolean, $\"{result.Value} is not a boolean.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Boolean\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarSByteValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10217\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"SByte\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarByteValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10218\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Byte\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarInt16ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10219\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Int16\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarUInt16ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10220\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadStaticScalarUInt16ValueVariableTestAsync),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"UInt16\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarInt32ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10221\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Int32\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarUInt32ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10222\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"UInt32\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarInt64ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10223\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Int64\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarUInt64ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10224\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"UInt64\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarFloatValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10225\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsFloat);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Float\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarDoubleValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10226\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsDouble);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Double\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarStringValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10227\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsString, $\"{result.Value} is not a string.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"String\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarDateTimeValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10228\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsDateTime);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"DateTime\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarGuidValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10229\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsGuid);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Guid\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarByteStringValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10230\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"ByteString\", result.DataType);\n            // TODO : Assert.Equal(VariantValueType.Bytes, result.Value.Type);\n            // TODO : Assert.Equal(VariantValueType.String, result.Value.Type);\n        }\n\n        public async Task NodeReadStaticScalarXmlElementValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10231\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsBytes);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"XmlElement\", result.DataType);\n            var xml = result.Value.ConvertTo<XmlElement>();\n            Assert.NotNull(xml);\n        }\n\n        public async Task NodeReadStaticScalarNodeIdValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10232\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            // Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsString, $\"{result.Value} is not a string.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"NodeId\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarExpandedNodeIdValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10233\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsString, $\"{result.Value} is not a string.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"ExpandedNodeId\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarQualifiedNameValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10234\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsString, $\"{result.Value} is not a string.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"QualifiedName\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarLocalizedTextValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10235\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsObject, $\"{result.Value} is not an object.\");\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"LocalizedText\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarStatusCodeValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10236\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(\n                result.Value.IsObject ||\n                result.Value.IsInteger);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"StatusCode\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarVariantValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10237\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n            // Assert.Equal(\"BaseDataType\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarEnumerationValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10238\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.NotNull(result.Value);\n            Assert.True(result.Value.IsInteger, $\"{result.Value} is not an integer.\");\n            AssertEqualValue(expected, result.Value);\n            // TODO: Assert.Equal(\"Enumeration\", result.DataType);\n            Assert.Equal(\"Int32\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarStructuredValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10239\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            Assert.True(result.Value!.IsObject);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"ExtensionObject\", result.DataType);\n            // TODO: Assert.Equal(\"Structure\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarNumberValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10240\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n            // Assert.Equal(\"Number\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarIntegerValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10241\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n            // Assert.Equal(\"Integer\", result.DataType);\n        }\n\n        public async Task NodeReadStaticScalarUIntegerValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10242\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n            // Assert.Equal(\"UInteger\", result.DataType);\n        }\n\n        public async Task NodeReadDataAccessMeasurementFloatValueTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"nsu=DataAccess;s=1:FC1001?Measurement\";\n            var expected = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n\n            // Act\n            var result = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                NodeId = node\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(result);\n            Assert.NotNull(result.SourceTimestamp);\n            Assert.NotNull(result.ServerTimestamp);\n            AssertEqualValue(expected, result.Value);\n            Assert.Equal(\"Float\", result.DataType);\n        }\n\n        public async Task NodeReadDiagnosticsNoneTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadDiagnosticsNoneTestAsync),\n                        Level = DiagnosticsLevel.None\n                    }\n                },\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#s=unknown\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.ErrorInfo);\n            Assert.Null(results.ErrorInfo.NamespaceUri);\n            Assert.Null(results.ErrorInfo.Locale);\n            Assert.Null(results.ErrorInfo.Inner);\n            Assert.Null(results.ErrorInfo.AdditionalInfo);\n            Assert.Null(results.ErrorInfo.ErrorMessage);\n            Assert.NotNull(results.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, results.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeReadDiagnosticsStatusTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadDiagnosticsStatusTestAsync),\n                        TimeStamp = DateTime.Now\n                    }\n                },\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#s=unknown\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.ErrorInfo);\n            Assert.Null(results.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", results.ErrorInfo.Locale);\n            Assert.Null(results.ErrorInfo.Inner);\n            Assert.Null(results.ErrorInfo.AdditionalInfo);\n            Assert.Equal(\"BadNodeIdUnknown\", results.ErrorInfo.ErrorMessage);\n            Assert.NotNull(results.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, results.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeReadDiagnosticsDebugTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadDiagnosticsDebugTestAsync),\n                        Level = DiagnosticsLevel.Information\n                    }\n                },\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#s=unknown\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.ErrorInfo);\n            Assert.Null(results.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", results.ErrorInfo.Locale);\n            Assert.Null(results.ErrorInfo.Inner);\n            Assert.Null(results.ErrorInfo.AdditionalInfo);\n            Assert.Equal(\"BadNodeIdUnknown\", results.ErrorInfo.ErrorMessage);\n            Assert.NotNull(results.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, results.ErrorInfo.StatusCode);\n        }\n\n        public async Task NodeReadDiagnosticsVerboseTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n\n            // Act\n            var results = await browser.ValueReadAsync(_connection, new ValueReadRequestModel\n            {\n                Header = new RequestHeaderModel\n                {\n                    Diagnostics = new DiagnosticsModel\n                    {\n                        AuditId = nameof(NodeReadDiagnosticsVerboseTestAsync),\n                        Level = DiagnosticsLevel.Verbose\n                    }\n                },\n                NodeId = \"http://opcfoundation.org/UA/Boiler/#s=unknown\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            Assert.NotNull(results.ErrorInfo);\n            Assert.Null(results.ErrorInfo.NamespaceUri);\n            Assert.Equal(\"en-US\", results.ErrorInfo.Locale);\n            Assert.Null(results.ErrorInfo.Inner);\n            Assert.Null(results.ErrorInfo.AdditionalInfo);\n            Assert.Equal(\"BadNodeIdUnknown\", results.ErrorInfo.ErrorMessage);\n            Assert.NotNull(results.ErrorInfo.SymbolicId);\n            Assert.Equal(Opc.Ua.StatusCodes.BadNodeIdUnknown, results.ErrorInfo.StatusCode);\n        }\n\n        /// <summary>\n        /// Helper to compare equal value\n        /// </summary>\n        /// <param name=\"expected\"></param>\n        /// <param name=\"value\"></param>\n        private static void AssertEqualValue(VariantValue? expected, VariantValue? value)\n        {\n            Assert.True(VariantValue.DeepEquals(expected, value),\n                $\"Expected: {expected} != Actual: {value}\");\n        }\n\n        private readonly T _connection;\n        private readonly DefaultJsonSerializer _serializer;\n        private readonly Func<T, string, IJsonSerializer, Task<VariantValue>> _readExpected;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/WriteArrayValueTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Azure.IIoT.OpcUa.Encoders;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using Opc.Ua;\n    using System;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using System.Xml;\n    using Xunit;\n\n    public class WriteArrayValueTests<T>\n    {\n        /// <summary>\n        /// Create node services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"readExpected\"></param>\n        public WriteArrayValueTests(Func<INodeServices<T>> services, T connection,\n            Func<T, string, IJsonSerializer, Task<VariantValue>> readExpected)\n        {\n            _services = services;\n            _connection = connection;\n            _serializer = new DefaultJsonSerializer();\n            _readExpected = readExpected;\n        }\n\n        public async Task NodeWriteStaticArrayBooleanValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10300\";\n\n            var expected = _serializer.Parse(\n                \"[true,true,true,false,false,false,true,true,true,false,true,\" +\n                \"false,false,false,true,false,false,false,false,true,false,true,\" +\n                \"true,true,true,false]\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArraySByteValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10301\";\n\n            var expected = _serializer.Parse(\n                \"[-94,94,62,22,-50,36,105,103,-60,56,-102,-14,-59,-83,119,-101,\" +\n                \"-39,85,-9,-14,-7,-100,64,122,-107,-61,13,-10,-19,81,-52,57,\" +\n                \"-32,-90,27,-128,92,44,-32,13,-93,-10,46,9,-38,55,116,-11,-43,\" +\n                \"63,-45,-103,2]\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"SByte\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayByteValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10302\";\n\n            var expected = _serializer.Parse(\n                \"\\\"jgYexIAKF3N6c2tgEh6R9j+tdOlOAm43n15OFyGtfjI2VhgVYpis1fYvfL\" +\n                \"qdeiRVY94AJSUZ\\\"\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"ByteString\"\n                // TODO: Assert.Equal(\"Byte\", result.DataType);\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayInt16ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10303\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<short>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int16\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayUInt16ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10304\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<ushort>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInt16\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayInt32ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10305\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<int>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int32\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayUInt32ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10306\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<uint>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInt32\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayInt64ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10307\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<long>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int64\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayUInt64ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10308\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<ulong>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInt64\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayFloatValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10309\";\n\n            var expected = _serializer.FromObject(new float[] {\n                float.NaN,\n                0.0f,\n                1.0f,\n                0.0034f,\n                2543.354f,\n                float.MaxValue,\n                float.MinValue\n            });\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Float\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayDoubleValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10310\";\n\n            var expected = _serializer.FromObject(new double[] {\n                -5.0,\n                1.0,\n                0.0,\n                6.0,\n                10000.1,\n                double.MinValue,\n                double.MaxValue,\n                double.PositiveInfinity,\n                double.NegativeInfinity,\n                double.NaN\n            });\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Double\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayStringValueVariableTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10311\";\n\n            var expected = _serializer.FromObject(new string[] {\n                \"test\",\n                \"test2\",\n                \"test3\",\n                \"test4,\",\n                \"Test\",\n                \"TEST\"\n            });\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"String\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayStringValueVariableTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10311\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<string>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"String\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayDateTimeValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10312\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<DateTime>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"DateTime\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayGuidValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10313\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<Guid>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Guid\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayByteStringValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10314\";\n\n            var expected = _serializer.Parse(\n                \"[\\\"y5rM6KSrJ9+U0zDRyN8nPrLz4zyKydoagl0A2Sz0XTeJ0GevE2/tFCMCp\" +\n                \"Fj9IA7zLA==\\\",\\\"OLyUL7UBwLFmRqtOs6B1+Ef3eHgqQgbPGIglgRxhTw2t\" +\n                \"uLugo1obZe5hCadp1E4E4wTZFnuzSPa2xRYs3D+UBfeeoQ==\\\",\\\"5NVV7dw\" +\n                \"Sicg5X2ZEOiCeGIc4kflvxeneQ+6Ir80Er8oz\\\",\\\"Hw2v7DpoKn+8V17S8r\" +\n                \"uhfH2+DKeLH+t3qe2K2vs0r5sQ5wGQaZr+Kc/vCJJ/cPvMDlCG8b6LxwAhOE\" +\n                \"JM3U+DiKfDwQu6EBPiv+PYmxZZ9znxvcyrrb3dhR8AbjFXsUt/bIDq\\\",\\\"r\" +\n                \"vAR/TyjMtuzK+nIQAlbIIPY2urlPOy6oeKLDpdZL5ZuO4oB\\\",\\\"zm4JiwLS\" +\n                \"9Bam8E5WK/uTpQDWcgRXW1oYI0Na+1NaBX5adLVp0F7javej+/I8uGxdm/Ft\" +\n                \"ZBj9VHMU8Ge+ePjDTOvP+7dGKtWi8ggMtGBo3GvX/F9h7KBlXSBBVN/2JQ==\" +\n                \"\\\",\\\"/9+uB2y8tRdxG8pyEPCfEqwU++d7mGFfSmmelgTV9azNFg3VsWFvryH\" +\n                \"l7kUhLlVsgC+oyvo+dmZ9TrwCHR4SmyYepfrjymFLpUzFlqocPhwUMRbVLSq\" +\n                \"xj5+nWGKkbJED0lIf\\\",\\\"iVuJts1dJa144LxhEKDu6wc9bvttFlo8cv6mOb\" +\n                \"rCw1f8O5O5qGAHzwUDFr/q9lIEfqX7leQjlXIATUPPtuzzthxk\\\",\\\"1A00Q\" +\n                \"6c2nvZp/5pRe6yiuxXGLnPYpiC5Wxw4GRkQYKOGkn32SWJUX0UtK3Nl+8giF\" +\n                \"DHe7+3xjC7se+eK/YXcWZ/3y+kvq3Gycg==\\\",\\\"Lap7rVNfVBUF6DJwtZQG\" +\n                \"TgnNeslhv1DR024w3/Novyt9Hg==\\\",\\\"4bM/KIg26ID0Jy9BNuPgoqQ4qG5\" +\n                \"uWqnZ5S51IZwoBvKX0SSbyqXyk3g+W6qkLA==\\\",\\\"+xLGG/PUsFSGCWVCWc\" +\n                \"HG48wgPKpkvkTX/kUV9S/+/jW4NHkO1g0THuZ8npFk\\\",\\\"mNGyWo+KZ4GVP\" +\n                \"c7uHK2+uyWICy+JJUe3Db4MHsPoILNznK1EQ9VudM03njtA6PFmXytXFYY02\" +\n                \"HOJ+k3Rfg==\\\",\\\"vawdGnp/AHp4UBmWYlKGDHYkzKa+mJEKLD7DObpIh532\" +\n                \"g3nyHiVtcWXkswf879KF7H2DKQTXiyUbEu48vMbAL8h7oN7ZlO1QtltA2eSK\" +\n                \"Dj1rPUw8xA==\\\",\\\"mR74U9YMNzG1nySDPoBO9KtYkDNyqJc=\\\",\\\"QJEEsd\" +\n                \"B+eYNrauKC5Ya94BmEpqG1YUuN7neR9KuR6/CHRxJFCIZhNiWgGNOdzA==\\\"\" +\n                \",\\\"JZqvGe4C9fzfRXbCWOyF19o=\\\",\\\"8g==\\\",\\\"nnN42JMjb3sUSXjwImh\" +\n                \"sWfx3/e2RSzMAkcMISqDIPVSr0XGxItaGy5N655bMhqDwgCvbYoEEaVNAd0f\" +\n                \"PGiXaSwsjRFD3uzYl8DJaFmOcMwsiGMl07dvTpmcecKqPt7Bt\\\",\\\"m4upQV\" +\n                \"D5xfS2ck+qUu+kRDutAltmXjBPnejZSoyVOYHsd8gRicnSHgR/NmmD/BUuzG\" +\n                \"ZUCa4SOTxbWQ==\\\",\\\"ZyB6aCA4zr3bJ5O6cdrjVuYoxsyh06p+JUEv0to+i\" +\n                \"7YvJmv+ihcWMLQ/Ogc5rOIvy7tSFJSNApN1/EPfCPzinZvciktv5cw=\\\",\\\"\" +\n                \"EZYXYpmiRHlfAAcf63YhoiPXiI7TNyi4XJ1rXCGWwOXvgwL+daD607fJfwj1\" +\n                \"w7Eku+g=\\\",\\\"l1w++9ptXwb8NuhYyEAhMGd0IyyD3LXWCbcgw5jrR6E4byi\" +\n                \"IsIcnkBaa/pzOcbfH05NJsJe7o7un\\\",\\\"8SNNm20Q70cfWBiYf+BMkxbp3h\" +\n                \"gHmP9Y7wShlgl9y2zhSZUEQnos7ayHUl6vOxRpZAOlut2PX1kk\\\",\\\"rGlvW\" +\n                \"T2ijau3NUpIUZu98GyARqCos/A4MQXXEI9S6TzgTM7DflJJr9EEhN4eHLIJ/\" +\n                \"ewi3hKDTfh5Nig3ynwbZUwOZwTN+nEZNpbPoy8RGQ==\\\",\\\"U84Toi8KKV3+\" +\n                \"1UlHKhLlVOgfkhC0rjwDewmofLOqyWcdE+T8aHg1QeQKBfewKe4ksXu6D34J\" +\n                \"YKSRECcmYqypVAzhKhct6etw6VErqalFUlEag8s477rpFLJAalg=\\\",\\\"D94\" +\n                \"4YbDrzv/X9sePSiUt3rb7TL7WDN/hcWVS+BZk7X6THtpy8w==\\\",\\\"+FmDUU\" +\n                \"KNA6illLw1/EQdmnsD/1bvS5nW6XIISPwrS7rqbQLyOoTJUt3JwL084GipYf\" +\n                \"mj13OcWa3ArWg=\\\",\\\"hLuseUkBS45CK2D2Oq14JovbmQgKX+cCiHNHTRQ=\\\"\" +\n                \",\\\"MYwc+M0iHEZ0OpXZ\\\",\\\"NZisnMUkMiLlE1/FJNOp8dW6/Xnt+dPaQd9\" +\n                \"VCURnXnMw+LFp29aBKeEyTHi8MqlPclSegJhgeTzF0lvmzindfbTrlSshPxb\" +\n                \"+ONOXuqxaHQ42Bpbvyd4=\\\",\\\"0H91pAh7m1q4Vc/E0Z1+LTM+n0fEyL+Par\" +\n                \"VMsMiS7bTWEMSsrJsOg51432TdlkxwuNhjsSmW\\\",\\\"CL/lOVMu6pIlZxvtw\" +\n                \"dnRgJgwHKpM6Vqy1Gjb+O8vPIo/+bzsx2G6VLLmufzCqYuX5ljLgQ3syh5kM\" +\n                \"mXqU/Ki9iuQrccc5Lg2dcf3ZS9d8CrdQxGXZLp8\\\",\\\"Lp2IlfvQAb9DwtEx\" +\n                \"+8N7AZ+UC0X0ZO8GQToMD+ELknEUWZl+XCM7pcY3ImyMvy8ayBD3z642Xsmu\" +\n                \"gVPAw/HeNzBf\\\",\\\"oSn8pHxZZn69QoJ5gQvxR9ATwsLd+9DQ28964dVY6js\" +\n                \"soo3xy2t7dki4oYcrB9K10qkNJG6dP6ZZLMmt3oWpZFdGTd59AHxl\\\",\\\"S3\" +\n                \"klWUik0/3FDytKxs2PY+eXnqLNmMIOPC/kuvM30S2oiyIjGkwQh/WwGHZ9Gp\" +\n                \"F5vnuVaN0=\\\",\\\"yrO3Fh0ZwBkJjT3+oQ==\\\",\\\"qmtJm4cWrB1/TJEinWv8\" +\n                \"d6FoT+XBb2wDL/bH26aLOX94Vs5TMfrhxxasM2qF+nxUHZLs1K68eTr+RmyQ\" +\n                \"TtF39BMRqkac\\\",\\\"RqeHiM8UPAJ+NHpzvhSeZNG73ZNU645ReEU1Pldz\\\",\" +\n                \"\\\"NrdzS0RNJu1l/vzHOBbbEmNVrkDuaQlUWhg1D4re/aoK40S7SshaF6rOd5\" +\n                \"VYI1Y7nTLS6akzYsyuH/EsFxZjhgFRvVTSH8g=\\\",\\\"+5eVIPFz+zbC+nJXD\" +\n                \"BQB1oF3DCvXLf+Ua/GUB2YBaX1qN+0RnkLbOiO6ah2kC3rsUOY=\\\",\\\"WhOd\" +\n                \"w82YAbQA3/TQwJH07dQm7zg/m9EHHcPh7192p7Z/Lg5qzXQfeZ2N21su6amM\" +\n                \"\\\",\\\"HqbGYK6Uv0GVpQq2EVSJOD1Rkg==\\\",\\\"ih9fBnabscB22DMaVT9B0O\" +\n                \"BW0JlPKDfPFcKLOFEi8JgXCSX+RsDpE+L/yr1y8GHSErlY54D4M2HokPCzD3\" +\n                \"huVOebA0sZQ4kgbLy3\\\",\\\"Xno=\\\",\\\"JWG4JZjKCRce1sQWts82A2mQdtXW\" +\n                \"7Ba5zzA3esRB4wNtM8pSV1LWit6E5HVVLdJQNrhNv+elhjhL/lZnko9S3PLA\" +\n                \"qIME5KwWuuz3UgihZKJd50ML\\\",\\\"JBvIrZIHWPxu904xB4KUhU9LUgw2Bfs\" +\n                \"=\\\",\\\"NDCpmrMJq0tH6M6k39Vy3FMaS/SoIAAezx0Om/H+vR4gG3hiXb5IZE\" +\n                \"wD6R+08KV52XW4HLoHBRMvisqW+w9ZSCqvhMQ=\\\",\\\"EH+U0eanpDbhat93l\" +\n                \"cF8RaFkGBVlMtLzsWk8qqH0BGvhHMn1I0rTX2DdTiDrH2VN3QKJS2uu996so\" +\n                \"R98avqV7WZzlnj4hiFWkLm1iOOyB5ID782ea7kAMiTrSIIrV/RmR2C5\\\",\\\"\" +\n                \"iexVVuEyurL5b/r6mYx4ey33gq1zY1QNPZ8rOcROQIP4jgkWmna8OP5NObXx\" +\n                \"Tuie3nk5T94MBSWYRxlBBoHuqi53AQqDYeE=\\\",\\\"OkmuJSqeHA==\\\",\\\"to\" +\n                \"1aSw==\\\",\\\"8aTsieN+Ulx7Mn1ejoZ6TN0afZeCFJVd3/v5KyqLeSajlD3SF\" +\n                \"YGg449avxcxx5sYoqLYct2zk9wPjqnnhCcy8LhWu/lJpzZceg==\\\",\\\"CCdV\" +\n                \"fSwYYOGIh7IHSe8BYMOH17heaCfPXtsLoc77a3z4Q6prhpFhkYejnqo9sQzL\" +\n                \"+Ojjr4TCOqD/hh9RDL4SjRw2DgVEldoyJUYwu8l9ka3OQKg=\\\",\\\"F7z3NQg\" +\n                \"KbAByEITJ\\\",\\\"EI4HogeGYw6xiT6Rf9aC9HGDzBUsdl8/2Q==\\\",\\\"OinZv\" +\n                \"xXCZiu574oKx7lF12UzuKOJM+kMAI23s2OZLg==\\\",\\\"yQlMOjTydHwrUx2T\" +\n                \"ame8EtBUESyGNXMGP82/\\\",\\\"CrLHH8DBQb1tCqJzvjx4NRZWoZjRpOMOiAJ\" +\n                \"BlJVF+2cy7HF4i/7SqCb+pcWynm1KvA==\\\",\\\"7+grJrVlzrmXvoCtJygPO0\" +\n                \"DSygCpGIT5ctL/Hlw=\\\",\\\"lPfXV1UTOws2DKnSZxQoeNd9tnZdm4C8lNdjM\" +\n                \"rPjZrBcrSmI1c/S/P81m71W17Fw0Pn7gmjmi/l2GsN+rwhXU6X5dQ==\\\",\\\"\" +\n                \"6p+jB6q5dij/wmW8JvNhuufkSHYhLxK6DFRN991HGF1h94UxVvPXrm9i+bS0\" +\n                \"Ble7p51rwbD/l7qN6Ps=\\\",\\\"bH9LuKoIWi5uMGP0DJkHvjZdBQb8kU8/3Fa\" +\n                \"sYl/LpG74gEHwF0EKrKspTXc6d7QX99mEL+L1WtsvC9tTW/jOo4v0/IxXF6f\" +\n                \"0U1la0kTYBWWilWo=\\\",\\\"RnWMAiVmwAtltlGzWqrrRXoov+AxkNyJmoeWVg\" +\n                \"Z2scWNSFwWaPlm8VabjpwIp3ea7L/qedaJVLaZA2idz2kF7wU=\\\",\\\"JRJN1\" +\n                \"d2Awc2K\\\",\\\"AT+A8xD8aUaMN+8D8w==\\\",\\\"fWWRyCHslp+WfYFlTBfiabc\" +\n                \"I/760WYJ1jdM=\\\",\\\"vmLNmyEfp1d37/msnf9iqANxqq9SZCKA5gQ08STjHD\" +\n                \"pO7dg8yeFfRaW/anm+W2K/UbB+A+MjrVk/TbQd6rUzlNO+XrAnJd8i\\\",\\\"Z\" +\n                \"AqS+qjBiqF1oHNkGFcqP379eyxBWu+L1aYA/bKXK9Bc8n4YGl+WjCl7dRXAM\" +\n                \"LpmM3CoKGT1zwkaBg==\\\",\\\"AsGN7910ogcm2RIkH2bvA8bl2suk65nJQe8D\" +\n                \"bGcidP0TOpTKnIuXoR0plI0hS4jCdPIJJEA7gBYnw67ucTWfA2UUEeXRJGY6\" +\n                \"TTmte1cMqPZmQPd1GU+92Ll9otjdqS/niZAn\\\",\\\"OqLwT4vP1gaOBL8bG7e\" +\n                \"HMD4q6hVWOCtTgY1cpAnF8sY=\\\",\\\"mrvDUKfpSXm2SbW+h70lIf+pXqYStg\" +\n                \"F3nM79cjL8yBH4NoD7w+CWQKGbn+52lfrQNoIKG5Mg0uS6TLPZ7NZHuYGjxl\" +\n                \"E9KV4eEx4EdhcSAAc=\\\",\\\"LTyv8qx+2GSbQXYsvFTKVOVt0s+pkgwk6wh1G\" +\n                \"1vNp0ysBr+amMfUJe3soejn8VfJOiIxpS04KpovigakCLwIzg==\\\",\\\"KoC1\" +\n                \"lS+8Hpit\\\",\\\"vPEkPfmwq+A4mwIec9skaw==\\\",\\\"wDAdMeTSTrxxoTQKZh\" +\n                \"MMgFdtqApNDPNc288zlwwM2nDErl1okK8=\\\",\\\"H9aBiA921dKI9Z0cbntgw\" +\n                \"LQ8wFUUn7avZMfERri2o/CnlQ==\\\",\\\"NMuD5OUG/auibvBr9GTuqSzPWsR/\" +\n                \"INEkR7KPGtJRrXXY8iz0MFjbTxb0FEB0W9DhyQ13IUzRChP6X5wyduPYUMF6\" +\n                \"kwI4+njU8wutiwyRsA==\\\",\\\"4a1QxNqMKQfoGPrRu6jYMhvEf/nIzqnPlKM\" +\n                \"tQCM=\\\",\\\"B2iusFHIkhR1NVGMGSAApxhKM3twRxK2JBMEgTA3XujjaRCRIg\" +\n                \"tXD58HTkmnPLSJzu2K4g0=\\\",\\\"Dr9W94w9xBHjPtZpqLAPboQN8yPbafnID\" +\n                \"udfe7JDrHvaO1tQOyp/GkuOIxBzPpMEeWBofe/q\\\",\\\"pcaN6KTeSF6gklqP\" +\n                \"bVW+M1mO2NdMRelV0FNbAg==\\\",\\\"2i6M7222iq1C2jwDL4J9GK8mr7osDu8\" +\n                \"WE4Bf3TgYUIJGDMZjzp//njSFF7Oc1B3DazwgLKxHJcs/ddztVq11KQ==\\\",\" +\n                \"\\\"ub0jvBpKECcQhqf2O3o+Y5xx/Pcj1v7m+iNZwhFIhxDuKeMX+QZR8hAFnM\" +\n                \"F+1QT7nYq5O3gyZuK+PcH28E0Vx/+XCBGXJ2mVIArnHjo8ZyUfXiSHjkuXvA\" +\n                \"==\\\",\\\"AFi7RFoBwu/UwufM8mR2ICQabktHqIHVnNeSKI45s/9MTZbOrVHGC\" +\n                \"CQuZnqAWCz6rmZqMChxfFfX5qiDbplhmw7ngKTNp3LT\\\",\\\"ZiYYQgdURKqY\" +\n                \"eifPg9fb0T73x6hDmorNy2uZ2IgsB/SX28JKYxXPkWTY1h85zIsQpNKOr6sq\" +\n                \"EcucSnebu2sia3IzNw==\\\",\\\"FJBuKSg1RGrEa5P/4IgztZ5XSG3K9q4YnjT\" +\n                \"V+LZqrAaU4/sUZGWHdeWmBzG3eLsyOGzNG+rK3R7iVYr0YEy0Wb6NavyNHw=\" +\n                \"=\\\"]\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"ByteString\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayXmlElementValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10315\";\n\n            var expected = _serializer.FromObject(_generator.GetRandomArray<XmlElement>());\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"XmlElement\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayNodeIdValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10316\";\n\n            var expected = _serializer.Parse(\n                \"[\\\"s=%eb%85%b9%ec%83%89%ec%9a%a9\\\",\" +\n                \"\\\"http://test.org/UA/Data//Instance#g=bc3623b6-cb5f-e6be-1c13-378f9126c663\\\",\" +\n                \"\\\"http://samples.org/UA/memorybuffer#i=1556000973\\\",\" +\n                \"\\\"b=728HLX82OBG556w1XptI6JmYAeS%2bs33GiJu3gjZHWRJ8o3Bct7mc3f592D8ZLQ\" +\n                    \"l5hMckxA%2fVWjvxQaTkfrXbco2auLoq7DHg%2byPlQNs%2brFuRPf5vIpUCp0k0ag%3d%3d\\\",\" +\n                \"\\\"http://samples.org/UA/memorybuffer#b=XkiiZbF%2bdE9PmJVDyOzvGWCzlElTQbdsT%2fiYEQ%3d%3d\\\",\" +\n                \"\\\"i=1137425282\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Boiler/#i=781022622\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Boiler//Instance#i=3738789614\\\",\" +\n                \"\\\"s=%e8%9b%87\\\",\" +\n                \"\\\"http://samples.org/UA/memorybuffer#s=%ec%9b%90%ec%88%ad%ec%9d%b4\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Boiler/#g=63e6b815-59de-d915-7884-26527beb2666\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Boiler//Instance#b=UJJxK4FZQCLL2gDeqAtnX9RHg2OUUABmSO9ltOiQe2hT\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Boiler//Instance#b=pI1kCZ03Sv93pn1HE4tSHt%2btvg%3d%3d\\\",\" +\n                \"\\\"http://test.org/UA/Data/#i=4103267082\\\",\" +\n                \"\\\"http://test.org/UA/Data/#s=%e9%bb%91%e8%89%b2\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Diagnostics#i=1186710474\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Boiler//Instance#b=XQUB7qFxHaBdPl2JpQtAEpqq0\" +\n                    \"hUQ%2fQ%2bf4BqefFDPCzpl52D6kBtBINbr2%2fwCDebTirEgnBFktV%2f2YQ6H0qFQjTIiJL6qRoF%2baLE%2b\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Diagnostics#s=%e7%b7%91%e3%83%96%e3%83%89%e3%82%a6\\\",\" +\n                \"\\\"http://samples.org/UA/memorybuffer/Instance#g=296faf9f-3101-0401-2e0c-b94d359a4dca\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Diagnostics#i=792930600\\\",\" +\n                \"\\\"http://samples.org/UA/memorybuffer/Instance#s=%eb%b0%94%eb%82%98%eb%82%98\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Boiler/#i=139672771\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Diagnostics#g=22f9c2de-a88d-5342-71ae-64098bd449bd\\\",\" +\n                \"\\\"http://opcfoundation.org/UA/Boiler//Instance#i=225423009\\\",\" +\n                \"\\\"http://test.org/UA/Data/#b=ocMhatBmRYbobwfmxpuAAdwwhPobBGmZBlNHZv\" +\n                    \"9B0YYvRvlIeihSBDomVB1yFwIK2T3bfOwJxah2R9H96Gp52AtnvmDz\\\",\" +\n                \"\\\"http://samples.org/UA/memorybuffer/Instance#i=56793307\\\",\" +\n                \"\\\"http://test.org/UA/Data/#b=1kZSrfTPYIdPipmDIylA%2fPvHwSChwYTMoE578\" +\n                    \"yc5Vi82S0iXM%2fmpsVb4XxFGcGsSmptnPJYOkBXChQ2mU21fFjNqTdjhqckBHg%2fKqWFzhi%2fiaFiM0hqY\" +\n                    \"J7sy1a7rAg%3d%3d\\\",\" +\n                \"\\\"http://samples.org/UA/memorybuffer/Instance#b=Sd3cIpMx8dJmHYZE57NO%2f97D6hXTRBk%3d\\\",\" +\n                \"\\\"http://test.org/UA/Data/#g=1ad3ae1c-1c15-e1b1-0f18-96aa0c4f3766\\\"]\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"NodeId\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayExpandedNodeIdValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10317\";\n\n            var expected = _serializer.Parse(\n                \"[\\\"http://samples.org/UA/memorybuffer/Instance#i=2144658193\\\",\" +\n                \"\\\"http://samples.org/UA/memorybuffer#b=c9PGBcMJ%2fXaDHbdQAdVi15q4Vd\" +\n                    \"F0s64Z2BzAQUguTWwH3T4OSRPSoA%2fZs0gCG%2fs8gfzkzVk8yr8krC2nSLstV\" +\n                    \"dBLSCSWVI2H5rTBm%2f9mFrwhhMA%3d\\\", \" +\n                \"\\\"http://opcfoundation.org/UA/Boiler/#g=7e12cb12-9cea-2be5-5753-ab5e78b7d3d7\\\"]\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"ExpandedNodeId\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayQualifiedNameValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10318\";\n\n            var expected = _serializer.FromObject(new string[] {\n                \"http://test.org/UA/Data/#afsdff\",\n                \"http://test.org/UA/Data/#tt\",\n                \"http://test.org/UA/Data/#sdf\",\n                \"http://test.org/UA/Data/#afsdff\",\n                \"http://test.org/UA/Data/#sg\",\n                \"http://test.org/UA/Data/#afsdff\",\n                \"http://test.org/UA/Data/#afsdff\",\n                \"http://test.org/UA/Data/#23234\",\n                \"nanananana\",\n                \"http://test.org/UA/Data/#afsdff\",\n                \"http://test.org/UA/Data/#w\",\n                \"afsdff\"\n            });\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"QualifiedName\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayLocalizedTextValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10319\";\n\n            var expected = _serializer.Parse(\"[\" +\n                \"{\\\"Text\\\":\\\"복숭아_ 파인애플&quot 황색 말 검정: 황색 고양이 자주색! 파인애플 녹색( 암소& 개 딸기 양 망고 들쭉 뱀 용> 고양이 빨간 파란 빨간@ 들쭉\\\",\\\"Locale\\\":\\\"ko\\\"},\" +\n                \"{\\\"Text\\\":\\\"Бело Корова. Известка\\\",\\\"Locale\\\":\\\"ru\\\"},\" +\n                \"{\\\"Text\\\":\\\"석회* 파인애플) 말= 바나나^ 양/\\\",\\\"Locale\\\":\\\"ko\\\"},\" +\n                \"{\\\"Text\\\":\\\"코끼리 백색! 황색# 뱀{ 바나나? 파인애플 녹색 백색^ 빨간> 녹색&\\\",\\\"Locale\\\":\\\"ko\\\"},\" +\n                \"{\\\"Text\\\":\\\"Horse? Blueberry% Pineapple Peach Red/ Banana$ Cat& Black_ Lemon Cat Purple Pig Red Horse Pineapple&quot\\\",\\\"Locale\\\":\\\"en-US\\\"},\" +\n                \"{\\\"Text\\\":\\\"紫色^ 菠萝 柠檬 桃子 蓝色; 马= 大象 马 狗 狗( 母牛$ 绵羊. 马 鼠 马 马 草莓 柠檬* 大象 马$ 柠檬 蛇 红色 白色$ 猴子 绿色 紫色* 猪 草莓& 草莓 龙# 绿色* 蛇 葡萄\\\",\\\"Locale\\\":\\\"zh-CN\\\"},\" +\n                \"{\\\"Text\\\":\\\"绿色 紫色 白色 鼠 母牛} 蓝莓* 草莓 蛇< 猴子 香蕉_ 柠檬. 猫 猫 桃子 大象 柠檬 葡萄 桃子&quot 绿色 菠萝? 桃子\\\",\\\"Locale\\\":\\\"zh-CN\\\"},\" +\n                \"{\\\"Text\\\":\\\"파란 바나나 빨간 파인애플&quot 검정 용 돼지 들쭉^ 암소 암소 고양이 황색> 복숭아\\\",\\\"Locale\\\":\\\"ko\\\"},\" +\n                \"{\\\"Text\\\":\\\"Mango$ Snake Monkey&quot Dragon# Rat( Rat Mango] Pineapple Black Dog Dog/\\\",\\\"Locale\\\":\\\"en-US\\\"},\" +\n                \"{\\\"Text\\\":\\\"Овцы&quot Овцы^ Дракон^ Манго Бело% Собака Змейка\\\",\\\"Locale\\\":\\\"ru\\\"},\" +\n                \"{\\\"Text\\\":\\\"Чернота Собака] Корова Бело) Лимон/ Кот\\\",\\\"Locale\\\":\\\"ru\\\"},\" +\n                \"{\\\"Text\\\":\\\"원숭이= 복숭아}\\\",\\\"Locale\\\":\\\"ko\\\"},\" +\n                \"{\\\"Text\\\":\\\"黒% いちご; ブタ 赤い_ ドラゴン$ ブドウ- パイナップル@ 猫% バナナ 青い= レモン いちご* 象 バナナ 白い} 白い 犬&quot 紫色 馬 猫) 馬 マンゴ+ バナナ) ヒツジ ブドウ\\\",\\\"Locale\\\":\\\"jp\\\"},\" +\n                \"{\\\"Text\\\":\\\"狗~ 大象, 柠檬 紫色 猴子 蓝色$ 柠檬 猫 猫 葡萄$ 猫 狗' 蓝色 绿色# 猴子 猪; 猴子 绿色/ 葡萄\\\",\\\"Locale\\\":\\\"zh-CN\\\"},\" +\n                \"{\\\"Text\\\":\\\"Лимон# Желтыйцвет% Зеленыйцвет* Овцы Корова\\\",\\\"Locale\\\":\\\"ru\\\"},\" +\n                \"{\\\"Text\\\":\\\"Известка Желтыйцвет^ Кот= Желтыйцвет( Зеленыйцвет) Кот Кот\\\",\\\"Locale\\\":\\\"ru\\\"},\" +\n                \"{\\\"Text\\\":\\\"パイナップル ラット 犬* ドラゴン^ ドラゴン} ヘビ 猿- 黄色* パイナップル]\\\",\\\"Locale\\\":\\\"jp\\\"},\" +\n                \"{\\\"Text\\\":\\\"말 돼지&quot 검정& 녹색* 딸기{ 망고] 들쭉&quot 뱀< 말# 양~ 용@ 뱀/ 파인애플 파인애플+ 돼지 황색{ 고양이, 녹색 검정 양. 뱀 용 자주색_ 들쭉\\\",\\\"Locale\\\":\\\"ko\\\"},\" +\n                \"{\\\"Text\\\":\\\"파인애플 자주색 자주색: 빨간 백색 빨간\\\",\\\"Locale\\\":\\\"ko\\\"},\" +\n                \"{\\\"Text\\\":\\\"猴子 猫! 桃子, 香蕉* 猴子; 蓝莓 草莓 红色 黄色 蓝莓/ 鼠 蛇 黑色> 芒果' 芒果, 红色@ 石灰 蓝色 猫{ 鼠\\\",\\\"Locale\\\":\\\"zh-CN\\\"},\" +\n                \"{\\\"Text\\\":\\\"牛 石灰> 馬* ヒツジ 黒? 黒~ いちご_ バナナ_\\\",\\\"Locale\\\":\\\"jp\\\"},\" +\n                \"{\\\"Text\\\":\\\"ヘビ} 青い 猿 猿 馬 ヘビ% 黄色) いちご いちご< 紫色/\\\",\\\"Locale\\\":\\\"jp\\\"},\" +\n                \"{\\\"Text\\\":\\\"Овцы Голубика Красно Змейка` Ананас Персик` Кот Банан Крыса\\\",\\\"Locale\\\":\\\"ru\\\"},\" +\n                \"{\\\"Text\\\":\\\"白色' 芒果 狗 芒果) 红色 桃子, 桃子; 蛇- 鼠 鼠 草莓 黄色 红色 蓝色* 白色&quot 葡萄%\\\",\\\"Locale\\\":\\\"zh-CN\\\"}]\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"LocalizedText\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayStatusCodeValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10320\";\n\n            var expected = _serializer.Parse(\"[2555904,9306112]\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"StatusCode\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayVariantValueVariableTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10321\";\n\n            var encoder = new JsonVariantEncoder(new ServiceMessageContext(), _serializer);\n            var values = _generator.GetRandomArray<string>();\n            var expected = _serializer.FromObject(values\n                .Select((object v) =>\n                {\n                    var body = encoder.Encode(new Variant(v), out var t);\n                    return _serializer.FromObject(new\n                    {\n                        Type = t.ToString(),\n                        Body = body\n                    });\n                }));\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Variant\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, _serializer.FromObject(values), result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayEnumerationValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10322\";\n\n            var expected = _serializer.Parse(\n                \"[213809063,256148911,1403441746,1765077059,1459915248,178083\" +\n                \"9730,1170915216,676529496,206863250,700571842,1421759593,311\" +\n                \"197401,2102772218,857824445,1673233467,1438792918,682491618,\" +\n                \"113683929,1784104203,508655730,154788171,1059835353,18362300\" +\n                \"58,201534405,291502570,265713070,1462120528,163301337,883718\" +\n                \"228,387243245,241294166,1024734946,868521396,1226516137,2049\" +\n                \"366608,1946103069,966183232,874571368,1377393447,1387753822,\" +\n                \"558428041,1888176372,210663882,185274868,1386322555,12440540\" +\n                \"68,45448351,2138501043,223371060,643696097,1931984232,590598\" +\n                \"358,992471751,2028344606,1582760362,1301457357,567402500,120\" +\n                \"1907341,1473574489,1194202178,318719202,1007613879,194029491\" +\n                \"5,1967103652,459277676,397024647,1590159652,876256081,955941\" +\n                \"484,1874614045,472609686,1955403897,883774129,396350381,2097\" +\n                \"711336,414095446,849171471,1650955190,962695497,1194932149,2\" +\n                \"20264719]\");\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int32\"\n                // Assert.Equal(\"Enumeration\", result.DataType);\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayStructureValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10323\";\n\n            var expected = _serializer.Parse(\"\"\"\n\n[\n    {\n        \"TypeId\": \"http://test.org/UA/Data/#i=9440\",\n        \"Encoding\": \"Json\",\n        \"Body\": {\n            \"BooleanValue\": true,\n            \"SByteValue\": -38,\n            \"ByteValue\": 110,\n            \"Int16Value\": 8055,\n            \"UInt16Value\": 55806,\n            \"Int32Value\": 256543409,\n            \"UInt32Value\": 1124716060,\n            \"Int64Value\": 6272273485009155588,\n            \"UInt64Value\": 8748332193282252019,\n            \"FloatValue\": 1.3550572E+28,\n            \"DoubleValue\": -55.151821136474609,\n            \"StringValue\": \"레몬 딸기^ 고양이) 파인애플\",\n            \"DateTimeValue\": \"2071-08-08T14:25:16.7814639Z\",\n            \"GuidValue\": \"2f1b64e2-9b6c-9ff9-9bcb-681a5030910b\",\n            \"ByteStringValue\": \"XmIaOczWGerdvT4+Y1BOuQ==\",\n            \"XmlElementValue\": \"PG4wOum7hOiJsiDjg5bjgr/jg6Ljg6I9IlZhY2EiIOOBhOOBoeOBlD0iQ2VyZG8iIOefs+eBsD0iQXLDoW5kYW5vIiDppqw9IlBlcnJvIiB4bWxuczpuMD0iaHR0cDovL+efs+eBsCI+PG4wOue0q+iJsj5Nb25vIFZlcmRlIFV2YSBTZXJwaWVudGUgTW9ubyBBenVsIFBpw7FhIE92ZWphLiBNYW5nbyBMaW1hPC9uMDrntKvoibI+PG4wOuefs+eBsD5NZWxvY290w7NuOyBQZXJybyBBcsOhbmRhbm8gTGltw7NuJmd0OyBBbWFyaWxsbzwvbjA655+z54GwPjxuMDrjg5bjg4njgqY+T3ZlamF+IFBlcnJvIFDDunJwdXJhXiBMaW1hIFJhdGEhIEJsYW5jb18gUMO6cnB1cmE9IEdhdG88L24wOuODluODieOCpj48L24wOum7hOiJsj4=\",\n            \"NodeIdValue\": \"http://samples.org/UA/memorybuffer#b=672G6bOkm2X9OQ4V\",\n            \"ExpandedNodeIdValue\": \"g=b869d987-396a-5018-7e4d-556d5e591587\",\n            \"QualifiedNameValue\": \"http://opcfoundation.org/UA/Diagnostics#Dragon\",\n            \"LocalizedTextValue\": {\n                \"Text\": \"母牛@ 蛇 马- 蓝莓 猴子< 绿色 蛇{ 白色$ 绵羊 绵羊 紫色 紫色 猴子[ 猴子! 蓝莓(\",\n                \"Locale\": \"zh-CN\"\n            },\n            \"StatusCodeValue\": 6356992,\n            \"VariantValue\": {\n                \"Type\": \"ExtensionObject\",\n                \"Body\": {\n                    \"TypeId\": \"http://test.org/UA/Data//Instance#g=a2a62a11-ee81-11e2-c797-f015f0dcc7bf\",\n                    \"Body\": \"+ejk7JrPhOKfaxAk3LnqVYIbn5/Oh111kBH5HcAc46atRudt/iWP1h6eT3cBow==\"\n                }\n            },\n            \"EnumerationValue\": 0,\n            \"StructureValue\": { \"TypeId\": null },\n            \"Number\": {\n                \"Type\": \"Double\",\n                \"Body\": 1.0\n            },\n            \"Integer\": {\n                \"Type\": \"Int64\",\n                \"Body\": 1\n            },\n            \"UInteger\": {\n                \"Type\": \"UInt64\",\n                \"Body\": 1\n            }\n        }\n    },\n    {\n        \"TypeId\": \"http://test.org/UA/Data/#i=9440\",\n        \"Encoding\": \"Json\",\n        \"Body\": {\n            \"BooleanValue\": true,\n            \"SByteValue\": -71,\n            \"ByteValue\": 165,\n            \"Int16Value\": -31474,\n            \"UInt16Value\": 60031,\n            \"Int32Value\": 1002303007,\n            \"UInt32Value\": 2322690949,\n            \"Int64Value\": -8682057831558849682,\n            \"UInt64Value\": 1004227894202161316,\n            \"FloatValue\": 4.1843192E-05,\n            \"DoubleValue\": 32635254472704.0,\n            \"StringValue\": \"Голубика> Дракон@\",\n            \"DateTimeValue\": \"2014-01-20T12:32:21.1556352Z\",\n            \"GuidValue\": \"252c98f0-ad64-fd43-2056-044339a3fb6e\",\n            \"ByteStringValue\": \"E3P8wU/iTsNcmseUhcjHs2z228AvXUXixBcwI448g6SHNFPFKEwN8n/uLZBxf4/6s2ljkAsraA==\",\n            \"XmlElementValue\": null,\n            \"NodeIdValue\": \"http://samples.org/UA/memorybuffer/Instance#i=4010681507\",\n            \"ExpandedNodeIdValue\": \"http://samples.org/UA/memorybuffer#g=979bd1d7-6e82-4d4e-813c-715d76a51cc9\",\n            \"QualifiedNameValue\": \"http://samples.org/UA/memorybuffer#%e8%8a%92%e6%9e%9c\",\n            \"LocalizedTextValue\": {\n                \"Text\": \"黄色 猿, ヒツジ@ 黒 ドラゴン 猿< ラット% ラット* 猿 パイナップル< 白い 黄色 赤い 黄色< 赤い ブタ マンゴ 猫= 象 緑 ブタ\",\n                \"Locale\": \"jp\"\n            },\n            \"StatusCodeValue\": 1441792,\n            \"VariantValue\": {\n                \"Type\": \"UInt16\",\n                \"Body\": 36671\n            },\n            \"EnumerationValue\": 0,\n            \"StructureValue\": { \"TypeId\": null },\n            \"Number\": {\n                \"Type\": \"Double\",\n                \"Body\": 1.0\n            },\n            \"Integer\": {\n                \"Type\": \"Int64\",\n                \"Body\": 1\n            },\n            \"UInteger\": {\n                \"Type\": \"UInt64\",\n                \"Body\": 1\n            }\n        }\n    },\n    {\n        \"TypeId\": \"http://test.org/UA/Data/#i=9440\",\n        \"Encoding\": \"Json\",\n        \"Body\": {\n            \"BooleanValue\": false,\n            \"SByteValue\": -113,\n            \"ByteValue\": 42,\n            \"Int16Value\": -14982,\n            \"UInt16Value\": 59442,\n            \"Int32Value\": 85049805,\n            \"UInt32Value\": 2602718263,\n            \"Int64Value\": 3649290182186472621,\n            \"UInt64Value\": 4161862115548090842,\n            \"FloatValue\": -5.763605E-32,\n            \"DoubleValue\": 3.4576486746766018E-34,\n            \"StringValue\": \"Виноградина Слон:\",\n            \"DateTimeValue\": \"1923-03-18T00:11:38.731972Z\",\n            \"GuidValue\": \"82622490-4f77-4562-6290-1295bf97c2e1\",\n            \"ByteStringValue\": \"g6SHNFPFKEwN8n/uLZBxf4/6s2ljkAsraA==\",\n            \"XmlElementValue\": \"PG4wOum7hOiJsiDjg5bjgr/jg6Ljg6I9IlZhY2EiIOOBhOOBoeOBlD0iQ2VyZG8iIOefs+eBsD0iQXLDoW5kYW5vIiDppqw9IlBlcnJvIiB4bWxuczpuMD0iaHR0cDovL+efs+eBsCI+PG4wOue0q+iJsj5Nb25vIFZlcmRlIFV2YSBTZXJwaWVudGUgTW9ubyBBenVsIFBpw7FhIE92ZWphLiBNYW5nbyBMaW1hPC9uMDrntKvoibI+PG4wOuefs+eBsD5NZWxvY290w7NuOyBQZXJybyBBcsOhbmRhbm8gTGltw7NuJmd0OyBBbWFyaWxsbzwvbjA655+z54GwPjxuMDrjg5bjg4njgqY+T3ZlamF+IFBlcnJvIFDDunJwdXJhXiBMaW1hIFJhdGEhIEJsYW5jb18gUMO6cnB1cmE9IEdhdG88L24wOuODluODieOCpj48L24wOum7hOiJsj4=\",\n            \"NodeIdValue\": \"s=%d0%93%d0%be%d0%bb%d1%83%d0%b1%d0%b8%d0%ba%d0%b0\",\n            \"ExpandedNodeIdValue\": \"http://test.org/UA/Data/#s=%e9%a9%ac%e7%b4%ab%e8%89%b2\",\n            \"QualifiedNameValue\": \"http://opcfoundation.org/UA/Diagnostics#Elephant\",\n            \"LocalizedTextValue\": {\n                \"Text\": \"猪 猴子~ 红色\\\" 黄色 红色 葡萄 芒果 香蕉 蓝莓 香蕉 芒果? 葡萄 马& 菠萝 白色< 白色 绿色 绿色= 鼠 白色 猪 蓝莓 草莓 猪 狗\",\n                \"Locale\": \"zh-CN\"\n            },\n            \"StatusCodeValue\": {\n                \"Symbol\": \"GoodShutdownEvent\",\n                \"Code\": 11010048\n            },\n            \"VariantValue\": {\n                \"Type\": \"Int64\",\n                \"Body\": 3678050018011977630\n            },\n            \"EnumerationValue\": 1,\n            \"StructureValue\": { \"TypeId\": null },\n            \"Number\": {\n                \"Type\": \"Double\",\n                \"Body\": 1.0\n            },\n            \"Integer\": {\n                \"Type\": \"Int64\",\n                \"Body\": 1\n            },\n            \"UInteger\": {\n                \"Type\": \"UInt64\",\n                \"Body\": 1\n            }\n        }\n    },\n    {\n        \"TypeId\": \"http://test.org/UA/Data/#i=9440\",\n        \"Encoding\": \"Json\",\n        \"Body\": {\n            \"BooleanValue\": false,\n            \"SByteValue\": 82,\n            \"ByteValue\": 198,\n            \"Int16Value\": 9215,\n            \"UInt16Value\": 44960,\n            \"Int32Value\": 1970614820,\n            \"UInt32Value\": 4087763535,\n            \"Int64Value\": 3156392098576755738,\n            \"UInt64Value\": 1179071999846299015,\n            \"FloatValue\": -1.2796896E-06,\n            \"DoubleValue\": -2.4084619380135754E-35,\n            \"StringValue\": \"ヘビ~ 猫* 緑) マンゴ< レモン ブタ\\\" 石灰 石灰{ 黒! ブタ 猿 馬 ブタ@ 牛 ヘビ' 犬 犬\\\" 牛$\",\n            \"DateTimeValue\": \"1949-12-22T18:46:59.3619463Z\",\n            \"GuidValue\": \"bfa4b0cc-483b-8dcf-f31c-be1ab6a22373\",\n            \"ByteStringValue\": \"5k3/MiwysaJQb0S+h/ZadiHED6kKXOEV505s59Gg\",\n            \"XmlElementValue\": \"PG4wOum7hOiJsiDjg5bjgr/jg6Ljg6I9IlZhY2EiIOOBhOOBoeOBlD0iQ2VyZG8iIOefs+eBsD0iQXLDoW5kYW5vIiDppqw9IlBlcnJvIiB4bWxuczpuMD0iaHR0cDovL+efs+eBsCI+PG4wOue0q+iJsj5Nb25vIFZlcmRlIFV2YSBTZXJwaWVudGUgTW9ubyBBenVsIFBpw7FhIE92ZWphLiBNYW5nbyBMaW1hPC9uMDrntKvoibI+PG4wOuefs+eBsD5NZWxvY290w7NuOyBQZXJybyBBcsOhbmRhbm8gTGltw7NuJmd0OyBBbWFyaWxsbzwvbjA655+z54GwPjxuMDrjg5bjg4njgqY+T3ZlamF+IFBlcnJvIFDDunJwdXJhXiBMaW1hIFJhdGEhIEJsYW5jb18gUMO6cnB1cmE9IEdhdG88L24wOuODluODieOCpj48L24wOum7hOiJsj4=\",\n            \"NodeIdValue\": \"http://opcfoundation.org/UA/Diagnostics#i=407765665\",\n            \"ExpandedNodeIdValue\": \"http://opcfoundation.org/UA/Boiler/#g=f16b1f33-7701-a037-4b9b-c936ae51bc40\",\n            \"QualifiedNameValue\": \"http://opcfoundation.org/UA/Boiler//Instance#%ec%bd%94%eb%81%bc%eb%a6%ac\",\n            \"LocalizedTextValue\": {\n                \"Text\": \"Персик Пурпурово\\\" Змейка` Овцы Крыса Пурпурово* Голубо< Бело& Крыса Змейка\",\n                \"Locale\": \"ru\"\n            },\n            \"StatusCodeValue\": 4980736,\n            \"VariantValue\": {\n                \"Type\": \"SByte\",\n                \"Body\": -114\n            },\n            \"EnumerationValue\": 1,\n            \"StructureValue\": { \"TypeId\": null },\n            \"Number\": {\n                \"Type\": \"Double\",\n                \"Body\": 1.0\n            },\n            \"Integer\": {\n                \"Type\": \"Int64\",\n                \"Body\": 5\n            },\n            \"UInteger\": {\n                \"Type\": \"UInt64\",\n                \"Body\": 1\n            }\n        }\n    },\n    {\n        \"TypeId\": \"http://test.org/UA/Data/#i=9440\",\n        \"Encoding\": \"Json\",\n        \"Body\": {\n            \"BooleanValue\": false,\n            \"SByteValue\": -97,\n            \"ByteValue\": 121,\n            \"Int16Value\": -29579,\n            \"UInt16Value\": 52214,\n            \"Int32Value\": 150448275,\n            \"UInt32Value\": 2074081332,\n            \"Int64Value\": -1011618571483371166,\n            \"UInt64Value\": 3946747598058890327,\n            \"FloatValue\": 7.858336E+35,\n            \"DoubleValue\": 10017916.0,\n            \"StringValue\": \"яблоко Ананас~ Овцы Корова Пурпурово_ Банан Крыса Собака Кот Бело( Корова'\",\n            \"DateTimeValue\": \"2034-12-05T15:52:28.675232Z\",\n            \"GuidValue\": \"0500899c-1c30-8180-cbc7-333928152ed2\",\n            \"ByteStringValue\": \"5xRa2IKDWkNPnQk0znSUOxE=\",\n            \"XmlElementValue\": \"PG4wOum7hOiJsiDjg5bjgr/jg6Ljg6I9IlZhY2EiIOOBhOOBoeOBlD0iQ2VyZG8iIOefs+eBsD0iQXLDoW5kYW5vIiDppqw9IlBlcnJvIiB4bWxuczpuMD0iaHR0cDovL+efs+eBsCI+PG4wOue0q+iJsj5Nb25vIFZlcmRlIFV2YSBTZXJwaWVudGUgTW9ubyBBenVsIFBpw7FhIE92ZWphLiBNYW5nbyBMaW1hPC9uMDrntKvoibI+PG4wOuefs+eBsD5NZWxvY290w7NuOyBQZXJybyBBcsOhbmRhbm8gTGltw7NuJmd0OyBBbWFyaWxsbzwvbjA655+z54GwPjxuMDrjg5bjg4njgqY+T3ZlamF+IFBlcnJvIFDDunJwdXJhXiBMaW1hIFJhdGEhIEJsYW5jb18gUMO6cnB1cmE9IEdhdG88L24wOuODluODieOCpj48L24wOum7hOiJsj4=\",\n            \"NodeIdValue\": \"http://opcfoundation.org/UA/Boiler//Instance#s=%e3%83%98%e3%83%93\",\n            \"ExpandedNodeIdValue\": \"http://opcfoundation.org/UA/Boiler/#i=3489247698\",\n            \"QualifiedNameValue\": \"DataAccess#%e9%a9%ac\",\n            \"LocalizedTextValue\": {\n                \"Text\": \"ブタ モモ 緑 いちご ドラゴン 犬; 青い~ モモ 黒; 緑 レモン} 猿% 馬 白い% 馬 牛 象 白い+ 象# いちご< 紫色: レモン~ モモ~ ブタ# マンゴ モモ\",\n                \"Locale\": \"jp\"\n            },\n            \"StatusCodeValue\": 1245184,\n            \"VariantValue\": {\n                \"Type\": \"ExpandedNodeId\",\n                \"Body\": \"http://opcfoundation.org/UA/Boiler//Instance#b=4Ncr5uADYkU88S45mg%3d%3d\"\n            },\n            \"EnumerationValue\": 1,\n            \"StructureValue\": { \"TypeId\": null },\n            \"Number\": {\n                \"Type\": \"Double\",\n                \"Body\": 1.0\n            },\n            \"Integer\": {\n                \"Type\": \"Int64\",\n                \"Body\": 1\n            },\n            \"UInteger\": {\n                \"Type\": \"UInt64\",\n                \"Body\": 88\n            }\n        }\n    },\n    {\n        \"TypeId\": \"http://test.org/UA/Data/#i=9669\",\n        \"Encoding\": \"Json\",\n        \"Body\": {\n            \"BooleanValue\": [ false, false, false, false, true ],\n            \"SByteValue\": [ 120, 27, 27, 57, 117, 61, -42, 106 ],\n            \"ByteValue\": [ 105, 241, 196, 82 ],\n            \"Int16Value\": [ 22001, -1270, 27022, -11160 ],\n            \"UInt16Value\": [ 31406, 22379, 11459, 18140 ],\n            \"Int32Value\": [ 1147924132, 937096171, 293419963, 1355723363, 1682226035, 921241048, 946417831, 483648971, 1150550410 ],\n            \"UInt32Value\": [ 405022290, 3763626854, 2219565007, 635093313, 1150728258 ],\n            \"Int64Value\": [ -1689618757610414770, -1598013270992443575, -6068487195887049228, 3886489167998855712 ],\n            \"UInt64Value\": [ 1434838700748177518, 579235881671951863, 1080167929345915653, 1330943213770414543 ],\n            \"FloatValue\": [ 4.311362E-33, 6.620173E-35, -8.877828E-29, -1.2760576E+29, -1.646687E-22, 1.802464E-21 ],\n            \"DoubleValue\": [ -6011373486080.0, 108132739055616.0, 8.3547184787473483E-36, 5.2422583022226784E+27, 1.0392232580248937E-32, 1.0094077198242765E+33, -8.35414627813762E-39 ],\n            \"StringValue\": [ \"녹색 들쭉 들쭉 돼지 녹색% 녹색 암소 원숭이 딸기+ 들쭉 암소~ 망고 망고 딸기 녹색 녹색 돼지 들쭉) 석회 개} 검정 쥐~ 쥐 코끼리= 들쭉\", \"Обезьяна Красно Зеленыйцвет Крыса\", \"Красно, Желтыйцвет Манго= Ананас Бело&\", \"Голубика Желтыйцвет\", \"蓝莓 大象~ 绵羊 柠檬 母牛 母牛 红色\", \"狗\\\" 马 紫色` 葡萄@ 柠檬 芒果 猪 菠萝 龙^ 黑色* 马 绿色 绵羊 大象 红色) 蓝莓 蛇# 狗 香蕉 草莓 黑色@ 红色 鼠~ 蓝色 香蕉 猫 红色% 黑色\", \"Чернота- Собака Пурпурово# Голубика Чернота Голубо: Дракон яблоко Бело Зеленыйцвет\" ],\n            \"DateTimeValue\": [ \"1916-05-09T17:48:30.6223191Z\" ],\n            \"GuidValue\": [ \"842d41a6-6123-30ce-5970-6c26b28dd4de\", \"9aa488f4-bf70-5b49-848a-9197639e0990\", \"63306802-aacd-cf0e-20eb-70b1d72bdbe2\", \"5763cae3-358e-e7ef-f7d1-0098d037cdbb\", \"4924dc67-715c-4910-79d4-7a844f978358\", \"99b3afae-b13b-cc01-7949-6bfbaa75ffe9\", \"fb4ab41e-9107-7285-b919-deb9bb6a975f\", \"20eaa74e-3383-b67f-da57-d01305159e03\" ],\n            \"ByteStringValue\": [ \"ZppNiFEdKUHgItJIEQ+yC6wDi99l6zWUIa/Bcm2jetrkKQP9EsZVzPdCU1zjkUbBYPlpm3j1LHtkuGaiXLfUPQ==\", \"+GToC7X45q6+5yOY2bGPaf8RczrfYe79iJhaX7JwP20VteotXbarAYLtuQ0I44s=\", \"1jk=\", \"pWEDx5Z16oIcnof7Tqe1giTGYgtJZXK38qjg9KUNU4g=\", \"FJoMEu1Tt3Mzj2L78Q==\", \"ZVNgZ0B0LhI/7kvV7pX23A9L/oI5DahvNnOqmBbWD7wAPHqgRKUT\", \"SgFaHcYXZSJ8Vn8X/G8xWKvwMMzKlvxp34/UsRpVmGk36zc3soqpHg2HG79W98CRCyL1U3VGSbQF8T43Q7MIJ74=\", \"3xA3+aUgRxG/Q3o8EufOQqb4YETz8aKCMsFMcdtZfvQAQBivWhE=\", \"1AxjhwY5yd9WaQANEMd6Iu1utMfj1NY1ZcSGO9HPH+iUe4s3kGqbSGni9QjbTG4thh4qQKVKmAA2LSFBs40Nh0kXeZQ7QpKD0mteAd/NWhlVWbWz\", \"3kJK4osBYkhaldvUbb7D0tnxQ4unbTnrlyBo0wjsWQ==\" ],\n            \"XmlElementValue\": [\n                \"PG4wOum7hOiJsiDjg5bjgr/jg6Ljg6I9IlZhY2EiIOOBhOOBoeOBlD0iQ2VyZG8iIOefs+eBsD0iQXLDoW5kYW5vIiDppqw9IlBlcnJvIiB4bWxuczpuMD0iaHR0cDovL+efs+eBsCI+PG4wOue0q+iJsj5Nb25vIFZlcmRlIFV2YSBTZXJwaWVudGUgTW9ubyBBenVsIFBpw7FhIE92ZWphLiBNYW5nbyBMaW1hPC9uMDrntKvoibI+PG4wOuefs+eBsD5NZWxvY290w7NuOyBQZXJybyBBcsOhbmRhbm8gTGltw7NuJmd0OyBBbWFyaWxsbzwvbjA655+z54GwPjxuMDrjg5bjg4njgqY+T3ZlamF+IFBlcnJvIFDDunJwdXJhXiBMaW1hIFJhdGEhIEJsYW5jb18gUMO6cnB1cmE9IEdhdG88L24wOuODluODieOCpj48L24wOum7hOiJsj4=\",\n                \"PG4wOum7hOiJsiDjg5bjgr/jg6Ljg6I9IlZhY2EiIOOBhOOBoeOBlD0iQ2VyZG8iIOefs+eBsD0iQXLDoW5kYW5vIiDppqw9IlBlcnJvIiB4bWxuczpuMD0iaHR0cDovL+efs+eBsCI+PG4wOue0q+iJsj5Nb25vIFZlcmRlIFV2YSBTZXJwaWVudGUgTW9ubyBBenVsIFBpw7FhIE92ZWphLiBNYW5nbyBMaW1hPC9uMDrntKvoibI+PG4wOuefs+eBsD5NZWxvY290w7NuOyBQZXJybyBBcsOhbmRhbm8gTGltw7NuJmd0OyBBbWFyaWxsbzwvbjA655+z54GwPjxuMDrjg5bjg4njgqY+T3ZlamF+IFBlcnJvIFDDunJwdXJhXiBMaW1hIFJhdGEhIEJsYW5jb18gUMO6cnB1cmE9IEdhdG88L24wOuODluODieOCpj48L24wOum7hOiJsj4=\"\n            ],\n            \"NodeIdValue\": [ \"http://samples.org/UA/memorybuffer#g=8c9312a3-b893-ea53-91d1-2382907eca95\", \"http://test.org/UA/Data//Instance#b=mZWnGBQiqm%2fQtuce1kejQM%2bdwkrCBDsAWl6ZeX3GfNZshJIz%2fPp%2fauhIgjOqs0w6\", \"nsu=DataAccess;s=파인애플\", \"http://test.org/UA/Data//Instance#s=%e8%9b%87%e7%8c%ab%e9%a6%99%e8%95%89\", \"http://opcfoundation.org/UA/Boiler//Instance#i=272173553\", \"nsu=DataAccess;b=b0PVHldheYEHVqYSX40/y4R9IYv92lU7yuG4V3n6mgH5hHz6JtoB6X4TUlAXoiijsj61kpDGuJXumVN2qSIIDbul\" ],\n            \"ExpandedNodeIdValue\": [ \"http://samples.org/UA/memorybuffer/Instance#g=7ca9a545-0c37-87ea-0423-27b914a43b44\", \"i=2349590220\", \"urn:manipc1:OPCFoundation:CoreSampleServer#g=94450a5c-8972-934d-6c99-0c1659b9ce0e\", \"http://test.org/UA/Data//Instance#s=%e6%a1%83%e5%ad%90\", \"http://opcfoundation.org/UA/Diagnostics#g=290ee634-1839-f122-f6b0-df426fb19e6b\", \"urn:manipc1:OPCFoundation:CoreSampleServer#i=2014900536\", \"http://opcfoundation.org/UA/Boiler//Instance#s=%ec%84%9d%ed%9a%8c\", \"http://test.org/UA/Data//Instance#b=4D2jPmkygekkYgnuy3rDjlEURSuQwxxtEVEYAMgjS9Cjxg%3d%3d\", \"http://opcfoundation.org/UA/Diagnostics#g=2005172c-cc4e-6fb5-0e0c-a653cb7c979a\", \"i=405616161\" ],\n            \"QualifiedNameValue\": [ \"DataAccess#%eb%b0%94%eb%82%98%eb%82%98\", \"http://samples.org/UA/memorybuffer#%d0%9a%d0%be%d1%80%d0%be%d0%b2%d0%b0\", \"%eb%b0%b1%ec%83%89\", \"http://samples.org/UA/memorybuffer/Instance#%e3%83%90%e3%83%8a%e3%83%8a\", \"DataAccess#%e3%83%91%e3%82%a4%e3%83%8a%e3%83%83%e3%83%97%e3%83%ab\", \"http://opcfoundation.org/UA/Boiler//Instance#Mango\" ],\n            \"LocalizedTextValue\": [\n                {\n                    \"Text\": \"Black~ Pig' Red Black' Lime! Black} Purple Blue Cat Strawberry:\",\n                    \"Locale\": \"en-US\"\n                },\n                {\n                    \"Text\": \"蓝色 芒果 猫 紫色. 鼠; 紫色 紫色 蛇 芒果 葡萄 狗' 母牛\",\n                    \"Locale\": \"zh-CN\"\n                },\n                {\n                    \"Text\": \"草莓, 绵羊 龙 白色{ 白色} 大象, 绿色% 葡萄 菠萝) 蛇 香蕉} 蓝色' 猪 大象' 大象` 芒果^ 猫= 黄色 母牛(\",\n                    \"Locale\": \"zh-CN\"\n                },\n                {\n                    \"Text\": \"绵羊< 石灰/ 母牛: 大象\",\n                    \"Locale\": \"zh-CN\"\n                },\n                {\n                    \"Text\": \"Овцы яблоко# Желтыйцвет Лимон( Змейка Собака Корова? Крыса Змейка> Лошадь Лошадь\",\n                    \"Locale\": \"ru\"\n                },\n                {\n                    \"Text\": \"菠萝' 草莓. 狗 红色: 蛇, 菠萝 龙 猴子/ 菠萝$ 柠檬# 草莓. 蓝莓= 猫 菠萝< 柠檬: 狗 大象 石灰 马= 葡萄( 芒果/ 鼠;\",\n                    \"Locale\": \"zh-CN\"\n                },\n                {\n                    \"Text\": \"Dog) Cat( Strawberry` Cat Monkey Elephant Horse! Grape- Peach Monkey} Blueberry! Red\",\n                    \"Locale\": \"en-US\"\n                },\n                {\n                    \"Text\": \"Snake Grape Mango\",\n                    \"Locale\": \"en-US\"\n                },\n                {\n                    \"Text\": \"蛇, 大象@ 红色 桃子+ 鼠 红色 紫色 草莓 菠萝\",\n                    \"Locale\": \"zh-CN\"\n                },\n                {\n                    \"Text\": \"Кот Крыса Слон Свинья' Голубика Пурпурово@ Дракон- Обезьяна? Бело(\",\n                    \"Locale\": \"ru\"\n                }\n            ],\n            \"StatusCodeValue\": [ 6225920, 7995392, 5832704, 6553600, 3997696, 1900544, 8519680 ],\n            \"VariantValue\": [\n                {\n                    \"Type\": \"Byte\",\n                    \"Body\": 82\n                }\n            ],\n            \"EnumerationValue\": [],\n            \"StructureValue\": [],\n            \"Number\": [],\n            \"Integer\": [],\n            \"UInteger\": []\n        }\n    },\n    {\n        \"TypeId\": \"http://test.org/UA/Data/#i=9440\",\n        \"Encoding\": \"Json\",\n        \"Body\": {\n            \"BooleanValue\": true,\n            \"SByteValue\": -56,\n            \"ByteValue\": 104,\n            \"Int16Value\": 3814,\n            \"UInt16Value\": 38042,\n            \"Int32Value\": 535350820,\n            \"UInt32Value\": 3693060540,\n            \"Int64Value\": -2577172637598593213,\n            \"UInt64Value\": 1118748778070163278,\n            \"FloatValue\": 1.931257E+17,\n            \"DoubleValue\": -0.00033564501791261137,\n            \"StringValue\": \"ラット} 馬` いちご 青い 白い 象 レモン. パイナップル\",\n            \"DateTimeValue\": \"1985-11-03T22:42:37.1296614Z\",\n            \"GuidValue\": \"5b9f4a59-1a25-042a-e156-e9e08f8eed3d\",\n            \"ByteStringValue\": \"wEYr6R2tv2YG6q2Z\",\n            \"XmlElementValue\": \"PG4wOum7hOiJsiDjg5bjgr/jg6Ljg6I9IlZhY2EiIOOBhOOBoeOBlD0iQ2VyZG8iIOefs+eBsD0iQXLDoW5kYW5vIiDppqw9IlBlcnJvIiB4bWxuczpuMD0iaHR0cDovL+efs+eBsCI+PG4wOue0q+iJsj5Nb25vIFZlcmRlIFV2YSBTZXJwaWVudGUgTW9ubyBBenVsIFBpw7FhIE92ZWphLiBNYW5nbyBMaW1hPC9uMDrntKvoibI+PG4wOuefs+eBsD5NZWxvY290w7NuOyBQZXJybyBBcsOhbmRhbm8gTGltw7NuJmd0OyBBbWFyaWxsbzwvbjA655+z54GwPjxuMDrjg5bjg4njgqY+T3ZlamF+IFBlcnJvIFDDunJwdXJhXiBMaW1hIFJhdGEhIEJsYW5jb18gUMO6cnB1cmE9IEdhdG88L24wOuODluODieOCpj48L24wOum7hOiJsj4=\",\n            \"NodeIdValue\": \"http://test.org/UA/Data//Instance#i=2103396786\",\n            \"ExpandedNodeIdValue\": \"http://test.org/UA/Data//Instance#i=577318642\",\n            \"QualifiedNameValue\": \"DataAccess#%e7%8a%ac%e3%83%96%e3%82%bf\",\n            \"LocalizedTextValue\": {\n                \"Text\": \"Red Green Lemon# Elephant Dog Horse Monkey: Lime' Strawberry Monkey\",\n                \"Locale\": \"en-US\"\n            },\n            \"StatusCodeValue\": 1638400,\n            \"VariantValue\": {\n                \"Type\": \"ExpandedNodeId\",\n                \"Body\": \"http://samples.org/UA/memorybuffer#i=1429871234\"\n            },\n            \"EnumerationValue\": 1,\n            \"StructureValue\": { \"TypeId\": null },\n            \"Number\": {\n                \"Type\": \"Double\",\n                \"Body\": 1.0\n            },\n            \"Integer\": {\n                \"Type\": \"Int64\",\n                \"Body\": 33\n            },\n            \"UInteger\": {\n                \"Type\": \"UInt64\",\n                \"Body\": 1\n            }\n        }\n    }\n]\n\n\"\"\");\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"ExtensionObject\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayNumberValueVariableTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10324\";\n\n            var values = _generator.GetRandomArray<sbyte>();\n            var expected = _serializer.FromObject(values\n                .Select(v => new\n                {\n                    Type = \"SByte\",\n                    Body = v\n                }));\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Number\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, _serializer.FromObject(values), result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayNumberValueVariableTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10324\";\n            var values = _generator.GetRandomArray<sbyte>();\n            var expected = _serializer.FromObject(values);\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Number\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayIntegerValueVariableTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10325\";\n\n            var values = _generator.GetRandomArray<int>();\n            var expected = _serializer.FromObject(values\n                .Select(v => new\n                {\n                    Type = \"Int32\",\n                    Body = v\n                }));\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Integer\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, _serializer.FromObject(values), result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayIntegerValueVariableTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10325\";\n            var values = _generator.GetRandomArray<int>();\n            var expected = _serializer.FromObject(values);\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Integer\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayUIntegerValueVariableTest1Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10326\";\n\n            var values = _generator.GetRandomArray<ushort>();\n            var expected = _serializer.FromObject(values\n                .Select(v => new\n                {\n                    Type = \"UInt16\",\n                    Body = v\n                }));\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInteger\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, _serializer.FromObject(values), result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticArrayUIntegerValueVariableTest2Async(CancellationToken ct = default)\n        {\n            var browser = _services();\n            const string node = \"http://test.org/UA/Data/#i=10326\";\n            var values = _generator.GetRandomArray<ushort>();\n            var expected = _serializer.FromObject(values);\n\n            // Act\n            var result = await browser.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInteger\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        private async Task AssertResultAsync(string node, VariantValue expected,\n            ValueWriteResponseModel result)\n        {\n            var value = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n            Assert.NotNull(value);\n            Assert.Null(result.ErrorInfo);\n            Assert.True(expected.Equals(value), $\"{expected} != {value}\");\n            Assert.Equal(expected, value);\n        }\n\n        private readonly T _connection;\n        private readonly Func<T, string, IJsonSerializer, Task<VariantValue>> _readExpected;\n        private readonly Func<INodeServices<T>> _services;\n        private readonly DefaultJsonSerializer _serializer;\n        private readonly Opc.Ua.Test.TestDataGenerator _generator = new();\n    }\n}\n"
  },
  {
    "path": "src/Azure.IIoT.OpcUa.Publisher.Testing/tests/Tests/TestData/WriteScalarValueTests.cs",
    "content": "// ------------------------------------------------------------\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//  Licensed under the MIT License (MIT). See License.txt in the repo root for license information.\n// ------------------------------------------------------------\n\nnamespace Azure.IIoT.OpcUa.Publisher.Testing.Tests\n{\n    using Azure.IIoT.OpcUa.Publisher.Models;\n    using Furly.Extensions.Serializers;\n    using Furly.Extensions.Serializers.Json;\n    using MemoryBuffer;\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using System.Xml;\n    using Xunit;\n\n    public class WriteScalarValueTests<T>\n    {\n        /// <summary>\n        /// Create node services tests\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"readExpected\"></param>\n        public WriteScalarValueTests(Func<INodeServices<T>> services, T connection,\n            Func<T, string, IJsonSerializer, Task<VariantValue>> readExpected)\n        {\n            _services = services;\n            _connection = connection;\n            _readExpected = readExpected;\n            _serializer = new DefaultJsonSerializer();\n        }\n\n        public async Task NodeWriteStaticScalarBooleanValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10216\";\n\n            VariantValue expected = false;\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n\n            expected = true;\n\n            // Act\n            result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = \"ns=2;i=10216\",\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest1Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10159\"; // Scalar\n            var path = new[] {\n                \".http://test.org/UA/Data/#BooleanValue\"\n            };\n\n            VariantValue expected = false;\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                BrowsePath = path,\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(\"http://test.org/UA/Data/#i=10216\", expected, result).ConfigureAwait(false);\n\n            expected = true;\n\n            // Act\n            result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = \"ns=2;i=10159\",\n                BrowsePath = path,\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(\"http://test.org/UA/Data/#i=10216\", expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest2Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10159\"; // Scalar\n            var path = new[] {\n                \"http://test.org/UA/Data/#BooleanValue\"\n            };\n\n            VariantValue expected = false;\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                BrowsePath = path,\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(\"http://test.org/UA/Data/#i=10216\", expected, result).ConfigureAwait(false);\n\n            expected = true;\n\n            // Act\n            result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = \"ns=2;i=10159\",\n                BrowsePath = path,\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(\"http://test.org/UA/Data/#i=10216\", expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarBooleanValueVariableWithBrowsePathTest3Async(CancellationToken ct = default)\n        {\n            var services = _services();\n            var path = new[] {\n                \"Objects\",\n                \"http://test.org/UA/Data/#Data\",\n                \"http://test.org/UA/Data/#Static\",\n                \"http://test.org/UA/Data/#Scalar\",\n                \"http://test.org/UA/Data/#BooleanValue\"\n            };\n\n            VariantValue expected = false;\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                BrowsePath = path,\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(\"http://test.org/UA/Data/#i=10216\", expected, result).ConfigureAwait(false);\n\n            expected = true;\n\n            // Act\n            result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                BrowsePath = path,\n                Value = expected,\n                DataType = \"Boolean\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(\"http://test.org/UA/Data/#i=10216\", expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarSByteValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10217\";\n\n            var expected = _serializer.Parse(\"-61\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"SByte\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarByteValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10218\";\n\n            var expected = _serializer.Parse(\"216\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Byte\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarInt16ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10219\";\n\n            var expected = _serializer.Parse(\"15373\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int16\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarUInt16ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10220\";\n\n            var expected = _serializer.Parse(\"52454\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInt16\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarInt32ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10221\";\n\n            var expected = _serializer.Parse(\n                \"1966214362\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int32\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarUInt32ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10222\";\n\n            var expected = _serializer.Parse(\"2235103439\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInt32\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarInt64ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10223\";\n\n            var expected = _serializer.Parse(\"1485146186671575531\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int64\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarUInt64ValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10224\";\n\n            var expected = _serializer.Parse(\"5415129398295885582\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInt64\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarFloatValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10225\";\n\n            var expected = _serializer.Parse(\n                \"1.65278221E-37\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Float\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarDoubleValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10226\";\n\n            var expected = _serializer.Parse(\"103.27073669433594\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Double\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarStringValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10227\";\n\n            var expected = _serializer.Parse(\n                \"\\\"Red+ Green] Cow^ Purple Horse~ Elephant^ Horse Lime\\\"\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"String\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarDateTimeValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10228\";\n\n            VariantValue expected = DateTime.UtcNow + TimeSpan.FromDays(11);\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"DateTime\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarGuidValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10229\";\n\n            VariantValue expected = \"bdc1d303-2355-6173-9314-1816b7315b96\";\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Guid\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarByteStringValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10230\";\n\n            var expected = _serializer.Parse(\n               \"\\\"+1q+tSjpWzavev/hDIb4gk/xHLZGD4VscxJEWo2QzUU145zcKKra6WaGpq\" +\n               \"hzgIeNIJNnQD/gruzUUkIWpQA=\\\"\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"ByteString\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarXmlElementValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10231\";\n\n            var expected = _serializer.FromObject(XmlElementEx.SerializeObject(\n                new MemoryBufferInstance\n                {\n                    Name = \"test\",\n                    TagCount = 333,\n                    DataType = \"Byte\"\n                }));\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"XmlElement\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarNodeIdValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10232\";\n\n            VariantValue expected = \"http://samples.org/UA/memorybuffer#i=2040578002\";\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"NodeId\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarExpandedNodeIdValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10233\";\n\n            VariantValue expected = \"http://opcfoundation.org/UA/Diagnostics#i=1375605653\";\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"ExpandedNodeId\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarQualifiedNameValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10234\";\n\n            var expected = _serializer.FromObject(\"http://test.org/UA/Data/#testname\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"QualifiedName\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarLocalizedTextValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10235\";\n\n            var expected = _serializer.Parse(\n                \"{\\\"Text\\\":\\\"자주색 들쭉) 망고 고양이\\\",\\\"Locale\\\":\\\"ko\\\"}\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"LocalizedText\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarStatusCodeValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10236\";\n\n            var expected = _serializer.Parse(\"11927552\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"StatusCode\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarVariantValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10237\";\n\n            var expected = _serializer.Parse(\"-2.5828845095702735E-29\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"BaseDataType\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarEnumerationValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10238\";\n\n            var expected = _serializer.Parse(\"1137262927\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int32\"\n                // TODO: Assert.Equal(\"Enumeration\", result.DataType);\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarStructuredValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10239\";\n\n            var expected = _serializer.Parse(\"\"\"\n\n{\n    \"TypeId\": \"http://test.org/UA/Data/#i=9440\",\n    \"Encoding\": \"Json\",\n    \"Body\": {\n        \"BooleanValue\": false,\n        \"SByteValue\": 101,\n        \"ByteValue\": 16,\n        \"Int16Value\": -15522,\n        \"UInt16Value\": 30310,\n        \"Int32Value\": 1931620437,\n        \"UInt32Value\": 1871434347,\n        \"Int64Value\": -485429667643080766,\n        \"UInt64Value\": 455062722452308260,\n        \"FloatValue\": -5.00243E+26,\n        \"DoubleValue\": 0.00046682002721354365,\n        \"StringValue\": \"黄色) 黄色] 桃子{ 黑色 狗[ 紫色 桃子] 狗 红色 葡萄% 桃子? 猫 猴子 绵羊\",\n        \"DateTimeValue\": \"2027-02-05T11:29:29.9135123Z\",\n        \"GuidValue\": \"64a055c1-1e60-67a1-e801-f996fece3eec\",\n        \"ByteStringValue\": \"XmIaOczWGerdvT4+Y1BOuQ==\",\n        \"XmlElementValue\": \"PG4wOum7hOiJsiDjg5bjgr/jg6Ljg6I9IlZhY2EiIOOBhOOBoeOBlD0iQ2VyZG8iIOefs+eBsD0iQXLDoW5kYW5vIiDppqw9IlBlcnJvIiB4bWxuczpuMD0iaHR0cDovL+efs+eBsCI+PG4wOue0q+iJsj5Nb25vIFZlcmRlIFV2YSBTZXJwaWVudGUgTW9ubyBBenVsIFBpw7FhIE92ZWphLiBNYW5nbyBMaW1hPC9uMDrntKvoibI+PG4wOuefs+eBsD5NZWxvY290w7NuOyBQZXJybyBBcsOhbmRhbm8gTGltw7NuJmd0OyBBbWFyaWxsbzwvbjA655+z54GwPjxuMDrjg5bjg4njgqY+T3ZlamF+IFBlcnJvIFDDunJwdXJhXiBMaW1hIFJhdGEhIEJsYW5jb18gUMO6cnB1cmE9IEdhdG88L24wOuODluODieOCpj48L24wOum7hOiJsj4=\",\n        \"NodeIdValue\": \"nsu=DataAccess;s=狗绵羊\",\n        \"ExpandedNodeIdValue\": \"http://test.org/UA/Data//Instance#b=pQ%3d%3d\",\n        \"QualifiedNameValue\": \"http://test.org/UA/Data/#%e3%83%98%e3%83%93\",\n        \"LocalizedTextValue\": {\n            \"Text\": \"蓝色 紫色 蓝色 红色$\",\n            \"Locale\": \"zh-CN\"\n        },\n        \"StatusCodeValue\": 1835008,\n        \"VariantValue\": {\n            \"Type\": \"Int32\",\n            \"Body\": 184297559\n        },\n        \"EnumerationValue\": 0,\n        \"StructureValue\": { \"TypeId\": null },\n        \"Number\": {\n            \"Type\": \"Double\",\n            \"Body\": 0.0\n        },\n        \"Integer\": {\n            \"Type\": \"Int64\",\n            \"Body\": 5\n        },\n        \"UInteger\": {\n            \"Type\": \"UInt64\",\n            \"Body\": 0\n        }\n    }\n}\n\n\"\"\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"ExtensionObject\"\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarNumberValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10240\";\n\n            var expected = _serializer.Parse(\"-44\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"SByte\"\n                // Assert.Equal(\"Number\", result.DataType);\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarIntegerValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10241\";\n\n            var expected = _serializer.Parse(\"94903859\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"Int32\"\n                // Assert.Equal(\"Integer\", result.DataType);\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        public async Task NodeWriteStaticScalarUIntegerValueVariableTestAsync(CancellationToken ct = default)\n        {\n            var services = _services();\n            const string node = \"http://test.org/UA/Data/#i=10242\";\n\n            var expected = _serializer.Parse(\"64817\");\n\n            // Act\n            var result = await services.ValueWriteAsync(_connection, new ValueWriteRequestModel\n            {\n                NodeId = node,\n                Value = expected,\n                DataType = \"UInt32\"\n                // Assert.Equal(\"UInteger\", result.DataType);\n            }, ct).ConfigureAwait(false);\n\n            // Assert\n            await AssertResultAsync(node, expected, result).ConfigureAwait(false);\n        }\n\n        private async Task AssertResultAsync(string node, VariantValue expected,\n            ValueWriteResponseModel result)\n        {\n            var value = await _readExpected(_connection, node, _serializer).ConfigureAwait(false);\n            Assert.NotNull(value);\n            Assert.Null(result.ErrorInfo);\n\n            Assert.True(expected.Equals(value), $\"{expected} != {value}\");\n            Assert.Equal(expected, value);\n        }\n\n        private readonly T _connection;\n        private readonly DefaultJsonSerializer _serializer;\n        private readonly Func<T, string, IJsonSerializer, Task<VariantValue>> _readExpected;\n        private readonly Func<INodeServices<T>> _services;\n    }\n}\n"
  },
  {
    "path": "src/Directory.Build.props",
    "content": "﻿<Project>\n  <Import Project=\"$([MSBuild]::GetPathOfFileAbove(common.props))\" Condition=\"'$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), common.props))' != ''\" />\n</Project>\n"
  },
  {
    "path": "testenvironments.json",
    "content": "{\n    \"version\": \"1\",\n    \"environments\": [\n        {\n            \"name\": \"Ubuntu-22.04\",\n            \"type\": \"wsl\",\n            \"wslDistribution\": \"Ubuntu-22.04\"\n        }\n    ]\n}"
  },
  {
    "path": "tools/checkdocs.cmd",
    "content": "@REM Copyright (c) Microsoft. All rights reserved.\n@REM Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n@setlocal EnableExtensions EnableDelayedExpansion\n@echo off\n\nset current-path=%~dp0\nrem // remove trailing slash\nset current-path=%current-path:~0,-1%\nset build_root=%current-path%\\..\n\npushd %build_root%\ncmd /c npm install -g markdown-link-validator > _tmp.out 2>&1\n\nif \"%1\" == \"-q\" goto :quiet\nif \"%1\" == \"--quiet\" goto :quiet\n\ncall markdown-link-validator . -i #.* -f gi\nif !ERRORLEVEL! == 0 goto :success\ngoto :error\n:quiet\ncall markdown-link-validator . -i #.* -f gi > _tmp.out 2>&1\nif !ERRORLEVEL! == 0 goto :success\ngoto :error\n:error\nif exist _tmp.out del /f _tmp.out\npopd\nexit /b 1\n:success\nif exist _tmp.out del /f _tmp.out\npopd\ngoto :eof"
  },
  {
    "path": "tools/clean.sh",
    "content": "#!/bin/bash\n\n# -------------------------------------------------------------------------------\nusage(){\n    echo '\nUsage: '\"$0\"'\n    1. Run first on the subscription using -m flag to mark groups for deletion.\n    2. Ask team to remove the tag for items they want to keep.\n    3. When done, run again with -y flag to remove all remaining tagged groups.\n\n    --subscription, -s         Subscription to clean up. If not set uses\n                               the default subscription for the account.\n    --mark, -m                 Mark groups not tagged with Production for\n                               deletion.\n            -y                 Perform actual deletion.\n    \n    --prefix                   Match and delete everything with prefix.\n\n    --kv-purge                 Purge all soft deleted key vaults in subscription.\n\n    --help                     Shows this help.\n\n'\n    exit 1\n}\n\nargs=( \"$@\"  )\nsubscription=\ndelete=\nprefix=\nmark=\npurgekv=\n\nwhile [ \"$#\" -gt 0 ]; do\n    case \"$1\" in\n        --subscription|-s)     subscription=\"$2\" ; shift ;;\n        --kv-purge)            purgekv=1 ;;\n        --mark|-m)             mark=1 ;;\n        --prefix)              prefix=\"$2\" ; shift ;;\n        -y)                    delete=1 ;;\n        *)                     usage ;;\n    esac\n    shift\ndone\n\n# -------------------------------------------------------------------------------\nif ! az account show > /dev/null 2>&1 ; then\n    az login\nfi\nif [[ -n \"$subscription\" ]]; then \n    if ! az account set -s $subscription ; then\n\t\techo \"Failed to change subscription!\"\n\t\texit 1\n\tfi\nfi\n\n# -------------------------------------------------------------------------------\nif [[ -n \"$prefix\" ]] ; then\n    # select groups with prefix that are not production\n    groups=$(az group list \\\n        --query \"[?starts_with(name, '$prefix') && tags.Production==null].name\" \\\n        -o tsv | tr -d '\\r')\nelif [[ -n \"$mark\" ]]; then\n    # select groups to mark for deletion\n    groups=$(az group list --query \"[?tags.Production==null].name\" \\\n        -o tsv | tr -d '\\r')\nelse\n    # select groups marked for deletion\n    groups=$(az group list --query \"[?tags.ReadyToDelete].name\" \\\n        -o tsv | tr -d '\\r')\nfi\n\n# remove groups \nfor group in $groups; do\n    if [[ -n \"$mark\" ]]; then\n        if [[ $group = MC_* ]] ; then\n\t\t\techo \"skipping $group ...\" > /dev/null\n        else\n\t\t\techo \"Marking group $group as ready to delete ...\"\n\t\t\taz group update -g $group --set tags.ReadyToDelete='true' > /dev/null\n\t\tfi\n    else\n        if [[ $group = MC_* ]] ; then\n            echo \"skipping $group ...\" > /dev/null\n        elif [[ -z \"$delete\" ]]; then \n            echo \"$group up for deletion.\"\n        else\n            echo \"Deleting resourcegroup $group ...\"\n            az group delete -g $group -y --no-wait\n        fi\n    fi\ndone\n\n# -------------------------------------------------------------------------------\nif [[ -n \"$purgekv\" ]]; then\n    # purge deleted keyvault\n    for vault in $(az keyvault list-deleted -o tsv | tr -d '\\r'); do\n        echo \"deleting keyvault $vault ...\"\n        az keyvault purge --name $vault\n    done\nfi\n# -------------------------------------------------------------------------------\n"
  },
  {
    "path": "tools/codecoverage.cmd",
    "content": "@REM Copyright (c) Microsoft. All rights reserved.\n@REM Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n@setlocal EnableExtensions EnableDelayedExpansion\n@echo off\n\nset current-path=%~dp0\nrem // remove trailing slash\nset current-path=%current-path:~0,-1%\nset build_root=%current-path%\\..\n\ncd %build_root%\n\ndotnet test \"Industrial-IoT.sln\" -v n --configuration Release /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura\ndotnet tool install -g dotnet-reportgenerator-globaltool\nreportgenerator -reports:./**/coverage.cobertura.xml -targetdir:./CodeCoverage -reporttypes:Badges;Html;HtmlSummary;Cobertura\n\n"
  },
  {
    "path": "tools/docgen.cmd",
    "content": "@REM Copyright (c) Microsoft. All rights reserved.\n@REM Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n@setlocal EnableExtensions EnableDelayedExpansion\n@echo off\n\nset current-path=%~dp0\nrem // remove trailing slash\nset current-path=%current-path:~0,-1%\nset build_root=%current-path%\\..\n\n:args-loop\nif \"%1\" equ \"\" goto :args-done\nif \"%1\" equ \"--xtrace\" goto :arg-trace\nif \"%1\" equ  \"-x\" goto :arg-trace\ngoto :usage\n:args-continue\nshift\ngoto :args-loop\n\n:usage\necho docgen.cmd [options]\necho options:\necho -x --xtrace        print a trace of each command.\nexit /b 1\n\n:arg-trace\necho on\ngoto :args-continue\n\n:args-done\ngoto :main\n\nrem\nrem generate docs\nrem\n:generate_docs\npushd %build_root%\\docs\n\ncall :generate_doc_for_service opc-publisher\n\nset service=\nset convert=\npopd\ngoto :eof\n\nrem\nrem generate doc\nrem\n:generate_doc_for_service\nset service=%1\npushd %service%\nif not exist openapi.json goto :eof\nif exist security.md move security.md security_save.md\necho swagger2markup.markupLanguage=MARKDOWN                      > config.properties\necho swagger2markup.generatedExamplesEnabled=false              >> config.properties\necho swagger2markup.pathsGroupedBy=TAGS                         >> config.properties\necho swagger2markup.inlineSchemaEnabled=true                    >> config.properties\necho swagger2markup.lineSeparator=WINDOWS                       >> config.properties\necho swagger2markup.pathSecuritySectionEnabled=true             >> config.properties\necho swagger2markup.flatBodyEnabled=false                       >> config.properties\necho swagger2markup.interDocumentCrossReferencesEnabled=true    >> config.properties\nrem echo swagger2markup.overviewDocument=overview               >> config.properties\necho swagger2markup.separatedDefinitionsEnabled=false           >> config.properties\necho swagger2markup.separatedOperationsEnabled=false            >> config.properties\ndocker run --rm --mount type=bind,source=%cd%,target=/opt swagger2markup/swagger2markup:1.3.1 convert -i /opt/openapi.json -d /opt -c /opt/config.properties\nif exist security_save.md move security_save.md security.md\nif exist paths.md type paths.md > api.md\nif exist paths.md del /f paths.md\nif exist overview.md del /f overview.md\nif exist config.properties del /f config.properties\npopd\ngoto :eof\n\n\n@rem\n@rem Main\n@rem\n:main\ncall :generate_docs\nendlocal\n\n"
  },
  {
    "path": "tools/e2etesting/DeployAKS.ps1",
    "content": "Param(\n    [string]\n    $ResourceGroupName,\n    [Guid]\n    $TenantId,\n    [String]\n    $Region = \"northeurope\",\n    [string]\n    $PublisherDeploymentFile = \"./K8s-Standalone/publisher/deployment.yaml\",\n    [string]\n    $ContainerRegistryServer = \"mcr.microsoft.com\",\n    [string]\n    $ContainerRegistryUsername,\n    [string]\n    $ContainerRegistryPassword,\n    [string]\n    $ImageNamespace = \"\",\n    [string]\n    $ImageTag = \"latest\"\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\nif (!$ResourceGroupName) {\n    Write-Error \"ResourceGroupName not set.\"\n}\n\nif (!$Region) {\n    Write-Error \"Region not set.\"\n}\n\nif (!(Microsoft.PowerShell.Management\\Test-Path -Path $PublisherDeploymentFile -PathType Leaf)) {\n    Write-Error \"OPC Publisher k8s deployment file '$PublisherDeploymentFile' does not exist\"\n}\n\n## show installed az.aks module\nGet-Module -listAvailable -Name Az.Aks, Az.ContainerRegistry\n\n## Login if required\n\n$context = Get-AzContext\n\nif (!$context) {\n    Write-Host \"Logging in...\"\n    Login-AzAccount -Tenant $TenantId\n    $context = Get-AzContext\n}\n\n## Check if resource group exists\n\n$resourceGroup = Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue\n\nif (!$resourceGroup) {\n    Write-Host \"Creating Resource Group $($ResourceGroupName) in $($Region)...\"\n    $resourceGroup = New-AzResourceGroup -Name $ResourceGroupName -Location $Region\n}\nelse {\n    Write-Host \"Using resource Group: $($resourceGroup.ResourceGroupName)\"\n}\n\n## Build verifier\n$registryName = \"$($ResourceGroupName)acr\"\n\n$registry = Get-AzContainerRegistry -ResourceGroupName $ResourceGroupName -Name $registryName -ErrorAction SilentlyContinue\nif (!$registry) {\n    Write-Host \"Creating container registry $($registryName) in $($Region) ...\"\n    $registry = New-AzContainerRegistry -ResourceGroupName $ResourceGroupName -Name $registryName -EnableAdminUser -Sku Standard -Location $Region\n}\nelse {\n    Write-Host \"Using conainer registry: $($registry.Name)\"\n}\n\n$registrySecret = Get-AzContainerRegistryCredential -ResourceGroupName $ResourceGroupName -Name $registryName\n\nConnect-AzContainerRegistry -Name $registryName\n$verifierImageName = \"$($registry.LoginServer)/mqtt-verifier:latest\"\nWrite-Host \"Build and push verifier image $($verifierImageName)...\"\ndocker build -t mqtt-verifier -f ./tools/e2etesting/MqttTestValidator/MqttTestValidator/Dockerfile ./tools/e2etesting/MqttTestValidator/MqttTestValidator\ndocker image tag mqtt-verifier $verifierImageName\ndocker push $verifierImageName\nWrite-Host \"Verifier image $($verifierImageName) created.\"\n\n## Determine suffix for testing resources\nif (!$resourceGroup.Tags) {\n    $resourceGroup.Tags = @{}\n}\n\n$testSuffix = $resourceGroup.Tags[\"TestingResourcesSuffix\"]\n\nif (!$testSuffix) {\n    $testSuffix = Get-Random -Minimum 10000 -Maximum 99999\n\n    $aksName = \"aksCluster_$($testSuffix)\"\n\n    # Create ssh keys\n    Write-Host \"Creating ssh key\"\n    ssh-keygen -m PEM -t rsa -b 4096 -f ssh -q -N '\"\"'\n\n    Get-Content ssh.pub\n\n    ## Create AKS Cluster\n    Write-Host \"Creating cluster $aksName\"\n\n    for ($i = 0; ($i -lt 20) -and (!$aksCluster); $i++) {\n        try {\n            $aksCluster = New-AzAksCluster -ResourceGroupName $resourceGroupName -Name $aksName -NodeCount 3 -SshKeyPath ssh.pub -Force\n            if (!$aksCluster) {\n                throw \"Failed to create AKS cluster.\"\n            }\n            else {\n                Write-Host \"Cluster $aksName created\"\n                $aksCluster | Format-Table | Out-String | % { Write-Host $_ }\n            }\n        }\n        catch {\n            Write-Host \"$($_.Exception.Message) for $($aksName) - Retrying...\"\n            Start-Sleep -s 2\n        }\n    }\n\n    if (!$aksCluster) {\n        Write-Error \"Failed to create AKS cluster.\"\n    }\n    else {\n        $tags = $resourceGroup.Tags\n        $tags += @{\"TestingResourcesSuffix\" = $testSuffix }\n        Set-AzResourceGroup -Name $resourceGroup.ResourceGroupName -Tag $tags | Out-Null\n        $resourceGroup = Get-AzResourceGroup -Name $resourceGroup.ResourceGroupName\n    }\n} else {\n    $aksName = \"aksCluster_$($testSuffix)\"\n}\n\n## Install kubectl\nInstall-AzAksKubectl -Version latest -Force\n\n## Load AKS Cluster credentials\nImport-AzAksCredential -ResourceGroupName $resourceGroupName -Name $aksName -Force\n\n## Create testing namespace in AKS\nkubectl apply -f ./tools/e2etesting/K8s-Standalone/e2etesting/\n\n## Load Mosquitto\nkubectl apply -f ./tools/e2etesting/K8s-Standalone/mosquitto/\n\n## Load OPC PLC\nkubectl apply -f ./tools/e2etesting/K8s-Standalone/opcplc/\n\n## Load OPC Publisher\n\n$deviceId = \"device_$($testSuffix)\"\n\n### Create Image Pull Secret if required\nif (![string]::IsNullOrEmpty($ContainerRegistryUsername) -and ($ContainerRegistryPassword.Length -ne 0)) {\n    $withImagePullSecret = $true\n    kubectl create secret docker-registry dev-registry-pull-secret --docker-server=$ContainerRegistryServer --docker-username=$ContainerRegistryUsername --namespace=e2etesting --docker-password=$ContainerRegistryPassword\n}\nelse {\n    $withImagePullSecret = $false\n}\n\n### Replace placeholder in deployment file\n$fileContent = Get-Content $PublisherDeploymentFile -Raw\n$fileContent = $fileContent -replace \"{{ContainerRegistryServer}}\", $ContainerRegistryServer\nif (![string]::IsNullOrEmpty($ImageNamespace)) {\n    $ImageNamespace = \"$($ImageNamespace)/\"\n}\n$fileContent = $fileContent -replace \"{{ImageNamespace}}\", $ImageNamespace\n$fileContent = $fileContent -replace \"{{ImageTag}}\", $ImageTag\n$fileContent = $fileContent -replace \"{{DeviceId}}\", $deviceId\nif ($withImagePullSecret) {\n    $fileContent = $fileContent -replace \"{{ImagePullSecret}}\", \"\"\n}\nelse {\n    $fileContent = $fileContent -replace \"{{ImagePullSecret}}\", \"#\"\n}\n$fileContent | Out-File $PublisherDeploymentFile -Force -Encoding utf8\n$fileContent | Out-Host\n\nkubectl apply -f ./tools/e2etesting/K8s-Standalone/publisher\n\n$fileContent = Get-Content './tools/e2etesting/K8s-Standalone/verifier/deployment.yaml' -Raw\n$fileContent = $fileContent -replace \"{{VerifierImage}}\", $verifierImageName\n$fileContent | Out-File './tools/e2etesting/K8s-Standalone/verifier/deployment.yaml' -Force -Encoding utf8\n$fileContent | Out-Host\n\nkubectl create secret docker-registry verifier-pull-secret --docker-server=$registry.LoginServer --docker-username=$registrySecret.Username --namespace=e2etesting --docker-password=$registrySecret.Password\nkubectl apply -f ./tools/e2etesting/K8s-Standalone/verifier\n"
  },
  {
    "path": "tools/e2etesting/DeployEdge.ps1",
    "content": "Param(\n    [string]\n    $ResourceGroupName,\n    [Guid]\n    $TenantId,\n    [string]\n    $EdgeVmSize = \"Standard_D2s_v3\",\n    [string]\n    $EdgeVmLocation,\n    [string]\n    $KeysPath\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\nif (!$ResourceGroupName) {\n    Write-Error \"ResourceGroupName not set.\"\n}\n\nif (!$KeysPath) {\n    Write-Error \"Path to store certifactes not set.\"\n}\n\nif (!(Test-Path -Path $KeysPath)) {\n    New-Item -ItemType Directory -Path $KeysPath | Out-Null\n}\n\n$edgeVmUsername = 'sandboxuser'\n\n## Login if required\n\n$context = Get-AzContext\n\nif (!$context) {\n    Write-Host \"Logging in...\"\n    Login-AzAccount -Tenant $TenantId\n    $context = Get-AzContext\n}\n\n## Check if resource group exists\n\n$resourceGroup = Get-AzResourceGroup -Name $resourceGroupName\n\nif (!$resourceGroup) {\n    Write-Error \"Could not find Resource Group '$($ResourceGroupName)'.\"\n}\n\n## Determine suffix for testing resources\n\n$testSuffix = $resourceGroup.Tags[\"TestingResourcesSuffix\"]\n\nif (!$testSuffix) {\n    $testSuffix = Get-Random -Minimum 10000 -Maximum 99999\n\n    $tags = $resourceGroup.Tags\n    $tags+= @{\"TestingResourcesSuffix\" = $testSuffix}\n    Set-AzResourceGroup -Name $resourceGroup.ResourceGroupName -Tag $tags | Out-Null\n    $resourceGroup = Get-AzResourceGroup -Name $resourceGroup.ResourceGroupName\n}\n\nWrite-Host \"Using suffix for testing resources: $($testSuffix)\"\n\n## Check if IoT Hub exists\n$iotHub = Get-AzIotHub -ResourceGroupName $ResourceGroupName\n\nif ($iotHub.Count -ne 1) {\n    Write-Error \"IotHub could not be automatically selected in Resource Group '$($ResourceGroupName)'.\"\n}\n\nWrite-Host \"IoT Hub Name: $($iotHub.Name)\"\n\n## Ensure that Edge Device exists\n\n$deviceName = \"e2etestdevice_$($testSuffix)\"\n\nWrite-Host \"Iot Hub Device Identity: $($deviceName)\"\n\n$edgeIdentity = Get-AzIotHubDevice -ResourceGroupName $ResourceGroupName -IotHubName $iotHub.Name -DeviceId $deviceName -ErrorAction SilentlyContinue\n\nif (!$edgeIdentity) {\n    Write-Host \"Creating edge-enabled device identity $($deviceName) in Iot Hub $($iotHub.Name)\"\n    $edgeIdentity = Add-AzIotHubDevice -ResourceGroupName $ResourceGroupName -IotHubName $iotHub.Name -DeviceId $deviceName -EdgeEnabled\n}\n\nif (!$edgeIdentity.Capabilities.IotEdge) {\n    Write-Error \"Device '$($edgeIdentity.Id)' Iot Hub: '$($iotHub.Name)') is not edge-enabled.\"\n}\n\nWrite-Host \"Updating 'os' and '__type__'-Tags in Device Twin...\"\nUpdate-AzIotHubDeviceTwin -ResourceGroupName $ResourceGroupName -IotHubName $iotHub.Name -DeviceId $edgeIdentity.Id -Tag @{ \"os\" = \"Linux\"; \"__type__\" = \"iiotedge\"; } | Out-Null\n\n## Generate SSH keys\n$privateKeyFilePath = Join-Path $KeysPath \"id_rsa_iotedge\"\n$publicKeyFilePath = $privateKeyFilePath + \".pub\"\n$keypassphrase = '\"$($testSuffix)\"'\nWrite-Output \"y\" | ssh-keygen -q -m PEM -b 4096 -t rsa -f $privateKeyFilePath -N $keypassphrase\n$sshPrivateKey = Get-Content $privateKeyFilePath -Raw\n$sshPublicKey = Get-Content $publicKeyFilePath -Raw\n\n## Delete SSH keys from file system\nRemove-Item -Path $privateKeyFilePath | Out-Null\nRemove-Item -Path $publicKeyFilePath | Out-Null\n\n## Deploy Edge VM\nWrite-Host \"Getting Device Connection String for IoT Edge Deployment...\"\n$edgeDeviceConnectionString = Get-AzIotHubDeviceConnectionString -ResourceGroupName $ResourceGroupName -IotHubName $iotHub.Name -DeviceId $edgeIdentity.Id -KeyType primary\n$edgeDeviceConnectionString = $edgeDeviceConnectionString.ConnectionString\n\n$dnsPrefix = \"e2etesting-edgevm-\" + $testSuffix\n\nWrite-Host \"Using DNS prefix: $($dnsPrefix)\"\n\n$edgeParameters = @{\n    \"dnsLabelPrefix\" = [string]$dnsPrefix\n    \"adminUsername\" = [string]$edgeVmUsername\n    \"deviceConnectionString\" = [string]$edgeDeviceConnectionString\n    \"authenticationType\" = \"sshPublicKey\"\n    \"adminPasswordOrKey\" = [string]$sshPublicKey\n    \"allowSsh\" = $true\n    \"vmSize\" = [string]$EdgeVmSize\n}\n\nif ($EdgeVmLocation) {\n    $edgeParameters[\"location\"] = [string]$EdgeVmLocation\n}\n\n$edgeTemplateUri = \"https://raw.githubusercontent.com/Azure/iotedge-vm-deploy/1.4/edgeDeploy.json\"\n\nWrite-Host \"Running IoT Edge VM Deployment...\"\n\n$edgeDeployment = New-AzResourceGroupDeployment -ResourceGroupName $ResourceGroupName -TemplateUri $edgeTemplateUri -TemplateParameterObject $edgeParameters\n\n$edgeDeployment | ConvertTo-Json | Out-Host\n\nif ($edgeDeployment.ProvisioningState -ne \"Succeeded\") {\n    Write-Error \"Deployment $($edgeDeployment.ProvisioningState).\"\n}\n\n## This needs to be refactored. However, currently the SSH-Command is the only output from the Edge deployment script. And that command includes the FQDN of the VM.\n$sshUrl = $edgeDeployment.Outputs[\"public_SSH\"].Value\nif ([string]::IsNullOrEmpty($sshUrl)) {\n    Write-Error \"Deployment did not provide Public_SSH output.\"\n}\n$fqdn = $sshUrl.Split(\"@\")[1]\n\nWrite-Host \"##vso[task.setvariable variable=EdgeIdentity]$($edgeIdentity.Id)\"\nWrite-Host \"##vso[task.setvariable variable=EdgeVmUsername]$($edgeVmUsername)\"\nWrite-Host \"##vso[task.setvariable variable=SshPrivateKey]$($sshPrivateKey)\"\nWrite-Host \"##vso[task.setvariable variable=SshPublicKey]$($sshPublicKey)\"\nWrite-Host \"##vso[task.setvariable variable=Fqdn]$($fqdn)\"\n\nWrite-Host \"Deployment finished.\""
  },
  {
    "path": "tools/e2etesting/DeployPLCs.ps1",
    "content": "Param(\n    [string]\n    $ResourceGroupName,\n    [int]\n    $NumberOfSimulations = 10,\n    [Guid]\n    $TenantId,\n    [int]\n    $NumberOfSlowNodes = 250,\n    [int]\n    $SlowNodeRate = 10,\n    [string]\n    $SlowNodeType =  \"uint\",\n    [int]\n    $NumberOfFastNodes = 50,\n    [int]\n    $FastNodeRate = 1,\n    [string]\n    $FastNodeType = \"uint\",\n    [string]\n    $PLCImage,\n    [string]\n    $ResourcesPrefix = \"e2etesting\",\n    [Double]\n    $MemoryInGb = 0.5,\n    [int]\n    $CpuCount = 1,\n    [bool]\n    $UsePrivateIp = $false\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\nif (!$PLCImage) {\n    $PLCImage = \"mcr.microsoft.com/iotedge/opc-plc:latest\"\n}\n\nif (!$ResourceGroupName) {\n    Write-Error \"ResourceGroupName not set.\"\n}\n\n## Check if resource group exists\n$resourceGroup = az group show --name $ResourceGroupName | ConvertFrom-Json\n\nif (!$resourceGroup) {\n    Write-Error \"Could not find Resource Group '$($ResourceGroupName)'.\"\n}\n\nWrite-Host \"Resource Group: $($ResourceGroupName)\"\n\n## Determine suffix for testing resources\n\n$testSuffix = $resourceGroup.tags.TestingResourcesSuffix\n\nif (!$testSuffix) {\n    $testSuffix = Get-Random -Minimum 10000 -Maximum 99999\n    # TODO: don't override the original tags\n    az group update --name $resourceGroup --tags TestingResourcesSuffix=$testSuffix\n}\n\n## Ensure Azure Container Instances ##\n\n$allAciNames = @()\n\nfor ($i = 0; $i -lt $NumberOfSimulations; $i++) {\n    $name = \"$($ResourcesPrefix)-simulation-aci-\" + $i.ToString().PadLeft(3, \"0\") + \"-\" + $testSuffix\n    $allAciNames += $name\n}\n\n$existingACIs = az container list --resource-group $ResourceGroupName  --query \"[?starts_with(name,'$ResourcesPrefix') ].name\"  | ConvertFrom-Json\n\n$aciNamesToCreate = @()\n\n$allAciNames | %{\n    if (!@($existingACIs).Contains($_)) {\n        $aciNamesToCreate += $_\n    }\n}\n\nWrite-Host \"Creating container instances with PLC Image $($PLCImage)...\"\n\n$jobs = @()\n\nif ($aciNamesToCreate.Length -gt 0) {\n    if ($UsePrivateIp -eq $false) {\n        $script = {\n            Param($Name)\n\n            # create\n            $ports = @(50000, 80)\n            az container create --resource-group $using:ResourceGroupName --name $Name --image $using:PLCImage --os-type Linux --ports @ports --cpu $using:CpuCount --memory $using:MemoryInGb --ip-address Public --dns-name-label $Name\n            $container = az container show --resource-group $using:ResourceGroupName --name $Name | ConvertFrom-Json\n            if (!$container.ipAddress.ip) {\n                throw \"Create container failed with exit code: $LASTEXITCODE\"\n            }\n            # update\n            $aciCommand = \"/bin/sh -c './opcplc --ph $($container.ipAddress.fqdn) --cdn $($container.ipAddress.ip) --ctb --pn=50000 --autoaccept --nospikes --nodips --nopostrend --nonegtrend --nodatavalues --sph --wp=80 --sn=$($using:NumberOfSlowNodes) --sr=$($using:SlowNodeRate) --st=$($using:SlowNodeType) --fn=$($using:NumberOfFastNodes) --fr=$($using:FastNodeRate) --ft=$($using:FastNodeType)'\"\n            az container create --resource-group $using:ResourceGroupName --name $Name --image $using:PLCImage --os-type Linux --ports @ports --cpu $using:CpuCount --memory $using:MemoryInGb --ip-address Public --dns-name-label $Name --command $aciCommand\n            if ($LASTEXITCODE -ne 0) {\n                az container delete -y --resource-group $using:ResourceGroupName --name $Name\n                throw \"Update container failed with exit code: $LASTEXITCODE\"\n            }\n        }\n    }\n    else {\n        Write-Host \"Creating containers with private IP addresses\"\n        ## Set vNet and subNet parameters for nested edge\n        $networkResourceGroup = $ResourceGroupName + \"-RG-network\"\n        $vNet =  az resource show --name \"PurdueNetwork\" --resource-group $networkResourceGroup --resource-type \"Microsoft.Network/virtualNetworks\" --query id\n        $subNet = \"3-L2-OT-AreaSupervisoryControl\"\n        Write-Host \"vNet resource id is $vNet\"\n\n        $script = {\n            Param($Name)\n\n            #create\n            $ports = @(50000, 80)\n            az container create --resource-group $using:ResourceGroupName --name $Name --image $using:PLCImage --os-type Linux --ports @ports --cpu $using:CpuCount --memory $using:MemoryInGb --ip-address Private --vnet $using:vNet --subnet $using:subNet\n            $container = az container show --resource-group $using:ResourceGroupName --name $Name | ConvertFrom-Json\n            if (!$container.ipAddress.ip) {\n                throw \"Create container failed with exit code: $LASTEXITCODE\"\n            }\n\n            # update\n            $aciCommand = \"/bin/sh -c './opcplc --ph $($container.ipAddress.fqdn) --cdn $($container.ipAddress.ip) --ctb --pn=50000 --autoaccept --nospikes --nodips --nopostrend --nonegtrend --nodatavalues --sph --wp=80 --sn=$($using:NumberOfSlowNodes) --sr=$($using:SlowNodeRate) --st=$($using:SlowNodeType) --fn=$($using:NumberOfFastNodes) --fr=$($using:FastNodeRate) --ft=$($using:FastNodeType)'\"\n            az container create --resource-group $using:ResourceGroupName --name $Name --image $using:PLCImage --os-type Linux --ports @ports --cpu $using:CpuCount --memory $using:MemoryInGb --ip-address Private --vnet $using:vNet --subnet $using:subNet --command $aciCommand\n            if ($LASTEXITCODE -ne 0) {\n                az container delete -y --resource-group $using:ResourceGroupName --name $Name\n                throw \"Update container failed with exit code: $LASTEXITCODE\"\n            }\n        }\n    }\n\n    foreach ($aciNameToCreate in $aciNamesToCreate) {\n        Write-Host \"Creating ACI $($aciNameToCreate)...\"\n        $job = Start-Job -Scriptblock $script -ArgumentList $aciNameToCreate\n        $jobs += $job\n    }\n\n    Write-Host \"Waiting for deployments to finish...\"\n\n    $working = $true\n\n    while($working) {\n        $working = $false\n        foreach ($job in $jobs) {\n            if ($job.JobStateInfo.State -eq 'Running') {\n                $working = $true\n                break\n            }\n        }\n        Start-Sleep -Seconds 1\n    }\n\n    Wait-Job -Job $jobs | Out-Null\n\n    Write-Host \"Deployment finished.\"\n\n    foreach ($job in $jobs) {\n        if ($job.JobStateInfo.State -ne 'Completed') {\n            Write-Host \"Error while deploying ACI: $($job.JobStateInfo.State).\"\n            Receive-Job -Job $job\n        }\n    }\n}\n\n## Write ACI FQDNs and ips ##\nWrite-Host\nWrite-Host \"Getting IPs of ACIs for simulated PLCs...\"\n$fqdnList = az container list --resource-group $ResourceGroupName  --query \"[?starts_with(name,'$ResourcesPrefix') ].ipAddress.fqdn\"  | ConvertFrom-Json\n$ipList = az container list --resource-group $ResourceGroupName  --query \"[?starts_with(name,'$ResourcesPrefix') ].ipAddress.ip\"  | ConvertFrom-Json\n\nif ($ipList.Count -eq 0) {\n    Write-Error \"No Azure Container Instances have been deployed. Please check that quota is not exceeded for this region.\"\n}\n\nforeach ($ip in $ipList) {\n    Write-Host $ip\n    $plcSimIps += $ip + \";\"\n}\nforeach ($fqdn in $fqdnList) {\n    Write-Host $ip\n    $plcSimNames += $fqdn + \";\"\n}\n\nWrite-Host \"##vso[task.setvariable variable=OpcPlcSimulationUrls]$($plcSimNames)\"\nWrite-Host \"##vso[task.setvariable variable=OpcPlcSimulationIps]$($plcSimIps)\"\n"
  },
  {
    "path": "tools/e2etesting/DeployStandalone.ps1",
    "content": "Param(\n    [string]\n    $ResourceGroupName,\n    [Guid]\n    $TenantId,\n    [string]\n    $Region = \"EastUS\",\n    [string]\n    $ServicePrincipalId,\n    [string]\n    $OpcPlcAddresses\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\nif (!$ResourceGroupName) {\n    Write-Error \"ResourceGroupName not set.\"\n}\n\nif (!$Region) {\n    Write-Error \"Region not set.\"\n}\n\nif (!$ServicePrincipalId) {\n    Write-Warning \"ServicePrincipalId not set, cannot update permissions.\"\n}\n\n## Login if required\n\nWrite-Host \"Getting Azure Context...\"\n$context = Get-AzContext\n\nif (!$context) {\n    Write-Host \"Logging in...\"\n    Login-AzAccount -Tenant $TenantId\n    $context = Get-AzContext\n}\n\nif (!$TenantId) {\n    $TenantId = $context.Tenant.Id\n    Write-Host \"Using TenantId $($TenantId).\"\n}\n\n## Check if resource group exists\n\n$resourceGroup = Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue\n\nif (!$resourceGroup) {\n    Write-Host \"Creating Resource Group $($ResourceGroupName) in $($Region)...\"\n    $resourceGroup = New-AzResourceGroup -Name $ResourceGroupName -Location $Region\n}\n\nWrite-Host \"Resource Group: $($resourceGroup.ResourceGroupName)\"\n\n## Determine suffix for testing resources\n\nif (!$resourceGroup.Tags) {\n    $resourceGroup.Tags = @{}\n}\n\n$testSuffix = $resourceGroup.Tags[\"TestingResourcesSuffix\"]\n\nif (!$testSuffix) {\n    $testSuffix = Get-Random -Minimum 10000 -Maximum 99999\n\n    $tags = $resourceGroup.Tags\n    $tags+= @{\"TestingResourcesSuffix\" = $testSuffix}\n    Set-AzResourceGroup -Name $resourceGroup.ResourceGroupName -Tag $tags | Out-Null\n    $resourceGroup = Get-AzResourceGroup -Name $resourceGroup.ResourceGroupName\n}\n\nWrite-Host \"Resources Suffix: $($testSuffix)\"\n\n$iotHubName = \"e2etesting-iotHub-$($testSuffix)\"\n$keyVaultName = \"e2etestingkeyVault$($testSuffix)\"\n\nWrite-Host \"IoT Hub: $($iotHubName)\"\nWrite-Host \"Key Vault: $($keyVaultName)\"\n\n## Ensure IoT Hub\n$iotHub = Get-AzIotHub -ResourceGroupName $ResourceGroupName -Name $iotHubName -ErrorAction SilentlyContinue\n\nif (!$iotHub) {\n    Write-Host \"Creating IoT Hub $($iotHubName)...\"\n    $iotHub = New-AzIotHub -ResourceGroupName $ResourceGroupName -Name $iotHubName -SkuName S1 -Units 1 -Location $resourceGroup.Location\n}\n\n# Ensure Event Hub additional consumer group for tests\n\n$cgName = \"TestConsumer\"\n$iotHubCg = Get-AzIotHubEventHubConsumerGroup -ResourceGroupName $ResourceGroupName -Name $iotHubName | Where-Object Name -eq $cgName\n\nif (!$iotHubCg) {\n    Write-Host \"Creating IoT Hub Event Hub Consumer Group $($cgName)...\"\n    $iotHubCg = Add-AzIotHubEventHubConsumerGroup -ResourceGroupName $ResourceGroupName -Name $iotHubName -EventHubConsumerGroupName $cgName\n}\n\n## Ensure KeyVault\n\n$keyVault = Get-AzKeyVault -ResourceGroupName $ResourceGroupName -VaultName $keyVaultName -ErrorAction SilentlyContinue\n\nif (!$keyVault) {\n    Write-Host \"Creating Key Vault $($keyVaultName)\"\n    $keyVault = New-AzKeyVault -ResourceGroupName $ResourceGroupName -VaultName $keyVaultName -Location $resourceGroup.Location -DisableRbacAuthorization\n}\nelse {\n    $keyVault | Update-AzKeyVault -DisableRbacAuthorization\n}\n\nif ($ServicePrincipalId) {\n    Write-Host \"Setting Key Vault Permissions for Service Principal $($ServicePrincipalId)...\"\n    Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -ServicePrincipalName $ServicePrincipalId -PermissionsToSecrets get,list,set\n}\n\n$connectionString = Get-AzIotHubConnectionString $ResourceGroupName -Name $iothub.Name -KeyName \"iothubowner\"\n$SubscriptionId = $context.Subscription.Id\n\nWrite-Host \"Adding/Updating KeyVault-Secret 'PCS-IOTHUB-CONNSTRING' with value '***'...\"\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $connectionString.PrimaryConnectionString -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-IOTHUB-CONNSTRING' -SecretValue $secret | Out-Null\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $TenantId -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-AUTH-TENANT' -SecretValue $secret | Out-Null\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $SubscriptionId -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-SUBSCRIPTION-ID' -SecretValue $secret | Out-Null\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $ResourceGroupName -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-RESOURCE-GROUP' -SecretValue $secret | Out-Null\n\nWrite-Host \"Deployment finished.\""
  },
  {
    "path": "tools/e2etesting/DeployTestResources.ps1",
    "content": "Param(\n    $ResourceGroupName,\n    $StorageAccountName,\n    $IoTHubName,\n    $TenantId,\n    $StorageFileShareName = \"acishare\"\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\n## Pre-Checks ##\n\nif (!$ResourceGroupName) {\n    Write-Error \"ResourceGroupName is empty.\"\n    return\n}\n\n$context = Get-AzContext\n\nif (!$context) {\n    Write-Host \"Logging in...\"\n    Login-AzAccount -Tenant $TenantId\n    $context = Get-AzContext\n}\n\n## Ensure Resource Group ##\n\n$resourceGroup = Get-AzResourceGroup -Name $ResourceGroupName\n\nif (!$resourceGroup) {\n    throw \"ResourceGroup $($ResourceGroupName) does not exist!\"\n}\n\n$suffix = $resourceGroup.Tags[\"TestingResourcesSuffix\"]\nif ([String]::IsNullOrWhiteSpace($suffix)) {\n    $suffix = (Get-Random -Minimum 10000 -Maximum 99999)\n    $tags = $resourceGroup.Tags\n    $tags+= @{\"TestingResourcesSuffix\"=$suffix}\n    Set-AzResourceGroup -Name $resourceGroup.ResourceGroupName -Tag $tags | Out-Null\n    $resourceGroup = Get-AzResourceGroup -Name $resourceGroup.ResourceGroupName\n}\n\nWrite-Host \"Using suffix $($suffix) for test-related resources.\"\n\n$keyVault = Get-AzKeyVault -ResourceGroupName $ResourceGroupName\nif ($keyVault.Count -ne 1) {\n    throw \"keyVault could not be automatically selected in Resource Group '$($ResourceGroupName)'.\"\n}\n\n## Log parameters ##\n\nWrite-Host \"==============================================\"\nWrite-Host \"Test suffix:  $($suffix)\"\nWrite-Host \"==============================================\"\nWrite-Host \"Subscription Id: $($context.Subscription.Id)\"\nWrite-Host \"Subscription Name: $($context.Subscription.Name)\"\nWrite-Host \"Tenant Id: $($context.Tenant.Id)\"\nWrite-Host \"Resource Group: $($ResourceGroupName)\"\nWrite-Host \"==============================================\"\nWrite-Host \"Storage Account: $($StorageAccountName)\"\nWrite-Host \"KeyVault: $($keyVault.VaultName)\"\nWrite-Host \"IoTHub: $($IoTHubName)\"\nWrite-Host \"==============================================\"\n\nWrite-Host \"##vso[build.addbuildtag]$($suffix)\"\nWrite-Host \"##vso[build.addbuildtag]$($context.Subscription.Id)\"\nWrite-Host \"##vso[build.addbuildtag]$($ResourceGroupName)\"\nWrite-Host \"##vso[build.addbuildtag]$($keyVault.VaultName)\"\n\n## Check existence of IoT Hub ##\n\nif (!$IoTHubName) {\n    $iothub = Get-AzIotHub -ResourceGroupName $ResourceGroupName\n    if ($iotHub.Count -eq 1) {\n        $IoTHubName = $iotHub.Name\n    } else {\n        throw \"More then 1 IoT Hub instances found in resource group $($ResourceGroupName). Please specify IoTHubName argument of this script.\"\n    }\n} else {\n    $iotHub = Get-AzIotHub -ResourceGroupName $ResourceGroupName -Name $IoTHubName -ErrorAction SilentlyContinue\n}\nif (!$iotHub) {\n    throw \"Could not retrieve IoTHub '$($IoTHubName)' in Resource Group '$($ResourceGroupName)'. Please make sure that it exists.\"\n}\n\n## Get IoT Hub EventHub-compatible Endpoint ##\n\n$ehEndpoint = $iotHub.Properties.EventHubEndpoints[\"events\"].Endpoint\n$iotHubkey = Get-AzIotHubKey -ResourceGroupName $ResourceGroupName -Name $IoTHubName -KeyName \"iothubowner\"\n$ehConnectionString =  \"Endpoint={0};SharedAccessKeyName={1};SharedAccessKey={2};EntityPath={3}\" -f $ehEndpoint,$iotHubkey.KeyName,$iotHubkey.PrimaryKey,$iotHub.Name\nWrite-Host \"Setting KeyVault Secret 'iothub-eventhub-connectionstring' to '***'.\"\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $ehConnectionString -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name \"iothub-eventhub-connectionstring\" -SecretValue $secret | Out-Null\n\n# Ensure Event Hub additional consumer group for tests\n\n$cgName = \"TestConsumer\"\n$iotHubCg = Get-AzIotHubEventHubConsumerGroup -ResourceGroupName $ResourceGroupName -Name $IoTHubName | Where-Object Name -eq $cgName\nif (!$iotHubCg) {\n    Write-Host \"Creating IoT Hub $($IoTHubName) Event Hub Consumer Group $($cgName)...\"\n    $iotHubCg = Add-AzIotHubEventHubConsumerGroup -ResourceGroupName $ResourceGroupName -Name $IoTHubName -EventHubConsumerGroupName $cgName\n}\n\n## Ensure Storage Account ##\n\nif (!$StorageAccountName) {\n    $StorageAccountName = \"e2etestingstorage\" + $suffix\n}\n\n$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroup.ResourceGroupName -Name $StorageAccountName -ErrorAction SilentlyContinue\nif (!$storageAccount) {\n    Write-Host \"Storage Account '$($StorageAccountName)' does not exist, creating...\"\n    $storageAccount = New-AzStorageAccount -AllowCrossTenantReplication $True -ResourceGroupName $resourceGroup.ResourceGroupName -Name $StorageAccountName -SkuName Standard_LRS -Location $resourceGroup.Location\n}\n\n$storageContext = $storageAccount.Context\n## Ensure file share for ACI mount and files to be able to support dynamic ACI:s in test\n$storageShare = Get-AzStorageShare -Context $storageContext.Context -Name $StorageFileShareName -ErrorAction SilentlyContinue\n\nif (!$storageShare) {\n    Write-Host \"Creating storage share '$($StorageFileShareName)' in storage account '$($storageAccount.StorageAccountName)'...\"\n    $storageShare = New-AzStorageShare -Context $storageContext.Context -Name $StorageFileShareName | Out-Null\n}\n"
  },
  {
    "path": "tools/e2etesting/DetermineKeyVaultName.ps1",
    "content": "param($ResourceGroupName)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\nif (!$ResourceGroupName) {\n    Write-Error \"ResourceGroupName is empty.\"\n    return\n}\n\n$keyVaultVariableName = \"KeyVaultName\"\n\nWrite-Host \"Looking for KeyVault in Resource group '$($ResourceGroupName)'\"\n$resourceGroup = Get-AzResourceGroup -Name $ResourceGroupName\n\nif (!$resourceGroup) {\n    Write-Host \"##vso[task.complete result=Failed]Could not get Resource Group with name '$($ResourceGroupName)', exiting...'\"\n}\n\n$keyVaults = Get-AzKeyVault -ResourceGroupName $resourceGroup.ResourceGroupName\n\nif (!$keyVaults) {\n    Write-Host \"##vso[task.complete result=Failed]Could not find any KeyVault on Resource Group '$($ResourceGroupName)'.\"\n}\n\nif ($keyVaults.Count -eq 1) {\n    $applicationKeyVault = $keyVaults.VaultName\n}\nelse {\n    $application = $resourceGroup.Tags[\"application\"]\n\n    if (!$application) {\n        Write-Host \"##vso[task.complete result=Failed]Application-Tag on Resource Group does not exist or is empty. Please make sure that the Resource Group contains a valid IIoT Deployment.\"\n    }\n\n    foreach ($keyVault in $keyVaults) {\n        $kvApplication = $keyVault.Tags[\"application\"]\n\n        if ($kvApplication -ne $application) {\n            continue\n        } else {\n            $applicationKeyVault = $keyVault.VaultName\n            break\n        }\n    }\n}\n\nif (!$applicationKeyVault) {\n    Write-Host \"##vso[task.complete result=Failed]Could not locate KeyVault with Tag 'application = $($application)' in Resource Group '$($ResourceGroupName)'.\"\n}\n\nWrite-Host \"Setting variable '$($keyVaultVariableName)' to '$($applicationKeyVault)'.\"\nWrite-Host \"##vso[task.setvariable variable=$($keyVaultVariableName)]$($applicationKeyVault)\""
  },
  {
    "path": "tools/e2etesting/GetSecrets.ps1",
    "content": "param(\n    [Parameter(Mandatory=$true)]\n    [string] $KeyVaultName\n)\n\n$ErrorActionPreference = \"Stop\"\n\n# Find the full path of the launchSettings.json file\n$folderName = \"e2e-tests\"\n$currentPath = (Get-Location).Path\n$path = Get-ChildItem -Path $currentPath $folderName -Recurse\nwhile (!$path) {\n    $currentPath = $currentPath + '\\..'\n    $path = Get-ChildItem -Path $currentPath $folderName\n}\n$settingsFile = $path.FullName + \"\\.env\"\n\n$confirmation = Read-Host \"Do you want to overwrite the $($settingsFile) file? yes/no\"\n\n$values = @{}\n\n# Get the resource group name\n$resourceGroup = (Get-AzResource -Name $KeyVaultName).ResourceGroupName\n$values[\"ApplicationName\"] = $resourceGroup\n\n# Get the names of the secrets from the Key Vault\n$secrets = Get-AzKeyVaultSecret -VaultName $KeyVaultName\n\n# Get the values for the secrets\nforeach ($secret in $secrets) {\n    $secretValueSec = Get-AzKeyVaultSecret -VaultName $KeyVaultName -Name $secret.Name\n\n    $ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secretValueSec.SecretValue)\n\n    try {\n        $secretValueText = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr)\n    } finally {\n        [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr)\n    }\n    $values[$secret.Name.ToUpperInvariant().Replace(\"-\", \"_\")] = $secretValueText.Replace(\"`n\", \"\\n\").Replace(\"`r\", \"\\r\")\n}\n\n# Write the secrets to .env\n$content = \"\"\nforeach ($variable in $values.Keys) {\n    $content += \"$($variable)=$($values[$variable])`n\"\n}\n\nif ($confirmation -eq \"yes\"){\n    Set-Content -Path $settingsFile $content\n    Write-Host \"The file $($settingsFile) was successfully updated with the secrets from your key vault.\"\n}\nelse {\n    Write-Host $content\n}"
  },
  {
    "path": "tools/e2etesting/SetKeyVaultPermissions.ps1",
    "content": "Param(\n    [string]\n    $ResourceGroupName,\n    [string]\n    $ServicePrincipalName\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\nif (!$ResourceGroupName) {\n    Write-Error \"ResourceGroupName not set.\"\n}\n\n$keyVaults = Get-AzKeyVault -ResourceGroupName $ResourceGroupName\n\nif (!$keyVaults) {\n    Write-Error \"Could not find any KeyVaults in Resource Group ($ResourceGroupName)\"\n}\n\nif ($ServicePrincipalName) {\n    $keyVaults | %{\n        Write-Host \"Adding List,Get,Set-Permissions for secrets of vault '$($_.VaultName)' for ServicePrincipalName '$($ServicePrincipalName)'\"\n        Set-AzKeyVaultAccessPolicy -VaultName $_.VaultName -ResourceGroupName $ResourceGroupName -ServicePrincipalName $ServicePrincipalName -PermissionsToSecrets get,list,set \n    }\n} else {\n    if ($azContext.Account.Id) {\n        $keyVaults | %{\n            Write-Host \"Adding List,Get,Set-Permissions for secrets of vault '$($_.VaultName)' for UserPrincipalName '$($azContext.Account.Id)'\"\n            Set-AzKeyVaultAccessPolicy -VaultName $_.VaultName -ResourceGroupName $ResourceGroupName -UserPrincipalName $azContext.Account.Id -PermissionsToSecrets get,list,set\n        }\n    } else {\n        Write-Error \"Not logged in\" -ErrorAction Stop\n    }\n} \n"
  },
  {
    "path": "tools/e2etesting/SetKeyVaultSecrets.ps1",
    "content": "Param(\n    [string] $KeyVaultName,\n    [string] $ImageTag,\n    [string] $ImageNamespace,\n    [string] $ContainerRegistryServer,\n    [string] $ContainerRegistryUsername,\n    [string] $ContainerRegistryPassword\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\nif (!$KeyVaultName) {\n    Write-Error \"KeyVaultName not set.\"\n}\n\nif (!$ImageTag) {\n    $ImageNamespace = \"latest\"\n}\n\nif (!$ImageNamespace) {\n    $ImageNamespace = \"\"\n}\n\nif (!$ContainerRegistryServer) {\n    $ContainerRegistryServer = \"mcr.microsoft.com\"\n}\n\nif (!$ContainerRegistryUsername) {\n    $ContainerRegistryUsername = \"\"\n}\n\nif (!$ContainerRegistryPassword) {\n    $ContainerRegistryPassword = \"\"\n}\n\n## Login if required\n\nWrite-Host \"Getting Azure Context...\"\n$context = Get-AzContext\n\nif (!$context) {\n    Write-Host \"Logging in...\"\n    Login-AzAccount -Tenant $TenantId\n    $context = Get-AzContext\n}\n\n## Ensure KeyVault\n$resourceGroup = (Get-AzResource -Name $KeyVaultName).ResourceGroupName\n$keyVault = Get-AzKeyVault -ResourceGroupName $resourceGroup -VaultName $KeyVaultName\n\nWrite-Host \"Adding/Updating KeyVault-Secrets...\"\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $ContainerRegistryServer -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-DOCKER-SERVER' -SecretValue (ConvertTo-SecureString $ContainerRegistryServer -AsPlainText -Force) | Out-Null\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $ContainerRegistryUsername -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-DOCKER-USER' -SecretValue (ConvertTo-SecureString $ContainerRegistryUsername -AsPlainText -Force) | Out-Null\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $ContainerRegistryPassword -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-DOCKER-PASSWORD' -SecretValue (ConvertTo-SecureString $ContainerRegistryPassword -AsPlainText -Force) | Out-Null\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $ImageNamespace -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-IMAGES-NAMESPACE' -SecretValue (ConvertTo-SecureString $ImageNamespace -AsPlainText -Force) | Out-Null\n[Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"PSAvoidUsingConvertToSecureStringWithPlainText\", \"\")]\n$secret = ConvertTo-SecureString $ImageTag -AsPlainText -Force\nSet-AzKeyVaultSecret -VaultName $keyVault.VaultName -Name 'PCS-IMAGES-TAG' -SecretValue (ConvertTo-SecureString $ImageTag -AsPlainText -Force) | Out-Null\n\n"
  },
  {
    "path": "tools/e2etesting/SetTestVariables.ps1",
    "content": "Param(\n    [string] $ResourceGroupName,\n    [Guid] $TenantId,\n    [string] $OpcPlcSimulationUrls,\n    [string] $OpcPlcSimulationIps,\n    [string] $EdgeIdentity,\n    [string] $EdgeVmUsername,\n    [string] $SshPrivateKey,\n    [string] $SshPublicKey,\n    [string] $Fqdn\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n\nif (!$ResourceGroupName) {\n    Write-Error \"ResourceGroupName not set.\"\n}\n\n## Check if KeyVault exists\n$keyVault = \"e2etestingkeyVault\" + $testSuffix\n$keyVaultList = az keyvault list --resource-group $ResourceGroupName | ConvertFrom-Json\nif ($keyVaultList.Count -ne 1){\n    Write-Error \"keyVault could not be automatically selected in Resource Group '$($ResourceGroupName)'.\"\n}\n\n$keyVault = $keyVaultList.name\nWrite-Host \"The following Key Vault has been selected: $keyVault\"\n\nWrite-Host \"Adding/Updating KeyVault-Secret 'plc-simulation-urls' with value '$($OpcPlcSimulationUrls)'...\"\naz keyvault secret set --vault-name $keyVault --name \"plc-simulation-urls\" --value $OpcPlcSimulationUrls > $null\nWrite-Host \"Adding/Updating KeyVault-Secret 'plc-simulation-ips' with value '$($OpcPlcSimulationIps)'...\"\naz keyvault secret set --vault-name $keyVault --name \"plc-simulation-ips\" --value $OpcPlcSimulationIps > $null\n\nWrite-Host \"Adding/Updating KeyVault-Secret 'iot-edge-device-id' with value '$($EdgeIdentity)'...\"\naz keyvault secret set --vault-name $keyVault --name 'iot-edge-device-id' --value $EdgeIdentity > $null\nWrite-Host \"Adding/Updating KeVault-Secret 'iot-edge-vm-username' with value '$($EdgeVmUsername)'...\"\naz keyvault secret set --vault-name $keyVault --name 'iot-edge-vm-username' --value $EdgeVmUsername > $null\nWrite-Host \"Adding/Updating KeVault-Certificate 'iot-edge-vm-privatekey'...\"\naz keyvault secret set --vault-name $keyVault --name 'iot-edge-vm-privatekey' --value $SshPrivateKey > $null\nWrite-Host \"Adding/Updating KeVault-Certificate 'iot-edge-vm-publickey'...\"\naz keyvault secret set --vault-name $keyVault --name 'iot-edge-vm-publickey' --value $SshPublicKey > $null\nWrite-Host \"Adding/Updating KeyVault-Secret 'iot-edge-device-dnsname' with value '$($Fqdn)'...\"\naz keyvault secret set --vault-name $keyVault --name 'iot-edge-device-dnsname' --value $Fqdn > $null\n\nWrite-Host \"Deployment finished.\"\n"
  },
  {
    "path": "tools/e2etesting/SetVariables.ps1",
    "content": "﻿Param(\n    [string] $BranchName,\n    [string] $Region,\n    [string] $ImageTag,\n    [string] $ContainerRegistryServer,\n    [string] $ResourceGroupName,\n    [string] $SubscriptionId\n)\n\n# Stop execution when an error occurs.\n$ErrorActionPreference = \"Stop\"\n# Set-PSDebug -Trace 2\n\n$registry = $script:ContainerRegistryServer\nif ([string]::IsNullOrWhiteSpace($registry))\n{\n    Write-Host \"No container registry provided, using default.\"\n    $registry = \"industrialiotdev\"\n}\n\nWrite-Host \"Looking up credentials for $($registry) registry in KV $KeyVaultName.\"\n\nif ($registry -eq \"mcr.microsoft.com\") {\n    Write-Host \"##vso[task.setvariable variable=ContainerRegistryServer]$($registry)\"\n}\nelse {\n    if ([string]::IsNullOrWhiteSpace($ResourceGroupName))\n    {\n        throw \"ResourceGroupName not provided.\"\n    }\n\n    if ([string]::IsNullOrWhiteSpace($SubscriptionId))\n    {\n        throw \"SubscriptionId not provided.\"\n    }\n\n    # Get the ACR credentials\n    $acrCredentials = Get-AzContainerRegistryCredential `\n        -ResourceGroupName $ResourceGroupName `\n        -RegistryName $registry `\n        -SubscriptionId $SubscriptionId\n\n    Write-Host \"##vso[task.setvariable variable=ContainerRegistryPassword]$($acrCredentials.Password)\"\n    Write-Host \"##vso[task.setvariable variable=ContainerRegistryServer]$($registry).azurecr.io\"\n    Write-Host \"##vso[task.setvariable variable=ContainerRegistryUsername]$($acrCredentials.Username)\"\n}\n\nif ([string]::IsNullOrWhiteSpace($script:ImageTag))\n{\n    $script:ImageTag = \"$($env:PlatformVersion)\"\n}\nif ([string]::IsNullOrWhiteSpace($script:ImageTag))\n{\n    $script:ImageTag = \"$($env:Version_Prefix)\"\n    if (![string]::IsNullOrWhiteSpace($env:Version_Suffix))\n    {\n        Write-Host \"##vso[task.setvariable variable=PlatformVersion]$($script:ImageTag)\"\n    }\n}\nif ([string]::IsNullOrWhiteSpace($script:ImageTag))\n{\n    try\n    {\n        dotnet tool install --global --framework net8.0 nbgv 2>&1\n    }\n    catch  {}\n    try\n    {\n        Write-Host \"Using get-version to determine version.\"\n        $props = $(nbgv get-version -f json) | ConvertFrom-Json\n        if ($LastExitCode -ne 0) {\n            throw \"Error: 'nbgv get-version -f json' failed with $($LastExitCode).\"\n        }\n        $version = $props.CloudBuildAllVars.NBGV_SimpleVersion\n        $script:ImageTag = \"$($version)\"\n        Write-Host \"##vso[task.setvariable variable=PlatformVersion]$($script:ImageTag)\"\n    }\n    catch\n    {\n        $script:ImageTag = $null\n    }\n}\nif ([string]::IsNullOrWhiteSpace($script:ImageTag))\n{\n    # build as latest if not building from ci/cd pipeline\n    Write-Warning \"Unable to determine version - use latest.\"\n    $script:ImageTag = \"latest\"\n}\n\n# Set namespace name based on branch name\nif ($registry -eq \"industrialiotdev\")\n{\n    if (![string]::IsNullOrWhiteSpace($script:BranchName))\n    {\n        if ($script:BranchName.StartsWith(\"refs/heads/\"))\n        {\n            $script:BranchName = $script:BranchName.Replace(\"refs/heads/\", \"\")\n        }\n    }\n    else\n    {\n        $script:BranchName = \"main\"\n    }\n\n    $imageNamespace = $script:BranchName\n    if ($imageNamespace.StartsWith(\"feature/\"))\n    {\n        # dev feature builds\n        $imageNamespace = $imageNamespace.Replace(\"feature/\", \"\")\n    }\n    $imageNamespace = $imageNamespace.Replace(\"_\", \"/\")\n    $imageNamespace = $imageNamespace.Substring(0, [Math]::Min($imageNamespace.Length, 24))\n}\nelseif ($registry -eq \"mcr.microsoft.com\")\n{\n    $imageNamespace = \"\"\n}\nelse\n{\n    $imageNamespace = \"public\"\n}\n\nWrite-Host \"==============================================================================\"\nWrite-Host \"Selected $($script:ImageTag) images in namespace $($imageNamespace) from $($registry).\"\nWrite-Host \"==============================================================================\"\nWrite-Host \"\"\n\nWrite-Host \"##vso[task.setvariable variable=ImageTag]$($script:ImageTag)\"\nWrite-Host \"##vso[task.setvariable variable=ImageNamespace]$($imageNamespace)\"\nif ([string]::IsNullOrEmpty($script:Region))\n{\n    $script:Region = \"westus\"\n}\nWrite-Host \"##vso[task.setvariable variable=Region]$($script:Region)\"\n\nWrite-Host \"##vso[build.addbuildtag]$($script:ImageTag)\"\nWrite-Host \"##vso[build.addbuildtag]$($registry)\"\nif (![string]::IsNullOrWhiteSpace($imageNamespace)) \n{\n    Write-Host \"##vso[build.addbuildtag]$($imageNamespace)\"\n}\n"
  },
  {
    "path": "tools/e2etesting/steps/cleanup.yml",
    "content": "parameters:\n- name: CleanupAppRegistrations\n  type: boolean\n\nsteps:\n- task: AzurePowerShell@5\n  displayName: \"Delete Resource Group\"\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    scriptType: 'InlineScript'\n    pwsh: true\n    inline: |\n      Write-Host \"Deleting Resource group '$(ResourceGroupName)'...\"\n      $resourceGroup = Get-AzResourceGroup -Name \"$(ResourceGroupName)\" -ErrorAction SilentlyContinue\n      if ($resourceGroup) { $resourceGroup | Remove-AzResourceGroup -Force }\n      else { Write-Host \"Resource group '$(ResourceGroupName)' not found.\" }\n"
  },
  {
    "path": "tools/e2etesting/steps/deploystandalone.yml",
    "content": "steps:\n- task: AzurePowerShell@5\n  displayName: 'Select Image to test'\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\SetVariables.ps1'\n    pwsh: true\n    scriptArguments: >\n      -BranchName \"$(BranchName)\"\n      -Region \"$(Region)\"\n      -ImageTag \"$(PlatformVersion)\"\n      -ContainerRegistryServer \"$(ContainerRegistryServer)\"\n      -SubscriptionId \"d355e77f-e625-4931-b133-445d3dcf12cb\"\n      -ResourceGroupName \"mcr-iot-industrial-do-not-delete\"\n\n# Need to do this so we can update the permissions in key vault for this\n# service principal in the next scripts\n- task: AzureCLI@2\n  displayName: 'Set Service Principal Environment Variables'\n  name: SetServicePrincipalId\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    scriptLocation: 'InlineScript'\n    scriptType: 'pscore'\n    addSpnToEnvironment: true\n    inlineScript: |\n      Write-Host \"##vso[task.setvariable variable=ServicePrincipalId]$($env:servicePrincipalId)\"\n- task: AzurePowerShell@5\n  displayName: \"Deploy standalone resources\"\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\DeployStandalone.ps1'\n    pwsh: true\n    scriptArguments: >\n      -ResourceGroupName \"$(ResourceGroupName)\"\n      -Region \"$(Region)\"\n      -ServicePrincipalId \"$(ServicePrincipalId)\"\n- task: AzurePowerShell@5\n  displayName: 'Set KeyVaultName-Variable'\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\DetermineKeyVaultName.ps1'\n    pwsh: true\n    scriptArguments: >\n      -ResourceGroupName '$(ResourceGroupName)'\n- task: AzurePowerShell@5\n  displayName: 'Set keyvault container registry secrets'\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\SetKeyVaultSecrets.ps1'\n    pwsh: true\n    scriptArguments: >\n      -KeyVaultName \"$(KeyVaultName)\"\n      -ImageTag \"$(ImageTag)\"\n      -ImageNamespace \"$(ImageNamespace)\"\n      -ContainerRegistryServer \"$(ContainerRegistryServer)\"\n      -ContainerRegistryUsername \"$(ContainerRegistryUsername)\"\n      -ContainerRegistryPassword \"$(ContainerRegistryPassword)\"\n"
  },
  {
    "path": "tools/e2etesting/steps/deploytestresources.yml",
    "content": "steps:\n- task: AzurePowerShell@5\n  displayName: \"Deploy required test resources\"\n  timeoutInMinutes: 90\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\DeployTestResources.ps1'\n    pwsh: true\n    scriptArguments: >\n      -ResourceGroupName \"$(ResourceGroupName)\"\n\n- task: AzureCLI@2\n  displayName: \"Deploy containers with simulated PLCs with public ips\"\n  timeoutInMinutes: 90\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: 'pscore'\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\DeployPLCs.ps1'\n    arguments: >\n      -ResourceGroupName \"$(ResourceGroupName)\"\n      -UsePrivateIp $false\n\n- task: AzurePowerShell@5\n  displayName: \"Deploy VM with IoT Edge Runtime\"\n  timeoutInMinutes: 90\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\DeployEdge.ps1'\n    pwsh: true\n    scriptArguments: >\n      -ResourceGroupName \"$(ResourceGroupName)\"\n      -KeysPath \"$(Agent.TempDirectory)\"\n\n- task: AzureCLI@2\n  displayName: \"Write test resource variables to Keyvault\"\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: 'pscore'\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\SetTestVariables.ps1'\n    arguments: >\n      -ResourceGroupName \"$(ResourceGroupName)\"\n      -OpcPlcSimulationUrls \"$(OpcPlcSimulationUrls)\"\n      -OpcPlcSimulationIps \"$(OpcPlcSimulationIps)\"\n      -Fqdn \"$(Fqdn)\"\n      -EdgeIdentity \"$(EdgeIdentity)\"\n      -EdgeVmUsername \"$(EdgeVmUsername)\"\n      -SshPrivateKey \"$(SshPrivateKey)\"\n      -SshPublicKey \"$(SshPublicKey)\"\n\n"
  },
  {
    "path": "tools/e2etesting/steps/runtests.yml",
    "content": "parameters:\n- name: ModeName\n  type: string\n- name: ModeValue\n  type: string\n\nsteps:\n- task: AzurePowerShell@5\n  displayName: 'Set KeyVaultName-Variable'\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\DetermineKeyVaultName.ps1'\n    pwsh: true\n    scriptArguments: >\n      -ResourceGroupName '$(ResourceGroupName)'\n\n# Need to do this so we can update the permissions in key vault for this\n# service principal in the next script\n- task: AzureCLI@2\n  displayName: 'Set Service Principal Environment Variables'\n  name: SetServicePrincipalId\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    scriptLocation: 'InlineScript'\n    scriptType: 'pscore'\n    addSpnToEnvironment: true\n    inlineScript: |\n      Write-Host \"##vso[task.setvariable variable=ServicePrincipalId]$($env:servicePrincipalId)\"\n- task: AzurePowerShell@5\n  displayName: \"Add permissions to KeyVault\"\n  name: keyvaultpermissions\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\SetKeyVaultPermissions.ps1'\n    pwsh: true\n    scriptArguments: >\n      -KeyVaultName \"$(KeyVaultName)\"\n      -ResourceGroupName \"$(ResourceGroupName)\"\n      -ServicePrincipalName \"$(ServicePrincipalId)\"\n\n- task: AzureKeyVault@2\n  displayName: 'Retrieve KeyVault secrets'\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    KeyVaultName: '$(KeyVaultName)'\n    SecretsFilter: 'PCS-IOTHUB-CONNSTRING,plc-simulation-urls,plc-simulation-ips,iot-edge-vm-username,iot-edge-vm-publickey,iot-edge-vm-privatekey,iot-edge-device-id,iot-edge-device-dnsname,iothub-eventhub-connectionstring,PCS-SUBSCRIPTION-ID'\n- task: AzureKeyVault@2\n  displayName: 'Retrieve KeyVault secrets for API tests'\n  condition: notIn( '${{ parameters.ModeValue }}', 'standalone', 'AE')\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    KeyVaultName: '$(KeyVaultName)'\n    SecretsFilter: 'PCS-SERVICE-URL,PCS-AUTH-TENANT,PCS-AUTH-CLIENT-APPID,PCS-AUTH-CLIENT-SECRET,PCS-AUTH-SERVICE-APPID'\n\n- task: AzurePowerShell@5\n  displayName: 'Select Image to test'\n  inputs:\n    azureSubscription: '$(AzureSubscription)'\n    azurePowerShellVersion: 'latestVersion'\n    workingDirectory: '$(BasePath)'\n    scriptType: filePath\n    scriptPath: '$(BasePath)\\tools\\e2etesting\\SetVariables.ps1'\n    pwsh: true\n    scriptArguments: >\n      -BranchName \"$(BranchName)\"\n      -Region \"$(Region)\"\n      -ImageTag \"$(PlatformVersion)\"\n      -ContainerRegistryServer \"$(ContainerRegistryServer)\"\n      -SubscriptionId \"d355e77f-e625-4931-b133-445d3dcf12cb\"\n      -ResourceGroupName \"mcr-iot-industrial-do-not-delete\"\n- task: UseDotNet@2\n  displayName: 'Install .NET Core SDK'\n  inputs:\n    packageType: sdk\n    version: 8.0.x\n    includePreviewVersions: false\n    installationPath: $(Agent.ToolsDirectory)/dotnet\n- task: DotNetCoreCLI@2\n  displayName: 'Restore xUnit tests'\n  inputs:\n    command: restore\n    feedsToUse: config\n    nugetConfigPath: '$(Build.SourcesDirectory)/nuget.config'\n    projects: '$(BasePath)\\e2e-tests\\IIoTPlatform-E2E-Tests.slnx'\n- task: DotNetCoreCLI@2\n  displayName: 'Build xUnit tests'\n  inputs:\n    command: build\n    projects: '$(BasePath)\\e2e-tests\\IIoTPlatform-E2E-Tests.slnx'\n    arguments: '--configuration Release'\n- task: DotNetCoreCLI@2\n  displayName: 'Executing xUnit tests (with ${{ parameters.ModeName }}=${{ parameters.ModeValue }})'\n  timeoutInMinutes: 180\n  retryCountOnTaskFailure: 1\n  inputs:\n    command: test\n    projects: '$(TestPath)\\IIoTPlatform-E2E-Tests.slnx'\n    arguments: '--configuration Release --filter ${{ parameters.ModeName }}=${{ parameters.ModeValue }} --verbosity=normal --logger \"console;verbosity=detailed\" --logger trx'\n  env:\n    ApplicationName: '$(ApplicationName)'\n    AzureSubscription: '$(AzureSubscription)'\n    SYSTEM_ACCESSTOKEN: $(System.AccessToken)\n    AZURE_CLIENT_ID: \"$(ServicePrincipalId)\"\n    AZURE_CLIENT_SECRET: \"$(ServicePrincipalKey)\"\n    AZURE_TENANT_ID: \"$(pcs-auth-tenant)\"\n    PCS_IMAGES_TAG: '$(ImageTag)'\n    PCS_DOCKER_SERVER: \"$(ContainerRegistryServer)\"\n    PCS_DOCKER_USER: \"$(ContainerRegistryUsername)\"\n    PCS_DOCKER_PASSWORD: \"$(ContainerRegistryPassword)\"\n    PCS_IMAGES_NAMESPACE: \"$(ImageNamespace)\"\n    PCS_SUBSCRIPTION_ID: '$(PCS-SUBSCRIPTION-ID)'\n    PCS_RESOURCE_GROUP: '$(ResourceGroupName)'\n    PCS_SERVICE_URL: '$(pcs-service-url)'\n    PCS_AUTH_TENANT: '$(pcs-auth-tenant)'\n    PCS_AUTH_CLIENT_APPID: '$(pcs-auth-client-appid)'\n    PCS_AUTH_CLIENT_SECRET: '$(pcs-auth-client-secret)'\n    PCS_AUTH_SERVICE_APPID: '$(pcs-auth-service-appid)'\n    PCS_IOTHUB_CONNSTRING: '$(pcs-iothub-connstring)'\n    PLC_SIMULATION_URLS: '$(plc-simulation-urls)'\n    PLC_SIMULATION_IPS: '$(plc-simulation-ips)'\n    IOT_EDGE_VERSION: \"$(EdgeVersion)\"\n    IOT_EDGE_DEVICE_ID: '$(iot-edge-device-id)'\n    IOT_EDGE_DEVICE_DNSNAME: '$(iot-edge-device-dnsname)'\n    IOT_EDGE_VM_USERNAME: '$(iot-edge-vm-username)'\n    IOT_EDGE_VM_PUBLICKEY: '$(iot-edge-vm-publickey)'\n    IOT_EDGE_VM_PRIVATEKEY: '$(iot-edge-vm-privatekey)'\n    IOTHUB_EVENTHUB_CONNECTIONSTRING: '$(iothub-eventhub-connectionstring)'\n- task: PublishTestResults@2\n  displayName: 'Publish test results'\n  condition: always()\n  inputs:\n    testResultsFormat: VSTest\n    testResultsFiles: '$(BasePath)\\e2e-tests\\**\\*.trx'\n"
  },
  {
    "path": "tools/swagger.cmd",
    "content": "@REM Copyright (c) Microsoft. All rights reserved.\n@REM Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n@setlocal EnableExtensions EnableDelayedExpansion\n@echo off\n\nset current-path=%~dp0\nrem // remove trailing slash\nset current-path=%current-path:~0,-1%\nset build_root=%current-path%\\..\n\nset clean=\n\n:args-loop\nif \"%1\" equ \"\" goto :args-done\nif \"%1\" equ \"--xtrace\" goto :arg-trace\nif \"%1\" equ  \"-x\" goto :arg-trace\nif \"%1\" equ \"--hostname\" goto :arg-hostname\nif \"%1\" equ  \"-h\" goto :arg-hostname\ngoto :usage\n:args-continue\nshift\ngoto :args-loop\n\n:usage\necho swagger.cmd [options]\necho options:\necho -x --xtrace        print a trace of each command.\necho -h --hostname      specify host name to retrieve from.\nexit /b 1\n\n:arg-trace\necho on\ngoto :args-continue\n\n:arg-hostname\nshift\nset _hostname=%1\ngoto :args-continue\n\n:args-done\ngoto :main\n\nrem\nrem wait until listening\nrem\n:retrieve_spec\n:retrieve_retry\necho Retrieve swagger docs for %1 from %_hostname%.\nif not exist %build_root%\\api\\swagger mkdir %build_root%\\api\\swagger\npushd %build_root%\\api\\swagger\nif exist %1.json del /f %1.json\ncurl -o %1.json http://%_hostname%/swagger/v2/openapi.json\nif exist %1.json goto :eof\nping nowhere -w 5000 >nul 2>&1\ngoto :retrieve_retry\n\n@rem\n@rem Main\n@rem\n:main\n\nrem start publisher module\npushd %build_root%\\src\\Azure.IIoT.OpcUa.Publisher.Module\\src\nstart dotnet run --project Azure.IIoT.OpcUa.Publisher.Module.csproj --unsecurehttp=9072\nset _hostname=localhost:9701\ncall :retrieve_spec opc-publisher\n\n:done\nif exist %TMP%\\sdk_build.log del /f %TMP%\\sdk_build.log\npopd\nendlocal\n\n"
  },
  {
    "path": "version.json",
    "content": "{\n  \"$schema\": \"https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json\",\n  \"version\": \"2.9.15\",\n  \"publicReleaseRefSpec\": [\n    \"^refs/heads/main$\",\n    \"^refs/heads/release/\\\\d+\\\\.\\\\d+\\\\.\\\\d+\"\n  ],\n  \"cloudBuild\": {\n    \"setVersionVariables\": true,\n    \"buildNumber\": {\n      \"enabled\": false\n    }\n  }\n}\n"
  }
]